Day-III/ 40777 0 0 0 12000033646 5214 5Day-III/.DS_Store100777 0 0 30004 12000027516 7013 0Bud1 ello_w  @ @ @ @01-hello_worldIlocblobH(01-hello_worldbwspblobbplist00 \WindowBounds[ShowSidebar]ShowStatusBar[ShowPathbar[ShowToolbar\SidebarWidth_{{147, 260}, {770, 438}} ". ! hello_world reads files ! hello_world writes files ! hello_world constants ! hello_world types ! hello_world data ! hello_world library ! ********************************************************************** ! hello_world ! ---------------------------------------------------------------------- program hello_world ! ---------------------------------------------------------------------- ! hello_world uses modules ! ---------------------------------------------------------------------- ! processor description use, intrinsic :: iso_fortran_env, only: output_unit ! ---------------------------------------------------------------------- ! all names are declared: require explicit declarations implicit none ! ---------------------------------------------------------------------- ! hello_world RCS strings ! ---------------------------------------------------------------------- ! program source filename supplied by RCS character( len= *), parameter :: hello_world_rcs_id = & '$Id$' ! ---------------------------------------------------------------------- ! hello_world constants ! ---------------------------------------------------------------------- ! ---------------------------------------------------------------------- ! hello_world types ! ---------------------------------------------------------------------- ! ---------------------------------------------------------------------- ! hello_world data ! ---------------------------------------------------------------------- ! ---------------------------------------------------------------------- ! hello_world text ! ---------------------------------------------------------------------- continue write( unit= output_unit, fmt= *) 'Image ', this_image(), ' of ', num_images(), ' says "Hello, world!"' stop 'normal exit in hello_world' ! ---------------------------------------------------------------------- ! hello_world library ! ---------------------------------------------------------------------- contains ! ---------------------------------------------------------------------- ! hello_world ! $Id$ ! ********************************************************************** ! eof end program hello_world Day-III/01-hello_world/hw100777 0 0 2410130 11777670156 10515 0 H__PAGEZERO(__TEXT__text__TEXT  __stubs__TEXTPP__stub_helper__TEXT__const__TEXT " __cstring__TEXT `{ __eh_frame__TEXTh __DATAP__program_vars__DATA(__got__DATA((K__nl_symbol_ptr__DATA__la_symbol_ptr__DATAȲXȲ.comment__DATA _ __data__DATA __bss__DATA j__common__DATA`  H__LINKEDIT  X"0 ` p   / PkEP  /usr/lib/dyld|9ȷj$ *  8Q/usr/lib/libgcc_s.1.dylib 8/usr/lib/libSystem.B.dylib&x (jHHH}HuHHHH9uH SHHUUHkHl$HHp}3LmIzLH}+$LmH]H[fSHHUUHkHl$HHizH=3@HH H n3LPL VHDžHDžPLX贱H5=H3HUEH5%H3H`H HDž`HhH5H3HUEH5H3HpH HDžpHxJ3H=H E33H]H[UHH AH]E3҅.uElLcމLۅu EADtGLuAL}t-IAAD0G4AuL}DLu HcA80E3EDOAEtH]H]Åu0E~`~fLǾ*HQoH]H]Et HcB-t HcB+~`HcLǾ o3H]H]H|uLHHHHHHELII;|Tƃ+3HcHv B*HH;rfofBHH;rH;AB*HH;r/3 EWHcH|uLHHHHHHEHZH;|Tǃ+3HcHv B HH;rfo fBHH;rH;B HH;r3A;ЉEADDUH]H]@UHHAAхI^EUAAAAt`Au UAu Ct1Et,3ADAA+H{Mcۊ:CuϺJʅt?AH]Et"H^{I#AMcACuH] AMcC0E3EDOAEtE H]Eu,E~`~@HcLǾ*jlH]~A`McLǾ LAl3H]HcH|uLHHHHHHELJI;|Tƃ+3HcHv B*HH;rfofBHH;rH;dB*HH;rR3-jIcH|wLHHHHHHEHrH;|VAÃD+3McHv B HH;rfoefBHI;rL;C IL;rE3H]DUHH AH]HE3҅:ELcމLHu EAD*HtQLuIL}t7ILIHIAL0G4IuL}LLu HcA80E3EDOAEtH]H]Åu0E~`~fLǾ*HjH]H]Et HcB-t HcB+~`HcLǾ i3H]H]H|uLHHHHHHELII;|Tƃ+3HcHv B*HH;rfofBHH;rH;AB*HH;r/3H EVHcH|uLHHHHHHEHZH;|Tǃ+3HcHv B HH;rfofBHH;rH;B HH;r3HIHH;HEIDDUH]H]DUHHAɅWmEdAtku Aau AOHt:HcEt2H3HIALI+LGvMcAHE;HGuARAHcHHt?H]Et%HHvH#AMcAHHCuH] AMcC03EAOAɅtE H]Eu,E~`~@HcLǾ*gH]~A`McLǾ Lf3H]HcH|uLHHHHHHELJI;|Tƃ+3HcHv B*HH;rfofBHH;rH;dB*HH;rR3H,iIcH|wLHHHHHHEHrH;|VAƒD+3McHv B HH;rfoIfBHI;rL;C IL;rE3H]UHH0AL}ALuiE`EWAAAAt AuAA.AAMc3LeALmDJTD"HEuȅLeLmALeLm3AEEEEAEED'HAA A;|!LuL}H]3LuL}H]H]ЉE~Iƍr]~HcLL%M$A©Eu~ EtB0HA;L;LHLH+L;L-}u'LeȸH]LmLuL}H]ÅtqHcUL;?LELe3H]LmLuL}MH]øH]LmLuL}H]LeȸH]LmLuL}H]øLeH]LmLuL}H]øLeH]LmLuL}H]3H]LmLuL}H]UHHH]LLE8tH]H]HUH;t 3H]H]UHHLeIH]хI$2tH]LeH]Å~vȃAA t u^E33ۅ~? uAHBt E;rE3AA3ۅ~/? uAHBt E;rDtZ+u H3 -H_DFHDADEغ M/I$H|tHI$3H]LeH]ÅtHHH;u3 I$H]LeH]øH]LeH]DUHH`H]LL}ELuALmALeIHcE3E33H3LEDMEHUJHUEEDMLEEASAt8Au0Au#H]LeLmLuL}H]þEH߉ELDuAHUDMEE33E;$DIcA+I< uHGd1AD;rMcC< uJEAE;~3H]LeLmLuL}H]øH]LeLmLuL}H]ËEE;DuHUDMADEMcA@LmAHUH]D}DeMHUEBHADcA]wmMcL=͂H TK éH-}uEH}t0H}u A;}DD A|'EuH]LeLmLuL}H]I;r HA7H]HUtI;HI;sHH+H`~%3HG3H]LeLmLuL}H]H|lHHHHHHHEHQH;|KH3H+HHHHv 8HH;rff9HH;rH;s:HH;rs3H]LeLmLuL}H]øH]LeLmLuL}H]UHH`HH]LL}LuELmALeAHcE3E3E3H3HEDEDMHUFHUEDMDEHEEASAt#AuAAuA ~AEHDMH4D}AHUDEEE3E3E;%DIcA+HA< uIGl9AD;rMcA| u5EAE;~3H]LeLmLuL}H]DME;D}HUDEADEMcA@LeAHUH]DuDmMHUEHADkA]wnMcL5oH vK éH-}uFH}t0H}u!A;}DED A|Eu H;rEuDHAALH]EHUt H;sDHH;HH+H`~3HQDH|pHHHHHHHEHQH;|OH3H+HHHHv 8HH;rff9HH;rH;?:HH;r.3"UH uV3~@Hc8 t&0u 3H]31EH]HH;|ɸH]t3҅~nHc: tTTtdtt_FtMftH.u+HH;tD:Tt>tt9Ftfu 3 H]HH;|3H]3H]øH]øH]@UHu^3~GHHc8 t,0u3HH]31HEH]HH;|øHH]w3҅~qHHc: tVTtgttbFtOftJ.u,HH;tD:TtAtt:!H5#DLH HN HHHE>:I@ HH DEAD DEI DDD A AA uЋEЉVHH;Mt+t`H mCI HA$H MHEȋ12It$t H :CI HA$H MHEȋ12oIt$u$H CI HAHMHEȋ12Bt H BI HA4H0MHEȋ12H BI HA,H(MHEȋ12 yH~DEԉAAD D DEI t4DDD A AA uЋEЉ}ЋEԉLeLmLuH]ÐUHLuLmLeLLHHHcHTH5H4IHHEЋuAAD]D DDEA AAA AD сA D ։%uEu}ЉEDU؉uT r`sHu}ЉEDU؃u*Dс E3Au}DU؉E܉EtNt#H @I HAHMHEȋ12H @I HA HMHEȋ12ocH @I HAHEȋ12NE3HMȅALMIȃHcAIMDtM#ItDtMIIr MIKI#΅uHtHt Ht D M MMt u-K I#$It t VtNHcL DtAJ ]HL#K4^tЅu HHHcDtHuE}Ћu}ЋuHHlsct#H56?LH HNHHHE>:!H5?LH HN HHHE>:I@ HH DEAD DEI DDD A AA uЋEЉVHH;Mt+t`H ]>I HA$H MHEȋ12It$t H *>I HA$H MHEȋ12oIt$u$H =I HAHMHEȋ12Bt H =I HA4H0MHEȋ12H =I HA,H(MHEȋ12 yH~DEԉAAD D DEI t4DDD A AA uЋEЉ}ЋEԉLeLmLuH]ÐUHH]L}LeHHHHcHOHHHHHEЋ]Aى؉ADUD DDEA AAA AD ɁA D ˉ%uEu}ЉEDM؉]T r`sHu}ЉEDM؃]*DɁ E3A]}DM؉E܉EtKt#H ;H HAHHHEȋH ;H HA HHHEȋ{rH ;H HAHEȋH]LeL}H]øE3HMȅALIIȃHcAIMD|M#HtDnIIIr MIJI#υuHtHt Ht D M MMt u'K I#HttStNHcL DtAJ UHL#KW\Ѕu HHHcDtHuE}Ћ]}Ћ]HHls`t#H2:HH HKHHHEً;:!H:HH HK HHHEً;:H@ HH DEAD DEH DDD A AA ؉]ЋEЉbHH;Mt(t`H \9H HA$H HHEȋHt$t H )9H HA$H HHEȋoHt$u$H 8H HAHHHEȋBt H 8H HA4H0HHEȋH 8H HA,H(HHEȋ H]LeL}H]H~DEԉAAD D DEH t4DDD A AA ؉]ЋEЉ}ЋEԉH]LeL}H]øH]LeL}H]fUHH]LuLeLLHHHcH"KHHIHHEЋ]ԉމ؉DM DDEA AAA AA A% A AAuuADEЉEԉuDMXA rA`sHuDEЉEԉuADM*A E3DMDEЉu؉E܉EAAtSAt%H 6HA(H I HEHH4H 6HAHI HEHHAH V6I HAHEHH53I25MȅLLHȃHcHIDtM#ItDuMIIr MHOI#΅uHtHt Ht M MMt u/H ?I#&It At [AtRHcL DtEH }HL#I4~tЅu HHHcDtHuEDEDMDEDMIIsbAt"H 4HA(H I HEHH H 4HAHI HEHHI@W YIIA~D3ۋEEDED]ىD ƉEAA I t[߉ىAA  AAD AE %D ȉ}DM]ԉEHL;Ht.AtgH 3HAHH@I HEHHAIt'Et"H 3HAHH@I HEHHwIt'Eu'H f3HA8H0I HEHHGEt"H ?3HAhH`I HEHH H 3HAXHPI HEHH }I AEA A A EI tXAA  AAD AE %D ȉuDM}ԉEHEHH]LeLuH]fDUHH]LuLeLLHHHcHFHHIHHEЋ]ԉމ؉DM DDEA AAA AA A% A AAuuADEЉEԉuDMXA rA`sHuDEЉEԉuADM*A E3DMDEЉu؉E܉EAAtSAt%H 0HA(H I HEHH4H 0HAHI HEHHAH 0I HAHEHH53I25MȅLLHȃHcHIDtM#ItDuMIIr MHOI#΅uHtHt Ht M MMt u/H ?I#&It At [AtRHcL DtEH }HL#I4~tЅu HHHcDtHuEDEDMDEDMIIsbAt"H :/HA(H I HEHH H /HAHI HEHHI@W YIIA~D3ۋEEDED]ىD ƉEAA I t[߉ىAA  AAD AE %D ȉ}DM]ԉEHL;Ht.AtgH .HAHH@I HEHHAIt'Et"H -HAHH@I HEHHwIt'Eu'H -HA8H0I HEHHGEt"H -HAhH`I HEHH H ]-HAXHPI HEHH }I AEA A A EI tXAA  AAD AE %D ȉuDM}ԉEHEHH]LeLuH]fDUHL}LuLeHHHHcH@LLAHHHEЋ}AAD]D DEEAAA AAA AA A%D AD AAuEuADUЉEDED]\A rA`sHuDUЉEDEAD]-DA E3AD]DUDE؉E܉EAAtSAt%H "+HA(H H HEH1H2fH *HAHH HEH1H2AA4H *H HAHEH1H2LeLuL}H]ø53I25MȅLHHȃHcAIMD|M#HtDvIIIr MIII#υuHtHt Ht D M MMt u/K I#&Ht At ]AtTHcL DtGJ MHL#OODDEu HHHcDtHuEDUD]DUD]I'IsbAt"H _)HA(H H HEH9H: H =)HAHH HEH9H:H@y tIIA~D3EE!DыEDы}AADA EAA H taAAAAD D ƁD ljAAD AE %D DEDU}ԉEHL;Ht.AtgH )(HAHH@H HEH1H2AHt'Et"H 'HAHH@H HEH1H2wHt'Eu'H 'HA8H0H HEH1H2GEt"H 'HAhH`H HEH1H2 H y'HAXHPH HEH1H2 LeLuL}H]DEIDA AAEE A E ÉEH t`DDDAA A AA AAAAE AE %D Љ}DUDEԉEHEHLeLuL}H]øLeLuL}H]UHL}LuLLHHHcHf;H5H4IEЋuЉA A AA A%Au AEDUTH3H3HuǃHtDU+uЉEԉM؉M܉MAAtOAt#H L%I HAHMHEȋ12H )%I HA HMHEȋ12hA[H $I HAHEȋ12F3HMȅLLHȃHcAIMD|M#ItDvMIIr MIHI#υuHtHt Ht M M MMt u/K I#&It At YAtPHcL DtCJ EHL#K4GtЅu HHHcDtHuEuDUuDUHHlsdAt#H5#LH HNHHHE>:!H5}#LH HN HHHE>:I@ HH }AA }I }  uЋEЉQHH;Ht,AtcH "I HA$H MHEȋ12AIt%Et H "I HA$H MHEȋ12qIt%Eu%H k"I HAHMHEȋ12CEt H F"I HA4H0MHEȋ12H &"I HA,H(MHEȋ12 oH~}ԉA A }I t.  uЋEЉuЋEԉLuL}H]AuЉEDUfUHL}LuLLHHHcH&7H5H4IEЋuЉA A AA A%Au AEDUTH3H3HuǃHtDU+uЉEԉM؉M܉MAAtOAt#H l I HAHMHEȋ12H I I HA HMHEȋ12hA[H  I HAHEȋ12F3HMȅLLHȃHcAIMD|M#ItDvMIIr MIHI#υuHtHt Ht M M MMt u/K I#&It At YAtPHcL DtCJ EHL#K4GtЅu HHHcDtHuEuDUuDUHHlsdAt#H5LH HNHHHE>:!H5LH HN HHHE>:I@ HH }AA }I }  uЋEЉQHH;Ht,AtcH I HA$H MHEȋ12AIt%Et H I HA$H MHEȋ12qIt%Eu%H I HAHMHEȋ12CEt H fI HA4H0MHEȋ12H FI HA,H(MHEȋ12 oH~}ԉA A }I t.  uЋEЉuЋEԉLuL}H]AuЉEDUfUHLuLmHHHHcH2LLAHEЋ}ЉAAA AAA AA A%Au AEDUXHE3H3HuAAAHtDUA+}ЉEԉM؉M܉MAAtOAt#H H HAHHHEȋ12H cH HA HHHEȋ12AH 3H HAHEȋ12LmLuH]ÉE3HMȅALIIȃHcAIMDtM#HtDvIIIr MIII#΅uHtHt Ht M M MMt u/K I#&Ht At YAtPHcL DtCJ MHL#KHHH H KHtEtHHH H ,HtEuHHHH HwHH H@DMDAuD ED EDEAAAAAD AAAE AE EAAE A%E D DUD}HEHH]LuL}H]UHH]L}LuH6HHHHcHbHHHHHEDEH taMAʉAADDAD AE EAD D AD ADE DMEDDDAtY3}E3IuEItà EAA AE ˉ]DDMDEDEEt7}Ir EIsDUE33]ЉE܉Em]DMԉ}^u#ADME ʉ]t};}3ADA 3A D ȉ}DЉ]DMԉM܉MEt.tHHHH HHHH t8tHiHH0H uHQHH(H ]EH-HH :IIAMIHtDgIIMu MLHu D}A MMtLHD$Ht t OtGHcL DɅt:IIDUEu&ICLcDtMu E]]EHs;EtH4HHH H$HHH H@! #HH;vpMtEt>HHH H KHtEtHHH H ,HtEuHHHH HHH H@DMDAuD ED EDEAAAAAD AAAE AE EAAE A%E D DUD}HEHH]LuL}H]UHH]L}LuHHHHcH%HHHHHEDEH taMAʉAADDAD AE EAD D AD ADE DMEDDDAtY3}E3IuEItà EAA AE ˉ]DDMDEDEEt7}Ir EIsDUE33]ЉE܉Em]DMԉ}^u#ADME ʉ]t};}3ADA 3A D ȉ}DЉ]DMԉM܉MEt.tHHHH HHHH tPt$HHH0H H]LuL}H]HhHH(H H]LuL}H]]H8HH H]LuL}H]IIAMIHtDgIIMu MLHu D}A MMtLHD$Ht t OtGHcL DɅt:IIDUEu&ICLcDtMu E]]EHs;EtH3HHH H#HHH H@- (HH;v|MtEt>HHH H KHtEtHHH H ,HtEuHHHH HHH H]LuL}H]H@DMDAuD ED EDEAAAAAD AAAE AE EAAE A%E D DUD}HEHH]LuL}H]øH]LuL}H]UHL}LmLeLLHH5HcHH5H4IHHEDUI t]MAˉωADED D%D D A AAA ADA }EDAAAAAEtY3DU3Hu HtA EA AAAA DMЉ}D]؉u܉uEt=ADUIr EAIsD]A3ADMЉE؉E܉EyADMЉ}ԉEDUeAu)}A DMЉEt ADU=ADU3D A3A DUDMЉ}D]؉u܉uAAt/AtHHHH -HHHH At/AtHHH0H H|HH(H AH\HH DȾ8H4LDHپHID}M#ItEgMIIr ML_M#Eu MD ًMD MtEu/L?M#&It At [AtRMcM EEtDH }HL#I<}؅u HNHcDtHuEDMDUDMDUDHs>AtH5HHH H%HHH I@ HH;HtAt@HHH H cAItEtHHH H AItEuHHHH #EtHHH0H HzHH(H AHAAADAA@EtHAH;AA ADɋEDɋ}ىD AAAA A AAAAAAAAE AAAE AE EAE %D D DUDmHEHLeLmL}H]ÐUHL}LmLeLLHH5HcH H5H4IHHEDUI t]MAˉωADED D%D D A AAA ADA }EDAAAAAEtY3DU3Hu HtA EA AAAA DMЉ}D]؉u܉uEt=ADUIr EAIsD]A3ADMЉE؉E܉EyADMЉ}ԉEDUeAu)}A DMЉEt ADU=ADU3D A3A DUDMЉ}D]؉u܉uAAt/AtHWHHH -HDHHH At/AtHHH0H H HH(H AHHH DȾ8H4LDHپHID}M#ItEgMIIr ML_M#Eu MD ًMD MtEu/L?M#&It At [AtRMcM EEtDH }HL#I<}؅u HNHcDtHuEDMDUDMDUDHs>AtHHHH HHHH I@ HH;HtAt@HoHH H cAItEtHMHH H AItEuH/HHH #EtHHH0H H HH(H AHAAADAA@EtHAH;AA ADɋEDɋ}ىD AAAA A AAAAAAAAE AAAE AE EAE %D D DUDmHEHLeLmL}H]ÐUHH]LmLeHHHRHcHHHHHHEDMH t]MAʉωADED D%D D A AAA ADA }EDAAAAAEtY3DM3Hu HtA EA AAAA DEЉ}DU؉]܉]Et=ADMIr EAIsDUA3ADEЉE؉E܉EyADEЉ}ԉEDMeAu)}A DEЉEt ADM=ADM3D A3A DMDEЉ}DU؉]܉]AAt/AtHHHH ;HHHH (At/AtHHH0H HHH(H AHHH H]LeLmH]D8H4HDHٻHIDmM#HtEgIIIr MLWM#Eu MD ыMD MtEu/L?M#&Ht At \AtSMcM EEtEH }HL#I|}}؅u HKHcDtHuEDEDMDEDMDHs>AtHKHHH H;HHH H@ HH;HtAt@HHH H cAHtEtHHH H AHtEuHHHH #EtHHH0H HHH(H H]LeLmH]AH@EtHAH;ǃA ADED}ىD AA A AAAAAAD AAAE AE EAE %D D DMDeHEHH]LeLmH]øH]LeLmH]UHLuLmLeLLHHHcHH5H4IHHEDMI taMAˉAADDAD AE EAD D AD ADE DUEDDDAtY3}E3IuEItƃ EAA AE ԉuDDUDMDMEt7}Ir EIsD]E33uЉE܉EmuDUԉ}^u#ADUE Ӊut};}3ADA 3A D Љ}D؉uDUԉM܉MtmEtHHHH t$HxHH MHHHH MIAMIItDdMIMu MLHu DuA MMtLHD$It t PtHHcL Dхt;IID]Eu'ID$LcDtMu EuuEHs%HWHHH I@ HH;vmMtEt>HHH0H KItEtHHH0H ,ItEuHHH H HHH T}HƀuЁDE MAD A}DEHEHLeLmLuH]UHLuLmLeLLHHHcHrH5H4IHHEDMI taMAˉAADDAD AE EAD D AD ADE DUEDDDAtY3}E3IuEItƃ EAA AE ԉuDDUDMDMEt7}Ir EIsD]E33uЉE܉EmuDUԉ}^u#ADUE Ӊut};}3ADA 3A D Љ}D؉uDUԉM܉MtmEtHSHHH t$H8HH MHHH MIAMIItDdMIMu MLHu DuA MMtLHD$It t PtHHcL Dхt;IID]Eu'ID$LcDtMu EuuEHs%HHHH I@ HH;vmMtEt>HHH0H KItEtHHH0H ,ItEuHHH H HHH T}HƀuЁDE MAD A}DEHEHLeLmLuH]UHH]L}LeHHH2HcHHHHHHEDEH taMAʉAADDAD AE EAD D AD ADE DMEDDDAtY3}E3IuEItà EAA AE ˉ]DDMDEDEEt7}Ir EIsDUE33]ЉE܉Em]DMԉ}^u#ADME ʉ]t};}3ADA 3A D ȉ}DЉ]DMԉM܉MEtHHHH 3t0HHH MH]LeL}H]HHH H]LeL}H]IIAMIHtDdIIMu MLHu D}A MMtLHD$Ht t OtGHcL DɅt:IIDUEu&ICLcDtMu E]]EHs%HHHH H@ HH;v|MtEt>HHH0H KHtEtHaHH0H ,HtEuHBHH H H2HH H]LeL}H]ËuHÀ]Ё} M uԉ}HEHH]LeL}H]øH]LeL}H]UHLuLmLeLLHHHcHH5H4IHHEDMI taMAˉAADDAD AE EAD D AD ADE DUEDDDAtY3}E3IuEItƃ EAA AE ԉuDDUDMDMEt7}Ir EIsD]E33uЉE܉EmuDUԉ}^u#ADUE Ӊut};}3ADA 3A D Љ}D؉uDUԉM܉MtmEtHHHH t$HHH MHXHH MIAMIItDgMIMu MLHu DuA MMtLHD$It t PtHHcL Dхt;IID]Eu'ID$LcDtMu EuuEHs%HdHHH I@ HH;vmMtEt>H%HH0H KItEtHHH0H ,ItEuHHH H HHH T}H uЁDE MA D A}DEHEHLeLmLuH]DUHLuLmLeLLHHHcHbH5H4IHHEDMI taMAˉAADDAD AE EAD D AD ADE DUEDDDAtY3}E3IuEItƃ EAA AE ԉuDDUDMDMEt7}Ir EIsD]E33uЉE܉EmuDUԉ}^u#ADUE Ӊut};}3ADA 3A D Љ}D؉uDUԉM܉MtmEtHcHHH t$HHHH MHHH MIAMIItDgMIMu MLHu DuA MMtLHD$It t PtHHcL Dхt;IID]Eu'ID$LcDtMu EuuEHs%H$HHH I@ HH;vmMtEt>HHH0H KItEtHHH0H ,ItEuHHH H HHH T}H uЁDE MA D A}DEHEHLeLmLuH]DUHH]L}LeHHH5HcHHHHHHEDEH taMAʉAADDAD AE EAD D AD ADE DMEDDDAtY3}E3IuEItà EAA AE ˉ]DDMDEDEEt7}Ir EIsDUE33]ЉE܉Em]DMԉ}^u#ADME ʉ]t};}3ADA 3A D ȉ}DЉ]DMԉM܉MEtH"HHH 6t0HHH MH]LeL}H]HHH H]LeL}H]IIAMIHtDgIIMu MLHu D}A MMtLHD$Ht t OtGHcL DɅt:IIDUEu&ICLcDtMu E]]EHs%HHHH H@ HH;v|MtEt>HHH0H KHtEtHnHH0H ,HtEuHOHH H H?HH H]LeL}H]ËuH ]Ё} M  uԉ}HEHH]LeL}H]øH]LeL}H]@UHLmLeLLHHrHcHH5H4IHHEDMI t_MAAʉADADE E%D AD D AD ADE DUEDDD%AtY3uE3IuEIt EA AAE ԉEDUD]DMDMEt6uIr EIsD]3EЉM؉M܉MrEDUԉM؉u`=u&ADUE ӉEЉMtu;u3ADA 3A D щuEDUD]؉}܉}tH HAHHqHr|t,H HHHqHrMT<H ZHHHqHr)MIMII@AItDUMIMuMu~II?DMtHHD!It t Ht@M Dt6HHMu!IBLcDtMu EEEH=s-H vHAHHqHrI@5 7H?H;MtEtNH +HA0HHq8HrcItEtH HA0HHq8HrHHHYHZMH]L}H]CH HHHYHZH]L}H]IIMII@AHtDOIIMuMuxII?DMtHHDHttEt@M Dt6HHMu!IALcDtMu EEEH=s-H HAHHYHZH@: 5H?H;MtEtNH пHA0HHY8HZcHtEtH HA0HHY8HZHHH H KItEtHHH H ,ItEuHHHH HиHH I@DEDAA]E ED EDDljAAAD AD AA ˉEAAA A%E DUЉMHEHH]LeH]DUHH]LeLLHHHcH&HHII t.EЋuЉ  ˁ EԋMAAAEAEuXt?E3DU3H@uAH@tA ADMЉMԉE؉E܉EcADMЉMDURAu#DMЁMt ADU0ADU&A3DUDMЉMԉE؉E܉EAAt/AtHHHH HHHH At9AtHoHH0H mHWHH(H UA<H2HH 1MIuHHItgLHHu HHH%u DeA EHtHHD%It At MAtDHcH ؉؅t8HHu؅u#HGHcDtHu EDMDMIs;EtH=HHH H-HHH I@ HL;vpMtEt>HHH H KItEtHϴHH H ,ItEuHHHH HHH I@DEDAA]E ED EDDljAAAD AD AA ˉEAAA A%E DUЉMHEHH]LeH]DUHLuLmHHH+HcHLLAHH t5EDEDDD A AA EԋMAAAEAEuXt?E3Dm3H@uAH@tA AÂD]ЉMԉE؉E܉EcAD]ЉMDmRAu#D]ЁMt ADm0ADm&AÂ3DmD]ЉMԉE؉E܉EAAt/AtHrHHH H_HHH AtIAt H:HH0H LmLuH]HHH(H LmLuH]ARHHH LmLuH]IIDELHAHtgHHHu HLH%u DuA EHtLHD%Ht At OAtFHcH t:IIDEEu#IALcDtMu ED]D]Is;EtHHHH HܰHHH H@& !HL;vxMtEt>HHH H KHtEtH~HH H ,HtEuH_HHH HOHH LmLuH]I@DMDAAuE ED EDEȉAAAAD AAE AA ͉EAAA A%E DUЉMHEHLmLuH]øLmLuH]fDUHLuLmLeLLHHHcHH5H4II t.EЋuЉ  Eԋ}AAEEuUt>E3ɉu3H@uAH@tA ADMЉ}ԉE؉E܉E\DMЉ}ԉuMAuDMЁ}tu-u%A3uDMЉ}ԉE؉E܉Et*tH`H HOH t*tH.H HH uiH `DȿHDLHAIMDuM#ItEpMIIr MMZM#EuD]؋MD ًMD MtEu4MMt,M#E$It t XtPMcM EEtBJ UHL#K4Vuԅu HHHcDtHuEuDMuDMEIs9tH׮H HɮH I@ HL;v|Htt9HH WIttHlH 9ItuHQH tH?H H1H AI@EtHAI;ƒA ADɋE AƉAD ƉEԁD %D DEЋEЉLeLmLuH]fUHLuLmLeLLHHHcH2H5H4II t.EЋuЉ  Eԋ}AAEEuUt>E3ɉu3H@uAH@tA ADMЉ}ԉE؉E܉E\DMЉ}ԉuMAuDMЁ}tu-u%A3uDMЉ}ԉE؉E܉Et*tH H HH t*tHH HݫH uiH `DȿHDLHAIMDuM#ItEpMIIr MMZM#EuD]؋MD ًMD MtEu4MMt,M#E$It t XtPMcM EEtBJ UHL#K4Vuԅu HHHcDtHuEuDMuDMEIs9tHH HH I@ HL;v|Htt9HJH WIttH,H 9ItuHH tHH HH AI@EtHAI;ƒA ADɋE AƉAD ƉEԁD %D DEЋEЉLeLmLuH]fUHH]LmLeHHHHcHHHHH t.EЋ]Љ߉؉  Eԋ}AAEEuUt>E3]3H@uAH@tA ADEЉ}ԉE؉E܉E\DEЉ}ԉ]MAuDEЁ}t]-]%A3]DEЉ}ԉE؉E܉Et'tHH HۧH t'tHH HH }tH H]LeLmH]DHDHHAIMDmM#HtEjIIIr MMQM#EuDU؋MD ыMD MtEu.MMt&M#EHttVtQMcM EEtCJ MHL#K\M]ԅu HHHcDtHuE]DE]DEEIs6tHhH HZH H@  HL;Htt9HH WHttHH 9HtuHH tHϥH HH H]LeLmH]AI@EtHAI;A ADE ÉljÉ Eԁ % }ЋEЉH]LeLmH]øH]LeLmH]@UHLmLuL.LHH:HcHH5H4II t3EЋuAAD D ɁD EDMEEAEAEuUAt>E3DU3I@uEAI@tAADEA E؉E܉E]ADEDUOAu!ADEt ADU/ADU%AA3DUDEAE؉E܉EAtkDMAtHH At"H MAHo MIDAHHItdLHHu HHHu E E EHtHHD%It At OAtFHcH t:HH}ԅu)ICLcDtMu EDE DEDMIs#H~H I@ HL;veMtEt:HAH0 EItEtH$H0 (ItEuHH H =MIDEЁAEA  MԋEԉLmLuH]@UHLmLuL.LHH:HcH&H5H4II t3EЋuAAD D ɁD EDMEEAEAEuUAt>E3DU3I@uEAI@tAADEA E؉E܉E]ADEDUOAu!ADEt ADU/ADU%AA3DUDEAE؉E܉EAtkDMAtHHH At"H. MAH MIDAHHItdLHHu HHHu E E EHtHHD%It At OAtFHcH t:HH}ԅu)ICLcDtMu EDE DEDMIs#HH I@ HL;veMtEt:HўH0 EItEtHH0 (ItEuHH H =MIDEЁAEA  MԋEԉLmLuH]@UHH]LeHHH`HcHYHHHH t3EЋ]Aى؉AD D ɁD EDMEEAEAEuUAt>E3DU3I@uEAI@tAADEA E؉E܉E]ADEDUOAu!ADEt ADU/ADU%AA3DUDEAE؉E܉EAt{DMAtHۜH At*H MH]LeH]AH H]LeH]IIDAHHHtdHHHu HHHu E E EHtHHD%Ht At OAtFHcH ؉؅t:HH}ԅu)ICLcDtMu EDE DEDMIs#HH H@ HL;vpMtEt:HTH0 EHtEtH7H0 (HtEuHH H  H]LeH]ËMIDEЁAEA  MԋEԉH]LeH]øH]LeH]ÐUHH0LEL]ALU$ELT$D\$D]D$H H]UHH 3EA҉EEL]H]HcM HLuL}ALmLLeADMDEDuL]A@EwE$EE$EMcHLevs@~nHAD$;LƉDUD|McLDUIŋHMPEAEAHMMc A>}HMAt AADD%DEDEAEu8Eu DEAED MD }D t HEH%M@π@HEH@ @HHtHH;u>A@E3AEEعpDD+ AEH?H;u uGquPƁ~0HcAH;t'%= E3AM A>HDDKLHHEH}H$HEHD$LEH|$DDULML]T=L]H DUMtS tN tI tD*H}HUbHL;tL\H]LeLmLuL}H]ËE|;~A {@sHHtA _Hcu~HcHH΀<>9|HH;|H<5}t ;|A +غE؅HDE3AD+DADDA,ۉIEI*H}HUaHL;tLYH]LeLmLuL}H]E~{B<HD DELELLMHEH$L]L\$HEHD$DU;DUH EtW tR  tD*H}HU`HL;tLH]LeLmLuL}H]þ H}HUDU`} DU . MAVUUUAAA+҉DRADEArDNփ LD؃t~+HEHEL]LL}{H$LEL\$LML|$DUg:DUH M;t!EAHcB(0EHcB(A+ʾʸ څIу |ƍ;. A@tI;u~~*H}HUO_HL;tLH]LeLmLuL}H]E$u}u3NljE;MƉE؉ƸNu؋E؃}DD| AtAEA@DODA0A;~D*H}HU^HL;tL_H]LeLmLuL}H]At } AHcuIMcI|9Lc]IL]MA׸gfffAD+ЍD+A0G<IyHEA+ɹ-AILNIIL+ރAKtIDLуDA LNEA+Å.HHcI+H+HHcuMcIILLHDUI]LDUHDLIcHHEt,.McEIY}IcHMH+LL+IHcuLILHDU\DUMcLHUK\ AtMcI;H++HL;tL3H]LeLmLuL}H]A}EtmAED3fk( tfYfYfYfY;r(fYA;s YA;rEHDDKLDHLELMHEH$LULT$HEHD$L]J6L]H EtS tN tI tD*H}HU[HL;tLVH]LeLmLuL}H]ËE3+HcULIӾ0L]2[HcML]HMc0LM+L+LHL]ZL]}  H}HUЉL]ZU L] }K| AtsDME|A; D;M~J}tD*H}HUWZHL;tL#H]LeLmLuL}H]AHcDEH}McH+IHcuIMcIIHLL]YUL]LHtG,G.HcuHJHUHcHJ<H+HcuHcIIHLFYLLu~AtHEHcIH+@+HL;tL3H]LeLmLuL}H]þ*H}HUXHL;tLH]LeLmLuL}H]þ*H}HUXHL;tLsH]LeLmLuL}H]HHH#H;'4DAD D DE E3EuEEMcL0LDUWDU@AED$A;pEd0iH+-McUI;u|AHH0IY*H}HUcWHL;tL/H]LeLmLuL}H]HcH}H+IIcI+HHǾ0HLLHDUVHHLI+HH+DUHLHcuHILLHDUtV&*H}HU}VHL;tLIH]LeLmLuL}H]ÅxHDEDLELcM$M͋uHU{HHL;tLEH]LeLmLuL}H]LcMDMDLEЋuHUHL;tLEH]LeLmLuL}H]3ElAEEz }^A;|bHEHcIH+@-#u>uA;D;u|AHEHcJH+щB0~uA;VLrHDLcMDMMD]LED$uHU HHL;tLEH]LeLmLuL}H]LcMDMDMLEЋuHUHL;tL8EH]LeLmLuL}H]EuEEL0HL] TL] UHH H];LuILmMLeMc}L*LSM@tIFLDHcLLhS*HcLH+L pSL+MLLH}MAt AADD%DEDEAuEu%EuME t E#M@π@Eဉ@ @tu>A@qE3AEEعpDD+ AuzEtt%?u u>@uG%~+Kt) E3AM A>HDDKLHHEH}H$HEHD$LEH|$DDULML]pL]H DUMtS tN tI tD*H}HU9|HH;|H<5}t ;|A +غE؅HDE3AD+DADDA,ۉIEI*H}HU9MHL;tLH]LeLmLuL}H]E~{B<HD DELELLMHEH$L]L\$HEHD$DUDUH EtW tR  tD*H}HU}LHL;tLIH]LeLmLuL}H]þ H}HUDU5L} DUj  MAVUUUAAA+҉DRADEArDNփ $D؃t~+HEHEL]LL}{H$LEL\$LML|$DUDUH M;t!EAHcB(0EHcB(A+ʾʸ څIу |ƍ; A@tI;u~~*H}HUJHL;tLǹH]LeLmLuL}H]E$u}u3NljE;MƉE؉ƸNu؋E؃}DD| AtAEA@DODA0A;~D*H}HU?JHL;tL H]LeLmLuL}H]At } _AHcuIMcI|9Lc]IL]MA׸gfffAD+ЍD+A0G<IyHEA+ɹ-AILNIIL+ރAKtIDLуDA LNEWA+ÅHHcI+H+HHcuMcIILLHDUHLDUHDLIcHHEt,.McEIYUIcHMH+LL+IHcuLILHDU~HDUMcLHUK\ AtMcI;H++HL;tL.3H]LeLmLuL}H]AEtoAED]3d( jYY;r(YYA;s YA;rEHDDKLDHLELMHEH$LULT$HEHD$L]dL]H EtS tN tI tD*H}HU4GHL;tLH]LeLmLuL}H]ËE3+HcULIӾ0L]FHcML]HMc0LM+L+LHL]FL]} u H}HUЉL]iFU L] }K| AtsDMERA; D;M~J}tD*H}HUFHL;tLʹH]LeLmLuL}H]AHcDEH}McH+IHcuIMcIIHLL]aEUL]LHtG,G.HcuH HUHcHJ<H+HcuHcIIHLDLLu~AtHEHcIH+@+HL;tL袳3H]LeLmLuL}H]þ*H}HUDHL;tLaH]LeLmLuL}H]þ*H}HUQDHL;tLH]LeLmLuL}H]Á7D &E3EuEEMcL0LDUCDUhAEDLA;Ed0H+-McUI;u|AHH0IY*H}HU7CHL;tLH]LeLmLuL}H]HcH}H+IIcI+HHǾ0HLLHDUBHHLI+HH+DUHLHcuHILLHDUHBN*H}HUQBHL;tLH]LeLmLuL}H]ÅxHDEDLELcM$M͋uHUoHHL;tL跰EH]LeLmLuL}H]LcMDMDLEЋuHUHL;tLjEH]LeLmLuL}H]3EAEE ^A;|HEHcIH+@-Mu>uA;D;u|AHEHcJH+щB0~uA;VLHDLcMDMMD]LED$uHUHHL;tL\EH]LeLmLuL}H]LcMDMDMLEЋuHUHL;tL EH]LeLmLuL}H]EuEEL0HL]?L]JUHH H];LuILmMLeMc}L*L?M@tIFLDHcLLH?*HcLH+L P?L+MLLH?H]LeLmLuH]UHH DDZALc]ILeMDUw DMDMDMDMtF HLMDUAL]L$D3衅HA$}t A$3LeH]UHH0LeAH]A@L}LuLmIՋEt.AIULD}AE-IHcLL >| AtAE3E~A;AVDLD;~McL*L=OIcLHI+׾ LM=LEM+LMЅ|=~AtAE+ILM+LLt=H]LeLmLuL}H]AE-I̐UHH0LEL]ALU$ELT$D\$D]D$H H]UHH 3EA҉EEL]H]HcM HLuL}LLmALeADMDEDuL]A@EwE$EE$EH#HOMcHEHMLm#SK@~KAE;DULDdMcLqDUINjMEAEAMcA>}At AADD%DEDEAEuVEu,Eu } DEA u u u tH}HEHHH:@uA@AHE@H}D HHHDLMuYHHtHH;u>A@E3AEEpDD+2 AEMuH?H;u <ƀu`%=?~EMu H-1@H;t3ƀu@ E3A^ AOHO LEADHEDHuH$HEHD$HEHt$HD$HEHD$ HDUL]ϸL]H0DUMtS tN tI tD*H}HU9HL;tLgH]LeLmLuL}H]ËE|;~A {@sHHtA _Hcu~HcHH΀<>9|HH;|H<5}t ;|A +غEHDE3AD+DADDAEۉIEI*H}HU8HL;tLdH]LeLmLuL}H]E~SBHEA DHEDL]MHMH$HEL\$HuHD$HL$Ht$ H}HuDUDUH0EtW tR  tD*H}HU7HL;tL虦H]LeLmLuL}H]þ H}HUDU7} DU u MAVUUUAAA+҉DRADEArDNփ tD؃+HЉHEML]H}HuSH$HEL\$HD$HEHD$HEHD$ DDUDUH0M;t!EAHcB80EHcB8A+ʾʸ څIу |ƍ;c  A@tI;u~~*H}HU96HL;tLH]LeLmLuL}H]E$u}u3NljE;MƉEƸNuE}DD| AtAEA@DODA0A;~D*H}HU}5HL;tLIH]LeLmLuL}H]At } AHcuIMcI|4Lc]IL]M؉׸gfff+Ѝ+0C<IyHEA+ɹ-AILNIIL+ރAKtIDLуDA LNEA+ÅIHHcI+H+HHcuMcIILLHDU84LDUDHLIcHH+Et,.EHsIcHMH+LL+IHcuLIHHDU3DUMcHHUIt7AtMcI;H++HL;tLt3H]LeLmLuL}H]AzEt]EEEE@@L]LADEH}HHU AE;|L]LDHO EHELLUADHUH$HELT$HMHD$HT$DHL$ H}HuL]诱L]H0EtS tN tI tD*H}HU2HL;tLKH]LeLmLuL}H]ËE3+HcULIӾ0L]'2HcML]HMc0LM+L+LHL]1L]}  H}HUL]1U L]i }K| AtsDUEA; D;U~J}tD*H}HUL1HL;tLH]LeLmLuL}H]AHcDEH}McH+IHcuIMcIIHLL]0UL]LHtG,G.HcuHHUHcHJ<H+HcuHcIIHL;0LLu1~AtHEHcIH+@+HL;tL3H]LeLmLuL}H]þ*H}HU/HL;tL謞H]LeLmLuL}H]þ*H}HU/HL;tLhH]LeLmLuL}H]HH-1H#H;M      pE3EuEEMcL0LDU.DUAEDA;ZEl0SH+-McUI;u|AHH0Hs*H}HU7.HL;tLH]LeLmLuL}H]eHcH}H+IIcI+HHǾ0HLLHDU-HHLI+HH+DUHLHcuHILLHDUH-LADUHLHc *H}HU2-HL;tLH]LeLmLuL}H]ÅxHDEDLELcM$MϋuHUHHL;tL蘛EH]LeLmLuL}H]LcMDMDLEuHUHL;tLKEH]LeLmLuL}H]AE9L]LADEH}HHUAE;|HEHcIH+@-u>uA;D;u|AHEHcJH+щB0n~ub4A;VL&HDLcMDMMD]LED$uHUHHL;tL1EH]LeLmLuL}H]LcMDMDMLEuHUHL;tLEH]LeLmLuL}H]EuEEL0HL]*L]>UHH H];LuILmMLeMc}L*L[*M@tIFLDHcLL**HcLH+L *L+MLLH)H]LeLmLuH]UHH DDzALc]IH]LDUw DMDMDMDMtG HLMDUAL]L$D3VHHHS}t 3HHC3H]H]DUHH0LeAH]A@L}LuLmIՋEt.AIULD}AE-IHcLL(| AtAE3E~A;AVDLD;~McL*L(OIcLHI+׾ LM(LEM+LMЅ|=~AtAE+ILM+LLD(H]LeLmLuL}H]AE-I̐UHHH]؉L}LuLmIHUf)EfEHMH}LEHuHUHLEKANjEH}Ht^EuYU~KW}F8 u HHENu*HcEH}HEH}HuHUHLEA0HuL Aƃ| EEHEHHuiHME$b ЈbHuH]HLEH}IHMHA(HtIDpxHEHP(Dr|HMHHt3HPHEHDH]LmLuL}H]bHσDEH]LmLuL}H]DH 3,*HM_ bE$ ЈbEHuHMHLEH}IHMHA(HtIDxxHEHP(Dz|HMHHt3HPHEHDH]LmLuL}H]bHσDEH]LmLuL}H]HEH}cHuqHMHY(HctDCxH]H{(G|LMIHt3H{H]HH]LmLuL}H]bHσAOH]LmLuL}H]HEHP(H߾t^HMHY(HtCxH]H{(G|LMIHt3H{H]HH]LmLuL}H]3IEH]LmLuL}H]3DDoH]LmLuL}H]ÿDDJH]LmLuL}H]ÿƉ'H]LmLuL}H]É t^HMHY(HthCxH]H{(G|LMIHt3H{H]HH]LmLuL}H]3H]LmLuL}H]3Ɖ{H]LmLuL}H]ÃNBAHxu\AEuUHxH}HEH5H}HUHuHLELMf@UHH@HLmIH}H}HuHuLeHULEMЃH}Ht`u\U~aW}\8ti u HIENuDHcEI}IEH}HuHUHLEFMЃH}HuLeLmH]ø0LeLmH]ÃNtAHMu[AEuUHuH}hIEHtDLeLmH]H}MEIHUMHHue@UHH0LuILmALef)EfEEtAcELH})tyI~(Ht5GxI~(G|IHtE3LOMLeLmLuH]AbLALeLmLuH]Eu53LeLmLuH]ÿƉLLeLmLuH]D*tI~(HtvGxI~(G|IHtE3LOMLeLmLuH]@UHHPH]L}LmLeIH3Ht A$`HHHcH{H E H A$`tQ.H]LeLmL}H]A$`uك A$`A$`uA$`jA$euA$`A$`HHu A$`8Hu2 A$`%A$`t.H]LeLmL}H]A$dA$gtL(ÅEA$gA$NTA$`@t/I$Ht@2I$Ht@3LtEA$_tA$ft HE tJHE3fEfUHEE3HUA$x职Y0H]LeLmL}H]HOH8SE$xD;tMHOH87D;t9HyOH8#D;t%3L3y3A$xًEM$Mt8H;OH8݋D;u$IDL%t IDŽ$A$` I$J3HUH|@<8H}A$`t>HH5*I$H*IL *3H $"HA$`3HH5*I$H}*IL g*3H $HH}H}螢A$`tZI$J3HUHIxMMLI>HI>AuD?D{I>HI>33Ax~eH?HJ|MIMMNTMIMM#Nd I>HI>NLN+LHIIMcHI;|ADNMcLL{IHHSIHIH1H3I>HI>DDCIIHHSIHIH1H3IISIH1HsI>HI>LLIXMcL{IHHIBH3#HRMcL{IHJbIH4I63IEH]LeLmLuL}H]ø0H]LeLmLuL}H]3CH]LeLmLuL}H]CAIxMMM$I>HI>AuD?E|$I>HI>33Ax~ZH?HJ|MIMMNTMIMI;J| I>HI>NLN+LHIIMcHI;|ADNMcLM|$IHIT$IHIH1I4$I>HI>DED$IIHIT$IHIH1I4$IIAT$IH1It$I>HI>LM$I\McM|$IHI$IDH3.%HֆMcM|$II$J4JIHIUHIU AD$IU3IE0H]LeLmLuL}H]AD$AH0HtYH0H=H=lH=|3KkHZH=H0H.lH1H`HPxH[[H[H54xH  tHZLLWLZH=J jIL'UHHHHL L(DJL*L+HEA)x)p)h)`)X)P)H)@H]؉H=L}E3LuALmLeuH=tAH=uEt Dž DžHvHt:H=ս3HviHHeHvf 3H Y3;HHH|HvHt:H=k3Hrv/iH>HPHYv 3H #Y3<HHH|H=3H M3shL%@3HU~Au uPH=DhDHt'H +HH5cDHhDWEt5ډ3H +H5H3H9Mt 2ɈHIuA.HpHHffAnf8foftftfDfDAAEuEtEEtE;HI 3'7HHtYHH=HpeH=N3dH,H=HHp.dHH[H"qHVVH=m:dHHAHEt3t H„tHAtu=Mt 2ɈHIuA.HHHffAnf8foftftfDfDAAEuEtEEtE;HI 35HHtYHH=HcH=3bHH=`HH.cHHpHoHkk;c.(H'H8Ht/zH'HEt cH={uH={u =7tabHtH:3Hu蘜"L-RHoHF,(tHQL$LQH=J aIL-QHnHF,(tHQL$LQH=oJ JaIfDUHHpH H(L0L8DJL*L+HEA)x)p)h)`)X)P)H)@HnHH]L}LuALmAt:H=ߴ3Hm`HHHmp3HP3D;,HHH|E~=EHEE0HHEHUH=.3HLE_HHHAEt3t H„tHAtu9Mt 2ɈHIuHH]LmLuL}H]H=V#`HHAHEt3t H„tHAtui9Mt 2ɈHIuA.HHHffAnf8foftftfDfDAAEuEtEEtE;HI 31IMtMH=HA_H=3^H=ZHHA.|_HHHkHHNHkHۋ  vtHuNHHeNDH=FH !^HDUHHH8L@LHDJL*L+HEA)x)p)h)`)X)P)H)@L}ILuA 3HUusH}3 EHEE0H HEHULHU3H}^HU胺 tD3HUAAAwvMcHLH ^J ῗ6/(! 3$H}tLuL}H]HvtLuL}H]fUHHHiHuHH=}V\3HiLeILmIK< tII|LeLmHliH]UHH3LmL-HiLeLuIL}IH]I!DH iHt:H=3Hh[HHHhy3H5K3;0lHHH|LHHfftfu HH-H3HLHqH phLIIEt3t H„tHAtu4Mt 2ɈHIuIIIIHhHLuL}H]t:H=֮3HgZHHHgg3H J3<HHH|HgLAEt3t H„tHAtu4Mt 2ɈHIuLeLmH]H=hZHH(AHPEt3t H„tHAtu3Mt 2ɈHIuA.HPHHffAnf8foftftfDfDAAEuEtEEtE;HI 3,HHtYHH=HPYH='3XHH=HPH.YH H!H eHH=FYHHAHEt3t H„tHAtuY2Mt 2ɈHIuA.HHHffAnf8foftftfDfDAAEuEtEEtE;HI 3*IMtOH=tHAEXH=۫3WH=IHHAE.jXHHHdHH{GH5dH  dtHcGL$LSGH=2J WIH &GH=CdH45tH GL$xLFH=J VIRH cHt6H=Ъ3HcVHHt=Hce3H F3< XHHH|H=VHHAHPEt3t H„tHAtu/Mt 2ɈHIuA.HPHHffAnf8foftftfDfDAAEuEtEEtE;HI 3N(HHtKH=HPAVH=3OUH=HPHK.VH <HH [bHH "EH5?bH tH EL$tHD H=H TIKUHHH(L0L8DJL*L+HEA)x)p)h)`)X)P)H)@3LeI3H]L}LuIHÿ 3HUjt|HHHfftfu HHb&LcM;rLHL,$LHLMM+L L&H]LeLuL}H]H}3 EHEE0HHEHUHHU3H}THuHHHfftfu HH%HcI;r LLl!LH_LL+L LiH}jH]LeLuL}H]@UHH3(H]UHH@L}IH=H]HLuLmLeIHMMcXA3I@HUCht*Ht;uM0A$')33H}3I@MtH}LL_HEA EVu   u4H=CRHtH =HH5HRH=Lm RHt,HH5QIMtLL3QLQH=4uHL3H2QH}iHt+;u&MtA$H]LeLmLuL}H]NH/H8HthHHH=%谵u H=%蠵uHt;3PPHEHt HEH83HuMMt6IE.|fUHH@L}IH=FH]HLuLmLeIHMMcA3I@HUft:Ht';u"MtA$H]LeLmLuL}H]ÿ)33UH}3I@CMtH}LLHEA EVu u4H=OHtH HH5sHOH=lnLmOHt,HH5BeOIMtLL3\OL6OH=9uHyL3H20OH}fHt+;u&MtA$H]LeLmLuL}H]HH8HtzfHHH=`u H=PuHt;3|NANHEHt HEH83HuMMt6IEވ|fUHH0LmILeHPLc澅H]L}Pt t t uHtH3MaB(tHI;|H3H|HUtcANju u4H=tMHtH HH5WHMYEnAE3tI;}HUB.2HB .uMtHE:HcHUD HHHEIHPEt3t H„tHAtu&Mt 2ɈHIuHEHcH(H0HDžf)@3HH c<L(3L@HHHHHDž@ftF3 HHHCHHS K H}cH]LeLmL}H]H7H5,LHP3H;KHXHt6H=3HXyKHHtlHXJ3Hq;3Ɂ<HHH|H+H H5!3H9QKH]LeLmL}H]H=lKHHAHEt3t H„tHAtu$Mt 2ɈHIuA.HHHffAnf8foftftfDfDAAEuEtEEtE;HI 3HHtKH=HJH=63JH=HH.JHHfHWHaaH9HVHۋtH9HH]H9H=H cIHH]-DUHHH]3L}ILuLmLeE3LcHHPHHHHx P$HH(HHx0HL@8LLH@LLPHLLXPLHPXH@`u IIHLɺ H=LΊ:utW:VuHHu3H=LΊ:utW:VuHHu3tZLLMEt3t H„tHAtu!Mt 2ɈHIuH]LeLmLuL}H]ËHTH҉xt:H=3HT_GHnHHT,3H S7x3;< HHH|HKTHt:H=+3H2TFHHHT3H 63<3 HHH|HAHEt3t H„tHAtui Mt 2ɈHIuHuȋHxݳtHBx3HEHEHJHu!3HxHEHp觫aH3HU[ HEȻHUHJHtHt HuHpDHpHHHfftfu HHHcHUH|13+[Mh3HHH}LE'FLMHUEt3t H„tHAtuMt 2ɈHIuH}\HQHt:H=ט3HQDHHHQh3H 43<HHH|H=I3H ?M3CLH'MEt3t H„tHAtuMt 2ɈHIuH]LeLmLuL}H]H QHt:H=3HPCHHHP}3H 33<HHH|H=^3H TM3BLH<MEt3t H„tHAtuMt 2ɈHIuH]LeLmLuL}H]LHtMEt3t H„tHAtuMt 2ɈHIuH]LeLmLuL}H]H=+BHHAHpEt3t H„tHAtu>Mt 2ɈHIuA.HpHHffAnf8foftftfDfDAAEuEtEEtE;HI 3HpHtYHpH=NHpxBH=3AHH=HpHp.ABHlHHNHH=AHHAHEt3t H„tHAtuMt 2ɈHIuA.HHHffAnf8foftftfDfDAAEuEtEEtE;HI 3;HpHtYHpH=H#AH=b31@H@H=HpH.@HHH6MHH}W/3HH}HM@H=R@HHAHpEt3t H„tHAtueMt 2ɈHIuA.HpHHffAnf8foftftfDfDAAEuEtEEtE;HI 3HHtKH=Hp?H=3>H=WHpH.z?HHHKHH.HKHۋ  ttHs.L,Hc.H=BH >IH=>HHAHpEt3t H„tHAtuMt 2ɈHIuA.HpHHffAnf8foftftfDfDAAEuEtEEtE;HI 3HHtKH=Hp>H=Q3 =H=HpH.=H HNH,JHIIH,HJHۋ  tH,L,EH,H=H <IH,H=IH  tH,HHSLo,H=NJ )<HH#H_IH 8,HtL,H=xH ;ILHAEt3t H„tHAtuMt 2ɈHIugt h3L'UHHLuADLmILHHfftfu HH D;~HcLMcLL+ LvLmLuH]fUHHH]H;:DUHHt'H t,3Ht'Ht*3Ht'Hft+3Hht'Hgt)3`H9tH0t(31H]DUHH0Ht'Ht,3Ht'Ht*3Ht'Hbt+3Hdt'Hct)3\H5tH,t(3-HH8HtPHHHHf)EfE3ExLe H}Huү}t"(tۿH3HED_ t@cH}Hu蚩t(LEǾD3A_LMI.D&ZHI38LeC>3H]DUHHH]HL}ALmLeIE33HU M<E3ɺE33IL$E33H}DA EHEuuuH}uuuHDA tA(tWEt+I$APHPIMп:3 H}HcEH+mN>H]DLeLmL}H]33uDmAH]HD}ALuIE;'DHAa|AzAsHDNI$HrL;}33a| zFNMcH>Bȃ)wLHcHCH=H<}LH5>B<AADUD}HLuEt"APHPIMп:H3HcEH}H+?M>H]DLeLmL}H]E)}EEt,EHuH#McLME3EE3HuHEHEEExE EuA EHuHMcH}ELMDh\&DhE3E3HEDUDUDUDUPEE}Ca|zpLANÃLuE HARuEHAE HuHEHEEE}/DAa| AzAsDNIPuEHASuEHAE DpH}DhDx%%DxDhDpEtEk}Ha|zD^MANƽw\HcLAHIEnHAElHAEqHAEoHA}D}HLuEt"APHPIMп:H3HcEH}H+1J>H]DLeLmL}H]EmHA EpHADpH}DhDx#DxDhDpzEE}!EH}DpDhDx}#DxDhDp}EtE8DEDLEH}DME $#E3E3HEE3DUDUDUDU E}EEt,E}HuHMcLME3EE3HuHEHEE EL}BEEt/EHuHMcLME3EE3e HuH`EHED E}EEt,EHuHMcLME3EE3HuHEHEE E}EEDDEDMH]AHAEDhH}N!DhE3E3HEDUDUDUDUB E}EEt/EJHuHMcLME3EE3 HuHEHE E}EEt/EHuHMcLME3EE3 HuHEHEn E>D]E}YEt,EL]M;McLME3EE3L]MEHEHNuE.H SuE1H E A u}.u E0v1u E3hD}HLuEt"APHPIMп:H3HcEH}H+E>H]DLeLmL}H]E EAD]AtKAuDMCAuDM7HcEH}H+LuD>H]DLeLmL}H]DME3E3D}HLuEt"APHPIMп:H3HcEH}H+DD>H]DLeLmL}H]HCDP;E}EEt/EQHuHMcLME3EE3HuHEHEHNZxE}E+Et,EHuHMcLME3EE3HuHjEHEEGE}EEt/ESHuHMcLME3EE3HuHEHEE53}DDEtcuƉutuDMDMDMD`H}DhADhD`3uuuHD AHE;tI|$I<$H;sD HAE;uD:DNADu-D:[E3E3HEDUDUDUDUH}EHEEuDhDh;E3E3HEDUDUDUDUzMEEEEu"tt+ttt @sDI@Is4H uHIA3 uE;|HcL1A<3EDME3}trEt+uƉutuDMDMDMDhH}dDhE3E3HEDUDUDUDUXEE}=AE}tmEt+uƉutuDMDMDMDhH}DhwE3E3HEDUDUDUDUEH}DpDhDxpDxDhDpEM}tmEt+uƉutuDMYDMDMDhH}DhE3E3HEDUDUDUDUEH}DpDhDxDxDhDpWE}tnEt+uƉutuDMDMDMDhH}LDh3HEuuuuEEEtMcLMDhH}DhE3E3HEDUDUDUDU}/E&Et1uƉutuDMDMDME3E3҃}t=DhH}jDhgE3E3HEDUDUDUDU}EH}DpDhDxDxDhDpM}tq}AAuH}DNMcLMEDhDhVE3E3HEDUDUDUDUBEH}DpDhDxMDxDhDp uƉuЃQCAC4ELsH]DLeLmL}H]D}HLuEt"APHPIMп:H3譸HcEH}H+ ;>H]DLeLmL}H]D}HLuEt"APHPIMп:H3LHcEH}H+:>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+K:>H]DLeLmL}H]D}HLuEt"APHPIMп:H3芷HcEH}H+9>H]DLeLmL}H]D}HLuEt"APHPIMп:H3)HcEH}H+9>H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H3軶HcEH}H+9>H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H3MHcEH}H+8>H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H3ߵHcEH}H+?8>H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H3qHcEH}H+7>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+p7>H]DLeLmL}H]D}HLuEt"APHPIMп:H3说HcEH}H+7>H]DLeLmL}H]D}HLuEt"APHPIMп:H3NHcEH}H+6>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+M6>H]DLeLmL}H]D}HLuEt"APHPIMп:H3茳HcEH}H+5>H]DLeLmL}H]D}HLuEt"APHPIMп:H3+HcEH}H+5>H]DLeLmL}H]D}HLuEt"APHPIMп:H3ʲHcEH}H+*5>H]DLeLmL}H]D}HLuEt"APHPIMп:H3iHcEH}H+4>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+h4>H]DLeLmL}H]D}HLuEt"APHPIMп:H3觱HcEH}H+4>H]DLeLmL}H]D}HLuEt"APHPIMп:H3FHcEH}H+3>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+E3>H]DLeLmL}H]D}HLuEt"APHPIMп:H3脰HcEH}H+2>H]DLeLmL}H]D}HLuEt"APHPIMп:H3#HcEH}H+2>H]DLeLmL}H]D}HLuEt"APHPIMп:H3¯HcEH}H+"2>H]DLeLmL}H]E#D}HLuEt"APHPIMп:H3UHcEH}H+1>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+T1>H]DLeLmL}H]D}HLuEt"APHPIMп:H3蓮HcEH}H+0>H]DLeLmL}H]EE}uzCuErHAPuEsHAHQ3DpDhDxDxDhDphD}HLuEt"APHPIMп:H3蠭HcEH}H+0>H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H32HcEH}H+/>H]DLeLmL}H]D}HLuEt"APHPIMп:H3ѬHcEH}H+1/>H]DLeLmL}H]E`EW}HÃa|zpLANA̓Nu EUZu EGH3DpDhDxDxDhDpDpH}DhDxYDxDhDpbHcUH}H+Lu&.LeE؉H]LmL}H]D}HLuEt"APHPIMп:H3hHcEH}H+->H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H3HcEH}H+Z->H]DLeLmL}H]D}HLuEt"APHPIMп:H3虪HcEH}H+,>H]DLeLmL}H]D}HLuEEHEt&I$APHPIMп:Hɾ3)HcEH}H+,>H]DLeLmL}H]D}HLuEt"APHPIMп:H3ȩHcEH}H+(,>H]DLeLmL}H]D}HLuEt"APHPIMп:H3gHcEH}H++>H]DLeLmL}H]D}HLuEtAPHPIMп:3 HcEH}H+i+>H]DLeLmL}H]D}HLuH]DLeLmL}H]Ã}D}HLuEt"APHPIMп:H3-HcEH}H+*>H]DLeLmL}H]D}HLuD}HLuEt"APHPIMп:H3迧HcEH}H+*>H]DLeLmL}H]D}HLuEt"APHPIMп:H3^HcEH}H+)>H]DLeLmL}H]D}HLuEt"APHPIMп:H3HcEH}H+])>H]DLeLmL}H]EH}DpDhDxDxDhDpMD}HLuEt&I$APHPIMп:Hɾ3LHcUH}H+(LeE؉H]LmL}H]D}HLuEt"APHPIMп:H3HcEH}H+N(>H]DLeLmL}H]D}HLuEt"APHPIMп:H3荥HcEH}H+'>H]DLeLmL}H]D}HLuEt&I$APHPIMп:Hɾ3(HcEH}H+'>H]DLeLmL}H]D}HLuEt"APHPIMп:H3ǤHcEH}H+''>H]DLeLmL}H]H]Lu3HcUHMH+H H]LeLmL}H]D}HLuEt"APHPIMп:H39HcEH}H+&>H]DLeLmL}H]ËuHH]D}Lu`Et&I$APHPIMп:Hɾ3ţHcEH}H+%&>H]DLeLmL}H]fDUHH0H 1LuIL}LmLeIcFAvA;~HHBAFH"HA;HsA E~ A~ ICT=;~XHcHuHA~H McI+HMHe$E~ A~Ic CD=HMI;HMIcFHtjA AF(AV$AvA~ AAQqyH IE~ 3AFLeLmLuL}H]ø>LeLmLuL}H]IcV HIvfQA~?H`~iHLaLAH+E3H;EOE3I+H;EOE t%LLaMcKD%EIEn V3@<0@|HH;rLaAN ΁}ƉڃEDl1gA~ @AF##DA~$AvLeLmLuL}H]DUHH@IH]IL}LuLmLeID}E3L=3L}3I$I A$E_EADuEEE3ۀYDDމE E$EAAAD DAD AtAADEDEA$D^A$n McH=|L*D}ENA@  @  AB3,HcH5kLLAE$A$I:AR5 E$A$I:5 E$A$I:5 E$A$I:#: E$A$I:[5{ E$A$I:65V E$A$I:5. IMA$A$8, @} AB3,HcH5LkLAE$A$I:AR4 E$A$I:h4 E$A$I:@4` E$A$I:88 E$A$I:3 E$A$I:3 E$A$I:3 IMA$A$8+ AB3)HcH5LLAE$A$I:AR)3I E$A$I:3! E$A$I:2E$A$I:W7E$A$I:2E$A$I:g2E$A$I:?2_IMA$A$8'*7EZA2A A$A$E3ۉ]EfA$fE$AB HcH5ILWLAI MA$A$H8.IMA$A$A$H8+dI MA$A$8,)<IMA$A$A$8J& I MA$8A$(IMA$A$8A$%I MA$8A$u(IMA$A$8A$%R=H]LeLmLuL}H]A3A$A$]EfA$fA$^tAD}AB wHcH5L[LAILA$H8@ILLE8A$<ILLE8A$}<]ILLE8A$Y<9A8|H tk tf ta@A?DDMI$IIcBL+3M~B HI$IIcBL+I;|H;HLIHcI2HtEUfA$fA$DH]LeLmLuL}H]3H]LeLmLuL}H]ø0H]LeLmLuL}H]UHH`H]L}LuILmILeH/E3HEE3IHtYuMAtMteAC  HcH-H EEH A@A$AEDEƒ3HcHHKHHAAUMMWC HAMM5C HAMMC| HAMMBZ HEALMB}HUIuE  EHALMB}HUIuEl HDAME|@A@A$AEDEƒ3HcHEHHHAAUMMAeHAMMAFHAMMA$HAMMAEHALMpA}HUIuE}EHALM4A}HUIuEHDAME!?jA@A$AEDEƒ3HcHHHHAAUMM@ HAMM@HAMM`@HAMM>@EHALM@}HUIuE"hEHALM?}HUIuE,HDAME=AE7 13fAfAA@EAE HcH(LLAH AME:IEAuHHAk=dHHAFHH AME<+IEAuHHAk8HHAEH ALE<}HUIuEoAuHAHM7HAHMDE}HUIu~dH ALE<}HUIuE4AuHAHMz7HAHM0DE}HUIu=H]LeLmLuL}H]Ã3fAfAAE wHcHH H HAIMDmHAIMCPHAHMjC}HUIuE7HAHM:C}HUIuE8| 93fAfApAE@sI 3IA@DCDƒA@EDEƒD EAA@AAEEAAAE EA EEAE D@DEADADE‰ʃD D@DEƒ@D ƒHcHH $H At>FtfuE3AIu3MEA@MUABMeE\$ HHE]AAA$MM\$0[H5At*Ftfu3IM3Iu^>HHE]AAA$MM\$o1HAt!Ftfu3IUHHE]AAA$MM\$'EH_IIcUH;Me}HAH+$HDL+HcLHU߃A;]}HEB HA;]|Et9 t4 t/u$ITuA;uAA@DH]LeLmLuL}H]ø0H]LeLmLuL}H]@UH:u@;t @>H]DUH:u;t 3ff>H]@UH:uH;t @>H]DUH:uH;t 3ff>H]UHHH]L}LuLmLeIHUHuE33McA$gt!LHMwHM A$gI$A$`@tLHtaB0tDLHuкE HM)HM~ I$Ht&@0I$HtB1I$Ht@4A$LF)HcHH-H A I$DDM$HI$tyH vUHDHpHMpHMHpHtMHHHH+HI\$pI$I$I$3HvD@:4# HH;rL3HcDžpI8uuHUHM{HMHUA;$xu+A$btEM$EAL+HtOI|$hH;wH4:H;r}rH4H;sH3HUHMsHHUHM HMHUI$PE3I$HID$hI\$hD}HIDŽ$PI$I$XHEHUHMDpHLMHMIc$xHUI$PI$}t   HI;}0E:Dt'A$`@u I$uEHHUHEE3H ~+HEuHUJ<(I|$h[IHUM(3H~!HMJ4)MIt$h: 7HH;|LMA HULIHpH+I\$hA$cI$HMHtI\$pI$I$};H2HٺHHA$xHV3I$I$I$I\$pA$cI$HRI$3HMI$PMIc$xI$HI$PI$ I$3HH}HD3I\$hHI$PI$I\$pI$I$Hu4H]LeLmLuL}H]I$I\$pH;*A$^I$AI$AI$3I$AI$AI$E3E3A$`3۩uA$futkI$HI$I$Hu]I;$uSA3I;$DE=H3^G I$I$I$DI$McHMLMH}D}Ilj]HH;UI$I|$hH;wH :H;r rH 2H;s 3{It$hHMI$MI$I+$Ic$x IL$hH}I$HI$I$oHH;UAugI$A$c DAyDItAD E D IcAA A A HceA$hMAu?I$yDD IHCHI}H?HHH;LEI$J (HMH;y A$^P }F H}I+M$L;vA$e@# H}HtH}H M$HHMH+HDžpHxJ4H;wHxH< H;r H;rLI;sH+UH3 H+UHyHMHULI$L+HxHI+H+L;vA$h HHpIDLMHMIc$xHx\HMHHxL+A$e@H;MH }+HuH+I+$A$x;HMIc$xIt$hHUHM2HpHtI$HID$hI$HEHpA$cID$pHt I$A$^HI$IDŽ$H;trA$Ltu_x HPuH;HHGI$A$ht8te3HHH;v-HH+Ӏ9 u"HHI$HH;r t-A$`@t"A$atA$Lu HI$H+Hu=A$`@u&€uA$futA$Lu ;=3H]LeLmLuL}H]Hc&I$H]LeLmLuL}H]jA_DI|$hH+߃}tlEDDI$HI+HH< HuHpLE~LEHpI$I$HUI|$hL;I$HM}tHMMI+L;w M$LHUHuLEH<HxLECHxI$I$LuHUI|$hEDD EL+HH3AL>5Hc'I$H]LeLmLuL}H]MDHHIt$hI$A$cI$_HcA$h IL$pyI$ A$eH]LeLmLuL}H]I$ A$eHxHEHHMLMD}][Et M$MD$hI$L;tNw IH;rL;r H2L;sL3LpLMLLpLMtLMLpI$HH;UuH]LeLmLuL}H]HxIt$hLMJL)HHpLMHpuI$I$MD$hbH]LeLmLuL}H]I$LH+LHHMMIc$xLMLMH]I$HID$hHEt A$e@H;UrHHMJHM+I$IH+I\$pI$I$A$cA$^I$'I$H]LeLmLuL}H]I$I$H]LeLmLuL}H]I$I$Hc'I$H]LeLmLuL}H]HEHHE8HuHMH+A$xHhA$h LHMIc$xIt$hID$hA$c DpPDPtD AD E IcD AD E Ic|A$hI$HHHcA$h MHLMIc$xIt$hLMI\$hLMI$II\$pA$cA$^I$H}H}L;A$e I$I\$pHxLMD}]LMI$zI$I\$pCH]LeLmLuL}H]H;|H;UHH@LeIMI$t I HuH;Mt I Hu}LeILmLuIL}MH]HLHڋ}IHt*HMLL+HMt I HuL;IFMtI;tLmLuL}H]SHtI$3ɺHEʉLeH]DUHH@L}ILuH]I IILrLAg@t7I(H;|+I;0}"ILJH+HIWhIL3Ax\HILJIA`uAfuIHI;I AHLAxHEA3H;wH H3HHEH҉}IDDuIL}LeILmIHLL}MHHt'HML+LHL MLDM;MFMtI;tDuHL}LeLmAe@H`I AHLAxHEE33IwhH;wH+H3HHEH҉}IDDuIL}LeILmIHLL}MHHt'HML+LHL MLDM;MFMtI;tDuHL}LeLmHHA^tAMEuC3IHIOhII I(HH;uHDI0I03ILJH]LuL}H]Hc'IH]LuL}H]IWht @a$H]LuL}H]I I(IUHH]DM Aɀ D3ȃD3ʃAD3AD3AE3tPADMf))))H@u @t M@DMUH]UHHPH]L}ALuILmLeI%uu#A qH]LeLmLuL}H]Dt6BHtHLeLutHEHH=lD-t0>tDLL^AA YMcHHTJN33{n3H^nAh3H;nAEAMAD$t M IN0n u~uxutvutt  Dt u tSu tAu t/u tu E˃aHcHHHF33lEG33l233lHwrHt@A33ulHQrHt@33OlAuC3rHrHt@J33lHqH@IF0HEHgt8HqHt@H33kHqHt:@1HqHt@I33kK33wkAL33OkA\H3*k:33kA'O33kAE33jE3ƛH=pHtEHpER 3=*Vfed&>6.y=n=c=X(RHH SHH%======8uHE3H}Ht t(t܃0t׃8tӁ8zqH8H%= HE3H}HHE3HIv0H]HHHIv0HH 3Iv0HH 3Iv0HH 3Iv0HH  3Iv0H H0 3Iv0H0H@ 3}Iv0H@HP 3_I~0HPH޺ 3EIF02H]8 I~0@@@ @MF0AMN0AHE3H}Hу8HcHH *H HE3H}H9HE3H}H'8HHHE3H}HIF0IV0AtGll}4HlHt@J33fHlHt@H]LeLmLuL}~lH]{lHdlHt@J33bfHClH@uHEIV0*H H H HEP3H}HHE3HIv0H]HHHIv0HH 3Iv0HH 3Iv0HH 3Iv0HH  3Iv0H H0 3hIv0H0H@ 3JIv0H@HP 3,I~0HPH޺ 3IF02H]8 I~0@@@ @HH JH HEHP3HPIv0H]HHHIv0HH 3bIv0HH 3DIv0HH 3&Iv0HH  3Iv0H H0 3Iv0H0H@ 3Iv0H@HP 3I~0HPH޺ 3IF02H]8 I~0@@@ @H~H H HEP3H}HHE3Iv0H]HHHIv0HH 3Iv0HH 3Iv0HH 3Iv0HH  3|Iv0H H0 3^Iv0H0H@ 3@Iv0H@HP 3"I~0HPH޺ 3IF02H]8 I~0@@@ @zK33taDUHJg ?gH]fDUH*gH]ÐUHHA?DDAfDEDD DƁALeDEA#A AAAAAAfDA?F$AA3EA3щ=fAٽA3G$A3 ff٭]U ʀA 3AA3AA3AA3A3tNUf))))H@u @t M@UULeH]fDUH~@e~3eF~%eF~eF ~ eFH]UHwmBH]DUHH3LuILmIՉH= LL|Mt+H= 3iH=Z3A6AVANMFLMH= 35H@IU0IM(2zLBLJH $HJt$|$Hr Hz(LD$LL$ LB0LJ8HL$(HJ@Ht$0H|$8HrHHzPLD$@LL$HLBXLJ`HL$PHJhHt$XH|$`HrpHzxLD$hLL$pLLHL$xHH$H$HHL$DLL$H$DLH$DH$DL$EL$$DуAA $$AD$D$AD$EA ADDDDD$EAED$EEAAA A@D$A鉌$$$ AD$(AA8D$0A@AD$8AD$@AA%D$H鉌$P$X$`H="AD$h$pDDDD$xD$D$D$D$$3$$AuIU IMEEMMHIE0HDDDD$DD\$Dt$DT$DD3|$ H=H0IE0HDDDD$DD\$Dt$DT$DD3|$ H=H0IE0HDDDD$DD\$Dt$DT$ DD3|$ H=H0IE0HDDDD$DD\$Dt$DT$DD3|$ H=H0IE0HD$D#D"D$D! D\$Dt$DT$)('D&D%3|$ H=H0IE0HD4D3D2D$D10D\$Dt$DT$987D6D53|$ H=H0IE0HDDDCDBD$DA@D\$Dt$DT$IHGDFDE3|$ H=H0IE0HDTDSDRD$DQPD\$Dt$DT$YXWDVDU3|$ H=H0MU0HĠEeEfAgAhD$Dt$EiEjD$|$AkAlD\$ Dt$(EmA`AaAbEcEdEnD$03|$8H=EoD\$@Dt$HDT$PNH`MU0HĠEuEvAwAxD$Dt$EyEzD$|$A{A|D\$ Dt$(E}ApAqArEsEtE~D$03|$8H=ED\$@Dt$HDT$PH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=jED\$@Dt$HDT$PH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=>ED\$@Dt$HDT$PH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=ED\$@Dt$HDT$PH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=ED\$@Dt$HDT$PRH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=ED\$@Dt$HDT$P膽H`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=ED\$@Dt$HDT$P躼H`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=bED\$@Dt$HDT$PH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=6ED\$@Dt$HDT$P"H`MU0HĠEEAAD$Dt$E E D$|$A A D\$ Dt$(E AAAEEED$03|$8H= ED\$@Dt$HDT$PVH`MU0HĠEEAAD$Dt$EED$|$AAD\$ Dt$(EAAAEEED$03|$8H=ED\$@Dt$HDT$P芹H`MU0HĠE%E&A'A(D$Dt$E)E*D$|$A+A,D\$ Dt$(E-A A!A"E#E$E.D$03|$8H=E/D\$@Dt$HDT$P辸H`MU0HĠE5E6A7A8D$Dt$E9E:D$|$A;A<D\$ Dt$(E=A0A1A2E3E4E>D$03|$8H=E?D\$@Dt$HDT$PH`MU0HĠEEEFAGAHD$Dt$EIEJD$|$AKALD\$ Dt$(EMA@AAABECEDEND$03|$8H=ZEOD\$@Dt$HDT$P&H`MU0HĠEUEVEWAXAYD$Dl$EZE[Dt$D$E\A]|$ A^D\$(Dl$0Dt$8APAQARESETD$@3|$HH=$E_DT$PZH`LmLuH]ÐUHH@H]HL}LuI!Pu PPtH]LuL}uPH]ÿ3HUHEHt@HEHHUHJP H=PH=Hu3L=L}ERE蔵Hu3脵 Hu3t Hu3dHu3ERMHu3=HuHU+H}HuL}HU H}tI3OL5VO!3:83,5OH]LuL}OH]ÿHuHEHU蠴뛿HuHEHU脴_UHHpHLeLmHMHLuL}HIH]HwHL3L%|HtL lE3OvG4 E$CE 7HcLL ~M ACE3IGCIDCfEfECE3IGCIfEfECE3IIGfEfECE3IG3ILJfEfE3E3IGIfEfEk3E3IGIfEfEt_AAAArEA u5 t1A@s+HLs3LeLmLuL}H]H]ËCEIGCIDCfEDKfECAHEDCDSALDED[ MAu KDDEREA u,KHO HQ' 3OFHQ, 30F} tHmQ/ 3 FHcEA IG5 A + A! HA@ CHEDCDSALDED[MAu KDDEREA u,KHmHP' 3`EHP, 3AE} tH~P/ 3EHcEA I3H|H=~A@ CHEDCDSALDED[MAu KDDEREA u,KHHO' 3zDHO, 3[D} tHO/ 38DELfAE7CHEDCDSALDED[MAu KDDEREA u,KHH O' 3CHN, 3C} tHN/ 3jCELfAE| A~-A@ HN3 CIIGPAsAGX(McLL O AIcA$I_ AI_IcA I_$AI_IcA$I_ AI_IcA$I_ @AI_IcA$I_ AI_IcA$I_ AI_jIcA$I_ AI_HIcA I_$AI_&LeLmLuL}H]ظ>H]LuDLeDLmLL}H]HLuHH]DLeDLmLL}IHII>LIILMcMIIMHcMEHIHcHHGLuDLeDLmLL}H]HcҸ fHWPLuDLeDLmLL}H]HcҀ HW LuDLeDLmLL}H]HcHWHMdH]HKpH+HH;HGHKpIcI_I_H]HdHDFHMIcHApI_I_jA tHcIc_HMdHMILIpLM;wrHMHH|bHMTtuMHMЀLuM;t;H=H}HNHcHHEHXpIcI_I_HEIcLHpI_I_HEHHHHEHIcI_I_wIcI_AI_`IcA I_$AI_>IcA$I_ AI_IcA I_$AI_IcA$I_ AI_IcA I_$AI_AHcADO(AIcI_I_ALI+_AAAufAAfC\G:IcKD`AAOI_fCLG(CI_LeDLmLLuL}H]HHGƇHGu3H]Mc3fAIGAI_H7B H4I<3 IcHAI_LeLmLuL}H]ظ>H]CTECTECTECTE\A@ACH| H=A@o>H]HMHHu-H]HKpH+HH;HGHKpIcI_I_H+H~HEHIcI_I_tHMHHH;HǁHGHYpIcI_I_HHH;HYHEMI_hIJ 2H+H;vHILMt'AbuHHH>HHI&IMLMopH+L+MMMLmLELL+MMWxLUMEL+HIIHIt$AbuHHH>HHI HIHIwhHIIOhLHEIHMHIGpt LMIHt LMIGxHtHEHE`HEHIOxE`A@t IHuIpL+ L33H]LeLmLuL}H]ø)H]LeLmLuL}H]fUHH HHcBH;}#LL;D|u HcDHHcBHHH]HH]UHH L}Ic H]HI?EOtUA|OAIH3H?3HHH~$H@tHD@7D2D0DHHH;|3H]L}H]LPA|A~A2|A4~A(|A0ÅtSMt A4tA2uBH3H?3HHHH~)L ;FT HDDE2F0\ HHH;|EOMcHJcDHHH+H=HJ HH,3HUHcHuYHu IEHuIEIMKIEIMKI?uwMDEEA _H]L}H]DUHH0LuIH]HL}ILmAFLeIAc t]MHH3H?3H3HH=J#IDLFF 'E2D2THDTHHH;| H|HiHIHHu)HHtH HًB3Hً LHu A$AH IAHtHHډAt$A# At$AЉE#$D E$OHIHHuH.HHtH HHBH3HHHH LHu I$H AIDHtHHHHcI#t$HH It$DI#<$HH I<$LHI63/IHHHtH HHB3MIHIJ ‰Mt!IIIDAX# fAX։A# fA3H]LeLmLuL}H]Ã2~!2| 4~(0 HcHުMPHcTHt6I>JI+HH HH Ht.3LHcHt`_H]LeLmLuL}H]HuA$4HuA$WAT$A$WAT$OAL$w At$ Ac tOMtAF4t2u莭DILmLuL}H]UHH0HuH]3ҹ(t t H]H]Ã|CNÉEhHcH 0HH<HH}t HW(Ht3HHLJ_L3HwHffG3fG @Ofև`fևh)@)P)D)D)D)DH@uHUЊ_$ h_LQH1?HuHUHMI 3H}HHcH;HUHHGHHBHiHHLJs$a$ Јa@itZY@itRQ@it$d$ Јd@itXW@i t\߈[@ig@HtHC3H]H]HcMH.HHGHH HzXHHtHkXHHHǁHAHHMHtHmHEH]H}TbUHHp3H]L}LuILmALeIHEHEEu A E3 EDDHW8A5ADmAEELeLcEM|cIh]IL%^-K Ht#_ u tt HP(HH#-LDHuHM~tzDHuHUHM`%HEHtMcL;mLcEH,IDLHuHM2LeHEHHE HP(EHxIMtID$Lt"t u HE耈h HE耠hHE@THU耢hHM耡h}H} ÅAAMANͅHh?HcH+HHHt HP(HtHEMD3VDiDHHǀs*a@@߀A@ @aDiAtZAYDiAtRAQDiAt*d@@A@ @dDiAtXAWDiA X\A߈[Di<MDHuHUHM.HEHMcL;DiDHHǀs*a@@߀A@ @aDiAtZAYDiAtRAQDiAt*d@@A@ @dDiAtXAWDiA t\A߈[Di`@HtHBIH]LeLmLuL}H]3H]LeLmLuL}H]H]LeLmLuL}H]P@r P@HEr(H]LeLmLuL}H]A}Eu EpHUҢHM3HQHff@qfq @qfց`fցh)@)P)D)D)D)DH@uMcLAAEANŃi}} HEHu7HUHEHBHHUHtBHEHBHHEHrQHE>IH]LeLmLuL}H]HcMH'HHEH MLemHEHtH QpEHU膡HU3HJHffBfB B@fւ`fւh)@)P)D)D)D)DH@uHEMcLAAEANŃi}} HEHHcUHHEI*3IH]LeLmLuL}H]HELeHEELeEpHUHEE3HPHffDxfDx Dxfր`fրh@)@)P)D)D)D)DH@uHEMcL3HUfHUHEHHuHMHHEHPHfDxfDx Dxfրfր)D)D)D)D)DHPuHUHEHeH)OHHMMHHQHH}H>THEtID$L3HUH]Le؀hHMLmL}hHuI6LuH]H}EEHEm踐UHDWDN׸sIALw$3 Di E+AiDIK4HI0t!;vHHvHHI0uH3H]HUHHPBH]L}ILuILmALe,E'D;%uAtȉD%AD%EAhAIcHExAqkHm#HHJAhIH]DeHDHUIH]HHLeLmLuHNHOA7L}H]DeDmAH]HDAAL$HUIDOE'H]LeLmLuL}H]A|$DHuHUHMË}}=t D`DNuQHEHHE'IHtH;t~H@HHuD HUIH]LeLmLuL}H]ÉE'H]LeLmLuL}H]HA3AH]LeLmLuL}H]HxHHH}zEAE'D`3A%H]LeLmLuL}H]UHH!HcHH8HtHH;HcH@HHLHuH]UHHLmILeA`@+IHA2΃,HcHNHHL;iLaA$c@tA$NLuIHtG2tvI|$(Ht4GxI|$(G|I$HtE3LOM$LeLmH]A$bLALeLmH]I$ A$eH H33LeLmH]IT$hB t"+u BA$cA$cB$A$cƉL LeLmH]UHHH]HHFu {F=xFt5 =~ ȉFF׳=}ƳL}I߉É uˁL}ZsH=Ns i +HH7HtHH;s1HIHHuLL}ȉCE3H]H]HcH;uLL}HhEH aE&u NE3H H$CD3E3AEAA+i D+DD3D+McII\HtALHs:utW:VuHHu3yIHHu83LEHU蕕LEtH]LeLmLuL}H]LHHfftfu HHQH3HUHHLE0LEHuHVLtHt Hu OHHtHEHCHEML`tjHEI$HU3r,HE@p0HU@r1HM@q2H]@s3H}@w4LMEq(H]I3C,H]LeLmLuL}H]HnAHUITH}ȉEWEH]LeLmLuL}H]UHHH]HHtC,HcK(C,~ 3H]H]HHtHCHBHCHt!HHLJH{͕HŕHH@HfUHH0H=H]L}LuLmLe~I3E2 eE3eMed A$LH5=:utW:VuHHu3LH5:utW:VuHHu3LA;HHffAnf8foftftfDfDAAEuEtEEtE;HI 3POHHtALH5f }L;LH5V y}L;cALcLA:HHffAnf8foftftfDfDAAEuEtEEtE;HI 3NHHLH5 |L;LH5 |L;LcA:ֺA $D…33A$tZtUu!,-u%H^F<2 ,(09CD|Z0|{9vDzII@xA$uZAT$,tO-tJH:^F;<|42bH'_H]LeLuFA uL@HHAEuHcL(H0kLXH`[HH0OHHCHcHH0HHcHHLmH]A0DHHH}HuHUHLEZUHMILmAH]HUHHuH}bAEtUu:Afu.u*A`uHƒt AƇLAƇLIHt^HtPHu AƇQ'HHu AƇQ"8A^0 H]ELeLmLuL}H]AƇQIHtdHuAdA^$ Ad@Hu Ad0A^0 H]ELeLmLuL}H]A`uAfutLLI{A`@mAL]E=?H=EyXI3M??HEy?c?A$LH5:utW:VuHHu3LH5:utW:VuHHu3VLH5x:utW:VuHHu3 LA;HHffAnf8foftftfDfDAAEuEtEEtE;HI 3|)HEHt_LH5WL;= LH5WL; LH5WL;=HEL`LA:HHffAnf8foftftfDfDAAEuEtEEtE;HI 3(HEHb LH5VL;@ LH5VL; LH5VL;HULb3;ûA $ED…H}3DEA$ tZtUu!,y -u%H5:D. ,R 09C4DDr0|v9qDBIH@xH}DEA$uMAT$,tB-t= H :HuD;|!H;HMЉ<D <(3ҿ`33;;;;t0Hc;3H~"H9D;,| H5:D;,~AHH;|;1; ;u;tALAƇNILJIHHaHcHhH +H Aa<hH9IH]LeLmLuL}H]AahHIH]LeLmLuL}H]AatAbt3AxSH~,hHIH]LeLmLuL}H]H rAauhhHeIH]LeLmLuL}H]Aatt,hH)IH]LeLmLuL}H]IHHu6Adu|hHIH]LeLmLuL}H]HuJA_@u Adt6hHIH]LeLmLuL}H]A_@tIVHtAOA:F{I;nI@H Hm I8HM HIFPHHHcH$H H A` hHIH]LeLmLuL}H]A`hHIH]LeLmLuL}H]A`ubhHIH]LeLmLuL}H]A`t,hHKIH]LeLmLuL}H]IFhHHuNA`A^urhHIH]LeLmLuL}H]Hu@Afu6hHIH]LeLmLuL}H]A`@tIFxHt5I;`t,hHyIH]LeLmLuL}H]IHHu6Adu|hH4IH]LeLmLuL}H]HuJA_@u Adt6hHIH]LeLmLuL}H]A_@tIHt6A`t,gHIH]LeLmLuL}H]IHt|Hu:AMhHiIH]LeLmLuL}H]HulAMtbhH-IH]LeLmLuL}H]AMt,hHIH]LeLmLuL}H]IHt_HtYE3Abu33AxNHAaui.H]LeLmLuL}H]IHt6A_@u,gHfIH]LeLmLuL}H]IHt5I;t,hH1IH]LeLmLuL}H]IHtuHu6ALtehHIH]LeLmLuL}H]HA:Lt,hHIH]LeLmLuL}H]I HHWHcHVH H A`uAfuu u hHGIH]LeLmLuL}H]A`uAfuu t hHIH]LeLmLuL}H]A`uAfu tu tzhHIH]LeLmLuL}H]A`tAft uu t,hHYIH]LeLmLuL}H]IHt6A`u,gHIH]LeLmLuL}H]IH|H~+Ht%Hu A`uHIh:A`AW3AhAYApA[AxA]H]LeLmLuL}H]øhHIH]LeLmLuL}H]ù o1HT/H M0HuD‰Ɖ5T1nH,/D;5H03DHH}DE00HHcxIH]LeLmLuL}H]IHuAbt43AxuIHu33Ax]IIItHtL;[H3Ax4IH^hHIH]LeLmLuL}H]Ag@IAatA^hHIH]LeLmLuL}H]Ag@uIG(HhHXIH]LeLmLuL}H]IG(HuL-UHHH]HL}LuLmLeHF8H HcH}H H ဣcƃPc $߈cƃPc $߈cƃPc0ƃPoc0ƃP_c $߈cƃPFc $߈cƃP-c0ƃPHR 3D=.ZH=SFIE3E3D-MD-D--AEwLH5:utW:VuHHu3.LH5:utW:VuHHu3LA;HHffAnf8foftftfDfDAAEuEtEEtE;HI 3)HpHtKLH5;fFL;aLH5+NFL;,AHpLhLA:HHffAnf8foftftfDfDAAEuEtEEtE;HI 3iHxHLH5DpEDpL;{LH5iDpuEDpL;HxLj3A;AAMDED…33AUttRtMu!,`-u%H5]'F4 ,0|t9oC4Dtr0|_9ZDrII@|AUuBAU,t8-t37H&F;4|*H'F4AD%*)3ҿ`33***D*Et0Hc*3H~"H&D;<| H5v'D;<~3HH;|Da*"U*AC*AEAL H5IDDcHAAƃPDcHHfftfu HHHs-HHHfftfu HH3HHJ Hfo%wSfvfo{SH#fo SfoSfn<1f8frfo5YSfoffffffffff8f~ pHH;rH;s$ 2a|zpHJHH;rH=HpƄ p:utW:VuHHu3TLHp:utW:VuHHu3H=@Hp:utW:VuHHu3H= Hp:utW:VuHHu3{H=Hp:utW:VuHHu35H=Hp:utW:VuHHu3H=<Hp:utW:VuHHu3H='Hp:utW:VuHHu3tQH=Hp:utW:VuHHu3A DcƃPrA DcƃP^AƃPDcJƃPAƃP8ƃP/ƃP&A DcƃPADcƃPHJ3H HUwTJ3 |HUHJHcH H;~Db HcMcHH .HJHH;HMMcAD HEBD VERTBD _CONBD FORTHEJ| d>HH. H?DcHAAƃPDcHHfftfu HHHs-HHHfftfu HH3HHH3fo%NfvfoNH#fo NfoNDfn<1f8frfo5Nfoffffffffff8f~ pHH;rH;s$ 2a|zpHJHH;rH=HpƄ p:utW:VuHHu3~H=Hp:utW:VuHHu3-H=lHp:utW:VuHHu3H=7Hp:utW:VuHHu3H=Hp:utW:VuHHu3[H=Hp:utW:VuHHu3H=hHp:utW:VuHHu3H=SHp:utW:VuHHu3twH=Hp:utW:VuHHu3uA DcƃPH}$R.H]LeLmLuL}H]A DcƃP|AƃPDchƃP_ƃPVƃPMƃPDA DcƃP0ADcƃP/tHEB (IAHHH}mQtH]LeLmLuL}H]3Hp@H 3D8Hp9HHDcHAAƃPDcHHfftfu HH] Hs-HHHfftfu HH, 3HHH3fo% JfvfoJH#fo %Jfo-JDfn<1f8frfo5Ifoffffffffff8f~| HH;rH;s! 2a|zLHJHH;rH=xHuD :utW:VuHHu3@H=Hu:utW:VuHHu3H=Hu:utW:VuHHu3H=Hu:utW:VuHHu3lH=Hu:utW:VuHHu3)H=MHu:utW:VuHHu3H=Hu:utW:VuHHu3H=Hu:utW:VuHHu3tNH=Hu:utW:VuHHu3A DcƃPrA DcƃP^AƃPDcJƃPAƃP8ƃP/ƃP&A DcƃPADcƃP3H]LeLmLuL}H]ùHHF4F4AD%HF;4HvF4INJAH53HEAD_HUJ|"5H3t-UHH@H]L}ALuLmILeEH}Lc3I~HU%J=3M~$H}8a|zHMHI;|HEAHMB|1 uI~BD1IHMB|1 tAARMcHjHoJHrH*sH~sHsHtHtH.uHuHvHjvHv{HwrHiwiH`x`HxWHyNHzEH\zAHEHXHA:HHffAnf8foftftfDfDAAEuEtEEtE;HI 3HEHHH5dDE7(DEH;ZHH5HDE(DEH;0HH5,DE'DEH;HUHZ3A;A DED…3tstStNu!,-u%H5 F,U ,v0|r9mCtDlr0|\9WDjHI@|uAS,t8-t3Hz F;,| Hg F,AD%u )3ҿ`33^ T V %DB Et0Hc> 3H~"H D;4| H D;4~EHH;|D 4 A" A AEtELAƇN3H]LeLmLuL}H]ù Hv Ho F,F,AD%y *HQ F;,H@ 3F,I" A A-fUHH IHEcAAAƀPEcHHfftfu HH|Hs-HHHfftfu HHK3HHZHfo%}5fvfo5H#fo 5fo5fn<1f8frfo5Y5foffffffffff8f~| HH;rH;s! 2a|zLHJHH;rH=HuD :utW:VuHHu3QH=Hu:utW:VuHHu3H=Hu:utW:VuHHu3H=ɴHu:utW:VuHHu3zH=Hu:utW:VuHHu36H=mHu:utW:VuHHu3H=Hu:utW:VuHHu3H=Hu:utW:VuHHu3tXH=Hu:utW:VuHHu3uA EcAƀP.H]A EcAƀPeAAƀPEcPAƀPFAƀPt!Ḭ LjA$AD$ AD$I A$AD$IHu #ILjF0IHt F1IF4N4t"tICD, ILjCD% rN0uN1t:t Ḭ A$AL$AD$CL,Lj> A$AD$C, Lj(t A$AD$ C,LjIA$ CD, I@0ILr IH1@1IH@4IHtJN0uN1t:t Ḭ A$AL$AD$CL,Lj> A$AD$C, Lj(t A$AD$ C,LjIA$ CD, I@0ILr IHp@1IH\@4SA^IIHtJF2tBtF4t ILjILjF0IHt @1I@4tHtF4t ICD, ILjCD% I@0ILr IH@1IHy@4pILjCD% I@0ILr IH<@1IH(@4A^IIHA2tVA0uA1tILjA$ IHu #ILjA0IHt A1IA4A4t ILj2A0uA1tILjA$ IILjHt A0IA1ILp IH'@4IHt%A0uA1tILjA$ IILjHt A0IA1ILp IH@4A^IIHtA23ILjt)HtA0IHt A1IA4HHt A0IA1ILp IH@4IIHLjt @0I@1ILp IH@4A^IIIHF2tetF4tLj.F0uF1tA$ LjIHu "ILjF0IHt F1IF4*F4t t%CD, *F0uF1t A$ CD, ILjCD% I@0ILr IH@1IH@4IIHtA0uA1t A$ CD, ILjCD% I@0ILr IHtM@1IHt=@47IHtB2tIuB4Iu HtB4LLLAbAct33AxlHAx9Ac3LeLmLuL}H]L[IF(HtBBPxIF(P|IHt 3HPIBLeLmLuL}H]ùBLAbA&LeLmLuL}H]þBL݇LeLmLuL}H]IFhB( IVhBD* IIFhB( IAc t3IFhUӈMnhEAEINhDmDiIvhMЈN[MnhMAMIFhDmDhIVhE҈BIvhUӈV'IFhBD( IVhBD* IFhB( IHc&ILeLmLuL}H]IFhB( IFhHpYh8ZHc&IAcLeLmLuL}H]DUHHPL}IH]LuLmIwxHIpHIH;LesBA`@tH+־ 蠎 H+3蔎IA^ANA^tA`@tIGxD0 IWxD2 I HHEcAu 3AxBHEcMI_xIMghI_xAg@tdIHI+I;tNLAMEc3H]LeLmLuL}H]è3IGxD A^I HHDI+AxH;w LH9H;EHHLH]HLeILmIDuIL}ADHLI;tH]LeLmDuL}?L+HغM;s MMuMHH]LeLmDuL}IHMAHMgxMEcILJ0IHI@Hc&IH]LeLmLuL}H]H]LeLmDuL}u@UHH LuIH]L}ILeAcЃALMuMt9Abt@IFhAc3IIFpII3H]LeLuL}H]3AxHM+LAxzHt AcuHcH3AxIJ&H]LeLuL}H]Å#MM+fp!fDUH?t H]fUHH]UHHLmL-mAEtEH}5AEAEuAEAELmH]UHHH5 H]UHHHu}3H]UHH H]HLeItEH}蔽Cu ACH]LeH]UHHLuL5uAtEH}6AAF3HDF3Hc| 3H<|~LcDI;t|HHH|HcC3HC=C~Hc CH;C|AFALuH]UH33HcCHc| 3H<|~LcDI;t|HHH|HccC3HNC=WC~Hc >CH;=C|H]UHH]ÐUHH]ÐUHHHEAHU 3H]DUHHH]HL}ELuLmLe؉MHULcMtEEEu zxm fE@tzYt 33X~Yt33<bYt33 FYuM33MȃMu mAHpMLx@M 33HHBA@Et3t H„tHAtuMt 2ɈHIuHAHHHfftfu HH3LcE 33iHHAA@Et3t H„tHAturMt 2ɈHIuHzAHHHfftfu HHLcLpLxMMHuHx*pat:EtH]LeLmLuL}H]ÉǾH 43pLEA_ A`@0L3LpLpI@(HtF&PxI@(P|IHt 3HBI&H]LeLmLuL}H]ù&LAbArH]LeLmLuL}H]ALPvHcL X?L`MAIPxHuIPhIIPpE^LLMdI@(HtF,PxI@(P|IHt 3HBI,H]LeLmLuL}H]ù,LAbA rH]LeLmLuL}H]IPxHtHIPhHIIPpE^LLMIPxHuIPhME^AIPpN tA`@tAatt MEJD I7H?23Lp蘆LpE^IPpAtA`@tAat ALtXANu ALt>t9t4I+u&ALtt tIHIPpIIǀHUNHBp HUHBpHUL3LpLpt`I@(Hx&PxI@(P|IHt 3HBI&H]LeLmLuL}H]ALȃHcH"<L jL AI@xHuI@hII@pHDIHUI@xfpHPI@x@IPxHIIPpHIHU}I@xHtHI@hHII@pHDIHUIIPxHuIPhIIPpHIHU!H/ 37HU3M~HJpHI;}HUHU3M~ LHJpB HI;}HUHUMLjpH}`@t :HMHY(HtHCxH]H{(G|LMIHt3H_LMIH]LeLmLuL}H]bHσAmH]LeLmLuL}H]þ&LvH]LeLmLuL}H]þ,LivH]LeLmLuL}H]I@hPMHhqAQIPhHƉ vH]LeLmLuL}H]HERS3A}EDMAAD]EAE^AE E^HED^AE D^DEDEA$AAH}^ D^L]E^AE E^H}^ ʈ^H}^ DAA^H}g ʈgHM@}g DAgHM^ Ј^HU^$A ^@HM$_ @@$@@_HMg ЈgHU_$@ Lj_H}}tbHMHY(Ht^0CxH]H{(G|LMIHt3H_LMIH]LeLmLuL}H]LE5ƉsH]LeLmLuL}H]3fDUHHHE3E3HUH]DUHt H]3=UHHLuIoHtZIHOMu)D5E3=E0t=D?3LuH]Iu)D53EtD3LuH]u)D53EtD)LuH]DUHH LuIH]HHHL}II>LmIMta u&3ۉtljMtM.3)H]LmLuL}H]HIMtL;LMLLI6yI>mUHHLurUcau)D5Y3QEDtQDS3LuH]DUHH L}AH]ALuILmItlu&3ۉtljAtH]LmLuL}H]ÿ33|M AuAuA DH~ LL\IHumu&3 ۉt lj AAu)H]LmLuL}H]ÿ)33{u&3ۉtlj3H]LmLuL}H]ITRu&K3Cۉ7tDljG3H]LmLuL}H]@UHH LmIH]LuALeIIEHt1AtH]LeLmLuH]ÿ33zAt]u&3ۉstljAt A33EzMAuAuA DH~ LL!IEHu[u&3ۉtljAAuA)Q)33ytE3)uE3D%kD%^tkljnDH]LeLmLuH]IE u&3ۉtljE3fUHH L}AH]ALeIthu&3ۉtljAtH]LeL}H]ÿ33[xIt]A L#1/u&(3 ۉt!lj$3H]LeL}H]u&3ۉtlj3H]LeL}H]UHH L}ALmELuIAt-AtLmLuL}H]ÿ33PwMIu3LmLuL}H]Et] u)D-3EtDAtAc33vA LtE3,D-E3D5ED5wtDDLmLuL}H]AtLmLuL}H]ÿ33)v@UHHH@HHLPLXDJL*L+HEA)x)p)h)`)X)P)H)@u 3H]EHEE0H0HEHUU0}BEHcHMH HUHBHE΋ 3҅~FHDMA0}EADEMcLUM LMMALEEIHu;|3H]øH]ÐUHHH@HHLPLXDJL*L+HEA)x)p)h)`)X)P)H)@u3HH]EHEE0H0HEHUU0}BEHcHMH HUHBHEE3L LeIU0}BEHcHMH HUHBHEHDʉII LIH HLLH AIAILuUH HuLH HuCDHu;I Mu$H AEL D;fLe3LH]LeH]LefUHH~cH]fDUHH]fUHH LHDJL*L+HEA)x)p)h)`)X)P)H)@H]L}MLuILmILeAHDHuLJÅ Dž(HEDž0H HHt0}BHcHHHHBHH20}BHcHHHHBHL*>8u ~NH]LeLmLuL}H]É߾DH 3qqHUЊAAb$A E3䈂bHub وbLMDžEeAD EeLUML]MH}LLMM@M8Dž(HEDž0H HH t HUЀi@0}BHcHHHHBHH0}BHcHHHHBH8L Q  8PtH{3oH]_ n@HC(H,tP/PxHEHH(Q|H]HHtL`HEL/H]LeLmLuL}H]ù/HbAYH]LeLmLuL}H]`@HC(HtS@xHEHP(B|HMHHtL`HELH]LeLmLuL}H]bH߃A YH]LeLmLuL}H]a^HC(HtS@xHEHP(B|HMHHtL`HELH]LeLmLuL}H]bH߃ALXH]LeLmLuL}H]iuu u HC(HtPrPxHEHH(Q|H]HHtL`HELrH]LeLmLuL}H]ùrHbAWH]LeLmLuL}H]H8H;@DcA3ҋxH HUH8H@H]H8HHHuLPLEIPILMAcLUMH]H3 HC(HtD&PxHC(P|HHt L`L&H]LeLmLuL}H]ù&HbALVH]LeLmLuL}H]LȃHcHg#H H HCxHuHChHHCpHDHHCxfHPHCx@HSxHHHSpHHqHCxHtHHChHHHCpHDHAHSxHuHShHHSpHHHu3jHEЀeHULHMLH]ЀeHuЀeH}LLEAe HEHu1f@tH@pKHUHBpHEHu gHEHǀ0LHELLHǀ@HMЀhmH]LeLmLuL}H]DH<H$b ЈbHIuHLMmMHHA(HtSXxHHP(Z|HHHt3HPHHH]LeLmLuL}H]bHσAmSH]LeLmLuL}H]3މ)\H]LeLmLuL}H]C%R=;)<QS{SHAIyA1Hu6HUЊ[\HMЀi H}@@[CHMHY(HtFCxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]bHσA"RH]LeLmLuL}H]ÿƉZH]LeLmLuL}H]úQHAIyA1L-LuBHUHIWXHMЀiH}@@W8tiHMHY(HVCxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]C<HAIyA1LNLu~HMЊd$ ЈdHuЀiHHu$HM$d ЈdHHEЀdHI8tiHMHY(H;CxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]C;HAIyA1L3LunHUЊQRHMЀiHHt&Hu HEƀQ'Hu HEƀQ" HEƀQHI8tiHMHY(H0CxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]CRHAIyA1L(LuBHUHIYZHMЀiH}@@Y8tiHMHY(HQCxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]CHAIyA1LILujHMЊa$ ЈaHuЀiHHtHu HEЀa HEЀaHI8tiHMHY(HJCxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]C{OrHMat1IIHH8HMH8H[H&_ HA(HtPmPxHEHH(Q|H]HHtL`HELmH]LeLmLuL}H]bHϹmALH]LeLmLuL}H]HA(HtS@xnHEHP(B|HMHHtL`HELnH]LeLmLuL}H]bHσnAyKH]LeLmLuL}H]HA(HtPoPxHEHH(Q|H]HHtL`HELoH]LeLmLuL}H]bHϹoAJH]LeLmLuL}H]þoSH]LeLmLuL}H]þmgSH]LeLmLuL}H]ÿn:SH]LeLmLuL}H]À{NHUHIHHuIIIHx/HRH]LeLmLuL}H]ÿHRH]LeLmLuL}H]ÿHvRH]LeLmLuL}H]þrHIRH]LeLmLuL}H]HUHcHHMHA(HtP&PxHEHH(Q|H]HHtL`HEL&H]LeLmLuL}H]bHϹ&AHH]LeLmLuL}H]þ&jQH]LeLmLuL}H]L MHSxIEHshH+H;wJxHHDjDHHH;EMIHIExIHHDHLMLILM׉LLI;t;HE3HDHLLLdMIE׹L+LL;s MMu MtHHE3HDHLLLHHsxHHHHHDcHǃ0HHH@tH]H8^5HcHHMHA(H&PxHEHH(Q|H]HHtL`HEL&H]LeLmLuL}H]þ&HNH]LeLmLuL}H]HChPHKhQHShH(@^@@ @^@@LMЀAڃ@A@E^AD E^AHMAD^AAE D^LEAA^@@ A^AAL]AA$E^AE E^H}@^@@ @^LUEgAE EgL]DAg ˈAgAHuA^ ˈ^D@H]@@@^@@ D@^$H]A_AE Ȉ_HE@g@@ @gLUE_AE E_HMcA Ècu HÅttHEЀcHUЈPH}٤t`HMHY(HtcMCxH]H{(G|LMIHtLcH]LH]LeLmLuL}H]H]_ƉLH]LeLmLuL}H]UHH H]L}LuILmLeHHE3I^E2fofofnfpH0fo cE2fE3DLxHAHAHH0=W??E3AE3+5c tFPu;~2|-~ |#~2|4~ (| 0AE3ɋ0Et E3ۃHcHH0tHHH0HH3H0HHu A4t |%, H0AHƅH0ƅHc4H~*H0H;PuHHH;@ HHH3H3H#3~Hf`f~PfhH0fHH;rHvHH;s,HHHHPHHHH;r3H73HHHH;rH 3H3H#f@foffofofofs fs HfH;ffffs ffrfofsffH~H;s$HH+HHHH;rH83HHLHH0LXD`HDDHD`LXLHHǃTt {HHHdEHHLHLXD`HD"DHD`LXLHt/HcHHtHHHHH3E3^ttHudHǃAc4t |,HcH#HHHu A:HǃDLHLPILXD`DLMIR0t MtHcIHE3뾊Hc4LE3HH0H3H#ffoffofofofs fs HfH;ffffs ffrfofsffH~H;s$HH+HHHH;rH83HHH0HcHHǃIcAE3H~uHDž~cH@D3HLHIZ.HHHH;eHuDHH@'uAH8HMHHHǃ2cHHLHLXD`HD DHD`LXLHuDH8E3HHMHHǃ,cEtMH8E3HAHHE3HǃM,cHc4@DHҋH@H-DLHLPILXD`DLHM"IFH#HI`IulDIDEʁDAD AD ׉AAA A E DIDY DDځEADI ADA EʁAD D΁yD AE AAD ΉD D ωǁ ƁA A DDff9A%AD D D DiI M3I?3M3IM~GH@LM MB\ @4=@2B2t HBtHHI;|H@Hnte8t\LHHHL8ML8Ht*_33L8H(LH(L8DeDsI ADeA@LIHSpHIH;LI u6 - LILMLIL LMIIMIMcL;IOI u,tu"L AMMDM+L[hL;ILetI t HHHHLHpLhLkx%H Lt E3HC(HUtDBPxHC(P|HHt LhLBH]LeLmLuL}H]ùBHbA5H]LeLmLuL}H]a DLA LHshL{pL+HpHheO H3f+cLȃHcH=L L AH{xHtH{pH{hH{pHHDHHCxfH@xHCx@H{xHHHH{pHH{xHtHH{hHHH{pHDHRH{xHtH{pH{hH{pHHH(HpQ 3,FHH{pIL+L0M;MCL8E}XƃVA3DVAH{pDEHHE+IMcL+M;H{pMCL0L8MMu*VHǃ0H{pHHH{pEL8M;MBEELL)AH{pM+IMHL)8L)0H{pHCh@xLKh@AyH{hH=LLLHC(E3HtD&PxHC(P|HHt LhL&H]LeLmLuL}H]ù&HbA/H]LeLmLuL}H]þ&H7H]LeLmLuL}H]H{(E3Htxt:GxH{(G|HHt LoLH]LeLmLuL}H]bH߃AS.H]LeLmLuL}H]ÿƉH 7H]LeLmLuL}H]ÊkH8ALt Deat^t Mtg@uDH;uLHCpH;v DeA@HLDeuL AMH{hMDHHI;LXM[BH6H]LeLmLuL}H]E3蒬HcHHC(H&PxHC(P|HHt LhL&H]LeLmLuL}H]E3"HcHHC(HI&PxHC(P|HHt LhL&H]LeLmLuL}H]HAAMcHH=JNTIIIIEHH>NT(IIEHH>NT(II;vIJM+I;~ L;LN H+I;IDHHtH/HHHLHM;ME3L+IIMHv4C4  BH| HHHHSHH>HLH HSHH>HLHI;vHHI+H;~ L;LH<H+H;HVHHtHAHHHHPH;)H3H+HHHHv@EEEAEAAAAE AE E DHH;rI3EDEDAD AD E D HH;rH(ALtZLLHAuLLL;8} H(`L(AH(L%3LH΃t3•Hc&IHiHHHQH?H| HHHHSH?HDHCHSH?HDHI;vHHI+H;~L;LH H+H;HHHtHHHHHQH;H3H+HHHHvEWfAfDVHH;rIOHt8foAOfoffqfqfff NHH;r6fofAoOfoffqfqfff NHH;rH;Aff~HH;r3A Wff VHH;r3뽃`dyMMDqAAAIAAAA A A AAAAHAA A :rHMHSp`WLMKH@DI DEʁAHD DρAD ׋YE AىDAAHDAAAAA A AAAAAD E D DE%DAD AD E ˉzDRDJ HH!H@HSpUMLMIIAHH>NTIII I@HH>NLIL+I@HH>NLILH;vHIL+L M;~'H;HIL+LM;H IItIIIIIBH;HIM+IIL3Mv8DDDށ D߁A A 4HI;rJHtifo%fo-fo5rfBfofoffofrfrfffrfffrffBIM;rnfo%9fo-!fo5 ffBofofoffofrfrfffrfffrffBIM;rL;HFDD%EAA AA A B4IL;rGH3DEDAEAAAA AA A 4HH;rHSpE3WM}MIIAH?NTIIII@H?NLILjI@H?NLILH;vHIL+L M;~#H;/HIL+LM;H0HHtHHHHLHL;LML+IIME3HvFQfAfFRIL;rLAIt7foAfoffqfqfff BHI;r5fofoAfoffqfqfff BHI;rL;s?LBIffBJIM;r L3D AfAfD BHI;rHSpE3HHLL89L8HSpHEHu?DLHILPILXHD`DLvDLHILPILXHD`DLHHoL;@L(L8McL;PHEv333g33yHE3LxHHCxHHSpHǃtH+u| HChH+uqeYHm 4H{(HN GxH{(G|HHt LoLH]LeLmLuL}H]HuLH0HCpHH€VLcpIVLcpL+HShL+I5B"Leu@ HSsH tTH{(Hn,GxH{(G|HHt LoLH]LeLmLuL}H]H efb܀dtTH{(HGxH{(G|HHt LoLH]LeLmLuL}H]IFH]LeLmLuL}H]Lx)Hu^HC(Hd&PxHC(P|HHt LhL&H]LeLmLuL}H]HHVwu^HC(H2&PxHC(P|HHt LhL&H]LeLmLuL}H]IܺIL拻x5HHC(Hl&PxHC(P|HHt LhL&H]LeLmLuL}H]HH+H~ HptTH{(HGxH{(G|HHt LoLH]LeLmLuL}H]H3ft^HC(H&PxHC(P|HHt LhL&H]LeLmLuL}H]LȃHcHH kH HCxHtHCpHChHCpHHLHHCxfHPHCx@HCxHHHHCpHHCxHtHHChHHHCpHLHUHCxHtHCpHChHCpH¾HH&H'n 3HCpƃV3VHCpDH+HHcH+H;HCpHCH0H8HChPHKhQHChHLLLWHcHDH H HLHt~HHbƅ sHLHs3bLꀻLu ƅ HHƄ Hxs8HLHXsbHChDHߺLChAHHshbsHLHrLH?IHI;HHƅr~LHߺHbrNHLHsr3HHVrbat^t MHLHrM;}HH{hM+3LHLHshqH$3ct,3x葄HƋx_tnc35{HcH&bHHIƅ @q4HcH&8tHcH&c3ƉH6 H]LeLmLuL}H]HSxHt"BJ ȃJHSxJ4HShBJ ȃJHshNH{(E3H`GxH{(G|HHt LoLH]LeLmLuL}H]3H]LeLmLuL}H]UHH0LeIA$eHNI$0LmILuIL}؃tZHu;LA$h I$@IDŽ$IDŽ$0I;IC΅3A$xA$e;I$I$@HuIDŽ$0LHuкE o I$IDŽ$0aALLLnM+MI$0M$I+I$0MLmLuL}3LeH]I|$(HLmLuL}t`t0GxI|$(G|I$HtE3LOM$LeH]A$bLALeH]ÿƉLO LeH]LmLuL}Hc&I$LeH]DUHH@LuLmILeHEIuxHMeptL+IEhL+MALO4 QHM7HuIuhI t IEhIEpgAeMMI0L}H]HHuCM~Ah LI@HIDžIDž0EI;ICօv8ALHLl I0M+I+II0MMaL}H]M3MLL>l3ALAbGHcHeH UH LHuغE kj3҃u E LHuD Hk8]IUxID$fEHoIUxBIuxHuIuhLLikLH?IHAbI;LHuĺE,kII@Ht D؉EDuAc tENJUƊM@uĈEUM@uEĊUŊM@uLjEUM@uLHuj6AeR3Axw}I3AxI_}HAhsAAhDuDuAc tENJUƊM@uĈEUM@uEĊUŊM@uLjEUM@uLHuiwL3Ax|H\DIH;sI}pI+3z MIuxHLLiy3Abt.LeLmLuH]ÿHZ3Act33Ax|HAx{:Ac3LeLmLuH]I}(HL}H]tbt0GxI}(G|IHtE3LOMM^AbLAM5ƉLML}H][zHcI&M3AxAe{II@HuIDž0NLHuEgtIIDž0LLgt3MQyHcI&yHcI&=myHc&ILeLmLuH]HyHc&IAbLeLmLuH]IUhIMhEňAyHcI&pLLIuhftUx8xHc&IAcLeLmLuH]DUHHLuIIAgL3 ~tuIF(Hut6&PxIF(P|IHt 3HPI&LuH]ù&LAbA[LuH]ALȃHcHeH =H IFxHtIFpIFhIFpIHLIIFxfUHPIFx@IFxHIHIFpI{IFxHtHIFhHIIFpHLIKIFxHtIFpIFhIFpHII!H3 IFpAf@tKIFpHIFpI;L^t LuH]L3I Ae+|tPIF(HR&PxIF(P|IHt 3HPI&LuH]ALȃHcHH H IFxHtIFpIFhIFpIHLIIFxfUHPIFx@IFxHIHIFpI{IFxHtHIFhHIIFpHLIKIFxHtIFpIFhIFpHII!H+3 IFpLIFp]t LuH]I AeAg3LuH]þ&LLuH]IFhPINhUQIFhH:IFhPINhUQIFhHDUHH DJL*L+HEA)x)p)h)`)X)P)H)@H]L}ALuILmLeMHHMLEDHuLÅ Dž0HEDž0HHHt0}BHcHHHHBHH20}BHcHHHHBHL">8u ~N? H]LeLmLuL}H]É߾DH 3HEE3DžLHULH]H@H8À Dž0HEDž0HHH t HUi@0}BHcHHHHBHH0}BHcHHHHBH8L  8 tH\3HHu$@׊b@ ȈbLMAAEbAAD EbAHMADdAAE DdLEAAd AdL]EeAE EeHMLHuLHM_ @HA(HtP/PxHEHH(Q|H]HHtLxHEL/H]LeLmLuL}H]bHϹ/AvH]LeLmLuL}H]`@HA(H\tS@xHEHP(B|HMHHtLxHELH]LeLmLuL}H]bHσAH]LeLmLuL}H]a^HA(HtS@xHEHP(B|HMHHtLxHELH]LeLmLuL}H]bHσAH]LeLmLuL}H]t NMH3HSfHfCfC Cfփfփ)D)D)D)D)DHPuH HU[tOt6u $爃HU/u*$ HU$ HUWtvȃwoHcHH H ኃ$ @F$ 4$ "$  $HEbuu ҃3LHu5HMHY(HC tFCxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]bHσAH]LeLmLuL}H]HEHCLcLeA$aI$8I;$@A$c3A$xlHHUH8H@H]H8HHHuLPLEIPILMAcLUMLeI$Ht9@2LeI$I$Ht@2tID$pI$7L3pID$(H)tG&PxID$(P|I$Ht LxM$&H]LeLmLuL}H]ù&LA$bA2H]LeLmLuL}H]A$LCHcHH H ID$xHuID$hI$ID$pA$^HLI$iID$(H[tG,PxID$(P|I$Ht LxM$,H]LeLmLuL}H]ù,LA$bA7H]LeLmLuL}H]ID$xHtH ID$hHI$ID$pA$^HLI$ID$xHuID$hI$A$^ID$pH tA$`@tA$att I$:HTI$+H3A$^ID$pt!A$`@tA$at A$Lt^A$Nu"A$LtBt=t8I$.u)A$Ltt tI$HID$pI$IDŽ$H]LcpHLI+Ծ LHUHHt&C3txhuC33H}muHEHH@2H}HuHHuHc3LHH{}LH~$B a|zHHH;|HLA| uH~ADHLA| tH=6LƊ:utW:VuHHu3tPH=LƊ:utW:VuHHu3uAL~u0E3L~tdHMHY(HCxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]EtHEHHt$@2HEHB2HMHHKLHuHUH]LeLmLuL}H]DHH$b ЈbHI4$HLMd$MHHA(HtSXxHHP(Z|HHHt3HPHHH]LeLmLuL}H]bHσA?H]LeLmLuL}H]3މH]LeLmLuL}H]CR;<QSSHAIyA10u6HU[\HMi H}@@[CfHMHY(HtSRCxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]ÿƉH]LeLmLuL}H]úQHAIyA1L4/LuBHUHIWXHMiH}@@W8timHMHY(HVUCxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]C9<HAIyA1LU.Lu~HMd$ ЈdHuiHHu$HM$d ЈdHHEdHI8tiRHMHY(H;:CxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]C;HAIyA1L:-LunHUQRHMiHHt&Hu HEƀQ'Hu HEƀQ" HEƀQHI8tiGHMHY(H0/CxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]CRHAIyA1L/,LuBHUHIYZHMiH}@@Y8tihHMHY(HQPCxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]CHAIyA1LP+LujHMa$ ЈaHuiHHtHu HEa HEaHI8tiaHMHY(HJICxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]C {OHMat1IIHH8HMH8H[H_ HA(HtPmPxHEHH(Q|H]HHtLxHELmH]LeLmLuL}H]bHϹmA$H]LeLmLuL}H]HA(HtS@xnHEHP(B|HMHHtLxHELnH]LeLmLuL}H]bHσnAH]LeLmLuL}H]HA(HtPoPxHEHH(Q|H]HHtLxHELoH]LeLmLuL}H]bHϹoAH]LeLmLuL}H]þoH]LeLmLuL}H]þmnH]LeLmLuL}H]ÿnAH]LeLmLuL}H]À{N"HUHIHHuIIIH/H]LeLmLuL}H]ÿH]LeLmLuL}H]ÿH]LeLmLuL}H][HUHcHHMHA(HtP&PxHEHH(Q|H]HHtLxHEL&H]LeLmLuL}H]bHϹ&AH]LeLmLuL}H]þ&H]LeLmLuL}H]M$ MI\$xIEIt$hH+H;w?HA$xH[HH;EMIHIEMA$xHHHDMʼnLALIDLH%[H;t3HE3HDLL\MIEϺL+LL;s LMu MtHHE3HDLLA$cI$I$HHIt$xHI$IDŽ$0I$HI$@tLeI$8zXHcI$HMHA(H&PxHEHH(Q|H]HHtLxHEL&H]LeLmLuL}H]þ&LFH]LeLmLuL}H]þ,LH]LeLmLuL}H]D^$AD D^LUE^AD ȉE^HMAA^DAA ӈ^LEAA^ A^L]E^AE E^Hu^ ʈ^LMEgAD EgLU@Ag ЉAgHM^ Ј^@HE^ @@^HU@_@$@ È_H]@g@@ @gLME_AD E_H}7t`HMHY(Htc?CxH]H{(G|LMIHtL{H]LH]LeLmLuL}H]HM_ƉH]LeLmLuL}H]fDUHHH]L}ILuLmLeHuH3AMo23MMHUM؉]L}M|$IAL$XIπA$@IT$P@ A$M|$I$A$HU]߃5LA$@A$Ict 5"IT$ A$THU!A$߃!LA$נR!A$t A$HcH [H5H4IUpI$IM$H<2H;3HIH;IDžHGIAg[IE3HtQ2t A2AAc@tANVL'DpL3I AeXELAPHcH ?H5H4I}xHtI}pI}hI}pIA^HTIcIE(HtF,PxIE(P|IHt 3HPI,H]LeLmLuL}H]ù,LAbAoH]LeLmLuL}H]I}xHtHI}hHII}pA^HTII}xHtI}pI}hI}pIA^HtA`@tAatAt I>HTI0Hp3A^I}pItA`@tAat ALt^ANu#ALtDt?t:HI.u)ALttt HIHI}pIIH+׾ IIDžErIB2bIX A^tIB2ILi.Ac@!HUE3k4A$ ]L}A^t0t)MH}HHH`IE(HtFiPxIE(P|IHt 3HPIiH]LeLmLuL}H]ùiLAbAH]LeLmLuL}H]IHtQ2t A2AIHt+Ag€IDžuIHAc@tANL?vL3I Ae'TELAPLHcH H5&H4I}xHtI}pI}hI}pIA^HTI.IE(H,PxIE(P|IHt 3HPI,H]LeLmLuL}H]I}xHtHI}hHII}pA^HTII}xHtI}pI}hI}pIA^HtA`@tAatAt I>HTI0H@3A^I}pItA`@tAat ALt^ANu#ALtDt?t:HI.u)ALttt HIHI}pIIDžH+׾ IDžAgEt IB2IUpIIQ`t  tHcIH3&UعE3HcdHHH3H#fffoŰfŰfoŰfofofs fs HfH;ffffs ffrfofsffH~H;s$HհH+հHհHHH;rHh3HHH`3ɅHcEHIDžIAgH}HHH`_F`%HcHtHHHIA^LM4t |, EEHcdHHdH3H#3~xffͰ~fH0fͰHH;rHvHH;HxHHHHHH;rHHհHհHH;rHH3H#fDfoհfհfoհfofofs fs HfH;ffffs ffrfofsffH~H;s$HͰH+ͰHͰHHH;rHh3HHH`菦E3EtuTA^HcLHtLHHIƅu X3҅LDtNMu6IDžE;4t |, AAIDžAg}t%IT$HuID$HIT$I<$3A$E$DdAt2McH= JI$HuOE$AE$LcH=O M$J:II$A@A@E$A@xLcH=v J<HI$!A@DE$~IDŽ$A@E$=HcA@L `I|9I$E$A$DA A|6A0McA@H= J|?I$eE$A9tA8u>HcA@I$2E$lDA| A4=A@I](HtI$fE$fE$r1E$nHcA@I$rE$NA@s7H%LsI$M$I;LOM$E$I$AH~I$H;~ HzI$H@wHEHXH!3HV HH} I$4LHH4t? Aeu ID$ ?I$Ht+H: uGHHI$HI$uA$uIDŽ$HI$MEpIJH;+ A$I$HtiHIup IEpHI$H\ I$H A IMpIEpHI$Hu HUA$HIDŽ$t H}EWIUp+LHIUp3 IUpI$IUpIH;HGII](HtICxI](C|IHt 3H{IH]LeLmLuL}H]ÿƉLH]LeLmLuL}H]ÅI@IID$H~HID$3H]LeLmLuL}H]B 8H IUpHIUpI;$|BH+HIHNHH;HOL`uIUpI$IE(HtFBPxIE(P|IHt 3HPIBH]LeLmLuL}H]ùBLAbAoH]LeLmLuL}H]þBL"H]LeLmLuL}H]IMhQ t +u AAcAc}A$Ac,LH]LeLmLuL}H]IE(HtF&PxIE(P|IHt 3HPI&H]LeLmLuL}H]ù&LAbAEH]LeLmLuL}H]þ&LH]LeLmLuL}H]I](HCxI](C|IHt 3H{IH]LeLmLuL}H]HU]L}IHt @2IHutBIHt6AgIDžt AgIHAc@tANHL+tVI](HCxI](C|IHt 3H{IH]LeLmLuL}H]I AeAgA$slI|$A$CRtVI](HCxI](C|IHt 3H{IH]LeLmLuL}H]IL$ H IE(HtFHxIU(AD$ B|IHt 3HPIAD$ H]LeLmLuL}H]AbLA蔹H]LeLmLuL}H]Ãu$3ID$H]LeLmLuL}H]LH}HotăΉLH]LeLmLuL}H]AAbAd膞IGH]LeLmLuL}H]IUhB t +u BAcAcB$AciLVH]LeLmLuL}H]HE8I3ID$H]LeLmLuL}IMhQ t +u AAcAcA$AcIE(Hk&PxIE(P|IHt 3HPI&H]LeLmLuL}H]I](H+CxI](C|IHt 3H{IH]LeLmLuL}H]I3ID$H]LeLmLuL}H]Ict3U3333AALA@HcI$XAALA@HcI$E$A<ALA@HcI$4HcL=E$E$AI8EE$I$uEA@fE$2uA<ALA@HcI$E$I$fE$E$I](HGCxI](C|IHt 3H{IH]LeLmLuL}H]I](HwCxI](C|IHt 3H{IH]LeLmLuL}H]A$?uAe ID$ ?I](HlCxI](C|IHt 3H{IH]LeLmLuL}H]L+LLIILNHL;IO+IE(H`BPxIE(P|IHt 3HPIBH]LeLmLuL}H]I](H~CxI](C|IHt 3H{IH]LeLmLuL}H]I](H(CxI](C|IHt 3H{IH]LeLmLuL}H]Å5I+@&IA$ 3HIT$H]LeLmLuL}H]IT$HH]LmHrHD3It$LeLuL}H]H^@UHH0HL}IH]HULuFtH]LuL}H]Lcu3H]HUI~Gu3M~ a|zHMHI;|HEAHMB|1 uI~BD1IHMB|1 tH=HΊ:utW:VuHHu3taH=HΊ:utW:VuHHu3u A*HH0H]DLuL}H]AHHH]LuL}H]fUHE3 LctM;*IA ; tEك tM;} IA<; uMcM;Eu:M;؍N DAHǃHcIDHDL;|A M;A+J aHwH;vIcIHL+II;~!H;;McHIH+MI;#M+I>HHHHHHELNM;DЃ+3HcHvD DL:HH;rHHtfD>HH;rfofD>HH;rI;sT8HI;rIHHHHHHHEHxL;|qD+3HcHv  HH;rfo@fHH;rI;s) HI;r3M+ŠD:H HI;r‰։H]33AEUHH0LHDJL*L+HEA)x)p)h)`)X)P)H)@H]L}MLuILmILeAHDHL3Å Dž(HEDž0H HHt0}BHcHHHHBHH20}BHcHHHHBHL*>8u ~N H]LeLmLuL}H]É߾DH qm3H`@HHB2HZH;c@t N HHHHtG2H{(H t=GxH{(G|HHtE3LOLH]LeLmLuL}H]bH߃A被H]LeLmLuL}H]H eHE3LHDžLHH@H8€Dž(HEDž0H HH tHi@0}BHcHHHHBHH0}BHcHHHHBH8L 8 t Hk3脿E3HAӊ@NJb@ وbLAAEbAD EbHADeAE DeHLHLH_ i$ iH_@@aЃ`@HA(Ht\@xHHP(B|HHHtLHHLH]LeLmLuL}H]bHσA萨H]LeLmLuL}H]^HA(H3t\@xHHP(B|HHHtLHHLH]LeLmLuL}H]bHσAͧH]LeLmLuL}H]L3IT$HffA$AD$fAD$ AD$fAD$@fAD$HfAD$P))B)B )B0I $HaH8H;@DcA"3ҋx'E3HHH8H@HH8HHHLPLIPILAcLMHHHtS@2HHHHt3@2t+HǃHHH@2H3q+E3ɅHC(HtD&PxHC(P|HHt LHL&H]LeLmLuL}H]ù&HbA譥H]LeLmLuL}H]LPlHcH 'xH5H4HSxHuHShHHSp^HLHMHC(HtD,PxHC(P|HHt LHL,H]LeLmLuL}H]ù,HbAH]LeLmLuL}H]HSxHtHHShHHHSp^HLHHSxHuHShH^HSpH4 t`@tatt H6HD H(Hd<3X^HSpt`@tat LtUNuLt=t8t3H*u%Ltt tHHHSpHHǃHHxxH H螴AL$RH^t5HHt)C3t!x#uC33H3(LLLIT$(HH]ELeLmLuL}H]DHbH$b ЈbHIuHLMmMHHA(HtSXxHHP(Z|HHHt3HPHHH]LeLmLuL}H]bHσAڡH]LeLmLuL}H]3މ薪H]LeLmLuL}H]HShB t+u BcῈc:B$cƉH4H]LeLmLuL}H]CR;x<5Q5SSHAIzA2SE3Ʌu?H[\Hi H@@[CWHHY(HtOCxHH{(G|LIHtLKHLH]LeLmLuL}H]bHσAH]LeLmLuL}H]ÿƉΨH]LeLmLuL}H]úQHAIzA2L LE3ɅuKHHIWXHiH@@W8tuHHY(HGCxHH{(G|LIHtLKHLH]LeLmLuL}H]C<HAIzA2L)LE3ɅHd$ ЈdHiHHu'H$d ЈdHHdHI8tuHHY(H CxHH{(G|LIHtLKHLH]LeLmLuL}H]C;HAIzA2LLE3Ʌu}HQRHiHHt,HuHƀQ'$HuHƀQ"HƀQHI8tuHHY(HCxHH{(G|LIHtLKHLH]LeLmLuL}H]C_RHAIzA2LLE3ɅuKHHIYZHiH@@Y8tuHHY(HCxHH{(G|LIHtLKHLH]LeLmLuL}H]C_HAIzA2LLE3ɅuvHa$ ЈaHiHHtHuHa HaHI8tuHHY(HCxHH{(G|LIHtLKHLH]LeLmLuL}H]C4{OHat4IIHH8HH8HmH_ HA(HtYmPxHHH(Q|HHHtLHHLmH]LeLmLuL}H]bHϹmAyH]LeLmLuL}H]HA(Ht\@xnHHP(B|HHHtLHHLnH]LeLmLuL}H]bHσnA̘H]LeLmLuL}H]HA(HtYoPxHHH(Q|HHHtLHHLoH]LeLmLuL}H]bHϹoA%H]LeLmLuL}H]þo۠H]LeLmLuL}H]þm豠H]LeLmLuL}H]ÿn脠H]LeLmLuL}H]À{N)HHIHHIJIHH]LeLmLuL}H]ÿH]LeLmLuL}H]E3HHcHHHA(HtY&PxHHH(Q|HHHtLHHL&H]LeLmLuL}H]bHϹ&AFH]LeLmLuL}H]þ&H]LeLmLuL}H]H HHshHEHSxH+H;wMxHHDDE3HHH;E"AHIHLEЋxHHDHLMLMLILIljLLcI;tBHE3HDHLLLLoMIE׹L+LL;s MMuMt HxHE3HDHLLLLHHsxHHHHHDcHǃ0HHH@tHH8E3HcHHHA(H&PxHHH(Q|HHHtLHHL&H]LeLmLuL}H]þ&HZH]LeLmLuL}H]þ,H-H]LeLmLuL}H]HxhHA(HtYPxHHH(Q|HHHtLHHLH]LeLmLuL}H]bHϹA蝒H]LeLmLuL}H]þSH]LeLmLuL}H]HA(HtY/PxHHH(Q|HHHtLHHL/H]LeLmLuL}H]bHϹ/ȂH]LeLmLuL}H]þ/肚H]LeLmLuL}H]DA^AE ؉Ј^LE^AE E^D$HA^A ̈^LAA^A A^LAE$^AE E$^H^ و^LEgAD EgLAg ȉAgH@^ Ȉ^@H^ @@^H@_@$@ ˆ_H@g@@ @gLE_AD E_HE3ɅtlHHY(HthECxHH{(G|LIHtLKHLH]LeLmLuL}H]HƉH]LeLmLuL}H]@UHHH]L}ILuLmLeHuHUMo3E3E2E3һME3ID$(f)`)P)@)0H@uLpcA^@IUxL H=AHIEMMpHtHI+ I+HIUhANLJHIDE3HDUILHD]L}AAT$Q0HfPt )EtHcHHE3`ULcTDE3MI6H3I#fDfoհfհfoհfofofs fs HfH;ffffs ffrfofsffH~I;s$LL+LHII;rHX3HHDHPhjDHcHAgHIDž,H}HuHHP談AE5Y6.PLCHcHtHHHHA^ HH4t |, EAEHcTHH4IE3L#3f~=hf=fBͰ~=pf=H0fBͰIM;rKHAD<8HH;|DM;"McHAQA;IL@IsHH;@v#H@H; I}pI;}hI;}xAHH; t A^@thAD$Rt IEpAd$RHI}pHHHLDԕHDLH)@HHIUpANALAatAƅNAƅLAL$R3IILLDDALE@ANALt$McMD$(IUxHI}pANL3DLDDLD"ALpRHcH=WLLAIUxHHt HI}pI}hI}pIA^L\ME3IE(H"tD,PxIE(P|IHt LHM,H]LeLmLuL}H]ù,LAbA膂H]LeLmLuL}H]IUxHHt HHzI}hHII}pA^L\MIUxHHt HI}pI}hI}pMA^JtA`@tAat pt IlJTI^HB~3DLDIUxI}pDLDA^Ht"A`@tAatALz ANu#ELAtCAt=At7I.u)ELAtAt AtIHI}pIIDžI AeLMAHtLL+LLWH+IEhHDH@HA|$RMAA?ANALAatAƅNAƅLE\$R3IILLDDALE@ANALt+McMD$(IUxI}pHHxAN#L3DLDDLDBALWHcLTHiIIUxHHtHHxIUpIUhHxIUpIHxL\:MA^E3IE(H ,PxIE(P|IHt LHM,H]LeLmLuL}H]IUxHHtHHzHxIUhHHxHxIIUpL\:MA^IUxHHtHHxIUpIUhHxIUpMHxJA^tA`@tAatt IzHxN\MeHZ>3DLD赒I}xM]pDLDA^HLxt"A`@tAatALANu ALtLtGtBI9u4ALtt tIHxHHxI}pHxIIDžI AeHHEHtHH+xIHL+xM]hLHA|$RLXIDHHH;@HDLDDLH@tMA^t (u2I~#IEpIV ANLEIEpA|$R E3A|$RI}pLHH行LHI+MupENELAatAƅNAƅLAL$R3IILAENEELtMcMD$(MuxIUpANfL3DDALWSHcH OH5H4MuxMt MupLIUhIUpIE^Ht I=E3IE(H`,PxIE(P|IHt LHM,H]LeLmLuL}H]MuxMtIVIUhHIIUpE^Ht IMuxMt MupLIUhIUpIE^AH4 tA`@tAatt IIHL I;H$:3D荎DE^MuxIUpAt"A`@tAatALIANu ALt>t9t4I+u&ALtt tIHIUpIIDžI AeAHMtL+L H+IMuhIVLDEuI;~ A|$RjLH@LDHDDA|$REteA^t (uJH~1IUpL ANI{LEIEpLA|$R3HA|$RHH;@I}pHHHLD荈HANALHHH)@IUpDL@AatAƅNAƅLAL$R3IILLDsDALE@ANALt$McMD$(IUxHI}pANL3DLDDLDELAStHcH=cKHFHIUxHHt HI}pI}hI}pIL\MA^vE3IE(H,PxIE(P|IHt LHM,H]LeLmLuL}H]IUxHHt HHzI}hHII}pL\MA^IUxHHt HI}pI}hI}pIA^H tA`@tAatAt IlL\M^H|53DLD׉I}xHDLDA^I}pt"A`@tAatALANu#ELAtCAt=At7I.u)ELAtAt AtIHI}pIIDžI AeLMAHtLL+LLH+IEhHHLXIDHAD$Rt{A^t (uVLL;@~FH~- HANHWHEIEpHAD$Ru3HAD$RI}pI}pHHH@DLDH@IUpH)HHDLDt-LD1 DALEMA|$RLHLHpDHZDALA|$RAiHuEuH;ANALh`AatAƅNAƅLAL$R3IILLDDLh`ANALt$HcID$(IUxHIUpANL3LD;DLMALPvHcH WFH5H4IUxHHt HIUpIUhIUpIA^Ht IjE3IE(H,PxIE(P|IHt LHM,H]LeLmLuL}H]IUxHHt HHRIUhHIIUpA^Ht IIUxHHt HIUpIUhIUpIA^H 2tA`@tAatt I^HL2IPH.0P3LD萄IUxHDLA^IUpt"A`@tAatAL<ANu ALt>t9t4I+u&ALtt tIHIUpIIDžI AeHHAHtHH+HHH+IuhHHHQHDH}t`@IUpHIUpIUpLHDHpDALEA?u#AeuID$(?E3E3A=IE(E3HDtD=PxIE(P|IHt LHM=H]LeLmLuL}H]ù=LAbAmH]LeLmLuL}H]M}M]p3A; H@H;HI: uIUpA|$RI E3IE(HM tD&PxIE(P|IHt LHM&H]LeLmLuL}H]ù&LAbA,lH]LeLmLuL}H]Ai​uEuHH;ANALxpAatAƅNAƅLAL$R3IILLD8DLxpANALt$HcID$(IUxHIUpANL3LD`DL ALPvHcH @H5H4IUxHHt HIUpIUhIUpIA^Ht IjE3IE(H ,PxIE(P|IHt LHM,H]LeLmLuL}H]IUxHHt HHRIUhHIIUpA^Ht IIUxHHt HIUpIUhIUpIA^H 2tA`@tAatt I^HL2IPHS*3LD~IUxHDLA^IUpt"A`@tAatAL ANu ALt>t9t4I+u&ALtt tIHIUpIIDžI AeHHAHtHH+HHH+IuhHHHQHDHHfPHpIUpLDKDALEt A?` M}uH@IUpA|$RhIUpLc@HX LPAt$HPHXL;IA tIcDHH tHPHXL;} IA< uHPH;HuiHPL;LXHWHDA IHPHLX~ LPHXH9HI;|IUpHXQHHXLPDž L;HHP+׃HHLXIM[LL;vLcIHLPH+L;~*H;YHcHH+HPH;<HPH+HHPHHHHHHHHEHL_L;PlH3LPAHHD+HXHMcH<v+HXH8THH;rHXHHHHt$HXH8fDHI;r"HXHfo8fDHI;rHHXH‰L;PsAHHHXHPHXHA<A| IL;rHXADHP4HHHXHHHIIIHIEL_L;PLPAÃD+3McHv  HH;rfofHI;rL;PHXHHHXHPHXA; IL;rRHH3H)PHXHHLHHPHXA;@| HA IH;r‰HcI}pHPHXHXHPIUpA|$RuA|$REA8SHJIE(E3H&PxIE(P|IHt LHM&H]LeLmLuL}H]AeuID$(?E3E3}E3>E3dAN1kL}E3IL$(HIE(HtDHxIU(AD$(B|IHt LHMAD$(H]LeLmLuL}H]AbLA\H]LeLmLuL}H]ÃBIHt$AgIDžt AgIExHIHtH+IUpH+AD$RHIs^IE(HBPxIE(P|IHt LHMBH]LeLmLuL}H]IEp IEpAD$RAD$RLANELAD$RMM,E3ANELt HcID$(L3E3Ʌt^IE(H&PxIE(P|IHt LHM&H]LeLmLuL}H]ALCIHcH0H H IExHtIEpIEhIEpIA^HLI'IE(H,PxIE(P|IHt LHM,H]LeLmLuL}H]IExHtHIEhHIIEpA^HLIIExHtIEpIEhIEpIA^H tA`@tAatt I:HTI,Hap3nA^E3IEptA`@tAat ALtXANu ALt>t9t4I+u&ALtt tIHIEpIIDžI AeID$(HIU(HtDBxIU(AD$(B|IHt LHMAD$(H]LeLmLuL}H]ÉLAbA>XH]LeLmLuL}H]ÿΉL`H]LeLmLuL}H]ÿƉL`H]LeLmLuL}H]AAgAbAdM=AIGJHt IEhH+LIUpI+Uh?HXAIE(E3HtD0PxIE(P|IHt LHM0H]LeLmLuL}H]ù0LAbAVH]LeLmLuL}H]þ0L_H]LeLmLuL}H]3E3a3E3G3iIU(E3Ht|t?DBxIU(DB|IHt LJMDH]LeLmLuL}H]AbLDVH]LeLmLuL}H]ÿDDL^H]LeLmLuL}H]3H]LeLmLuL}H]H@UHHH]HL}ILuLmLeIHuM@MoxMIGpAHtLL+ H+IMohANIELDAFQuU(IT$H fA$AD$fAD$ AD$fAD$0fAD$8))B)B HLH}'(E)E)E)E)EHHUH}AEt&A?fDH]LeLmLuL}H]AVQHEA<$ tHUHB<" uHUE3Ҁ} t IB| uDDHUA^@GD|D+DŽDDBLAH;;|;IG(H tI@x&IG(@|BIHt 3HBI&H]LeLmLuL}H]AbL&ABoSH]LeLmLuL}H]HcHpL;MANALPXAatAƇNAƇL3ANRIILD`LhLhAD`PEɊXANALtMcMN(MoxIpANgL3DXD`LhLhD`DXIG(Hb tF&PxIG(P|IHt 3HBI&H]LeLmLuL}H]ù&LAbAQH]LeLmLuL}H]ALJHcH5w(H=Ht9t4I+u&ALtt tIHIpIILJI AeAHMtL+L H+IMohIMHcHxLDHcIpHxHcHcHpHxHL;ANALPXAatAƇNAƇL3ANRIILD`LhLhAD`PEɊXANALtMcMN(MoxIpANL3DXD`Lh6LhD`DXt`IG(H&PxIG(P|IHt 3HBI&H]LeLmLuL}H]ALJQHcH#H5H4MoxMt MopLIhIpIA^HLIWIG(HM,PxIG(P|IHt 3HBI,H]LeLmLuL}H]MoxMtI}IhHIIpA^HLIMoxMt MopLIhIpIA^HtA`@tAatt IeHTIWH z 3DXD`LhFaLhD`DXMoxIpA^t"A`@tAatALANu ALt>t9t4I+u&ALtt tIHIpIILJI AeAHMtL+L H+IMohIULDIpMc LLPDXLh)\LP3MGpMGpHMA(IwpHLhHDX~#IwpHuI_pB " HH;|HuIwpH},;AYEH7IWp>L+pIOpHL;xbANALIOpPAatAƇNAƇL3ANRIILLh茺LhAPEANALtMcMN(IWpL3DXLhLhDXt`IG(Hg&PxIG(P|IHt 3HBI&H]LeLmLuL}H]ALVKHcH  HvHIWxHtIWpIWhIWpIA^H\ IBIG(H,PxIG(P|IHt 3HBI,H]LeLmLuL}H]IWxHtHIWhHIIWpA^H\ IIWxHtIWpIWhIWpIA^H tA`@tAatt ISHL IEH 3DXLh\LhDXIWpA^tA`@tAat ALtXANu ALt>t9t4I+u&ALtt tIHIWpIILJI Ae IOpH3M~IOpI_pL HI;|IOpLMWpHMH]A)IGpAVQ AVQHcqII~(H?LeDDDLmLuL}H]3AVQH]LeLmLuL}H]AeuIF(?E3E3&BLNH]LeLmLuL}H]þ&LNH]LeLmLuL}H]þ,LNH]LeLmLuL}H]AN4AN8UHH0H]L}LuLmILeIH=Gd~IMtVA>tNHЃtyELHQ|HcH ttNQHЃt)y ELH |HcH tIT$(LjpMuH !DUHH]UHH@LuLmHHEHWHUHOHMHwHuLG LEHEH}AEGEtZEt>u HED08u HEMcL0'HB3FHEfD0Eu EHUHEH4RHH(HH9D>(tXHEHMHuHP(L IH~(IDRxLO\ELmHUHMIE(LRHq(IDH|H>NT E nHEHMHuHP(LIH~(ILcBxLODL]HEHUMk(L@HJ(IIcu|H9Jt HEHUH<@HJ(HH1d>(HEHP(HMHuL IH~(ILCL(LUL]KRMk(HM]AD(uLHEHP(HJpHqLmIU(LjpIEHBpI}׭I}I}˭HUHEH4RHH(HLBd(LULMO,RMY(IIAd(HMHUHu HED08u HEMcL0'H]?3QDHEfD03LmLuH]HED0:HEHx(H zqHED0HELH(EqxH}Hu؋ULUL]Mj(Ms(AMxEF|x.A}UHHLHDJL-L+HA)x)p)h)`)X)P)H)@LmAH3L}LuLeEHMHH Mc=4 DEt_DtBu HE:u HEH(H=3B HU3fDAE L=Ҧƅ8É0D(MH=IDOӃM4MtM;f8[ Mv0MuHHt)kH;tH=;H`Dž8eH=E3~0HDžeDH n3AI~(H 5IV(H;B uG3H}HEHEH=I~(H HEHBpHtx 2HHu8D(E3H 3HHBH~D(t IH0L;|L;tKHfHH@HHHÅIF(H@KIV(HH:3LD8IffT3fT @tfքfքA)A)DA)DA)DA)DA)DHPuIV(H 3LDIf3TfT @|fD fD(A)A)@IV(H L(At`DztAu HD8;u HL8*H:b3? HfD8H H=HUDmLuL}HEHUDeI~(3HHL5HM0H ()(H) (P )0(X0)@(`@)P(hP)`(p`)pIF(LLHPLx`IN(HQh>H=9LHPL H=u-3HLeLmLuL}H]HD8IHHHHfftfu HHG{EJD;w.HHHfftfu HH{AMcLH2KBƄ=H=?LDAj(}tTDtut=uHE7u HEHcH&H8v3y=HEfAu+ADHLeLmLuL}H]HEE(HEE0H HEHUU0}BEHcHMH HUHBHEL:U0}BEHcHMH HUHBHEL2DEH 8LIEɉ߾D3EHHHHfftfu HHnyHcI;rLL;8LH+8LL+L L58H=YPWIHHHHfftfu HHxEJD;w.HHHfftfu HHxAMcLH2BƄ=H=jԣLDA%3趻ÅuzIF(H@IV(H23H~HffF3fF Nfֆfֆ))D)D)D)D)DHPuIF(H3bIH5HHHfftfu HHwEJD;w.HHHfftfu HHSwAMcLH2菤3H}HEHEYH=lI~(H ^VI(D(HHHHfftfu HHvEJD;w.HHHfftfu HHzvAMcLH2趣BƄ=H=@(LDA#c8D(QIV(H#HH5S3Y薣HHH5=3HޠsHHH5*3HàPHHH53H-HHH53H HtaHH52HHtBHH52H̢Ht#HH52Hh譢HHkgHA$at%IIHI$8VIAA$_ ID$(HtImPxID$(P|I$Ht3HPI$mH]LeLmLuL}H]ùmLA$bAH]LeLmLuL}H]ID$(HtL@xnID$(@|I$Ht3HPI$nH]LeLmLuL}H]A$bLnAZH]LeLmLuL}H]ID$(HtIoPxID$(P|I$Ht3HPI$oH]LeLmLuL}H]ùoLA$bAH]LeLmLuL}H]þoLsH]LeLmLuL}H]þmLFH]LeLmLuL}H]ÿnLH]LeLmLuL}H]ANIII$IVII$AWE( HH5#˓HHH5r#H訓HHH5_#H腓HHH5L#HݐbHHH59#H?HtaHH5.#Hː HtBHH5##HHt#HH5#HHHWH1HjWH KWH5dWH=eWHfWLgWL 8WL)WHH H5H=HLL L HH5"HǏ<HZHHӏfDUHHH8L@LHDJL*L+HEA)x)p)h)`)X)P)H)@HL}AHDHHuH]LuE3LmLe AE HEE3ƀLHULH]H@H8DžHEDž0H HH t HUi@0}BHcHHHHBHL"0}BHcHHHHBHA$8H 8=tH 63%DAHMA$b ЈbH}A@b@@ @bLUEbAE EbL]I{(H L3HWHH~GLBt(t*ut B\Ft Bt(HUHz(HWHH0H;|H HMHA(H tIXxHEHP(Dr|HMHHtLhHELH]LeLmLuL}H]bHσEH]LeLmLuL}H]DPtHMHY(Hs tFCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]bHσA0H]LeLmLuL}H]AD$R;<QSSHAH{3.Yu6HU[\HMi Hu[AD$0HMHY(HtSCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]ÿƉH]LeLmLuL}H]úQHAH{3PXuDHUIHWXHMiH}@@WA$8tiDHMHY(Hc.CxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]AD$E<HAH{3|WHMd$ ЈdHuiHHu$HM$d ЈdHHEdIHA$8ti0HMHY(HOCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]AD$(;HAH{3hVupHUQRHMiHHt&Hu HEƀQ'Hu HEƀQ" HEƀQIHA$8ti0HMHY(HOCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]AD$RHAH{3hUuDHUIHYZHMiH}@@YA$8ti\HMHY(H{FCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]AD$BHAH{3TulHMa$ ЈaHuiHHtHu HEa HEaIHA$8ti`HMHY(HJCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]AD$=A|$OHMat3HHHH8HMH8H]IA$_ HA(HtPmPxHEHH(Q|H]HHtLhHELmH]LeLmLuL}H]bHϹmAgH]LeLmLuL}H]HA(HtS@xnHEHP(B|HMHHtLhHELnH]LeLmLuL}H]bHσnAH]LeLmLuL}H]HA(HtPoPxHEHH(Q|H]HHtLhHELoH]LeLmLuL}H]bHϹoA%H]LeLmLuL}H]þoH]LeLmLuL}H]þmH]LeLmLuL}H]ÿnH]LeLmLuL}H]A|$NHUIHHHuHKHHA$D!H]LeLmLuL}H]3Ɖ H]LeLmLuL}H]D#HMHY(HCxH]H{(G|LMIHtLkH]LH]LeLmLuL}H]DžHEDž0H HHHHHHHt{0}BHcHHHHBHH20}BHcHHHHBHH>8u~Nt5DH]LeLmLuL}H ]Dj^D3DH uH$b ЈbHH3HLH[IHHA(HtSD`xHHP(Db|HHHt3HPHHDH]LeLmLuL}bHσj^DEH]LeLmLuL}3DDH H]LeLmLuL}fUHHLuALmMc=tfHH=sIAFH{DOAN4MtM;n8t Mv0MuH=;3MDLmLuH]HH5u{踁HHH5_H蕁HHH5LH~rHHH59H~OHHH5&H~,HtaHH5H~ HtBHH5H~Ht#HH5 H~πHHEH~HWEH 8EH5QEH=REHSELTEL %ELEH}H }H5}H= ~H ~L ~L }L}HH5wH})HZH}H}UHH@LeAH]HL}ALuALmADEt9At3H{(H o}E| McHC(HK dHD (t3DHHEEAA AAUAKAAAe4A?u eEHDEHD3H}HHHHfftfu HHQLcHL;H*Fu A dEHDEHD3H}HHHHfftfu HHlPLcHL;H-u A HAHD3H}XHHHHfftfu HHOLcHL;Hr&LHIH I+AAH{(H zvf)EfEHBH5BHHH{(H HHczHH}XD[DDH3DH]LeLmLuL}H]H{(H (zԅu A MHAHD3H}HHHHfftfu HHXNLcHL;H @UHHH5v |y{HHH5` Hy{HHH5M Hxs{HHH5: HxP{HHH5' Hx-{HtaHH5 Hx{HtBHH5 HxzHt#HH5 HxzHH?H_?H @?H5Y?H=Z?L[?L \?L-?L?HwHwH wH5wH= xL xL xLwLw*HH5{ Hw-zH]HwH]UHH@LmI3LeIL3H]L}LuOgI$It$XAT$`M|$@Md$HAHG MI It.IuAgp Iu1AgtoH AgA^uhuHHHH}OЉUHcҹxEHcHu0H=} ByHHuHx:H=S $yHHuHH=M yHHuH HHHfftfu HHJE u~HHuE> tE3AA33Ʌ~,HcHD\A tEuAAD9HɉEE;rڅu5AgzLHuHU gEWHuƅ>~jEttHH9wHHuHcU&wHHHfftfu HHIHcUHƄcHcHH¹vHcEƄ;>/PMNEAqMcHLLgvBƄ%L3DD3E~A8 uIDt;r33EMc~/DKDTA tEuAHAHDAI;rƅA8~McE3C</DEHDuEALHLuEHJ< t/IHuHcU"HcEIIƄIH:utW:VuHHu33H]LeLmLuL}H]ø+H]LeLmLuL}H]3HH 3tHuHHuHIHH HcHH YH H_8H8 uAxuHHMTHD8H8tAxuHH2)H8H8tAxuHHHuE3HAgA_ tJIHHuHHfftfu HHyF3HۉEHE3HH 3EsHHHfftfu HHFEHHHHU <3HHuE?H5}HuH5eHuH5MHuH6H8csAxWtHHt HuE3H5HuH6H8%sAxtHHt HuE3UH5HuL3IAcIDH]LeLmLuL}H]3HHH=HUEH3HLDLHrHHHHHfftfu HHhDLc3ɺAB|6/EÁkH}LH}EtAA>/DmDmMcAD=ZrH3EHHALDLudC>=H}LLH}EtAB'/DuDuMcA>qHu33҈3U HqHcEHUfDXXDXXXXfortE EHcH}8lqAxHcUHH¹HuGpHDLpLAx/tpHHHfftfu HHBAEMcHLLoELMcBƄ5H=LhpLHtHÿ 3A H5HHHH3-mHHHfftfu HH^>HIt(HuȹH@guuItTHuйHUBAEt5ItHEȋ1DH]LeLmLuL}H]ÿpHU2tH]LeLmLuL}H]ÿpHuHU3HJHffBfB B@fւ`fւh)@)P)D)D)D)DH@uH3HJHfBfB B@fւ`fւh)@)P)D)D)D)DH@u渐)))))HPuHEA^HǀLEA^ A^L]E^AE^AE E^HUE^A^$A Lj^H}A^@^@@ @^LUE^A E^AE E^L}EgAAg$A AgHEAgg ʈgLEA^@@A^@@ A^H L]E^AE^AE E^L}A^$A^ иA^3HuH HDžHHxH}AEtcH}\HPItHEȋItHEЋDH]LeLmLuL}H]HA^HǀLA^ A^LE^AE^AE E^HE^A^$A Lj^HA^@^@@ @^LE^A E^AE E^LEgAAg$A AgHAgg ʈgLA^@@A^@@ A^H LE^AE^AE E^LA^$A^ 3A^HHxHjAEHEƀNHUc@A}ZHcLLuL3kALFHcHH `H IFxHtIFpIFhIFpIA^HLI[IF(HFtF,PxIF(P|IHt 3HPI,H]LeLmLuL}H]ù,LAbA_H]LeLmLuL}H]IFxHtHIFhHIIFpA^HLIIFxHtIFpIFhIFpIA^HtA`@tAatt I7HTI)H/3A^IFptA`@tAat ALtXANu ALt>t9t4I+u&ALtt tIHIFpIIdžHEHxpHHHEHXpH}xTAE33H|rAEEHI<$HppHH+ALcLI$B88 uE~HAI$8 t3ED33E~(McIDLA tEuDtHA;rEuEL3H}(3HH}zHzItHEȋ\ItHEЋC3H]LeLmLuL}H]þ,LTH]LeLmLuL}H]3H}Ly3HkH}zHyItHEȋItHEЋDH]LeLmLuL}H]3H}L3HH}yHsyItHEȋ*ItHEЋDH]LeLmLuL}H]IF(HtF&PxIF(P|IHt 3HPI&H]LeLmLuL}H]ù&LAbAH]LeLmLuL}H]þ&LH]LeLmLuL}H]3H}H}OxHCxItHEȋItHEЋDH]LeLmLuL}H]DUHH0H]L}LuILmILeȻE]]A^tIHu IEXH AHt ƅcILMMXHuMU`HM]@HMMeHLEHELMLUL]Le*tH]LeLmLuL}H]HHHfftfu HH1HIH 3fAJtuIHtHt Hu.I Hu Idž IHtA_@3AeIHt{HtbHu A_@3cHuA_@AdCA^0 H]ELeLmLuL}H]A_@IHt{HtbHu A_@3cHuA_@TAdCA^;0 H]ELeLmLuL}H]A_@ IUHgHcHH5pEH4AaA^{JAaAaHA_@AaAa&AaAaAaAaIHHcHH5H4 EEA_@tA^uA`t(A^u.H]LeLmLuL}H] EEA`]t(A^u.H]LeLmLuL}H]IH E]uMEIEPH)HcHH H A`tY.H]LeLmLuL}H]A` A`A`A`oA_@A`A`IEPHu A`:Hu4 A`(A`t.H]LeLmLuL}H]IEhHwHcHH H AfXA^u A`?Af5AauutA^uA`A`@AALIHHcHH5HH4Aauuu A`@tU.H]LeLmLuL}H]AƆL(Aat.H]LeLmLuL}H]AU0ANIE0H#HtqHu5AaA`@taH|XSAƆNDHt>A^0 H]ELeLmLuL}H]AaIH#Ht{Hu"Aa|AƆMHu/AaTLDAƆMg0H]LeLmLuL}H]Aat+Ht"t.H]LeLmLuL}H]èAƆMIHt tut AƆLeAfuuA`tt"AƆL5tAƆL"HʃtAƆL t tut'Ht".H]LeLmLuL}H]HAft+ut#t'.H]LeLmLuL}H]à !IUHt0 H]ELeLmLuL}H]A^:0 H]ELeLmLuL}H]A^<0 H]ELeLmLuL}H]IHIDž3uUIW?AEx/>HcI >8 t>8#t H]LeLmLuL}H]E^At-Aat#A`@tAƆNExAƆNExIT$hB t"+u BA$cA$cB$A$cƉLH]LeLmLuL}H]333I.>L=Ht3A=3Ax=<HcIH]LeLmLuL}H]LAxr=HtAa j<HcxIH]LeLmLuL}H]ÃAA333I=ÉH<H&H=Aĉ30<3Ax<>t Aa7HAxt<HAa333Io<ÉH6<HyH [<Aĉ3;3Ax;HAx;H Aaq333I;AIDH޺;HDHI;AD3:3AxZ;HHWH;:  HH;r3Ax;HAaIdž AeAa3Ax:HAx:t AcH98u Ac19Hc&IAcH]LeLmLuL}H]r9HcHIVxH]LeLmLuL}H]HH;HIt IE 1HW%HcxHHNIM HcIE HFIE(HHcIu( tE3AA33Ʌ~,HcHD\A tEuAAD9HɉEE;rڅubAgt!LHuHUu+EtHu7+H]LeLmLuL}H]H]LeLmLuL}H]ƅ>~[tvHUHtHt HuLcEHEHU5HHHfftfu HHVHcUHUHcHH}HcUHEA]t AA>/;It$H(ID$ AAHcHHDE0HHDEƄHE3DD3E~H}? uHDD;rH}33EIc~3HEH8DDLA tEuAHAHDAH;rHEƅ8~yIcȾHE</EI<$%DEDAHH}HuEHMHuEHMH<t/AIHuHcUHMHcuHuHMHA4A]A3H]LeLmLuL}H]3HH 3/HR0HHuHiIHH HcH H !H HH8/Ax0HH\THH8/Ax0HHA)HH8i/Ax]0HH&Hu3HAgA_ tZIHHuHHfftfu HH0I$H҉EtI$vn3HH 3E'.HHHfftfu HHEHHHHU3HHuEH5$HuH5 HuH5HuHpH8 .Ax.HHt Hu3XH5HuH3H8-Ax.HHt Hu3H5Hu3H3LLH}@7ỈuLUL]DEL}LmILuJ|-HHHHHfftfu HHYLcE3AB|>/DEEAH}LH}tAA?/DuDuMcA>J-HH3@uII?DEL}LLmLuuzA4H}HHuEHMDEnEDEHMH}t ADE/DEMcA8,Hu33҈3U H+HcEHUfDXXDXXXXfortE EHcH}8B,AxHcUHH}HuͼAEANLL}LmLuEHMZ+DEHMEHEx/tHHHfftfu HHsFMcHL¹HuEDE*DEEDMcHHEBƄH=DE+DEHt0H=DE+DEHHDE"*DEHEA,H*HHHEHHHfftfu HH~A~/H=j*Ht H=Y*HH)HuEHHuERH4H8)Ax*HHt Hu3$H5HuAgtA^8H=)HHuHHH8c)AxW*HHt Hu3H5 HuA_ 3HH 3(EHHu yH]LeLmLuL}H]A^A^mfUH3H]DUH90H]fUHH90H3H]fUHH]fUHH]fUHH]fUHH]fUHH]fUHH]fUHH]ATAUAVAWSUHxDJL.L+H$A)x)p)h)`)X)P)H)@AH$AL$ID$$H$3AfWf$H$(H$ L$H$H$H$H$f$`f$pf$f$f$f$f$f$ f$f$0f$f$@f$f$Pf$HDŽ$t,A.E:DD$HHcHH#HHH H$A A$@sH>Hs IAuLL-uH+u HAIľE3E[EEADD$8EHDA@AD$HED$@E$XE$DDA@AH$PAD$`%L$hD$pD$0E$EZAobMcL5zL=OHA McI©McIHE3IAIIL$ EDM+H$(IL$ H;$L$MIH$OHs IAuLL-uH+u HAIAE3E*EDADLDDD$hEEA%@A@DL$xE|$PDD$XDt$`DALD$pH$H$D$D$A$joGHcL-oL5MtA|$hGEHHl$ HIHAHHHH l$p<$H*$HMHL l$ HL H-MEE& $L\$D]E %A $A HA;&AIEϋ $L\$m$MEHMHL l$ HL H-ME%L\$DuE%E$A A E;%AHIEL\$DuEuqL$Ht H-Hm( H-Hm HHl$(HH |$XHE݃|$PBE9A<$ .IAu!}ftMIIA Hu)$HuE$H HcH©HT$ HcHHT$HE3HڽHHLt$HDDM+HD$ ILt$HL;$$H$HHH$L,Ll$L$rHl$ HyHHHL+HT$HILuH"|$`u?u$|$Pu-$u$;T$x%H%HD$HHIAxH$H$D$LHHEH@IEAt.|$tEt"A$uEtD$(H5 HD$ Hu;HH H ut$,DH%H=D$(HDHt5H|$@pHHHÀHcL$0HEHHAHE T$0HcHHHcL$8HLl$HIHD$ LHHN,IHLDH$HHHӤ$HwLH$E3HDŽ$H~H$HIHH$H$H$ H$H$HHPH$H԰u H$HH԰HtH$L$E3MMIML$ML$H$}H$3HzHH?LTIMMEID$HcDHHIIDM LLMHDIDII HI;rHcD$H uHL4H;HcLHHHHDHH HHc$AHA ^!E3L$LH$HIHHIڸH;ANÿML;DOA !AH$AAMcILHHtL$LL$E3H~HAHH>L$IMcM+EsH$H$LNMcEDE3DAMcLT$MEJt H$AH$I+L<$HD$H$D$HT$DHHcHHM<2MIDIDHhHHcLLcL Mt2LHDJ IINI;rHT$Hct$L<$HD$H$H4uH$D$I;H$DI+L+HLcN|(LHDIJ NH$LcAE3AD3AE3EvjH$I+H$D$LJ| M4;J,HIILuMt;ILuA;rH$|6D$;w$HcLIH+L$LHt(JHL$H HpH$HHHtHH$HH H;$wH$t HHJHHt,H$H C$H4$,$H?\$L$=H| HH%H$E3HDŽ$H~H$HIHH$H$IH$I@HthH$HH@wVL$IuEMLI IM2H4H?I4HL IIMOL $ $pHo)Dp)D`)DP)D@H@uH$H$H?H$HHDŽ$H;s?HH$HDŽ$IHDŽ$H$H$p^H$HH$H$HHLI0HtH$L$pH$HH$p)D)D)D)DH@uHDŽ$HH/VH qH=bHtQ^HxHH$hH$H$HHHHtbHHLcLL=ҿCtHIyH;LNGHEAAI+OWL=HcL$8KL$hI HDŽ$PLc3AE3HcHD$N܀L$PNJܰ@M<HO4MM;AO4AM|OtMM;AOtAIH;rHcL$PD$L MM;w-M+H$PH$@JܸJLJ܈H H$@H Hu/H$HH$HHH48HHtH$@HBH$HH$8HH$0HH$LD9L$hAHzI3I?MDIMviLcIN<MI?MI J<J<II?HM N<I;rHcL MHH L;w2IcL$@HHH?HH HI H$@H HHEHrzH$H?H$HH;s-HHDŽ$H$hH$/H$HHHHHtHĀL$pHH H<$M MDL<$LI L $MH|$ LH ILL$ LII MM;AL$AL\$IJLH II LLcL3L;LD$HxJNİLALD$@MHE3MLcMPHt$L$H$L$XHpL$JĀH$H$`H$D$Ld$ LT$IN,M+IM+LIILl$@IHH IMHIILII HH MH H3M;IH;иLL;M]AAH HHIM;L\ZH$NILT$@L$L$XMLT$L$H$E+H$`H$D$IcHDŽpHAxeLcII7,DAAA+HcfpfHH;rI;s3HpHHI;rH$E3HE3LcMHcJH$L$L$XL$LL\$HI<0H$H$D$3H/HD$8JHN$NJpH|$0NHt$PHHH LT$(LL$ LD$Lt$HL,M+ILHI+ILM>MI IMLEMMLI LH MI ME3M;AI<6H;LL;LAAI MMILLX3MM;ڃIEH;L$PLHL+HD$8H|$0Ht$PLT$(LL$ LD$M$IIM;H$L$L$XL$H$H$D$H԰HL$hH$3HE3A3HcHvmHt$LLpHt$@DJIL7LL;ظL|7JDLL;NN|HL;rIcLML;D$w*HL$I+HxH̸HHHH H4$H$HHH<0HHtH$HHIH$HAHrI3I?MDIMvgLcIN<MI?MI J<J<II?HM N<I;rHcL EHHL;w%IcHHH?HH HH?HHBHEH$IcκHHH$H HDHHHtHҺHEHt3HHEHtHu3I2H5~5 H:IH?33H;ȃIM8L;$v HMHJHL$H1|HIALH?H@DIIHIHDAHIIL#L $L\$L<$L;$|IL8H;$iH$I+H+H$H HL$AHIHIELQL;$} L$ML+IIME3Hv"L$L|$O \IL;rL$~$LT$flfADfADfAD(fAD8HI;rfpffք$L;$H$L$L\$O TIL;rXHL$HHM\8H$LQMMI?L $LL$L;$IL8H;$ H$I+H+HH$HMHL$AHIHIELQL;$$L$ML+IIME3Hv"L$L|$O \IL;rL$~$LT$flfADfAD fAD0fAD@HI;rfpffք$L;$s*H$L$L\$O TIL;rL$L$E3AMIEEIHL$O HALDHHH$HH;srHD$I|8HH0HHDŽ$HHuH$HHH4HHtHuHIH$,HH$HtHT$H$HHH#H2HD$H0I#II| AHÀt;HtH@ H֭HH A@HE'HtH@( H@ HH A HEI2HH A@H$HEADH%H$H?H I4H4LI HH HHEH$$xH$HH4$H H?HT$ H,$\$HRL$H+H(~H ?HYxt Yx(HWu(H$Ht!At H$H( H$L H$HtH$HHĸ][A_A^A]A\$0H$D$0H$HD$HL$ $0}A$HcH\$HHL$HAHD$H$D$D$LI3AHT$@H$H $D$L$`l$Pt$hLD$@E $HEQAVMcLBNL5O4AuuQMcLH@IIJT ZMuH@OuKUHˀuH$H$pH$33HH$E3E3_HHH^xH$H$D$PA $LD$(fATAUAVAWSUH Ỉ$Չ<$HcfHcL$ L$x H$ H$H))))H@uL$ 9AMM0HcHHu Hu3AA A3A AADEAAAމDEAAE޾I I M HHL HL HHtHHEHt3HHDD$I|$L#MIL3ILDHDT$HD$It MM;MHsH$ H$ ItIHH HEH LHQHtHH…u@HI+H$ 8HsH$ H$ MItaIIuIH$ DH$ HBЉIHH HEH$ H LHQHtHH…uH$ @HEI+ĉ;HsH$ H$ ŀtAMtEH$HLhL;$ ~M*M%I|$H$ LA$0LLMtI`FL0LpK<,H$ @E^LHHHtMII(M3I)M~ MHMH+I/HAHH$H %HsH$ H$ ID$ IIMMIIIIIPFIMt II(I)3M~ MHML+INHD$0$h uMIƅjH$HH1GHE3HHHHHIDHnFH$ MnII>Ol5IL$HL;LMHNt3t:HLHAHIHIDH$L$HL$0L$HD$I|$D$HL,$A$0MH$ H$ L$X $p L$ Ht$0\$H,$LL$HMuH;DHALMIIIH?HNTH NlH<L;MK<I;AAHHI>MH?ML H?NTHxH;ÉJDHLM;kIcIIH$ H$ HmO,;I;w]L+O$M;LAO$ANH>IO|eM;ANAHI?I IJLLMLP$IDDU0DHIiRA;2H$ H$ ILb?IIMIL+MEDL$ L$IMtHI;E33E3AMEIL-$ $ A ȍ,iLH$ HK, HK H;AFMM+I@D$ HJl8H^<IDIcIL+L$ DIIcLL΃AAE3AEH$ E3ALMDAEIHI;DIL;DL L̸MDAEIHI;DIL;DAL HE;rH$ GD6D;wDLE3E3MDEIHI;DIM L;DƃMDMHE3MDMHHH+H3H?MtHI;˹E3ɋ$ A4A H$ HHHj<Ma<H;@H@HBH$ HHHtH$ HH(!H$ 3H)H~ HHHH+H$H$)L )L )L )L H@uL$ H@AH$ H$ /NH$ H H LxMH\k^L$9IHNMt}2H$ IIMcL L=tL5uC\YIkH;LNG,YEAAIKLIcOfH\$eH$ HHIIMcLL=CcML$H;MLG4cEAALIcL5IOoKH\$H-L HlE^IxHH$8IHNMtHMH AEIMII MLMLI I MME3M;ELcAMMI MM;NH AI MMN@ AJDŽ xTID8EE3AMcfB fB@ IM;rM;sE3N N@ IM;rE3LIMcMPH$ N@ MT$N L$H NL$P H$pL$H$ H$H$ MN,M+HHLI+IL$H IM>MEI IILLIHI H MH L3M;I4.AALH L3H;L;LWAAMILLMM;ЃIUL;$P LIIM+H$ H$pL$H$ H$H$ M$ALqLcJH$LJ@ I(IE3E.DE3AD3AMcMH$ NL$N@ L$N L$H$H$ L$E3H$H$H$DL8IL0MM;ELALT8L\0MM;EL\AHM;rIcL$H$ H$H$ LEM;w M+N NH NIIHu'L$H$IIN< IHtINL$MMI\(L$I3InIAI?OD0IMvdDLcIN,MI?MM N,N,MI?MM N,I;rHcLEHLL;w*McJHH?HJ JIIHIIEII;,LJJH?NLL;s|NIHHDŽ$NĸMH,IuH$HHL(MItHt IM,IL$H+NM+HHLMt+H$) ) p) `) PH@uE3H$ H$ wH3HAE3A0H$ }=H$` H$` H$H$ H$H$ H$H$` H$` H$H$ H$H$ H$M+HMyL-MpL$IDM$H$LH K|*HNĐDL$xLd$HEIMH$LH HH$@ HL$0 LH L3L;H HHD$McMH HI HHIAL$8 ILHHD$HI MH MI HM;NAAH;N ;˃3IM;σE3II;H I HIHHHNJJNIH$H E틔$H$L$L$x|Wʻ3v03JJJJI;r֍\ ;w3JJIXHc3ۅH$LILIWHIGH$ L$( L$ H$ L$L$xL$L$L$L$ LM+HL$@ ML$0 MI<$IAI MMMMMLI H MI ME3M;EH$( I4/AI+H;DHH;HGD3II MMHLII;L$H ML$8 MMMMMI HLMH M;I,3HDDI MI IL3H;H;DHLHII;AL$ I DIJH;$ HL$( L$ L+L+H$L$L$xL$L$L$IIWIGH$IPAI@HĈJĠH3LcED3AD3AMcML$xNL$NL$NL$L$E3L$L$L$J9HN LL;DNJ\9N\ LL;DN\HI;rHcL$xL$L$L$LAIDIIl*H$H$H$` HIIIHM;|fDH$` HE3HAH$` E3H$A0H$ H$HKH$HܐH$H$ H$DHcL;6McMHMHMpD$L$M\L$MTMlLH JĐHL$Ll$HEIML$II HH$ IL$ MH L3L;H HLD$IcMH HI HHIEL$ IMLLT$II MI MI IM;LİAAI;N$;˃IM;H$ ʃE3II;H I LILHLL(HĨLĠL H$L$L$L$D$|Wɾ3v03H(HĨH HĠH;r֍t;w3H(HĨIXHc3ۅ+H$ L(ILIWHIGH$ L$ L$ L$L$L$D$H$L$xL$L$ LM+HL$ ML$ MI<$IAI MMMMMLI H MI ME3M;EH$ I4/AI+H;DHH;HGD3II MMHLII;L$ ML$ MMMMMI HLMH M;I,3HDDI MI IL3H;H;DHLHII;AL$ I DIJH;$ HL$ L$ L+L+L$L$L$D$H$L$xL$IIWIG3IPH$I@JĠHԨH$HLcP3A3HcHH$NL$NL$N(L$L$xL$L$D$E3H$L$L$L$L4+HN$ MM;EN$ALt+Nd MM;ENdAHH;rHcL$L$D$H$L4]L$xL$M;w(M+H$J0JJHHHu(33HHHHtHJTHԐHBL$MMHL$H3HzHAH?HtHHvuL$xfDLcIN MI?MM N N MI?MM N H;rHcL$xL4]HLL;w%IcHHH?HH HH HILDL;$/L$H$HĘH?H$HĐHH;H$L$HĐHĈHDŽ$H:u"33HHH<tHH$LDMt JĐHAH$HtH$HĐHu_E3H$3HIHHtIH$L$-H-|AIDITIl*H$H$IIAIIH$H$` H$ H$H$ I|iM}dH3{H-{J\K6II)M)MH$L$$!HHLMtH$P) ) ) ) H@uMH!I7|qLHLcLKzL=D,$$D;ALOl7HcILHHH|$H;}Mt$ HD$HL$ HHHD$I|$H$ 3HD$LA$1L$I|$MuMtMxMu.HN顾H$ $p L$ 靶$ H$ H$ $p HL$ Ht'$3҉EHcHHD$.H$ .H$ L$ VL$x $ H$ L$ L$X $p L$ UL$E3L$L$E39E34E33fNL$L 6YH2YIAM HH$L$cMILHLcL%sYH dYClM]I;MLLBYGH$ H?H$ BЉIH1H 1HEH$ H e1HHQHtHH…uH$ A@HADEH+ʼndH?sH$ H$ AAĀtAMAtDH$LhL;$ ~M)M$H}H$ HE0AHHMtI`GH0LW!J|-H$ A@ADEIM#I4MtHI H L3H H~ HHHL+H/IIH$L %H?sH$ H$ H?$ I?IIMM#III4IPFIMtHL I I 3M~ MHML+DIHD$0$x uMIsH$HHHE3HHHHHIDHNGH$ MII>O5IL$L;LMHN3t:HLHAHIHIDH$L$HL$0L$HD$H}D$HL,$E0MH$ H$ L$p H$ D$ Ht$0\$H,$LT$HMuH;rEHALMIIIH?HNTH NlH<L;MK<I;AAHHI>MH?ML H?NTHxH;ÉJDHLM;kIcIIH$ H$ HmO,;I;w]L+O$M;LAO$ANH>IO|eM;ANAHI?I IJLLMLP$IDDU0DHIiRA;2H$ H$ ILb?IIMIL+MEDL$ L$IMtHI;E33E3AMEIL-$ $ A ȍ,iLH$ HK,HK H;AFMM+I@D$ HJl8H<IDIcIL+L$ DIIcLLփAAE3AEH$ E3ALMDAEIHI;DIL;DL LMDAEIHI;DIL;DAL HE;rH$ GD6D;wDLE3E3MDEIHI;DIM L;DƃMDMHE3MDMHHH+H3H?MtHI;˹E3ɋ$ A4A H$ HHH<M<H/<@H@HBHH$ H#H4HtHH $ H !H$ 3H H~ HHHH+H$H$)L )L )L )L H@uL$ H@AH$ H$ /NH$ HCH CLxMHLy^L$:IHNMt2H$ IIMcL "CL= CL5 CCLYI{H;LNG,YEAAIK LIcOfHL$eH$ HHIIMcL(CL=CC cML$H;MLG4cEAALIcL5BOoK HL$H=BL BH|G^IxHH$9IHNMtHMH AEIMII MLMLI I MME3M;ELcAMMI MM;NX AI MMNP AJDŽ xTIm8EE3AMcfB fBP IM;rM;sE3N NP IM;rE3LKMcMPH$ NP MT$N L$X NL$` H$xL$H$ H$H$ MN,M+HHLI+IL$X IM>MEI IILLIHI H MH L3M;I4.AALH L3H;L;LWAAMILLMM;ЃIUL;$` LIIM+H$ H$xL$H$ H$H$ M$ALsLcJH$LJP I 8IE3E%DE3AD3AMcMH$ NL$NP L$N L$H$H$ L$E3H$H$H$L0IL(MM;ELALT0L\(MM;EL\AHM;rIcL$H$ H$H$ LEM;w M+N NX NIIHu'L$H$IIN< IHtI^L$MMIL8L$I3I~IAI?OD0IMvdDLcIN,MI?MM N,N,MI?MM N,I;rHcLEHLL;w*McJHH?HJ JIIHIIEII;,LJJH?NLL;s|NIXHDŽ$NĸMH<IuH$HHL8MItHt IML,IL$H-,NM,HHLMt,H$) ) p) `) PH@u3H$ H$ tH3HAE3A0H$ }=H$H$p H$h H$H$ H$ H$H$H$p H$h H$H$ H$ H$M+H`;HxL%X;LwL$IDMH$LH L$xHOD!LDL\$HEIML$MI HH$P IL$@ MH L3L;ٹH HHD$McMH HI HHIAL$H IMLHD$HI MH MI HM;NAAH;N,;˃3IM;E3II;H I LILHLNJNNIH$X E䋔$H$L$L$x|Wʻ3v03JJJJI;r֍\ ;w3JJH_Hc3ۅH$LILIWLIGL$( L$8 L$0 H$ L$L$xH$ L$L$L$( LM+HL$P ML$@ MI<$IAI MMMMMLI H MI ME3M;EH$8 I4/AI+H;DHH;HGD3II MMHLII;L$X ML$H MMMMMI HLMH M;I,3HDDI MI IL3H;H;DHLHII;AL$0 I DIJH;$ HL$8 L$0 L+L+H$L$L$xH$ L$L$IIWIGH$HWALgJHH3LcED3AD3AMcML$xNL$NL$NH$ L$E3L$L$H$J8HNLL;DL8J\8NTLL;DLT8HI;rHcL$xH$ L$L$LD,$$D;ALO7HcILHHH|$H;M$ HD$HL$ HHHD$H}H$ E3HD$HE1(L$H}#MuHtMxMu/Ip麽H$ D$ H$ 颵$ H$ H$ D$ HH$ Ht'$3҉EHcHHD$-H$ 2H$ H$ [L$ $ H$ L$ L$p D$ H$ }L$E3L$L$E3@E3OE3!3cNL$L H MAM H L$L$pLHIIMcL%C lMUH;H MLGLsIAuD$L+D$LA-uHA+u$HIDŽ$8AHDŽ$0$EADt$PEAD$L$EMA@Dt$ L59D$EAD$EAD\$@M^@Lt$pL\$xM^PEL\$AEDt$XEAA@D\$`EDt$HEAAD\$hD$H$H$D$D$AHoHcL%XL5QM4A|$PyX$JH=M4H$0%HADŽ$8H HHH $fHHTHHHL$0HM L $L%vMKLT$H4$H|$AA<$KA7 I;KAIED$H4$H|$LT$E$$EhI$M HHL$0HM L H M$JH|$LT$D$DEJA?A A;JAHIED$H|$LT$D1EupHLHL$xHEL$HII |$ ( )$ IE܃|$@?$1$A? uIu$yftMIỈ$Hu.IHu $IH HcHHcHHE3HAHIHEDI+HI;IMHƋ$8IO L{MuHHHH$0HH+HH$0P|$XuI+|$`u@"$uvI|$@u(I|$huA;iKH\KH3I$DH$H$D$MHIEH@IEAt2|$(t$t!EEu $t HDMuBHH H uH$(H?H$(DH%H=HDCHt3HsBHHHÀLcD$8HEILAIE D$8HcIIHHIHHމIL4HcD$0HHIMLDIw9HDŽ$XMH$~H$MHMH$L$MHBH$XLİu H$XHH԰HtH$XH$HH$-H$HHHH$H$HH$H$H$XH$XE3HrHH?L\IML $MID$IcDHAHIIDI HHIHDIDHI HM;rMcD$J EIJH;HcH$HHHHHHH HHc$XAHA OFE3L$LH$HIHHIڸH;ANÿML;DOA FAH$AAMcILHL;ǿII;HL4 I MMHHT4(LHL;IcIH$D$L$L,]HL$N\$H_L;wHHH MHII HIII II IJTH H N8II;JTI;ĸH3M;߃HHHHJTHHD$HHD$H;s8HD(H|$ u3HHDH| tHcHHDHL;$xH$L$L$8H$H$@H$D$H$XH|H HL$HCH$XHT$LD$IHJ4H>HtH$XLD$E3H~HAHH>L$XIMcM+EhH$XH$HRHcʅ E33HcHELTH$XAL$8H+H $H$H$@D$DDIHcHHN,MIDIDHhHHcLLcL xNdLHDJ xHINL;rIcL$8H $H$H$@HH$XH$HHL I0HtH$XL$(H$XHԀH$(H$)D)D)D)DH@uH$)p)`)P)@H@uHDŽ$0H=HDŽ$xH=3ҿE30H=}MH$L$L$L$8H$XH$@D$L$H$0H$L$L$L$8H$XH$@D$L$H$0H+H-HL%LyL,.MI KT ML̀H\.DL$MH$HLl$LEMI IL$xML$MI IMcI;D$PMAAI II I;JMI MMLHH ILAL$IMLH\$LH MI HH;JDŽJDŽNl=3M;MM;NAAI I MILILN\xI$PEL$xL$|\AA3AEv0E3NNNNlxIA;rDlD;w3JJHiLc3EOH$NINH$NML$I\$L$L$L$pL$hL$`H$L$xH$H$0L$H$H$L$L4M+HL$LH$xHM,$MEI IIIMHIH I HH L3H;L$pNM+3M;ЃII;L$MI]MH IH$HLIML3HLHMM;σHLH H LL$hL;II JAA3H;H;ظI H MLMH3LMMMM;̃IFH;$`HL$pL$hL+L+H$H$L$H$H$0L$H$H$IML$I\$H3L$H̀LyMcH̀HEDE3ADE3AMcMH$ǸǸJI,IK4HH;ŽK,IlKD4HH;ŽKD,IM;rIcH$L,]M;w M+JJ̈J̈HHHu"33HHL MtHHH̀H$HY7HIH$HALIM3IMvl@LcIN<MI?MI J<J<II?HM N<I;rD$HcHMcIHM;w,JHH?HJ JHHt#HHtHHHHH$H?H$HH$H;s`HDŽ$H$u:33HHHtHHuHH$I[H̀QHuL33HHHHtHH+LHT.H.O\H$H$H$XHIHHHsH;|fDH$XwL$H$0H$L$L$L$8H$@D$13ɿH$3H$@0L$L$L$8D$H$H$0AAMcI;zHcHL sH9L%kL{H$N,N\"JTMI L܀H$LELl$IEMML$MI IL$L$MMH LL;LD$XMcAAI MH MLHI H MIM;AL$HT$NAAMMMLLMH I LML;JDŽO,8AA3M;MM;NAAI I MMMILN\xJDŽIH$ED$XH$H$|`AAEE3AEv1E3ANNNN\xIE;rG\E;wE3NNLKMcE3E/L$`NMNM_NMGL$hL$xL$pH$H$H$$H$H$0H$L$hN4M+IL$LH$HM,$MDI HIHMHHH H HH L3H;L$xH4)M+3H;LL;H$HMEAAHH IH$HHILL3ILHMM;߃LHH H HL$pH;MLOAA3L;҃M;AAH H LLMIE3LM]MM;AMVL;$`IL$xL$pM+M+H$H$H$$H$H$0H$MM_MGHE3H$L܀L[McL܀MEEE3AAEAMcL$PMH$NH$0NH$PNDN IJ0II;AJANLJ\0II;AJ\AHM;rMcH$0H$NEM;w M+NNNMMMu$E3E3IIO8MtIIL܀L$M/MHL$HAL[ME3IMvnDMcAINMI?MM NNMI?MM NM;rGMcIMcINM;w,NĈMI?MN ĀNĈMMt#MMtMMHHL$I?L$ML$M;saHDŽ$H$u3E3IHJtHHt H܀nIL$HRMuM3E3IHNMtHH+H-2NDN Hl*L$L$HHHH]H$H$0H$L$L$L$8H$@D$H|iH}dL5H !MD@6HHHH$HH$,HHLMtH$H$)Dp)D`)DP)D@H@uH,H7|oHHLcH=QLBH3BLGIpH;LNFGEAAI+OKIHcL$M\I L\$HL$HDŽ$xHcH79,HH8-H HDŽ$HtQ^H$H5HxHH$u L$IJĀHtL$LDA^HxH$H+HHLMtHNH$EH$HHH L>L$HT>IHv$$HcLMӉMH L$LHHI I ML3M;IʃH LI LME3L;AH$HL[MLcE3H$MH$PLH$H$H$L$HPD$J܀H$L$L$L$8H$H$H$ H$@L$L$IN,M+IM+LIIL$PIHH HIIMILII HH MH H3M;IH LH3H;ÃL;MUAAHIM;L[H$J HىH$PA+H$L$L$L$8H$L$H$ H$@D$L$$HcHDŽPHxeHcHH(x(AEAE+McfPfHI;rL;s3JPJIL;rH3HcE3H-Lc$LL$D$H$ǸL$J L$L$L$8H$H$L$H$@L$E3MNH$HHHNJJPL$NL$J"HH H$H$L$N,M+IMIM+ILM>MI IMLDMLHI HH MI ME3M;AI4H;HH;I)3H LMHLIiII;IuL;$HIM+L$H$HL$L$H$H$I(HIH;H$L$L$L$8H$H$L$H$@D$L$H H$E3HH$$E3E3HcHH$@HD$HPH$PM1IM$)MM;AM$ AM\1Md)MM;AMd AIL;rIcH$@D$H MH;w%H+LXLLHHH$H$H$HHH48HHtH$L$MMIL$HHJH3H?LLIMv_HcHH4II?HM L4L4MI?MI H4I;rHcHH HL3H;߃H;IEMHH;I)[H$HHH$L$L$HH$L$8L$+H$ H$@D$HcHDŽPHxaHcHHh ] ʉփ+HcfPfHH;rH;s3HPHHH;rH3Hc3HL$xHD$H$L$JL$N L$8L$L$H$@L$xE3MOH$H,HL NNPH$NH$H\HH H$H$L$N,M+HLII+IMM>MI IILDILHI HH MH L3M;IH;иLL;LAA3H HLILLNMM;̃IUL;$xHIM+H$H$H$H$H$L$xM HHH;H$L$L$L$8L$H$@D$H$3L$$HHD$HHH$H$3A3HcHL$L$D$NL$DJ4HN$ LL;N$JtNd LL;NdHH;rHcD$L EL;$w,H$I+H$HXHHHH$HHu$Ht$H$HHH 0HHtH $L$MMIL$HHWH3H?LL9IMvkDHcHH II?HM L L MI?MI H I;rHcH4EHLH;w.HcH4$HHH?HH HHH$HHHWHDHH$H?H$HH$H;ssHDŽ$H$t H$L !H$HHH L ItHtIL CIL$I'HHHLMtLH$0HH$0EL$ HH>H$HH HT>IHvMډLH$$$HcLH MHHI MM;AH$HAI LHMH H LIE3L;AHcIH$@E3LSHHH$$H$nH$D$H$L$HԀL$H̀L$8L$H$ H$@L$ L$IN,M+IM+MIIL$@III MMIMMLII HI MH ME3M;AI>H HL3H;߃H;IEMHL;I*[H$JHH$@A+H$L$L$L$8L$H$ H$@D$HHcHDŽĀHxYHcHHSHʉփ+HcfĀfHH;rH;s3HԀHHH;rHHc33HLc$0HH$L$L$ǸL$8J L$HL$H$@D$E3MLH$8LIL1J,NĀH$0NL$PIII H$(H$ H$L$HN,M+HLII+IMM>MI IIMDILII HH MH L3M;IH;иHH;H.3H HLHLHnII;IUL;$PJIM+H$8H$0L$PH$(H$ H$I(HHH;H$L$L$L$8L$H$@D$H$E3L$$HHH$HH$E3E3HcHH$H$@D$H$@HHԀ@MIM$*MM;AM$ AM\Md*MM;AMd AIL;rIcH$@D$HUH;$w%H$H+L̈L\LHHHu#H$H$HHH2HHtL$MMIL$HAHOH3H?Ht>HHvrD$LcINMI?MM NNMI?MM NH;rHcD$LUHLL;w*IcHHH?HH HHHHHWHDHH$H?H$HH$H;ssHDŽ$H$t H$L !H$HHH L ItHtIL CIL$I'HHHLMtLL$XH$(IT:$I:$LcLH HHH$HȉHEN H H$ IHLL$IH I HH$L3H;LЃI II;AALH IIL$@IIILOIcE3ɋ$HnH$D$H$L$HԀL$HL$8L$H$ H$@L$ L$IN,M+IM+MIIL$@III MMIMMLII HI MH ME3M;AI>H HL3H;߃H;IEMHL;I*[H$JHH$@A+H$L$L$L$8L$H$ H$@D$HHcHDŽĀHxYHcHHwlʉփ+HcfĀfHH;rH;s3HԀHHH;rH$XE3H3LcMHcJԀH$L$L$L$8HH$HI L$H$@D$E3HNH$8NIH<2H,LH$0HMI IMMDMLII HH MI ME3M;AIH;иHH;H.3H LMHLHnII;IUL;$PHII+H$8H$0H$PH$(L$ L$H/IHM;H$L$L$L$8L$H$@D$H$MH$X$H HH$HԀH$3AE3HcHvrH$L$@LH@I0HOLL;ںOIT0O\LL;ںO\IH;rHcL ML;$w%H$I+ḦHTḦHHHu3H$XH$H$HHH:HHtH$XH$HHIH$H$XL$XA3IpHH?J|HHvafLcINMI?MI JJII?HM NH;rHcL UHHL;w*IcHHH?HH HHHH$XHHQHDH$XIc̺HHH$`H HDHHHtAHLE HtAA3HLEHtHu3In@Hq~q H2I3I?I;ҺHH4H;$Xv HH$XHH$X5HHHL$ ?ILL$ MIJ?I@ $IIDL\$AIDL\$MAI $IIIM#M L\$H;LTI;I+HH. NԀL $ILEMYI; I3M+IILMv D$L$$M ,HI;rD$fInflH $fBfBDfBD fBD0IM;rfpffI~L;+JԀN ,IL;rLMML\HL$ M I?HHD$I;HL$LL$LTI;I+HH NԀL $ILEMYI; I3M+IILMv D$L$$M ,HI;rD$fInflH $fBfBDfBD fBD0IM;rfpffI~L;sJԀN ,IL;r3MAIAEILT$L\$I OZIIIH|$HL$ HHL$ H;HL$ HDHHĀHDŽ$HHHH$Xu,H$XH$HHH4HHtH$XH$XHu#HIHDŽ$XH$fHH^Ht"HD$HHHT$ H#HT$ H HD$ HHD$ Hu H$XHHԀHtH$XI@#II| AHÀt;HHHHBHEH A@HE()$ HbHHHBPH@HHEA HE()$ HH A@HEH$H$Xs3H$I~-I0HHH?HH0H1LH I >In@AAƀA@| DHH3DHHDHDH HHH HH$ HEH$(H$pHt!At H$pH( H$pL8H$hHtH$hHH$ H$(H8][A_A^A]A\$0H$xD$0L$H\$LD$D$A0}AX$McL\$MLD$IXH\$E:D$3MI3$LL$H$@LD$ H$H4$H|$LT$L$8D$D$DL$hT$Hl$`t$X|$@DD$PEHEcAVMcL-JiL5óOtAE]McL$H@IHJDHuH@}uyHˀugqII L ueH SuOD$L$8LL$H$@LD$ H$H4$H|$LT$D$sEt IAD$L$8LL$H$@LD$ H$H4$H|$LT$D$tA0D$HHHuHD$p(@0)$ LH<$$VHD$H$ $HT$H$()$yHD$p(@03)$ $HcLHtHuH$(H?H$(|$@t%$t$A? uIu$Hu $u&At$tHH AHEHHH |$ H$pHEHt H$pL8H$hHtH$hHH$ H$(H8][A_A^A]A\D$H4$H|$LT$)D$H|$LT$D$H|$LT$zAIjD$jHsH¾L԰IL ٶD$D$ANeD$I$ |$H{0D3A3HcHv0HHHHHHH;rԍt A;ӹHcHH黹H$H$(HH}{MML$8E3L$33L$3HH$L$sHLHBL MH$L$HHHHHcHǴDzDH;} DDzDAHH H=HcJAIH$It8M 8Ht$LL$E3fE3yH$XH4Ht$HtH>_H$H$D$鵴EL鳯H ֳH5dzATAUAVAWSUH LH$ EHt$fH$( L$(L$0H$8H$@$$HcHcH|$L$ L$ HD$H$ H$8 H$ ) ) ) ) H@uH$8 9AIH2McIIAu IuE3D% EE3= EAEAAADEEAAAEAH I I HIH LI HItHHEH$p -HtHDŽ$p 3IHDH$p HILT$I#MLL3I#MI IL|$I;L\$t HvML3M HI?s HT$ HT$HtHHčHɍHEHHHPItHH…uA@HAH+H$ DAAA<I?sHD$HD$HHtYI/IuH>H\$H\$I?Bʉ HHȌHŌHEHD$HHHPItHH…uH$ A@HADEH+ʼnNI?s HL$ HL$AAŀtMAtDH$ HXH;$8 ~L)H$H}H$ IE0AIHHtH` IH0H|H|H$ A@ADErIM#I0Mt,ILM IH1L LT$MIMt]M3ILT$M~LT$MHMLT$AL+AMDIL$ DL T$ML$ I+E33ML|$~Ld$MHMLd$L+IHL$H/IL$ IDL$ M I?s HL$ HL$IM#H?I0$( HH%AHHHHrFHMt$HLL IH1L LHXMt5I3M~ MHML+уLHL ۉLH3M3M~ MHML+IAHMLd$ADEEL$ H$ $ Mt$uLIwH$ H>L|$LH3HHHHHDMGH$8 IHH>JHH$ H;HMHNtnHHN $IJӬ N It&Ir N $IN  JӬ L$ IL$N MLEHD$H}D$IH$HE0HD$L$ L$ H$ D$ Dd$Hl$H $LD$HMuI;EHAL MIIL$ IL$ IL$ L$ H$ L$ L$ D$ t?H$ HCH$ J2H;$8 ~H$ LÉHBH$ I L3qIMtL$ H$ rMtLL$ 3M~ MHMLЃH+LHH$L ͉LHH$!3M3M~ MHMHIH3HEHL$ HH$ L$ H$ L$ L$ L$ L$ H$ L$ L$ 9))))H@uI| IY~@HHO3HMEL$ H$ L$ L$ L$ L$ H$ L$ L$ H$ HH$ tH$ H$ ~H$ HtFH$ 3H~ HHHσH$ H+H$ HHHH +3H$ 3H~ HHHHH$ H3ɽHE͉$ H$ H$ H$ H$HyH$ )D)D)D)DH@uH$ H@H$ H$ /NH$ HߣHLxMH\K^L$0@HHH<HtQ1L$ LHLcH_L-HL%IFtCI@AM;LNFCEAAIKDMIcO4LHD$eH$ HHIIMcL cL=LL-MCQMBH;MLG$QEAALKIcOt]HD$L-֢HǢMlM^HxHH$3?HHH<HtIII ALHAMII HMMH H3H;H IHLI II;LcՃH HHJԘAJԐJDŽ xOI>D3Hcf fĐHH;rI;s3H H̐HI;r3HELcM<H$ JܐH_N L$p JL$x L$pL$xH$ H$ IL,M+LLIM+IL$p HM>MEI IIMMIHI H MH L3M;M6AAIH L3L;փI;I[ӃMHLIII;܃IUH;$x NHHH+H$ L$pL$xH$ H$ HALMJ̐HH9NLcK.3EE3AAEE3AMcMH$ NL$NL$N H$ L$pE3L$xH$H$K8HM40LL;DM4KD8Mt0LL;DMtII;rHcL$pL$xH$ H$ L<}M;w M+J JJH9H9HuH$IIJ H9HtIiL$MMK\.L$I3MALAH?JDHHv_LcIN4MI?MM N4N4MI?MM N4H;rHcL}HL<M;w*McJHH?HJ JH9H9HIEIII;+LJJH?JHH;s|JJHDŽ$IiHLHuH$IHJHHtHt HH=+HH$H+JH +HHHHt*H$))p)`)PH@u3H$ H$ \H3HAE3A0H$ }5H$ H$ H$ H$H$ H$H$ H$ H$ H$H$ H$I+HHyL%LwL$IDMLH O\"LH$xHDLD$HEIML$MI HH$X IL$P MH LL;H$΃H HHD$McMH HI HHIAL$` IMLHD$HI MH MI HM;NAAH;N,;˃3IM;E3II;H I LILHLNJNNIH$h E䋔$H$L$H$x|Wʽ3v03JJJJI;r֍l;w3JJHoLc3EH$NIN܈IWNܐIGL$8 L$H L$@ L$0 L$H$xH$L$L$L$8 LM+HL$X ML$P MI<$IAI MMMMMLI H MI ME3M;EH$H I4AI+H;DHH;HGD3II MMHLII;L$h ML$` MMMMMI HLMH M;I 3HDI MI IL3H;΃H;DHLHII;AL$@ IDIZH;$0 HL$H L$@ L+L+H$L$H$xH$L$L$IIWIGH$LDLwJLIE3Mc3A3HcHH$xNL$NL$NL$H$L$L$E3L$H$H$J,HL8LL;DLJlL\8LL;DL\HH;rHcH$xH$L$L$LEM;w!M+JJJIEIEHu(33HHJ(HtHLt:NM~H$HHHH$I3I~HH?N\2IMv_HcHHII?HI HHII?HI HI;rHcH]HHH;w%HcHܘHH?HH ܐHܘIEHLIDH;$ H$H$HĘH?H$HĐHH;s{H$HĐHĈHDŽ$HxH:u"33HHH<tHH$H|HuHH$H{HqH$HĐHu\H$3HĐ3HHHHtHH$+H5oIDIIt2H$H$H$ HIIIHI;|fDH$ IE3IAH$ E3H$ A0L$H$ Il$H$JH$H$DHcH;;McIHOHHGLwL$L$MdMDMD$MI HLˉL\$HEIML$II HL$ ML$ MH LL;ۻL$AAH LLD$IcMH MI ILMEL$ IMLLD$MI MI MI IM;LAAI;Nl=݃MM;H$ ڃE3MM;̓I I MILHLL8LĸLİL0H$L$L$L$D$|[A3v2E3L8LĸL0LİH;rDd-D;w3H8HĸHoLc3E*L$ N8INIUNIEL$ L$ L$ L$L$L$D$H$H$xH$L$ LM+HL$ ML$ MI<$IAI MMMMMLI H MI ME3M;EH$ I4AI+H;DHH;HGD3II MMHLII;L$ ML$ MMMMMI HLMH M;I 3HDI MI IL3H;΃H;DHLHII;AL$ IDIZH;$ HL$ L$ L+L+L$L$L$D$H$H$xH$IIUIE3HWH$HGAHHԸH$H+ELcTDE3AD3AMcMH$NL$NL$N8L$H$xH$L$D$E3H$H$H$L$Lt ILT=MM;ELT5ALt LT=MM;ELT5AHM;rIcL$L$D$H$L4mH$xH$M;w(M+H$J@JJH+H+Hu(33HHH,HtHHT:HԐHBL$MMHL$H3LbLAH?H|HHvrH$xHcHL MI?MM L L MI?MM L H;rHcH$xL4mHL,M;w%McJHH?HJ JHHHHDH;$+H$H$HĘH?H$HĐHH;H$H$HĐHĈHDŽ$H:u"33HHH<tHH$H|Ht HHH$HqH$HĐHu\3H$3HHHHtHH$H$+H5MIDIIt0H$H$IIAIIH$H$ H$ H$ H|iH}dHoL[H\K6HJJHH$H$'HHHHtbL$@))))H@uH(H7|oHHLcLL5xHiClZMCH;MNG,ZEAAI+OII?HOLI O,L$?M;MO$M;AAHLI>MH?ML K<$OLJ4fH;KtILM;lMc3IIH$ N$EO,:M;w]M+OM;MAOAN I>MO|]M;AN AMI?M MN L L ML@D$ IDEC0DHHiR;>H$ L$ HLJ?IIMHL+LEDH$ L$ HMtIM;ADEE3A33MIC $ $( LFYC L$p IM<0IH 6L;FLI+H@$ HJt3HIDMcIM+H$ EHIcHIAʽEE3AEH$ E3ɽL MDEIII;D˃MM;EAL L MDEIII;D˃MM;EAAL HE;rH$ Cl6A;wDL 3E3AMEEIII;݉MM M;AAMAMH3AMAMH HI+H3H?MtHI;ȹAAE3D$( L$p F DA IIHHH^*H|tHHHHHHHEHJH;|SH3H+HHHHv (0HH;rfof*HH;rH;)0HH;r錶3Dd$Hl$L$ L$ D$ H$ 鿺3ۻH$ ID$ HH$8 H;HMq|iHH؃EЍJ;|O3+ʃ˅v 0H;rfofH;r;s 0H;rMcIJ3ዌ$$;L|$LLHH>HcJHHHHHL$L;:H1$( H$p HD$H HHHD$H}H$ E3HD$IE1骻H$ HuMtHxH$ Hu$6H$ D$ H$ @$( H$p H$ D$ HH$ Ht'$3ۅ҉EHcHHD$9H$ гH$ H$ H$-3H$H$E3E3KE3E3CH$ D$ H$ H$ L$ D$ H$ 鼹D$( L$p H$ D$ BLIIH$ H$ L$ D$ H$ cH$ D$ H$ H$ L$ D$ H$ &D$ uH UNH$qLaHaIHH$IHH$IILHLcLbL= bHaC,cMT$I;MLG4cEAAIO4oIHcL$M|IlL|$Hl$$HaLzatDE33H~DEtuAE3ۅEOEt_AAqwUMcLHKt9HI%t)I'uHI uHIDEuE3HZ`HLL$L(B0Hr8HJ0LL$)D$LOHOHwDV?t$|$D$ $$#Y3YATAUAVHPH$H$L$L$DJL.L+H$/A)x)p)h)`)X)P)H)@AAE=LtNH=/537脛H[HH=JIcHHH !5IcHHH uDHH "E~fDŽ$0H$pDŽ$40H$H$8H$@H=3L$0莚HHPA^A]A\HHPA^A]A\H=74HH2AH$Et3t H„tHAtuMtMt 2ɈHIuA.H$HHffAnf8foftftfDfDAAEuEtEEtE;HI 3lIMtIH=k3H4$A$薚H=E33褙H=C3H4$HkA$.gH=ZHH=D4AVAWSUHHH$L$L$DJL.L+H$/A)x)p)h)`)X)P)H)@AA׉Eu%0H=}23莙HH][A_A^Ã=atNH=D23L虘HpHH=_IcHHH !IcHHH u#D/HE~XDŽ$0H$pDŽ$40H$H$8H$@H=Η3L$0謗H sH3舘H=i13zHH][A_A^H[H=F13H2ЗHH][A_A^H=1HHAH$Et3t H„tHAtu5qMt 2ɈHIuA.H$HHffAnf8foftftfDfDAAEuEtEEtE;HI 3iHHtEH=S0H4$耗H=/03莖H=-0H4$HU.SH=FHHYH3H:聖HYH=/3H2oHH][A_A^H=VeYVjIYATH IH4$Ht ID$HD$ HD$D$HD$u D$D$HH4$Bu'H$HtHH 7erH$HD$H$1H$u#HtHH69rH$HD$H8HD$HtI;IGH A\H:H A\AUAVAWH@ IHDŽ$0 IAAI?HtGIwHXvGHH56H6H 6L6L 63L6L$pHIGX Lg6Lh6ARH{6H l6La6L R63AS'HIWIWH@ A_A^A]IHtcMGI1v`f@0 @,ws: @(ollo@$mp f@ k du@stac@hex @ or @olic@ symb@ack @aceb TrIG1ZHm5Et3t H„tHAtu^mMt 2ɈHIuIWIWH@ A_A^A]LzIMuH@ A_A^A]LH$!H$0 rH$0 3HH$!HEH<$L-AH$襒ILHHfftfu HHdI?IHtGIWIwJD*EH;vGHHH54H$1LL$3L$LD$IHIGJT(EIWHL$APARH+Hz4MH$13LL$HIWIWH@ A_A^A]3H$ H 3EGaH$ HHfftfu HHcHH$!HHfftfu HHcHH$HHfftfu HHcIH$HHfftfu HH^cIH$HHfftfu HH+cHMII?HLtSIWIwHIDH;vVH5f1L$ARML$AS3H$0 H$1LL$cHMoAG3H@ A_A^A]HH+H 1H$@ ML$A3LT$ L$L$ L\$L$ Ll$H IWIWH@ A_A^A]DHDHG@3DATAWSUHHIHSIHHHIHH$ TH$ HHMEt3t H„tHAtuhMt 2ɈHIu3軎HH$ :utW:VuHHu3tH$83HHE$(IHH][A_A\euSHH`MEt3t H„tHAtuFhMt 2ɈHIuHH][A_A\3IMtf)D)D)D)DH@uLH4$辎HuSHHMEt3t H„tHAtugMt 2ɈHIuHH][A_A\LH5)0贍IMuSHHZMEt3t H„tHAtu@gMt 2ɈHIuHH][A_A\þ H$LQt[HHMEt3t H„tHAtufMt 2ɈHIuLیHH][A_A\L3L$t$tH;wLH<$[HHMEt3t H„tHAtu;fMt 2ɈHIuEHHMEt3t H„tHAtueMt 2ɈHIuLHH][A_A\DUHH=5蝌@ATAUAVAWSUHHIIHbH $<viL$L$D<$DIL#HH:utW:VuHHu3AԊD;rHH tHt HuZHH tHt HuZHHH tHt HuaZ3HĘ][A_A^A]A\L$LL$HPH5,mHHt H|$`H`t H/|$dt HD$htD$pE3ȉD$pL$MMľH|$Hu|$u@H|$H҉nH5$,H|$:utW:VuHHu3t$HHƸ苉HcH"t$HHgHcHD$pȉD$p)MML$HLD$XLD$XMM3MLAu 4 <Mt M;hvL3A@A@ApHIxHA@L;L;$ 6AhIxAIHEHD $4$vIE3E!AD;Ol%OL rHkE3O (L3H,$E3LM;A)%=u#AHƒ?NTM;IMM+=u)A)?IAHNTM;IMM+뒃 H#H5H4M;I MM+]MQM;EqIA ELEAnML) MM+,AALM;s@IMM+AANTM;s"IMM+AANTM;@H,$H5p)H3H $貇H $MEHLLH $EH $AHHHƄ3HĘ][A_A^A]A\IcAIMHM+OIAIMHM+8IAIMHM+!Ei3H(HHI;HD(vIMH,$M+EQM;EqIAELEAnML) MM+HH tHt HukUHH mtHt Hu@UHHH ?tHt HuU3HĘ][A_A^A]A\II"HH tHt HuTHH ΪtHt HuTHHH tHt HusT3HĘ][A_A^A]A\HI;HH TtHt Hu'THH )tHt HuSHHH tHt HuS3HĘ][A_A^A]A\H=éWfSDGDC6HH tHt HusSHH utHt HuHSHHH GtHt HuS3HĘ][A_A^A]A\HH tHt HuRHH tHt HuRHHH tHt HuR3HĘ][A_A^A]A\HH xtHt HuKRHH MtHt Hu RHHH tHt HuQ3HĘ][A_A^A]A\HH tHt HuQHH tHt HuQHHH tHt Hu^Q3HĘ][A_A^A]A\ËD$HHMHHMHcL$Ht$LD$XHL$L$ND Nd (HH tHt HuOHH ޥtHt HuOHHH tHt HuO3HĘ][A_A^A]A\3PH&HiATSUMLH~HHHE Ht&L~HU H;H;HE U4Ht HE(P3HHfHfPfP P0fր0fր8)D)D)D)D)DHPuHU(Hǀ@HHH@3HE(E4HRHЋE0t&u4HU(FH(H @LLDIXE0E4E03][A\3][A\ø][A\UHH0H]L}LuLmLeH}HuHUE(33HHAdEt3t H„tHAtuWMt 2ɈHIuHAH9f)E)`)p)E)E HuHH`HEEP/~HuHU~ HuHp~HuHU}H=}f) )0)@fօP)@))))H@uHEHtHHH@ HDž@H5H 3HHH{EH=~>}u~E3HPE3HvDHuKDmHH$L%AHtcHH eH=`HL1{AE$4A?,ABTFdBt B,IIjH$IL;4Ld$PLl$XLt$`L|$hH\$pHl$xHĈHIVH4$4$4 ʃ  փHDHMzHVzH _zLd$PfLl$XLt$`L|$hH\$pHl$xfffHĈfUHH H]}HuPSQRLEEAAXAHAP ZY[XH]H]@UHHH}H]PSQRLEAAXAHAP <~M<~2<~A@0AX4AH8AP<A@ AX$AH(AP,A@AXAHAPZY[XH]H]@UHHLmALeAH]w4Ar.L%xA<$t3HxALeBH]LmH]3H]LeLmH]EPQX5 PX;tEQYX}u HxH PHEHEHHUHYH]HU3E؉PSQR9]u9Uu9Mu EHUЉZY[XH'xH$xE؋M̃ EH0HEHPSQRWLEtAAXAHAP }IӉ}_ZY[X3HHcU3HD0DǃtuyAAID46A?D4A AAD8AAETDEEA ELA| EHHH;^Hw8u }|A$@UHH@LmL-vLeE3L}E3LuE3H]A}wHv;Hv8v/S]̉U[DeAtA AAHTvvL5KvAHEvE6D2H?vA;vL55vAH/vE6D2H)vA;vL5vAHvE6D2A DD=DAD=D5uVH YHHEQUY ]ELMLMPSQRLEEAAXAHAP ZY[XEH}UHuMEUME:utW:VuHHu3ELxPSQRLxEAAXAHAP ZY[XDeAAELMPSQRLEEAAXAHAP ZY[X}rLDžpL`PSQRL`pAAXAHAP ZY[XE njDD%XH]LeLmLuL}H]EPQX5 PX;tEQYX}u HsH H\HhHHLHYHTHh3tPSQR9Lu#9Pu9TuDžtHhZY[XHlsHist\ DžHHH@HPSQRWL@tAAXAHAP }IӉH_ZY[X3HHcH3HDDǃtuyAAIDA?DA AADAAETDEEA ELA| EHHH;^H8r8u\|%AEyVRYVcYHut:f)D)D)D)DH@u$3ҋD$@DDu4t$$@$$t$$ $$H$$ $$DHf)D)D)D)DH@u$$T$$@ $$t!$$@$$H@H0HHHfuAt\$D$@D$T$t\$D$ D$T$\$D$ D$T$DV333/133433 333_lH/HHHfuAt\$D$@D$T$t\$D$ D$T$\$D$ D$T$DV333/133333 333_kH.HHHfuAt\$D$@D$T$t\$D$ D$T$\$D$ D$T$DV333/133233 333_jH-qHHHfu=t\$D$@D$T$t\$D$ D$T$\$D$ D$T$fH333933&/33HHAH$Et3t H„tHAtu4CMt 2ɈHIuH $3333ifHa,HHfH$t<f)D)D)D)DH@u$3D$@DD$Du5t$$@$$t$$ $$H$$$ $$H33333033HAH$Et3t H„tHAtuAMt 2ɈHIuH $3,333gfH*HxHfHt:f)D)D)D)DH@u$3ҋD$@DDu4t$$@$$t$$ $$H$$ $$fH333)33.338HAH$Et3t H„tHAtu$@Mt 2ɈHIuH $3333ffHQ)HHfHt:f)D)D)D)DH@u$3ҋD$@DDu4t$$@$$t$$ $$H$$ $$fH33333*33HAH$Et3t H„tHAtu>Mt 2ɈHIuH $3,333dfH'AHxHf\$D$ D$T$\$D$@D$T$H33333*33HAH$Et3t H„tHAtu=Mt 2ɈHIuH $3333 rcfHt:f)D)D)D)DH@u$3ҋD$@DDu4t$$@$$t$$ $$H$$ $$f\$D$ D$T$\$D$@D$T$ATAUAVAWSUHILNM#ILLZM#LL$pM3H0HLI#LL$`IIDUH0M#M#L.AL\$hAL:NDPA=L|$ Ll$(I0I0LL$0LD$8LL$ HD$(IM3HD$@M3ILT$8HD$(ILLHD$0ILLIL|$HHD$0ILLLt$PLl$XHD$XH!HT$PsOIE3HI1I LD$HHD$XLHH1H HT$PHT$@HDEIM LD$HKIE3HI0I LD$HHD$XLHH0H HT$PHT$@HDEIM LD$HMU\$xH H t$xXD$ u HT$HH|\* t"HD$`H?styLL$XLD$PHcH0LI LH_HĈ][A_A^A]A\LD$PIuLL$XILL$XLL$XDHҺD#HcL#LD$PHT$H\$xt$xAAA u HD$HH?3A t(HD$`H?sA A3~oHA YD$t}HD$`H?s Ath At]H?H HHHHDHGHĈ][A_A^A]A\|?LD$H/HD$HHe]H?HHHHHD롃}HT$P3uHT$P(IHD$XI;sHT$P HT$Pu Hs3݉ك@}GLL$HE3AMLl$XIMEEIIHIM L LD$HLd$PLl$X_}0E3H T$HLT$XMDEIIM LD$HLT$PHD$HAHD$PHD$X3MtHLD$HYD$u&HHLD$HYD$HcH0Hl$XHD$PH HH_HĈ][A_A^A]A\LD$HMADEL HT$XLD$HHT$P=HH;T$XH|$PlLD$HHD$HHJBA3MAEI H $u D$XIL;$v AD\$;IL;$v D$!HAH; $ABʉL$3AMAEI H $u D$UIL;$vD$A7IL;$v D$AD$AEBDT$D$DT$D T$Y=NAtREtHHYD$H?HHHHLHHOHĈ][A_A^A]A\ËT$LD$8LL$0L|$ Ll$(;T$H}H5~|$YD$ 1MMMDIDA 3M;MDFI M;EGAEA+Ń@}LIHL IL|$ MI@HD$ MDLL$0\$xHHl$xYHL$` D$H?s3ҁHD3ҁHDHH_HĈ][A_A^A]A\LL$01MMHT$(LDIDA E3M;MEFI M;EGAEA+@}HIHL HHT$(II@HD$(LDLD$8mA D$;D$tD|$t L?HBL/HFH/HGHg^D$HGHD$pHHH\$hH#HH/H#H/ tH ^D$;tuN)M;rGL|$ Ll$(uM;r6M;ruHD$ H;D$(s HHHF!HFH?s HHHF HHHBH/HGHĈ][A_A^A]A\AtHl$0HT$HLE3L;MBLHMMtL;tL;sME3MxM 3M EH Hl$PHH1IHI1H HHT$pHl$PM$HtH}$XD$( uM|X& tHD$xH?s t:t0LT$PLD$pHcH0IH LH_HĘ][A_A^A]A\LD$pIuLT$PILT$PLT$P3҅DMADDA#HcL#LD$pHD$pLT$PHcH0LI HH_HĘ][A_A^A]A\$D$D u LH?0 t&HD$xH?s C3~xH YD$(HD$xH?s H?HmHHHHDHGHĘ][A_A^A]A\}Hl$p,uHl$p!HHD$PH;Hl$pru Hs3މك@}23MAIDDIM LT$PLHHIH =}'L ͽAHD$PIDDIHM M3E33tfMt$HD$pHLT$PYD$(%AAHH-HD$pYELT$PD$(HD$pLT$P3MADDHD$PL fH?HmlHHHHDjMHH;T$PlH|$p`SMM;A?x4HcHH0HH HH_HĘ][A_A^A]A\Ã~2A.@DHH HH_HĘ][A_A^A]A\Ã~+A.@DHHH_HĘ][A_A^A]A\Hl$HLL$@$H$ YHT$xH?D$(s3ҁHD3ҁHDHH_HĘ][A_A^A]A\Hl$HLL$@$H$ Y D$(tOHD$xH?s t;t1H?H!jHHHHDHGHĘ][A_A^A]A\H?H0jHHHHDA3MAEI H $u ADd$UIL;$$v D$;IL;$$v D$!HAH; $AB̉L$3AMAEI H $uAHIL;$$vA0IL;$$vAAL $AEBL $L$A ̉ $ D;d$tD|$t LHBLHFH/HGH^D$(HGHIH$L#HI/H#H/D tHb^D$(A;tEuN)M;rGL\$0LT$8uM;r6M;ruHD$0H;D$8s HHHF!HFH?s HHHF HHHBH/HGHĘ][A_A^A]A\Dd$tCD$uHl$0HT$HLE3L;MBLHMMtL;tL;sME3MxM 3M EH Hl$PHH1IHI1H HHT$pHl$PM$HH$XD$( uM|X& tHD$xH?s t:t0LT$PLD$pHcH0IH LH_HĘ][A_A^A]A\LD$pIuLT$PILT$PLT$P3҅DMADDA#HcL#LD$pHD$pLT$PHcH0LI HH_HĘ][A_A^A]A\$D$D u LH?0 t&HD$xH?s C3~xH) YD$(HD$xH?s H?H_HHHHDHGHĘ][A_A^A]A\}Hl$p,uHl$p!HHD$PH;Hl$pru Hs3މك@}23MAIDDIM LT$PLHHIH =}'L ͽAHD$PIDDIHM M3E33tfMt$HD$pHLT$PYD$(%AAHH-HD$pYELT$PD$(HD$pLT$P3MADDHD$PL fH?H}^HHHHDjMHH;T$PlH|$p`SMM;A?x4HcHH0HH HH_HĘ][A_A^A]A\Ã~2A.@DHH HH_HĘ][A_A^A]A\Ã~+A.@DHHH_HĘ][A_A^A]A\Hl$HLL$@$H$ YHT$xH?D$(s3ҁHD3ҁHDHH_HĘ][A_A^A]A\Hl$HLL$@$H$ Y D$(tOHD$xH?s t;t1H?H1\HHHHDHGHĘ][A_A^A]A\H?H@\HHHHDA3MAEI H $u ADd$UIL;$$v D$;IL;$$v D$!HAH; $AB̉L$3AMAEI H $uAHIL;$$vA0IL;$$vAAL $AEBL $L$A ̉ $ D;d$tD|$t LHBLHFH/HGH^D$(HGHIH$L#HI/H#H/D tHr^D$(A;tEuN)M;rGL\$0LT$8uM;r6M;ruHD$0H;D$8s HHHF!HFH?s HHHF HHHBH/HGHĘ][A_A^A]A\Dd$tCD$ufDEGHIH3AuIȁAt+ADA;utdIHHtY A+3H]A\AODAA:DEt$HtDA;utIHHu3H]A\+H]A\ÉA+H]A\3BDDT A;u4t&Ht DUCE A;ut Hu3H]A\A+H]A\DA+H]A\+3rEfEtD;v 3H]A\I;w 3H]A\CA +3H]A\fUHIHHt*DUAD;#HIHaEXAAtVHDUAA;%AD;A HIHAAtfHAH4$u@A;!A;HIAuH4$HAAtcH4H4$uDAD;wEYA;VAHIuH4$HE3D%t2foEfA:c)(HHIuLAt$EA;utYHIHtN+A3GvAE:ȅt#HtA;uɩtHIHu3H]D+KAD+C3D(B D;Et&Ht HD)B D;uvEt HuE3DH]H4$E3AH4$D+H4$D+A+A3rH;r3H])B +A3H]AH4$D+D+DUI1~*3 Ht/9/9!IHIIu~*3 HtHuffoftfɅu.IHHI;ffoftfɅttJtH*HH(Ht *H(Ht*Hf(HtHL+]HI]Mv) HˆHIȅtMt HˆHIȅu]ÈHI]ÉHI]fHI]ÐUI"~*3 Ht/* *IHIIu~*3 HtHufof:c:r&IHHICfof:c:sf:c:tHtH*HH(Ht *H(Ht*Hf(HtHL+]HI]Mv) HˆHIȅtMt HˆHIȅu]ÈHI]ÉHI]fHI]VHHIL+ffAo ftfH2fIfAoftfHtHcH+LLHt HA IHu HAAӍ~D3Au.A IHtN HAAӍ~D3AtuA ^fofftfɅu/)T$fHfoAIfoftfɅt(T$ttHHB4^ADMcA ^fA AB^fA ^fUHHHH+fftEfDAMAHE3foEf:c:EBMcMtf:c:HcH+HHHt HˆMHHu HAAD~E3Au/MHHtE HAAD~E3AtDEtvt}tkuM]fof:c:rHEHfof:c:sf:c:tDTHHD)]E]AHc M]fME]fM]MuHIHL+ffAoftfDAMIfAoftfHtHcH+LLHt% IHA tIMRHu)T$Hl$I  HAAӍ~D3AuBIA IIIr HtW HAAӍ~D3Atu(T$Hl$A fofoftfʅu/IHAII.fofoftfʅt(T$Hl$tDDHHFA(T$Hl$Mt IHA @IMuAEMcu(T$Hl$A (T$Hl$fA AB(T$Hl$fA ÐMuHIHL+ffAtfDAMAIfAof:c:ABHcHtf:c:HcH+LLHt% IHA tIM1HuHl$I HAAӍ~D3AuBIA IIIr HtR HAAӍ~D3AtuHl$A fof:c:t'IHAII;fof:c:uHl$f:c:tDDHHFAHl$Mt IHA RIMuAEMcHl$A Hl$fA ABHl$fA fIHHIHuD D LТI LLC$HuLILLC$LRIIC$DfDRDJDfDQDIIHHfDDJfDDIIHHDDJDDIIHHmD D IHHVDfDRDfDQIHH5fDfDIHHDDIHHHtDDHIHHtfDfDHIHHDDIHHfLPLPLXLXL`L`LhLhLpLpLxLxLJLILRLQLJLILRLQLJLILRLQLJLILRLQLJLILRLQLJLILRLQLJLILRLQLJLILRLQLOLOLWLWL_L_LgLgLoLoLwLwLLLJLILJLILJLILJLILZLYLRLQLJLILZLYLRLQLJLILZLYLRLQLJLILZLYLRLQDJDILNLNLVLVL^L^LfLfLnLnLvLvL~L~LJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLIfDJfDILMLMLULUL]L]LeLeLmLmLuLuL}L}LJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLIfDJDRfDIDQLLLLLTLTL\L\LdLdLlLlLtLtL|L|LJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLIDJDILKLLLSLSL[L[LcLcLkLkLsLsL{L{LJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLIDJDRDIDQLJLJLRLRLZLZLbLbLjLjLrLrLzLzLJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLIDJfDRDIfDQLILILQLQLYLYLaLaLiLiLqLqLyLyLJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLILJLIDJfDRDZDIfDQDYfDL YA9OHM1L<M IIMNM91HLIIofHL)HIfo C$LٟMIILLM)IC$fDfoZfoB HR M@fsfofsfI fsfofsfffAHI }[fI foZfoB H fsfofsffsfofsfffAH I } fI foZfoB H fsfofs ffsfofs fffAH I }fI foZfoB H fsfofs ffsfofs fffAH I }kfI foZfoB H fsfofs ffsfofs fffAH I }fI foZfoB H fsfofs ffsfofs fffAH I }fI foZfoB H fsfofs ffsfofs fffAH I }{fI foZfoB H fsfofsffsfofsfffAH I }+fI foZfoB H fs fofsffs fofsfffAH I }fI foZfoB H fs fofsffs fofsfffAH I }fI foZfoB H fs fofsffs fofsfffAH I };fI foZfoB H fs fofsffs fofsfffAH I }fI foZfoB H fs fofsffs fofsfffAH I }fI foZfoB H fsfofsffsfofsfffAH I }NDI foZfoB H fsfofsffsfofsfffAH I }LLLLC$HI@HR@M@oBoJI@fAfIoRoZfQfY}LMIILLM)IC$ffofoJffIM@foR foZ0fQ fY0foB@foJPIfA@fIPfoR`foZpHfQ`fYpH}LГLLC$fDL A9LM IIMNM9uL LRM@L LQLZLJLYLII@LR LZ(LQ LY(LJ0LR8HR@LI0LQ8HI@L9JJ C$fDI@L L LRLQLZLYLJLILR LQ LZ(LY(LJ0LI0LR8LQ8HR@HI@I@}|fDfDoBfAoJfIoRfQoZfYoBfAoJfIoRfQoZfYLYLLC$L L HHI6D D HHID D HHID D HHIDPRQAPH(2H(AXYZX@HHu@7I@I|/HIHuLILC$ÐI~L#IIIILM)C$DfDW뮉WW릉WfW띉WfWWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWH~HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWfWH}HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWfWWH|HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWH{HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWWHzHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfWHyHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWWfWWL A9SfHnflLIIIM)ILM)C$VHWPHWWGHWfW=HWfWW0HWW'HWWWHWWfWHWWfWWLILC$ÉHIHt҉HIHtHIfPf`fpfGfGfGfGfGfGfGfGfOf_foffGfGfGfGfGfGfGWfNf^fnf~fGfGfGfGfGfGfGfWfMf]fmf}fGfGfGfGfGfGfGfWWfLf\flf|fGfGfGfGfGfGfGWfKf[fkf{fGfGfGfGfGfGfGWWfJfZfjfzfGfGfGfGfGfGfGWfWfIfYfifyfGfGfGfGfGfGfGWfWWfHfXfhfxfGfGfGfGfGfGfGfGfGfWfgfwfGfGfGfGfGfGfGfGWfFfVfffvfGfGfGfGfGfGfGfGfWfEfUfefufGfGfGfGfGfGfGfGfWWfDfTfdftfGfGfGfGfGfGfGfGWfCfSfcfsfGfGfGfGfGfGfGfGWWfBfRfbfrfGfGfGfGfGfGfGHWWfWfAfQfafqfGfGfGfGfGfGfGHWWfWWL M;ZM@ffGfG fG0IfG@fGPfG`fGpH}LLC$ItIffGfG fG0fG@fGPfG`fGpHǀI}LHLC$L A9L M;DfHHWM@HWHWI@HW HW(HW0HW8H@LJ<C$@ItHHWM@HWHWHW I@HW(HW0HW8H@}LĎJ<C$I1ੀLWPWRAPH(H(AXZ_XDfD%r%t%v%x%z%|%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%hhh3hRhbhwhhhhhhxh nh)dhCZhYPhgFhx<h2h(hhh hhhhhhh,h<hJhXhehuhh~hthjh`hVhLhBh8h.h$h.h>hNh`hmhhhhhhhhhhh"h6zhHphYfhi\hxRhHh>h4h*h hh hLAS%8 8 8`_`**************** ******************************** ******************************** **************** $@?$@$@ A??? A A A A"Unknown"   *   !"%&(* #-/023                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3         ! " $ % & ' ( ) *+ , -. /1 2lmnopqrs l m n o p q r s!!AA!!A!!!!!!!AAAAAAA)))))))7*7!7777777*7!*G!*G!*G!000        ,,,,,,$$$$ $ $$$&&&&&########*!######+!##+!#+!#+!#*!# $ $ $ $ $ $$$&&&&&########*!######+!##+!#+!#+!#*!#CONUSERPRNCOM1COM2COM3COM4LPT1LPT2LPT3LPT4NULAUXERRLINEaaaazzzz aaaazzzz 2<2<2< d'@Bʚ; TvHrN @zZƤ~o#]xEcd #NJ:0yE>Hz>ư>h㈵>-C6?MbP?{Gz???$@Y@@@@j@.AcAחAeA _BvH7BmB@0BļB4&k C7yAC؅W4vCNgmC=`XC@xDPKDMDJ-DyCxD(,* E52TEqىE/'E!1Eꌠ9Y>)F$_FnFF"F|FMraB3G yhGiWCG*GJH\)c=H7]rHaxHyֲHL}YI\CkFI3T|I\'I^ 9^;j7֖6P:2 ǼH.D|)޷ET%u?j/ ȮSd>?- }+) MB~O{ \Hz\/u5%P7xf @,1BBB d d d hhkkkL!L!L!-$-$-$.&.&O&p&MDyֲHrbnMz5߼Qҟ&V;/V[EW`VfYdsTNNe VBij㒻Tmz42q/Ngvۗ:5P{3t<{aaa"" fff'ii    ###n&qޝhb!q&Ui ;+*\[z@g7._⼺;1axl}9V"Suu\TӒsi$$wÿ-ԵJbڗ;5H~t۝Xv%QӮS;uD'm,{tPd弥a}J]I62w[Mľ٬:|\ 5$KB.̈Po ̼$ 믿ۗ6A_paw̫BzՔֶil7#GGŧ,eX;On ףp= ף@P$ (k@C*焑 1_.@v:k #NJbxz&n2xW ?hӠ@aQYȥo: '΄ x9? 6Ngɖ"E@|op+ŝL67V߄\l: {Η H½ Pv1P?%O7и'ƫCưp\{2~]o0b/5E=!dhknrux| "%(,/269<@CFJMPTWZ^adgknqux{QӮeMq3Ag˻zNdP#vڍMS T]"%oDzw,n% DHZ;SC.>Bs    " " " "    GGG((( *$*$*$*$K'K'K'***---n1n1n1n1: 'fPKS^=ߕ^Tjᕝ_vIξTSܷ dp폔ܔs}cO 5v)/@i``````` # # # %%%HHH!!!!*%*% ( ( ( (,+PJG@=Z]q$~({~4Ud^wH~t*J6ڝXv%"݃:QӮC5yrjR;uD<u'm8c$S,^{tPd2l1+a}JϟCb.2:]Ç I62wyh.L[Mľ K7٬:|S\ 5$oe(KB.E.D?ˈPo ̼I9i$ MZDs10 h16A_p=|6+ aw̫Miv2=BzՔI?il7Tr3܀#GGŧN@a+eX&1Zd;Onp= ףp= ףp= ף22q#2IkXWڥ%I-64OSá#-ޟݦf0K=eMq3pj:U&N5 ʕ%ΟkSkuzcZ CV@@11f%H;ԭ¿4=I(S(96'f@Ob˻_tF cccccccD"D"D"D"D"D"D"((((((f/f/f/f/f/f/f/'5'5'5'5'5'5;;;;;;BBBBBBBXPT\eƑP(= e uuvRΚ2(M]=];JJ?Lɚ R`mAePKԟYFK4>QUX H{%;#K ж%YJ^MDb;uj= bڸ#MPu8벚ƣJy©?7rbcΔ'j:b.hԽBxDuBpV4ꍛs cccccccd"d"d"d"d"e'e'e'e'e'e'e'&.&.&.&.&.&.&.'5'5'5'5'5'5;;;;;;;BP)r}n%4\mʥJ '5CC000000000000000000000000000000000000000000000000UnknownAuthenticAMDGenuineIntel????Image of says "Hello, world!"normal exit in hello_worldp_siginfo->si_signo = %d p_siginfo->si_errno = %d p_siginfo->si_code = %d p_siginfo->_sifields._sigfault.si_addr = %16.16lx p_ctx->uc_sigmask = %8.8x p_ctx->uc_link = %16.16lx p_ctx->uc_stack.ss_sp = %16.16lx p_ctx->uc_stack.ss_flags = %8.8x p_ctx->uc_stack.ss_size = %lu p_ctx->uc_mcsize = %lu p_ctx->uc_mcontext->es.trapno = %8.8x p_ctx->uc_mcontext->es.err = %8.8x p_ctx->uc_mcontext->es.faultvaddr = %16.16lx p_ctx->uc_mcontext->ss.rax = %16.16lx p_ctx->uc_mcontext->ss.rbx = %16.16lx p_ctx->uc_mcontext->ss.rcx = %16.16lx p_ctx->uc_mcontext->ss.rdx = %16.16lx p_ctx->uc_mcontext->ss.rdi = %16.16lx p_ctx->uc_mcontext->ss.rsi = %16.16lx p_ctx->uc_mcontext->ss.rbp = %16.16lx p_ctx->uc_mcontext->ss.rsp = %16.16lx p_ctx->uc_mcontext->ss.r8 = %16.16lx p_ctx->uc_mcontext->ss.r9 = %16.16lx p_ctx->uc_mcontext->ss.r10 = %16.16lx p_ctx->uc_mcontext->ss.r11 = %16.16lx p_ctx->uc_mcontext->ss.r12 = %16.16lx p_ctx->uc_mcontext->ss.r13 = %16.16lx p_ctx->uc_mcontext->ss.r14 = %16.16lx p_ctx->uc_mcontext->ss.r15 = %16.16lx p_ctx->uc_mcontext->ss.rip = %16.16lx p_ctx->uc_mcontext->ss.rflags = %16.16lx p_ctx->uc_mcontext->ss.cs = %16.16lx p_ctx->uc_mcontext->ss.fs = %16.16lx p_ctx->uc_mcontext->ss.gs = %16.16lx p_ctx->uc_mcontext->fs.fpu_fcw.invalid = %x p_ctx->uc_mcontext->fs.fpu_fcw.denorm = %x p_ctx->uc_mcontext->fs.fpu_fcw.zdiv = %x p_ctx->uc_mcontext->fs.fpu_fcw.ovrfl = %x p_ctx->uc_mcontext->fs.fpu_fcw.undfl = %x p_ctx->uc_mcontext->fs.fpu_fcw.precis = %x p_ctx->uc_mcontext->fs.fpu_fcw.pc = %x p_ctx->uc_mcontext->fs.fpu_fcw.rc = %x p_ctx->uc_mcontext->fs.fpu_fsw.invalid = %x p_ctx->uc_mcontext->fs.fpu_fsw.denorm = %x p_ctx->uc_mcontext->fs.fpu_fsw.zdiv = %x p_ctx->uc_mcontext->fs.fpu_fsw.ovrfl = %x p_ctx->uc_mcontext->fs.fpu_fsw.undfl = %x p_ctx->uc_mcontext->fs.fpu_fsw.precis = %x p_ctx->uc_mcontext->fs.fpu_fsw.stkflt = %x p_ctx->uc_mcontext->fs.fpu_fsw.errsumm = %x p_ctx->uc_mcontext->fs.fpu_fsw.c0 = %x p_ctx->uc_mcontext->fs.fpu_fsw.c1 = %x p_ctx->uc_mcontext->fs.fpu_fsw.c2 = %x p_ctx->uc_mcontext->fs.fpu_fsw.tos = %x p_ctx->uc_mcontext->fs.fpu_fsw.c3 = %x p_ctx->uc_mcontext->fs.fpu_fsw.busy = %x p_ctx->uc_mcontext->fs.fpu_ftw = %8.8x p_ctx->uc_mcontext->fs.fpu_fop = %8.8x p_ctx->uc_mcontext->fs.fpu_ip = %8.8x p_ctx->uc_mcontext->fs.fpu_cs = %8.8x p_ctx->uc_mcontext->fs.fpu_dp = %8.8x p_ctx->uc_mcontext->fs.fpu_ds = %8.8x p_ctx->uc_mcontext->fs.fpu_mxcsr = %8.8x p_ctx->uc_mcontext->fs.fpu_mxcsrmask = %8.8x p_ctx->uc_mcontext->fs.fpu_stmm0.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm1.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm2.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm3.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm4.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm5.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm6.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_stmm7.mmst_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm0.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm1.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm2.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm3.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm4.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm5.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm6.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm7.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm8.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm9.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm10.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm11.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm12.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm13.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm14.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x p_ctx->uc_mcontext->fs.fpu_xmm15.xmm_reg = %02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x%02.2x FOR_DUMP_EXCEPTION_INFOfor_init.csignum = %d, p_siginfo = %16.16lx, p_ctx = %16.16lx. Dump of siginfo struct: Dump of ucontext struct: FOR_IGNORE_EXCEPTIONSsegmentation fault occurredbus error occurredunknownfor_wseq_lis.cfor_stop.c%urequested disposition modified, file not deleted, unit %d, file %sinvalid reference to variable in NAMELIST input, unit %d, file %sinvalid key match specifier for key direction, unit %d, file %scannot allocate memory for the file buffer - out of memory, unit %d, file %sAsynchronous data transfer statement is not allowed to this unit, unit %d, file %sincorrect %s specifier value for connected file, unit %d, file %sthere is no data-edit-descriptor to match a data-item in the I/O list, unit %d, file %sstream data transfer statement is not allowed to an unopened unit, unit %dstream data transfer statement is not allowed to this unit, unit %d, file %sposition number is outside of the valid range, unit %d, file %sRECL= specifier may not be applied to stream access file, unit %d, file %sBACKSPACE statement may not be applied to unformatted stream access file, unit %d, file %sA keyword was specified that is not allowed with unformatted I/O; unit %d, file %sIf NEWUNIT appears in OPEN statement either FILE or STATUS (with value SCRATCH) specifier shall appearuser breakpoint (SIGTRAP) - obtain more info on this signal via the debuggerA pointer passed to DEALLOCATE points to an array that cannot be deallocatedDATE argument to DATE_AND_TIME is too short (LEN=%d), required LEN=8TIME argument to DATE_AND_TIME is too short (LEN=%d), required LEN=10ZONE argument to DATE_AND_TIME is too short (LEN=%d), required LEN=5Run-Time Check Failure. The variable '%s' is being used without being definedunformatted I/O to unit open for formatted transfers, unit %d, file %sformatted I/O to unit open for unformatted transfers, unit %d, file %sdirect-access I/O to unit open for keyed access, unit %d, file %ssequential-access I/O to unit open for direct access, unit %d, file %skeyed-access I/O to unit open for direct access, unit %d, file %soperation requires file to be on disk or tape, unit %d, file %soperation requires sequential file organization and access, unit %d, file %sAn other process has this file locked for shared/exclusive use, unit %d, file %sDiagnostic message buffer overflow, hex message number was %8.8xInsufficient memory to allocate Fortran RTL message buffer, message #%dInsufficient memory to allocate Fortran RTL message buffer, message #%d = hex %8.8x. The allocation of dynamic common %s of size %s in procedure %s failed Heap Allocation Failure while creating common %s in procedure %sOut of range: substring ending position %d is greater than length %dSOURCE and PAD arguments to RESHAPE have different character lengthsSHAPE and ORDER arguments to RESHAPE have different sizes (%d and %d)Shape mismatch (dimension %d) between ARRAY and SHIFT in CSHIFTOut of range: DIM argument to COUNT has value %d with MASK of rank %dOut of range: DIM argument to PRODUCT has value %d with ARRAY of rank %dOut of range: DIM argument to SUM has value %d with ARRAY of rank %dShape mismatch (dimension %d) between ARRAY and BOUNDARY in EOSHIFTShape mismatch (dimension %d) between ARRAY and SHIFT in EOSHIFTOut of range: DIM argument (%d) to LBOUND greater than array rank (%d)Out of range: DIM argument to MAXVAL has value %d with ARRAY of rank %dOut of range: DIM argument to MINVAL has value %d with ARRAY of rank %dOut of range: DIM argument (%d) to UBOUND greater than array rank (%d)Out of range: DIM argument (%d) to UBOUND greater than array rankA SYNC ALL statement could not perform a synchronization of all imagesSome value in the image-set expression is out of range, value %d, number of images %dThe lock variable in a LOCK statement is already locked by the executing imageThe lock variable in an UNLOCK statement is not already locked by the executing imageThe lock variable in a LOCK statement is already locked by another imageifcore_msg.catoperation completed successfullynot a FORTRAN specific errornot implementedignored requested dispositionignored requested disposition, file not deleted@(#)Intel Fortran RTL Message Catalog V12.1-110 Apr 04 2012internal consistency check failure, file %s, line %dpermission to access file denied, unit %d, file %scannot overwrite existing file, unit %d, file %sunit not connectedSOURCE length %d does not equal variable length %dsyntax error in NAMELIST input, unit %d, file %stoo many values for NAMELIST variable, unit %d, file %sREWIND error, unit %d, file %sduplicate file specifications, unit %d, file %sinput record too long, unit %d, file %sBACKSPACE error, unit %d, file %send-of-file during read, unit %d, file %srecord number outside range, unit %d, file %sOPEN or DEFINE FILE requiredtoo many records in I/O statement, unit %d, file %sCLOSE error, unit %d, file %sfile not found, unit %d, file %sopen failure, unit %d, file %smixed file access modes, unit %d, file %sinvalid logical unit number, unit %d, file %sENDFILE error, unit %d, file %sunit already open, unit %d, file %ssegmented record format error, unit %d, file %sattempt to access non-existent record, unit %d, file %sinconsistent record length, unit %d, file %serror during write, unit %d, file %serror during read, unit %d, file %srecursive I/O operation, unit %d, file %sinsufficient virtual memoryno such device, unit %d, file %sfile name specification error, unit %d, file %sinconsistent record type, unit %d, file %skeyword value error in OPEN statement, unit %d, file %sinconsistent OPEN/CLOSE parameters, unit %d, file %swrite to READONLY file, unit %d, file %sinvalid argument to FORTRAN Run-Time Libraryinvalid key specification, unit %d, file %sinconsistent key change or duplicate key, unit %d, file %sinconsistent file organization, unit %d, file %sspecified record locked, unit %d, file %sno current record, unit %d, file %sREWRITE error, unit %d, file %sDELETE error, unit %d, file %sUNLOCK error, unit %d, file %sFIND error, unit %d, file %sformat syntax error at or near %.*slist-directed I/O syntax error, unit %d, file %sinfinite format loop, unit %d, file %sformat/variable-type mismatch, unit %d, file %ssyntax error in format, unit %d, file %soutput conversion error, unit %d, file %sinput conversion error, unit %d, file %sfloating invalidoutput statement overflows record, unit %d, file %sinput statement requires too much data, unit %d, file %svariable format expression value error, unit %d, file %sprocess interrupted (SIGINT)integer overflowinteger divide by zerofloating overflowfloating divide by zerofloating underflowfloating point exceptionAbort trap signalsubscript out of rangeprocess killed (SIGTERM)process quit (SIGQUIT)wrong number of argumentsinvalid argument to math libraryundefined exponentiationlogarithm of zero or negative valuesquare root of negative valuesignificance lost in math libraryfloating overflow in math libraryfloating underflow in math libraryadjustable array dimension errorfloating point conversion failedF_UFMTENDIAN environment variable was ignored:erroneous syntaxwrite exceeds the record length of the file, unit %d, file %sFORT_FMT_RECL environment variable has erroneous syntaxFORT_UFMT_RECL environment variable has erroneous syntaxID value is out of range, unit %d, file %sincorrect %s specifier for connected file, unit %d, file %sFORT_BLOCKSIZE environment variable has erroneous syntaxFORT_BUFFERCOUNT environment variable has erroneous syntaxcannot stat file, unit %d, file %skeyword value error in a CLOSE statement, unit %d, file %skeyword value error in an I/O statement, unit %d, file %soperation requires seek ability, unit %d, file %sCannot access current working directory for unit %d, file %sError Stop - Program terminated.kernel breakpoint (SIGTRAP)taken branch delay emulation (SIGTRAP)not taken branch delay emulation (SIGTRAP)user single step (SIGTRAP)overflow check (SIGTRAP)divide by zero check (SIGTRAP)array index out of bounds (SIGTRAP)array index out of bounds for index %d (SIGTRAP)floating inexactdecimal overflowdecimal divide by zerodecimal invalidreserved operandassertion errornull pointer errorstack overflowstring length errorsubstring errorrange errorallocatable array is already allocatedunresolved contention for Intel Fortran RTL global resourceallocatable array or pointer is not allocatedarray index out of boundsarray index out of bounds for index %dGENTRAP code = 0x%lx (%ld)Program Exception - access violationProgram Exception - datatype misalignmentProgram Exception - breakpointProgram Exception - single stepProgram Exception - array bounds exceededProgram Exception - denormal floating-point operandProgram Exception - floating stack checkProgram Exception - integer divide by zeroProgram Exception - integer overflowProgram Exception - privileged instructionProgram Exception - in page errorProgram Exception - illegal instructionProgram Exception - noncontinuable exceptionProgram Exception - stack overflowProgram Exception - invalid dispositionProgram Exception - exception code = 0x%lx (%ld)SIGSEGV, %sDivide by zeroCannot allocate array - overflow on array size calculation.SIGBUS, %sprogram aborting due to %s eventIntel Pentium fdiv flaw detected, please update the processorI/O to non-FORTRAN unitinvalid text is %s in record number %dinvalid text is %sFORTRAN abort routine calledend of record during read, unit %d, file %s%d floating inexact traps%d floating invalid traps%d floating overflow traps%d floating divide-by-zero traps%d floating underflow traps%sforrtl: forrtl: info (%i): forrtl: warning (%i): forrtl: error (%i): forrtl: severe (%i): forrtlMessage not foundInsufficient memory to allocate Fortran RTL messageFormatMessage failed for sysmem message number %iIntel(r) Visual Fortran run-time error The current size of dynamic common %s is %s The declared size in procedure %s is %s bytesUnknown, line %s, position %d%sAllocate Dynamic Common Error - %sAllocation FailureInconsistent Common SizeEmpty HeapIncrementally linked image--PC correlation disabled.Stack trace terminated abnormally.Stop - Program terminated.Return code File name missing or blank - please enter file nameUNIT %d? IEEE_DIVIDE_BY_ZERO is signalingIEEE_INVALID is signalingIEEE_OVERFLOW is signalingIEEE_UNDERFLOW is signalingarray or substring subscript expression out of rangeCHARACTER substring expression out of rangelabel not found in assigned GOTO listINTEGER arithmetic overflowINTEGER overflow on inputinvalid INTEGERREAL indefinite (uninitialized or previous error)invalid REALREAL math overflowNo matching CASE found for SELECT CASEINTEGER assignment overflowformatted I/O not consistent with OPEN optionslist-directed I/O not consistent with OPEN optionsterminal I/O not consistent with OPEN optionsdirect I/O not consistent with OPEN optionsunformatted I/O not consistent with OPEN optionsA edit descriptor expected for CHARACTERE, F, D or G edit descriptor expected for REALI edit descriptor expected for INTEGERL edit descriptor expected for LOGICALfile already open : parameter mismatchnamelist I/O not consistent with OPEN optionsIOFOCUS illegal with non-window unitIOFOCUS illegal without QuickWinTITLE illegal with non-window unitTITLE illegal without QuickWinKEEP illegal for scratch fileSCRATCH illegal for named filemultiple radix specifiersillegal radix specifierillegal STATUS valueillegal MODE valueillegal ACCESS valueillegal BLANK valueillegal FORM valueillegal SHARE valueillegal LOCKMODE valueillegal record numberno unit number associated with *illegal RECORDS valueillegal unit numberillegal RECL valuearray already allocatedarray size zero or negativenon-HUGE array exceeds 64Karray not allocatedBACKSPACE illegal on terminal deviceEOF illegal on terminal deviceENDFILE illegal on terminal deviceREWIND illegal on terminal deviceDELETE illegal for read-only fileexternal I/O illegal beyond end of filetruncation error : file closedterminal buffer overflowcomma delimiter disabled after left repositioningLOCKING illegal on sequential filefile already locked or unlockedfile deadlockedSHARE not installedfile already connected to a different unitaccess not allowedfile already existsfile not foundtoo many open filestoo many units connectedillegal structure for unformatted fileunknown unit numberfile read-only or locked against writingno space left on devicetoo many threadsinvalid argumentBACKSPACE illegal for SEQUENTIAL WRITE-only filesfile not open for reading or file lockedend of file encounteredpositive integer expected in repeat fieldmultiple repeat fieldinvalid number in inputinvalid string in inputcomma missing in COMPLEX inputT or F expected in LOGICAL readtoo many bytes read from unformatted recordH or apostrophe edit descriptor illegal on inputillegal character in hexadecimal inputvariable name not foundinvalid NAMELIST input formatwrong number of array dimensionsarray subscript exceeds allocated areainvalid subrange in NAMELIST inputsubstring range specified on non-CHARACTER iteminternal file overflowdirect record overflownumeric field bigger than record sizeheap space limit exceededscratch file name limit exceededD field exceeds W field in ES edit descriptorD field exceeds W field in EN edit descriptorExponent of 0 not allowed in formatinteger expected in formatinitial left parenthesis expected in formatpositive integer expected in formatrepeat count on nonrepeatable descriptorinteger expected preceding H, X, or P edit descriptorN or Z expected after B in formatformat nesting limit exceeded'.' expected in formatunexpected end of formatunexpected character in formatM field exceeds W field in I edit descriptorinteger out of range in formatformat not set by ASSIGNseparator expected in format%c or $ : nonstandard edit descriptor in formatZ : nonstandard edit descriptor in formatDOS graphics not supported under Windows NTGraphics errorUsing QuickWin is illegal in console applicationIllegal 'ADVANCE' valueDIM argument to SIZE out of range (value %d)Uninitialised pointer used as argument to ASSOCIATED functionReference to uninitialised POINTERReference to POINTER which is not ASSOCIATEDReference to uninitialised POINTER %sReference to POINTER %s which is not ASSOCIATEDOut of range: substring starting position %d is less than 1Subscript %d of %s (value %d) is out of range (%d:%d)Subscript %d of %s (value %d) is out of range (%d:*)VECTOR argument to PACK has incompatible character lengthVECTOR argument to PACK is too smallElement %d of SHAPE argument to RESHAPE is negativeSOURCE too small for specified SHAPE in RESHAPE, and no PADOut of memoryElement %d of ORDER argument to RESHAPE is out of range (%d)Value %d occurs twice in ORDER argument to RESHAPEimpossible nextelt overflow in RESHAPEInvalid value %d for argument DIM for SPREAD of rank %d sourceComplex zero raised to power zeroComplex zero raised to negative powerImpossible error in NAMELIST inputDIM argument to CSHIFT (%d) is out of rangeDIM argument (%d) to CSHIFT is out of range (1:%d)Internal Error - bad arguments to cshift_caInternal error - bad arguments to cshift_caaDATE argument to DATE_AND_TIME is too short (LEN=%d)TIME argument to DATE_AND_TIME is too short (LEN=%d)ZONE argument to DATE_AND_TIME is too short (LEN=%d)VALUES argument to DATE_AND_TIME is too small (%d elements)Out of range: DIM argument to COUNT has value %dOut of range: DIM argument to PRODUCT has value %dReal zero raised to zeroth powerReal zero raised to negative powerOut of range: DIM argument to SUM has value %dDIM argument (%d) to EOSHIFT is out of range (1:%d)DIM argument to EOSHIFT is out of range (%d)BOUNDARY argument to EOSHIFT has wrong LEN (%d instead of %d)BOUNDARY has LEN %d instead of %d to EOSHIFTInternal error - bad arguments to EOSHIFTGETARG: Value of K (%d) is out of rangeFLUSH: Value of LUNIT (%d) is out of rangeFLUSH: Unit %d is not connectedInvalid string length (%d) to ICHARInvalid string length (%d) to IACHARInteger zero raised to a negative powerInteger zero raised to zeroth powerSIZE argument (%d) to ISHFTC intrinsic out of rangeSHIFT argument (%d) to ISHFTC intrinsic out of rangeOut of range: DIM argument to LBOUND has value %dOut of range: DIM argument to MAXVAL has value %dCannot allocate array temporary - out of memoryAttempt to DEALLOCATE part of a larger objectPointer in DEALLOCATE is ASSOCIATED with an ALLOCATABLE arrayAttempt to DEALLOCATE an object which was not ALLOCATEdCannot ALLOCATE scalar POINTER - out of memoryDEALLOCATE: object not allocated/associatedCannot allocate POINTER array - out of memoryDEALLOCATE: Array not allocatedDEALLOCATE: Character array not allocatedCannot ALLOCATE ALLOCATABLE array - out of memoryCannot allocate automatic variable - out of memoryDEALLOCATE failure: ALLOCATABLE array is not ALLOCATEdOut of range: DIM argument to MINVAL has value %dP argument to MOD is double precision zeroP argument to MOD is integer zeroP argument to MOD is real zeroP argument to MODULO is real zeroP argument to modulo is zeroArgument S to NEAREST is zeroHeap Storage ExhaustedPUT argument to RANDOM_SEED is too smallGET argument to RANDOM_SEED is too smallRecursive i/o referenceArgument to SHAPE intrinsic is not PRESENTOut of range: DIM argument to UBOUND has value %dOut of range: UBOUND of assumed-size array with DIM==rank (%d)Shape mismatch: Dimension %d extents are %d and %dIllegal POSITION valueIllegal ACTION valueDELIM= specifier not allowed for an UNFORMATTED fileIllegal DELIM valuePAD= specifier not allowed for an UNFORMATTED fileillegal PAD valueillegal CARRIAGECONTROL valueSIZE specifier only allowed with ADVANCE=NOillegal character in binary inputillegal character in octal inputEnd of record encounteredIllegal subcript in namelist input recordplace holderAll values in image-set expression must be positive, value %dImage-set array expression must not contain repeated valuesOne of the images to be synchronized with has terminated.In coarray image %d "%s"%lldfor_diags_intel.cFOR__IS_DEBUGGER_PRESENTFOR_DEBUGGER_IS_PRESENTFOR_DISABLE_STACK_TRACE%s FORT0aFOR_DIAGNOSTIC_LOG_FILEFOR_DISABLE_DIAGNOSTIC_DISPLAYf77_dump_flagdecfort_dump_flag(1H ,A)%s : %s Unknown errorSuccessNo errorfor_exit_handler.cFORT%dpthread_selfpthread_createpthread_cancelpthread_exitpthread_mutex_initpthread_mutex_lockpthread_mutex_unlockpthread_cond_waitpthread_cond_signalfor_aio.cFORT_BLOCKSIZEFORT_BUFFERCOUNTFORT_FMT_RECLFORT_UFMT_RECLfor_lub_mgt.cfor_put.cF_UFMTENDIANbiglittlebig;little;big:little:FOR_FMT_TERMINATORCRLFCRLFCR;LF;CRLF;CR:LF:CRLF:DEFAULTUTF-8PLUSSUPPRESSPROCESSOR_DEFINEDCOMMAPOINTUPDOWNZERONEARESTCOMPATIBLENOYESCOMPATDENYNONEDENYRDDENYRWDENYWRREADREADWRITEWRITEAPPENDASISREWINDAPOSTROPHENONEQUOTEBIG_ENDIANLITTLE_ENDIANVAXDVAXGCRAYIBMFDXFGXNATIVEOLDNEWSCRATCHUNKNOWNREPLACEFIXEDVARIABLESEGMENTEDSTREAMSTREAM_CRSTREAM_LFSTREAM_CRLFSEQUENTIALRELATIVEINDEXEDFORMATTEDUNFORMATTEDBINARYSAVEKEEPDELETEPRINTSUBMITPRINT/DELETESUBMIT/DELETEFORTRANLISTNULLDIRECTKEYEDfor_open.cACCESS=ACTION=ASSOCIATEVARIABLE=DISPOSE=FORM=MAXREC=MODE=NOSHAREDORGANIZATION=POSITION=READONLYRECL=RECORDTYPE=SHARE=SHAREDSTATUS=BUFFERED=ASYNCHRONOUS=FORT_CONVERTFORT_CONVERT%dFOR_TYPEFOR_PRINTFOR_ACCEPTFOR_READfor_desc_item.cFatal Error: This program was not built to run on the processor in your system.Run-Time Check Failure: The variable '%s' is being used without being initialized Windows XP 64-bit Edition Version 2003 or newer should be used.Intel(R) Core(TM) Duo processors and compatible Intel processors with supplemental Streaming SIMD Extensions 3 (SSSE3) instruction supportIntel(R) Pentium(R) 4 and compatible Intel processors with Intel(R) Streaming SIMD Extensions 3 (Intel(R) SSE3) instruction supportIntel(R) Pentium(R) 4 and compatible Intel processors. Enables new optimizations in addition to Intel processor-specific optimizationsIntel(R) processors with SSE4.2 and POPCNT instructions supportPlease verify that both the operating system and the processor support Intel(R) AVX.Please verify that both the operating system and the processor support Intel(R) AVX, F16C and RDRAND instructions.Please verify that both the operating system and the processor support Intel(R) AVX2, BMI, LZCNT and FMA instructions.irc_msg.catLANG Constant propagation error (%s substitution):FORMALRETURNGLOBAL I32 %lx != %lx SI32 %ld != %ld F32 %f != %f I64 %lx:%lx != %lx:%lx SI64 %ld:%ld != %ld:%ld F64 %f != %fBad second argumentFatal Error: Can not initiate the HeapUsage: %s input_file output_fileUsage: %s segment_size input_file [-trace]Conversion from text file %s to binary %s completedsegment_size = 0x%x = %dCannot allocate memory to hold segment (size = 0x%x)Input file: %s corruptedroutine_name = '%s'file_name = '%s'prof_dir = '%s'Dynamic profile created from file %s completedThe allowed processors are: %s.Error: Buffer overrun occurred, forced exitInitialization of symbol handler failed. Error code %dNTDLL module not foundRtlCaptureContext function not found in ntdll.dllStackWalk is terminated abnormally. Error code %dException is raised during stack walkingSignal %s is raisedSignal %s is raised at 0x%pSIGSEGVSIGILLSIGBUSSIGFPEYou must link with libunwind to use traceback functionalityIntel(R) Pentium(R) M and compatible Intel processorsIntel(R) processors with Swing New Instructions supportIntel(R) processors with MOVBE instructions supportFatal Error: This program was not built to run in your system. Hex Dump of User Context at Exception is NOT yet supported on Apple Intel(c) 64 TBK_ENABLE_VERBOSE_STACK_TRACEFOR_ENABLE_VERBOSE_STACK_TRACEfor_wseq_fmt.cchmod -xchmod +x(%s %s; %s ;%s %s) &rm(%s %s;%s ;%s %s) &lpr(%s %s) &(%s %s;%s %s) &0123456789ABCDEFstdinstdoutstderrfort.%dHOMEFORT_TMPDIRTMPDIRfortXXXXXX/%s for_open_proc.cFORT_BUFFEREDNaNNANnanInfinityINFINITYinfinityfor_wseq.cfor_fmt_comp.cfor_intrp_fmt.c--------- Frame # %s --------------------------------------- Image: %s PC: 0x%16.16llx Routine name: %s Source file: %s Line number: %s Stack trace buffer overflow; further frames not shown. Stack trace terminated abnormally. Traceback symbolic or hex stack dump follows: SourceLineRoutinePCImage%-19.19s%-18.18s%-19.19s%-12.12s%-19.19s %-17.17s %16.16llX %-17.17s %10.10s %s for_get.cr__DATA_trace%luzRx TP|P v  v" zRx D@| v[ zRx ,$L`}$t.# p `$`.# hp$`$D.# lpP`$.# `$$`.# ,Dh$t$p.# ,x$$p.# ,Dx$t$p.# x0$, <0zRx ,H} ƴL} !`,  ,4  <dp L, P H,@  L0`  AT@ *CzRx ,[  ,L[ <|x[` E,[  ,[  Lx[` <<l[ ,\ },x\  , X\  zRx 4`"` 9d T$@ O  &s&## M % #]&Z#Uz#`c#Z#Ml `9@9   $g}7$$^$DLH$UULYj!$_,0i@     ' C $  $ 9    -    =   zRx ,hD0 &LhD         $    $             4  +    ,LXM0 zRx 4PM0 dTHM  gKGtN  ]<4hNp StN  \OHdO  x8QP  \gAQ &LR  p lXS q[ ̌ ,DT0 %,tT  zRx pp    <8P 8dH Z8l@  L\ *SdP c0zRx      P  d   t,0 ndX ] L p )\`   'x _ ,|  Ƅ@  o 4hP  ? +   $$@   yIL  XzRx ,@ <L@ X zRx T p  l zRx (d df      g    t@n , r T<r O v  R !!8!<L V   8  "        % N ( K %     `~ W #T&Q#N_Td pP i h0  I,D zRx ,xp gzRx 4`  zRx D} dh \ p0  dl@p                    4, c|d8   9 z    7,8P <ƤX "6T|p  PϏ ,<` VzRx 8  {%D H "zRx 4s0zRx X0<h zRx 0 ($P  P D q\$J` Vx0 lfzRx $zRx Tpp &rt@ Ddؔ 2T   |ÃED  !      h       d      x  i  ~          O      ] Ãà A7`%C-'81%!!M'38178'!V-,3$h=99-{K3t8    C    dh        4D(  Aà =Q Ãà | H0 ODP u ^  zRx $hqp  ^  5Ds`  v  à à  _   x   à à    zRx $`zRx      *    ,@    , 0 ,<0  ,l0 ,0 !zRx $Ht zRx R e   $T@ ((  ( ( Z( zRx + .   .  zRx t,  #- 2     ̌  ̍    Tl.P  . #(zRx pQ  !!m ndpT@  ?l U` o! JzRx @D<ȶ@ zRx HP<x zRx p  pzRx  m H      #  a  &  n  &       g  %    %    M                         #  T  &  Q  #        L      h  #            ", #        $    $  R     !  "    I    $    S  G  $    A    }  U      ;  (  S  &    A      A  p    A  A  J    p  zRx |p0  P    C    ,     E F W !  zRx >0 R,zRx l  l͌W > ͌Tl   l͌W > ͌TzRx X  P52/CKdp +/0%  S?2/CTd .-0%zRx d0   |Z t ]N zRx ,P AL #    G                  /  /  P    O  8    ;  d$' h<' u0(  zRx ,P AL #           m            /  /  /    O  8    ;  d$ h<0 s  zRx ,P AL0p #              m                  /   /         O   8      ;   d$ h< s`  zRx  t [   zRx @0 Aw @ Cz zRx L0 Ll0 h` # T@ T@ L@  L0p WLdPp Wp }!u: zRx Tl Ttpq  u  <" Tzp RT4 p R8  TT@ T@ Аp %"|L TP@ TL8@  p %"L L L 4` *' zRx L( lLlh l #x zRx TC TtG (L  jw zRx LP 7LlP 7 KI zRx L` KLl` K HI zRx dM }dS }`X  @ zRx T@ Tt  %  v T* Tp/ D4 I zRx       7    $ +   8$nnG$Y 4`6`+     o ! 4 e   " w  "  $ 6 :    > : . R  / / /  " 1   v      v   ?  !                   $ V@        \  L  ,8a zRx ,a  ,L`  ,|`  ,`  ,`  , `  ,<``  ,l@`  , ` zRx P (08 80( zRx (w, (08'80( 80( zRx @O (08 80( zRx p] (08b80( 80( zRx x@R (08G 80( zRx $hzRx $zRx @`R (08 K80(  80(  zRx $   O7#a&q&l##  #T&Q#Oh#1"D @   ##: [[/[5V!~q bble^ \ @ !, 4"<Th0  `    e uX  t$Ih+zRx d 7@)   Ύ BΎ B =D   =`  Ύ B  = Ύ B  =  = Ύ B   Ύ B   Ύ B   Ύ B    =  =  = Ύ B  = Ύ B  = Ύ B Ύ B  = Ύ B  = Ύ B  =  =  = =  = Ύ BΎ B    = Ύ B   Ύ B    = Ύ B  A Ύ B Ύ B  :   Ύ BΎ B    =  =  =U <  Ύ B Ύ B  A Ύ BΎ  Ύ B F R`  zRx l  &à ÃσOÃ#ÃÃÃ(Rà R:#zRx L00lp  >9     1% X   K zRx `j  QyS)ty N  R%, z , `v `zRx 7HƆ)Ɔ! l88Ɔ,Ɔ! zRx ) <) zRx 81 <@ +<  wTP  %   mzRx zRx zRx еzRx   (0880( n80( 80( 80( ,80( %80( u80( 80( 80( ?80( R80( e80( 80( 4  (0880( n80( 80( 80( ,80( %80( u80( 80( 80( ?80( R80( e80( 80( $LX.# zRx   (08d80( 80( 80( 80( I80( 80( :80( G80( X  (08d80( 80( 80( 80( I80( 80( :80( G80( $\.# zRx 8<(\|| (( X( ( c( s( ( ,H  D,80  (08'80(  80( -80( 80( 80( 80( 80( 80( 80( 80( t @   <P    \zRx (* pD` h p x  @`H@   ` @@ `    `@ D @ p` @L D H  0  ` < $ 8 4 , @ ( ` M   `8 ȇ Ї   dH`(2<FPZdnx",6@JT^hr|&0:DNXblv-defaultlib:libirc -defaultlib:libirc -defaultlib:libirc -defaultlib:libirc -defaultlib:libirc S]]]]]]]]]]NNNNNND??????(,,`,```,```````,(,,`,```,```````,)-----(,,?,???,???????,(,,?,???,???????,)--a-aaa-aaaaaaa-(,,+,+++,+++++++,(,,+,+++,+++++++,)--d-ddd-ddddddd-(,,,,,(,,,,,(,,,,,(,,,,,(,,,,,)-----(,,,,,(,,,,,)-----(,,v,vvv,vvvvvvv,(,,v,vvv,vvvvvvv,(,,,,,(,,,,,(,,,,,(,,,,,(,,F,FFF,FFFFFFF,(,,F,FFF,FFFFFFF,(,,c,ccc,ccccccc,(,,,,,(,,,,,(,,C,CCC,CCCCCCC,(,,,,,(,,,,,(,,F,FFF,FFFFFFF,(,,,,,(,,,,,(,,,,,(,,,,,(,,,,,)--<-<<<-<<<<<<<-(,,,,,(,,,,,(,,,,,(,,K,KKK,KKKKKKK,(,,K,KKK,KKKKKKK,(,,q,qqq,qqqqqqq,}`;;0|9z5 ss ]>$>$8A(AHAXAxA-AA B PB BBBC@.8CXCCCCD0DPDDDDD E!DE"dE#E$E%E& F'HF(lF)F*F+F,G-4G.lG/G0G1H2,H3hH4H5H6H7 I8,I9LI:lI;I<I=I>J?HJ@tJAJBJCJD$KE`KFKGKHKIKJKKKLLMLN4LOPLPhLQLRLSLTLWMX,MYPM]tM^._M`MaMb.c8`?L`@``Ax`B`C`D`E`F`G aH(aIDaJXaKaLaMaNaO bP4bQTbRpbSbTbUbVbW cX8cYLcZ`c[pc\c]c^c_c`da db4dcHdd|dedfdgdheiej4ekTeltemeneoepfq4frXfsftfufvfwgx,gyHgzlg{g|g}g~ h8h\hhhhii8iXiiiiij@jlj|jjjj8k\kkkk: lXlll`:l(mdm:tmmmnPntnnnn ; oLo|ooo$p`p`;p; <ppq@q<tq<qqr@rhrrrrs(sLsss@=s= tPtttt(uTuuuuv8vpv>vvvw8wXwxwwwwx,x`>`x>xxxy F F F FeU0Ue FUe` VVVVLVVVVV99VVVV99VV99V9VVVVVV9Vwne\SJA8/&`P:'PPPP{PPlP]NP?P0!PPPPPPPPPPPPPPPPPPPPPPyj[PPPA' PPPPPPPPO G 77E%}mT8%luuucuZuuuQuuHuu?uuuu6uu-uuuuuuuuuuuuuuuuuuuuuuuuu$uuuuuuuuuuuuuuuuuuuuirrr`rWrrrNrrErr<rrrr3rr*rrrrrrrrrrrrrrrrrrrrrrrrr!rrrrr rrrrrrrrrrrrrrroQ?0&QQQQQQQrbQRQB2QQQQQQQQQQQQQQQQQQQQQ% Q~nQQQR6&QQQQQQQQX    l~$~,~4~@~T~\~d~h~p~x~~ @~~~~~~~~~~~~ ~~~~~~~ ~~ ~  ,4<DHL PX\`hpx        $, < LTp~\ d~l0xU^<b F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F M    ` iEEmmStop - Program terminated.Return code Y000V$Vk%0%%D%$D%D%D%#FL;;:;L;::: 7ch88h## > >  o o o p^                      ux==xqqqwwMxxd??x&&L   L PPP""""""""""""""""""""""""""""""""""""" Y Y ~ ~ ~ XXs999ffQ   $$,$$$###44=444444 l 222$b ' ' b 222<<<<rr1 1111 o \ \ \ f    ($)$)$)($)$)$)$)$)$)($)$)$)v($)$)X($)$)$)$)$)$)$)$)$)($)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)$)X(WdC/vW//S0&&;;ssss;VrmOOOOOOOOOOOOOOOOOOOOOOIOOOOOOOOOO71("OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOy}}}}}}}}}}}}}}}}}}}}}}m}}}}}}}}}}d[dU}/}}}}}}}s}}j}}}}}}}}}}}_}}}}}}O}s}}j}}}}}}}}}}}_'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''wwwwwwg]MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMwwwwwwg]MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM kkkkkkkkkRRR6(RI7RRR6(RI7LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLzLLlLPLPLPLPLPLPLPLPLPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLELxxxxxxh^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpt̆  $ 4 H pHdxЈ  Xp ؉!"#4$<%D&L'-(`|)h*+,- .܊/01H23`4ujS=vE-P~`    /@  @    0H`@ HPX`hp)Y T/L' D<4,w$ozgr_ jWwbOoZGgR?|_J7tWB/lO:'q^A,~cP3 pUB%bG4qT9& cF+U8 p`P@0vlbXND:08[4}W0y S,uO(qK$mG iCe?a;]7Y3} U/yQ+uM'qI#mEi>bAGPZgp|=CLVclx; d>hJ5_9cE0Z4{^@+zU/v Y;&u P*qT6!pK%lO1kF gJ,|fAbE'wa9Z=o Y1x R5~gQ)pJ-v_I!hB%nWA"UBp`A`-B`K0OpV0,R0 SARDTBSGV0SARCSASGT0p0p0ppSARAVJSHRERERFp(RER0 pp@ppp(pp@p@pp@pp@p8ppp(ppp(pp@ppp(ppp(p8p8p(ppp(ppp(p(ppp(pp@pppp\4pp`A`A`@__DefaultRuneLocaleQr(@__Unwind_ForcedUnwind@___stderrp@___stdinp@___stdoutp@_dladdr@dyld_stub_binderrA__Unwind_ForcedUnwindrA__Unwind_GetIPrA__Unwind_GetRegionStartr@___errorr@___memcpy_chkr@___sprintf_chkr@___strcat_chkr@___strcpy_chkr@___strncat_chkr@___strncpy_chkr@___tolowerr@___vsprintf_chkr@__dyld_get_image_namer@__dyld_image_countr@__dyld_presentr@_abortr@_basenamer@_catcloser@_catgetsr@_catopenr@_closer@_closedirrA_dladdrr@_dlsymr@_exitr@_fcloser@_fcntlr@_filenor@_fopenr@_fprintfr@_fputsr@_freadr@_freer@_freopenr@_fseekr@_fstat$INODE64r@_ftellr@_ftruncater@_getcwdr@_getenvr@_getpidr@_isattyr@_killr@_lseekr@_mallocr@_memchrr@_memmover@_mkstempr@_nanosleepr@_openr@_opendir$INODE64r@_perrorr@_printfr@_raiser@_readr @_readlinkr @_reallocr @_setenvr @_sigactionr @_siglongjmpr @_signalr @_sigprocmaskr @_sigsetjmpr @_snprintfr @_sprintfr @_sscanfr @_stat$INODE64r @_strerrorr @_strstrr @_systemr @_ttynamer @_unlinkr @_vallocr @_vsprintfr @_write_ start_mMAIN__cCf TRACEBACKQQtdump_dfil_exception_infoSetEndianena_%vax_c-i-NXArg5mh_execute_header_&intel_fast_mem'ainessage_catalog3vtray._as_$iunsigneddatabooleantext_to_vax_cray_to_ieee_ntegerbm_eee__to_text64_to_text_to_text64_to_text!&+_to_text64_to_text1:_to_text64_to_textC_exKSiunsigneddatabooleanntegereee_ [6464^ddg64nu64wf_to_ieee_singled_to_ieee_doubleg_to_ieee_double_zVT_heckVAX_CRAY_TO_IEEE_IF_TO_IEEE_SINGLED_TO_IEEE_DOUBLEG_TO_IEEE_DOUBLE__singledouble_SINGLEDOUBLE_short_to_ieee_singlelong_to_ieee_double_ИBM_EEE_ SHORT_TO_IEEE_SINGLELONG_TO_IEEE_DOUBLE_double_to_s t_to_text x_to_text cray ibm_long vax_ _ DOUBLE_TO_ SINGLE_TO_ CRAY IBM_LONG VAX_ _ d g h _ D G H _ к_ ingle_to_ _to_text cray ibm_short vax_f _ CRAY IBM_SHORT VAX_F _ _ _ex t_ex s_ex x_ex _ex Ё_ex or_ etestexcept%p5 c _ eperror_gesrtl_openadeallocwlose heck_cdkey_desc_ret_itemiget_message_catalog_closerfesaluopwb.lose_vt_reate_lubo"argsdefaultproceisable_asynch_deliv_privatesc_itm_table.fault_io_sizes_env_initsc_allocate_lubcl_exit_hand#ret_itemtest_itemzero_length_itemo_returnsnterp_fmt_fmt_table.sue_diagnostic_special_devicemsgsdnext_lubfree_newunitvmmit_diagnosticrrmsgxitnable_underflowtc_uninit_useem_from_lf_tableracebackqq_bk_ иrror_t_fpe_pe_exit_handlerormat_ilush_readaheadree_vmedg_fmt_table.xit_handlernable_asynch_deliv_privatecompilervaluevalueforeign_alease_entrancy_open_file"d_inputlloc_vmettopup_mxcsr_ignal_handlerepec_align_tatic_threadstor_private2Хcounts_fpe_reentrancyfinish_init_dcquire_lunio_!_argv3just_bufferd_to_lf_table ower_bound_index_2ub_table4 readwritecheck   env_namemult_overflow lunnewunit          StreamRecortTypeEndian   pdate_reopen_keywordsser_iomsg_2 t_gv_default_msg2foreign_bitsterminator_optionconversion_optionsignal_ops_during_vm pen_nce_privatez_fmt_table.keyargsdefaultproc"  nle_info_hash_table4d_iomsgish_ufseq_write     reconnected_units_createut_thread_mutex_5 sduf rite_fs_.outputargs     cleanupinitmode5     ialized5bortllocsynchronous" _core      ate_allocatable  ate_allocatable   64 allocfreeН  rite_seqait" _xmitfmtlis    _xmitsure_one_leading_blank_before_data viron5_xmit st get&trace_stack&_jmp_env5ack_trace!ring_stack_signal% acquire_lun!release"destroy"check_unit"error_handling"init"pthread_#global_mutex2lub_table5_fname""_lun"id""mpute_filename#erce_data_types2Јself#c#mutex_#exit$reate#ancel#ond_$lock#unlock$init$wait$signal$Љa_to_$s_to_a%t%_nan_%x_to_a%pten_.globals_/huge_/s%t%x%_to_a%iny_/s%t%x%divq%mulq%PC&RetAddr&FramePtr&ModuleName&_pc_info&errorstring&cacheSize'intel_'mulq*divq*xxref2progname5cpy'set'new_'proc_init(sse+mem-cpu_indicator5proc_init(mem-_(_*E(I(G)H)L)S)T*P*.(W(A(.(S(A(.)R)A).)P)A)Ї.)O)A).)N)A).*M*A*T*P*.*M*A*.**L*A*ДЪ.++L+A+2_str+4_str+c+len,end,nc,py+hr,at,c+len,end,nc,py,hr,at,mp,py,at,mp,py,at,Аcpy-set-cpy-set-eee_-bm_-nt_c.t-s-s-l-_fmt_table.userr_default_msg2table.msf_table.word/t/6401281t/x/s/pten_/tiny_pten_1281t/6401281_map/pten_0huge_pten_1281t06401281_map0_bexp0_0map0bexp1_0map0bexp1ڙ_bexp1_bexp2_1map1bexp1_bexp2_1map1bexp2ȣȤ$$ current_arg2ex3f3u3ovfcnt4div0cnt4in4b4argc4$$$%%buf3len3ȏ&Џ&؏&it_3cpt_info3termination3hand_decl4&&&pe_mask3mtrecl4&ndcnt4fmtrecl4&&&vcnt4ecnt4&&&&locksize4uffercount4Đ&Ȑ&̐&&&'''''init_ptr5lock_ptr5unlock_ptr5'''''c5v5''''@` P  P#P"P% p  0R000@# P (PPp )%&  # ` ` 0@0p0 5>G>r  V   /XФ@   @ 0p`0p`0p`0`00000@@@00@P 0"P* +p>%?4S>TMft0`cf gpP $3`jPlj x:~PpSWa`mrt$v4PvE0yc t(08@H (&0B@YDppx|`.;Fb `2N`j(HPX`hpx #+3; J(Y0hHw~ `      @ `     +  B ( U + m @,  ,  -  -  .  .  /  /  / / @0 D 0 Z 1 q 2  2  `3  3  4  4   @5   5 +  8 =  8 Y  9 n  9   D   `D   g   pj   tj   k   s   $s   (s 8  ,s R  0s q  @s y  Hs   Ps   Xs   `s   hs   ps   xs   s   s   s   s          *  E  X  a  j  s                 @ '  @ 5  @ K  @ a  @ m  D ~  H   L   P   T   X   \       )  ;  O  c  x          (   ,   0  8  @ 1 H E P Y X k `  h  p  x         @ *pCp\y0 `PP4 Rl@PA`xpsP ` h ovp#-7 N^nP~000Kd 0Ѓ8pQ`j0`,CZo 0p`п/D@Y`nPPPPx  k ~0~ V%V-3)J!_%w0zupk  @>\P{Ь 8S`m,- ` #= X lp@ A  :;3`7,?C*Z@Tq-P22P/UJ. FH=ce}0[PO @`9HXm@   ` 4@C@ W`ev0 X    `2Ic@0"@p `P  `Zpk0H0-F)bjw:l D q @  / H _ |   p , 5 ` !  "![3!]G!p^X!  p!!U!Q!J!L!!0W"P"e9"0hM"ob"q~"""""" #+#sD#Z#`p####p#h##Pd##$@$@9($u8$pP$0g$k$ L $ D $ H $  $ 0 $  $ ` % % < )% $ :% 8 I% 4 X% , g% @ x% ( %J% ` %@% %%&@& &M3&S& p& & &@&&`&p && '#'  @'  V'pRh'k~'r'pn''  '`' (p%(0A(V(m(( `8 (0( ȇ ( Ї ( ( ))`2)=) T)b)`>t)Q) )0 )V) )@ )* *'*1*P>* L*p"a*`}k*x*"*@7*!*P**0*@*Z*J*  +x+4+G+_+)s+ w+d~+H++++ + ؇ + @ +0]+@]+]+ ], a,Pm%,p'6,WO,n`,Pn,`u, {,,@,@,@,,,,,-- -.-=-L-W-g-}----------@----. ... .'.-.6.=.L.S.^.f.n.v.~................///&/3/>/H/Q/Y/g/q/y///////FGHIJKOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~EFLMN_@@FGHIJKOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ _NaN_2003_Infinity_2003_NaN_2003_Infinity_2003_NaN_2003_Infinity_2003_redefine_severity_table_for_gerror_i_emit_comp_fmt_to_uint8_to_uint16_to_int8_to_int16_enter_cr_and_find_lub_find_min_lun_process_existing_lub_reentrancy_cleanup_reentrancy_init_init_resource_recurschk_init_resource_write_UFSEQD_record_to_file_for__finish_direct_write_wseq_complex_aio__routine_for__prompt_user___libirc_get_msg___libirc_print_stackwalk_cb_tbk_signal_handler_tbk_stop_unwind_callback___intel_cpu_indicator_init_get_cpuid2_cache___libirc_cpuid_get_cpuid2_info___libirc_init_mem_ops_method__NLITPACK_0.0.1__STRLITPACK_8.0.1__STRLITPACK_9.0.1__STRLITPACK_10.0.1__STRLITPACK_11.0.1__STRLITPACK_12.0.1_extended_options.97.0.0.2_cvt_options.98.0.0.3_cvt_int64_max_cvt_uint64_max_extended_options.757.0.0.6_cvt_options.540.0.0.5_cvt_options.758.0.0.7_extended_options.757.0.0.6_cvt_options.540.0.0.5_cvt_options.758.0.0.7_extended_options.762.0.0.6_cvt_options.545.0.0.5_cvt_options.763.0.0.7_for__default_name_str_lf_units.1008.0.7_class_table_fmt_check_extended_options.861.0.0.6_extended_options.1024.0.0.7_fmt_cat_coerce_integer_to_float_coerce_floating_to_integer_forfloat_to_cvtfloat_mask.776.0.3_for_special_device_table.1507.0.17_for__asynch_mask__wait_obj_save.869.0.0.10__wait_obj_save.1149.0.0.18__wait_obj_save.1324.0.0.19_tbk__default_unknown_amd_id.145.0.0.10_intel_id.112.0.0.3__infsq__zerosq__maxnumq_d_zero_d_tiny_d_one_d_norm_d_huge_d_half__infsq__zerosq__maxnumq_d_zero_d_tiny_d_one_d_huge_d_norm_d_half__STRLITPACK_3__STRLITPACK_2__STRLITPACK_1__STRLITPACK_0_pvars_first_time.906.0.5_desc_lst.1095.0.11_for_msgtab_intel_first_msg_use_internal_msg_severity_table_forrtl_header_cvt_read_routine_cvt_write_routine_looper.1067.0.10_old_context.1067.0.10_for__newunit_curr_key_encoding.1140.0.10_key_sign.1140.0.10_key_decimal.1140.0.10_key_round.1140.0.10_key_asynch.1140.0.10_key_buffered.1140.0.10_key_share.1140.0.10_key_mode.1140.0.10_key_position.1140.0.10_key_pad.1140.0.10_key_delim.1140.0.10_key_action.1140.0.10_key_convert.1140.0.10_key_status.1140.0.10_key_recordtype.1140.0.10_key_organization.1140.0.10_key_form.1140.0.10_key_dispose.1140.0.10_key_carriage.1140.0.10_key_blank.1140.0.10_key_access.1140.0.10_global_resources_global_resources_recurschk_msf_def_stopstr_msg_msf_def_stopn_msg_aio_lub_table_mutex_aio_lub_mutex_irc_msgtab_first_msg_use_internal_msg_cpuid2_cache_tbl___libirc_mem_ops_method___libirc_largest_cache_size___libirc_largest_cache_size_half___libirc_data_cache_size___libirc_data_cache_size_half_p_zero_p_tiny_p_one_p_norm_p_huge_p_half_p_zero_p_tiny_p_one_p_huge_p_norm_p_halfUSE_SSE2USE_MMXUSE_REGNOT_INITEDUNROLLED_LIMITUSE_SSE2USE_MMXUSE_REGUSE_NOT_INITED_this_image_number.906.0.5_fmt_buf.1147.0.14_tmp_buf_tmp_ptr_tmp_sev_redirect_stderr_once_block.1161.0.16_abort_on_exit_rtl_init_once_block.936.0.4_for__protect_handler_ops_for__newunit_mask_for__newunit_flag_for__newunit_first_exceptionbeg_exceptionend_rectype_exceptionbeg_rectype_exceptionend_endianmode_endianexception_exceptioncount_endian_var_scanned_rectype_var_scanned_rectype_exception_rectype_mode_rectype_exceptioncount_lub_read.769.0.1_lub_accept.769.0.1_lub_print.769.0.1_lub_type.769.0.1_lub_stderr.769.0.1_lub_read_5.769.0.1_lub_print_6.769.0.1_reentrancy_cleanup_once_block_reentrancy_init_once_block_stop_msg_done_block_for__protect_vm_ops_for__protect_signal_ops_for__signal_num_for__protect_trace_ops_pthread_self_ptr_pthread_create_ptr_pthread_cancel_ptr_pthread_exit_ptr_pthread_cond_wait_ptr_pthread_cond_signal_ptr_aio_lub_aio_rte_thread_aio_init_flg_get_msg_buf_print_buf_message_catalog_error_msg___libirc_cache_tbl___libirc_largest_cachelinesize_CVT_CRAY_TO_IEEE_DOUBLE_CVT_CRAY_TO_IEEE_SINGLE_CVT_IBM_LONG_TO_IEEE_DOUBLE_CVT_IBM_SHORT_TO_IEEE_SINGLE_CVT_IEEE_DOUBLE_TO_CRAY_CVT_IEEE_DOUBLE_TO_IBM_LONG_CVT_IEEE_DOUBLE_TO_VAX_D_CVT_IEEE_DOUBLE_TO_VAX_G_CVT_IEEE_DOUBLE_TO_VAX_H_CVT_IEEE_SINGLE_TO_CRAY_CVT_IEEE_SINGLE_TO_IBM_SHORT_CVT_IEEE_SINGLE_TO_VAX_F_CVT_VAX_D_TO_IEEE_DOUBLE_CVT_VAX_F_TO_IEEE_SINGLE_CVT_VAX_G_TO_IEEE_DOUBLE_CheckEndian_CheckStreamRecortType_MAIN___NXArgc_NXArgv_SetEndian_TRACEBACKQQ___cacheSize___divq___divq.A___divq.L___intel_cpu_indicator___intel_memcpy___intel_memset___intel_new_memcpy___intel_new_memset___intel_new_proc_init___intel_new_proc_init_E___intel_new_proc_init_E.A___intel_new_proc_init_E.W___intel_new_proc_init_G___intel_new_proc_init_G.A___intel_new_proc_init_G.R___intel_new_proc_init_H___intel_new_proc_init_H.A___intel_new_proc_init_H.P___intel_new_proc_init_I___intel_new_proc_init_I.A___intel_new_proc_init_I.S___intel_new_proc_init_L___intel_new_proc_init_L.A___intel_new_proc_init_L.O___intel_new_proc_init_P___intel_new_proc_init_S___intel_new_proc_init_S.A___intel_new_proc_init_S.N___intel_new_proc_init_T___intel_new_proc_init_T.A___intel_new_proc_init_T.M___intel_proc_init___intel_proc_init_P___intel_proc_init_T___intel_proc_init_T.A___intel_proc_init_T.M___intel_sse2_strcat___intel_sse2_strchr___intel_sse2_strcpy___intel_sse2_strend___intel_sse2_strlen___intel_sse2_strncat___intel_sse2_strncmp___intel_sse2_strncpy___intel_sse4_strcat___intel_sse4_strchr___intel_sse4_strcpy___intel_sse4_strend___intel_sse4_strlen___intel_sse4_strncat___intel_sse4_strncmp___intel_sse4_strncpy___mulq___mulq.A___mulq.L___progname___xxref__intel_fast_memcpy__intel_fast_memset__mh_execute_header_a_divq_a_mulq_cray_cvt_boolean64_to_text_cvt_boolean_to_text_cvt_boolean_to_text_ex_cvt_cray_to_ieee_double_cvt_cray_to_ieee_double__cvt_cray_to_ieee_single_cvt_cray_to_ieee_single__cvt_data64_to_text_cvt_data_to_text_cvt_ibm_long_to_ieee_double_cvt_ibm_long_to_ieee_double__cvt_ibm_short_to_ieee_single_cvt_ibm_short_to_ieee_single__cvt_ieee_double_to_cray_cvt_ieee_double_to_cray__cvt_ieee_double_to_ibm_long_cvt_ieee_double_to_ibm_long__cvt_ieee_double_to_vax_d_cvt_ieee_double_to_vax_d__cvt_ieee_double_to_vax_g_cvt_ieee_double_to_vax_g__cvt_ieee_double_to_vax_h_cvt_ieee_double_to_vax_h__cvt_ieee_s_to_text_cvt_ieee_s_to_text_ex_cvt_ieee_single_to_cray_cvt_ieee_single_to_cray__cvt_ieee_single_to_ibm_short_cvt_ieee_single_to_ibm_short__cvt_ieee_single_to_vax_f_cvt_ieee_single_to_vax_f__cvt_ieee_t_to_text_cvt_ieee_t_to_text_ex_cvt_ieee_x_to_text_cvt_ieee_x_to_text_ex_cvt_integer64_to_text_cvt_integer_to_text_cvt_text_to_boolean_cvt_text_to_boolean64_cvt_text_to_data_cvt_text_to_data64_cvt_text_to_ieee_s_ex_cvt_text_to_ieee_t_ex_cvt_text_to_ieee_x_ex_cvt_text_to_integer_cvt_text_to_integer64_cvt_text_to_unsigned_cvt_text_to_unsigned64_cvt_unsigned64_to_text_cvt_unsigned_to_text_cvt_vax_d_to_ieee_double_cvt_vax_d_to_ieee_double__cvt_vax_f_to_ieee_single_cvt_vax_f_to_ieee_single__cvt_vax_g_to_ieee_double_cvt_vax_g_to_ieee_double__cvtas__nan_s_cvtas__nan_t_cvtas__nan_x_cvtas_a_to_s_cvtas_a_to_t_cvtas_a_to_x_cvtas_globals_s_cvtas_globals_t_cvtas_globals_x_cvtas_huge_huge_pten_128_cvtas_huge_huge_pten_128_bexp_cvtas_huge_pten_128_cvtas_huge_pten_128_bexp_cvtas_huge_pten_128_map_cvtas_huge_pten_64_cvtas_huge_pten_64_bexp_cvtas_huge_pten_64_map_cvtas_huge_pten_t_cvtas_huge_pten_t_map_cvtas_pten_128_cvtas_pten_128_bexp_cvtas_pten_64_cvtas_pten_64_bexp_cvtas_pten_t_cvtas_pten_word_cvtas_s_to_a_cvtas_t_to_a_cvtas_tiny_pten_128_cvtas_tiny_pten_128_bexp_cvtas_tiny_pten_128_map_cvtas_tiny_pten_64_cvtas_tiny_pten_64_bexp_cvtas_tiny_pten_64_map_cvtas_tiny_pten_t_cvtas_tiny_pten_t_map_cvtas_tiny_tiny_pten_128_cvtas_tiny_tiny_pten_128_bexp_cvtas_x_to_a_dump_dfil_exception_info_ensure_one_leading_blank_before_data_environ_fetestexcept_for__a_argv_for__acquire_lun_for__add_to_lf_table_for__adjust_buffer_for__aio_acquire_lun_for__aio_acquire_lun_fname_for__aio_check_unit_for__aio_destroy_for__aio_error_handling_for__aio_global_mutex_for__aio_init_for__aio_lub_table_for__aio_pthread_cancel_for__aio_pthread_cond_signal_for__aio_pthread_cond_wait_for__aio_pthread_create_for__aio_pthread_exit_for__aio_pthread_mutex_init_for__aio_pthread_mutex_lock_for__aio_pthread_mutex_unlock_for__aio_pthread_self_for__aio_release_for__aio_release_lun_for__b_fmt_table_for__buserr_default_msg_for__close_args_for__close_default_for__close_proc_for__coerce_data_types_for__compute_filename_for__create_lub_for__cvt_foreign_check_for__cvt_foreign_read_for__cvt_foreign_write_for__cvt_value_for__deallocate_lub_for__decl_exit_hand_for__default_io_sizes_env_init_for__desc_ret_item_for__desc_test_item_for__desc_zero_length_item_for__disable_asynch_deliv_private_for__dsc_itm_table_for__enable_asynch_deliv_private_for__exit_handler_for__fedg_fmt_table_for__file_info_hash_table_for__find_iomsg_for__finish_ufseq_write_for__flush_readahead_for__format_compiler_for__format_value_for__fpe_exit_handler_for__free_vm_for__get_d_for__get_free_newunit_for__get_msg_for__get_next_lub_for__get_s_for__get_vm_for__i_fmt_table_for__interp_fmt_for__io_return_for__is_special_device_for__issue_diagnostic_for__key_desc_ret_item_for__l_argc_for__l_blocksize_for__l_buffercount_for__l_current_arg_for__l_div0cnt_for__l_excpt_info_for__l_exit_hand_decl_for__l_exit_termination_for__l_fmtrecl_for__l_fpe_mask_for__l_inecnt_for__l_invcnt_for__l_ovfcnt_for__l_ufmtrecl_for__l_undcnt_for__lower_bound_index_for__lub_table_for__message_catalog_close_for__once_private_for__open_args_for__open_default_for__open_key_for__open_proc_for__oz_fmt_table_for__preconnected_units_create_for__pthread_mutex_init_ptr_for__pthread_mutex_lock_ptr_for__pthread_mutex_unlock_ptr_for__put_d_for__put_sf_for__put_su_for__read_input_for__realloc_vm_for__reentrancy_cleanup_for__reentrancy_init_for__reentrancy_initialized_for__reentrancy_mode_for__release_lun_for__release_newunit_for__reopen_file_for__rm_from_lf_table_for__rtc_uninit_use_for__segv_default_msg_for__set_conversion_option_for__set_foreign_bits_for__set_signal_ops_during_vm_for__set_terminator_option_for__signal_handler_for__spec_align_alloc_for__spec_align_free_for__static_threadstor_private_for__update_reopen_keywords_for__user_iomsg_buf_for__user_iomsg_len_for__wfs_msf_table_for__wfs_table_for__write_args_for__write_output_for_abort_for_alloc_allocatable_for_allocate_for_asynchronous_for_check_env_name_for_check_mult_overflow_for_check_mult_overflow64_for_close_for_dealloc_allocatable_for_deallocate_for_emit_diagnostic_for_enable_underflow_for_errmsg_for_exit_for_gerror__for_get_fpe__for_get_fpe_counts__for_open_for_perror__for_rtl_finish__for_rtl_init__for_set_fpe__for_set_reentrancy_for_setup_mxcsr_for_stop_for_stop_core_for_wait_for_waitid_for_write_seq_for_write_seq_fmt_for_write_seq_fmt_xmit_for_write_seq_lis_for_write_seq_lis_xmit_for_write_seq_xmit_fp_ibm_l_ibm_s_ieee_s_ieee_t_int_c_main_message_catalog_tbk__jmp_env_tbk_getFramePtr_tbk_getModuleName_tbk_getPC_tbk_getRetAddr_tbk_get_pc_info_tbk_geterrorstring_tbk_stack_trace_tbk_string_stack_signal_tbk_trace_stack_tracebackqq__vax_cstart__DefaultRuneLocale__Unwind_ForcedUnwind__Unwind_GetIP__Unwind_GetRegionStart___error___memcpy_chk___sprintf_chk___stderrp___stdinp___stdoutp___strcat_chk___strcpy_chk___strncat_chk___strncpy_chk___tolower___vsprintf_chk__dyld_get_image_name__dyld_image_count__dyld_present_abort_basename_catclose_catgets_catopen_close_closedir_dladdr_dlsym_exit_fclose_fcntl_fileno_fopen_fprintf_fputs_fread_free_freopen_fseek_fstat$INODE64_ftell_ftruncate_getcwd_getenv_getpid_isatty_kill_lseek_malloc_memchr_memmove_mkstemp_nanosleep_open_opendir$INODE64_perror_printf_raise_read_readlink_realloc_setenv_sigaction_siglongjmp_signal_sigprocmask_sigsetjmp_snprintf_sprintf_sscanf_stat$INODE64_strerror_strstr_system_ttyname_unlink_valloc_vsprintf_writedyld_stub_binderDay-III/01-hello_world/hw.mk100777 0 0 173 11777667610 11024 0FC=ifort FCFLAGS=-std -warn all -check all -coarray hw: hello_world.f90 ${FC} ${FCFLAGS} hello_world.f90 ${LIBS} -o hw Day-III/02-mctoy/ 40777 0 0 0 12000033646 6566 5Day-III/02-mctoy/._mctoy.f90100777 0 0 10000 12000033462 10561 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/02-mctoy/._mctoy.mk100777 0 0 10000 12000033464 10574 0Mac OS X  2TEXTR*chATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/02-mctoy/mctoy.f90100777 0 0 12243 12000032264 10356 0! bof ! ********************************************************************** ! Fortran 95 program mctoy ! ---------------------------------------------------------------------- ! Source Control Strings ! $Id$ ! ---------------------------------------------------------------------- ! Copyright 2012 Dan Nagle ! All Rights Reserved ! This program is free software; you can redistribute it and/or ! modify it under the terms of the GNU General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public ! License along with this program; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, or contact the Authors, ! Contact: ! Dan Nagle ! send email to dannagle@verizon.net ! or mail to 2820 Lafayette Dr. ! Boulder, CO 80305 USA ! ---------------------------------------------------------------------- ! mctoy describe the program ! ---------------------------------------------------------------------- ! mctoy uses ! processor_dependencies- describes the processor ! mctoy includes ! ! mctoy reads files ! mctoy writes files ! mctoy constants ! mctoy types ! mctoy data ! mctoy library ! ********************************************************************** ! mctoy ! ---------------------------------------------------------------------- program mctoy ! ---------------------------------------------------------------------- ! mctoy uses modules ! ---------------------------------------------------------------------- ! processor description use, intrinsic :: iso_fortran_env, only: input_unit, output_unit, error_unit ! ---------------------------------------------------------------------- ! all names are declared: require explicit declarations implicit none ! ---------------------------------------------------------------------- ! mctoy RCS strings ! ---------------------------------------------------------------------- ! program source filename supplied by RCS character( len= *), parameter :: mctoy_rcs_id = & '$Id$' ! ---------------------------------------------------------------------- ! mctoy constants ! ---------------------------------------------------------------------- real, parameter :: one = 1.0 ! ---------------------------------------------------------------------- ! mctoy types ! ---------------------------------------------------------------------- ! ---------------------------------------------------------------------- ! mctoy data ! ---------------------------------------------------------------------- integer :: i integer, codimension[ *] :: num_trials integer :: quadrant real :: sign_x, sign_y real :: x, y real, codimension[ *] :: total ! ---------------------------------------------------------------------- ! mctoy text ! ---------------------------------------------------------------------- continue if( num_images() /= 4 )then write( unit= error_unit, fmt= *) 'mctoy must be run with four images' stop 'wrong number of images for mctoy' end if if( this_image() == 1 )then write( unit= output_unit, fmt= *) 'number of trials (per image)' read( unit= input_unit, fmt= *) num_trials end if do i = 2, num_images() num_trials[ i] = num_trials end do sync all quadrant = mod( this_image(), 4) if( quadrant == 0 )then sign_x = one sign_y = one else if( quadrant == 1 )then sign_x = -one sign_y = one else if( quadrant == 1 )then sign_x = -one sign_y = -one else if( quadrant == 3 )then sign_x = one sign_y = -one end if total = 0 do i = 1, num_trials call random_number( harvest= x) call random_number( harvest= y) x = sign( x, sign_x) y = sign( y, sign_y) if( x*x + y*y < one ) total = total + 1 end do sync all do i = 2, num_images() total = total + total[ i] end do if( this_image() == 1 )then write( unit= output_unit, fmt= *) 'buffon says pi = ', real( total) / real( num_trials) end if stop 'normal exit in mctoy' ! ---------------------------------------------------------------------- ! mctoy library ! ---------------------------------------------------------------------- contains ! ---------------------------------------------------------------------- ! mctoy ! $Id$ ! ********************************************************************** ! eof end program mctoy Day-III/02-mctoy/mctoy.mk100777 0 0 164 11777671700 10356 0FC=ifort FCFLAGS=-std -warn all -check all -coarray mctoy: mctoy.f90 ${FC} ${FCFLAGS} mctoy.f90 ${LIBS} -o mctoy Day-III/03-mxv/ 40777 0 0 0 12000033646 6246 5Day-III/03-mxv/._coco.inc100777 0 0 10000 12000033464 10206 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/03-mxv/._mxv.f90100777 0 0 10000 12000033464 7722 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/03-mxv/._parfunc.fpp100777 0 0 10000 12000033466 10737 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/03-mxv/._stdfunc.fpp100777 0 0 10000 12000033470 10742 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/03-mxv/coco.inc100777 0 0 1124 12000002320 7743 0?? logical, parameter :: BYTE_K = .true. ?? logical, parameter :: SHORT_K = .true. ?? logical, parameter :: INT_K = .true. ?? logical, parameter :: LONG_K = .true. ?? logical, parameter :: SINGLE_K = .true. ?? logical, parameter :: DOUBLE_K = .true. ?? logical, parameter :: QUAD_K = .true. ?? logical, parameter :: L_BYTE_K = .true. ?? logical, parameter :: L_SHORT_K = .true. ?? logical, parameter :: L_INT_K = .true. ?? logical, parameter :: L_LONG_K = .true. ?? logical, parameter :: ASCII_K = .true. ?? logical, parameter :: EBCDIC_K = .false. ?? logical, parameter :: ISO_10646_K = .false. Day-III/03-mxv/mxv.f90100777 0 0 15440 12000033146 7517 0! bof ! ********************************************************************** ! Fortran 95 program mxv ! ---------------------------------------------------------------------- ! Source Control Strings ! $Id$ ! ---------------------------------------------------------------------- ! Copyright 2012 Dan Nagle ! All Rights Reserved ! This program is free software; you can redistribute it and/or ! modify it under the terms of the GNU General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public ! License along with this program; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, or contact the Authors, ! Contact: ! Dan Nagle ! send email to dannagle@verizon.net ! or mail to 2820 Lafayette Dr. ! Boulder, CO 80305 USA ! ---------------------------------------------------------------------- ! mxv describe the program ! ---------------------------------------------------------------------- ! mxv uses ! processor_dependencies- describes the processor ! mxv includes ! ! mxv reads files ! mxv writes files ! mxv constants ! mxv types ! mxv data ! mxv library ! ********************************************************************** ! mxv ! ---------------------------------------------------------------------- program mxv ! ---------------------------------------------------------------------- ! mxv uses modules ! ---------------------------------------------------------------------- ! processor description use, intrinsic :: iso_fortran_env, only: input_unit ! ---------------------------------------------------------------------- ! all names are declared: require explicit declarations implicit none ! ---------------------------------------------------------------------- ! mxv RCS strings ! ---------------------------------------------------------------------- ! program source filename supplied by RCS character( len= *), parameter :: mxv_rcs_id = & '$Id$' ! ---------------------------------------------------------------------- ! mxv constants ! ---------------------------------------------------------------------- ! ---------------------------------------------------------------------- ! mxv types ! ---------------------------------------------------------------------- ! 1-d segment_t type :: segment_t integer :: lo integer :: hi end type segment_t ! ---------------------------------------------------------------------- ! mxv data ! ---------------------------------------------------------------------- integer, codimension[ *] :: mat_size real, dimension( :, :), codimension[ :], allocatable :: rows real, dimension( :), codimension[ :], allocatable :: vector, prod integer :: i type( segment_t), dimension( :), allocatable :: batch ! ---------------------------------------------------------------------- ! mxv text ! ---------------------------------------------------------------------- continue if( this_image() == 1 )then read( unit= input_unit, fmt= *) mat_size do i = 2, num_images() mat_size[ i] = mat_size end do end if sync all allocate( vector( mat_size)[ *], prod( mat_size)[ *] ) if( this_image() == 1 )then read( unit= input_unit, fmt= *) vector end if sync all if( this_image() == 1 )then do i = 2, num_images() vector[ i] = vector end do end if sync all allocate( batch( num_images()) ) call segment( 1, mat_size, num_images(), batch) allocate( rows( mat_size, batch( 1)% lo: batch( 1)% hi)[ *] ) if( this_image() == 1 )then do i = 1, mat_size read( unit= input_unit, fmt= *) rows( :, batch( i)% lo: batch( i)% hi)[ i] end do end if sync all do i = batch( this_image())% lo, batch( this_image())% hi prod( i) = dot_product( vector, rows( :, i)) end do sync all if( this_image() == 1 )then do i = 1, this_image() write( unit= output_unit, fmt= *) rows[ i] end do end if stop 'normal exit in mxv' ! ---------------------------------------------------------------------- ! mxv library ! ---------------------------------------------------------------------- contains ! ---------------------------------------------------------------------- ! segment() partition a (loop) range as evenly as possible subroutine segment( low, high, nproc, subseg) ! input ( low, high), to be divided nproc ways ! output subseg=( ibgn, iend), ( 0, 0) ==> error integer, intent( in) :: low, high, nproc type( segment_t), intent( out), dimension( nproc) :: subseg ! local data integer :: quot, rem, cnt ! segment() continue ! get size of segment cnt = high - low + 1 ! detect nonsense if( low >= high .or. nproc < 1 )then subseg( 1) = segment_t( 0, 0) return ! detect no-op elseif( nproc == 1 )then subseg( 1) = segment_t( low, high) return ! detect 1-1 elseif( nproc == cnt )then subseg = (/ ( segment_t( i, i), i = low, high) /) return endif ! get remainder and quotient rem = mod( cnt, nproc) quot = cnt / nproc ! if nonzero remainder, first rem segments will be one greater if( rem /= 0 ) quot = quot + 1 ! first range subseg( 1) = segment_t( low, low + quot - 1) ! loop thru segments (if needed) do i = 2, nproc-1 ! set first subseg( i)% lo = subseg( i - 1)% lo + quot rem = rem - 1 ! after first rem segments, reset for rest of segments if( rem == 0 ) quot = quot - 1 ! set last subseg( i)% hi = subseg( i - 1)% hi + quot enddo ! set up last segment subseg( nproc) = segment_t( subseg( nproc - 1)% hi + 1, high) ! having partitioned the original segment nproc ways as fairly as possible return ! segment() end subroutine segment ! ---------------------------------------------------------------------- ! mxv ! $Id$ ! ********************************************************************** ! eof end program mxv Day-III/03-mxv/parfunc.fpp100777 0 0 227372 12000002224 10554 0! bof ! ********************************************************************** ! Fortran 95 module parallel_functions ! ********************************************************************** ! Source Control Strings ! $Source$ ! $Revision$ ! $State$ ! $Date$ ! ********************************************************************** ! Copyright 2000 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! routines useful with vector and parallel programs ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! parallel_functions routines useful in parallel computing ! ********************************************************************** ! parallel_functions types ! type segment_t integers( [ lo, hi]) ! type tile_t segment_t x segment_t ! type block_t tile_t x segment_t ! type accumulator_t sum-by-magnitude accumulator ! parallel_functions library ! segment() divide a contiguous 1d range as evenly as possible ! tile() divide a contiguous 2d range as evenly as possible ! block() divide a contiguous 3d range as evenly as possible ! smag_zero() zeros accumulator ! smag_add() add to accumulator sorted by magnitude for reals ! smag_sum() sum of accumulator sorted by magnitude for reals ! permute() permute an (index) array (of integers) randomly ! vector_index() an array of constant stride index values for integers ! cycle_index() an array of indices divided cyclically nproc ways for integers ! shuffle_index() an array of indices shuffled nproc ways for integers ! prng_next() ! prng_vector() ! prng_restrt() ! prng_chkpnt() parallel random number generator ! cvmgt() vector merge ! cvmgp() ! cvmgm() ! cvmgz() ! cvmgn() ! bit_size() for segment_t, tile_t, block_t, accumulator_t ! swap() for segment_t, tile_t, block_t, accumulator_t ! ********************************************************************** ! parallel_functions module parallel_functions ! ********************************************************************** ! use standard parameterization of processor dependencies use standard_types ! a basic set of utility and computational routines use standard_functions ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), parameter :: parallel_functions_rcs_source = & '$Source$' character( len= *), parameter :: parallel_functions_rcs_revision = & '$Revision$' character( len= *), parameter :: parallel_functions_rcs_state = & '$State$' character( len= *), parameter :: parallel_functions_rcs_date = & '$Date$' ! ********************************************************************** ?? include 'coco.inc' ! ********************************************************************** ! parallel_functions types ! ********************************************************************** ! 1-d segment_t type :: segment_t ! seg_i = [ low, high] integer :: i_lo ! low integer :: i_hi ! high end type segment_t ! ********************************************************************** ! 2-d tile_t = segment_t x segment_t type :: tile_t ! ( seg_i, seg_j) integer :: i_lo ! low integer :: i_hi ! high integer :: j_lo ! j_lo integer :: j_hi ! j_hi end type tile_t ! ********************************************************************** ! 3-d block_t = segment_t x segment_t x segment_t type :: block_t ! ( seg_i, seg_j, seg_k) integer :: i_lo ! low integer :: i_hi ! high integer :: j_lo ! j_lo integer :: j_hi ! j_hi integer :: k_lo ! k_lo integer :: k_hi ! k_hi end type block_t ! ********************************************************************** ! library ! ********************************************************************** ! declare interfaces for permute() function public :: permute ?? if( byte_k )then private :: byte_permute ?? endif ?? if( short_k )then private :: short_permute ?? endif ?? if( int_k )then private :: int_permute ?? endif ?? if( long_k )then private :: long_permute ?? endif interface permute ?? if( byte_k )then module procedure byte_permute ?? endif ?? if( short_k )then module procedure short_permute ?? endif ?? if( int_k )then module procedure int_permute ?? endif ?? if( long_k )then module procedure long_permute ?? endif end interface ! declare interfaces for smag_sum() function public :: smag_sum ?? if( single_k )then private :: single_smag_sum ?? endif ?? if( double_k )then private :: double_smag_sum ?? endif ?? if( quad_k )then private :: quad_smag_sum ?? endif interface smag_sum ?? if( single_k )then module procedure single_smag_sum ?? endif ?? if( double_k )then module procedure double_smag_sum ?? endif ?? if( quad_k )then module procedure quad_smag_sum ?? endif end interface ! declare interfaces for vector_index() function public :: vector_index ?? if( byte_k )then private :: byte_vector_index ?? endif ?? if( short_k )then private :: short_vector_index ?? endif ?? if( int_k )then private :: int_vector_index ?? endif ?? if( long_k )then private :: long_vector_index ?? endif interface vector_index ?? if( byte_k )then module procedure byte_vector_index ?? endif ?? if( short_k )then module procedure short_vector_index ?? endif ?? if( int_k )then module procedure int_vector_index ?? endif ?? if( long_k )then module procedure long_vector_index ?? endif end interface ! declare interfaces for cyclic_index() function public :: cyclic_index ?? if( byte_k )then private :: byte_cyclic_index ?? endif ?? if( short_k )then private :: short_cyclic_index ?? endif ?? if( int_k )then private :: int_cyclic_index ?? endif ?? if( long_k )then private :: long_cyclic_index ?? endif interface cyclic_index ?? if( byte_k )then module procedure byte_cyclic_index ?? endif ?? if( short_k )then module procedure short_cyclic_index ?? endif ?? if( int_k )then module procedure int_cyclic_index ?? endif ?? if( long_k )then module procedure long_cyclic_index ?? endif end interface ! declare interfaces for shuffle_index() function public :: shuffle_index ?? if( byte_k )then private :: byte_shuffle_index ?? endif ?? if( short_k )then private :: short_shuffle_index ?? endif ?? if( int_k )then private :: int_shuffle_index ?? endif ?? if( long_k )then private :: long_shuffle_index ?? endif interface shuffle_index ?? if( byte_k )then module procedure byte_shuffle_index ?? endif ?? if( short_k )then module procedure short_shuffle_index ?? endif ?? if( int_k )then module procedure int_shuffle_index ?? endif ?? if( long_k )then module procedure long_shuffle_index ?? endif end interface ! ********************************************************************** ! declare interfaces for cvmgt() functions public :: cvmgt ?? if( byte_k )then private :: byte_cvmgt ?? endif ?? if( short_k )then private :: short_cvmgt ?? endif ?? if( int_k )then private :: int_cvmgt ?? endif ?? if( long_k )then private :: long_cvmgt ?? endif ?? if( single_k )then private :: single_cvmgt ?? endif ?? if( double_k )then private :: double_cvmgt ?? endif ?? if( quad_k )then private :: quad_cvmgt ?? endif ?? if( l_byte_k )then private :: l_byte_cvmgt ?? endif ?? if( l_short_k )then private :: l_short_cvmgt ?? endif ?? if( l_int_k )then private :: l_int_cvmgt ?? endif ?? if( l_long_k )then private :: l_long_cvmgt ?? endif ?? if( single_k )then private :: single_complex_cvmgt ?? endif ?? if( double_k )then private :: double_complex_cvmgt ?? endif ?? if( quad_k )then private :: quad_complex_cvmgt ?? endif interface cvmgt ?? if( byte_k )then module procedure byte_cvmgt ?? endif ?? if( short_k )then module procedure short_cvmgt ?? endif ?? if( int_k )then module procedure int_cvmgt ?? endif ?? if( long_k )then module procedure long_cvmgt ?? endif ?? if( single_k )then module procedure single_cvmgt ?? endif ?? if( double_k )then module procedure double_cvmgt ?? endif ?? if( quad_k )then module procedure quad_cvmgt ?? endif ?? if( l_byte_k )then module procedure l_byte_cvmgt ?? endif ?? if( l_short_k )then module procedure l_short_cvmgt ?? endif ?? if( l_int_k )then module procedure l_int_cvmgt ?? endif ?? if( l_long_k )then module procedure l_long_cvmgt ?? endif ?? if( single_k )then module procedure single_complex_cvmgt ?? endif ?? if( double_k )then module procedure double_complex_cvmgt ?? endif ?? if( quad_k )then module procedure quad_complex_cvmgt ?? endif end interface ! declare interfaces for cvmgp() functions public :: cvmgp ?? if( byte_k )then private :: byte_cvmgp ?? endif ?? if( short_k )then private :: short_cvmgp ?? endif ?? if( int_k )then private :: int_cvmgp ?? endif ?? if( long_k )then private :: long_cvmgp ?? endif ?? if( single_k )then private :: single_cvmgp ?? endif ?? if( double_k )then private :: double_cvmgp ?? endif ?? if( quad_k )then private :: quad_cvmgp ?? endif interface cvmgp ?? if( byte_k )then module procedure byte_cvmgp ?? endif ?? if( short_k )then module procedure short_cvmgp ?? endif ?? if( int_k )then module procedure int_cvmgp ?? endif ?? if( long_k )then module procedure long_cvmgp ?? endif ?? if( single_k )then module procedure single_cvmgp ?? endif ?? if( double_k )then module procedure double_cvmgp ?? endif ?? if( quad_k )then module procedure quad_cvmgp ?? endif end interface ! declare interfaces for cvmgm() functions public :: cvmgm ?? if( byte_k )then private :: byte_cvmgm ?? endif ?? if( short_k )then private :: short_cvmgm ?? endif ?? if( int_k )then private :: int_cvmgm ?? endif ?? if( long_k )then private :: long_cvmgm ?? endif ?? if( single_k )then private :: single_cvmgm ?? endif ?? if( double_k )then private :: double_cvmgm ?? endif ?? if( quad_k )then private :: quad_cvmgm ?? endif interface cvmgm ?? if( byte_k )then module procedure byte_cvmgm ?? endif ?? if( short_k )then module procedure short_cvmgm ?? endif ?? if( int_k )then module procedure int_cvmgm ?? endif ?? if( long_k )then module procedure long_cvmgm ?? endif ?? if( single_k )then module procedure single_cvmgm ?? endif ?? if( double_k )then module procedure double_cvmgm ?? endif ?? if( quad_k )then module procedure quad_cvmgm ?? endif end interface ! declare interfaces for cvmgz() functions public :: cvmgz ?? if( byte_k )then private :: byte_cvmgz ?? endif ?? if( short_k )then private :: short_cvmgz ?? endif ?? if( int_k )then private :: int_cvmgz ?? endif ?? if( long_k )then private :: long_cvmgz ?? endif ?? if( single_k )then private :: single_cvmgz ?? endif ?? if( double_k )then private :: double_cvmgz ?? endif ?? if( quad_k )then private :: quad_cvmgz ?? endif ?? if( single_k )then private :: single_complex_cvmgz ?? endif ?? if( double_k )then private :: double_complex_cvmgz ?? endif ?? if( quad_k )then private :: quad_complex_cvmgz ?? endif interface cvmgz ?? if( byte_k )then module procedure byte_cvmgz ?? endif ?? if( short_k )then module procedure short_cvmgz ?? endif ?? if( int_k )then module procedure int_cvmgz ?? endif ?? if( long_k )then module procedure long_cvmgz ?? endif ?? if( single_k )then module procedure single_cvmgz ?? endif ?? if( double_k )then module procedure double_cvmgz ?? endif ?? if( quad_k )then module procedure quad_cvmgz ?? endif ?? if( single_k )then module procedure single_complex_cvmgz ?? endif ?? if( double_k )then module procedure double_complex_cvmgz ?? endif ?? if( quad_k )then module procedure quad_complex_cvmgz ?? endif end interface ! declare interfaces for cvmgn() functions public :: cvmgn ?? if( byte_k )then private :: byte_cvmgn ?? endif ?? if( short_k )then private :: short_cvmgn ?? endif ?? if( int_k )then private :: int_cvmgn ?? endif ?? if( long_k )then private :: long_cvmgn ?? endif ?? if( single_k )then private :: single_cvmgn ?? endif ?? if( double_k )then private :: double_cvmgn ?? endif ?? if( quad_k )then private :: quad_cvmgn ?? endif ?? if( single_k )then private :: single_complex_cvmgn ?? endif ?? if( double_k )then private :: double_complex_cvmgn ?? endif ?? if( quad_k )then private :: quad_complex_cvmgn ?? endif interface cvmgn ?? if( byte_k )then module procedure byte_cvmgn ?? endif ?? if( short_k )then module procedure short_cvmgn ?? endif ?? if( int_k )then module procedure int_cvmgn ?? endif ?? if( long_k )then module procedure long_cvmgn ?? endif ?? if( single_k )then module procedure single_cvmgn ?? endif ?? if( double_k )then module procedure double_cvmgn ?? endif ?? if( quad_k )then module procedure quad_cvmgn ?? endif ?? if( single_k )then module procedure single_complex_cvmgn ?? endif ?? if( double_k )then module procedure double_complex_cvmgn ?? endif ?? if( quad_k )then module procedure quad_complex_cvmgn ?? endif end interface ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! parallel_functions ! ********************************************************************** ! segment() partition a (loop) range as evenly as possible subroutine segment( low, high, nproc, subseg) ! input ( low, high), to be divided nproc ways ! output subseg=( ibgn, iend), ( 0, 0) ==> error integer, intent( in) :: low, high, nproc type( segment_t), intent( out), dimension( nproc) :: subseg ! local data integer :: quot, rem, cnt ! segment() continue ! segment() ! get size of segment cnt = high - low + 1 ! size of range ! detect nonsense if( low >= high .or. nproc < 1 )then ! range or processor number subseg( 1) = segment_t( 0, 0) ! signal error return ! detect no-op elseif( nproc == 1 )then ! one processor subseg( 1) = segment_t( low, high) ! only range is low..high return ! detect 1-1 elseif( nproc == cnt )then ! one processor, one loop index subseg = (/ ( subseg_t( i, i), i = low, high) /) return endif ! get remainder and quotient rem = cnt .mod. nproc quot = cnt / nproc ! if nonzero remainder, first rem segments will be one greater if( rem /= 0 ) quot = quot + 1 ! divide evenly? ! first range subseg( 1) = segment_t( low, low + quot - 1) ! loop thru segments (if needed) do i = 2, nproc-1 ! if nproc > 2 ! set first subseg( i)%i_lo = subseg( i-1)%i_lo + quot rem = rem - 1 ! decrement counter ! after first rem segments, reset for rest of segments if( rem == 0 ) quot = quot - 1 ! rest are one smaller ! set last subseg( i)%i_hi = subseg( i-1)%i_hi + quot enddo ! set up last segment subseg( nproc) = segment_t( subseg( nproc-1)%i_hi + 1, high) ! having partitioned the original segment nproc ways as fairly as possible return ! segment() ! segment() end subroutine segment ! ********************************************************************** ! tile() partition a 2-d (loop nest) range as evenly as possible subroutine tile( lo1, hi1, lo2, hi2, np1, np2, tiles) integer, intent( in) :: lo1, hi1, lo2, hi2, np1, np2 type( tile_t), intent( out), dimension( np1, np2) :: tiles ! segs along 1, segs along 2 type( segment_t), dimension( np1) :: i_segs type( segment_t), dimension( np2) :: j_segs ! tile() continue ! tile() call segment( lo1, hi1, np1, i_segs) call segment( lo2, hi2, np2, j_segs) do i = 1, np1 do j = 1, np2 tiles( i, j) = tile_t( i_segs(i)%i_lo, i_segs(i)%i_hi, & j_segs(j)%i_lo, j_segs(j)%i_hi) enddo enddo return ! tile() ! tile() end subroutine tile ! ********************************************************************** ! block() partition a 3-d (loop nest) range as evenly as possible subroutine block( lo1, hi1, lo2, hi2, lo3, hi3, np1, np2, np3, blks) integer, intent( in) :: lo1, hi1, lo2, hi2, lo3, hi3, np1, np2, np3 type( block_t), intent( out), dimension( np1, np2, np3) :: blks ! segs along 1, segs along 2, segs along 3 type( segment_t), dimension( np1) :: i_segs type( segment_t), dimension( np2) :: j_segs type( segment_t), dimension( np3) :: k_segs ! block() continue ! block() call segment( lo1, hi1, np1, i_segs) call segment( lo2, hi2, np2, j_segs) call segment( lo3, hi3, np3, k_segs) do i = 1, np1 do j = 1, np2 do k = 1, np3 blks( i, j) = block_t( i_segs(i)%i_lo, i_segs(i)%i_hi, & j_segs(j)%i_lo, j_segs(j)%i_hi, & k_segs(k)%i_lo, k_segs(k)%i_hi) enddo enddo enddo return ! block() ! block() end subroutine block ! ********************************************************************** ! byte_permute(): permute for kind byte ! ********************************************************************** ! permute() permute an array of integers ?? if( byte_k )then ! ********************************************************************** ! byte_permute(): permute for kind byte subroutine byte_permute( n, narr) integer( kind= byte_k), intent( in) :: n integer( kind= byte_k), dimension( n), intent( inout) :: narr ! local data real( kind= single_k), dimension( n) :: ra integer( kind= int_k) :: i, ir, j, l real( kind= single_k) :: rra integer( kind= byte_k) :: rnarr ! byte_permute() continue ! permute() ! set up array ra to hold random numbers call random_number( ra) ! start sorting if( n < 2 ) return l = n/2 + 1 ir = n 10 continue if( l > 1 )then l = l - 1 rra = ra( l) rnarr = narr( l) else rra = ra( ir) rnarr = narr( ir) ra( ir) = ra( 1) narr( ir) = narr( 1) ir = ir - 1 if( ir == 1 )then ra( 1) = rra narr( 1) = rnarr return endif endif i = l j = l + l 20 continue if( j <= ir )then if( j < ir )then if( ra( j) < ra( j+1) ) j = j + 1 endif if( rra < ra( j) )then ra( i) = ra( j) narr( i) = narr( j) i = j j = j + j else j = ir + 1 endif goto 20 endif ra( i) = rra narr( i) = rnarr goto 10 ! byte_permute() end subroutine byte_permute ?? endif ?? if( short_k )then ! ********************************************************************** ! short_permute(): permute for kind short subroutine short_permute( n, narr) integer( kind= short_k), intent( in) :: n integer( kind= short_k), dimension( n), intent( inout) :: narr ! local data real( kind= single_k), dimension( n) :: ra integer( kind= int_k) :: i, ir, j, l real( kind= single_k) :: rra integer( kind= short_k) :: rnarr ! short_permute continue ! permute() ! set up array ra to hold random numbers call random_number( ra) ! start sorting if( n < 2 ) return l = n/2 + 1 ir = n 10 continue if( l > 1 )then l = l - 1 rra = ra( l) rnarr = narr( l) else rra = ra( ir) rnarr = narr( ir) ra( ir) = ra( 1) narr( ir) = narr( 1) ir = ir - 1 if( ir == 1 )then ra( 1) = rra narr( 1) = rnarr return endif endif i = l j = l + l 20 continue if( j <= ir )then if( j < ir )then if( ra( j) < ra( j+1) ) j = j + 1 endif if( rra < ra( j) )then ra( i) = ra( j) narr( i) = narr( j) i = j j = j + j else j = ir + 1 endif goto 20 endif ra( i) = rra narr( i) = rnarr goto 10 ! short_permute() end subroutine short_permute ?? endif ?? if( int_k )then ! ********************************************************************** ! int_permute(): permute for kind int subroutine int_permute( n, narr) integer( kind= int_k), intent( in) :: n integer( kind= int_k), dimension( n), intent( inout) :: narr ! local data real( kind= single_k), dimension( n) :: ra integer( kind= int_k) :: i, ir, j, l real( kind= single_k) :: rra integer( kind= int_k) :: rnarr ! int_permute() continue ! permute() ! set up array ra to hold random numbers call random_number( ra) ! start sorting if( n < 2 ) return l = n/2 + 1 ir = n 10 continue if( l > 1 )then l = l - 1 rra = ra( l) rnarr = narr( l) else rra = ra( ir) rnarr = narr( ir) ra( ir) = ra( 1) narr( ir) = narr( 1) ir = ir - 1 if( ir == 1 )then ra( 1) = rra narr( 1) = rnarr return endif endif i = l j = l + l 20 continue if( j <= ir )then if( j < ir )then if( ra( j) < ra( j+1) ) j = j + 1 endif if( rra < ra( j) )then ra( i) = ra( j) narr( i) = narr( j) i = j j = j + j else j = ir + 1 endif goto 20 endif ra( i) = rra narr( i) = rnarr goto 10 ! int_permute() end subroutine int_permute ?? endif ?? if( long_k )then ! ********************************************************************** ! long_permute(): permute for kind int subroutine long_permute( n, narr) integer( kind= long_k), intent( in) :: n integer( kind= long_k), dimension( n), intent( inout) :: narr ! local data real( kind= single_k), dimension( n) :: ra integer( kind= long_k) :: i, ir, j, l real( kind= single_k) :: rra integer( kind= long_k) :: rnarr ! long_permute() continue ! permute() ! set up array ra to hold random numbers call random_number( ra) ! start sorting if( n < 2 ) return l = n/2 + 1 ir = n 10 continue if( l > 1 )then l = l - 1 rra = ra( l) rnarr = narr( l) else rra = ra( ir) rnarr = narr( ir) ra( ir) = ra( 1) narr( ir) = narr( 1) ir = ir - 1 if( ir == 1 )then ra( 1) = rra narr( 1) = rnarr return endif endif i = l j = l + l 20 continue if( j <= ir )then if( j < ir )then if( ra( j) < ra( j+1) ) j = j + 1 endif if( rra < ra( j) )then ra( i) = ra( j) narr( i) = narr( j) i = j j = j + j else j = ir + 1 endif goto 20 endif ra( i) = rra narr( i) = rnarr goto 10 ! long_permute() end subroutine long_permute ?? endif ! ********************************************************************** ! smag_sum(): real summation sorted by magnitude ?? if( single_k )then ! ********************************************************************** ! single_smag_sum(): smag_sum for kind single subroutine single_smag_sum( total, addend, delta) real( kind= single_k), intent( out), optional :: total real( kind= single_k), intent( in) :: addend real( kind= single_k), intent( out), optional :: delta ! local data real( kind= single_k), & dimension( minexponent( 1._single_k): maxexponent( 1._single_k)), & save :: accumulator = 0._single_k real( kind= single_k) :: o_sum real( kind= single_k), save :: last_sum = 0._single_k ! single_smag_sum() continue ! smag_sum() ! first, update accumulator accumulator( exponent( addend) ) = & accumulator( exponent( addend) ) + addend ! calculate ordered sum if total or delta are needed must_sum: if( present( total) .or. present( delta) )then o_sum = 0._single_k ! compute sum in increasing exponent order ordered_sum: do i = minexponent( 1._single_k), maxexponent( 1._single_k) o_sum = o_sum + accumulator( i) end do ordered_sum ! report total output_total: if( present( total) )then total = o_sum ! return value requested endif output_total ! report delta and save sum output_delta: if( present( delta) )then delta = o_sum - last_sum ! return value requested last_sum = o_sum ! update for next time endif output_delta endif must_sum return ! smag_sum() ! single_smag_sum() end subroutine single_smag_sum ?? endif ?? if( double_k )then ! ********************************************************************** ! double_smag_sum(): smag_sum for kind double subroutine double_smag_sum( total, addend, delta) real( kind= double_k), intent( out), optional :: total real( kind= double_k), intent( in) :: addend real( kind= double_k), intent( out), optional :: delta ! local data real( kind= double_k), & dimension( minexponent( 1._double_k): maxexponent( 1._double_k)), & save :: accumulator = 0._double_k real( kind= double_k) :: o_sum real( kind= double_k), save :: last_sum ! double_smag_sum() continue ! smag_sum() ! first, update accumulator accumulator( exponent( addend) ) = & accumulator( exponent( addend) ) + addend ! calculate ordered sum if total or delta are needed must_sum: if( present( total) .or. present( delta) )then o_sum = 0._double_k ! compute sum in increasing exponent order ordered_sum: do i = minexponent( 1._double_k), maxexponent( 1._double_k) o_sum = o_sum + accumulator( i) end do ordered_sum ! report total output_total: if( present( total) )then total = o_sum ! return value requested endif output_total ! report delta and save sum output_delta: if( present( delta) )then delta = o_sum - last_sum ! return value requested last_sum = o_sum ! update for next time endif output_delta endif must_sum return ! smag_sum() ! double_smag_sum() end subroutine double_smag_sum ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_smag_sum(): smag_sum for kind double subroutine quad_smag_sum( total, addend, delta) real( kind= quad_k), intent( out), optional :: total real( kind= quad_k), intent( in) :: addend real( kind= quad_k), intent( out), optional :: delta ! local data real( kind= quad_k), & dimension( minexponent( 1._quad_k): maxexponent( 1._quad_k)), & save :: accumulator = 0._quad_k real( kind= quad_k) :: o_sum real( kind= quad_k), save :: last_sum ! quad_smag_sum() continue ! smag_sum() ! first, update accumulator accumulator( exponent( addend) ) = & accumulator( exponent( addend) ) + addend ! calculate ordered sum if total or delta are needed must_sum: if( present( total) .or. present( delta) )then o_sum = 0._quad_k ! compute sum in increasing exponent order ordered_sum: do i = minexponent( 1._quad_k), maxexponent( 1._quad_k) o_sum = o_sum + accumulator( i) end do ordered_sum ! report total output_total: if( present( total) )then total = o_sum ! return value requested endif output_total ! report delta and save sum output_delta: if( present( delta) )then delta = o_sum - last_sum ! return value requested last_sum = o_sum ! update for next time endif output_delta endif must_sum return ! smag_sum() ! quad_smag_sum() end subroutine quad_smag_sum ?? endif ! ********************************************************************** ! vector_index(): return array of constant stride index values ?? if( byte_k )then ! ********************************************************************** ! byte_vector_index(): vector_index() for kind byte subroutine byte_vector_index( indx, b1, b2, b3) integer( kind= byte_k), dimension( *), intent( out) :: indx integer( kind= byte_k), intent( in) :: b1, b2 integer( kind= byte_k), intent( in), optional :: b3 ! vector_index() continue ! vector_index() if( present( b3) )then ! if have stride, use it do i = b1, b2, b3 indx( i) = i enddo else ! no stride provided, use 1 do i = b1, b2 indx( i) = i enddo endif return ! vector_index() ! byte_vector_index() end subroutine byte_vector_index ?? endif ?? if( short_k )then ! ********************************************************************** ! short_vector_index(): vector_index() for kind short subroutine short_vector_index( indx, b1, b2, b3) integer( kind= short_k), dimension( *), intent( out) :: indx integer( kind= short_k), intent( in) :: b1, b2 integer( kind= short_k), intent( in), optional :: b3 ! short_vector_index() continue ! vector_index() if( present( b3) )then ! if have stride, use it do i = b1, b2, b3 indx( i) = i enddo else ! no stride provided, use 1 do i = b1, b2 indx( i) = i enddo endif return ! vector_index() ! short_vector_index() end subroutine short_vector_index ?? endif ?? if( int_k )then ! ********************************************************************** ! int_vector_index(): vector_index() for kind int subroutine int_vector_index( indx, b1, b2, b3) integer( kind= int_k), dimension( *), intent( out) :: indx integer( kind= int_k), intent( in) :: b1, b2 integer( kind= int_k), intent( in), optional :: b3 ! int_vector_index() continue ! vector_index() if( present( b3) )then ! if have stride, use it do i = b1, b2, b3 indx( i) = i enddo else ! no stride provided, use 1 do i = b1, b2 indx( i) = i enddo endif return ! vector_index() ! int_vector_index() end subroutine int_vector_index ?? endif ?? if( long_k )then ! ********************************************************************** ! long_vector_index(): vector_index() for kind int subroutine long_vector_index( indx, b1, b2, b3) integer( kind= long_k), dimension( *), intent( out) :: indx integer( kind= long_k), intent( in) :: b1, b2 integer( kind= long_k), intent( in), optional :: b3 ! long_vector_index() continue ! vector_index() if( present( b3) )then ! if have stride, use it do i = b1, b2, b3 indx( i) = i enddo else ! no stride provided, use 1 do i = b1, b2 indx( i) = i enddo endif return ! vector_index() ! long_vector_index() end subroutine long_vector_index ?? endif ! ********************************************************************** ! cyclic_index(): return array of constant stride index values ?? if( byte_k )then ! ********************************************************************** ! byte_cyclic_index(): cyclic_index() for kind byte subroutine byte_cyclic_index( mindx, m, nproc, sindx, n) integer( kind= byte_k), intent( in) :: m, n, nproc integer( kind= byte_k), dimension( m), intent( in) :: mindx integer( kind= byte_k), dimension( n, nproc), intent( out) :: sindx ! byte_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! byte_cyclic_index() end subroutine byte_cyclic_index ?? endif ?? if( short_k )then ! ********************************************************************** ! short_cyclic_index(): cyclic_index() for kind short subroutine short_cyclic_index( mindx, m, nproc, sindx, n) integer( kind= short_k), intent( in) :: m, n, nproc integer( kind= short_k), dimension( m), intent( in) :: mindx integer( kind= short_k), dimension( n, nproc), intent( out) :: sindx ! short_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! short_cyclic_index() end subroutine short_cyclic_index ?? endif ?? if( int_k )then ! ********************************************************************** ! int_cyclic_index(): cyclic_index() for kind int subroutine int_cyclic_index( mindx, m, nproc, sindx, n) integer( kind= int_k), intent( in) :: m, n, nproc integer( kind= int_k), dimension( m), intent( in) :: mindx integer( kind= int_k), dimension( n, nproc), intent( out) :: sindx ! int_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! int_cyclic_index() end subroutine int_cyclic_index ?? endif ?? if( long_k )then ! ********************************************************************** ! long_cyclic_index(): cyclic_index() for kind int subroutine long_cyclic_index( mindx, m, nproc, sindx, n) integer( kind= long_k), intent( in) :: m, n, nproc integer( kind= long_k), dimension( m), intent( in) :: mindx integer( kind= long_k), dimension( n, nproc), intent( out) :: sindx ! long_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! long_cyclic_index() end subroutine long_cyclic_index ?? endif ! ********************************************************************** ! shuffle_index(): return array of constant stride index values ?? if( byte_k )then ! ********************************************************************** ! byte_shuffle_index(): shuffle_index() for kind byte subroutine byte_shuffle_index( mindx, m, nproc, sindx, n) integer( kind= byte_k), intent( in) :: m, n, nproc integer( kind= byte_k), dimension( m), intent( in) :: mindx integer( kind= byte_k), dimension( n, nproc), intent( out) :: sindx ! byte_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! byte_shuffle_index() end subroutine byte_shuffle_index ?? endif ?? if( short_k )then ! ********************************************************************** ! short_shuffle_index(): shuffle_index() for kind short subroutine short_shuffle_index( mindx, m, nproc, sindx, n) integer( kind= short_k), intent( in) :: m, n, nproc integer( kind= short_k), dimension( m), intent( in) :: mindx integer( kind= short_k), dimension( n, nproc), intent( out) :: sindx ! short_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! short_shuffle_index() end subroutine short_shuffle_index ?? endif ?? if( int_k )then ! ********************************************************************** ! int_shuffle_index(): shuffle_index() for kind int subroutine int_shuffle_index( mindx, m, nproc, sindx, n) integer( kind= int_k), intent( in) :: m, n, nproc integer( kind= int_k), dimension( m), intent( in) :: mindx integer( kind= int_k), dimension( n, nproc), intent( out) :: sindx ! int_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! int_shuffle_index() end subroutine int_shuffle_index ?? endif ?? if( long_k )then ! ********************************************************************** ! long_shuffle_index(): shuffle_index() for kind int subroutine long_shuffle_index( mindx, m, nproc, sindx, n) integer( kind= long_k), intent( in) :: m, n, nproc integer( kind= long_k), dimension( m), intent( in) :: mindx integer( kind= long_k), dimension( n, nproc), intent( out) :: sindx ! long_cycle_index() continue ! cycle_index() i = 0 ! initialize master index block: do j = 1, n ! block per proc proc: do k = 1, nproc ! processors i = i + 1 ! increment master index sindx( j, k) = mindx( i) ! copy to subindex if( i >= m ) exit block ! quit when too many enddo proc ! processors enddo block ! block per processor return ! cycle_index() ! long_shuffle_index() end subroutine long_shuffle_index ?? endif ! ********************************************************************** ! vector merges: merge two vectors into one by a third ! ********************************************************************** ! cvmgt(): first vector if third is true, second otherwise ?? if( byte_k )then ! ********************************************************************** ! byte_cvmgt(): cvmgt() for kind byte elemental integer( kind= byte_k) function byte_cvmgt( b1, b2, l) integer( kind= byte_k), intent( in) :: b1, b2 logical, intent( in) :: l ! byte_cvmgt() continue ! cvmgt() if( l )then byte_cvmgt = b1 else byte_cvmgt = b2 endif return ! cvmgt() ! byte_cvmgt() end function byte_cvmgt ?? endif ?? if( short_k )then ! ********************************************************************** ! short_cvmgt(): cvmgt() for kind short elemental integer( kind= short_k) function short_cvmgt( b1, b2, l) integer( kind= short_k), intent( in) :: b1, b2 logical, intent( in) :: l ! short_cvmgt() continue ! cvmgt() if( l )then short_cvmgt = b1 else short_cvmgt = b2 endif return ! cvmgt() ! short_cvmgt() end function short_cvmgt ?? endif ?? if( int_k )then ! ********************************************************************** ! int_cvmgt(): cvmgt() for kind int elemental integer( kind= int_k) function int_cvmgt( b1, b2, l) integer( kind= int_k), intent( in) :: b1, b2 logical, intent( in) :: l ! int_cvmgt() continue ! cvmgt() if( l )then int_cvmgt = b1 else int_cvmgt = b2 endif return ! cvmgt() ! int_cvmgt() end function int_cvmgt ?? endif ?? if( long_k )then ! ********************************************************************** ! long_cvmgt(): cvmgt() for kind int elemental integer( kind= long_k) function long_cvmgt( b1, b2, l) integer( kind= long_k), intent( in) :: b1, b2 logical, intent( in) :: l ! long_cvmgt() continue ! cvmgt() if( l )then long_cvmgt = b1 else long_cvmgt = b2 endif return ! cvmgt() ! long_cvmgt() end function long_cvmgt ?? endif ?? if( single_k )then ! ********************************************************************** ! single_cvmgt(): cvmgt() for kind single elemental real( kind= single_k) function single_cvmgt( b1, b2, l) real( kind= single_k), intent( in) :: b1, b2 logical, intent( in) :: l ! single_cvmgt() continue ! cvmgt() if( l )then single_cvmgt = b1 else single_cvmgt = b2 endif return ! cvmgt() ! single_cvmgt() end function single_cvmgt ?? endif ?? if( double_k )then ! ********************************************************************** ! double_cvmgt(): cvmgt() for kind double elemental real( kind= double_k) function double_cvmgt( b1, b2, l) real( kind= double_k), intent( in) :: b1, b2 logical, intent( in) :: l ! double_cvmgt() continue ! cvmgt() if( l )then double_cvmgt = b1 else double_cvmgt = b2 endif return ! cvmgt() ! double_cvmgt() end function double_cvmgt ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_cvmgt(): cvmgt() for kind double elemental real( kind= quad_k) function quad_cvmgt( b1, b2, l) real( kind= quad_k), intent( in) :: b1, b2 logical, intent( in) :: l ! quad_cvmgt() continue ! cvmgt() if( l )then quad_cvmgt = b1 else quad_cvmgt = b2 endif return ! cvmgt() ! quad_cvmgt() end function quad_cvmgt ?? endif ?? if( l_byte_k )then ! ********************************************************************** ! l_byte_cvmgt(): cvmgt() for kind space elemental logical( kind= l_byte_k) function l_byte_cvmgt( b1, b2, l) logical( kind= l_byte_k), intent( in) :: b1, b2 logical, intent( in) :: l ! l_byte_cvmgt() continue ! cvmgt() if( l )then space_cvmgt = b1 else space_cvmgt = b2 endif return ! cvmgt() ! l_byte_cvmgt() end function l_byte_cvmgt ?? endif ?? if( l_short_k )then ! ********************************************************************** ! l_short_cvmgt(): cvmgt() for kind space elemental logical( kind= l_short_k) function l_short_cvmgt( b1, b2, l) logical( kind= l_short_k), intent( in) :: b1, b2 logical, intent( in) :: l ! l_short_cvmgt() continue ! cvmgt() if( l )then space_cvmgt = b1 else space_cvmgt = b2 endif return ! cvmgt() ! l_short_cvmgt() end function l_short_cvmgt ?? endif ?? if( l_int_k )then ! ********************************************************************** ! l_int_cvmgt(): cvmgt() for kind space elemental logical( kind= l_int_k) function l_int_cvmgt( b1, b2, l) logical( kind= l_int_k), intent( in) :: b1, b2 logical, intent( in) :: l ! l_int_cvmgt() continue ! cvmgt() if( l )then space_cvmgt = b1 else space_cvmgt = b2 endif return ! cvmgt() ! l_int_cvmgt() end function l_int_cvmgt ?? endif ?? if( l_long_k )then ! ********************************************************************** ! l_long_cvmgt(): cvmgt() for kind l_long elemental logical( kind= l_long_k) function l_long_cvmgt( b1, b2, l) logical( kind= l_long_k), intent( in) :: b1, b2 logical( kind= l_int_k), intent( in) :: l ! long_cvmgt() continue ! cvmgt() if( l )then l_long_cvmgt = b1 else l_long_cvmgt = b2 endif return ! cvmgt() ! l_long_cvmgt() end function l_long_cvmgt ?? endif ?? if( single_k )then ! ********************************************************************** ! single_complex_cvmgt(): cvmgt() for kind single_complex elemental complex( kind= single_k) function single_complex_cvmgt( b1, b2, l) complex( kind= single_k), intent( in) :: b1, b2 logical, intent( in) :: l ! single_complex_cvmgt() continue ! cvmgt() if( l )then single_complex_cvmgt = b1 else single_complex_cvmgt = b2 endif return ! cvmgt() ! single_complex_cvmgt() end function single_complex_cvmgt ?? endif ?? if( double_k )then ! ********************************************************************** ! double_complex_cvmgt(): cvmgt() for kind double_complex elemental complex( kind= double_k) function double_complex_cvmgt( b1, b2, l) complex( kind= double_k), intent( in) :: b1, b2 logical, intent( in) :: l ! double_complex_cvmgt() continue ! cvmgt() if( l )then double_complex_cvmgt = b1 else double_complex_cvmgt = b2 endif return ! cvmgt() ! double_complex_cvmgt() end function double_complex_cvmgt ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_complex_cvmgt(): cvmgt() for kind quad_complex elemental complex( kind= quad_k) function quad_complex_cvmgt( b1, b2, l) complex( kind= quad_k), intent( in) :: b1, b2 logical, intent( in) :: l ! quad_complex_cvmgt() continue ! cvmgt() if( l )then quad_complex_cvmgt = b1 else quad_complex_cvmgt = b2 endif return ! cvmgt() ! quad_complex_cvmgt() end function quad_complex_cvmgt ?? endif ! ********************************************************************** ! cvmgp(): first vector if third is true, second otherwise ?? if( byte_k )then ! ********************************************************************** ! byte_cvmgp(): cvmgp() for kind byte elemental integer( kind= byte_k) function byte_cvmgp( b1, b2, b3) integer( kind= byte_k), intent( in) :: b1, b2, b3 ! byte_cvmgp() continue ! cvmgp() if( b3 >= 0_byte_k )then byte_cvmgp = b1 else byte_cvmgp = b2 endif return ! cvmgp() ! byte_cvmgp() end function byte_cvmgp ?? endif ?? if( short_k )then ! ********************************************************************** ! short_cvmgp(): cvmgp() for kind short elemental integer( kind= short_k) function short_cvmgp( b1, b2, b3) integer( kind= short_k), intent( in) :: b1, b2, b3 ! short_cvmgp() continue ! cvmgp() if( b3 >= 0_short_k )then short_cvmgp = b1 else short_cvmgp = b2 endif return ! cvmgp() ! short_cvmgp() end function short_cvmgp ?? endif ?? if( int_k )then ! ********************************************************************** ! int_cvmgp(): cvmgp() for kind int elemental integer( kind= int_k) function int_cvmgp( b1, b2, b3) integer( kind= int_k), intent( in) :: b1, b2, b3 ! int_cvmgp() continue ! cvmgp() if( b3 >= 0_int_k )then int_cvmgp = b1 else int_cvmgp = b2 endif return ! cvmgp() ! int_cvmgp() end function int_cvmgp ?? endif ?? if( long_k )then ! ********************************************************************** ! long_cvmgp(): cvmgp() for kind int elemental integer( kind= long_k) function long_cvmgp( b1, b2, b3) integer( kind= long_k), intent( in) :: b1, b2, b3 ! long_cvmgp() continue ! cvmgp() if( b3 >= 0_long_k )then long_cvmgp = b1 else long_cvmgp = b2 endif return ! cvmgp() ! long_cvmgp() end function long_cvmgp ?? endif ?? if( single_k )then ! ********************************************************************** ! single_cvmgp(): cvmgp() for kind single elemental real( kind= single_k) function single_cvmgp( b1, b2, b3) real( kind= single_k), intent( in) :: b1, b2, b3 ! single_cvmgp() continue ! cvmgp() if( b3 >= 0._single_k )then single_cvmgp = b1 else single_cvmgp = b2 endif return ! cvmgp() ! single_cvmgp() end function single_cvmgp ?? endif ?? if( double_k )then ! ********************************************************************** ! double_cvmgp(): cvmgp() for kind double elemental real( kind= double_k) function double_cvmgp( b1, b2, b3) real( kind= double_k), intent( in) :: b1, b2, b3 ! double_cvmgp() continue ! cvmgp() if( b3 >= 0._double_k )then double_cvmgp = b1 else double_cvmgp = b2 endif return ! cvmgp() ! double_cvmgp() end function double_cvmgp ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_cvmgp(): cvmgp() for kind double elemental real( kind= quad_k) function quad_cvmgp( b1, b2, b3) real( kind= quad_k), intent( in) :: b1, b2, b3 ! quad_cvmgp() continue ! cvmgp() if( b3 >= 0._quad_k )then quad_cvmgp = b1 else quad_cvmgp = b2 endif return ! cvmgp() ! quad_cvmgp() end function quad_cvmgp ?? endif ! ********************************************************************** ! cvmgm(): first vector if third is true, second otherwise ?? if( quad_k )then ! ********************************************************************** ! byte_cvmgm(): cvmgm() for kind byte elemental integer( kind= byte_k) function byte_cvmgm( b1, b2, b3) integer( kind= byte_k), intent( in) :: b1, b2, b3 ! byte_cvmgm() continue ! cvmgm() if( b3 < 0_byte_k )then byte_cvmgm = b1 else byte_cvmgm = b2 endif return ! cvmgm() ! byte_cvmgm() end function byte_cvmgm ?? endif ?? if( short_k )then ! ********************************************************************** ! short_cvmgm(): cvmgm() for kind short elemental integer( kind= short_k) function short_cvmgm( b1, b2, b3) integer( kind= short_k), intent( in) :: b1, b2, b3 ! short_cvmgm() continue ! cvmgm() if( b3 < 0_short_k )then short_cvmgm = b1 else short_cvmgm = b2 endif return ! cvmgm() ! short_cvmgm() end function short_cvmgm ?? endif ?? if( int_k )then ! ********************************************************************** ! int_cvmgm(): cvmgm() for kind int elemental integer( kind= int_k) function int_cvmgm( b1, b2, b3) integer( kind= int_k), intent( in) :: b1, b2, b3 ! int_cvmgm() continue ! cvmgm() if( b3 < 0_int_k )then int_cvmgm = b1 else int_cvmgm = b2 endif return ! cvmgm() ! int_cvmgm() end function int_cvmgm ?? endif ?? if( long_k )then ! ********************************************************************** ! long_cvmgm(): cvmgm() for kind int elemental integer( kind= long_k) function long_cvmgm( b1, b2, b3) integer( kind= long_k), intent( in) :: b1, b2, b3 ! long_cvmgm() continue ! cvmgm() if( b3 < 0_long_k )then long_cvmgm = b1 else long_cvmgm = b2 endif return ! cvmgm() ! long_cvmgm() end function long_cvmgm ?? endif ?? if( single_k )then ! ********************************************************************** ! single_cvmgm(): cvmgm() for kind single elemental real( kind= single_k) function single_cvmgm( b1, b2, b3) real( kind= single_k), intent( in) :: b1, b2, b3 ! single_cvmgm() continue ! cvmgm() if( b3 < 0._single_k )then single_cvmgm = b1 else single_cvmgm = b2 endif return ! cvmgm() ! single_cvmgm() end function single_cvmgm ?? endif ?? if( double_k )then ! ********************************************************************** ! double_cvmgm(): cvmgm() for kind double elemental real( kind= double_k) function double_cvmgm( b1, b2, b3) real( kind= double_k), intent( in) :: b1, b2, b3 ! double_cvmgm() continue ! cvmgm() if( b3 < 0._double_k )then double_cvmgm = b1 else double_cvmgm = b2 endif return ! cvmgm() ! double_cvmgm() end function double_cvmgm ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_cvmgm(): cvmgm() for kind double elemental real( kind= quad_k) function quad_cvmgm( b1, b2, b3) real( kind= quad_k), intent( in) :: b1, b2, b3 ! quad_cvmgm() continue ! cvmgm() if( b3 < 0._quad_k )then quad_cvmgm = b1 else quad_cvmgm = b2 endif return ! cvmgm() ! quad_cvmgm() end function byte_cvmgz ?? endif ! ********************************************************************** ! cvmgz(): first vector if third is true, second otherwise ?? if( byte_k )then ! ********************************************************************** ! byte_cvmgz(): cvmgz() for kind byte elemental integer( kind= byte_k) function byte_cvmgz( b1, b2, b3) integer( kind= byte_k), intent( in) :: b1, b2, b3 ! byte_cvmgz() continue ! cvmgz() if( b3 == 0_byte_k )then byte_cvmgz = b1 else byte_cvmgz = b2 endif return ! cvmgz() ! byte_cvmgz() end function byte_cvmgz ?? endif ?? if( short_k )then ! ********************************************************************** ! short_cvmgz(): cvmgz() for kind short elemental integer( kind= short_k) function short_cvmgz( b1, b2, b3) integer( kind= short_k), intent( in) :: b1, b2, b3 ! short_cvmgz() continue ! cvmgz() if( b3 == 0_short_k )then short_cvmgz = b1 else short_cvmgz = b2 endif return ! cvmgz() ! short_cvmgz() end function short_cvmgz ?? endif ?? if( int_k )then ! ********************************************************************** ! int_cvmgz(): cvmgz() for kind int elemental integer( kind= int_k) function int_cvmgz( b1, b2, b3) integer( kind= int_k), intent( in) :: b1, b2, b3 ! int_cvmgz() continue ! cvmgz() if( b3 == 0_int_k )then int_cvmgz = b1 else int_cvmgz = b2 endif return ! cvmgz() ! int_cvmgz() end function int_cvmgz ?? endif ?? if( long_k )then ! ********************************************************************** ! long_cvmgz(): cvmgz() for kind int elemental integer( kind= long_k) function long_cvmgz( b1, b2, b3) integer( kind= long_k), intent( in) :: b1, b2, b3 ! long_cvmgz() continue ! cvmgz() if( b3 == 0_long_k )then long_cvmgz = b1 else long_cvmgz = b2 endif return ! cvmgz() ! long_cvmgz() end function long_cvmgz ?? endif ?? if( single_k )then ! ********************************************************************** ! single_cvmgz(): cvmgz() for kind single elemental real( kind= single_k) function single_cvmgz( b1, b2, b3) real( kind= single_k), intent( in) :: b1, b2, b3 ! single_cvmgz() continue ! cvmgz() if( b3 == 0._single_k )then single_cvmgz = b1 else single_cvmgz = b2 endif return ! cvmgz() ! single_cvmgz() end function single_cvmgz ?? endif ?? if( double_k )then ! ********************************************************************** ! double_cvmgz(): cvmgz() for kind double elemental real( kind= double_k) function double_cvmgz( b1, b2, b3) real( kind= double_k), intent( in) :: b1, b2, b3 ! double_cvmgz() continue ! cvmgz() if( b3 == 0._double_k )then double_cvmgz = b1 else double_cvmgz = b2 endif return ! cvmgz() ! double_cvmgz() end function double_cvmgz ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_cvmgz(): cvmgz() for kind double elemental real( kind= quad_k) function quad_cvmgz( b1, b2, b3) real( kind= quad_k), intent( in) :: b1, b2, b3 ! quad_cvmgz() continue ! cvmgz() if( b3 == 0._quad_k )then quad_cvmgz = b1 else quad_cvmgz = b2 endif return ! cvmgz() ! quad_cvmgz() end function single_complex_cvmgz ?? endif ?? if( single_k )then ! ********************************************************************** ! single_complex_cvmgz(): cvmgz() for kind single_complex elemental complex( kind= single_k) function single_complex_cvmgz( b1, b2, b3) complex( kind= single_k), intent( in) :: b1, b2, b3 ! single_complex_cvmgz() continue ! cvmgz() if( abs( b3) == 0._single_k )then single_complex_cvmgz = b1 else single_complex_cvmgz = b2 endif return ! cvmgz() ! single_complex_cvmgz() end function single_complex_cvmgz ?? endif ?? if( double_k )then ! ********************************************************************** ! double_complex_cvmgz(): cvmgz() for kind double_complex elemental complex( kind= double_k) function double_complex_cvmgz( b1, b2, b3) complex( kind= double_k), intent( in) :: b1, b2, b3 ! double_complex_cvmgz() continue ! cvmgz() if( abs( b3) == 0._double_k )then double_complex_cvmgz = b1 else double_complex_cvmgz = b2 endif return ! cvmgz() ! double_complex_cvmgz() end function quad_complex_cvmgz ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_complex_cvmgz(): cvmgz() for kind quad_complex elemental complex( kind= quad_k) function quad_complex_cvmgz( b1, b2, b3) complex( kind= quad_k), intent( in) :: b1, b2, b3 ! quad_complex_cvmgz() continue ! cvmgz() if( abs( b3) == 0._quad_k )then quad_complex_cvmgz = b1 else quad_complex_cvmgz = b2 endif return ! cvmgz() ! quad_complex_cvmgz() end function quad_complex_cvmgz ?? endif ! ********************************************************************** ! cvmgn(): first vector if third is true, second otherwise ?? if( byte_k )then ! ********************************************************************** ! byte_cvmgn(): cvmgn() for kind byte elemental integer( kind= byte_k) function byte_cvmgn( b1, b2, b3) integer( kind= byte_k), intent( in) :: b1, b2, b3 ! byte_cvmgn() continue ! cvmgn() if( b3 /= 0_byte_k )then byte_cvmgn = b1 else byte_cvmgn = b2 endif return ! cvmgn() ! byte_cvmgn() end function byte_cvmgn ?? endif ?? if( short_k )then ! ********************************************************************** ! short_cvmgn(): cvmgn() for kind short elemental integer( kind= short_k) function short_cvmgn( b1, b2, b3) integer( kind= short_k), intent( in) :: b1, b2, b3 ! short_cvmgn() continue ! cvmgn() if( b3 /= 0_short_k )then short_cvmgn = b1 else short_cvmgn = b2 endif return ! cvmgn() ! short_cvmgn() end function short_cvmgn ?? endif ?? if( int_k )then ! ********************************************************************** ! int_cvmgn(): cvmgn() for kind int elemental integer( kind= int_k) function int_cvmgn( b1, b2, b3) integer( kind= int_k), intent( in) :: b1, b2, b3 ! int_cvmgn() continue ! cvmgn() if( b3 /= 0_int_k )then int_cvmgn = b1 else int_cvmgn = b2 endif return ! cvmgn() ! int_cvmgn() end function int_cvmgn ?? endif ?? if( long_k )then ! ********************************************************************** ! long_cvmgn(): cvmgn() for kind int elemental integer( kind= long_k) function long_cvmgn( b1, b2, b3) integer( kind= long_k), intent( in) :: b1, b2, b3 ! long_cvmgn() continue ! cvmgn() if( b3 /= 0_long_k )then long_cvmgn = b1 else long_cvmgn = b2 endif return ! cvmgn() ! long_cvmgn() end function long_cvmgn ?? endif ?? if( single_k )then ! ********************************************************************** ! single_cvmgn(): cvmgn() for kind single elemental real( kind= single_k) function single_cvmgn( b1, b2, b3) real( kind= single_k), intent( in) :: b1, b2, b3 ! cvmgn() continue ! cvmgn() if( b3 /= 0._single_k )then single_cvmgn = b1 else single_cvmgn = b2 endif return ! cvmgn() ! single_cvmgn() end function single_cvmgn ?? endif ?? if( double_k )then ! ********************************************************************** ! double_cvmgn(): cvmgn() for kind double elemental real( kind= double_k) function double_cvmgn( b1, b2, b3) real( kind= double_k), intent( in) :: b1, b2, b3 ! double_cvmgn() continue ! cvmgn() if( b3 /= 0._double_k )then double_cvmgn = b1 else double_cvmgn = b2 endif return ! cvmgn() ! double_cvmgn() end function double_cvmgn ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_cvmgn(): cvmgn() for kind double elemental real( kind= quad_k) function quad_cvmgn( b1, b2, b3) real( kind= quad_k), intent( in) :: b1, b2, b3 ! quad_cvmgn() continue ! cvmgn() if( b3 /= 0._quad_k )then quad_cvmgn = b1 else quad_cvmgn = b2 endif return ! cvmgn() ! quad_cvmgn() end function quad_cvmgn ?? endif ?? if( single_k )then ! ********************************************************************** ! single_complex_cvmgn(): cvmgn() for kind single_complex elemental complex( kind= single_k) function single_complex_cvmgn( b1, b2, b3) complex( kind= single_k), intent( in) :: b1, b2, b3 ! single_complex_cvmgn() continue ! cvmgn() if( abs( b3) /= 0._single_k )then single_complex_cvmgn = b1 else single_complex_cvmgn = b2 endif return ! cvmgn() ! single_complex_cvmgn() end function single_complex_cvmgn ?? endif ?? if( double_k )then ! ********************************************************************** ! double_complex_cvmgn(): cvmgn() for kind double_complex elemental complex( kind= double_k) function double_complex_cvmgn( b1, b2, b3) complex( kind= double_k), intent( in) :: b1, b2, b3 ! double_complex_cvmgn() continue ! cvmgn() if( abs( b3) /= 0._double_k )then double_complex_cvmgn = b1 else double_complex_cvmgn = b2 endif return ! cvmgn() ! double_complex_cvmgn() end function double_complex_cvmgn ?? endif ?? if( quad_k )then ! ********************************************************************** ! quad_complex_cvmgn(): cvmgn() for kind quad_complex elemental complex( kind= quad_k) function quad_complex_cvmgn( b1, b2, b3) complex( kind= quad_k), intent( in) :: b1, b2, b3 ! quad_complex_cvmgn() continue ! cvmgn() if( abs( b3) /= 0._quad_k )then quad_complex_cvmgn = b1 else quad_complex_cvmgn = b2 endif return ! cvmgn() ! quad_complex_cvmgn() end function quad_complex_cvmgn ! ********************************************************************** ! parallel_functions ! ********************************************************************** ! $Source$ end module parallel_functions ! eof Day-III/03-mxv/stdfunc.fpp100777 0 0 152264 12000003670 10567 0! bof ! ********************************************************************** ! Fortran 95 module standard_functions ! ********************************************************************** ! Source Control Strings ! $Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $ ! ********************************************************************** ! Copyright 2009 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! adds a basic set of operators and functions to Fortran 95 programs ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dannagle@verizon.net ! or mail to 4311-G Bob Ct. ! Fairfax, VA 22030 USA ! ********************************************************************** ! standard_functions constants ! error_short_string integer encode() or decode() passed null or short string ! error_bad_base integer encode() or decode() base larger than translation table ! error_not_in_table integer decode() input character not in translation table ! standard_functions operators ! .xor. binary logicals ! .mod. binary integers, reals ! .modulo. binary integers, reals ! .gcd. binary integers ! .lcm. binary integers ! .cd. binary integers ! .cr. binary integers ! standard_functions library ! iseven() logical( integer) ! isodd() logical( integer) ! gcd() greatest common divisor integer( integer, integer) ! lcm() least common multiple integer( integer, integer) ! cd() ceiling division [ ( j+ k- 1) /k ] integer( integer, integer) ! cr() ceiling remainder [ j- k* cd() ] integer( integer, integer) ! rrint() round up with probability ( a - int( a)) or down integer( real) ! hex() string to integer ! oct() string to integer ! bin() string to integer ! hexstr() integer to string ! octstr() integer to string ! binstr() integer to string ! encode() integer to string, arbitrary base, via translate table ! decode() string to integer, arbitrary base, via translate table ! start_rng() starts the rng ! timestamp() writes a time-stamped message to a file ! pause() subroutine pause() | pause( char*(*)) | pause( integer) ! swap() for all tk ! rev_endian() for all tk size > 1 byte ! rev_bits() for all tk size = 1 byte ! get_logical_unit() a logical i/o unit number which may be opened ?? ! ******************************************************************* ?? ! preprocessor dependencies ?? include 'coco.inc' ?? ! ******************************************************************* ! ********************************************************************** module standard_functions ! ********************************************************************** ! use kind parameters use standard_types ! ********************************************************************** ! explicit declaration implicit none ! ********************************************************************** ! explicit export private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), public, parameter :: standard_functions_rcs_id = & '$Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $' ! ********************************************************************** ! standard_functions constants ! ********************************************************************** ! encode()/decode() error codes integer, public, parameter :: error_short_string = 1 integer, public, parameter :: error_bad_base = 2 integer, public, parameter :: error_not_in_table = 3 ! hex()/oct()/bin() string lengths ( note need for ceiling division! ) integer, public, parameter :: hexstr_len = bit_size( 0) / 4 integer, public, parameter :: octstr_len = bit_size( 0)/3 + 1 integer, public, parameter :: binstr_len = bit_size( 0) ! ********************************************************************** ! pause()/stop() formats character( len= *), parameter :: ps_fmt_a = '( a)' character( len= *), parameter :: ps_fmt_ai = '( a, i5.5)' character( len= *), parameter :: ps_fmt_aa = '( a, a)' ?? if( byte_k )then ! ********************************************************************** ! rev_bits masks and shift counts integer( kind= byte_k) :: bit_1 ; data bit_1 / z'01'/ integer( kind= byte_k) :: bit_2 ; data bit_2 / z'02'/ integer( kind= byte_k) :: bit_3 ; data bit_3 / z'04'/ integer( kind= byte_k) :: bit_4 ; data bit_4 / z'08'/ integer( kind= byte_k) :: bit_5 ; data bit_5 / z'10'/ integer( kind= byte_k) :: bit_6 ; data bit_6 / z'20'/ integer( kind= byte_k) :: bit_7 ; data bit_7 / z'40'/ integer( kind= byte_k) :: bit_8 ; data bit_8 / z'80'/ integer( kind= byte_k), parameter :: sh_1 = 7 integer( kind= byte_k), parameter :: sh_2 = 5 integer( kind= byte_k), parameter :: sh_3 = 3 integer( kind= byte_k), parameter :: sh_4 = 1 integer( kind= byte_k), parameter :: sh_5 = -1 integer( kind= byte_k), parameter :: sh_6 = -3 integer( kind= byte_k), parameter :: sh_7 = -5 integer( kind= byte_k), parameter :: sh_8 = -7 ?? endif ! ********************************************************************** ! standard_functions library ! ********************************************************************** ! declare specific functions implementing the .xor. operator public :: operator( .xor.) interface operator( .xor.) ?? if( l_byte_k )then module procedure l_byte_xor ?? endif ?? if( l_short_k )then module procedure l_short_xor ?? endif ?? if( l_int_k )then module procedure l_int_xor ?? endif ?? if( l_long_k )then module procedure l_long_xor ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the .mod. operator public :: operator( .mod.) interface operator( .mod.) ?? if( byte_k )then module procedure byte_mod ?? endif ?? if( short_k )then module procedure short_mod ?? endif ?? if( int_k )then module procedure int_mod ?? endif ?? if( long_k )then module procedure long_mod ?? endif ?? if( single_k )then module procedure single_mod ?? endif ?? if( double_k )then module procedure double_mod ?? endif ?? if( quad_k )then module procedure quad_mod ?? endif end interface ! declare specific functions implementing the .modulo. operator public :: operator( .modulo.) interface operator( .modulo.) ?? if( byte_k )then module procedure byte_modulo ?? endif ?? if( short_k )then module procedure short_modulo ?? endif ?? if( int_k )then module procedure int_modulo ?? endif ?? if( long_k )then module procedure long_modulo ?? endif ?? if( single_k )then module procedure single_modulo ?? endif ?? if( double_k )then module procedure double_modulo ?? endif ?? if( quad_k )then module procedure quad_modulo ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the .gcd. operator public :: operator( .gcd.) interface operator( .gcd.) ?? if( byte_k )then module procedure byte_gcd ?? endif ?? if( short_k )then module procedure short_gcd ?? endif ?? if( int_k )then module procedure int_gcd ?? endif ?? if( long_k )then module procedure long_gcd ?? endif end interface ! declare specific functions implementing the gcd() function public :: gcd interface gcd ?? if( byte_k )then module procedure byte_gcd ?? endif ?? if( short_k )then module procedure short_gcd ?? endif ?? if( int_k )then module procedure int_gcd ?? endif ?? if( long_k )then module procedure long_gcd ?? endif end interface ! declare specific functions implementing the .lcm. operator public :: operator( .lcm.) interface operator( .lcm.) ?? if( byte_k )then module procedure byte_lcm ?? endif ?? if( short_k )then module procedure short_lcm ?? endif ?? if( int_k )then module procedure int_lcm ?? endif ?? if( long_k )then module procedure long_lcm ?? endif end interface ! declare specific functions implementing the lcm() function public :: lcm interface lcm ?? if( byte_k )then module procedure byte_lcm ?? endif ?? if( short_k )then module procedure short_lcm ?? endif ?? if( int_k )then module procedure int_lcm ?? endif ?? if( long_k )then module procedure long_lcm ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the .cd. operator public :: operator( .cd.) interface operator( .cd.) ?? if( byte_k )then module procedure byte_cd ?? endif ?? if( short_k )then module procedure short_cd ?? endif ?? if( int_k )then module procedure int_cd ?? endif ?? if( long_k )then module procedure long_cd ?? endif end interface ! declare specific functions implementing the cd() function public :: cd interface cd ?? if( byte_k )then module procedure byte_cd ?? endif ?? if( short_k )then module procedure short_cd ?? endif ?? if( int_k )then module procedure int_cd ?? endif ?? if( long_k )then module procedure long_cd ?? endif end interface ! declare specific functions implementing the .cr. operator public :: operator( .cr.) interface operator( .cr.) ?? if( byte_k )then module procedure byte_cr ?? endif ?? if( short_k )then module procedure short_cr ?? endif ?? if( int_k )then module procedure int_cr ?? endif ?? if( long_k )then module procedure long_cr ?? endif end interface ! declare specific functions implementing the cr() function public :: cr interface cr ?? if( byte_k )then module procedure byte_cr ?? endif ?? if( short_k )then module procedure short_cr ?? endif ?? if( int_k )then module procedure int_cr ?? endif ?? if( long_k )then module procedure long_cr ?? endif end interface ! ********************************************************************** ! integer diagnostic functions ! ********************************************************************** ! declare specific functions implementing the iseven() function public :: iseven interface iseven ?? if( byte_k )then module procedure byte_iseven ?? endif ?? if( short_k )then module procedure short_iseven ?? endif ?? if( int_k )then module procedure int_iseven ?? endif ?? if( long_k )then module procedure long_iseven ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the isodd() function public :: isodd interface isodd ?? if( byte_k )then module procedure byte_isodd ?? endif ?? if( short_k )then module procedure short_isodd ?? endif ?? if( int_k )then module procedure int_isodd ?? endif ?? if( long_k )then module procedure long_isodd ?? endif end interface ! ********************************************************************** ! real to integer functions ! ********************************************************************** ! declare specific functions implementing the rrint() function public :: rrint interface rrint ?? if( single_k )then module procedure single_rrint ?? endif ?? if( double_k )then module procedure double_rrint ?? endif ?? if( quad_k )then module procedure quad_rrint ?? endif end interface ! ********************************************************************** ! rng starter functions ! ********************************************************************** ! declare specific function supporting generic function start_rng() public :: start_rng interface start_rng ?? if( single_k )then module procedure single_start_rng ?? endif ?? if( double_k )then module procedure double_start_rng ?? endif ?? if( quad_k )then module procedure quad_start_rng ?? endif end interface ! ********************************************************************** ! subroutines to replace pause statements ! ********************************************************************** ! declare specific subroutines supporting generic subroutine pause() public :: pause interface pause module procedure int_pause module procedure char_pause end interface ! ********************************************************************** ! subroutines to implement the swap() routine ! ********************************************************************** ! declare specific subroutines supporting swap() public :: swap interface swap ?? if( ascii_k )then module procedure ascii_character_swap ?? endif ?? if( ebcdic_k )then module procedure ebcdic_character_swap ?? endif ?? if( byte_k )then module procedure byte_integer_swap ?? endif ?? if( short_k )then module procedure short_integer_swap ?? endif ?? if( int_k )then module procedure int_integer_swap ?? endif ?? if( long_k )then module procedure long_integer_swap ?? endif ?? if( l_byte_k )then module procedure l_byte_logical_swap ?? endif ?? if( l_short_k )then module procedure l_short_logical_swap ?? endif ?? if( l_int_k )then module procedure l_int_logical_swap ?? endif ?? if( l_long_k )then module procedure l_long_logical_swap ?? endif ?? if( single_k )then module procedure single_real_swap ?? endif ?? if( double_k )then module procedure double_real_swap ?? endif ?? if( quad_k )then module procedure quad_real_swap ?? endif ?? if( single_k )then module procedure single_complex_swap ?? endif ?? if( double_k )then module procedure double_complex_swap ?? endif ?? if( quad_k )then module procedure quad_complex_swap ?? endif end interface ! ********************************************************************** ! subroutines to implement the rev_endian() routine ! ********************************************************************** ! declare specific subroutines supporting rev_endian() public :: rev_endian interface rev_endian ?? if( short_k )then module procedure short_rev_endian ?? endif ?? if( int_k )then module procedure int_rev_endian ?? endif ?? if( long_k )then module procedure long_rev_endian ?? endif ?? if( l_short_k )then module procedure l_short_rev_endian ?? endif ?? if( l_int_k )then module procedure l_int_rev_endian ?? endif ?? if( l_long_k )then module procedure l_long_rev_endian ?? endif ?? if( single_k )then module procedure single_rev_endian ?? endif ?? if( double_k )then module procedure double_rev_endian ?? endif ?? if( quad_k )then module procedure quad_rev_endian ?? endif ?? if( single_k )then module procedure single_complex_rev_endian ?? endif ?? if( double_k )then module procedure double_complex_rev_endian ?? endif ?? if( quad_k )then module procedure quad_complex_rev_endian ?? endif end interface ! ********************************************************************** ! subroutines to implement the rev_bits() routine ! ********************************************************************** ! declare specific subroutines supporting rev_bits() public :: rev_bits interface rev_bits ?? if( ascii_k )then module procedure ascii_rev_bits ?? endif ?? if( ebcdic_k )then module procedure ebcdic_rev_bits ?? endif ?? if( byte_k )then module procedure byte_rev_bits ?? endif ?? if( l_byte_k )then module procedure l_byte_rev_bits ?? endif end interface ! ********************************************************************** ! declare module procedure names public public :: bin public :: oct public :: hex public :: binstr public :: octstr public :: hexstr public :: decode public :: encode public :: get_logical_unit ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! ********************************************************************** ! define .xor. binary operator ?? text :: xor( kind) ! ********************************************************************** ! ?kind?_xor: xor() for kind ?kind? elemental logical( kind= ?kind?_k) function ?kind?_xor( l1, l2) logical( kind= ?kind?_k), intent( in) :: l1, l2 ! ?kind?_xor() continue ?kind?_xor = l1 .neqv. l2 return ! ?kind?_xor() end function ?kind?_xor ?? end text xor ?? if( l_byte_k )then ?? copy :: xor( l_byte) ?? endif ?? if( l_short_k )then ?? copy :: xor( l_short) ?? endif ?? if( l_int_k )then ?? copy :: xor( l_int) ?? endif ?? if( l_long_k )then ?? copy :: xor( l_long) ?? endif ! ********************************************************************** ! define .mod. binary operator ?? text :: mod( type, kind) ! ********************************************************************** ! ?kind?_mod(): .mod. for kind ?kind? elemental ?type?( kind= ?kind?_k) function ?kind?_mod( a, p) ?type?( kind= ?kind?_k), intent( in) :: a, p ! ?kind?_mod() continue ?kind?_mod = mod( a, p) return ! ?kind?_mod() end function ?kind?_mod ?? end text mod ?? if( byte_k )then ?? copy :: mod( integer, byte) ?? endif ?? if( short_k )then ?? copy :: mod( integer, short) ?? endif ?? if( int_k )then ?? copy :: mod( integer, int) ?? endif ?? if( long_k )then ?? copy :: mod( integer, long) ?? endif ?? if( single_k )then ?? copy :: mod( real, single) ?? endif ?? if( double_k )then ?? copy :: mod( real, double) ?? endif ?? if( quad_k )then ?? copy :: mod( real, quad) ?? endif ! ********************************************************************** ! define .modulo. binary operator ?? text :: modulo( type, kind) ! ********************************************************************** ! ?kind?_modulo(): .modulo. for kind ?kind? elemental ?type?( kind= ?kind?_k) function ?kind?_modulo( a, p) ?type?( kind= ?kind?_k), intent( in) :: a, p ! ?kind?_modulo() continue ?kind?_modulo = modulo( a, p) return ! ?kind?_modulo() end function ?kind?_modulo ?? end text modulo ?? if( byte_k )then ?? copy :: modulo( integer, byte) ?? endif ?? if( short_k )then ?? copy :: modulo( integer, short) ?? endif ?? if( int_k )then ?? copy :: modulo( integer, int) ?? endif ?? if( long_k )then ?? copy :: modulo( integer, long) ?? endif ?? if( single_k )then ?? copy :: modulo( real, single) ?? endif ?? if( double_k )then ?? copy :: modulo( real, double) ?? endif ?? if( quad_k )then ?? copy :: modulo( real, quad) ?? endif ! ********************************************************************** ! define iseven()/isodd() for integer kinds ?? text :: iseven( kind) ! ********************************************************************** ! ?kind?_iseven(): iseven() for kind ?kind? elemental logical function ?kind?_iseven( a) integer( kind= ?kind?_k), intent( in) :: a ! ?kind?_iseven() continue ?kind?_iseven = iand( a, 1_?kind?_k) == 0_?kind?_k return ! ?kind?_iseven() end function ?kind?_iseven ?? end text iseven ?? if( byte_k )then ?? copy :: iseven( byte) ?? endif ?? if( short_k )then ?? copy :: iseven( short) ?? endif ?? if( int_k )then ?? copy :: iseven( int) ?? endif ?? if( long_k )then ?? copy :: iseven( long) ?? endif ?? text :: isodd( kind) ! ********************************************************************** ! ?kind?_isodd(): isodd() for kind ?kind? elemental logical function ?kind?_isodd( a) integer( kind= ?kind?_k), intent( in) :: a ! ?kind?_isodd() continue ?kind?_isodd = iand( a, 1_?kind?_k) == 1_?kind?_k return ! ?kind?_isodd() end function ?kind?_isodd ?? end text isodd ?? if( byte_k )then ?? copy :: isodd( byte) ?? endif ?? if( short_k )then ?? copy :: isodd( short) ?? endif ?? if( int_k )then ?? copy :: isodd( int) ?? endif ?? if( long_k )then ?? copy :: isodd( long) ?? endif ! ********************************************************************** ! define gcd()/lcm() ?? text :: gcd( kind) ! ********************************************************************** ! ?kind?_gcd() gcd() for kind ?kind?_k elemental integer( kind= ?kind?_k) function ?kind?_gcd( a, b) integer( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_gcd() local integer( kind= ?kind?_k) :: a_gcd, b_gcd, rnp1, rn, rnm1 ! ?kind?_gcd() continue ! if a or b zero, abs( other) is gcd zero_a: if( a == 0_?kind?_k )then ?kind?_gcd = abs( b) return endif zero_a zero_b: if( b == 0_?kind?_k )then ?kind?_gcd = abs( a) return endif zero_b ! set |a| >= |b| ( > 0) ! r1 = a .mod. b ! r0 = b a_gcd = max( abs( a), abs( b)) b_gcd = min( abs( a), abs( b)) rn = a_gcd .mod. b_gcd rnm1 = b_gcd ! while rn /= 0 ! compute rn+1 = rn .mod. rn-1 ! gcd() = rnm1 zero_rem: do while( rn /= 0_?kind?_k) rnp1 = rnm1 .mod. rn rnm1 = rn rn = rnp1 enddo zero_rem ?kind?_gcd = rnm1 return ! ?kind?_gcd() end function ?kind?_gcd ?? end text gcd ?? if( byte_k )then ?? copy :: gcd( byte) ?? endif ?? if( short_k )then ?? copy :: gcd( short) ?? endif ?? if( int_k )then ?? copy :: gcd( int) ?? endif ?? if( long_k )then ?? copy :: gcd( long) ?? endif ! ********************************************************************** ! lcm ?? text :: lcm( kind) ! ********************************************************************** ! ?kind?_lcm() lcm() for kind= ?kind?_k elemental integer( kind= ?kind?_k) function ?kind?_lcm( a, b) integer( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_lcm() continue ?kind?_lcm = ( a* b) / gcd( a, b) return ! ?kind?_lcm() end function ?kind?_lcm ?? end text lcm ?? if( int_k )then ?? copy :: lcm( byte) ?? endif ?? if( short_k )then ?? copy :: lcm( short) ?? endif ?? if( int_k )then ?? copy :: lcm( int) ?? endif ?? if( long_k )then ?? copy :: lcm( long) ?? endif ! ********************************************************************** ! define cd()/cr() for integer kinds ?? text :: cd( kind) ! ********************************************************************** ! ?kind?_cd(): .cd., cd() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_cd( j, k) integer( kind= ?kind?_k), intent( in) :: j, k ! ?kind?_cd() continue ?kind?_cd = ( j + k - 1_?kind?_k) / k return ! ?kind?_cd() end function ?kind?_cd ?? end text cd ?? if( byte_k )then ?? copy :: cd( byte) ?? endif ?? if( short_k )then ?? copy :: cd( short) ?? endif ?? if( int_k )then ?? copy :: cd( int) ?? endif ?? if( long_k )then ?? copy :: cd( long) ?? endif ?? text :: cr( kind) ! ********************************************************************** ! ?kind?_cr(): .cr., cr() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_cr( j, k) integer( kind= ?kind?_k), intent( in) :: j, k ! ?kind?_cr() continue ?kind?_cr = j - k * cd( j, k) return ! ?kind?_cr() end function ?kind?_cr ?? end text cr ?? if( byte_k )then ?? copy :: cr( byte) ?? endif ?? if( short_k )then ?? copy :: cr( short) ?? endif ?? if( int_k )then ?? copy :: cr( int) ?? endif ?? if( long_k )then ?? copy :: cr( long) ?? endif ! ********************************************************************** ! define hex()/oct()/bin() integer from string ! ********************************************************************** ! hex() hex string to int integer function hex( hexstr, stat) character( len= *), intent( in) :: hexstr integer, optional, intent( out) :: stat ! hex() local character( len= hexstr_len) :: str integer :: istr, jloc ! hex() digits table character( len= *), parameter :: lc_digits = '0123456789abcdef' ! ********************************************************************** ! hex() continue ! make local copy of input string str = adjustl( hexstr) ! force lower case for A-F digits to_lc: do istr = 1, hexstr_len force_lc: select case( str( istr: istr)) case( 'A': 'F' ) force_lc str( istr: istr) = char( ichar( str( istr: istr)) + 32) end select force_lc enddo to_lc ! initialize for decode loop istr = 1 hex = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits, str( istr: istr)) no_hex: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char hex = 0 return endif no_hex hex = hex * 16 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! hex() end function hex ! ********************************************************************** ! oct() octal string to int integer function oct( octstr, stat) character( len= *), intent( in) :: octstr integer, optional, intent( out) :: stat ! oct() local character( len= octstr_len) :: str integer :: istr, jloc ! oct() digits table character( len= *), parameter :: lc_digits = '01234567' ! ********************************************************************** ! oct() continue ! make local copy of input string str = adjustl( octstr) ! initialize for decode loop istr = 1 oct = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits, str( istr: istr)) no_oct: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char oct = 0 return endif no_oct oct = oct * 8 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! oct() end function oct ! ********************************************************************** ! bin() binary string to int integer function bin( binstr, stat) character( len= *), intent( in) :: binstr integer, optional, intent( out) :: stat ! bin() local character( len= binstr_len) :: str integer :: istr, jloc ! bin() digits table character( len= *), parameter :: lc_digits = '01' ! ********************************************************************** ! bin() continue ! make local copy of input string str = adjustl( binstr) ! initialize for decode loop istr = 1 bin = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits( 1: 2), str( istr: istr)) no_bin: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char bin = 0 return endif no_bin bin = bin * 2 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! bin() end function bin ! ********************************************************************** ! define hexstr()/octstr()/binstr() string from integer ! ********************************************************************** ! hexstr() integer to hex string character( len= hexstr_len) function hexstr( i, lc) integer, intent( in) :: i logical, optional, intent( in) :: lc ! hexstr() digits tables character( len= *), parameter :: lc_digits = '0123456789abcdef' character( len= *), parameter :: uc_digits = '0123456789ABCDEF' ! hexstr() local character( len= len( lc_digits)) :: hex_digits integer :: hex_i, jstr, kdig logical :: hex_lc ! ********************************************************************** ! hexstr() continue ! lc argument is present lc_arg: if( present( lc) )then hex_lc = lc else lc_arg hex_lc = .true. endif lc_arg ! lower case or upper case lc_uc: if( hex_lc )then hex_digits = lc_digits else lc_uc hex_digits = uc_digits endif lc_uc ! initialize encode loop jstr = hexstr_len hexstr = ' ' hexstr( jstr: jstr) = '0' hex_i = i ! encode loop each_digit: do while( hex_i /= 0) kdig = iand( hex_i, 15) + 1 hexstr( jstr: jstr) = hex_digits( kdig: kdig) hex_i = ishft( hex_i, -4) jstr = jstr - 1 enddo each_digit hexstr = adjustl( hexstr) ! successful return return ! hexstr() end function hexstr ! ********************************************************************** ! octstr() integer to octal string character( len= octstr_len) function octstr( i) integer, intent( in) :: i ! octstr() local integer :: oct_i, jstr, kdig ! hex()/oct()/bin() digits table character( len= *), parameter :: lc_digits = '01234567' ! ********************************************************************** ! octstr() continue ! initialize encode loop jstr = octstr_len octstr = ' ' octstr( jstr: jstr) = '0' oct_i = i ! encode loop each_digit: do while( oct_i /= 0) kdig = iand( oct_i, 7) + 1 octstr( jstr: jstr) = lc_digits( kdig: kdig) oct_i = ishft( oct_i, -3) jstr = jstr - 1 enddo each_digit octstr = adjustl( octstr) ! successful return return ! octstr() end function octstr ! ********************************************************************** ! binstr() integer to binary string character( len= binstr_len) function binstr( i) integer, intent( in) :: i ! binstr() local integer :: bin_i, jstr, kdig ! hex()/oct()/bin() digits table character( len= *), parameter :: lc_digits = '01' ! ********************************************************************** ! binstr() continue ! initialize encode loop jstr = binstr_len binstr = ' ' binstr( jstr: jstr) = '0' bin_i = i ! encode loop each_digit: do while( bin_i /= 0) kdig = iand( bin_i, 1) + 1 binstr( jstr: jstr) = lc_digits( kdig: kdig) bin_i = ishft( bin_i, -1) jstr = jstr - 1 enddo each_digit binstr = adjustl( binstr) ! successful return return ! binstr() end function binstr ! ********************************************************************** ! define encode() & decode() ! ********************************************************************** ! encode(): integer to character string using translation table pure subroutine encode( str, i, ttable, stat) character( len= *), intent( out) :: str integer, intent( in) :: i character( len= *), intent( in) :: ttable integer, optional, intent( out) :: stat ! encode() local integer :: base integer :: jstr, lenstr, loci, next_char ! encode() continue ! string lengths lenstr = len( str) base = len( ttable) bad_base: if( base < 1 )then status_error: if( present( stat) )then stat = error_bad_base endif status_error return endif bad_base loci = i str = ' ' ! encode i in str next_char = lenstr + 1 ! do positive i all_chars: do while( loci > 0 ) jstr = (loci .mod. base) + 1 overflow: if( next_char > 1 )then next_char = next_char - 1 str( next_char: next_char) = ttable( jstr: jstr) elseif( next_char == 1 )then overflow str = '*' if( present( stat) ) stat = error_short_string return endif overflow loci = loci / base enddo all_chars status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! encode() end subroutine encode ! ********************************************************************** ! decode(): character string to integer using ttable pure subroutine decode( i, str, ttable, stat) integer, intent( out) :: i character( len= *), intent( in) :: str character( len= *), intent( in) :: ttable integer, optional, intent( out) :: stat ! decode() local character( len= len( str)) :: str_buff integer :: base integer :: jstr ! decode() continue ! check input str_buff = adjustl( str) base = len( ttable) i = 0 bad_base: if( base < 1 )then status_error: if( present( stat) )then stat = error_bad_base endif status_error return endif bad_base ! scan str each_char: do while( str_buff /= ' ') jstr = index( ttable, str_buff( 1: 1)) bad_char: if( jstr == substring_not_found )then i = 0 if( present( stat) ) stat = error_not_in_table return endif bad_char i = i*base + ( jstr - 1) str_buff = str_buff( 2: ) enddo each_char status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! decode() end subroutine decode ! ********************************************************************** ! rrint()- randomly round real to integer ?? text :: rrint( kind) ! ********************************************************************** ! ?kind?_rrint: rrint() for kind ?kind? integer function ?kind?_rrint( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_rrint() local real( kind= ?kind?_k) :: r integer :: i ! ?kind?_rrint() continue overflow: if( int( a) >= huge( i) )then ?kind?_rrint = huge( i) return elseif( int( a) <= -huge( i) )then overflow ?kind?_rrint = -huge( i) return endif overflow call random_number( r) ! down if close to floor, up if close to ceiling hi_lo: if( ( a - real( floor( a), kind= ?kind?_k)) <= r )then i = floor( a) else hi_lo i = ceiling( a) endif hi_lo ?kind?_rrint = i return ! ?kind?_rrint() end function ?kind?_rrint ?? end text rrint ?? if( single_k )then ?? copy :: rrint( single) ?? endif ?? if( double_k )then ?? copy :: rrint( double) ?? endif ?? if( quad_k )then ?? copy :: rrint( quad) ?? endif ! ********************************************************************** ! start_rng() for real kinds ?? text :: start_rng( kind) ! ********************************************************************** ! ?kind?_start_rng(): start_rng() for kind ?kind? subroutine ?kind?_start_rng( rngs, log_unit) ! array of random variables real( kind= ?kind?_k), dimension( :), intent( out) :: rngs ! unit to receive the seed value integer, optional, intent( in) :: log_unit ! format of the seed value character( len= *), parameter :: seed_fmt = '( a, 99i10)' ! ?kind?_start_rng() local character( len= date_len) :: date_str character( len= time_len) :: time_str integer, dimension( values_size) :: dt_values integer, dimension( :), allocatable :: rng_seed integer :: seed_size ! ?kind?_start_rng() continue call random_seed( size = seed_size) allocate( rng_seed( seed_size)) call date_and_time( date= date_str, time= time_str, values= dt_values) rng_seed( 1) = sum( dt_values * dt_values) if( seed_size > 1 ) rng_seed( 2) = sum( dt_values * (/ dt_values( 2: seed_size), dt_values( 1) /) ) if( seed_size > 2 ) rng_seed( 3) = sum( dt_values * (/ dt_values( 3: seed_size), dt_values( 1: 2) /) ) if( seed_size > 3 ) rng_seed( 4) = sum( dt_values * (/ dt_values( 4: seed_size), dt_values( 1: 3) /) ) if( seed_size > 4 ) rng_seed( 5) = sum( dt_values * (/ dt_values( 5: seed_size), dt_values( 1: 4) /) ) if( seed_size > 5 ) rng_seed( 6) = sum( dt_values * (/ dt_values( 6: seed_size), dt_values( 1: 5) /) ) if( seed_size > 6 ) rng_seed( 7) = sum( dt_values * (/ dt_values( 7: seed_size), dt_values( 1: 6) /) ) if( seed_size > 7 ) rng_seed( 8) = sum( dt_values * (/ dt_values( 8: seed_size), dt_values( 1: 7) /) ) if( seed_size > 8 ) rng_seed( 9: ) = 0 got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= seed_fmt) 'random seed is ', rng_seed else got_unit write( unit= *, fmt= seed_fmt) 'random seed is ', rng_seed end if got_unit call random_number( harvest= rngs) return ! ?kind?_start_rng() end subroutine ?kind?_start_rng ?? end text start_rng ?? if( single_k )then ?? copy :: start_rng( single) ?? endif ?? if( double_k )then ?? copy :: start_rng( double) ?? endif ?? if( quad_k )then ?? copy :: start_rng( quad) ?? endif ! ********************************************************************** ! define timestamp() ! ********************************************************************** ! timestamp(): write a timestamped message to a log file subroutine timestamp( log_unit, message) integer, intent( in), optional :: log_unit character( len= *), intent( in) :: message character( len= *), parameter :: message_fmt = '( a)' character( len= *), parameter :: slash = '/' character( len= *), parameter :: colon = ':' ! timestamp() local character( len= date_len) :: date_str character( len= time_len) :: time_str ! timestamp() continue call date_and_time( date= date_str, time= time_str) got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= message_fmt) date_str( 1: 4) // slash // date_str( 5: 6) // date_str( 7: 8) // ' ' & // time_str( 1: 2) // colon // time_str( 3: 4) // time_str( 5: 6) // '.' time_str( 7: time_len) & // trim( message) else got_unit write( unit= *, fmt= message_fmt) date_str( 1: 4) // slash // date_str( 5: 6) // date_str( 7: 8) // ' ' & // time_str( 1: 2) // colon // time_str( 3: 4) // time_str( 5: 6) // '.' time_str( 7: time_len) & // trim( message) end if got_unit return ! timestamp() end subroutine timestamp ! ---------------------------------------------------------------------- ! ********************************************************************** ! define pause() ! ********************************************************************** ! int_pause(): pause or pause n subroutine subroutine int_pause( n) integer, intent( in), optional :: n ! int_pause() continue n_arg: if( present( n) )then write( unit= *, fmt= ps_fmt_ai) ' pause: ', n else n_arg write( unit= *, fmt= ps_fmt_a) ' pause' end if n_arg read( unit= *, fmt= *) return ! int_pause() end subroutine int_pause ! ---------------------------------------------------------------------- ! char_pause(): pause 'string' subroutine subroutine char_pause( string) character( len= *), intent( in) :: string ! char_pause() continue write( unit= *, fmt= ps_fmt_aa) ' pause: ', trim( string) read( unit= *, fmt= *) return ! char_pause() end subroutine char_pause ! ********************************************************************** ! swap() ?? text :: swap( type, kind) ! ********************************************************************** ! ?kind?_?type?_swap() elemental subroutine ?kind?_?type?_swap( a, b) ?type?( kind= ?kind?_k), intent( inout) :: a, b ! ?kind?_?type?_swap() local ?type?( kind= ?kind?_k) :: t1, t2 ! ?kind?_?type?_swap() continue t1 = a t2 = b b = t1 a = t2 return ! ?kind?_?type?_swap() end subroutine ?kind?_?type?_swap ?? end text swap ?? if( ascii_k )then ?? copy :: swap( character, ascii) ?? endif ?? if( ebcdic_k )then ?? copy :: swap( character, ebcdic) ?? endif ?? if( byte_k )then ?? copy :: swap( integer, byte) ?? endif ?? if( short_k )then ?? copy :: swap( integer, short) ?? endif ?? if( int_k )then ?? copy :: swap( integer, int) ?? endif ?? if( long_k )then ?? copy :: swap( integer, long) ?? endif ?? if( l_byte_k )then ?? copy :: swap( logical, l_byte) ?? endif ?? if( l_short_k )then ?? copy :: swap( logical, l_short) ?? endif ?? if( l_int_k )then ?? copy :: swap( logical, l_int) ?? endif ?? if( l_long_k )then ?? copy :: swap( logical, l_long) ?? endif ?? if( single_k )then ?? copy :: swap( real, single) ?? endif ?? if( double_k )then ?? copy :: swap( real, double) ?? endif ?? if( quad_k )then ?? copy :: swap( real, quad) ?? endif ?? if( single_k )then ?? copy :: swap( complex, single) ?? endif ?? if( double_k )then ?? copy :: swap( complex, double) ?? endif ?? if( quad_k )then ?? copy :: swap( complex, quad) ?? endif ! ********************************************************************** ! rev_endian() ?? if( short_k )then ! ********************************************************************** ! short_rev_endian() elemental integer( kind= short_k) function short_rev_endian( a) integer( kind= short_k), intent( in) :: a ! short_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_short_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! short_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) short_rev_endian = transfer( tmp, short_rev_endian) return ! short_rev_endian() end function short_rev_endian ?? endif ?? if( int_k )then ! ---------------------------------------------------------------------- ! int_rev_endian() elemental integer( kind= int_k) function int_rev_endian( a) integer( kind= int_k), intent( in) :: a ! int_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_int_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! int_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) int_rev_endian = transfer( tmp, int_rev_endian) return ! int_rev_endian() end function int_rev_endian ?? endif ?? if( long_k )then ! ---------------------------------------------------------------------- ! long_rev_endian() elemental integer( kind= long_k) function long_rev_endian( a) integer( kind= long_k), intent( in) :: a ! long_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_long_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! long_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) long_rev_endian = transfer( tmp, long_rev_endian) return ! long_rev_endian() end function long_rev_endian ?? endif ?? if( l_short_k )then ! ---------------------------------------------------------------------- ! l_short_rev_endian() elemental logical( kind= l_short_k) function l_short_rev_endian( a) logical( kind= l_short_k), intent( in) :: a ! l_short_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_short_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_short_rev_endian = transfer( tmp, l_short_rev_endian) return ! l_short_rev_endian() end function l_short_rev_endian ?? endif ?? if( l_int_k )then ! ---------------------------------------------------------------------- ! l_int_rev_endian() elemental logical( kind= l_int_k) function l_int_rev_endian( a) logical( kind= l_int_k), intent( in) :: a ! l_int_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_int_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_int_rev_endian = transfer( tmp, l_int_rev_endian) return ! l_int_rev_endian() end function l_int_rev_endian ?? endif ?? if( l_long_k )then ! ---------------------------------------------------------------------- ! l_long_rev_endian() elemental logical( kind= l_long_k) function l_long_rev_endian( a) logical( kind= l_long_k), intent( in) :: a ! l_long_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_long_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_long_rev_endian = transfer( tmp, l_long_rev_endian) return ! l_long_rev_endian() end function l_long_rev_endian ?? endif ?? if( single_k )then ! ---------------------------------------------------------------------- ! single_rev_endian() elemental real( kind= single_k) function single_rev_endian( a) real( kind= single_k), intent( in) :: a ! single_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( csu_per_nsu) :: tmp ! single_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) single_rev_endian = transfer( tmp, single_rev_endian) return ! single_rev_endian() end function single_rev_endian ?? endif ?? if( double_k )then ! ---------------------------------------------------------------------- ! double_rev_endian() elemental real( kind= double_k) function double_rev_endian( a) real( kind= double_k), intent( in) :: a ! double_rev_endian() local integer, parameter :: num_bytes = 2 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! double_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) double_rev_endian= transfer( tmp, double_rev_endian) return ! double_rev_endian() end function double_rev_endian ?? endif ?? if( quad_k )then ! ---------------------------------------------------------------------- ! quad_rev_endian() elemental real( kind= quad_k) function quad_rev_endian( a) real( kind= quad_k), intent( in) :: a ! quad_rev_endian() local integer, parameter :: num_bytes = 4 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! quad_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) quad_rev_endian= transfer( tmp, quad_rev_endian) return ! quad_rev_endian() end function quad_rev_endian ?? endif ?? if( single_k )then ! ---------------------------------------------------------------------- ! single_complex_rev_endian() elemental complex( kind= single_k) function single_complex_rev_endian( a) complex( kind= single_k), intent( in) :: a ! single_complex_rev_endian() local integer, parameter :: num_bytes = 2 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! single_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) single_complex_rev_endian = transfer( tmp, single_complex_rev_endian) return ! single_complex_rev_endian() end function single_complex_rev_endian ?? endif ?? if( double_k )then ! ---------------------------------------------------------------------- ! double_complex_rev_endian() elemental complex( kind= double_k) function double_complex_rev_endian( a) complex( kind= double_k), intent( in) :: a ! double_complex_rev_endian() local integer, parameter :: num_bytes = 4 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! double_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) double_complex_rev_endian = transfer( tmp, double_complex_rev_endian) return ! double_complex_rev_endian() end function double_complex_rev_endian ?? endif ?? if( quad_k )then ! ---------------------------------------------------------------------- ! quad_complex_rev_endian() elemental complex( kind= quad_k) function quad_complex_rev_endian( a) complex( kind= quad_k), intent( in) :: a ! quad_complex_rev_endian() local integer, parameter :: num_bytes = 8 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! quad_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) quad_complex_rev_endian = transfer( tmp, quad_complex_rev_endian) return ! quad_complex_rev_endian() end function quad_complex_rev_endian ?? endif ! ********************************************************************** ! rev_bits() ?? if( ascii_k )then ! ********************************************************************** ! ascii_rev_bits() elemental character( kind= ascii_k) function ascii_rev_bits( c) character( len= 1, kind= ascii_k), intent( in) :: c ! ascii_rev_buts() local integer( kind= byte_k) :: loci ! ascii_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_1), sh_1)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_2), sh_2)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_3), sh_3)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_4), sh_4)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_5), sh_5)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_6), sh_6)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_7), sh_7)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_8), sh_8)) ascii_rev_bits = char( loci) return ! ascii_rev_bits() end function ascii_rev_bits ?? endif ?? if( ebcdic_k )then ! ********************************************************************** ! ebcdic_rev_bits() elemental character( kind= ebcdic_k) function ebcdic_rev_bits( c) character( len= 1, kind= ebcdic_k), intent( in) :: c ! ebcdic_rev_buts() local integer( kind= byte_k) :: loci ! ebcdic_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_1), sh_1)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_2), sh_2)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_3), sh_3)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_4), sh_4)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_5), sh_5)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_6), sh_6)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_7), sh_7)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_8), sh_8)) ebcdic_rev_bits = char( loci) return ! ebcdic_rev_bits() end function ebcdic_rev_bits ?? endif ?? if( byte_k )then ! ---------------------------------------------------------------------- ! byte_rev_bits() elemental integer( kind= byte_k) function byte_rev_bits( i) integer( kind= byte_k), intent( in) :: i ! byte_rev_buts() local integer( kind= byte_k) :: loci ! byte_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( i, bit_1), sh_1)) loci = ior( loci, ishft( iand( i, bit_2), sh_2)) loci = ior( loci, ishft( iand( i, bit_3), sh_3)) loci = ior( loci, ishft( iand( i, bit_4), sh_4)) loci = ior( loci, ishft( iand( i, bit_5), sh_5)) loci = ior( loci, ishft( iand( i, bit_6), sh_6)) loci = ior( loci, ishft( iand( i, bit_7), sh_7)) loci = ior( loci, ishft( iand( i, bit_8), sh_8)) byte_rev_bits = loci return ! rev_bits() end function byte_rev_bits ?? endif ?? if( l_byte_k )then ! ---------------------------------------------------------------------- ! l_byte_rev_bits() elemental logical( kind= l_byte_k) function l_byte_rev_bits( i) logical( kind= l_byte_k), intent( in) :: i ! l_byte_rev_buts() local integer( kind= byte_k) :: loci, locj ! l_byte_rev_bits() continue loci = 0 locj = transfer( i, loci) loci = ior( loci, ishft( iand( locj, bit_1), sh_1)) loci = ior( loci, ishft( iand( locj, bit_2), sh_2)) loci = ior( loci, ishft( iand( locj, bit_3), sh_3)) loci = ior( loci, ishft( iand( locj, bit_4), sh_4)) loci = ior( loci, ishft( iand( locj, bit_5), sh_5)) loci = ior( loci, ishft( iand( locj, bit_6), sh_6)) loci = ior( loci, ishft( iand( locj, bit_7), sh_7)) loci = ior( loci, ishft( iand( locj, bit_8), sh_8)) l_byte_rev_bits = transfer( loci, l_byte_rev_bits) return ! rev_bits() end function l_byte_rev_bits ?? endif ! ********************************************************************** ! find io unit which may be opened ! upon return: if >0, an io unit to open; else not_a_unit ! ********************************************************************** ! integer function get_logical_unit() integer function get_logical_unit( min_unit, max_unit, exclude) integer, optional, intent( in) :: min_unit integer, optional, intent( in) :: max_unit integer, optional, dimension(:), intent( in) :: exclude ! inquire return values integer :: io_stat, io_unit logical :: is_open, is_unit ! local min_unit, max_unit integer :: l_min, l_max ! get_logical_unit() continue ! prepare search limits set_min: if( present( min_unit) )then l_min = min_unit else set_min l_min = 0 endif set_min set_max: if( present( max_unit) )then l_max = max_unit else set_max l_max = huge( 0) endif set_max ! search loop io_units: do io_unit = l_min, l_max inquire( unit= io_unit, opened= is_open, exist= is_unit, iostat= io_stat) error: if( is_io_error( io_stat) )then get_logical_unit = not_a_unit return endif error ready: if( is_unit .and. (.not. is_open) )then not_list: if( present( exclude) )then on_list: if( any( io_unit == exclude) )then cycle io_units endif on_list endif not_list get_logical_unit = io_unit return endif ready enddo io_units ! none found get_logical_unit = not_a_unit return ! get_logical_unit() end function get_logical_unit ! ********************************************************************** ! standard_functions ! $Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $ ! ********************************************************************** end module standard_functions Day-III/04-Digits-Home/ 40777 0 0 0 12000033646 7546 5Day-III/04-Digits-Home/._make_digits.f90100777 0 0 10000 12000033472 12667 0Mac OS X  2TEXTR*chATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/04-Digits-Home/digits.list100777 0 0 3000 12000023614 12011 0 1111 2111 3111 4111 1211 2211 3211 4211 1311 2311 3311 4311 1411 2411 3411 4411 1121 2121 3121 4121 1221 2221 3221 4221 1321 2321 3321 4321 1421 2421 3421 4421 1131 2131 3131 4131 1231 2231 3231 4231 1331 2331 3331 4331 1431 2431 3431 4431 1141 2141 3141 4141 1241 2241 3241 4241 1341 2341 3341 4341 1441 2441 3441 4441 1112 2112 3112 4112 1212 2212 3212 4212 1312 2312 3312 4312 1412 2412 3412 4412 1122 2122 3122 4122 1222 2222 3222 4222 1322 2322 3322 4322 1422 2422 3422 4422 1132 2132 3132 4132 1232 2232 3232 4232 1332 2332 3332 4332 1432 2432 3432 4432 1142 2142 3142 4142 1242 2242 3242 4242 1342 2342 3342 4342 1442 2442 3442 4442 1113 2113 3113 4113 1213 2213 3213 4213 1313 2313 3313 4313 1413 2413 3413 4413 1123 2123 3123 4123 1223 2223 3223 4223 1323 2323 3323 4323 1423 2423 3423 4423 1133 2133 3133 4133 1233 2233 3233 4233 1333 2333 3333 4333 1433 2433 3433 4433 1143 2143 3143 4143 1243 2243 3243 4243 1343 2343 3343 4343 1443 2443 3443 4443 1114 2114 3114 4114 1214 2214 3214 4214 1314 2314 3314 4314 1414 2414 3414 4414 1124 2124 3124 4124 1224 2224 3224 4224 1324 2324 3324 4324 1424 2424 3424 4424 1134 2134 3134 4134 1234 2234 3234 4234 1334 2334 3334 4334 1434 2434 3434 4434 1144 2144 3144 4144 1244 2244 3244 4244 1344 2344 3344 4344 1444 2444 3444 4444 Day-III/04-Digits-Home/make_digits.f90100777 0 0 673 12000023500 12420 0program make_digits character( len= 1), dimension( 4), parameter :: digits_4 = [ '1', '2', '3', '4'] integer :: i, j, k, l continue do l = 1, 4 do k = 1, 4 do j = 1, 4 do i = 1, 4 write( unit= *, fmt= *) digits_4( i) // digits_4( j) // digits_4( k) // digits_4( l) end do end do end do end do stop 'normal exit in digits_home' end program make_digits Day-III/04-Digits-Home/md100777 0 0 32370 12000023564 10214 0 H__PAGEZERO(__TEXT __text__TEXT__stubs__TEXT6__stub_helper__TEXTl__cstring__TEXT88__const__TEXT @ __eh_frame__TEXT``(__DATA  __dyld__DATA 8 __nl_symbol_ptr__DATA8 8  __la_symbol_ptr__DATAH HH  __data__DATA  __common__DATA  __bss2__DATA H__LINKEDIT00"000 0(1x1h3 P 3 /usr/lib/dyldV'+9\1Oj$ * H/usr/local/gfortran/lib/libgfortran.3.dylib 8/usr/lib/libSystem.B.dylib H/usr/local/gfortran/lib/libgcc_s.1.dylib H/usr/local/gfortran/lib/libquadmath.0.dylib&1jHHH}HuHHHH9uHXASLAS%%UHAVAUATSH ~tH5H="DVE]Ѓ}EDeԃ}{EDm؃}#EDu܃}HHDžDžDžHHEHH҅t HH5H=nH҅t HH5H=@UHcHɅtH5-H=nHɅtH5rH=CHJHHHPHHHEIAHѺHƿEHH҅t HH5H=uH҅t HH5H=GHPH0H HUHEIAHѺHƿ EHH҅t HH5H=>H҅t HH5?H=HPHH HUHEIAHѺHƿwHMHHHHHkD9utH5H=-}EDu܅7D9mtH5H=}EDm؅D9etH5H=}EDeԅ9]tH5CH=n}E]Ѕ1H=bUHH}HuHUEH։*H5Ð%%%%%%%%%hRhHhA>h[4hx*h hh hLAS%Recursive call to nonrecursive procedure 'make_digits'At line 1 of file make_digits.f90make_digits.f90Index '%ld' of dimension 1 of array 'digits_4' below lower bound of %ldAt line 17 of file make_digits.f90Index '%ld' of dimension 1 of array 'digits_4' above upper bound of %ldLoop variable has been modifiedAt line 15 of file make_digits.f90At line 13 of file make_digits.f90At line 11 of file make_digits.f90At line 9 of file make_digits.f90normal exit in digits_homezRx 46 4T= 8 __    1234"UBY@dyld_stub_binderQr8rH@__gfortran_concat_stringrP@__gfortran_runtime_error_atrX@__gfortran_set_argsr`@__gfortran_set_optionsrh@__gfortran_st_writerp@__gfortran_st_write_donerx@__gfortran_stop_stringr@__gfortran_transfer_character_writer@_exit_ startK_'mainPNXArgUenvirongmh_execute_headerG_prognamel/8c]vbAAAA/<."6@F U j r z  X#<Sw} @@  dyld_stub_binding_helper__dyld_func_lookup_MAIN___options.9.1567_digits_4.1555_is_recursive.0.1540_NXArgc_NXArgv___progname__mh_execute_header_environ_mainstart__gfortran_concat_string__gfortran_runtime_error_at__gfortran_set_args__gfortran_set_options__gfortran_st_write__gfortran_st_write_done__gfortran_stop_string__gfortran_transfer_character_write_exitdyld_stub_binderDay-III/05-submodules/ 40777 0 0 0 12000033646 7620 5Day-III/05-submodules/._module.f90100777 0 0 10000 12000033472 11746 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/05-submodules/._program_use.f90100777 0 0 10000 12000033472 13004 0Mac OS X  2TEXTR*chATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/05-submodules/._submodule.f90100777 0 0 10000 12000033476 12464 0Mac OS X  2TEXTR*chATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/05-submodules/._submodule_use.f90100777 0 0 10000 12000033476 13340 0Mac OS X  2TEXTR*chATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/05-submodules/module.f90100777 0 0 3447 12000025222 11524 0! bof ! ********************************************************************** ! Fortran 2008 module color_points ! ---------------------------------------------------------------------- ! Source Control Strings ! $Id$ ! ---------------------------------------------------------------------- ! color_points description ! ---------------------------------------------------------------------- ! color_points uses ! iso_fortran_env- describes the processor ! color_points includes ! ! color_points constants ! color_points types ! color_points data ! color_points library ! ********************************************************************** ! color_points ! ---------------------------------------------------------------------- module color_points type color_point private real :: x,y integer :: color end type color_point ! Interfaces for procedures with separate ! bodies in the submodule color_points_a interface ! Destroy a color_point object module subroutine color_point_del ( p ) import :: color_point type( color_point), allocatable :: p end subroutine color_point_del ! Distance between two color_point objects real module function color_point_dist ( a, b ) import :: color_point type(color_point), intent(in) :: a, b end function color_point_dist ! Draw a color_point object module subroutine color_point_draw ( p ) import :: color_point type(color_point), intent(in) :: p end subroutine color_point_draw ! Create a color_point object module subroutine color_point_new ( p ) import :: color_point type(color_point), allocatable :: p end subroutine color_point_new end interface end module color_points Day-III/05-submodules/program_use.f90100777 0 0 1453 12000026532 12562 0program main use color_points ! "instance_count" and "inquire_palette" are not accessible here ! because they are not declared in the "color_points" module. ! "color_points_a" and "color_points_b" cannot be referenced by ! use association. ! just to demonstrate it’s possible interface draw module procedure color_point_draw end interface type(color_point) :: C_1, C_2 real :: RC ! ... ! body in color_points_a, interface in color_points call color_point_new (c_1) ! ... ! body in color_points_b, specific interface ! in color_points, generic interface here. call draw (c_1) ! ... ! body in color_points_a, interface in color_points rc = color_point_dist (c_1, c_2) ! ... ! body in color_points_a, interface in color_points call color_point_del (c_1) ! ... end program main Day-III/05-submodules/submodule.f90100777 0 0 2503 12000025652 12235 0 ! Submodule of color_points submodule ( color_points ) color_points_a integer :: instance_count = 0 ! Interface for a procedure with a separate ! body in submodule color_points_b interface module subroutine inquire_palette ( pt, pal ) use palette_stuff ! palette_stuff, especially submodules ! thereof, can reference color_points by use ! association without causing a circular ! dependence during translation because this ! use is not in the module. Furthermore, ! changes in the module palette_stuff do not ! affect the translation of color_points. type( color_point), intent( in) :: pt type( palette), intent( out) :: pal end subroutine inquire_palette end interface ! Invisible bodies for public separate module procedures ! declared in the module contains module subroutine color_point_del ( p ) type(color_point), allocatable :: p instance_count = instance_count - 1 deallocate ( p ) end subroutine color_point_del real module function color_point_dist (a,b) result(dist) type(color_point), intent(in) :: a, b dist = sqrt( (b%x - a%x)**2 + (b%y - a%y)**2 ) end function color_point_dist module subroutine color_point_new ( p ) type(color_point), allocatable :: p instance_count = instance_count + 1 allocate ( p ) end subroutine color_point_new end submodule color_points_a Day-III/05-submodules/submodule_use.f90100777 0 0 2153 12000027056 13112 0module palette_stuff type :: palette !... end type palette contains subroutine test_palette ( p ) ! Draw a color wheel using procedures from the color_points module ! This does not cause a circular dependency because ! the "use palette_stuff" that is logically within ! color_points is in the color_points_a submodule. use color_points type(palette), intent(in) :: p ! ... end subroutine test_palette end module palette_stuff ! Subsidiary**2 submodule submodule ( color_points:color_points_a ) color_points_b contains ! Invisible body for interface declared in the ancestor module module subroutine color_point_draw ( p ) use palette_stuff, only: palette type(color_point), intent(in) :: p type(palette) :: MyPalette ! ... call inquire_palette ( p, MyPalette ); ... end subroutine color_point_draw ! Invisible body for interface declared in the parent submodule module procedure inquire_palette ! ... implementation of inquire_palette end procedure inquire_palette ! not accessible from color_points_a subroutine private_stuff ! ... end subroutine private_stuff end submodule color_points_b Day-III/06-coco/ 40777 0 0 0 12000033650 6355 5Day-III/06-coco/.DS_Store100777 0 0 30004 12000024214 10151 0Bud1 unc.f9  @ @ @ @ bitfunc.f90Ilocblob bitfunc.fppIlocblobBugsIlocblobJBugsdsclboolcocoIlocblobcoco.f90Ilocblob coco.f90,vIlocblobcoco.incIlocblobJcoco.oIlocblobcoco.setIlocblob document.incIlocblob environ.f90IlocblobJ environ.fppIlocblobmake_pmIlocblob make_pm.f90Ilocblob make_pm.inIlocblobJ make_pm.logIlocblobmakefileIlocblobnext.f90Ilocblobpm.f90IlocblobJ procdep.f90Ilocblob stdfunc.f90Ilocblob stdfunc.fppIlocblobTestsIlocblob trigfunc.f90Ilocblob trigfunc.fppIlocblob typerat.f90Ilocblob typerat.fppIlocblob E DSDB ` @ @ @ typerat.f90Ilocblob typerat.fppIlocblobDay-III/06-coco/._.DS_Store100777 0 0 10000 12000033500 10356 0Mac OS X  2 ATTR;xThis resource fork intentionally left blank Day-III/06-coco/._bitfunc.fpp100777 0 0 10000 12000033500 11034 0Mac OS X  2TEXTATTR;5&com.apple.quarantinecom.apple.TextEncodingfa0001;4ec1bd1b;Safari;|com.apple.SafariUTF-8;134217984This resource fork intentionally left blank Day-III/06-coco/._document.inc100777 0 0 10000 12000033506 11212 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/06-coco/._environ.fpp100777 0 0 10000 12000033510 11063 0Mac OS X  2TEXTATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/06-coco/._makefile100777 0 0 10000 12000033514 10400 0Mac OS X  2TEXTR*chATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/06-coco/._make_pm.f90100777 0 0 10000 12000033512 10627 0Mac OS X  2ATTR;&com.apple.quarantine"5)com.apple.metadata:kMDItemDownloadedDateWZ%com.apple.metadata:kMDItemWhereFroms0001;4ec2731d;Safari;|com.apple.Safaribplist003Ar=r bplist00_+http://www.daniellnagle.com/pub/make_pm.f90 8This resource fork intentionally left blank Day-III/06-coco/._make_pm.in100777 0 0 10000 12000033512 10637 0Mac OS X  2TEXT!RchATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/06-coco/bitfunc.f90100777 0 0 301042 11740026672 10507 0! bof ! ********************************************************************** ! Fortran 95 module bit_functions ! ********************************************************************** ! Source Control Strings ! $Id: bitfunc.fpp 1.3 2003/10/03 19:28:00Z Dan Release $ ! ********************************************************************** ! Copyright 2003 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dannagle@verizon.net ! or fax to 703 424 8525 (USA) ! or mail to 4311-G Bob Ct. ! Fairfax, VA 22030 USA ! ********************************************************************** ! functions and operators for basic bit-level calculations ! ********************************************************************** ! bit_functions operators ! .not. bit-wise for integers ! .and. bit-wise for integers ! .or. bit-wise for integers ! .eor. bit-wise for integers ! .eqv. bit-wise for integers ! .neqv. bit-wise for integers ! .xor. bit-wise for integers ! .hamd. for integers ! .shift. linear shift operator ! .rotate. circular shift operator ! bit_functions library ! csmg() [ = ( i& k) ! ( j& ~k) ] ! compl() for integers ! leadz() ! lastz() ! popcnt() ! poppar() for integers ! ilen() width (a la HPF) ! hamd() hamming distance integer( integer, integer) ! dshftl() ! dshftr() ! dshftc() for integers ! mask() ! maskl() ! maskr() for integers ! ********************************************************************** ! bit_functions module bit_functions ! ********************************************************************** ! use standard parameterization of processor dependencies use standard_types ! ********************************************************************** ! explicit declarations implicit none ! ********************************************************************** ! explicit export private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), parameter :: bit_functions_rcs_source = & '$Id: bitfunc.fpp 1.3 2003/10/03 19:28:00Z Dan Release $' ! ********************************************************************** ! bit_functions library ! ********************************************************************** ! bit functions csmg(), compl(), leadz(), lastz(), popcnt(), poppar() ! ********************************************************************** ! declare specific functions supporting generic function csmg() public :: csmg ! generic name interface csmg module procedure byte_csmg module procedure short_csmg module procedure int_csmg module procedure long_csmg end interface ! declare specific functions implementing the compl() function public :: compl ! generic name interface compl module procedure byte_compl module procedure short_compl module procedure int_compl module procedure long_compl end interface ! ********************************************************************** ! declare specific functions supporting generic function leadz() public :: leadz ! generic name interface leadz module procedure byte_leadz module procedure short_leadz module procedure int_leadz module procedure long_leadz end interface ! ********************************************************************** ! declare specific functions supporting generic function lastz() public :: lastz ! generic name interface lastz module procedure byte_lastz module procedure short_lastz module procedure int_lastz module procedure long_lastz end interface ! ********************************************************************** ! declare specific functions supporting generic function popcnt() public :: popcnt ! generic name interface popcnt module procedure byte_popcnt module procedure short_popcnt module procedure int_popcnt module procedure long_popcnt end interface ! ********************************************************************** ! declare specific functions supporting generic function poppar() public :: poppar ! generic name interface poppar module procedure byte_poppar module procedure short_poppar module procedure int_poppar module procedure long_poppar end interface ! ********************************************************************** ! bit length of an integer .ilen. ilen() ! ********************************************************************** ! declare specific functions supporting .ilen. public :: operator( .ilen.) ! operator name interface operator( .ilen.) module procedure byte_ilen module procedure short_ilen module procedure int_ilen module procedure long_ilen end interface ! declare specific functions supporting generic ilen() public :: ilen ! generic name interface ilen module procedure byte_ilen module procedure short_ilen module procedure int_ilen module procedure long_ilen end interface ! ********************************************************************** ! hamming distance .hamd. hamd() ! ********************************************************************** ! declare specific functions supporting .hamd. public :: operator( .hamd.) ! operator name interface operator( .hamd.) module procedure byte_hamd module procedure short_hamd module procedure int_hamd module procedure long_hamd end interface ! declare specific functions supporting generic hamd() public :: hamd ! generic name interface hamd module procedure byte_hamd module procedure short_hamd module procedure int_hamd module procedure long_hamd end interface ! ********************************************************************** ! mask functions mask(), maskl(), maskr() ! ********************************************************************** ! declare specific functions supporting generic function mask() public :: mask ! generic name interface mask module procedure byte_mask module procedure short_mask module procedure int_mask module procedure long_mask end interface ! ********************************************************************** ! declare specific functions supporting generic function maskl() public :: maskl ! generic name interface maskl module procedure byte_maskl module procedure short_maskl module procedure int_maskl module procedure long_maskl end interface ! ********************************************************************** ! declare specific functions supporting generic function maskr() public :: maskr ! generic name interface maskr module procedure byte_maskr module procedure short_maskr module procedure int_maskr module procedure long_maskr end interface ! ********************************************************************** ! shifts as binary operators .shift. .rotate. ! ********************************************************************** ! declare specific functions supporting .shift. public :: operator( .shift.) ! operator name interface operator( .shift.) module procedure byte_shift module procedure short_shift module procedure int_shift module procedure long_shift end interface ! ********************************************************************** ! declare specific functions supporting .rotate. public :: operator( .rotate.) ! operator name interface operator( .rotate.) module procedure byte_rotate module procedure short_rotate module procedure int_rotate module procedure long_rotate end interface ! ********************************************************************** ! two word shift functions dshftl(), dshftr(), dshftc() ! ********************************************************************** ! declare specific functions supporting generic function dshftl() public :: dshftl ! generic name interface dshftl module procedure byte_dshftl module procedure short_dshftl module procedure int_dshftl module procedure long_dshftl end interface ! ********************************************************************** ! declare specific functions supporting generic function dshftr() public :: dshftr ! generic name interface dshftr module procedure byte_dshftr module procedure short_dshftr module procedure int_dshftr module procedure long_dshftr end interface ! ********************************************************************** ! declare specific functions supporting generic function dshftc() public :: dshftc ! generic name interface dshftc module procedure byte_dshftc module procedure short_dshftc module procedure int_dshftc module procedure long_dshftc end interface ! ********************************************************************** ! unary operator: .not. ! ********************************************************************** ! declare specific functions implementing the .not. operator public :: operator( .not.) ! operator name interface operator( .not.) module procedure byte_not module procedure short_not module procedure int_not module procedure long_not end interface ! ********************************************************************** ! binary operators: .and., .or., .eor., .xor., .eqv., .neqv., .xor. ! ********************************************************************** ! declare specific functions implementing the .and. operator public :: operator( .and.) ! operator name interface operator( .and.) module procedure byte_and module procedure short_and module procedure int_and module procedure long_and end interface ! declare specific functions implementing the .or. operator public :: operator( .or.) ! operator name interface operator( .or.) module procedure byte_or module procedure short_or module procedure int_or module procedure long_or end interface ! declare specific functions implementing the .eor. operator public :: operator( .eor.) ! operator name interface operator( .eor.) module procedure byte_eor module procedure short_eor module procedure int_eor module procedure long_eor end interface ! declare specific functions implementing the .eqv. operator public :: operator( .eqv.) ! operator name interface operator( .eqv.) module procedure byte_eqv module procedure short_eqv module procedure int_eqv module procedure long_eqv end interface ! declare specific functions implementing the .neqv. operator public :: operator( .neqv.) ! operator name interface operator( .neqv.) module procedure byte_neqv module procedure short_neqv module procedure int_neqv module procedure long_neqv end interface ! declare specific functions implementing the .xor. operator public :: operator( .xor.) ! operator name interface operator( .xor.) module procedure byte_xor module procedure short_xor module procedure int_xor module procedure long_xor end interface ! ********************************************************************** ! private data ! ********************************************************************** ! mask, maskl, maskr data for byte_k integer( kind= byte_k), dimension( bit_size( 0_byte_k) ), save :: & byte_left_mask, byte_right_mask data & byte_left_mask/ z'80', z'c0', z'e0', z'f0', & z'f8', z'fc', z'fe', z'ff'/ data & byte_right_mask/ z'01', z'03', z'07', z'0f', & z'1f', z'3f', z'7f', z'ff'/ ! mask, maskl, maskr data for short_k integer( kind= short_k), dimension( bit_size( 0_short_k) ), save :: & short_left_mask, short_right_mask data & short_left_mask/ z'8000', z'c000', z'e000', z'f000', & z'f800', z'fc00', z'fe00', z'ff00', & z'ff80', z'ffc0', z'ffe0', z'fff0', & z'fff8', z'fffc', z'fffe', z'ffff'/ data & short_right_mask/ z'0001', z'0003', z'0007', z'000f', & z'001f', z'003f', z'007f', z'00ff', & z'01ff', z'03ff', z'07ff', z'0fff', & z'1fff', z'3fff', z'7fff', z'ffff'/ ! mask, maskl, maskr data for int_k integer( kind= int_k), dimension( bit_size( 0_int_k) ), save :: & int_left_mask, int_right_mask data & int_left_mask/ z'80000000', z'c0000000', z'e0000000', z'f0000000', & z'f8000000', z'fc000000', z'fe000000', z'ff000000', & z'ff800000', z'ffc00000', z'ffe00000', z'fff00000', & z'fff80000', z'fffc0000', z'fffe0000', z'ffff0000', & z'ffff8000', z'ffffc000', z'ffffe000', z'fffff000', & z'fffff800', z'fffffc00', z'fffffe00', z'ffffff00', & z'ffffff80', z'ffffffc0', z'ffffffe0', z'fffffff0', & z'fffffff8', z'fffffffc', z'fffffffe', z'ffffffff'/ data & int_right_mask/ z'00000001', z'00000003', z'00000007', z'0000000f', & z'0000001f', z'0000003f', z'0000007f', z'000000ff', & z'000001ff', z'000003ff', z'000007ff', z'00000fff', & z'00001fff', z'00003fff', z'00007fff', z'0000ffff', & z'0001ffff', z'0003ffff', z'0007ffff', z'000fffff', & z'001fffff', z'003fffff', z'007fffff', z'00ffffff', & z'01ffffff', z'03ffffff', z'07ffffff', z'0fffffff', & z'1fffffff', z'3fffffff', z'7fffffff', z'ffffffff'/ ! mask, maskl, maskr dada for long_k integer( kind= long_k), dimension( bit_size( 0_long_k) ), save :: & long_left_mask, long_right_mask data & long_left_mask/ z'8000000000000000', z'c000000000000000', z'e000000000000000', z'f000000000000000', & z'f800000000000000', z'fc00000000000000', z'fe00000000000000', z'ff00000000000000', & z'ff80000000000000', z'ffc0000000000000', z'ffe0000000000000', z'fff0000000000000', & z'fff8000000000000', z'fffc000000000000', z'fffe000000000000', z'ffff000000000000', & z'ffff800000000000', z'ffffc00000000000', z'ffffe00000000000', z'fffff00000000000', & z'fffff80000000000', z'fffffc0000000000', z'fffffe0000000000', z'ffffff0000000000', & z'ffffff8000000000', z'ffffffc000000000', z'ffffffe000000000', z'fffffff000000000', & z'fffffff800000000', z'fffffffc00000000', z'fffffffe00000000', z'ffffffff00000000', & z'ffffffff80000000', z'ffffffffc0000000', z'ffffffffe0000000', z'fffffffff0000000', & z'fffffffff8000000', z'fffffffffc000000', z'fffffffffe000000', z'ffffffffff000000', & z'ffffffffff800000', z'ffffffffffc00000', z'ffffffffffe00000', z'fffffffffff00000', & z'fffffffffff80000', z'fffffffffffc0000', z'fffffffffffe0000', z'ffffffffffff0000', & z'ffffffffffff8000', z'ffffffffffffc000', z'ffffffffffffe000', z'fffffffffffff000', & z'fffffffffffff800', z'fffffffffffffc00', z'fffffffffffffe00', z'ffffffffffffff00', & z'ffffffffffffff80', z'ffffffffffffffc0', z'ffffffffffffffe0', z'fffffffffffffff0', & z'fffffffffffffff8', z'fffffffffffffffc', z'fffffffffffffffe', z'ffffffffffffffff'/ data & long_right_mask/ z'0000000000000001', z'0000000000000003', z'0000000000000007', z'000000000000000f', & z'000000000000001f', z'000000000000003f', z'000000000000007f', z'00000000000000ff', & z'00000000000001ff', z'00000000000003ff', z'00000000000007ff', z'0000000000000fff', & z'0000000000001fff', z'0000000000003fff', z'0000000000007fff', z'000000000000ffff', & z'000000000001ffff', z'000000000003ffff', z'000000000007ffff', z'00000000000fffff', & z'00000000001fffff', z'00000000003fffff', z'00000000007fffff', z'0000000000ffffff', & z'0000000001ffffff', z'0000000003ffffff', z'0000000007ffffff', z'000000000fffffff', & z'000000001fffffff', z'000000003fffffff', z'000000007fffffff', z'00000000ffffffff', & z'00000001ffffffff', z'00000003ffffffff', z'00000007ffffffff', z'0000000fffffffff', & z'0000001fffffffff', z'0000003fffffffff', z'0000007fffffffff', z'000000ffffffffff', & z'000001ffffffffff', z'000003ffffffffff', z'000007ffffffffff', z'00000fffffffffff', & z'00001fffffffffff', z'00003fffffffffff', z'00007fffffffffff', z'0000ffffffffffff', & z'0001ffffffffffff', z'0003ffffffffffff', z'0007ffffffffffff', z'000fffffffffffff', & z'001fffffffffffff', z'003fffffffffffff', z'007fffffffffffff', z'00ffffffffffffff', & z'01ffffffffffffff', z'03ffffffffffffff', z'07ffffffffffffff', z'0fffffffffffffff', & z'1fffffffffffffff', z'3fffffffffffffff', z'7fffffffffffffff', z'ffffffffffffffff'/ ! ********************************************************************** ! masks for leadz() integer( kind= byte_k), save :: byte_lead_p4; data byte_lead_p4/ z'f0'/ integer( kind= byte_k), save :: byte_lead_p2; data byte_lead_p2/ z'cc'/ integer( kind= byte_k), save :: byte_lead_p1; data byte_lead_p1/ z'aa'/ integer( kind= short_k), save :: short_lead_p8; data short_lead_p8/ z'ff00'/ integer( kind= short_k), save :: short_lead_p4; data short_lead_p4/ z'f0f0'/ integer( kind= short_k), save :: short_lead_p2; data short_lead_p2/ z'cccc'/ integer( kind= short_k), save :: short_lead_p1; data short_lead_p1/ z'aaaa'/ integer( kind= int_k), save :: int_lead_p16; data int_lead_p16/ z'ffff0000'/ integer( kind= int_k), save :: int_lead_p8; data int_lead_p8/ z'ff00ff00'/ integer( kind= int_k), save :: int_lead_p4; data int_lead_p4/ z'f0f0f0f0'/ integer( kind= int_k), save :: int_lead_p2; data int_lead_p2/ z'cccccccc'/ integer( kind= int_k), save :: int_lead_p1; data int_lead_p1/ z'aaaaaaaa'/ integer( kind= long_k), save :: long_lead_p32; data long_lead_p32/ z'ffffffff00000000'/ integer( kind= long_k), save :: long_lead_p16; data long_lead_p16/ z'ffff0000ffff0000'/ integer( kind= long_k), save :: long_lead_p8; data long_lead_p8/ z'ff00ff00ff00ff00'/ integer( kind= long_k), save :: long_lead_p4; data long_lead_p4/ z'f0f0f0f0f0f0f0f0'/ integer( kind= long_k), save :: long_lead_p2; data long_lead_p2/ z'cccccccccccccccc'/ integer( kind= long_k), save :: long_lead_p1; data long_lead_p1/ z'aaaaaaaaaaaaaaaa'/ ! ********************************************************************** ! masks for lastz() integer( kind= byte_k), save :: byte_last_p4; data byte_last_p4/ z'0f'/ integer( kind= byte_k), save :: byte_last_p2; data byte_last_p2/ z'33'/ integer( kind= byte_k), save :: byte_last_p1; data byte_last_p1/ z'55'/ integer( kind= short_k), save :: short_last_p8; data short_last_p8/ z'00ff'/ integer( kind= short_k), save :: short_last_p4; data short_last_p4/ z'0f0f'/ integer( kind= short_k), save :: short_last_p2; data short_last_p2/ z'3333'/ integer( kind= short_k), save :: short_last_p1; data short_last_p1/ z'5555'/ integer( kind= int_k), save :: int_last_p16; data int_last_p16/ z'0000ffff'/ integer( kind= int_k), save :: int_last_p8; data int_last_p8/ z'00ff00ff'/ integer( kind= int_k), save :: int_last_p4; data int_last_p4/ z'0f0f0f0f'/ integer( kind= int_k), save :: int_last_p2; data int_last_p2/ z'33333333'/ integer( kind= int_k), save :: int_last_p1; data int_last_p1/ z'55555555'/ integer( kind= long_k), save :: long_last_p32; data long_last_p32/ z'00000000ffffffff'/ integer( kind= long_k), save :: long_last_p16; data long_last_p16/ z'0000ffff0000ffff'/ integer( kind= long_k), save :: long_last_p8; data long_last_p8/ z'00ff00ff00ff00ff'/ integer( kind= long_k), save :: long_last_p4; data long_last_p4/ z'0f0f0f0f0f0f0f0f'/ integer( kind= long_k), save :: long_last_p2; data long_last_p2/ z'3333333333333333'/ integer( kind= long_k), save :: long_last_p1; data long_last_p1/ z'5555555555555555'/ ! ********************************************************************** ! masks for popcnt()/poppar() integer( kind= byte_k), save :: byte_p1; data byte_p1/ z'11'/ integer( kind= byte_k), save :: byte_p2; data byte_p2/ z'22'/ integer( kind= byte_k), save :: byte_p4; data byte_p4/ z'44'/ integer( kind= byte_k), save :: byte_p8; data byte_p8/ z'88'/ integer( kind= byte_k), save :: byte_hi_nibble; data byte_hi_nibble/ z'f0'/ integer( kind= byte_k), save :: byte_lo_nibble; data byte_lo_nibble/ z'0f'/ integer( kind= byte_k), save :: byte_low_bit; data byte_low_bit/ z'01'/ integer( kind= short_k), save :: short_p1; data short_p1/ z'1111'/ integer( kind= short_k), save :: short_p2; data short_p2/ z'2222'/ integer( kind= short_k), save :: short_p4; data short_p4/ z'4444'/ integer( kind= short_k), save :: short_p8; data short_p8/ z'8888'/ integer( kind= short_k), save :: short_hi_nibble; data short_hi_nibble/ z'f0f0'/ integer( kind= short_k), save :: short_lo_nibble; data short_lo_nibble/ z'0f0f'/ integer( kind= short_k), save :: short_low_byte; data short_low_byte/ z'00ff'/ integer( kind= short_k), save :: short_low_bit; data short_low_bit/ z'0001'/ integer( kind= int_k), save :: int_p1; data int_p1/ z'11111111'/ integer( kind= int_k), save :: int_p2; data int_p2/ z'22222222'/ integer( kind= int_k), save :: int_p4; data int_p4/ z'44444444'/ integer( kind= int_k), save :: int_p8; data int_p8/ z'88888888'/ integer( kind= int_k), save :: int_hi_nibble; data int_hi_nibble/ z'f0f0f0f0'/ integer( kind= int_k), save :: int_lo_nibble; data int_lo_nibble/ z'0f0f0f0f'/ integer( kind= int_k), save :: int_low_byte; data int_low_byte/ z'000000ff'/ integer( kind= int_k), save :: int_low_bit; data int_low_bit/ z'00000001'/ integer( kind= long_k), save :: long_p1; data long_p1/ z'1111111111111111'/ integer( kind= long_k), save :: long_p2; data long_p2/ z'2222222222222222'/ integer( kind= long_k), save :: long_p4; data long_p4/ z'4444444444444444'/ integer( kind= long_k), save :: long_p8; data long_p8/ z'8888888888888888'/ integer( kind= long_k), save :: long_hi_nibble; data long_hi_nibble/ z'f0f0f0f0f0f0f0f0'/ integer( kind= long_k), save :: long_lo_nibble; data long_lo_nibble/ z'0f0f0f0f0f0f0f0f'/ integer( kind= long_k), save :: long_low_byte; data long_low_byte/ z'00000000000000ff'/ integer( kind= long_k), save :: long_low_bit; data long_low_bit/ z'0000000000000001'/ ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! bit_functions ! ********************************************************************** ! csmg(): conditional scalar merge for integer kinds ! ********************************************************************** ! byte_csmg(): csmg() for kind byte elemental integer( kind= byte_k) function byte_csmg( i, j, k) integer( kind= byte_k), intent( in) :: i, j, k ! byte_csmg() continue ! csmg() byte_csmg = ior( iand( i, k), iand( j, not( k)) ) return ! csmg() ! byte_csmg() end function byte_csmg ! ********************************************************************** ! short_csmg(): csmg() for kind short elemental integer( kind= short_k) function short_csmg( i, j, k) integer( kind= short_k), intent( in) :: i, j, k ! short_csmg() continue ! csmg() short_csmg = ior( iand( i, k), iand( j, not( k)) ) return ! csmg() ! short_csmg() end function short_csmg ! ********************************************************************** ! int_csmg(): csmg() for kind int elemental integer( kind= int_k) function int_csmg( i, j, k) integer( kind= int_k), intent( in) :: i, j, k ! int_csmg() continue ! csmg() int_csmg = ior( iand( i, k), iand( j, not( k)) ) return ! csmg() ! int_csmg() end function int_csmg ! ********************************************************************** ! long_csmg(): csmg() for kind long elemental integer( kind= long_k) function long_csmg( i, j, k) integer( kind= long_k), intent( in) :: i, j, k ! long_csmg() continue ! csmg() long_csmg = ior( iand( i, k), iand( j, not( k)) ) return ! csmg() ! long_csmg() end function long_csmg ! ********************************************************************** ! compl(): bit-wise complement ! ********************************************************************** ! byte_compl(): compl() for kind byte elemental integer( kind= byte_k) function byte_compl( i) integer( kind= byte_k), intent( in) :: i ! byte_compl() continue ! compl() byte_compl = not( i) return ! compl() ! byte_compl() end function byte_compl ! ********************************************************************** ! short_compl(): compl() for kind short elemental integer( kind= short_k) function short_compl( i) integer( kind= short_k), intent( in) :: i ! short_compl() continue ! compl() short_compl = not( i) return ! compl() ! short_compl() end function short_compl ! ********************************************************************** ! int_compl(): compl() for kind int elemental integer( kind= int_k) function int_compl( i) integer( kind= int_k), intent( in) :: i ! int_compl() continue ! compl() int_compl = not( i) return ! compl() ! int_compl() end function int_compl ! ********************************************************************** ! long_compl(): compl() for kind long elemental integer( kind= long_k) function long_compl( i) integer( kind= long_k), intent( in) :: i ! long_compl() continue ! compl() long_compl = not( i) return ! compl() ! long_compl() end function long_compl ! ********************************************************************** ! bit counts: leadz(), lastz(), popcnt(), poppar() ! ********************************************************************** ! leadz( b) elemental integer( kind= byte_k) function byte_leadz( b) integer( kind= byte_k), intent( in) :: b ! scratch data and masks integer( kind= byte_k) :: test, at_least ! byte_leadz() continue ! leadz() test = b if( test == 0_byte_k )then ! catch end case byte_leadz = bit_size( b) return ! leadz() end if if( iand( byte_lead_p4, test) == 0_byte_k )then at_least = 4 ! top half all zero else at_least = 0 test = iand( byte_lead_p4, test) end if if( iand( byte_lead_p2, test) == 0_byte_k )then at_least = at_least + 2 ! top quarter all zero else test = iand( byte_lead_p2, test) end if if( iand( byte_lead_p1, test) == 0_byte_k )then at_least = at_least + 1 ! top bit (eighth) zero end if byte_leadz = at_least return ! leadz() ! byte_leadz() end function byte_leadz ! ********************************************************************** ! leadz( b) elemental integer( kind= short_k) function short_leadz( b) integer( kind= short_k), intent( in) :: b ! scratch data integer( kind= short_k) :: test, at_least ! short_leadz() continue ! leadz() test = b if( test == 0_short_k )then ! catch end case short_leadz = bit_size( b) return ! leadz() end if if( iand( short_lead_p8, test) == 0_short_k )then at_least = 8 ! top half all zero else at_least = 0 test = iand( short_lead_p8, test) end if if( iand( short_lead_p4, test) == 0_short_k )then at_least = at_least + 4 ! top quarter all zero else test = iand( short_lead_p4, test) end if if( iand( short_lead_p2, test) == 0_short_k )then at_least = at_least + 2 ! top eighth all zero else test = iand( short_lead_p2, test) end if if( iand( short_lead_p1, test) == 0_short_k )then at_least = at_least + 1 ! top bit (sixteenth) zero end if short_leadz = at_least return ! leadz() ! short_leadz() end function short_leadz ! ********************************************************************** ! leadz( b) elemental integer( kind= int_k) function int_leadz( b) integer( kind= int_k), intent( in) :: b ! scratch data integer( kind= int_k) :: test, at_least ! int_leadz() continue ! leadz() test = b if( test == 0_int_k )then ! catch end case int_leadz = bit_size( b) return ! leadz() end if if( iand( int_lead_p16, test) == 0_int_k )then at_least = 16 ! top half all zero else at_least = 0 test = iand( int_lead_p16, test) end if if( iand( int_lead_p8, test) == 0_int_k )then at_least = at_least + 8 ! top quarter all zero else test = iand( int_lead_p8, test) end if if( iand( int_lead_p4, test) == 0_int_k )then at_least = at_least + 4 ! top eighth all zero else test = iand( int_lead_p4, test) end if if( iand( int_lead_p2, test) == 0_int_k )then at_least = at_least + 2 ! top sixteenth all zero else test = iand( int_lead_p2, test) end if if( iand( int_lead_p1, test) == 0_int_k )then at_least = at_least + 1 ! top bit (thirtysecond) zero end if int_leadz = at_least return ! leadz() ! int_leadz() end function int_leadz ! ********************************************************************** ! leadz( b) elemental integer( kind= long_k) function long_leadz( b) integer( kind= long_k), intent( in) :: b ! scratch data and masks integer( kind= long_k) :: test, at_least ! long_leadz() continue ! leadz() test = b if( test == 0_long_k )then ! catch end case long_leadz = bit_size( b) return ! leadz() end if if( iand( long_lead_p32, test) == 0_long_k )then at_least = 32 ! top half all zero else at_least = 0 test = iand( long_lead_p32, test) end if if( iand( long_lead_p16, test) == 0_long_k )then at_least = at_least + 16 ! top quarter all zero else test = iand( long_lead_p16, test) end if if( iand( long_lead_p8, test) == 0_long_k )then at_least = at_least + 8 ! top eighth all zero else test = iand( long_lead_p8, test) end if if( iand( long_lead_p4, test) == 0_long_k )then at_least = at_least + 4 ! top sixteenth all zero else test = iand( long_lead_p4, test) end if if( iand( long_lead_p2, test) == 0_long_k )then at_least = at_least + 2 ! top thritysecond all zero else test = iand( long_lead_p2, test) end if if( iand( long_lead_p1, test) == 0_long_k )then at_least = at_least + 1 ! top bit (sixtyfourth) zero end if long_leadz = at_least return ! leadz() ! long_leadz() end function long_leadz ! ********************************************************************** ! lastz( b) elemental integer( kind= byte_k) function byte_lastz( b) integer( kind= byte_k), intent( in) :: b ! scratch data and masks integer( kind= byte_k) :: test, at_least ! byte_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_byte_k )then ! catch end case now byte_lastz = bit_size( b) return end if if( iand( byte_last_p4, test) == 0_byte_k )then at_least = 4 ! bottom half all zero else at_least = 0 test = iand( byte_last_p4, test) end if if( iand( byte_last_p2, test) == 0_byte_k )then at_least = at_least + 2 ! bottom quarter all zero else test = iand( byte_last_p2, test) end if if( iand( byte_last_p1, test) == 0_byte_k )then at_least = at_least + 1 ! bottom bit zero end if byte_lastz = at_least return ! lastz() ! byte_lastz() end function byte_lastz ! ********************************************************************** ! lastz( b) elemental integer( kind= short_k) function short_lastz( b) integer( kind= short_k), intent( in) :: b ! scratch data and masks integer( kind= short_k) :: test, at_least ! short_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_short_k )then ! catch end case now short_lastz = bit_size( b) return end if if( iand( short_last_p8, test) == 0_short_k )then at_least = 8 ! bottom half all zero else at_least = 0 test = iand( short_last_p8, test) end if if( iand( short_last_p4, test) == 0_short_k )then at_least = at_least + 4 ! bottom quarter all zero else test = iand( short_last_p4, test) end if if( iand( short_last_p2, test) == 0_short_k )then at_least = at_least + 2 ! bottom eighth all zero else test = iand( short_last_p2, test) end if if( iand( short_last_p1, test) == 0_short_k )then at_least = at_least + 1 ! bottom bit zero end if short_lastz = at_least return ! lastz() ! short_lastz() end function short_lastz ! ********************************************************************** ! lastz( b) elemental integer( kind= int_k) function int_lastz( b) integer( kind= int_k), intent( in) :: b ! scratch data and masks integer( kind= int_k) :: test, at_least ! int_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_int_k )then ! catch end case now int_lastz = bit_size( b) return end if if( iand( int_last_p16, test) == 0_int_k )then at_least = 16 ! bottom half all zero else at_least = 0 test = iand( int_last_p16, test) end if if( iand( int_last_p8, test) == 0_int_k )then at_least = at_least + 8 ! bottom quarter all zero else test = iand( int_last_p8, test) end if if( iand( int_last_p4, test) == 0_int_k )then at_least = at_least + 4 ! bottom eighth all zero else test = iand( int_last_p4, test) end if if( iand( int_last_p2, test) == 0_int_k )then at_least = at_least + 2 ! bottom sixteenth all zero else test = iand( int_last_p2, test) end if if( iand( int_last_p1, test) == 0_int_k )then at_least = at_least + 1 ! bottom bit zero end if int_lastz = at_least return ! lastz() ! int_lastz() end function int_lastz ! ********************************************************************** ! lastz( b) elemental integer( kind= long_k) function long_lastz( b) integer( kind= long_k), intent( in) :: b ! scratch data and masks integer( kind= long_k) :: test, at_least ! long_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_long_k )then ! catch end case now long_lastz = bit_size( b) return end if if( iand( long_last_p32, test) == 0_long_k )then at_least = 32 ! bottom half all zero else at_least = 0 test = iand( long_last_p32, test) end if if( iand( long_last_p16, test) == 0_long_k )then at_least = at_least + 16 ! bottom half all zero else test = iand( long_last_p16, test) end if if( iand( long_last_p8, test) == 0_long_k )then at_least = at_least + 8 ! bottom quarter all zero else test = iand( long_last_p8, test) end if if( iand( long_last_p4, test) == 0_long_k )then at_least = at_least + 4 ! bottom eighth all zero else test = iand( long_last_p4, test) end if if( iand( long_last_p2, test) == 0_long_k )then at_least = at_least + 2 ! bottom sixteenth all zero else test = iand( long_last_p2, test) end if if( iand( long_last_p1, test) == 0_long_k )then at_least = at_least + 1 ! bottom bit zero end if long_lastz = at_least return ! lastz() ! long_lastz() end function long_lastz ! ********************************************************************** ! popcnt( b) elemental integer( kind= byte_k) function byte_popcnt( b) integer( kind= byte_k), intent( in) :: b ! scratch data integer( kind= byte_k) :: test, t1, t2, t4, t8 ! byte_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, byte_p1) ! 1 bit from each nibble t2 = iand( test, byte_p2) t4 = iand( test, byte_p4) t8 = iand( test, byte_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, byte_hi_nibble) t2 = iand( test, byte_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, byte_lo_nibble) ! return popcnt byte_popcnt = test return ! popcnt() ! byte_popcnt() end function byte_popcnt ! ********************************************************************** ! popcnt( b) elemental integer( kind= short_k) function short_popcnt( b) integer( kind= short_k), intent( in) :: b ! scratch data integer( kind= short_k) :: test, t1, t2, t4, t8 ! short_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, short_p1) ! 1 bit from each nibble t2 = iand( test, short_p2) t4 = iand( test, short_p4) t8 = iand( test, short_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, short_hi_nibble) t2 = iand( test, short_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, short_lo_nibble) ! add each of 2 bytes & mask off low byte test = test + ishft( test, -8) short_popcnt = iand( test, short_low_byte) return ! popcnt() ! short_popcnt() end function short_popcnt ! ********************************************************************** ! popcnt( b) elemental integer( kind= int_k) function int_popcnt( b) integer( kind= int_k), intent( in) :: b ! scratch data and masks integer( kind= int_k) :: test, t1, t2, t4, t8 ! int_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, int_p1) ! 1 bit from each nibble t2 = iand( test, int_p2) t4 = iand( test, int_p4) t8 = iand( test, int_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, int_hi_nibble) t2 = iand( test, int_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, int_lo_nibble) ! add each of 4 bytes & mask off low byte test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) int_popcnt = iand( test, int_low_byte) return ! popcnt() ! int_popcnt() end function int_popcnt ! ********************************************************************** ! popcnt( b) elemental integer( kind= long_k) function long_popcnt( b) integer( kind= long_k), intent( in) :: b ! scratch data and masks integer( kind= long_k) :: test, t1, t2, t4, t8 ! long_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, long_p1) ! 1 bit from each nibble t2 = iand( test, long_p2) t4 = iand( test, long_p4) t8 = iand( test, long_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, long_hi_nibble) t2 = iand( test, long_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, long_lo_nibble) ! add each of 4 bytes & mask off low byte test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) & + ishft( test, -32) + ishft( test, -40) + ishft( test, -48) + ishft( test, -56) long_popcnt = iand( test, long_low_byte) return ! popcnt() ! long_popcnt() end function long_popcnt ! ********************************************************************** ! poppar( b) elemental integer( kind= byte_k) function byte_poppar( b) integer( kind= byte_k), intent( in) :: b ! local data integer( kind= byte_k) :: test, t1, t2, t4, t8 ! byte_poppar() continue ! poppar() test = b t1 = iand( test, byte_p1) t2 = iand( test, byte_p2) t4 = iand( test, byte_p4) t8 = iand( test, byte_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, byte_hi_nibble) t2 = iand( test, byte_lo_nibble) test = iand( ishft( t1, -4) + t2, byte_lo_nibble) byte_poppar = iand( test, byte_low_bit) return ! poppar() ! byte_poppar() end function byte_poppar ! ********************************************************************** ! poppar( b) elemental integer( kind= short_k) function short_poppar( b) integer( kind= short_k), intent( in) :: b ! local data integer( kind= short_k) :: test, t1, t2, t4, t8 ! short_poppar() continue ! poppar() test = b t1 = iand( test, short_p1) t2 = iand( test, short_p2) t4 = iand( test, short_p4) t8 = iand( test, short_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, short_hi_nibble) t2 = iand( test, short_lo_nibble) test = iand( ishft( t1, -4) + t2, short_lo_nibble) test = test + ishft( test, -8) short_poppar = iand( test, short_low_bit) return ! poppar() ! short_poppar() end function short_poppar ! ********************************************************************** ! poppar( b) elemental integer( kind= int_k) function int_poppar( b) integer( kind= int_k), intent( in) :: b ! local data integer( kind= int_k) :: test, t1, t2, t4, t8 ! int_poppar() continue ! poppar() test = b t1 = iand( test, int_p1) t2 = iand( test, int_p2) t4 = iand( test, int_p4) t8 = iand( test, int_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, int_hi_nibble) t2 = iand( test, int_lo_nibble) test = iand( ishft( t1, -4) + t2, int_lo_nibble) test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) int_poppar = iand( test, int_low_bit) return ! poppar() ! int_poppar() end function int_poppar ! ********************************************************************** ! poppar( b) elemental integer( kind= long_k) function long_poppar( b) integer( kind= long_k), intent( in) :: b ! local data integer( kind= long_k) :: test, t1, t2, t4, t8 ! long_poppar() continue ! poppar() test = b t1 = iand( test, long_p1) t2 = iand( test, long_p2) t4 = iand( test, long_p4) t8 = iand( test, long_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, long_hi_nibble) t2 = iand( test, long_lo_nibble) test = iand( ishft( t1, -4) + t2, long_lo_nibble) test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) long_poppar = iand( test, long_low_bit) return ! poppar() ! long_poppar() end function long_poppar ! ********************************************************************** ! .ilen. i, ilen( i) ! ********************************************************************** ! byte_ilen() elemental integer( kind= byte_k) function byte_ilen( i) integer( kind= byte_k), intent( in) :: i ! byte_ilen() continue ! .ilen. i, ilen() byte_ilen = bit_size( i) - leadz( abs( i)) return ! .ilen i, ilen() ! byte_ilen() end function byte_ilen ! ********************************************************************** ! short_ilen() elemental integer( kind= short_k) function short_ilen( i) integer( kind= short_k), intent( in) :: i ! short_ilen() continue ! .ilen. i, ilen() short_ilen = bit_size( i) - leadz( abs( i)) return ! .ilen i, ilen() ! short_ilen() end function short_ilen ! ********************************************************************** ! int_ilen() elemental integer( kind= int_k) function int_ilen( i) integer( kind= int_k), intent( in) :: i ! int_ilen() continue ! .ilen. i, ilen() int_ilen = bit_size( i) - leadz( abs( i)) return ! .ilen i, ilen() ! int_ilen() end function int_ilen ! ********************************************************************** ! long_ilen() elemental integer( kind= long_k) function long_ilen( i) integer( kind= long_k), intent( in) :: i ! long_ilen() continue ! .ilen. i, ilen() long_ilen = bit_size( i) - leadz( abs( i)) return ! .ilen i, ilen() ! long_ilen() end function long_ilen ! ********************************************************************** ! i .hamd. i, hamd( i, i) ! ********************************************************************** ! byte_hamd() elemental integer( kind= byte_k) function byte_hamd( i, j) integer( kind= byte_k), intent( in) :: i, j ! byte_hamd() continue ! i .hamd. i, hamd() byte_hamd = popcnt( ieor( i, j)) return ! i .hamd i, hamd() ! byte_hamd() end function byte_hamd ! ********************************************************************** ! short_hamd() elemental integer( kind= short_k) function short_hamd( i, j) integer( kind= short_k), intent( in) :: i, j ! short_hamd() continue ! i .hamd. i, hamd() short_hamd = popcnt( ieor( i, j)) return ! i .hamd i, hamd() ! short_hamd() end function short_hamd ! ********************************************************************** ! int_hamd() elemental integer( kind= int_k) function int_hamd( i, j) integer( kind= int_k), intent( in) :: i, j ! int_hamd() continue ! i .hamd. i, hamd() int_hamd = popcnt( ieor( i, j)) return ! i .hamd i, hamd() ! int_hamd() end function int_hamd ! ********************************************************************** ! long_hamd() elemental integer( kind= long_k) function long_hamd( i, j) integer( kind= long_k), intent( in) :: i, j ! long_hamd() continue ! i .hamd. i, hamd() long_hamd = popcnt( ieor( i, j)) return ! i .hamd i, hamd() ! long_hamd() end function long_hamd ! ********************************************************************** ! masks: mask(), maskl(), maskr() ! ********************************************************************** ! mask( i) elemental integer( kind= byte_k) function byte_mask( i) integer( kind= byte_k), intent( in) :: i ! byte_mask() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! byte_mask() continue ! mask() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 byte_mask = byte_right_mask( i) case( -bs: -1) bits ! [ -8, -1] ==> 11... 1100... 00 byte_mask = byte_left_mask( abs( i)) case default bits ! otherwise 00... 00 byte_mask = 0_byte_k end select bits return ! mask() ! byte_mask() end function byte_mask ! ********************************************************************** ! mask( i) elemental integer( kind= short_k) function short_mask( i) integer( kind= short_k), intent( in) :: i ! short_mask() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! short_mask() continue ! mask() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 short_mask = short_right_mask( i) case( -bs: -1) bits ! [ -8, -1] ==> 11... 1100... 00 short_mask = short_left_mask( abs( i)) case default bits ! otherwise 00... 00 short_mask = 0_short_k end select bits return ! mask() ! short_mask() end function short_mask ! ********************************************************************** ! mask( i) elemental integer( kind= int_k) function int_mask( i) integer( kind= int_k), intent( in) :: i ! int_mask() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! int_mask() continue ! mask() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 int_mask = int_right_mask( i) case( -bs: -1) bits ! [ -8, -1] ==> 11... 1100... 00 int_mask = int_left_mask( abs( i)) case default bits ! otherwise 00... 00 int_mask = 0_int_k end select bits return ! mask() ! int_mask() end function int_mask ! ********************************************************************** ! mask( i) elemental integer( kind= long_k) function long_mask( i) integer( kind= long_k), intent( in) :: i ! long_mask() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! long_mask() continue ! mask() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 long_mask = long_right_mask( i) case( -bs: -1) bits ! [ -8, -1] ==> 11... 1100... 00 long_mask = long_left_mask( abs( i)) case default bits ! otherwise 00... 00 long_mask = 0_long_k end select bits return ! mask() ! long_mask() end function long_mask ! ********************************************************************** ! maskl( i) elemental integer( kind= byte_k) function byte_maskl( i) integer( kind= byte_k), intent( in) :: i ! byte_maskl() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! byte_maskl() continue ! maskl() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 11... 1100... 00 byte_maskl = byte_left_mask( i) case default bits ! otherwise 00... 00 byte_maskl = 0_byte_k end select bits return ! maskl() ! byte_maskl() end function byte_maskl ! ********************************************************************** ! maskl( i) elemental integer( kind= short_k) function short_maskl( i) integer( kind= short_k), intent( in) :: i ! short_maskl() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! short_maskl() continue ! maskl() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 11... 1100... 00 short_maskl = short_left_mask( i) case default bits ! otherwise 00... 00 short_maskl = 0_short_k end select bits return ! maskl() ! short_maskl() end function short_maskl ! ********************************************************************** ! maskl( i) elemental integer( kind= int_k) function int_maskl( i) integer( kind= int_k), intent( in) :: i ! int_maskl() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! int_maskl() continue ! maskl() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 11... 1100... 00 int_maskl = int_left_mask( i) case default bits ! otherwise 00... 00 int_maskl = 0_int_k end select bits return ! maskl() ! int_maskl() end function int_maskl ! ********************************************************************** ! maskl( i) elemental integer( kind= long_k) function long_maskl( i) integer( kind= long_k), intent( in) :: i ! long_maskl() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! long_maskl() continue ! maskl() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 11... 1100... 00 long_maskl = long_left_mask( i) case default bits ! otherwise 00... 00 long_maskl = 0_long_k end select bits return ! maskl() ! long_maskl() end function long_maskl ! ********************************************************************** ! maskr( i) elemental integer( kind= byte_k) function byte_maskr( i) integer( kind= byte_k), intent( in) :: i ! byte_maskr() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! byte_maskr() continue ! maskr() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 byte_maskr = byte_right_mask( i) case default bits ! otherwise 00... 00 byte_maskr = 0_byte_k end select bits return ! maskr() ! byte_maskr() end function byte_maskr ! ********************************************************************** ! maskr( i) elemental integer( kind= short_k) function short_maskr( i) integer( kind= short_k), intent( in) :: i ! short_maskr() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! short_maskr() continue ! maskr() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 short_maskr = short_right_mask( i) case default bits ! otherwise 00... 00 short_maskr = 0_short_k end select bits return ! maskr() ! short_maskr() end function short_maskr ! ********************************************************************** ! maskr( i) elemental integer( kind= int_k) function int_maskr( i) integer( kind= int_k), intent( in) :: i ! int_maskr() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! int_maskr() continue ! maskr() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 int_maskr = int_right_mask( i) case default bits ! otherwise 00... 00 int_maskr = 0_int_k end select bits return ! maskr() ! int_maskr() end function int_maskr ! ********************************************************************** ! maskr( i) elemental integer( kind= long_k) function long_maskr( i) integer( kind= long_k), intent( in) :: i ! long_maskr() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! long_maskr() continue ! maskr() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 long_maskr = long_right_mask( i) case default bits ! otherwise 00... 00 long_maskr = 0_long_k end select bits return ! maskr() ! long_maskr() end function long_maskr ! ********************************************************************** ! specific functions implementing shifts as binary operators ! ********************************************************************** ! shift( i, j) elemental integer( kind= byte_k) function byte_shift( i, j) integer( kind= byte_k), intent( in) :: i, j ! byte_shift() continue ! .shift. byte_shift = ishft( i, j) return ! .shift. ! byte_shift() end function byte_shift ! ********************************************************************** ! shift( i, j) elemental integer( kind= short_k) function short_shift( i, j) integer( kind= short_k), intent( in) :: i, j ! short_shift() continue ! .shift. short_shift = ishft( i, j) return ! .shift. ! short_shift() end function short_shift ! ********************************************************************** ! shift( i, j) elemental integer( kind= int_k) function int_shift( i, j) integer( kind= int_k), intent( in) :: i, j ! int_shift() continue ! .shift. int_shift = ishft( i, j) return ! .shift. ! int_shift() end function int_shift ! ********************************************************************** ! shift( i, j) elemental integer( kind= long_k) function long_shift( i, j) integer( kind= long_k), intent( in) :: i, j ! long_shift() continue ! .shift. long_shift = ishft( i, j) return ! .shift. ! long_shift() end function long_shift ! ********************************************************************** ! rotate( i, j) elemental integer( kind= byte_k) function byte_rotate( i, j) integer( kind= byte_k), intent( in) :: i, j ! byte_rotate() continue ! .rotate. byte_rotate = ishftc( i, j) return ! .rotate. ! byte_rotate() end function byte_rotate ! ********************************************************************** ! rotate( i, j) elemental integer( kind= short_k) function short_rotate( i, j) integer( kind= short_k), intent( in) :: i, j ! short_rotate() continue ! .rotate. short_rotate = ishftc( i, j) return ! .rotate. ! short_rotate() end function short_rotate ! ********************************************************************** ! rotate( i, j) elemental integer( kind= int_k) function int_rotate( i, j) integer( kind= int_k), intent( in) :: i, j ! int_rotate() continue ! .rotate. int_rotate = ishftc( i, j) return ! .rotate. ! int_rotate() end function int_rotate ! ********************************************************************** ! rotate( i, j) elemental integer( kind= long_k) function long_rotate( i, j) integer( kind= long_k), intent( in) :: i, j ! long_rotate() continue ! .rotate. long_rotate = ishftc( i, j) return ! .rotate. ! long_rotate() end function long_rotate ! ********************************************************************** ! double word shifts: dshftl(), dshftr(), dshftc() ! ********************************************************************** ! dshftl( bl, br, i) elemental integer( kind= byte_k) function byte_dshftl( bl, br, i) integer( kind= byte_k), intent( in) :: bl, br integer( kind= byte_k), intent( in) :: i ! byte_dshftl() local integer( kind= int_k) :: btl, btr ! byte_dshftl() continue ! dshftl() ! trap out endcase if( i < 0 )then byte_dshftl = 0_byte_k return ! dshftl() elseif( i == 0 )then byte_dshftl = bl return ! dshftl() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, i) btr = ishft( br, i - bit_size( i)) byte_dshftl = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word byte_dshftl = br else ! if shift out of range byte_dshftl = 0_byte_k end if return ! dshftl() ! byte_dshftl() end function byte_dshftl ! ********************************************************************** ! dshftl( bl, br, i) elemental integer( kind= short_k) function short_dshftl( bl, br, i) integer( kind= short_k), intent( in) :: bl, br integer( kind= short_k), intent( in) :: i ! short_dshftl() local integer( kind= int_k) :: btl, btr ! short_dshftl() continue ! dshftl() ! trap out endcase if( i < 0 )then short_dshftl = 0_short_k return ! dshftl() elseif( i == 0 )then short_dshftl = bl return ! dshftl() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, i) btr = ishft( br, i - bit_size( i)) short_dshftl = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word short_dshftl = br else ! if shift out of range short_dshftl = 0_short_k end if return ! dshftl() ! short_dshftl() end function short_dshftl ! ********************************************************************** ! dshftl( bl, br, i) elemental integer( kind= int_k) function int_dshftl( bl, br, i) integer( kind= int_k), intent( in) :: bl, br integer( kind= int_k), intent( in) :: i ! int_dshftl() local integer( kind= int_k) :: btl, btr ! int_dshftl() continue ! dshftl() ! trap out endcase if( i < 0 )then int_dshftl = 0_int_k return ! dshftl() elseif( i == 0 )then int_dshftl = bl return ! dshftl() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, i) btr = ishft( br, i - bit_size( i)) int_dshftl = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word int_dshftl = br else ! if shift out of range int_dshftl = 0_int_k end if return ! dshftl() ! int_dshftl() end function int_dshftl ! ********************************************************************** ! dshftl( bl, br, i) elemental integer( kind= long_k) function long_dshftl( bl, br, i) integer( kind= long_k), intent( in) :: bl, br integer( kind= long_k), intent( in) :: i ! long_dshftl() local integer( kind= int_k) :: btl, btr ! long_dshftl() continue ! dshftl() ! trap out endcase if( i < 0 )then long_dshftl = 0_long_k return ! dshftl() elseif( i == 0 )then long_dshftl = bl return ! dshftl() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, i) btr = ishft( br, i - bit_size( i)) long_dshftl = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word long_dshftl = br else ! if shift out of range long_dshftl = 0_long_k end if return ! dshftl() ! long_dshftl() end function long_dshftl ! ********************************************************************** ! dshftr( bl, br, i) elemental integer( kind= byte_k) function byte_dshftr( bl, br, i) integer( kind= byte_k), intent( in) :: bl, br integer( kind= byte_k), intent( in) :: i ! byte_dshftr() local integer( kind= byte_k) :: btl, btr ! byte_dshftr() continue ! dshftr() ! trap out endcase if( i < 0 )then byte_dshftr = 0_byte_k return ! dshftr() elseif( i == 0 )then byte_dshftr = br return ! dshftr() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, bit_size( i) - i) btr = ishft( br, -i) byte_dshftr = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word byte_dshftr = bl else ! if shift out of range byte_dshftr = 0_byte_k end if return ! dshftr() ! byte_dshftr() end function byte_dshftr ! ********************************************************************** ! dshftr( bl, br, i) elemental integer( kind= short_k) function short_dshftr( bl, br, i) integer( kind= short_k), intent( in) :: bl, br integer( kind= short_k), intent( in) :: i ! short_dshftr() local integer( kind= short_k) :: btl, btr ! short_dshftr() continue ! dshftr() ! trap out endcase if( i < 0 )then short_dshftr = 0_short_k return ! dshftr() elseif( i == 0 )then short_dshftr = br return ! dshftr() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, bit_size( i) - i) btr = ishft( br, -i) short_dshftr = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word short_dshftr = bl else ! if shift out of range short_dshftr = 0_short_k end if return ! dshftr() ! short_dshftr() end function short_dshftr ! ********************************************************************** ! dshftr( bl, br, i) elemental integer( kind= int_k) function int_dshftr( bl, br, i) integer( kind= int_k), intent( in) :: bl, br integer( kind= int_k), intent( in) :: i ! int_dshftr() local integer( kind= int_k) :: btl, btr ! int_dshftr() continue ! dshftr() ! trap out endcase if( i < 0 )then int_dshftr = 0_int_k return ! dshftr() elseif( i == 0 )then int_dshftr = br return ! dshftr() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, bit_size( i) - i) btr = ishft( br, -i) int_dshftr = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word int_dshftr = bl else ! if shift out of range int_dshftr = 0_int_k end if return ! dshftr() ! int_dshftr() end function int_dshftr ! ********************************************************************** ! dshftr( bl, br, i) elemental integer( kind= long_k) function long_dshftr( bl, br, i) integer( kind= long_k), intent( in) :: bl, br integer( kind= long_k), intent( in) :: i ! long_dshftr() local integer( kind= long_k) :: btl, btr ! long_dshftr() continue ! dshftr() ! trap out endcase if( i < 0 )then long_dshftr = 0_long_k return ! dshftr() elseif( i == 0 )then long_dshftr = br return ! dshftr() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, bit_size( i) - i) btr = ishft( br, -i) long_dshftr = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word long_dshftr = bl else ! if shift out of range long_dshftr = 0_long_k end if return ! dshftr() ! long_dshftr() end function long_dshftr ! ********************************************************************** ! dshftc( bl, br, i) elemental subroutine byte_dshftc( bl, br, i) integer( kind= byte_k), intent( inout) :: bl, br integer( kind= byte_k), intent( in) :: i ! byte_dshftc() local integer( kind= byte_k) :: btl, btr, carryl, carryr, ia ! byte_dshftc() continue ! dshftc() ia = abs( i) if( ia > bit_size( i) ) return if( ia == bit_size( i) )then ! if exactly swapping words btl = br btr = bl bl = btl br = btr elseif( i=1 )then ! if i+ shift left carryl = ishft( bl, i - bit_size( i)) carryr = ishft( br, i - bit_size( i)) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) elseif( ia=1 )then ! if i- shift right carryl = ishft( bl, bit_size( i) + i) carryr = ishft( br, bit_size( i) + i) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) end if ! else do nothing return ! dshftc() ! byte_dshftc() end subroutine byte_dshftc ! ********************************************************************** ! dshftc( bl, br, i) elemental subroutine short_dshftc( bl, br, i) integer( kind= short_k), intent( inout) :: bl, br integer( kind= short_k), intent( in) :: i ! short_dshftc() local integer( kind= short_k) :: btl, btr, carryl, carryr, ia ! short_dshftc() continue ! dshftc() ia = abs( i) if( ia > bit_size( i) ) return if( ia == bit_size( i) )then ! if exactly swapping words btl = br btr = bl bl = btl br = btr elseif( i=1 )then ! if i+ shift left carryl = ishft( bl, i - bit_size( i)) carryr = ishft( br, i - bit_size( i)) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) elseif( ia=1 )then ! if i- shift right carryl = ishft( bl, bit_size( i) + i) carryr = ishft( br, bit_size( i) + i) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) end if ! else do nothing return ! dshftc() ! short_dshftc() end subroutine short_dshftc ! ********************************************************************** ! dshftc( bl, br, i) elemental subroutine int_dshftc( bl, br, i) integer( kind= int_k), intent( inout) :: bl, br integer( kind= int_k), intent( in) :: i ! int_dshftc() local integer( kind= int_k) :: btl, btr, carryl, carryr, ia ! int_dshftc() continue ! dshftc() ia = abs( i) if( ia > bit_size( i) ) return if( ia == bit_size( i) )then ! if exactly swapping words btl = br btr = bl bl = btl br = btr elseif( i=1 )then ! if i+ shift left carryl = ishft( bl, i - bit_size( i)) carryr = ishft( br, i - bit_size( i)) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) elseif( ia=1 )then ! if i- shift right carryl = ishft( bl, bit_size( i) + i) carryr = ishft( br, bit_size( i) + i) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) end if ! else do nothing return ! dshftc() ! int_dshftc() end subroutine int_dshftc ! ********************************************************************** ! dshftc( bl, br, i) elemental subroutine long_dshftc( bl, br, i) integer( kind= long_k), intent( inout) :: bl, br integer( kind= long_k), intent( in) :: i ! long_dshftc() local integer( kind= long_k) :: btl, btr, carryl, carryr, ia ! long_dshftc() continue ! dshftc() ia = abs( i) if( ia > bit_size( i) ) return if( ia == bit_size( i) )then ! if exactly swapping words btl = br btr = bl bl = btl br = btr elseif( i=1 )then ! if i+ shift left carryl = ishft( bl, i - bit_size( i)) carryr = ishft( br, i - bit_size( i)) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) elseif( ia=1 )then ! if i- shift right carryl = ishft( bl, bit_size( i) + i) carryr = ishft( br, bit_size( i) + i) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) end if ! else do nothing return ! dshftc() ! long_dshftc() end subroutine long_dshftc ! ********************************************************************** ! bit-wise unary operator- .not. i ! ********************************************************************** ! byte_not()- .not. for kind byte elemental integer( kind= byte_k) function byte_not( i) integer( kind= byte_k), intent( in) :: i ! byte_not() continue ! .not. i byte_not = not( i) return ! .not. i ! byte_not() end function byte_not ! ********************************************************************** ! short_not()- .not. for kind short elemental integer( kind= short_k) function short_not( i) integer( kind= short_k), intent( in) :: i ! short_not() continue ! .not. i short_not = not( i) return ! .not. i ! short_not() end function short_not ! ********************************************************************** ! int_not()- .not. for kind int elemental integer( kind= int_k) function int_not( i) integer( kind= int_k), intent( in) :: i ! int_not() continue ! .not. i int_not = not( i) return ! .not. i ! int_not() end function int_not ! ********************************************************************** ! long_not()- .not. for kind long elemental integer( kind= long_k) function long_not( i) integer( kind= long_k), intent( in) :: i ! long_not() continue ! .not. i long_not = not( i) return ! .not. i ! long_not() end function long_not ! ********************************************************************** ! bit-wise binary operator- i1 .and. i2 ! ********************************************************************** ! byte_and()- .and. for kind byte elemental integer( kind= byte_k) function byte_and( i1, i2) integer( kind= byte_k), intent( in) :: i1, i2 ! byte_and() continue ! i .and. i byte_and = iand( i1, i2) return ! i .and. i ! byte_and() end function byte_and ! ********************************************************************** ! short_and()- .and. for kind short elemental integer( kind= short_k) function short_and( i1, i2) integer( kind= short_k), intent( in) :: i1, i2 ! short_and() continue ! i .and. i short_and = iand( i1, i2) return ! i .and. i ! short_and() end function short_and ! ********************************************************************** ! int_and()- .and. for kind int elemental integer( kind= int_k) function int_and( i1, i2) integer( kind= int_k), intent( in) :: i1, i2 ! int_and() continue ! i .and. i int_and = iand( i1, i2) return ! i .and. i ! int_and() end function int_and ! ********************************************************************** ! long_and()- .and. for kind long elemental integer( kind= long_k) function long_and( i1, i2) integer( kind= long_k), intent( in) :: i1, i2 ! long_and() continue ! i .and. i long_and = iand( i1, i2) return ! i .and. i ! long_and() end function long_and ! ********************************************************************** ! bit-wise binary operator- i1 .or. i2 ! ********************************************************************** ! byte_or()- .or. for kind byte elemental integer( kind= byte_k) function byte_or( i1, i2) integer( kind= byte_k), intent( in) :: i1, i2 ! byte_or() continue ! i .or. i byte_or = ior( i1, i2) return ! i .or. i ! byte_or() end function byte_or ! ********************************************************************** ! short_or()- .or. for kind short elemental integer( kind= short_k) function short_or( i1, i2) integer( kind= short_k), intent( in) :: i1, i2 ! short_or() continue ! i .or. i short_or = ior( i1, i2) return ! i .or. i ! short_or() end function short_or ! ********************************************************************** ! int_or()- .or. for kind int elemental integer( kind= int_k) function int_or( i1, i2) integer( kind= int_k), intent( in) :: i1, i2 ! int_or() continue ! i .or. i int_or = ior( i1, i2) return ! i .or. i ! int_or() end function int_or ! ********************************************************************** ! long_or()- .or. for kind long elemental integer( kind= long_k) function long_or( i1, i2) integer( kind= long_k), intent( in) :: i1, i2 ! long_or() continue ! i .or. i long_or = ior( i1, i2) return ! i .or. i ! long_or() end function long_or ! ********************************************************************** ! bit-wise binary operator- i1 .eor. i2 ! ********************************************************************** ! byte_eor()- .eor. for kind byte elemental integer( kind= byte_k) function byte_eor( i1, i2) integer( kind= byte_k), intent( in) :: i1, i2 ! byte_eor() continue ! i .eor. i byte_eor = ieor( i1, i2) return ! i .eor. i ! byte_eor() end function byte_eor ! ********************************************************************** ! short_eor()- .eor. for kind short elemental integer( kind= short_k) function short_eor( i1, i2) integer( kind= short_k), intent( in) :: i1, i2 ! short_eor() continue ! i .eor. i short_eor = ieor( i1, i2) return ! i .eor. i ! short_eor() end function short_eor ! ********************************************************************** ! int_eor()- .eor. for kind int elemental integer( kind= int_k) function int_eor( i1, i2) integer( kind= int_k), intent( in) :: i1, i2 ! int_eor() continue ! i .eor. i int_eor = ieor( i1, i2) return ! i .eor. i ! int_eor() end function int_eor ! ********************************************************************** ! long_eor()- .eor. for kind long elemental integer( kind= long_k) function long_eor( i1, i2) integer( kind= long_k), intent( in) :: i1, i2 ! long_eor() continue ! i .eor. i long_eor = ieor( i1, i2) return ! i .eor. i ! long_eor() end function long_eor ! ********************************************************************** ! bit-wise binary operator- i1 .eqv. i2 ! ********************************************************************** ! byte_eqv()- .eqv. for kind byte elemental integer( kind= byte_k) function byte_eqv( b1, b2) integer( kind= byte_k), intent( in) :: b1, b2 ! byte_eqv() continue ! i .eqv. i byte_eqv = not( ieor( b1, b2) ) return ! i .eqv. i ! byte_eqv() end function byte_eqv ! ********************************************************************** ! short_eqv()- .eqv. for kind short elemental integer( kind= short_k) function short_eqv( b1, b2) integer( kind= short_k), intent( in) :: b1, b2 ! short_eqv() continue ! i .eqv. i short_eqv = not( ieor( b1, b2) ) return ! i .eqv. i ! short_eqv() end function short_eqv ! ********************************************************************** ! int_eqv()- .eqv. for kind int elemental integer( kind= int_k) function int_eqv( b1, b2) integer( kind= int_k), intent( in) :: b1, b2 ! int_eqv() continue ! i .eqv. i int_eqv = not( ieor( b1, b2) ) return ! i .eqv. i ! int_eqv() end function int_eqv ! ********************************************************************** ! long_eqv()- .eqv. for kind long elemental integer( kind= long_k) function long_eqv( b1, b2) integer( kind= long_k), intent( in) :: b1, b2 ! long_eqv() continue ! i .eqv. i long_eqv = not( ieor( b1, b2) ) return ! i .eqv. i ! long_eqv() end function long_eqv ! ********************************************************************** ! bit-wise binary operator- i1 .neqv. i2 ! ********************************************************************** ! byte_neqv()- .neqv. for kind byte elemental integer( kind= byte_k) function byte_neqv( b1, b2) integer( kind= byte_k), intent( in) :: b1, b2 ! byte_neqv() continue ! i .neqv. i byte_neqv = ieor( b1, b2) return ! i .neqv. i ! byte_neqv() end function byte_neqv ! ********************************************************************** ! short_neqv()- .neqv. for kind short elemental integer( kind= short_k) function short_neqv( b1, b2) integer( kind= short_k), intent( in) :: b1, b2 ! short_neqv() continue ! i .neqv. i short_neqv = ieor( b1, b2) return ! i .neqv. i ! short_neqv() end function short_neqv ! ********************************************************************** ! int_neqv()- .neqv. for kind int elemental integer( kind= int_k) function int_neqv( b1, b2) integer( kind= int_k), intent( in) :: b1, b2 ! int_neqv() continue ! i .neqv. i int_neqv = ieor( b1, b2) return ! i .neqv. i ! int_neqv() end function int_neqv ! ********************************************************************** ! long_neqv()- .neqv. for kind long elemental integer( kind= long_k) function long_neqv( b1, b2) integer( kind= long_k), intent( in) :: b1, b2 ! long_neqv() continue ! i .neqv. i long_neqv = ieor( b1, b2) return ! i .neqv. i ! long_neqv() end function long_neqv ! ********************************************************************** ! bit-wise binary operator: i1 .xor. i2 ! ********************************************************************** ! byte_xor(): xor() for kind byte elemental integer( kind= byte_k) function byte_xor( i1, i2) integer( kind= byte_k), intent( in) :: i1, i2 ! byte_xor() continue ! i .xor. i byte_xor = ieor( i1, i2) return ! i .xor. i ! byte_xor() end function byte_xor ! ********************************************************************** ! short_xor(): xor() for kind short elemental integer( kind= short_k) function short_xor( i1, i2) integer( kind= short_k), intent( in) :: i1, i2 ! short_xor() continue ! i .xor. i short_xor = ieor( i1, i2) return ! i .xor. i ! short_xor() end function short_xor ! ********************************************************************** ! int_xor(): xor() for kind int elemental integer( kind= int_k) function int_xor( i1, i2) integer( kind= int_k), intent( in) :: i1, i2 ! int_xor() continue ! i .xor. i int_xor = ieor( i1, i2) return ! i .xor. i ! int_xor() end function int_xor ! ********************************************************************** ! long_xor(): xor() for kind long elemental integer( kind= long_k) function long_xor( i1, i2) integer( kind= long_k), intent( in) :: i1, i2 ! long_xor() continue ! i .xor. i long_xor = ieor( i1, i2) return ! i .xor. i ! long_xor() end function long_xor ! ********************************************************************** ! bit_functions ! ********************************************************************** ! $Id: bitfunc.fpp 1.3 2003/10/03 19:28:00Z Dan Release $ end module bit_functions ! eof Day-III/06-coco/bitfunc.fpp100777 0 0 216277 11731455616 10721 0! bof ! ********************************************************************** ! Fortran 95 module bit_functions ! ********************************************************************** ! Source Control Strings ! $Id: bitfunc.fpp 1.3 2003/10/03 19:28:00Z Dan Release $ ! ********************************************************************** ! Copyright 2003 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dannagle@verizon.net ! or fax to 703 424 8525 (USA) ! or mail to 4311-G Bob Ct. ! Fairfax, VA 22030 USA ! ********************************************************************** ! functions and operators for basic bit-level calculations ! ********************************************************************** ! bit_functions operators ! .not. bit-wise for integers ! .and. bit-wise for integers ! .or. bit-wise for integers ! .eor. bit-wise for integers ! .eqv. bit-wise for integers ! .neqv. bit-wise for integers ! .xor. bit-wise for integers ! .hamd. for integers ! .shift. linear shift operator ! .rotate. circular shift operator ! bit_functions library ! csmg() [ = ( i& k) ! ( j& ~k) ] ! compl() for integers ! leadz() ! lastz() ! popcnt() ! poppar() for integers ! ilen() width (a la HPF) ! hamd() hamming distance integer( integer, integer) ! dshftl() ! dshftr() ! dshftc() for integers ! mask() ! maskl() ! maskr() for integers ?? ! ******************************************************************* ?? ! preprocessor definitions ?? include 'coco.inc' ?? ! ******************************************************************* ! ********************************************************************** ! bit_functions module bit_functions ! ********************************************************************** ! use standard parameterization of processor dependencies use standard_types ! ********************************************************************** ! explicit declarations implicit none ! ********************************************************************** ! explicit export private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), parameter :: bit_functions_rcs_source = & '$Id: bitfunc.fpp 1.3 2003/10/03 19:28:00Z Dan Release $' ! ********************************************************************** ! bit_functions library ! ********************************************************************** ! bit functions csmg(), compl(), leadz(), lastz(), popcnt(), poppar() ! ********************************************************************** ! declare specific functions supporting generic function csmg() public :: csmg ! generic name interface csmg ?? if( byte_k )then module procedure byte_csmg ?? end if ?? if( short_k )then module procedure short_csmg ?? end if ?? if( int_k )then module procedure int_csmg ?? end if ?? if( long_k )then module procedure long_csmg ?? end if end interface ! declare specific functions implementing the compl() function public :: compl ! generic name interface compl ?? if( byte_k )then module procedure byte_compl ?? end if ?? if( short_k )then module procedure short_compl ?? end if ?? if( int_k )then module procedure int_compl ?? end if ?? if( long_k )then module procedure long_compl ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function leadz() public :: leadz ! generic name interface leadz ?? if( byte_k )then module procedure byte_leadz ?? end if ?? if( short_k )then module procedure short_leadz ?? end if ?? if( int_k )then module procedure int_leadz ?? end if ?? if( long_k )then module procedure long_leadz ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function lastz() public :: lastz ! generic name interface lastz ?? if( byte_k )then module procedure byte_lastz ?? end if ?? if( short_k )then module procedure short_lastz ?? end if ?? if( int_k )then module procedure int_lastz ?? end if ?? if( long_k )then module procedure long_lastz ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function popcnt() public :: popcnt ! generic name interface popcnt ?? if( byte_k )then module procedure byte_popcnt ?? end if ?? if( short_k )then module procedure short_popcnt ?? end if ?? if( int_k )then module procedure int_popcnt ?? end if ?? if( long_k )then module procedure long_popcnt ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function poppar() public :: poppar ! generic name interface poppar ?? if( byte_k )then module procedure byte_poppar ?? end if ?? if( short_k )then module procedure short_poppar ?? end if ?? if( int_k )then module procedure int_poppar ?? end if ?? if( long_k )then module procedure long_poppar ?? end if end interface ! ********************************************************************** ! bit length of an integer .ilen. ilen() ! ********************************************************************** ! declare specific functions supporting .ilen. public :: operator( .ilen.) ! operator name interface operator( .ilen.) ?? if( byte_k )then module procedure byte_ilen ?? end if ?? if( short_k )then module procedure short_ilen ?? end if ?? if( int_k )then module procedure int_ilen ?? end if ?? if( long_k )then module procedure long_ilen ?? end if end interface ! declare specific functions supporting generic ilen() public :: ilen ! generic name interface ilen ?? if( byte_k )then module procedure byte_ilen ?? end if ?? if( short_k )then module procedure short_ilen ?? end if ?? if( int_k )then module procedure int_ilen ?? end if ?? if( long_k )then module procedure long_ilen ?? end if end interface ! ********************************************************************** ! hamming distance .hamd. hamd() ! ********************************************************************** ! declare specific functions supporting .hamd. public :: operator( .hamd.) ! operator name interface operator( .hamd.) ?? if( byte_k )then module procedure byte_hamd ?? end if ?? if( short_k )then module procedure short_hamd ?? end if ?? if( int_k )then module procedure int_hamd ?? end if ?? if( long_k )then module procedure long_hamd ?? end if end interface ! declare specific functions supporting generic hamd() public :: hamd ! generic name interface hamd ?? if( byte_k )then module procedure byte_hamd ?? end if ?? if( short_k )then module procedure short_hamd ?? end if ?? if( int_k )then module procedure int_hamd ?? end if ?? if( long_k )then module procedure long_hamd ?? end if end interface ! ********************************************************************** ! mask functions mask(), maskl(), maskr() ! ********************************************************************** ! declare specific functions supporting generic function mask() public :: mask ! generic name interface mask ?? if( byte_k )then module procedure byte_mask ?? end if ?? if( short_k )then module procedure short_mask ?? end if ?? if( int_k )then module procedure int_mask ?? end if ?? if( long_k )then module procedure long_mask ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function maskl() public :: maskl ! generic name interface maskl ?? if( byte_k )then module procedure byte_maskl ?? end if ?? if( short_k )then module procedure short_maskl ?? end if ?? if( int_k )then module procedure int_maskl ?? end if ?? if( long_k )then module procedure long_maskl ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function maskr() public :: maskr ! generic name interface maskr ?? if( byte_k )then module procedure byte_maskr ?? end if ?? if( short_k )then module procedure short_maskr ?? end if ?? if( int_k )then module procedure int_maskr ?? end if ?? if( long_k )then module procedure long_maskr ?? end if end interface ! ********************************************************************** ! shifts as binary operators .shift. .rotate. ! ********************************************************************** ! declare specific functions supporting .shift. public :: operator( .shift.) ! operator name interface operator( .shift.) ?? if( byte_k )then module procedure byte_shift ?? end if ?? if( short_k )then module procedure short_shift ?? end if ?? if( int_k )then module procedure int_shift ?? end if ?? if( long_k )then module procedure long_shift ?? end if end interface ! ********************************************************************** ! declare specific functions supporting .rotate. public :: operator( .rotate.) ! operator name interface operator( .rotate.) ?? if( byte_k )then module procedure byte_rotate ?? end if ?? if( short_k )then module procedure short_rotate ?? end if ?? if( int_k )then module procedure int_rotate ?? end if ?? if( long_k )then module procedure long_rotate ?? end if end interface ! ********************************************************************** ! two word shift functions dshftl(), dshftr(), dshftc() ! ********************************************************************** ! declare specific functions supporting generic function dshftl() public :: dshftl ! generic name interface dshftl ?? if( byte_k )then module procedure byte_dshftl ?? end if ?? if( short_k )then module procedure short_dshftl ?? end if ?? if( int_k )then module procedure int_dshftl ?? end if ?? if( long_k )then module procedure long_dshftl ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function dshftr() public :: dshftr ! generic name interface dshftr ?? if( byte_k )then module procedure byte_dshftr ?? end if ?? if( short_k )then module procedure short_dshftr ?? end if ?? if( int_k )then module procedure int_dshftr ?? end if ?? if( long_k )then module procedure long_dshftr ?? end if end interface ! ********************************************************************** ! declare specific functions supporting generic function dshftc() public :: dshftc ! generic name interface dshftc ?? if( byte_k )then module procedure byte_dshftc ?? end if ?? if( short_k )then module procedure short_dshftc ?? end if ?? if( int_k )then module procedure int_dshftc ?? end if ?? if( long_k )then module procedure long_dshftc ?? end if end interface ! ********************************************************************** ! unary operator: .not. ! ********************************************************************** ! declare specific functions implementing the .not. operator public :: operator( .not.) ! operator name interface operator( .not.) ?? if( byte_k )then module procedure byte_not ?? end if ?? if( short_k )then module procedure short_not ?? end if ?? if( int_k )then module procedure int_not ?? end if ?? if( long_k )then module procedure long_not ?? end if end interface ! ********************************************************************** ! binary operators: .and., .or., .eor., .xor., .eqv., .neqv., .xor. ! ********************************************************************** ! declare specific functions implementing the .and. operator public :: operator( .and.) ! operator name interface operator( .and.) ?? if( byte_k )then module procedure byte_and ?? end if ?? if( short_k )then module procedure short_and ?? end if ?? if( int_k )then module procedure int_and ?? end if ?? if( long_k )then module procedure long_and ?? end if end interface ! declare specific functions implementing the .or. operator public :: operator( .or.) ! operator name interface operator( .or.) ?? if( byte_k )then module procedure byte_or ?? end if ?? if( short_k )then module procedure short_or ?? end if ?? if( int_k )then module procedure int_or ?? end if ?? if( long_k )then module procedure long_or ?? end if end interface ! declare specific functions implementing the .eor. operator public :: operator( .eor.) ! operator name interface operator( .eor.) ?? if( byte_k )then module procedure byte_eor ?? end if ?? if( short_k )then module procedure short_eor ?? end if ?? if( int_k )then module procedure int_eor ?? end if ?? if( long_k )then module procedure long_eor ?? end if end interface ! declare specific functions implementing the .eqv. operator public :: operator( .eqv.) ! operator name interface operator( .eqv.) ?? if( byte_k )then module procedure byte_eqv ?? end if ?? if( short_k )then module procedure short_eqv ?? end if ?? if( int_k )then module procedure int_eqv ?? end if ?? if( long_k )then module procedure long_eqv ?? end if end interface ! declare specific functions implementing the .neqv. operator public :: operator( .neqv.) ! operator name interface operator( .neqv.) ?? if( byte_k )then module procedure byte_neqv ?? end if ?? if( short_k )then module procedure short_neqv ?? end if ?? if( int_k )then module procedure int_neqv ?? end if ?? if( long_k )then module procedure long_neqv ?? end if end interface ! declare specific functions implementing the .xor. operator public :: operator( .xor.) ! operator name interface operator( .xor.) ?? if( byte_k )then module procedure byte_xor ?? end if ?? if( short_k )then module procedure short_xor ?? end if ?? if( int_k )then module procedure int_xor ?? end if ?? if( long_k )then module procedure long_xor ?? end if end interface ! ********************************************************************** ! private data ! ********************************************************************** ?? if( byte_k )then ! mask, maskl, maskr data for byte_k integer( kind= byte_k), dimension( bit_size( 0_byte_k) ), save :: & byte_left_mask, byte_right_mask data & byte_left_mask/ z'80', z'c0', z'e0', z'f0', & z'f8', z'fc', z'fe', z'ff'/ data & byte_right_mask/ z'01', z'03', z'07', z'0f', & z'1f', z'3f', z'7f', z'ff'/ ?? end if ?? if( short_k )then ! mask, maskl, maskr data for short_k integer( kind= short_k), dimension( bit_size( 0_short_k) ), save :: & short_left_mask, short_right_mask data & short_left_mask/ z'8000', z'c000', z'e000', z'f000', & z'f800', z'fc00', z'fe00', z'ff00', & z'ff80', z'ffc0', z'ffe0', z'fff0', & z'fff8', z'fffc', z'fffe', z'ffff'/ data & short_right_mask/ z'0001', z'0003', z'0007', z'000f', & z'001f', z'003f', z'007f', z'00ff', & z'01ff', z'03ff', z'07ff', z'0fff', & z'1fff', z'3fff', z'7fff', z'ffff'/ ?? end if ?? if( int_k )then ! mask, maskl, maskr data for int_k integer( kind= int_k), dimension( bit_size( 0_int_k) ), save :: & int_left_mask, int_right_mask data & int_left_mask/ z'80000000', z'c0000000', z'e0000000', z'f0000000', & z'f8000000', z'fc000000', z'fe000000', z'ff000000', & z'ff800000', z'ffc00000', z'ffe00000', z'fff00000', & z'fff80000', z'fffc0000', z'fffe0000', z'ffff0000', & z'ffff8000', z'ffffc000', z'ffffe000', z'fffff000', & z'fffff800', z'fffffc00', z'fffffe00', z'ffffff00', & z'ffffff80', z'ffffffc0', z'ffffffe0', z'fffffff0', & z'fffffff8', z'fffffffc', z'fffffffe', z'ffffffff'/ data & int_right_mask/ z'00000001', z'00000003', z'00000007', z'0000000f', & z'0000001f', z'0000003f', z'0000007f', z'000000ff', & z'000001ff', z'000003ff', z'000007ff', z'00000fff', & z'00001fff', z'00003fff', z'00007fff', z'0000ffff', & z'0001ffff', z'0003ffff', z'0007ffff', z'000fffff', & z'001fffff', z'003fffff', z'007fffff', z'00ffffff', & z'01ffffff', z'03ffffff', z'07ffffff', z'0fffffff', & z'1fffffff', z'3fffffff', z'7fffffff', z'ffffffff'/ ?? end if ?? if( long_k )then ! mask, maskl, maskr dada for long_k integer( kind= long_k), dimension( bit_size( 0_long_k) ), save :: & long_left_mask, long_right_mask data & long_left_mask/ z'8000000000000000', z'c000000000000000', z'e000000000000000', z'f000000000000000', & z'f800000000000000', z'fc00000000000000', z'fe00000000000000', z'ff00000000000000', & z'ff80000000000000', z'ffc0000000000000', z'ffe0000000000000', z'fff0000000000000', & z'fff8000000000000', z'fffc000000000000', z'fffe000000000000', z'ffff000000000000', & z'ffff800000000000', z'ffffc00000000000', z'ffffe00000000000', z'fffff00000000000', & z'fffff80000000000', z'fffffc0000000000', z'fffffe0000000000', z'ffffff0000000000', & z'ffffff8000000000', z'ffffffc000000000', z'ffffffe000000000', z'fffffff000000000', & z'fffffff800000000', z'fffffffc00000000', z'fffffffe00000000', z'ffffffff00000000', & z'ffffffff80000000', z'ffffffffc0000000', z'ffffffffe0000000', z'fffffffff0000000', & z'fffffffff8000000', z'fffffffffc000000', z'fffffffffe000000', z'ffffffffff000000', & z'ffffffffff800000', z'ffffffffffc00000', z'ffffffffffe00000', z'fffffffffff00000', & z'fffffffffff80000', z'fffffffffffc0000', z'fffffffffffe0000', z'ffffffffffff0000', & z'ffffffffffff8000', z'ffffffffffffc000', z'ffffffffffffe000', z'fffffffffffff000', & z'fffffffffffff800', z'fffffffffffffc00', z'fffffffffffffe00', z'ffffffffffffff00', & z'ffffffffffffff80', z'ffffffffffffffc0', z'ffffffffffffffe0', z'fffffffffffffff0', & z'fffffffffffffff8', z'fffffffffffffffc', z'fffffffffffffffe', z'ffffffffffffffff'/ data & long_right_mask/ z'0000000000000001', z'0000000000000003', z'0000000000000007', z'000000000000000f', & z'000000000000001f', z'000000000000003f', z'000000000000007f', z'00000000000000ff', & z'00000000000001ff', z'00000000000003ff', z'00000000000007ff', z'0000000000000fff', & z'0000000000001fff', z'0000000000003fff', z'0000000000007fff', z'000000000000ffff', & z'000000000001ffff', z'000000000003ffff', z'000000000007ffff', z'00000000000fffff', & z'00000000001fffff', z'00000000003fffff', z'00000000007fffff', z'0000000000ffffff', & z'0000000001ffffff', z'0000000003ffffff', z'0000000007ffffff', z'000000000fffffff', & z'000000001fffffff', z'000000003fffffff', z'000000007fffffff', z'00000000ffffffff', & z'00000001ffffffff', z'00000003ffffffff', z'00000007ffffffff', z'0000000fffffffff', & z'0000001fffffffff', z'0000003fffffffff', z'0000007fffffffff', z'000000ffffffffff', & z'000001ffffffffff', z'000003ffffffffff', z'000007ffffffffff', z'00000fffffffffff', & z'00001fffffffffff', z'00003fffffffffff', z'00007fffffffffff', z'0000ffffffffffff', & z'0001ffffffffffff', z'0003ffffffffffff', z'0007ffffffffffff', z'000fffffffffffff', & z'001fffffffffffff', z'003fffffffffffff', z'007fffffffffffff', z'00ffffffffffffff', & z'01ffffffffffffff', z'03ffffffffffffff', z'07ffffffffffffff', z'0fffffffffffffff', & z'1fffffffffffffff', z'3fffffffffffffff', z'7fffffffffffffff', z'ffffffffffffffff'/ ?? end if ! ********************************************************************** ! masks for leadz() ?? if( byte_k )then integer( kind= byte_k), save :: byte_lead_p4; data byte_lead_p4/ z'f0'/ integer( kind= byte_k), save :: byte_lead_p2; data byte_lead_p2/ z'cc'/ integer( kind= byte_k), save :: byte_lead_p1; data byte_lead_p1/ z'aa'/ ?? end if ?? if( short_k )then integer( kind= short_k), save :: short_lead_p8; data short_lead_p8/ z'ff00'/ integer( kind= short_k), save :: short_lead_p4; data short_lead_p4/ z'f0f0'/ integer( kind= short_k), save :: short_lead_p2; data short_lead_p2/ z'cccc'/ integer( kind= short_k), save :: short_lead_p1; data short_lead_p1/ z'aaaa'/ ?? end if ?? if( int_k )then integer( kind= int_k), save :: int_lead_p16; data int_lead_p16/ z'ffff0000'/ integer( kind= int_k), save :: int_lead_p8; data int_lead_p8/ z'ff00ff00'/ integer( kind= int_k), save :: int_lead_p4; data int_lead_p4/ z'f0f0f0f0'/ integer( kind= int_k), save :: int_lead_p2; data int_lead_p2/ z'cccccccc'/ integer( kind= int_k), save :: int_lead_p1; data int_lead_p1/ z'aaaaaaaa'/ ?? end if ?? if( long_k )then integer( kind= long_k), save :: long_lead_p32; data long_lead_p32/ z'ffffffff00000000'/ integer( kind= long_k), save :: long_lead_p16; data long_lead_p16/ z'ffff0000ffff0000'/ integer( kind= long_k), save :: long_lead_p8; data long_lead_p8/ z'ff00ff00ff00ff00'/ integer( kind= long_k), save :: long_lead_p4; data long_lead_p4/ z'f0f0f0f0f0f0f0f0'/ integer( kind= long_k), save :: long_lead_p2; data long_lead_p2/ z'cccccccccccccccc'/ integer( kind= long_k), save :: long_lead_p1; data long_lead_p1/ z'aaaaaaaaaaaaaaaa'/ ?? end if ! ********************************************************************** ! masks for lastz() ?? if( byte_k )then integer( kind= byte_k), save :: byte_last_p4; data byte_last_p4/ z'0f'/ integer( kind= byte_k), save :: byte_last_p2; data byte_last_p2/ z'33'/ integer( kind= byte_k), save :: byte_last_p1; data byte_last_p1/ z'55'/ ?? end if ?? if( short_k )then integer( kind= short_k), save :: short_last_p8; data short_last_p8/ z'00ff'/ integer( kind= short_k), save :: short_last_p4; data short_last_p4/ z'0f0f'/ integer( kind= short_k), save :: short_last_p2; data short_last_p2/ z'3333'/ integer( kind= short_k), save :: short_last_p1; data short_last_p1/ z'5555'/ ?? end if ?? if( int_k )then integer( kind= int_k), save :: int_last_p16; data int_last_p16/ z'0000ffff'/ integer( kind= int_k), save :: int_last_p8; data int_last_p8/ z'00ff00ff'/ integer( kind= int_k), save :: int_last_p4; data int_last_p4/ z'0f0f0f0f'/ integer( kind= int_k), save :: int_last_p2; data int_last_p2/ z'33333333'/ integer( kind= int_k), save :: int_last_p1; data int_last_p1/ z'55555555'/ ?? end if ?? if( long_k )then integer( kind= long_k), save :: long_last_p32; data long_last_p32/ z'00000000ffffffff'/ integer( kind= long_k), save :: long_last_p16; data long_last_p16/ z'0000ffff0000ffff'/ integer( kind= long_k), save :: long_last_p8; data long_last_p8/ z'00ff00ff00ff00ff'/ integer( kind= long_k), save :: long_last_p4; data long_last_p4/ z'0f0f0f0f0f0f0f0f'/ integer( kind= long_k), save :: long_last_p2; data long_last_p2/ z'3333333333333333'/ integer( kind= long_k), save :: long_last_p1; data long_last_p1/ z'5555555555555555'/ ?? end if ! ********************************************************************** ! masks for popcnt()/poppar() ?? if( byte_k )then integer( kind= byte_k), save :: byte_p1; data byte_p1/ z'11'/ integer( kind= byte_k), save :: byte_p2; data byte_p2/ z'22'/ integer( kind= byte_k), save :: byte_p4; data byte_p4/ z'44'/ integer( kind= byte_k), save :: byte_p8; data byte_p8/ z'88'/ integer( kind= byte_k), save :: byte_hi_nibble; data byte_hi_nibble/ z'f0'/ integer( kind= byte_k), save :: byte_lo_nibble; data byte_lo_nibble/ z'0f'/ integer( kind= byte_k), save :: byte_low_bit; data byte_low_bit/ z'01'/ ?? end if ?? if( short_k )then integer( kind= short_k), save :: short_p1; data short_p1/ z'1111'/ integer( kind= short_k), save :: short_p2; data short_p2/ z'2222'/ integer( kind= short_k), save :: short_p4; data short_p4/ z'4444'/ integer( kind= short_k), save :: short_p8; data short_p8/ z'8888'/ integer( kind= short_k), save :: short_hi_nibble; data short_hi_nibble/ z'f0f0'/ integer( kind= short_k), save :: short_lo_nibble; data short_lo_nibble/ z'0f0f'/ integer( kind= short_k), save :: short_low_byte; data short_low_byte/ z'00ff'/ integer( kind= short_k), save :: short_low_bit; data short_low_bit/ z'0001'/ ?? end if ?? if( int_k )then integer( kind= int_k), save :: int_p1; data int_p1/ z'11111111'/ integer( kind= int_k), save :: int_p2; data int_p2/ z'22222222'/ integer( kind= int_k), save :: int_p4; data int_p4/ z'44444444'/ integer( kind= int_k), save :: int_p8; data int_p8/ z'88888888'/ integer( kind= int_k), save :: int_hi_nibble; data int_hi_nibble/ z'f0f0f0f0'/ integer( kind= int_k), save :: int_lo_nibble; data int_lo_nibble/ z'0f0f0f0f'/ integer( kind= int_k), save :: int_low_byte; data int_low_byte/ z'000000ff'/ integer( kind= int_k), save :: int_low_bit; data int_low_bit/ z'00000001'/ ?? end if ?? if( long_k )then integer( kind= long_k), save :: long_p1; data long_p1/ z'1111111111111111'/ integer( kind= long_k), save :: long_p2; data long_p2/ z'2222222222222222'/ integer( kind= long_k), save :: long_p4; data long_p4/ z'4444444444444444'/ integer( kind= long_k), save :: long_p8; data long_p8/ z'8888888888888888'/ integer( kind= long_k), save :: long_hi_nibble; data long_hi_nibble/ z'f0f0f0f0f0f0f0f0'/ integer( kind= long_k), save :: long_lo_nibble; data long_lo_nibble/ z'0f0f0f0f0f0f0f0f'/ integer( kind= long_k), save :: long_low_byte; data long_low_byte/ z'00000000000000ff'/ integer( kind= long_k), save :: long_low_bit; data long_low_bit/ z'0000000000000001'/ ?? end if ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! bit_functions ! ********************************************************************** ! csmg(): conditional scalar merge for integer kinds ?? text :: csmg( kind) ! ********************************************************************** ! ?kind?_csmg(): csmg() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_csmg( i, j, k) integer( kind= ?kind?_k), intent( in) :: i, j, k ! ?kind?_csmg() continue ! csmg() ?kind?_csmg = ior( iand( i, k), iand( j, not( k)) ) return ! csmg() ! ?kind?_csmg() end function ?kind?_csmg ?? end text csmg ?? if( byte_k )then ?? copy :: csmg( byte) ?? end if ?? if( short_k )then ?? copy :: csmg( short) ?? end if ?? if( int_k )then ?? copy :: csmg( int) ?? end if ?? if( long_k )then ?? copy :: csmg( long) ?? end if ! ********************************************************************** ! compl(): bit-wise complement ?? text :: compl( kind) ! ********************************************************************** ! ?kind?_compl(): compl() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_compl( i) integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_compl() continue ! compl() ?kind?_compl = not( i) return ! compl() ! ?kind?_compl() end function ?kind?_compl ?? end text compl ?? if( byte_k )then ?? copy :: compl( byte) ?? end if ?? if( short_k )then ?? copy :: compl( short) ?? end if ?? if( int_k )then ?? copy :: compl( int) ?? end if ?? if( long_k )then ?? copy :: compl( long) ?? end if ! ********************************************************************** ! bit counts: leadz(), lastz(), popcnt(), poppar() ?? if( byte_k )then ! ********************************************************************** ! leadz( b) elemental integer( kind= byte_k) function byte_leadz( b) integer( kind= byte_k), intent( in) :: b ! scratch data and masks integer( kind= byte_k) :: test, at_least ! byte_leadz() continue ! leadz() test = b if( test == 0_byte_k )then ! catch end case byte_leadz = bit_size( b) return ! leadz() end if if( iand( byte_lead_p4, test) == 0_byte_k )then at_least = 4 ! top half all zero else at_least = 0 test = iand( byte_lead_p4, test) end if if( iand( byte_lead_p2, test) == 0_byte_k )then at_least = at_least + 2 ! top quarter all zero else test = iand( byte_lead_p2, test) end if if( iand( byte_lead_p1, test) == 0_byte_k )then at_least = at_least + 1 ! top bit (eighth) zero end if byte_leadz = at_least return ! leadz() ! byte_leadz() end function byte_leadz ?? end if ?? if( short_k )then ! ********************************************************************** ! leadz( b) elemental integer( kind= short_k) function short_leadz( b) integer( kind= short_k), intent( in) :: b ! scratch data integer( kind= short_k) :: test, at_least ! short_leadz() continue ! leadz() test = b if( test == 0_short_k )then ! catch end case short_leadz = bit_size( b) return ! leadz() end if if( iand( short_lead_p8, test) == 0_short_k )then at_least = 8 ! top half all zero else at_least = 0 test = iand( short_lead_p8, test) end if if( iand( short_lead_p4, test) == 0_short_k )then at_least = at_least + 4 ! top quarter all zero else test = iand( short_lead_p4, test) end if if( iand( short_lead_p2, test) == 0_short_k )then at_least = at_least + 2 ! top eighth all zero else test = iand( short_lead_p2, test) end if if( iand( short_lead_p1, test) == 0_short_k )then at_least = at_least + 1 ! top bit (sixteenth) zero end if short_leadz = at_least return ! leadz() ! short_leadz() end function short_leadz ?? end if ?? if( int_k )then ! ********************************************************************** ! leadz( b) elemental integer( kind= int_k) function int_leadz( b) integer( kind= int_k), intent( in) :: b ! scratch data integer( kind= int_k) :: test, at_least ! int_leadz() continue ! leadz() test = b if( test == 0_int_k )then ! catch end case int_leadz = bit_size( b) return ! leadz() end if if( iand( int_lead_p16, test) == 0_int_k )then at_least = 16 ! top half all zero else at_least = 0 test = iand( int_lead_p16, test) end if if( iand( int_lead_p8, test) == 0_int_k )then at_least = at_least + 8 ! top quarter all zero else test = iand( int_lead_p8, test) end if if( iand( int_lead_p4, test) == 0_int_k )then at_least = at_least + 4 ! top eighth all zero else test = iand( int_lead_p4, test) end if if( iand( int_lead_p2, test) == 0_int_k )then at_least = at_least + 2 ! top sixteenth all zero else test = iand( int_lead_p2, test) end if if( iand( int_lead_p1, test) == 0_int_k )then at_least = at_least + 1 ! top bit (thirtysecond) zero end if int_leadz = at_least return ! leadz() ! int_leadz() end function int_leadz ?? end if ?? if( long_k )then ! ********************************************************************** ! leadz( b) elemental integer( kind= long_k) function long_leadz( b) integer( kind= long_k), intent( in) :: b ! scratch data and masks integer( kind= long_k) :: test, at_least ! long_leadz() continue ! leadz() test = b if( test == 0_long_k )then ! catch end case long_leadz = bit_size( b) return ! leadz() end if if( iand( long_lead_p32, test) == 0_long_k )then at_least = 32 ! top half all zero else at_least = 0 test = iand( long_lead_p32, test) end if if( iand( long_lead_p16, test) == 0_long_k )then at_least = at_least + 16 ! top quarter all zero else test = iand( long_lead_p16, test) end if if( iand( long_lead_p8, test) == 0_long_k )then at_least = at_least + 8 ! top eighth all zero else test = iand( long_lead_p8, test) end if if( iand( long_lead_p4, test) == 0_long_k )then at_least = at_least + 4 ! top sixteenth all zero else test = iand( long_lead_p4, test) end if if( iand( long_lead_p2, test) == 0_long_k )then at_least = at_least + 2 ! top thritysecond all zero else test = iand( long_lead_p2, test) end if if( iand( long_lead_p1, test) == 0_long_k )then at_least = at_least + 1 ! top bit (sixtyfourth) zero end if long_leadz = at_least return ! leadz() ! long_leadz() end function long_leadz ?? end if ?? if( byte_k )then ! ********************************************************************** ! lastz( b) elemental integer( kind= byte_k) function byte_lastz( b) integer( kind= byte_k), intent( in) :: b ! scratch data and masks integer( kind= byte_k) :: test, at_least ! byte_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_byte_k )then ! catch end case now byte_lastz = bit_size( b) return end if if( iand( byte_last_p4, test) == 0_byte_k )then at_least = 4 ! bottom half all zero else at_least = 0 test = iand( byte_last_p4, test) end if if( iand( byte_last_p2, test) == 0_byte_k )then at_least = at_least + 2 ! bottom quarter all zero else test = iand( byte_last_p2, test) end if if( iand( byte_last_p1, test) == 0_byte_k )then at_least = at_least + 1 ! bottom bit zero end if byte_lastz = at_least return ! lastz() ! byte_lastz() end function byte_lastz ?? end if ?? if( short_k )then ! ********************************************************************** ! lastz( b) elemental integer( kind= short_k) function short_lastz( b) integer( kind= short_k), intent( in) :: b ! scratch data and masks integer( kind= short_k) :: test, at_least ! short_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_short_k )then ! catch end case now short_lastz = bit_size( b) return end if if( iand( short_last_p8, test) == 0_short_k )then at_least = 8 ! bottom half all zero else at_least = 0 test = iand( short_last_p8, test) end if if( iand( short_last_p4, test) == 0_short_k )then at_least = at_least + 4 ! bottom quarter all zero else test = iand( short_last_p4, test) end if if( iand( short_last_p2, test) == 0_short_k )then at_least = at_least + 2 ! bottom eighth all zero else test = iand( short_last_p2, test) end if if( iand( short_last_p1, test) == 0_short_k )then at_least = at_least + 1 ! bottom bit zero end if short_lastz = at_least return ! lastz() ! short_lastz() end function short_lastz ?? end if ?? if( int_k )then ! ********************************************************************** ! lastz( b) elemental integer( kind= int_k) function int_lastz( b) integer( kind= int_k), intent( in) :: b ! scratch data and masks integer( kind= int_k) :: test, at_least ! int_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_int_k )then ! catch end case now int_lastz = bit_size( b) return end if if( iand( int_last_p16, test) == 0_int_k )then at_least = 16 ! bottom half all zero else at_least = 0 test = iand( int_last_p16, test) end if if( iand( int_last_p8, test) == 0_int_k )then at_least = at_least + 8 ! bottom quarter all zero else test = iand( int_last_p8, test) end if if( iand( int_last_p4, test) == 0_int_k )then at_least = at_least + 4 ! bottom eighth all zero else test = iand( int_last_p4, test) end if if( iand( int_last_p2, test) == 0_int_k )then at_least = at_least + 2 ! bottom sixteenth all zero else test = iand( int_last_p2, test) end if if( iand( int_last_p1, test) == 0_int_k )then at_least = at_least + 1 ! bottom bit zero end if int_lastz = at_least return ! lastz() ! int_lastz() end function int_lastz ?? end if ?? if( long_k )then ! ********************************************************************** ! lastz( b) elemental integer( kind= long_k) function long_lastz( b) integer( kind= long_k), intent( in) :: b ! scratch data and masks integer( kind= long_k) :: test, at_least ! long_lastz() continue ! lastz() test = b ! operate on integer if( test == 0_long_k )then ! catch end case now long_lastz = bit_size( b) return end if if( iand( long_last_p32, test) == 0_long_k )then at_least = 32 ! bottom half all zero else at_least = 0 test = iand( long_last_p32, test) end if if( iand( long_last_p16, test) == 0_long_k )then at_least = at_least + 16 ! bottom half all zero else test = iand( long_last_p16, test) end if if( iand( long_last_p8, test) == 0_long_k )then at_least = at_least + 8 ! bottom quarter all zero else test = iand( long_last_p8, test) end if if( iand( long_last_p4, test) == 0_long_k )then at_least = at_least + 4 ! bottom eighth all zero else test = iand( long_last_p4, test) end if if( iand( long_last_p2, test) == 0_long_k )then at_least = at_least + 2 ! bottom sixteenth all zero else test = iand( long_last_p2, test) end if if( iand( long_last_p1, test) == 0_long_k )then at_least = at_least + 1 ! bottom bit zero end if long_lastz = at_least return ! lastz() ! long_lastz() end function long_lastz ?? end if ?? if( byte_k )then ! ********************************************************************** ! popcnt( b) elemental integer( kind= byte_k) function byte_popcnt( b) integer( kind= byte_k), intent( in) :: b ! scratch data integer( kind= byte_k) :: test, t1, t2, t4, t8 ! byte_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, byte_p1) ! 1 bit from each nibble t2 = iand( test, byte_p2) t4 = iand( test, byte_p4) t8 = iand( test, byte_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, byte_hi_nibble) t2 = iand( test, byte_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, byte_lo_nibble) ! return popcnt byte_popcnt = test return ! popcnt() ! byte_popcnt() end function byte_popcnt ?? end if ?? if( short_k )then ! ********************************************************************** ! popcnt( b) elemental integer( kind= short_k) function short_popcnt( b) integer( kind= short_k), intent( in) :: b ! scratch data integer( kind= short_k) :: test, t1, t2, t4, t8 ! short_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, short_p1) ! 1 bit from each nibble t2 = iand( test, short_p2) t4 = iand( test, short_p4) t8 = iand( test, short_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, short_hi_nibble) t2 = iand( test, short_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, short_lo_nibble) ! add each of 2 bytes & mask off low byte test = test + ishft( test, -8) short_popcnt = iand( test, short_low_byte) return ! popcnt() ! short_popcnt() end function short_popcnt ?? end if ?? if( int_k )then ! ********************************************************************** ! popcnt( b) elemental integer( kind= int_k) function int_popcnt( b) integer( kind= int_k), intent( in) :: b ! scratch data and masks integer( kind= int_k) :: test, t1, t2, t4, t8 ! int_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, int_p1) ! 1 bit from each nibble t2 = iand( test, int_p2) t4 = iand( test, int_p4) t8 = iand( test, int_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, int_hi_nibble) t2 = iand( test, int_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, int_lo_nibble) ! add each of 4 bytes & mask off low byte test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) int_popcnt = iand( test, int_low_byte) return ! popcnt() ! int_popcnt() end function int_popcnt ?? end if ?? if( long_k )then ! ********************************************************************** ! popcnt( b) elemental integer( kind= long_k) function long_popcnt( b) integer( kind= long_k), intent( in) :: b ! scratch data and masks integer( kind= long_k) :: test, t1, t2, t4, t8 ! long_popcnt() continue ! popcnt() test = b ! operate on integer t1 = iand( test, long_p1) ! 1 bit from each nibble t2 = iand( test, long_p2) t4 = iand( test, long_p4) t8 = iand( test, long_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) ! each nibble now contains [ 0, 1, 2, 3] t1 = iand( test, long_hi_nibble) t2 = iand( test, long_lo_nibble) ! add each of 4 high nibbles with each of 4 low nibbles test = iand( ishft( t1, -4) + t2, long_lo_nibble) ! add each of 4 bytes & mask off low byte test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) & + ishft( test, -32) + ishft( test, -40) + ishft( test, -48) + ishft( test, -56) long_popcnt = iand( test, long_low_byte) return ! popcnt() ! long_popcnt() end function long_popcnt ?? end if ?? if( byte_k )then ! ********************************************************************** ! poppar( b) elemental integer( kind= byte_k) function byte_poppar( b) integer( kind= byte_k), intent( in) :: b ! local data integer( kind= byte_k) :: test, t1, t2, t4, t8 ! byte_poppar() continue ! poppar() test = b t1 = iand( test, byte_p1) t2 = iand( test, byte_p2) t4 = iand( test, byte_p4) t8 = iand( test, byte_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, byte_hi_nibble) t2 = iand( test, byte_lo_nibble) test = iand( ishft( t1, -4) + t2, byte_lo_nibble) byte_poppar = iand( test, byte_low_bit) return ! poppar() ! byte_poppar() end function byte_poppar ?? end if ?? if( short_k )then ! ********************************************************************** ! poppar( b) elemental integer( kind= short_k) function short_poppar( b) integer( kind= short_k), intent( in) :: b ! local data integer( kind= short_k) :: test, t1, t2, t4, t8 ! short_poppar() continue ! poppar() test = b t1 = iand( test, short_p1) t2 = iand( test, short_p2) t4 = iand( test, short_p4) t8 = iand( test, short_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, short_hi_nibble) t2 = iand( test, short_lo_nibble) test = iand( ishft( t1, -4) + t2, short_lo_nibble) test = test + ishft( test, -8) short_poppar = iand( test, short_low_bit) return ! poppar() ! short_poppar() end function short_poppar ?? end if ?? if( int_k )then ! ********************************************************************** ! poppar( b) elemental integer( kind= int_k) function int_poppar( b) integer( kind= int_k), intent( in) :: b ! local data integer( kind= int_k) :: test, t1, t2, t4, t8 ! int_poppar() continue ! poppar() test = b t1 = iand( test, int_p1) t2 = iand( test, int_p2) t4 = iand( test, int_p4) t8 = iand( test, int_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, int_hi_nibble) t2 = iand( test, int_lo_nibble) test = iand( ishft( t1, -4) + t2, int_lo_nibble) test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) int_poppar = iand( test, int_low_bit) return ! poppar() ! int_poppar() end function int_poppar ?? end if ?? if( long_k )then ! ********************************************************************** ! poppar( b) elemental integer( kind= long_k) function long_poppar( b) integer( kind= long_k), intent( in) :: b ! local data integer( kind= long_k) :: test, t1, t2, t4, t8 ! long_poppar() continue ! poppar() test = b t1 = iand( test, long_p1) t2 = iand( test, long_p2) t4 = iand( test, long_p4) t8 = iand( test, long_p8) test = t1 + ishft( t2, -1) + ishft( t4, -2) + ishft( t8, -3) t1 = iand( test, long_hi_nibble) t2 = iand( test, long_lo_nibble) test = iand( ishft( t1, -4) + t2, long_lo_nibble) test = test + ishft( test, -8) + ishft( test, -16) + ishft( test, -24) long_poppar = iand( test, long_low_bit) return ! poppar() ! long_poppar() end function long_poppar ?? end if ! ********************************************************************** ! .ilen. i, ilen( i) ?? text :: ilen( kind) ! ********************************************************************** ! ?kind?_ilen() elemental integer( kind= ?kind?_k) function ?kind?_ilen( i) integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_ilen() continue ! .ilen. i, ilen() ?kind?_ilen = bit_size( i) - leadz( abs( i)) return ! .ilen i, ilen() ! ?kind?_ilen() end function ?kind?_ilen ?? end text ilen ?? if( byte_k )then ?? copy :: ilen( byte) ?? end if ?? if( short_k )then ?? copy :: ilen( short) ?? end if ?? if( int_k )then ?? copy :: ilen( int) ?? end if ?? if( long_k )then ?? copy :: ilen( long) ?? end if ! ********************************************************************** ! i .hamd. i, hamd( i, i) ?? text :: hamd( kind) ! ********************************************************************** ! ?kind?_hamd() elemental integer( kind= ?kind?_k) function ?kind?_hamd( i, j) integer( kind= ?kind?_k), intent( in) :: i, j ! ?kind?_hamd() continue ! i .hamd. i, hamd() ?kind?_hamd = popcnt( ieor( i, j)) return ! i .hamd i, hamd() ! ?kind?_hamd() end function ?kind?_hamd ?? end text hamd ?? if( byte_k )then ?? copy :: hamd( byte) ?? end if ?? if( short_k )then ?? copy :: hamd( short) ?? end if ?? if( int_k )then ?? copy :: hamd( int) ?? end if ?? if( long_k )then ?? copy :: hamd( long) ?? end if ! ********************************************************************** ! masks: mask(), maskl(), maskr() ?? text :: mask( kind) ! ********************************************************************** ! mask( i) elemental integer( kind= ?kind?_k) function ?kind?_mask( i) integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_mask() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! ?kind?_mask() continue ! mask() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 ?kind?_mask = ?kind?_right_mask( i) case( -bs: -1) bits ! [ -8, -1] ==> 11... 1100... 00 ?kind?_mask = ?kind?_left_mask( abs( i)) case default bits ! otherwise 00... 00 ?kind?_mask = 0_?kind?_k end select bits return ! mask() ! ?kind?_mask() end function ?kind?_mask ?? end text mask ?? if( byte_k )then ?? copy :: mask( byte) ?? end if ?? if( short_k )then ?? copy :: mask( short) ?? end if ?? if( int_k )then ?? copy :: mask( int) ?? end if ?? if( long_k )then ?? copy :: mask( long) ?? end if ?? text :: maskl( kind) ! ********************************************************************** ! maskl( i) elemental integer( kind= ?kind?_k) function ?kind?_maskl( i) integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_maskl() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! ?kind?_maskl() continue ! maskl() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 11... 1100... 00 ?kind?_maskl = ?kind?_left_mask( i) case default bits ! otherwise 00... 00 ?kind?_maskl = 0_?kind?_k end select bits return ! maskl() ! ?kind?_maskl() end function ?kind?_maskl ?? end text maskl ?? if( byte_k )then ?? copy :: maskl( byte) ?? end if ?? if( short_k )then ?? copy :: maskl( short) ?? end if ?? if( int_k )then ?? copy :: maskl( int) ?? end if ?? if( long_k )then ?? copy :: maskl( long) ?? end if ?? text :: maskr( kind) ! ********************************************************************** ! maskr( i) elemental integer( kind= ?kind?_k) function ?kind?_maskr( i) integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_maskr() local integer, parameter :: bs = bit_size( i) ! bits in kind i ! ?kind?_maskr() continue ! maskr() bits: select case( i) case( 1: bs) bits ! [ 1, 8] ==> 00... 0011... 11 ?kind?_maskr = ?kind?_right_mask( i) case default bits ! otherwise 00... 00 ?kind?_maskr = 0_?kind?_k end select bits return ! maskr() ! ?kind?_maskr() end function ?kind?_maskr ?? end text maskr ?? if( byte_k )then ?? copy :: maskr( byte) ?? end if ?? if( short_k )then ?? copy :: maskr( short) ?? end if ?? if( int_k )then ?? copy :: maskr( int) ?? end if ?? if( long_k )then ?? copy :: maskr( long) ?? end if ! ********************************************************************** ! specific functions implementing shifts as binary operators ?? text :: shift( kind) ! ********************************************************************** ! shift( i, j) elemental integer( kind= ?kind?_k) function ?kind?_shift( i, j) integer( kind= ?kind?_k), intent( in) :: i, j ! ?kind?_shift() continue ! .shift. ?kind?_shift = ishft( i, j) return ! .shift. ! ?kind?_shift() end function ?kind?_shift ?? end text shift ?? if( byte_k )then ?? copy :: shift( byte) ?? end if ?? if( short_k )then ?? copy :: shift( short) ?? end if ?? if( int_k )then ?? copy :: shift( int) ?? end if ?? if( long_k )then ?? copy :: shift( long) ?? end if ?? text :: rotate( kind) ! ********************************************************************** ! rotate( i, j) elemental integer( kind= ?kind?_k) function ?kind?_rotate( i, j) integer( kind= ?kind?_k), intent( in) :: i, j ! ?kind?_rotate() continue ! .rotate. ?kind?_rotate = ishftc( i, j) return ! .rotate. ! ?kind?_rotate() end function ?kind?_rotate ?? end text rotate ?? if( byte_k )then ?? copy :: rotate( byte) ?? end if ?? if( short_k )then ?? copy :: rotate( short) ?? end if ?? if( int_k )then ?? copy :: rotate( int) ?? end if ?? if( long_k )then ?? copy :: rotate( long) ?? end if ! ********************************************************************** ! double word shifts: dshftl(), dshftr(), dshftc() ?? text :: dshftl( kind) ! ********************************************************************** ! dshftl( bl, br, i) elemental integer( kind= ?kind?_k) function ?kind?_dshftl( bl, br, i) integer( kind= ?kind?_k), intent( in) :: bl, br integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_dshftl() local integer( kind= int_k) :: btl, btr ! ?kind?_dshftl() continue ! dshftl() ! trap out endcase if( i < 0 )then ?kind?_dshftl = 0_?kind?_k return ! dshftl() elseif( i == 0 )then ?kind?_dshftl = bl return ! dshftl() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, i) btr = ishft( br, i - bit_size( i)) ?kind?_dshftl = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word ?kind?_dshftl = br else ! if shift out of range ?kind?_dshftl = 0_?kind?_k end if return ! dshftl() ! ?kind?_dshftl() end function ?kind?_dshftl ?? end text dshftl ?? if( byte_k )then ?? copy :: dshftl( byte) ?? end if ?? if( short_k )then ?? copy :: dshftl( short) ?? end if ?? if( int_k )then ?? copy :: dshftl( int) ?? end if ?? if( long_k )then ?? copy :: dshftl( long) ?? end if ?? text :: dshftr( kind) ! ********************************************************************** ! dshftr( bl, br, i) elemental integer( kind= ?kind?_k) function ?kind?_dshftr( bl, br, i) integer( kind= ?kind?_k), intent( in) :: bl, br integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_dshftr() local integer( kind= ?kind?_k) :: btl, btr ! ?kind?_dshftr() continue ! dshftr() ! trap out endcase if( i < 0 )then ?kind?_dshftr = 0_?kind?_k return ! dshftr() elseif( i == 0 )then ?kind?_dshftr = br return ! dshftr() end if if( i < bit_size( i) )then ! if shift within one word btl = ishft( bl, bit_size( i) - i) btr = ishft( br, -i) ?kind?_dshftr = ior( btl, btr) elseif( i == bit_size( i) )then ! shift is exactly one word ?kind?_dshftr = bl else ! if shift out of range ?kind?_dshftr = 0_?kind?_k end if return ! dshftr() ! ?kind?_dshftr() end function ?kind?_dshftr ?? end text dshftr ?? if( byte_k )then ?? copy :: dshftr( byte) ?? end if ?? if( short_k )then ?? copy :: dshftr( short) ?? end if ?? if( int_k )then ?? copy :: dshftr( int) ?? end if ?? if( long_k )then ?? copy :: dshftr( long) ?? end if ?? text :: dshftc( kind) ! ********************************************************************** ! dshftc( bl, br, i) elemental subroutine ?kind?_dshftc( bl, br, i) integer( kind= ?kind?_k), intent( inout) :: bl, br integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_dshftc() local integer( kind= ?kind?_k) :: btl, btr, carryl, carryr, ia ! ?kind?_dshftc() continue ! dshftc() ia = abs( i) if( ia > bit_size( i) ) return if( ia == bit_size( i) )then ! if exactly swapping words btl = br btr = bl bl = btl br = btr elseif( i=1 )then ! if i+ shift left carryl = ishft( bl, i - bit_size( i)) carryr = ishft( br, i - bit_size( i)) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) elseif( ia=1 )then ! if i- shift right carryl = ishft( bl, bit_size( i) + i) carryr = ishft( br, bit_size( i) + i) btl = ishft( bl, i) btr = ishft( br, i) bl = ior( btl, carryr) br = ior( btr, carryl) end if ! else do nothing return ! dshftc() ! ?kind?_dshftc() end subroutine ?kind?_dshftc ?? end text dshftc ?? if( byte_k )then ?? copy :: dshftc( byte) ?? end if ?? if( short_k )then ?? copy :: dshftc( short) ?? end if ?? if( int_k )then ?? copy :: dshftc( int) ?? end if ?? if( long_k )then ?? copy :: dshftc( long) ?? end if ! ********************************************************************** ! bit-wise unary operator- .not. i ?? text :: not( kind) ! ********************************************************************** ! ?kind?_not()- .not. for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_not( i) integer( kind= ?kind?_k), intent( in) :: i ! ?kind?_not() continue ! .not. i ?kind?_not = not( i) return ! .not. i ! ?kind?_not() end function ?kind?_not ?? end text not ?? if( byte_k )then ?? copy :: not( byte) ?? end if ?? if( short_k )then ?? copy :: not( short) ?? end if ?? if( int_k )then ?? copy :: not( int) ?? end if ?? if( long_k )then ?? copy :: not( long) ?? end if ! ********************************************************************** ! bit-wise binary operator- i1 .and. i2 ?? text :: and( kind) ! ********************************************************************** ! ?kind?_and()- .and. for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_and( i1, i2) integer( kind= ?kind?_k), intent( in) :: i1, i2 ! ?kind?_and() continue ! i .and. i ?kind?_and = iand( i1, i2) return ! i .and. i ! ?kind?_and() end function ?kind?_and ?? end text and ?? if( byte_k )then ?? copy :: and( byte) ?? end if ?? if( short_k )then ?? copy :: and( short) ?? end if ?? if( int_k )then ?? copy :: and( int) ?? end if ?? if( long_k )then ?? copy :: and( long) ?? end if ! ********************************************************************** ! bit-wise binary operator- i1 .or. i2 ?? text :: or( kind) ! ********************************************************************** ! ?kind?_or()- .or. for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_or( i1, i2) integer( kind= ?kind?_k), intent( in) :: i1, i2 ! ?kind?_or() continue ! i .or. i ?kind?_or = ior( i1, i2) return ! i .or. i ! ?kind?_or() end function ?kind?_or ?? end text or ?? if( byte_k )then ?? copy :: or( byte) ?? end if ?? if( short_k )then ?? copy :: or( short) ?? end if ?? if( int_k )then ?? copy :: or( int) ?? end if ?? if( long_k )then ?? copy :: or( long) ?? end if ! ********************************************************************** ! bit-wise binary operator- i1 .eor. i2 ?? text :: eor( kind) ! ********************************************************************** ! ?kind?_eor()- .eor. for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_eor( i1, i2) integer( kind= ?kind?_k), intent( in) :: i1, i2 ! ?kind?_eor() continue ! i .eor. i ?kind?_eor = ieor( i1, i2) return ! i .eor. i ! ?kind?_eor() end function ?kind?_eor ?? end text eor ?? if( byte_k )then ?? copy :: eor( byte) ?? end if ?? if( short_k )then ?? copy :: eor( short) ?? end if ?? if( int_k )then ?? copy :: eor( int) ?? end if ?? if( long_k )then ?? copy :: eor( long) ?? end if ! ********************************************************************** ! bit-wise binary operator- i1 .eqv. i2 ?? text :: eqv( kind) ! ********************************************************************** ! ?kind?_eqv()- .eqv. for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_eqv( b1, b2) integer( kind= ?kind?_k), intent( in) :: b1, b2 ! ?kind?_eqv() continue ! i .eqv. i ?kind?_eqv = not( ieor( b1, b2) ) return ! i .eqv. i ! ?kind?_eqv() end function ?kind?_eqv ?? end text eqv ?? if( byte_k )then ?? copy :: eqv( byte) ?? end if ?? if( short_k )then ?? copy :: eqv( short) ?? end if ?? if( int_k )then ?? copy :: eqv( int) ?? end if ?? if( long_k )then ?? copy :: eqv( long) ?? end if ! ********************************************************************** ! bit-wise binary operator- i1 .neqv. i2 ?? text :: neqv( kind) ! ********************************************************************** ! ?kind?_neqv()- .neqv. for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_neqv( b1, b2) integer( kind= ?kind?_k), intent( in) :: b1, b2 ! ?kind?_neqv() continue ! i .neqv. i ?kind?_neqv = ieor( b1, b2) return ! i .neqv. i ! ?kind?_neqv() end function ?kind?_neqv ?? end text neqv ?? if( byte_k )then ?? copy :: neqv( byte) ?? end if ?? if( short_k )then ?? copy :: neqv( short) ?? end if ?? if( int_k )then ?? copy :: neqv( int) ?? end if ?? if( long_k )then ?? copy :: neqv( long) ?? end if ! ********************************************************************** ! bit-wise binary operator: i1 .xor. i2 ?? text :: xor( kind) ! ********************************************************************** ! ?kind?_xor(): xor() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_xor( i1, i2) integer( kind= ?kind?_k), intent( in) :: i1, i2 ! ?kind?_xor() continue ! i .xor. i ?kind?_xor = ieor( i1, i2) return ! i .xor. i ! ?kind?_xor() end function ?kind?_xor ?? end text xor ?? if( byte_k )then ?? copy :: xor( byte) ?? end if ?? if( short_k )then ?? copy :: xor( short) ?? end if ?? if( int_k )then ?? copy :: xor( int) ?? end if ?? if( long_k )then ?? copy :: xor( long) ?? end if ! ********************************************************************** ! bit_functions ! ********************************************************************** ! $Id: bitfunc.fpp 1.3 2003/10/03 19:28:00Z Dan Release $ end module bit_functions ! eof Day-III/06-coco/Bugs/ 40777 0 0 0 12000033650 7255 5Day-III/06-coco/Bugs/._gfortran_ICE.txt100777 0 0 10000 12000033502 12640 0Mac OS X  2TEXT!RchATTR;com.apple.TextEncodingUTF-8;134217984This resource fork intentionally left blank Day-III/06-coco/Bugs/bug100777 0 0 21520 11662466424 10123 0 H__PAGEZERO__TEXT__text__TEXT  __stubs__TEXT__stub_helper__TEXT8__const__TEXT@__eh_frame__TEXT@@__DATA__dyld__DATA8__nl_symbol_ptr__DATA88__la_symbol_ptr__DATAH H__data__DATA __common__DATA H__LINKEDIT  P"0   ` x!H" P  "  /usr/lib/dyld8+I0àw'$ *  H/usr/local/gfortran/lib/libgfortran.3.dylib 8/usr/lib/libSystem.B.dylib H/usr/local/gfortran/lib/libgcc_s.1.dylib H/usr/local/gfortran/lib/libquadmath.0.dylib& jHHH}HuHHHH9uHgASLAS%%UHH}]UHH HE= uHEHEHEHH=IUHH}HuHUEH։H5%%%%hhh7 hTLIAS%9What! Me worry?zRx 4   ,T; 4= 8 __"UBT@dyld_stub_binderQr8rH@__gfortran_set_argsrP@__gfortran_set_optionsrX@__gfortran_stop_stringr`@_exit_ startK_'mainPNXArgUenvirongmh_execute_headerG_prognamelc]vb!!!!< ;(..88@ P e m u  s  @@  dyld_stub_binding_helper__dyld_func_lookup_foo.1540_MAIN___options.0.1565___vtab_bug_P_t.1549_NXArgc_NXArgv___progname__mh_execute_header_environ_mainstart__gfortran_set_args__gfortran_set_options__gfortran_stop_string_exitdyld_stub_binderDay-III/06-coco/Bugs/bug.f90100777 0 0 504 11662466214 10454 0program bug implicit none type, abstract :: p_t end type p_t type, extends( p_t) :: c_t end type c_t class( p_t), pointer :: p_p continue select type( p_p) type is( c_t) call foo( p_p) end select stop "What! Me worry?" contains subroutine foo( ptr) type( c_t), pointer :: ptr end subroutine foo end program bug Day-III/06-coco/Bugs/gfortran_ICE.txt100777 0 0 3674 11673213360 12447 0 Dan-Nagles-MacBook:Preprocessor dan$ gfortran -v -save-temps -std=f2008 -Wall -fcheck=all coco.f90 -o coco Driving: gfortran -mmacosx-version-min=10.7.2 -v -save-temps -std=f2008 -Wall -fcheck=all coco.f90 -o coco -l gfortran -shared-libgcc Using built-in specs. COLLECT_GCC=gfortran COLLECT_LTO_WRAPPER=/usr/local/gfortran/libexec/gcc/x86_64-apple-darwin11/4.6.2/lto-wrapper Target: x86_64-apple-darwin11 Configured with: ../gcc-4.6.2-RC-20111019/configure --prefix=/usr/local/gfortran --with-gmp=/Users/fx/devel/gcc/deps-static/x86_64 --enable-languages=c,c++,fortran,objc,obj-c++ --build=x86_64-apple-darwin11 Thread model: posix gcc version 4.6.2 20111019 (prerelease) (GCC) COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.7.2' '-v' '-save-temps' '-std=f2008' '-Wall' '-fcheck=all' '-o' 'coco' '-shared-libgcc' '-mtune=core2' /usr/local/gfortran/libexec/gcc/x86_64-apple-darwin11/4.6.2/f951 coco.f90 -fPIC -quiet -dumpbase coco.f90 -mmacosx-version-min=10.7.2 -mtune=core2 -auxbase coco -Wall -std=f2008 -version -fcheck=all -fintrinsic-modules-path /usr/local/gfortran/lib/gcc/x86_64-apple-darwin11/4.6.2/finclude -o coco.s GNU Fortran (GCC) version 4.6.2 20111019 (prerelease) (x86_64-apple-darwin11) compiled by GNU C version 4.6.2 20111019 (prerelease), GMP version 5.0.2, MPFR version 3.0.1-p4, MPC version 0.9 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU Fortran (GCC) version 4.6.2 20111019 (prerelease) (x86_64-apple-darwin11) compiled by GNU C version 4.6.2 20111019 (prerelease), GMP version 5.0.2, MPFR version 3.0.1-p4, MPC version 0.9 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 coco.f90: In function ‘process_block_directive’: coco.f90:12574:0: internal compiler error: in gfc_trans_block_construct, at fortran/trans-stmt.c:984 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. Dan-Nagles-MacBook:Preprocessor dan$ Day-III/06-coco/Bugs/type.f90100777 0 0 400 11666012726 10652 0program bugger type :: thingo_t end type thingo_t type, extends( thingo_t) :: sonofthingo_t end type sonofthingo_t class( thingo_t), pointer :: pt continue select type( pt) type in( sonofthingo_t) end select stop 'whew!' end program bugger Day-III/06-coco/coco100777 0 0 3523120 11740036652 7430 0 H__PAGEZEROx__TEXT __text__TEXT.G __stubs__TEXTY zY __stub_helper__TEXTx[ x[ __cstring__TEXT^ mO^ __const__TEXTp (p __unwind_info__TEXT  __eh_frame__TEXT@ #@ x__DATA ` __program_vars__DATA ( __got__DATA( @( ?__nl_symbol_ptr__DATAh h G__la_symbol_ptr__DATAx x I__data__DATA  __bss__DATA @__common__DATA8 H__LINKEDITP P"0  0Ȧ 0  H P>( /usr/lib/dyldB÷=I3ɎiX$ * @/usr/local/lib/NAG_Fortran/libf53.dylib 8/usr/lib/libSystem.B.dylib& pjHHH}HuHHHH9uHL[H UH1]G UH]NG UH]>G UH]@G UHAVAUATSID.HOD9SĉADEH5 D9DiF$0AAIcHLLNHHLL@H@HFIPIQIHIIIpIqEEEL$AEAAtEIcHLL^McIMMAIAHFIPISIHIKMHMKEEEL$IcHLLnMcIMM\$ID$HFISIUIKIMMcMeAAMcIMMl$McIMIKICID$HqIuHQIULYM]AAAMcIMM\$IcHLHJHBID$HqIsLiMkHQISA@EaIcHLLfHHLHHH@HFLiMl$LYM\$HQIT$A@AqLcIMIuHHLHHH@IELYL^LaLfHQHVA@EiMcIMMkHHLHHH@ICLaMeHqIuHQIUAAAENIcHAHMBNIRHHBHuHLZM\ AAE)ANAAHHHL@L`MbIXIZMXMZ MhMj(AIr E9tvt8AAHHHHPHXH^LZL^LjLn HJHN(AIr@CHHHHHLXL^LiLnHQHV LaLf(AH CHHHL`LhLnIT$HVIL$HN I\$H^(AH E9CHHHHXHPHVHKHNLcLf L[L^(L^ CDHHHL`LhMkIT$ISIL$IK I\$I[(L^@CDHHHL`LhMkIT$ISIL$IK I\$I[(L^`CDHHHL`LhMkIT$ISIL$IK I\$I[(AHE9IcHHH ;IJD)7E2[A\A]A^]AuĉHcLaIIRIQHs LLHEHt4DEHN(H96H1AAGHNHH I9(tdtOt:t%t@HJHH I9~THJHH I9~DHJHH I9~4HJHH I9~$HJHH I9~HJHH I9HcIIK43HFHEI9"LHFHM)d(xHNHHr`I9~xHNHHI9~xHNHHI9~xHNHHI9~xHNHHI9lxHNHHI9UGD9t2HJHHr I9:HNHHr@I9Z!H?HELL II|$HuMcIM|$O|Mf MfE14UOA9AAG ALfHcHN3IKMkLnHQIT$LAMD$LyM|$DGE9EAt|At2IcHLHrLzM{LfLaHFHALVLQDGE`McIMIzIcHLHHHpIrLYL_HYH_LiLoAApHcHLL{McIMIzMZL[HOIOLoMoHWIWAE9A@HHLLxMcIMMbMjLhIL$IOI|$IIT$IWEXIcHLLZHrIrICID$I[I\$MkMl$AHLcIMMeI}HzM|$M{It$IsMT$MSA@HHLLxHXI]II|$IWIT$IGID$AE9AAA;DL}EE11qUHAWAVAUATSHIIHUIHYH9cL;qYHE1GAHQ L9q0&t|tbtHt.tAHZ0HQ@L9ALB0H M9AHr0H L9AHJ0H L9ALZ0H M9ALJ0H M9AMA9t|HB L9r0wrDiHP L9p0wdDiHp@L9r0wVDiHP`L9v0wHDiHL9r0w7DiHL9v0w&DiHL9r0wDiHL9v0yIcHJ E1HHULLSE$AxE9DD‰׃ApMcIMIKLcIO!MJMBMCIQHQIAHAMALAAHt5AxLcIMIsISIRHFIAHNIILVMQAEHIcHLLBMcIMMSICHBIJIHIrIpIzIxEMcIOt<ILuOt<(H[A\A]A^A_]EPIcHLLVHFIAMJLOMZL_IJHOAxLcIMI{ICHFHWIRHwIrLOMJEHIcHLLPHPISIJHOIrHwMBLGEApIcHLHJHcHN 'IyMQLRHGHAL_LYLWLQD9% HLL@LLPLLX HHx(HHA0HHQ8HHq@LLIHLLAPLLQXLLY`HHyhHHApHHQxHHLLLLTLL\HH| HHT(L^ IID MML MMD MMT (LF@II|IITIID MML(HF`LLTLL\HH| HHT(HLLLLLDLLT LL\(LIID IIT MML MMD (LMM\ II| IID IIT (HH_<<H{VLLA;IcLNIK !A$K!HHBHuLjHHMl M9s&HHULL_H[A\A]A^A_]H^HJ #HULL0MAML$0M9L$AM\$PM9\$8AID$@HP0H9PAPAHXPH9X8AHppH9pXDBLL9PxDBHH9~DBLL9fDBLL9NDBHH96DBH0H9DBH Ax*19A HQH9 E1ҍGAHQ0H H9Ft|tbtHt.tAHQ0H H9AHQ0H I9AHQ0H I9AHQ0H I9AHQ0H I9AHQ0H I9ArA9HQ0HA I9DVHP0HH I9vvDVHQ0HH@I9veDVHQ0HH`I9vTDVHQ0HI9v@DVHQ0HI9v,DVHQ0HI9vDVHQ0HI9YI99E(xND9EAEDƃqEKIcHLLiMcIK LCL[LYI@IEIxI}IPIUE9qE˃t5AsHcHLLHHxH{IQIPMiMhIYIXAECMcIMM]IcHLHOHWIULIMKHYI[HqIsEASLcIMIuIEI@LFLGLNLOHNHOA[LcIMIYIyI}HCHFLCLFH{H~ECIcHLLZLjMiIKHKIsHsICHCEEKIcHLLjIcHN'IxI@HBH_I]HwIuHOIME9McIO#MrMzIL}O|(A$H[A\A]A^A_]HAArHcHHLL@M9M9HHL9L1u EXAwZMcEAALHJ&IcHHJ4'H~HFH9CAMcLHLHKHVHSHGHAHWHQH_HYAAxELHN&IcHHJ4#H~HVI9RaAMcLHLLSHSHGIBHWIRHOIJAAxcAMcLHLHHHVHPH_HYLWLQHwHqAXALHN&HcHHJ4'H~HVI9RAMcMIMMBHVIRHGI@HOIHLWMPDCAxLHN!IcHHJ4'H~HFI9B+LHHID (ID(H^IZE$AE$A<-AvvD)ǃEKEPIcHLHsIcHLHJHBHCHQHVHAHFHYH^AwtDEKEPIcHLL[IcHLLBHBHCIHIKIpIsIxI{AAIcHLL[IcHLLBHBHCIHIKIpIsIxI{AAIcHLL[IcHLLBHBHCIHIKIpIsIxI{Aw AQABHcHLL[HHLL@H@HCIHIKIpIsIxI{AQABHcHLL[HHLL@H@HCIHIKIpIsIxI{AQABHcHLL[HHLL@H@HCIHIKIpIsIxI{AALHHID (ID(HNIJA<$A<$<>A<$AM;|$ E1DGDƒAIu0I I9t|tbtHt.tAI]0I I9AIM0I I9AMM0I M9AME0I M9AIE0I I9uAIU0I I9`ARA9!IE M;}0CDRHp L;x01DRHH@L;~0DRHp`L;y0 DRHL;~0DRHL;y0DRHL;~0DRLL;y0YHL]M\(LxE1E1eLHHID (ID(HNIJA<$A<$<LHHID (ID(HNHKA<$A<$<E1E1LL1 <UHAVAUATSIH H H\1HHHHHIUHt1HJILB L9wYHJILJ I9EHHuHHw HGIMHOIEHtHxI}I}IUHt HOH9Jv0HI}IEH==H4LMU[A\A]A^]HHHtH;HwHH:IEH=~HIEIMHYHLqLa HtxHqHsHAHtaHPIUH9tKHuHHH9uL L LL tuIEL)IEH[HH= KLMEIUHQIUHQL7I9LJ M I9I9HzHr MvMf IFI]I^IEHtLpMuI}IUHt INH9JvIMuHHHtH;HwIL2I}KH=T 1{ JHB H HCL;A9HA HB HQHtGHyHzHAHtPHPIUH9t7HuHHH9uL1L2Mu8LYM]HQL"MeIUUHAWAVAUATSHIIIH HH7HEHH8tH[A\A]A^A_]þ II$HX HLLPLLHLL@ HHx(HHp0HHP8HHA@LLYHLLQPLLIXLLA`HHyhHHqpHHQxHHLLLLLLLDHH| HHT(LF IIDMM\MMT MML(LV@II| IIT IID MM\ (HF`LLLLLDHH| HHT(HLL\LLTLLL LLD(LIIT IID MM\ MMT (LMMD II| IIT IID (HH_<<H{HHQ;IO HHAHuHYI_AM<$LLHuLH[A\A]A^A_]0 I$M$IBM $MiI<$OD5LGI4$Lv(I $HA H[A\A]A^A_]HAQUHAWAVAUATSH(H}LwM MnM&I}HrA]~LE1H{ AH E9eEE~WMEMo I}HJ rEUE~LE1H{ ZAH E9eEI DeE9&HUD*EHUEHL{ MoMI}HE]E~LE1H{ AH E9eEE~WMEMn I}H0EeE~LE1H{ AH E9eEI DmE9/EHE D}L]E9;EH]5EeAw-IUI;U0S-LAAD$ƃAAIU8I}PH H9t_t=tAAHQ8HqPH H9kAESHQ8LAPH L9NAESHQ8HAPH H91AESHQ8LIPH L9AESHQ8LyPH L9AESHQ8HYPH H9ACAD9|ESHQ8Hq H;QPAAHV8Hy@H;VPEZAHW8Hq`H;WPDXDPHV8HH;VPthDXDPHW8HH;WPtODXDPHV8HH;VPt6DXDPHW8HH;WPtDXDPHV8HH;VP&HIcDD7H9*AIcHHLH^HN<)IOIWHVLALCLILKHAHCAE9.HIT=IcHHIt=AIcIIMIXHN<)IwMOMHHNHKHVHSHFHCA[AA9HHcHHN(MHM9L=(AIcIIMM_IPMOLJMKHBICLBMCD[HIT5IcHHItH94IcIIHM| (O| (HHL KLIL5AUAU<0A\$D9 EAA<EBEKMcIMM|$IcHLHJHBID$HqIwHQIWLaMgD9tDEBEKIcHLLVIcHLHxL`LfHOIJLMzL_MZAAIcHLLQMcIMM\$It$HqM{MzI{IzISIRAAMcIMMWIcHLL^HNIOI{IzISIRICIBD9AHAAHcHLHwHHLLPLxLIRHVMZL^MbLfAHAAHcHLHwHHLLPLxLIRHVMZL^MbLfAHAAHcHLLgHHLLXLxLISIT$ICID$MSMT$AAEeAuIUI;U0{LAET$DփAAIU8MEPH L9t_t=tAAHQ8HqPH H9kAESHQ8LIPH L9NAESHQ8HyPH H91AESHQ8HAPH H9AESHQ8HYPH H9AESHQ8LAPH L9ACAD9ESHQ8Hq H;QPAAHV8Hy@H;VPEZAHW8Hq`H;WPDXDPHV8HH;VPthDXDPHW8HH;WPtODXDPHV8HH;VPt6DXDPHW8HH;WPtDXDPHV8HH;VP&HIcDD7H9AIcHHLLFHJ)HKHCHFHQIPLIMHHYIXAE90HIT=IcHHIt=AIcIIMMHHJ4)HNHFI@HQIQHYIYHqIqA[AA9HLcLHN(MHM9L=AIcHHLLXIPLHHzI{LJMKLBMCD[HIT5IcHHItH94IcIIHID (KD(HHH I\I\5EMAEMA<.A\$D9IDD AEBA{IcHLLbHcHLHNHFHBHqIt$HAID$HQIT$9EAAtDEBA{IcHLLZHcHLLNHFHBIIIKMaMcMQMSAIcHLLZHcHLLNHFHBIIIKMaMcMQMSAIcHLLZHcHLLNHFHBIIIKMaMcMQMS9ApGHcHLLZHHLLHH@HBIIIKMaMcMQMSApGHcHLLZHHLLHH@HBIIIKMaMcMQMSApGHcHLLZHHLLHH@HBIIIKMaMcMQMSAIcHHID(ID=(IIIPKT AMAM<5IcHHHID (ID5(HHH MLMLEEAEEA<PEeA<IUI;U0LAA|$AAIU8MMPH L9t_t=tAAHQ8HqPH H9kAESHQ8LAPH L9NAESHQ8HAPH H91AESHQ8HyPH H9AESHQ8HYPH H9AESHQ8LIPH L9ACAD9ESHQ8Hq H;QPAAHV8Hy@H;VPEZAHW8Hq`H;WPDXDPHV8HH;VPthDXDPHW8HH;WPtODXDPHV8HH;VPt6DXDPHW8HH;WPtDXDPHV8HH;VP&HIcDD7H9~AIcHHLH^HN)IHI@HFHQHSLILKLALCAE9.HIT=IcHHIt=AIcIIMIYHJ4)HNHFIALALCHQHSHqHsA[AA9HHcHHN(MHM9L=AIcHHLLYIPLIHzI{HBICLBMCD[HIT5IcHHItH94IcIIHID (KD (HHL KTIT5A]A]<0A\$D92DD AEBA{IcHLLbHcHLHHHpHrHAID$HqIt$HQIT$9EAAtDEBA{IcHLLRHcHLLHHpHrIIIJMaMbMYMZAIcHLLRHcHLLHHpHrIIIJMaMbMYMZAIcHLLRHcHLLHHpHrIIIJMaMbMYMZ9EPGIcHLL^HHLL`H@HFIT$ISIL$IKML$MKEPGIcHLL^HHLL`H@HFIT$ISIL$IKML$MKEPGIcHLLRHHLLHHpHrIIIJMaMbMYMZAIcHHML(ML=(HHI@IDEMAEMA</EeAYIUI;U05LAEL$D΃AAIU8I}PH H9t_t=tAAHQ8HqPH H9kAESHQ8LAPH L9NAESHQ8HAPH H91AESHQ8LIPH L9AESHQ8LqPH L9AESHQ8HYPH H9ACAD9ESHQ8Hq H;QPAAHV8Hy@H;VPEZAHW8Hq`H;WPDXDPHV8HH;VPthDXDPHW8HH;WPtODXDPHV8HH;VPt6DXDPHW8HH;WPtDXDPHV8HH;VP&HIcDD7H9& AIcHHLHZHN4)INMNLJHqHsLALCHAHCAE9.HIT=IcHHIt=AIcHHLLJHN)IpMpLrHNIIH^IYHFIAA[AA9HHcHHN(MHM9L=AIcIIMM^IPMNLJMKHBICLBMCD[HIT5IcHHItH94IcIIHMD (OD5(HHH ILILAuAu<0A\$D9DD AEBA{McIMMt$HcHLHJHBID$HqIvHQIVLaMf9AEAAtDEBA{IcHLLVHcHLLHL`LfIIIJMqMrMYMZAIcHLLQLcIMM\$It$HqMsMrMKMJISIRAMcIMMVHcHLL^HNINMKMJISIRICIB9TAHGLcIMIqHHLLPLpMqIRHVMZL^MbLfAHGLcIMIqHHLLPLpMqIRHVMZL^MbLfAHGLcIMMaHHLLXLpMqISIT$ICID$MSMT$AIcIII|(K|5(HHMHMLAEAE<3H([A\A]A^A_]E'AkIWI;W0GLAA|$AAIW8MOPH L9t_t=tAAHQ8HqPH H9kAESHQ8LiPH L9NAESHQ8HyPH H91AESHQ8LAPH L9AESHQ8LqPH L9AESHQ8HAPH H9ACAD9WESHQ8Hq H;QPAAHV8Hy@H;VPEZAHW8Hq`H;WPDXDPHV8HH;VPthDXDPHW8HH;WPtODXDPHV8HH;VPt6DXDPHW8HH;WPtDXDPHV8HH;VP&HIcDD7H9AIcIIMMqHJ49HNLnMiHYI^LAMFHAIFAE9.HIT?IcHHIt?AIcHHLHsHJ9LrHJHKMNLNIFHFMnLnA[AA9HHcHHN8MHM9L?AIcHHLLXIPLHHJIKLrMsLBMCD[HIT7IcHHItH94IcHHHMD(MD(IIH ILKLE7AE7A<0A\$D9DD AEBA{McIMMnLcIMIL$ID$IFHqIuHQIULaMe9EAAtDEBA{IcHLLRLcIMMNIvHrIIIJMiMjMYMZAMcIMMeHcHLLRHJIMMJML$MZM\$IBID$AMcIMIsLcIMMeMMMKMT$LVID$HFMt$Lv9E`GIcHLLYHHLLhLpLqIUISIuIsMMMKEPGMcIMMNHHLHpL`MfHNIIHVIQLnMiEXGMcIMIrHHLHHH@IBLaLfLqLvHQHVAIcIIMl(Ol(HHI@IDE7AE7A<2rE1A HAE1ҹ`IcIIHMt (Ot (IIH ItKtA]A]< IcHHHID (ID5(IIH MLOLA]A]<~IcHHHIT(IT7(HHL, OL/MLEAEA<YHMD!A HqH;q0 AET$DփAAHQ8LyPH L9t_t=tAAHQ8HqPH H9kAESHQ8LAPH L9NAESHQ8LqPH L91AESHQ8HAPH H9AESHQ8HyPH H9AESHQ8HYPH H9ACAD9ESHQ8Hq H;QPAAHV8Hy@H;VPEZAHW8Hq`H;WPDXDPHV8HH;VPthDXDPHW8HH;WPtODXDPHV8HH;VPt6DXDPHW8HH;WPtDXDPHV8HH;VP&HIcDDCH9 AIcIILMMqHLmJ)HrHJIIH^I^LFMFHFIFAE99HL}IT?AIcIILmM}HH]L IIMqMuHqIwLAMGHAIGA[AA9HHcHHLuN0MHM9L> AIcHHHMLYMpLII~I{IFICMFMCD[HH]HT3IcIILmKt H9"IcHHHHuHT(HT(IIL NtNt.DADA<A\$D9 EAA<EBEKMcILmMuIcHHEHHLxM}HqIvHQIVLaMfD9tFEBEKIcHHMLYIcHHuH~HVHQLgMcLwMsLWMSAAIcHH}LoMcILeM\$Mt$LwMSMUICIEM{M}AAMcIL]IsMcILUIJIBICLyL~LiLnHQHVD9ApAALcILuMnHHHELXL`MfI{I}MSMUM{M}APAAHcHHuL^HHHEHxHHHNLgMcLwMsLWMSExAAIcHHMHyHHHEL`LhLiIT$HWIt$HwMt$LwAAE&AIVI;V04LAE|$DAAIN8MVPH L9t_t=tAAHJ8HrPH H9kAEKHJ8LjPH L9NAEKHJ8LBPH L91AEKHJ8HzPH H9AEKHJ8LzPH L9AEKHJ8HBPH H9ACAD9EKHJ8Hr H;JPAAHN8Hz@H;NPEYAHO8Hr`H;OPDXDHHN8HH;NPthDXDHHO8HH;OPtODXDHHN8HH;NPt6DXDHHO8HH;OPtDXDHHN8HH;NP&HIcDD7H90AMcMIMM}HJ47HNH~I}LQMWHYI_HAIGAE9.IKTIcIIKLAMcLHLLiHJ7LRHzHyIZI]IBIEMzM}A[AA9IHcHHJ<0LWO9TAIcHHLLXHWLPHJIKLzM{HzI{D[HIT6IcHHILH94McLHHIt>(It(LHH =I|I|EAEA<0A\$D9EAA<EAESMcIMMoMcIMIL$ID$IGHqIuHQIULaMeD9tDEAESIcHLLZMcIMMOIwHrIIIKMiMkIyI{AAMcIMMeIcHLLZHJIMMKML$I{I|$ICID$AAIcHLHwMcIMMeMMLOM\$L^ID$HFM|$L~D9E`ABIcHLHyHHLLhLxLyIUHWIuHwMMLOEXABMcIMMOHHLHpL`MgHNIIHVIQLnMiAxABLcIMIsHHLHHH@ICLaLfLyL~HQHVAAIcIII|(K|=(IIIPKT AEAE<HHAE1ҹE1ACHAE1ҹE1A'HAE1ҹE1AIcIIMl(Ol(HHHGIDE>AE>A<rIcHHH}Ll(Ll(IIIHJL<LIcIIHH]L| (N|+(IIH HLJL DADA<.oMcLHHIT>(IT6(MIL,=K|.K|AA<IcHHHM| (M|(IIH4 MD5OD A]A]<:pE1AE1AHAE1ҹHAE1ҹ-E1AHAE1ɿUHAWAVAUATSH8HIHUIMDMm H@ u/JT*HHt*H;H:HH8[A\A]A^A_]HCHHxHHEH=LEAPHcH9]WI7HtBHUH}9HI?D'EuHGHt Ia HqLuAVi1AI}Ht$DLcHLLHHuIEIAAyuM/I}H4@EEE~LE1H{ (AH E9eM/Mt=HULH}VHI?DEuHGHt I~ Hu HHuH}L8L}MAA)EoTH47 H5h HF H h HA Hth HBj H= L- L}Ot=LHIHIIT$Ht5HB H9tjHH9~HB H9tPH9HRHuuc H\LMILUNME)QA HH dHZHJH,HrHqHBH HHI $H90Hu I)|$HHH9uL L HJH#HZHYHBHHHI $H9HuvI)|$HZH ;HJHB H)HB HIHA HAI|$HyID$HtHHIL$I|$xI$Ht HqH9rv%HI $*HHH9uL*L)wHHHtH;pwHH HcLHMH9HUHBkA]IUI;U0LADSDփAAIU8MuPH L9t_t=tAAHQ8HqPH H9jAEAHQ8HyPH H9MAEAHQ8LQPH L90AEAHQ8HAPH H9AEAHQ8LYPH L9AEAHQ8LaPH L9AAA9EAHQ8Hq H;QPAAHV8Hy@H;VPEHAHW8Hq`H;WPDHD@HV8HH;VPthDHD@HW8HH;WPtODHD@HV8HH;VPt6DHD@HW8HH;WPtDHD@HV8HH;VP'HIcDب:H9RAIcHHLLRHN$)IL$Mt$LrHqIrLYMZHAIBAD91HIT=IcHHIt=AIcHHLLZHN)IJIrHrLqMsLaMcHAICEaED9HMcLHN(MZM;\=6AIcHHLLJIJLZLYMYHAIALQMQEL$HIT5IcIIKt%H93IcHHHMT (MT5(IIH MtOt%E]AE]A<-A9HEAA<EPEYIcHLLfMcIMINIFHFHQIT$LqMt$HAID$D9tDEPEYIcHLLJIcHLL@HpHrIHIIM`MaIxIyAAIcHLLqIcHLH~HVHQLgMfLGMFLOMNAAMcIMMt$IcHLLJHJIL$MAMFIyI~IAIFD9AJACLcIMIpHHLLpL`M`I~H~MNLNIVHVAJACLcIMIpHHLLpL`M`I~H~MNLNIVHVAJACLcIMIpHHLLHL`M`IyH~IAHFMqLvAAIL$HJIL$HJH=S 1R IL$~LM$LM$IL$LRMT$HJIcHHMt(Mt(HHMZM\ AEAE</IcIIHMd (Od5(IIH ItKtEUAEUA<HAE14AE1UHAL H  HD_ H55_ ]XUHAL H  H_ H5 _ ],UHAL H [ H^ H5^ ]UHAL~ H / H^ H5^ ]UHAL H  H^ H5^ ]UHAL H  H^ H5y^ ]|UHAL H  H<^ H5-^ ]PUHAL H w H^ H5^ ]$UHAL H S H] H5] ]UHALv H ' H] H5] ]UHAL  H  H] H5] ]UHAL H  H] H5q] ]tUHAWAVAUATSHIHHHHZHAHLEI9HI~NH=A HOMD LHHILH4 HHHHHI92HL)HL\ ALF H  LL=\ LLLUIHLUI9I9HINLHLU HLUJ\8L+M.L3HMI_HL\ I;RAJLH)LcI9L  MYN$LHIHIOTLHIIML9IMMLH[A\A]A^A_]HCHHx~*HHHHI 6I; tdH LPH|HL)Jvttu1ۃÍ|[11 MAEH[A\A]]MtID$HHx9HH5X HH 2HHHH[A\A]]ÿ3ISHHH<3H~X H;:t1H HH[A\A]]Yv 82?HrLH LHH[A\A]]*11 UHHuH W HH HHH8]HFHHx HH$HHL7HW L;tH ]项H1 ]餶H:r]UHAWAVAUATSHHIIAM ¸H9tLv't"1ۃÍT[1DL1 MAEH[A\A]A^A_]MtID$HHx:HH5V HH 2HHHH[A\A]A^A_]ò3IWHHH<3HV H;:t5H HH[A\A]A^A_]{v %20HrCH LHH[A\A]A^A_]H1DL1 UHATSIH tmHu#HU HH HI$L![A\]HCHHx~THHHI4HU H;twH L[A\]颷Ht%HCHHx(HHsH[U iHAHHI4HCU H;t H L"rGH HL[A\]-H UHATSIH譿 tmHu#HT HH HI$L![A\]HCHHx~THHHI4HT H;twH L[A\]鐶Ht%HCHHx(HHsHIT iHAHHI4H1T H;t H} L"rGH HL[A\]H 萐UHH@}HuEHMHvH S Ha HH1@0@HHH@萖 HH@HHHHH1@0@Ԏ H0H@HHHHH1@0@h HHH@HHHHH1@0@\B H`H@HHHHH 0Hψ  w6HR H "` HxHHH 0HLjd E   H Hu@H Z:H5 @0@?HH0H0? i H )ȉEȋEȃ|EHcH H9H HH)H HH UHcH5 HHHFHH6 ZL) E0ɉ,Hlj(΋(H ‹,H DI4 H MHcH(HHHHHhDžppE EăEċEă|HhMHcɊ< tۋEăEċEĉEEHcZHK HljL HxHxHHt HEH@Hf@f f $<HEH@Hf@f f fH IH5 E0DHH8֋DH84H4D3ADD3蛪 HEH@Hf@ff tnH I[H5 H= AE0H(HH H H(DIDA HEHHEH@H@f@ff tnH ISH5Z H= AE0HHHHHDIDAz HEH@H@f@fftnH IYH5ʭ H= AE0HHHHHDIDA HEH@H@f@fftnHh IgH5: H=g AE0HHHHHDIDAZ HEH@H@f@f f $< HEH@H@f@f f fH IH= A E0HHlj֋HHDADA覧 HEH@H@f@ff tnH* I[H5 H=) AE0HHHHHDIDA HEHHUHuܿHHHHDW E܃~+H< H J HH !0HljΈ蚽 E؋M9~8H; H J HHHHk 0HljΈX HEHMUHHHHHHHD补 I HĀ]@UHH@H}HDžPHDžXHDž`HHP t@Hb I!H5 @0@OHH@H@O肥  H: HHt,H: HHH FH9uH: HHh HDžhHhHHh@$<u@H InH5 @0@?HH0H0?ʤ Hh@t@HV IpH5 @0@/HH H /v Hh@ tOHh@ H IH5n 1HHHA Hh@$<u@H IoH5 @0@HHH轣 Hhf@ftcHhf@H > IsH= AE0HHω֋HDAI HhHdHhH@Hf@ff $<tnH IUH5 H=F AE0HHHHHDIDA誢 HhH@Hf@fftnH& IYH5 H= AE0HHHHHDIDA HhH@Hf@f f $< HhH@Hf@f f fHt IH= A E0HHlj֋HHDADA` HhH@Hf@ff tnH I[H5< H=p AE0HHHHHDIDAԠ H= HPH= HXH= H`HPHtHXH@HEHEHHPHMHHN HPHH9uGHPH IH5 HHHHD HPH$EȋEȃHPHtHPHH9uGHPH e IH5 |HHpHHpD|k HEHHtHEHHH9uDHEH IH5 lHH`HH`Dl HEHH$HHPH$HѺHHƉ\\ҝ ɉMȋMȃHPHtHPHH9uGHPH 3 IH5٣ XHHPHHPDX9 HXH G7 HHH9HPHEHEHHtHEHHH9uDHEH IH57 LHH@HH@DL補 HEHǀHHEHHtHEHHH9uDHEH % IH5 \IsH=P AE0HHω֋HDAI HhHdHhH@Hf@ff $<tnH \IUH5 H=ޙ AE0HHHHHDIDA誓 HhH@Hf@fftnH& \IYH5 H=L AE0HHHHHDIDA HhH@Hf@f f $< HhH@Hf@f f fHt \IH= A E0HHlj֋HHDADA` HhH@Hf@ff tnH \I[H5ԗ H= AE0HHHHHDIDAԑ H. HPH. HXH. H`HPHtHXH@HEHEHHPHMHHN HPHH9uGHPH |IH5 HHHHD HPH$EȋEȃHPHtHPHH9uGHPH e ~IH5 |HHpHHpD|k HEHHtHEHHH9uDHEH ~IH50 lHH`HH`Dl HEHH$HHPH$HѺHHƉ\\Ҏ ɉMȋMȃHPHtHPHH9uGHPH 3 IH5ٔ XHHPHHPDX9 HXH ( HHH9HPHEHEHHtHEHHH9uDHEH IH5ϔ LHH@HH@DL裍 HEHǀHHEHHtHEHHH9uDHEH % IH5W IsH= AE0HHω֋HDAI HHdHH@Hf@ff $<tnH IUH5 H=F AE0HHHHHDIDA誄 HH@Hf@fftnH& IYH5` H= AE0HxHHpHpHxDlIlDkAk HH@Hf@f f $< HH@Hf@f f fHt IH= A E0H`Hlj\֋\H`XHXDTATDSAS` HH@Hf@ff tnH I[H5 H=p AE0HHHH@H@HHDQ H0H$EEE,ppHcHHU HljQ HhHhHEHEHHtIHEHHMHMHY H,HHHHHQ HE$HEH cY H,HHHEHEH,HHEHEHHt8HEHMHcHUHUHUHuHHHYQ HE EHcHMHUHHHmHEH* H [ H`HHpHh0Hωƈg pHcHhHH=IT HHωHƋH?P  H0H~O H@]DfDUHH@H}uHDž0HDž8HDž@HH0Ƭ t@HS G!H5W @0@/HH H /O w H HHt,H HHH CH9uH HHP HDžPHPHHP@$<u@HR GnH5.W @0@HHHO HP@t@HR GpH5V @0@HHHN HP@ tOHP@ H ,R GH5V 1HHHA,N HP@$<u@HQ GoH5!V @0@HHHM HPf@ftcHPf@H {Q GsH=U AE0HHω֋HDAM HPHbHPH@Hf@ff tnHP GSH5>U H=.T AE0HHHHHDIDAL HPH@Hf@fftnHeP GYH5T H=S AE0HHHHHDIDAWL HPH@Hf@f f $< HPH@Hf@f f fHO GH=R A E0HHlj֋HHDADAK HPH@Hf@ff tnH!O G[H5hS H=XR AE0HHHxHxHDtItDsAsK ESEHcH N H/E0HhHωd֋dHhDcIcJ HEH Q Hlj\H΋\J LLE#ppHcHHM HljI HhHhHEHEHHtIHEHHMHMH!Q H#HHPHHPHJ HE$HEH P H#HH-HEHEH#HHEHEHHt8HEHMHcHUHUHUHuHHHI HE EHcHMHUHHH謔HEHi H HpHh0Hωƈ_ pHcHhHH=L HHHωDHƋDHHH E Džp1EpHEHHHHHhpHhHO %Hω@H։‹@tH LLEppHc"HHK HljG HhHhHEHEHHtIHEHHMHMH3O HHH8HH8HG HE$HEH N HHHHEHEHHHEHEHHt8HEHMHcHUHUHUHuHHH\G HE EHcHMHUHHHpHEH- H HHHpHh0Hωƈ] pHcHh"HH=LJ H0Hω,HƋ,H0BF DžHH~ H ~mHHcHHA HH I ,HLM E0ɉ(Hω$֋$(D#I#E HHcH ; HHHHHHXDž``E EEE|HXMHcɊ< tۋEEEpEHc,HHH HljD HhHhHHtG HHHHD@ H0H$EEE0ppHc>HHE HljA HhHhHEHEHHtIHEHHMHMHI H0HHHHH>A HE$HEH SI H0HHNHEHEH0HHEHEHHt8HEHMHcHUHUHUHuHHH@ HE EHcHMHUHHH͋HEH H H`HHpHh0HωƈW pHcHh>HH=C HHωHƋH?  H0H> H@]DfDUHH@H}uHDž0HDž8HDž@HH0* t@HB G!H5G @0@/HH H /? ۛ HH HHt,H8 HHH CH9uH HHP HDžPHPHHP@$<u@HGB GnH5"G @0@HHHg> HP@t@HA GpH5F @0@HHH> HP@ tOHP@ H A GH5F 1HHHA= HP@$<u@H:A GoH5F @0@HHHZ= HPf@ftcHPf@H @ GsH=E AE0HHω֋HDA< HPHbHPH@Hf@ff tnHW@ GSH52E H=C AE0HHHHHDIDAI< HPH@Hf@fftnH? GYH5D H=B AE0HHHHHDIDA; HPH@Hf@f f $< HPH@Hf@f f fH? GH=QB A E0HHlj֋HHDADA: HPH@Hf@ff tnH> G[H5\C H=A AE0HHHxHxHDtItDsAss: ESEHcH > G/E0HhHωd֋dHhDcIc: HEH A Hlj\H΋\: LLE#ppHcGH[= Hlj\9 HhHhHEHEHHtIHEHHMHMH@ H#HHPHHPH}9 HE$HEH J@ H#HH荄HEHEH#HHEHEHHt8HEHMHcHUHUHUHuHHH8 HE EHcHMHUHHH HEH H z HpHh0Hωƈ\O pHcHhGH=; HHHωDHƋDHH7 E Džp1EpHEHHHHHhpHhH? %Hω@H։‹@7 LLEppHcGH; Hlj 7 HhHhHEHEHHtIHEHHMHMH> HHH8HH8HA7 HE$HEH \> HHHQHEHEHHHEHEHHt8HEHMHcHUHUHUHuHHH6 HE EHcHMHUHHHЁHEH H > HHHpHh0HωƈM pHcHhGH=9 H0Hω,HƋ,H05 DžHH~ H ~mHHcHHA HH >9 GL= E0ɉ(Hω$֋$(D#I#L5 HHcH HHHHHHXDž``E EEE|HXMHcɊ< tۋEEEpEHcGHZ8 Hlj[4 HhHhHHt. H@]DfDUHHH> HHEH}uHUM܋ t@H|2 `G!H57 @0@?HH0H0?. \ H HHt,H HHH `H9uH HH@ HDž@H@HH@@$<u@H1 `GnH57 @0@/HH H /- H@@t@Hp1 `GpH56 @0@HHH- H@@ $< tRH@@ H 1 `GH5s6 HHH A- H@@$<u@H0 `GoH56 @0@HHH, H@f@ftcH@f@H S0 `GsH=5 AE0HHω֋HDA^, E܃ {EHcHHH/ jG H5@5 H=!3 A E0HHHHHLIHDI+ H@HbH@H@Hf@ff tnHL/ `GSH54 H=2 AE0HHHHHDIDA>+ H@H@Hf@fftnH. `GYH54 H=1 AE0HHHHHDIDA* H@H@Hf@f f $< H@H@Hf@f f fH. `GH=F1 A E0HHlj֋HHD|A|D{A{) H@H@Hf@ff tnHv- `G[H52 H=0 AE0HpHHhHhHpDdIdDcAch) HeHHMHMHMHMȊ HUЈ HMHHHMHMHHHMHMȊ HUЈ HMHHHMHMHHHMH 2 HMHUHuЈHUHHHUHUHHHUH`HHuHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHEHHHHHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHZHHuHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHMHM HU HMHHHMHMHHHMHNHHUHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHHHHHxHxHUHEHHHEHxHHHxHxHUHEHHHEHxHHHxHxHUHEHHHEHxHHHxHxHUHEHHHEHxHHHxHxHUHEHHHEHxHHHxHxHUHEHHHEHxHHHxHEHpHhEQHhHpHpHHHpHhHHHhE؃E؋E؃ ~` Hѷ HHMH9u Hİ]" UHHH HHEH}uHUM܋ t@H% 3G!H5Q+ @0@?HH0H0?! ~ H% HHt,H HHH `H9uH HH@ HDž@H@HH@@$<u@H$% 3GnH5* @0@/HH H /D! H@@t@H$ 3GpH5E* @0@HHH H@@ $< tRH@@ H g$ 3GH5) HHH Ad H@@$<u@H$ 3GoH5) @0@HHH2 H@f@ftcH@f@H # 3GsH=9) AE0HHω֋HDA E܃{EHcHHHJ# =G H5( H=& AE0HHHHHLIHDI; H@HbH@H@Hf@ff tnH" 3GSH5!( H=% AE0HHHHHDIDA H@H@Hf@fftnH" 3GYH5' H=Q% AE0HHHHHDIDA  H@H@Hf@f f $< H@H@Hf@f f fHh! 3GH=$ A E0HHlj֋HHD|A|D{A{T H@H@Hf@ff tnH 3G[H5K& H= $ AE0HpHHhHhHpDdIdDcAc HcHHMHMHMHMȊ HUЈ HMHHHMHMHHHMHMȊ HUЈ HMHHHMHMHHHMHMȊ HUЈ HMHHHMHMHHHMHMȊ HUЈ HMHHHMHMHHHMH % HMHUHuЈHUHHHUHUHHHUH\HHuHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHEHHHHHEHEHuHEHHHEHEHHHEHEHuHEHHHEHEHHHEHTHHuHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHUHuHUHHHUHUHHHUHMHM HU HMHHHMHMHHHMHJHHUHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHUHEHHHEHEHHHEHEHHHHHxHxHUHEHHHEHxHHHxHxHUHEHHHEHxHHHxHEHpHhEQHhHpHpHHHpHhHHHhE؃E؋E؃ ~r H} HHMH9u Hİ]c UHHpH}uq t4H F!H55 @0@}HHuHME q H HHt)H HHH H9uHͩ HHEHEHEHHE@$<u:H FnH5 @0@}HHxHxE' HE@t@H FpH5J @0@wHHhHhw HE@ $< tOHE@ H S FH5 dHHXHXdAP HE@$<u@H FoH5 @0@WHHHHHW! HEf@ft`HEf@H  FsH=J AE0H@Hω<֋ F/E0H׋DIf HEHMHcDM8$EċEă HEEHEEEԃ@EHcH F.@0@Hω֋H EM9~DEHcMHcHc F/E0H׋DI HEMHcɊDM8$EċEăHEHtbHEH@H@f@fft@H FH5 @0@HHH HECHEHcH F.@0@Hω֋H HEM9~GEHcHM HcH+ F/E0H׋DIS HECHEHcH F.@0@Hω֋H HEM9~GEHcHM HcH F/E0H׋DI HEHMHcHUHuHcҊTTHEHtbHEH@H@f@fft@H FH5 @0@HHH# HEHMHEHtbHEH@H@f@fft@H FH5y @0@HHH HEHMHEHtbHEH@H@f@fft@H FH5 @0@HHH- HEHMHEHtbHEH@H@f@fft@H FH5j @0@HHH HECHEHcH 9 F.@0@Hω֋H_ HEM9~GEHcHM HcH F/E0H׋DI HECHEHcH F.@0@Hω|֋|H HEM9~GEHcHM HcHA F/E0xH׋xDwIwi HEHMHcHUHuHcҊTTHEHtbHEH@H@f@fft@H FH5 @0@vHHhHhv HEHMHEHtbHEH@H@f@fft@H@ FH51 @0@gHHXHXg` HEHMN Hİ]DfDUHHH}HuHUMM t4H E!H5 @0@}HHuHME M H HHt)H HHH yH9uHՅ HHEHEHEHHEЋ@$<u4H EnH5 @0@}HHuHME5 HEЋ@t4H EpH5 @0@}HHuHME HEЋ@ t@HEЋ@ H o EH5 1}HHuHUMA{ HEЋ@$<u:H, EoH5' @0@}HHxHxER HEf@ft`HEf@H EsH= AE0HpHωl֋lHpDkAk HEHIHEH@H@f@ff tnHZ ESH5U H=u AE0H`HHXHXH`DTITDSASL HEH@H@f@fftnH EYH5 H= AE0HHHH@H@HHD9 HHEH}HuHUMH9 HHt,H 9 HHH H9uH8 HH HDžHHH@$<u@H DnH5 @0@[HHPHP[8 H@t@HĦ DpH5Z @0@OHH@H@O H@ tOH@ H ] DH5 1 HHH0H(HU@0H@OH։ŠOO9H(H ǝ HHΉHH \E\M9~Dž0\C\HcH g D.@0@GHω@֋@HG荒 EM9~DEHcMHcH D/E0 Hn! H 7 HHHHHEMH\H @0@HHHH豚E܃E EEE|HEMHcɊ< tދEE M9$EE\E EEM9~Dž0E@EHcH E.@0@Hω֋H EM9~DEHcMHcH E/E0H׋DI EM)ȃ0HEMHcHHHH(HcHpH(Hh0=!0|0)xDž|DžxEQHhHpHpHHHpHhHHHhEEE|9|E.Hp HpHHHpEEEx9|HHteHH@H@f@fft@H EH5 @0@HHH HHtDHH@H@f@ff$f K3 f f%ff f 43 H H 4 H`HHHcHMມ@0H@HΊ[E܃E EEE|HEMHcɊ< tދEEE0EHc$EHʋ Hljˇ H(H(HHt:H(HMHcH(HuHuHHH HE#EHcH(HUHHHHE0 Hc$EH! Hlj" HHHpHpHHtRHpHHpHpH HHHHHH4 HE'HpH HHHAHEHpHHHpHpHHtFHpH0HcH(HpHpHHHH蕆 HE)0HcH(HpHHHHE0HcH($EH5 HHHƉH賅 H " HC1 HxHH H@0@H׉Ί蚜 HcHHHƋHB E܃E EEE|HEMHcɊ< tދEEE0EHc.EHψ HljЄ H(H(HHt:H(HMHcH(HuHuHHH HE#EHcH(HUHHHHE0 Hc.EH& Hlj' HHHpHpHHtRHpHHpHpH HHHHHH9 HE'HpH ǎ HHHFHEHpHHHpHpHHtFHpH0HcH(HpHpHHHH蚃 HE)0HcH(HpHHHHEЋ0HcH(.EH5 HHHƉH踂 H ' HH. HHH H@0@H׉Ί蟙 HcHHHƋHG HE\9}Dž0\C\HcH 8E.@0@Hω֋H HEM9~GEHcHM HcH 8E/E0H׋DI轁 HE\)ȃ0\HMHcHHHH(HHteHH@H@f@fft@H 8EH5 @0@HHxHx HHtDHH@H@f@ff$f + f f%ff f + H H , HHH0H(HU@0H@wH։ŠwERHHteHH@H@f@fft@H @EH5 @0@vHHhHhv HE9$HMH  HHMH9u HĠ] fDUHH@H HHEH}HuHUMH HHt,H HHH H9uH HH HDžHHH@$<u@HȂ CnH5 @0@HHH~ H@t@Ht CpH5 @0@HHH~ H@ tOH@ H CH5d 1HHHA ~ H@$<u@H CoH5 @0@HHH} Hf@ftcHf@H \ CsH= AE0HHω֋HDAg} HHHH@H@f@ff tnH׀ CSH5 H= AE0HHHHHDIDA| HH@H@f@fftnHD CYH5 H= AE0HHHxHxHDtItDsAs6| HH@H@f@fftnH CgH5 H=g AE0HhHH`H`HhD\I\D[A[{ HH@H@f@f f $<HH@H@f@f f fH~ CH5 E0THHH֋THHDHDDCADTCz HH@H@f@ff tnHy~ C[H5 H=/ AE0H8HH0H0H8D,I,D+A+kz HHbHH@Hf@ff tnH} CSH5 H= AE0H HHHH DIDAy HH@Hf@fftnHJ} CYH5 H= AE0HHHHHDIDA EM9~DEHcMHcHpB mC/E0 HEM)HHEHMHcHHHH@HEEHEM9~Dž8HECHEHcH A mC.@0@:Hω4֋4H:= EM9~DEHcMHcHtA mC/E00H׋0D/I/= HEM)8HEHMHcHHHH0HEEHEM9~Dž(HECHEHcH @ mC.@0@.Hω(֋(H.< EM9~DEHcMHcHx@ mC/E0$H׋$D#I#< HEM)(HEHMHcHHHH HEEHEM9~DžHECHEHcH ? mC.@0@"Hω֋H"; EM9~DEHcMHcH|? mC/E0H׋DI; HEM)HEHMHcHHHHHEEHEM9~DžHECHEHcH > mC.@0@Hω֋H: EM9~DEHcMHcH> mC/E0 H׋ D I : HEM)HEHMHcHHHHHEEHEM9~DžHECHEHcH = mC.@0@ Hω֋H 9 EM9~DEHcMHcH= mC/E0H׋DI9 HEM)HEHMHcHHHHHEEHEM9~DžHECHEHcH < mC.@0@Hω֋H9 EM9~DEHcMHcH< mC/E0H׋DI8 HEM)HEHMHcHHHHHEEHEM9~DžHECHEHcH ; mC.@0@Hω֋H8 EM9~DEHcMHcH; mC/E0H׋DI7 HEM)HEHMHcHHHHHEEHEM9~DžHECHEHcH : mC.@0@Hω֋H 7 EM9~DEHcMHcH: mC/E0H׋DI6 HEM)HEHMHcHHHHHEEHEM9~DžHECHEHcH 9 mC.@0@Hω֋H6 EM9~DEHcMHcH9 mC/E0H׋DI5 HEM)HEHMHcHHHHhH`H)A HωH։‹P4 XHPH@ HωH։‹4 VHH@H@ HωH։‹3 8H0H@ HωH։‹3 (H HI@ HωH։‹\3 HH@ HωH։‹3 bHH? HωH։‹2 %HH? HωH։‹2 HHe? HωH։‹h2 HH*? HωH։‹+2 trHH> HωH։‹1 t9HH> HωH։‹1 u EEEĉEEt~HHteHH@H@f@fft@H 6 zCH5= @0@HHH*2 HEHMEE EEE|HEMHcɊ< tދEEEhEHcCHe5 Hljf1 H`H`HHt:H`HMHcH`HuHuHHH1 HE#EHcH`HUHHH|HEȋh&XXHcCH4 Hlj0 HPHPHEHEHHtIHEHHMHMH< H&HHHHH0 HE$HEH s< H&HH{HEHEH&HHEHEHHt=HEHhHcH`HuHuHHHHT0 HE&hHcH`HUHHHb{HE؋hHcH`CH5w3 HHHƉ|Hu/ H H HXHP@0@{H׉Ί{iF XHcHPHHƋ|H/ HHteHH@H@f@fft@H2 CH5: @0@zHHpHpz. HEHMHHteHH@H@f@fft@H52 CH59 @0@oHH`H`oU. HEHM HĠ]DUHHH^ HHEH}HuU t@H1 A!H59 @0@HHH-  H HHt)H HHH cH9uH HHEHEHEHHE@$<u@H0 AnH5D9 @0@HHH- HE@t@H0 ApH58 @0@HHH, HE@ tLHE@ H A0 AH58 1HHHAA, HE@$<u@H/ AoH5C8 @0@HHpHp, HEf@ft`HEf@H / AsH=7 AE0HhHωd֋dHhDcAc+ HEHSHEH@Hf@ff tnH/ ASH5l7 H=7 AE0HXHHPHPHXDLILDKAK + HEH@Hf@fftnH. AYH56 H=6 AE0H@HH8H8H@D4I4D3A3~* HEH@Hf@f f $< HEH@Hf@f f fH- AH=R6 A E0H(Hlj$֋$H( H DADA) HEH@Hf@ff tnHQ- A[H55 H=5 AE0HHHHHDIDAC) HEHHEH@H@f@ff tnH, ASH5 5 H=o3 AE0HHHHHDIDA( HEH@H@f@fftnH), AYH5z4 H=2 AE0HHHHHDIDA( HEH@H@f@fftnH+ AgH53 H=O2 AE0HHHHHDIDA' HEH@H@f@f f $<HEH@H@f@f f fH* AH=1 AE0HHlj֋HHDADA& HEH@H@f@ff tnH[* A[H52 H=1 AE0HHHHHDIDAM& HEMH0 HljH։ʋ% MMHEMH1 HljH։ʋ$ ƉHu}L1 |HLD|DDD$ ƉuHu}Lb1 xHLDxDDDo$ Ɖ|Hu}L"1 tHLDtDDD4$ ƉxHu}L0 pHLDpDDD# ƉHu}L0 lHLDlDDD# EEM9~DEHcMHcH'( 4B/E0hH׋hDgIgO$ HEHEED‰EHHEHEHEE=EEE)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|H H HHH@0H@fHΊfyEEM9~ EtE@EHcH & 8B.@0@eHω`֋`He" EM)ȃEHEMHcHHHHEHHEHEHEE=EEE)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|H H O HHHHH@0H@_HΊ_wHEHtbHEH@H@f@fft@H$ HEHEH/HHEHEHHt8HEHMHcHUHUHUHuHHH HE EHcHMHUHHH0>HEH H > HXHHEHM0Hωƈy EHcHMBH= HHωHƋH &O H{ HHMH9u H]a UHHH}HuUH; HHt,H+ HHH H9uH HH HDžHHH@$<u@H: @nH5, @0@HHHZ H@t@H @pH5 @0@HHH H@ tOH@ H  @H5 1HHHA H@$<u@H- @oH5 @0@HHHM Hf@ftcHf@H @sH= AE0HHω֋HDA HHbHH@Hf@ff tnHJ @SH5< H= AE0HxHHpHpHxDlIlDkAk< HH@Hf@fftnH @YH5 H= AE0H`HHXHXH`DTITDSAS HH@Hf@f f $< HH@Hf@f f fH @H= A E0HHHljD֋DHH@H@DM9~Dž8CHcH @.@0@Hω֋H E싍)ȃ8HEHcHHHH0H| H - H8H0HH@0@HHHHDC9EM9~Dž8CHcH @.@0@Hω֋H EM9~DEHcMHcH> @/E0H׋DIf E)ȃ8HEHcHHHH08H0H HωH։‹ ɉMMEM9~Dž8CHcH C @.@0@Hω|֋|Hi EM9~DEHcMHcH @/E0xH׋xDwIw E)ȃ8HEHcHHHH0HHxH0Hp88E8)MEEEQHpHxHxHHHxHpHHHpEEEM9|E.Hx HxHHHxEEEM9|ȋ EM9~Dž8CHcH > @.@0@vHωp֋pHvd EM9~DEHcMHcH @/E0lH׋lDkIk E)ȃ8HEHcHHHH08H0Hv HωdH։‹d ɉMMEM9~Dž8CHcH @.@0@cHω\֋\Hc EM9~DEHcMHcH @/E0XH׋XDWIW E)ȃ8HEHcHHHH0HHxH0Hp88E8)MEEEQHpHxHxHHHxHpHHHpEEEM9|E.Hx HxHHHxEEEM9|ȋC EM9~Dž8CHcH @.@0@VHωP֋PHV EM9~DEHcMHcH @/E0LH׋LDKIK E)ȃ8HEHcHHHH08H0H HωDH։‹DT ɉMMEM9~Dž8CHcH @.@0@CHω<֋ HpHpHxHxHHHxHpHHHpHx HxHHHxHx HxHHHxHx HxHHHxHx HxHHHxHx HxHHHxtt EEE䉅Su1u t EEE艅 Dž8HH0H0H k Hlj|H΋|葫 t6H0H * HljxH΋x[ u9$MH0H ܷ HHΉtt u9$HHxHHpHpHxHxHHHxHpHHHpHpHxHxHHHxHpHHHpHpHxHxHHHxHpHHHpHpHxHxHHHxHpHHHpHpHxHxHHHxHpHHHpHpHxHxHHHxHpHHHpHHteHH@H@f@fft@H AH5K @0@sHHhHhs让 HEHĠ]DfDUHHH}HuUH> HHt)H> HHH H9uH> HHEHEHEHHE@$<u4H ?nH5 @0@}HHuHME HE@t@Hq ?pH5 @0@HHpHp葨 HE@ tLHE@ H  ?H5V 1lHH`H`lA HE@$<u@H ?oH5 @0@_HHPHP_ HEf@ft`HEf@H h ?sH= AE0HHHωD֋DHHDCACs HEHSHEH@Hf@ff tnH ?SH5 H=2 AE0H8HH0H0H8D,I,D+A+ܦ HEH@Hf@fftnH[ ?YH5 H= AE0H HHHH DIDAM HEH@Hf@f f $< HEH@Hf@f f fH ?H= A E0HHlj֋HHDADA蛥 HEH@Hf@ff tnH ?[H5N H=h AE0HHHHHDIDA HEHHEH@H@f@ff tnH ?SH5 H=> AE0HHHHHDIDAz HEH@H@f@fftnH ?YH5& H= AE0HHHHHDIDA HEH@H@f@fftnHh ?gH5 H= AE0HHHHHDIDAZ HEH@H@f@f f $<HEH@H@f@f f fH ?H5| E0HH֋HHDAD赢 HEH@H@f@ff tnH9 ?[H5g H= AE0HxHHpHpHxDlIlDkAk+ EEE E؃E؋E؃|HEMHcɊ< tދE؃E؋E؉EE+EEM9EM9~ EtE@EHcH N ?.@0@jHωd֋dHjt EM)ȃEHEMHcHHHHEH{6 H L[ HEHMHUHu@0@cHHXHHXc?!EMMEM9E@EHcH v @.@0@WHωP֋PHW蜠 EM9~DEHcMHcH& @/E0LH׋LDKIKN HEMHcɊDEEE E EEEEEEE<*tE!H5k @0@3HH(H(3  H>0 HHt,H.0 HHH YH9uH0 HHH HDžHHHHHH@$<u@H= >nH5 @0@'HHH'] HH@t@H >pH5_ @0@HHH HH@ tOHH@ H >H5 1HHHA肙 HH@$<u@H0 >oH5 @0@HHHP HHf@ftcHHf@H ќ >sH=_ AE0HHω֋HDAܘ HHHbHHH@Hf@ff tnHM >SH5å H= AE0HHHHHDIDA? HHH@Hf@fftnH >YH51 H=U AE0HHHHHDIDA譗 HHH@Hf@f f $< HHH@Hf@f f fH >H= A E0HHlj֋HHDADA HHH@Hf@ff tnHw >[H5 H= AE0HHHHHD|I|D{A{i HHHHHH@H@f@ff tnHٙ >SH5O H=| AE0HpHHhHhHpDdIdDcAc˕ HHH@H@f@fftnHF >YH5 H= AE0HXHHPHPHXDLILDKAK8 HHH@H@f@fftnH >gH5) H=V AE0H@HH8H8H@D4I4D3A3襔 HHH@H@f@f f $<HHH@H@f@f f fH >H= AE0H(Hlj$֋$H( H DADA HHH@H@f@ff tnHl >[H5 H= AE0HHHHHDIDA^ HEMH HljH։ʋ> 44HHHteHHH@H@f@fft@H )?H53 @0@HHH詒 HE HEMH HljH։ʋz 44HHHteHHH@H@f@fft@Hŕ 5?H5o @0@HHH HE HEMH %HljH։ʋΑ 44EHDž@H& H !H5 @0@}HHuHME  H3 HHt)H# HHH ^H9uH  HHEHEHEHHEȋ@$<u4H> >nH5 @0@}HHuHMEj HEȋ@t4H >pH5ē @0@}HHuHME% HEȋ@ tLHEȋ@ H >H5 1|HHpHp|A褅 HEȋ@$<u@HU >oH5 @0@oHH`H`ou HEf@ft`HEf@H >sH=ے AE0HXHωT֋THXDSAS HEHUHEH@Hf@ff $<tnH| >UH5G H=c AE0HHHH@H@HHDYH5 H=ԑ AE0H0HH(H(H0D$I$D#A#߃ HEH@Hf@f f $< HEH@Hf@f f fHA >H=/ A E0HHlj֋HHD A D A - HEH@Hf@ff tnH >[H5} H= AE0HHHHHDIDA褂 HEHHH9uDHEH * >H5 HHHHD0 HEHH$E؋E؃HEHHtHEHHH9uDHEH >H5 HHHHD觀 HEHHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHP TH" HEH" HEH" HEHEHtHEH@HEHEHHEHMHH HEHH9uDHEH >H5I HHHHD HEH$E؋E؃HEHtHEHH9uDHEH # >H5Ʌ HHHHD) HEH  HHH9HEHEHEHtaHEH@Hf@fft@H >H5} @0@HHH HEHMHHEHPHHk~ *HEHtHEHH9uDHEH  >H5 HHHHD ~ HEHHMHHHMH@HEHEHtHEH@HEHEHHEHMHH} HEHtaHEH@Hf@fft@HG >H55 @0@HHHg~ HEH@ HEHb} HĀ]UHHH}HEHEHEHHE t4H 7>!H5 @0@}HHuHME}  H HHt)H HHH ^H9uH HHEHEHEHHEȋ@$<u4H 7>nH5 @0@}HHuHME} HEȋ@t4H 7>pH5 @0@}HHuHME| HEȋ@ tLHEȋ@ H T 7>H5g 1|HHpHp|AT| HEȋ@$<u@H 7>oH5 @0@oHH`H`o%| HEf@ft`HEf@H  7>sH= AE0HXHωT֋THXDSAS{ HEHUHEH@Hf@ff $<tnH, 7>UH5$ H= AE0HHHH@H@HHDYH5 H=+ AE0H0HH(H(H0D$I$D#A#z HEH@Hf@f f $< HEH@Hf@f f fH} 7>H= A E0HHlj֋HHD A D A y HEH@Hf@ff tnHb} 7>[H5Z H=~ AE0HHHHHDIDATy HEHHH9uDHEH | Z>H5t~ HHHHDw HEHH$E؋E؃HEHHtHEHHH9uDHEH Q| \>H5} HHHHDWw HEHHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHw TH HEH HEH HEHEHtHEH@HEHEHHEHMHHv HEHH9uDHEH S{ h>H5| HHHHDYv HEH$E؋E؃HEHtHEHH9uDHEH z j>H5y| HHHHDu HEH  HHH9HEHEHEHtaHEH@Hf@fft@H?z n>H5{ @0@HHH_v HEHMHHEH`HHu *HEHtHEHH9uDHEH y t>H5[{ HHHHDt HEHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHgt HEHtaHEH@Hf@fft@Hx z>H5z @0@HHHu HEH HEHt HĀ]UHHH}HEHEHEHHE t4H>x =!H5] @0@}HHuHMEjt V H HHt)H HHH ^H9uHj HHEHEHEHHEȋ@$<u4Hw =nH5 @0@}HHuHMEs HEȋ@t4HYw =pH5x @0@}HHuHMEs HEȋ@ tLHEȋ@ H w =H5> 1|HHpHp|As HEȋ@$<u@Hv =oH5Ԁ @0@oHH`H`or HEf@ft`HEf@H \v =sH= AE0HXHωT֋THXDSASgr HEHUHEH@Hf@ff $<tnHu =UH5 H=x AE0HHHH@H@HHDH5u HHHHDn HEHH$E؋E؃HEHHtHEHHH9uDHEH s >H53u HHHHDn HEHHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHm TH9 HEH6 HEH3 HEHEHtHEH@HEHEHHEHMHHZm HEHH9uDHEH r >H5s HHHHD m HEH$E؋E؃HEHtHEHH9uDHEH q >H5)s HHHHDl HEH  HHH9HEHEHEHtaHEH@Hf@fft@Hp >H5s @0@HHHm HEHMHHEH`HHk *HEHtHEHH9uDHEH ep >H5 r HHHHDkk HEHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHk HEHtaHEH@Hf@fft@Ho $>H5q @0@HHHk HEH HEHj HĀ]UHH0H}s t4Ho =!H5Zy @0@}HHuȉHMȊE@k 0 Hi HHt)HY HHH H9uH@ HHEHEHEHHE؋@$<u4Htn =nH5x @0@}HHuHMEj HE؋@t4H/n =pH5ux @0@}HHuHME[j HE؋@ t@HE؋@ H m =H5:x 1}HHuHUMAi HE؋@$<u4Hm =oH5w @0@}HHuHMEi HEf@ftZHEf@H Jm =sH=w AE0H}Hω|֋|HMD{A{[i HEHUHEH@Hf@ff $<tnHl =cH5w H=jn AE0HpHHhHhHpDdIdDcAch HEH@Hf@fftnHAl =YH5v H=m AE0HXHHPHPHXDLILDKAK3h HEH@Hf@f f $< HEH@Hf@f f fHk =H=6m A E0H@Hlj<֋P AE0HPHHHHHHPDDIDDCACQA H0H@H@f@fftnHD <YH5O H=O AE0H8HH0H0H8D,I,D+A+@ H0H@H@f@fftnH9D <gH5aO H=O AE0H HHHH DIDA+@ H0H@H@f@f f $<H0H@H@f@f f fHC <H5pN E0 HH֋ HHDAD ? H0H@H@f@ff tnHC <[H5)N H=M AE0HHHHHDIDA> H^ HHX H HR H(HHtH H@HEHEHHHMHHm= HHH9uGHH B <H5C HHHHD= HH$EEHHtHHH9uGHH A <H5*C HHHHD< H H HHH96HHEHEH$HHMUHωHƋ9< HEHH0HteH0H@H@f@fft@H@ <H5wK @0@HHH< HE\HMHE@H HtH HH9uDH@ <H H5K HHHD; HEHCHHEH] HHHEE?HEHMHEHHHEHEHHHEEEE=~H HtH HH9uDH-? <H H5J HHHD/: H @HMA EE EEE|HEMHcɊ< tދEEEPEHc<H> Hlj: HHHHHHt:HHHMHcHHHuHuHHH: HE#EHcHHHUHHHӅHEP@@Hc<H= Hlj9 H8H8HxHxHHtRHxHHxHxHH HHHHHH9 HE'HxH H HHHHEHxHHHxHxHHtFHxHPHcHHHxHxHHHHT9 HE)PHcHHHxHHH_HEPHcHH<H5t< HHHƉ|Hr8 H H H@H8@0@{H׉Ί{fO@HcH8HHƋ|H8 HHtHHH9uGHH ; <H5f= tHHhHHhDt6 HHHHHH H@H(HHtH H@HEHEHHHMHH]6 EE EEE|HEMHcɊ< tދEEEPEHc<H: Hlj6 HHHHHHt:HHHMHcHHHuHuHHH7 HE#EHcHHHUHHHHEЋP@@Hc<H%: Hlj&6 H8H8HEHEHHtIHEHHMHMH\E HHH`HH`HG6 HE$HEH %E HHHWHEHEHHHEHEHHt=HEHPHcHHHuHuHHHH5 HE&PHcHHHUHHHˀHEPHcHH<H58 HHXHƉTHX4 H M H HHH@H8@0@SH׉ΊSK@HcH8HHƋTHXm4  HH3 Hİ]fUHHH}HuUl t4H7 F<!H5C @0@}HHuHME)4 ) HR HHt)HB HHH }H9uH) HHEHEHEHHEȋ@$<u4H]7 F<nH5B @0@}HHuHME3 HEȋ@t4H7 F<pH5B @0@}HHuHMED3 HEȋ@ t@HEȋ@ H 6 F<H5fB 1}HHuHUMA2 HEȋ@$<u:H6 F<oH5B @0@}HHxHxE2 HEf@ft`HEf@H -6 F<sH=A AE0HpHωl֋lHpDkAk82 HEHSHEH@Hf@ff tnH5 F<SH54A H=;@ AE0H`HHXHXH`DTITDSAS1 HEH@Hf@fftnH 5 F<YH5@ H=? AE0HHHH@H@HHD AE0HHHHHD I D A / HEHZHEH@H@f@ff $<tnHK3 F<cH5> H=4 AE0HHHHHDIDA=/ HEH@H@f@fftnH2 F<YH5@> H=U4 AE0HHHHHDIDA. HEH@H@f@f f $< HEH@H@f@f f fH 2 F<H=3 A E0HHlj֋HHDADA- HEH@H@f@ff tnH}1 F<[H5= H=3 AE0HHHHHDIDAo- HEHtbHEH@H@f@fft@H0 g<H52 @0@HHH- HEH HH HHH HHHEHHtHEH@H@HEHEHHEHMHH+ HEHHH9uDHEH +0 k<H51 HHHHD1+ HEHH$EЋEЃHEHHtHEHHH9uDHEH / m<H5H1 HHHHD* HEHH$HHMUHω|HƋ|* ɉMЋMЃ3HEHtbHEH@H@f@fft@H. s<H50 @0@{HHpHp{+ HEHHtHEHHH9uDHEH {. s<H5!0 lHH`HH`Dl) HEHHMHHHPHQH@HAHEHHtHEH@H@HEHEHHEHMHH ) ; HĠ]f.UHHH}HuU t4H- <!H5O9 @0@}HHuHME) ͆ H HHt)H HHH }H9uHɾ HHEHEHEHHEȋ@$<u4H, <nH58 @0@}HHuHME)) HEȋ@t4H, <pH5j8 @0@}HHuHME( HEȋ@ t@HEȋ@ H c, <H538 1}HHuHUMAo( HEȋ@$<u:H , <oH57 @0@}HHxHxEF( HEf@ft`HEf@H + <sH=7 AE0HpHωl֋lHpDkAk' HEHSHEH@Hf@ff tnHO+ <SH57 H=5 AE0H`HHXHXH`DTITDSASA' HEH@Hf@fftnH* <YH5r6 H=L5 AE0HHHH@H@HHD H.HHHHHJ HE$HEH  H.HHZZHEHEH.HHEHEHHt7HEHMHcHUHuHuHHHH HE EHcHMHUHHHYHEEHcHM;H5 HHHƉH H b H HMHU@0@H׉Ί$EHcHMHHƋH Hr HtHe HH9uDHT ;HC H5 HHHDV H @EЋEЃt%H H HHH0mBj H`]DUHH`H}u j t4H L;!H5/ @0@}HHuHME i H HHt)H HHH H9uH͡ HHEHEHEHHE@$<u@H L;nH5 @0@HHpHp! HE@t@H L;pH5> @0@oHH`H`o HE@ tLHE@ H O L;H5 1\HHPHP\AO HE@$<u@H L;oH5 @0@OHH@H@O HEf@ft`HEf@H  L;sH=S AE0H8Hω4֋4H8D3A3 HEHSHEH@Hf@ff tnH) L;SH5 H= AE0H(HH H H(DIDA HEH@Hf@fftnH L;YH5( H=X AE0HHHHHDIDA HEH@Hf@f f $< HEH@Hf@f f fH L;H= A E0HHlj֋HHDADA HEH@Hf@ff tnH_ L;[H5 H= AE0HHHHHDIDAQ HEMH HljH։ʋ EE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcj;Hs Hljt HEHEHHt4HEHMHcHUHuHuHHH HE EHcHMHUHHHRHE؋E-EEHcj;H Hlj HEHEHEHEHHtIHEHHMHMH~ H-HHHHH  HE$HEH G H-HHRHEHEH-HHEHEHHt7HEHMHcHUHuHuHHHH HE EHcHMHUHHHQHEEHcHMj;H5 HHHƉH H " H HMHU@0@H׉ΊEHcHMHHƋH[ H2 HtH% HH9uDH p;H H5 HHHD Hˡ @EЋEЃt%HN H HHH0b H`]DUHH`H}ua t4Ha ;!H5c @0@}HHuHME a H HHt)H HHH H9uH HHEHEHEHHE@$<u@H ;nH5 @0@HHpHp HE@t@Hp ;pH5r @0@oHH`H`o HE@ tLHE@ H  ;H55 1\HHPHP\A HE@$<u@H ;oH5 @0@OHH@H@O HEf@ft`HEf@H g ;sH= AE0H8Hω4֋4H8D3A3r HEHSHEH@Hf@ff tnH ;SH5 H= AE0H(HH H H(DIDA HEH@Hf@fftnHZ ;YH5\ H= AE0HHHHHDIDAL HEH@Hf@f f $< HEH@Hf@f f fH ;H= A E0HHlj֋HHDADA HEH@Hf@ff tnH ;[H5! H=S AE0HHHHHDIDA HEMH HljH։ʋEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHc/;H3 Hlj4HEHEHHt4HEHMHcHUHuHuHHHxHE EHcHMHUHHHJHE؋E.EEHc/;H HljHEHEHEHEHHtIHEHHMHMH H.HHHHHHE$HEH  H.HHIHEHEH.HHEHEHHt7HEHMHcHUHuHuHHHHFHE EHcHMHUHHHZIHEEHcHM/;H5u HHHƉHsH HӺ HMHU@0@H׉ΊmEHcHMHHƋHH HtH HH9uDH 5;HÙ H5S HHHDH @EЋEЃt%H H HHH0Y H`]DUHHH}uY t@H! :!H5 @0@yHHpHpyAYY Hj HHt)HZ HHH uH9uHA HHEHEHEHHE@$<u@Hu:nH5 @0@oHH`H`oHE@t@H$:pH5 @0@_HHPHP_DHE@ tLHE@ H :H5b 1LHH@H@LAHE@$<u@Ht:oH5 @0@?HH0H0?HEf@ft`HEf@H :sH= AE0H(Hω$֋$H(D#A#&HEHSHEH@Hf@ff tnH:SH5 H=K AE0HHHHHD I D A HEH@Hf@fftnH:YH5 H= AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHb:H= A E0HHlj֋HHDADANHEH@Hf@ff tnH:[H5M H= AE0HHHHHDIDAHEMHh HljH։ʋEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHc:HHljHEHEHHt4HEHMHcHUHuHuHHH,HE EHcHMHUHHH@BHE؋E/EEHc:HVHljWHEHEHEHEHHtIHEHHMHMH H/HHHHH~HE$HEH  H/HHAHEHEH/HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHAHEEHcHM:H5)HHHƉH'H H' HMHU@0@H׉Ί! EHcHMHHƋHH HtH HH9uDH:Hw H5 HHHDH? @EЋEЃ { z ? ?Dž||~ |~m|HcHHAHH :L E0ɉHω֋DIH3 HE|k&HcH Ա HHME?HEHMHEHHHEHEHHHEEԃEԋEԃ%~E%HE HEHHHEEԃEԋE=z~ы|~ |~m|HcHHAHH :L E0ɉHω|֋|D{I{|k&HcH HH8 &HωtHƋt]ɉMЋMЃt8Hy H HHHH#2 0HljΈ;HA H ү H0HHH. 0HLj/|||i{> z1 N HĠ]fDUHHH}uHH(H HDžHDžHDžH\N t@H9!H5 @0@HHH N H HHt,H HHH 5H9uH HH0 HDž0H0HH0@$<u@H9nH5 @0@HHH9H0@t@H9pH5 @0@HHHH0@ tOH0@ H ^9H5 1HHHA^H0@$<u@H 9oH5 @0@HHH,H0f@ftcH0f@H 9sH= AE0HHω֋HDAH0HbH0H@Hf@ff tnH)9SH5+ H=Y AE0HHHHHDIDAH0H@Hf@fftnH9YH5H=AE0HHHxHxHDtItDsAsH0H@Hf@f f $< H0H@Hf@f f fH9H=A E0HhHljd֋dHh`H`D\A\D[A[H0H@Hf@ff tnHS9[H5UH=AE0HPHHHHHHPDDIDDCACEHDžESEHcH :/ E0H8Hω4֋4H8D3I3HEH  Hlj,H΋,EEM9~DEHcMHcH:/E0(H׋(D'I'BHEHhED‰pHQ H HpHhH@0H@&H։Š&HHH9uGHH _#:H5 HHHHD eHH$EE{HHtHHH9uGHH +:H5jHHHHDHH 8 HHH9(HHEHEH(H(H`HHnM9~DžpCHcH 1:.@0@Hω֋H$E)ȃpHEHcHHHHhH~ H ` HHHpHhH(@0H@H։Š_HH HHH9(HHEHEH H H`HH"M9~Dž`CHcH 7:.@0@Hω֋HE)ȃ`HEHcHHHHXH| H  H0HH`HXH @0H@H։ŠZHHtHHH9uGHH ;:H5hHHHHDE EEE|HMHcɊD$< tڋEEEPEHc;:H6Hlj7HHHHHHtIHHHMHcHH$HHHHHHH`HE3EHcHH$HHHHHHa1HEP5@@Hc;:HnHljoH8H8HEHEHHtIHEHHMHMH|H5HHHHHHE$HEH EH5HH0HEHEH5HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHH0HEЋPHcHH;:H5)HHHƉH'H y Hר HHHH@H8@0@H׉Ί@HcH8HHƋHHDž ESEHcH tE:/E0HHω֋HDIHEH HHΉXɉMME Džp1EpHEHHHHHhH1x H r H`HHpHh0Hωƈ ESEHcH RM:/E0HHω֋HDIeHEH HHΉ6ɉMME Džp1EpHEHHHHHhHw H P HxHHpHh0HωƈUyESEHcH 0U:/E0HHω֋HDICHEH }HHΉɉMME Džp1EpHEHHHHHhHu H . HHHpHh0HωƈCWESEHcH ]:/E0HHω|֋|HD{I{!HEH _HHΉttɉMME Džp1EpHEHHHHHhHt H HHHpHh0Hωƈ5ESEHcH e:/E0HhHωd֋dHhDcIcHEH EHHΉ\\ɉMME Džp1EpHEHHHHHhHs H HHHpHh0HωƈESEHcH m:/E0HPHωL֋LHPDKIKHEH (HHΉDDɉMME Džp1EpHEHHHHHhHr H ȡ HHHpHh0Hωƈ-ESEHcH u:/E0H8Hω4֋4H8D3I3HEH HHΉ,,ɉMME Džp1EpHEHHHHHhHeq H HHHpHh0Hωƈ+xEE EEE|HEMHcɊ< tދEEEpEHc:HJHljKHhHhHHt:HhHMHcHhHuHuHHHHE#EHcHhHUHHH&HE؋p ``Hc:HHljHXHXHEHEHHtIHEHHMHMHH HH HH HHE$HEH H HH%HEHEH HHEHEHHt=HEHpHcHhHuHuHHHH9HE&pHcHhHUHHHG%HE苅pHcHh:H5\HHHƉHZH n H HHH`HX@0@H׉ΊA`HcHXHHƋHA6 H(H(H HHH H]UHHH}HuHUMDE5 t@HU|9!H5(@0@kHH`H`ku5 Hm HHt,Hm HHH iH9uHum HHp HDžpHpHHp@$<u@H|9nH5p@0@_HHPHP_Hp@t@HI|9pH5@0@OHH@H@OiHp@ tOHp@ H |9H51HHω HƋ H4CHcH 8.@0@ Hω֋H M9~GEHcHcH8/E0H׋DIɯHMHcD<($ttEpppp|HEpHcɊ< tҋppppHc8HԲHljծHHHHt=HHpHcHHuHuHHH HE&pHcHHUHHHHEHc8H%Hlj&HHHXHXHHtRHXHHXHXHHHHHHH8HE'HXH mHHHEHEHXHHHXHXHHtFHXHHcHHXHXHHHH虭HE)HcHHXHHHHEHcH8H5HHHƉH跬H &B Hv HHHH@0@H׉ΊHcHHHƋHFHHtHHH9uGHH  9H5HHHHDDž)Hc 9HHlj衫HHHXHXHHtRHXHHXHXH@H HHHHH賫HE'HXH H HHHEHXH HHXHXHHt_HXHHH$HHXHXHHHHHHHE4HH$HHXHHHHEH HPHHHHPHHH9wpDžpWHHHPHPHHHPHHHHHHppp(~uDžpCp()p()HHHcҊHPHcɈ ppp(~HPH)HHPDžp4HP HPHHHPppp=w~HcH 9H5HHHH賨H "> Hr HHHH 0Hψ`HHtHHH9uGHH 49H5öHHHHD:HHHu@H9:H5ֻ@0@HHHHHhDž$HHtHHH9uGHH S9H5HHHHDYHHHu+H9;@0H@Ί4$HH)ȉdd| dHcHHH9HHHH)HHHHHdHcHHHHHFHH/9L E0ɉHlj|΋|Hp‹HpDoIo-H( HXHHdiɡHcHHPHXHPH9wrDžpWHPHXHXHHHXHPHHHPppp=~wDžpCp)p)HPHcҊHXHcɈ ppp=~HXHHHXH H HHΉhhʣH9 H [n HHHH0H @0HH`@HX[DžH t HHHHHXHH`HH@0@WHω֊WtllH49 H m HHHHH H@0@VHωPHƋPDPVz H8 H m HHHH0HljΈƱHO HH HA HHH = HHtHHH9uGHH @9H5*LHH@HH@DL衡HHHu+HG@9;@0H@?Ί?|$HH)ȉdd| dHcHHH9HHHH)HHHHHdHcHHHHHFHHw@9LhE0ɉ8Hlj4΋4H(‹8H(D'I'uH+HXHHdiɡHcHHPDžpWHPHXHXHHHXHPHHHPppp=~HHtHHH9uGHH FD9H5ծ HHHHD LHHHH$tt$HHtHHH9uGHH F9H5<HHHHD賞HHxHu+HYF9;@0H@Ί莟DžHHxHHDžHHHHHHHHHHHHHtHHH9uGHH F9H5HHHHD蓝HHHu+H9F9;@0H@Ίn$HH)ȉdd| dHcHHH9HHHH)HHHHHdHcHHHHHFHHiF9LZE0ɉHlj΋H‹HDIgHHtHHH9uGHH ݠF9H5lHHHHDHHHHu+HF9;@0H@Ί辜DžHHHHHDžHH`HHHpHHHXHHHHz1 H e H HHHHdiɡHcHH+HHE0HHHHHDAAI H0 H 6e H8HHH+H@0H@֊H HHIL HNj‰5H+H 6 HljH΋~8H0 H qd HPHHH+0HljΈH HXH+HPDžpWHPHXHXHHHXHPHHHPppp=~HL/ H c HhHHH 0HLj:C$$$h9HHtHHH9uGHH ;_9H5ʧHHHHDAHHHu@H_9:H5ݬ@0@HHH# HHȉ HHtHHH9uGHH ac9H5HHxHHxDgDž-Hcc9H Hlj HHHXHXHHtRHXHHXHXHHHHpHHpHHE'HXH HHH)HEHXHHHXHXHHt_HXHHH$HHXHXHHHhHHhHdHE4HH$HHXHHHdHEH HPHHHHPHHH9wpDžpWHHHPHPHHHPHHHHHHppp,~uDžpCp,)p,)HHHcҊHPHcɈ ppp,~HPH-HHPDžp4HP HPHHHPppp=s~HcHc9H5HH`HH`H * H^ HHHH 5 0HψiLK HH*HI* HHMH9u Hİ.]/UHH`H}uHDžhHDžpHDžxHHh t@H/7!H5a@0@gHHXHXgOk Hx) HHt)Hh) HHH CH9uHO) HHEHEHEHHE@$<u@H7nH5@0@WHHHHHW裓HE@t@H27pH5d@0@GHH8H8GRHE@ tLHE@ H і7H5#14HH(H(4AђHE@$<u@H7oH5@0@'HHH'袒HEf@ft`HEf@H )7sH=vAE0HHω ֋ HD A 4HEHSHEH@Hf@ff tnH7SH5ݥH=AE0HHHHHDIDA蝑HEH@Hf@fftnH7YH5NH=xAE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHp7H=ӤA E0HHlj֋HHDADA\HEH@Hf@ff tnH7[H5H==AE0HHHHHDIDAӏHDžhESEHcH Z7/ E0HHω֋HDImHEH \ HljH΋?MMEEԋEԋM9~DEHcMHcH7/E0H׋DIَHEHEEԃD‰EH# H Z HEHMHh@0H@H։ŠnHhHH9uGHhH 7H5HHHHDHhH$E̋Ẽ ESEHcH 8/E0HxHωt֋tHxDsIs襍HEH ҟHHΉllvɉM̋M̃u ESEHcH  8/E0H`Hω\֋\H`D[I[HEH 8HHΉTT׋ɉM̋M̃ESEHcH T8/E0HHHωD֋DHHDCICgHEH HHΉ<<8ɉM̋M̃E E+EEHEHHHHHEH! H W HHHEHM0HωƈvHO( HtHB( HH9uDH18H ( H58HH0H0D83H' @NESEHcH ̎"8/E0H(Hω$֋$H(D#I#ߊHEH HHΉ谉ɉM̋M̃E E+EEHEHHHHHEH H sV H0HHEHM0Hωƈ螐H& HtH& HH9uDH*8H& H5(HHHD諈H`& @ESEHcH D08/E0HHω֋HDIWHEH HHΉ(ɉM̋M̃E E+EEHEHHHHHEH  H T HHHHEHM0HωƈwH?% HtH2% HH9uDH!88H% H5HHHD#H$ @>ESEHcH >8/E0HHω֋HDIχHEH HHΉ蠆ɉM̋M̃ttE E+EEHEHHHHHEH H gS H`HHEHM0Hωƈ2d/ESEHcH H8/E0HHω֋HDIHEH HHΉ葅ɉM̋M̃EE EȃEȋEȃ|HEMHcɊ< tދEȃEȋEȉEEHcV8HՉHljօHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHH.HE؋E!EEHcV8HDHljEHEHEHEHEHHtIHEHHMHMHH!HHHHHlHE$HEH IH!HH|HEHEH!HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHMV8H5HHHƉHH  HeP HxHHMHU@0@H׉ΊEHcHMHHƋH调 HhHH`]fDfDUHSHH HHEH}HuHU؉MDEDM̋ t@H"q6!H5@0@WHHHHHWBb Hk HHt,H[ HHH VH9uHB HHh HDžhHhHHh@$<u@Hjq6nH5@0@GHH8H8G节Hh@t@Hq6pH5@0@7HH(H(76Hh@ tOHh@ H q6H5_1$HHH$A证Hh@$<u@H]q6oH5@0@HHH}Hhf@ftcHhf@H q6sH=AE0HHω֋HDA HhHHhH@H@f@ff $<tnHwq6NH5 H=-AE0HHHHHDIDAiHhH@H@f@fftnHq6YH5xH=AE0HHHHHDIDAHhH@H@f@f f $< HhH@H@f@f f fH0q6H=A E0HHlj֋HHDADAHhH@H@f@ff $<HhH@H@f@ff fHHHjq6H5H= AE0HHHHHDIDA\~HEHHtnHEH@HHHMH Hҁq6H=kAHHHHHDID|HEHHhH/HhH@H@f@ff $<tnHOq6NH5H=AE0HHHxHxHDtItDsAsA}HhH@H@f@fftnHq6YH5PH=}AE0HhHH`H`HhD\I\D[A[|HhH@H@f@fftnH)q6gH5H=AE0HPHHHHHHPDDIDDCAC|HhH@H@f@f f $< HhH@H@f@f f fHuq6H==A E0H8Hlj4֋4H80H0D,A,D+A+a{HhH@H@f@ff $<HhH@H@f@ff fHHH~q6H5CH=pAE0H HHHH DIDAzEԃ{EHcHHH-~{6 H5H=-AE0HHHHHLIHDIzHhHbHhH@Hf@ff tnH}q6SH5#H=AE0HHHHHDIDAyHhH@Hf@fftnH|q6YH5H=AE0HHHHHDIDAxHhH@Hf@f f $< HhH@Hf@f f fHK|q6H=RA E0HHlj֋HHDADA7xHhH@Hf@ff tnH{q6[H5MH=AE0HHHHHDIDAwHhHHhHH(HHHHHwHHHHH%vH x HYF HHh0Hψ32HH(IL |HNj|‰vDždH HtH HH9uDHUz6H H5FxHHpHpDxWuH HtH HH9uDHy6H H5߄lHH`H`DltHM HtH@ HH9uDHy6H H5x\HHPHPD\tH @H HH5 ALHH@H@LDCHlj??HHHHHHtFHHHcHHHHHHH]?HE)HcHHHHHhHEHHcHHHHHtRHHHHHTHHHHHHHH>HE'HH MTHHH辉HEHcH7H5AHH@HH@=Dž|HE苍HcɊ< tҋHc7HPAHljQ=HHHHt=HHHcHHuHuHHH=HE&HcHHUHHH蔈HEȉxxHc7H@Hlj<HpHpHHHHtFHHHcHHHHHHH<HE)HcHHHHHƇHEHHcHHHHHtFHHHcHHHHHHH<HE)HcHHHHH&HEHcH7H5;?HH8HƉ4H89;HcHHHƋ4H8;H ~H_ HHHxHp@0@3H׉Ί3QxHcHpHHƋ4H8:\\\9׬ HhH9HHHMH9u H[]:UHH H}HuHUMDEHH t@H=5!H5P@0@HHpHp9T HHHt,H HHH XH9uHHH HDžHHH@$<u@H=5nH5dO@0@oHH`H`o<9H@t@H<5pH5O@0@_HHPHP_8H@ tOH@ H a<5H5N1LHH@H@LAa8H@$<u@H<5oH5WN@0@?HH0H0?/8Hf@ftcHf@H ;5sH=NAE0H(Hω$֋$H(D#A#7HHbHH@Hf@ff tnH,;5SH5tMH=MAE0HHHHHD I D A 7HH@Hf@fftnH:5YH5LH=LAE0HHHHHDIDA6HH@Hf@f f $< HH@Hf@f f fH95H=GLA E0HHlj֋HHDADA5HH@Hf@ff tnHV95[H5KH=KAE0HHHHHDIDAH5HHgHH@H@f@ff tnH85SH5KH=KAE0HHHHHDIDA4HH@H@f@fftnH%85YH5mJH=JAE0HHHHHDIDA4HH@H@f@f f $<HH@H@f@f f fHq75H=IAE0HHlj֋HHD|A|D{A{]3HH@H@f@ff tnH65[H5&IH=DIAE0HpHHhHhHpDdIdDcAc2HHgHH@H@f@ff tnH@65SH5HH=@EAE0HXHHPHPHXDLILDKAK22HH@H@f@fftnH55YH5GH=DAE0H@HH8H8H@D4I4D3A31HH@H@f@f f $< HH@H@f@f f fH45H=DA E0H(Hlj$֋$H( H DADA0HH@H@f@ff tnHf45[H5FH=fCAE0HHHHHDIDAX0DžDHHD5H53HHHH/HHHHHtXHHHHHHHǀHHHǀxHHǀHHHHb.DDtDH Hg/E@@@@|HE@HcɊ< tҋ@@@@Hc5H{2Hlj|.HHHHt@HH@HcHHuHuHHH.HH)@HcHHUHHHyHHHc5H1Hlj-HHHHHHtUHHHHHCHHHHHH-HP*HH CHHHxHPHHHHHHHtIHHHcHHHHHHH4-HX,HcHHHHHHHHHt@HH@HcHHuHuHHHsHH)@HcHHUHHH~HHxxHcK3HHlj艢HpHpHHHHtUHHHHHHHHHHH蛢HP*HH |HHHHPHHHHHHHtIHHHcHHHHHHHHX,HcHHHHHHXHcHK3H5HHHƉHH }6H.yHxHp@0@H׉ΊxHcHpHHƋH誠HQBHH9uDHpQ3H/BH5HHHDrHAH$88H=HtH=HH9uDHS3H<H5{HHHDH<H@H<H 9HHHHHz<H`HHi<HHtHY<H@H@H` HDž`HH6<H`HHRH<HtH<HH9uDHU3H;H5HHHDH;HH ;HHH ;H@H;H;HtH;H@Hh HDžhHHhH \;HHH@HJ8HHH?H`H?H?HtH?H@Hp HDžpHHpH ?HHH?H:H?H:H?H:H:HtH:H@Hx HDžxHHxH o:HH蒜H`HtH`HH9uGH`H (_3H5HHxHHxD.H`HH`HtH`HH9uGH`H e3H5tHHhHHhDt趛H`H$HHHEHEE4E)0Dž4Dž0Dž@WHHHHHHHHHH@@@49|Dž@4H HHHH@@@09|H8HtH8HH9uDH-g3H8H5dHHXHXDd/H`HtH`HH9uGH`H g3H5THHHHHHDTřH`HCHHH8HHHDž@WHHHHHHHHHH@@@=~H|7HtHo7HH9uDHh3HM7H5DHH8H8DD踘H`HtH`HH9uGH`H Hh3H5;4HH(HH(D4NH`H 6IHH`HtH`HH9uGH`H ʜj3H5$HHHHD$ЗH`@H`HtH`HH9uGH`H Rk3H5EHHHHDXH`HCHHDž@4H HHHH@@@=~H`HtH`HH9uGH`H l3H5sHHHHD膖H`@ ESEHcH $r3/E0HHω֋HDI7HE<($88= HEMHdHljH։ʋXXE@@@@|HE@HcɊ< tҋ@@@@Hcz3H Hlj HHHHt=HH@HcHHuHuHHH@HE&@HcHHUHHHNHExxHcz3H[Hlj\HpHpHHHHtRHHHHHHHHHHHnHE'HH pHHH{HEHHHHHHHtFHHHcHHHHHHHϔHE)HcHHHHHHEHcHz3H5HHHƉHH \)H lHHHxHp@0@H׉ΊԪxHcHpHHƋH|XDDDžDM9~GEHcDHcH3/E0H׋DI;DHEHHHHHH`HtH`HH9uGH`H }3H5pHHHHD胑H'H jH0HHH`HHHH@0@H׉HΉ‹RDžDH`HtH`HH9uGH`H 3H5HHHHD袐H`HxHtDžDH`ǀH`HǀH`HtH`HH9uGH`H 3H5ߞHHHHDH`HHHu@H3:H5R@0@HHxHx踐H`HǀH`H`@@} Dž@H`@HcHH`HǀH`H`HHH)H@HcH H HHHD3H5HHpHHp蒏HH`HHxDTDtDH ,H裏TH`HtH`HH9uGH`H 3H5lHH`HH`DlDž@@@@|H`@HcɊD$< t΋@@@@Hc3HKHljLHHHHtLHH@HcH`H$HHHHHHrHE6@HcH`H$HHHHHpHE(xxHc3H}Hlj~HpHpHHHHtRHHHHHH(HHXHHXH萍HE'HH ʦH(HHHEHH(HHHHHtFHHHcHHHHHHHHE)HcHHHHHHEHcH3H5HHPHƉLHPH ~!H/dHHHHxHp@0@KH׉ΊKxHcHpHHƋLHP螋HEH`HtH`HH9uGH`H <3H5/DHH8HH8DDBDž@@@@|H`@HcɊD$< t΋@@@@Hc3HHlj薊HHHHtLHH@HcH`H$HHHHHH輊HE6@HcH`H$HHHHHHE=xxHc3HǍHljȉHpHpHHHHtRHHHHH~H=HH0HH0HډHE'HH DH=HHHEHH=HHHHHtFHHHcHHHHHHH;HE)HcHHHHHFHEHcH3H5[HH(HƉ$H(YH Hy`H`HHxHp@0@#H׉Ί#@xHcHpHHƋ$H(HEMHHljH։ʋ\\E@@@@|HE@HcɊ< tҋ@@@@Hc3HHljHHHHt=HH@HcHHuHuHHHRHE&@HcHHUHHH`HEȋ-xxHc3HmHljnHpHpHHHHtRHHHHHdH-HHHHH耆HE'HH *H-HHHEHH-HHHHHtFHHHcHHHHHHHHE)HcHHHHHHE؋HcH3H5HHHƉHH nH]HxHHxHp@0@H׉ΊxHcHpHHƋH莄H`HtH`HH9uGH`H @3H53HHHHDF\DDM9~DžDCDHcH 3.@0@Hω֋HDM)DHMHcHHHHHH [HHHHH`HHH@0@H׉H΋ԐH} H5.AHNjD\\DDs 9~DžDCDHcH f3.@0@Hω֋H茂 =~Y HcH 3/E0HHω֋HHDI& D)ȃDHcH A HHHHHc3HzHlj{HHHpxHHDž@*@@HHHH@9~ H< t@4WHHHHHHHHHH4449@)ȉ44H HHHH4449H`HtH`HH9uGH`H 3H5HHHHD~H`HHHHpHx=!xx)DžDžDž0WHHHHHHHHHH0009|Dž04H HHHH0009|xHcHp3H5kHHHHo~H`HtH`HH9uGH`H !3H5HHHHD'}H`HM  H`H1}Hp]UHHH.HHEH}HuU^ t4Ho2!H5@0@}HHuHME} HHHt)HHHH oH9uHHHEHEHEHHE@$<u4Hπ2nH5A@0@}HHuHME|HE@t@H2pH5@0@HHpHp|HE@ tLHE@ H )2H51lHH`H`lA)|HE@$<u@H2oH5L@0@_HHPHP_{HEf@ft`HEf@H 2sH=AE0HHHωD֋DHHDCAC{HEHXHEH@H@f@ff tnH2SH5tH=hAE0H8HH0H0H8D,I,D+A+zHEH@H@f@fftnHr~2YH5H=ؐAE0H HHHH DIDAdzHEH@H@f@f f $<HEH@H@f@f f fH}2H=1AE0HHlj֋HHDADAyHEH@H@f@ff tnH4}2[H5H=AE0HHHHHDIDA&yHEHSHEH@Hf@ff tnH|2SH5H=AAE0HHHHHDIDAxHEH@Hf@fftnH|2YH5H=AE0HHHHHDIDAxHEH@Hf@f f $< HEH@Hf@f f fHb{2H= A E0HHlj֋HHDADANwHEH@Hf@ff tnHz2[H5EH=wAE0HHHHHDIDAvH H )PHHEHMUHuE0|HHpHHplH‹l|DkAkHHtHHH9uDHy2HH5UdHHXHXDdtH@EEEE܋E܋M9~ EtE܃@EHcH Oy2.@0@WHωP֋PHWuuEM)ȃEHEMHcHHHHEH| H NHHHEHMHUHuE0LHH@HH@LD?A?] H HHMH9u H]t@UHHH}HuHUMDE t@H%x`2!H5َ@0@kHH`H`kEt Hn HHt,H^ HHH iH9uHE HHp HDžpHpHHp@$<u@Hmw`2nH5!@0@_HHPHP_sHp@t@Hw`2pH5͍@0@OHH@H@O9sHp@ tOHp@ H v`2H51|AE0HHω ֋ HD A *aHHbHH@Hf@ff tnHd1SH5{H={AE0HHHHHDIDA`HH@Hf@fftnH d1YH5 {H=:{AE0HHHHHDIDA_HH@Hf@f f $< HH@Hf@f f fHWc1H=zA E0HHlj֋HHDADAC_HH@Hf@ff tnHb1[H5yH=yAE0HHHHHDIDA^ESEHcH Ib1/E0HHω֋HDI\^HE<($E|HMHc< tҋHc1HraHljs]HHHHt@HHHcHHuHuHHH]H)HcHHUHHH賨HHc1H`Hlj\HHHHHHtUHHHHHwHHHHHH\H*HH xwHHHڧHHHHHHHHtIHHHcHHHHHHH+\H,HcHHHHH3HHcH1H5E_HHHƉHC[H HC7HH@0@H׉Ί7rHcHHHƋHZDžHDH 6HHHHEMHH@0@HHxHHxiCHcH A^1.@0@wHωp֋pHwgZM9~GEHcHcH]1/E0lH׋lDkIkZHMHcD<)$.E|HMHc< tҋHc1H]HljYHHHHt@HHHcHHuHuHHHTYH )HcHHUHHH_H 2Hc1Hi\HljjXHHHHHHtUHHHHHsH2HH`HH`H|XH(*HH CsH2HH膣H(HH2HHHHHtIHHHcHHHHHHHWH0,HcHHHHHߢH0HcH1H5ZHHXHƉTHXVH ^H2H0HHH@0@SH׉ΊSmHcHHHƋTHX~VE|HMHc< tҋ$)E|HMHc< tҋHc1HYHljUHHHHt@HHHcHHuHuHHHUH8)HcHHUHHHH8*Hc1HXHljTHHHHHHtUHHHHHpH*HHHHHHHTH@*HH oH*HHH@HH*HHHHHtIHHHcHHHHHHH8THH,HcHHHHH@HHHcH1H5RWHH@HƉHHHHHHtRHHHHHxZH+HH8HH8H>HE'HH >ZH+HHىHEHH+HHHHHtFHHHcHHHHHHH->HE)HcHHHHH8HEHcH2H5MAHH0HƉ,H0K=HcHNj,H0 =HHHHHHtFHHHcHHHHHHH(=HE)HcHHHHH3HEHHcHHHXHHHHHHHHHHHHHHHHHHHHHHcH2H5?HH HH ;HHHHDž*HHHH  H< tWHHHHHHHHHH ~ )4H HHHH ~Dž |Hc< tҋHc2H=Hlj9HHHHt2/E0HHω|֋|HHD{I{W&HRfHD‰HHH/H~DžDžDžWHHHHHHHHHH9|Dž4H HHHH9|=~DžCHcH (B2.@0@zHωt֋tHz$|)iHcH dHHHHHHHl@H~DžDžDžWHHHHHHHHHH9|Dž4H HHHH9|HH HHHH0`0HLjt HSHHMH9u HĐ]9#fUHH0H}u t@Hq&21!H5>@0@HHH"a HHHt,HHHH uH9uHHH HDžHHH@$<u@H%21nH5>@0@HHH!H@t@He%21pH5=@0@HHH!H@ tOH@ H $21H5=1HHHA H@$<u@H$21oH5=@0@HHH Hf@ftcHf@H M$21sH=<AE0HHω֋HDAX HHbHH@Hf@ff tnH#21SH5+<H=Y<AE0HHHHHDIDAHH@Hf@fftnH7#21YH5;H=;AE0HHHHHDIDA)HH@Hf@f f $< HH@Hf@f f fH"21H=;A E0HHlj|֋|HxHxDtAtDsAsqHH@Hf@ff tnH!21[H5U:H=:AE0HhHH`H`HhD\I\D[A[HHtHsHH9uDHb!R1HQH5-THHHHHDTdH@DDDjEE EEE|HEMHcɊ< tދEEE8EHcV1H HljH0H0HHt:H0HMHcH0HuHuHHHHE#EHcH0HUHHHgHE8!((HcV1HHljH H HEHEHHtIHEHHMHMH[8H!HH8HH8HHE$HEH $8H!HH'gHEHEH!HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHfHE8HcH0V1H5HH0HƉ,H0H HnH(H @0@+H׉Ί+1(HcH HHƋ,H0JEE EEE|HEMHcɊ< tދEEE8EHcZ1HHljH0H0HHt:H0HMHcH0HuHuHHHHE#EHcH0HUHHH!eHE8#((HcZ1H.Hlj/H H HEHEHHtIHEHHMHMH5H#HH HH HPHE$HEH 5H#HH`dHEHEH#HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHcHE8HcH0Z1H5HHHƉHH VHHHH(H @0@H׉Ί.(HcH HHƋHvEE EEE|HEMHcɊ< tދEEE8EHc^1HHljH0H0HHt:H0HMHcH0HuHuHHH<HE#EHcH0HUHHHMbHE8%((Hc^1HZHlj[H H HEHEHHtIHEHHMHMH3H%HHHHH|HE$HEH 2H%HHaHEHEH%HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHaHEЋ8HcH0^1H5HHHƉHH HH0HH(H @0@H׉Ί+(HcH HHƋHHEMHHljH։ʋEE EEE|HEMHcɊ< tދEEE8EHcf1HHljH0H0HHt:H0HMHcH0HuHuHHH6HE#EHcH0HUHHHG_HE؋8)((Hcf1HTHljUH H HEHEHHtIHEHHMHMH20H)HHHHHvHE$HEH /H)HH^HEHEH)HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHH]HE苅8HcH0f1H5HHHƉH H |HHHHH(H @0@H׉Ί((HcH HHƋHH H \H`HH10HLjH| H0]DfDUHHH}uT t@H0!H5U.@0@HHH1 HZHHt,HJHHH uH9uH1HH HDžHHH@$<u@HY0nH5-@0@HHHyH@t@H0pH5I-@0@HHH%H@ tOH@ H 0H5-1HHHAH@$<u@HL0oH5,@0@HHHlHf@ftcHf@H 0sH=M,AE0HHω֋HDAHHbHH@Hf@ff tnHi0SH5+H=+AE0HHHHHD|I|D{A{[HH@Hf@fftnH0YH5+H=G+AE0HpHHhHhHpDdIdDcAc HH@Hf@f f $< HH@Hf@f f fH%0H=*A E0HXHljT֋THXPHPDLALDKAK HH@Hf@ff tnH0[H5)H=*AE0H@HH8H8H@D4I4D3A3 H HtHHH9uDH0HH5,HH H D, H@H HQHHHcHEtttt|HEtHcɊ< tҋttttHc0H"Hlj# HHHHt@HHtHcHHuHuHHHX Hx)tHcHHUHHHcVHxHc0HmHljn HHHhHhHHtRHhHHhHhH'HHHHHH HE'HhH h'HHHUHEHhHHHhHhHHtFHhHHcHHhHhHHHH HE)HcHHhHHHTHEHcH0H5 HHHƉHH nHHH@0@H׉ΊHcHHHƋHO Etttt|HEtHcɊ< tҋttttHc1H HljHHHHt=HHtHcHHuHuHHHCHE&tHcHHUHHHQSHEHc1H^ Hlj_HHHhHhHHtRHhHHhHhH$HHHHHHqHE'HhH u$HHH~RHEHhHHHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHQHEHcH1H5 HHHƉHH _HHHHH@0@H׉ΊHcHHHƋH3Etttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHH'HE&tHcHHUHHH5PHE!Hc1HBHljCHHHhHhHHtRHhHHhHhH!H!HHHHHUHE'HhH o!H!HHbOHEHhH!HHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHNHEHcH1H5HHHƉHH CHH0HHH@0@H׉ΊHcHHHƋHcEtttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHH HE&tHcHHUHHHMHE#Hc1H&Hlj'HHHhHhHHtRHhHHhHhHH#HHHHH9HE'HhH {H#HHFLHEHhH#HHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHKHEЋHcH1H5HHHƉHH 'HHHHHH@0@H׉ΊHcHHHƋHGHEMH& HljH։ʋOEtttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHHHE&tHcHHUHHHIHE؋'Hc1HHljHHHhHhHHtRHhHHhHhHH'HHHHHHE'HhH UH'HHHHEHhH'HHhHhHHtFHhHHcHHhHhHHHHLHE)HcHHhHHHWHHE苅HcH1H5lHHHƉHjH ّHJH`HHH@0@H׉ΊQHcHHHƋHHИHtHØHH9uDH1HH51 HHHDHi@H[HtHNHH9uDH=1H,H5 HHxHxD?HH@HtHH@HH9uTHɗHHH 1H5tHHhHHhDtHuHtHhHH9uDHW1HFH5 dHHXHXDdYHHtHHH9uDH1HߖH5o THHHHHDTHH HIIH@tH@u EEEH@At H]f''@UHHHHHEH}uJt t@HY0!H5D@0@HHH#s HLHHt,H<HHH gH9uH#HH HDžHHH@$<u@HKY0nH5@0@HHHkH@t@HY0pH58@0@HHHH@ tOH@ H Y0H51HHHAH@$<u@H>Y0oH5@0@HHH^Hf@ftcHf@H Y0sH=>AE0HHω֋HDAHHbHH@Hf@ff tnH[Y0SH5H=AE0HHHHHDIDAMHH@Hf@fftnHY0YH5 H=:AE0HHHxHxHDtItDsAsHH@Hf@f f $< HH@Hf@f f fHY0H=A E0HhHljd֋dHh`H`D\A\D[A[HH@Hf@ff tnHY0[H5H=AE0HPHHHHHHPDDIDDCACwHHtHHH9uDH0HH5sHXHc0H_Hlj`HHH8H8HHtUH8HH8H8HHHH HH HrH`*H8H aHHH|=H`H8HHH8H8HHtIH8HHcHH8H8HHHHHh,HcHH8HHHHlj?HHH8H8HHtUH8HH8H8H HHHHHHQHx*H8H _ HHH[:HxH8HHH8H8HHtFH8HHcHH8H8HHHHHE)HcHH8HHH9HEHcH0H5HHHƉHH 9H*HHHH@0@H׉ΊHcHHHƋHY3ETTTT|HETHcɊ< tҋTTTTHc0HHljHHHHt=HHTHcHHuHuHHHHE&THcHHUHHH8HE$Hc0HHljHHH8H8HHtRH8HH8H8H H$HHHHH/HE'H8H Y H$HH<7HEH8H$HH8H8HHtFH8HHcHH8H8HHHHHE)HcHH8HHH6HEHcH0H5HHHƉHH HH0HHH@0@H׉ΊHcHHHƋH=ETTTT|HETHcɊ< tҋTTTTHc0HHljHHHHt=HHTHcHHuHuHHHHE&THcHHUHHH4HE&Hc0HHljHHH8H8HHtRH8HH8H8HH&HHHHHHE'H8H eH&HH 4HEH8H&HH8H8HHtFH8HHcHH8H8HHHHtHE)HcHH8HHH3HEHcH0H5HHHƉHH }HHHHHH@0@H׉ΊyHcHHHƋH!HEMHHljH։ʋ/ETTTT|HETHcɊ< tҋTTTTHc0HUHljVHHHHt=HHTHcHHuHuHHHHE&THcHHUHHH1HE Hc0HHljHHH8H8HHtRH8HH8H8HmH HHHHHHE'H8H 3H HH0HEH8H HH8H8HHtFH8HHcHH8H8HHHHHE)HcHH8HHH%0HEȋHcH0H5:HHHƉH8H yHH`HHH@0@H׉ΊHcHHHƋHPPM9~DžPCPHcH d0.@0@Hω֋HE싍P)ȃHEPHcHHHHHHHωH։‹ɉLLETTTT|HETHcɊ< tҋTTTTHc0H8Hlj9HHHHt=HHTHcHHuHuHHHnHE&THcHHUHHH|-HEЋ*Hc0HHljHHH8H8HHtRH8HH8H8HxH*HHHHHHE'H8H >H*HH,HEH8H*HH8H8HHtFH8HHcHH8H8HHHHHE)HcHH8HHH,HEHcH0H5HHHƉHH uH{HxHHH@0@H׉ΊHcHHHƋHH|HtHt|HH9uDHc0HR|H5HHxHxDeH|@H |HtH{HH9uDH0H{H5mtHHhHhDtH{H@HtH{H@HH9uTHz{HHH k0H5dHHXHHXDdqH&{H@@LLH{HtHzHH9uDH0HzH5dTHHHHHDTHz@LLtzHzHtHtzHH9uDHc0HRzH5DHH8H8DDeHz@PPM9~GEHcPHcH0/E04H׋4D3I3 HEHPD‰HH8HH0=!H)DDžHDžDDžTWH0H8H8HHH8H0HHH0TTTH9|DžT4H8 H8HHH8TTTD9|HpH HHHHH@0H@2HΊ2WHxHtHxHH9uDH0HwH5q,HH H D,HwHHwHtHwHH9uDH{0HjwH5HHHD}H2wH_U HoHHMH9u H]f@UHHHnoHHEH}uT t@H/!H5@0@HHHT HnHHt,HnHHH gH9uHnHHH HDžHHHHHH@$<u@H/nH5`@0@HHHHH@t@H/pH5 @0@HHpHpHH@ tOHH@ H @/H51lHH`H`lA@HH@$<u@H/oH5S@0@_HHPHP_HHf@ftcHHf@H /sH=AE0HHHωD֋DHHDCACHHHbHHH@Hf@ff tnH /SH5pH=AE0H8HH0H0H8D,I,D+A+HHH@Hf@fftnHy/YH5H=AE0H HHHH DIDAkHHH@Hf@f f $< HHH@Hf@f f fH/H=[A E0HHlj֋HHDADAHHH@Hf@ff tnH5/[H5H=AE0HHHHHDIDA'HEMHHljH։ʋDDEE EEE|HEMHcɊ< tދEEEhEHc0H:Hlj;H`H`HHt:H`HMHcH`HuHuHHHsHE#EHcH`HUHHHHEhXXHc0HHljHPHPHEHEHHtIHEHHMHMHHHHHHHHE$HEH HHHHEHEHHHEHEHHt=HEHhHcH`HuHuHHHH)HE&hHcH`HUHHH7HEȋhHcH`0H5LHHHƉHJH gHHXHP@0@H׉Ί>XHcHPHHƋHDEEM9~ DžhzE@EHcH 0.@0@Hω֋HEM)ȃhHEMHcHHHH`hH`H#HωH։‹LɉMMEE EEE|HEMHcɊ< tދEEEhEHc0HHljH`H`HHt:H`HMHcH`HuHuHHHHE#EHcH`HUHHHHEЋh%XXHc0HHljHPHPHEHEHHtIHEHHMHMHbH%HHHHHHE$HEH +H%HHHEHEH%HHEHEHHt=HEHhHcH`HuHuHHHH|HE&hHcH`HUHHHHEhHcH`0H5HHHƉHH dHMHHHXHP@0@H׉ΊXHcHPHHƋH,HcH ܯH0HH10HLj HjHtHjHH9uDH,0HjH58HHHDHpjH@HtH_jH@HH9uTHEjHHH 6,0H5eHHHHD<HiH@@EEDEEM9~DEHcMHcH20/E0|H׋|D{I{HEH`ED‰hHHEH`HEh=hEh)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|HaH YHHHHHH@@0H@zHΊz{H4hHtH'hHH9uDH80HhH5tHHhHhDtHg@HHgHtHgHH9uDH:0HgH5dHHXHXDdHVg@HHAgHtH4gHH9uDH#B0HgH5THHHHHDT%Hf@HfHtHfHH9uDHD0HfH5-DHH8H8DDHef@D H^HHMH9u H]UHH@H}cD t4H/!H5@0@}HHuЉHMЊE@ D Hi^HHt)HY^HHH H9uH@^HHEHEHEHHE@$<u4Ht/nH5T@0@}HHuHMEHE@t4H//pH5@0@}HHuHME[HE@ t@HE@ H /H51}HHuHUMAHE@$<u4H/oH5w@0@}HHuHMEHEf@ftNHEf@H J/sH=<AE0H}Hωu֋UHMDMAEgHEHRHEHDHEH@Hf@ff tnH/SH5H=AE0HxHHpHpHxDlIlDkAkHEH@Hf@fftnHA/YH5!H=9AE0H`HHXHXH`DTITDSAS3HEH@Hf@f f $<HEH@Hf@f f fH/H5E0LHH@֋LH@~H@t@Hʁg-pH5Q@0@HHH}H@ tOH@ H cg-H51HHHAc}H@$<u@Hg-oH5@0@HHH1}Hf@ftcHf@H g-sH=JAE0HHω֋HDA|HHgHH@H@f@ff tnH-g-SH5H=AE0HxHHpHpHxDlIlDkAk|HH@H@f@fftnHg-YH5!H=$AE0H`HHXHXH`DTITDSAS{HH@H@f@f f $<HH@H@f@f f fH~g-H=wAE0HHHljD֋DHH@H@DHE9Hc-HK]HljLYHHH(H(HHtRH(HH(H(H{H9HHHHH^YHE'H(H zH9HHkHEH(H9HH(H(HHtFH(HHcHH(H(HHHHXHE)HcHH(HHHʣHEЋHcH-H5[HHHƉHWH LH>HHHHH@0@H׉ΊnHcHHHƋHlWHHtHHH9uDH%[-HH5fHHHD'VHHtHHH9uGHH Z-H5\HHxHHxDUHH`HH(HHHHDž@WHH(H(HHH(HHHH@@@=~HtHtHgHH9uDHY-HEH5dtHHhHhDtTHHtHHH9uGHH @Y-H5r[dHHXHHXDdFTHH ILH|H M;H`HHH0H@0HHP@HHHxHHHHPHH0HψƽHHSHHHMH9u H]TfDfDUHHHHHEH}HuUft@HW,!H5Av@0@HHHTHHHHt)H8HHH cH9uHHHEHEHEHHE@$<u@HSW,nH5u@0@HHHsSHE@t@HW,pH5Du@0@HHH"SHE@ tLHE@ H V,H5 u1HHHARHE@$<u@HRV,oH5t@0@HHHrRHEf@ft`HEf@H U,sH=\tAE0HxHωt֋tHxDsAsRHEHSHEH@Hf@ff tnH{U,SH5sH=sAE0HhHH`H`HhD\I\D[A[mQHEH@Hf@fftnHT,YH5.sH=dsAE0HPHHHHHHPDDIDDCACPHEH@Hf@f f $< HEH@Hf@f f fH@T,H=rA E0H8Hlj4֋4H80H0D,A,D+A+,PHEH@Hf@ff tnHS,[H5qH=)rAE0H HHHH DIDAOHEHXHEH@H@f@ff tnHS,SH5[qH=oAE0HHHHHDIDA OHEH@H@f@fftnHR,YH5pH=oAE0HHHHHDIDA{NHEH@H@f@f f $<HEH@H@f@f f fHQ,H=lnAE0HHlj֋HHDADAMHEH@H@f@ff tnHKQ,[H5oH=mAE0HHHHHDIDA=MHHtHHH9uDHP,-HH59]HHHDKHq@EEUDžM9~ ECHcH &P6-.@0@Hω֋HLLE䋍)ȃEHEHcHHHHEEHMHHmHωH։‹KуM܋U9~ ECHcH BO8-.@0@Hω֋HhKE܋M9~DEHcMHcHN8-/E0H׋DIKE܋)ȃEHEHcHHHHEHHEHEHEE=EEԋE)MEԡEE?HEHMHEHHHEHEHHHEE؃E؋E؋M9|E%HE HEHHHEE؃E؋E؋M9|HQH 1HHHHE0Hlj|H΋|D{A{E܋E̋E܋M9~ EE܃@EHcH M@-.@0@zHωt֋tHzBIE=~VEHcH L@-/E0HhHωd֋dHHhDcIcHE̋M)ȃEHMHcHHHHEHH 0HHHEHMHHuE0\HHPHHP\DOAOCHcH KD-.@0@NHωH֋HHNGM9~GEHcHcHzKD-/E0DH׋DDCICGHEHcɊD< $EEu`HHHMH9u H]GUHHH}HuHUMDEt@HJ,!H51i@0@kHH`H`kFHHHt,HHHH iH9uHHHp HDžpHpHHp@$<u@HI,nH5yh@0@_HHPHP_ FHp@t@HI,pH5%h@0@OHH@H@OEHp@ tOHp@ H 2I,H5g1HpH@H@f@fftnHA,YH5`H=`AE0HHHHHD I D A =HpH@H@f@fftnHgA,gH5_H=`AE0HHHHHDIDAY=HpH@H@f@f f $< HpH@H@f@f f fH@,H=d_A E0HHlj֋HHDADA<HpH@H@f@ff tnH @,[H5^H=^AE0HHHHHDIDA<HEMHy^HljH։ʋ;llEE EEE|HEMHcɊ< tދEEEEEHc,H(?Hlj);HEHEHHt4HEHMHcHUHuHuHHHm;HE EHcHMHUHHH聆HEȋE EEHc,H>Hlj:HxHxHEHEHHtIHEHHMHMH]H HHHHH:HE$HEH \H HHɅHEHEH HHEHEHHt7HEHMHcHUHuHuHHHH5:HE EHcHMHUHHHIHE؋EHcHM,H5d=HHHƉHb9H H!HMHx@0@H׉ΊYPEHcHxHHƋH9HpHteHpH@H@f@fft@H<,H5K@0@HHH8lHMHEM9~GEHcHM HcHC<,/E0H׋DIk8HEHEHED‰EH}H . HHHEHM0HωƈiHpHteHpH@H@f@fft@H;,H56Z@0@HHH7HEM9~GEHcHM HcH);,/E0H׋DIQ7HEHEHED‰EHEHEHEHEEM9}EEEM)M EEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|hHĀ]DfDUHH`-H~HHEH}u2t@H9+!H5X@0@qHHhHhq5H HHt,HHHH gH9uHHH HDžHHH@$<u@H 9+nH5W@0@gHHXHXg+5H@t@H8+pH5W@0@WHHHHHW4H@ tOH@ H P8+H5^W1DHH8H8DAP4H@$<u@H7+oH5V@0@7HH(H(74Hf@ftcHf@H 7+sH=VAE0H Hω֋H DA3HHbHH@Hf@ff tnH7+SH5VH=7VAE0HHHHHDIDA 3HH@Hf@fftnH6+YH5sUH=UAE0HHHHHDIDA{2HH@Hf@f f $< HH@Hf@f f fH5+H=TA E0HHlj֋HHDADA1HH@Hf@ff tnHE5+[H5/TH=aTAE0HHHHHDIDA71HHtHHH9uDH4+HH53AHHHD/Hk@EE*DžDžHHpH?:HhHhHpHpHHHpHhHHHhE.Hp HpHHHpEEE=~ȋEE EEE|HEMHcɊ< tދEEM9$EEb"CHcH 23+.@0@Hω֋HX/M9~GEHcHcH2+/E0H׋DI/DžHEHcHHHHHH QHHΉ-t5HH JHHΉs-`M9~DžCHcH 1+.@0@Hω֋H.E싍)ȃHEHcHHHH=~DžCHcH >1+.@0@Hω֋Hd-)HHcHHHHH]H >HHHHLE0HxHHHxtLDtDsAs E싍)ȃEE} ENCHcH 0+.@0@rHωl֋lHrE,M9$EEMEM9~ DžzE@EHcH /+.@0@kHωd֋dHk+EM)ȃHEMHcHHHHHH5>`H׉‹`\8*\ʃʃEE EEE|HEMHcɊ< tދEEEEHc+Ha.Hljb*HHHHt:HHMHcHHuHuHHH*HE#EHcHHUHHHuHEHc+H-Hlj)HHHpHpHHtRHpHHpHpHLHHHPHHPH)HE'HpH dLHHHtHEHpHHHpHpHHtFHpHHcHHpHpHHHH,)HE)HcHHpHHH7tHEHcH+H5L,HHHHƉDHHJ(H HHHHH@0@CH׉ΊC1?HcHHHƋDHH'HH 2HHΉ<<&|5HH l2HHΉ88&2HH 2HHΉ44x&|5HH 2HHΉ00G&HH 1HHΉ,,&HH IHHΉ((%tfHH IHHΉ$$%t5HH c1HHΉ {%M9~DžCHcH ),.@0@Hω֋H&E싍)ȃHEHcHHHHHHE9HωH։‹%uDEE EEE|HEMHcɊ< tދEEEȃEM9~DžCHcH (,.@0@Hω ֋ H$EM9~DEHcMHcHJ(,/E0H׋DIr$E)ȃHEHcHHHHHmH NH0HHHH|@0H@H։Š]| EM9~DžCHcH @',.@0@Hω֋Hf#EM9~DEHcMHcH&,/E0H׋DI#E)ȃHEHcHHHHH3HpHHh=E)MEEEQHhHpHpHHHpHhHHHhEEEM9|E.Hp HpHHHpEEEM9|HH HHHHH3H,@0H@HΊxHrHH HHHHHH‹U!HjHHHHƋA2!MMutHH ,HljH΋ MMu8,H ԜHω MMuHHMEEM9~DžCHcH #!,.@0@Hω֋HEM9~DEHcMHcH#!,/E0H׋DIE)ȃHEHcHHHHHc!,H"HljHHHpHpHHtRHpHHpHpHAHHHHHH HE'HpH AHHHjHEHpHHHpHpHHtFHpHHcHHpHpHHHHjHE)HcHHpHHHuiHEH2H H`HHH0Hωƈ4HcH!,H=Q!HHωHƋHGH$HpHrHhE$EEHhHHHhE  Hh< tNjEEQHhHpHpHHHpHhHHHhEEE ~E )M.Hp HpHHHpEEE ~ʋ=~DžCHcH %,.@0@Hω֋H)HHcHHHHHH`H$HX ~Dž|  x|DžxEQHXH`H`HHH`HXHHHXEEE|9|E.H` H`HHH`EEEx9|}EM9~DžCHcH 7+,.@0@Hω֋H]EM9~DEHcMHcH+,/E0H׋DIE)ȃHEHcHHHHH3HpHHh=E)MEEEQHhHpHpHHHpHhHHHhEEEM9|E.Hp HpHHHpEEEM9|HH HxHHH3H@0H@HΊv&=~DžCHcH 1,.@0@Hω֋H)HHcHHHHHHpHk"Hh~EEEEEQHhHpHpHHHpHhHHHhEEEM9|E.Hp HpHHHpEEEM9|=~DžCHcH [5,.@0@Hω֋H)HHcHHHHHHpH Hh~EEEEEQHhHpHpHHHpHhHHHhEEEM9|E.Hp HpHHHpEEEM9|ȋCHcH =,.@0@Hω֋H=~YHcH =,/E0HxHωt֋tHHxDsIsHc< $EEJEE=~ Dž|E@EHcH ?,.@0@rHωl֋lHrE)HMHcHHHHHc?,HmHljnHpHpHHHhE$EEHhHHHhM9~ Hh< t‹EEQHhHpHpHHHpHhHHHhEEM9M)ȉE.Hp HpHHHpEEM9ŋEE=~ Dž|E@EHcH ?,.@0@kHωd֋dHk+E)HMHcHHHHHH`HHX9~"|)ȉx|DžxH`HXH9wiEQHXH`H`HHH`HXHHHXEEE|9|oE?|M)ȃ|U)уHXHcɊ H`Hc EEE|9|H`|HcHH`E.H` H`HHH`EEEx9|ŋHcH?,H5HHXHHXE EEE|EHc< tދEEEM9~DžCHcH KM,.@0@WHωP֋PHWqE싍)ȃHEHcHHHHHcM,HHljHHHpHpHHtRHpHHpHpH1HHHHHHHHHE'HpH 1HHHYHEHpHHHpHpHHtFHpHHcHHpHpHHHH0HE)HcHHpHHH;YHEHH HHHH0Hωƈ~$HcHM,H=H@HωHlj?HEHEHEHEHHtIHEHHMHMH"H!HHHHHfHE$HEH "H!HHvJHEHEH!HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHIHEEHcHMo+H5HHHƉHH ~HHMHU@0@H׉ΊIEHcHMHHƋHH:HtH:HH9uDHps+H:H5R!HHHDrH:HEHEHEE=EE̋E)ME̡EE?HEHMHEHHHEHEHHHEEЃEЋEЋM9|E%HE HEHHHEEЃEЋEЋM9|HH HHHH90HLjӳH1w+H0 Hlj{HĀ]UHHPH}HuU{t@H+!H5@0@HHpHpA{H&HHt)HHHH qH9uHHHEHEHEHHE@$<u@H1+nH5K@0@oHH`H`oQHE@t@H+pH5@0@_HHPHP_HE@ tLHE@ H +H51LHH@H@LAHE@$<u@H0+oH5J@0@?HH0H0?PHEf@ft`HEf@H +sH=AE0H(Hω$֋$H(D#A#HEHZHEH@H@f@ff $<tnHV+UH5pH=AE0HHHHHD I D A HHEH@H@f@fftnH+YH5H=TAE0HHHHHDIDAHEH@H@f@f f $< HEH@H@f@f f fH+H=A E0HHlj֋HHDADAHEH@H@f@ff tnH+[H5H=AE0HHHHHDIDAzHEHSHEH@Hf@ff tnH+SH5 H=?AE0HHHHHDIDAHEH@Hf@fftnHb+YH5|H=AE0HHHHHDIDATHEH@Hf@f f $< HEH@Hf@f f fH+H= A E0HHlj֋HHD|A|D{A{HEH@Hf@ff tnH'+[H5AH=uAE0HpHHhHhHpDdIdDcAcHHtHHH9uDH)+HH5\HHPHPD\HM@E̋ẼAHEHHtHEHHH9uDHEH -+H5LHH@HH@DLHEHPE̋Ẽ HEHHtHEHHH9uDHEH /+H5)HEЋE EEHc/+HVHljWHEHEHEHEHHtIHEHHMHMHH HH(HH(H~HE$HEH KH HH=HEHEH HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHH=HEEHcHM/+H5)HH HƉH 'H HWHMHU@0@H׉Ί!EHcHMHHƋH HEHHtHEHHH9uDHEH 5+H5HHHHDHEHtAHEH@H@f@ff$f Rf f%ff f ;HH MHHHHEHH\HHMU@0H@HƊHEHHtHEHHH9uDHEH ~7+H5HHHHDHEHǀHHЌHtHÌHH9uDH 9+HH5HHHD HEHHtHEHHH9uDHEH 9+H59HHHHDHEHH`HHEHHHHEE?HEHMHEHHHEHEHHHEEȃEȋE=~HHtHsHH9uDH:+HQH5HHHDHEHHtHEHHH9uDHEH O:+H5HHHHDUHEHH ILlHP]UHHPH}HuUtlt@H*!H5G@0@HHpHp%lHHHt)HHHH qH9uH݁HHEHEHEHHE@$<u@H*nH5@0@oHH`H`o1HE@t@H*pH5J@0@_HHPHP_HE@ tLHE@ H _*H51LHH@H@LA_HE@$<u@H*oH5@0@?HH0H0?0HEf@ft`HEf@H *sH=aAE0H(Hω$֋$H(D#A#HEHZHEH@H@f@ff $<tnH6*UH5H=\AE0HHHHHD I D A (HEH@H@f@fftnH*YH50H=AE0HHHHHDIDAHEH@H@f@f f $< HEH@H@f@f f fH*H=%A E0HHlj֋HHDADAHEH@H@f@ff tnHh*[H5 H=AE0HHHHHDIDAZHEHSHEH@Hf@ff tnH*SH5[ H= AE0HHHHHDIDAHEH@Hf@fftnHB*YH5 H= AE0HHHHHDIDA4HEH@Hf@f f $< HEH@Hf@f f fH*H= A E0HHlj֋HHD|A|D{A{HEH@Hf@ff tnH*[H5 H=U AE0HpHHhHhHpDdIdDcAcHHtHHH9uDHv*HeH5\HHPHPD\xH-@E̋ẼAHEHHtHEHHH9uDHEH *H5$LHH@HH@DLHEHPE̋Ẽ HEHHtHEHHH9uDHEH o*H5(SH5(H=ZAE0H8HH0H0H8D,I,D+A+0HEH@Hf@fftnH(YH5H=AE0H HHHH DIDA衱HEH@Hf@fftnH (gH5 H=<AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHt(H=A E0HHlj֋HHDADA`HEH@Hf@ff tnH([H5H=AE0HHHHHDIDAׯHEHXHEH@H@f@ff tnHM(SH57H=qAE0HHHHHDIDA?HEH@H@f@fftnH(YH5H=AE0HHHHHDIDA诮HEH@H@f@f f $< HEH@H@f@f f fH(H=:A E0HHlj֋HHDADAHEH@H@f@ff tnH([H5iH=AE0HxHHpHpHxDlIlDkAkqHEMHMHljdH։ʋd=u,EE EEE|HEMHcɊ< tދEEEEK,YE1,+,HEHtaHEH@Hf@fft@H>(H5a@0@cHHXHXc^HEHEȋE~EEE EEEE%HE HEHHHEȋEEEM9|H5 HEE%HE HEHHHEȋEEE=~H+HEHE HEHHHEHEMHhHljTH։ʋT胫MM@EHcH (.@0@SHωL֋LHSEM9~DEHcMHcH(/E0HH׋HDGIGĪHEMHcɊD<&$EԋEԃt EEEEEM99 )"@t@'@E@EHcH ).@0@?Hω8֋8H?EM9~DEHcMHcH)/E04H׋4D3I3ɩHEMHcɊD )8$EԋEԃt'H(HEHE HEHHHEHEHtaHEH@Hf@fft@H)H5@0@2HH(H(2E@EHcH ).@0@'Hω ֋ H'ƨEM9~DEHcMHcHP)/E0H׋DIx'C'HcH ).@0@Hω֋H*'M9~GEHc o'HcH)/E0H׋DI֧.'HMHcHUuHcT2TE@EHcH I).@0@Hω֋HoEM9~DEHcMHcH)/E0H׋DI!}&Cr&HcH ).@0@Hω֋HӦ/&=~Y"&HcH ])/E0HHω֋HHDIm%HcH HUuHcT2TEE%%%%E@EHcH 0).@0@Hω֋HץEM9~DEHcMHcHa0)/E0H׋DI艥HEMHcɊD t uEE$$E@EHcH ר?).@0@Hω֋HEM9~DEHcMHcH?)/E0H׋DI诤HEMHcɊD!"t'E@EHcH E).@0@Hω֋H-EM9~DEHcMHcHE)/E0H׋DIߣHEMHcɊD1#{HEHtaHEH@Hf@fft@H9S)H5\@0@HHHYE@EHcH S).@0@Hω֋HEM9~DEHcMHcHS)/E0H׋DIâH7H ǖHHEMHcHHHȹ0HljΈgHMHHQ!C!HcH S).@0@Hω֋H-!M9~GEHc r!HcHS)/E0H׋DI١1!HMHcHHHHMHEHEEEE܋E)MEEE?HEHMȈHEHHHEHEHHHEEEEM9|E%HE HEHHHEȋEEEM9|HES)HHlj諠E@EHcH sT).@0@Hω֋H虠EM9~DEHcMHcH#T)/E0H׋DIKCHcH ףT).@0@Hω|֋|HY=~YLHcH T)/E0HpHωl֋lHHpDkIk藟HcH HUuHcT2TEEEEЋE@EHcH âk).@0@jHωd֋dHjEЋM9~DEHcMHcHsk)/E0`H׋`D_I_蛞HEMHcɊD<&$EԋEԃt Hİ]ÐUHHH}HuU|t4H#(!H5@0@}HHuHMEٝ9H3HHt)H2HHH }H9uH2HHEHEHEHHE؋@$<u4H #(nH5C@0@}HHuHME9HE؋@t4HȠ#(pH5@0@}HHuHMEHE؋@ t@HE؋@ H s#(H51}HHuHUMAHE؋@$<u4H0#(oH5f@0@}HHuHME\HEf@ft`HEf@H #(sH=/AE0HxHωt֋tHxDsAsHEHHEH@Hf@ff tnHe#(SH5H=AE0HhHH`H`HhD\I\D[A[WHEH@Hf@fftnH֞#(YH5 H=,AE0HPHHHHHHPDDIDDCACȚHEH@Hf@fftnHG#(eH5}H=AE0H8HH0H0H8D,I,D+A+9HEH@Hf@f f $< HEH@Hf@f f fH#(H=A E0H Hlj֋H HDADA臙HEH@Hf@ff tnH #([H5BH=bAE0HHHHHDIDAHEHHEH@H@f@ff tnHt#(SH5H=ԾAE0HHHHHDIDAfHEH@H@f@fftnH#(YH5H=DAE0HHHHHDIDA֗HEH@H@f@fftnHT#(eH5H=AE0HHHHHDIDAFHEH@H@f@f f $<HEH@H@f@f f fH#(H5E0HH֋HHDAD衖HEH@H@f@ff tnH%#([H5[H=AE0HHHHHDIDAEEЋEЉEEFgEԃ@EHcH e(.@0@Hω|֋|H訕EԋM9~DEHcMHcH2e(/E0xH׋xDwIwZHEMHcɊD 8$EEt YEԃ@EHcH n(.@0@vHωp֋pHvӔEԋM9~DEHcMHcH]n(/E0lH׋lDkIk腔HEMHcɊD0EԃEԋEԋM9 H]f.UHHH}ut@H'!H5@0@wHHhHhw1HZ&HHt)HJ&HHH uH9uH1&HHEHEHEHHE@$<u@He'nH5r@0@gHHXHXg腐HE@t@H'pH5!@0@WHHHHHW4HE@ tLHE@ H 'H5+1DHH8H8DA賏HE@$<u@Hd'oH5q@0@7HH(H(7脏HEf@ft`HEf@H 'sH=~AE0H Hω֋H DAHEHHEH@Hf@ff tnH'SH5H=AE0HHHHHDIDAHEH@Hf@fftnH'YH5 H=TAE0HHHHHDIDAHEH@Hf@fftnHo'eH5|H=ųAE0HHHHHDIDAaHEH@Hf@f f $< HEH@Hf@f f fHÐ'H= A E0HHlj֋HHDADA诌HEH@Hf@ff tnH4'[H5AH=AE0HHHHHDIDA&EE EЃEЋEЃ|HEMHcɊ< tދEЃEЋEЉ|DžxQ |9HEHtaHEH@Hf@fft@H>'H5@0@HHH^|M9~GEHc|HcH'/E0H׋DI HEHE|D‰EHEHt@HEH@Hf@ff$f ~f f%ff f ~HH #HEHMHx@0H@H։Š5x 9  EԋEԋM9~DEHcMHcH'/E0H׋DIHEHEEԃD‰EEEEHc'HTHljUHEHEHEHEHHt7HEHMHcHUHuHuHHHH莉HE EHcHMHUHHHHE؋EHMHcHHMHPHEHEHMHEHHHEHEHHHEHHEHEHEE=EE̋E)ME̡EHEHMH9wTE?HEHMHEHHHEHEHHHEEЃEЋEЋM9|WE3E̋M)ȃM̋U)уHUHcɊ HUHc EЃEЋEЋM9|HEMHcHHEE%HE HEHHHEEЃEЋEЋM9|ыEHcHM'H5;HHHH?HEHtaHEH@Hf@fft@H'H5M@0@HHpHpM9~ EkC`HcH '.@0@oHωh֋hHo詆M)M HMHcHHHHMEEEHc'HHljHEHEHEH{HEHEHMHEHHHEHEHHHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEHEHEHEHEEM9}EE̋EM)M EEEHEHMH9wTE?HEHMHEHHHEHEHHHEEЃEЋEЋM9|WE3E̋M)ȃM̋U)уHUHcɊ HUHc EЃEЋEЋM9|HEMHcHHEE%HE HEHHHEEЃEЋEЋM9|ыEHcHM'H5HH`HH`8gHHpHHh E!)ME!EEQHhHpHpHHHpHhHHHhEEEM9|E.Hp HpHHHpEEEM9|ȋHcHy'H5jHHHHfE EEE|EHc< tދEEE!~YHcH i}'/!E0HHω֋HHDIeHH(D‰00H(HXTH׉H΋PdPPHHteHH@H@f@fft@Hh'H5|@0@HHHdHHtDHH@H@f@ff$f yYf f%ff f bY!~YHcH h'/!E0HHω֋HHDIdHH(D‰0EE|EHcHxH9HxMHcHHBHHBg'LE0ɉHlj֋HHDI@cH`HUHcHHHhE EEE|HMHcɊ< tۋEEE EHc'HbfHljcbHHHHtdHcHH9t@dd```\``77Hp]UHHHHHEH}HuUMHHt@HA%!H5Te@0@HHH>HDHHt,H4HHH OH9uHHH HDžHHH@$<u@HCA%nH5d@0@HHHc=H@t@H@%pH5Hd@0@HHH=H@ tOH@ H @%H5c1HHHA<H@$<u@H6@%oH5c@0@HHHV<Hf@ftcHf@H ?%sH=HcAE0HHω֋HDA;HHHH@H@f@ff tnHR?%SH5bH=bAE0HHHHHDIDAD;HH@H@f@fftnH>%YH5bH=%eH5aH=aAE0HHHHHD|I|D{A{:HH@H@f@f f $< HH@H@f@f f fHx=%H=`A E0HpHljl֋lHphHhDdAdDcAcd9HH@H@f@ff tnH<%[H5>`H=b`AE0HXHHPHPHXDLILDKAK8HHHH@Hf@ff tnHH<%SH5_H=_AE0H@HH8H8H@D4I4D3A3:8HH@Hf@fftnH;%YH5_H=C_AE0H(HH H H(DIDA7HH@Hf@fftnH$;%eH5}^H=^AE0HHHHHDIDA7HH@Hf@f f $< HH@Hf@f f fHr:%H=^A E0HHlj֋HHDADA^6HH@Hf@ff tnH9%[H59]H=m]AE0HHHHHDIDA5HDžHH /HH0HLj%HHH9uGHH &9&H5CHHHHD,4HH$@@)0HHtHHH9uGHH 8&&H5BHHHHD3Dž<<<<|H HH΋L? wHHtHHH9uGHH v&H5HHHHDDž<<<<|HHxHpAE0HhHHhDDDnHCBH tHxHHHfH@0H@g֊gHX2HXHIL ^THNjT‰裫HEHtaHEH@Hf@fft@Ht$H5@0@SHHHHHSHEHEHfHEE=~EԡE-E E܉EEE?HEHMȈHEHHHEHEHHHEE؃E؋E؋M9|E%HE HEHHHEȋE؃E؋E؋M9|/H@HHMH9u Hİ*[A^]bfUHHPHN@HHEH}HH@.t@H#!H5}@0@?HH0H0?襪m.H?HHt,H?HHH YH9uH?HHH HDžHHHHHH@$<u@Hͭ#nH5@0@/HH H /HH@t@Hy#pH5q@0@HHH虩HH@ tOHH@ H #H5&1 HHH AHH@$<u@H#oH5@0@HHHHHf@ftcHHf@H a#sH=pAE0HHω֋HDAlHHHHHH@Hf@ff tnHݫ#SH5H=AE0HHHHHDIDAϧHHH@Hf@fftnHK#YH5CH=eAE0HHHHHDIDA=HHH@Hf@fftnH#eH5H=AE0HHHHHDIDA諦HHH@Hf@f f $< HHH@Hf@f f fH#H=(A E0HHlj֋HHDADAHHH@Hf@ff tnHu#[H5mH=AE0HxHHpHpHxDlIlDkAkgHDž@HFH@H@HHHH@HH9uGH@H #H5dHHXHHXDd軣H@H$EEY H@HtH@HH9uGH@H )#H5\THHHHHHDT/E EEE|H@MHcɊD < tڋEEEhEHc#HHlj螣H`H`HHtIH`HMHcH@H HH`HHHHǣHE3EHcH@H HH`HHHHEhXXHc#HӦHljԢHPHPHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHEȋhHMHcHHMHEHHtSHEHHMHHHUHUHHH@HH@H`HE.HEHHHMHHHfHEЋhHcH`#H5{HH8HH8H@HEHPHEX=XEX)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|ыXHcHP#H5pHH0HH0tHEHHH@H5s$IAL=,HH΋,HEL$D$D$MMuH$HNHHHtdHHH@Hf@fft@H#H5@0@+HH H +赟HEMH HE@ E EEE|EHc@< tދEEEhEHc#HHljH`H`HHt9H`HMHcH`H@HHH-HE&EHcH`H@HHH;HE؋hXXHc#HHHljIHPHPHEHEHHtIHEHHMHMHDHHHHHHjHE$HEH HHHzHEHEHHHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHE苅hHcH`#H5HHHƉ HH p2HaHXHP@0@ H׉Ί XHcHPHHƋ H蝜HE@H@HtH@HH9uGH@H ?$H5rHHHHDEH@HtH@HH9uGH@H ՟$H5HHHHDۚH@H@IHHHHtdHHH@Hf@fft@HM$H5n@0@HHHmHEHHHEH@HEE?HEHMHEHHHEHEHHHEEEE=~H@HtH@HH9uGH@H l $H5HHHHDrH@HH@H@HHH?("H@H]H|/HHMH9u HP]bfUHHH}uH?/HHt,H//HHH H9uH/HH HDžHHH@$<u@H>"nH5@0@HHxHx^H@t@H"pH5D@0@wHHhHhw H@ tOH@ H "H51dHHXHXdA胘H@$<u@H1"oH5@0@WHHHHHWQHf@ftcHf@H қ"sH=KAE0H@Hω<֋aHH0HH0B]HH@HH8=E)MEEEQH8H@H@HHH@H8HHH8EEEM9|E.H@ H@HHH@EEEM9|ȋHcH"H5`HH(HH(\E EEE|HEMHcɊ< tދEEEE^M9„Dȉ ^HHtdHH@Hf@fft@Hk_"H5+@0@'HHH'[^=~Y ^HcH _"/E0HHω ֋ HHD I %[HEH]D‰E EEE|EHc< tދEEEEHc"HV^HljWZHHHHt9HHMHcHHHHHZHE&EHcHHHHH螥HEЋȉHc"H]HljYHHHxHxHHtFHxHHcHHxHxHHHHYHE)HcHHxHHHФHE؋HxHcHHxHxHHtFHxHHcHHxHxHHHH%YHE)HcHHxHHH0HEHcH"H5E\HHHHIXHEHpHHh=E)MEEHpHhH9wfEQHhHpHpHHHpHhHHHhEEEM9|cE9EM)ȃMU)уHhHcɊ HpHc EEEM9|HpMHcHHpE.Hp HpHHHpEEEM9|ȋHcH"H5ZHHHHVHHHMH9u H]VDfDUHHH}t@H4Z!!H5@0@wHHhHhwTVH}HHt,HmHHH xH9uHTHHx HDžxHxHHx@$<u@H|Y!nH5K@0@gHHXHXgUHx@t@H(Y!pH5@0@WHHHHHWHUHx@ tOHx@ H X!H51DHH8H8DATHx@$<u@HoX!oH5>@0@7HH(H(7THxf@ftcHxf@H X!sH=~AE0H Hω֋H DATHxHHxH@Hf@ff tnHW!SH5[~H=}~AE0HHHHHDIDA~SHxH@Hf@fftnHV!YH5}H=}AE0HHHHHDIDARHxH@Hf@fftnHhV!eH57}H=Y}AE0HHHHHDIDAZRHxH@Hf@f f $< HxH@Hf@f f fHU!H=|A E0HHlj֋HHDADAQHxH@Hf@ff tnH$U![H5{H=|AE0HHHHHDIDAQHHtHHH9uDHT"HH5aHHHDOHJ@EԋEԃHEHHtHEHHH9uGHEH T"HHHHHDOHPH SHHEH0HljΈHxHtdHxH@Hf@fft@HaS#"H5Yz@0@HHpHpOHE@H HH5AlHH`H`lD\AD\ROMЋMЃHEHHH [ HωXHƋXNMЋMЃHEHHtHEHHH9uDHEH @R#"H5GyTHHHHHHDTFME̠ ẼE̋Ẽ|HEHMHcɊ< tۋẼE̋ẺEEHc#"HQHljMHEHEHHt6HEHMHcHUHHuHHHHMHE#EHcHMH HUHHH HE؋EHMHHHΉLMЋMHcHu#"LQDHH΋DLMEЃuHHmLMHEMЉH HE@ E EЃEЋEЃ|EHMHcD< t݋EЃEЋEЉEEHc*"HhPHljiLHEHEHHt@HEHMHcHUHHHuHHHHLHE-EHcHMHHHUHHH託HEEEEHc*"HOHljKHEHEHEHEHHtIHEHHMHMHvHHH8HH8HKHE$HEH bvHHHHEHEHHHEHEHHt7HEHMHcHUHuHuHHHHbKHE EHcHMHUHHHvHEEHcHM*"H5NHH0HƉ,H0JH HMHHHMHU@0@+H׉Ί+|aEHcHMHHƋ,H0*JHxHtdHxH@Hf@fft@HM0"H5t@0@*HH H *IHE@HMAHxHtdHxH@Hf@fft@H?M8"H57t@0@HHH_IHxHtCHxH@Hf@ff$f Lf f%ff f KHBH LH0HHHE0HLj#"H]ÐUHHHHHEH}%t@H6Lb!!H5es@0@vHHhHhvVHHHHt,HoHHH jH9uHVHH HDžHHH@$<u@H~Kb!nH5r@0@gHHXHXgGH@t@H*Kb!pH5Yr@0@WHHHHHWJGH@ tOH@ H Jb!H5 r1DHH8H8DAFH@$<u@HqJb!oH5q@0@7HH(H(7FHf@ftcHf@H Jb!sH=VqAE0H Hω֋H DAFHHHH@Hf@ff tnHIb!SH5pH=pAE0HHHHHDIDAEHH@Hf@fftnHHb!YH5+pH=oAE0HHHHHDIDADHH@Hf@fftnHjHb!eH5oH=[oAE0HHHHHDIDA\DHH@Hf@f f $< HH@Hf@f f fHGb!H=nA E0HHlj֋HHDADACHH@Hf@ff tnH&Gb![H5UnH=nAE0HHHHHDIDAC@HHHHHcHbHHtdHH@Hf@fft@HNF!H5Fm@0@HHHnBHE@H HH5AHHxHxDtADt?BMMHEHHH x HωpHƋp AMMu?HCH gHHAMMuHH@MHEMH HEHHtHEHHH9uDHEH D!H5klHH`HH`Dl?Dž8HEHHHHHH0Dž((Hc!HYDHljZ@H H HEHkHEHEHMHEHHHEHEHHHEHEHHtIHEHH0HUHUHHHXHHXH:@HE$H0HMHHHJHEHwHEH HEE?HEHMHEHHHEHEHHHEEEE=~(HcH !H5BHHPHHP>~t+H_H BHHw0HljΈ#HHtdHH@Hf@fft@HpB!H5hi@0@OHH@H@O>HE@H HH5AMMHEHHH  Hω(HƋ(-=MMPE EEE|EHcw< tދEEE8EHc!H.AHlj/=H0H0HHt9H0HMHcH0HwHHHh=HE&EHcH0HwHHHvHE8H0H~HHΉI<M8HcH0!Le@$HH΋$Lf<EuH%H;MHEMH  HEHHtHEHHH9uDHEH ?!H5f HHHHD :Dž88Hc!H?Hlj;H0H0HEHfHEHEHMHEHHHEHEHHHEHEHHtIHEHHMH HUHUHHHHHHy;HE$HEHHMHHH艆HEHwHEH0HEE?HEHMHEHHHEHEHHHEEEE=~8HcH0!H56>HHHH::yt8HH />HHHHw0HljΈUHHtdHH@Hf@fft@H=!H5d@0@HHH9HE@H FHH5AHHHDAD9MMHEHHH  HωHƋ_8MMPE EEE|EHcw< tދEEE8EHc!H`<Hlja8H0H0HHt9H0HMHcH0HwHHH8HE&EHcH0HwHHH訃HE8H0HHHΉ{7M8HcH0!L;HH΋L7EuHWH6MHEMH 5HEHHtHEHHH9uDHEH ";!H5)bHHHHD(6Dž88Hc!H:Hlj6H0H0HEHbHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHHtIHEHHMH HUHUHHHHHH?6HE$HEHHMHHHOHEHwHEH0HEE?HEHMHEHHHEHEHHHEEEE=~8HcH0!H58HHHH5tt8HdH 8H0HHHw0HljΈHHtdHH@Hf@fft@Hh8!H5`_@0@HHH4HE@H HH5AHHHDADY4MMHEHHH  HωHƋ%3MMPE EEE|EHcw< tދEEE8EHc!H&7Hlj'3H0H0HHt9H0HMHcH0HwHHH`3HE&EHcH0HwHHHn~HEЋ8H0HvHHΉA2M8HcH0!L]6HH΋L^2EuHH1MHEMH HE@ E EEE|EHMHcD< t݋EEE8EHc!H5Hlj1H0H0HHtFH0HMHcHUHHH0HHHH1HE0EHcHMHHH0HHH|HE؋8((Hc!H4Hlj0H H HEHEHHtIHEHHMHMH[HHHHHH1HE$HEH [HHH+|HEHEHHHEHEHHt=HEH8HcH0HuHuHHHH0HE&8HcH0HUHHH{HE苅8HcH0!H53HHHƉ|H/H !H3HHHH(H @0@{H׉Ί{F(HcH HHƋ|HA/HHHMH9u HĐ]/nsUHHH}ut4H2!!H5Z@0@}HHuȉHMȊE.HHHt)HHHH H9uHHHEHEHEHHE؋@$<u4H!2!nH5{Y@0@}HHuHMEM.HE؋@t4H1!pH56Y@0@}HHuHME.HE؋@ $<tCHE؋@ H 1!H5X}HHuHUMA-HE؋@$<u4H?1!oH5X@0@}HHuHMEk-HEf@ftZHEf@H 0!sH=cXAE0H}Hω|֋|HMD{A{-HEHSHEH@Hf@ff tnHz0!SH5WH=kQAE0HpHHhHhHpDdIdDcAcl,HEH@Hf@fftnH/!YH5EWH=PAE0HXHHPHPHXDLILDKAK+HEH@Hf@f f $< HEH@Hf@f f fH?/!H=7PA E0H@Hlj<֋pH5g@0@HHH^H @ tOH @ H H5D1 HHH AH @$<u@HoH5@0@HHHH f@ftcH f@H &sH=CDAE0HHω֋HDA1H HH H@Hf@ff tnHSH5H=BAE0HHHHHDIDAH H@Hf@fftnHYH59H=BAE0HHHHHDIDAH H@Hf@fftnH~eH5H=oAAE0HHHHHDIDApH H@Hf@f f $< H H@Hf@f f fHH=@A E0HHlj֋HHDADAH H@Hf@ff tnH:[H5cH=+@AE0HxHHpHpHxDlIlDkAk,HDZHhHhH HHH HtdH H@Hf@fft@HqH5i?@0@jHH`H`jH HtCH H@Hf@ff$f jf f%ff f SHtH HHE0HLjB HlkH'HHEHEHHHEE?HEHMHEHHHEHEHHHEEEE=~E%HE HEHHHEEEE=~DžH HtdH H@Hf@fft@HH5=@0@_HHPHP_HE@H0HH5"ALHH@H@LDcHHH'HHEHLHEE?HEHMHEHHHEHEHHHEEEE ~E%HE HEHHHEEEE=~H&KH HHΉ ||HH {H`HHH0HG@0HH@HDž@H JHHH8HxHHHHH8@0@Hω֊MMHZH HHHH{HHIHE0HHHHDDEDHD$HH55HNj‰ou8HH HHHH~5 0HljΈ Dž@H{HHHHH8H*H HHHH80HljΈnHEHHH(HHxH_H'HHEHEHHHEE?HEHMHEHHHEHEHHHEEEE=~E%HE HEHHHEEEE=~H{H 14HHΉu8HϜH 0HHHH3 0HljΈVHHtHHH9uDH 8 HУH5`HHHDH@EEtQHH |HHHH{Hh@0H@HΊ.GHH HHHH{0HljΈ0(^u8HqH H HHH250HljΈHHtHHH9uDH f HrH5HHxHxDH:@EEtnHEH HljtH΋tY~8HH H8HHH1E0HljΈNHOH HPHHHA0HLj=vHMIȉvHlHH9uDH[ HJH5pHHhHhDp]HhHH9uGHhH  H51dHHXHHXDdHHtHHhH9t EEEԉEEE EEE|EHMHcD< t݋EEE@EHc H/Hlj0H8H8HHtFH8HMHcHUHHH8HHHH\HE0EHcHMHHH8HHH`NHE؋@&00Hc HmHljnH(H(HEHEHHtIHEHHMHMH[/H&HHPHHPHHE$HEH $/H&HHMHEHEH&HHEHEHHt=HEH@HcH8HuHuHHHHHE&@HcH8HUHHHMHE苅@HcH8 H5(HHHHƉDHH&H HHhHH0H(@0@CH׉ΊC 0HcH(HHƋDHHHDžhH HtdH H@Hf@fft@HU H5M+@0@BHH8H8BuH HtCH H@Hf@ff$f .f f%ff f HXH HHHHE0HLjIHhHH#HHMH9u H] fUHHPHHHEH}HuHUMDEHHEt@H!H5g,@0@HHH6H_HHt,HOHHH JH9uH6HH HDžHHH@$<u@H^nH5+@0@HHH~H@t@H pH5[+@0@HHH*H@ tOH@ H H5 +1HHHAH@$<u@HQoH5*@0@HHHqHf@ftcHf@H sH=W*AE0HHω֋HDAHHgHH@H@f@ff tnHmSH5)H=AE0HHHxHxHDtItDsAs_HH@H@f@fftnHYH5+)H=dAE0HhHH`H`HhD\I\D[A[HH@H@f@f f $<HH@H@f@f f fH&H=AE0HPHljL֋LHPHHHDDADDCACHH@H@f@ff tnH[H5'H=AE0H8HH0H0H8D,I,D+A+HHgHH@H@f@ff tnHSH5F'H=AE0H HHHH DIDAHH@H@f@fftnHbYH5&H=AE0HHHHHDIDATHH@H@f@f f $< HH@H@f@f f fHH=HA E0HHlj֋HHDADAHH@H@f@ff tnH[H5l%H=AE0HHHHHDIDA HHbHH@Hf@ff tnH~SH5$H=AE0HHHHHDIDApHH@Hf@fftnHYH5=$H=AE0HHHHHDIDAHH@Hf@f f $< HH@Hf@f f fH:H=A E0HHlj֋HHDADA&HH@Hf@ff tnH[H5"H=HAE0HxHHpHpHxDlIlDkAkDžLH`HLH5HH`HH`H0H0H(H(Ht"H(HH(HHHH`HHLLtLH 8HE؃HHHH|HE苍HHcɊ< tҋHHHHHc"HHljHHHHt@HHHHcHHuHuHHH)HP)HHcHHUHHH4?HP!Hc"H>Hlj?HHH0H0HHtUH0HH0H0Hm H!HHXHHXHQHX*H0H 0 H!HH[>HXH0H!HH0H0HHtIH0HHcHH0H0HHHHH`,HcHH0HHH=H`HcH"H5HHPHƉLHPH 3HHH@0@KH׉ΊKHcHHHƋLHP`HgHH9uDH&(HEH5DHH8H8DD(H H$@@HHtHHH9uDH*H֍H5A4HH(H(D4HH@HH HHHHHpHHH_HHtHOH@H@Hh HDžhHH,HhHHHHtHHH9uDH,HH5O$HHHD$HHH HHH H@HHHtHH@Hp HDžpHHpH RHH5H'H@HHHHHHHtHH@Hx HDžxHHxH HHHHHHHHHHtHH@HEHEHHEH nHHQHHtHHH9uGHH 6H5HHHHDHHHHtHHH9uGHH o<H5 HHHHDuHH$HH0HEH E؃E؉HH5HHHDHHtHHH9uGHH ~>H5HHHHDHHCHH0HƈHHH DžHWH H0H0HHH0H HHH HHH=~H;HtH.HH9uDHu?H H5fHHHDwHHtHHH9uGHH ?H5HHHHD HH cIHHHtHHH9uGHH EH5#HHHHDHHM PHHtHHH9uGHH IH5HHHHDHǀTE܃E܃SEHcH O/E0HHω֋HDIHHtHHH9uGHH *OH5HHxHHxD0HHM =ɉH{HHtHHH9uGHH SH59tHHhHHhDtHǀHHHtHHH9uGHH $YH5dHHXHHXDd*HH$@@E؃HHHH|HE苍HHcɊ< tҋHHHHHc[HRHljSHHHHt=HHHHcHHuHuHHHHE&HHcHHUHHH1HE/Hc[HHljHHH0H0HHtRH0HH0H0HH/HHPHHPHHE'H0H H/HH0HEH0H/HH0H0HHtFH0HHcHH0H0HHHHHE)HcHH0HHH"0HEHcH[H57HHHHHH;E܃<<<<|HEVHH!HHtHHH9uGHH (H5HHHHD轷HHHHtHHH9uGHH ?.H5qHHHHDEHH$HH0HEH E؃E؉WH5p HHHHD DHPt<$u EEE@@E؃HHHH|HE苍HHcɊ< tҋHHHHHcYHTHljUHHHHt=HHHHcHHuHuHHH芨HE&HHcHHUHHHHEBHcYHHlj覧HHH0H0HHtRH0HH0H0HHBHHHHH踧HE'H0H HBHHHEH0HBHH0H0HHtFH0HHcHH0H0HHHHHE)HcHH0HHH$HEЋHcHYH59HHHƉH7H ;HHHHHH@0@H׉ΊHcHHHƋHƥHECHtH8CHH9uDH]HCH5pHHHD聤HHtHHH9uGHH ]H5CHHHHDHH`HH0HYBHHH DžHWH H0H0HHH0H HHH HHH=~HAHtHAHH9uDH^HAH5HHHD HHtHHH9uGHH ^H5̩HHHHD蠢HH @ILk5HH覢H8HHMH9u H@]諣DfDUHHH8HHEH}HuU 5t@HϦ[!H5@0@HHH4H8HHt)H8HHH cH9uH7HHEHEHEHHE@$<u@H#[nH5%@0@HHHCHE@t@Hҥ[pH5@0@HHHHE@ tLHE@ H q[H51HHHAqHE@$<u@H"[oH5$@0@HHHBHEf@ft`HEf@H ɤ[sH=AE0HxHωt֋tHxDsAsԠHEHSHEH@Hf@ff tnHK[SH5MH=AE0HhHH`H`HhD\I\D[A[=HEH@Hf@fftnH[YH5H=4AE0HPHHHHHHPDDIDDCAC讟HEH@Hf@f f $< HEH@Hf@f f fH[H=A E0H8Hlj4֋4H80H0D,A,D+A+HEH@Hf@ff tnH[[H5H=AE0H HHHH DIDAsHEHXHEH@H@f@ff tnH[SH5H=sAE0HHHHHDIDA۝HEH@H@f@fftnHY[YH5[H=AE0HHHHHDIDAKHEH@H@f@f f $<HEH@H@f@f f fH[H=<AE0HHlj֋HHDADA藜HEH@H@f@ff tnH[[H5H=AE0HHHHHDIDA DžM9~ ECHcH v.@0@Hω֋H蜛E䋍)ȃEHEHcHHHHEEHMHHωH։‹JуMU9~ ECHcH .@0@Hω֋H踚EM9~DEHcMHcHB/E0H׋DIjE)ȃEHEHcHHHHEHHEHEHEE=EE؋E)MEءEE?HEHMHEHHHEHEHHHEE܃E܋E܋M9|E%HE HEHHHEE܃E܋E܋M9|H.H ҦHHHHE0HljH΋DAQ~YHcH /E0HHω|֋|HHD{I{褘HHED‰EH-H HHHEHM0Hωƈ_7EEЋEM9~ EE@EHcH .@0@zHωt֋tHzחE=~VEHcH g/E0HhHωd֋dHHhDcIcwEЋM)ȃEHMHcHHHHEH{,H H0HHEHMHHuE0\HHPHHP\DOAOKCHcH e.@0@NHωH֋HHN苖M9~GEHcHcH/E0DH׋DDCIC7HEHcɊD< $E̋Ẽu'H.+HHMH9u H]@UHHH}HuHUMDE't@HE!H5@0@kHH`H`ke5'H*HHt,H~*HHH iH9uHe*HHp HDžpHpHHp@$<u@HnH5@0@_HHPHP_譔Hp@t@H9pH5@0@OHH@H@OYHp@ tOHp@ H җH581[H5H=+AE0HHHHHDIDA0HpHbHpH@Hf@ff tnHSH5H=AE0HHHHHDIDA蓏HpH@Hf@fftnHYH5XH=AE0HxHHpHpHxDlIlDkAkHpH@Hf@f f $< HpH@Hf@f f fH]H=ZA E0H`Hlj\֋\H`XHXDTATDSASIHpH@Hf@ff tnHˑ[H5H=AE0HHHH@H@HHDH)HHiHEHEH)HHEHEHHt7HEHMHcHUHuHuHHHHՈHE EHcHMHUHHHHE؋EHcHM8H5HHHƉHH qH2HMHx@0@H׉ΊEHcHxHHƋH複HpHteHpH@H@f@fft@HN>H5B@0@HHHnlHMHEM9~GEHcHM HcHD/E0H׋DI HEHEHED‰EHH ޔHHHEHM0Hωƈ%HpHteHpH@H@f@fft@H%HH5֨@0@HHHEHEM9~GEHcHM HcHɉH/E0H׋DIHEHEHED‰EHEHEHEHEEM9}EEEM)M EEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|HĀ]DfDUHHPH}ut4Hq!H5@0@}HHuHME蝄qHHHt)HHHH H9uHHHEHEHEHHE@$<u@HчnH5u@0@HHpHpHE@t@HpH5$@0@oHH`H`o蠃HE@ tLHE@ H H51\HHPHP\AHE@$<u@HІoH5t@0@OHH@H@OHEf@ft`HEf@H wsH=7AE0H8Hω4֋4H8D3A3肂HEHSHEH@Hf@ff tnHSH5H=ɱAE0H(HH H H(DIDAHEH@Hf@fftnHjYH5H=:AE0HHHHHDIDA\HEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADA誀HEH@Hf@ff tnH/[H5ӯH=AE0HHHHHDIDA!t-HIH HH0HljΈݖ HEMHHljH։ʋ~u@HEMHCHljH։ʋi~uEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHHlj~HEHEHHt4HEHMHcHUHuHuHHH~HE EHcHMHUHHH HE؋E"EEHcH#Hlj$~HEHEHEHEHHtIHEHHMHMHH"HHHHHK~HE$HEH H"HH[HEHEH"HHEHEHHt7HEHMHcHUHuHuHHHH}HE EHcHMHUHHHHEEHcHMH5HHHƉH|H cHHHHMHU@0@H׉ΊEHcHMHHƋH|HP]f.UHHPH}u|t4H1S!H5[@0@}HHuHME]|9HHHt)HvHHH H9uH]HHEHEHEHHE@$<u@HSnH5@0@HHpHp{HE@t@H@SpH5j@0@oHH`H`o`{HE@ tLHE@ H ~SH5-1\HHPHP\AzHE@$<u@H~SoH5@0@OHH@H@OzHEf@ft`HEf@H 7~SsH=AE0H8Hω4֋4H8D3A3BzHEHSHEH@Hf@ff tnH}SSH5H=AE0H(HH H H(DIDAyHEH@Hf@fftnH*}SYH5TH=AE0HHHHHDIDAyHEH@Hf@f f $< HEH@Hf@f f fH~|SH=A E0HHlj֋HHDADAjxHEH@Hf@ff tnH{S[H5H=KAE0HHHHHDIDAw t-H H ʆHH0HljΈ蝎  HEMHBHljH։ʋkvuHEMHHljH։ʋ)vuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHtzHljuvHEHEHHt4HEHMHcHUHuHuHHHvHE EHcHMHUHHHHE؋E%EEHcHyHljuHEHEHEHEHHtIHEHHMHMH?H%HHHHH vHE$HEH H%HHHEHEH%HHEHEHHt7HEHMHcHUHuHuHHHHuHE EHcHMHUHHHHEEHcHMH5xHHHƉHtH # HHHHMHU@0@H׉Ί衋EHcHMHHƋHOtgHP]f.UHHPH}uDt4Hw!H5@0@}HHuHMEtHF HHt)H6 HHH H9uH HHEHEHEHHE@$<u@HQwnH5 @0@HHpHpqsHE@t@HwpH5@0@oHH`H`o sHE@ tLHE@ H vH5}1\HHPHP\ArHE@$<u@HPvoH5 @0@OHH@H@OprHEf@ft`HEf@H usH=ТAE0H8Hω4֋4H8D3A3rHEHSHEH@Hf@ff tnHyuSH53H=7AE0H(HH H H(DIDAkqHEH@Hf@fftnHtYH5H=AE0HHHHHDIDApHEH@Hf@f f $< HEH@Hf@f f fH>tH=A E0HHlj֋HHDADA*pHEH@Hf@ff tnHs5iH=mAE0HHHHHDIDAot-HH HH)0HljΈ] QHEMHHljH։ʋ+nuHEMHÞHljH։ʋmurEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHc>H4rHlj5nHEHEHHt4HEHMHcHUHuHuHHHynHE EHcHMHUHHH荹HE؋E$EEHc>HqHljmHEHEHEHEHHtIHEHHMHMHH$HHHHHmHE$HEH HH$HH۸HEHEH$HHEHEHHt7HEHMHcHUHuHuHHHHGmHE EHcHMHUHHH[HEEHcHM>H5vpHHHƉHtlH H$|HHHMHU@0@H׉ΊaEHcHMHHƋHl/HP]f.UHHPH}u t4Ho!H5@0@}HHuHMEkHHHt)HHHH H9uHHHEHEHEHHE@$<u@HonH5H@0@HHpHp1kHE@t@HnpH5@0@oHH`H`ojHE@ tLHE@ H _nH51\HHPHP\A_jHE@$<u@HnoH5G@0@OHH@H@O0jHEf@ft`HEf@H msH= AE0H8Hω4֋4H8D3A3iHEHSHEH@Hf@ff tnH9mSH5pH=AE0H(HH H H(DIDA+iHEH@Hf@fftnHlYH5H= AE0HHHHHDIDAhHEH@Hf@f f $< HEH@Hf@f f fHkH=hA E0HHlj֋HHDADAgHEH@Hf@ff tnHok5H=ҘAE0HHHHHDIDAagUt-HH JwHHi0HljΈ~ HEMH–HljH։ʋeuxHEMHHljH։ʋeu6EE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHiHljeHEHEHHt4HEHMHcHUHuHuHHH9fHE EHcHMHUHHHMHE؋E"EEHcHciHljdeHEHEHEHEHHtIHEHHMHMHH"HHHHHeHE$HEH H"HH蛰HEHEH"HHEHEHHt7HEHMHcHUHuHuHHHHeHE EHcHMHUHHHHEEHcHMH56hHHHƉH4dH HdtHHHMHU@0@H׉Ί!{EHcHMHHƋHcHP]f.UHHHHHEH}ut@Hcg:!H5@0@HHHcwHHHt,HHHH gH9uHHH( HDž(H(HH(@$<u@Hf:nH5`@0@HHHbH(@t@HWf:pH5 @0@HHHwbH(@ tOH(@ H e:H5ȓ1HHHAaH(@$<u@He:oH5S@0@HHHaH(f@ftcH(f@H ?e:sH=AE0HHω֋HDAJaH(HbH(H@Hf@ff tnHd:SH5pH=AE0HHHHHDIDA`H(H@Hf@fftnH)d:YH5ޑH=AE0HHHHHDIDA`H(H@Hf@f f $< H(H@Hf@f f fHwc:H=cA E0HHlj֋HHD|A|D{A{c_H(H@Hf@ff tnHb:5H=ʐAE0HpHHhHhHpDdIdDcAc^t-HH pHHc0HljΈu HH oHHHHEH UH H$AE0HXHHPHHPLHHXLDHAHDGAGR$EE EEE|HEMHcɊ< tދEEEHEHc|HCaHljD]H@H@HHt:H@HMHcH@HuHuHHH|]HE#EHcH@HUHHH荨HEH%88Hc|H`Hlj\H0H0HEHEHHtIHEHHMHMHpH%HH8HH8H\HE$HEH 9H%HḨHEHEH%HHEHEHHt=HEHHHcH@HuHuHHHH2\HE&HHcH@HUHHH@HEHHcH@|H5U_HH0HƉ,H0S[H HlH0HH8H0@0@+H׉Ί+:r8HcH0HHƋ,H0Z'EE EEE|HEMHcɊ< tދEE M9$EEEE EEE|HEMHcɊ< tދEEEHEHcH^HljZH@H@HHt:H@HMHcH@HuHuHHHPZHE#EHcH@HUHHHaHEH-88HcHn]HljoYH0H0HEHEHHtIHEHHMHMHlH-HH HH HYHE$HEH 5H-HH蠤HEHEH-HHEHEHHt=HEHHHcH@HuHuHHHHYHE&HHcH@HUHHHHEȋHHcH@H5)\HHHƉH'XH HiHHHH8H0@0@H׉Ίo8HcH0HHƋHWEE EEE|HEMHcɊ< tދEEEHEHcH9[Hlj:WH@H@HHt:H@HMHcH@HuHuHHHrWHE#EHcH@HUHHH胢HEЋH;88HcHZHljVH0H0HEHEHHtIHEHHMHMHH;HHHHHVHE$HEH H;HH¡HEHEH;HHEHEHHt=HEHHHcH@HuHuHHHH(VHE&HHcH@HUHHH6HEHHcH@H5KYHHHƉHIUH HfH`HH8H0@0@H׉ΊpQ8HcH0HHƋHTHHHHEH HEE?HEHMHEHHHEHEHHHEEEE=~kHHHMH9u H]TUHHPH}u,t4HW!H5g@0@}HHuHMESHHHt)HHHH H9uHHHEHEHEHHE@$<u@H!WnH5Dž@0@HHpHpASHE@t@HVpH5v@0@oHH`H`oRHE@ tLHE@ H oVH581\HHPHP\AoRHE@$<u@H VoH5Ƅ@0@OHH@H@O@RHEf@ft`HEf@H UsH=AE0H8Hω4֋4H8D3A3QHEHSHEH@Hf@ff tnHIUSH5H=AE0H(HH H H(DIDA;QHEH@Hf@fftnHTYH5`H=AE0HHHHHDIDAPHEH@Hf@f f $< HEH@Hf@f f fHTH=A E0HHlj֋HHDADAOHEH@Hf@ff tnHS[H5%H=UAE0HHHHHDIDAqOut-HH ZaHH0HljΈ-f 9HEMH~HljH։ʋMuHEMH~HljH։ʋMu>EE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHc%HRHljNHEHEHHt4HEHMHcHUHuHuHHHINHE EHcHMHUHHH]HE؋E$EEHc%HsQHljtMHEHEHEHEHHtIHEHHMHMHGH$HHHHHMHE$HEH H$HH諘HEHEH$HHEHEHHt7HEHMHcHUHuHuHHHHMHE EHcHMHUHHH+HEEHcHM%H5FPHHHƉHDLH Ht^HHHMHU@0@H׉Ί1cEHcHMHHƋHKHP]f.UHHPH}ut4HO!H5~@0@}HHuHMEKHHHt)HHHH H9uHHHEHEHEHHE@$<u@HNnH5~@0@HHpHpKHE@t@HNpH5}@0@oHH`H`oJHE@ tLHE@ H /NH5}1\HHPHP\A/JHE@$<u@HMoH5}@0@OHH@H@OJHEf@ft`HEf@H MsH=|AE0H8Hω4֋4H8D3A3IHEHSHEH@Hf@ff tnH MSH58|H=d|AE0H(HH H H(DIDAHHEH@Hf@fftnHzLYH5{H={AE0HHHHHDIDAlHHEH@Hf@f f $< HEH@Hf@f f fHKH=0{A E0HHlj֋HHDADAGHEH@Hf@ff tnH?K[H5nzH=zAE0HHHHHDIDA1G=t-HYH YHH1z0HljΈ] HEMHvHljH։ʋEu<HEMHSvHljH։ʋyEuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHIHljEHEHEHHt4HEHMHcHUHuHuHHH FHE EHcHMHUHHHHE؋E"EEHcH3IHlj4EHEHEHEHEHHtIHEHHMHMHxH"HHHHH[EHE$HEH PxH"HHkHEHEH"HHEHEHHt7HEHMHcHUHuHuHHHHDHE EHcHMHUHHHHEEHcHMH5HHHHƉHDH sHVHHHMHU@0@H׉ΊZEHcHMHHƋHCHP]f.UHHHHHEH}ut@H3G!!H5v@0@HHHSC_H|HHt,HlHHH gH9uHSHH( HDž(H(HH(@$<u@H{F!nH5-v@0@HHHBH(@t@H'F!pH5u@0@HHHGBH(@ tOH(@ H E!H5u1HHHAAH(@$<u@HnE!oH5 u@0@HHHAH(f@ftcH(f@H E!sH=tAE0HHω֋HDAAH(HbH(H@Hf@ff tnHD!SH5=tH=otAE0HHHHHDIDA}@H(H@Hf@fftnHC!YH5sH=sAE0HHHHHDIDA?H(H@Hf@f f $< H(H@Hf@f f fHGC!H=2sA E0HHlj֋HHD|A|D{A{3?H(H@Hf@ff tnHB![H5grH=rAE0HpHHhHhHpDdIdDcAc>t-HH pRHH3r0HljΈcU HH 9RHHHHEH(UH H$AE0HXHHPHHPLHHXLDHAHDGAG1$EE EEE|HEMHcɊ< tދEEEHEHccHAHlj=H@H@HHt:H@HMHcH@HuHuHHHL=HE#EHcH@HUHHH]HEH'88HccHj@Hljk<H0H0HEHEHHtIHEHHMHMHHpH'HH8HH8H<HE$HEH pH'HH蜇HEHEH'HHEHEHHt=HEHHHcH@HuHuHHHH<HE&HHcH@HUHHHHEHHcH@cH5%?HH0HƉ,H0#;H H3OH0HH8H0@0@+H׉Ί+ R8HcH0HHƋ,H0:'EE EEE|HEMHcɊ< tދEE M9$EEEE EEE|HEMHcɊ< tދEEEHEHcgH=Hlj9H@H@HHt:H@HMHcH@HuHuHHH :HE#EHcH@HUHHH1HEH/88HcgH>=Hlj?9H0H0HEHEHHtIHEHHMHMHDmH/HH HH H`9HE$HEH mH/HHpHEHEH/HHEHEHHt=HEHHHcH@HuHuHHHH8HE&HHcH@HUHHHHEȋHHcH@gH5;HHHƉH7H fHLHHHH8H0@0@H׉ΊN8HcH0HHƋH7ҍEE EEE|HEMHcɊ< tދEEEHEHcqH ;Hlj 7H@H@HHt:H@HMHcH@HuHuHHHB7HE#EHcH@HUHHHSHEЋH=88HcqH`:Hlja6H0H0HEHEHHtIHEHHMHMHjH=HHHHH6HE$HEH _jH=HH蒁HEHEH=HHEHEHHt=HEHHHcH@HuHuHHHH5HE&HHcH@HUHHHHEHHcH@qH59HHHƉH5H H)IH`HH8H0@0@H׉Ί@18HcH0HHƋH4ߊ HЊHHHEH(HEE?HEHMHEHHHEHEHHHEEEE=~lHH *HHxHHH30HLjGH H(IL fhHNj‰3HHHMH9u H]3fDUHHpH}ut:H17!H5g@0@}HHxHxEW3kHHHt)HpHHH {H9uHWHHEHEHEHHE@$<u@H6nH5Jg@0@wHHhHhw2HE@t@H:6pH5f@0@gHHXHXgZ2HE@ tLHE@ H 5H5f1THHHHHTA1HE@$<u@H5oH5If@0@GHH8H8G1HEf@ft`HEf@H 15sH= fAE0H0Hω,֋,H0D+A+<1HEHSHEH@Hf@ff tnH4SH5reH=eAE0H HHHH DIDA0HEH@Hf@fftnH$4YH5dH= eAE0HHHHHDIDA0HEH@Hf@f f $< HEH@Hf@f f fHx3H=hdA E0HHlj֋HHDADAd/HEH@Hf@ff tnH2[H5cH=cAE0HHHHHDIDA.t-HH CHHhc0HljΈE E E+EEHEHHHHHEEHMH8HωH։‹)-ɉMԋMԃESEHcH 1/E0HHω֋HDI-H4mH$HHEHEHEHEHMȈHEHHHEHEHHHEHEHMȈHEHHHEHEHHHEEE EЃEЋEЃ|HEMHcɊ< tދEЃEЋEЉEEHc H0Hlj,HEHEHHt4HEHMHcHUHuHuHHH,HE EHcHMHUHHHwHE؋E*EEHc H/Hlj+HEHEHEHEHHtIHEHHMHMH`H*HHHHH,HE$HEH `H*HH(wHEHEH*HHEHEHHt7HEHMHcHUHuHuHHHH+HE EHcHMHUHHHvHEEHcHM H5.HHHƉH*H 0H?HHHMHU@0@H׉ΊAEHcHMHHƋH\*Hp]UHH@HHHEH}u~t@H-i!H50_@0@#HHH#*/H<HHt,H,HHH gH9uHHH0 HDž0H0HH0@$<u@H;-inH5x^@0@HHH[)H0@t@H,ipH5$^@0@HHH)H0@ tOH0@ H ,iH5]1HHHA(H0@$<u@H.,ioH5k]@0@HHHN(H0f@ftcH0f@H +isH=)]AE0HHω֋HDA'H0HbH0H@Hf@ff tnHK+iSH5\H=\AE0HHHHHDIDA='H0H@Hf@fftnH*iYH5[H=$\AE0HHHHHDIDA&H0H@Hf@f f $< H0H@Hf@f f fH*iH=y[A E0HHlj֋HHDADA%H0H@Hf@ff tnHu)i[H5ZH=ZAE0HxHHpHpHxDlIlDkAkg%HH K;HHEH$UH$H(AE0H`HHXHHXTHH`TDPAPDOAO(EE EEE|HEMHcɊ< tދEEEPEHcH"(Hlj#$HHHHHHt:HHHMHcHHHuHuHHH[$HE#EHcHHHUHHHloHEP$@@HcHy'Hljz#H8H8HEHEHHtIHEHHMHMHXH$HH@HH@H#HE$HEH XH$HHnHEHEH$HHEHEHHt=HEHPHcHHHuHuHHHH#HE&PHcHHHUHHHnHEPHcHHH54&HH8HƉ4H82"H HR8HHH@H8@0@3H׉Ί39@HcH8HHƋ4H8!'EE EEE|HEMHcɊ< tދEE$M9$EEEE EEE|HEMHcɊ< tދEEEPEHcH$Hlj HHHHHHt:HHHMHcHHHuHuHHH/!HE#EHcHHHUHHH@lHEP,@@HcHM$HljN H8H8HEHEHHtIHEHHMHMHUH,HH(HH(Ho HE$HEH UH,HHkHEHEH,HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHHjHEȋPHcHHH5#HH HƉH H uH&5H0HH@H8@0@H׉Ί5@HcH8HHƋH !]EE EEE|HEMHcɊ< tދEEEPEHcH"HljHHHHHHt:HHHMHcHHHuHuHHHQHE#EHcHHHUHHHbiHEЋP:@@HcHo!HljpH8H8HEHEHHtIHEHHMHMH SH:HHHHHHE$HEH RH:HHhHEHEH:HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHHhHEPHcHHH5* HHHƉH(H HH2HHHH@H8@0@H׉ΊO@HcH8HHƋHXX#HcH AHHωHƋHAIH,HH-H,upHH T1H`HHH0HLjQHzH(IL /HNj‰"DH$HNIL nljH֋HHLIHLIHH$MEHHHMH9u H@]fUHH H}ut@H !H5O@0@CHH8H8CqH HHt,HHHH uH9uHHHH HDžHHHHHH@$<u@H  nH5O@0@7HH(H(7)HH@t@H pH5N@0@'HHH'HH@ tOHH@ H N H5{N1HHHANHH@$<u@H oH5N@0@HHHHHf@ftcHHf@H  sH=MAE0HHω֋HDAHHHbHHH@Hf@ff tnH SH5.MH=HMAE0HHHHHDIDA HHH@Hf@fftnH YH5LH=LAE0HHHHHDIDAyHHH@Hf@f f $< HHH@Hf@f f fH H= LA E0HHlj֋HHDADAHHH@Hf@ff tnHC [H5XKH=rKAE0HHHHHDIDA5HHH9uDH4HnH5KHHxHxDH6H$EEEHMHtH@HH9uDH/6HH5JtHHhHhDt1HHM6H5HH`HH`HEHEHEHEHtHHMHHEHHH~HHHEDEtEH HDEE EEE|HEMHcɊ< tދEEEhEHc:HHljH`H`HHt:H`HMHcH`HuHuHHHHE#EHcH`HUHHH.^HEh#XXHc:H;Hlj<HPHPHEHEHHtIHEHHMHMHiHH#HHXHHXH]HE$HEH 2HH#HHm]HEHEH#HHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHH\HEЋhHcH`:H5HHPHƉLHPH cH'HXHP@0@KH׉ΊK'XHcHPHHƋLHPHgHtHZHH9uDHI>H8H5FDHH8H8DDKHHHHHHHEHHMDH5HH0HH0HEHEHEHEHtHEH:HEHHH"HHHEDEtEH HDEE EEE|HEMHcɊ< tދEEEhEHcHHHljH`H`HHt:H`HMHcH`HuHuHHHHE#EHcH`HUHHHZHE؋hXXHcHHHlj HPHPHEHEHHtIHEHHMHMHqDHHH(HH(HAHE$HEH :DHHHQYHEHEHHHEHEHHt=HEHhHcH`HuHuHHHH HE&hHcH`HUHHHXHE苅hHcH`HH5HH HƉH H GH#HHHXHP@0@H׉Ί#XHcHPHHƋH g HH7H0HHHY HHtHHH9uDHRHH5HBHHHD HH HHEHEHEE=EEE)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|H֡HtHɡHH9uDHTHH5 AHHHD Ho@HaHtHTHH9uDHCVH2H5@HHHDE HHH ]UHHH}HuU̠t4H !H5c@@0@}HHuȉHMȊE HHHt)HHHH }H9uHHHEHEHEHHE؋@$<u4H nH5?@0@}HHuHMEI HE؋@t4H pH5~?@0@}HHuHME HE؋@ t@HE؋@ H H5B?1}HHuHUMAHE؋@$<u4H@ oH5>@0@}HHuHMElHEf@ftZHEf@H sH=>AE0H}Hω|֋|HMD{A{HEHZHEH@H@f@ff $<tnHx UH5>H=:>AE0HpHHhHhHpDdIdDcAcjHEH@H@f@fftnH YH5=H==AE0HXHHPHPHXDLILDKAKHEH@H@f@f f $< HEH@H@f@f f fH: H==A E0H@Hlj<֋>HEЋP%@@HcHKHljLH8H8HEHEHHtIHEHHMHMHi)H%HHHHHmHE$HEH 2)H%HH}=HEHEH%HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHHHEHM0HωƈESEHcH / E0HHω֋HDIHEH  HHΉɉMԋMԃE  E+E EHEH HHHHEEHhH 1HHHEHMHU@0H@H։Š/ESEHcH /E0HHω֋HDIHEH HHΉɉMԋMԃE E+EEHEHHHHHEEHgH H0HHEHMHU@0H@H։Š.ESEHcH / E0HHω|֋|HD{I{HEH  HHΉttɉMԋMԃE  E+E EHEH HHHHEEHffH HHHHEHMHU@0H@sH։ŠsqESEHcH z/E0HhHωd֋dHhDcIcHEH HHΉ\\^ɉMԋMԃE E+EEHEHHHHHEEH9eH H`HHEHMHU@0H@[H։Š[DESEHcH M/ E0HPHωL֋LHPDKIK`HEH  HHΉDD1ɉMԋMԃttE  E+E EHEH HHHHEHdH HxHHEHM0Hωƈ5ESEHcH >/E0H8Hω4֋4H8D3I3QHEH HHΉ,,"ɉMԋMԃttE E+EEHEHHHHHEHcH yHHHEHM0HωƈT& ESEHcH //E0H Hω֋H DIBHEH HHΉɉMԋMԃttE E+EEHEHHHHHEHaH jHHHEHM0Hωƈ ESEHcH  /E0HHω֋HDI3HEH HHΉɉMԋMԃttE E+EEHEHHHHHEH`H [HHHEHM0Hωƈ֗ ESEHcH /E0HHω֋HDI$HEH HHΉɉMԋMԃttE E+EEHEHHHHHEH_H LHHHEHM0Hωƈ跆 ESEHcH /E0HHω֋HDIHEH HHΉɉMԋMԃttE E+EEHEHHHHHEH^H =HHHEHM0Hωƈh}ESEHcH $/E0HHω֋HDIHEH HHΉɉMԋMԃttE E+EEHEHHHHHEH]H .HHHEHM0HωƈtESEHcH ,/E0HHω֋HDIHEH HHΉɉMԋMԃttE E+EEHEHHHHHEH\H H HHEHM0HωƈZcESEHcH 4/E0HHω֋HDIHEH HHΉɉMԋMԃttE E+EEHEHHHHHEH[H H8HHEHM0Hωƈ ZESEHcH </E0HxHωt֋tHxDsIsHEH HHΉllɉMԋMԃttE E+EEHEHHHHHEHZH HPHHEHM0HωƈPESEHcH D/E0H`Hω\֋\H`D[I[HEH HHΉTTɉMԋMԃttE E+EEHEH HHHHEHYH HhHHEHM0HωƈmGESEHcH L/E0HHHωD֋DHHDCICHEH HHΉ<<ɉMԋMԃttE E+EEHEHHHHHEHrXH HHHEHM0Hωƈ>EE EЃEЋEЃ|HEMHcɊ< tދEЃEЋEЉEEHcVH`HljaHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHH HE؋EEEHcVHHljHEHEHEHEHHtIHEHHMHMHHHH0HH0HHE$HEH HHH HEHEHHHEHEHHt7HEHMHcHUHuHuHHHHsHE EHcHMHUHHH HEEHcHMVH5HH(HƉ$H(H VHHHHMHU@0@#H׉Ί#EHcHMHHƋ$H(;/WH]fDUHHWt4HY!H5K@0@}HHuHMEVH=UHHt)H-UHHH H9uHUHHEHEHEH}HE@$<u4HHYnH5@0@}HHuЉHMЊEtHE@t4HYpH5f@0@}HHuHME/HE@ t@HE@ H YH5)1}HHuHUMA躾HE@$<u4HkYoH5@0@}HHuHME藾HEf@ftKHEf@H YsH=E1E0H}Hωu֋UHMDMAE>HqSH "HH0HLj<H THH5T[A}HHuHMED|AD|覽MMHxTH aHHѺ HljxH΋x跼MMu?HH (THH褼MMuHTH^ME~:HDRH HHHH(0HljΈ |EHQH H0HHH0HLjswHQH kHHHHH$0HLjjSHĐ]DUHHHnQHHEVt@H!H5R@0@HHHڻUHQHHt)HPHHH nH9uHPHHEHEHEHHE@$<u@HnH5@0@HHH.HE@t@HpH5U@0@HHHݺHE@ tLHE@ H \H51HHHA\HE@$<u@H oH5@0@HHH-HEf@ft]HEf@H sH=bE1E0HHω֋HDA¹HNH HHl0HLj{++ELH }SHH5VAHHHDADM܋M܃HSH HHѺ HljH΋#M܋M܃u?H H RHHM܋M܃uHRHʷM܋E܉V P E E܃E܋E܃|!EHcH  HHъ< t΋E܃E܋E܉EEHcHĻHljŷHEHEHHt@HEHMHcHUH5 HHHHHHE0EHcHMHl HHHHHHEEEEHcHHljHEHEHEHEHHtIHEHHMHMHHHHxHHxH?HE$HEH iHHHOHEHEHHHEHEHHt7HEHMHcHUHuHuHHHH軶HE EHcHMHUHHHHEEHcHMH5HHpHƉlHpH WKHHHHMHU@0@kH׉ΊkEHcHMHHƋlHp胵 HJH H0HHHH n1@0@jHljdH΋dj(Eu8HJH "HHHHH60HljΈ  HH HHΉ``г&&EHHHHEHIH sH`HHHE0HljΈ,M؋M؃HIH -HxHHHH /HU@0@_HωXHƋXDX_xEHIH HHHH0HljΈtvHH SHljTH΋TyuEu8HHH FHHHH,0HljΈ,1% ȉ#%HTHH HHHH0HLjBaLH!HHHMH9u Hİ]UHHOt@HH !H5@0@CHH8H8ChOHGHHt,HGHHH |H9uHhGHHH HDžHHHHHH@$<u@H nH5@0@7HH(H(7谱HH@t@H< pH5{@0@'HHH'\HH@ tOHH@ H մ H5,1HHHAհHH@$<u@H oH5@0@HHH裰HHf@ft`HHf@H $ sH=vE1E0HHω֋HDA2MHNH WMHHHֺHHHAL >MHHHDILAHH$D$D$1MMuHMH蝮ELLE EEE|!EHcH xLHHъ< t΋EEEhEHc1HHlj覮H`H`HHtFH`HMHcH`H5KHHHHHҮHE3EHcH`HKHHHHHHEh.XXHc1HHljHPHPHEHEHHtIHEHHMHMHH.HHHHHHE$HEH H.HHHEHEH.HHEHEHHt=HEHhHcH`HuHuHHHHxHE&hHcH`HUHHHHEȋhHcH`1H5HHHƉH虬H BH HXHP@0@H׉ΊXHcHPHHƋH5It?H!H I(HH蜬HHHH HJH HHHֺHHHAL 3IHHHDILAHH$D$D$&MMuHIH蒪E/)E EEE|!EHcH HHъ< t΋EEEhEHcKHHlj蛪H`H`HHtFH`HMHcH`H5hHHHHHǪHE3EHcH`H3HHHHHHEЋhXXHcKHխHlj֩HPHPHEHEHHtIHEHHMHMH*HHHHHHHE$HEH HHHHEHEHHHEHEHHt=HEHhHcH`HuHuHHHHmHE&hHcH`HUHHH{HEhHcH`KH5HHHƉH莨H =HHHHXHP@0@H׉ΊuXHcHPHHƋH)HH HHHHD HHxHHpHxLpD$fDHHHH eHljlH΋l苦HEH <HHHֺHHHAL DH`HH`D\I\LPAHPH$D$D$薦MMuHTEHEE EEE|!EHcH ]HHъ< t΋EEEhEHccH Hlj H`H`HHtFH`HMHcH`H5HHHHH7HE3EHcH`HHHHHH8HE苅h/XXHccHEHljFHPHPHEHEHHtIHEHHMHMHH/HHHHHHHgHE$HEH H/HHwHEHEH/HHEHEHHt=HEHhHcH`HuHuHHHHݤHE&hHcH`HUHHHHEhHcH`cH5HH@HƉHHω4H(H(H HD4D4`HRL LljHƋ‹7HH HƉ>H Dž\TH N=HHωHHHHDD藛HLLljHƋ‹n\~ \ ~m\HcHHA HH L^E0ɉHω֋DI襚Dž % HcH-Hlj.HHHhH}H`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`HhHHtHhH\HcHHHHHHHhHhHHHHHHXHT\HcH bHHHHHHhHHH8HHH S9%HHH HcHH=%HHωHƋHH苖OHHƉHʋAACH5LLljHƋ‹\~ \ ~m\HcHHA HH CL E0ɉHω֋DIQ\HcH HHHH'HHDž|HHcɊ< tϋ HcHDHljEHHHHtBHHHcHHHHHHxH,HcHHHHHH HcHHlj苔HHHhHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`H`HhHhHHHhH`HHH`HhHHtIHhH HcHHhHhHHHH裒H, HcHHhHHHH HcHH5HHHƉH軑HH53HHHΉ9HcHHHƋHiHِ\~ \ ~m\HcHHA HH LϘE0ɉHω֋DI\HcH eHHH H6H 5H HωHƋH褐H92HHL|LD|DEHp膐HLplLljhHƋh‹lc\~ \ ~m\HcHHA HH LSE0ɉdHω`֋`dD_I_蚏\HcH HHHAH 1HωHPˎHP艎SHHPƉLHʋLAAGH9LPHLljDHƋD‹H\~ \ ~m\HcHHA HH GLE0ɉ@Hω<֋<@D;I;U\HcH HHHH'HHDž|HHcɊ< tϋ HcHHHljIHHHHtBHHHcHHHHHH|H,HcHHHHHH HcHHlj菌HHHhHhHHtUHhHHhHhHHHH0HH0H行H*HhH zHHHHHhHHHhHhHHtIHhH HcHHhHhHHHHH, HcHHhHHHH HcHH5HH(HƉ$H( HcHNj$H(ӊHHH`H`HHtIH`HHcHH`H`HHHHH ,HcHH`HHHH H`HcHH`H`HHtUH`HH`H`HjH HHHHH?H(*H`H -H HHIH(HcHH5[HHHH_HH5vHHHHD pH@@ H HωHxupHx3pHHxƉtHʋtAApHLxpLljlHƋl‹poH@HtH@HH9uGH@H s@H5uhHH`HH`DhnDž|H@HcɊC< tˋ Hc@HNsHljOoHHHHtOHHHcH@HCHHHHHHuoH9HcH@HCHHHHHpH Hc@HzrHlj{nHHHhHhHHtUHhHHhHhHHHHXHHXHnH*HhH fHHH藹HHhHHHhHhHHtIHhH HcHHhHhHHHHmH, HcHHhHHHH HcH@H5qHHPHƉLHPm HcHNjLHPlHHH`H`HHtIH`HHcHH`H`HHHHlH,HcHH`HHHHH`HcHH`H`HHtUH`HH`H`HVH HH@HH@H+lH*H`H H HH5HHcH@H5GoHH8HH8KkHdH@PH }HHωHHHHDDdHLLljHƋ‹cH۟HHƉcHnc-H HHωHHHHDDdHLLljHƋ‹bH%HHƉbHbH@H H@\GH HHωHHHxHDD!cHLxtLljpHƋp‹taHH HxHƉaHxaH HHωlH`H`HXHDlDlbbHTLXTLljPHƋP‹T9aHHXHƉ@aHX aH6H H HωLHƋLH@aH(HHL@`HcHXHHƋHHH8H@=!@@)DžDžDžWHHHHHHHHHH9|Dž4H HHHH9|@HcH8H5qAHH0HH0u=\\\9H #HHω,H H HHD,D,l=H^`LLljHƋ‹C<Dž|Hc< tҋ0HcH:@Hlj;<H(H(HHtHHHƉH: HH5HHHΉ9 HcHHHƋH9H99H HHωHHHHDD9H\LLljHƋ‹8Hu HHƉ8Hz8>H HHωHHHHDD9H \LLljHƋ‹7Dž|H0Hc< tˋHcH;Hlj7HHHHtLHHHcH0HHHHHHH8HE6HcH0HHHHHHHEHcH;Hlj7HHHHhrHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHtFHHHcHHHHHHH*5HE)HcHHHHH5HEHcHH5J8HHHƉHH4HH5HHHΉ3HcHHHƋH3Hf3HHH 5HHH9H@H(H(HHH H(ʼnH VHHωHHHHDD3HVL|LljxHƋx‹|v2Ho(HHƉ}2HG2H HHωtHhHhH`HDtDt2HUL`\LljXHƋX‹\1HnH`HƉ1H`1HHDž4H HHHH=~H(HHHu+Hy5;@0H@WΊW1H(H`Dž\Dž|Hc< tҋHcH4Hlj0HHHHt H GLDžD`H ´HHωHHHHDD Ha HJ`HH LLljHƋ‹I HIHu@H r:H5 @0@HHH DH I)ȉHH|HHcH XIH9HHIHH)H DIHH :IHHcH5*IHHHFHH rL E0ɉHlj΋H‹HDIHHHHcH(HHHHHxDžTTTT|HxTHcɊ< tϋTTTTHcrH HljHHHHt?HHTHcHxHHHHHHE)THcHxHHHHSHEppHcrH HljHhHhH8HH0H0H8H8HHH8H0HHH0H8HHtFH8HHcHH8H8HHHHHE)HcHH8HHHQHEHcHrH5 HHpHƉlHppHhH5LHH`HΉpHcHhHHƋlHpH` DDDL9[H үHHω\HPHPHHHD\D\Hf[HH LHDLlj@HƋ@‹DeHHS'[H #HHωH iHHωHHHHDDH=HH LLljHƋ‹H% HHƉH&@=&~ &~m&HcHHAHH Lg%E0ɉHω֋DIDžH/HHcHPHljQH@H@H0H0HHtUH0HH0H0H$HHHHHHcH@*H0H $HHHm1H@H0HHH0H0HHtgH0H -%kHcH HH0H0HHHHHHHH<$kHcH HH0HHH0HHHgH(H@H Dž<WH H(H(HHH(H HHH <<<.~Dž<4H( H(HHH(<<<=q~HHcH@H5HHHHHgH0H"H(Dž<WH(H0H0HHH0H(HHH(<<<~Dž<4H0 H0HHH0<<<=~;9H |HHωHHHHDDH8HH LLljHƋ‹Dž<<<<|HHHHBDžHHHcHHljH@H@H0H0HHtRH0HH0H0HHHHHHHHE'H0H YHHH!HEH0HHH0H0HHt_H0HH0H0H%HHHHHHHH\HE4H0H $HHHHH\HEHgH(H@H Dž<WH H(H(HHH(H HHH <<<=~Dž<4H( H(HHH(<<<=~HHcH@H5HHHH$H |HHωHHHHDDH$HH LLljHƋ‹Dž<<<<|HgH0HH(Dž<WH(H0H0HHH0H(HHH(<<<~Dž<4H0 H0HHH0<<<=~HgH0HH(Dž<WH(H0H0HHH0H(HHH(<<<~Dž<4H0 H0HHH0<<<=~@H tHHωXHPHPHHHDXDXHHH LHDLlj@HƋ@‹DDž<<<<|6oH5@0@}HHuHMEjHEf@ftKHEf@H 6sH=E1E0H}Hωu֋UHMDMAE Nt-H9/H HH'0HljΈͰ MMMHp]UHHpMt4H;!H5U@0@}HHuHMEg_MH.HHt)H.HHH H9uHg.HHEHEHEH}HE@$<u4HnH5@0@}HHu؉HM؊EǘHE@t4HVpH5p@0@}HHuȉHMȊE肘HE@ t@HE@ H H5=1}HHuHUMA HE@$<u4HoH5@0@}HHuHMEHEf@ftKHEf@H qsH=E1E0H}Hωu֋UHMDMAE著Kt-H,H HHx)0HljΈM UKK=KHp]UHHp*Kt4H!H57@0@}HHuHMEJH,HHt)H,HHH H9uH+HHEHEHEH}HE@$<u4HnH5@0@}HHu؉HM؊EGHE@t4H֙pH5R@0@}HHuȉHMȊEHE@ t@HE@ H H51}HHuHUMA荕HE@$<u4H>oH5@0@}HHuHMEjHEf@ftKHEf@H sH=E1E0H}Hωu֋UHMDMAEIt-H9*H jHHX'0HljΈͫ HHHHp]UHHpHt4H;!H5@0@}HHuHMEgoHH)HHt)H)HHH H9uHg)HHEHEHEH}HE@$<u4HnH5u@0@}HHu؉HM؊EǓHE@t4HVpH50@0@}HHuȉHMȊE肓HE@ t@HE@ H H51}HHuHUMA HE@$<u4HoH5@0@}HHuHMEHEf@ftKHEf@H qsH=dE1E0H}Hωu֋UHMDMAE葒Ft-H'H *HH0%0HljΈM eFFMFHp]UHHH}u0Ft4H>!H5@0@}HHuHMEݑEH'HHt)H&HHH H9uH&HHEHEHEHHEЋ@$<u4H>nH5A@0@}HHuHME=HEЋ@t4H̔>pH5@0@}HHuHMEHEЋ@ t@HEЋ@ H w>H51}HHuHUMA胐HEЋ@$<u4H4>oH5d@0@}HHuHME`HEf@ft`HEf@H >sH=4AE0HxHωt֋tHxDsAsHEHSHEH@Hf@ff tnHi>SH5H=AE0HhHH`H`HhD\I\D[A[[HEH@Hf@fftnHڒ>YH5 H=8AE0HPHHHHHHPDDIDDCAC̎HEH@Hf@f f $< HEH@Hf@f f fH.>H=A E0H8Hlj4֋4H80H0D,A,D+A+HEH@Hf@ff tnH>[H5H=AE0H HHHH DIDA葍At-H"H HH)0HljΈM mAO H@HHHEHEHE؋E=EEE)MEEE?HE؊HMHEHHHEHEHHHE؋EEEM9|E%HE HEHHHEEEEM9|zH!H hHHHHA0HLjUNH.H(IL t HNj ‰@H]UHHpH}u?t:Ha!H5@0@}HHxHxE臋?H HHt)H HHH {H9uH HHEHEHEHHE@$<u@HnH5W@0@wHHhHhwۊHE@t@HjpH5@0@gHHXHXg芊HE@ tLHE@ H H51THHHHHTA HE@$<u@HoH5V@0@GHH8H8GډHEf@ft`HEf@H asH=AE0H0Hω,֋,H0D+A+lHEHSHEH@Hf@ff tnHSH5H=AE0H HHHH DIDAՈHEH@Hf@fftnHTYH5H=AE0HHHHHDIDAFHEH@Hf@f f $< HEH@Hf@f f fHH=oA E0HHlj֋HHDADA蔇HEH@Hf@ff tnH[H5H=AE0HHHHHDIDA +;t-H3H HHo0HljΈǝ :E E+EEHEHHHHHEEHMH0HωH։‹YɉMԋMԃESEHcH ։%/E0HHω֋HDIH9H$HHEHEHEHEHMȈHEHHHEHEHHHEHEHMȈHEHHHEHEHHHEEE EЃEЋEЃ|HEMHcɊ< tދEЃEЋEЉEEHc)HHlj貄HEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHH HE؋E*EEHc)H Hlj!HEHEHEHEHHtIHEHHMHMHH*HHHHHHHE$HEH ŸH*HHXHEHEH*HHEHEHHt7HEHMHcHUHuHuHHHHăHE EHcHMHUHHHHEEHcHM)H5HHHƉHH `HHHHMHU@0@H׉ΊޙEHcHMHHƋH茂6Hp]UHHHHHEH}uHHp6t@H!H5@0@oHH`H`o2R6H[HHt)HKHHH VH9uH2HHEHEHEHHE@$<u@HfnH5J@0@_HHPHP_膁HE@t@HpH5@0@OHH@H@O5HE@ tLHE@ H H51S oH5@0@7HH(H(7^OHxf@ftcHxf@H R sH=ؕAE0H Hω֋H DANHxHbHxH@Hf@ff tnH[R SH59H=cAE0HHHHHDIDAMNHxH@Hf@fftnHQ YH5H=єAE0HHHHHDIDAMHxH@Hf@f f $< HxH@Hf@f f fHQ H=&A E0HHlj֋HHDADAMHxH@Hf@ff tnHP [H5cH=AE0HHHHHDIDAwLHH {HHEM0HljΈ37HMHtHHQHuHEHEE=EE؋E)MEEE?HEHMȈHEHHHEHEHHHEE܃E܋E܋M9|E%HE HEHHHEȋE܃E܋E܋M9|HEHOHlj,KHtH5N]AHNjD.Jtt8tEЋE=~VEHcH N/E0HHω֋HHDIJHtHEEЃD‰EHH yHHHEHM0Hωƈ t=~ EtCtHcH M.@0@Hω֋HIt)MHttHcHHHHEtEЋE=~VEHcH BM/E0HHω֋HHDIRIHtHEEЃD‰EHdH wH0HHEMHUHu@0@HH։ʉHE E܃E܋E܃|EHct< tދE܃E܋E܉EEHc"HHH0H0>FHHHt,HHHH uH9uHHH@ HDž@H@HH@@$<u@HIH nH5@0@/HH H /EH@@t@HIH pH5@0@HHHEH@@ tOH@@ H IH H5W1 HHH AEH@@$<u@HHH oH5@0@HHHDH@f@ftcH@f@H mHH sH=AE0HHω֋HDAxDH@HbH@H@Hf@ff tnHGH SH5H=+AE0HHHHHDIDACH@H@Hf@fftnHWGH YH5qH=AE0HHHHHDIDAICH@H@Hf@f f $< H@H@Hf@f f fHFH H=A E0HHlj֋HHDADABH@H@Hf@ff tnHFH [H5-H=UAE0HHHHHDIDABqt-H-H qHH&0HljΈX 5EE EEE|HEMHcɊ< tދEEE$EEEE EEE|HEMHcɊ< tދEEE`EHc HDHlj@HXHXHHt:HXHMHcHXHuHuHHH@HE#EHcHXHUHHHHE`PPHc HDHlj@HHHHHEHEHHtIHEHHMHMHbHHHxHHxH?@HE$HEH +HHHOHEHEHHHEHEHHt=HEH`HcHXHuHuHHHH?HE&`HcHXHUHHHÊHEЋ`HcHX H5BHHpHƉlHp>H EHnHHHPHH@0@kH׉ΊkUPHcHHHHƋlHpe>ESEHcH 3B /E0H`Hω\֋\H`D[I[F>HyH mH0HHHE0HljΈ(HxH?HHQHuHxHEEEEE)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|Hx H@Hlj<?aT#T0t[T1tAT3tTaTbtTduK xiZKEE EEE|HEMHcɊ< tދEEE`EHc H?Hlj;HXHXHHt:HXHMHcHXHuHuHHH<HE#EHcHXHUHHH$HE؋`PPHc H1?Hlj2;HHHHHEHEHHtIHEHHMHMHHHHHHHHHS;HE$HEH SHHHcHEHEHHHEHEHHt=HEH`HcHXHuHuHHHH:HE&`HcHXHUHHHׅHE苅`HcHX H5=HH@HƉH ]HxHHH0HljΈ%IHH b]HHHHK0HljΈ踞 HĿH %]HHHH0HljΈ+HH \HHH胕H_H \HHHےH7H \HHH3WHH p\HHH苍/HH H\H HHH10HljΈnHH \H8HHƄHHHljHL LD D H3)H%LLLljHƋ‹ (Hp5HHƉ(H'H;, H,Hlj(HH [HPHHMHHHljHLLDDH:(H,KLLljHƋ‹'HmIHHƉ'H&HB+ HoHlj'HH ZHhHH0HoH׉ƈMMHH 8HljH΋&u|x c)ȉcccc~LH H jYHHHHcH L@0H@HΊw bc)ȃScMc)E EEE|EHcH H< tًEEE=$||E EEE|EHcH |H< tًEEEEHc< HT)HljU%HHHHt9HHMHcHH5HHH%HE&EHcHHHHHpHEHc< H(Hlj$HHHHHHHHtRHHHHHHHHlHHHHHH$HE'HHH |lHHHoHEHHHHHHHHHHtFHHHHcHHHHHHHHH$HE)HcHHHHHH(oHEHcH< H5='HHHƉH;#H H VHHHH@0@H׉Ί":HcHHHƋH"FaHaE EEE|EHcH mH< tًEEEEHcF HE&HljF"HHHHt9HHMHcHH5HHH"HE&EHcHH˽HHHmHEHcF H%Hlj!HHHHHHHHtFHHHHcHHHHHHHHH!HE)HcHHHHHHlHEHHHcHHHHRiH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@HcHF H5#HHHHH ^HHH8HH0=!t)pDžtDžpDžxWH0H8H8HHH8H0HHH0xxxt9|Džx4H8 H8HHH8xxxp9|HcHF H5."HHHH2n[p[E EEE|EHcH չH< tًEEEEHcN H!HljHHHHt9HHMHcHH5[HHHHE&EHcHH3HHHhHEHcN H!HljHHHHHHHHtFHHHHcHHHHHHHHH!HE)HcHHHHHH,hHEHHHcHHHHdH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@HcHN H5HHHHH4XHHH8HH0=!t)pDžtDžpDžxWH0H8H8HHH8H0HHH0xxxt9|Džx4H8 H8HHH8xxxp9|HcHN H5HHHHn nE EEE|EHcH =H< tًEEEEHcV HHljHHHHt9HHMHcHH5ôHHHOHE&EHcHHHHH]dHEHcV HjHljkHHHHHHHHtFHHHHcHHHHHHHHHHE)HcHHHHHHcHEȋHHHcHHHH,`H@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@HcHV H5aHHHHeH\kHHH8HH0=!t)pDžtDžpDžxWH0H8H8HHH8H0HHH0xxxt9|Džx4H8 H8HHH8xxxp9|HcHV H5HHHHRjSlSEHTHt EaHTHTQEEEE}EEHcHTHTHjTHH)HVTEHcHhHhH(HHMf H5HHHHHHHHHSHSHHSH`HSH(HDžXJH(HHH(H(HH(HXHHHXHXH`H9|EEtEH ܰH~8HH EHHHHu[0HljΈ*(P*PHPHHHHHH@EQH@HHHHHHHHH@HHH@EEE=~HOHHH Hlj|HΉx|DxBuPE EEE|!EHcH OHHъ< t΋EEE=mE EEE|!EHcH NHHъ< t΋EEEEHc HHljHHHHtFHHMHcHH5NHHHHH<HE3EHcHHMHHHHH=\HEЋHc HJHljKHHHHHHHHtRHHHHHHHHXHHHpHHpH]HE'HHH gXHHHj[HEHHHHHHHHHHtFHHHHcHHHHHHHHHHE)HcHHHHHHZHEHcH H5HHhHƉdHhHcHNjdHhHHH@H@HHtFH@HHcHH@H@HHHHHE)HcHH@HHHYHE苅H@HcHH@H\VH8H8H@H@HHH@H8HHH8H8H@H@HHH@H8HHH8H8H@H@HHH@H8HHH8H8H@H@HHH@H8HHH8HcH H5HHXHƉTHX H H_?HHHH@0@SH׉ΊSv#HcHHHƋTHX a aEE=~VEHcH  /E0HHHωD֋DHHHDCIC HHHHHED‰Hc H)Hlj* HHHHHHHHtFHHHHcHHHHHHHHHH HE)HcHHHHHHSVHEHHHcHHHHRH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@HP^HHH8HH0=!x)tDžxDžtEQH0H8H8HHH8H0HHH0EEEx9|E.H8 H8HHH8EEEt9|ŋHcH H5 HH8HH8&EEDžHGHu@H  :H5 @0@7HH(H(7H G)ȉTT|THcH GH9HwGHH)H sGHH iGTHcH5YGHHHFHH  L E0ɉ$Hlj ΋ H‹$HDIHFTHcH(HHH(H(H E(HHH(HHH C }CH ʛH5+9HHH1HH5QCE0HH΋DWHFHu@H  :H5 @0@HHHH E)ȉTT|THcH EH9HEHH)H EHH ~ETHcH5nEHHHFHH  L E0ɉHlj΋H‹HDIHDTHcH(HHHHHHHH@EQH@HHHHHHHHH@HHH@EEE=~E9$ʻHHHMH9u H0]m=\&NvUHHHHHEH}uRt@HC !H5K@0@%HHH%cHHHt,H|HHH gH9uHcHH0 HDž0H0HH0@$<u@H nH5FK@0@HHHH0@t@H7 pH5J@0@HHHWH0@ tOH0@ H  H5J1HHHAH0@$<u@H~ oH59J@0@HHHH0f@ftcH0f@H  sH=IAE0HHω֋HDA*H0HbH0H@Hf@ff tnH SH5VIH=nIAE0HHHHHDIDAH0H@Hf@fftnH  YH5HH=HAE0HHHHHDIDAH0H@Hf@f f $< H0H@Hf@f f fHW H=1HA E0HHlj֋HHDADACH0H@Hf@ff tnH [H5GH=GAE0HxHHpHpHxDlIlDkAkHHH9uDHA H؛H52 dHHXHXDdCHH$pp]H&H ٸH HωTHƋTHHHHHLHDLDDDEH8HL84Llj0HƋ0‹4HHtHHH9uDH HH5 ,HH H D,HS@H HωH^HRHHƉHʋAAHRHH LLlj HƋ ‹HHtHHH9uDH HrH5 HHHDDžllll|HlHcɊD< t΋llllHc H0Hlj1HHHHtOHHlHcHHHHHHHHWHx9lHcH LHHHHHHRFHxHc H\Hlj]HHHPHPHHtRHPHHPHPHBHHHHHHoHE'HPH BHHH|EHEHPHHHPHPHHtFHPHHcHHPHPHHHHHE)HcHHPHHHDHEHcH H5HHHƉHHcHNjHHHHHHHHHtFHHHHcHHHHHHHHHHE)HcHHHHHHCHEHHHcHHHH@H@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@HcH H5HHHHHH8H&H0Džh*hhH0HHH0h  H0< thdWH0H8H8HHH8H0HHH0ddd ~h )d4H8 H8HHH8ddd ~Dž` ```|`Hc< tҋ````Hc HHljHxHxHHtHEH(HcHH(H(HHtFH(HHcHxH(H(HHHHHE)HcHxH(HHH=HEHcH H5HHHƉHHcHxHHƋHp``HcHNjHNHXHXH H HHtFH HpHcHhH H HHHHlHE)pHcHhH HHHw HuH5/ HHHD @Hu@H ;HωHHfHHPH HHHHHH‹HHHH‹AHLLljHƋ‹HtHtHtHH9uDH H}tH5HHHDHEt@ H HωHPH,HHƉHʋAAH,HH LLljHƋ‹HsHtHsHH9uDH HdsH5HHHDDž|HsHcɊD< t΋xHc H"Hlj#HpHpHHtOHpHHcH|rHHHpHHHHIH9HcH >rHHHpHHHD HxhhHc HNHljOH`H`HHHHtUHHHHH!HHHHHHaH*HH HHHkHHHHHHHHtIHHxHcHpHHHHHHH,xHcHpHHHHHxHcHp H5HHHƉHhXXHcHNjHHPHPHHHHtIHHhHcH`HHHHHHH,hHcH`HHHHHhHHcHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHhHcH` H5cHHHHgHHHHDž*HHHH  H< tWHHHHHHHHHH ~ )4H HHHH ~Dž |Hc< tҋHHc HHljH@H@HHt?H@HHcH@HHHHH,HcH@HHHHHXHȉ88Hc HHljH0H0HHHHtIHHXHcHPHHHHHHH ,XHcHPHHHHH XHHcHHHHHtIHHHHcH@HHHHHHoH(,HHcH@HHHHwH(XHcHP H5HHHƉ|HHHcH@HHƋ|H]8((HcHNj|HH H HxHxHHtIHxH8HcH0HxHxHHHH:H0,8HcH0HxHHHBH08HxHcHHxHHpHpHxHxHHHxHpHHHpHpHxHxHHHxHpHHHp8HcH0 H5HHpHƉlHp( HcHNjlHpYHHHhHhHHtIHhH(HcH HhHhHHHHwH8,(HcH HhHHHH8(HhHcHHhHhHHtUHhHHhHhHH HH`HH`HH@*HhH XH HHH@(HcH H5HHXHHXHH`HHXDž*HXHHHX  HX< tWHXH`H`HHH`HXHHHX ~ )4H` H`HHH` ~Dž |Hc< tҋHc H0Hlj1HHHHt?HHHcHHHHHgHH,HcHHHHHoHHȉHc HtHljuHHHPHPHHtIHPHHcHHPHPHHHHHP,HcHHPHHHHPHPHcHHPHPHHtIHPHHcHHPHPHHHHHX,HcHHPHHHHXHcH H5HHPHƉLHPHcHHHƋLHPHcHNjLHPHHHHHHHHtIHHHHcHHHHHHHHHH`,HcHHHHHHH`HHHcHHHHH@H@HHHHHHHHH@HHH@H@HHHHHHHHH@HHH@HcH H5HH@HH@Dž|Hc< tҋHc HHljHHHHt?HHHcHHHHHHh,HcHHHHH HhȉHc HHljHHH8H8HHtIH8HHcHH8H8HHHHHp,HcHH8HHH HpH8HcHH8H8HHtIH8HHcHH8H8HHHHTHx,HcHH8HHH\ HxHcH H5nHH8HƉ4H8lHcHHHƋ4H8BHH5\~HH(HΉHcHHHƋ4H8H(`CHH OH Hω$HƋ$HH}HHLLDDEHƾHLLljHƋ‹製H[HtH[HH9uDH Hq[H5HHHDܼH9[@H |HωHDHHHƉHʋAAHHH LLljHƋ‹芼HZHtHzZHH9uDH HXZH5HHHDûDž|HYHcɊD< t΋xHc HHljHpHpHHtLHpHHcHpYHHHpHHHH=HE6HcH 5YHHHpHHH;HExhhHc HHHljIH`H`HHHHtRHHHHHHHHHHH[HE'HH HHHhHEHHHHHHHtFHHxHcHpHHHHHH輺HE)xHcHpHHHHHExHcHp H5ܽHHHƉHڹhXXHcHNjH虹HPHPHHHHtFHHhHcH`HHHHHH跹HE)hHcH`HHHHHEhHHcHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHhHcH` H5oHHHHsHHHHDž*HHHH  H< tWHHHHHHHHHH ~ )4H HHHH ~Dž |Hc< tҋHHc HHlj迴H@H@HHtHHHHtHHt)H>HHH zH9uH>HHEHEHEHHE@$<u4H7 nH50@0@}HHuHMEHE@t4H7 pH5@0@}HHuHMEѨHE@ t@HE@ H P7 H51}HHuHUMA\HE@$<u4H 7 oH5S@0@}HHuHME9HEf@ftWHEf@H 7 sH=E1E0H}Hω|֋|HMD{A{ԧHEH'IHEHEHHH舦HEHH9uDHEH 1Y H5tHHhHHhDt7HEH$EEHEHtHEHH9uDHEH [ H5XdHHXHHXDd跥E EEE|HE؋MHcɊD < t݋EEEEHEHtHEHH9uDHEH ] H5THHHHHHDTEԃ@EHcH ǩ] .@0@GHω@֋@HGE=~VEHcH }] /E0H8Hω4֋4HH8D3I3荥HE؋MHcɊD !8$EE/HEHtHEHH9uDHEH ߨ_ H5,HH HH D,EԃEEԃEE@EHcH _ .@0@Hω֋H襤E=~VEHcH 5_ /E0HHω ֋ HHD I EHE؋MHcɊT HEHtHEHH9uDHEH c H5WHHHHD趢HEHHEHEHHH茢hHEH譢H]f.UHHH}uht4H !H5r@0@}HHu؉HM؊E-qhHV8HHt)HF8HHH H9uH-8HHEHEHEHHE@$<u4Ha nH5@0@}HHuȉHMȊE荢HE@t4H pH5@0@}HHuHMEHHE@ t@HE@ H ǥ H5P1}HHuHUMAӡHE@$<u4H oH5@0@}HHuHME谡HEf@ftNHEf@H 7 sH=AE0H}Hωu֋UHMDMAETHEHMHEH@Hf@ff thHˤ SH5<H=VAE0H}HHxHxHEDtItDsAsàHEH@Hf@fftnHB YH5H=AE0HhHH`H`HhD\I\D[A[4HEH@Hf@f f $< HEH@Hf@f f fH H=(A E0HPHljL֋LHPHHHDDADDCAC肟HEH@Hf@ff tnH [H5xH=AE0H8HH0H0H8D,I,D+A+HEMH5Hlj$H։ʋ$˝MM~a/QHEMHHlj H։ʋ |MM~\JHEMH{HljH։ʋ0MM~:XcH]UHHH}uHH@'ct@Hp !H5@0@?HH0H0?萝bH2HHt,H2HHH dH9uH2HHH HDžHHHHHH@$<u@H nH5P@0@/HH H /؜HH@t@Hd pH5@0@HHH脜HH@ tOHH@ H H51 HHH AHH@$<u@H oH5C@0@HHH˛HHf@ftcHHf@H L sH=AE0HHω֋HDAWHHHHHH@Hf@ff tnHȞ SH5`H=AE0HHHHHDIDA躚HHH@Hf@fftnH6 YH5H=AE0HHHHHDIDA(HHH@Hf@fftnH gH5<H=bAE0HHHHHDIDA薙HHH@Hf@f f $< HHH@Hf@f f fH H=A E0HHlj֋HHDADAޘHHH@Hf@ff tnH` [H5H=AE0HxHHpHpHxDlIlDkAkRHHHtdHHH@Hf@fft@H H5@0@jHH`H`jHEHEHoHEE~EEE EEEE?HEHMHEHHHEHEHHHEẼE̋E̋M9|E%HE HEHHHEẼE̋E̋M9|HDž@Hm8H@H@HHHȕH@HH9uGH@H k H5\HHPHHPD\qH@H$EE0HHHtdHHH@Hf@fft@Hؙ H5@0@OHH@H@OEE ẼE̋Ẽ|HEMHcɊ< tދẼE̋ẺxEHc HNHljOHpHpHHt:HpHMHcHpHuHuHHH臕HE#EHcHpHUHHHHEЋxhhHc HHlj覔H`H`HEHEHHt=HEHxHcHpHuHuHHHHӔHE&xHcHpHUHHHHE؋xHMHcHHMHHEHEHMHEHHHEHEHHHExHcHp H5HH8HH8襓H@HtH@HH9uGH@H W H54HH(HH(D4]hXXHc HHljHPHPHEHEHHt=HEHhHcH`HuHuHHHH&HE&hHcH`HUHHH4HEhHMHcHHMHEHHtVHEHH@H HHUHUHHH HH H肒HE1H@H HHMHHHHE苅hHcH` H5HHHH螑HEHEHPHEXM9}XEċXM)M EEEE?HEHMHEHHHEHEHHHEEȃEȋEȋM9|E%HE HEHHHEEȃEȋEȋM9|ыXHcHP H5HHHH虐H@HtH@HH9uGH@H K H5 HHHHD QH@HH@H@HHHQUH@H<H]fUHH0H}uLUt4HK !H5c@0@}HHu؉HM؊E轏 UH$HHt)H$HHH H9uH$HHEHEHEHHE@$<u4HK nH5@0@}HHuȉHMȊEHE@t4HK pH5~@0@}HHuHME؎HE@ t@HE@ H WK H5M1}HHuHUMAcHE@$<u4HK oH5@0@}HHuHME@HEf@ftNHEf@H ǑK sH=AE0H}Hωu֋UHMDMAEHEHHEH@Hf@ff thH[K SH5-H=AE0H}HHxHxHEDtItDsAsSHEH@Hf@fftnHҐK YH5H=AE0HhHH`H`HhD\I\D[A[ČHEH@Hf@fftnHCK gH5H=AE0HPHHHHHHPDDIDDCAC5HEH@Hf@f f $< HEH@Hf@f f fHK H=\A E0H8Hlj4֋4H80H0D,A,D+A+胋HEH@Hf@ff tnHK [H5H=AE0H HHHH DIDAH=HHUHlj HHHHHHLD $'E~+HH kHHI&0HljΈ螆E}8HH 8HHHH120HljΈHEMHhHHHHHHHID$UOH0]fDfDUHHPH}uNt4H1!H5@0@}HHu؉HM؊E]NHHHt)HvHHH H9uH]HHEHEHEHHE@$<u4HnH5@0@}HHuȉHMȊE轈HE@t4HLpH5@0@}HHuHMExHE@ t@HE@ H H51}HHuHUMAHE@$<u4HoH5&@0@}HHuHMEHEf@ftNHEf@H gsH=AE0H}Hωu֋UHMDMAE脇HEHHEH@Hf@ff thHSH5mH=AE0H}HHxHxHEDtItDsAsHEH@Hf@fftnHrYH5H=0AE0HhHH`H`HhD\I\D[A[dHEH@Hf@fftnHgH5UH=AE0HPHHHHHHPDDIDDCACՅHEH@Hf@f f $< HEH@Hf@f f fH7H=A E0H8Hlj4֋4H80H0D,A,D+A+#HEH@Hf@ff tnH[H5H=fAE0H HHHH DIDA蚄HHHUHlj HHHHHHLD $ǃEudHEMHHHHHHHHID$`E~+HH _HH'0HljΈE}8HH ,HHHH30HljΈRHHHUHljHHHHHHLD$荂EudHEMHHHHHHHHID$&E~8HH %H0HHH>*0HljΈ~E}8HH HHHHH.60HljΈ iGHP]UHHH}uDGt4H!H5@0@}HHuЉHMЊE譁GHHHt)HHHH H9uHHHEHEHEHHE@$<u4HnH5b@0@}HHuHME HE@t4HpH5@0@}HHuHMEȀHE@ t@HE@ H GH51}HHuHUMASHE@$<u4HoH5@0@}HHuHME0HEf@ftNHEf@H sH=TAE0H}Hωu֋UHMDMAEHEHHEH@Hf@ff tnHKSH5H= AE0HxHHpHpHxDlIlDkAk=HEH@Hf@fftnHYH5=H=zAE0H`HHXHXH`DTITDSAS~HEH@Hf@fftnH-gH5H=AE0HHHH@H@HHDHHωTHƋTHHAnxHHHHRxHHw  H ljDH΋DXx  ~+H H հHH$0HljΈ'L H ]H=,ILIL H8lj4H΋4H8L(IH(L IH H$pwME  ~8H H HHHHN"0HljΈ#}guڳѳDž|HHtDž|dHHEEEE}EEHcHWHTH=HH)H)EHcHpHpH(HH|H5yHHHHuHHHHHHHHHhHH@HDž`JH@HHH@H(HH@H`HHH`H`HhH9|||t|H HJu~8HZ H H0HHH40HljΈ/1|/H{Hu@HSx:H5Kx@0@HHHst׳H H)ȉ\\|\HcH H9HHH)H HH \HcH5HHHFHHwLwE0ɉHlj΋H‹HDIsHQ\HcH(HHH@H@H (HHsH@HHHrHHu@Hv:H5v@0@HHHrKH )ȉ\\|\HcH H9HyHH)H uHH k\HcH5[HHHFHH vLuE0ɉHlj΋H‹HDI rHű\HcH(HHHHȋ H1IL ωH֋LIHLIHH$ZqME~8HH שHHHHH0HljΈ vp|98H+H |H`HHH0HLjHH(IL HNj‰oD$t 9$u ޯܯt$t EEEtHHHHH HljH΋Dn||9~DžCHcH s .@0@Hω֋H(o|=~Y|HcH r /E0HHω֋HHDIn|)ȃHcH HHHHHHHHHHӾH8~DžXTXDžTEQH8HHHHHHHHH8HHH8EEEX9|E.HH HHHHHHEEET9|ŋu -!t EEEϬͬu !t EEEt t EEE}su  t EEEJLu  t EEE#u t EEEHիH$HH uHljH΋kHFH HxHHH0HljΈ轷PPthG]:mDž)HcAH3oHlj4kHHHHHHHHtRHHHHHHHHH'HHHHHFkHE'HHH pH'HHSHEHHH'HHHH=H$HH8H8HHHHHHHHH8HHH8H8HHHHHHHHH8HHH8Dž>HcAHmHljiHHH0H0HHtRH0HHH0H0H)HHxHHxHiHE'HH0H)HH迴HEH0H)HH0H0HHtRH0HH0H0HHHHpHHpHiHE'H0H YHHHHEHcHAH5)lHHhHƉdHh'hDžJHcHNjdHhgHHH(H(HHtRH(HHH(H(H>HHXHHXHgHE'HH(H>HH HEH(H>HH(H(HHtRH(HH(H(HkH HHPHHPHRgHE'H(H kH HH_HEHcHAH5tjHHHHƉDHHrfH H2HHHHJ@0@CHω֊CZ}HcHHHƋDHHfHH$HH oHljwHcHHHƋH_tt EEEHHHH5c`IHHHHLL$D$ D$H^HH=ILH:HHLA AE0DHLDDFSH5WH=/mAE0H}HHuHMHED|I|D{A{HUJ HMI ~`HEH.H'H(HH=H HzHH *"@0@Hω֊UHEHtaHEH@Hf@fft@HBH5h@0@HHH$>HEH ~HHEHHH<H0]fDfDUHHHHHEH}at@HVAG!H5r@0@HHpHpv=HHHt,HHHH jH9uHvHH` HDž`H`HH`@$<u@H@GnH5Nq@0@oHH`H`o<H`@t@HJ@GpH5p@0@_HHPHP_j<H`@ tOH`@ H ?GH5͍1LHH@H@LA;H`@$<u@H?GoH5Ap@0@?HH0H0?;H`f@ftcH`f@H 2?GsH=AE0H(Hω$֋$H(D#A#=;H`HH`H@Hf@ff tnH>GSH5^oH=eAE0HHHHHD I D A :H`H@Hf@fftnH>GYH5nH= eAE0HHHHHDIDA:H`H@Hf@fftnH=GeH5:nH={dAE0HHHHHDIDA|9H`H@Hf@f f $< H`H@Hf@f f fH<GH=cA E0HHlj֋HHDADA8H`H@Hf@ff tnHF<G[H5lH=7cAE0HHHHHDIDA88HE@ HE@H@HEHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHE HEHHHEHPHEH)HEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE ~H@HEHЅHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE ~HPHEHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE ~HDž5HDžHPHDžHDžHDžHDžHDžHDžHDžHDžHDžHDžHDžHDžH@HDž4HDžH`HtdH`H@Hf@fft@H4H5[@0@HHH0HEHHHMIHLL ωH֋HLAHLIH$HHD$D$D$0HUJ HMI E EEE|EHMHcD< t݋EEEEEHcH3Hlj/HxHxHHtFHxHMHcHUHHHxHHHH/HE0EHcHMHHHxHHHzHEEppHcH2Hlj.HhHhHEHEHHtIHEHHMHMHHHHHHH.HE$HEH WHHHyHEHEHHHEHEHHt:HEHMHcHxHuHuHHHH_.HE#EHcHxHUHHHpyHEЋEHcHxH51HHxHƉtHx-H HiHpHh@0@sH׉ΊszDpHcHhHHƋtHx"-lE EEE|EHMHcD< t݋EEEEEHcH0Hlj,HxHxHHtFHxHMHcHUHHHxHHHH,HE0EHcHMHHHxHHHwHE؋E ppHcH/Hlj+HhHhHEHEHHtIHEHHMHMH}H HHhHHhH,HE$HEH }H HHwHEHEH HHEHEHHt:HEHMHcHxHuHuHHHH+HE#EHcHxHUHHHvHEEHcHxH5.HH`HƉ\H`*H HgHHHpHh@0@[H׉Ί[&pHcHhHHƋ\H`6*HE@ tHE@tHE@HEHHH(HH)H`HtdH`H@Hf@fft@H-H5T@0@ZHHPHPZ)HEH iHHEHHHk(mHE@tHE@H`HtdH`H@Hf@fft@H,H5S@0@OHH@H@O(HEH hHHEHHH'HE@ tHE@H`HtdH`H@Hf@fft@H ,H5S@0@?HH0H0?@(HEH HHEHHH&HJHHMH9u H]0(UHHCt4Hx+!H5y@0@}HHuHME'HͼHHt)HHHH H9uHHHEHEHEHHEЋ@$<u4H*nH5x@0@}HHuHME'HEЋ@t4H*pH5x@0@}HHuHME&HEЋ@ t@HEЋ@ H >*H5~x1}HHuHUMAJ&HEЋ@$<u4H)oH5!x@0@}HHuHME'&HEf@ft]HEf@H )sH=wE1E0HxHωt֋tHxDsAs%HzHPeHzH:eHyH$eHyHeHyHdHeHJHdH4HdHHdHHdHHH5H"HHH5cH y(HH0%HcHHHHHh#HHhHHMHvHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE=~H_H x(HH#H_HHHHH`}!HH`HHMHtHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE=~HMuH w(HH H/uHHHHX1HH u(HH HnHHXHvH Ax(HHS HuHHHXHPHHPHHMHqHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE=~HH (w(HH HHHHzH%xHHxHxx xHHHHH HHHHH@HHHHH@HHHHHHH@H?HtHHHHȹHչHHsHEHEEHEH wHHHEHHHEHEHHHEHEH ~HmsHHHEHnHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEHEHMHEHHHEHEHHHEE%HE HEHHHEEEE~Hhahhhhhhh;h\hyhhhhzhphfh<\hWRhoHh>h4h*h hh hLyAS%ihuge_deallocate: overlapping free itemsImpossible negative allocation (please report this bug).FILE_TPATH_TPREDEFINED_TSYMBOL_TLOGICAL_TINTEGER_TMACRO_TTEXT_TIF_TSTATE_TREPORT_Tcoco.f90SOURCE_FILE_LIST?? End of file - next file is COCO:PROCESS_INPUT_FILE?? This was produced using the following SET fileCOCO:CLOSE_FILEcoco normal exitCOCO:CHECK_KEY_CHARS_OKCHECK_KEY_CHARS_OKKEYS?~`@#$^{}|\:COCO:GET_CL_ARG_CHECK_LENGET_CL_ARG_CHECK_LENIARGBUFFERcan't get command argument lengthcommand line argument too longCOCO:GET_LOG_VALUE_FROM_CMDLINEGET_LOG_VALUE_FROM_CMDLINELOGICAL_PTRSYMBOL_PTRtype mismatch command line versus source: COCO:GET_INT_VALUE_FROM_CMDLINEGET_INT_VALUE_FROM_CMDLINEINTEGER_PTRCOCO:GET_LOG_VALUE_FROM_SETFILEGET_LOG_VALUE_FROM_SETFILEparameter mismatch set file versus source file: type mismatch set file versus source: COCO:GET_INT_VALUE_FROM_SETFILEGET_INT_VALUE_FROM_SETFILECOCO:VALID_NEW_SF_NAMEVALID_NEW_SF_NAMESTRINGabcdefghijklmnopqrstuvwxyzillegal initial character in name: abcdefghijklmnopqrstuvwxyz0123456789_illegal character in name: PREDEFINED_MACROSset file attempt to redefine a predefined macro: attempt to declare duplicate set file name: COCO:VALID_NEW_CL_NAMEVALID_NEW_CL_NAMEcommand line attempt to redefine a predefined macro: attempt to declare duplicate command line name: COCO:VALID_NEW_NAMEVALID_NEW_NAMEattempt to redefine a predefined macro: attempt to declare duplicate name: COCO:FORMAT_TIMEFORMAT_TIME:COCO:FORMAT_DATEFORMAT_DATE/COCO:TO_LOWERTO_LOWERAZCOCO:UNQUOTE_STRINGUNQUOTE_STRINGQUOTED_STRUNQUOTED_STRIN_LENOUT_LEN COCO:SEEK_CLOSE_PARENSEEK_CLOSE_PARENSTARTMATCHCOCO:REPLACE_SUBSTRINGREPLACE_SUBSTRINGMIXED_CASE_STRSEARCH_STRLOWER_CASE_STRREPLACE_STRFIRST_IDXCOCO:EVAL_LOG_PRIMARYEVAL_LOG_PRIMARYVALUEPRIMARY_STRPRIMARY_LEN.not.az..true..false.bad logical literal: (unmatched parenthesis: bad logical primary: COCO:EVAL_INT_PRIMARYEVAL_INT_PRIMARY090123456789( i10)can't decode: bad integer expression: COCO:SEEK_LOG_PRIMARYSEEK_LOG_PRIMARYOP_IDXREL_OP_IDXLOG_EXPR.or..and..eqv..neqv..eq..ne..lt..le..ge..gt.==/=<<=>=>unbalanced parenthesis in expression: COCO:EVAL_REL_EXPREVAL_REL_EXPRREL_EXPRno relational operator (.eq., .ne., .gt., .ge., .le., .lt.): no relational operator (==, /=, >, >=, <=, <): COCO:EVAL_LOG_EXPREVAL_LOG_EXPRunknown logical operator: COCO:EVAL_INT_EXPREVAL_INT_EXPRINT_EXPRunknown arithmetic operator: COCO:INTEGER_OR_LOGICALINTEGER_OR_LOGICALEXPR_STRFLAG.<>=+-*/\can't classify: COCO:GET_NEXT_MACROGET_NEXT_MACROMACRO_PTRCOCO:GET_NEXT_LOGICALGET_NEXT_LOGICALCOCO:GET_NEXT_INTEGERGET_NEXT_INTEGERCOCO:GET_NEXT_SYMBOLGET_NEXT_SYMBOLCOCO:GET_TEXT_PTRGET_TEXT_PTRTEXT_PTRNAME_STRunknown text: text::COCO:GET_LOGICAL_VALUEGET_LOGICAL_VALUELOGICAL_STRRETURN_VALUECURRENT_FILElogical not defined: unknown logical: COCO:GET_INTEGER_VALUEGET_INTEGER_VALUEINTEGER_STRinteger not defined: unknown integer: COCO:SEEK_SF_SYMBOL_NAMESEEK_SF_SYMBOL_NAMECOCO:SEEK_CL_SYMBOL_NAMESEEK_CL_SYMBOL_NAMECOCO:SEEK_SYMBOL_NAMESEEK_SYMBOL_NAMECOCO:PROCESS_SYMBOLS_DIRECTIVEPROCESS_SYMBOLS_DIRECTIVESYMBOLS_DIRextra characters at end of symbols directive: IF_CONSTRUCTCOCO:PROCESS_REPORT_DIRECTIVEPROCESS_REPORT_DIRECTIVEREPORT_DIRextra characters at end of report directive: COCO:PROCESS_OPTIONS_DIRECTIVEPROCESS_OPTIONS_DIRECTIVEOPTIONS_DIRextra characters at end of options directive: COCO:PROCESS_DOCUMENT_DIRECTIVEPROCESS_DOCUMENT_DIRECTIVEDOCUMENT_DIRextra characters at end of document directive: DOCUMENT_TEXT?COCO:PROCESS_BLOCK_DIRECTIVEPROCESS_BLOCK_DIRECTIVEBLOCK_STMT=assignment variable must be an integer or a logical: stopmessageif(elseif(elseendifasserterror: unknown block directive: COCO:GET_COPY_NAMEGET_COPY_NAMENAME_LENDECL_STMTTEXT_NAME (can't find name in copy statement: COCO:PROCESS_COPY_DIRECTIVEPROCESS_COPY_DIRECTIVECOPY_DIRno actual arguments for text: can't find close parenthesis in copy directive: ,no dummy arguments for text: ?? ! text TEXT_PTR%TEXT_LINES??COCO:WRAP_SOURCE_LINE?? ! end text COCO:VERIFY_TEXT_DIRECTIVEVERIFY_TEXT_DIRECTIVETEXT_STMTillegal directive in text block: COCO:ASSIGN_TEXT_VALUEASSIGN_TEXT_VALUEARGS_ARRAYLINES_ARRAYCOCO:OPEN_SCRATCHread text failed: end of file encountered within text blockTEXT_FILE%LINEwrite text file failed: CURRENT_FILE%LINEendtextsource line in continued coco statement in text COCO:CLOSE_SCRATCHtext block has no lines: allocate text block failedrewind text scratch file failedread text scratch file failed dummy arg not found in text COCO:ADD_TEXTADD_TEXTTEXT_DECL_STRMUST_PARENScan't allocate text: FIRST_SYMBOLLAST_SYMBOL)bad text dummy argument list: TEXT_PTR%DUMMY_ARGScan't aloocate text actual args array: text actual args declared to need parens but no dummy args: extra characters at end of text declaration: COCO:PROCESS_TEXT_DIRECTIVEPROCESS_TEXT_DIRECTIVETEXT_DIRCOCO:GET_TEXT_NAMEGET_TEXT_NAMEcan't find name in text statement: COCO:VERIFY_MACRO_VALUEVERIFY_MACRO_VALUEARGLISTVALUE_STRmacro has null valuemacro argument unused: macro definition has name already defined: COCO:VERIFY_DUMMY_ARGSVERIFY_DUMMY_ARGSARG_ARRAYfound duplicated dummy argument name: COCO:PROCESS_DUMMY_ARGLISTPROCESS_DUMMY_ARGLISTallocate dummy argument list failed: ,COCO:ADD_MACROADD_MACROMACRO_NAMEMAC_DECL_STRcan't allocate macro: bad macro dummy argument list: MACRO_PTR%DUMMY_ARGScan't aloocate macro actual args array: macro actual args declared to need parens but no dummy args: a macro definition must have an equals sign: COCO:PROCESS_MACRO_DECLARATIONPROCESS_MACRO_DECLARATIONMAC_STMTCOCO:GET_MACRO_NAMEGET_MACRO_NAME=(can't find name in macro declaration: COCO:PROCESS_ASSERT_DIRECTIVEPROCESS_ASSERT_DIRECTIVEASSERT_DIRcan't find open parenthesis: can't find close parenthesis in assert directive: can't find condition in assert directive: extra characters after assert condition: if( .not. )thenwrite( unit= *, fmt= *) "assertion failed: : : " // "stop "assertion failed"end ifCOCO:PROCESS_ENDIF_DIRECTIVEPROCESS_ENDIF_DIRECTIVEENDIF_DIRend if outside any if construct: end if badly nested in text block: end if badly nested in include file: extra characters after end if directive: COCO:PROCESS_ELSE_DIRECTIVEPROCESS_ELSE_DIRECTIVEELSE_DIRelse outside if construct: else after else: else badly nested in text block: else badly nested in include file: extra characters after else directive: IF_CONSTRUCT%ENCLOSINGCOCO:PROCESS_ELSEIF_DIRECTIVEPROCESS_ELSEIF_DIRECTIVEELSEIF_DIRelse if outside if construct: else if after else: else if badly nested in text block: else if badly nested in include file: no 'then' in else if directive: extra characters after else if directive: COCO:PROCESS_IF_DIRECTIVEPROCESS_IF_DIRECTIVEIF_DIRno 'then' in if directive: extra characters after if directive: COCO:DELETE_BLOCKDELETE_BLOCKPHASEblocks bested badlydeallocate block failedCOCO:NEW_BLOCKNEW_BLOCKallocate block failedIF_CONSTRUCT%NESTEDCOCO:ADD_LOGICALADD_LOGICALIS_CONSTLOGICAL_NAMELOG_DECL_STRcan't allocate logical: an logical constant must have a value: non constant expression used to define logical constant: COCO:PROCESS_LOGICAL_DECLARATIONPROCESS_LOGICAL_DECLARATIONLOGICAL_STMT, COCO:ADD_INTEGERADD_INTEGERINT_DECL_STRINTEGER_NAMEcan't allocate integer: an integer constant must have a value: non constant expression used to define integer constant: COCO:PROCESS_INTEGER_DECLARATIONPROCESS_INTEGER_DECLARATIONINTEGER_STMTCOCO:GET_SYMBOL_NAMEGET_SYMBOL_NAMESYMBOL_NAME= can't find name in declaration: COCO:PROCESS_MESSAGE_DIRECTIVEPROCESS_MESSAGE_DIRECTIVEMESSAGE_DIR'bad message string: +-can't encode: bad message list item: ( a)coco message: COCO:PROCESS_STOP_DIRECTIVEPROCESS_STOP_DIRECTIVESTOP_DIRcoco stop directive encountered: OUTPUT_FILE%LINEcoco stop directive encounteredCOCO:PROCESS_LOGICAL_ASSIGNMENTPROCESS_LOGICAL_ASSIGNMENTASSIGN_DIRattempt to redefine a constant: COCO:PROCESS_INTEGER_ASSIGNMENTPROCESS_INTEGER_ASSIGNMENTCOCO:PROCESS_COCO_STATEMENTPROCESS_COCO_STATEMENTCOCO_STMTtarget of assignment must be type integer or logical: integer::integer,parameter::logical::logical,parameter::macro::macro,parens::cmdlinedocumentoptionsreportsymbolstext::text,parens::copy::unknown coco directive: COCO:BLANK_COMPRESS_LOWER_CASEBLANK_COMPRESS_LOWER_CASEOUT_STRIN_STR COCO:SEEK_COMMENT_IDXSEEK_COMMENT_IDXWRAP_LINECOMMENT_IDXWRAP_SOURCE_LINE& &COCO:PROCESS_ACTUAL_ARGLISTPROCESS_ACTUAL_ARGLISTACTUAL_ARGSDUMMY_ARGSMACRO_VALUE_STRCOCO:MAKE_ACTUAL_ARRAYMAKE_ACTUAL_ARRAYACTUAL_ARRAYcan't find close parenthesis in actual argument list: COCO:EDIT_MACRO_STRINGSEDIT_MACRO_STRINGSLOWER_CASE_LINEEDIT_LINEmacro args missing: can't find close parenthesis on line to be edited: COCO:EDIT_LOGICAL_STRINGSEDIT_LOGICAL_STRINGSedit logical symbol not defined: COCO:EDIT_INTEGER_STRINGSEDIT_INTEGER_STRINGSedit integer symbol not defined: COCO:EDIT_COCO_STRINGSEDIT_COCO_STRINGSCOCO:EDIT_SOURCE_LINEEDIT_SOURCE_LINESOURCE_LINECOCO:SEEK_INCLUDE_FILESEEK_INCLUDE_FILEINCLUDE_FILEDIRECTORYcan't inquire include file: COCO:PROCESS_INCLUDE_DIRECTIVEPROCESS_INCLUDE_DIRECTIVEINCLUDE_DIRnull include file name: badly quoted include file name: can't find include file: ??! include ??! end include COCO:PROCESS_ENDFILE_DIRECTIVEPROCESS_ENDFILE_DIRECTIVEENDFILE_DIRIF_PTRextra characters after endfile directive: COCO:ADD_NUMBER_TO_LINEADD_NUMBER_TO_LINEOUTPUT_LINE! COCO:WRITE_SOURCE_LINEWRITE_SOURCE_LINETHIS_FILETHIS_FILE%LINEerror writing source output: COCO:WRITE_COCO_LINEWRITE_COCO_LINE!!?>COCO:IS_COCO_STATEMENTIS_COCO_STATEMENTCOCO:GATHER_COCO_STATEMENTGATHER_COCO_STATEMENTCOMPLETESTATEMENTLINEnull statement encountered in continuation sequencetoo many continuationsPROCESS_INPUT_FILEcan't read input file: end of file encountered in a continued coco statementincludeinclude line cannot be continuedendfileendfile line cannot be continuedsource line encountered in a continued coco statementFILE_IF_LEVELbadly nested if-block at end of file: COCO:ADD_SF_LOGICALADD_SF_LOGICALcan't allocate set file logical: FIRST_SF_SYMBOLLAST_SF_SYMBOLa set file logical constant must have a value: COCO:PROCESS_SF_LOGICAL_DECLARATIONPROCESS_SF_LOGICAL_DECLARATIONCOCO:ADD_SF_INTEGERADD_SF_INTEGERcan't allocate set file integer: a set file integer constant must have a value: non constant expression used to define set file integer constant: COCO:PROCESS_SF_INTEGER_DECLARATIONPROCESS_SF_INTEGER_DECLARATIONCOCO:GET_SF_SYMBOL_NAMEGET_SF_SYMBOL_NAMEcan't find name in set file declaration: COCO:PROCESS_WRAP_DIRECTIVEPROCESS_WRAP_DIRECTIVEWRAP_DIRtoo many wrap statementsonoffunknown option on wrap directive: COCO:PROCESS_VERBOSE_DIRECTIVEPROCESS_VERBOSE_DIRECTIVEVERBOSE_DIRtoo many verbose statementsunknown option on verbose directive: COCO:PROCESS_SUMMARY_DIRECTIVEPROCESS_SUMMARY_DIRECTIVEtoo many report statementsunknown option on report directive: COCO:PROCESS_POST_DIRECTIVEPROCESS_POST_DIRECTIVEPOST_DIRtoo many post statementsunknown option on post directive: COCO:PROCESS_OUTPUT_DIRECTIVEPROCESS_OUTPUT_DIRECTIVEOUTPUT_DIRtoo many output statementsnull name found on output directive: badly quoted name found on output directive: command line overrides set file, output directive ignored: COCO:PROCESS_NUMBER_DIRECTIVEPROCESS_NUMBER_DIRECTIVENUMBER_DIRtoo many number statementsunknown option on number directive: COCO:PROCESS_MARK_DIRECTIVEPROCESS_MARK_DIRECTIVEMARK_DIRtoo many mark statementsunknown option on mark directive: COCO:PROCESS_LOGFILE_DIRECTIVEPROCESS_LOGFILE_DIRECTIVELOGFILE_DIRtoo many log file statementsnull name found on log file directive: badly quoted name found on log file directive: command line overrides set file, log file directive ignored: COCO:OPEN_FILECOCO:PROCESS_KEY_DIRECTIVEPROCESS_KEY_DIRECTIVEKEY_DIRtoo many keys statementsextra characters at end of key directive: COCO:PROCESS_INPUT_DIRECTIVEPROCESS_INPUT_DIRECTIVEINPUT_DIRnull name found on input directive: badly quoted name found on input directive: command line overrides set file, input directive ignored: COCO:ADD_DIRECTORYADD_DIRECTORYDIRECTORY_STRFIRST_DIRECTORYCURRENT_DIRECTORYcan't append to include path list: can't start path list: COCO:SEEK_DIRECTORYSEEK_DIRECTORYDIRECTORY_PTRCOCO:PROCESS_DIRECTORY_DIRECTIVEPROCESS_DIRECTORY_DIRECTIVEDIRECTORY_DIRnull directory name: badly quoted directory name: redundant include directory ignored: COCO:PROCESS_FORM_DIRECTIVEPROCESS_FORM_DIRECTIVEFORM_DIRtoo many form statementsfreefixedbad form: extra characters after form directive: COCO:PROCESS_ALTER_DIRECTIVEPROCESS_ALTER_DIRECTIVEALTER_DIRtoo many alter statementsdeleteblankshift1shift0shift3unknown alter directive: COCO:PROCESS_SET_STATEMENTPROCESS_SET_STATEMENTSET_STMTalter:directoryform:inputkeys:logfilemark:number:outputpost:report:verbose:wrap:unknown set file directive: COCO:COPY_SET_FILECOPY_SET_FILEcan't copy set fileCOCO:PROCESS_SET_FILEPROCESS_SET_FILEcan't read set file: end of file encountered within a continuation sequencesource lines are not allowed in the set fileCOCO:SEEK_SET_FILESEEK_SET_FILEcan't inquire set file named on command line: can't inquire set file: COCO_SET_FILEcan't inquire set file named from environment: coco.setcan't inquire default set file: coco.setCOCO:WRITE_SYMBOLSWRITE_SYMBOLSpredefined symbolsname: value: referenced in file: at line: never referencednext symboldeclared in file: type: logical constantvariablevalue: .true.value: .false.defined in file: value: type: integer ( a: i10)type: macro with arguments in parenthesistype: macro with argumentsdummy arguments: type: macrotype: text with arguments in parenthesistype: text with argumentstype: textblock:error: type is unknownend symbolsCOCO:WRITE_REPORTWRITE_REPORTcoco executed: set file: output: input:input: ( a: i0: a)include path: .include path: . (PATH_PTRfiles read: include files read: set lines read: coco lines read: source lines read: source lines written: selected source lines: elided source lines: text blocks read: text lines read: text lines written: COCO:WRITE_OPTIONSWRITE_OPTIONScoco options:ALTER_LABELSalter state causes lines to be alter state is undefinedprocessing free form source: wrap len:processing fixed form source: wrap len:marking subsequent input filesnot marking subsequent input filesnumbering source linesnot numbering source linespostpending set file not postpending set file printing coco reportnot printing coco reportverbose mode is onverbose mode is offwrapping source linesnot wrapping source linesfound directory separator character no directory separator character foundthe left argument key: "" the right argument key: "COCO:PROCESS_CMDLINE_DIRECTIVEPROCESS_CMDLINE_DIRECTIVECMDLINE_DIRextra characters at end of cmdline directive: coco command line: COCO:PROCESS_WRAP_OPTIONPROCESS_WRAP_OPTIONtoo many wrap options on command lineCOCO:PROCESS_VERBOSE_OPTIONPROCESS_VERBOSE_OPTIONtoo many verbose options on command lineCOCO:PROCESS_SET_FILE_OPTIONPROCESS_SET_FILE_OPTIONSET_FILE_ARGtoo many set file options on command lineCOCO:PROCESS_REPORT_OPTIONPROCESS_REPORT_OPTIONtoo many report options on command lineCOCO:PROCESS_POSTPEND_OPTIONPROCESS_POSTPEND_OPTIONtoo many postpend options on command lineCOCO:PROCESS_NUMBER_OPTIONPROCESS_NUMBER_OPTIONtoo many number options on command lineCOCO:PROCESS_MARK_OPTIONPROCESS_MARK_OPTIONtoo many mark options on command lineCOCO:PROCESS_LOG_FILE_OPTIONPROCESS_LOG_FILE_OPTIONLOG_FILE_ARGtoo many log file options on command lineCOCO:PROCESS_KEY_OPTIONPROCESS_KEY_OPTIONKEY_OPTtoo many -k optionssCOCO:PROCESS_INCLUDE_OPTIONPROCESS_INCLUDE_OPTIONDIRECTORY_OPTnull name passed to -I optionbadly quoted name passed to -I optionCOCO:PRINT_HELPPRINT_HELPusage: coco [ -V | -h | [[ opts ] [--] [ basename | output input [...]]]OPTIONS_MSGCOCO:PROCESS_FIXED_OPTIONPROCESS_FIXED_OPTIONtoo many fixed options on command lineCOCO:ADD_CL_LOGICALADD_CL_LOGICALcan't allocate -D logical: FIRST_CL_SYMBOLLAST_CL_SYMBOLCOCO:ADD_CL_INTEGERADD_CL_INTEGERcan't allocate -D integer: COCO:PROCESS_DEFINE_OPTIONPROCESS_DEFINE_OPTIONSYMBOL_OPTCOCO:PROCESS_ALTER_OPTIONPROCESS_ALTER_OPTIONALTER_OPTtoo many alter options on command linegarbled -a option: unknown -a option: COCO:GETOPTGETOPTOPTSTRINGCOCO:PROCESS_COMMAND_LINEPROCESS_COMMAND_LINEa:D:FhI:k:l:mnprs:vVw $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $coco error exitfile name too long: .fpp.f90.setcan't allocate input file arrayset file name too long: COCO:MSG_CONTINUEMSG_CONTINUEMSGcoco message: file: , line: COCO:MSG_QUITMSG_QUIT coco error: file: , iostat: coco error: COCO:CHECK_INCPATH_DIRSCHECK_INCPATH_DIRSCOCO:SEEK_SEP_CHARSEEK_SEP_CHARPWD\COCO:BUILD_INCPATH_VALUEBUILD_INCPATH_VALUEMACRO_VALUECOCO:GET_PWD_ENVIRONMENT_VALUEGET_PWD_ENVIRONMENT_VALUEcan't access environment variable: PWDenvironment variable too long for macro value: PWDCOCO:GET_USER_ENVIRONMENT_VALUEGET_USER_ENVIRONMENT_VALUEUSERcan't access environment variable: USERenvironment variable too long for macro value: USERLOGNAMEcan't access environment variable: LOGNAMEenvironment variable too long for macro value: LOGNAMECOCO:GET_COMMAND_LINE_VALUEGET_COMMAND_LINE_VALUEcan't access the command linecommand line too long for macro valueCOCO:SET_OPTION_DEFAULTSSET_OPTION_DEFAULTScan't rewind input list scratch filecan't read input name scratch filecan't allocate input file listcan't read input list tmp file.funusable key characters from set file: must be chosen from unusable key characters from command line: CLOSE_SCRATCHcan't close scratch file: CLOSE_FILEkeepcan't close file: closed file: OPEN_SCRATCHreadwriteunformattedscratchcan't open scratch file: OPEN_FILEreplacewriteoldreadcan't open file: opened file: COCO:INITIALIZE_COCOINITIALIZE_COCOfilelinedatetimecocosetfileusercwdincpath  5 5 5   ( a)  ( a) ( a)  ( a: i10)   ((X@@Y @ T<fx<y?} ,kS 00!zRx ,F  ,LF  ,|bF  , ,thZ ,8jY  ,ht ,ȃ  ,4  ,dx ,( ,y  ,hc ,$ ,TxT3 ,؇7 ,x  ,(y ,xy ,D ,txy ,y ,y ,hy ,4M ,d)  ,2  ,C ,y ,$X  ,T(  ,q  ,X(l  ,5  ,?S+ ,Dk ,t> ,h ,} ,  ,4T ,d ,W ,# ,H# ,$H  ,T' ,. ,xD ,a ,ca ,Dd ,t8e ,g ,i 88889=>BB`FpFx[ [ [ [ [ [ [ [ [ [ [ [ [ [ \ \ \ "\ ,\ 6\ @\ J\ T\ ^\ h\ r\ |\ \ \ \ \ \ \ \ \ \ \ \ \ \ ] ] ] &] 0] :] D] N] X] b] l] v] ] ] ] ] ] ] ] ] ] ] ] (h^ o^ v^ H^  `^  `^  P^ P R 0T  ^ T W pY  ^ (^ $^ ?? h^  h^  h^  h^  h^  h^  h^     ( @ 03 + `  @  @X `` @h `p  p x < p   7a( e(  r  r  P g( r @  i( r   k( sl(  r  r  P n( o( h r @ r   p( Rp( p(  ^  1q(    0 H r  r ` r h &p r   r( Rr( r(  ^  1s( ( @ X p  r  r  r  1 r  P t( Rt( t(  ^  1u( h     r H r  r  `; r    ň(   ( (          8 P h       0 r ( i0 iH r X r ` ,h  (   ( ( @ X p        0 r @ iP h r x r  0 ( r                ޚ(             +(      ( @ X p        0 H ` x        8 P h        ( @ X p        h 0 @ P ` p       r      ( 8 H X h x   r  @ X p  0(  t(  (        0 H   r ` p r   r  ` x    (     `@ ` r (  ^  ^  (   @x  r  0 CO( r ( p ( '(  r h r   ׷( W(  r  r   p ( r ` л  ( r  < 0 #( r   `p  ((  h^    r   p ! ! Preprocessor executed: ?date? ?time?! ! Preprocessor command line: ?cmdline?! Preprocessor set file: ?setfile? ! Preprocessor log file: ?logfile? ! Preprocessor version: ?coco? ! ! Source file: ?file? line: ?line? ! Compile file: ?output? ! Include path: ?incpath? ! ! User: ?user? ! Current directory: ?cwd? ! ! ! Preprocessor executed: ?date? ?time?! ! Preprocessor command line: ?cmdline?! Preprocessor set file: ?setfile? ! Preprocessor log file: ?logfile? ! Preprocessor version: ?coco? ! ! Source file: ?file? line: ?line? ! Compile file: ?output? ! Include path: ?incpath? ! ! User: ?user? ! Current directory: ?cwd? !    ^  ^   ^  (        6(   0 H ` x         `; m8 ^H r X @U` $h p ax I 08 P r   ( r  0! H! `!    ^  (  K( ( *( h^  h^   * * h^  h^  x! ! ! ! ! ! "  " 8" P" h" " " " " " " # (# @# X# p# # # # # @! # r # i$ r $ P $ r 8$ `@$ `H$ +P$ 1`$ ix$ $ $ $ p$ `$ p& &  ^     ( & & & & ' `;X& ' a ' I(' 080' r 8' ' h^  ( B( h^  (   ( h^  E( ( H( M( h^  ( ' ( (( @( X( p( ( ( ( ( ( ) ) 0) H) `) x) ) 0 ' r ) r ) `) r ) +) 1) @) r ) @ ) r * r * r * r * @  * F(*  r 0* + a( (  *8( ( =(  **+ , (, @, X, p, , , , r + r , @, r , r , r , `- - .  .     8. P. h. . . W- p.  . . P/ (  h/ r @/ p/ / X( 1( ^  ( ^  / 0 0 00 r / r H0 P0 r X0 `0 0 ( ( 1 p0 r  1 p1 }( *1 r `1 @1 1 ?( (  *( ( ( * 2  2 82 P2 h2 2 2 2 r 1 r 2 @2 r 2 r 2 r 2 h2 3 3 4     (4 @4 X4 p3 p4 4 [(  4 r 4 p5 P5 (  n( ( z(  h^  h^  h^  h^  h5 5 5 5 5 5 5 6 (6 @6 X6 p6 r @5 i6 r 6 r 6 r 6 6 p6 6 p6 p6 p6 8 ?( ( ( p( (8 @8 X8 p8 r 8 r 8 r 8 r 8 8 09 i( ( 1( ( ( H9 `9 x9 9 r (9 r 9 r 9 r 9 r 9 P: 3( ( ( _( ( W(  h: : : : : : : r H: r ; r ; r  ; r (; r 0; i8; < ( (  < 0< H< `< r ; r x< p< i< = (  ( (= r = r @= = ( r = =  ( < (   ( ^  ^  = > > 0> H> `> r = r x> i> r > > > `? x? ?   ? ? ? @? P? P@ ( (  ( ^  ^  h@ @ @ @ @ @ r @@ r @ A r A A  A A A B   (B @B XB A pB B &(  B r B pC `C xC C C   (   G(  1(  h^  C C C D  D 8D PD hD D D D D 0O@C r D D D r E iE r  E PW (E 0E `8E @F ( h^  XF PW 0F `pF F !(  F F r F iG `G j#(  xG G r PG G H H  ^  ^   ^  %(                      #*( 0H HH `H xH H H H H H I  I 8I PI hI I I I I I I J (J @J XJ pJ J J J J J K K 0K HK `K `;G mxK ^K r K @UK $K K aK IK 08K K K @K @L  L   L P0L 0 8L ^@L @VHL NPL EXL N`L NpL pL r L O  FO  h^  PO hO O O pO  5( O O P (P @P XP FpP  uP Q Q 0Q  7(  HQ `Q xQ Q iP r Q iQ  R ^  =(  >( >( ** * 8R PR hR R R R R R R S (S @S XS pS S S S R r S iS r S PT  T u@T  U ^  D(  E( 8U PU hU U U U U r U uU PV ^  H(  H( hV V V V V V @HV r V uW  iK( W W W W W uX  PX hX X X X X X X Y (Y F@Y  ЍHY rXY pVhY xY Y 0Z N( r  Z Z Z Z Z   *P( P( 'Q( h^  Q( h^  h^  h^  Z [  [ 8[ P[ h[ [ [ [ [ 0OpZ r [ r [ r [ [ r \ `\ p\ @\  \ `(\ @] T( X] r 8] p] P]  X( h^  ] ] @] r ^ `^ p^  \( ^ ^ ^ @h^ @^ @^ r ^  ^( L^( P_ h_ _ _ _ r _ r _ h^  _(  _( _( h^  J`(  `(  ^   `(  h^  7a( h^  ` 8` P` h` ` ` ` ` ` ` a (a @a Xa pa a a a a a b @ b r  b (b r 8b `@b +Hb 1Pb r hb pb r xb b }b r b b pb r b p b `d b( d(  e( xd d d d r Xd r d id r d e e e   e e e f P`e 0(f `[0f f Bi( Tk(  &l( f f f g r f r g  g r 0g g g g   h  h 8h Ph g 0hh ph h o(  h r h 0i `i p( q( xi r Pi r i i q( r( i r i r j `j r( s( xj r Pj r j j s( t( j r j r k `k t(    u( u( u( xk k k k k k l r Pk 0O l r @l r Hl PW Pl l v( v( l r l r m `m w( w( xm r Pm r m m x(   x( iy( y( h^  m n (n @n Xn pn n n r m 0On r n r n PW n @ n o z( {( o r o r o 0p Hp `p xp   |( |( |( h^  p p p p 0Op r p r p PW q 0 q q J~( ~( q r q r q  r 8r Pr hr   l( ́(  o^  H(  r r r r r r 0Or r s r s P  s PW 0s @ 8s s ( ^( ( s t r s r (t r 0t t (  ( t r t r t u                  5( (u @u Xu pu u u u u u v v 0v Hv `v xv v v v v v w w u  w 0w @w Pw @[ `w j hw 0 pw p' xw ` w   w  w 0w w w pw 0w r w y h^  Ɖ( h^  h^  y y y @ y r y `y p z z h^  (  ( (   ( h^  z z z z z { ({ @{ X{ p{ { @ pz r { { r { +{ 1{  { r { p { | ( ,( ( ^( | } (} r | r @} r H} r P}  } V( r }  ~  8~ 8~  ,P~  deleted blank line initial ! shifted 1 + ! shifted 3 + !?> ~ !( r ~ 0 ( r ( p l( r h  ( r   ( r  0 ݬ( r ( p 9( r h  ( r   $( h^   r  @  p ( (  r ` r    0 H   *( G(  o^  (  ` x    ؂ 0O r  r  P  PW  @   -a ? set alter state, ? = { b, d, 0, 1, 3} -D name[=n] provide integer =n or logical true value -F treat source as fixed form source -h print this help message and quit -k cc sets the left and right key characters to cc -I directory search directory for include files (after .) -l log-file write log messages to log-file (default stderr) -m mark subsequent input files in the output file -n print line numbers on source lines -p disable the copy of set file at end of output -r print summary report at end of processing -s set-file read set-file as the set file (default coco.set) -v report file opening and closing -V print coco version and quit -w disable line wrapping -- optionally separate options from source file names ( r Ї  ( r  ` 5(  x  r X     (   0 H ` x F         @ .( (  D( X p  r 8 r  F  r  0 H   ` x    ޺(  D(  ( ( (   ( @ X p    Ќ    0 ! Ћ  H  P   p X @ `  h p  p   p   ! x  r  r  r    (  ( ؏ PW  r  @  (  (  (  ( X p  PW 0 r  PW  r  0 ( ( H r  r `   ( +( ( ( h^  (  (  ȑ    ( @ X p    В    r  r 0 r 8 r @ @ H P r X ` r h 8p  ,x   p         P  ( r H  ( i(  r  PW  5z    Ж "( r   >( ( ( r  PW @ "\C`?HXpHpp@pp@pTEpTGpXpXp RBVARARARARARApRApRAp0pRARAp(RAp RAp0pRARAp8pRARAphp(UARARARARARAp`p(UARARARARARAp`p(UARARARARAR0`ARARARARARARARAR0SAWARARARARARARAp(RAR0 `2ARARARARARARARARARARARARARARARARARARARARARARARARARAS0pZARARARARARAS0VARARARBp(RARARARAp RAp0pRARAp8pRARAp(RApp(RApp(RApp8pRARARAR0 RCp(p(p`ARARARARARARARARARARARAp(RBSMppppp^A^ARARARARARARARARARARARARARARARARARDpWARARARARARApp@pppp@`ARARARARARARARARARARARARARARARARARApYARARARARARARARBS0pVARARARAp8pRARAp8p(pTARARARARARAp0pRARAp8pRARApXARARARARARARARBS0SARARAp8pRARApp(ppp^ARARARARARARARARARARBpTARARARARARApxTARARARARARApWARARARARARARARApxTARARARARAp8pRARAp(RApxppVARARARARARARAS0SARARApppVARARARARARARAS0SARARAp8pRARAT0p^ARARARARARARARARARAp ppRARApPRARARApPRARARARCp(p(p`%ARARARARARARARARARARARARARARARARARARARARARARARARARAp(RHpUAR0pUARARAS0TARARARAR0pWAYARARARARARARARAR0VARARARAR0VARARAR0UAR0\ARARARARARAp(RBT0(p\ARARARARARARARARARARAp0pRARBp0pRARARARAp`SARARARARMVARARBppppXp(p`ARARARARARARARARARARARARARARARARApxTARARARARAS0TARARARApxTARARARARAS0TARARARAp0pRARAp8pRARAp8pRARAp8pRARAp8pRARApWARARARARARAp0pRARAp8pRARAppZARARARARARAp8pRARAT0pVARARARARAp0pRARAT0p@XARARARARARApPRARARARAp0pRARAp`ARARARARARARARARARARARARARARARARARARApp(ppSARARARARApppUAXARARARARARARARARAp`SARARARARApp RAp0pRARKp(RAp RAp RAp RAp RAp RAp RAp RApppRARAp8pRARAT0p@XARARARARAR0p(RAp RApHRARARApUARARARARARAp`SARARARARARLTARAp^ARARARAppRARARARAppRARARARARARAp0pRARAphSARARARARAp8pRARAphp`ARARARARARARARARARARARARARARARARApp RAp0pRARCp0p pHp(RAp0pRAR>@___stack_chk_guardQr`@dyld_stub_binderrx>@___NAGf90_associate_pointerr>@___NAGf90_badptr3_liner>@___NAGf90_cdangle_Deallocate_sr>@___NAGf90_cdangling_aDeAllocr>@___NAGf90_charcmpr>@___NAGf90_chindex1r>@___NAGf90_chindex1br>@___NAGf90_closefr>@___NAGf90_crashr>@___NAGf90_date_and_time_liner>@___NAGf90_destroy_pointerr>@___NAGf90_disassociate_target_becauser>@___NAGf90_end_inquirer>@___NAGf90_end_read_internalr>@___NAGf90_end_read_sequentialr>@___NAGf90_end_write_ifiler>@___NAGf90_end_write_sequentialr>@___NAGf90_establish_formatr>@___NAGf90_f90_init1_dllr>@___NAGf90_f90_init2_dllr>@___NAGf90_f90_init_dllr>@___NAGf90_fmt_read_chr>@___NAGf90_fmt_read_ir>@___NAGf90_fmt_write_chr>@___NAGf90_fmt_write_ir>@___NAGf90_freememr>@___NAGf90_getargr>@___NAGf90_getcmdr>@___NAGf90_getenvr>@___NAGf90_getmemr>@___NAGf90_iargcr>@___NAGf90_init_dllr>@___NAGf90_inquire_filer>@___NAGf90_inquire_openedr>@___NAGf90_inquire_unitr>@___NAGf90_line_Alloc_zvarr>@___NAGf90_line_Allocate_aacr>@___NAGf90_line_Allocate_sr>@___NAGf90_line_DeAlloc_or>@___NAGf90_line_chfreer>@___NAGf90_openf2r>@___NAGf90_pagecolourr>@___NAGf90_pu_bad_cdtype_liner>@___NAGf90_read_internal_filer>@___NAGf90_read_sequentialr>@___NAGf90_readu_optf2r>@___NAGf90_rewindfr>@___NAGf90_rtcrashr>@___NAGf90_rterrr>@___NAGf90_scalar_ifilexr>@___NAGf90_scanr>@___NAGf90_set_ioctx_nonadvancingr>@___NAGf90_stat_errmsgr>@___NAGf90_stop_liner>@___NAGf90_verifyr>@___NAGf90_write_ifiler>@___NAGf90_write_sequentialr>@___NAGf90_writeu_optf2r>@___memcpy_chkr>@___stack_chk_failr>@_exitr>@_getpagesizer>@_memcpy_ startY_=f90_initmaincoco_NXArgenvironmh_execute_headerU_^%NAGf90_tprognameinitlzaopReAllocfast_deallocation_allowed&21&&&zaopine_ReAllocaAllocoAllocpAlloc͡aAllocoAllocpAllocѢAllocDeAllocգAllocDeAllocllocatable_AllocDeAllocaDeAllocAllocDeAllocaDeAllocrdinary_٤AllocDeAllocAllocDeAllocointer_ rocref ݥиMP__DT_macro_ttext_tcopyfinaliseinitialise111copyfinaliseinitialise1113file_tHEADERpslogical_tHEADERimacro_tHEADERtext_tHEADERreport_tHEADER3ath_tHEADERredefined_tHEADER33ymbol_tHEADERtate_tHEADER33nteger_tHEADERf_tHEADER333333cv<<<<qltail<2<<2<qltail<2<=2 =ql2 tail2 ===%< $.%^,,,,,,,,,,,, p ''!!!5ЂHUMx(%%1 g"ВZ!C'b!"0>!UU!`Q.'9Ds85."A,3 5ON!  3&go   "W5~   G +;6 H% <-YO>IROU_Qi~$H0c ~p,8F0Oiu9`Sm,i@3I0d&1`;EN@V;^_i@p@` N#W:hV@q@ pP08!IAacpP@7$Z@Uz^m}9YPtpVrЍ  ? b @~ p ` + 1 @ `[ H `  P 0 p  * 0L  n    `  p'  0  @  P  @[ E j e w        `  л  <  `p 1 0 T  q       p   p . O@ kp        *! :+ XPW nr     p  7 T@ kp 0 @ 03 p    `    * 9 HP W f uе           / 0 J P d h |      X ' ` J h m p  x     1 T  q @  P  p    # F _    @  P    > W ` z h  p       #  <  _         H  P !  D  g            , ( P 0 t H  X  `  h   " @ < 0 ` @  P  h  x     2 V 0 p P  h   0  @  P 8 ` \ p           5  Z           ( 8 8 ] H  X  h  x     ;  `  ~   @  `  p    (   L   p     @   `      ( ! 0 2! x V!  p!  !  !  ! ( ! 0 " P 2" h V" p p"  "  "  "  "  # 0 2# ` V# p p#  #  #  #  #  $ 0 ($ P F$  j$  $  $  $  $ @ $  %  ,%  F% 8 j% H % X % ` % h % p & x B&  f&  &  &  &  & ' 0' N' ! r' 0! ' # ' # ' $ ' $ ( $ @( 8$ d( @$ ( H$ ( P$ ( `$ ( x$ ) $ ?) $ d) $ ) $ ) $ ) $ ) X& * p& /* ' S* ' w* (' * 0' * 8' * @' + ' %+ ' ?+ ) c+ ) + ) + ) + ) + ) , ) ;, ) _, ) , * , * , * , * - * <- (* a- 0* - @* - + - + - , . , *. , N. , r. , . - . - . - . - / . :/ . ^/ . / . / @/ / P/ / / 0 /  0 / D0 / ^0 H0 0 P0 0 X0 0 `0 0 p0  1 0 01 0 J1 1 n1 01 1 `1 1 p1 1 1 1 1  2 1 02 1 J2 2 n2 2 2 2 2 2 2 2 2 2 "3 3 @3 3 d3 3 ~3 p4 3 4 3 4 3 4 3 5 "4 5 @4 @5 d4 P5 ~4 6 4 6 4 6 4 6 5 6 25 6 V5 6 z5 6 5 6 5 6 5 6 6 7 6 8 ;6 8 U6 8 y6 8 6 8 6 8 6 8 7 (9 '7 09 A7 9 e7 9 7 9 7 9 7 9 7 H: 8 P: -8 ; Q8 ; u8 ; 8 (; 8 0; 8 8; 9 P; #9 ; G9 < a9 x< 9 < 9 < 9 < 9 = : = ): @= M: P= k: = : = : = : = : = ; x> ); > M; > q; > ; > ; > ; @? ; `? < ? 9< @ W< @@ {< P@ < @ < A < A = A %= A I= 0A g= A = A = pB = B = B  > B %> C I> C g> @C > `C > D > D > D ? E 5? E Y? E }? (E ? 0E ? 8E ? @E @ 0F +@ @F E@ pF i@ F @ F @ F @ G @ G A PG +A `G EA G iA G A G A H A xK A K  B K 1B K UB K yB K B K B K B K  C K .C K SC K xC L C L C L C 0L  D 8L 1D @L VD HL {D PL D XL D `L D pL E L 4E L YE L wE O E O E 0O E PO E O F O 5F O SF O mF pP F P F P F P F Q G Q 5G Q YG Q wG R G R G S G S G S !H T EH T iH @T H pT H U H U H U  I U 1I V OI HV sI PV I V I W I 0W I W  J X 1J 0X OJ PX iJ @Y J HY J XY J hY J xY K Y AK Y _K Z K 0Z K PZ K pZ K Z K [ L [ AL [ eL [ L \ L \ L \ L \ M \ =M (\ bM 0\ M 8] M @] M p] M ] N ] N ] 7N ] QN ^ uN ^ N ^ N h^ N p^ N ^ O ^ =O ^ aO ^ O P_ O _ O _ O _ P _ #P ` =P b aP b P (b P 8b P @b P Hb Q Pb 9Q hb ]Q pb Q xb Q b Q b Q b R b 9R b ^R b R b R b R Xd R `d S d (S d LS d pS e S `e S e S (f S 0f T Pf 2T f VT f pT g T g T 0g T @g T g U g 8U hh \U ph U h U h U h U i V i V Pi BV `i \V i V i V i V i V j W j W Pj BW `j \W j W j W j W j W k X k X Pk BX `k \X l X @l X Hl X Pl X `l  Y l .Y l HY m lY m Y Pm Y `m Y m Y m  Z m .Z m HZ n lZ n Z n Z n Z n Z o [ o >[ o X[ o |[ o [ p [ 0p [ p [ p  \ q D\ q h\ q \ q \ q \ q \ q ] r *] r D] s h] s ] s ] 0s ] 8s ] @s ^ s :^ s T^ (t x^ 0t ^ @t ^ t ^ t ^ t _ t :_ u ^_ u x_ w _ 0w _ @w _ Pw ` `w ,` hw P` pw t` xw ` w ` w ` w a w +a w Pa w ua w a w a w a w b y &b y @b y db y b z b z b pz b z c { ,c { Pc { tc { c { c { c { d { (d | Fd | jd | d @} d H} d P} d `} e } 2e } Le ~ je ~ e ~ e P~ e `~ e ~ e ~ f ~ 7f  Uf ( yf 0 f P f h f p f   g  1g  Kg  ig  g  g  g ( g 0 h P !h h Eh p _h }h h h Ѐ h h i ;i 0 Yi ` }i p i i i i j ;j _j j  j  j j j Ї k 6k Tk  xk k @ k X k ` k l 0l Tl nl l l l l m 8 @m @ Zm ~m m m m n 0 "n Fn dn Ћ n n H n P n X o ` 2o h Vo p {o x o o o p 4p Yp wp p p p p 0 q @ 5q Yq }q q q q 0 q ` !r p ?r cr }r 0 r 8 r @ r H  s P 1s X Us ` ys h s p s x s  t 0t Ut zt t t H t P t p u =u Wu {u Е u u u Ж u v  5v  Ov @ sv P v v v v v v v v w  $w ;w ` Qw ^w qw w w w w H w L w P w T w X x \  x ` x 6x Bx Nx Zx fx rx ~x x x x x x x x x x x  y $y (%y ,2y 0?y 4Ly 8Yy <fy @sy Dy Hy Ly `y y Dy Hy Py y  z z &z 3z @z Mz Zz nz {z z z z z z z z z z { { .{ ;{ H{ U{ $b{ (o{ 0{ @{ h{ l{ p{ t{ x{ |{ { | | &| 4| A| U| b| o| || | | | | | | | | (} ,} 0+} @A} PP} x]} l} y} } } } } } } } } ~ ~ !~ B~ O~ s~ ~ ~ ~ ~ ~  $ (1 ,> 0_ 4l 8 < @ D `    # 0 = ^ k     À Ҁ H߀ `   ! 7 M d { 0 8 @ h pʁ ׁ    ' 4 U b     $ ( ,  0 48 8E <g @t D H L P x˃ |     = J [ h w     Ƅ @݄ P `  h  l % p 2 t ? x L | Y f u # # # # # 8ʅ 888ݒ!48M9g== † цՑpf- z4#I[o͐%}Y;̇5=> B%B>ObBx`FpFQƈ؈8  " ; T k  `  `  ̉  @ P R *0T FT [W tpY 8,"PĊ؊ *GYl؋0NhҌ+ASduэ7QjÎ"4D\kǏݏ$2;M`kuŐːѐؐߐ "*19AGMT\dlrzÑɑґّ  (.6?GPXcpz’ʒҒے $+3<BJU[dkpv|Ɠ͓֓ޓ &,3:CIQYakt|ɔєؔ     ;br@@     ;br _rebalance_try_misc_allocate_misc_insert_huge_deallocate_misc_deallocate_maybe_coalesce_allocate___inline_memcpy_chk_coco_IP_check_key_chars_ok_coco_IP_get_cl_arg_check_len_coco_IP_get_log_value_from_cmdline_coco_IP_get_int_value_from_cmdline_coco_IP_get_log_value_from_setfile_coco_IP_get_int_value_from_setfile_coco_IP_valid_new_sf_name_coco_IP_valid_new_cl_name_coco_IP_valid_new_name_coco_IP_format_time_coco_IP_format_date_coco_IP_to_lower_coco_IP_unquote_string_coco_IP_seek_close_paren_coco_IP_replace_substring_coco_IP_eval_log_primary_coco_IP_eval_int_primary_coco_IP_seek_log_primary_coco_IP_eval_rel_expr_coco_IP_eval_log_expr_coco_IP_eval_int_expr_coco_IP_integer_or_logical_coco_IP_get_next_macro_coco_IP_get_next_logical_coco_IP_get_next_integer_coco_IP_get_next_symbol_coco_IP_get_text_ptr_coco_IP_get_logical_value_coco_IP_get_integer_value_coco_IP_seek_sf_symbol_name_coco_IP_seek_cl_symbol_name_coco_IP_seek_symbol_name_coco_IP_process_symbols_directive_coco_IP_process_report_directive_coco_IP_process_options_directive_coco_IP_process_document_directive_coco_IP_process_block_directive_coco_IP_get_copy_name_coco_IP_process_copy_directive_coco_IP_verify_text_directive_coco_IP_assign_text_value_coco_IP_add_text_coco_IP_process_text_directive_coco_IP_get_text_name_coco_IP_verify_macro_value_coco_IP_verify_dummy_args_coco_IP_process_dummy_arglist_coco_IP_add_macro_coco_IP_process_macro_declaration_coco_IP_get_macro_name_coco_IP_process_assert_directive_coco_IP_process_endif_directive_coco_IP_process_else_directive_coco_IP_process_elseif_directive_coco_IP_process_if_directive_coco_IP_delete_block_coco_IP_new_block_coco_IP_add_logical_coco_IP_process_logical_declaration_coco_IP_add_integer_coco_IP_process_integer_declaration_coco_IP_get_symbol_name_coco_IP_process_message_directive_coco_IP_process_stop_directive_coco_IP_process_logical_assignment_coco_IP_process_integer_assignment_coco_IP_process_coco_statement_coco_IP_blank_compress_lower_case_coco_IP_seek_comment_idx_coco_IP_wrap_source_line_coco_IP_process_actual_arglist_coco_IP_make_actual_array_coco_IP_edit_macro_strings_coco_IP_edit_logical_strings_coco_IP_edit_integer_strings_coco_IP_edit_coco_strings_coco_IP_edit_source_line_coco_IP_seek_include_file_coco_IP_process_include_directive_coco_IP_process_endfile_directive_coco_IP_add_number_to_line_coco_IP_write_source_line_coco_IP_write_coco_line_coco_IP_is_coco_statement_coco_IP_gather_coco_statement_coco_IP_process_input_file_coco_IP_add_sf_logical_coco_IP_process_sf_logical_declaration_coco_IP_add_sf_integer_coco_IP_process_sf_integer_declaration_coco_IP_get_sf_symbol_name_coco_IP_process_wrap_directive_coco_IP_process_verbose_directive_coco_IP_process_summary_directive_coco_IP_process_post_directive_coco_IP_process_output_directive_coco_IP_process_number_directive_coco_IP_process_mark_directive_coco_IP_process_logfile_directive_coco_IP_process_key_directive_coco_IP_process_input_directive_coco_IP_add_directory_coco_IP_seek_directory_coco_IP_process_directory_directive_coco_IP_process_form_directive_coco_IP_process_alter_directive_coco_IP_process_set_statement_coco_IP_copy_set_file_coco_IP_process_set_file_coco_IP_seek_set_file_coco_IP_write_symbols_coco_IP_write_report_coco_IP_write_options_coco_IP_process_cmdline_directive_coco_IP_process_wrap_option_coco_IP_process_verbose_option_coco_IP_process_set_file_option_coco_IP_process_report_option_coco_IP_process_postpend_option_coco_IP_process_number_option_coco_IP_process_mark_option_coco_IP_process_log_file_option_coco_IP_process_key_option_coco_IP_process_include_option_coco_IP_print_help_coco_IP_process_fixed_option_coco_IP_add_cl_logical_coco_IP_add_cl_integer_coco_IP_process_define_option_coco_IP_process_alter_option_coco_IP_getopt_coco_IP_process_command_line_coco_IP_msg_continue_coco_IP_msg_quit_coco_IP_check_incpath_dirs_coco_IP_seek_sep_char_coco_IP_build_incpath_value_coco_IP_get_pwd_environment_value_coco_IP_get_user_environment_value_coco_IP_get_command_line_value_coco_IP_set_option_defaults_coco_IP_close_scratch_coco_IP_close_file_coco_IP_open_scratch_coco_IP_open_file_coco_IP_initialize_coco_dConst1.19038_BSInfo1.19039_BSInfo1.41211_BSInfo1.51659_dConst1.52851_dConst2.52852_dConst3.52853_dConst4.52854_dConst5.52855_dConst6.52856_dConst7.52857_dConst8.52858_dConst9.52859_pvars_first.9451_coco_VAR_r_key__coco_VAR_l_key__coco_VAR_optarg__coco_VAR_if_construct__coco_VAR_last_symbol__coco_VAR_first_sf_symbol__coco_VAR_last_sf_symbol__coco_VAR_first_cl_symbol__coco_VAR_last_cl_symbol__coco_VAR_current_file__coco_VAR_processor_msg__coco_VAR_first_directory__coco_VAR_first_symbol____NAGf90_Check_Procref_Args4.6178___NAGf90_Check_Arg.6177___NAGf90_Check_Procref_Args5.6179___NAGf90_Check_Procref_Args6.6180___NAGf90_Check_Procref_Args7.6181___NAGf90_Check_Procref_Args8.6182___NAGf90_Check_Procref_Args10.6183___NAGf90_Check_Procref_Args12.6184___NAGf90_Check_Procref.6185___NAGf90_Check_Procref_Args0.6439___NAGf90_Check_Arg.6438___NAGf90_Check_Procref_Args1.6440___NAGf90_Check_Procref.6441___NAGf90_Check_Procref_Args0.6557___NAGf90_Check_Arg.6556___NAGf90_Check_Procref.6558___NAGf90_Check_Procref_Args0.6820___NAGf90_Check_Arg.6819___NAGf90_Check_Procref.6821___NAGf90_Check_Procref_Args0.7088___NAGf90_Check_Arg.7087___NAGf90_Check_Procref_Args1.7089___NAGf90_Check_Procref.7090___NAGf90_Check_Procref_Args0.7446___NAGf90_Check_Arg.7445___NAGf90_Check_Procref_Args1.7447___NAGf90_Check_Procref.7448___NAGf90_Check_Procref_Args0.7798___NAGf90_Check_Arg.7797___NAGf90_Check_Procref_Args1.7799___NAGf90_Check_Procref_Args2.7800___NAGf90_Check_Procref_Args3.7801___NAGf90_Check_Procref_Args4.7802___NAGf90_Check_Procref.7803___NAGf90_Check_Procref_Args0.8056___NAGf90_Check_Arg.8055___NAGf90_Check_Procref_Args1.8057___NAGf90_Check_Procref_Args2.8058___NAGf90_Check_Procref_Args3.8059___NAGf90_Check_Procref_Args4.8060___NAGf90_Check_Procref.8061___NAGf90_Check_Procref_Args0.8314___NAGf90_Check_Arg.8313___NAGf90_Check_Procref_Args1.8315___NAGf90_Check_Procref_Args2.8316___NAGf90_Check_Procref_Args3.8317___NAGf90_Check_Procref_Args4.8318___NAGf90_Check_Procref.8319___NAGf90_Check_Arg.10539___NAGf90_Check_Procref_Args0.10540___NAGf90_Check_Procref_Args1.10541___NAGf90_Check_Procref_Args2.10542___NAGf90_Check_Procref_Args3.10543___NAGf90_Check_Procref_Args4.10544___NAGf90_Check_Procref_Args5.10545___NAGf90_Check_Procref_Args6.10546___NAGf90_Check_Procref_Args7.10547___NAGf90_Check_Procref.10548___NAGf90_Check_Arg.11139___NAGf90_Check_Procref_Args0.11140___NAGf90_Check_Procref_Args1.11141___NAGf90_Check_Procref_Args2.11142___NAGf90_Check_Procref_Args3.11143___NAGf90_Check_Procref_Args4.11144___NAGf90_Check_Procref_Args5.11145___NAGf90_Check_Procref.11146___NAGf90_Check_Procref_Args0.11809___NAGf90_Check_Arg.11808___NAGf90_Check_Procref.11810___NAGf90_Check_Procref_Args0.12484___NAGf90_Check_Arg.12483___NAGf90_Check_Procref_Args1.12485___NAGf90_Check_Procref_Args2.12486___NAGf90_Check_Procref_Args3.12487___NAGf90_Check_Procref_Args4.12488___NAGf90_Check_Procref_Args5.12489___NAGf90_Check_Procref_Args6.12490___NAGf90_Check_Procref_Args7.12491___NAGf90_Check_Procref_Args8.12492___NAGf90_Check_Procref_Args9.12493___NAGf90_Check_Procref_Args10.12494___NAGf90_Check_Procref_Args11.12495___NAGf90_Check_Procref_Args12.12496___NAGf90_Check_Procref_Args13.12497___NAGf90_Check_Procref_Args14.12498___NAGf90_Check_Procref_Args15.12499___NAGf90_Check_Procref_Args16.12500___NAGf90_Check_Procref_Args17.12501___NAGf90_Check_Procref_Args18.12502___NAGf90_Check_Procref_Args19.12503___NAGf90_Check_Procref_Args20.12504___NAGf90_Check_Procref_Args21.12505___NAGf90_Check_Procref_Args22.12506___NAGf90_Check_Procref_Args23.12507___NAGf90_Check_Procref_Args24.12508___NAGf90_Check_Procref_Args25.12509___NAGf90_Check_Procref.12510___NAGf90_Check_Procref_Args0.13313___NAGf90_Check_Arg.13312___NAGf90_Check_Procref_Args1.13314___NAGf90_Check_Procref_Args2.13315___NAGf90_Check_Procref_Args3.13316___NAGf90_Check_Procref_Args4.13317___NAGf90_Check_Procref_Args5.13318___NAGf90_Check_Procref.13319___NAGf90_Check_Procref_Args0.14315___NAGf90_Check_Arg.14314___NAGf90_Check_Procref_Args1.14316___NAGf90_Check_Procref_Args2.14317___NAGf90_Check_Procref.14318___NAGf90_Check_Procref_Args0.14548___NAGf90_Check_Arg.14547___NAGf90_Check_Procref_Args1.14549___NAGf90_Check_Procref_Args2.14550___NAGf90_Check_Procref.14551___NAGf90_Check_Procref_Args0.15435___NAGf90_Check_Arg.15434___NAGf90_Check_Procref.15436___NAGf90_Check_Procref_Args0.15600___NAGf90_Check_Arg.15599___NAGf90_Check_Procref_Args1.15601___NAGf90_Check_Procref.15602___NAGf90_Check_Procref_Args0.15907___NAGf90_Check_Arg.15906___NAGf90_Check_Procref_Args1.15908___NAGf90_Check_Procref.15909___NAGf90_Check_Procref_Args0.16678___NAGf90_Check_Arg.16677___NAGf90_Check_Procref.16679___NAGf90_Check_Procref_Args0.16821___NAGf90_Check_Arg.16820___NAGf90_Check_Procref.16822___NAGf90_Check_Procref_Args0.16964___NAGf90_Check_Arg.16963___NAGf90_Check_Procref.16965___NAGf90_Check_Procref_Args0.17111___NAGf90_Check_Arg.17110___NAGf90_Check_Procref_Args1.17112___NAGf90_Check_Procref_Args2.17113___NAGf90_Check_Procref.17114_aConst1.17108_aConst2.17109___NAGf90_Check_Procref_Args0.17296___NAGf90_Check_Arg.17295___NAGf90_Check_Procref_Args1.17297___NAGf90_Check_Procref_Args2.17298___NAGf90_Check_Procref_Args3.17299___NAGf90_Check_Procref_Args4.17300___NAGf90_Check_Procref_Args5.17301___NAGf90_Check_Procref_Args6.17302___NAGf90_Check_Procref_Args7.17303___NAGf90_Check_Procref_Args8.17304___NAGf90_Check_Procref_Args9.17305___NAGf90_Check_Procref_Args10.17306___NAGf90_Check_Procref_Args11.17307___NAGf90_Check_Procref.17308___NAGf90_Check_Procref_Args0.17689___NAGf90_Check_Arg.17688___NAGf90_Check_Procref.17690___NAGf90_Check_Procref_Args0.17928___NAGf90_Check_Arg.17927___NAGf90_Check_Procref_Args1.17929___NAGf90_Check_Procref_Args2.17930___NAGf90_Check_Procref_Args3.17931___NAGf90_Check_Procref_Args4.17932___NAGf90_Check_Procref_Args5.17933___NAGf90_Check_Procref_Args6.17934___NAGf90_Check_Procref_Args7.17935___NAGf90_Check_Procref_Args8.17936___NAGf90_Check_Procref_Args9.17937___NAGf90_Check_Procref_Args10.17938___NAGf90_Check_Procref_Args11.17939___NAGf90_Check_Procref_Args12.17940___NAGf90_Check_Procref_Args13.17941___NAGf90_Check_Procref_Args14.17942___NAGf90_Check_Procref_Args15.17943___NAGf90_Check_Procref_Args16.17944___NAGf90_Check_Procref.17945___NAGf90_Check_Procref_Args0.18746___NAGf90_Check_Arg.18745___NAGf90_Check_Procref_Args1.18747___NAGf90_Check_Procref_Args2.18748___NAGf90_Check_Procref_Args3.18749___NAGf90_Check_Procref_Args4.18750___NAGf90_Check_Procref_Args5.18751___NAGf90_Check_Procref.18752___NAGf90_Check_Procref_Args0.19041___NAGf90_Check_Arg.19040___NAGf90_Check_Procref_Args1.19042___NAGf90_Check_Procref_Args2.19043___NAGf90_Check_Procref_Args3.19044___NAGf90_Check_Procref_Args4.19045___NAGf90_Check_Procref_Args5.19046___NAGf90_Check_Procref_Args6.19047___NAGf90_Check_Procref_Args7.19048___NAGf90_Check_Procref_Args8.19049___NAGf90_Check_Procref_Args9.19050___NAGf90_Check_Procref_Args10.19051___NAGf90_Check_Procref_Args11.19052___NAGf90_Check_Procref_Args12.19053___NAGf90_Check_Procref_Args13.19054___NAGf90_Check_Procref_Args14.19055___NAGf90_Check_Procref_Args15.19056___NAGf90_Check_Procref_Args16.19057___NAGf90_Check_Procref.19058___NAGf90_Check_Procref_Args0.20227___NAGf90_Check_Arg.20226___NAGf90_Check_Procref_Args1.20228___NAGf90_Check_Procref_Args2.20229___NAGf90_Check_Procref_Args3.20230___NAGf90_Check_Procref_Args4.20231___NAGf90_Check_Procref_Args5.20232___NAGf90_Check_Procref_Args6.20233___NAGf90_Check_Procref.20234___NAGf90_Check_Procref_Args0.20967___NAGf90_Check_Arg.20966___NAGf90_Check_Procref_Args1.20968___NAGf90_Check_Procref_Args2.20969___NAGf90_Check_Procref_Args3.20970___NAGf90_Check_Procref.20971___NAGf90_Check_Procref_Args0.21103___NAGf90_Check_Arg.21102___NAGf90_Check_Procref_Args1.21104___NAGf90_Check_Procref.21105___NAGf90_Check_Procref_Args0.21364___NAGf90_Check_Arg.21363___NAGf90_Check_Procref_Args1.21365___NAGf90_Check_Procref_Args2.21366___NAGf90_Check_Procref_Args3.21367___NAGf90_Check_Procref_Args4.21368___NAGf90_Check_Procref.21369___NAGf90_Check_Procref_Args0.21924___NAGf90_Check_Arg.21923___NAGf90_Check_Procref_Args1.21925___NAGf90_Check_Procref.21926___NAGf90_Check_Procref_Args0.22177___NAGf90_Check_Arg.22176___NAGf90_Check_Procref_Args1.22178___NAGf90_Check_Procref.22179___NAGf90_Check_Procref_Args0.22508___NAGf90_Check_Arg.22507___NAGf90_Check_Procref_Args1.22509___NAGf90_Check_Procref_Args2.22510___NAGf90_Check_Procref_Args3.22511___NAGf90_Check_Procref_Args4.22512___NAGf90_Check_Procref_Args5.22513___NAGf90_Check_Procref_Args6.22514___NAGf90_Check_Procref.22515___NAGf90_Check_Procref_Args0.23304___NAGf90_Check_Arg.23303___NAGf90_Check_Procref_Args1.23305___NAGf90_Check_Procref.23306___NAGf90_Check_Procref_Args0.23436___NAGf90_Check_Arg.23435___NAGf90_Check_Procref_Args1.23437___NAGf90_Check_Procref.23438___NAGf90_Check_Procref_Args0.23717___NAGf90_Check_Arg.23716___NAGf90_Check_Procref_Args1.23718___NAGf90_Check_Procref_Args2.23719___NAGf90_Check_Procref_Args3.23720___NAGf90_Check_Procref_Args4.23721___NAGf90_Check_Procref_Args5.23722___NAGf90_Check_Procref_Args6.23723___NAGf90_Check_Procref_Args7.23724___NAGf90_Check_Procref_Args8.23725___NAGf90_Check_Procref_Args9.23726___NAGf90_Check_Procref_Args10.23727___NAGf90_Check_Procref.23728_start_col_.23731___NAGf90_Check_Procref_Args0.24816___NAGf90_Check_Arg.24815___NAGf90_Check_Procref_Args1.24817___NAGf90_Check_Procref_Args2.24818___NAGf90_Check_Procref_Args3.24819___NAGf90_Check_Procref_Args4.24820___NAGf90_Check_Procref.24821___NAGf90_Check_Procref_Args0.25138___NAGf90_Check_Arg.25137___NAGf90_Check_Procref_Args1.25139___NAGf90_Check_Procref_Args2.25140___NAGf90_Check_Procref_Args3.25141___NAGf90_Check_Procref_Args4.25142___NAGf90_Check_Procref.25143___NAGf90_Check_Procref_Args0.25574___NAGf90_Check_Arg.25573___NAGf90_Check_Procref_Args1.25575___NAGf90_Check_Procref_Args2.25576___NAGf90_Check_Procref_Args3.25577___NAGf90_Check_Procref_Args4.25578___NAGf90_Check_Procref_Args5.25579___NAGf90_Check_Procref_Args6.25580___NAGf90_Check_Procref.25581___NAGf90_Check_Procref_Args0.26114___NAGf90_Check_Arg.26113___NAGf90_Check_Procref_Args1.26115___NAGf90_Check_Procref_Args2.26116___NAGf90_Check_Procref_Args3.26117___NAGf90_Check_Procref.26118___NAGf90_Check_Procref_Args0.26393___NAGf90_Check_Arg.26392___NAGf90_Check_Procref_Args1.26394___NAGf90_Check_Procref.26395___NAGf90_Check_Procref_Args0.26515___NAGf90_Check_Arg.26514___NAGf90_Check_Procref.26516___NAGf90_Check_Procref_Args0.26699___NAGf90_Check_Arg.26698___NAGf90_Check_Procref_Args1.26700___NAGf90_Check_Procref_Args2.26701___NAGf90_Check_Procref_Args3.26702___NAGf90_Check_Procref_Args4.26703___NAGf90_Check_Procref_Args5.26704___NAGf90_Check_Procref.26705___NAGf90_Check_Procref_Args0.27400___NAGf90_Check_Arg.27399___NAGf90_Check_Procref_Args1.27401___NAGf90_Check_Procref.27402___NAGf90_Check_Procref_Args0.27598___NAGf90_Check_Arg.27597___NAGf90_Check_Procref_Args1.27599___NAGf90_Check_Procref_Args2.27600___NAGf90_Check_Procref_Args3.27601___NAGf90_Check_Procref_Args4.27602___NAGf90_Check_Procref_Args5.27603___NAGf90_Check_Procref.27604___NAGf90_Check_Procref_Args0.28299___NAGf90_Check_Arg.28298___NAGf90_Check_Procref_Args1.28300___NAGf90_Check_Procref.28301___NAGf90_Check_Procref_Args0.28489___NAGf90_Check_Arg.28488___NAGf90_Check_Procref_Args1.28490___NAGf90_Check_Procref.28491___NAGf90_Check_Procref_Args0.28743___NAGf90_Check_Arg.28742___NAGf90_Check_Procref_Args1.28744___NAGf90_Check_Procref_Args2.28745___NAGf90_Check_Procref_Args3.28746___NAGf90_Check_Procref_Args4.28747___NAGf90_Check_Procref_Args5.28748___NAGf90_Check_Procref_Args6.28749___NAGf90_Check_Procref_Args7.28750___NAGf90_Check_Procref_Args8.28751___NAGf90_Check_Procref_Args9.28752___NAGf90_Check_Procref.28753___NAGf90_Check_Procref_Args0.29449___NAGf90_Check_Arg.29448___NAGf90_Check_Procref_Args1.29450___NAGf90_Check_Procref.29451___NAGf90_Check_Procref_Args0.29611___NAGf90_Check_Arg.29610___NAGf90_Check_Procref_Args1.29612___NAGf90_Check_Procref.29613___NAGf90_Check_Procref_Args0.29862___NAGf90_Check_Arg.29861___NAGf90_Check_Procref_Args1.29863___NAGf90_Check_Procref.29864___NAGf90_Check_Procref_Args0.30118___NAGf90_Check_Arg.30117___NAGf90_Check_Procref_Args1.30119___NAGf90_Check_Procref_Args2.30120___NAGf90_Check_Procref_Args3.30121___NAGf90_Check_Procref_Args4.30122___NAGf90_Check_Procref_Args5.30123___NAGf90_Check_Procref_Args6.30124___NAGf90_Check_Procref_Args7.30125___NAGf90_Check_Procref_Args8.30126___NAGf90_Check_Procref_Args9.30127___NAGf90_Check_Procref_Args10.30128___NAGf90_Check_Procref_Args11.30129___NAGf90_Check_Procref_Args12.30130___NAGf90_Check_Procref_Args13.30131___NAGf90_Check_Procref_Args14.30132___NAGf90_Check_Procref_Args15.30133___NAGf90_Check_Procref_Args16.30134___NAGf90_Check_Procref_Args17.30135___NAGf90_Check_Procref_Args18.30136___NAGf90_Check_Procref_Args19.30137___NAGf90_Check_Procref_Args20.30138___NAGf90_Check_Procref_Args21.30139___NAGf90_Check_Procref_Args22.30140___NAGf90_Check_Procref_Args23.30141___NAGf90_Check_Procref_Args24.30142___NAGf90_Check_Procref_Args25.30143___NAGf90_Check_Procref.30144___NAGf90_Check_Procref_Args0.30773___NAGf90_Check_Arg.30772___NAGf90_Check_Procref.30774___NAGf90_Check_Arg.31307___NAGf90_Check_Procref_Args0.31308___NAGf90_Check_Procref_Args1.31309___NAGf90_Check_Procref.31310___NAGf90_Check_Arg.31673___NAGf90_Check_Procref_Args0.31674___NAGf90_Check_Procref_Args1.31675___NAGf90_Check_Procref.31676___NAGf90_Check_Procref_Args0.32109___NAGf90_Check_Arg.32108___NAGf90_Check_Procref_Args1.32110___NAGf90_Check_Procref_Args2.32111___NAGf90_Check_Procref.32112___NAGf90_Check_Procref_Args0.32686___NAGf90_Check_Arg.32685___NAGf90_Check_Procref_Args1.32687___NAGf90_Check_Procref_Args2.32688___NAGf90_Check_Procref_Args3.32689___NAGf90_Check_Procref_Args4.32690___NAGf90_Check_Procref_Args5.32691___NAGf90_Check_Procref_Args6.32692___NAGf90_Check_Procref.32693___NAGf90_Check_Procref_Args0.33638___NAGf90_Check_Arg.33637___NAGf90_Check_Procref_Args1.33639___NAGf90_Check_Procref_Args2.33640___NAGf90_Check_Procref.33641___NAGf90_Check_Procref_Args0.34055___NAGf90_Check_Arg.34054___NAGf90_Check_Procref_Args1.34056___NAGf90_Check_Procref_Args2.34057___NAGf90_Check_Procref.34058___NAGf90_Check_Arg.34479___NAGf90_Check_Procref_Args0.34480___NAGf90_Check_Procref.34481___NAGf90_Check_Arg.34807___NAGf90_Check_Procref_Args0.34808___NAGf90_Check_Procref_Args1.34809___NAGf90_Check_Procref_Args2.34810___NAGf90_Check_Procref_Args3.34811___NAGf90_Check_Procref_Args4.34812___NAGf90_Check_Procref_Args5.34813___NAGf90_Check_Procref.34814___NAGf90_Check_Procref_Args0.34947___NAGf90_Check_Arg.34946___NAGf90_Check_Procref.34948___NAGf90_Check_Procref_Args0.35242___NAGf90_Check_Arg.35241___NAGf90_Check_Procref_Args1.35243___NAGf90_Check_Procref_Args2.35244___NAGf90_Check_Procref_Args3.35245___NAGf90_Check_Procref_Args4.35246___NAGf90_Check_Procref_Args5.35247___NAGf90_Check_Procref_Args6.35248___NAGf90_Check_Procref_Args7.35249___NAGf90_Check_Procref_Args8.35250___NAGf90_Check_Procref_Args9.35251___NAGf90_Check_Procref_Args10.35252___NAGf90_Check_Procref.35253___NAGf90_Check_Procref_Args0.35766___NAGf90_Check_Arg.35765___NAGf90_Check_Procref_Args1.35767___NAGf90_Check_Procref.35768_number_len_.36004___NAGf90_Check_Procref_Args0.36350___NAGf90_Check_Arg.36349___NAGf90_Check_Procref_Args1.36351___NAGf90_Check_Procref_Args2.36352___NAGf90_Check_Procref.36353___NAGf90_Check_Procref_Args0.36600___NAGf90_Check_Arg.36599___NAGf90_Check_Procref_Args1.36601___NAGf90_Check_Procref_Args2.36602___NAGf90_Check_Procref_Args3.36603___NAGf90_Check_Procref.36604___NAGf90_Check_Arg.37087___NAGf90_Check_Procref_Args0.37088___NAGf90_Check_Procref_Args1.37089___NAGf90_Check_Procref_Args2.37090___NAGf90_Check_Procref.37091___NAGf90_Check_Arg.37304___NAGf90_Check_Procref_Args0.37305___NAGf90_Check_Procref_Args1.37306___NAGf90_Check_Procref_Args2.37307___NAGf90_Check_Procref_Args3.37308___NAGf90_Check_Procref_Args4.37309___NAGf90_Check_Procref_Args5.37310___NAGf90_Check_Procref_Args6.37311___NAGf90_Check_Procref_Args7.37312___NAGf90_Check_Procref_Args8.37313___NAGf90_Check_Procref_Args9.37314___NAGf90_Check_Procref_Args10.37315___NAGf90_Check_Procref_Args11.37316___NAGf90_Check_Procref_Args12.37317___NAGf90_Check_Procref_Args13.37318___NAGf90_Check_Procref_Args14.37319___NAGf90_Check_Procref_Args15.37320___NAGf90_Check_Procref_Args16.37321___NAGf90_Check_Procref.37322___NAGf90_Check_Procref_Args0.37716___NAGf90_Check_Arg.37715___NAGf90_Check_Procref_Args1.37717___NAGf90_Check_Procref_Args2.37718___NAGf90_Check_Procref_Args3.37719___NAGf90_Check_Procref.37720___NAGf90_Check_Procref_Args0.38366___NAGf90_Check_Arg.38365___NAGf90_Check_Procref_Args1.38367___NAGf90_Check_Procref_Args2.38368___NAGf90_Check_Procref.38369___NAGf90_Check_Procref_Args0.38564___NAGf90_Check_Arg.38563___NAGf90_Check_Procref_Args1.38565___NAGf90_Check_Procref_Args2.38566___NAGf90_Check_Procref_Args3.38567___NAGf90_Check_Procref.38568___NAGf90_Check_Procref_Args0.39206___NAGf90_Check_Arg.39205___NAGf90_Check_Procref_Args1.39207___NAGf90_Check_Procref_Args2.39208___NAGf90_Check_Procref.39209___NAGf90_Check_Procref_Args0.39396___NAGf90_Check_Arg.39395___NAGf90_Check_Procref_Args1.39397___NAGf90_Check_Procref.39398___NAGf90_Check_Procref_Args0.39636___NAGf90_Check_Arg.39635___NAGf90_Check_Procref_Args1.39637___NAGf90_Check_Procref.39638___NAGf90_Check_Procref_Args0.39779___NAGf90_Check_Arg.39778___NAGf90_Check_Procref_Args1.39780___NAGf90_Check_Procref.39781___NAGf90_Check_Procref_Args0.39922___NAGf90_Check_Arg.39921___NAGf90_Check_Procref_Args1.39923___NAGf90_Check_Procref.39924___NAGf90_Check_Procref_Args0.40065___NAGf90_Check_Arg.40064___NAGf90_Check_Procref_Args1.40066___NAGf90_Check_Procref.40067___NAGf90_Check_Procref_Args0.40213___NAGf90_Check_Arg.40212___NAGf90_Check_Procref_Args1.40214___NAGf90_Check_Procref_Args2.40215___NAGf90_Check_Procref_Args3.40216___NAGf90_Check_Procref_Args4.40217___NAGf90_Check_Procref.40218___NAGf90_Check_Procref_Args0.40488___NAGf90_Check_Arg.40487___NAGf90_Check_Procref_Args1.40489___NAGf90_Check_Procref.40490___NAGf90_Check_Procref_Args0.40631___NAGf90_Check_Arg.40630___NAGf90_Check_Procref_Args1.40632___NAGf90_Check_Procref.40633___NAGf90_Check_Procref_Args0.40779___NAGf90_Check_Arg.40778___NAGf90_Check_Procref_Args1.40780___NAGf90_Check_Procref_Args2.40781___NAGf90_Check_Procref_Args3.40782___NAGf90_Check_Procref_Args4.40783___NAGf90_Check_Procref_Args5.40784___NAGf90_Check_Procref.40785___NAGf90_Check_Procref_Args0.41056___NAGf90_Check_Arg.41055___NAGf90_Check_Procref_Args1.41057___NAGf90_Check_Procref.41058___NAGf90_Check_Procref_Args0.41213___NAGf90_Check_Arg.41212___NAGf90_Check_Procref_Args1.41214___NAGf90_Check_Procref_Args2.41215___NAGf90_Check_Procref_Args3.41216___NAGf90_Check_Procref_Args4.41217___NAGf90_Check_Procref.41218___NAGf90_Check_Procref_Args0.41499___NAGf90_Check_Arg.41498___NAGf90_Check_Procref_Args1.41500___NAGf90_Check_Procref.41501___NAGf90_Check_Procref_Args0.41923___NAGf90_Check_Arg.41922___NAGf90_Check_Procref_Args1.41924___NAGf90_Check_Procref_Args2.41925___NAGf90_Check_Procref_Args3.41926___NAGf90_Check_Procref_Args4.41927___NAGf90_Check_Procref_Args5.41928___NAGf90_Check_Procref.41929___NAGf90_Check_Procref_Args0.42192___NAGf90_Check_Arg.42191___NAGf90_Check_Procref_Args1.42193___NAGf90_Check_Procref_Args2.42194___NAGf90_Check_Procref.42195___NAGf90_Check_Procref_Args0.42414___NAGf90_Check_Arg.42413___NAGf90_Check_Procref_Args1.42415___NAGf90_Check_Procref.42416___NAGf90_Check_Procref_Args0.42583___NAGf90_Check_Arg.42582___NAGf90_Check_Procref_Args1.42584___NAGf90_Check_Procref_Args2.42585___NAGf90_Check_Procref_Args3.42586___NAGf90_Check_Procref_Args4.42587___NAGf90_Check_Procref_Args5.42588___NAGf90_Check_Procref_Args6.42589___NAGf90_Check_Procref_Args7.42590___NAGf90_Check_Procref_Args8.42591___NAGf90_Check_Procref_Args9.42592___NAGf90_Check_Procref_Args10.42593___NAGf90_Check_Procref_Args11.42594___NAGf90_Check_Procref_Args12.42595___NAGf90_Check_Procref_Args13.42596___NAGf90_Check_Procref_Args14.42597___NAGf90_Check_Procref_Args15.42598___NAGf90_Check_Procref_Args16.42599___NAGf90_Check_Procref_Args17.42600___NAGf90_Check_Procref.42601___NAGf90_Check_Procref_Args0.43012___NAGf90_Check_Arg.43011___NAGf90_Check_Procref_Args1.43013___NAGf90_Check_Procref_Args2.43014___NAGf90_Check_Procref_Args3.43015___NAGf90_Check_Procref.43016___NAGf90_Check_Procref_Args0.43083___NAGf90_Check_Arg.43082___NAGf90_Check_Procref_Args1.43084___NAGf90_Check_Procref_Args2.43085___NAGf90_Check_Procref_Args3.43086___NAGf90_Check_Procref_Args4.43087___NAGf90_Check_Procref_Args5.43088___NAGf90_Check_Procref_Args6.43089___NAGf90_Check_Procref_Args7.43090___NAGf90_Check_Procref_Args8.43091___NAGf90_Check_Procref.43092___NAGf90_Check_Procref_Args0.43246___NAGf90_Check_Arg.43245___NAGf90_Check_Procref_Args1.43247___NAGf90_Check_Procref_Args2.43248___NAGf90_Check_Procref_Args3.43249___NAGf90_Check_Procref.43250___NAGf90_Check_Procref_Args0.43649___NAGf90_Check_Arg.43648___NAGf90_Check_Procref.43650___NAGf90_Check_Procref_Args0.45434___NAGf90_Check_Arg.45433___NAGf90_Check_Procref_Args1.45435___NAGf90_Check_Procref.45436_aConst1.46027___NAGf90_Check_Procref_Args0.46726___NAGf90_Check_Arg.46725___NAGf90_Check_Procref.46727___NAGf90_Check_Procref_Args0.46923___NAGf90_Check_Arg.46922___NAGf90_Check_Procref.46924___NAGf90_Check_Procref_Args0.46968___NAGf90_Check_Arg.46967___NAGf90_Check_Procref.46969___NAGf90_Check_Procref_Args0.47020___NAGf90_Check_Arg.47019___NAGf90_Check_Procref.47021___NAGf90_Check_Procref_Args0.47101___NAGf90_Check_Arg.47100___NAGf90_Check_Procref.47102___NAGf90_Check_Procref_Args0.47146___NAGf90_Check_Arg.47145___NAGf90_Check_Procref.47147___NAGf90_Check_Procref_Args0.47191___NAGf90_Check_Arg.47190___NAGf90_Check_Procref.47192___NAGf90_Check_Procref_Args0.47236___NAGf90_Check_Arg.47235___NAGf90_Check_Procref.47237___NAGf90_Check_Procref_Args0.47288___NAGf90_Check_Arg.47287___NAGf90_Check_Procref_Args1.47289___NAGf90_Check_Procref.47290___NAGf90_Check_Procref_Args0.47380___NAGf90_Check_Arg.47379___NAGf90_Check_Procref_Args1.47381___NAGf90_Check_Procref.47382___NAGf90_Check_Procref_Args0.47535___NAGf90_Check_Arg.47534___NAGf90_Check_Procref_Args1.47536___NAGf90_Check_Procref_Args2.47537___NAGf90_Check_Procref_Args3.47538___NAGf90_Check_Procref_Args4.47539___NAGf90_Check_Procref_Args5.47540___NAGf90_Check_Procref.47541_aConst1.47691___NAGf90_Check_Procref_Args0.47772___NAGf90_Check_Arg.47771___NAGf90_Check_Procref.47773___NAGf90_Check_Procref_Args0.47831___NAGf90_Check_Arg.47830___NAGf90_Check_Procref.47832___NAGf90_Check_Procref_Args0.48083___NAGf90_Check_Arg.48082___NAGf90_Check_Procref_Args1.48084___NAGf90_Check_Procref.48085___NAGf90_Check_Procref_Args0.48367___NAGf90_Check_Arg.48366___NAGf90_Check_Procref_Args1.48368___NAGf90_Check_Procref_Args2.48369___NAGf90_Check_Procref_Args3.48370___NAGf90_Check_Procref_Args4.48371___NAGf90_Check_Procref.48372___NAGf90_Check_Procref_Args0.48518___NAGf90_Check_Arg.48517___NAGf90_Check_Procref_Args1.48519___NAGf90_Check_Procref_Args2.48520___NAGf90_Check_Procref_Args3.48521___NAGf90_Check_Procref.48522___NAGf90_Check_Procref_Args0.48745___NAGf90_Check_Arg.48744___NAGf90_Check_Procref_Args1.48746___NAGf90_Check_Procref.48747___NAGf90_Check_Procref_Args0.48895___NAGf90_Check_Arg.48894___NAGf90_Check_Procref_Args1.48896___NAGf90_Check_Procref_Args2.48897___NAGf90_Check_Procref_Args5.48898___NAGf90_Check_Procref_Args6.48899___NAGf90_Check_Procref_Args7.48900___NAGf90_Check_Procref_Args12.48901___NAGf90_Check_Procref_Args15.48902___NAGf90_Check_Procref_Args16.48903___NAGf90_Check_Procref_Args17.48904___NAGf90_Check_Procref_Args18.48905___NAGf90_Check_Procref_Args19.48906___NAGf90_Check_Procref_Args20.48907___NAGf90_Check_Procref.48908___NAGf90_Check_Procref_Args0.51376___NAGf90_Check_Arg.51375___NAGf90_Check_Procref_Args1.51377___NAGf90_Check_Procref.51378___NAGf90_Check_Procref_Args0.51457___NAGf90_Check_Arg.51456___NAGf90_Check_Procref_Args1.51458___NAGf90_Check_Procref_Args2.51459___NAGf90_Check_Procref_Args3.51460___NAGf90_Check_Procref.51461___NAGf90_Check_Procref_Args0.51554___NAGf90_Check_Arg.51553___NAGf90_Check_Procref_Args1.51555___NAGf90_Check_Procref.51556___NAGf90_Check_Procref_Args0.51661___NAGf90_Check_Arg.51660___NAGf90_Check_Procref_Args1.51662___NAGf90_Check_Procref_Args2.51663___NAGf90_Check_Procref_Args3.51664___NAGf90_Check_Procref_Args4.51665___NAGf90_Check_Procref_Args5.51666___NAGf90_Check_Procref_Args6.51667___NAGf90_Check_Procref_Args7.51668___NAGf90_Check_Procref_Args8.51669___NAGf90_Check_Procref_Args9.51670___NAGf90_Check_Procref_Args10.51671___NAGf90_Check_Procref_Args11.51672___NAGf90_Check_Procref_Args12.51673___NAGf90_Check_Procref_Args13.51674___NAGf90_Check_Procref_Args14.51675___NAGf90_Check_Procref_Args15.51676___NAGf90_Check_Procref.51677___NAGf90_Check_Procref_Args0.52136___NAGf90_Check_Arg.52135___NAGf90_Check_Procref.52137___NAGf90_Check_Procref_Args0.52226___NAGf90_Check_Arg.52225___NAGf90_Check_Procref_Args1.52227___NAGf90_Check_Procref.52228___open_specs_tmp_17_.52457___NAGf90_Check_Procref_Args0.52453___NAGf90_Check_Arg.52452___NAGf90_Check_Procref.52454___NAGf90_Check_Procref_Args0.52555___NAGf90_Check_Arg.52554___NAGf90_Check_Procref_Args1.52556___NAGf90_Check_Procref.52557_pgsize_pointer_misc_allocatable_misc_ordinary_misc_pointer_huge_allocatable_huge_ordinary_huge_coco_VAR_number_of_names__coco_VAR_optind__coco_VAR_output_file__coco_VAR_input_file__coco_VAR_i__coco_VAR_options__coco_VAR_source_file_list__coco_VAR_line__coco_VAR_set_file__coco_VAR_log_file___ftf_.6366__ftf_.6443__ftf_.6561__ftf_.6824__ftf_.7093__ftf_.7451__ftf_.7808_coco_VAR_predefined_macros___ftf_.8066__ftf_.8324__ftf_.8584__ftf_.8705__ftf_.8815__ftf_.8961__ftf_.9355__ftf_.9540__ftf_.11813__ftf_.12522__ftf_.14556__ftf_.14858__ftf_.15011__ftf_.15164__ftf_.15315__ftf_.15439__ftf_.15605__ftf_.15912__ftf_.16204__ftf_.16361__ftf_.16518__ftf_.16681__ftf_.16824__ftf_.16967__ftf_.17117__ftf_.17315__ftf_.17693__ftf_.17957_coco_VAR_asis_stmt__coco_VAR_total___ftf_.18756__ftf_.19070__ioctx_.19067___ifile_tmp_2_.19069__ftf_.20237__ftf_.20974__ftf_.21108__ftf_.21375__ftf_.21930__ftf_.22185__ftf_.22519_coco_VAR_asis_len___ftf_.23310__ftf_.23441__ftf_.23733___ifile_tmp_3_.23730__ioctx_.23732__ftf_.24823__ftf_.25145__ftf_.25586__ftf_.26123__ftf_.26397__ftf_.26518__ftf_.26709_coco_VAR_all_constants___ftf_.27407__ftf_.27608__ftf_.28306__ftf_.28494__ftf_.28766___ifile_tmp_4_.28763__ioctx_.28760__ftf_.29453__ftf_.29615__ftf_.29866__ftf_.30151__ftf_.30781_out_idx_.30778_asis_idx_.30779_quote_.30782__ftf_.31122_char_context_.31125_quote_.31124__ftf_.31314_coco_VAR_wrap_len___ftf_.31682__ftf_.32119__ftf_.32703__ftf_.33648__ftf_.34066___ifile_tmp_5_.34067__ioctx_.34065__ftf_.34487__ftf_.34816__ftf_.34953__ioctx_.34950_coco_VAR_count_include_in_dot___ftf_.35770__ftf_.36003___ifile_tmp_6_.36002__ioctx_.36001__ftf_.36356__ioctx_.36355__ftf_.36607__ioctx_.36606__ftf_.37002__ftf_.37095_statement_len_.37094_continuation_lines_.37093__ftf_.37724__ftf_.38374__ftf_.38572__ftf_.39214__ftf_.39401__ftf_.39641_too_many_wrap_statements_.39640__ftf_.39783_too_many_verbose_statements_.39784__ftf_.39927_too_many_report_statements_.39926__ftf_.40069_too_many_post_statements_.40070__ftf_.40222_too_many_output_statements_.40224__ftf_.40493_too_many_number_statements_.40492__ftf_.40636_too_many_mark_statements_.40635__ftf_.40791_too_many_logfile_statements_.40789__ftf_.41060_too_many_keys_directives_.41061__ftf_.41225_coco_VAR_name_file___ioctx_.41224__ftf_.41504_current_directory_.41503__ftf_.41770__ftf_.41935__ftf_.42198_too_many_form_statements_.42197__ftf_.42419_too_many_alter_statements_.42418__ftf_.42603__ftf_.43019__ioctx_.43018__ftf_.43096__ioctx_.43095__ftf_.43254_coco_VAR_cl_set_file___ioctx_.43252__ftf_.43660__ioctx_.43657___ifile_tmp_8_.43652___ifile_tmp_9_.43653___ifile_tmp_10_.43654___ifile_tmp_11_.43655___ifile_tmp_12_.43656__ftf_.45441__ioctx_.45438__ftf_.46031__ioctx_.46029__ftf_.46730__ioctx_.46729__ftf_.46927_too_many_wrap_options_.46926_coco_VAR_cl_options___ftf_.46971_too_many_verbose_options_.46972__ftf_.47023_too_many_set_file_options_.47024__ftf_.47105_too_many_report_options_.47104__ftf_.47150_too_many_postpend_options_.47149__ftf_.47194_too_many_number_options_.47195__ftf_.47240_too_many_mark_options_.47239__ftf_.47293_too_many_log_file_options_.47292__ftf_.47384_too_many_keys_directives_.47385__ftf_.47547__ftf_.47695__ioctx_.47693__ftf_.47776_too_many_fixed_options_.47775__ftf_.47835__ftf_.48088__ftf_.48376__ftf_.48524_too_many_alter_options_.48526__ftf_.48752_coco_VAR_nargs___ftf_.48915__ioctx_.48913__ftf_.49520___ifile_tmp_13_.49521__ioctx_.49519__ftf_.49975__ioctx_.49974___ifile_tmp_14_.49976___ifile_tmp_15_.49977___ifile_tmp_16_.49972__ftf_.50956__ftf_.51071__ftf_.51158__ftf_.51381__ftf_.51464__ftf_.51558__ftf_.51681__ioctx_.51680__ftf_.52139__ftf_.52230__ftf_.52456__ftf_.52560_coco_VAR_log_line___ftf_.52861_coco_VAR_outside_any_if_construct__NXArgc_NXArgv___NAGf90_ReAlloc___NAGf90_aAlloc___NAGf90_aDeAlloc___NAGf90_allocatable_ql___NAGf90_allocatable_ql2___NAGf90_allocatable_tail___NAGf90_allocatable_tail2___NAGf90_fast_deallocation_allowed___NAGf90_init___NAGf90_laAlloc___NAGf90_laDeAlloc___NAGf90_line_ReAlloc___NAGf90_loAlloc___NAGf90_loDeAlloc___NAGf90_loaDeAlloc___NAGf90_lpAlloc___NAGf90_lpDeAlloc___NAGf90_lzaAlloc___NAGf90_lzoAlloc___NAGf90_lzpAlloc___NAGf90_oAlloc___NAGf90_oDeAlloc___NAGf90_oaDeAlloc___NAGf90_ordinary_ql___NAGf90_ordinary_ql2___NAGf90_ordinary_tail___NAGf90_ordinary_tail2___NAGf90_pAlloc___NAGf90_pDeAlloc___NAGf90_pointer_ql2___NAGf90_pointer_tail2___NAGf90_procref___NAGf90_zaAlloc___NAGf90_zoAlloc___NAGf90_zpAlloc___progname__mh_execute_header_coco_DT_file_tHEADER_coco_DT_if_tHEADER_coco_DT_integer_tHEADER_coco_DT_logical_tHEADER_coco_DT_macro_tHEADER_coco_DT_path_tHEADER_coco_DT_predefined_tHEADER_coco_DT_report_tHEADER_coco_DT_state_tHEADER_coco_DT_symbol_tHEADER_coco_DT_text_tHEADER_coco_MP__macro_tcopy_coco_MP__macro_tfinalise_coco_MP__macro_tinitialise_coco_MP__text_tcopy_coco_MP__text_tfinalise_coco_MP__text_tinitialise_environ_f90_init_f90_init1_f90_init2_mainstart__DefaultRuneLocale___NAGf90_associate_pointer___NAGf90_badptr3_line___NAGf90_cdangle_Deallocate_s___NAGf90_cdangling_aDeAlloc___NAGf90_charcmp___NAGf90_chindex1___NAGf90_chindex1b___NAGf90_closef___NAGf90_crash___NAGf90_date_and_time_line___NAGf90_destroy_pointer___NAGf90_disassociate_target_because___NAGf90_end_inquire___NAGf90_end_read_internal___NAGf90_end_read_sequential___NAGf90_end_write_ifile___NAGf90_end_write_sequential___NAGf90_establish_format___NAGf90_f90_init1_dll___NAGf90_f90_init2_dll___NAGf90_f90_init_dll___NAGf90_fmt_read_ch___NAGf90_fmt_read_i___NAGf90_fmt_write_ch___NAGf90_fmt_write_i___NAGf90_freemem___NAGf90_getarg___NAGf90_getcmd___NAGf90_getenv___NAGf90_getmem___NAGf90_iargc___NAGf90_init_dll___NAGf90_inquire_file___NAGf90_inquire_opened___NAGf90_inquire_unit___NAGf90_line_Alloc_zvar___NAGf90_line_Allocate_aac___NAGf90_line_Allocate_s___NAGf90_line_DeAlloc_o___NAGf90_line_chfree___NAGf90_openf2___NAGf90_pagecolour___NAGf90_pu_bad_cdtype_line___NAGf90_read_internal_file___NAGf90_read_sequential___NAGf90_readu_optf2___NAGf90_rewindf___NAGf90_rtcrash___NAGf90_rterr___NAGf90_scalar_ifilex___NAGf90_scan___NAGf90_set_ioctx_nonadvancing___NAGf90_stat_errmsg___NAGf90_stop_line___NAGf90_verify___NAGf90_write_ifile___NAGf90_write_sequential___NAGf90_writeu_optf2___error___maskrune___memcpy_chk___srget___stack_chk_fail___stack_chk_guard___stderrp___stdinp___stdoutp___swbuf___toupper__exit_abort_access_alarm_atan_atan2_atanf_atoi_ceil_chdir_chmod_chown_clearerr_closedir_cos_cosf_cosh_coshf_ctermid_execl_execlp_execv_execve_execvp_exit_exp2_expm1_expm1f_fclose_fdopen_feof_ferror_fetestexcept_fflush_fileno_finite_floor_floorf_fmod_fmodf_fopen_fork_fprintf_fputs_fread_freopen_frexp_fseek_fseeko_fstat_ftell_ftello_ftruncate_fwrite_getc_getcwd_getegid_getenv_geteuid_getgid_getgroups_gethostname_getlogin_getpagesize_getpgrp_getpid_getppid_getrusage_gettimeofday_getuid_hypotf_isatty_islower_ldexp_link_localtime_r_log2_memchr_memcmp_memcpy_memmove_memset_mkdir_mkfifo_mkstemp_mmap_munmap_nanosleep_open_opendir_pause_pow_powf_putc_readdir_r_remainder_remainderf_rename_rewind_rewinddir_rint_rintf_rmdir_scalbnf_setenv_setgid_setpgid_setsid_setuid_setvbuf_sigaction_signal_sin_sinf_sinh_sinhf_sleep_sprintf_stat_strchr_strcmp_strcpy_strerror_sysconf_system_tan_tanf_tanh_tanhf_time_times_toupper_ttyname_umask_uname_ungetc_unlink_utime_vsnprintf_wait_waitpiddyld_stub_binderDay-III/06-coco/coco.f90100777 0 0 1661775 11740037326 10045 0! bof ! ********************************************************************** ! Fortran 2008 program coco ! ********************************************************************** ! Source Control Strings ! $Id: coco.f90,v 2.9 2012/04/07 13:16:36 dan Exp $ ! ********************************************************************** ! Copyright 2003-2011 Dan Nagle ! All Rights Reserved ! This program is free software; you can redistribute it and/or ! modify it under the terms of the GNU General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public ! License along with this program; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, or make other technical comments, ! to the Authors, Contact: ! Dan Nagle ! send email to danlnagle@me.com ! ********************************************************************** ! coco implements Part 3: Conditional Compilation ! ********************************************************************** ! coco compilation: ! $ fc -std coco.f90 -o coco ! where fc is your Fortran compiler ! and -std is your compiler's option to check for standards conformance ! coco has been compiled using ! nagfor -f2008 -w=all -C=all coco.f90 -o coco ! nagfor -V ! NAG Fortran Compiler Release 5.3(854) ! coco has been compiled using ! ifort -std -warn all -check all coco.f90 -o coco ! ifort --version ! ifort (IFORT) 12.1.0 20111011 ! ifort (IFORT) 12.1.2 20111207 ! ifort (IFORT) 12.1.3 20120130 ! coco has been compiled using ! gfortran -std=f2008 -Wall -fcheck=all coco.f90 -o coco ! gfortran --version ! GNU Fortran (GCC) 4.6.2 20111019 (prerelease) ! No reason is known why other standards-complaint compilers would not work. ! ********************************************************************** ! coco reads ! input source file(s)- named via command line, or stdin ! named set file- name taken from the output file name, or coco.set ! coco writes ! output source file- named via command line, or stdout ! log file- named via ??logfile directive, or stderr ! coco temp files ! scratch- hold the contents of text blocks while counting their size ! coco uses (if your compiler doesn't support the f03 command line intrinsics) ! f2kcli (http://www.winteracter.com/f2kcli) ! iso_fortran_env: input_unit, output_unit, error_unit ! or else define them (perhaps in the units section of the code) ! a popular choice is input_unit= 5, output_unit= 6, error_unit= 0 ! coco constants ! coco_rcs_id- this file's rcs id string ! *_unit- logical unit numbers ! *_fmt- formats ! *_len- lengths of character entities ! alter_*- the alter states ! if_*- the current state of if-directive processing ! coco types ! file_t- file name and unit ! path_t- include directory ! symbol_t- integer, logical, macro, text symbol ! if_t- if block and state ! state_t- set of options ! report_t- statistics ! coco data ! coco library ! ********************************************************************** ! coco ! ********************************************************************** program coco ! coco implements ISO/IEC 1539-3 Conditional Compilation standard with extensions ! coco steps ! 1. call process_command_line() to read command line, get file names & options ! 2. call process_setfile() to read the set file, if there is one ! 3. open the output file, if named, use stdout if not ! 4. open the input file(s), if named, use stdin if not ! 5. call process_input_file() to process the input file(s) & write the output file ! 6. copy the set file contents to the output file ! 7. close all files ! 8. call write_report() to print summary information ! ********************************************************************** ! coco uses modules ! ********************************************************************** ! get preconnected units from intrinsic environment module ! if your compiler doesn't support the intrinsic module, ! define these below before the other units use, intrinsic :: iso_fortran_env, only: input_unit, output_unit, error_unit ! if your compiler does not support f03 command line processing (most do) ! you might use f2kcli available from http://www.winteracter.com/f2kcli ! ********************************************************************** ! explicit declaration implicit none ! ********************************************************************** ! coco RCS strings ! ********************************************************************** ! program source file name supplied by RCS character( len= *), parameter :: coco_rcs_id = & '$Id: coco.f90,v 2.9 2012/04/07 13:16:36 dan Exp $' ! ********************************************************************** ! coco constants ! ********************************************************************** ! coco logical unit numbers ! scheme for logical unit numbers: ! The set file is read first and processed. ! The set file is then closed. The output is opened ! (if need be), and then the input file is opened (again, if need be). ! If an include file is encountered, the logical unit numbers used are ! computed by adding to the current input unit number. If the current ! input file is stdin, read_unit is used first, then successive unit ! numbers are used for nested include files. When all input files have ! been read, the set scratch file is copied to the output file. All ! Fortran files are then closed. The summary is written to the output. ! A text block is copied to the text_unit to count the number of lines. ! Then it is copied back to a character array and the text_unit is closed. ! ********************************************************************** ! global constants ! ********************************************************************** ! input/output units ! ---------------------------------------------------------------------- ! log file unit else use error_unit, + 4 tries to avoid plot_unit, punch_unit, others integer, parameter :: log_unit = max( input_unit, output_unit, error_unit, 6) + 4 ! scratch unit for name scratch file, if any integer, parameter :: name_unit = log_unit + 1 ! scratch unit for text scratch files integer, parameter :: text_unit = name_unit + 1 ! set file unit integer, parameter :: set_unit = text_unit + 1 ! output unit if named output file (else use unit= *) integer, parameter :: write_unit = set_unit + 1 ! first input unit if named input file (else use unit= *) (includes increment this unit) integer, parameter :: read_unit = write_unit + 1 ! ---------------------------------------------------------------------- ! formats ! ---------------------------------------------------------------------- ! used to read/write lines character( len= *), parameter :: string_fmt = '( a)' ! used to write reports character( len= *), parameter :: integer_fmt = '( a: i10)' ! used to write reports character( len= *), parameter :: directory_fmt = '( a: i0: a)' ! length of format strings integer, parameter :: format_len = max( len( string_fmt), len( integer_fmt) ) ! length of input/output specifier strings integer, parameter :: io_specifier_len = 16 ! ---------------------------------------------------------------------- ! conversion of strings to integers- 10 digits supports 32 bit values ! ---------------------------------------------------------------------- ! length of strings used to convert between integers and characters integer, parameter :: conversion_len = 10 ! format used to convert between integers and characters character( len= *), parameter :: conversion_fmt = '( i10)' ! ********************************************************************** ! coco character lengths ! ********************************************************************** ! these are the lengths of strings used throughout coco ! ---------------------------------------------------------------------- ! blank character character( len= *), parameter :: blank = ' ' ! length of character storing a constant or variable name integer, parameter :: symbol_name_len = 31 ! length of a Fortran source line integer, parameter :: free_form_len = 132 integer, parameter :: card_image_len = 80 integer, parameter :: fixed_form_len = 72 ! length of character storing file names integer, parameter :: file_name_len = 256 ! length of character line buffers (allows for max_continuations number of continuations) integer, parameter :: max_continuations = 39 ! buffer a whole coco statement and always have a blank at the end integer, parameter :: buffer_len = ( max_continuations + 1) * free_form_len + 1 ! length to hold a processor error message integer, parameter :: processor_msg_len = 1024 ! no message yet from the processor character( len= *), parameter :: no_processor_msg = repeat( string= blank, ncopies= processor_msg_len) ! ********************************************************************** ! this string is used to initialize character variables ! ---------------------------------------------------------------------- ! null string character( len= *), parameter :: null_string = '' ! ---------------------------------------------------------------------- ! mark beginning of the set file in the output character( len= *), parameter :: mark_set_file = & '?? This was produced using the following SET file' ! mark beginning of the next input file in the output character( len= *), parameter :: mark_input_file = & '?? End of file - next file is ' ! ---------------------------------------------------------------------- ! names must be made of alphanumeric characters only character( len= *), parameter :: alpha_chars = 'abcdefghijklmnopqrstuvwxyz' character( len= *), parameter :: digit_chars = '0123456789' character( len= *), parameter :: underscore = '_' character( len= *), parameter :: alphanum_chars = alpha_chars // digit_chars // underscore ! ********************************************************************** ! coco directives constants ! ********************************************************************** ! many character string constants' lengths are used to count past ! the string as coco processes each statement ! coco line and statement syntax uses the next set of character constants ! ********************************************************************** ! . separates file names from extensions, delimits logical operators & literals character( len= *), parameter :: dot = '.' ! ---------------------------------------------------------------------- ! character is special to getopt() and used to separate hh and mm, and mm and ss character( len= *), parameter :: colon = ':' ! ---------------------------------------------------------------------- ! characters defining coco directives, comments, separators, and so on ! ---------------------------------------------------------------------- ! coco line key ??coco_directive character( len= *), parameter :: coco_key = '??' ! the default substitution key character( len= *), parameter :: arg_key = '?' ! acceptable key characters character( len= *), parameter :: ok_key_list = '?~`@#$^{}|\:' ! length of ?name? integer, parameter :: target_len = len( arg_key) + symbol_name_len + len( arg_key) ! continuation character character( len= *), parameter :: continuation = '&' ! ascii tab character character( len= *), parameter :: tab = achar( 9) ! whitespace is blank or tab character( len= *), parameter :: white_space = blank // tab ! coco comment initializer character( len= *), parameter :: comment = '!' ! separates items within a list character( len= *), parameter :: comma = ',' ! quotes character( len= *), parameter :: single_quote = "'" character( len= *), parameter :: double_quote = '"' ! ********************************************************************** ! process_logical_declaration() constants ! ---------------------------------------------------------------------- ! process name[=value][,name[=value]]... character( len= *), parameter :: end_of_decl = comma // blank ! ---------------------------------------------------------------------- ! constants defining coco (integer or logical) operators, constants, and similar ! ---------------------------------------------------------------------- ! minus sign character( len= *), parameter :: minus = '-' ! plus sign character( len= *), parameter :: plus = '+' ! times sign character( len= *), parameter :: times = '*' ! slash and division sign character( len= *), parameter :: slash = '/' ! backslash and modulus sign character( len= *), parameter :: backslash = '\' ! ---------------------------------------------------------------------- ! logical binary operators character( len= *), parameter :: or_str = '.or.' character( len= *), parameter :: and_str = '.and.' character( len= *), parameter :: eqv_str = '.eqv.' character( len= *), parameter :: neqv_str = '.neqv.' ! ---------------------------------------------------------------------- ! logical uniary operator character( len= *), parameter :: not_str = '.not.' ! ---------------------------------------------------------------------- ! logical literals character( len= *), parameter :: true_str = '.true.' character( len= *), parameter :: false_str = '.false.' ! ---------------------------------------------------------------------- ! the archaic versions of the relational operators character( len= *), parameter :: dot_eq = '.eq.' character( len= *), parameter :: dot_ne = '.ne.' character( len= *), parameter :: dot_gt = '.gt.' character( len= *), parameter :: dot_ge = '.ge.' character( len= *), parameter :: dot_le = '.le.' character( len= *), parameter :: dot_lt = '.lt.' ! the modern versions of the relational operators character( len= *), parameter :: ch_eq = '==' character( len= *), parameter :: ch_ne = '/=' character( len= *), parameter :: ch_gt = '>' character( len= *), parameter :: ch_ge = '>=' character( len= *), parameter :: ch_le = '<=' character( len= *), parameter :: ch_lt = '<' ! ---------------------------------------------------------------------- ! strings used to declare symbol names and values ! ---------------------------------------------------------------------- ! equal sign character( len= *), parameter :: equals = '=' ! open parenthesis character( len= *), parameter :: open_paren = '(' ! close parenthesis character( len= *), parameter :: close_paren = ')' ! ---------------------------------------------------------------------- ! directives which must appear in the set file ! ---------------------------------------------------------------------- ! alter directive character( len= *), parameter :: alter_str = 'alter:' ! directory declaration character( len= *), parameter :: directory_str = 'directory' ! form directive allows setting free form or fixed form from the set file character( len= *), parameter :: form_str = 'form:' ! set the key characters character( len= *), parameter :: keys_str = 'keys:' ! log file declaration character( len= *), parameter :: logfile_str = 'logfile' ! mark directive controls placing message in output for each new input read after the first character( len= *), parameter :: mark_str = 'mark:' ! number directive controls placing "! file: line" strings on source lines character( len= *), parameter :: number_str = 'number:' ! post directive controls postpending the setfile at the end of the output character( len= *), parameter :: post_str = 'post:' ! report directive causes writing a report report after processing character( len= *), parameter :: summary_str = 'report:' ! verbose directive causes operation with more messages issued character( len= *), parameter :: verbose_str = 'verbose:' ! wrap directive controls line wrapping character( len= *), parameter :: wrap_str = 'wrap:' ! ---------------------------------------------------------------------- ! name input files in set file directive character( len= *), parameter :: input_str = 'input' ! name the output file in set file directive character( len= *), parameter :: output_str = 'output' ! ---------------------------------------------------------------------- ! directives which may appear in the set file or source file ! ---------------------------------------------------------------------- ! integer declaration character( len= *), parameter :: integer_str = 'integer::' ! integer constant declaration character( len= *), parameter :: integer_constant_str = 'integer,parameter::' ! logical declaration character( len= *), parameter :: logical_str = 'logical::' ! logical constant declaration character( len= *), parameter :: logical_constant_str = 'logical,parameter::' ! ---------------------------------------------------------------------- ! directives which must appear in the source file ! ---------------------------------------------------------------------- ! include directive character( len= *), parameter :: include_str = 'include' ! ---------------------------------------------------------------------- ! stop directive character( len= *), parameter :: stop_str = 'stop' ! ---------------------------------------------------------------------- ! message directive character( len= *), parameter :: message_str = 'message' ! ---------------------------------------------------------------------- ! if directive character( len= *), parameter :: if_str = 'if(' ! ---------------------------------------------------------------------- ! else if directive character( len= *), parameter :: elseif_str = 'elseif(' ! ---------------------------------------------------------------------- ! )then must close an if( or elseif( character( len= *), parameter :: then_str = ')then' ! ---------------------------------------------------------------------- ! else directive character( len= *), parameter :: else_str = 'else' ! ---------------------------------------------------------------------- ! endif directive character( len= *), parameter :: endif_str = 'endif' ! ---------------------------------------------------------------------- ! directives which are extensions ! ---------------------------------------------------------------------- ! macro declaration character( len= *), parameter :: macro_str = 'macro::' ! macro declaration character( len= *), parameter :: macro_parens_str = 'macro,parens::' ! ---------------------------------------------------------------------- ! assert directive (the open paren is treated as part of the assert expression) character( len= *), parameter :: assert_str = 'assert' ! ---------------------------------------------------------------------- ! cmdline directive character( len= *), parameter :: cmdline_str = 'cmdline' ! document directive character( len= *), parameter :: document_str = 'document' ! options directive character( len= *), parameter :: options_str = 'options' ! repport directive character( len= *), parameter :: report_str = 'report' ! symbols directive character( len= *), parameter :: symbols_str = 'symbols' ! ---------------------------------------------------------------------- ! text directive (the end text string is in process_text_directive() ) character( len= *), parameter :: text_str = 'text::' ! text directive character( len= *), parameter :: text_parens_str = 'text,parens::' ! copy directive character( len= *), parameter :: copy_str = 'copy::' ! ---------------------------------------------------------------------- ! endfile directive character( len= *), parameter :: endfile_str = 'endfile' ! ---------------------------------------------------------------------- ! these strings are parts of directives ! ---------------------------------------------------------------------- ! on directive character( len= *), parameter :: on_str = 'on' ! off directive character( len= *), parameter :: off_str = 'off' ! form free directive character( len= *), parameter :: free_str = 'free' ! form fixed directive character( len= *), parameter :: fixed_str = 'fixed' ! ********************************************************************** ! possible states encountered during execution ! ---------------------------------------------------------------------- ! codes for possible alter states integer, parameter :: alter_none = 0 integer, parameter :: alter_delete = 1 integer, parameter :: alter_blank = 2 integer, parameter :: alter_shift_0 = 3 integer, parameter :: alter_shift_1 = 4 integer, parameter :: alter_shift_3 = 5 ! ---------------------------------------------------------------------- ! codes for possible if construct phases integer, parameter :: outside_block = 0 integer, parameter :: if_block = 1 integer, parameter :: elseif_block = 2 integer, parameter :: else_block = 3 integer, parameter :: text_block = 4 integer, parameter :: include_block = 5 ! ---------------------------------------------------------------------- ! indexes of predefined macros integer, parameter :: file_idx = 1 integer, parameter :: line_idx = 2 integer, parameter :: date_idx = 3 integer, parameter :: time_idx = 4 integer, parameter :: coco_idx = 5 integer, parameter :: setfile_idx = 6 integer, parameter :: logfile_idx = 7 integer, parameter :: output_idx = 8 integer, parameter :: cmdline_idx = 9 integer, parameter :: user_idx = 10 integer, parameter :: cwd_idx = 11 integer, parameter :: incpath_idx = 12 integer, parameter :: predefined_size = incpath_idx - file_idx + 1 ! ********************************************************************** ! communication with getopt() ! ---------------------------------------------------------------------- ! getopt() 'no more arguments' integer, parameter :: end_of_args = -1 ! getopt() 'not in optltrs' character( len= *), parameter :: unknown_option = '?' ! coco usage (error message) character( len= *), parameter :: usage_msg = & 'usage: coco [ -V | -h | [[ opts ] [--] [ basename | output input [...]]]' ! ********************************************************************** ! null string constants ! ---------------------------------------------------------------------- ! file name when there is no file name character( len= file_name_len), parameter :: null_file_name = repeat( string= blank, ncopies= file_name_len) ! symbol name when there is no symbol name character( len= symbol_name_len), parameter :: null_symbol_name = repeat( string= blank, ncopies= symbol_name_len) ! macro value when there is no macro value character( len= buffer_len), parameter :: null_macro_value = repeat( string= blank, ncopies= buffer_len) ! default file name constants character( len= *), parameter :: input_file_name = '' character( len= *), parameter :: output_file_name = '' character( len= *), parameter :: log_file_name = '' ! ---------------------------------------------------------------------- ! suffix used to construct output file name if one name is on the command line character( len= *), parameter :: output_suffix = '.f90' ! suffix when fixed form processing is requested character( len= *), parameter :: fixed_suffix = '.f' ! ********************************************************************** ! ********************************************************************** ! coco types ! ********************************************************************** ! coco files and search paths ! ---------------------------------------------------------------------- ! file type type :: file_t integer :: io_unit character( len= file_name_len) :: name_str character( len= format_len) :: format_str character( len= buffer_len), pointer :: line integer :: io_status integer :: lines_transfered logical :: named_file logical :: create end type file_t ! ---------------------------------------------------------------------- ! search location type type :: path_t character( len= file_name_len) :: name_str integer :: times_accessed type( path_t), pointer :: next end type path_t ! ********************************************************************** ! this derived type is used to store coco predefined macros ! ---------------------------------------------------------------------- ! type stores a predefined macro type :: predefined_t character( len= symbol_name_len) :: name_str logical :: referenced character( len= file_name_len) :: referenced_file integer :: referenced_line character( len= buffer_len) :: macro_value end type predefined_t ! ********************************************************************** ! these derived types are used to store coco constants or variables ! ---------------------------------------------------------------------- ! type stores a generic coco symbol type, abstract :: symbol_t character( len= symbol_name_len) :: name_str character( len= file_name_len) :: declared_file integer :: declared_line logical :: referenced character( len= file_name_len) :: referenced_file integer :: referenced_line class( symbol_t), pointer :: next end type symbol_t ! type stores a logical coco symbol type, extends( symbol_t) :: logical_t logical :: defined character( len= file_name_len) :: defined_file integer :: defined_line logical :: constant logical :: sf_defined logical :: cl_defined logical :: logical_value end type logical_t ! type stores an integer coco symbol type, extends( symbol_t) :: integer_t logical :: defined character( len= file_name_len) :: defined_file integer :: defined_line logical :: constant logical :: sf_defined logical :: cl_defined integer :: integer_value end type integer_t ! type stores a macro coco symbol type, extends( symbol_t) :: macro_t logical :: args_in_parens character( len= symbol_name_len), dimension( :), allocatable :: dummy_args character( len= buffer_len), dimension( :), allocatable :: actual_args character( len= buffer_len) :: macro_value end type macro_t ! type stores a text coco symbol type, extends( symbol_t) :: text_t logical :: args_in_parens character( len= symbol_name_len), dimension( :), allocatable :: dummy_args character( len= buffer_len), dimension( :), allocatable :: actual_args character( len= buffer_len), dimension( :), allocatable :: text_lines end type text_t ! ********************************************************************** ! if_t stores the state of an if block ! ---------------------------------------------------------------------- ! if_t type :: if_t logical :: now_selected logical :: ever_selected integer :: phase type( if_t), pointer :: nested type( if_t), pointer :: enclosing end type if_t ! ********************************************************************** ! state_t stores a set of coco options ! ---------------------------------------------------------------------- ! state_t type :: state_t integer :: alter_state logical :: free_form logical :: mark_input logical :: number_source logical :: print_report logical :: postpend_setfile logical :: verbose_mode logical :: wrapping_lines character( len= 2) :: keychars logical :: got_sep_char character( len= 1) :: sep_char end type state_t ! ********************************************************************** ! report_t stores coco statistics ! ---------------------------------------------------------------------- ! report_t records the source and sink of lines type :: report_t integer :: input_lines integer :: input_files integer :: include_files integer :: coco_lines integer :: selected_lines integer :: elided_lines integer :: text_blocks integer :: text_lines integer :: copied_lines end type report_t ! ********************************************************************** ! coco variables ! ********************************************************************** ! option swtiches ! ---------------------------------------------------------------------- ! options actually used and those set from set file type( state_t) :: options ! options from the command line override the set file options type( state_t) :: cl_options ! ---------------------------------------------------------------------- ! the left and right key characters character( len= 1) :: l_key = arg_key character( len= 1) :: r_key = arg_key ! ---------------------------------------------------------------------- ! report totals of event counts type( report_t) :: total ! ---------------------------------------------------------------------- ! if construct outside any if construct type( if_t), target :: outside_any_if_construct ! if construct status type( if_t), pointer :: if_construct ! ---------------------------------------------------------------------- ! coco symbols are stored in a singly linked list class( symbol_t), pointer :: first_symbol class( symbol_t), pointer :: last_symbol ! ---------------------------------------------------------------------- ! coco symbols from the set file class( symbol_t), pointer :: first_sf_symbol class( symbol_t), pointer :: last_sf_symbol ! ---------------------------------------------------------------------- ! coco symbols from the command line class( symbol_t), pointer :: first_cl_symbol class( symbol_t), pointer :: last_cl_symbol ! ---------------------------------------------------------------------- ! predefined macros: file, line, date, time, coco, setfile, logfile, output, cmdline type( predefined_t), dimension( 1: predefined_size) :: predefined_macros ! ---------------------------------------------------------------------- ! mark when non constants are used to provide a value for a constant logical :: all_constants ! ---------------------------------------------------------------------- ! options set the wrapping length to either 72 (fixed) or 131 (free) integer :: wrap_len ! ********************************************************************** ! coco file name variables ! ---------------------------------------------------------------------- ! input file, output file, or set file ! ---------------------------------------------------------------------- ! the (first) input file type( file_t), target :: input_file ! ---------------------------------------------------------------------- ! the output file type( file_t), target :: output_file ! ---------------------------------------------------------------------- ! the set file type( file_t), target :: set_file ! the set file named on the command line type( file_t) :: cl_set_file ! ---------------------------------------------------------------------- ! the log file is never the current file type( file_t) :: log_file ! ---------------------------------------------------------------------- ! point to current input file for error messages type( file_t), pointer :: current_file ! hold an error message from the processor character( len= processor_msg_len) :: processor_msg = no_processor_msg ! ---------------------------------------------------------------------- ! a list of source files for reports type( file_t), allocatable, dimension(:) :: source_file_list ! number of file names integer :: number_of_names = 0 ! scratch file to count input names found in the scratch file type( file_t) :: name_file ! ---------------------------------------------------------------------- ! the input/output line buffer character( len= buffer_len), target :: line !integer :: line_len ! the log file line buffer character( len= buffer_len), target :: log_line ! some directive processing peeks at the as-is statement being decoded character( len= buffer_len) :: asis_stmt ! length of the as is statement integer :: asis_len ! ---------------------------------------------------------------------- ! list of include directories is initially . only type( path_t), pointer :: first_directory integer :: count_include_in_dot ! ---------------------------------------------------------------------- ! communicate with getopt() ! ---------------------------------------------------------------------- ! getopt() string returning non-option letter words character( len= file_name_len) :: optarg = null_string ! ---------------------------------------------------------------------- ! number of command line args integer :: nargs ! count command line words integer :: optind = 0 ! ********************************************************************** ! coco local ! ---------------------------------------------------------------------- ! loop index of file name args integer :: i ! ********************************************************************** ! coco text ! ********************************************************************** continue ! ---------------------------------------------------------------------- ! initialize coco program variables call initialize_coco() ! ---------------------------------------------------------------------- ! process command line to get options and file names call process_command_line() ! ---------------------------------------------------------------------- ! see if set file exists and process it if it does call seek_set_file() ! ---------------------------------------------------------------------- ! set option to default values if the command line or the set file hasn't set them call set_option_defaults() ! ---------------------------------------------------------------------- ! open the output file but link not current_file call open_file( output_file) ! ********************************************************************** ! read all input file(s) number_of_input_files: select case( number_of_names) case( 0, 1) number_of_input_files ! process the input file call process_input_file( input_file) ! end of input case default number_of_input_files ! process several input files (1 is the output file) read_all_files: do i = 2, number_of_names ! if marking subsequent input files marking_input: if( options% mark_input .and. i > 2 )then line = mark_input_file // trim( source_file_list( i)% name_str) call write_coco_line( output_file) end if marking_input ! process the input using coco default units call process_input_file( source_file_list( i) ) ! repeat for each input file end do read_all_files ! end of input end select number_of_input_files ! ********************************************************************** ! if the output file has content and the copy is wanted, copy the set file to it made_output: if( output_file% lines_transfered > 0 .and. options% postpend_setfile )then ! mark the set file in the output (whether it is present or not) line = mark_set_file call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! if processed a set file append_set_file: if( set_file% named_file )then ! copy set file file to output call copy_set_file() ! if processed set file end if append_set_file end if made_output ! ---------------------------------------------------------------------- ! close the output file call close_file( output_file) ! ---------------------------------------------------------------------- ! report to log file log_report: if( options% print_report )then call write_report() end if log_report ! ---------------------------------------------------------------------- ! close the log file call close_file( log_file) ! ---------------------------------------------------------------------- ! coco exit stop 'coco normal exit' ! ********************************************************************** ! coco library ! ********************************************************************** contains ! ********************************************************************** ! ********************************************************************** ! initialize_coco() prepares coco for execution subroutine initialize_coco() ! ********************************************************************** ! initialize_coco() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! set default options options = state_t( alter_state= alter_none, free_form= .true., mark_input= .false., number_source= .false., & print_report= .false., verbose_mode= .false., postpend_setfile= .true., wrapping_lines= .true., & keychars= blank, got_sep_char= .false., sep_char= blank) cl_options = options ! initialize report totals total = report_t( input_lines= 0, input_files= 0, include_files= 0, coco_lines= 0, & selected_lines= 0, elided_lines= 0, text_blocks= 0, text_lines= 0, copied_lines= 0) ! files input_file = file_t( io_unit= input_unit, name_str= null_file_name, format_str= string_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .false.) input_file% name_str = input_file_name output_file = file_t( io_unit= output_unit, name_str= null_file_name, format_str= string_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .true.) output_file% name_str = output_file_name set_file = file_t( io_unit= set_unit, name_str= null_file_name, format_str= string_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .false.) cl_set_file = set_file log_file = file_t( io_unit= error_unit, name_str= null_file_name, format_str= integer_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .true.) log_file% name_str = log_file_name name_file = file_t( io_unit= name_unit, name_str= null_file_name, format_str= null_string, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .true.) ! ---------------------------------------------------------------------- ! initialize pointers ! ---------------------------------------------------------------------- ! magic if-block outside any if block outside_any_if_construct = if_t( now_selected= .true., ever_selected= .true., phase= outside_block, & nested= null(), enclosing= null() ) ! initialize if-block structures nullify( if_construct) if_construct => outside_any_if_construct ! ---------------------------------------------------------------------- ! initialize symbols lists nullify( first_symbol) nullify( last_symbol) ! initialize set file symbols lists nullify( first_sf_symbol) nullify( last_sf_symbol) ! initialize command line symbols lists nullify( first_cl_symbol) nullify( last_cl_symbol) ! ---------------------------------------------------------------------- ! set files and lines nullify( current_file) ! initialize include file search path nullify( first_directory) count_include_in_dot = 0 ! ---------------------------------------------------------------------- ! initialize predefined macro names predefined_macros = predefined_t( name_str= null_symbol_name, referenced= .false., & referenced_file= null_file_name, referenced_line= 0, & macro_value= null_macro_value) predefined_macros( file_idx)% name_str = 'file' predefined_macros( line_idx)% name_str = 'line' predefined_macros( date_idx)% name_str = 'date' predefined_macros( time_idx)% name_str = 'time' predefined_macros( coco_idx)% name_str = 'coco' predefined_macros( setfile_idx)% name_str = 'setfile' predefined_macros( logfile_idx)% name_str = 'logfile' predefined_macros( output_idx)% name_str = 'output' predefined_macros( cmdline_idx)% name_str = 'cmdline' predefined_macros( user_idx)% name_str = 'user' predefined_macros( cwd_idx)% name_str = 'cwd' predefined_macros( incpath_idx)% name_str = 'incpath' ! ---------------------------------------------------------------------- ! initialize_coco() exit return ! ********************************************************************** ! initialize_coco() end subroutine initialize_coco ! ********************************************************************** ! ********************************************************************** ! %%% open and close files, write log file messages, parse command line ! ********************************************************************** ! ********************************************************************** ! open_file() open a file and remark subroutine open_file( this_file) ! ********************************************************************** ! open_file() interface ! ---------------------------------------------------------------------- ! the file to be opened type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! open_file() constants ! ---------------------------------------------------------------------- ! open for reading or writing character( len= *), parameter :: read_action = 'read' character( len= *), parameter :: write_action = 'write' ! open existing file or create a new one character( len= *), parameter :: read_status = 'old' character( len= *), parameter :: write_status = 'replace' ! ********************************************************************** ! open_file() local ! ---------------------------------------------------------------------- ! open for reading or writing character( len= io_specifier_len) :: open_status character( len= io_specifier_len) :: open_action ! ********************************************************************** ! open_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! open the file if file is named file_has_name: if( this_file% named_file )then ! establish open parameters for reading or writing direction: if( this_file% create )then open_status = write_status open_action = write_action else direction open_status = read_status open_action = read_action end if direction ! open this file open( unit= this_file% io_unit, & file= this_file% name_str, & status= open_status, & action= open_action, & iostat= this_file% io_status, & iomsg= processor_msg) named_status: if( this_file% io_status > 0 )then call msg_quit( "can't open file: " // trim( this_file% name_str) ) else if( options% verbose_mode )then named_status call msg_continue( "opened file: " // trim( this_file% name_str) ) end if named_status end if file_has_name ! the log file is never the current input file, since it receives error messages current_input_only: select case( this_file% io_unit) case( set_unit, input_unit, read_unit: ) current_file => this_file this_file% line => line case( output_unit, write_unit) this_file% line => line case( log_unit, error_unit) this_file% line => log_line end select current_input_only ! ---------------------------------------------------------------------- ! open_file() exit return ! ********************************************************************** ! open_file() end subroutine open_file ! ********************************************************************** ! ********************************************************************** ! open_scratch() open an unformatted scratch file subroutine open_scratch( this_file) ! ********************************************************************** ! open_scratch() interface ! ---------------------------------------------------------------------- ! the scratch file to be opened type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! open_scratch() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! open the file open( unit= this_file% io_unit, & status= 'scratch', & action= 'readwrite', & form= 'unformatted', & iostat= this_file% io_status, & iomsg= processor_msg) scratch_status: if( this_file% io_status > 0 )then current_file => this_file call msg_quit( "can't open scratch file: ") end if scratch_status ! link to line buffer this_file% line => line ! ---------------------------------------------------------------------- ! open_scratch() exit return ! ********************************************************************** ! open_scratch() end subroutine open_scratch ! ********************************************************************** ! ********************************************************************** ! close_file() close a file and remark subroutine close_file( this_file) ! ********************************************************************** ! close_file() interface ! ---------------------------------------------------------------------- ! the file to be closed type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! close_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! close the named file close_named: if( this_file% named_file )then close( unit= this_file% io_unit, & status= 'keep', & iostat= this_file% io_status, & iomsg= processor_msg) logfile_close: if( this_file% io_unit == log_unit )then this_file% io_unit = error_unit end if logfile_close close_status: if( this_file% io_status > 0 )then call msg_quit( "can't close file: " // trim( this_file% name_str) ) else if( options% verbose_mode )then close_status call msg_continue( "closed file: " // trim( this_file% name_str) ) end if close_status end if close_named ! input file is not connected input_only: select case( this_file% io_unit) case( set_unit, input_unit, read_unit: ) input_only nullify( current_file) end select input_only ! ---------------------------------------------------------------------- ! close_file() exit return ! ********************************************************************** ! close_file() end subroutine close_file ! ********************************************************************** ! ********************************************************************** ! close_scratch() close a file and remark subroutine close_scratch( this_file) ! ********************************************************************** ! close_scratch() interface ! ---------------------------------------------------------------------- ! the scratch file to be closed type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! close_scratch() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! close the scratch file close( unit= this_file% io_unit, & status= 'delete', & iostat= this_file% io_status, & iomsg= processor_msg) close_status: if( this_file% io_status > 0 )then call msg_quit( "can't close scratch file: ") end if close_status ! ---------------------------------------------------------------------- ! close_scratch() exit return ! ********************************************************************** ! close_scratch() end subroutine close_scratch ! ********************************************************************** ! ********************************************************************** ! set_option_defaults() set options to their default values subroutine set_option_defaults() ! ********************************************************************** ! Some options are initially set to absurd values in order to allow ! the command line option to override the corresponding set file directive. ! These options need to be set to useful values after the set file ! has been initially read but before coco further executes. ! These options are: the alter mode and the wrap length. ! The options selected are also made mutually consistent. ! ********************************************************************** ! set_option_defaults() local ! ---------------------------------------------------------------------- ! index of output file name suffix integer :: suffix_idx ! strings to be edited into the line- they are the exact length needed character( len= 8) :: today_str character( len= 10) :: now_str ! check allocate integer :: astat ! if name tmp file was opened logical :: name_open ! ********************************************************************** ! set_option_defaults() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! if input file names didn't come from the command line, get them from the set file inquire( unit= name_file% io_unit, opened= name_open) input_directives: if( name_open )then rewind( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) rewind_error: if( name_file% io_status > 0 )then call msg_quit( "can't rewind input list scratch file") end if rewind_error count_names: select case( number_of_names) case( 1) count_names input_or_output: if( .not. output_file% named_file )then read( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) input_file% name_str read_1_error: if( name_file% io_status > 0 )then call msg_quit( "can't read input name scratch file") end if read_1_error input_file% named_file = .true. input_file% io_unit = read_unit end if input_or_output case( 2: ) count_names last_input: if( .not. output_file% named_file )then number_of_names = number_of_names + 1 end if last_input allocate( source_file_list( 2: number_of_names), stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate input file list") end if alloc_error input_file% io_unit = read_unit input_file% named_file = .true. name_each: do i = 2, number_of_names source_file_list( i) = input_file read( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) source_file_list( i)% name_str read_n_error: if( name_file% io_status > 0 )then call msg_quit( "can't read input list tmp file") end if read_n_error end do name_each call close_scratch( name_file) end select count_names end if input_directives ! ---------------------------------------------------------------------- ! if the command line or the set file hasn't set the alter state, set it to the default cl_alter_set: if( cl_options% alter_state /= alter_none )then options% alter_state = cl_options% alter_state end if cl_alter_set alter_default: if( options% alter_state == alter_none )then options% alter_state = alter_shift_3 end if alter_default ! ---------------------------------------------------------------------- ! free form unless either the command line or the set file requests fixed form options% free_form = options% free_form .and. cl_options% free_form ! set wrapping length and reset output file name if needed wrap_default: if( options% free_form )then wrap_len = free_form_len else wrap_default wrap_len = fixed_form_len name_from_basename: if( output_file% named_file )then suffix_idx = index( output_file% name_str, output_suffix, back= .true.) output_file% name_str( suffix_idx: suffix_idx + len( output_suffix) - 1) = fixed_suffix end if name_from_basename end if wrap_default ! ---------------------------------------------------------------------- ! set the rest of the options from the command line options% mark_input = options% mark_input .or. cl_options% mark_input options% number_source = options% number_source .or. cl_options% number_source options% postpend_setfile = options% postpend_setfile .and. cl_options% postpend_setfile options% print_report = options% print_report .or. cl_options% print_report options% verbose_mode = options% verbose_mode .or. cl_options% verbose_mode ! verbose mode makes a summary report as well options% print_report = options% print_report .or. options% verbose_mode ! ---------------------------------------------------------------------- ! set key characters set_keys_dir: if( options% keychars /= blank )then set_keys_ok: if( check_key_chars_ok( options% keychars) )then l_key = options% keychars( 1: 1) r_key = options% keychars( 2: 2) else set_keys_ok call msg_quit( "unusable key characters from set file: " // options% keychars & // " must be chosen from " // ok_key_list) end if set_keys_ok end if set_keys_dir set_keys_opt: if( cl_options% keychars /= blank )then cl_keys_ok: if( check_key_chars_ok( cl_options% keychars) )then l_key = cl_options% keychars( 1: 1) r_key = cl_options% keychars( 2: 2) else cl_keys_ok call msg_quit( "unusable key characters from command line: " // cl_options% keychars & // " must be chosen from " // ok_key_list) end if cl_keys_ok end if set_keys_opt ! the command line can only disable line wrapping options% wrapping_lines = options% wrapping_lines .and. cl_options% wrapping_lines ! ---------------------------------------------------------------------- ! set values in the prdefined macros call date_and_time( date= today_str, time= now_str) predefined_macros( date_idx)% macro_value = format_date( today_str) predefined_macros( time_idx)% macro_value = format_time( now_str) predefined_macros( coco_idx)% macro_value = coco_rcs_id predefined_macros( setfile_idx)% macro_value = set_file% name_str predefined_macros( logfile_idx)% macro_value = log_file% name_str predefined_macros( output_idx)% macro_value = output_file% name_str ! set value from the coco command line call get_command_line_value( predefined_macros( cmdline_idx)% macro_value) ! set values from the environment call get_user_environment_value( predefined_macros( user_idx)% macro_value) call get_pwd_environment_value( predefined_macros( cwd_idx)% macro_value) ! build incpath value from the include directory list call build_incpath_value( predefined_macros( incpath_idx)% macro_value) ! ---------------------------------------------------------------------- ! try to find the OS file name separator character call seek_sep_char( predefined_macros( cwd_idx)% macro_value) have_sep_char: if( options% got_sep_char )then call check_incpath_dirs() end if have_sep_char ! ---------------------------------------------------------------------- ! set_option_defaults() exit return ! ********************************************************************** ! set_option_defaults() end subroutine set_option_defaults ! ********************************************************************** ! ********************************************************************** ! get_command_line_value() get command line string subroutine get_command_line_value( macro_value) ! ********************************************************************** ! get_command_line_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! get_command_line_value() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: cmdline_len integer :: cl_stat ! ********************************************************************** ! get_command_line_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- call get_command( length= cmdline_len, status= cl_stat) cl_status_error: if( cl_stat > 0 )then call msg_quit( "can't access the command line") end if cl_status_error command_line_too_long: if( cmdline_len > len( macro_value) )then call msg_quit( "command line too long for macro value") end if command_line_too_long call get_command( command= macro_value) ! ---------------------------------------------------------------------- ! get_command_line_value() exit return ! ********************************************************************** ! get_command_line_value() end subroutine get_command_line_value ! ********************************************************************** ! ********************************************************************** ! get_user_environment_value() get command line string subroutine get_user_environment_value( macro_value) ! ********************************************************************** ! get_user_environment_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! get_user_environment_value() constants ! ---------------------------------------------------------------------- ! name of environment variable to fetch character( len= *), parameter :: env_var_name = 'USER' character( len= *), parameter :: alt_env_var_name = 'LOGNAME' ! ********************************************************************** ! get_user_environment_value() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: env_stat ! ********************************************************************** ! get_user_environment_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! try to get USER call get_environment_variable( name= env_var_name, status= env_stat) got_user: if( env_stat == 0 )then call get_environment_variable( name= env_var_name, value= macro_value) return else got_user env_status_error: if( env_stat > 0 )then call msg_continue( "can't access environment variable: " // env_var_name) end if env_status_error env_var_too_long: if( env_stat < 0 )then call msg_quit( "environment variable too long for macro value: " // env_var_name) end if env_var_too_long end if got_user ! if no USER, try to get LOGNAME call get_environment_variable( name= alt_env_var_name, status= env_stat) got_logname: if( env_stat == 0 )then call get_environment_variable( name= alt_env_var_name, value= macro_value) else got_logname alt_env_status_error: if( env_stat > 0 )then call msg_continue( "can't access environment variable: " // alt_env_var_name) end if alt_env_status_error alt_env_var_too_long: if( env_stat < 0 )then call msg_quit( "environment variable too long for macro value: " // alt_env_var_name) end if alt_env_var_too_long end if got_logname ! ---------------------------------------------------------------------- ! get_user_environment_value() exit return ! ********************************************************************** ! get_user_environment_value() end subroutine get_user_environment_value ! ********************************************************************** ! ********************************************************************** ! get_pwd_environment_value() get command line string subroutine get_pwd_environment_value( macro_value) ! ********************************************************************** ! get_pwd_environment_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! get_pwd_environment_value() constants ! ---------------------------------------------------------------------- ! name of environment variable to fetch character( len= *), parameter :: env_var_name = 'PWD' ! ********************************************************************** ! get_pwd_environment_value() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: env_stat ! ********************************************************************** ! get_pwd_environment_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! try to get PWD call get_environment_variable( name= env_var_name, status= env_stat) env_status_error: if( env_stat > 0 )then call msg_continue( "can't access environment variable: " // env_var_name) end if env_status_error env_var_too_long: if( env_stat < 0 )then call msg_quit( "environment variable too long for macro value: " // env_var_name) end if env_var_too_long call get_environment_variable( name= env_var_name, value= macro_value) ! ---------------------------------------------------------------------- ! get_pwd_environment_value() exit return ! ********************************************************************** ! get_pwd_environment_value() end subroutine get_pwd_environment_value ! ********************************************************************** ! ********************************************************************** ! build_incpath_value() get command line string subroutine build_incpath_value( macro_value) ! ********************************************************************** ! build_incpath_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! build_incpath_value() constants ! ---------------------------------------------------------------------- character( len= *), parameter :: default_path = dot ! ********************************************************************** ! build_incpath_value() local ! ---------------------------------------------------------------------- type( path_t), pointer :: path_ptr ! ********************************************************************** ! build_incpath_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- macro_value = default_path nullify( path_ptr) path_ptr => first_directory scan_path: do if( .not. associated( path_ptr) ) exit scan_path macro_value = trim( macro_value) // blank // path_ptr% name_str path_ptr => path_ptr% next end do scan_path ! ---------------------------------------------------------------------- ! build_incpath_value() exit return ! ********************************************************************** ! build_incpath_value() end subroutine build_incpath_value ! ********************************************************************** ! ********************************************************************** ! seek_sep_char() try to find the OS file name separator character subroutine seek_sep_char( pwd) ! ********************************************************************** ! seek_sep_char() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( in) :: pwd ! ********************************************************************** ! seek_sep_char() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: char_idx ! ********************************************************************** ! seek_sep_char() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! first seek slash in pwd char_idx = index( string= pwd, substring= slash) got_slash: if( char_idx > 0 )then options% sep_char = slash options% got_sep_char = .true. return end if got_slash ! next seek backslash in pwd char_idx = index( string= pwd, substring= backslash) got_backslash: if( char_idx > 0 )then options% sep_char = backslash options% got_sep_char = .true. return end if got_backslash ! next seek colon in pwd char_idx = index( string= pwd, substring= colon) got_colon: if( char_idx > 0 )then options% sep_char = colon options% got_sep_char = .true. return end if got_colon ! ---------------------------------------------------------------------- ! seek_sep_char() exit return ! ********************************************************************** ! seek_sep_char() end subroutine seek_sep_char ! ********************************************************************** ! ********************************************************************** ! check_incpath_dirs() get command line string subroutine check_incpath_dirs() ! ********************************************************************** ! check_incpath_dirs() interface ! ---------------------------------------------------------------------- ! ********************************************************************** ! check_incpath_dirs() local ! ---------------------------------------------------------------------- type( path_t), pointer :: path_ptr integer :: dir_lt ! ********************************************************************** ! check_incpath_dirs() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- nullify( path_ptr) path_ptr => first_directory scan_path: do if( .not. associated( path_ptr) ) exit scan_path dir_lt = len_trim( path_ptr% name_str) fix_missing_sep: if( path_ptr% name_str( dir_lt: dir_lt) /= options% sep_char )then path_ptr% name_str( dir_lt + 1: dir_lt + 1) = options% sep_char end if fix_missing_sep path_ptr => path_ptr% next end do scan_path ! ---------------------------------------------------------------------- ! check_incpath_dirs() exit return ! ********************************************************************** ! check_incpath_dirs() end subroutine check_incpath_dirs ! ********************************************************************** ! ********************************************************************** ! msg_quit() process error and stop subroutine msg_quit( msg) ! ********************************************************************** ! msg_quit() interface ! ---------------------------------------------------------------------- ! the error message character( len= *), intent( in) :: msg ! ********************************************************************** ! msg_quit() local ! ---------------------------------------------------------------------- ! strings conatining the line number and iostat of the failed operation character( len= conversion_len) :: number_str character( len= conversion_len) :: iostat_str ! construct a message that might include a processor message character( len= processor_msg_len) :: quit_msg ! ********************************************************************** ! msg_quit() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! is there a processor message to include? have_processor_message: if( processor_msg /= no_processor_msg )then quit_msg = msg // blank // processor_msg else have_processor_message quit_msg = msg end if have_processor_message ! if file is associated with this error file_msg: if( associated( current_file) )then ! if a line is associated with this error line_msg: if( associated( current_file% line) )then write( unit= log_file% io_unit, fmt= log_file% format_str) trim( current_file% line) end if line_msg ! if io error caused this error io_error: if( current_file% io_status > 0 )then ! decode line number & iostat write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered write( unit= iostat_str, fmt= conversion_fmt) current_file% io_status ! write error message with file data write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco error: file: ' & // trim( current_file% name_str) // ', line: ' // trim( adjustl( number_str)) & // ', ' // ', iostat: ' // trim( adjustl( iostat_str)) // ': ' // trim( quit_msg) ! if io error caused not this error else io_error ! decode line number write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered ! write error message with file data write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco error: file: ' & // trim( current_file% name_str) // ', line: ' // trim( adjustl( number_str)) & // ', ' // trim( quit_msg) end if io_error ! if file associated not with this error else file_msg ! write error message without file data write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco error: ' // trim( quit_msg) end if file_msg ! ---------------------------------------------------------------------- ! msg_quit() exit stop 'coco error exit' ! ********************************************************************** ! msg_quit() end subroutine msg_quit ! ********************************************************************** ! ********************************************************************** ! msg_continue() print message or continue processing subroutine msg_continue( msg) ! ********************************************************************** ! msg_continue() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( in) :: msg ! ********************************************************************** ! msg_continue() local ! ---------------------------------------------------------------------- ! string containing the current input line number character( len= conversion_len) :: number_str ! ********************************************************************** ! msg_continue() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! if file associated with this message file_msg: if( associated( current_file) )then ! decode line number write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered ! write message with file data write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco message: file: ' & // trim( current_file% name_str) // ', line: ' // trim( adjustl( number_str)) & // ': ' // msg) ! if file associated not with this message else file_msg ! write message without file data write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco message: ' // msg) end if file_msg ! ---------------------------------------------------------------------- ! msg_continue() exit return ! ********************************************************************** ! msg_continue() end subroutine msg_continue ! ********************************************************************** ! ********************************************************************** ! process_command_line() process command line subroutine process_command_line() ! ********************************************************************** ! process_command_line calls getopt() to get any options, then ! process_command_line gets file names from the command line ! ********************************************************************** ! default coco file names constants ! ********************************************************************** ! input file name constants ! ---------------------------------------------------------------------- ! suffix used to construct input file name if one name is on the command line character( len= *), parameter :: input_suffix = dot // 'fpp' ! ********************************************************************** ! set file constants ! ---------------------------------------------------------------------- ! suffix used to construct set file name if name is on the command line character( len= *), parameter :: set_suffix = dot // 'set' ! ********************************************************************** ! suffix length integer, parameter :: suffix_len = & max( len( input_suffix), len( output_suffix), len( set_suffix) ) ! ********************************************************************** ! other command line constants ! ---------------------------------------------------------------------- ! coco communicate with getopt() ! ---------------------------------------------------------------------- ! valid option letters character( len= *), parameter :: opt_letters = 'a:D:FhI:k:l:mnprs:vVw ' ! ********************************************************************** ! process_command_line local ! ---------------------------------------------------------------------- ! getopt() option letter integer :: optltr ! input file names character( len= file_name_len) :: argword ! dot divides basename and suffix integer :: basename_len ! loop through input file names integer :: i ! allocation status integer :: astat ! ********************************************************************** ! process_command_line() text ! ---------------------------------------------------------------------- continue ! get number of command line args nargs = command_argument_count() ! do until end of args is returned optltr = getopt( opt_letters) ! process options cl_args: do if( optltr == end_of_args) exit cl_args ! select which option which_option: select case( char( optltr)) ! ---------------------------------------------------------------------- ! set the alter state case( 'a') which_option call process_alter_option( optarg) ! declare a symbol case( 'D') which_option call process_define_option( optarg) ! set source form to fixed case( 'F') which_option call process_fixed_option() ! help case( 'h') which_option call print_help() stop 'coco normal exit' ! set directories to search for include files case( 'I') which_option call process_include_option( optarg) ! set the left and right key characters for finding macros case( 'k') which_option call process_key_option( optarg) ! set log file (NOTE: optarg has len= file_name_len, so no overflow can occur.) case( 'l') which_option call process_log_file_option( optarg) ! turn on marking input files case( 'm') which_option call process_mark_option() ! turn on line numbers case( 'n') which_option call process_number_option() ! turn off copy of setfile case( 'p') which_option call process_postpend_option() ! write summary report case( 'r') which_option call process_report_option() ! name set file case( 's') which_option call process_set_file_option( optarg) ! turn on verbose case( 'v') which_option call process_verbose_option() ! print coco version data case( 'V') which_option write( unit= error_unit, fmt= string_fmt) coco_rcs_id stop 'coco normal exit' ! turn off line wrapping case( 'w') which_option call process_wrap_option() ! command line error case default which_option write( unit= error_unit, fmt= string_fmt) usage_msg stop 'coco error exit' end select which_option ! ---------------------------------------------------------------------- optltr = getopt( opt_letters) end do cl_args ! ---------------------------------------------------------------------- ! the rest of the command line words (if any) must be file names ! ---------------------------------------------------------------------- ! number of command line args left unprocessed args_left: if( optarg == unknown_option )then number_of_names = nargs - optind optind = optind + 1 no_more_args: if( number_of_names > 0 )then call get_cl_arg_check_len( optind, optarg) end if no_more_args else args_left number_of_names = nargs - optind + 1 end if args_left ! ---------------------------------------------------------------------- ! process file names file_names: select case( number_of_names) ! ---------------------------------------------------------------------- ! one file name arg case( 1) file_names ! check that basename is not too long base_too_long: if( ( len_trim( optarg) + suffix_len) > file_name_len )then call msg_quit( 'file name too long: ' // trim( optarg) ) end if base_too_long ! use basename to make input file name input_file% io_unit = read_unit input_file% named_file = .true. input_file% name_str = trim( optarg) // input_suffix ! use basename to make output file name output_file% io_unit = write_unit output_file% named_file = .true. output_file% name_str = trim( optarg) // output_suffix ! use basename to make set file file name set_file% io_unit = set_unit set_file% named_file = .true. set_file% name_str = trim( optarg) // set_suffix ! ---------------------------------------------------------------------- ! more than one file name arg case( 2: ) file_names ! read source from read_unit input_file% io_unit = read_unit input_file% named_file = .true. ! allocate source file list allocate( source_file_list( 2: number_of_names), stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate input file array") end if alloc_error ! set up output file output_file% io_unit = write_unit output_file% named_file = .true. output_file% name_str = optarg ! compute set file name basename_len = index( output_file% name_str, dot, back= .true.) no_dot: if( basename_len == 0 )then basename_len = len_trim( output_file% name_str) + len( dot) end if no_dot ! check that set file name is not too long set_too_long: if( basename_len + suffix_len > file_name_len )then call msg_quit( 'set file name too long: ' // trim( output_file% name_str) // set_suffix ) end if set_too_long ! use output file name to make set file file name set_file% io_unit = set_unit set_file% named_file = .true. set_file% name_str = output_file% name_str( 1: basename_len - len( dot)) // set_suffix ! record input files in source file list list_inputs: do i = 2, number_of_names ! establish the components of this input file except the name source_file_list( i) = input_file ! get next arg string optind = optind + 1 call get_cl_arg_check_len( optind, argword) source_file_list( i)% name_str = argword end do list_inputs ! only possible values end select file_names ! ---------------------------------------------------------------------- ! process_command_line() exit return ! ********************************************************************** ! process_command_line() end subroutine process_command_line ! ********************************************************************** ! ********************************************************************** ! getopt() return next known option from command line or unknown integer function getopt( optstring) ! ********************************************************************** ! getopt() interface ! ---------------------------------------------------------------------- ! the string of valid option letters character( len= *), intent( in) :: optstring ! ********************************************************************** ! getopt() constants ! ---------------------------------------------------------------------- ! special characters character( len= *), parameter :: dash = minus ! ********************************************************************** ! getopt() local ! ---------------------------------------------------------------------- ! argument buffer character( len= file_name_len) :: optword ! index in optstring integer :: index_optstring ! ********************************************************************** ! getopt() text continue ! ---------------------------------------------------------------------- ! initialize for next option check_inc: if( optind >= nargs )then optarg = unknown_option getopt = end_of_args return end if check_inc ! ---------------------------------------------------------------------- ! get next option optind = optind + 1 call get_cl_arg_check_len( optind, optword) ! if word is not -? not_an_option: if( optword( 1: 1) /= dash )then optarg = optword getopt = end_of_args return ! if word is -- else if( optword( 2: 2) == dash )then not_an_option optarg = unknown_option getopt = end_of_args return end if not_an_option ! ---------------------------------------------------------------------- ! optword is -x (not --) index_optstring = index( optstring, optword( 2: 2)) is_opt: if( index_optstring > 0 )then ! if this optltr must have another word opt_string: if( optstring( index_optstring + 1: index_optstring + 1) == colon )then ! it can be separated by a blank next_word: if( optword( 3: 3) == blank )then optind = optind + 1 call get_cl_arg_check_len( optind, optarg) ! or not be separated by a blank else next_word optarg = optword( 3: ) end if next_word end if opt_string getopt = ichar( optword( 2: 2)) ! if this optltr must not have another word else is_opt optarg = optword getopt = ichar( unknown_option) end if is_opt ! ---------------------------------------------------------------------- ! getopt() exit return ! ********************************************************************** ! getopt() end function getopt ! ********************************************************************** ! ********************************************************************** ! %%% process particular command line options ! ********************************************************************** ! ********************************************************************** ! process_alter_option() process alter arguments subroutine process_alter_option( alter_opt) ! ********************************************************************** ! process_alter_option() interface ! ---------------------------------------------------------------------- ! the alter option from the command line character( len= *), intent( in) :: alter_opt ! ********************************************************************** ! entry: alter_opt is command line arg following -a ! "d" | "b" | "0" | "1" | "3" ! exit: alter_opt is processed or error exit ! ********************************************************************** ! process_alter_option() constants ! ---------------------------------------------------------------------- ! possible alter option strings character( len= *), parameter :: delete_str = 'd' character( len= *), parameter :: blank_str = 'b' character( len= *), parameter :: shift0_str = '0' character( len= *), parameter :: shift1_str = '1' character( len= *), parameter :: shift3_str = '3' ! ********************************************************************** ! process_alter_option() local ! ---------------------------------------------------------------------- ! decoding the option is done in lower case which may require a case change character( len= 1) :: lower_case_opt ! ---------------------------------------------------------------------- ! allow only one -a per command line logical, save :: too_many_alter_options = .false. ! ********************************************************************** ! process_alter_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_alter_options )then call msg_quit( "too many alter options on command line") else too_many too_many_alter_options = .true. end if too_many ! ---------------------------------------------------------------------- ! check for unknown option too_long: if( len_trim( alter_opt) > 1 )then call msg_quit( "garbled -a option: " // trim( alter_opt) ) end if too_long ! force arg to lower case lower_case_opt = to_lower( alter_opt( 1: 1)) ! ---------------------------------------------------------------------- ! legal alter argument or error alter_value_str: select case( lower_case_opt) ! alter delete case( delete_str) alter_value_str cl_options% alter_state = alter_delete ! alter blank case( blank_str) alter_value_str cl_options% alter_state = alter_blank ! alter shift1 case( shift1_str) alter_value_str cl_options% alter_state = alter_shift_1 ! alter shift0 case( shift0_str) alter_value_str cl_options% alter_state = alter_shift_0 ! alter shift3 case( shift3_str) alter_value_str cl_options% alter_state = alter_shift_3 ! unknown alter code ( not one of { b, d, 0, 1, 3 } ) case default alter_value_str call msg_quit( "unknown -a option: " // trim( alter_opt) ) ! legal alter statement or error end select alter_value_str ! ---------------------------------------------------------------------- ! process_alter_option() exit return ! ********************************************************************** ! process_alter_option() end subroutine process_alter_option ! ********************************************************************** ! ********************************************************************** ! process_define_option() process define arguments -Dname[=n] subroutine process_define_option( symbol_opt) ! ********************************************************************** ! process_define_option() interface ! ---------------------------------------------------------------------- ! the symbol string from the command line character( len= *), intent( in) :: symbol_opt ! ********************************************************************** ! entry: symbol_opt is string following -D { log | int=val } ! exit: symbol_opt is processed or error exit ! ********************************************************************** ! process_define_option() local ! ---------------------------------------------------------------------- ! find characters integer :: eq_idx ! construct a declaration string to process character( len= file_name_len) :: decl_string ! ********************************************************************** ! process_define_option() text continue ! ---------------------------------------------------------------------- ! force names to lower case decl_string = to_lower( symbol_opt) ! ---------------------------------------------------------------------- ! an equal sign must separate a value from the name eq_idx = index( decl_string, equals) ! if there's an equals, it's an integer int_or_log: if( eq_idx > 0 )then ! check name call valid_new_cl_name( decl_string( 1: eq_idx - 1)) ! declare the integer constant call add_cl_integer( decl_string( eq_idx: ), decl_string( 1: eq_idx - 1)) ! if there's no equals, it's a logical ( = .true.) else int_or_log ! check name call valid_new_cl_name( trim( decl_string)) ! declare the logical constant call add_cl_logical( decl_string) ! integer or logical end if int_or_log ! ---------------------------------------------------------------------- ! process_define_option() exit return ! ********************************************************************** ! process_define_option() end subroutine process_define_option ! ********************************************************************** ! ********************************************************************** ! add_cl_integer() store integer from the command line in cl symbol table subroutine add_cl_integer( int_decl_str, integer_name) ! ********************************************************************** ! add_cl_integer() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: int_decl_str ! the symbol name character( len= *), intent( in) :: integer_name ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case integer declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! exit: integer declaration is added to the integer symbol list or error exit ! ********************************************************************** ! add_cl_integer() local ! ---------------------------------------------------------------------- ! check allocation status integer :: astat ! type pointer to allocate type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! add_cl_integer() text continue ! ---------------------------------------------------------------------- ! allocate new integer allocate( integer_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate -D integer: " // trim( integer_name)) end if alloc_error ! build new integer on list subsequent_or_first: if( associated( first_cl_symbol) )then last_cl_symbol% next => integer_ptr last_cl_symbol => last_cl_symbol% next else subsequent_or_first first_cl_symbol => integer_ptr last_cl_symbol => first_cl_symbol end if subsequent_or_first nullify( integer_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members integer_ptr% name_str = integer_name ! ---------------------------------------------------------------------- ! decode the value call eval_int_expr( int_decl_str( len( equals) + 1: ), integer_ptr% integer_value) ! ---------------------------------------------------------------------- ! add_cl_integer() exit return ! ********************************************************************** ! add_cl_integer() end subroutine add_cl_integer ! ********************************************************************** ! ********************************************************************** ! add_cl_logical() store integer from the command line in cl symbol table subroutine add_cl_logical( logical_name) ! ********************************************************************** ! add_logical() interface ! ---------------------------------------------------------------------- ! the valid logical name character( len= *), intent( in) :: logical_name ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case logical declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_logical() local ! ---------------------------------------------------------------------- ! check allocation status integer :: astat ! type pointer to allocate type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! add_logical() text continue ! ---------------------------------------------------------------------- ! allocate new logical allocate( logical_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate -D logical: " // trim( logical_name)) end if alloc_error ! build new logical on list subsequent_or_first: if( associated( first_cl_symbol) )then last_cl_symbol% next => logical_ptr last_cl_symbol => last_cl_symbol% next else subsequent_or_first first_cl_symbol => logical_ptr last_cl_symbol => first_cl_symbol end if subsequent_or_first nullify( logical_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members logical_ptr% name_str = logical_name ! ---------------------------------------------------------------------- ! logicals on the command line are true logical_ptr% logical_value = .true. ! ---------------------------------------------------------------------- ! add_cl_logical() exit return ! ********************************************************************** ! add_cl_logical() end subroutine add_cl_logical ! ********************************************************************** ! ********************************************************************** ! process_fixed_option() process fixed arguments subroutine process_fixed_option() ! ********************************************************************** ! entry: ! exit: -F is processed or error exit ! ********************************************************************** ! process_fixed_option() local ! ---------------------------------------------------------------------- ! allow only one -a per command line logical, save :: too_many_fixed_options = .false. ! ********************************************************************** ! process_fixed_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_fixed_options )then call msg_quit( "too many fixed options on command line") else too_many too_many_fixed_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% free_form = .false. ! ---------------------------------------------------------------------- ! process_fixed_option() exit return ! ********************************************************************** ! process_fixed_option() end subroutine process_fixed_option ! ********************************************************************** ! ********************************************************************** ! print_help() write usage message and options to stderr subroutine print_help() ! ********************************************************************** ! entry: in response to -h command line option ! exit: print help message ! ********************************************************************** ! print_help() constants ! ---------------------------------------------------------------------- ! the options message character( len= *), dimension( 1: 16), parameter :: options_msg = [ & ' -a ? set alter state, ? = { b, d, 0, 1, 3} ', & ' -D name[=n] provide integer =n or logical true value ', & ' -F treat source as fixed form source ', & ' -h print this help message and quit ', & ' -k cc sets the left and right key characters to cc ', & ' -I directory search directory for include files (after .) ', & ' -l log-file write log messages to log-file (default stderr) ', & ' -m mark subsequent input files in the output file ', & ' -n print line numbers on source lines ', & ' -p disable the copy of set file at end of output ', & ' -r print summary report at end of processing ', & ' -s set-file read set-file as the set file (default coco.set) ', & ' -v report file opening and closing ', & ' -V print coco version and quit ', & ' -w disable line wrapping ', & ' -- optionally separate options from source file names' ] ! ********************************************************************** ! print_help() local ! ---------------------------------------------------------------------- ! implied do variable integer :: i ! ********************************************************************** ! print_help() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- write( unit= error_unit, fmt= string_fmt) usage_msg write( unit= error_unit, fmt= string_fmt) ( trim( options_msg( i)), i = 1, size( options_msg)) ! ---------------------------------------------------------------------- ! print_help() exit return ! ********************************************************************** ! print_help() end subroutine print_help ! ********************************************************************** ! ********************************************************************** ! process_include_option() process include directory options subroutine process_include_option( directory_opt) ! ********************************************************************** ! process_include_option() interface ! ---------------------------------------------------------------------- ! the directory string from the command line character( len= *), intent( in) :: directory_opt ! ********************************************************************** ! entry: directory_opt is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_opt is on the list ! ********************************************************************** ! process_include_option() local ! ---------------------------------------------------------------------- ! point to a directory type type( path_t), pointer :: path_ptr ! unquote the directory name if needed character( len= file_name_len) :: directory_str ! lengths of quoted string integer :: quoted_len ! lengths of unquoted string integer :: unquoted_len ! ********************************************************************** ! process_include_option() text continue ! ---------------------------------------------------------------------- ! if the directory is quoted, unquote it call unquote_string( directory_opt, directory_str, quoted_len, unquoted_len) badly_quoted: if( unquoted_len == 0 )then call msg_quit( "null name passed to -I option") else if( quoted_len > len_trim( directory_opt) )then badly_quoted call msg_quit( "badly quoted name passed to -I option") end if badly_quoted ! ---------------------------------------------------------------------- ! if name is already on the path nullify( path_ptr) call seek_directory( directory_str, path_ptr) on_list_or_add: if( associated( path_ptr) )then call msg_continue( "redundant include directory ignored: " // trim( directory_opt) ) else on_list_or_add call add_directory( directory_str) end if on_list_or_add ! ---------------------------------------------------------------------- ! process_include_option() exit return ! ********************************************************************** ! process_include_option() end subroutine process_include_option ! ********************************************************************** ! ********************************************************************** ! process_key_option() process number directives subroutine process_key_option( key_opt) ! ********************************************************************** ! process_key_option() interface ! ---------------------------------------------------------------------- ! the key characters from the set file or command line character( len= *), intent( in) :: key_opt ! ********************************************************************** ! entry: cc + blanks ! exit: keys characters processed is processed or error exit ! ********************************************************************** ! process_key_option() local ! ---------------------------------------------------------------------- ! allow only one -k per command line logical, save :: too_many_keys_directives = .false. ! ********************************************************************** ! process_key_option() text continue ! ---------------------------------------------------------------------- ! only one number statement per set file too_many_keys: if( too_many_keys_directives )then call msg_quit( "too many -k optionss") else too_many_keys too_many_keys_directives = .true. end if too_many_keys ! ---------------------------------------------------------------------- ! process number switch on_off: if( key_opt( 3: ) == blank )then cl_options% keychars = key_opt( 1: 2) else on_off call msg_quit( "extra characters at end of key directive: " // trim( key_opt) ) end if on_off ! ---------------------------------------------------------------------- ! process_key_option() exit return ! ********************************************************************** ! process_key_option() end subroutine process_key_option ! ********************************************************************** ! ********************************************************************** ! process_log_file_option() process log_file arguments subroutine process_log_file_option( log_file_arg) ! ********************************************************************** ! process_log_file_option character( len= *), intent( in) :: log_file_arg ! ********************************************************************** ! entry: log_file_arg is log file name ! exit: -l is processed or error exit ! ********************************************************************** ! process_log_file_option() local ! ---------------------------------------------------------------------- ! allow only one -l per command line logical, save :: too_many_log_file_options = .false. ! ********************************************************************** ! process_log_file_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_log_file_options )then call msg_quit( "too many log file options on command line") else too_many too_many_log_file_options = .true. end if too_many ! ---------------------------------------------------------------------- log_file% io_unit = log_unit log_file% name_str = log_file_arg log_file% named_file = .true. call open_file( log_file) ! ---------------------------------------------------------------------- ! process_log_file_option() exit return ! ********************************************************************** ! process_log_file_option() end subroutine process_log_file_option ! ********************************************************************** ! ********************************************************************** ! process_mark_option() process number arguments subroutine process_mark_option() ! ********************************************************************** ! entry: from -m encountered ! exit: -m is processed or error exit ! ********************************************************************** ! process_mark_option() local ! ---------------------------------------------------------------------- ! allow only one -m per command line logical, save :: too_many_mark_options = .false. ! ********************************************************************** ! process_mark_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_mark_options )then call msg_quit( "too many mark options on command line") else too_many too_many_mark_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% mark_input = .true. ! ---------------------------------------------------------------------- ! process_mark_option() exit return ! ********************************************************************** ! process_mark_option() end subroutine process_mark_option ! ********************************************************************** ! ********************************************************************** ! process_number_option() process number arguments subroutine process_number_option() ! ********************************************************************** ! entry: from -n encountered ! exit: -n is processed or error exit ! ********************************************************************** ! process_number_option() local ! ---------------------------------------------------------------------- ! allow only one -n per command line logical, save :: too_many_number_options = .false. ! ********************************************************************** ! process_number_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_number_options )then call msg_quit( "too many number options on command line") else too_many too_many_number_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% number_source = .true. ! ---------------------------------------------------------------------- ! process_number_option() exit return ! ********************************************************************** ! process_number_option() end subroutine process_number_option ! ********************************************************************** ! ********************************************************************** ! process_postpend_option() process postpend arguments subroutine process_postpend_option() ! ********************************************************************** ! entry: from -p encountered ! exit: -p is processed or error exit ! ********************************************************************** ! process_postpend_option() local ! ---------------------------------------------------------------------- ! allow only one -p per command line logical, save :: too_many_postpend_options = .false. ! ********************************************************************** ! process_postpend_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_postpend_options )then call msg_quit( "too many postpend options on command line") else too_many too_many_postpend_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% postpend_setfile = .false. ! ---------------------------------------------------------------------- ! process_postpend_option() exit return ! ********************************************************************** ! process_postpend_option() end subroutine process_postpend_option ! ********************************************************************** ! ********************************************************************** ! process_report_option() process report arguments subroutine process_report_option() ! ********************************************************************** ! entry: from -r encountered ! exit: -r is processed or error exit ! ********************************************************************** ! process_report_option() local ! ---------------------------------------------------------------------- ! allow only one -r per command line logical, save :: too_many_report_options = .false. ! ********************************************************************** ! process_report_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_report_options )then call msg_quit( "too many report options on command line") else too_many too_many_report_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% print_report = .true. ! ---------------------------------------------------------------------- ! process_report_option() exit return ! ********************************************************************** ! process_report_option() end subroutine process_report_option ! ********************************************************************** ! ********************************************************************** ! process_set_file_option() process set_file arguments subroutine process_set_file_option( set_file_arg) ! ********************************************************************** ! process_set_file_option character( len= *), intent( in) :: set_file_arg ! ********************************************************************** ! entry: set_file_arg is set file name ! exit: -s is processed or error exit ! ********************************************************************** ! process_set_file_option() local ! ---------------------------------------------------------------------- ! allow only one -s per command line logical, save :: too_many_set_file_options = .false. ! ********************************************************************** ! process_set_file_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_set_file_options )then call msg_quit( "too many set file options on command line") else too_many too_many_set_file_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_set_file% name_str = set_file_arg cl_set_file% named_file = .true. ! ---------------------------------------------------------------------- ! process_set_file_option() exit return ! ********************************************************************** ! process_set_file_option() end subroutine process_set_file_option ! ********************************************************************** ! ********************************************************************** ! process_verbose_option() process verbose arguments subroutine process_verbose_option() ! ********************************************************************** ! entry: ! exit: -v is processed or error exit ! ********************************************************************** ! process_verbose_option() local ! ---------------------------------------------------------------------- ! allow only one -v per command line logical, save :: too_many_verbose_options = .false. ! ********************************************************************** ! process_verbose_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_verbose_options )then call msg_quit( "too many verbose options on command line") else too_many too_many_verbose_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% verbose_mode = .true. ! ---------------------------------------------------------------------- ! process_verbose_option() exit return ! ********************************************************************** ! process_verbose_option() end subroutine process_verbose_option ! ********************************************************************** ! ********************************************************************** ! process_wrap_option() process wrap arguments subroutine process_wrap_option() ! ********************************************************************** ! entry: ! exit: -v is processed or error exit ! ********************************************************************** ! process_wrap_option() local ! ---------------------------------------------------------------------- ! allow only one -w per command line logical, save :: too_many_wrap_options = .false. ! ********************************************************************** ! process_wrap_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_wrap_options )then call msg_quit( "too many wrap options on command line") else too_many too_many_wrap_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% wrapping_lines = .false. ! ---------------------------------------------------------------------- ! process_wrap_option() exit return ! ********************************************************************** ! process_wrap_option() end subroutine process_wrap_option ! ********************************************************************** ! ********************************************************************** ! %%% diagnostic directives write to the log file ! ********************************************************************** ! ********************************************************************** ! process_cmdline_directive() write command line to the log file subroutine process_cmdline_directive( cmdline_dir) ! ********************************************************************** ! process_cmdline_directive() text ! ---------------------------------------------------------------------- character( len= *), intent( in) :: cmdline_dir ! ********************************************************************** ! process_cmdline_directive() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! check for well formed directive extra_chars: if( cmdline_dir /= blank )then call msg_quit( "extra characters at end of cmdline directive: " // trim( cmdline_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! if an active line active_line: if( if_construct% now_selected )then ! write command line to stderr or the log file write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco command line: ' & // trim( predefined_macros( cmdline_idx)% macro_value) end if active_line ! ---------------------------------------------------------------------- ! process_cmdline_directive() exit return ! ********************************************************************** ! process_cmdline_directive() end subroutine process_cmdline_directive ! ********************************************************************** ! ********************************************************************** ! write_options() write options in effect to the log file subroutine write_options() ! ********************************************************************** ! write_options() constants ! ---------------------------------------------------------------------- ! possible alter states integer, parameter :: lower_alter = min( alter_delete, alter_blank, alter_shift_1, alter_shift_0, alter_shift_3) integer, parameter :: upper_alter = max( alter_delete, alter_blank, alter_shift_1, alter_shift_0, alter_shift_3) ! possible alter state labels character( len= 16), dimension( lower_alter: upper_alter), parameter :: alter_labels = [ & 'deleted ', & 'blank line ', & 'initial ! ', & 'shifted 1 + ! ', & 'shifted 3 + !?> ' ] ! ********************************************************************** ! write_options() local ! ---------------------------------------------------------------------- ! construct output lines character( len= buffer_len) :: output_line ! ********************************************************************** ! write_options() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! write a header write( unit= log_file% io_unit, fmt= log_file% format_str) "coco options:" ! ---------------------------------------------------------------------- ! identify the alter state check_index: select case( options% alter_state) case( lower_alter: upper_alter) check_index output_line = 'alter state causes lines to be ' // alter_labels( options% alter_state) case default check_index output_line = 'alter state is undefined' end select check_index write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether free form or fixed form rpt_form: if( options% free_form )then output_line = 'processing free form source: wrap len:' else rpt_form output_line = 'processing fixed form source: wrap len:' end if rpt_form write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) // blank, wrap_len ! identify whether printing new input file mark rpt_mark: if( options% mark_input )then output_line = 'marking subsequent input files' else rpt_mark output_line = 'not marking subsequent input files' end if rpt_mark write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether printing "! file: line" on source lines rpt_number: if( options% number_source )then output_line = 'numbering source lines' else rpt_number output_line = 'not numbering source lines' end if rpt_number write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether postpending the set file rpt_post: if( options% postpend_setfile )then output_line = 'postpending set file ' // set_file% name_str else rpt_post output_line = 'not postpending set file ' // set_file% name_str end if rpt_post write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether printing coco report rpt_prt: if( options% print_report )then output_line = 'printing coco report' else rpt_prt output_line = 'not printing coco report' end if rpt_prt write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether verbose mode is on rpt_verbose: if( options% verbose_mode )then output_line = 'verbose mode is on' else rpt_verbose output_line = 'verbose mode is off' end if rpt_verbose write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether wrapping lines rpt_wrap: if( options% wrapping_lines )then output_line = 'wrapping source lines' else rpt_wrap output_line = 'not wrapping source lines' end if rpt_wrap write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! found a file name directory separator character rpt_sep_char: if( options% got_sep_char )then output_line = 'found directory separator character ' // options% sep_char else rpt_sep_char output_line = 'no directory separator character found' end if rpt_sep_char write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify the argument keys output_line = 'the left argument key: "' // l_key // '" the right argument key: "' // r_key // '"' write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! ---------------------------------------------------------------------- ! write_options() exit return ! ********************************************************************** ! write_options() end subroutine write_options ! ********************************************************************** ! ********************************************************************** ! write_report() write summary report to the log file subroutine write_report() ! ********************************************************************** ! write_report() local ! ---------------------------------------------------------------------- ! print date and time in header character( len= 8) :: today_str character( len= 10) :: now_str ! ---------------------------------------------------------------------- ! print include path type( path_t), pointer :: path_ptr ! ---------------------------------------------------------------------- ! print input files integer :: i ! ********************************************************************** ! write_report() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! banner includes the date and time call date_and_time( date= today_str, time= now_str) write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco executed: ' // format_date( today_str) & // blank // format_time( now_str) ! ---------------------------------------------------------------------- ! identify the set file write( unit= log_file% io_unit, fmt= log_file% format_str) 'set file: ' // trim( set_file% name_str) ! ---------------------------------------------------------------------- ! identify the output file write( unit= log_file% io_unit, fmt= log_file% format_str) 'output: ' // trim( output_file% name_str) ! ---------------------------------------------------------------------- ! identify the input file(s) one_or_more: if( allocated( source_file_list) )then write( unit= log_file% io_unit, fmt= log_file% format_str, advance= 'NO') 'input:' more_than_one: do i = 2, number_of_names write( unit= log_file% io_unit, fmt= log_file% format_str, advance= 'NO') & blank // trim( source_file_list( i)% name_str) end do more_than_one write( unit= log_file% io_unit, fmt= log_file% format_str) else one_or_more write( unit= log_file% io_unit, fmt= log_file% format_str) 'input: ' // trim( input_file% name_str) end if one_or_more ! ---------------------------------------------------------------------- ! identify the include path write_sep_char: if( options% got_sep_char )then write( unit= log_file% io_unit, fmt= directory_fmt, advance= 'NO') & 'include path: .' // options% sep_char // ' (', count_include_in_dot, ')' else write_sep_char write( unit= log_file% io_unit, fmt= directory_fmt, advance= 'NO') 'include path: . (', count_include_in_dot, ')' end if write_sep_char nullify( path_ptr) path_ptr => first_directory inc_path: do if( .not. associated( path_ptr) ) exit inc_path write( unit= log_file% io_unit, fmt= directory_fmt, advance= 'NO') & comma // blank // trim( path_ptr% name_str) // blank // open_paren, path_ptr% times_accessed, close_paren path_ptr => path_ptr% next end do inc_path ! end line using null string write( unit= log_file% io_unit, fmt= log_file% format_str) ! ---------------------------------------------------------------------- ! number of files read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'files read: ', total% input_files write( unit= log_file% io_unit, fmt= log_file% format_str) & 'include files read: ', total% include_files ! number of set file lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'set lines read: ', set_file% lines_transfered ! number of coco lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'coco lines read: ', total% coco_lines ! number of source lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'source lines read: ', total% input_lines ! number of lines written write( unit= log_file% io_unit, fmt= log_file% format_str) & 'source lines written: ', output_file% lines_transfered ! number of selected lines written write( unit= log_file% io_unit, fmt= log_file% format_str) & 'selected source lines: ', total% selected_lines ! number of elided lines write( unit= log_file% io_unit, fmt= log_file% format_str) & 'elided source lines: ', total% elided_lines ! number of text blocks read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'text blocks read: ', total% text_blocks ! number of text lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'text lines read: ', total% text_lines ! number of text lines written write( unit= log_file% io_unit, fmt= log_file% format_str) & 'text lines written: ', total% copied_lines ! ---------------------------------------------------------------------- ! write_report() exit return ! ********************************************************************** ! write_report() end subroutine write_report ! ********************************************************************** ! ********************************************************************** ! write_symbols() write symbol list to the log file subroutine write_symbols() ! ********************************************************************** ! write_symbols() local ! ---------------------------------------------------------------------- ! symbol to be written to the log file class( symbol_t), pointer :: symbol_ptr ! convert line numbers to strings character( len= conversion_len) :: line_no_str ! print dummy arguments character( len= buffer_len) :: args_line ! predefined macros index and block line index integer :: i ! ********************************************************************** ! write_symbols() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! predefined symbols write( unit= log_file% io_unit, fmt= string_fmt) 'predefined symbols' all_predefined: do i = 1, size( predefined_macros) write( unit= log_file% io_unit, fmt= string_fmt) 'name: ' // predefined_macros( i)% name_str write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' // trim( predefined_macros( i)% macro_value) predefined_referenced: if( predefined_macros( i)% referenced )then write( unit= line_no_str, fmt= conversion_fmt) predefined_macros( i)% referenced_line write( unit= log_file% io_unit, fmt= string_fmt) 'referenced in file: ' & // trim( predefined_macros( i)% referenced_file) & // ' at line: ' // trim( adjustl( line_no_str)) else predefined_referenced write( unit= log_file% io_unit, fmt= string_fmt) 'never referenced' end if predefined_referenced end do all_predefined ! ---------------------------------------------------------------------- symbol_ptr => first_symbol write( unit= log_file% io_unit, fmt= string_fmt) 'symbols' all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols write( unit= log_file% io_unit, fmt= string_fmt) 'next symbol' ! ---------------------------------------------------------------------- ! data all symbols have write( unit= log_file% io_unit, fmt= string_fmt) 'name: ' // symbol_ptr% name_str write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% declared_line write( unit= log_file% io_unit, fmt= string_fmt) 'declared in file: ' // trim( symbol_ptr% declared_file) & // ' at line: ' // trim( adjustl( line_no_str)) ever_referenced: if( symbol_ptr% referenced )then write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% referenced_line write( unit= log_file% io_unit, fmt= string_fmt) 'referenced in file: ' // trim( symbol_ptr% referenced_file) & // ' at line: ' // trim( adjustl( line_no_str)) else ever_referenced write( unit= log_file% io_unit, fmt= string_fmt) 'never referenced' end if ever_referenced ! ---------------------------------------------------------------------- ! type-specific data print_type: select type( symbol_ptr) ! ---------------------------------------------------------------------- ! logical data type is( logical_t) write( unit= log_file% io_unit, fmt= string_fmt, advance= 'no') 'type: logical ' log_const_or_var: if( symbol_ptr% constant )then write( unit= log_file% io_unit, fmt= string_fmt) 'constant' else log_const_or_var write( unit= log_file% io_unit, fmt= string_fmt) 'variable' end if log_const_or_var logical_defined: if( symbol_ptr% defined )then true_false: if( symbol_ptr% logical_value )then write( unit= log_file% io_unit, fmt= string_fmt) 'value: .true.' else true_false write( unit= log_file% io_unit, fmt= string_fmt) 'value: .false.' end if true_false write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% defined_line write( unit= log_file% io_unit, fmt= string_fmt) 'defined in file: ' // trim( symbol_ptr% defined_file) & // ' at line: ' // trim( adjustl( line_no_str)) else logical_defined write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' end if logical_defined ! ---------------------------------------------------------------------- ! integer data type is( integer_t) write( unit= log_file% io_unit, fmt= string_fmt, advance= 'no') 'type: integer ' int_const_or_var: if( symbol_ptr% constant )then write( unit= log_file% io_unit, fmt= string_fmt) 'constant' else int_const_or_var write( unit= log_file% io_unit, fmt= string_fmt) 'variable' end if int_const_or_var integer_defined: if( symbol_ptr% defined )then write( unit= log_file% io_unit, fmt= integer_fmt) 'value: ', symbol_ptr% integer_value write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% defined_line write( unit= log_file% io_unit, fmt= string_fmt) 'defined in file: ' // trim( symbol_ptr% defined_file) & // ' at line: ' // trim( adjustl( line_no_str)) else integer_defined write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' end if integer_defined ! ---------------------------------------------------------------------- ! macro data type is( macro_t) macro_args: if( allocated( symbol_ptr% dummy_args) )then macro_parens: if( symbol_ptr% args_in_parens )then write( unit= log_file% io_unit, fmt= string_fmt) 'type: macro with arguments in parenthesis' else macro_parens write( unit= log_file% io_unit, fmt= string_fmt) 'type: macro with arguments' end if macro_parens args_line = null_string line_macro: do i = 1, size( symbol_ptr% dummy_args) args_line = trim( args_line) // blank // trim( symbol_ptr% dummy_args( i)) end do line_macro write( unit= log_file% io_unit, fmt= string_fmt) 'dummy arguments: ' // trim( args_line) else macro_args write( unit= log_file% io_unit, fmt= string_fmt) 'type: macro' end if macro_args write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' // trim( symbol_ptr% macro_value) ! ---------------------------------------------------------------------- ! text data type is( text_t) text_args: if( allocated( symbol_ptr% dummy_args) )then text_parens: if( symbol_ptr% args_in_parens )then write( unit= log_file% io_unit, fmt= string_fmt) 'type: text with arguments in parenthesis' else text_parens write( unit= log_file% io_unit, fmt= string_fmt) 'type: text with arguments' end if text_parens args_line = null_string line_text: do i = 1, size( symbol_ptr% dummy_args) args_line = trim( args_line) // blank // trim( symbol_ptr% dummy_args( i)) end do line_text write( unit= log_file% io_unit, fmt= string_fmt) 'dummy arguments: ' // trim( args_line) else text_args write( unit= log_file% io_unit, fmt= string_fmt) 'type: text' end if text_args write( unit= log_file% io_unit, fmt= string_fmt) 'block:' write_block: do i = 1, size( symbol_ptr% text_lines) write( unit= log_file% io_unit, fmt= string_fmt) trim( symbol_ptr% text_lines( i)) end do write_block ! ---------------------------------------------------------------------- class default call msg_quit( 'error: type is unknown') end select print_type symbol_ptr => symbol_ptr% next end do all_symbols write( unit= log_file% io_unit, fmt= string_fmt) 'end symbols' ! ---------------------------------------------------------------------- ! write_symbols() exit return ! ********************************************************************** ! write_symbols() end subroutine write_symbols ! ********************************************************************** ! ********************************************************************** ! %%% seek and process the set file (if any) ! ********************************************************************** ! ********************************************************************** ! seek_set_file() find a set file to open or don't read one subroutine seek_set_file() ! ********************************************************************** ! seek_set_file constants ! ---------------------------------------------------------------------- ! default set_file name character( len= *), parameter :: default_name = 'coco.set' ! default set_file name environment variable name character( len= *), parameter :: env_var_name = 'COCO_SET_FILE' integer :: env_stat ! ********************************************************************** ! seek_set_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! see if there is name for the set_file from the command line cl_named_set_file: if( cl_set_file% named_file )then ! inquire by file looking for named set file inquire( file= cl_set_file% name_str, exist= cl_set_file% named_file, iostat= cl_set_file% io_status, iomsg= processor_msg) cl_inq_named: if( cl_set_file% io_status > 0 )then call msg_quit( "can't inquire set file named on command line: " // trim( cl_set_file% name_str)) end if cl_inq_named end if cl_named_set_file ! ---------------------------------------------------------------------- ! see if the set_file from the command line was found named_set_file: if( cl_set_file% named_file )then ! if so, use it set_file = cl_set_file ! see if there is name for the set_file from the source file names else if( set_file% named_file )then named_set_file ! inquire by file looking for named set file inquire( file= set_file% name_str, exist= set_file% named_file, iostat= set_file% io_status, iomsg= processor_msg) inq_named: if( set_file% io_status > 0 )then call msg_quit( "can't inquire set file: " // trim( set_file% name_str)) end if inq_named ! done checking set file name end if named_set_file ! ---------------------------------------------------------------------- ! if no set file so far see if there is an environment variable with a set file name env_named_set_file: if( .not. set_file% named_file )then call get_environment_variable( name= env_var_name, value= set_file% name_str, status= env_stat) found_env_var: if( env_stat == 0 .and. set_file% name_str /= blank )then ! inquire by file looking for named set file inquire( file= set_file% name_str, exist= set_file% named_file, iostat= set_file% io_status, iomsg= processor_msg) env_inq_named: if( set_file% io_status > 0 )then call msg_quit( "can't inquire set file named from environment: " // trim( set_file% name_str)) end if env_inq_named else found_env_var set_file% name_str = null_string end if found_env_var end if env_named_set_file ! if no named set file then try to find the default set file default_set_file: if( .not. set_file% named_file )then ! inquire by file looking for default set file inquire( file= default_name, exist= set_file% named_file, iostat= set_file% io_status, iomsg= processor_msg) inq_default: if( set_file% io_status > 0 )then call msg_quit( "can't inquire default set file: " // default_name) end if inq_default ! if found the default set file ensure the variable correctly specifies it use_default: if( set_file% named_file )then set_file% name_str = default_name end if use_default end if default_set_file ! ---------------------------------------------------------------------- ! if have set file, open it, process it, close it read_set_file: if( set_file% named_file )then call process_set_file() else read_set_file set_file% name_str = '' end if read_set_file ! ---------------------------------------------------------------------- ! seek_set_file() exit return ! ********************************************************************** ! seek_set_file() end subroutine seek_set_file ! ********************************************************************** ! ********************************************************************** ! process_sefile() open, process, close the coco set file subroutine process_set_file() ! ********************************************************************** ! process_set_file() steps ! 1. open the set file ! 2. open the set scratch file ! 2. read the set file line by line ! 3. call blank_compress_lower_case() to construct a coco statement ! 4. ignore coco comments ! 5. call process_set_statement() to process coco set statement ! 6. close set file ! ********************************************************************** ! process_set_file() local ! ---------------------------------------------------------------------- ! process the set file statement by statement character( len= buffer_len) :: set_statement ! ---------------------------------------------------------------------- ! signal complete statement logical :: complete ! ********************************************************************** ! process_set_file() text continue ! ---------------------------------------------------------------------- ! open the set file for reading call open_file( set_file) ! ---------------------------------------------------------------------- ! count files processed total% input_files = total% input_files + 1 ! as if finished a complete statement at beginning of file complete = .true. ! ---------------------------------------------------------------------- ! main read set file lines loop read_lines: do ! ---------------------------------------------------------------------- ! read a set file line read( unit= set_file% io_unit, fmt= set_file% format_str, iostat= set_file% io_status, iomsg= processor_msg) set_file% line read_set: if( set_file% io_status > 0 )then call msg_quit( "can't read set file: " // trim( set_file% name_str)) end if read_set ! ---------------------------------------------------------------------- ! read until end of file read_eof: if( set_file% io_status < 0 )then ! reset statement processing for the next file call blank_compress_lower_case( set_statement, null_string) ! if in a statement continuation sequence premature_eof: if( .not. complete )then call msg_quit( "end of file encountered within a continuation sequence") end if premature_eof ! exit the read lines loop exit read_lines end if read_eof ! count set file lines set_file% lines_transfered = set_file% lines_transfered + 1 ! ---------------------------------------------------------------------- ! process set file lines or error if source lines coco_line: if( line( 1: len( coco_key)) == coco_key )then ! count coco lines total% coco_lines = total% coco_lines + 1 ! process set file lines, ignore coco comments coco_statement: if( is_coco_statement( line( len( coco_key) + 1: )) )then ! ---------------------------------------------------------------------- ! read a complete statement line by line call gather_coco_statement( line, set_statement, complete) ! if not yet a complete statement go get the rest of it get_statement: if( .not. complete )then cycle read_lines end if get_statement ! process the complete set file statement call process_set_statement( set_statement) ! process set file lines, ignore coco comments end if coco_statement ! source line in set file else coco_line allow_blank_lines: if( line /= blank .or. .not. complete )then call msg_quit( "source lines are not allowed in the set file") end if allow_blank_lines ! end processing set statements end if coco_line ! ---------------------------------------------------------------------- ! end main read set file lines loop end do read_lines total% input_lines = total% input_lines + set_file% lines_transfered ! ---------------------------------------------------------------------- ! close the set file call close_file( set_file) ! ---------------------------------------------------------------------- ! process_set_file() exit return ! ********************************************************************** ! process_set_file() end subroutine process_set_file ! ********************************************************************** ! ********************************************************************** ! copy_set_file() copy set file to output file subroutine copy_set_file() ! ********************************************************************** ! copy_set_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! open the set file call open_file( set_file) ! ---------------------------------------------------------------------- ! count lines correctly when appending the set file to the output set_file% lines_transfered = 0 ! copy each line copy_lines: do ! read a line read( unit= set_file% io_unit, fmt= set_file% format_str, iostat= set_file% io_status, iomsg= processor_msg) set_file% line read_set_file: if( set_file% io_status > 0 )then call msg_quit( "can't copy set file") ! read entire set file else if( set_file% io_status < 0 )then read_set_file exit copy_lines end if read_set_file ! count lines for possible line numbering set_file% lines_transfered = set_file% lines_transfered + 1 ! write a line call write_coco_line( output_file) end do copy_lines ! ---------------------------------------------------------------------- ! close the set file call close_file( set_file) ! ---------------------------------------------------------------------- ! copy_set_file() exit return ! ********************************************************************** ! copy_set_file() end subroutine copy_set_file ! ********************************************************************** ! ********************************************************************** ! %%% process statements many of which may appear only in the set file ! ********************************************************************** ! ********************************************************************** ! process_set_statement() process set line subroutine process_set_statement( set_stmt) ! ********************************************************************** ! process_set_statement() interface ! ---------------------------------------------------------------------- ! the statement string from the set file character( len= *), intent( in) :: set_stmt ! ********************************************************************** ! entry: set_stmt is blank_compress_lower_case set statement past the coco key ! "alter:..." | "integer..." | "logical..." | "directory'...'" | "form:..." | ! "input'...'" | "keys:..." | "logfile'...'" | "mark:..." | "number:..." | ! "output'...'" | "post:..." | "report:..." | "verbose:..." | "wrap:..." ! exit: set_stmt is processed or error exit ! ********************************************************************** ! process_set_statement() text continue ! ---------------------------------------------------------------------- ! catergorize set file statement: alter, integer, logical, directory, wrap ! ---------------------------------------------------------------------- ! if the directive is an alter directive which_directive: if( set_stmt( 1: len( alter_str)) == alter_str )then call process_alter_directive( set_stmt( len( alter_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file integer declaration else if( set_stmt( 1: len( integer_str)) == integer_str )then which_directive call process_sf_integer_declaration( set_stmt( len( integer_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! integer constant declaration else if( set_stmt( 1: len( integer_constant_str)) == integer_constant_str )then which_directive call process_sf_integer_declaration( set_stmt( len( integer_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! if the directive is a set file logical declaration else if( set_stmt( 1: len( logical_str)) == logical_str )then which_directive call process_sf_logical_declaration( set_stmt( len( logical_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! logical constant declaration else if( set_stmt( 1: len( logical_constant_str)) == logical_constant_str )then which_directive call process_sf_logical_declaration( set_stmt( len( logical_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! if the directive is a set file directory directive else if( set_stmt( 1: len( directory_str)) == directory_str )then which_directive call process_directory_directive( set_stmt( len( directory_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file form directive else if( set_stmt( 1: len( form_str)) == form_str )then which_directive call process_form_directive( set_stmt( len( form_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file input directive else if( set_stmt( 1: len( input_str)) == input_str )then which_directive call process_input_directive( set_stmt( len( input_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file keys directive else if( set_stmt( 1: len( keys_str)) == keys_str )then which_directive call process_key_directive( set_stmt( len( keys_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file log file directive else if( set_stmt( 1: len( logfile_str)) == logfile_str )then which_directive call process_logfile_directive( set_stmt( len( logfile_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file mark: directive else if( set_stmt( 1: len( mark_str)) == mark_str )then which_directive call process_mark_directive( set_stmt( len( mark_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file number: directive else if( set_stmt( 1: len( number_str)) == number_str )then which_directive call process_number_directive( set_stmt( len( number_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file output directive else if( set_stmt( 1: len( output_str)) == output_str )then which_directive call process_output_directive( set_stmt( len( output_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file post: directive else if( set_stmt( 1: len( post_str)) == post_str )then which_directive call process_post_directive( set_stmt( len( post_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file report: directive else if( set_stmt( 1: len( summary_str)) == summary_str )then which_directive call process_summary_directive( set_stmt( len( summary_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file verbose directive else if( set_stmt( 1: len( verbose_str)) == verbose_str )then which_directive call process_verbose_directive( set_stmt( len( verbose_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file wrap directive else if( set_stmt( 1: len( wrap_str)) == wrap_str )then which_directive call process_wrap_directive( set_stmt( len( wrap_str) + 1: )) ! ---------------------------------------------------------------------- ! otherwise complain about the unknown directive else which_directive call msg_quit( "unknown set file directive: " // trim( set_stmt)) ! catergorize set file statement: alter or integer or logical or extension end if which_directive ! ---------------------------------------------------------------------- ! process_set_statement() exit return ! ********************************************************************** ! process_set_statement() end subroutine process_set_statement ! ********************************************************************** ! ********************************************************************** ! process_alter_directive() process alter directives subroutine process_alter_directive( alter_dir) ! ********************************************************************** ! process_alter_directive() interface ! ---------------------------------------------------------------------- ! the alter directive from the set file character( len= *), intent( in) :: alter_dir ! ********************************************************************** ! entry: alter_dir is blank_compress_lower_case alter directive past the colon ! "delete" | "blank" | "shift0" | "shift1" | "shift3" ! exit: alter_dir is processed or error exit ! ********************************************************************** ! process_alter_directive() constants ! ---------------------------------------------------------------------- ! possible alter strings character( len= *), parameter :: delete_str = 'delete' character( len= *), parameter :: blank_str = 'blank' character( len= *), parameter :: shift0_str = 'shift0' character( len= *), parameter :: shift1_str = 'shift1' character( len= *), parameter :: shift3_str = 'shift3' ! ********************************************************************** ! process_alter_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_alter_statements = .false. ! ********************************************************************** ! process_alter_directive() text continue ! ---------------------------------------------------------------------- ! only one alter directive per set file too_many_alters: if( too_many_alter_statements )then call msg_quit( "too many alter statements") else too_many_alters too_many_alter_statements = .true. end if too_many_alters ! if the alter state has not been set from the command line not_set: if( options% alter_state == alter_none )then ! ---------------------------------------------------------------------- ! legal alter statement or error ! ---------------------------------------------------------------------- ! decode alter state alter_value_str: select case( alter_dir) ! alter delete case( delete_str) alter_value_str options% alter_state = alter_delete ! alter blank case( blank_str) alter_value_str options% alter_state = alter_blank ! alter shift1 case( shift1_str) alter_value_str options% alter_state = alter_shift_1 ! alter shift0 case( shift0_str) alter_value_str options% alter_state = alter_shift_0 ! alter shift3 case( shift3_str) alter_value_str options% alter_state = alter_shift_3 ! unknown alter case default alter_value_str call msg_quit( "unknown alter directive: " // trim( alter_dir)) ! legal alter statement or error end select alter_value_str end if not_set ! ---------------------------------------------------------------------- ! process_alter_directive() exit return ! ********************************************************************** ! process_alter_directive() end subroutine process_alter_directive ! ********************************************************************** ! ********************************************************************** ! process_form_directive() process form directives subroutine process_form_directive( form_dir) ! ********************************************************************** ! process_form_directive() interface ! ---------------------------------------------------------------------- ! the wrap directive from the set file character( len= *), intent( in) :: form_dir ! ********************************************************************** ! entry: wrap_dir is blank_compress_lower_case wrap directive ! it must be a number string ! exit: wrap_dir is processed or error exit ! ********************************************************************** ! process_form_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_form_statements = .false. ! check for characters after directive integer :: next_char ! ********************************************************************** ! process_form_directive() text continue ! ---------------------------------------------------------------------- ! only one form statement per set file too_many_forms: if( too_many_form_statements )then call msg_quit( "too many form statements") else too_many_forms too_many_form_statements = .true. end if too_many_forms ! ---------------------------------------------------------------------- ! process form value if not already set on command line forms: if( form_dir( 1: len( free_str)) == free_str )then ! check directive for correctness and use value from command line or default next_char = len( free_str) + 1 else if( form_dir( 1: len( fixed_str)) == fixed_str )then forms ! check directive for correctness and use fixed form options% free_form = .false. next_char = len( fixed_str) + 1 else forms ! directive not correct call msg_quit( "bad form: " // trim( form_dir)) end if forms ! error if characters after directive error_chars: if( form_dir( next_char: ) /= blank )then call msg_quit( "extra characters after form directive: " // trim( form_dir)) end if error_chars ! ---------------------------------------------------------------------- ! process_form_directive() exit return ! ********************************************************************** ! process_form_directive() end subroutine process_form_directive ! ********************************************************************** ! ********************************************************************** ! process_directory_directive() process include directory options subroutine process_directory_directive( directory_dir) ! ********************************************************************** ! process_directory_directive() interface ! ---------------------------------------------------------------------- ! the directory directive from the set file character( len= *), intent( in) :: directory_dir ! ********************************************************************** ! entry: directory_opt is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_opt is on the list ! ********************************************************************** ! process_directory_directive() local ! ---------------------------------------------------------------------- ! point to a directory type type( path_t), pointer :: directory_ptr ! the name of a directory character( len= file_name_len) :: name_str ! count length of quoted string integer :: directive_len ! count length of unquoted string integer :: name_len ! ********************************************************************** ! process_directory_directive() text continue ! ---------------------------------------------------------------------- ! unquote string to find path string call unquote_string( directory_dir, name_str, directive_len, name_len ) badly_quoted: if( name_len == 0 )then call msg_quit( "null directory name: " // trim( directory_dir) ) else if( directive_len > len_trim( directory_str) )then badly_quoted call msg_quit( "badly quoted directory name: " // trim( directory_dir) ) end if badly_quoted ! ---------------------------------------------------------------------- ! if name is already on the path call seek_directory( name_str, directory_ptr) on_list_or_add: if( associated( directory_ptr) )then call msg_continue( "redundant include directory ignored: " // trim( directory_dir) ) ! if name is not already on the path else on_list_or_add call add_directory( name_str) end if on_list_or_add ! ---------------------------------------------------------------------- ! process_directory_directive() exit return ! ********************************************************************** ! process_directory_directive() end subroutine process_directory_directive ! ********************************************************************** ! ********************************************************************** ! seek_directory() return a pointer to directory_str or null() subroutine seek_directory( name_str, directory_ptr) ! ********************************************************************** ! seek_directory() interface ! ---------------------------------------------------------------------- ! the name of the directory to seek character( len= *), intent( in) :: name_str ! a pointer to the directory entry if found or null() type( path_t), pointer :: directory_ptr ! ********************************************************************** ! entry: directory_str is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_str is on the list ! ********************************************************************** ! seek_directory() text continue ! ---------------------------------------------------------------------- ! search from beginning to end of path list nullify( directory_ptr) directory_ptr => first_directory ! if the name is already in the path scan_path: do if( .not. associated( directory_ptr) ) exit scan_path found_name: if( name_str == directory_ptr% name_str )then exit scan_path end if found_name directory_ptr => directory_ptr% next end do scan_path ! ---------------------------------------------------------------------- ! seek_directory() exit return ! ********************************************************************** ! seek_directory() end subroutine seek_directory ! ********************************************************************** ! ********************************************************************** ! add_directory() return a pointer to directory_str or null() subroutine add_directory( directory_str) ! ********************************************************************** ! add_directory() interface ! ---------------------------------------------------------------------- ! the name of the directory to add to the directory list character( len= *), intent( in) :: directory_str ! ********************************************************************** ! entry: directory_str is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_str is on the list ! ********************************************************************** ! add_directory() local ! ---------------------------------------------------------------------- ! end of linked list, null() if no linked list yet type( path_t), save, pointer :: current_directory => null() ! check allocation status integer :: astat ! ********************************************************************** ! add_directory() text continue ! ---------------------------------------------------------------------- ! append to list start_or_append: if( associated( first_directory) )then allocate( current_directory% next, stat= astat, errmsg= processor_msg) append_status: if( astat > 0 )then call msg_quit( "can't append to include path list: " // trim( directory_str) ) end if append_status current_directory => current_directory% next ! start list else start_or_append allocate( first_directory, stat= astat, errmsg= processor_msg) start_status: if( astat > 0 )then call msg_quit( "can't start path list: " // trim( directory_str) ) end if start_status current_directory => first_directory end if start_or_append ! update new entry current_directory% name_str = directory_str current_directory% times_accessed = 0 nullify( current_directory% next) ! ---------------------------------------------------------------------- ! add_directory() exit return ! ********************************************************************** ! add_directory() end subroutine add_directory ! ********************************************************************** ! ********************************************************************** ! process_input_directive() process input file directives subroutine process_input_directive( input_dir) ! ********************************************************************** ! process_input_directive() interface ! ---------------------------------------------------------------------- ! the input directive from the set file character( len= *), intent( in) :: input_dir ! ********************************************************************** ! entry: input_dir is a file file to be listed as an input file ! exit: input_dir is on the list ! ********************************************************************** ! process_input_directive() local ! ---------------------------------------------------------------------- ! the name of the file to be opened character( len= file_name_len) :: input_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len ! check whether the scratch file for names is already open logical :: name_open ! ********************************************************************** ! process_input_directive() text continue ! ---------------------------------------------------------------------- ! unquote string on directive call unquote_string( input_dir, input_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on input directive: " // trim( input_dir) ) else if( unquoted_len > len_trim( input_dir) )then badly_quoted call msg_quit( "badly quoted name found on input directive: " // trim( input_dir) ) end if badly_quoted ! ---------------------------------------------------------------------- ! if input named on command line ignore the directive already_named: if( input_file% named_file )then call msg_continue( "command line overrides set file, input directive ignored: " // trim( input_dir) ) ! if input not named on command line open the named file else already_named number_of_names = number_of_names + 1 inquire( unit= name_file% io_unit, opened= name_open) open_first: if( .not. name_open )then call open_scratch( name_file) end if open_first write( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) input_name end if already_named ! ---------------------------------------------------------------------- ! process_input_directive() exit return ! ********************************************************************** ! process_input_directive() end subroutine process_input_directive ! ********************************************************************** ! ********************************************************************** ! process_key_directive() process keys directives subroutine process_key_directive( key_dir) ! ********************************************************************** ! process_key_directive() interface ! ---------------------------------------------------------------------- ! the key characters from the set file or command line character( len= *), intent( in) :: key_dir ! ********************************************************************** ! entry: cc + blanks ! exit: keys characters processed is processed or error exit ! ********************************************************************** ! process_key_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_keys_directives = .false. ! ********************************************************************** ! process_key_directive() text continue ! ---------------------------------------------------------------------- ! only one key statement per set file too_many_keys: if( too_many_keys_directives )then call msg_quit( "too many keys statements") else too_many_keys too_many_keys_directives = .true. end if too_many_keys ! ---------------------------------------------------------------------- ! process number switch on_off: if( key_dir( 3: ) == blank )then options% keychars = key_dir( 1: 2) else on_off call msg_quit( "extra characters at end of key directive: " // trim( key_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_key_directive() exit return ! ********************************************************************** ! process_key_directive() end subroutine process_key_directive ! ********************************************************************** ! ********************************************************************** ! process_logfile_directive() process log file directive subroutine process_logfile_directive( logfile_dir) ! ********************************************************************** ! process_logfile_directive() interface ! ---------------------------------------------------------------------- ! the logfile directive from the set file character( len= *), intent( in) :: logfile_dir ! ********************************************************************** ! entry: logfile_opt is a file file to be opened as the log file ! exit: logfile_opt is on the list ! ********************************************************************** ! process_logfile_directive() local ! ---------------------------------------------------------------------- ! the name of the file to be opened character( len= file_name_len) :: logfile_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len ! count number of some statements to disallow more than one logical, save :: too_many_logfile_statements = .false. ! ********************************************************************** ! process_logfile_directive() text continue ! ---------------------------------------------------------------------- ! only one log file statement per set file too_many_logfiles: if( too_many_logfile_statements )then call msg_quit( "too many log file statements") else too_many_logfiles too_many_logfile_statements = .true. end if too_many_logfiles ! unquote string on directive call unquote_string( logfile_dir, logfile_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on log file directive: " // trim( logfile_dir)) else if( unquoted_len > len_trim( logfile_dir) )then badly_quoted call msg_quit( "badly quoted name found on log file directive: " // trim( logfile_dir)) end if badly_quoted ! ---------------------------------------------------------------------- ! if log file named on command line ignore the directive already_named: if( log_file% named_file )then call msg_continue( "command line overrides set file, log file directive ignored: " // trim( logfile_dir) ) ! if log file not named on command line open the named file else already_named log_file% io_unit = log_unit log_file% name_str = logfile_name log_file% named_file = .true. call open_file( log_file) end if already_named ! ---------------------------------------------------------------------- ! process_logfile_directive() exit return ! ********************************************************************** ! process_logfile_directive() end subroutine process_logfile_directive ! ********************************************************************** ! ********************************************************************** ! process_mark_directive() process mark directives subroutine process_mark_directive( mark_dir) ! ********************************************************************** ! process_mark_directive() interface ! ---------------------------------------------------------------------- ! the mark directive from the set file character( len= *), intent( in) :: mark_dir ! ********************************************************************** ! entry: mark_dir is blank_compress_lower_case mark directive ! it must be "on" or "off" ! exit: mark_dir is processed or error exit ! ********************************************************************** ! process_mark_directive() local ! ---------------------------------------------------------------------- ! count mark of some statements to disallow more than one logical, save :: too_many_mark_statements = .false. ! ********************************************************************** ! process_mark_directive() text continue ! ---------------------------------------------------------------------- ! only one mark statement per set file too_many_mark: if( too_many_mark_statements )then call msg_quit( "too many mark statements") else too_many_mark too_many_mark_statements = .true. end if too_many_mark ! ---------------------------------------------------------------------- ! process mark switch on_off: if( mark_dir == on_str )then options% mark_input = .true. else if( mark_dir == off_str )then on_off options% mark_input = .false. else on_off call msg_quit( "unknown option on mark directive: " // trim( mark_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_mark_directive() exit return ! ********************************************************************** ! process_mark_directive() end subroutine process_mark_directive ! ********************************************************************** ! ********************************************************************** ! process_number_directive() process number directives subroutine process_number_directive( number_dir) ! ********************************************************************** ! process_number_directive() interface ! ---------------------------------------------------------------------- ! the number directive from the set file character( len= *), intent( in) :: number_dir ! ********************************************************************** ! entry: number_dir is blank_compress_lower_case number directive ! it must be "on" or "off" ! exit: number_dir is processed or error exit ! ********************************************************************** ! process_number_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_number_statements = .false. ! ********************************************************************** ! process_number_directive() text continue ! ---------------------------------------------------------------------- ! only one number statement per set file too_many_number: if( too_many_number_statements )then call msg_quit( "too many number statements") else too_many_number too_many_number_statements = .true. end if too_many_number ! ---------------------------------------------------------------------- ! process number switch on_off: if( number_dir == on_str )then options% number_source = .true. else if( number_dir == off_str )then on_off options% number_source = .false. else on_off call msg_quit( "unknown option on number directive: " // trim( number_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_number_directive() exit return ! ********************************************************************** ! process_number_directive() end subroutine process_number_directive ! ********************************************************************** ! ********************************************************************** ! process_output_directive() process output directive subroutine process_output_directive( output_dir) ! ********************************************************************** ! process_output_directive() interface ! ---------------------------------------------------------------------- ! the output directive from the set file character( len= *), intent( in) :: output_dir ! ********************************************************************** ! entry: output_dir is a file file to be opened as the output file ! exit: output_dir is set ! ********************************************************************** ! process_output_directive() local ! ---------------------------------------------------------------------- ! the name of the file to be opened character( len= file_name_len) :: output_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len ! count number of some statements to disallow more than one logical, save :: too_many_output_statements = .false. ! ********************************************************************** ! process_output_directive() text continue ! ---------------------------------------------------------------------- ! only one log file statement per set file too_many_outputs: if( too_many_output_statements )then call msg_quit( "too many output statements") else too_many_outputs too_many_output_statements = .true. end if too_many_outputs ! unquote string on directive call unquote_string( output_dir, output_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on output directive: " // trim( output_dir) ) else if( unquoted_len > len_trim( output_dir) )then badly_quoted call msg_quit( "badly quoted name found on output directive: " // trim( output_dir) ) end if badly_quoted ! ---------------------------------------------------------------------- ! if log file named on command line ignore the directive already_named: if( output_file% named_file )then call msg_continue( "command line overrides set file, output directive ignored: " // trim( output_dir) ) ! if log file not named on command line open the named file else already_named number_of_names = number_of_names + 1 output_file% io_unit = write_unit output_file% name_str = output_name output_file% named_file = .true. end if already_named ! ---------------------------------------------------------------------- ! process_output_directive() exit return ! ********************************************************************** ! process_output_directive() end subroutine process_output_directive ! ********************************************************************** ! ********************************************************************** ! process_post_directive() process post directives subroutine process_post_directive( post_dir) ! ********************************************************************** ! process_post_directive() interface ! ---------------------------------------------------------------------- ! the post directive from the set file character( len= *), intent( in) :: post_dir ! ********************************************************************** ! entry: post_dir is blank_compress_lower_case post directive ! it must be "on" or "off" ! exit: post_dir is processed or error exit ! ********************************************************************** ! process_post_directive() local ! ---------------------------------------------------------------------- ! count post of some statements to disallow more than one logical, save :: too_many_post_statements = .false. ! ********************************************************************** ! process_post_directive() text continue ! ---------------------------------------------------------------------- ! only one post statement per set file too_many_post: if( too_many_post_statements )then call msg_quit( "too many post statements") else too_many_post too_many_post_statements = .true. end if too_many_post ! ---------------------------------------------------------------------- ! process post switch on_off: if( post_dir == on_str )then options% postpend_setfile = .true. else if( post_dir == off_str )then on_off options% postpend_setfile = .false. else on_off call msg_quit( "unknown option on post directive: " // trim( post_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_post_directive() exit return ! ********************************************************************** ! process_post_directive() end subroutine process_post_directive ! ********************************************************************** ! ********************************************************************** ! process_summary_directive() process report directives subroutine process_summary_directive( report_dir) ! ********************************************************************** ! process_summary_directive() interface ! ---------------------------------------------------------------------- ! the srap directive from the set file character( len= *), intent( in) :: report_dir ! ********************************************************************** ! entry: report_dir is blank_compress_lower_case report directive ! it must be "on" or "off" ! exit: report_dir is processed or error exit ! ********************************************************************** ! process_summary_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_report_statements = .false. ! ********************************************************************** ! process_summary_directive() text continue ! ---------------------------------------------------------------------- ! only one report statement per set file too_many_reports: if( too_many_report_statements )then call msg_quit( "too many report statements") else too_many_reports too_many_report_statements = .true. end if too_many_reports ! ---------------------------------------------------------------------- ! process report switch on_off: if( report_dir == on_str )then options% print_report = .true. else if( report_dir == off_str)then on_off options% print_report = .false. else on_off call msg_quit( "unknown option on report directive: " // trim( report_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_summary_directive() exit return ! ********************************************************************** ! process_summary_directive() end subroutine process_summary_directive ! ********************************************************************** ! ********************************************************************** ! process_verbose_directive() process verbose directives subroutine process_verbose_directive( verbose_dir) ! ********************************************************************** ! process_verbose_directive() interface ! ---------------------------------------------------------------------- ! the verbose directive from the set file character( len= *), intent( in) :: verbose_dir ! ********************************************************************** ! entry: verbose_dir is blank_compress_lower_case verbose directive ! it must be "on" or "off" ! exit: verbose_dir is processed or error exit ! ********************************************************************** ! process_verbose_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_verbose_statements = .false. ! ********************************************************************** ! process_verbose_directive() text continue ! ---------------------------------------------------------------------- ! only one verbose statement per set file too_many_verboses: if( too_many_verbose_statements )then call msg_quit( "too many verbose statements") else too_many_verboses too_many_verbose_statements = .true. end if too_many_verboses ! ---------------------------------------------------------------------- ! process verbose switch if not already set on command line on_off: if( verbose_dir == on_str )then options% verbose_mode = .true. else if( verbose_dir == off_str)then on_off options% verbose_mode = .false. else on_off call msg_quit( "unknown option on verbose directive: " // trim( verbose_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_verbose_directive() exit return ! ********************************************************************** ! process_verbose_directive() end subroutine process_verbose_directive ! ********************************************************************** ! ********************************************************************** ! process_wrap_directive() process wrap directives subroutine process_wrap_directive( wrap_dir) ! ********************************************************************** ! process_wrap_directive() interface ! ---------------------------------------------------------------------- ! the wrap directive from the set file character( len= *), intent( in) :: wrap_dir ! ********************************************************************** ! entry: wrap_dir is blank_compress_lower_case wrap directive ! it must be "on" or "off" ! exit: wrap_dir is processed or error exit ! ********************************************************************** ! process_wrap_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_wrap_statements = .false. ! ********************************************************************** ! process_wrap_directive() text continue ! ---------------------------------------------------------------------- ! only one wrap statement per set file too_many_wrap: if( too_many_wrap_statements )then call msg_quit( "too many wrap statements") else too_many_wrap too_many_wrap_statements = .true. end if too_many_wrap ! ---------------------------------------------------------------------- ! process wrap switch on_off: if( wrap_dir == on_str )then options% wrapping_lines = .true. else if( wrap_dir == off_str )then on_off options% wrapping_lines = .false. else on_off call msg_quit( "unknown option on wrap directive: " // trim( wrap_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_wrap_directive() exit return ! ********************************************************************** ! process_wrap_directive() end subroutine process_wrap_directive ! ********************************************************************** ! ********************************************************************** ! get_sf_symbol_name() extract symbol name and determine its length subroutine get_sf_symbol_name( decl_stmt, symbol_name, name_len) ! ********************************************************************** ! get_sf_symbol_name() interface ! ---------------------------------------------------------------------- ! a declaration statement with a symbol name character( len= *), intent( in) :: decl_stmt ! the name of the symbol character( len= *), intent( out) :: symbol_name ! the length of the symbol name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name=..." ! exit: a valid symbol name and its length or error exit ! ********************************************************************** ! get_sf_symbol_name() constants ! ---------------------------------------------------------------------- ! characters which must end a symbol name character( len= *), parameter :: end_of_name = equals // blank ! ********************************************************************** ! get_sf_symbol_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_sf_symbol_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) name_error: if( char_idx == 0 )then call msg_quit( "can't find name in set file declaration: " // trim( decl_stmt)) end if name_error ! length of name is one less than first character past name name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is a valid new name call valid_new_sf_name( decl_stmt( 1: name_len)) ! return name symbol_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_sf_symbol_name() exit return ! ********************************************************************** ! get_sf_symbol_name() end subroutine get_sf_symbol_name ! ********************************************************************** ! ********************************************************************** ! process_sf_integer_declaration() process integer declarations subroutine process_sf_integer_declaration( integer_stmt, is_const) ! ********************************************************************** ! process_sf_integer_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: integer_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_stmt is blank_compress_lower_case integer declaration past the integer keyword ! "::..." | ",parameter::..." ! exit: int_stmt is processed or error exit ! ********************************************************************** ! process_sf_integer_declaration() constants ! ---------------------------------------------------------------------- ! mark the end of a definition character( len= *), parameter :: end_of_def = comma // blank ! ********************************************************************** ! process_sf_integer_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: def_len ! ********************************************************************** ! process_sf_integer_declaration() text continue ! ---------------------------------------------------------------------- next_char = 1 ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string def_len = scan( integer_stmt( next_char: ), end_of_def) + next_char - 1 symbol_str = integer_stmt( next_char: def_len - 1) ! extract symbol name call get_symbol_name( symbol_str, symbol_name, symbol_len) ! check for valid new set file name call valid_new_sf_name( symbol_name( 1: symbol_len)) ! store symbol in symbol list call add_sf_integer( symbol_str( symbol_len + 1: def_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( integer_stmt( def_len: def_len) == blank )then exit all_symbols end if all_done ! move to next symbol next_char = def_len + 1 ! extract all symbols on directive end do all_symbols ! ---------------------------------------------------------------------- ! process_sf_integer_declaration() exit return ! ********************************************************************** ! process_sf_integer_declaration() end subroutine process_sf_integer_declaration ! ********************************************************************** ! ********************************************************************** ! add_sf_integer() store integer declaration in symbol table subroutine add_sf_integer( int_decl_str, integer_name, is_const) ! ********************************************************************** ! add_sf_integer() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: int_decl_str ! the symbol name character( len= *), intent( in) :: integer_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case integer declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: integer declaration is added to the integer symbol list or error exit ! ********************************************************************** ! add_sf_integer() local ! ---------------------------------------------------------------------- ! expression defining integer symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! add_sf_integer() text continue ! ---------------------------------------------------------------------- ! allocate new integer allocate( integer_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate set file integer: " // trim( integer_name)) end if alloc_error ! build new integer on list subsequent_or_first: if( associated( first_sf_symbol) )then last_sf_symbol% next => integer_ptr last_sf_symbol => last_sf_symbol% next else subsequent_or_first first_sf_symbol => integer_ptr last_sf_symbol => first_sf_symbol end if subsequent_or_first nullify( integer_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members integer_ptr% name_str = integer_name integer_ptr% declared_file = current_file% name_str integer_ptr% declared_line = current_file% lines_transfered ! ---------------------------------------------------------------------- ! store whether integer is a constant integer_ptr% constant = is_const ! determine if declaration specifies a value got_eq: if( len( int_decl_str) > 0 )then integer_ptr% defined = int_decl_str( 1: len( equals)) == equals else got_eq integer_ptr% defined = .false. end if got_eq ! there must be a value in the set file to compute and store constant_value: if( .not. integer_ptr% defined )then call msg_quit( "a set file integer constant must have a value: " // trim( integer_name) // trim( int_decl_str) ) end if constant_value ! decode the value process_value: if( integer_ptr% defined )then all_constants = .true. expr_str = int_decl_str( len( equals) + 1: ) call eval_int_expr( expr_str, integer_ptr% integer_value) non_const: if( integer_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define set file integer constant: " // trim( integer_name)) end if non_const integer_ptr% defined_file = current_file% name_str integer_ptr% defined_line = current_file% lines_transfered end if process_value ! ---------------------------------------------------------------------- ! add_sf_integer() exit return ! ********************************************************************** ! add_sf_integer() end subroutine add_sf_integer ! ********************************************************************** ! ********************************************************************** ! process_sf_logical_declaration() process logical declarations subroutine process_sf_logical_declaration( logical_stmt, is_const) ! ********************************************************************** ! process_sf_logical_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the logical declaration character( len= *), intent( in) :: logical_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: logical_stmt is blank_compress_lower_case logical declaration past the logical keyword ! "::..." | ",parameter::..." ! exit: logical declaration is processed or error exit ! ********************************************************************** ! process_sf_logical_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: decl_len ! ********************************************************************** ! process_sf_logical_declaration() text continue next_char = 1 ! ---------------------------------------------------------------------- ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string decl_len = scan( logical_stmt( next_char: ), end_of_decl) + next_char - 1 symbol_str = logical_stmt( next_char: decl_len - 1) ! extract symbol name call get_sf_symbol_name( symbol_str, symbol_name, symbol_len) ! check for valid new set file name call valid_new_sf_name( symbol_name( 1: symbol_len)) ! store symbol in symbol list call add_sf_logical( symbol_str( symbol_len + 1: decl_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( logical_stmt( decl_len: decl_len) == blank )then exit all_symbols end if all_done ! reset for next symbol next_char = decl_len + 1 ! extract all symbols on directive end do all_symbols ! ---------------------------------------------------------------------- ! process_sf_logical_declaration() exit return ! ********************************************************************** ! process_sf_logical_declaration() end subroutine process_sf_logical_declaration ! ********************************************************************** ! ********************************************************************** ! add_sf_logical() store logical declaration in symbol table subroutine add_sf_logical( log_decl_str, logical_name, is_const) ! ********************************************************************** ! add_sf_logical() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: log_decl_str ! the valid logical name character( len= *), intent( in) :: logical_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case logical declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_sf_logical() local ! ---------------------------------------------------------------------- ! expression defining logical symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! add_sf_logical() text continue ! ---------------------------------------------------------------------- ! allocate new logical allocate( logical_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate set file logical: " // trim( logical_name)) end if alloc_error ! build new logical on list subsequent_or_first: if( associated( first_sf_symbol) )then last_sf_symbol% next => logical_ptr last_sf_symbol => last_sf_symbol% next else subsequent_or_first first_sf_symbol => logical_ptr last_sf_symbol => first_sf_symbol end if subsequent_or_first nullify( logical_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members logical_ptr% name_str = logical_name logical_ptr% declared_file = current_file% name_str logical_ptr% declared_line = current_file% lines_transfered ! ---------------------------------------------------------------------- ! store whether logical is a constant logical_ptr% constant = is_const ! store whether symbol is declared in the set file logical_ptr% sf_defined = .false. ! determine if declaration specifies a value got_eq: if( len( log_decl_str) > 0 )then logical_ptr% defined = log_decl_str( 1: len( equals)) == equals else got_eq logical_ptr% defined = .false. end if got_eq ! there must be a value in the set file to compute and store constant_value: if( .not. logical_ptr% defined )then call msg_quit( "a set file logical constant must have a value: " & // trim( logical_name) // trim( log_decl_str) ) end if constant_value ! decode the value process_value: if( logical_ptr% defined )then all_constants = .true. expr_str = log_decl_str( len( equals) + 1: ) call eval_log_expr( expr_str, logical_ptr% logical_value) non_const: if( logical_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define logical constant: " // trim( logical_name)) end if non_const logical_ptr% defined_file = current_file% name_str logical_ptr% defined_line = current_file% lines_transfered end if process_value ! ---------------------------------------------------------------------- ! add_sf_logical() exit return ! ********************************************************************** ! add_sf_logical() end subroutine add_sf_logical ! ********************************************************************** ! ********************************************************************** ! %%% read and write files, and process coco lines and statements ! ********************************************************************** ! ********************************************************************** ! process_input_file() reads a coco source file, recurse upon include files recursive subroutine process_input_file( this_file) ! ********************************************************************** ! process_input_file() interface ! ---------------------------------------------------------------------- ! the file to be processed type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! entry: source file to be processed ! exit: source file has been processed or error ! ********************************************************************** ! process_input_file() local ! ---------------------------------------------------------------------- ! statement buffer character( len= buffer_len) :: statement ! signal complete statement logical :: complete ! get if block nesting correct at file open and close type( if_t), pointer :: file_if_level ! store to line macro character( len= conversion_len) :: line_str ! ********************************************************************** ! process_input_file() text continue ! the if level at the start of this file file_if_level => if_construct ! open source file call open_file( this_file) ! count files total% input_files = total% input_files + 1 ! set file predefined macro predefined_macros( file_idx)% macro_value = this_file% name_str ! as if finished a complete statement at beginning of file complete = .true. ! ---------------------------------------------------------------------- ! main read lines loop read_lines: do ! read from input file read( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & this_file% line read_source: if( this_file% io_status > 0 )then call msg_quit( "can't read input file: " // trim( this_file% name_str)) end if read_source ! ---------------------------------------------------------------------- ! read until end of file or complete statement read_eof: if( this_file% io_status < 0 )then call blank_compress_lower_case( statement, null_string) continuation_eof: if( .not. complete )then call msg_quit( "end of file encountered in a continued coco statement") end if continuation_eof exit read_lines end if read_eof ! ---------------------------------------------------------------------- ! count lines this_file% lines_transfered = this_file% lines_transfered + 1 write( unit= line_str, fmt= conversion_fmt) this_file% lines_transfered predefined_macros( line_idx)% macro_value = adjustl( line_str) ! process coco lines or source lines process_coco: if( line( 1: len( coco_key)) == coco_key )then ! count lines total% coco_lines = total% coco_lines + 1 ! write coco line to the output call write_coco_line( output_file) ! if line is not a coco comment coco_statement: if( is_coco_statement( line( len( coco_key) + 1: )) )then ! read a complete statement call gather_coco_statement( line, statement, complete) ! ---------------------------------------------------------------------- ! process coco directives ! ---------------------------------------------------------------------- ! directive is a coco include directive process_directive: if( statement( 1: len( include_str)) == include_str )then ! cannot continue an include line continue_include: if( .not. complete )then call msg_quit( "include line cannot be continued") end if continue_include ! process (possibly recursive) include directives (include 'a' --> include 'b' and so on) call process_include_directive( statement( len( include_str) + 1: )) ! reset current file current_file => this_file ! reset file predefined macro predefined_macros( file_idx)% macro_value = this_file% name_str ! directive is a coco endfile directive else if( statement( 1: len( endfile_str)) == endfile_str )then process_directive ! cannot continue an endfile line continue_endfile: if( .not. complete )then call msg_quit( "endfile line cannot be continued") end if continue_endfile active_endfile: if( if_construct% now_selected )then call process_endfile_directive( statement, file_if_level) exit read_lines end if active_endfile ! process any other directive else process_directive ! if not yet a complete statement go get the rest of it get_statement: if( ( .not. complete) )then cycle read_lines end if get_statement ! process other (not possibly recursive) coco directives call process_coco_statement( statement) end if process_directive ! if line is not a coco comment end if coco_statement ! ---------------------------------------------------------------------- ! process source lines else process_coco ! error if a source line is mixed into a continued coco statement continuation_error: if( .not. complete )then call msg_quit( "source line encountered in a continued coco statement") end if continuation_error ! if within the active block of a coco if construct active_source: if( if_construct% now_selected )then ! if left key characters present, edit source line edit_line: if( index( string= line, substring= l_key) > 0 )then call edit_source_line( line) end if edit_line end if active_source ! copy source lines call write_source_line( output_file) ! end processing coco lines end if process_coco ! end main read lines loop end do read_lines total% input_lines = total% input_lines + this_file% lines_transfered ! ---------------------------------------------------------------------- ! no open if blocks no_blocks: if( .not. associated( if_construct, file_if_level) )then call msg_quit( "badly nested if-block at end of file: " // trim( this_file% name_str)) end if no_blocks nullify( file_if_level) ! end of file call close_file( this_file) ! ---------------------------------------------------------------------- ! process_input_file() exit return ! ********************************************************************** ! process_input_file() end subroutine process_input_file ! ********************************************************************** ! ********************************************************************** ! gather_coco_statement() examine lines and signal a complete statement subroutine gather_coco_statement( line, statement, complete) ! ********************************************************************** ! gather_coco_statement() interface ! ---------------------------------------------------------------------- ! the current input file character( len= *), intent( in) :: line ! the statement as it is built character( len= *), intent( in out) :: statement ! true when a complete statement has been seen logical, intent( out) :: complete ! ********************************************************************** ! entry: statement is a line ! "..." ! exit: statement is accumulated, complete is true when whole ! ********************************************************************** ! gather_coco_statement() local ! ---------------------------------------------------------------------- ! count continuation lines integer, save :: continuation_lines = 0 ! ---------------------------------------------------------------------- ! number of characters processed so far integer, save :: statement_len = 0 ! ********************************************************************** ! gather_coco_statement() text continue ! ---------------------------------------------------------------------- ! blank compress lower case call blank_compress_lower_case( statement, line( len( coco_key) + 1: ) ) ! if statement length hasn't changed and statement is not a comment null_stmt: if( statement_len == len_trim( statement) )then call msg_quit( "null statement encountered in continuation sequence") end if null_stmt ! if not a complete statement yet statement_len = len_trim( statement) ! last character is continuation means more to read to get a complete statement incomplete: if( statement( statement_len: statement_len) == continuation )then ! if too many continuation lines too_many: if( continuation_lines > max_continuations )then call msg_quit( "too many continuations") end if too_many ! count continuation lines continuation_lines = continuation_lines + 1 ! go get the rest of the statement complete = .false. return end if incomplete ! coco statement is complete continuation_lines = 0 statement_len = 0 complete = .true. ! ---------------------------------------------------------------------- ! gather_coco_statement() exit return ! ********************************************************************** ! gather_coco_statement() end subroutine gather_coco_statement ! ********************************************************************** ! ********************************************************************** ! is_coco_statement() true if coco statement is a coco construct and not a coco comment logical function is_coco_statement( coco_stmt) ! ********************************************************************** ! is_coco_statement() interface ! ---------------------------------------------------------------------- ! the coco statement to be categorized character( len= *), intent( in) :: coco_stmt ! ********************************************************************** ! entry: coco_stmt is coco statement past the coco key ! "..." ! exit: true if statement is a coco construct, ! false if statement is a coco comment ! ********************************************************************** ! is_coco_statement() local ! ---------------------------------------------------------------------- ! locations of specific characters integer :: char_idx ! ********************************************************************** ! is_coco_statement() text continue ! ---------------------------------------------------------------------- ! scan from first character (past coco key) for non-whitespace char_idx = verify( coco_stmt, white_space) ! if found other than whitespace white_space_or_comment: if( char_idx > 0 )then ! is construct if first character past the white space is not comment is_coco_statement = coco_stmt( char_idx: char_idx) /= comment ! all whitespace else white_space_or_comment ! is not a construct is_coco_statement = .false. end if white_space_or_comment ! ---------------------------------------------------------------------- ! is_coco_statement() exit return ! ********************************************************************** ! is_coco_statement() end function is_coco_statement ! ********************************************************************** ! ********************************************************************** ! write_coco_line() write a coco line of output subroutine write_coco_line( this_file) ! ********************************************************************** ! write_coco_line() interface ! ---------------------------------------------------------------------- ! the file to receive the output type( file_t), intent( in out) :: this_file ! ********************************************************************** ! entry: out_unit is the logical unit connected to the output file ! coco_line is a line to be written as per the current alter state ! exit: line has been written or error exit ! ********************************************************************** ! write_coco_line() constants ! ---------------------------------------------------------------------- ! line prefix when alter state is shift 3 character( len= *), parameter :: shift3_prefix = '!?>' ! ********************************************************************** ! write_coco_line() local ! ---------------------------------------------------------------------- ! maximum line length character( len= buffer_len) :: line_buffer ! ********************************************************************** ! write_coco_line() text continue ! ---------------------------------------------------------------------- ! write output as per alter state alter_print: select case( options% alter_state) ! delete the line case( alter_delete) alter_print return ! blank line case( alter_blank) alter_print write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & null_string ! comment the line case( alter_shift_0) alter_print line_buffer = comment // this_file% line( len( comment) + 1: ) ! check whether to number the source line want_numbers_shift_0: if( options% number_source )then ! if so, go number the atring call add_number_to_line( line_buffer) end if want_numbers_shift_0 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( line_buffer) ! shift one or comment the line case( alter_shift_1) alter_print line_buffer = comment // this_file% line( 1: len( this_file% line) - len( comment)) ! check whether to number the source line want_numbers_shift_1: if( options% number_source )then ! if so, go number the atring call add_number_to_line( line_buffer) end if want_numbers_shift_1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( line_buffer) ! shift three or comment the line case( alter_shift_3) alter_print line_buffer = shift3_prefix // this_file% line( 1: len( this_file% line) - len( shift3_prefix)) ! check whether to number the source line want_numbers_shift_3: if( options% number_source )then ! if so, go number the atring call add_number_to_line( line_buffer) end if want_numbers_shift_3 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( line_buffer) end select alter_print ! ---------------------------------------------------------------------- ! check write iostat write_this_file: if( this_file% io_status > 0 )then call msg_quit( "error writing source output: " // trim( this_file% name_str) ) end if write_this_file ! ---------------------------------------------------------------------- ! write_coco_line() exit return ! ********************************************************************** ! write_coco_line() end subroutine write_coco_line ! ********************************************************************** ! ********************************************************************** ! write_source_line() write a line of output subroutine write_source_line( this_file) ! ********************************************************************** ! write_source_line() interface ! ---------------------------------------------------------------------- ! the file to receive the output type( file_t), intent( in out) :: this_file ! ********************************************************************** ! entry: out_unit is the logical unit connected to the output file ! source_line is the line of Fortran source to be written ! exit: the line is written or error exit ! ********************************************************************** ! write_source_line() text continue ! ---------------------------------------------------------------------- ! if currently printing output process_line: if( if_construct% now_selected )then ! check whether to number the source line want_numbers: if( options% number_source )then ! if so, go number the atring call add_number_to_line( this_file% line) end if want_numbers ! write source output write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( this_file% line) ! check for write error write_error: if( this_file% io_status > 0 )then call msg_quit( "error writing source output: " // trim( this_file% name_str) ) end if write_error ! count lines written this_file% lines_transfered = this_file% lines_transfered + 1 total% selected_lines = total% selected_lines + 1 else process_line ! otherwise print as per the alter state call write_coco_line( this_file) total% elided_lines = total% elided_lines + 1 end if process_line ! ---------------------------------------------------------------------- ! write_source_line() exit return ! ********************************************************************** ! write_source_line() end subroutine write_source_line ! ********************************************************************** ! ********************************************************************** ! add_number_to_line() write a line of output subroutine add_number_to_line( output_line) ! ********************************************************************** ! add_number_to_line() interface ! ---------------------------------------------------------------------- ! the file to receive the output character( len= buffer_len), intent( in out) :: output_line ! ********************************************************************** ! entry: output_line is a line of output ! exit: the line has numbers added or error exit ! ********************************************************************** ! add_number_to_line() constants character( len= *), parameter :: name_prefix = '! ' character( len= *), parameter :: number_prefix = ': ' integer, parameter :: number_pad = 1 ! ********************************************************************** ! add_number_to_line() local ! ---------------------------------------------------------------------- ! character line number character( len= conversion_len) :: number_str ! where to put the line numbering integer, save :: number_len = card_image_len ! format a label ! file-name:line-number character( len= file_name_len) :: label ! ********************************************************************** ! add_number_to_line() text continue ! ---------------------------------------------------------------------- ! avoid touching current_file for lines not associated with an input file from_input: if( associated( current_file) )then ! get the line number as a string write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered ! prepare label label = name_prefix // trim( current_file% name_str) // number_prefix // adjustl( number_str) ! pick a length number_len = max( number_len, len_trim( output_line) + number_pad) ! add ! file: number output_line = output_line( 1: number_len) // trim( label) end if from_input ! ---------------------------------------------------------------------- ! add_number_to_line() exit return ! ********************************************************************** ! add_number_to_line() end subroutine add_number_to_line ! ********************************************************************** ! ********************************************************************** ! process_endfile_directive() process a coco endfile directive subroutine process_endfile_directive( endfile_dir, if_ptr) ! ********************************************************************** ! process_endfile_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an endfile directive character( len= *), intent( in) :: endfile_dir ! a pointer to the if block containing the first if block in this source type( if_t), pointer :: if_ptr ! ********************************************************************** ! entry: endfile_dir is blank_compress_lower_case if directive ! exit: the directive is processed or error exit ! ********************************************************************** ! process_endfile_directive() text continue ! ---------------------------------------------------------------------- ! check for a well formed if directive endfile_extra_chars: if( endfile_dir( len( endfile_str) + 1: ) /= blank )then call msg_quit( "extra characters after endfile directive: " // trim( endfile_dir)) end if endfile_extra_chars ! ---------------------------------------------------------------------- ! if this endfile is enclosed within selected lines active_lines: if( if_construct% enclosing% now_selected )then ! reset the if-block state so the next input starts ok pop_ifs: do if( associated( if_construct, if_ptr) ) exit pop_ifs call delete_block() end do pop_ifs end if active_lines ! ---------------------------------------------------------------------- ! process_endfile_directive() exit return ! ********************************************************************** ! process_endfile_directive() end subroutine process_endfile_directive ! ********************************************************************** ! ********************************************************************** ! process_include_directive() process an include directive recursive subroutine process_include_directive( include_dir) ! ********************************************************************** ! process_include_directive() interface ! ---------------------------------------------------------------------- ! the include directive character( len= *), intent( in) :: include_dir ! ********************************************************************** ! entry: inc_name is inlcude file name ! exit: inc_name is inlcude file name with directory prepended ! ********************************************************************** ! process_include_directive() constants ! ---------------------------------------------------------------------- ! mark the beginning and end of include files as per the standard character( len= *), parameter :: begin_inc = '??! include ' character( len= *), parameter :: end_inc = '??! end include ' ! ********************************************************************** ! process_include_directive() local ! ---------------------------------------------------------------------- ! file variable of file named on the include directive type( file_t), target :: include_file ! ---------------------------------------------------------------------- ! length of quoted include file name integer :: construct_len ! length of unquoted include file name integer :: name_len ! ********************************************************************** ! process_include_directive() text continue ! ---------------------------------------------------------------------- ! check the include syntax: unquote the include file name call unquote_string( include_dir, include_file% name_str, construct_len, name_len ) badly_quoted: if( name_len == 0 )then call msg_quit( "null include file name: " // trim( include_dir)) else if( construct_len > len_trim( include_dir) )then badly_quoted call msg_quit( "badly quoted include file name: " // trim( include_dir)) end if badly_quoted ! ---------------------------------------------------------------------- ! if active block, process include directive active_inc: if( if_construct% now_selected )then ! see if the include file exists inquire( file= include_file% name_str, & exist= include_file% named_file, iostat= include_file% io_status, iomsg= processor_msg) inquire_error: if( include_file% io_status > 0 )then call msg_quit( "can't inquire include file: " // trim( include_file% name_str) ) end if inquire_error ! if not found, check directories seek_inc: if( include_file% named_file )then count_include_in_dot = count_include_in_dot + 1 else seek_inc call seek_include_file( include_file) end if seek_inc ! if still not found, complain and quit no_name: if( .not. include_file% named_file )then call msg_quit( "can't find include file: " // trim( include_file% name_str) ) end if no_name ! ---------------------------------------------------------------------- ! build include_file to pass to process_input_file() ! ---------------------------------------------------------------------- ! get new unit include_unit: if( current_file% io_unit == input_unit )then include_file% io_unit = read_unit else include_unit include_file% io_unit = current_file% io_unit + 1 end if include_unit ! include file components include_file% format_str = current_file% format_str include_file% line => null() include_file% io_status = 0 include_file% lines_transfered = 0 include_file% named_file = .true. include_file% create = .false. ! ---------------------------------------------------------------------- ! mark include file in output line = begin_inc // include_file% name_str call write_coco_line( output_file) ! push dummy block on the if block list to catch badly nested if blocks call new_block( phase= include_block) ! prepare to process include file total% include_files = total% include_files + 1 ! process include file call process_input_file( include_file) ! push dummy block on the if block list to catch badly nested if blocks call delete_block( phase= include_block) ! mark include file in output line = end_inc // include_file% name_str call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! if active block, process include directive end if active_inc ! end processing include statement ! ---------------------------------------------------------------------- ! process_include_directive() exit return ! ********************************************************************** ! process_include_directive() end subroutine process_include_directive ! ********************************************************************** ! ********************************************************************** ! seek_include_file() seek inlcude file in directories subroutine seek_include_file( include_file) ! ********************************************************************** ! seek_include_file() interface ! ---------------------------------------------------------------------- ! the include file name to be sought type( file_t), intent( in out) :: include_file ! ********************************************************************** ! entry: include_file is inlcude file name ! exit: include_file is inlcude file name with directory prepended ! ********************************************************************** ! seek_include_file() local ! ---------------------------------------------------------------------- ! pointer to directories on path type( path_t), pointer :: directory ! construct path/names to check for existance character( len= file_name_len) :: trial_name ! ********************************************************************** ! seek_include_file() text continue ! ---------------------------------------------------------------------- ! search list for directory/file nullify( directory) directory => first_directory ! last directory in path is not associated search_path: do if( .not. associated( directory) ) exit search_path ! construct full name trial_name = trim( directory% name_str) // include_file% name_str ! check file existence inquire( file= trial_name, exist= include_file% named_file, iostat= include_file% io_status, iomsg= processor_msg) inquire_error: if( include_file% io_status > 0 )then call msg_quit( "can't inquire include file: " // trim( trial_name)) end if inquire_error ! found file name name_match: if( include_file% named_file )then ! found a file in this directory directory% times_accessed = directory% times_accessed + 1 ! rewrite include file name to include directory include_file% name_str = trial_name exit search_path end if name_match ! file name not yet found so try next directory directory => directory% next end do search_path ! ---------------------------------------------------------------------- ! seek_include_file() exit return ! ********************************************************************** ! seek_include_file() end subroutine seek_include_file ! ********************************************************************** ! ********************************************************************** ! %%% edit Fortran source lines ! ********************************************************************** ! ********************************************************************** ! edit_source_line() edit source lines subroutine edit_source_line( source_line) ! ********************************************************************** ! edit_source_line() interface ! ---------------------------------------------------------------------- ! source line to be edited character( len= *), intent( in out) :: source_line ! ********************************************************************** ! entry: line is a line of Fortran source ! with (possibly) ?file?, ?line?, ?date?, ?time?, ?integer?, ?logical?, ?macro? ! exit: line has any ?macro? etc. strings replaced with their values ! ********************************************************************** ! edit_source_line() local ! ---------------------------------------------------------------------- ! copy of line since editing may expand the line beyond its length character( len= buffer_len) :: edit_line ! make lower case copy of line character( len= buffer_len) :: lower_case_line ! ********************************************************************** ! edit_source_line() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! the line may be expanded by editing, so edit a long buffer edit_line = source_line ! make lower case copy of line lower_case_line = to_lower( source_line) ! ---------------------------------------------------------------------- ! process the predefined macros call edit_coco_strings( edit_line, lower_case_line) ! ---------------------------------------------------------------------- ! replace ?name? with the current integer value of name call edit_integer_strings( edit_line, lower_case_line) call edit_logical_strings( edit_line, lower_case_line) ! ---------------------------------------------------------------------- ! replace ?name? with the current string value of name call edit_macro_strings( edit_line, lower_case_line) ! ---------------------------------------------------------------------- ! remove any line length overflow if( options% wrapping_lines ) call wrap_source_line( edit_line) source_line = edit_line ! ---------------------------------------------------------------------- ! edit_source_line() exit return ! ********************************************************************** ! edit_source_line() end subroutine edit_source_line ! ********************************************************************** ! ********************************************************************** ! edit_coco_strings() process ?coco? strings subroutine edit_coco_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_coco_strings() interface ! ---------------------------------------------------------------------- ! the source line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?integer ! exit: line has any ?name strings replaced with their values ! ********************************************************************** ! edit_coco_strings() local ! ---------------------------------------------------------------------- ! make substring character( len= symbol_name_len) :: search_str integer :: search_len ! find substring index integer :: search_idx ! loop index integer :: i ! ********************************************************************** ! edit_coco_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace remaining predefined macros with their values edit_predefined: do i = 1, size( predefined_macros) search_str = l_key // trim( predefined_macros( i)% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) go_edit: if( search_idx > 0 )then call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), & trim( predefined_macros( i)% macro_value), search_idx) predefined_macros( i)% referenced = .true. predefined_macros( i)% referenced_file = current_file% name_str predefined_macros( i)% referenced_line = current_file% lines_transfered end if go_edit end do edit_predefined ! ---------------------------------------------------------------------- ! edit_coco_strings() exit return ! ********************************************************************** ! edit_coco_strings() end subroutine edit_coco_strings ! ********************************************************************** ! ********************************************************************** ! edit_integer_strings() process ?integer? strings subroutine edit_integer_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_integer_strings() interface ! ---------------------------------------------------------------------- ! the source line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?integer? ! exit: line has any ?name? strings replaced with their values ! ********************************************************************** ! edit_integer_strings() local ! ---------------------------------------------------------------------- ! string containing integer value character( len= conversion_len) :: value_str ! target string to be replaced character( len= target_len) :: search_str ! length of target string integer :: search_len ! point to integers on symbol list type( integer_t), pointer :: integer_ptr ! point to search_str location in line integer :: search_idx ! ********************************************************************** ! edit_integer_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace ?integer? with the current string value of integer nullify( integer_ptr) ! test the occurance of each integer on symbol list each_integer: do call get_next_integer( integer_ptr) if( .not. associated( integer_ptr) ) exit each_integer ! does ?integer? appear on line search_str = l_key // trim( integer_ptr% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) ! if found the target, try to replace it with its value go_integer: if( search_idx > 0 )then ! if integer has a value no_value: if( .not. integer_ptr% defined )then call msg_quit( "edit integer symbol not defined: " // trim( integer_ptr% name_str) ) end if no_value write( unit= value_str, fmt= conversion_fmt) integer_ptr% integer_value value_str = adjustl( value_str) ! go replace the string with its value call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), trim( value_str), & search_idx) end if go_integer end do each_integer ! ---------------------------------------------------------------------- ! edit_integer_strings() exit return ! ********************************************************************** ! edit_integer_strings() end subroutine edit_integer_strings ! ********************************************************************** ! ********************************************************************** ! edit_logical_strings() process ?logical? strings subroutine edit_logical_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_logical_strings() interface ! ---------------------------------------------------------------------- ! the source line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?logical ! exit: line has any ?name strings replaced with their values ! ********************************************************************** ! edit_logical_strings() local ! ---------------------------------------------------------------------- ! string containing logical value character( len= conversion_len) :: value_str ! target string to be replaced character( len= target_len) :: search_str ! length of target string integer :: search_len ! point to logicals on symbol list type( logical_t), pointer :: logical_ptr ! point to search_str location in line integer :: search_idx ! ********************************************************************** ! edit_logical_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace ?logical? with the current string value of logical nullify( logical_ptr) each_logical: do call get_next_logical( logical_ptr) if( .not. associated( logical_ptr) ) exit each_logical ! does ?logical? appear on line search_str = l_key // trim( logical_ptr% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) go_logical: if( search_idx > 0 )then ! if logical has a value no_value: if( .not. logical_ptr% defined )then call msg_quit( "edit logical symbol not defined: " // trim( logical_ptr% name_str) ) end if no_value decode: if( logical_ptr% logical_value )then value_str = true_str else decode value_str = false_str end if decode call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), & trim( value_str), search_idx) end if go_logical end do each_logical ! ---------------------------------------------------------------------- ! edit_logical_strings() exit return ! ********************************************************************** ! edit_logical_strings() end subroutine edit_logical_strings ! ********************************************************************** ! ********************************************************************** ! edit_macro_strings() process ?macro? strings subroutine edit_macro_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_macro_strings() interface ! ---------------------------------------------------------------------- ! the osurce line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?macro ! exit: line has any ?macro strings replaced with their values ! ********************************************************************** ! edit_macro_strings() local ! ---------------------------------------------------------------------- ! string containing macro value character( len= target_len) :: search_str ! length of ?macro? integer :: search_len ! point to ?macro? integer :: search_idx ! argument strings character( len= buffer_len) :: value_str ! scan for macros type( macro_t), pointer :: macro_ptr ! end of substrings integer :: close_paren_idx integer :: open_paren_idx integer :: value_len ! ********************************************************************** ! edit_macro_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace ?macro? with the current string value of macro nullify( macro_ptr) each_macro: do call get_next_macro( macro_ptr) end_of_list: if( .not. associated( macro_ptr) )then exit each_macro end if end_of_list ! ---------------------------------------------------------------------- ! does ?macro? appear on line search_str = l_key // trim( macro_ptr% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) ! ---------------------------------------------------------------------- ! if macro appears on line found_macro: if( search_idx > 0 )then macro_ptr% referenced = .true. macro_ptr% referenced_file = current_file% name_str macro_ptr% referenced_line = current_file% lines_transfered ! macro definition has a dummy arg list have_arg_list: if( allocated( macro_ptr% dummy_args) )then ! must rebuild the macro value with each new set of actual args next_dummy_args: do if( search_idx == 0 ) exit next_dummy_args ! check for actual arg list open_paren_idx = search_idx + search_len no_actual_args: if( edit_line( open_paren_idx: open_paren_idx) /= open_paren )then call msg_quit( "macro args missing: " // trim( macro_ptr% name_str) ) end if no_actual_args ! have an actual arg list, find the close parenthesis call seek_close_paren( edit_line, open_paren_idx, close_paren_idx) no_close_paren: if( close_paren_idx > len_trim( edit_line) )then call msg_quit( "can't find close parenthesis on line to be edited: " // trim( edit_line)) end if no_close_paren call make_actual_array( edit_line( open_paren_idx + 1: close_paren_idx - 1) // comma, & macro_ptr% actual_args, macro_ptr% args_in_parens) ! build the new macro value call process_actual_arglist( macro_ptr% actual_args, & value_str, macro_ptr% macro_value, macro_ptr% dummy_args) ! substitute it value_len = len_trim( value_str) ! replace whole "?macro?(args)" with computed macro value edit_line = edit_line( 1: search_idx - 1) // value_str( 1: value_len) & // edit_line( close_paren_idx + 1: ) lower_case_line = lower_case_line( 1: search_idx - 1) // value_str( 1: value_len) & // lower_case_line( close_paren_idx + 1: ) ! find the next occurance of ?macro? search_idx = index( lower_case_line, trim( search_str( 1: search_len)) ) end do next_dummy_args ! ---------------------------------------------------------------------- ! no arg list so macro value doesn't change else have_arg_list ! insert macro into the line value_len = len_trim( macro_ptr% macro_value) call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), & macro_ptr% macro_value( 1: value_len), search_idx) end if have_arg_list ! ---------------------------------------------------------------------- ! done with this macro end if found_macro ! ---------------------------------------------------------------------- ! go try the next macro end do each_macro ! ---------------------------------------------------------------------- ! edit_macro_strings() exit return ! ********************************************************************** ! edit_macro_strings() end subroutine edit_macro_strings ! ********************************************************************** ! ********************************************************************** ! make_actual_array() process actual arglist strings to actual arg array subroutine make_actual_array( actual_args, actual_array, must_parens) ! ********************************************************************** ! make_actual_array() interface ! ---------------------------------------------------------------------- ! the actual args from the source line character( len= *), intent( in) :: actual_args ! the actual args one per element character( len= *), dimension( :), intent( out) :: actual_array ! true if must enclose actual arguments in parenthesis logical, intent( in) :: must_parens ! ********************************************************************** ! entry: actual_args is a single string with the actual args ! exit: actual array is the actual args one per array element ! ********************************************************************** ! make_actual_array() local ! ---------------------------------------------------------------------- ! index the actual args array integer :: i_arg ! index characters integer :: i_char ! mark the previous character integer :: prev_char ! mark the close parenthesis integer :: close_paren_idx ! ********************************************************************** ! make_actual_array() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! scan through the actual arguments string to find a comma outside parenthesis i_char = 1 prev_char = 1 i_arg = 1 each_char: do ! find a comma outside parenthesis find_actual: select case( actual_args( i_char: i_char)) ! at open paren, skip to matching paren case( open_paren) find_actual call seek_close_paren( actual_args, i_char, close_paren_idx) no_close_paren: if( close_paren_idx > len_trim( actual_args) )then call msg_quit( "can't find close parenthesis in actual argument list: " // trim( actual_args)) end if no_close_paren i_char = close_paren_idx + 1 ! actual argument is isolated before comma outside parenthesis case( comma) find_actual ensure_parens: if( must_parens )then call seek_close_paren( actual_args, prev_char, close_paren_idx) needs_parens: if( close_paren_idx == i_char - 1 )then actual_array( i_arg) = adjustl( actual_args( prev_char: i_char - 1)) else needs_parens actual_array( i_arg) = open_paren // trim( adjustl( actual_args( prev_char: i_char - 1))) // close_paren end if needs_parens else ensure_parens actual_array( i_arg) = adjustl( actual_args( prev_char: i_char - 1)) end if ensure_parens if( i_arg == size( actual_array) ) exit each_char i_arg = i_arg + 1 i_char = i_char + 1 prev_char = i_char ! otherwise, keep checking characters case default find_actual i_char = i_char + 1 end select find_actual end do each_char ! ---------------------------------------------------------------------- ! make_actual_array() exit return ! ********************************************************************** ! make_actual_array() end subroutine make_actual_array ! ********************************************************************** ! ********************************************************************** ! process_actual_arglist() process macro actual arglist strings subroutine process_actual_arglist( actual_args, value_str, macro_value_str, dummy_args) ! ********************************************************************** ! process_actual_arglist() interface ! ---------------------------------------------------------------------- ! the comma separated actual args from the macro instance character( len= *), dimension( :), intent( in) :: actual_args ! the value of the macro after editing character( len= *), intent( out) :: value_str ! the macro value character( len= *), intent( in) :: macro_value_str ! the macro dummy args character( len= symbol_name_len), dimension( :), intent( in) :: dummy_args ! ********************************************************************** ! entry: arg_list is an actual argument list ! macro is a macro variable ! exit: value_buf has the macro's value with all dummy args replaced by actuals ! ********************************************************************** ! process_actual_arglist() local ! ---------------------------------------------------------------------- ! search lower case copy macro text with actual args character( len= len( value_str)) :: lc_value_str ! ---------------------------------------------------------------------- ! construct macro text with actual args character( len= target_len) :: search_str integer :: search_len ! ---------------------------------------------------------------------- ! index argument loop integer :: i ! character pointers integer :: dummy_idx ! ********************************************************************** ! process_actual_arglist() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! the value will be edited with the actual args value_str = macro_value_str lc_value_str = to_lower( value_str) ! loop thru each dummy arg each_arg: do i = 1, size( dummy_args) ! prepare the ?dummy? string search_str = l_key // trim( dummy_args( i) ) // r_key search_len = len_trim( search_str) dummy_idx = index( lc_value_str, search_str( 1: search_len)) substitute: if( dummy_idx > 0 )then call replace_substring( mixed_case_str= value_str, & lower_case_str= lc_value_str, search_str= search_str( 1: search_len), & replace_str= trim( actual_args( i)), first_idx= dummy_idx) end if substitute end do each_arg ! ---------------------------------------------------------------------- ! process_actual_arglist() exit return ! ********************************************************************** ! process_actual_arglist() end subroutine process_actual_arglist ! ********************************************************************** ! ********************************************************************** ! wrap_source_line() ensure lines are not too long subroutine wrap_source_line( wrap_line) ! ********************************************************************** ! wrap_source_line() interface ! ---------------------------------------------------------------------- ! the line to be wrapped character( len= *), target, intent( in out) :: wrap_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) more than 132 characters ! exit: line has continuations written and fewer than 132 source lines ! ********************************************************************** ! wrap_source_line() constants ! ---------------------------------------------------------------------- ! start in the right column for fixed format integer, parameter :: start_col = 5 ! fixed format start of line character( len= *), parameter :: blank_str = repeat( blank, start_col) ! fixed format start of line integer, parameter :: no_comment = huge( 0) ! ********************************************************************** ! wrap_source_line() local ! ---------------------------------------------------------------------- ! length of source line integer :: output_len ! index of comment integer :: comment_idx ! ********************************************************************** ! wrap_source_line() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! initialize output_len = len_trim( wrap_line) comment_idx = no_comment ! ---------------------------------------------------------------------- ! while line is too long wrap_lines: do if( output_len <= wrap_len ) exit wrap_lines ! seek a comment prior to the wrap length call seek_comment_idx( wrap_line( 1: output_len), comment_idx) if( comment_idx <= wrap_len ) exit wrap_lines ! process fixed format differently fix_length: if( options% free_form )then ! free format line up to the breakpoint, then the continuation character line = wrap_line( 1: wrap_len - len( continuation)) // continuation ! the continuation character, then the rest of the line wrap_line = continuation // wrap_line( wrap_len: ) else fix_length if( line( 1: 1) == 'c' .or. line( 1: 1) == 'C' .or. line( 1: 1) == '*' ) exit wrap_lines ! fixed format line up to the breakpoint, then blanks to column 72, then continuation in column 73 line = wrap_line( 1: wrap_len) ! blanks up to column 6, then continuation in column 6, then the rest of the line wrap_line = blank_str // continuation // wrap_line( wrap_len + 1: ) end if fix_length ! write lines as they are made call write_source_line( output_file) ! reset line to check for another wrap output_len = len_trim( wrap_line) ! ---------------------------------------------------------------------- ! while line is too long end do wrap_lines ! ---------------------------------------------------------------------- ! wrap_source_line() exit return ! ********************************************************************** ! wrap_source_line() end subroutine wrap_source_line ! ********************************************************************** ! ********************************************************************** ! seek_comment_idx() ensure lines are not too long subroutine seek_comment_idx( wrap_line, comment_idx) ! ********************************************************************** ! seek_comment_idx() interface ! ---------------------------------------------------------------------- ! the line to be wrapped character( len= *), target, intent( in out) :: wrap_line ! the index of a comment or unchanged integer, intent( in out) :: comment_idx ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) more than 132 characters ! exit: comment_idx indicates the start of an in-line comment or is unchanged ! ********************************************************************** ! seek_comment_idx() local ! ---------------------------------------------------------------------- ! length of source line integer :: line_len ! loop through line integer :: char_idx ! the quote that starts a character context character( len= 1), save :: quote ! whether in character context or not logical, save :: char_context = .false. ! ********************************************************************** ! seek_comment_idx() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! initialize line_len = len( wrap_line) ! ---------------------------------------------------------------------- ! loop through line each_char: do char_idx = 1, line_len in_char_context: if( char_context )then found_the_quote: if( wrap_line( char_idx: char_idx) == quote )then char_context = .false. quote = blank end if found_the_quote else in_char_context found_comment: if( ( wrap_line( char_idx: char_idx) == comment) )then comment_idx = char_idx exit each_char end if found_comment found_a_quote: if( ( wrap_line( char_idx: char_idx) == single_quote) & .or. ( wrap_line( char_idx: char_idx) == double_quote) )then quote = wrap_line( char_idx: char_idx) char_context = .true. end if found_a_quote end if in_char_context end do each_char ! ---------------------------------------------------------------------- ! seek_comment_idx() exit return ! ********************************************************************** ! seek_comment_idx() end subroutine seek_comment_idx ! ********************************************************************** ! ********************************************************************** ! blank_compress_lower_case() blank compress or convert to lower case subroutine blank_compress_lower_case( out_str, in_str) ! ********************************************************************** ! blank_compress_lower_case() interface ! ---------------------------------------------------------------------- ! a coco line with blanks, quoted strings and comments character( len= *), intent( in) :: in_str ! a blank compressed lower case coco statement character( len= *), intent( out) :: out_str ! ********************************************************************** ! entry: in_str is a coco line ! exit: out_str is a coco statement, possibly complete only up to hwm ! ********************************************************************** ! blank_compress_lower_case() local ! ---------------------------------------------------------------------- ! quote used for the current quoted string character( len= 1), save :: quote ! length of in_str integer :: in_str_len ! input pointer reset for each line integer :: in_idx ! output pointer reset for each statement integer, save :: out_idx = 0 ! asis pointer follows output pointer integer, save :: asis_idx ! character pointer reset by each intrinsic use integer :: char_idx ! ********************************************************************** ! blank_compress_lower_case() text continue ! ---------------------------------------------------------------------- ! null input signals end-of-file reached on input file cleanup: if( in_str == null_string )then out_idx = 0 return end if cleanup ! ---------------------------------------------------------------------- ! initialize line length in_str_len = len_trim( in_str) ! setup pointers initialize: if( out_idx == 0 )then in_idx = 1 out_idx = 1 asis_idx = 1 out_str = null_string asis_stmt = null_string quote = null_string else initialize char_idx = verify( in_str, white_space) ! check whether first character is a continuation skip_contin: if( in_str( char_idx: char_idx) == continuation )then in_idx = char_idx + 1 else skip_contin in_idx = char_idx end if skip_contin end if initialize ! ********************************************************************** ! scan each character until end of input string scan_line: do if( in_idx > in_str_len) exit scan_line ! ---------------------------------------------------------------------- ! if in quoted string char_literal: select case( quote) ! ---------------------------------------------------------------------- case( single_quote, double_quote) char_literal ! if found matching quote end_of_string: if( in_str( in_idx: in_idx) == quote )then ! out of string so set quote to null quote = null_string end if end_of_string ! copy the character out_str( out_idx: out_idx) = in_str( in_idx: in_idx) asis_stmt( asis_idx: asis_idx) = in_str( in_idx: in_idx) ! update the pointers in_idx = in_idx + 1 out_idx = out_idx + 1 asis_idx = asis_idx + 1 ! ---------------------------------------------------------------------- ! not in quoted string case default char_literal ! white space is not copied skip_ws: select case( in_str( in_idx: in_idx) ) ! blanks or tabs case( blank, tab) skip_ws in_idx = in_idx + 1 asis_idx = asis_idx + 1 ! all others case default skip_ws ! check for special characters spec_char: select case( in_str( in_idx: in_idx) ) ! found quoted string case( single_quote, double_quote) spec_char quote = in_str( in_idx: in_idx) ! found coco comment case( comment) spec_char exit scan_line end select spec_char ! ---------------------------------------------------------------------- ! copy non-blank characters to lower case out_str( out_idx: out_idx) = to_lower( in_str( in_idx: in_idx)) asis_stmt( asis_idx: asis_idx) = in_str( in_idx: in_idx) ! update pointers in_idx = in_idx + 1 out_idx = out_idx + 1 asis_idx = asis_idx + 1 end select skip_ws ! ---------------------------------------------------------------------- end select char_literal ! process next character end do scan_line ! ---------------------------------------------------------------------- ! check whether last character is continuation line_complete: if( out_str( out_idx - 1: out_idx - 1) == continuation )then ! next line is a continuation line out_idx = out_idx - 1 asis_idx = asis_idx - 1 else line_complete ! next line is an initial line asis_len = asis_idx out_idx = 0 end if line_complete ! ---------------------------------------------------------------------- ! blank_compress_lower_case() exit return ! ********************************************************************** ! blank_compress_lower_case() end subroutine blank_compress_lower_case ! ********************************************************************** ! ********************************************************************** ! process_coco_statement() process a coco directive subroutine process_coco_statement( coco_stmt) ! ********************************************************************** ! process_coco_statement() interface ! ---------------------------------------------------------------------- ! the coco statement to be processed character( len= *), intent( in) :: coco_stmt ! ********************************************************************** ! entry: coco_stmt is a blank_compress_lower_case coco directive past the coco key ! "stop..." | "message..." | "if..." | "else if..." | "else..." | ! "end if..." | "integer..." | "logical..." | "assert..." | "=..." | ! "text..." | "copy..." | "symbols" | "options" | "report" | ! exit: the directive is processed or error exit ! If a directive might have something after the keyword, the keyword ! match is checked by "keyword( : len( keyword) ) == string", otheriwse, ! if the directive must not have anything after the keyword, the ! keyword match is checked by "keyword == string". Thus, a directive ! with unknown nonblank characters after the keyword is an unknown directive. ! ********************************************************************** ! process_coco_statement() local ! ---------------------------------------------------------------------- ! point to location of symbol on symbol list class( symbol_t), pointer :: symbol_ptr type( integer_t), pointer :: integer_ptr type( logical_t), pointer :: logical_ptr ! possible index of equals integer :: eq_idx ! expression string is after the equals integer :: expr_idx ! ********************************************************************** ! process_coco_statement() text continue ! ---------------------------------------------------------------------- ! detect assignment statements assigning to named variables nullify( symbol_ptr) eq_idx = scan( coco_stmt( 1: symbol_name_len + len( equals)), equals) got_equals: if( eq_idx > 0 )then call seek_symbol_name( coco_stmt( 1: eq_idx - 1), symbol_ptr) end if got_equals ! ---------------------------------------------------------------------- ! which directive? ! ---------------------------------------------------------------------- ! assignment directive which_directive: if( associated( symbol_ptr) )then ! up to the equals must be a declared name expr_idx = eq_idx + len( equals) ! must be an integer or logical variable integer_or_logical_or_error: select type( symbol_ptr) type is( integer_t) integer_or_logical_or_error integer_ptr => symbol_ptr call process_integer_assignment( coco_stmt( expr_idx: ), integer_ptr) type is( logical_t) integer_or_logical_or_error logical_ptr => symbol_ptr call process_logical_assignment( coco_stmt( expr_idx: ), logical_ptr) class default integer_or_logical_or_error call msg_quit( "target of assignment must be type integer or logical: " // trim( symbol_ptr% name_str) ) end select integer_or_logical_or_error ! ---------------------------------------------------------------------- ! stop directive else if( coco_stmt == stop_str )then which_directive call process_stop_directive( coco_stmt( len( stop_str) + 1: ) ) ! ---------------------------------------------------------------------- ! message directive else if( coco_stmt( 1: len( message_str)) == message_str )then which_directive call process_message_directive( coco_stmt( len( message_str) + 1: ) ) ! ---------------------------------------------------------------------- ! if directive else if( coco_stmt( 1: len( if_str)) == if_str )then which_directive call process_if_directive( coco_stmt( len( if_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else if directive else if( coco_stmt( 1: len( elseif_str)) == elseif_str )then which_directive call process_elseif_directive( coco_stmt( len( elseif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else directive else if( coco_stmt( 1: len( else_str)) == else_str )then which_directive call process_else_directive( coco_stmt( len( else_str) + 1: ) ) ! ---------------------------------------------------------------------- ! endif directive else if( coco_stmt( 1: len( endif_str)) == endif_str )then which_directive call process_endif_directive( coco_stmt( len( endif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! integer declaration else if( coco_stmt( 1: len( integer_str)) == integer_str )then which_directive call process_integer_declaration( coco_stmt( len( integer_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! integer constant declaration else if( coco_stmt( 1: len( integer_constant_str)) == integer_constant_str )then which_directive call process_integer_declaration( coco_stmt( len( integer_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! logical declaration else if( coco_stmt( 1: len( logical_str)) == logical_str )then which_directive call process_logical_declaration( coco_stmt( len( logical_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! logical constant declaration else if( coco_stmt( 1: len( logical_constant_str)) == logical_constant_str )then which_directive call process_logical_declaration( coco_stmt( len( logical_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! macro declaration else if( coco_stmt( 1: len( macro_str)) == macro_str )then which_directive call process_macro_declaration( coco_stmt( len( macro_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! macro, parens declaration else if( coco_stmt( 1: len( macro_parens_str)) == macro_parens_str )then which_directive call process_macro_declaration( coco_stmt( len( macro_parens_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! assert directive else if( coco_stmt( 1: len( assert_str)) == assert_str )then which_directive call process_assert_directive( coco_stmt( len( assert_str) + 1: )) ! ---------------------------------------------------------------------- ! cmdline directive else if( coco_stmt( 1: len( cmdline_str)) == cmdline_str )then which_directive call process_cmdline_directive( coco_stmt( len( cmdline_str) + 1: )) ! ---------------------------------------------------------------------- ! document directive else if( coco_stmt( 1: len( document_str)) == document_str )then which_directive call process_document_directive( coco_stmt( len( document_str) + 1: )) ! ---------------------------------------------------------------------- ! options directive else if( coco_stmt( 1: len( options_str)) == options_str )then which_directive call process_options_directive( coco_stmt( len( options_str) + 1: )) ! ---------------------------------------------------------------------- ! report directive else if( coco_stmt( 1: len( report_str)) == report_str )then which_directive call process_report_directive( coco_stmt( len( report_str) + 1: )) ! ---------------------------------------------------------------------- ! symbols directive else if( coco_stmt( 1: len( symbols_str)) == symbols_str )then which_directive call process_symbols_directive( coco_stmt( len( symbols_str) + 1: )) ! ---------------------------------------------------------------------- ! text directive else if( coco_stmt( 1: len( text_str)) == text_str )then which_directive call process_text_directive( coco_stmt( len( text_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! text, parens directive else if( coco_stmt( 1: len( text_parens_str)) == text_parens_str )then which_directive call process_text_directive( coco_stmt( len( text_parens_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! copy directive else if( coco_stmt( 1: len( copy_str)) == copy_str )then which_directive call process_copy_directive( coco_stmt( len( copy_str) + 1: )) ! ---------------------------------------------------------------------- ! cannot process this directive else which_directive call msg_quit( "unknown coco directive: " // trim( coco_stmt)) ! ---------------------------------------------------------------------- ! which directive? end if which_directive ! ---------------------------------------------------------------------- ! process_coco_statement() exit return ! ********************************************************************** ! process_coco_statement() end subroutine process_coco_statement ! ********************************************************************** ! ********************************************************************** ! process_integer_assignment() process a coco stop directive subroutine process_integer_assignment( assign_dir, integer_ptr) ! ********************************************************************** ! process_integer_assignment() interface ! ---------------------------------------------------------------------- ! the integer assignment directive character( len= *), intent( in) :: assign_dir ! a pointer to the integer symbol type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! entry: stop_dir is blank_compress_lower_case coco stop directive, past the coco key word ! exit: coco processing stops ! ********************************************************************** ! process_integer_assignment() local ! ********************************************************************** ! process_integer_assignment() text continue ! ---------------------------------------------------------------------- ! process assignment directive if on an active line active_line: if( if_construct% now_selected ) then ! do not allow redefinition of constants redefine_constant: if( integer_ptr% constant )then call msg_quit( "attempt to redefine a constant: " // trim( integer_ptr% name_str) ) end if redefine_constant ! assign the value call eval_int_expr( assign_dir, integer_ptr% integer_value) integer_ptr% defined = .true. integer_ptr% defined_file = current_file% name_str integer_ptr% defined_line = current_file% lines_transfered end if active_line ! ---------------------------------------------------------------------- ! process_integer_assignment() exit return ! ********************************************************************** ! process_integer_assignment() end subroutine process_integer_assignment ! ********************************************************************** ! ********************************************************************** ! process_logical_assignment() process a coco stop directive subroutine process_logical_assignment( assign_dir, logical_ptr) ! ********************************************************************** ! process_logical_assignment() interface ! ---------------------------------------------------------------------- ! the logical assignment directive character( len= *), intent( in) :: assign_dir ! a pointer to the logical symbol type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! entry: stop_dir is blank_compress_lower_case coco stop directive, past the coco key word ! exit: coco processing stops ! ********************************************************************** ! process_logical_assignment() local ! ********************************************************************** ! process_logical_assignment() text continue ! ---------------------------------------------------------------------- ! process stop directive if on an active line active_line: if( if_construct% now_selected )then ! do not allow redefinition of constants redefine_constant: if( logical_ptr% constant )then call msg_quit( "attempt to redefine a constant: " // trim( logical_ptr% name_str) ) end if redefine_constant ! assign the value call eval_log_expr( assign_dir, logical_ptr% logical_value) logical_ptr% defined = .true. logical_ptr% defined_file = current_file% name_str logical_ptr% defined_line = current_file% lines_transfered end if active_line ! ---------------------------------------------------------------------- ! process_logical_assignment() exit return ! ********************************************************************** ! process_logical_assignment() end subroutine process_logical_assignment ! ********************************************************************** ! ********************************************************************** ! process_stop_directive() process a coco stop directive subroutine process_stop_directive( stop_dir) ! ********************************************************************** ! process_stop_directive() interface ! ---------------------------------------------------------------------- ! the stop directive character( len= *), intent( in) :: stop_dir ! ********************************************************************** ! entry: stop_dir is blank_compress_lower_case coco stop directive, past the coco key word ! exit: coco processing stops ! ********************************************************************** ! process_stop_directive() text continue ! ---------------------------------------------------------------------- ! process stop directive if on an active line active_line: if( if_construct% now_selected )then verbose_output: if( options% verbose_mode )then call msg_continue( "coco stop directive encountered: " // trim( stop_dir)) end if verbose_output output_file% line = stop_dir call write_coco_line( output_file) stop 'coco stop directive encountered' end if active_line ! ---------------------------------------------------------------------- ! process_stop_directive() exit return ! ********************************************************************** ! process_stop_directive() end subroutine process_stop_directive ! ********************************************************************** ! ********************************************************************** ! process_message_directive() process a coco message directive subroutine process_message_directive( message_dir) ! ********************************************************************** ! process_message_directive() interface ! ---------------------------------------------------------------------- ! the message directive character( len= *), intent( in) :: message_dir ! ********************************************************************** ! entry: message_dir is blank_compress_lower_case coco message directive, past the message key word ! exit: message is written to error unit ! ********************************************************************** ! process_message_directive() local ! ---------------------------------------------------------------------- character( len= buffer_len) :: msg_buffer integer :: in_idx integer :: out_idx integer :: comma_idx integer :: quoted_len integer :: unquoted_len integer :: integer_value integer :: istat logical :: logical_value logical :: is_integer character( len= buffer_len) :: expr_str character( len= conversion_len) :: conversion_str ! ********************************************************************** ! process_message_directive() text continue ! ---------------------------------------------------------------------- ! process if on active line active_line: if( if_construct% now_selected )then ! ---------------------------------------------------------------------- ! initialize in_idx = 1 out_idx = 1 msg_buffer = blank ! loop thru message list items list_items: do if( in_idx > len_trim( message_dir) ) exit list_items ! ---------------------------------------------------------------------- ! a list item can be a quoted string or an expression string_expr: select case( message_dir( in_idx: in_idx) ) ! ---------------------------------------------------------------------- ! process quoted strings case( single_quote, double_quote) string_expr ! try to unquote the string call unquote_string( message_dir( in_idx: ), msg_buffer( out_idx: ), quoted_len, unquoted_len) ! if the matching quote is found within the string got_string: if( quoted_len <= len( message_dir( in_idx: )) )then ! found quote, update the character pointers in_idx = in_idx + quoted_len + index( message_dir( in_idx + quoted_len - 1: ), comma) - 1 out_idx = out_idx + unquoted_len - 1 ! found not quote, complain and quit else got_string call msg_quit( "bad message string: " // trim( message_dir) ) end if got_string ! ---------------------------------------------------------------------- ! process expressions case( 'a': 'z', '0': '9', dot, plus, minus, open_paren) string_expr ! expression ends at a comma comma_idx = scan( message_dir( in_idx: ), comma) ! find the comma or the end of the expression end_of_string: if( comma_idx == 0 )then comma_idx = len_trim( message_dir) + 1 else end_of_string comma_idx = in_idx + comma_idx - 1 end if end_of_string ! encode integer or logical call integer_or_logical( message_dir( in_idx: comma_idx - 1), is_integer) ! an integer expression int_log: if( is_integer )then expr_str = message_dir( in_idx: comma_idx - 1) call eval_int_expr( expr_str, integer_value) write( unit= conversion_str, fmt= conversion_fmt, iostat= istat, iomsg= processor_msg) integer_value ! trap internal write errors encode: if( istat > 0 )then call msg_quit( "can't encode: " // message_dir( in_idx: comma_idx - 1) ) end if encode msg_buffer( out_idx: ) = adjustl( conversion_str) ! a logical expression else int_log expr_str = message_dir( in_idx: comma_idx - 1) call eval_log_expr( expr_str, logical_value) t_or_f: if( logical_value )then msg_buffer( out_idx: ) = '.true.' else t_or_f msg_buffer( out_idx: ) = '.false.' end if t_or_f end if int_log ! update pointers and add to output buffer adjust: if( msg_buffer( out_idx: out_idx) == blank )then msg_buffer( out_idx + 1: ) = adjustl( msg_buffer( out_idx + 1: ) ) end if adjust in_idx = comma_idx + 1 out_idx = len_trim( msg_buffer) + 2 ! ---------------------------------------------------------------------- ! list item isn't a string, a symbol or a literal case default string_expr call msg_quit( "bad message list item: " // message_dir( in_idx: ) ) ! ---------------------------------------------------------------------- end select string_expr ! loop thru message list items end do list_items ! ---------------------------------------------------------------------- ! make the message available verbose_output: if( options% verbose_mode )then call msg_continue( msg_buffer( 1: out_idx) ) end if verbose_output ! copy for the log file write( unit= log_file% io_unit, fmt= string_fmt) 'coco message: ' // msg_buffer( 1: out_idx) ! copy for the output file if( options% wrapping_lines ) call wrap_source_line( msg_buffer( 1: out_idx)) ! add a leading blank to avoid shift 0 from deleting a character line = blank // msg_buffer( 1: len( line) - 1) call write_coco_line( output_file) end if active_line ! ---------------------------------------------------------------------- ! process_message_directive() exit return ! ********************************************************************** ! process_message_directive() end subroutine process_message_directive ! ********************************************************************** ! ********************************************************************** ! %%% process declarations of integers and logicals ! ********************************************************************** ! ********************************************************************** ! get_symbol_name() extract symbol name and determine its length subroutine get_symbol_name( decl_stmt, symbol_name, name_len) ! ********************************************************************** ! get_symbol_name() interface ! ---------------------------------------------------------------------- ! a declaration statement with a symbol name character( len= *), intent( in) :: decl_stmt ! the name of the symbol character( len= *), intent( out) :: symbol_name ! the length of the symbol name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name=..." ! exit: a valid symbol name and its length or error exit ! ********************************************************************** ! get_symbol_name() constants ! ---------------------------------------------------------------------- ! characters which must end a symbol name character( len= *), parameter :: end_of_name = equals // blank ! ********************************************************************** ! get_symbol_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_symbol_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) name_error: if( char_idx == 0 )then call msg_quit( "can't find name in declaration: " // trim( decl_stmt)) end if name_error ! length of name is one less than first character past name name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is a valid new name call valid_new_name( decl_stmt( 1: name_len)) ! return name symbol_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_symbol_name() exit return ! ********************************************************************** ! get_symbol_name() end subroutine get_symbol_name ! ********************************************************************** ! ********************************************************************** ! process_integer_declaration() process integer declarations subroutine process_integer_declaration( integer_stmt, is_const) ! ********************************************************************** ! process_integer_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: integer_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_stmt is blank_compress_lower_case integer declaration past the integer keyword ! "::..." | ",parameter::..." ! exit: int_stmt is processed or error exit ! ********************************************************************** ! process_integer_declaration() constants ! ---------------------------------------------------------------------- ! mark the end of a definition character( len= *), parameter :: end_of_def = comma // blank ! ********************************************************************** ! process_integer_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: def_len ! ********************************************************************** ! process_integer_declaration() text continue ! ---------------------------------------------------------------------- ! if active line, process the declaration active_line: if( if_construct% now_selected )then next_char = 1 ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string def_len = scan( integer_stmt( next_char: ), end_of_def) + next_char - 1 symbol_str = integer_stmt( next_char: def_len - 1) ! extract symbol name call get_symbol_name( symbol_str, symbol_name, symbol_len) ! store symbol in symbol list call add_integer( symbol_str( symbol_len + 1: def_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( integer_stmt( def_len: def_len) == blank )then exit all_symbols end if all_done ! move to next symbol next_char = def_len + 1 ! extract all symbols on directive end do all_symbols ! if active line, process the declaration end if active_line ! ---------------------------------------------------------------------- ! process_integer_declaration() exit return ! ********************************************************************** ! process_integer_declaration() end subroutine process_integer_declaration ! ********************************************************************** ! ********************************************************************** ! add_integer() store integer declaration in symbol table subroutine add_integer( int_decl_str, integer_name, is_const) ! ********************************************************************** ! add_integer() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: int_decl_str ! the symbol name character( len= *), intent( in) :: integer_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case integer declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: integer declaration is added to the integer symbol list or error exit ! ********************************************************************** ! add_integer() local ! ---------------------------------------------------------------------- ! expression defining integer symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! add_integer() text continue ! ---------------------------------------------------------------------- ! allocate new integer allocate( integer_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate integer: " // trim( integer_name)) end if alloc_error ! build new integer on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => integer_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => integer_ptr last_symbol => first_symbol end if subsequent_or_first nullify( integer_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members integer_ptr% name_str = integer_name integer_ptr% declared_file = current_file% name_str integer_ptr% declared_line = current_file% lines_transfered integer_ptr% referenced = .false. integer_ptr% referenced_file = null_string integer_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! store whether integer is a constant integer_ptr% constant = is_const ! store whether symbol is declared in the set file integer_ptr% sf_defined = .false. integer_ptr% cl_defined = .false. ! determine if declaration specifies a value got_eq: if( len( int_decl_str) > 0 )then integer_ptr% defined = int_decl_str( 1: len( equals)) == equals else got_eq integer_ptr% defined = .false. end if got_eq ! compute and store the value if there is one constant_value: if( integer_ptr% constant .and. .not. integer_ptr% defined )then call msg_quit( "an integer constant must have a value: " // trim( integer_name) // trim( int_decl_str) ) end if constant_value ! decode the value process_value: if( integer_ptr% defined )then all_constants = .true. expr_str = int_decl_str( len( equals) + 1: ) call eval_int_expr( expr_str, integer_ptr% integer_value) non_const: if( integer_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define integer constant: " // trim( integer_name)) end if non_const integer_ptr% defined_file = current_file% name_str integer_ptr% defined_line = current_file% lines_transfered end if process_value ! allow a value from the set file and/or the command line to overwrite the source file value call get_int_value_from_setfile( integer_ptr) call get_int_value_from_cmdline( integer_ptr) ! ---------------------------------------------------------------------- ! add_integer() exit return ! ********************************************************************** ! add_integer() end subroutine add_integer ! ********************************************************************** ! ********************************************************************** ! process_logical_declaration() process logical declarations subroutine process_logical_declaration( logical_stmt, is_const) ! ********************************************************************** ! process_logical_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the logical declaration character( len= *), intent( in) :: logical_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: logical_stmt is blank_compress_lower_case logical declaration past the logical keyword ! "::..." | ",parameter::..." ! exit: logical declaration is processed or error exit ! ********************************************************************** ! process_logical_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: decl_len ! ********************************************************************** ! process_logical_declaration() text continue next_char = 1 ! ---------------------------------------------------------------------- ! if active line, process the declaration active_line: if( if_construct% now_selected )then ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string decl_len = scan( logical_stmt( next_char: ), end_of_decl) + next_char - 1 symbol_str = logical_stmt( next_char: decl_len - 1) ! extract symbol name call get_symbol_name( symbol_str, symbol_name, symbol_len) ! store symbol in symbol list call add_logical( symbol_str( symbol_len + 1: decl_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( logical_stmt( decl_len: decl_len) == blank )then exit all_symbols end if all_done ! reset for next symbol next_char = decl_len + 1 ! extract all symbols on directive end do all_symbols ! if active line, process the declaration end if active_line ! ---------------------------------------------------------------------- ! process_logical_declaration() exit return ! ********************************************************************** ! process_logical_declaration() end subroutine process_logical_declaration ! ********************************************************************** ! ********************************************************************** ! add_logical() store logical declaration in symbol table subroutine add_logical( log_decl_str, logical_name, is_const) ! ********************************************************************** ! add_logical() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: log_decl_str ! the valid logical name character( len= *), intent( in) :: logical_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case logical declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_logical() local ! ---------------------------------------------------------------------- ! expression defining logical symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! add_logical() text continue ! ---------------------------------------------------------------------- ! allocate new logical allocate( logical_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate logical: " // trim( logical_name)) end if alloc_error ! build new logical on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => logical_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => logical_ptr last_symbol => first_symbol end if subsequent_or_first nullify( logical_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members logical_ptr% name_str = logical_name logical_ptr% declared_file = current_file% name_str logical_ptr% declared_line = current_file% lines_transfered logical_ptr% referenced = .false. logical_ptr% referenced_file = null_string logical_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! store whether logical is a constant logical_ptr% constant = is_const ! store whether symbol is declared in the set file logical_ptr% sf_defined = .false. logical_ptr% cl_defined = .false. ! determine if declaration specifies a value got_eq: if( len( log_decl_str) > 0 )then logical_ptr% defined = log_decl_str( 1: len( equals)) == equals else got_eq logical_ptr% defined = .false. end if got_eq ! compute and store the value if there is one constant_value: if( logical_ptr% constant .and. .not. logical_ptr% defined )then call msg_quit( "an logical constant must have a value: " & // trim( logical_name) // trim( log_decl_str) ) end if constant_value ! decode the value process_value: if( logical_ptr% defined )then all_constants = .true. expr_str = log_decl_str( len( equals) + 1: ) call eval_log_expr( expr_str, logical_ptr% logical_value) non_const: if( logical_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define logical constant: " // trim( logical_name)) end if non_const logical_ptr% defined_file = current_file% name_str logical_ptr% defined_line = current_file% lines_transfered end if process_value ! allow a value from the set file and/or the command line to overwrite the source file value call get_log_value_from_setfile( logical_ptr) call get_log_value_from_cmdline( logical_ptr) ! ---------------------------------------------------------------------- ! add_logical() exit return ! ********************************************************************** ! add_logical() end subroutine add_logical ! ********************************************************************** ! ********************************************************************** ! %%% process if constructs: if, else if, else, end if ! ********************************************************************** ! ********************************************************************** ! new_block() pushes a new block on the block list subroutine new_block( phase) ! ********************************************************************** ! new_block() interface ! ---------------------------------------------------------------------- ! the phase of the new block, or if_block if not present integer, intent( in), optional :: phase ! ********************************************************************** ! entry: a phase and the block list ! exit: the block list has a new entry with the required phase ! ********************************************************************** ! new_block() local ! ---------------------------------------------------------------------- ! status of allocating a new if block integer :: astat ! ********************************************************************** ! new_block() text continue ! ---------------------------------------------------------------------- ! append new if construct at end of list allocate( if_construct% nested, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "allocate block failed") end if alloc_error ! establish pointers if_construct% nested% enclosing => if_construct ! make new if construct the active if construct if_construct => if_construct% nested nullify( if_construct% nested) ! if the phase is specified use_phase: if( present( phase) )then ! this phase is as requested if_construct% phase = phase ! if this is processed, it's an active statement if_construct% now_selected = .true. else use_phase ! otherwise, this phase is an if block if_construct% phase = if_block end if use_phase ! ---------------------------------------------------------------------- ! new_block() exit return ! ********************************************************************** ! new_block() end subroutine new_block ! ********************************************************************** ! ********************************************************************** ! delete_block() pops a block on the block list subroutine delete_block( phase) ! ********************************************************************** ! delete_block() interface ! ---------------------------------------------------------------------- ! the phase of the popped block, no required phase if not present integer, intent( in), optional :: phase ! ********************************************************************** ! entry: a phase and the block list ! exit: the block list has an entry removed or error ! ********************************************************************** ! delete_block() local ! ---------------------------------------------------------------------- ! status of deallocating a block integer :: astat ! ********************************************************************** ! delete_block() text continue ! ---------------------------------------------------------------------- ! if requires phase, enforce it have_phase: if( present( phase) )then must_be: if( if_construct% phase /= phase )then call msg_quit( "blocks bested badly") end if must_be end if have_phase ! ---------------------------------------------------------------------- ! decrement if level if_construct => if_construct% enclosing deallocate( if_construct% nested, stat= astat) next_error: if( astat > 0 )then call msg_quit( "deallocate block failed") end if next_error nullify( if_construct% nested) ! ---------------------------------------------------------------------- ! delete_block() exit return ! ********************************************************************** ! delete_block() end subroutine delete_block ! ********************************************************************** ! ********************************************************************** ! process_if_directive() process a coco if( )then directive subroutine process_if_directive( if_dir) ! ********************************************************************** ! process_if_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an if directive character( len= *), intent( in) :: if_dir ! ********************************************************************** ! entry: if_dir is blank_compress_lower_case if directive, past the coco key and the "if(" ! ")then" ! exit: the directive is processed or error exit ! ********************************************************************** ! process_if_directive() local ! ---------------------------------------------------------------------- ! pointer to ')then' integer :: then_idx ! value of logical expression logical :: expression_value ! copy expression string for evaluation character( len= buffer_len) :: expr_str ! ********************************************************************** ! process_if_directive() text continue ! ---------------------------------------------------------------------- ! check for a well formed if directive then_idx = index( if_dir, then_str) syntax_check: if( then_idx == 0 )then call msg_quit( "no 'then' in if directive: " // trim( if_dir) ) end if syntax_check extra_chars_check: if( if_dir( then_idx + len( then_str): ) /= blank )then call msg_quit( "extra characters after if directive: " // trim( if_dir) ) end if extra_chars_check ! ---------------------------------------------------------------------- ! append new if construct at end of list call new_block() ! ---------------------------------------------------------------------- ! if this if block is enclosed within selected lines active_lines: if( if_construct% enclosing% now_selected )then ! ---------------------------------------------------------------------- ! evaluate logical expression only when enclosing if block is selected expr_str = if_dir( 1: then_idx - 1) call eval_log_expr( expr_str, expression_value) ! set if value accordingly if_construct% now_selected = expression_value if_construct% ever_selected = expression_value ! ---------------------------------------------------------------------- ! the enclosing if block is not selected else active_lines if_construct% now_selected = .false. if_construct% ever_selected = .true. end if active_lines ! ---------------------------------------------------------------------- ! process_if_directive() exit return ! ********************************************************************** ! process_if_directive() end subroutine process_if_directive ! ********************************************************************** ! ********************************************************************** ! process_elseif_directive() process a coco elseif( )then directive subroutine process_elseif_directive( elseif_dir) ! ********************************************************************** ! process_elseif_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an elseif directive character( len= *), intent( in) :: elseif_dir ! ********************************************************************** ! entry: elseif_dir is blank_compress_lower_case elseif directive, past the coco key ! exit: the directive is processed or error exit ! ********************************************************************** ! process_elseif_directive() local ! ---------------------------------------------------------------------- ! location of closing )then integer :: then_idx ! value of logical expression logical :: expression_value character( len= buffer_len) :: expr_str ! ********************************************************************** ! process_elseif_directive() text continue ! ---------------------------------------------------------------------- ! if not in if-block, elseif is misplaced if_sequence: select case( if_construct% phase) case( outside_block ) if_sequence call msg_quit( "else if outside if construct: " // trim( elseif_dir) ) case( else_block ) if_sequence call msg_quit( "else if after else: " // trim( elseif_dir) ) case( text_block ) if_sequence call msg_quit( "else if badly nested in text block: " // trim( elseif_dir) ) case( include_block ) if_sequence call msg_quit( "else if badly nested in include file: " // trim( elseif_dir) ) end select if_sequence ! ---------------------------------------------------------------------- ! logical expression must be between 'if(' and ')then' then_idx = index( elseif_dir, then_str) syntax_check: if( then_idx == 0 )then call msg_quit( "no 'then' in else if directive: " // trim( elseif_dir) ) end if syntax_check extra_chars_check: if( elseif_dir( then_idx + len( then_str): ) /= blank )then call msg_quit( "extra characters after else if directive: " // trim( elseif_dir) ) end if extra_chars_check ! this phase is an elseif block if_construct% phase = elseif_block ! ---------------------------------------------------------------------- ! if this if block is enclosed within selected lines active_lines: if( if_construct% enclosing% now_selected )then previous_true: if( if_construct% ever_selected )then if_construct% now_selected = .false. else previous_true ! evaluate logical expression expr_str = elseif_dir( 1: then_idx - 1) call eval_log_expr( expr_str, expression_value) ! set if value accordingly if_construct% now_selected = expression_value if_construct% ever_selected = expression_value end if previous_true end if active_lines ! ---------------------------------------------------------------------- ! process_elseif_directive() exit return ! ********************************************************************** ! process_elseif_directive() end subroutine process_elseif_directive ! ********************************************************************** ! ********************************************************************** ! process_else_directive() process a coco else directive subroutine process_else_directive( else_dir) ! ********************************************************************** ! process_else_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an else directive character( len= *), intent( in) :: else_dir ! ********************************************************************** ! entry: else_dir is blank_compress_lower_case else directive, past the coco key ! exit: the directive is processed or error exit ! ********************************************************************** ! process_else_directive() text continue ! ---------------------------------------------------------------------- ! if not in if-block, else is misplaced if_sequence: select case( if_construct% phase) case( outside_block ) if_sequence call msg_quit( "else outside if construct: " // trim( else_dir) ) case( else_block ) if_sequence call msg_quit( "else after else: " // trim( else_dir) ) case( text_block ) if_sequence call msg_quit( "else badly nested in text block: " // trim( else_dir) ) case( include_block ) if_sequence call msg_quit( "else badly nested in include file: " // trim( else_dir) ) end select if_sequence ! must have nothing after 'else' syntax_error: if( else_dir /= blank )then call msg_quit( "extra characters after else directive: " // trim( else_dir) ) end if syntax_error ! ---------------------------------------------------------------------- ! this phase is an else block if_construct% phase = else_block ! ---------------------------------------------------------------------- ! select else block if this if ithe enclosing block is active and no previous block has been selected if_construct% now_selected = if_construct% enclosing% now_selected & .and. .not. if_construct% ever_selected ! ---------------------------------------------------------------------- ! process_else_directive() exit return ! ********************************************************************** ! process_else_directive() end subroutine process_else_directive ! ********************************************************************** ! ********************************************************************** ! process_endif_directive() process a coco endif directive subroutine process_endif_directive( endif_dir) ! ********************************************************************** ! process_endif_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an endif directive character( len= *), intent( in) :: endif_dir ! ********************************************************************** ! entry: endif_dir is blank_compress_lower_case endif directive, past the coco key ! exit: the directive is processed or error exit ! ********************************************************************** ! process_endif_directive() local ! ********************************************************************** ! process_endif_directive() text continue ! ---------------------------------------------------------------------- ! if not in if-block, endif is misplaced if_sequence: select case( if_construct% phase) case( outside_block ) if_sequence call msg_quit( "end if outside any if construct: " // trim( endif_dir) ) case( text_block ) if_sequence call msg_quit( "end if badly nested in text block: " // trim( endif_dir) ) case( include_block ) if_sequence call msg_quit( "end if badly nested in include file: " // trim( endif_dir) ) end select if_sequence ! must have nothing after 'endif' syntax_error: if( endif_dir /= blank )then call msg_quit( "extra characters after end if directive: " // trim( endif_dir) ) end if syntax_error ! ---------------------------------------------------------------------- ! decrement if level call delete_block() ! ---------------------------------------------------------------------- ! process_endif_directive() exit return ! ********************************************************************** ! process_endif_directive() end subroutine process_endif_directive ! ********************************************************************** ! ********************************************************************** ! process extensions assert, macro, text, copy ! ********************************************************************** ! ********************************************************************** ! process_assert_directive() process an assert directive subroutine process_assert_directive( assert_dir) ! ********************************************************************** ! process_assert_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an assert directive character( len= *), intent( in) :: assert_dir ! ********************************************************************** ! entry: assert_dir is quoted assert condition ! exit: assertion code is written to the output ! ********************************************************************** ! process_assert_directive() constants ! ---------------------------------------------------------------------- ! pieces of the assert output character( len= *), parameter :: if_prt = 'if( .not. ' character( len= *), parameter :: then_prt = ')then' character( len= *), parameter :: write_prt = 'write( unit= *, fmt= *) "assertion failed: ' character( len= *), parameter :: stop_prt = 'stop "assertion failed"' character( len= *), parameter :: endif_prt = 'end if' ! ---------------------------------------------------------------------- ! starting column of output integer, parameter :: free_start_col = 1 integer, parameter :: fixed_start_col = 7 ! ********************************************************************** ! process_assert_directive() local ! ---------------------------------------------------------------------- ! the column to start writing output source integer, save :: start_col = free_start_col ! the length of the assert condition integer :: cond_len ! start of the condition in the as-is buffer integer :: open_idx ! assemble the output line character( len= buffer_len) :: edit_line ! ---------------------------------------------------------------------- ! convert the current input line number to characters character( len= conversion_len) :: conversion_str ! ********************************************************************** ! process_assert_directive() text continue ! ---------------------------------------------------------------------- ! check syntax- condition must be within parentheses find_open_praen: if( assert_dir( 1: 1) /= open_paren )then call msg_quit( "can't find open parenthesis: " // trim( assert_dir)) end if find_open_praen call seek_close_paren( assert_dir, 1, cond_len) find_close_praen: if( assert_dir( cond_len: cond_len) /= close_paren )then call msg_quit( "can't find close parenthesis in assert directive: " // trim( assert_dir)) else if( len_trim( assert_dir) <= len( open_paren // close_paren) )then find_close_praen call msg_quit( "can't find condition in assert directive: " // trim( assert_dir)) end if find_close_praen ! check syntax- directive must be blank after condition extra_chars: if( assert_dir( cond_len + 1: ) /= blank )then call msg_quit( "extra characters after assert condition: " // trim( assert_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! if active block, process assert directive active_line: if( if_construct% now_selected )then ! use the condition from the as-is buffer open_idx = index( asis_stmt, open_paren) ! set start column per the source form if( .not. options% free_form ) start_col = fixed_start_col ! write the if statement if( start_col > 1 ) edit_line( 1: start_col - 1) = blank edit_line( start_col: ) = if_prt // asis_stmt( open_idx: asis_len) // then_prt ! remove any line length overflow if( options% wrapping_lines ) call wrap_source_line( edit_line) ! ---------------------------------------------------------------------- ! write assembled if-then statement line = edit_line( 1: len( line)) call write_source_line( output_file) ! ---------------------------------------------------------------------- ! write the write statement if( start_col > 1 ) edit_line( 1: start_col - 1) = blank ! get the current line number write( unit= conversion_str, fmt= conversion_fmt) current_file% lines_transfered ! construct the assertion complaint edit_line( start_col: ) = write_prt // trim( current_file% name_str) & // ": " // trim( adjustl( conversion_str)) & // ': " // ' // '"' // trim( asis_stmt( open_idx: asis_len)) // '"' ! remove any line length overflow if( options% wrapping_lines ) call wrap_source_line( edit_line) ! ---------------------------------------------------------------------- ! write assembled write statement line = edit_line( 1: len( line)) call write_source_line( output_file) ! ---------------------------------------------------------------------- ! blank until the start column for the stop and end if if( start_col > 1 ) line( 1: start_col - 1) = blank ! write the stop statement line( start_col: ) = stop_prt call write_source_line( output_file) ! ---------------------------------------------------------------------- ! blank until the start column for the stop and end if if( start_col > 1 ) line( 1: start_col - 1) = blank ! write the end if statement line( start_col: ) = endif_prt call write_source_line( output_file) ! ---------------------------------------------------------------------- end if active_line ! ---------------------------------------------------------------------- ! process_assert_directive() exit return ! ********************************************************************** ! process_assert_directive() end subroutine process_assert_directive ! ********************************************************************** ! ********************************************************************** ! %%% process coco macros ! ********************************************************************** ! ********************************************************************** ! get_macro_name() verify macro name and determine its length subroutine get_macro_name( decl_stmt, macro_name, name_len) ! ********************************************************************** ! get_macro_name() interface ! ---------------------------------------------------------------------- ! the directive containing the macro character( len= *), intent( in) :: decl_stmt ! the name of the macro character( len= *), intent( out) :: macro_name ! the length of the macro name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name=..." | "name(..." ! exit: name is valid and its length is known or error exit ! ********************************************************************** ! get_macro_name() constants ! ---------------------------------------------------------------------- ! equals or open parenthesis may end a macro name character( len= *), parameter :: end_of_name = equals // open_paren ! ********************************************************************** ! get_macro_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_macro_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) ! if no equals or open paren found no_eq_op: if( char_idx == 0 )then call msg_quit( "can't find name in macro declaration: " // trim( decl_stmt)) end if no_eq_op name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is not in use and has a valid form call valid_new_name( decl_stmt( 1: name_len)) macro_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_macro_name() exit return ! ********************************************************************** ! get_macro_name() end subroutine get_macro_name ! ********************************************************************** ! ********************************************************************** ! process_macro_declaration() process macro declarations subroutine process_macro_declaration( mac_stmt, must_parens) ! ********************************************************************** ! process_macro_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the macro declaration character( len= *), intent( in) :: mac_stmt ! this macro must have actual args in parens logical, intent( in) :: must_parens ! ********************************************************************** ! entry: mac_stmt is blank_compress_lower_case logical declaration ! past the macro keyword "::..." ! exit: macro declaration is processed or error exit ! ********************************************************************** ! process_macro_declaration() local ! ---------------------------------------------------------------------- ! name of symbol character( len= symbol_name_len) :: macro_name ! results of decoding statement integer :: name_len ! ********************************************************************** ! process_macro_declaration() text continue ! ---------------------------------------------------------------------- ! extract symbol name call get_macro_name( mac_stmt, macro_name, name_len) ! if active line, process the declaration active_line: if( if_construct% now_selected )then ! store symbol in symbol list call add_macro( mac_stmt( name_len + 1: ), macro_name, must_parens) end if active_line ! ---------------------------------------------------------------------- ! process_macro_declaration() exit return ! ********************************************************************** ! process_macro_declaration() end subroutine process_macro_declaration ! ********************************************************************** ! ********************************************************************** ! add_macro() store macro declaration in symbol table subroutine add_macro( mac_decl_str, macro_name, must_parens) ! ********************************************************************** ! add_macro() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: mac_decl_str ! the symbol name character( len= *), intent( in) :: macro_name ! wrap actual args in parens logical, intent( in) :: must_parens ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case macro declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: macro declaration is added to the macro symbol list or error exit ! ********************************************************************** ! add_macro() local ! ---------------------------------------------------------------------- ! check allocation status integer :: astat ! type pointer to allocate type( macro_t), pointer :: macro_ptr ! index of the = integer :: eq_idx ! length of arglist if there is one integer :: arglist_len ! ********************************************************************** ! add_macro() text continue ! ---------------------------------------------------------------------- ! allocate new macro allocate( macro_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate macro: " // trim( macro_name)) end if alloc_error ! build new macro on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => macro_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => macro_ptr last_symbol => first_symbol end if subsequent_or_first nullify( macro_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members macro_ptr% name_str = macro_name macro_ptr% declared_file = current_file% name_str macro_ptr% declared_line = current_file% lines_transfered macro_ptr% referenced = .false. macro_ptr% referenced_file = null_string macro_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! check for dummy argument list got_paren: if( mac_decl_str( 1: len( open_paren)) == open_paren )then ! arglist_len is zero if no close paren arglist_len = index( mac_decl_str, close_paren) bad_arg_list_len: if( arglist_len <= len( open_paren // close_paren) )then call msg_quit( "bad macro dummy argument list: " // trim( mac_decl_str)) end if bad_arg_list_len ! must have something between parens call process_dummy_arglist( mac_decl_str( len( open_paren) + 1: arglist_len - 1), macro_ptr% dummy_args) allocate( macro_ptr% actual_args( size( macro_ptr% dummy_args)), stat= astat, errmsg= processor_msg) actual_error: if( astat /= 0 )then call msg_quit( "can't aloocate macro actual args array: " // trim( macro_ptr% name_str)) end if actual_error else got_paren ! declared must have parenthesis on actual arguments but no dummy arguments parens_no_args: if( must_parens )then call msg_quit( "macro actual args declared to need parens but no dummy args: " // trim( macro_ptr% name_str)) end if parens_no_args end if got_paren ! ---------------------------------------------------------------------- ! must have equals eq_idx = index( mac_decl_str, equals) no_eq: if( eq_idx == 0 )then call msg_quit( "a macro definition must have an equals sign: " // trim( mac_decl_str)) end if no_eq ! process the macro value call verify_macro_value( macro_ptr% dummy_args, mac_decl_str( eq_idx + 1: )) ! assign the macro value from the as-is buffer eq_idx = index( asis_stmt, equals) macro_ptr% macro_value = adjustl( asis_stmt( eq_idx + 1: asis_len)) ! finish the macro definition macro_ptr% args_in_parens = must_parens ! ---------------------------------------------------------------------- ! add_macro() exit return ! ********************************************************************** ! add_macro() end subroutine add_macro ! ********************************************************************** ! ********************************************************************** ! process_dummy_arglist() process macro or text dummy argument list subroutine process_dummy_arglist( arglist, arg_array) ! ********************************************************************** ! process_dummy_arglist() interface ! ---------------------------------------------------------------------- ! the non-null comma separated dummy argument list character( len= *), intent( in) :: arglist ! an allocatable array one dummy arg per word character( len= symbol_name_len), dimension( :), allocatable :: arg_array ! ********************************************************************** ! entry: arglist is a character with the arglist ! exit: symbol_ptr has its arglist array allocated or defined ! ********************************************************************** ! process_dummy_arglist() constants character( len= *), parameter :: end_of_arg = blank // comma ! ********************************************************************** ! process_dummy_arglist() local ! ---------------------------------------------------------------------- ! number of dummy arguments found integer :: number_of_args ! an element in arg_array or character in arg list integer :: i ! beginning and end of an arg integer :: b_arg, e_arg ! allocation status integer :: astat ! ********************************************************************** ! process_dummy_arglist() text continue ! ---------------------------------------------------------------------- ! count macro dummy arguments number_of_args = 1 count_args: do i = 1, len( arglist) found_another: select case( arglist( i: i)) case( comma) found_another number_of_args = number_of_args + 1 end select found_another end do count_args ! ---------------------------------------------------------------------- ! allocate array to hold dummy args allocate( arg_array( 1: number_of_args), stat= astat, errmsg= processor_msg) arg_error: if( astat > 0 )then call msg_quit( "allocate dummy argument list failed: " // trim( arglist)) end if arg_error ! ---------------------------------------------------------------------- ! put each dummy arg into its own array element b_arg = 1 get_args: do i = 1, number_of_args ! find end of each arg e_arg = scan( arglist( b_arg: ) // blank, end_of_arg) - 2 + b_arg ! store arg arg_array( i) = arglist( b_arg: e_arg) ! shift off that arg b_arg = e_arg + 2 end do get_args ! check the dummy arg names call verify_dummy_args( arg_array) ! ---------------------------------------------------------------------- ! process_dummy_arglist() exit return ! ********************************************************************** ! process_dummy_arglist() end subroutine process_dummy_arglist ! ********************************************************************** ! ********************************************************************** ! verify_dummy_args() process macro or text dummy argument list subroutine verify_dummy_args( arg_array) ! ********************************************************************** ! verify_dummy_args() interface ! ---------------------------------------------------------------------- ! an array of dummy args character( len= symbol_name_len), dimension( :), intent( in) :: arg_array ! ********************************************************************** ! entry: macro or text dummy arg list ! exit: macro's dummy arguments are valid and may be substituted in value ! ********************************************************************** ! verify_dummy_args() local ! ---------------------------------------------------------------------- ! index args array integer :: i integer :: j ! ********************************************************************** ! verify_dummy_args() text continue ! ---------------------------------------------------------------------- ! macro or text dummy arguments must be valid names check_names: do i = 1, size( arg_array) call valid_new_name( trim( arg_array( i))) dup_name: do j = 1, i - 1 got_dup: if( arg_array( i) == arg_array( j) )then call msg_quit( "found duplicated dummy argument name: " // trim( arg_array( i))) end if got_dup end do dup_name end do check_names ! ---------------------------------------------------------------------- ! verify_dummy_args() exit return ! ********************************************************************** ! verify_dummy_args() end subroutine verify_dummy_args ! ********************************************************************** ! ********************************************************************** ! verify_macro_value() process macro dummy argument list subroutine verify_macro_value( arglist, value_str) ! ********************************************************************** ! verify_macro_value() interface ! ---------------------------------------------------------------------- ! a pointer to the macro definition so far character( len= symbol_name_len), dimension( :), allocatable :: arglist ! the macro value string is the declaration past the = character( len=*), intent( in) :: value_str ! ********************************************************************** ! entry: macro or its coridate value ! exit: macro's value is valid & may be assigned to macro ! ********************************************************************** ! verify_macro_value() local ! ---------------------------------------------------------------------- ! check all symbol names class( symbol_t), pointer :: symbol_ptr ! make ?name? string character( len= target_len) :: search_str ! point to characters integer :: arg_idx ! point to dummy args integer :: i ! ********************************************************************** ! verify_macro_value() text continue ! ---------------------------------------------------------------------- ! check for null valued macros null_macro: if( len_trim( value_str) == 0 )then call msg_quit( "macro has null value") end if null_macro ! ---------------------------------------------------------------------- ! check that all the dummy args all appear in the macro value have_dummy_args: if( allocated( arglist) )then scan_dummy_args: do i = 1, size( arglist) search_str = l_key // trim( arglist( i)) // r_key arg_idx = index( value_str, trim( search_str)) arg_not_used: if( arg_idx == 0 )then call msg_quit( "macro argument unused: " // trim( arglist( i))) end if arg_not_used end do scan_dummy_args end if have_dummy_args ! ---------------------------------------------------------------------- ! check that no symbol ?name? appear in macro value (includes recursion) nullify( symbol_ptr) call get_next_symbol( symbol_ptr) check_all_symbols: do if( .not. associated( symbol_ptr) ) exit check_all_symbols search_str = l_key // trim( symbol_ptr% name_str) // r_key arg_idx = index( value_str, trim( search_str)) name_defined: if( arg_idx > 0 )then call msg_quit( "macro definition has name already defined: " // trim( symbol_ptr% name_str)) end if name_defined call get_next_symbol( symbol_ptr) end do check_all_symbols ! ---------------------------------------------------------------------- ! verify_macro_value() exit return ! ********************************************************************** ! verify_macro_value() end subroutine verify_macro_value ! ********************************************************************** ! ********************************************************************** ! %%% process coco text and copy ! ********************************************************************** ! ********************************************************************** ! get_text_name() verify text name and determine its length subroutine get_text_name( decl_stmt, text_name, name_len) ! ********************************************************************** ! get_text_name() interface ! ---------------------------------------------------------------------- ! the statement containing the text name character( len= *), intent( in) :: decl_stmt ! the text name character( len= *), intent( out) :: text_name ! the length of the text name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name(..." ! exit: name is valid and its length is known or error exit ! ********************************************************************** ! get_text_name() constants ! ---------------------------------------------------------------------- ! blank or open parenthesis may end a name character( len= *), parameter :: end_of_name = blank // open_paren ! ********************************************************************** ! get_text_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_text_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) ! if no equals found no_eq_op: if( char_idx == 0 )then call msg_quit( "can't find name in text statement: " // trim( decl_stmt)) end if no_eq_op name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is not in use and has a valid form call valid_new_name( decl_stmt( 1: name_len)) text_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_text_name() exit return ! ********************************************************************** ! get_text_name() end subroutine get_text_name ! ********************************************************************** ! ********************************************************************** ! process_text_directive() process an text declaration subroutine process_text_directive( text_dir, must_parens) ! ********************************************************************** ! process_text_directive() interface ! ---------------------------------------------------------------------- ! a statement containing a text directive character( len= *), intent( in) :: text_dir ! true if actual arguments must be in parenthesis logical, intent( in) :: must_parens ! ********************************************************************** ! entry: text_dir is quoted text condition ! exit: text code is stored in the text variable on the symbol list ! ********************************************************************** ! process_text_directive() local ! ---------------------------------------------------------------------- ! name of symbol character( len= symbol_name_len) :: text_name ! results of decoding statement integer :: name_len ! ********************************************************************** ! process_text_directive() text continue ! ---------------------------------------------------------------------- ! extract text name call get_text_name( text_dir, text_name, name_len) ! if active block, process text declaration active_line: if( if_construct% now_selected )then ! add a block to the if-block list to ensure correct nesting call new_block( text_block) ! store text in symbol list call add_text( text_dir( name_len + 1: ), text_name, must_parens) ! end of text so remove text block from if block list call delete_block( text_block) ! count text blocks total% text_blocks = total% text_blocks + 1 end if active_line ! ---------------------------------------------------------------------- ! process_text_directive() exit return ! ********************************************************************** ! process_text_directive() end subroutine process_text_directive ! ********************************************************************** ! ********************************************************************** ! add_text() copy text block to symbol table subroutine add_text( text_decl_str, text_name, must_parens) ! ********************************************************************** ! add_text() interface ! ---------------------------------------------------------------------- ! a statement containing a text declaration character( len= *), intent( in) :: text_decl_str ! the name of the text character( len= *), intent( in) :: text_name ! true if actual args are wrapped in parentheses logical, intent( in) :: must_parens ! ********************************************************************** ! entry: text_decl_str is blank_compress_lower_case logical declaration statement past the double colon ! "" | "(...)" ! text_name is the symbol name ! must_parens is true if this is a constant declaration ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_text() local ! ---------------------------------------------------------------------- ! length of the dummy arglist integer :: arglist_len ! allocation status integer :: astat ! type pointer to allocate type( text_t), pointer :: text_ptr ! ********************************************************************** ! add_text() text continue ! ---------------------------------------------------------------------- ! allocate new text allocate( text_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate text: " // trim( text_name)) end if alloc_error ! build new text on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => text_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => text_ptr last_symbol => first_symbol end if subsequent_or_first nullify( text_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members text_ptr% name_str = text_name text_ptr% declared_file = current_file% name_str text_ptr% declared_line = current_file% lines_transfered text_ptr% referenced = .false. text_ptr% referenced_file = null_string text_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! check for dummy argument list got_paren: if( text_decl_str( 1: len( open_paren)) == open_paren )then ! arglist_len is zero if no close paren arglist_len = index( text_decl_str, close_paren) bad_arg_list_len: if( arglist_len <= len( open_paren // close_paren) )then call msg_quit( "bad text dummy argument list: " // trim( text_decl_str)) end if bad_arg_list_len ! must have something between parens call process_dummy_arglist( text_decl_str( len( open_paren) + 1: arglist_len - 1), text_ptr% dummy_args) allocate( text_ptr% actual_args( size( text_ptr% dummy_args)), stat= astat, errmsg= processor_msg) actual_error: if( astat /= 0 )then call msg_quit( "can't aloocate text actual args array: " // trim( text_ptr% name_str)) end if actual_error else got_paren ! declared must have parenthesis on actual arguments but no dummy arguments parens_no_args: if( must_parens )then call msg_quit( "text actual args declared to need parens but no dummy args: " // trim( text_ptr% name_str)) end if parens_no_args arglist_len = 0 end if got_paren ! ---------------------------------------------------------------------- ! must have nothing after name or close paren extra_chars: if( text_decl_str( arglist_len + 1: ) /= blank )then call msg_quit( "extra characters at end of text declaration: " // trim( text_decl_str)) end if extra_chars ! ---------------------------------------------------------------------- ! assign the text value call assign_text_value( text_name, text_ptr% dummy_args, text_ptr% text_lines) ! finish the text definition text_ptr% args_in_parens = must_parens ! ---------------------------------------------------------------------- ! add_text() exit return ! ********************************************************************** ! add_text() end subroutine add_text ! ********************************************************************** ! ********************************************************************** ! assign_text_value() copy text block to symbol table subroutine assign_text_value( text_name, args_array, lines_array) ! ********************************************************************** ! assign_text_value() interface ! ---------------------------------------------------------------------- ! the name of the text block character( len= symbol_name_len), intent( in) :: text_name ! the array to contain the text dummy args character( len= symbol_name_len), dimension( :), allocatable, intent( in) :: args_array ! the array to contain the text block character( len= buffer_len), dimension( :), allocatable, intent( out) :: lines_array ! ********************************************************************** ! entry: the array dummy args ! exit: the lines array is complete ! ********************************************************************** ! assign_text_value() constants ! ---------------------------------------------------------------------- ! end of a text block character( len= *), parameter :: endtext_str = 'endtext' ! ********************************************************************** ! assign_text_value() local ! ---------------------------------------------------------------------- ! the text scratch file type( file_t) :: text_file ! ---------------------------------------------------------------------- ! copy buffer character( len= buffer_len) :: statement ! lines of text in the text block integer :: i integer :: j ! seek dummy argments in text block character( len= target_len) :: search_str integer :: arg_idx integer :: arg_len ! true when complete statement has been read logical :: complete ! allocation status integer :: astat ! ---------------------------------------------------------------------- ! line number string character( len= conversion_len) :: line_str ! ********************************************************************** ! assign_text_value() text continue ! ---------------------------------------------------------------------- ! store text value (read into scratch file, count lines, allocate storage, copy to storage) ! ---------------------------------------------------------------------- ! initialize the text file variable text_file = file_t( io_unit= text_unit, name_str= null_file_name, & format_str= null_string, line= null(), & io_status= 0, lines_transfered= 0, & named_file= .false., create= .true.) ! open the set text file call open_scratch( text_file) ! start as if with a complete statement complete = .true. ! ---------------------------------------------------------------------- ! main read text block lines loop read_lines: do ! ---------------------------------------------------------------------- ! read a text line from the current source file read( unit= current_file% io_unit, fmt= current_file% format_str, & iostat= current_file% io_status, iomsg= processor_msg) current_file% line read_error: if( current_file% io_status > 0 )then call msg_quit( "read text failed: " // trim( current_file% name_str)) end if read_error ! ---------------------------------------------------------------------- ! read until end of file or complete statement read_eof: if( current_file% io_status < 0 )then total% input_lines = total% input_lines + current_file% lines_transfered call msg_quit( "end of file encountered within text block") end if read_eof ! count lines current_file% lines_transfered = current_file% lines_transfered + 1 write( unit= line_str, fmt= conversion_fmt) current_file% lines_transfered predefined_macros( line_idx)% macro_value = line_str total% text_lines = total% text_lines + 1 ! write all lines to the output as coco lines call write_coco_line( output_file) ! write the text line write( unit= text_file% io_unit, iostat= text_file% io_status, iomsg= processor_msg) text_file% line write_text: if( text_file% io_status > 0 )then call msg_quit( "write text file failed: " // trim( text_file% line)) end if write_text ! count text lines text_file% lines_transfered = text_file% lines_transfered + 1 ! ---------------------------------------------------------------------- ! process coco lines coco_line: if( current_file% line( 1: len( coco_key)) == coco_key )then ! count coco lines total% coco_lines = total% coco_lines + 1 ! ignore coco comments coco_statement: if( is_coco_statement( current_file% line( len( coco_key) + 1: )) )then ! gather a complete statement call gather_coco_statement( current_file% line, statement, complete) ! if incomplete, go get rest of statement got_statement: if( .not. complete )then cycle read_lines end if got_statement ! ---------------------------------------------------------------------- ! check for the end text statement end_text: if( trim( statement) == endtext_str & .or. trim( statement) == endtext_str // trim( text_name) )then exit read_lines end if end_text ! check for certain directives in the text block call verify_text_directive( statement) end if coco_statement ! source lines else coco_line continuation_error: if( .not. complete )then call msg_quit( "source line in continued coco statement in text " // trim( text_name)) end if continuation_error ! end processing text statements end if coco_line ! end main read set file lines loop end do read_lines ! ---------------------------------------------------------------------- ! check for no lines in text block or remove the end text statement null_text: if( text_file% lines_transfered < 2 )then call close_scratch( text_file) call msg_quit( "text block has no lines: " // trim( text_name)) else null_text text_file% lines_transfered = text_file% lines_transfered - 1 end if null_text ! ---------------------------------------------------------------------- ! allocate array for text allocate( lines_array( 1: text_file% lines_transfered), stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "allocate text block failed") end if alloc_error ! count text lines defined total% text_lines = total% text_lines + 1 ! rewind text scratch file rewind( unit= text_file% io_unit, iostat= text_file% io_status, iomsg= processor_msg) rewind_text: if( text_file% io_status > 0 )then call msg_quit( "rewind text scratch file failed") end if rewind_text ! copy text scratch file to array copy: do i = 1, size( lines_array) read( unit= text_file% io_unit, iostat= text_file% io_status, iomsg= processor_msg) lines_array( i) read_text: if( text_file% io_status > 0 )then call msg_quit( "read text scratch file failed " // trim( text_name)) end if read_text end do copy ! close text scratch file call close_scratch( text_file) ! verify whether each dummy arg appears in the text block somewhere has_dummy_args: if( allocated( args_array) )then check_arg: do j = 1, size( args_array) arg_idx = 0 search_str = l_key // trim( args_array( j) ) // r_key arg_len = len_trim( search_str) check_line: do i = 1, size( lines_array) arg_idx = max( arg_idx, index( to_lower( lines_array( i)), search_str( 1: arg_len) ) ) end do check_line not_found: if( arg_idx == 0 )then call msg_quit( "dummy arg " // search_str( 1: arg_len) // " not found in text " // trim( text_name)) end if not_found end do check_arg end if has_dummy_args ! ---------------------------------------------------------------------- ! assign_text_value() exit return ! ********************************************************************** ! assign_text_value() end subroutine assign_text_value ! ********************************************************************** ! ********************************************************************** ! verify_text_directive() check that no invalid directives appear in a text block subroutine verify_text_directive( text_stmt) ! ********************************************************************** ! verify_text_directive() interface ! ---------------------------------------------------------------------- ! a statement from a text block character( len= *), intent( in) :: text_stmt ! ********************************************************************** ! entry: text_stmt is a blank_compress_lower_case coco directive past the coco key ! which must contain only: ! assignment | "stop" | "message" | "if..." | "else if..." | ! "else" | "end if" | "assert..." ! exit: if any other directive exists, the directive is found and flagged ! ********************************************************************** ! verify_text_directive() local ! presence/location of equals integer :: eq_idx ! walk symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! verify_text_directive() text continue ! ---------------------------------------------------------------------- ! detect assignment statements assigning to named variables nullify( symbol_ptr) eq_idx = index( text_stmt( 1: symbol_name_len + len( equals)), equals) got_equals: if( eq_idx > 0 )then call seek_symbol_name( text_stmt( 1: eq_idx - 1), symbol_ptr) end if got_equals ! ---------------------------------------------------------------------- ! which directive? which_directive: if( associated( symbol_ptr) )then ! assignment is ok continue ! ---------------------------------------------------------------------- ! stop directive else if( text_stmt( 1: len( stop_str)) == stop_str )then which_directive ! stop is ok continue ! ---------------------------------------------------------------------- ! message directive else if( text_stmt( 1: len( message_str)) == message_str )then which_directive ! message is ok continue ! ---------------------------------------------------------------------- ! if directive else if( text_stmt( 1: len( if_str)) == if_str )then which_directive ! process the if statement to check for correct nesting call process_if_directive( text_stmt( len( if_str) + 1: )) ! just store the if in the text block- evaluate it when the block is copied if_construct% now_selected = .true. ! ---------------------------------------------------------------------- ! else if directive else if( text_stmt( 1: len( elseif_str)) == elseif_str )then which_directive ! process the else if statement to check for correct nesting call process_elseif_directive( text_stmt( len( elseif_str) + 1: )) ! just store the elseif in the text block- evaluate it when the block is copied if_construct% now_selected = .true. ! ---------------------------------------------------------------------- ! else directive else if( text_stmt( 1: len( else_str)) == else_str )then which_directive ! process the else statement to check for correct nesting call process_else_directive( text_stmt( len( else_str) + 1: )) ! just store the else in the text block- evaluate it when the block is copied if_construct% now_selected = .true. ! ---------------------------------------------------------------------- ! end if directive else if( text_stmt( 1: len( endif_str)) == endif_str )then which_directive ! process the if statement to check for correct nesting call process_endif_directive( text_stmt( len( endif_str) + 1: )) ! ---------------------------------------------------------------------- ! assert statement else if( text_stmt( 1: len( assert_str)) == assert_str )then which_directive ! assert is ok continue ! ---------------------------------------------------------------------- ! all else fails else which_directive ! something other than a good one call msg_quit( "illegal directive in text block: " // trim( text_stmt)) ! ---------------------------------------------------------------------- ! which directive? end if which_directive ! ---------------------------------------------------------------------- ! verify_text_directive() exit return ! ********************************************************************** ! verify_text_directive() end subroutine verify_text_directive ! ********************************************************************** ! ********************************************************************** ! process_copy_directive() process a coco copy directive subroutine process_copy_directive( copy_dir) ! ********************************************************************** ! process_copy_directive() interface ! ---------------------------------------------------------------------- ! a statement containing a copy directive character( len= *), intent( in) :: copy_dir ! ********************************************************************** ! entry: copy directive ! exit: the directive is processed or error exit ! ********************************************************************** ! process_copy_directive() constants ! ---------------------------------------------------------------------- ! mark beginning and end of text character( len= *), parameter :: begin_txt = '?? ! text ' character( len= *), parameter :: end_txt = '?? ! end text ' ! ********************************************************************** ! process_copy_directive() local ! ---------------------------------------------------------------------- ! use name from directive to find text block pointer character( len= symbol_name_len) :: text_name ! length of text block name integer :: name_len ! find beginning of name integer :: name_idx ! find end of name integer :: end_name_idx ! pointer to text block type( text_t), pointer :: text_ptr ! gather a coco statement from the text block character( len= buffer_len) :: statement ! expanded lines character( len= buffer_len) :: expand_line ! loop through the text block lines integer :: i ! find open parenthesis on copy directive integer :: open_paren_idx ! find close parenthesis integer :: close_paren_idx ! communicate with gather_statement() logical :: complete ! ********************************************************************** ! process_copy_directive() text continue ! ---------------------------------------------------------------------- ! check for valid directive name_idx = 1 call get_copy_name( copy_dir, text_name, name_len) end_name_idx = name_idx + name_len - 1 call get_text_ptr( copy_dir( name_idx: end_name_idx), text_ptr) ! ---------------------------------------------------------------------- ! if active block, process text declaration active_line: if( if_construct% now_selected )then text_ptr% referenced = .true. text_ptr% referenced_file = current_file% name_str text_ptr% referenced_line = current_file% lines_transfered ! test first character after name open_paren_idx = end_name_idx + 1 ! check that if text has dummy args, copy has actual args, and vice versa have_args: if( allocated( text_ptr% dummy_args) )then ! text with args no_args: if( copy_dir( open_paren_idx: open_paren_idx) /= open_paren )then call msg_quit( "no actual arguments for text: " // trim( text_ptr% name_str) ) end if no_args open_paren_idx = index( asis_stmt, open_paren) call seek_close_paren( asis_stmt, open_paren_idx, close_paren_idx) no_close_paren: if( close_paren_idx > len_trim( asis_stmt) )then call msg_quit( "can't find close parenthesis in copy directive: " // trim( asis_stmt)) end if no_close_paren call make_actual_array( asis_stmt( open_paren_idx + 1: close_paren_idx - 1) // comma, text_ptr% actual_args, & text_ptr% args_in_parens) else have_args ! text without args got_args: if( copy_dir( open_paren_idx: open_paren_idx) == open_paren )then call msg_quit( "no dummy arguments for text: " // trim( copy_dir)) end if got_args ! block has/has not args end if have_args ! ---------------------------------------------------------------------- ! mark the beginning of the text line = begin_txt // text_ptr% name_str call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! loop thru text block lines copy_lines: do i = 1, size( text_ptr% text_lines) line = text_ptr% text_lines( i) ! coco lines or source lines coco_lines: if( line( 1: len( coco_key)) == coco_key )then ! write coco line to the output call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! process coco lines, ignore coco comments coco_construct: if( is_coco_statement( line( len( coco_key) + 1: )) )then ! gather a complete coco statement call gather_coco_statement( line, statement, complete) ! if not yet a complete statement, get next line incomplete: if( .not. complete )then cycle copy_lines end if incomplete ! process (permitted in a block) directives call process_block_directive( statement) output_file% line => line end if coco_construct ! ---------------------------------------------------------------------- ! source lines else coco_lines ! allow for macro expansion to lengthen the line expand_line = text_ptr% text_lines( i) ! if args substitute in text line go_args: if( allocated( text_ptr% dummy_args) )then call process_actual_arglist( text_ptr% actual_args, & expand_line, text_ptr% text_lines( i), text_ptr% dummy_args) if( options% wrapping_lines ) call wrap_source_line( expand_line) end if go_args ! if ? present, edit source line edit_line_args: if( index( expand_line, l_key) > 0 )then call edit_source_line( expand_line) end if edit_line_args ! finally, write out the line line = expand_line( 1: len( line)) call write_source_line( output_file) end if coco_lines end do copy_lines total% copied_lines = total% copied_lines + size( text_ptr% text_lines) ! mark the end of the text line = end_txt // text_ptr% name_str call write_coco_line( output_file) ! process active lines only end if active_line ! ---------------------------------------------------------------------- ! process_copy_directive() exit return ! ********************************************************************** ! process_copy_directive() end subroutine process_copy_directive ! ********************************************************************** ! ********************************************************************** ! get_copy_name() verify text name and determine its length subroutine get_copy_name( decl_stmt, text_name, name_len) ! ********************************************************************** ! get_copy_name() interface ! ---------------------------------------------------------------------- ! the statement containing the text name character( len= *), intent( in) :: decl_stmt ! the text name character( len= *), intent( out) :: text_name ! the length of the text name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name(..." ! exit: name is valid and its length is known or error exit ! ********************************************************************** ! get_copy_name() constants ! ---------------------------------------------------------------------- ! blank or open parenthesis may end a name character( len= *), parameter :: end_of_name = blank // open_paren ! ********************************************************************** ! get_copy_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_copy_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) ! if no equals found no_eq_op: if( char_idx == 0 )then call msg_quit( "can't find name in copy statement: " // trim( decl_stmt)) end if no_eq_op name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! return the name text_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_copy_name() exit return ! ********************************************************************** ! get_copy_name() end subroutine get_copy_name ! ********************************************************************** ! ********************************************************************** ! process_block_directive() process a coco text block directive subroutine process_block_directive( block_stmt) ! ********************************************************************** ! process_block_directive() interface ! ---------------------------------------------------------------------- ! a statement from a text block character( len= *), intent( in) :: block_stmt ! ********************************************************************** ! entry: coco_stmt is a blank_compress_lower_case coco directive past the coco key ! "stop..." | "message..." | "if..." | "else if..." | "else..." | ! "end if..." | "assert..." | "name=..." ! exit: the directive is processed or error exit ! ********************************************************************** ! process_block_directive() local ! ---------------------------------------------------------------------- ! point to location of symbol class( symbol_t), pointer :: symbol_ptr ! specific type pointers type( integer_t), pointer :: integer_ptr type( logical_t), pointer :: logical_ptr ! pointer to equals integer :: eq_idx ! expression string is after the equals integer :: expr_idx ! ********************************************************************** ! process_block_directive() text continue ! ---------------------------------------------------------------------- ! which directive? ! ---------------------------------------------------------------------- ! detect assignment statements assigning to variables named by keywords nullify( symbol_ptr) eq_idx = scan( block_stmt( 1: symbol_name_len + 1), equals) got_equals: if( eq_idx > 0 )then call seek_symbol_name( block_stmt( 1: eq_idx - 1), symbol_ptr) end if got_equals ! ---------------------------------------------------------------------- ! which directive? ! ---------------------------------------------------------------------- ! assignment directive which_directive: if( associated( symbol_ptr) )then ! up to the equals must be a declared name expr_idx = eq_idx + len( equals) ! must be an integer or logical variable integer_or_logical_or_error: select type( symbol_ptr) type is( integer_t) integer_or_logical_or_error integer_ptr => symbol_ptr call process_integer_assignment( block_stmt( expr_idx: ), integer_ptr) type is( logical_t) integer_or_logical_or_error logical_ptr => symbol_ptr call process_logical_assignment( block_stmt( expr_idx: ), logical_ptr) class default integer_or_logical_or_error call msg_quit( "assignment variable must be an integer or a logical: " // trim( symbol_ptr% name_str) ) end select integer_or_logical_or_error nullify( symbol_ptr) ! ---------------------------------------------------------------------- ! stop directive else if( block_stmt( 1: len( stop_str)) == stop_str )then which_directive call process_stop_directive( block_stmt( len( stop_str) + 1: ) ) ! ---------------------------------------------------------------------- ! message directive else if( block_stmt( 1: len( message_str)) == message_str )then which_directive call process_message_directive( block_stmt( len( message_str) + 1: ) ) ! ---------------------------------------------------------------------- ! if directive else if( block_stmt( 1: len( if_str)) == if_str )then which_directive call process_if_directive( block_stmt( len( if_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else if directive else if( block_stmt( 1: len( elseif_str)) == elseif_str )then which_directive call process_elseif_directive( block_stmt( len( elseif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else directive else if( block_stmt( 1: len( else_str)) == else_str )then which_directive call process_else_directive( block_stmt( len( else_str) + 1: ) ) ! ---------------------------------------------------------------------- ! endif directive else if( block_stmt( 1: len( endif_str)) == endif_str )then which_directive call process_endif_directive( block_stmt( len( endif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! assert declaration else if( block_stmt( 1: len( assert_str)) == assert_str )then which_directive call process_assert_directive( block_stmt( len( assert_str) + 1: )) ! ---------------------------------------------------------------------- ! cannot process this directive else which_directive call msg_quit( "error: unknown block directive: " // trim( block_stmt)) ! ---------------------------------------------------------------------- ! which directive? end if which_directive ! ---------------------------------------------------------------------- ! process_block_directive() exit return ! ********************************************************************** ! process_block_directive() end subroutine process_block_directive ! ********************************************************************** ! ********************************************************************** ! process_document_directive() process a coco stop directive subroutine process_document_directive( document_dir) ! ********************************************************************** ! process_document_directive() interface ! ---------------------------------------------------------------------- ! document string character( len= *), intent( in) :: document_dir ! ********************************************************************** ! process_document_directive() constants ! ---------------------------------------------------------------------- ! document text character( len= *), dimension( 1: 15), parameter :: document_text = [ & '! ', & '! Preprocessor executed: ?date? ?time?', & '! ', & '! Preprocessor command line: ?cmdline?', & '! Preprocessor set file: ?setfile? ', & '! Preprocessor log file: ?logfile? ', & '! Preprocessor version: ?coco? ', & '! ', & '! Source file: ?file? line: ?line? ', & '! Compile file: ?output? ', & '! Include path: ?incpath? ', & '! ', & '! User: ?user? ', & '! Current directory: ?cwd? ', & '! ' ] ! ********************************************************************** ! process_document_directive() local ! ---------------------------------------------------------------------- ! loop through document text integer :: i ! save any selected arg keys character( len= 1) :: save_l_key character( len= 1) :: save_r_key ! ********************************************************************** ! process_document_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters extra_chars: if( document_dir /= blank )then call msg_quit( "extra characters at end of document directive: " // trim( document_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! process assignment directive if on an active line active_line: if( if_construct% now_selected ) then save_l_key = l_key save_r_key = r_key l_key = arg_key r_key = arg_key text_to_output: do i = 1, size( document_text) line = document_text( i) ! if ? present, edit source line edit_line: if( index( document_text( i), arg_key) > 0 )then call edit_source_line( line) end if edit_line ! copy source lines call write_source_line( output_file) end do text_to_output l_key = save_l_key r_key = save_r_key end if active_line ! ---------------------------------------------------------------------- ! process_document_directive() exit return ! ********************************************************************** ! process_document_directive() end subroutine process_document_directive ! ********************************************************************** ! ********************************************************************** ! process_options_directive() process a coco options directive subroutine process_options_directive( options_dir) ! ********************************************************************** ! process_options_directive() interface ! ---------------------------------------------------------------------- ! the options directive character( len= *), intent( in) :: options_dir ! ********************************************************************** ! entry: options_dir is blank_compress_lower_case coco options directive, past the coco key word ! exit: coco processing optionss ! ********************************************************************** ! process_options_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters at end of directive extra_chars: if( options_dir /= blank )then call msg_quit( "extra characters at end of options directive: " // trim( options_dir)) end if extra_chars ! process options directive if on an active line active_line: if( if_construct% now_selected )then call write_options() end if active_line ! ---------------------------------------------------------------------- ! process_options_directive() exit return ! ********************************************************************** ! process_options_directive() end subroutine process_options_directive ! ********************************************************************** ! ********************************************************************** ! process_report_directive() process a coco report directive subroutine process_report_directive( report_dir) ! ********************************************************************** ! process_report_directive() interface ! ---------------------------------------------------------------------- ! the report directive character( len= *), intent( in) :: report_dir ! ********************************************************************** ! entry: report_dir is blank_compress_lower_case coco report directive, past the coco key word ! exit: coco processing reports ! ********************************************************************** ! process_report_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters at end of directive extra_chars: if( report_dir /= blank )then call msg_quit( "extra characters at end of report directive: " // trim( report_dir)) end if extra_chars ! process report directive if on an active line active_line: if( if_construct% now_selected )then call write_report() end if active_line ! ---------------------------------------------------------------------- ! process_report_directive() exit return ! ********************************************************************** ! process_report_directive() end subroutine process_report_directive ! ********************************************************************** ! ********************************************************************** ! process_symbols_directive() process a coco symbols directive subroutine process_symbols_directive( symbols_dir) ! ********************************************************************** ! process_symbols_directive() interface ! ---------------------------------------------------------------------- ! the symbols directive character( len= *), intent( in) :: symbols_dir ! ********************************************************************** ! entry: symbols_dir is blank_compress_lower_case coco symbols directive, past the coco key word ! exit: coco processing symbolss ! ********************************************************************** ! process_symbols_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters at end of directive extra_chars: if( symbols_dir /= blank )then call msg_quit( "extra characters at end of symbols directive: " // trim( symbols_dir)) end if extra_chars ! process symbols directive if on an active line active_line: if( if_construct% now_selected )then call write_symbols() end if active_line ! ---------------------------------------------------------------------- ! process_symbols_directive() exit return ! ********************************************************************** ! process_symbols_directive() end subroutine process_symbols_directive ! ********************************************************************** ! ********************************************************************** ! seek_symbol_name() seek symbol on symbol list subroutine seek_symbol_name( name_str, symbol_ptr) ! ********************************************************************** ! seek_symbol_name() interface ! ---------------------------------------------------------------------- ! the name of the symbol being sought character( len= *), intent( in) :: name_str ! a pointer to the symbol found class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! seek_symbol_name() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_symbol all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols name_match: if( name_str == symbol_ptr% name_str )then exit all_symbols end if name_match symbol_ptr => symbol_ptr% next end do all_symbols ! ---------------------------------------------------------------------- ! seek_symbol_name() exit return ! ********************************************************************** ! seek_symbol_name() end subroutine seek_symbol_name ! ********************************************************************** ! ********************************************************************** ! seek_cl_symbol_name() seek symbol on symbol list subroutine seek_cl_symbol_name( name_str, symbol_ptr) ! ********************************************************************** ! seek_cl_symbol_name() interface ! ---------------------------------------------------------------------- ! the name of the symbol being sought character( len= *), intent( in) :: name_str ! a pointer to the symbol found class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! seek_cl_symbol_name() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_cl_symbol all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols name_match: if( name_str == symbol_ptr% name_str )then exit all_symbols end if name_match symbol_ptr => symbol_ptr% next end do all_symbols ! ---------------------------------------------------------------------- ! seek_cl_symbol_name() exit return ! ********************************************************************** ! seek_cl_symbol_name() end subroutine seek_cl_symbol_name ! ********************************************************************** ! ********************************************************************** ! seek_sf_symbol_name() seek symbol on symbol list subroutine seek_sf_symbol_name( name_str, symbol_ptr) ! ********************************************************************** ! seek_sf_symbol_name() interface ! ---------------------------------------------------------------------- ! the name of the symbol being sought character( len= *), intent( in) :: name_str ! a pointer to the symbol found class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! seek_sf_symbol_name() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_sf_symbol all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols name_match: if( name_str == symbol_ptr% name_str )then exit all_symbols end if name_match symbol_ptr => symbol_ptr% next end do all_symbols ! ---------------------------------------------------------------------- ! seek_sf_symbol_name() exit return ! ********************************************************************** ! seek_sf_symbol_name() end subroutine seek_sf_symbol_name ! ********************************************************************** ! ********************************************************************** ! get_integer_value() seek symbol on symbol list subroutine get_integer_value( integer_str, return_value) ! ********************************************************************** ! get_integer_value() interface ! ---------------------------------------------------------------------- ! the name of the integer whose value is sought character( len= *), intent( in) :: integer_str ! the value of the integer integer, intent( out) :: return_value ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_integer_value() local ! ---------------------------------------------------------------------- ! pointer to search the integer sublist of the symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_integer_value() text continue ! ---------------------------------------------------------------------- ! search integer list symbol_ptr => first_symbol search_list: do if( .not. associated( symbol_ptr) ) exit search_list check_integers: select type( symbol_ptr) type is( integer_t) check_integers name_match: if( integer_str == symbol_ptr% name_str )then value_defined: if( symbol_ptr% defined )then return_value = symbol_ptr% integer_value symbol_ptr% referenced = .true. symbol_ptr% referenced_file = current_file% name_str symbol_ptr% referenced_line = current_file% lines_transfered return else value_defined call msg_quit( "integer not defined: " // trim( integer_str) ) end if value_defined end if name_match end select check_integers symbol_ptr => symbol_ptr% next end do search_list ! ---------------------------------------------------------------------- ! integer not found call msg_quit( "unknown integer: " // trim( integer_str) ) ! ---------------------------------------------------------------------- ! get_integer_value() exit return ! ********************************************************************** ! get_integer_value() end subroutine get_integer_value ! ********************************************************************** ! ********************************************************************** ! get_logical_value() seek symbol on symbol list subroutine get_logical_value( logical_str, return_value) ! ********************************************************************** ! get_logical_value() interface ! ---------------------------------------------------------------------- ! the name of the logical whose value is sought character( len= *), intent( in) :: logical_str ! the value of the logical logical, intent( out) :: return_value ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_logical_value() local ! ---------------------------------------------------------------------- ! pointer to search symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_logical_value() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_symbol search_list: do if( .not. associated( symbol_ptr) ) exit search_list check_logicals: select type( symbol_ptr) type is( logical_t) check_logicals name_match: if( logical_str == symbol_ptr% name_str )then value_defined: if( symbol_ptr% defined )then return_value = symbol_ptr% logical_value symbol_ptr% referenced = .true. symbol_ptr% referenced_file = current_file% name_str symbol_ptr% referenced_line = current_file% lines_transfered return else value_defined call msg_quit( "logical not defined: " // trim( logical_str) ) end if value_defined end if name_match end select check_logicals symbol_ptr => symbol_ptr% next end do search_list ! ---------------------------------------------------------------------- ! logical not found call msg_quit( "unknown logical: " // trim( logical_str) ) ! ---------------------------------------------------------------------- ! get_logical_value() exit return ! ********************************************************************** ! get_logical_value() end subroutine get_logical_value ! ********************************************************************** ! ********************************************************************** ! get_text_ptr() seek symbol on symbol list subroutine get_text_ptr( name_str, text_ptr) ! ********************************************************************** ! get_text_ptr() interface ! ---------------------------------------------------------------------- ! the name of the text whose pointer is sought character( len= *), intent( in) :: name_str ! the pointer to the text type( text_t), pointer :: text_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case text symbol name ! exit: symbol found or not in text symbol array ! ********************************************************************** ! get_text_ptr() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_text_ptr() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_symbol search_list: do if( .not. associated( symbol_ptr) ) exit search_list check_text: select type( symbol_ptr) type is( text_t) check_text name_match: if( name_str == symbol_ptr% name_str )then text_ptr => symbol_ptr return end if name_match end select check_text symbol_ptr => symbol_ptr% next end do search_list ! ---------------------------------------------------------------------- ! text not found call msg_quit( "unknown text: " // trim( text_str)) ! ---------------------------------------------------------------------- ! get_text_ptr() exit return ! ********************************************************************** ! get_text_ptr() end subroutine get_text_ptr ! ********************************************************************** ! ********************************************************************** ! get_next_symbol() seek symbol on symbol list subroutine get_next_symbol( symbol_ptr) ! ********************************************************************** ! get_next_symbol() interface ! ---------------------------------------------------------------------- ! a pointer to the next symbol on the symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_symbol() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous symbol start_or_continue: if( associated( symbol_ptr) )then symbol_ptr => symbol_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! ---------------------------------------------------------------------- ! get_next_symbol() exit return ! ********************************************************************** ! get_next_symbol() end subroutine get_next_symbol ! ********************************************************************** ! ********************************************************************** ! get_next_integer() seek symbol on symbol list subroutine get_next_integer( integer_ptr) ! ********************************************************************** ! get_next_integer() interface ! ---------------------------------------------------------------------- ! a pointer to the next integer on the symbol list type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_integer() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_next_integer() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous integer start_or_continue: if( associated( integer_ptr) )then symbol_ptr => integer_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! scan to the next integer find_next: do if( .not. associated( symbol_ptr) ) exit find_next check_next: select type( symbol_ptr) type is( integer_t) check_next integer_ptr => symbol_ptr return end select check_next symbol_ptr => symbol_ptr% next end do find_next ! end of the integer list nullify( integer_ptr) ! ---------------------------------------------------------------------- ! get_next_integer() exit return ! ********************************************************************** ! get_next_integer() end subroutine get_next_integer ! ********************************************************************** ! ********************************************************************** ! get_next_logical() seek symbol on symbol list subroutine get_next_logical( logical_ptr) ! ********************************************************************** ! get_next_logical() interface ! ---------------------------------------------------------------------- ! a pointer to the next logical on the symbol list type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_logical() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_next_logical() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous logical start_or_continue: if( associated( logical_ptr) )then symbol_ptr => logical_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! scan to the next logical find_next: do if( .not. associated( symbol_ptr) ) exit find_next check_next: select type( symbol_ptr) type is( logical_t) check_next logical_ptr => symbol_ptr return end select check_next symbol_ptr => symbol_ptr% next end do find_next ! end of the logical list nullify( logical_ptr) ! ---------------------------------------------------------------------- ! get_next_logical() exit return ! ********************************************************************** ! get_next_logical() end subroutine get_next_logical ! ********************************************************************** ! ********************************************************************** ! get_next_macro() seek symbol on symbol list subroutine get_next_macro( macro_ptr) ! ********************************************************************** ! get_next_macro() interface ! ---------------------------------------------------------------------- ! a pointer to the next macro on the symbol list type( macro_t), pointer :: macro_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_macro() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_next_macro() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous macro start_or_continue: if( associated( macro_ptr) )then symbol_ptr => macro_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! scan to the next macro find_next: do if( .not. associated( symbol_ptr) ) exit find_next check_next: select type( symbol_ptr) type is( macro_t) check_next macro_ptr => symbol_ptr return end select check_next symbol_ptr => symbol_ptr% next end do find_next ! end of macro list nullify( macro_ptr) ! ---------------------------------------------------------------------- ! get_next_macro() exit return ! ********************************************************************** ! get_next_macro() end subroutine get_next_macro ! ********************************************************************** ! ********************************************************************** ! %%% diagnose and evaluate expressions ! ********************************************************************** ! ********************************************************************** ! integer_or_logical() determine type of expression subroutine integer_or_logical( expr_str, flag) ! ********************************************************************** ! integer_or_logical() interface ! ---------------------------------------------------------------------- ! an expression whose type is to be assertained character( len= *), intent( in) :: expr_str ! true if the type is integer logical, intent( out) :: flag ! ********************************************************************** ! entry: symbol_str is string "..." ! exit: flag is true if string is an integer expression and false otherwise ! ********************************************************************** ! integer_or_logical() constants ! ---------------------------------------------------------------------- ! search for a character which must be part of a logical expression character( len= *), parameter :: logical_chars = '.<>=' ! search for a character which may be part of an integer expression character( len= *), parameter :: integer_chars = '+-*/\' ! ********************************************************************** ! integer_or_logical() local ! ---------------------------------------------------------------------- ! search results integer :: char_idx ! search integer or logical lists type( integer_t), pointer :: integer_ptr type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! integer_or_logical() text continue ! ---------------------------------------------------------------------- ! does string contain a character which is only in logical expressions? char_idx = scan( expr_str, logical_chars) got_dot: if( char_idx > 0 )then flag = .false. return end if got_dot ! does string contain a character which is only in integer expressions? char_idx = scan( expr_str, integer_chars) got_op: if( char_idx > 0 )then flag = .true. return end if got_op ! ---------------------------------------------------------------------- ! is string an integer or a logical symbol name? char_idx = verify( expr_str, alphanum_chars) got_name: if( char_idx == 0 )then nullify( integer_ptr) search_integers: do call get_next_integer( integer_ptr) if( .not. associated( integer_ptr) ) exit search_integers match_int_name: if( expr_str == trim( integer_ptr% name_str) )then flag = .true. return end if match_int_name end do search_integers nullify( logical_ptr) search_logicals: do call get_next_logical( logical_ptr) if( .not. associated( logical_ptr) ) exit search_logicals match_log_name: if( expr_str == trim( logical_ptr% name_str) )then flag = .false. return end if match_log_name end do search_logicals end if got_name ! ---------------------------------------------------------------------- ! is string all digits? char_idx = verify( expr_str, digit_chars) got_digits: if( char_idx == 0 )then flag = .true. return end if got_digits ! ---------------------------------------------------------------------- ! can't classify the expression so punt call msg_quit( "can't classify: " // trim( expr_str) ) ! ---------------------------------------------------------------------- ! integer_or_logical() exit return ! ********************************************************************** ! integer_or_logical() end subroutine integer_or_logical ! ********************************************************************** ! ********************************************************************** ! eval_int_expr() evaluate int_expr as an integer recursive subroutine eval_int_expr( int_expr, value) ! ********************************************************************** ! eval_int_expr() interface ! ---------------------------------------------------------------------- ! the integer expression to be evaluated character( len= *), intent( in) :: int_expr ! the value of the integer expression integer, intent( out) :: value ! ********************************************************************** ! entry: int_expr is blank_compress_lower_case integer int_expr ! exit: true if value is int_expr value, false otherwise ! ********************************************************************** ! eval_int_expr() constants ! ---------------------------------------------------------------------- ! addition operators integer, parameter :: add_op_len = max( len( plus), len( minus) ) ! multiplication operators (times is defined in the main program) character( len= *), parameter :: divby = slash character( len= *), parameter :: remby = backslash integer, parameter :: mul_op_len = max( len( times), len( divby), len( remby) ) ! length of operators integer, parameter :: op_len = max( len( plus), len( minus), len( times), len( divby), len( remby) ) ! ********************************************************************** ! eval_int_expr() local ! ---------------------------------------------------------------------- ! operations to be done character( len= add_op_len) :: add_op character( len= mul_op_len) :: mul_op ! ---------------------------------------------------------------------- ! next operation character( len= op_len) :: next_op ! ---------------------------------------------------------------------- ! partial values of the int_expr integer :: l_add, r_add integer :: l_mul, r_mul ! ---------------------------------------------------------------------- ! pointers to characters integer :: next_char integer :: next_op_idx integer :: expr_len integer :: primary_len ! ********************************************************************** ! eval_int_expr() text continue ! ---------------------------------------------------------------------- ! limits of scan next_char = 1 expr_len = len_trim( int_expr) ! initialize adds add_op = plus l_add = 0 ! ---------------------------------------------------------------------- ! scan thru int_expr add_ops: do if( next_char > expr_len) exit add_ops ! find a primary call eval_int_primary( int_expr( next_char: ), primary_len, r_add) next_op_idx = next_char + primary_len ! find next operator or end of expression add_end: if( next_op_idx <= expr_len )then next_op = int_expr( next_op_idx: next_op_idx) next_char = next_op_idx + 1 else add_end next_op = blank next_char = next_op_idx end if add_end ! ---------------------------------------------------------------------- ! initialize for a set of mul ops mul_op = next_op l_mul = r_add ! ---------------------------------------------------------------------- ! process a set of mul ops mul_ops: do if( .not. ( next_op == times .or. next_op == divby .or. next_op == remby) ) exit mul_ops ! find a primary call eval_int_primary( int_expr( next_char: ), primary_len, r_mul) next_op_idx = next_char + primary_len ! find next operator or end of expression mul_end: if( next_op_idx <= expr_len )then next_op = int_expr( next_op_idx: next_op_idx) next_char = next_op_idx + 1 else mul_end next_op = blank next_char = next_op_idx end if mul_end ! do the pending add op mul_div: select case( mul_op) case( times) mul_div l_mul = l_mul * r_mul case( divby) mul_div l_mul = l_mul / r_mul case( remby) mul_div l_mul = mod( l_mul, r_mul) end select mul_div mul_op = next_op end do mul_ops ! product is the right operand r_add = l_mul ! ---------------------------------------------------------------------- ! do the pending add op add_sub: select case( add_op) case( blank, plus) add_sub l_add = l_add + r_add case( minus) add_sub l_add = l_add - r_add case default add_sub call msg_quit( "unknown arithmetic operator: " // add_op) end select add_sub add_op = next_op end do add_ops ! ---------------------------------------------------------------------- ! value of integer expression value = l_add ! ---------------------------------------------------------------------- ! eval_int_expr() exit return ! ********************************************************************** ! eval_int_expr() end subroutine eval_int_expr ! ********************************************************************** ! ********************************************************************** ! eval_log_expr() expression is evaluated as a logical recursive subroutine eval_log_expr( log_expr, value) ! ********************************************************************** ! eval_log_expr() interface ! ---------------------------------------------------------------------- ! the logical expression to be evaluated character( len= *), intent( in) :: log_expr ! the value of the expression logical, intent( out) :: value ! ********************************************************************** ! entry: expression is blank_compress_lower_case logical expression ! exit: value is expression value ! ********************************************************************** ! eval_log_expr() constants integer, parameter :: eqv_op_len = max( len( eqv_str), len( neqv_str)) ! length of the next operator integer, parameter :: next_op_len = max( len( or_str), len( and_str), len( eqv_str), len( neqv_str)) ! ********************************************************************** ! eval_log_expr() local ! ---------------------------------------------------------------------- ! the current eqv operator character( len= eqv_op_len) :: eqv_op ! the next operator character( len= next_op_len) :: next_op ! ---------------------------------------------------------------------- ! point to characters not yet decoded integer :: next_char integer :: next_op_idx integer :: expr_len integer :: primary_len ! false if and but no eqv logical :: do_or ! expression values logical :: l_eqv, l_or, l_and logical :: r_eqv, r_or, r_and ! ********************************************************************** ! eval_log_expr() text continue ! ---------------------------------------------------------------------- ! limits of scan next_char = 1 expr_len = len_trim( log_expr) ! initialize equivalences eqv_op = eqv_str l_eqv = .true. ! ---------------------------------------------------------------------- ! scan thru log_expr eqv_ops: do if( next_char > expr_len) exit eqv_ops ! find a primary and return its length and value call eval_log_primary( log_expr( next_char: ), primary_len, r_eqv) next_op_idx = next_char + primary_len ! find next operator or end of expression eqv_or_end: if( next_op_idx <= expr_len )then ! decode which operator eqv_next_op: if( log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) == eqv_str )then next_op = log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) next_char = next_op_idx + len( eqv_str) else if( log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) == neqv_str )then eqv_next_op next_op = log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) next_char = next_op_idx + len( neqv_str) else if( log_expr( next_op_idx: next_op_idx + len( or_str) - 1) == or_str )then eqv_next_op next_op = log_expr( next_op_idx: next_op_idx + len( or_str) - 1) next_char = next_op_idx + len( or_str) else if( log_expr( next_op_idx: next_op_idx + len( and_str) - 1) == and_str )then eqv_next_op next_op = log_expr( next_op_idx: next_op_idx + len( and_str) - 1) next_char = next_op_idx + len( and_str) else eqv_next_op call msg_quit( "unknown logical operator: " // trim( log_expr( next_op_idx: ) )) end if eqv_next_op ! past end of expression else eqv_or_end next_op = blank next_char = next_op_idx end if eqv_or_end ! ---------------------------------------------------------------------- ! initialize for a set of or ops l_or = r_eqv ! ---------------------------------------------------------------------- ! process a set of and ops or_ops: do if( .not. ( next_op == or_str .or. next_op == and_str) ) exit or_ops do_or = next_op == or_str or_next: select case( do_or) case( .true.) or_next ! find a primary and return its length and value call eval_log_primary( log_expr( next_char: ), primary_len, r_or) next_op_idx = next_char + primary_len ! find next operator or end of expression or_end: if( next_op_idx <= expr_len )then ! decode which operator or_next_op: if( log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) == eqv_str )then next_op = log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) next_char = next_op_idx + len( eqv_str) else if( log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) == neqv_str )then or_next_op next_op = log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) next_char = next_op_idx + len( neqv_str) else if( log_expr( next_op_idx: next_op_idx + len( or_str) - 1) == or_str )then or_next_op next_op = log_expr( next_op_idx: next_op_idx + len( or_str) - 1) next_char = next_op_idx + len( or_str) else if( log_expr( next_op_idx: next_op_idx + len( and_str) - 1) == and_str )then or_next_op next_op = log_expr( next_op_idx: next_op_idx + len( and_str) - 1) next_char = next_op_idx + len( and_str) else or_next_op call msg_quit( "unknown logical operator: " // trim( log_expr( next_op_idx: ) ) ) end if or_next_op else or_end next_op = blank next_char = next_op_idx end if or_end case default or_next r_or = l_or end select or_next ! ---------------------------------------------------------------------- ! initialize for a set of and ops l_and = r_or ! ---------------------------------------------------------------------- ! process a set of and ops and_ops: do if( next_op /= and_str ) exit and_ops ! find a primary call eval_log_primary( log_expr( next_char: ), primary_len, r_and) next_op_idx = next_char + primary_len ! find next operator or end of expression and_end: if( next_op_idx <= expr_len )then ! decode which operator and_next_op: if( log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) == eqv_str )then next_op = log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) next_char = next_op_idx + len( eqv_str) else if( log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) == neqv_str )then and_next_op next_op = log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) next_char = next_op_idx + len( neqv_str) else if( log_expr( next_op_idx: next_op_idx + len( and_str) - 1) == and_str )then and_next_op next_op = log_expr( next_op_idx: next_op_idx + len( and_str) - 1) next_char = next_op_idx + len( and_str) else if( log_expr( next_op_idx: next_op_idx + len( or_str) - 1) == or_str )then and_next_op next_op = log_expr( next_op_idx: next_op_idx + len( or_str) - 1) next_char = next_op_idx + len( or_str) else and_next_op call msg_quit( "unknown logical operator: " // trim( log_expr( next_op_idx: ) ) ) end if and_next_op else and_end next_op = blank next_char = next_op_idx end if and_end ! do the pending and op l_and = l_and .and. r_and end do and_ops ! product is the right operand r_or = l_and ! ---------------------------------------------------------------------- ! do the pending or op this_or: select case( do_or) case( .true.) this_or l_or = l_or .or. r_or case default this_or l_or = r_or end select this_or end do or_ops ! product is the right operand r_eqv = l_or ! ---------------------------------------------------------------------- ! do the pending eqv op eqv_neqv: select case( eqv_op) case( blank, eqv_str) eqv_neqv l_eqv = l_eqv .eqv. r_eqv case( neqv_str) eqv_neqv l_eqv = l_eqv .neqv. r_eqv end select eqv_neqv eqv_op = next_op end do eqv_ops ! ---------------------------------------------------------------------- value = l_eqv ! ---------------------------------------------------------------------- ! eval_log_expr() exit return ! ********************************************************************** ! eval_log_expr() end subroutine eval_log_expr ! ********************************************************************** ! ********************************************************************** ! eval_rel_expr() a relational expression is evaluated as a logical subroutine eval_rel_expr( rel_expr, value) ! ********************************************************************** ! eval_rel_expr() interface ! ---------------------------------------------------------------------- ! the relational expression ot be evaluated character( len= *), intent( in) :: rel_expr ! the value of the relational expression logical, intent( out) :: value ! ********************************************************************** ! entry: expression is blank_compress_lower_case relational expression ! exit: value is expression value ! ********************************************************************** ! eval_rel_expr() local ! ---------------------------------------------------------------------- ! index of symbol entry integer :: dot_idx integer :: eq_idx, ne_idx, gt_idx, ge_idx, le_idx, lt_idx integer :: l_val, r_val character( len= buffer_len) :: expr_str ! ********************************************************************** ! eval_rel_expr() text continue ! ---------------------------------------------------------------------- dot_idx = index( rel_expr, dot) ! ---------------------------------------------------------------------- ! find a dot? got_dot: if( dot_idx > 0 )then ! seek all operators with dot eq_idx = index( rel_expr, dot_eq) ne_idx = index( rel_expr, dot_ne) gt_idx = index( rel_expr, dot_gt) ge_idx = index( rel_expr, dot_ge) le_idx = index( rel_expr, dot_le) lt_idx = index( rel_expr, dot_lt) ! ---------------------------------------------------------------------- ! find one dot_rel_op: if( eq_idx > 0 )then expr_str = rel_expr( 1: eq_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( eq_idx + len( dot_eq): ) call eval_int_expr( expr_str, r_val) value = l_val == r_val else if( ne_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: ne_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ne_idx + len( dot_ne): ) call eval_int_expr( expr_str, r_val) value = l_val /= r_val else if( ge_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: ge_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ge_idx + len( dot_ge): ) call eval_int_expr( expr_str, r_val) value = l_val >= r_val else if( le_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: le_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( le_idx + len( dot_le): ) call eval_int_expr( expr_str, r_val) value = l_val <= r_val else if( gt_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: gt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( gt_idx + len( dot_gt): ) call eval_int_expr( expr_str, r_val) value = l_val > r_val else if( lt_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: lt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( lt_idx + len( dot_lt): ) call eval_int_expr( expr_str, r_val) value = l_val < r_val ! ---------------------------------------------------------------------- ! unknown relational operator else dot_rel_op call msg_quit( "no relational operator (.eq., .ne., .gt., .ge., .le., .lt.): " // rel_expr) end if dot_rel_op ! ---------------------------------------------------------------------- ! operator without dot else got_dot ! seek all comparison ops eq_idx = index( rel_expr, ch_eq) ne_idx = index( rel_expr, ch_ne) gt_idx = index( rel_expr, ch_gt) ge_idx = index( rel_expr, ch_ge) le_idx = index( rel_expr, ch_le) lt_idx = index( rel_expr, ch_lt) ! ---------------------------------------------------------------------- ! find one ch_rel_op: if( eq_idx > 0 )then expr_str = rel_expr( 1: eq_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( eq_idx + len( ch_eq): ) call eval_int_expr( expr_str, r_val) value = l_val == r_val else if( ne_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: ne_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ne_idx + len( ch_ne): ) call eval_int_expr( expr_str, r_val) value = l_val /= r_val else if( ge_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: ge_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ge_idx + len( ch_ge): ) call eval_int_expr( expr_str, r_val) value = l_val >= r_val else if( le_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: le_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( le_idx + len( ch_le): ) call eval_int_expr( expr_str, r_val) value = l_val <= r_val else if( gt_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: gt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( gt_idx + len( ch_gt): ) call eval_int_expr( expr_str, r_val) value = l_val > r_val else if( lt_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: lt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( lt_idx + len( ch_lt): ) call eval_int_expr( expr_str, r_val) value = l_val < r_val ! ---------------------------------------------------------------------- ! unknown relational operator else ch_rel_op call msg_quit( "no relational operator (==, /=, >, >=, <=, <): " // rel_expr) end if ch_rel_op end if got_dot ! ---------------------------------------------------------------------- ! eval_rel_expr() exit return ! ********************************************************************** ! eval_rel_expr() end subroutine eval_rel_expr ! ********************************************************************** ! ********************************************************************** ! seek_log_primary() a relational expression is evaluated as a logical subroutine seek_log_primary( log_expr, op_idx, rel_op_idx) ! ********************************************************************** ! seek_log_primary() interface ! ---------------------------------------------------------------------- ! the logical primary to be evaluated character( len= *), intent( in) :: log_expr ! the index of the next operator or end of line after the primary integer, intent( out) :: op_idx ! the index of the next relational operator or zero integer, intent( out) :: rel_op_idx ! ********************************************************************** ! entry: find log op before first (if any) open paren or after matching ! exit: length to first log op ! ********************************************************************** ! seek_log_primary() local integer :: paren_level ! ********************************************************************** ! seek_log_primary() text continue ! initialize while loop parameters op_idx = 1 paren_level = 0 rel_op_idx = 0 ! ---------------------------------------------------------------------- ! scan through expression scan_stmt: do if( op_idx > len_trim( log_expr)) exit scan_stmt ! check each character which_char: select case( log_expr( op_idx: op_idx)) ! need to track parenthesis level case( open_paren) which_char paren_level = paren_level + 1 op_idx = op_idx + len( open_paren) cycle scan_stmt case( close_paren) which_char paren_level = paren_level - 1 op_idx = op_idx + len( close_paren) cycle scan_stmt case( dot) which_char log_op_at_level_zero: if( paren_level == 0 )then ! find logical operator find_log_op: if( log_expr( op_idx: op_idx + len( or_str) - 1) == or_str )then exit scan_stmt else if( log_expr( op_idx: op_idx + len( and_str) - 1) == and_str )then find_log_op exit scan_stmt else if( log_expr( op_idx: op_idx + len( eqv_str) - 1) == eqv_str )then find_log_op exit scan_stmt else if( log_expr( op_idx: op_idx + len( neqv_str) - 1) == neqv_str )then find_log_op exit scan_stmt end if find_log_op end if log_op_at_level_zero end select which_char ! check for relational operator (which diagnoses a relational expression) rel_op_at_level_zero: if( paren_level == 0 )then found_rel_op: if( log_expr( op_idx: op_idx + len( dot_eq) - 1) == dot_eq & .or. log_expr( op_idx: op_idx + len( dot_ne) - 1) == dot_ne & .or. log_expr( op_idx: op_idx + len( dot_lt) - 1) == dot_lt & .or. log_expr( op_idx: op_idx + len( dot_le) - 1) == dot_le & .or. log_expr( op_idx: op_idx + len( dot_ge) - 1) == dot_ge & .or. log_expr( op_idx: op_idx + len( dot_gt) - 1) == dot_gt & .or. log_expr( op_idx: op_idx + len( ch_eq) - 1) == ch_eq & .or. log_expr( op_idx: op_idx + len( ch_ne) - 1) == ch_ne & .or. log_expr( op_idx: op_idx + len( ch_lt) - 1) == ch_lt & .or. log_expr( op_idx: op_idx + len( ch_le) - 1) == ch_le & .or. log_expr( op_idx: op_idx + len( ch_ge) - 1) == ch_ge & .or. log_expr( op_idx: op_idx + len( ch_gt) - 1) == ch_gt )then rel_op_idx = op_idx end if found_rel_op end if rel_op_at_level_zero ! catch unbalanced parenthesis in logical expression unbalanced_parens: if( paren_level < 0 )then call msg_quit( "unbalanced parenthesis in expression: " // trim( log_expr) ) end if unbalanced_parens ! scan next character op_idx = op_idx + 1 end do scan_stmt ! point to last character in primary op_idx = op_idx - 1 ! ---------------------------------------------------------------------- ! seek_log_primary() exit return ! ********************************************************************** ! seek_log_primary() end subroutine seek_log_primary ! ********************************************************************** ! ********************************************************************** ! eval_int_primary() decode a string to get an integer value recursive subroutine eval_int_primary( primary_str, primary_len, value) ! ********************************************************************** ! eval_int_primary() interface ! ---------------------------------------------------------------------- ! the integer primary to be evaluated character( len= *), intent( in) :: primary_str ! the length of the inetger primary integer, intent( out) :: primary_len ! the value of the primary integer, intent( out) :: value ! ********************************************************************** ! entry: primary_str is a string containing a literal integer ! exit: primary_len is the length decoded, value is integer value ! ********************************************************************** ! eval_int_primary() local ! ---------------------------------------------------------------------- ! decode integer literal via internal read integer :: conversion_iostat ! process sign separately integer :: isign ! pointers to characters integer :: next_char integer :: char_idx integer :: match_paren ! decode digit strings character( len= conversion_len) :: conversion_str ! string containing expressions character( len= buffer_len) :: expr_str ! ********************************************************************** ! eval_int_primary() text continue ! ---------------------------------------------------------------------- ! decode unary operator next_char = 1 ! evaluate the primary using the expression string expr_str = primary_str ! ---------------------------------------------------------------------- ! test first character is minus process_sign: select case( expr_str( next_char: next_char) ) ! ---------------------------------------------------------------------- case( minus) process_sign next_char = next_char + len( minus) primary_len = len( minus) isign = -1 ! ---------------------------------------------------------------------- ! test first character is plus case( plus) process_sign next_char = next_char + len( plus) primary_len = len( plus) isign = 1 ! ---------------------------------------------------------------------- ! test first character is neither plus nor minus case default process_sign primary_len = 0 isign = 1 end select process_sign ! ---------------------------------------------------------------------- ! find the value of a variable, a literal, or a parenthesized primary_str get_value: select case( expr_str( next_char: next_char) ) ! ---------------------------------------------------------------------- ! get the value from the variable case( 'a': 'z') get_value ! seek the value of the symbol name char_idx = verify( expr_str( next_char: ) // blank, alphanum_chars) + next_char - 2 call get_integer_value( expr_str( next_char: char_idx), value) ! processed the alphanumeric characters primary_len = primary_len + char_idx ! ---------------------------------------------------------------------- ! get the value of a literal case( '0': '9') get_value ! find the first character which is not a digit char_idx = verify( expr_str( next_char: ) // blank, digit_chars) + next_char - 2 ! decode digits conversion_str = expr_str( next_char: char_idx) conversion_str = adjustr( conversion_str) read( unit= conversion_str, fmt= conversion_fmt, iostat= conversion_iostat, iomsg= processor_msg) value ! check read error decode: if( conversion_iostat > 0 )then call msg_quit( "can't decode: " // primary_str) end if decode ! processed the digit string primary_len = primary_len + char_idx ! ---------------------------------------------------------------------- ! get the value of an primary_str case( open_paren) get_value call seek_close_paren( expr_str, next_char, match_paren) found_match: if( match_paren <= len_trim( primary_str) )then ! go evaluate the nested expression expr_str = primary_str( next_char + 1: match_paren - 1) call eval_int_expr( expr_str, value) ! unmatched parenthesis so complain and quit else found_match call msg_quit( "unmatched parenthesis: " // trim( primary_str)) end if found_match ! processed up to the closing parenthesis primary_len = match_paren ! ---------------------------------------------------------------------- ! error: cannot get the value case default get_value call msg_quit( "bad integer expression: " // trim( primary_str) ) end select get_value ! ---------------------------------------------------------------------- ! apply sign value = value * isign ! ---------------------------------------------------------------------- ! eval_int_primary() exit return ! ********************************************************************** ! eval_int_primary() end subroutine eval_int_primary ! ********************************************************************** ! ********************************************************************** ! eval_log_primary() decode a string to get an logical value recursive subroutine eval_log_primary( primary_str, primary_len, value) ! ********************************************************************** ! eval_log_primary() interface ! ---------------------------------------------------------------------- ! the logical primary to be evaluated character( len= *), intent( in) :: primary_str ! the length of the logical primary integer, intent( out) :: primary_len ! the value of the logical primary logical, intent( out) :: value ! ********************************************************************** ! entry: primary_str is a string containing a literal logical ! exit: value is logical value ! ********************************************************************** ! eval_log_primary() local ! ---------------------------------------------------------------------- ! logical "sign" logical :: lsign integer :: rel_op_idx ! next character to be decoded integer :: next_char integer :: match_paren character( len= buffer_len) :: expr_str ! ********************************************************************** ! eval_log_primary() text continue ! ---------------------------------------------------------------------- ! find length of primary and whether it is a relational expression call seek_log_primary( primary_str, primary_len, rel_op_idx) ! decode unary operator next_char = 1 ! ---------------------------------------------------------------------- ! expression too short to contain a .not. process_sign: if( primary_len <= len( not_str) )then lsign = .true. ! expression has a .not. else if( primary_str( next_char: len( not_str)) == not_str )then process_sign next_char = next_char + len( not_str) lsign = .false. ! no .not. else process_sign lsign = .true. end if process_sign ! ---------------------------------------------------------------------- ! a logical primary is either a logical expression or a relational expression log_or_rel: if( rel_op_idx == 0 )then ! ---------------------------------------------------------------------- ! find the value of a variable, a literal, or a parenthesized expression get_value: select case( primary_str( next_char: next_char) ) ! ---------------------------------------------------------------------- ! get the value from the variable case( 'a': 'z') get_value ! check whether it's a logical name or error call get_logical_value( primary_str( next_char: primary_len), value) ! ---------------------------------------------------------------------- ! get the value of a literal case( dot) get_value ! decode literal value literal_value: if( primary_str( next_char: next_char + len( true_str) - 1) == true_str )then ! found a .true. string value = .true. else if( primary_str( next_char: next_char + len( false_str) - 1) == false_str )then literal_value ! found a .false. string value = .false. ! complain and quit else literal_value call msg_quit( "bad logical literal: " // trim( primary_str) ) end if literal_value ! ---------------------------------------------------------------------- ! get the value of an expression case( open_paren) get_value ! seek the closing parenthesis call seek_close_paren( primary_str, next_char, match_paren) ! if found, determine whether it is a logical or (part of a) relational expression found_match: if( match_paren <= len_trim( primary_str) )then ! evaluate the logical expression within parenthesis expr_str = primary_str( next_char + 1: match_paren - 1) call eval_log_expr( expr_str, value) ! unmatched parenthesis so complain and quit else found_match call msg_quit( "unmatched parenthesis: " // trim( primary_str)) end if found_match ! ---------------------------------------------------------------------- ! error: can't decode logical value case default call msg_quit( "bad logical primary: " // trim( primary_str)) end select get_value ! ---------------------------------------------------------------------- ! evaluate the relational expression else log_or_rel call eval_rel_expr( primary_str( next_char: primary_len), value) end if log_or_rel ! ---------------------------------------------------------------------- ! apply sign value = value .eqv. lsign ! ---------------------------------------------------------------------- ! eval_log_primary() exit return ! ********************************************************************** ! eval_log_primary() end subroutine eval_log_primary ! ********************************************************************** ! ********************************************************************** ! %%% string utilities- editing, parenthesis and quotes ! ********************************************************************** ! ********************************************************************** ! replace_substring() edit source lines subroutine replace_substring( mixed_case_str, lower_case_str, search_str, replace_str, first_idx) ! ********************************************************************** ! replace_substring() interface ! ---------------------------------------------------------------------- ! mixed case string to be printed character( len= *), intent( in out), optional :: mixed_case_str ! lower case string to be searched character( len= *), intent( in out) :: lower_case_str ! substring to be replaced character( len= *), intent( in) :: search_str ! string to replace target character( len= *), intent( in) :: replace_str ! location of first occurance integer, intent( in) :: first_idx ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?target? ! exit: line has any ?target? strings replaced ! ********************************************************************** ! replace_substring() local ! ---------------------------------------------------------------------- ! beginning and end of target within lines integer :: end_idx integer :: search_idx integer :: search_len ! ********************************************************************** ! replace_substring() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! initialize search_idx = first_idx search_len = len( search_str) ! ---------------------------------------------------------------------- ! if mixed case is present mixed_present: if( present( mixed_case_str) )then ! replace in both strings edit_mixed: do if( search_idx == 0 ) exit edit_mixed end_idx = search_idx + search_len end_mixed: if( search_idx == 1 )then mixed_case_str = replace_str // mixed_case_str( end_idx: ) lower_case_str = replace_str // lower_case_str( end_idx: ) else if( end_idx > len( lower_case_str) )then end_mixed mixed_case_str = mixed_case_str( 1: search_idx - 1) & // replace_str lower_case_str = lower_case_str( 1: search_idx - 1) & // replace_str else end_mixed mixed_case_str = mixed_case_str( 1: search_idx - 1) & // replace_str & // mixed_case_str( end_idx: ) lower_case_str = lower_case_str( 1: search_idx - 1) & // replace_str & // lower_case_str( end_idx: ) end if end_mixed search_idx = index( lower_case_str, search_str) end do edit_mixed ! ---------------------------------------------------------------------- ! mixed case is not present else mixed_present ! replace in lower case only edit_string: do if( search_idx == 0 ) exit edit_string end_idx = search_idx + search_len end_lower: if( search_idx == 1 )then lower_case_str = replace_str // lower_case_str( end_idx: ) else if( end_idx > len( lower_case_str) )then end_lower lower_case_str = lower_case_str( 1: search_idx - 1) // replace_str else end_lower lower_case_str = lower_case_str( 1: search_idx - 1) & // replace_str & // lower_case_str( end_idx: ) end if end_lower search_idx = index( lower_case_str, search_str) end do edit_string end if mixed_present ! ---------------------------------------------------------------------- ! replace_substring() exit return ! ********************************************************************** ! replace_substring() end subroutine replace_substring ! ********************************************************************** ! ********************************************************************** ! seek_close_paren() true if successfully found matching () subroutine seek_close_paren( string, start, match) ! ********************************************************************** ! seek_close_paren() interface ! ---------------------------------------------------------------------- ! the string starting with open parenthesis character( len= *), intent( in) :: string ! the index of the open parenthesis integer, intent( in) :: start ! the index of the matching close parenthesis integer, intent( out) :: match ! ********************************************************************** ! seek_close_paren() local ! ---------------------------------------------------------------------- ! counters and pointers integer :: level integer :: string_len ! ********************************************************************** ! seek_close_paren() text continue ! ---------------------------------------------------------------------- ! initialize string_len = len_trim( string) level = 0 ! ---------------------------------------------------------------------- search: do match = start + 1, string_len levels: select case( string( match: match) ) case( open_paren) levels level = level + 1 case( close_paren) levels eureka: if( level == 0 )then exit search end if eureka level = level - 1 end select levels end do search ! ---------------------------------------------------------------------- ! seek_close_paren() exit return ! ********************************************************************** ! seek_close_paren() end subroutine seek_close_paren ! ********************************************************************** ! ********************************************************************** ! unquote_string() true if extracts string from between quotes subroutine unquote_string( quoted_str, unquoted_str, in_len, out_len) ! ********************************************************************** ! unquote_string() interface ! ---------------------------------------------------------------------- ! the quoted string to be unquoted character( len= *), intent( in) :: quoted_str ! the unquoted string character( len= *), intent( out) :: unquoted_str ! the length of the quoted string integer, intent( out) :: in_len ! the length of the unquoted string integer, intent( out) :: out_len ! ********************************************************************** ! unquote_string() local ! ---------------------------------------------------------------------- ! which quote is to be used character( len= 1) :: quote ! ********************************************************************** ! unquote_string() text continue ! ---------------------------------------------------------------------- ! which quote is the first quote (if either) which_quote: select case( quoted_str( 1: 1) ) ! ---------------------------------------------------------------------- ! string delimited by single quote case( single_quote) which_quote quote = single_quote ! ---------------------------------------------------------------------- ! string delimited by double quote case( double_quote) which_quote quote = double_quote ! ---------------------------------------------------------------------- ! string delimited by neither quote- nothing to do case default which_quote in_len = 0 out_len = len_trim( quoted_str) unquoted_str = quoted_str return end select which_quote ! ---------------------------------------------------------------------- ! initialize scan loop in_len = 2 out_len = 1 unquoted_str = blank ! scan thru the quoted string scan_string: do if( in_len > len_trim( quoted_str) ) exit scan_string ! ---------------------------------------------------------------------- ! if find one matching quote next_char: if( quoted_str( in_len: in_len) == quote )then ! check for a pair of quotes next_quote: if( quoted_str( in_len + 1: in_len + 1) == quote )then unquoted_str( out_len: out_len) = quoted_str( in_len: in_len) in_len = in_len + 1 out_len = out_len + 1 else next_quote exit scan_string end if next_quote ! check next character in_len = in_len + 1 ! ---------------------------------------------------------------------- ! character is not a matching quote else next_char unquoted_str( out_len: out_len) = quoted_str( in_len: in_len) in_len = in_len + 1 out_len = out_len + 1 end if next_char end do scan_string ! ---------------------------------------------------------------------- ! unquote_string() exit return ! ********************************************************************** ! unquote_string() end subroutine unquote_string ! ********************************************************************** ! ********************************************************************** ! to_lower() string is returned all lower case pure function to_lower( string) result( lc_str) ! ********************************************************************** ! to_lower() interface ! ---------------------------------------------------------------------- ! the string to be lowercased character( len= *), intent( in) :: string ! the lower case string character( len= len( string)) :: lc_str ! ********************************************************************** ! to_lower() local ! ---------------------------------------------------------------------- ! ascii characters change case integer, parameter :: change_case = 32 ! ---------------------------------------------------------------------- ! index characters in string integer :: i ! ********************************************************************** ! to_lower() text continue ! ---------------------------------------------------------------------- ! check every character in string scan_string: do i = 1, len( string) check_char: select case( string( i: i)) case( 'A': 'Z') check_char lc_str( i: i) = char( ichar( string( i: i)) + change_case) case default check_char lc_str( i: i) = string( i: i) end select check_char end do scan_string ! ---------------------------------------------------------------------- ! to_lower() exit return ! ********************************************************************** ! to_lower() end function to_lower ! ********************************************************************** ! ********************************************************************** ! format_date() date string is with slashes pure function format_date( string) result( fmt_str) ! ********************************************************************** ! format_date() interface ! ---------------------------------------------------------------------- ! the date string to be formatted character( len= 8), intent( in) :: string ! the lower case string character( len= 10) :: fmt_str ! ********************************************************************** ! format_date() text continue ! ---------------------------------------------------------------------- ! build the new string fmt_str = string( 1: 4) // slash // string( 5: 6) // slash // string( 7: 8) ! ---------------------------------------------------------------------- ! format_date() exit return ! ********************************************************************** ! format_date() end function format_date ! ********************************************************************** ! ********************************************************************** ! format_time() time string is with colons pure function format_time( string) result( fmt_str) ! ********************************************************************** ! format_time() interface ! ---------------------------------------------------------------------- ! the time string to be formatted character( len= 10), intent( in) :: string ! the lower case string character( len= 12) :: fmt_str ! ********************************************************************** ! format_time() text continue ! ---------------------------------------------------------------------- ! build the new string fmt_str = string( 1: 2) // colon // string( 3: 4) // colon // string( 5: 10) ! ---------------------------------------------------------------------- ! format_time() exit return ! ********************************************************************** ! format_time() end function format_time ! ********************************************************************** ! ********************************************************************** ! valid_new_name() returns if string is a valid name subroutine valid_new_name( string) ! ********************************************************************** ! valid_new_name() interface ! ---------------------------------------------------------------------- ! the name to be checked character( len= *), intent( in) :: string ! ---------------------------------------------------------------------- ! predefined macro index integer :: i ! character index integer :: char_idx ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! valid_new_name() text continue ! ---------------------------------------------------------------------- ! check that initial character is alphabetic char_idx = verify( string( 1: 1), alpha_chars) initial_ok: if( char_idx > 0 )then call msg_quit( "illegal initial character in name: " // string ) end if initial_ok ! check that following characters are legal char_idx = verify( string( 2: ), alphanum_chars) name_ok: if( char_idx > 0 )then call msg_quit( "illegal character in name: " // string ) end if name_ok ! ---------------------------------------------------------------------- ! check that name isn't predefined not_predefined: do i = 1, size( predefined_macros) not_name: if( string == trim( predefined_macros( i)% name_str) )then call msg_quit( "attempt to redefine a predefined macro: " // string) end if not_name end do not_predefined ! ---------------------------------------------------------------------- ! check that name doesn't exist on list yet nullify( symbol_ptr) call seek_symbol_name( string, symbol_ptr) duplicate_name: if( associated( symbol_ptr) )then call msg_quit( "attempt to declare duplicate name: " // string ) end if duplicate_name ! ---------------------------------------------------------------------- ! valid_new_name() exit return ! ********************************************************************** ! valid_new_name() end subroutine valid_new_name ! ********************************************************************** ! ********************************************************************** ! valid_new_cl_name() returns if string is a valid name subroutine valid_new_cl_name( string) ! ********************************************************************** ! valid_new_cl_name() interface ! ---------------------------------------------------------------------- ! the name to be checked character( len= *), intent( in) :: string ! ---------------------------------------------------------------------- ! index predefined macros integer :: i ! character index integer :: char_idx ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! valid_new_cl_name() text continue ! ---------------------------------------------------------------------- ! check that initial character is alphabetic char_idx = verify( string( 1: 1), alpha_chars) initial_ok: if( char_idx > 0 )then call msg_quit( "illegal initial character in name: " // string ) end if initial_ok ! check that following characters are legal char_idx = verify( string( 2: ), alphanum_chars) name_ok: if( char_idx > 0 )then call msg_quit( "illegal character in name: " // string ) end if name_ok ! ---------------------------------------------------------------------- ! check that name isn't predefined not_predefined: do i = 1, size( predefined_macros) not_name: if( string == trim( predefined_macros( i)% name_str) )then call msg_quit( "command line attempt to redefine a predefined macro: " // string) end if not_name end do not_predefined ! ---------------------------------------------------------------------- ! check that name doesn't exist on list yet nullify( symbol_ptr) call seek_cl_symbol_name( string, symbol_ptr) duplicate_name: if( associated( symbol_ptr) )then call msg_quit( "attempt to declare duplicate command line name: " // string ) end if duplicate_name ! ---------------------------------------------------------------------- ! valid_new_cl_name() exit return ! ********************************************************************** ! valid_new_cl_name() end subroutine valid_new_cl_name ! ********************************************************************** ! ********************************************************************** ! valid_new_sf_name() returns if string is a valid name subroutine valid_new_sf_name( string) ! ********************************************************************** ! valid_new_sf_name() interface ! ---------------------------------------------------------------------- ! the name to be checked character( len= *), intent( in) :: string ! ---------------------------------------------------------------------- ! index predefined macros integer :: i ! character index integer :: char_idx ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! valid_new_sf_name() text continue ! ---------------------------------------------------------------------- ! check that initial character is alphabetic char_idx = verify( string( 1: 1), alpha_chars) initial_ok: if( char_idx > 0 )then call msg_quit( "illegal initial character in name: " // string ) end if initial_ok ! check that following characters are legal char_idx = verify( string( 2: ), alphanum_chars) name_ok: if( char_idx > 0 )then call msg_quit( "illegal character in name: " // string ) end if name_ok ! ---------------------------------------------------------------------- ! check that name isn't predefined not_predefined: do i = 1, size( predefined_macros) not_name: if( string == trim( predefined_macros( i)% name_str) )then call msg_quit( "set file attempt to redefine a predefined macro: " // string) end if not_name end do not_predefined ! ---------------------------------------------------------------------- ! check that name doesn't exist on list yet nullify( symbol_ptr) call seek_sf_symbol_name( string, symbol_ptr) duplicate_name: if( associated( symbol_ptr) )then call msg_quit( "attempt to declare duplicate set file name: " // string ) end if duplicate_name ! ---------------------------------------------------------------------- ! valid_new_sf_name() exit return ! ********************************************************************** ! valid_new_sf_name() end subroutine valid_new_sf_name ! ********************************************************************** ! ********************************************************************** ! get_int_value_from_setfile() overwrites the integer value with one from the set file subroutine get_int_value_from_setfile( integer_ptr) ! ********************************************************************** ! get_int_value_from_setfile() interface ! ---------------------------------------------------------------------- ! the name to be checked type( integer_t), pointer :: integer_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_int_value_from_setfile() text continue ! ---------------------------------------------------------------------- ! check each symbol on the set file symbol list symbol_ptr => first_sf_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == integer_ptr% name_str )then types_match: select type( symbol_ptr) type is( integer_t) types_match constant_eqv: if( symbol_ptr% constant .eqv. integer_ptr% constant )then integer_ptr% defined = .true. integer_ptr% defined_file = symbol_ptr% defined_file integer_ptr% defined_line = symbol_ptr% defined_line integer_ptr% sf_defined = .true. integer_ptr% integer_value = symbol_ptr% integer_value else constant_eqv call msg_quit( "parameter mismatch set file versus source file: " // trim( integer_ptr% name_str)) end if constant_eqv class default types_match call msg_quit( "type mismatch set file versus source: " // trim( integer_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_int_value_from_setfile() exit return ! ********************************************************************** ! get_int_value_from_setfile() end subroutine get_int_value_from_setfile ! ********************************************************************** ! ********************************************************************** ! get_log_value_from_setfile() overwrites the logical value with one from the set file subroutine get_log_value_from_setfile( logical_ptr) ! ********************************************************************** ! get_log_value_from_setfile() interface ! ---------------------------------------------------------------------- ! the name to be checked type( logical_t), pointer :: logical_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_log_value_from_setfile() text continue ! ---------------------------------------------------------------------- ! check each symbol on the set file symbol list symbol_ptr => first_sf_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == logical_ptr% name_str )then types_match: select type( symbol_ptr) type is( logical_t) types_match constant_eqv: if( symbol_ptr% constant .eqv. logical_ptr% constant )then logical_ptr% defined = .true. logical_ptr% defined_file = symbol_ptr% defined_file logical_ptr% defined_line = symbol_ptr% defined_line logical_ptr% sf_defined = .true. logical_ptr% logical_value = symbol_ptr% logical_value else constant_eqv call msg_quit( "parameter mismatch set file versus source file: " // trim( logical_ptr% name_str)) end if constant_eqv class default types_match call msg_quit( "type mismatch set file versus source: " // trim( logical_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_log_value_from_setfile() exit return ! ********************************************************************** ! get_log_value_from_setfile() end subroutine get_log_value_from_setfile ! ********************************************************************** ! ********************************************************************** ! get_int_value_from_cmdline() overwrites the integer value with one from the command line subroutine get_int_value_from_cmdline( integer_ptr) ! ********************************************************************** ! get_int_value_from_cmdline() interface ! ---------------------------------------------------------------------- ! the name to be checked type( integer_t), pointer :: integer_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_int_value_from_cmdline() text continue ! ---------------------------------------------------------------------- ! check each symbol on the command line symbol list symbol_ptr => first_cl_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == integer_ptr% name_str )then types_match: select type( symbol_ptr) type is( integer_t) types_match integer_ptr% defined = .true. integer_ptr% defined_file = '' integer_ptr% defined_line = 0 integer_ptr% cl_defined = .true. integer_ptr% integer_value = symbol_ptr% integer_value class default types_match call msg_quit( "type mismatch command line versus source: " // trim( integer_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_int_value_from_cmdline() exit return ! ********************************************************************** ! get_int_value_from_cmdline() end subroutine get_int_value_from_cmdline ! ********************************************************************** ! ********************************************************************** ! get_log_value_from_cmdline() overwrites the logical value with one from the command line subroutine get_log_value_from_cmdline( logical_ptr) ! ********************************************************************** ! get_log_value_from_cmdline() interface ! ---------------------------------------------------------------------- ! the name to be checked type( logical_t), pointer :: logical_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_log_value_from_cmdline() text continue ! ---------------------------------------------------------------------- ! check each symbol on the command line symbol list symbol_ptr => first_cl_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == logical_ptr% name_str )then types_match: select type( symbol_ptr) type is( logical_t) types_match logical_ptr% defined = .true. logical_ptr% defined_file = '' logical_ptr% defined_line = 0 logical_ptr% cl_defined = .true. logical_ptr% logical_value = symbol_ptr% logical_value class default types_match call msg_quit( "type mismatch command line versus source: " // trim( logical_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_log_value_from_cmdline() exit return ! ********************************************************************** ! get_log_value_from_cmdline() end subroutine get_log_value_from_cmdline ! ********************************************************************** ! ********************************************************************** ! get_cl_arg_check_len() overwrites the logical value with one from the command line subroutine get_cl_arg_check_len( iarg, buffer) ! ********************************************************************** ! get_cl_arg_check_len() interface ! ---------------------------------------------------------------------- ! which word integer, intent( in) :: iarg ! buffer to be filled character( len= *), intent( out) :: buffer ! ---------------------------------------------------------------------- ! communicate with get_command_argument integer :: cl_stat integer :: cl_arg_len ! ---------------------------------------------------------------------- ! get_cl_arg_check_len() text continue ! ---------------------------------------------------------------------- ! get the length then the value call get_command_argument( number= iarg, length= cl_arg_len, status= cl_stat) ! problem accessing the command line len_stat: if( cl_stat > 0 )then call msg_quit( "can't get command argument length") end if len_stat ! argument is too long for the buffer len_error: if( cl_arg_len > len( buffer) )then call msg_quit( "command line argument too long") end if len_error ! return it call get_command_argument( number= iarg, value= buffer) ! ---------------------------------------------------------------------- ! get_cl_arg_check_len() exit return ! ********************************************************************** ! get_cl_arg_check_len() end subroutine get_cl_arg_check_len ! ********************************************************************** ! ********************************************************************** ! check_key_chars_ok() overwrites the logical value with one from the command line pure function check_key_chars_ok( keys) result( ok) ! ********************************************************************** ! check_key_chars_ok() interface logical :: ok ! ---------------------------------------------------------------------- ! keys to check character( len= 2), intent( in) :: keys ! ---------------------------------------------------------------------- ! check_key_chars_ok() text continue ! ---------------------------------------------------------------------- ! check the list ok = verify( keys, ok_key_list) == 0 ! ---------------------------------------------------------------------- ! check_key_chars_ok() exit return ! ********************************************************************** ! check_key_chars_ok() end function check_key_chars_ok ! ********************************************************************** ! ********************************************************************** ! coco ! $Id: coco.f90,v 2.9 2012/04/07 13:16:36 dan Exp $ ! ********************************************************************** end program coco Day-III/06-coco/coco.f90,v100777 0 0 2160711 11740037320 10262 0head 2.9; access; symbols; locks; strict; comment @# @; 2.9 date 2012.04.07.13.16.36; author dan; state Exp; branches; next 2.8; 2.8 date 2011.12.23.20.39.40; author dan; state Exp; branches; next 2.7; 2.7 date 2011.12.23.14.58.32; author dan; state Exp; branches; next 2.6; 2.6 date 2011.12.23.02.15.15; author dan; state Exp; branches; next 2.5; 2.5 date 2011.12.22.20.24.02; author dan; state Exp; branches; next 2.4; 2.4 date 2011.12.22.20.06.53; author dan; state Exp; branches; next 2.3; 2.3 date 2011.12.22.16.23.57; author dan; state Exp; branches; next 2.2; 2.2 date 2011.12.21.14.41.15; author dan; state Exp; branches; next 2.1; 2.1 date 2011.12.19.23.17.09; author dan; state Exp; branches; next 2.0; 2.0 date 2011.12.17.00.48.06; author dan; state Exp; branches; next ; desc @Initial revision of the new coco. @ 2.9 log @simplify symbol list processing; add environment variable reading and USER, CWD, INCPATH predefined macros @ text @! bof ! ********************************************************************** ! Fortran 2008 program coco ! ********************************************************************** ! Source Control Strings ! $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ********************************************************************** ! Copyright 2003-2011 Dan Nagle ! All Rights Reserved ! This program is free software; you can redistribute it and/or ! modify it under the terms of the GNU General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public ! License along with this program; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, or make other technical comments, ! to the Authors, Contact: ! Dan Nagle ! send email to danlnagle@@me.com ! ********************************************************************** ! coco implements Part 3: Conditional Compilation ! ********************************************************************** ! coco compilation: ! $ fc -std coco.f90 -o coco ! where fc is your Fortran compiler ! and -std is your compiler's option to check for standards conformance ! coco has been compiled using ! nagfor -f2008 -w=all -C=all coco.f90 -o coco ! nagfor -V ! NAG Fortran Compiler Release 5.3(854) ! coco has been compiled using ! ifort -std -warn all -check all coco.f90 -o coco ! ifort --version ! ifort (IFORT) 12.1.0 20111011 ! ifort (IFORT) 12.1.2 20111207 ! ifort (IFORT) 12.1.3 20120130 ! coco has been compiled using ! gfortran -std=f2008 -Wall -fcheck=all coco.f90 -o coco ! gfortran --version ! GNU Fortran (GCC) 4.6.2 20111019 (prerelease) ! No reason is known why other standards-complaint compilers would not work. ! ********************************************************************** ! coco reads ! input source file(s)- named via command line, or stdin ! named set file- name taken from the output file name, or coco.set ! coco writes ! output source file- named via command line, or stdout ! log file- named via ??logfile directive, or stderr ! coco temp files ! scratch- hold the contents of text blocks while counting their size ! coco uses (if your compiler doesn't support the f03 command line intrinsics) ! f2kcli (http://www.winteracter.com/f2kcli) ! iso_fortran_env: input_unit, output_unit, error_unit ! or else define them (perhaps in the units section of the code) ! a popular choice is input_unit= 5, output_unit= 6, error_unit= 0 ! coco constants ! coco_rcs_id- this file's rcs id string ! *_unit- logical unit numbers ! *_fmt- formats ! *_len- lengths of character entities ! alter_*- the alter states ! if_*- the current state of if-directive processing ! coco types ! file_t- file name and unit ! path_t- include directory ! symbol_t- integer, logical, macro, text symbol ! if_t- if block and state ! state_t- set of options ! report_t- statistics ! coco data ! coco library ! ********************************************************************** ! coco ! ********************************************************************** program coco ! coco implements ISO/IEC 1539-3 Conditional Compilation standard with extensions ! coco steps ! 1. call process_command_line() to read command line, get file names & options ! 2. call process_setfile() to read the set file, if there is one ! 3. open the output file, if named, use stdout if not ! 4. open the input file(s), if named, use stdin if not ! 5. call process_input_file() to process the input file(s) & write the output file ! 6. copy the set file contents to the output file ! 7. close all files ! 8. call write_report() to print summary information ! ********************************************************************** ! coco uses modules ! ********************************************************************** ! get preconnected units from intrinsic environment module ! if your compiler doesn't support the intrinsic module, ! define these below before the other units use, intrinsic :: iso_fortran_env, only: input_unit, output_unit, error_unit ! if your compiler does not support f03 command line processing (most do) ! you might use f2kcli available from http://www.winteracter.com/f2kcli ! ********************************************************************** ! explicit declaration implicit none ! ********************************************************************** ! coco RCS strings ! ********************************************************************** ! program source file name supplied by RCS character( len= *), parameter :: coco_rcs_id = & '$Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $' ! ********************************************************************** ! coco constants ! ********************************************************************** ! coco logical unit numbers ! scheme for logical unit numbers: ! The set file is read first and processed. ! The set file is then closed. The output is opened ! (if need be), and then the input file is opened (again, if need be). ! If an include file is encountered, the logical unit numbers used are ! computed by adding to the current input unit number. If the current ! input file is stdin, read_unit is used first, then successive unit ! numbers are used for nested include files. When all input files have ! been read, the set scratch file is copied to the output file. All ! Fortran files are then closed. The summary is written to the output. ! A text block is copied to the text_unit to count the number of lines. ! Then it is copied back to a character array and the text_unit is closed. ! ********************************************************************** ! global constants ! ********************************************************************** ! input/output units ! ---------------------------------------------------------------------- ! log file unit else use error_unit, + 4 tries to avoid plot_unit, punch_unit, others integer, parameter :: log_unit = max( input_unit, output_unit, error_unit, 6) + 4 ! scratch unit for name scratch file, if any integer, parameter :: name_unit = log_unit + 1 ! scratch unit for text scratch files integer, parameter :: text_unit = name_unit + 1 ! set file unit integer, parameter :: set_unit = text_unit + 1 ! output unit if named output file (else use unit= *) integer, parameter :: write_unit = set_unit + 1 ! first input unit if named input file (else use unit= *) (includes increment this unit) integer, parameter :: read_unit = write_unit + 1 ! ---------------------------------------------------------------------- ! formats ! ---------------------------------------------------------------------- ! used to read/write lines character( len= *), parameter :: string_fmt = '( a)' ! used to write reports character( len= *), parameter :: integer_fmt = '( a: i10)' ! used to write reports character( len= *), parameter :: directory_fmt = '( a: i0: a)' ! length of format strings integer, parameter :: format_len = max( len( string_fmt), len( integer_fmt) ) ! length of input/output specifier strings integer, parameter :: io_specifier_len = 16 ! ---------------------------------------------------------------------- ! conversion of strings to integers- 10 digits supports 32 bit values ! ---------------------------------------------------------------------- ! length of strings used to convert between integers and characters integer, parameter :: conversion_len = 10 ! format used to convert between integers and characters character( len= *), parameter :: conversion_fmt = '( i10)' ! ********************************************************************** ! coco character lengths ! ********************************************************************** ! these are the lengths of strings used throughout coco ! ---------------------------------------------------------------------- ! blank character character( len= *), parameter :: blank = ' ' ! length of character storing a constant or variable name integer, parameter :: symbol_name_len = 31 ! length of a Fortran source line integer, parameter :: free_form_len = 132 integer, parameter :: card_image_len = 80 integer, parameter :: fixed_form_len = 72 ! length of character storing file names integer, parameter :: file_name_len = 256 ! length of character line buffers (allows for max_continuations number of continuations) integer, parameter :: max_continuations = 39 ! buffer a whole coco statement and always have a blank at the end integer, parameter :: buffer_len = ( max_continuations + 1) * free_form_len + 1 ! length to hold a processor error message integer, parameter :: processor_msg_len = 1024 ! no message yet from the processor character( len= *), parameter :: no_processor_msg = repeat( string= blank, ncopies= processor_msg_len) ! ********************************************************************** ! this string is used to initialize character variables ! ---------------------------------------------------------------------- ! null string character( len= *), parameter :: null_string = '' ! ---------------------------------------------------------------------- ! mark beginning of the set file in the output character( len= *), parameter :: mark_set_file = & '?? This was produced using the following SET file' ! mark beginning of the next input file in the output character( len= *), parameter :: mark_input_file = & '?? End of file - next file is ' ! ---------------------------------------------------------------------- ! names must be made of alphanumeric characters only character( len= *), parameter :: alpha_chars = 'abcdefghijklmnopqrstuvwxyz' character( len= *), parameter :: digit_chars = '0123456789' character( len= *), parameter :: underscore = '_' character( len= *), parameter :: alphanum_chars = alpha_chars // digit_chars // underscore ! ********************************************************************** ! coco directives constants ! ********************************************************************** ! many character string constants' lengths are used to count past ! the string as coco processes each statement ! coco line and statement syntax uses the next set of character constants ! ********************************************************************** ! . separates file names from extensions, delimits logical operators & literals character( len= *), parameter :: dot = '.' ! ---------------------------------------------------------------------- ! character is special to getopt() and used to separate hh and mm, and mm and ss character( len= *), parameter :: colon = ':' ! ---------------------------------------------------------------------- ! characters defining coco directives, comments, separators, and so on ! ---------------------------------------------------------------------- ! coco line key ??coco_directive character( len= *), parameter :: coco_key = '??' ! the default substitution key character( len= *), parameter :: arg_key = '?' ! acceptable key characters character( len= *), parameter :: ok_key_list = '?~`@@#$^{}|\:' ! length of ?name? integer, parameter :: target_len = len( arg_key) + symbol_name_len + len( arg_key) ! continuation character character( len= *), parameter :: continuation = '&' ! ascii tab character character( len= *), parameter :: tab = achar( 9) ! whitespace is blank or tab character( len= *), parameter :: white_space = blank // tab ! coco comment initializer character( len= *), parameter :: comment = '!' ! separates items within a list character( len= *), parameter :: comma = ',' ! quotes character( len= *), parameter :: single_quote = "'" character( len= *), parameter :: double_quote = '"' ! ********************************************************************** ! process_logical_declaration() constants ! ---------------------------------------------------------------------- ! process name[=value][,name[=value]]... character( len= *), parameter :: end_of_decl = comma // blank ! ---------------------------------------------------------------------- ! constants defining coco (integer or logical) operators, constants, and similar ! ---------------------------------------------------------------------- ! minus sign character( len= *), parameter :: minus = '-' ! plus sign character( len= *), parameter :: plus = '+' ! times sign character( len= *), parameter :: times = '*' ! slash and division sign character( len= *), parameter :: slash = '/' ! backslash and modulus sign character( len= *), parameter :: backslash = '\' ! ---------------------------------------------------------------------- ! logical binary operators character( len= *), parameter :: or_str = '.or.' character( len= *), parameter :: and_str = '.and.' character( len= *), parameter :: eqv_str = '.eqv.' character( len= *), parameter :: neqv_str = '.neqv.' ! ---------------------------------------------------------------------- ! logical uniary operator character( len= *), parameter :: not_str = '.not.' ! ---------------------------------------------------------------------- ! logical literals character( len= *), parameter :: true_str = '.true.' character( len= *), parameter :: false_str = '.false.' ! ---------------------------------------------------------------------- ! the archaic versions of the relational operators character( len= *), parameter :: dot_eq = '.eq.' character( len= *), parameter :: dot_ne = '.ne.' character( len= *), parameter :: dot_gt = '.gt.' character( len= *), parameter :: dot_ge = '.ge.' character( len= *), parameter :: dot_le = '.le.' character( len= *), parameter :: dot_lt = '.lt.' ! the modern versions of the relational operators character( len= *), parameter :: ch_eq = '==' character( len= *), parameter :: ch_ne = '/=' character( len= *), parameter :: ch_gt = '>' character( len= *), parameter :: ch_ge = '>=' character( len= *), parameter :: ch_le = '<=' character( len= *), parameter :: ch_lt = '<' ! ---------------------------------------------------------------------- ! strings used to declare symbol names and values ! ---------------------------------------------------------------------- ! equal sign character( len= *), parameter :: equals = '=' ! open parenthesis character( len= *), parameter :: open_paren = '(' ! close parenthesis character( len= *), parameter :: close_paren = ')' ! ---------------------------------------------------------------------- ! directives which must appear in the set file ! ---------------------------------------------------------------------- ! alter directive character( len= *), parameter :: alter_str = 'alter:' ! directory declaration character( len= *), parameter :: directory_str = 'directory' ! form directive allows setting free form or fixed form from the set file character( len= *), parameter :: form_str = 'form:' ! set the key characters character( len= *), parameter :: keys_str = 'keys:' ! log file declaration character( len= *), parameter :: logfile_str = 'logfile' ! mark directive controls placing message in output for each new input read after the first character( len= *), parameter :: mark_str = 'mark:' ! number directive controls placing "! file: line" strings on source lines character( len= *), parameter :: number_str = 'number:' ! post directive controls postpending the setfile at the end of the output character( len= *), parameter :: post_str = 'post:' ! report directive causes writing a report report after processing character( len= *), parameter :: summary_str = 'report:' ! verbose directive causes operation with more messages issued character( len= *), parameter :: verbose_str = 'verbose:' ! wrap directive controls line wrapping character( len= *), parameter :: wrap_str = 'wrap:' ! ---------------------------------------------------------------------- ! name input files in set file directive character( len= *), parameter :: input_str = 'input' ! name the output file in set file directive character( len= *), parameter :: output_str = 'output' ! ---------------------------------------------------------------------- ! directives which may appear in the set file or source file ! ---------------------------------------------------------------------- ! integer declaration character( len= *), parameter :: integer_str = 'integer::' ! integer constant declaration character( len= *), parameter :: integer_constant_str = 'integer,parameter::' ! logical declaration character( len= *), parameter :: logical_str = 'logical::' ! logical constant declaration character( len= *), parameter :: logical_constant_str = 'logical,parameter::' ! ---------------------------------------------------------------------- ! directives which must appear in the source file ! ---------------------------------------------------------------------- ! include directive character( len= *), parameter :: include_str = 'include' ! ---------------------------------------------------------------------- ! stop directive character( len= *), parameter :: stop_str = 'stop' ! ---------------------------------------------------------------------- ! message directive character( len= *), parameter :: message_str = 'message' ! ---------------------------------------------------------------------- ! if directive character( len= *), parameter :: if_str = 'if(' ! ---------------------------------------------------------------------- ! else if directive character( len= *), parameter :: elseif_str = 'elseif(' ! ---------------------------------------------------------------------- ! )then must close an if( or elseif( character( len= *), parameter :: then_str = ')then' ! ---------------------------------------------------------------------- ! else directive character( len= *), parameter :: else_str = 'else' ! ---------------------------------------------------------------------- ! endif directive character( len= *), parameter :: endif_str = 'endif' ! ---------------------------------------------------------------------- ! directives which are extensions ! ---------------------------------------------------------------------- ! macro declaration character( len= *), parameter :: macro_str = 'macro::' ! macro declaration character( len= *), parameter :: macro_parens_str = 'macro,parens::' ! ---------------------------------------------------------------------- ! assert directive (the open paren is treated as part of the assert expression) character( len= *), parameter :: assert_str = 'assert' ! ---------------------------------------------------------------------- ! cmdline directive character( len= *), parameter :: cmdline_str = 'cmdline' ! document directive character( len= *), parameter :: document_str = 'document' ! options directive character( len= *), parameter :: options_str = 'options' ! repport directive character( len= *), parameter :: report_str = 'report' ! symbols directive character( len= *), parameter :: symbols_str = 'symbols' ! ---------------------------------------------------------------------- ! text directive (the end text string is in process_text_directive() ) character( len= *), parameter :: text_str = 'text::' ! text directive character( len= *), parameter :: text_parens_str = 'text,parens::' ! copy directive character( len= *), parameter :: copy_str = 'copy::' ! ---------------------------------------------------------------------- ! endfile directive character( len= *), parameter :: endfile_str = 'endfile' ! ---------------------------------------------------------------------- ! these strings are parts of directives ! ---------------------------------------------------------------------- ! on directive character( len= *), parameter :: on_str = 'on' ! off directive character( len= *), parameter :: off_str = 'off' ! form free directive character( len= *), parameter :: free_str = 'free' ! form fixed directive character( len= *), parameter :: fixed_str = 'fixed' ! ********************************************************************** ! possible states encountered during execution ! ---------------------------------------------------------------------- ! codes for possible alter states integer, parameter :: alter_none = 0 integer, parameter :: alter_delete = 1 integer, parameter :: alter_blank = 2 integer, parameter :: alter_shift_0 = 3 integer, parameter :: alter_shift_1 = 4 integer, parameter :: alter_shift_3 = 5 ! ---------------------------------------------------------------------- ! codes for possible if construct phases integer, parameter :: outside_block = 0 integer, parameter :: if_block = 1 integer, parameter :: elseif_block = 2 integer, parameter :: else_block = 3 integer, parameter :: text_block = 4 integer, parameter :: include_block = 5 ! ---------------------------------------------------------------------- ! indexes of predefined macros integer, parameter :: file_idx = 1 integer, parameter :: line_idx = 2 integer, parameter :: date_idx = 3 integer, parameter :: time_idx = 4 integer, parameter :: coco_idx = 5 integer, parameter :: setfile_idx = 6 integer, parameter :: logfile_idx = 7 integer, parameter :: output_idx = 8 integer, parameter :: cmdline_idx = 9 integer, parameter :: user_idx = 10 integer, parameter :: cwd_idx = 11 integer, parameter :: incpath_idx = 12 integer, parameter :: predefined_size = incpath_idx - file_idx + 1 ! ********************************************************************** ! communication with getopt() ! ---------------------------------------------------------------------- ! getopt() 'no more arguments' integer, parameter :: end_of_args = -1 ! getopt() 'not in optltrs' character( len= *), parameter :: unknown_option = '?' ! coco usage (error message) character( len= *), parameter :: usage_msg = & 'usage: coco [ -V | -h | [[ opts ] [--] [ basename | output input [...]]]' ! ********************************************************************** ! null string constants ! ---------------------------------------------------------------------- ! file name when there is no file name character( len= file_name_len), parameter :: null_file_name = repeat( string= blank, ncopies= file_name_len) ! symbol name when there is no symbol name character( len= symbol_name_len), parameter :: null_symbol_name = repeat( string= blank, ncopies= symbol_name_len) ! macro value when there is no macro value character( len= buffer_len), parameter :: null_macro_value = repeat( string= blank, ncopies= buffer_len) ! default file name constants character( len= *), parameter :: input_file_name = '' character( len= *), parameter :: output_file_name = '' character( len= *), parameter :: log_file_name = '' ! ---------------------------------------------------------------------- ! suffix used to construct output file name if one name is on the command line character( len= *), parameter :: output_suffix = '.f90' ! suffix when fixed form processing is requested character( len= *), parameter :: fixed_suffix = '.f' ! ********************************************************************** ! ********************************************************************** ! coco types ! ********************************************************************** ! coco files and search paths ! ---------------------------------------------------------------------- ! file type type :: file_t integer :: io_unit character( len= file_name_len) :: name_str character( len= format_len) :: format_str character( len= buffer_len), pointer :: line integer :: io_status integer :: lines_transfered logical :: named_file logical :: create end type file_t ! ---------------------------------------------------------------------- ! search location type type :: path_t character( len= file_name_len) :: name_str integer :: times_accessed type( path_t), pointer :: next end type path_t ! ********************************************************************** ! this derived type is used to store coco predefined macros ! ---------------------------------------------------------------------- ! type stores a predefined macro type :: predefined_t character( len= symbol_name_len) :: name_str logical :: referenced character( len= file_name_len) :: referenced_file integer :: referenced_line character( len= buffer_len) :: macro_value end type predefined_t ! ********************************************************************** ! these derived types are used to store coco constants or variables ! ---------------------------------------------------------------------- ! type stores a generic coco symbol type, abstract :: symbol_t character( len= symbol_name_len) :: name_str character( len= file_name_len) :: declared_file integer :: declared_line logical :: referenced character( len= file_name_len) :: referenced_file integer :: referenced_line class( symbol_t), pointer :: next end type symbol_t ! type stores a logical coco symbol type, extends( symbol_t) :: logical_t logical :: defined character( len= file_name_len) :: defined_file integer :: defined_line logical :: constant logical :: sf_defined logical :: cl_defined logical :: logical_value end type logical_t ! type stores an integer coco symbol type, extends( symbol_t) :: integer_t logical :: defined character( len= file_name_len) :: defined_file integer :: defined_line logical :: constant logical :: sf_defined logical :: cl_defined integer :: integer_value end type integer_t ! type stores a macro coco symbol type, extends( symbol_t) :: macro_t logical :: args_in_parens character( len= symbol_name_len), dimension( :), allocatable :: dummy_args character( len= buffer_len), dimension( :), allocatable :: actual_args character( len= buffer_len) :: macro_value end type macro_t ! type stores a text coco symbol type, extends( symbol_t) :: text_t logical :: args_in_parens character( len= symbol_name_len), dimension( :), allocatable :: dummy_args character( len= buffer_len), dimension( :), allocatable :: actual_args character( len= buffer_len), dimension( :), allocatable :: text_lines end type text_t ! ********************************************************************** ! if_t stores the state of an if block ! ---------------------------------------------------------------------- ! if_t type :: if_t logical :: now_selected logical :: ever_selected integer :: phase type( if_t), pointer :: nested type( if_t), pointer :: enclosing end type if_t ! ********************************************************************** ! state_t stores a set of coco options ! ---------------------------------------------------------------------- ! state_t type :: state_t integer :: alter_state logical :: free_form logical :: mark_input logical :: number_source logical :: print_report logical :: postpend_setfile logical :: verbose_mode logical :: wrapping_lines character( len= 2) :: keychars logical :: got_sep_char character( len= 1) :: sep_char end type state_t ! ********************************************************************** ! report_t stores coco statistics ! ---------------------------------------------------------------------- ! report_t records the source and sink of lines type :: report_t integer :: input_lines integer :: input_files integer :: include_files integer :: coco_lines integer :: selected_lines integer :: elided_lines integer :: text_blocks integer :: text_lines integer :: copied_lines end type report_t ! ********************************************************************** ! coco variables ! ********************************************************************** ! option swtiches ! ---------------------------------------------------------------------- ! options actually used and those set from set file type( state_t) :: options ! options from the command line override the set file options type( state_t) :: cl_options ! ---------------------------------------------------------------------- ! the left and right key characters character( len= 1) :: l_key = arg_key character( len= 1) :: r_key = arg_key ! ---------------------------------------------------------------------- ! report totals of event counts type( report_t) :: total ! ---------------------------------------------------------------------- ! if construct outside any if construct type( if_t), target :: outside_any_if_construct ! if construct status type( if_t), pointer :: if_construct ! ---------------------------------------------------------------------- ! coco symbols are stored in a singly linked list class( symbol_t), pointer :: first_symbol class( symbol_t), pointer :: last_symbol ! ---------------------------------------------------------------------- ! coco symbols from the set file class( symbol_t), pointer :: first_sf_symbol class( symbol_t), pointer :: last_sf_symbol ! ---------------------------------------------------------------------- ! coco symbols from the command line class( symbol_t), pointer :: first_cl_symbol class( symbol_t), pointer :: last_cl_symbol ! ---------------------------------------------------------------------- ! predefined macros: file, line, date, time, coco, setfile, logfile, output, cmdline type( predefined_t), dimension( 1: predefined_size) :: predefined_macros ! ---------------------------------------------------------------------- ! mark when non constants are used to provide a value for a constant logical :: all_constants ! ---------------------------------------------------------------------- ! options set the wrapping length to either 72 (fixed) or 131 (free) integer :: wrap_len ! ********************************************************************** ! coco file name variables ! ---------------------------------------------------------------------- ! input file, output file, or set file ! ---------------------------------------------------------------------- ! the (first) input file type( file_t), target :: input_file ! ---------------------------------------------------------------------- ! the output file type( file_t), target :: output_file ! ---------------------------------------------------------------------- ! the set file type( file_t), target :: set_file ! the set file named on the command line type( file_t) :: cl_set_file ! ---------------------------------------------------------------------- ! the log file is never the current file type( file_t) :: log_file ! ---------------------------------------------------------------------- ! point to current input file for error messages type( file_t), pointer :: current_file ! hold an error message from the processor character( len= processor_msg_len) :: processor_msg = no_processor_msg ! ---------------------------------------------------------------------- ! a list of source files for reports type( file_t), allocatable, dimension(:) :: source_file_list ! number of file names integer :: number_of_names = 0 ! scratch file to count input names found in the scratch file type( file_t) :: name_file ! ---------------------------------------------------------------------- ! the input/output line buffer character( len= buffer_len), target :: line !integer :: line_len ! the log file line buffer character( len= buffer_len), target :: log_line ! some directive processing peeks at the as-is statement being decoded character( len= buffer_len) :: asis_stmt ! length of the as is statement integer :: asis_len ! ---------------------------------------------------------------------- ! list of include directories is initially . only type( path_t), pointer :: first_directory integer :: count_include_in_dot ! ---------------------------------------------------------------------- ! communicate with getopt() ! ---------------------------------------------------------------------- ! getopt() string returning non-option letter words character( len= file_name_len) :: optarg = null_string ! ---------------------------------------------------------------------- ! number of command line args integer :: nargs ! count command line words integer :: optind = 0 ! ********************************************************************** ! coco local ! ---------------------------------------------------------------------- ! loop index of file name args integer :: i ! ********************************************************************** ! coco text ! ********************************************************************** continue ! ---------------------------------------------------------------------- ! initialize coco program variables call initialize_coco() ! ---------------------------------------------------------------------- ! process command line to get options and file names call process_command_line() ! ---------------------------------------------------------------------- ! see if set file exists and process it if it does call seek_set_file() ! ---------------------------------------------------------------------- ! set option to default values if the command line or the set file hasn't set them call set_option_defaults() ! ---------------------------------------------------------------------- ! open the output file but link not current_file call open_file( output_file) ! ********************************************************************** ! read all input file(s) number_of_input_files: select case( number_of_names) case( 0, 1) number_of_input_files ! process the input file call process_input_file( input_file) ! end of input case default number_of_input_files ! process several input files (1 is the output file) read_all_files: do i = 2, number_of_names ! if marking subsequent input files marking_input: if( options% mark_input .and. i > 2 )then line = mark_input_file // trim( source_file_list( i)% name_str) call write_coco_line( output_file) end if marking_input ! process the input using coco default units call process_input_file( source_file_list( i) ) ! repeat for each input file end do read_all_files ! end of input end select number_of_input_files ! ********************************************************************** ! if the output file has content and the copy is wanted, copy the set file to it made_output: if( output_file% lines_transfered > 0 .and. options% postpend_setfile )then ! mark the set file in the output (whether it is present or not) line = mark_set_file call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! if processed a set file append_set_file: if( set_file% named_file )then ! copy set file file to output call copy_set_file() ! if processed set file end if append_set_file end if made_output ! ---------------------------------------------------------------------- ! close the output file call close_file( output_file) ! ---------------------------------------------------------------------- ! report to log file log_report: if( options% print_report )then call write_report() end if log_report ! ---------------------------------------------------------------------- ! close the log file call close_file( log_file) ! ---------------------------------------------------------------------- ! coco exit stop 'coco normal exit' ! ********************************************************************** ! coco library ! ********************************************************************** contains ! ********************************************************************** ! ********************************************************************** ! initialize_coco() prepares coco for execution subroutine initialize_coco() ! ********************************************************************** ! initialize_coco() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! set default options options = state_t( alter_state= alter_none, free_form= .true., mark_input= .false., number_source= .false., & print_report= .false., verbose_mode= .false., postpend_setfile= .true., wrapping_lines= .true., & keychars= blank, got_sep_char= .false., sep_char= blank) cl_options = options ! initialize report totals total = report_t( input_lines= 0, input_files= 0, include_files= 0, coco_lines= 0, & selected_lines= 0, elided_lines= 0, text_blocks= 0, text_lines= 0, copied_lines= 0) ! files input_file = file_t( io_unit= input_unit, name_str= null_file_name, format_str= string_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .false.) input_file% name_str = input_file_name output_file = file_t( io_unit= output_unit, name_str= null_file_name, format_str= string_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .true.) output_file% name_str = output_file_name set_file = file_t( io_unit= set_unit, name_str= null_file_name, format_str= string_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .false.) cl_set_file = set_file log_file = file_t( io_unit= error_unit, name_str= null_file_name, format_str= integer_fmt, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .true.) log_file% name_str = log_file_name name_file = file_t( io_unit= name_unit, name_str= null_file_name, format_str= null_string, & line= null(), io_status= 0, lines_transfered= 0, named_file= .false., create= .true.) ! ---------------------------------------------------------------------- ! initialize pointers ! ---------------------------------------------------------------------- ! magic if-block outside any if block outside_any_if_construct = if_t( now_selected= .true., ever_selected= .true., phase= outside_block, & nested= null(), enclosing= null() ) ! initialize if-block structures nullify( if_construct) if_construct => outside_any_if_construct ! ---------------------------------------------------------------------- ! initialize symbols lists nullify( first_symbol) nullify( last_symbol) ! initialize set file symbols lists nullify( first_sf_symbol) nullify( last_sf_symbol) ! initialize command line symbols lists nullify( first_cl_symbol) nullify( last_cl_symbol) ! ---------------------------------------------------------------------- ! set files and lines nullify( current_file) ! initialize include file search path nullify( first_directory) count_include_in_dot = 0 ! ---------------------------------------------------------------------- ! initialize predefined macro names predefined_macros = predefined_t( name_str= null_symbol_name, referenced= .false., & referenced_file= null_file_name, referenced_line= 0, & macro_value= null_macro_value) predefined_macros( file_idx)% name_str = 'file' predefined_macros( line_idx)% name_str = 'line' predefined_macros( date_idx)% name_str = 'date' predefined_macros( time_idx)% name_str = 'time' predefined_macros( coco_idx)% name_str = 'coco' predefined_macros( setfile_idx)% name_str = 'setfile' predefined_macros( logfile_idx)% name_str = 'logfile' predefined_macros( output_idx)% name_str = 'output' predefined_macros( cmdline_idx)% name_str = 'cmdline' predefined_macros( user_idx)% name_str = 'user' predefined_macros( cwd_idx)% name_str = 'cwd' predefined_macros( incpath_idx)% name_str = 'incpath' ! ---------------------------------------------------------------------- ! initialize_coco() exit return ! ********************************************************************** ! initialize_coco() end subroutine initialize_coco ! ********************************************************************** ! ********************************************************************** ! %%% open and close files, write log file messages, parse command line ! ********************************************************************** ! ********************************************************************** ! open_file() open a file and remark subroutine open_file( this_file) ! ********************************************************************** ! open_file() interface ! ---------------------------------------------------------------------- ! the file to be opened type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! open_file() constants ! ---------------------------------------------------------------------- ! open for reading or writing character( len= *), parameter :: read_action = 'read' character( len= *), parameter :: write_action = 'write' ! open existing file or create a new one character( len= *), parameter :: read_status = 'old' character( len= *), parameter :: write_status = 'replace' ! ********************************************************************** ! open_file() local ! ---------------------------------------------------------------------- ! open for reading or writing character( len= io_specifier_len) :: open_status character( len= io_specifier_len) :: open_action ! ********************************************************************** ! open_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! open the file if file is named file_has_name: if( this_file% named_file )then ! establish open parameters for reading or writing direction: if( this_file% create )then open_status = write_status open_action = write_action else direction open_status = read_status open_action = read_action end if direction ! open this file open( unit= this_file% io_unit, & file= this_file% name_str, & status= open_status, & action= open_action, & iostat= this_file% io_status, & iomsg= processor_msg) named_status: if( this_file% io_status > 0 )then call msg_quit( "can't open file: " // trim( this_file% name_str) ) else if( options% verbose_mode )then named_status call msg_continue( "opened file: " // trim( this_file% name_str) ) end if named_status end if file_has_name ! the log file is never the current input file, since it receives error messages current_input_only: select case( this_file% io_unit) case( set_unit, input_unit, read_unit: ) current_file => this_file this_file% line => line case( output_unit, write_unit) this_file% line => line case( log_unit, error_unit) this_file% line => log_line end select current_input_only ! ---------------------------------------------------------------------- ! open_file() exit return ! ********************************************************************** ! open_file() end subroutine open_file ! ********************************************************************** ! ********************************************************************** ! open_scratch() open an unformatted scratch file subroutine open_scratch( this_file) ! ********************************************************************** ! open_scratch() interface ! ---------------------------------------------------------------------- ! the scratch file to be opened type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! open_scratch() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! open the file open( unit= this_file% io_unit, & status= 'scratch', & action= 'readwrite', & form= 'unformatted', & iostat= this_file% io_status, & iomsg= processor_msg) scratch_status: if( this_file% io_status > 0 )then current_file => this_file call msg_quit( "can't open scratch file: ") end if scratch_status ! link to line buffer this_file% line => line ! ---------------------------------------------------------------------- ! open_scratch() exit return ! ********************************************************************** ! open_scratch() end subroutine open_scratch ! ********************************************************************** ! ********************************************************************** ! close_file() close a file and remark subroutine close_file( this_file) ! ********************************************************************** ! close_file() interface ! ---------------------------------------------------------------------- ! the file to be closed type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! close_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! close the named file close_named: if( this_file% named_file )then close( unit= this_file% io_unit, & status= 'keep', & iostat= this_file% io_status, & iomsg= processor_msg) logfile_close: if( this_file% io_unit == log_unit )then this_file% io_unit = error_unit end if logfile_close close_status: if( this_file% io_status > 0 )then call msg_quit( "can't close file: " // trim( this_file% name_str) ) else if( options% verbose_mode )then close_status call msg_continue( "closed file: " // trim( this_file% name_str) ) end if close_status end if close_named ! input file is not connected input_only: select case( this_file% io_unit) case( set_unit, input_unit, read_unit: ) input_only nullify( current_file) end select input_only ! ---------------------------------------------------------------------- ! close_file() exit return ! ********************************************************************** ! close_file() end subroutine close_file ! ********************************************************************** ! ********************************************************************** ! close_scratch() close a file and remark subroutine close_scratch( this_file) ! ********************************************************************** ! close_scratch() interface ! ---------------------------------------------------------------------- ! the scratch file to be closed type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! close_scratch() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! close the scratch file close( unit= this_file% io_unit, & status= 'delete', & iostat= this_file% io_status, & iomsg= processor_msg) close_status: if( this_file% io_status > 0 )then call msg_quit( "can't close scratch file: ") end if close_status ! ---------------------------------------------------------------------- ! close_scratch() exit return ! ********************************************************************** ! close_scratch() end subroutine close_scratch ! ********************************************************************** ! ********************************************************************** ! set_option_defaults() set options to their default values subroutine set_option_defaults() ! ********************************************************************** ! Some options are initially set to absurd values in order to allow ! the command line option to override the corresponding set file directive. ! These options need to be set to useful values after the set file ! has been initially read but before coco further executes. ! These options are: the alter mode and the wrap length. ! The options selected are also made mutually consistent. ! ********************************************************************** ! set_option_defaults() local ! ---------------------------------------------------------------------- ! index of output file name suffix integer :: suffix_idx ! strings to be edited into the line- they are the exact length needed character( len= 8) :: today_str character( len= 10) :: now_str ! check allocate integer :: astat ! if name tmp file was opened logical :: name_open ! ********************************************************************** ! set_option_defaults() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! if input file names didn't come from the command line, get them from the set file inquire( unit= name_file% io_unit, opened= name_open) input_directives: if( name_open )then rewind( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) rewind_error: if( name_file% io_status > 0 )then call msg_quit( "can't rewind input list scratch file") end if rewind_error count_names: select case( number_of_names) case( 1) count_names input_or_output: if( .not. output_file% named_file )then read( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) input_file% name_str read_1_error: if( name_file% io_status > 0 )then call msg_quit( "can't read input name scratch file") end if read_1_error input_file% named_file = .true. input_file% io_unit = read_unit end if input_or_output case( 2: ) count_names last_input: if( .not. output_file% named_file )then number_of_names = number_of_names + 1 end if last_input allocate( source_file_list( 2: number_of_names), stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate input file list") end if alloc_error input_file% io_unit = read_unit input_file% named_file = .true. name_each: do i = 2, number_of_names source_file_list( i) = input_file read( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) source_file_list( i)% name_str read_n_error: if( name_file% io_status > 0 )then call msg_quit( "can't read input list tmp file") end if read_n_error end do name_each call close_scratch( name_file) end select count_names end if input_directives ! ---------------------------------------------------------------------- ! if the command line or the set file hasn't set the alter state, set it to the default cl_alter_set: if( cl_options% alter_state /= alter_none )then options% alter_state = cl_options% alter_state end if cl_alter_set alter_default: if( options% alter_state == alter_none )then options% alter_state = alter_shift_3 end if alter_default ! ---------------------------------------------------------------------- ! free form unless either the command line or the set file requests fixed form options% free_form = options% free_form .and. cl_options% free_form ! set wrapping length and reset output file name if needed wrap_default: if( options% free_form )then wrap_len = free_form_len else wrap_default wrap_len = fixed_form_len name_from_basename: if( output_file% named_file )then suffix_idx = index( output_file% name_str, output_suffix, back= .true.) output_file% name_str( suffix_idx: suffix_idx + len( output_suffix) - 1) = fixed_suffix end if name_from_basename end if wrap_default ! ---------------------------------------------------------------------- ! set the rest of the options from the command line options% mark_input = options% mark_input .or. cl_options% mark_input options% number_source = options% number_source .or. cl_options% number_source options% postpend_setfile = options% postpend_setfile .and. cl_options% postpend_setfile options% print_report = options% print_report .or. cl_options% print_report options% verbose_mode = options% verbose_mode .or. cl_options% verbose_mode ! verbose mode makes a summary report as well options% print_report = options% print_report .or. options% verbose_mode ! ---------------------------------------------------------------------- ! set key characters set_keys_dir: if( options% keychars /= blank )then set_keys_ok: if( check_key_chars_ok( options% keychars) )then l_key = options% keychars( 1: 1) r_key = options% keychars( 2: 2) else set_keys_ok call msg_quit( "unusable key characters from set file: " // options% keychars & // " must be chosen from " // ok_key_list) end if set_keys_ok end if set_keys_dir set_keys_opt: if( cl_options% keychars /= blank )then cl_keys_ok: if( check_key_chars_ok( cl_options% keychars) )then l_key = cl_options% keychars( 1: 1) r_key = cl_options% keychars( 2: 2) else cl_keys_ok call msg_quit( "unusable key characters from command line: " // cl_options% keychars & // " must be chosen from " // ok_key_list) end if cl_keys_ok end if set_keys_opt ! the command line can only disable line wrapping options% wrapping_lines = options% wrapping_lines .and. cl_options% wrapping_lines ! ---------------------------------------------------------------------- ! set values in the prdefined macros call date_and_time( date= today_str, time= now_str) predefined_macros( date_idx)% macro_value = format_date( today_str) predefined_macros( time_idx)% macro_value = format_time( now_str) predefined_macros( coco_idx)% macro_value = coco_rcs_id predefined_macros( setfile_idx)% macro_value = set_file% name_str predefined_macros( logfile_idx)% macro_value = log_file% name_str predefined_macros( output_idx)% macro_value = output_file% name_str ! set value from the coco command line call get_command_line_value( predefined_macros( cmdline_idx)% macro_value) ! set values from the environment call get_user_environment_value( predefined_macros( user_idx)% macro_value) call get_pwd_environment_value( predefined_macros( cwd_idx)% macro_value) ! build incpath value from the include directory list call build_incpath_value( predefined_macros( incpath_idx)% macro_value) ! ---------------------------------------------------------------------- ! try to find the OS file name separator character call seek_sep_char( predefined_macros( cwd_idx)% macro_value) have_sep_char: if( options% got_sep_char )then call check_incpath_dirs() end if have_sep_char ! ---------------------------------------------------------------------- ! set_option_defaults() exit return ! ********************************************************************** ! set_option_defaults() end subroutine set_option_defaults ! ********************************************************************** ! ********************************************************************** ! get_command_line_value() get command line string subroutine get_command_line_value( macro_value) ! ********************************************************************** ! get_command_line_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! get_command_line_value() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: cmdline_len integer :: cl_stat ! ********************************************************************** ! get_command_line_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- call get_command( length= cmdline_len, status= cl_stat) cl_status_error: if( cl_stat > 0 )then call msg_quit( "can't access the command line") end if cl_status_error command_line_too_long: if( cmdline_len > len( macro_value) )then call msg_quit( "command line too long for macro value") end if command_line_too_long call get_command( command= macro_value) ! ---------------------------------------------------------------------- ! get_command_line_value() exit return ! ********************************************************************** ! get_command_line_value() end subroutine get_command_line_value ! ********************************************************************** ! ********************************************************************** ! get_user_environment_value() get command line string subroutine get_user_environment_value( macro_value) ! ********************************************************************** ! get_user_environment_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! get_user_environment_value() constants ! ---------------------------------------------------------------------- ! name of environment variable to fetch character( len= *), parameter :: env_var_name = 'USER' character( len= *), parameter :: alt_env_var_name = 'LOGNAME' ! ********************************************************************** ! get_user_environment_value() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: env_stat ! ********************************************************************** ! get_user_environment_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! try to get USER call get_environment_variable( name= env_var_name, status= env_stat) got_user: if( env_stat == 0 )then call get_environment_variable( name= env_var_name, value= macro_value) return else got_user env_status_error: if( env_stat > 0 )then call msg_continue( "can't access environment variable: " // env_var_name) end if env_status_error env_var_too_long: if( env_stat < 0 )then call msg_quit( "environment variable too long for macro value: " // env_var_name) end if env_var_too_long end if got_user ! if no USER, try to get LOGNAME call get_environment_variable( name= alt_env_var_name, status= env_stat) got_logname: if( env_stat == 0 )then call get_environment_variable( name= alt_env_var_name, value= macro_value) else got_logname alt_env_status_error: if( env_stat > 0 )then call msg_continue( "can't access environment variable: " // alt_env_var_name) end if alt_env_status_error alt_env_var_too_long: if( env_stat < 0 )then call msg_quit( "environment variable too long for macro value: " // alt_env_var_name) end if alt_env_var_too_long end if got_logname ! ---------------------------------------------------------------------- ! get_user_environment_value() exit return ! ********************************************************************** ! get_user_environment_value() end subroutine get_user_environment_value ! ********************************************************************** ! ********************************************************************** ! get_pwd_environment_value() get command line string subroutine get_pwd_environment_value( macro_value) ! ********************************************************************** ! get_pwd_environment_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! get_pwd_environment_value() constants ! ---------------------------------------------------------------------- ! name of environment variable to fetch character( len= *), parameter :: env_var_name = 'PWD' ! ********************************************************************** ! get_pwd_environment_value() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: env_stat ! ********************************************************************** ! get_pwd_environment_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! try to get PWD call get_environment_variable( name= env_var_name, status= env_stat) env_status_error: if( env_stat > 0 )then call msg_continue( "can't access environment variable: " // env_var_name) end if env_status_error env_var_too_long: if( env_stat < 0 )then call msg_quit( "environment variable too long for macro value: " // env_var_name) end if env_var_too_long call get_environment_variable( name= env_var_name, value= macro_value) ! ---------------------------------------------------------------------- ! get_pwd_environment_value() exit return ! ********************************************************************** ! get_pwd_environment_value() end subroutine get_pwd_environment_value ! ********************************************************************** ! ********************************************************************** ! build_incpath_value() get command line string subroutine build_incpath_value( macro_value) ! ********************************************************************** ! build_incpath_value() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( out) :: macro_value ! ********************************************************************** ! build_incpath_value() constants ! ---------------------------------------------------------------------- character( len= *), parameter :: default_path = dot ! ********************************************************************** ! build_incpath_value() local ! ---------------------------------------------------------------------- type( path_t), pointer :: path_ptr ! ********************************************************************** ! build_incpath_value() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- macro_value = default_path nullify( path_ptr) path_ptr => first_directory scan_path: do if( .not. associated( path_ptr) ) exit scan_path macro_value = trim( macro_value) // blank // path_ptr% name_str path_ptr => path_ptr% next end do scan_path ! ---------------------------------------------------------------------- ! build_incpath_value() exit return ! ********************************************************************** ! build_incpath_value() end subroutine build_incpath_value ! ********************************************************************** ! ********************************************************************** ! seek_sep_char() try to find the OS file name separator character subroutine seek_sep_char( pwd) ! ********************************************************************** ! seek_sep_char() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( in) :: pwd ! ********************************************************************** ! seek_sep_char() local ! ---------------------------------------------------------------------- ! test command line status and length integer :: char_idx ! ********************************************************************** ! seek_sep_char() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! first seek slash in pwd char_idx = index( string= pwd, substring= slash) got_slash: if( char_idx > 0 )then options% sep_char = slash options% got_sep_char = .true. return end if got_slash ! next seek backslash in pwd char_idx = index( string= pwd, substring= backslash) got_backslash: if( char_idx > 0 )then options% sep_char = backslash options% got_sep_char = .true. return end if got_backslash ! next seek colon in pwd char_idx = index( string= pwd, substring= colon) got_colon: if( char_idx > 0 )then options% sep_char = colon options% got_sep_char = .true. return end if got_colon ! ---------------------------------------------------------------------- ! seek_sep_char() exit return ! ********************************************************************** ! seek_sep_char() end subroutine seek_sep_char ! ********************************************************************** ! ********************************************************************** ! check_incpath_dirs() get command line string subroutine check_incpath_dirs() ! ********************************************************************** ! check_incpath_dirs() interface ! ---------------------------------------------------------------------- ! ********************************************************************** ! check_incpath_dirs() local ! ---------------------------------------------------------------------- type( path_t), pointer :: path_ptr integer :: dir_lt ! ********************************************************************** ! check_incpath_dirs() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- nullify( path_ptr) path_ptr => first_directory scan_path: do if( .not. associated( path_ptr) ) exit scan_path dir_lt = len_trim( path_ptr% name_str) fix_missing_sep: if( path_ptr% name_str( dir_lt: dir_lt) /= options% sep_char )then path_ptr% name_str( dir_lt + 1: dir_lt + 1) = options% sep_char end if fix_missing_sep path_ptr => path_ptr% next end do scan_path ! ---------------------------------------------------------------------- ! check_incpath_dirs() exit return ! ********************************************************************** ! check_incpath_dirs() end subroutine check_incpath_dirs ! ********************************************************************** ! ********************************************************************** ! msg_quit() process error and stop subroutine msg_quit( msg) ! ********************************************************************** ! msg_quit() interface ! ---------------------------------------------------------------------- ! the error message character( len= *), intent( in) :: msg ! ********************************************************************** ! msg_quit() local ! ---------------------------------------------------------------------- ! strings conatining the line number and iostat of the failed operation character( len= conversion_len) :: number_str character( len= conversion_len) :: iostat_str ! construct a message that might include a processor message character( len= processor_msg_len) :: quit_msg ! ********************************************************************** ! msg_quit() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! is there a processor message to include? have_processor_message: if( processor_msg /= no_processor_msg )then quit_msg = msg // blank // processor_msg else have_processor_message quit_msg = msg end if have_processor_message ! if file is associated with this error file_msg: if( associated( current_file) )then ! if a line is associated with this error line_msg: if( associated( current_file% line) )then write( unit= log_file% io_unit, fmt= log_file% format_str) trim( current_file% line) end if line_msg ! if io error caused this error io_error: if( current_file% io_status > 0 )then ! decode line number & iostat write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered write( unit= iostat_str, fmt= conversion_fmt) current_file% io_status ! write error message with file data write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco error: file: ' & // trim( current_file% name_str) // ', line: ' // trim( adjustl( number_str)) & // ', ' // ', iostat: ' // trim( adjustl( iostat_str)) // ': ' // trim( quit_msg) ! if io error caused not this error else io_error ! decode line number write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered ! write error message with file data write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco error: file: ' & // trim( current_file% name_str) // ', line: ' // trim( adjustl( number_str)) & // ', ' // trim( quit_msg) end if io_error ! if file associated not with this error else file_msg ! write error message without file data write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco error: ' // trim( quit_msg) end if file_msg ! ---------------------------------------------------------------------- ! msg_quit() exit stop 'coco error exit' ! ********************************************************************** ! msg_quit() end subroutine msg_quit ! ********************************************************************** ! ********************************************************************** ! msg_continue() print message or continue processing subroutine msg_continue( msg) ! ********************************************************************** ! msg_continue() interface ! ---------------------------------------------------------------------- ! the warning or informational message character( len= *), intent( in) :: msg ! ********************************************************************** ! msg_continue() local ! ---------------------------------------------------------------------- ! string containing the current input line number character( len= conversion_len) :: number_str ! ********************************************************************** ! msg_continue() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! if file associated with this message file_msg: if( associated( current_file) )then ! decode line number write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered ! write message with file data write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco message: file: ' & // trim( current_file% name_str) // ', line: ' // trim( adjustl( number_str)) & // ': ' // msg) ! if file associated not with this message else file_msg ! write message without file data write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco message: ' // msg) end if file_msg ! ---------------------------------------------------------------------- ! msg_continue() exit return ! ********************************************************************** ! msg_continue() end subroutine msg_continue ! ********************************************************************** ! ********************************************************************** ! process_command_line() process command line subroutine process_command_line() ! ********************************************************************** ! process_command_line calls getopt() to get any options, then ! process_command_line gets file names from the command line ! ********************************************************************** ! default coco file names constants ! ********************************************************************** ! input file name constants ! ---------------------------------------------------------------------- ! suffix used to construct input file name if one name is on the command line character( len= *), parameter :: input_suffix = dot // 'fpp' ! ********************************************************************** ! set file constants ! ---------------------------------------------------------------------- ! suffix used to construct set file name if name is on the command line character( len= *), parameter :: set_suffix = dot // 'set' ! ********************************************************************** ! suffix length integer, parameter :: suffix_len = & max( len( input_suffix), len( output_suffix), len( set_suffix) ) ! ********************************************************************** ! other command line constants ! ---------------------------------------------------------------------- ! coco communicate with getopt() ! ---------------------------------------------------------------------- ! valid option letters character( len= *), parameter :: opt_letters = 'a:D:FhI:k:l:mnprs:vVw ' ! ********************************************************************** ! process_command_line local ! ---------------------------------------------------------------------- ! getopt() option letter integer :: optltr ! input file names character( len= file_name_len) :: argword ! dot divides basename and suffix integer :: basename_len ! loop through input file names integer :: i ! allocation status integer :: astat ! ********************************************************************** ! process_command_line() text ! ---------------------------------------------------------------------- continue ! get number of command line args nargs = command_argument_count() ! do until end of args is returned optltr = getopt( opt_letters) ! process options cl_args: do if( optltr == end_of_args) exit cl_args ! select which option which_option: select case( char( optltr)) ! ---------------------------------------------------------------------- ! set the alter state case( 'a') which_option call process_alter_option( optarg) ! declare a symbol case( 'D') which_option call process_define_option( optarg) ! set source form to fixed case( 'F') which_option call process_fixed_option() ! help case( 'h') which_option call print_help() stop 'coco normal exit' ! set directories to search for include files case( 'I') which_option call process_include_option( optarg) ! set the left and right key characters for finding macros case( 'k') which_option call process_key_option( optarg) ! set log file (NOTE: optarg has len= file_name_len, so no overflow can occur.) case( 'l') which_option call process_log_file_option( optarg) ! turn on marking input files case( 'm') which_option call process_mark_option() ! turn on line numbers case( 'n') which_option call process_number_option() ! turn off copy of setfile case( 'p') which_option call process_postpend_option() ! write summary report case( 'r') which_option call process_report_option() ! name set file case( 's') which_option call process_set_file_option( optarg) ! turn on verbose case( 'v') which_option call process_verbose_option() ! print coco version data case( 'V') which_option write( unit= error_unit, fmt= string_fmt) coco_rcs_id stop 'coco normal exit' ! turn off line wrapping case( 'w') which_option call process_wrap_option() ! command line error case default which_option write( unit= error_unit, fmt= string_fmt) usage_msg stop 'coco error exit' end select which_option ! ---------------------------------------------------------------------- optltr = getopt( opt_letters) end do cl_args ! ---------------------------------------------------------------------- ! the rest of the command line words (if any) must be file names ! ---------------------------------------------------------------------- ! number of command line args left unprocessed args_left: if( optarg == unknown_option )then number_of_names = nargs - optind optind = optind + 1 no_more_args: if( number_of_names > 0 )then call get_cl_arg_check_len( optind, optarg) end if no_more_args else args_left number_of_names = nargs - optind + 1 end if args_left ! ---------------------------------------------------------------------- ! process file names file_names: select case( number_of_names) ! ---------------------------------------------------------------------- ! one file name arg case( 1) file_names ! check that basename is not too long base_too_long: if( ( len_trim( optarg) + suffix_len) > file_name_len )then call msg_quit( 'file name too long: ' // trim( optarg) ) end if base_too_long ! use basename to make input file name input_file% io_unit = read_unit input_file% named_file = .true. input_file% name_str = trim( optarg) // input_suffix ! use basename to make output file name output_file% io_unit = write_unit output_file% named_file = .true. output_file% name_str = trim( optarg) // output_suffix ! use basename to make set file file name set_file% io_unit = set_unit set_file% named_file = .true. set_file% name_str = trim( optarg) // set_suffix ! ---------------------------------------------------------------------- ! more than one file name arg case( 2: ) file_names ! read source from read_unit input_file% io_unit = read_unit input_file% named_file = .true. ! allocate source file list allocate( source_file_list( 2: number_of_names), stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate input file array") end if alloc_error ! set up output file output_file% io_unit = write_unit output_file% named_file = .true. output_file% name_str = optarg ! compute set file name basename_len = index( output_file% name_str, dot, back= .true.) no_dot: if( basename_len == 0 )then basename_len = len_trim( output_file% name_str) + len( dot) end if no_dot ! check that set file name is not too long set_too_long: if( basename_len + suffix_len > file_name_len )then call msg_quit( 'set file name too long: ' // trim( output_file% name_str) // set_suffix ) end if set_too_long ! use output file name to make set file file name set_file% io_unit = set_unit set_file% named_file = .true. set_file% name_str = output_file% name_str( 1: basename_len - len( dot)) // set_suffix ! record input files in source file list list_inputs: do i = 2, number_of_names ! establish the components of this input file except the name source_file_list( i) = input_file ! get next arg string optind = optind + 1 call get_cl_arg_check_len( optind, argword) source_file_list( i)% name_str = argword end do list_inputs ! only possible values end select file_names ! ---------------------------------------------------------------------- ! process_command_line() exit return ! ********************************************************************** ! process_command_line() end subroutine process_command_line ! ********************************************************************** ! ********************************************************************** ! getopt() return next known option from command line or unknown integer function getopt( optstring) ! ********************************************************************** ! getopt() interface ! ---------------------------------------------------------------------- ! the string of valid option letters character( len= *), intent( in) :: optstring ! ********************************************************************** ! getopt() constants ! ---------------------------------------------------------------------- ! special characters character( len= *), parameter :: dash = minus ! ********************************************************************** ! getopt() local ! ---------------------------------------------------------------------- ! argument buffer character( len= file_name_len) :: optword ! index in optstring integer :: index_optstring ! ********************************************************************** ! getopt() text continue ! ---------------------------------------------------------------------- ! initialize for next option check_inc: if( optind >= nargs )then optarg = unknown_option getopt = end_of_args return end if check_inc ! ---------------------------------------------------------------------- ! get next option optind = optind + 1 call get_cl_arg_check_len( optind, optword) ! if word is not -? not_an_option: if( optword( 1: 1) /= dash )then optarg = optword getopt = end_of_args return ! if word is -- else if( optword( 2: 2) == dash )then not_an_option optarg = unknown_option getopt = end_of_args return end if not_an_option ! ---------------------------------------------------------------------- ! optword is -x (not --) index_optstring = index( optstring, optword( 2: 2)) is_opt: if( index_optstring > 0 )then ! if this optltr must have another word opt_string: if( optstring( index_optstring + 1: index_optstring + 1) == colon )then ! it can be separated by a blank next_word: if( optword( 3: 3) == blank )then optind = optind + 1 call get_cl_arg_check_len( optind, optarg) ! or not be separated by a blank else next_word optarg = optword( 3: ) end if next_word end if opt_string getopt = ichar( optword( 2: 2)) ! if this optltr must not have another word else is_opt optarg = optword getopt = ichar( unknown_option) end if is_opt ! ---------------------------------------------------------------------- ! getopt() exit return ! ********************************************************************** ! getopt() end function getopt ! ********************************************************************** ! ********************************************************************** ! %%% process particular command line options ! ********************************************************************** ! ********************************************************************** ! process_alter_option() process alter arguments subroutine process_alter_option( alter_opt) ! ********************************************************************** ! process_alter_option() interface ! ---------------------------------------------------------------------- ! the alter option from the command line character( len= *), intent( in) :: alter_opt ! ********************************************************************** ! entry: alter_opt is command line arg following -a ! "d" | "b" | "0" | "1" | "3" ! exit: alter_opt is processed or error exit ! ********************************************************************** ! process_alter_option() constants ! ---------------------------------------------------------------------- ! possible alter option strings character( len= *), parameter :: delete_str = 'd' character( len= *), parameter :: blank_str = 'b' character( len= *), parameter :: shift0_str = '0' character( len= *), parameter :: shift1_str = '1' character( len= *), parameter :: shift3_str = '3' ! ********************************************************************** ! process_alter_option() local ! ---------------------------------------------------------------------- ! decoding the option is done in lower case which may require a case change character( len= 1) :: lower_case_opt ! ---------------------------------------------------------------------- ! allow only one -a per command line logical, save :: too_many_alter_options = .false. ! ********************************************************************** ! process_alter_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_alter_options )then call msg_quit( "too many alter options on command line") else too_many too_many_alter_options = .true. end if too_many ! ---------------------------------------------------------------------- ! check for unknown option too_long: if( len_trim( alter_opt) > 1 )then call msg_quit( "garbled -a option: " // trim( alter_opt) ) end if too_long ! force arg to lower case lower_case_opt = to_lower( alter_opt( 1: 1)) ! ---------------------------------------------------------------------- ! legal alter argument or error alter_value_str: select case( lower_case_opt) ! alter delete case( delete_str) alter_value_str cl_options% alter_state = alter_delete ! alter blank case( blank_str) alter_value_str cl_options% alter_state = alter_blank ! alter shift1 case( shift1_str) alter_value_str cl_options% alter_state = alter_shift_1 ! alter shift0 case( shift0_str) alter_value_str cl_options% alter_state = alter_shift_0 ! alter shift3 case( shift3_str) alter_value_str cl_options% alter_state = alter_shift_3 ! unknown alter code ( not one of { b, d, 0, 1, 3 } ) case default alter_value_str call msg_quit( "unknown -a option: " // trim( alter_opt) ) ! legal alter statement or error end select alter_value_str ! ---------------------------------------------------------------------- ! process_alter_option() exit return ! ********************************************************************** ! process_alter_option() end subroutine process_alter_option ! ********************************************************************** ! ********************************************************************** ! process_define_option() process define arguments -Dname[=n] subroutine process_define_option( symbol_opt) ! ********************************************************************** ! process_define_option() interface ! ---------------------------------------------------------------------- ! the symbol string from the command line character( len= *), intent( in) :: symbol_opt ! ********************************************************************** ! entry: symbol_opt is string following -D { log | int=val } ! exit: symbol_opt is processed or error exit ! ********************************************************************** ! process_define_option() local ! ---------------------------------------------------------------------- ! find characters integer :: eq_idx ! construct a declaration string to process character( len= file_name_len) :: decl_string ! ********************************************************************** ! process_define_option() text continue ! ---------------------------------------------------------------------- ! force names to lower case decl_string = to_lower( symbol_opt) ! ---------------------------------------------------------------------- ! an equal sign must separate a value from the name eq_idx = index( decl_string, equals) ! if there's an equals, it's an integer int_or_log: if( eq_idx > 0 )then ! check name call valid_new_cl_name( decl_string( 1: eq_idx - 1)) ! declare the integer constant call add_cl_integer( decl_string( eq_idx: ), decl_string( 1: eq_idx - 1)) ! if there's no equals, it's a logical ( = .true.) else int_or_log ! check name call valid_new_cl_name( trim( decl_string)) ! declare the logical constant call add_cl_logical( decl_string) ! integer or logical end if int_or_log ! ---------------------------------------------------------------------- ! process_define_option() exit return ! ********************************************************************** ! process_define_option() end subroutine process_define_option ! ********************************************************************** ! ********************************************************************** ! add_cl_integer() store integer from the command line in cl symbol table subroutine add_cl_integer( int_decl_str, integer_name) ! ********************************************************************** ! add_cl_integer() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: int_decl_str ! the symbol name character( len= *), intent( in) :: integer_name ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case integer declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! exit: integer declaration is added to the integer symbol list or error exit ! ********************************************************************** ! add_cl_integer() local ! ---------------------------------------------------------------------- ! check allocation status integer :: astat ! type pointer to allocate type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! add_cl_integer() text continue ! ---------------------------------------------------------------------- ! allocate new integer allocate( integer_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate -D integer: " // trim( integer_name)) end if alloc_error ! build new integer on list subsequent_or_first: if( associated( first_cl_symbol) )then last_cl_symbol% next => integer_ptr last_cl_symbol => last_cl_symbol% next else subsequent_or_first first_cl_symbol => integer_ptr last_cl_symbol => first_cl_symbol end if subsequent_or_first nullify( integer_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members integer_ptr% name_str = integer_name ! ---------------------------------------------------------------------- ! decode the value call eval_int_expr( int_decl_str( len( equals) + 1: ), integer_ptr% integer_value) ! ---------------------------------------------------------------------- ! add_cl_integer() exit return ! ********************************************************************** ! add_cl_integer() end subroutine add_cl_integer ! ********************************************************************** ! ********************************************************************** ! add_cl_logical() store integer from the command line in cl symbol table subroutine add_cl_logical( logical_name) ! ********************************************************************** ! add_logical() interface ! ---------------------------------------------------------------------- ! the valid logical name character( len= *), intent( in) :: logical_name ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case logical declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_logical() local ! ---------------------------------------------------------------------- ! check allocation status integer :: astat ! type pointer to allocate type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! add_logical() text continue ! ---------------------------------------------------------------------- ! allocate new logical allocate( logical_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate -D logical: " // trim( logical_name)) end if alloc_error ! build new logical on list subsequent_or_first: if( associated( first_cl_symbol) )then last_cl_symbol% next => logical_ptr last_cl_symbol => last_cl_symbol% next else subsequent_or_first first_cl_symbol => logical_ptr last_cl_symbol => first_cl_symbol end if subsequent_or_first nullify( logical_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members logical_ptr% name_str = logical_name ! ---------------------------------------------------------------------- ! logicals on the command line are true logical_ptr% logical_value = .true. ! ---------------------------------------------------------------------- ! add_cl_logical() exit return ! ********************************************************************** ! add_cl_logical() end subroutine add_cl_logical ! ********************************************************************** ! ********************************************************************** ! process_fixed_option() process fixed arguments subroutine process_fixed_option() ! ********************************************************************** ! entry: ! exit: -F is processed or error exit ! ********************************************************************** ! process_fixed_option() local ! ---------------------------------------------------------------------- ! allow only one -a per command line logical, save :: too_many_fixed_options = .false. ! ********************************************************************** ! process_fixed_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_fixed_options )then call msg_quit( "too many fixed options on command line") else too_many too_many_fixed_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% free_form = .false. ! ---------------------------------------------------------------------- ! process_fixed_option() exit return ! ********************************************************************** ! process_fixed_option() end subroutine process_fixed_option ! ********************************************************************** ! ********************************************************************** ! print_help() write usage message and options to stderr subroutine print_help() ! ********************************************************************** ! entry: in response to -h command line option ! exit: print help message ! ********************************************************************** ! print_help() constants ! ---------------------------------------------------------------------- ! the options message character( len= *), dimension( 1: 16), parameter :: options_msg = [ & ' -a ? set alter state, ? = { b, d, 0, 1, 3} ', & ' -D name[=n] provide integer =n or logical true value ', & ' -F treat source as fixed form source ', & ' -h print this help message and quit ', & ' -k cc sets the left and right key characters to cc ', & ' -I directory search directory for include files (after .) ', & ' -l log-file write log messages to log-file (default stderr) ', & ' -m mark subsequent input files in the output file ', & ' -n print line numbers on source lines ', & ' -p disable the copy of set file at end of output ', & ' -r print summary report at end of processing ', & ' -s set-file read set-file as the set file (default coco.set) ', & ' -v report file opening and closing ', & ' -V print coco version and quit ', & ' -w disable line wrapping ', & ' -- optionally separate options from source file names' ] ! ********************************************************************** ! print_help() local ! ---------------------------------------------------------------------- ! implied do variable integer :: i ! ********************************************************************** ! print_help() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- write( unit= error_unit, fmt= string_fmt) usage_msg write( unit= error_unit, fmt= string_fmt) ( trim( options_msg( i)), i = 1, size( options_msg)) ! ---------------------------------------------------------------------- ! print_help() exit return ! ********************************************************************** ! print_help() end subroutine print_help ! ********************************************************************** ! ********************************************************************** ! process_include_option() process include directory options subroutine process_include_option( directory_opt) ! ********************************************************************** ! process_include_option() interface ! ---------------------------------------------------------------------- ! the directory string from the command line character( len= *), intent( in) :: directory_opt ! ********************************************************************** ! entry: directory_opt is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_opt is on the list ! ********************************************************************** ! process_include_option() local ! ---------------------------------------------------------------------- ! point to a directory type type( path_t), pointer :: path_ptr ! unquote the directory name if needed character( len= file_name_len) :: directory_str ! lengths of quoted string integer :: quoted_len ! lengths of unquoted string integer :: unquoted_len ! ********************************************************************** ! process_include_option() text continue ! ---------------------------------------------------------------------- ! if the directory is quoted, unquote it call unquote_string( directory_opt, directory_str, quoted_len, unquoted_len) badly_quoted: if( unquoted_len == 0 )then call msg_quit( "null name passed to -I option") else if( quoted_len > len_trim( directory_opt) )then badly_quoted call msg_quit( "badly quoted name passed to -I option") end if badly_quoted ! ---------------------------------------------------------------------- ! if name is already on the path nullify( path_ptr) call seek_directory( directory_str, path_ptr) on_list_or_add: if( associated( path_ptr) )then call msg_continue( "redundant include directory ignored: " // trim( directory_opt) ) else on_list_or_add call add_directory( directory_str) end if on_list_or_add ! ---------------------------------------------------------------------- ! process_include_option() exit return ! ********************************************************************** ! process_include_option() end subroutine process_include_option ! ********************************************************************** ! ********************************************************************** ! process_key_option() process number directives subroutine process_key_option( key_opt) ! ********************************************************************** ! process_key_option() interface ! ---------------------------------------------------------------------- ! the key characters from the set file or command line character( len= *), intent( in) :: key_opt ! ********************************************************************** ! entry: cc + blanks ! exit: keys characters processed is processed or error exit ! ********************************************************************** ! process_key_option() local ! ---------------------------------------------------------------------- ! allow only one -k per command line logical, save :: too_many_keys_directives = .false. ! ********************************************************************** ! process_key_option() text continue ! ---------------------------------------------------------------------- ! only one number statement per set file too_many_keys: if( too_many_keys_directives )then call msg_quit( "too many -k optionss") else too_many_keys too_many_keys_directives = .true. end if too_many_keys ! ---------------------------------------------------------------------- ! process number switch on_off: if( key_opt( 3: ) == blank )then cl_options% keychars = key_opt( 1: 2) else on_off call msg_quit( "extra characters at end of key directive: " // trim( key_opt) ) end if on_off ! ---------------------------------------------------------------------- ! process_key_option() exit return ! ********************************************************************** ! process_key_option() end subroutine process_key_option ! ********************************************************************** ! ********************************************************************** ! process_log_file_option() process log_file arguments subroutine process_log_file_option( log_file_arg) ! ********************************************************************** ! process_log_file_option character( len= *), intent( in) :: log_file_arg ! ********************************************************************** ! entry: log_file_arg is log file name ! exit: -l is processed or error exit ! ********************************************************************** ! process_log_file_option() local ! ---------------------------------------------------------------------- ! allow only one -l per command line logical, save :: too_many_log_file_options = .false. ! ********************************************************************** ! process_log_file_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_log_file_options )then call msg_quit( "too many log file options on command line") else too_many too_many_log_file_options = .true. end if too_many ! ---------------------------------------------------------------------- log_file% io_unit = log_unit log_file% name_str = log_file_arg log_file% named_file = .true. call open_file( log_file) ! ---------------------------------------------------------------------- ! process_log_file_option() exit return ! ********************************************************************** ! process_log_file_option() end subroutine process_log_file_option ! ********************************************************************** ! ********************************************************************** ! process_mark_option() process number arguments subroutine process_mark_option() ! ********************************************************************** ! entry: from -m encountered ! exit: -m is processed or error exit ! ********************************************************************** ! process_mark_option() local ! ---------------------------------------------------------------------- ! allow only one -m per command line logical, save :: too_many_mark_options = .false. ! ********************************************************************** ! process_mark_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_mark_options )then call msg_quit( "too many mark options on command line") else too_many too_many_mark_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% mark_input = .true. ! ---------------------------------------------------------------------- ! process_mark_option() exit return ! ********************************************************************** ! process_mark_option() end subroutine process_mark_option ! ********************************************************************** ! ********************************************************************** ! process_number_option() process number arguments subroutine process_number_option() ! ********************************************************************** ! entry: from -n encountered ! exit: -n is processed or error exit ! ********************************************************************** ! process_number_option() local ! ---------------------------------------------------------------------- ! allow only one -n per command line logical, save :: too_many_number_options = .false. ! ********************************************************************** ! process_number_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_number_options )then call msg_quit( "too many number options on command line") else too_many too_many_number_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% number_source = .true. ! ---------------------------------------------------------------------- ! process_number_option() exit return ! ********************************************************************** ! process_number_option() end subroutine process_number_option ! ********************************************************************** ! ********************************************************************** ! process_postpend_option() process postpend arguments subroutine process_postpend_option() ! ********************************************************************** ! entry: from -p encountered ! exit: -p is processed or error exit ! ********************************************************************** ! process_postpend_option() local ! ---------------------------------------------------------------------- ! allow only one -p per command line logical, save :: too_many_postpend_options = .false. ! ********************************************************************** ! process_postpend_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_postpend_options )then call msg_quit( "too many postpend options on command line") else too_many too_many_postpend_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% postpend_setfile = .false. ! ---------------------------------------------------------------------- ! process_postpend_option() exit return ! ********************************************************************** ! process_postpend_option() end subroutine process_postpend_option ! ********************************************************************** ! ********************************************************************** ! process_report_option() process report arguments subroutine process_report_option() ! ********************************************************************** ! entry: from -r encountered ! exit: -r is processed or error exit ! ********************************************************************** ! process_report_option() local ! ---------------------------------------------------------------------- ! allow only one -r per command line logical, save :: too_many_report_options = .false. ! ********************************************************************** ! process_report_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_report_options )then call msg_quit( "too many report options on command line") else too_many too_many_report_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% print_report = .true. ! ---------------------------------------------------------------------- ! process_report_option() exit return ! ********************************************************************** ! process_report_option() end subroutine process_report_option ! ********************************************************************** ! ********************************************************************** ! process_set_file_option() process set_file arguments subroutine process_set_file_option( set_file_arg) ! ********************************************************************** ! process_set_file_option character( len= *), intent( in) :: set_file_arg ! ********************************************************************** ! entry: set_file_arg is set file name ! exit: -s is processed or error exit ! ********************************************************************** ! process_set_file_option() local ! ---------------------------------------------------------------------- ! allow only one -s per command line logical, save :: too_many_set_file_options = .false. ! ********************************************************************** ! process_set_file_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_set_file_options )then call msg_quit( "too many set file options on command line") else too_many too_many_set_file_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_set_file% name_str = set_file_arg cl_set_file% named_file = .true. ! ---------------------------------------------------------------------- ! process_set_file_option() exit return ! ********************************************************************** ! process_set_file_option() end subroutine process_set_file_option ! ********************************************************************** ! ********************************************************************** ! process_verbose_option() process verbose arguments subroutine process_verbose_option() ! ********************************************************************** ! entry: ! exit: -v is processed or error exit ! ********************************************************************** ! process_verbose_option() local ! ---------------------------------------------------------------------- ! allow only one -v per command line logical, save :: too_many_verbose_options = .false. ! ********************************************************************** ! process_verbose_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_verbose_options )then call msg_quit( "too many verbose options on command line") else too_many too_many_verbose_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% verbose_mode = .true. ! ---------------------------------------------------------------------- ! process_verbose_option() exit return ! ********************************************************************** ! process_verbose_option() end subroutine process_verbose_option ! ********************************************************************** ! ********************************************************************** ! process_wrap_option() process wrap arguments subroutine process_wrap_option() ! ********************************************************************** ! entry: ! exit: -v is processed or error exit ! ********************************************************************** ! process_wrap_option() local ! ---------------------------------------------------------------------- ! allow only one -w per command line logical, save :: too_many_wrap_options = .false. ! ********************************************************************** ! process_wrap_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_wrap_options )then call msg_quit( "too many wrap options on command line") else too_many too_many_wrap_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% wrapping_lines = .false. ! ---------------------------------------------------------------------- ! process_wrap_option() exit return ! ********************************************************************** ! process_wrap_option() end subroutine process_wrap_option ! ********************************************************************** ! ********************************************************************** ! %%% diagnostic directives write to the log file ! ********************************************************************** ! ********************************************************************** ! process_cmdline_directive() write command line to the log file subroutine process_cmdline_directive( cmdline_dir) ! ********************************************************************** ! process_cmdline_directive() text ! ---------------------------------------------------------------------- character( len= *), intent( in) :: cmdline_dir ! ********************************************************************** ! process_cmdline_directive() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! check for well formed directive extra_chars: if( cmdline_dir /= blank )then call msg_quit( "extra characters at end of cmdline directive: " // trim( cmdline_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! if an active line active_line: if( if_construct% now_selected )then ! write command line to stderr or the log file write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco command line: ' & // trim( predefined_macros( cmdline_idx)% macro_value) end if active_line ! ---------------------------------------------------------------------- ! process_cmdline_directive() exit return ! ********************************************************************** ! process_cmdline_directive() end subroutine process_cmdline_directive ! ********************************************************************** ! ********************************************************************** ! write_options() write options in effect to the log file subroutine write_options() ! ********************************************************************** ! write_options() constants ! ---------------------------------------------------------------------- ! possible alter states integer, parameter :: lower_alter = min( alter_delete, alter_blank, alter_shift_1, alter_shift_0, alter_shift_3) integer, parameter :: upper_alter = max( alter_delete, alter_blank, alter_shift_1, alter_shift_0, alter_shift_3) ! possible alter state labels character( len= 16), dimension( lower_alter: upper_alter), parameter :: alter_labels = [ & 'deleted ', & 'blank line ', & 'initial ! ', & 'shifted 1 + ! ', & 'shifted 3 + !?> ' ] ! ********************************************************************** ! write_options() local ! ---------------------------------------------------------------------- ! construct output lines character( len= buffer_len) :: output_line ! ********************************************************************** ! write_options() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! write a header write( unit= log_file% io_unit, fmt= log_file% format_str) "coco options:" ! ---------------------------------------------------------------------- ! identify the alter state check_index: select case( options% alter_state) case( lower_alter: upper_alter) check_index output_line = 'alter state causes lines to be ' // alter_labels( options% alter_state) case default check_index output_line = 'alter state is undefined' end select check_index write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether free form or fixed form rpt_form: if( options% free_form )then output_line = 'processing free form source: wrap len:' else rpt_form output_line = 'processing fixed form source: wrap len:' end if rpt_form write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) // blank, wrap_len ! identify whether printing new input file mark rpt_mark: if( options% mark_input )then output_line = 'marking subsequent input files' else rpt_mark output_line = 'not marking subsequent input files' end if rpt_mark write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether printing "! file: line" on source lines rpt_number: if( options% number_source )then output_line = 'numbering source lines' else rpt_number output_line = 'not numbering source lines' end if rpt_number write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether postpending the set file rpt_post: if( options% postpend_setfile )then output_line = 'postpending set file ' // set_file% name_str else rpt_post output_line = 'not postpending set file ' // set_file% name_str end if rpt_post write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether printing coco report rpt_prt: if( options% print_report )then output_line = 'printing coco report' else rpt_prt output_line = 'not printing coco report' end if rpt_prt write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether verbose mode is on rpt_verbose: if( options% verbose_mode )then output_line = 'verbose mode is on' else rpt_verbose output_line = 'verbose mode is off' end if rpt_verbose write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify whether wrapping lines rpt_wrap: if( options% wrapping_lines )then output_line = 'wrapping source lines' else rpt_wrap output_line = 'not wrapping source lines' end if rpt_wrap write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! found a file name directory separator character rpt_sep_char: if( options% got_sep_char )then output_line = 'found directory separator character ' // options% sep_char else rpt_sep_char output_line = 'no directory separator character found' end if rpt_sep_char write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! identify the argument keys output_line = 'the left argument key: "' // l_key // '" the right argument key: "' // r_key // '"' write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) ! ---------------------------------------------------------------------- ! write_options() exit return ! ********************************************************************** ! write_options() end subroutine write_options ! ********************************************************************** ! ********************************************************************** ! write_report() write summary report to the log file subroutine write_report() ! ********************************************************************** ! write_report() local ! ---------------------------------------------------------------------- ! print date and time in header character( len= 8) :: today_str character( len= 10) :: now_str ! ---------------------------------------------------------------------- ! print include path type( path_t), pointer :: path_ptr ! ---------------------------------------------------------------------- ! print input files integer :: i ! ********************************************************************** ! write_report() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! banner includes the date and time call date_and_time( date= today_str, time= now_str) write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco executed: ' // format_date( today_str) & // blank // format_time( now_str) ! ---------------------------------------------------------------------- ! identify the set file write( unit= log_file% io_unit, fmt= log_file% format_str) 'set file: ' // trim( set_file% name_str) ! ---------------------------------------------------------------------- ! identify the output file write( unit= log_file% io_unit, fmt= log_file% format_str) 'output: ' // trim( output_file% name_str) ! ---------------------------------------------------------------------- ! identify the input file(s) one_or_more: if( allocated( source_file_list) )then write( unit= log_file% io_unit, fmt= log_file% format_str, advance= 'NO') 'input:' more_than_one: do i = 2, number_of_names write( unit= log_file% io_unit, fmt= log_file% format_str, advance= 'NO') & blank // trim( source_file_list( i)% name_str) end do more_than_one write( unit= log_file% io_unit, fmt= log_file% format_str) else one_or_more write( unit= log_file% io_unit, fmt= log_file% format_str) 'input: ' // trim( input_file% name_str) end if one_or_more ! ---------------------------------------------------------------------- ! identify the include path write_sep_char: if( options% got_sep_char )then write( unit= log_file% io_unit, fmt= directory_fmt, advance= 'NO') & 'include path: .' // options% sep_char // ' (', count_include_in_dot, ')' else write_sep_char write( unit= log_file% io_unit, fmt= directory_fmt, advance= 'NO') 'include path: . (', count_include_in_dot, ')' end if write_sep_char nullify( path_ptr) path_ptr => first_directory inc_path: do if( .not. associated( path_ptr) ) exit inc_path write( unit= log_file% io_unit, fmt= directory_fmt, advance= 'NO') & comma // blank // trim( path_ptr% name_str) // blank // open_paren, path_ptr% times_accessed, close_paren path_ptr => path_ptr% next end do inc_path ! end line using null string write( unit= log_file% io_unit, fmt= log_file% format_str) ! ---------------------------------------------------------------------- ! number of files read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'files read: ', total% input_files write( unit= log_file% io_unit, fmt= log_file% format_str) & 'include files read: ', total% include_files ! number of set file lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'set lines read: ', set_file% lines_transfered ! number of coco lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'coco lines read: ', total% coco_lines ! number of source lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'source lines read: ', total% input_lines ! number of lines written write( unit= log_file% io_unit, fmt= log_file% format_str) & 'source lines written: ', output_file% lines_transfered ! number of selected lines written write( unit= log_file% io_unit, fmt= log_file% format_str) & 'selected source lines: ', total% selected_lines ! number of elided lines write( unit= log_file% io_unit, fmt= log_file% format_str) & 'elided source lines: ', total% elided_lines ! number of text blocks read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'text blocks read: ', total% text_blocks ! number of text lines read write( unit= log_file% io_unit, fmt= log_file% format_str) & 'text lines read: ', total% text_lines ! number of text lines written write( unit= log_file% io_unit, fmt= log_file% format_str) & 'text lines written: ', total% copied_lines ! ---------------------------------------------------------------------- ! write_report() exit return ! ********************************************************************** ! write_report() end subroutine write_report ! ********************************************************************** ! ********************************************************************** ! write_symbols() write symbol list to the log file subroutine write_symbols() ! ********************************************************************** ! write_symbols() local ! ---------------------------------------------------------------------- ! symbol to be written to the log file class( symbol_t), pointer :: symbol_ptr ! convert line numbers to strings character( len= conversion_len) :: line_no_str ! print dummy arguments character( len= buffer_len) :: args_line ! predefined macros index and block line index integer :: i ! ********************************************************************** ! write_symbols() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! predefined symbols write( unit= log_file% io_unit, fmt= string_fmt) 'predefined symbols' all_predefined: do i = 1, size( predefined_macros) write( unit= log_file% io_unit, fmt= string_fmt) 'name: ' // predefined_macros( i)% name_str write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' // trim( predefined_macros( i)% macro_value) predefined_referenced: if( predefined_macros( i)% referenced )then write( unit= line_no_str, fmt= conversion_fmt) predefined_macros( i)% referenced_line write( unit= log_file% io_unit, fmt= string_fmt) 'referenced in file: ' & // trim( predefined_macros( i)% referenced_file) & // ' at line: ' // trim( adjustl( line_no_str)) else predefined_referenced write( unit= log_file% io_unit, fmt= string_fmt) 'never referenced' end if predefined_referenced end do all_predefined ! ---------------------------------------------------------------------- symbol_ptr => first_symbol write( unit= log_file% io_unit, fmt= string_fmt) 'symbols' all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols write( unit= log_file% io_unit, fmt= string_fmt) 'next symbol' ! ---------------------------------------------------------------------- ! data all symbols have write( unit= log_file% io_unit, fmt= string_fmt) 'name: ' // symbol_ptr% name_str write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% declared_line write( unit= log_file% io_unit, fmt= string_fmt) 'declared in file: ' // trim( symbol_ptr% declared_file) & // ' at line: ' // trim( adjustl( line_no_str)) ever_referenced: if( symbol_ptr% referenced )then write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% referenced_line write( unit= log_file% io_unit, fmt= string_fmt) 'referenced in file: ' // trim( symbol_ptr% referenced_file) & // ' at line: ' // trim( adjustl( line_no_str)) else ever_referenced write( unit= log_file% io_unit, fmt= string_fmt) 'never referenced' end if ever_referenced ! ---------------------------------------------------------------------- ! type-specific data print_type: select type( symbol_ptr) ! ---------------------------------------------------------------------- ! logical data type is( logical_t) write( unit= log_file% io_unit, fmt= string_fmt, advance= 'no') 'type: logical ' log_const_or_var: if( symbol_ptr% constant )then write( unit= log_file% io_unit, fmt= string_fmt) 'constant' else log_const_or_var write( unit= log_file% io_unit, fmt= string_fmt) 'variable' end if log_const_or_var logical_defined: if( symbol_ptr% defined )then true_false: if( symbol_ptr% logical_value )then write( unit= log_file% io_unit, fmt= string_fmt) 'value: .true.' else true_false write( unit= log_file% io_unit, fmt= string_fmt) 'value: .false.' end if true_false write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% defined_line write( unit= log_file% io_unit, fmt= string_fmt) 'defined in file: ' // trim( symbol_ptr% defined_file) & // ' at line: ' // trim( adjustl( line_no_str)) else logical_defined write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' end if logical_defined ! ---------------------------------------------------------------------- ! integer data type is( integer_t) write( unit= log_file% io_unit, fmt= string_fmt, advance= 'no') 'type: integer ' int_const_or_var: if( symbol_ptr% constant )then write( unit= log_file% io_unit, fmt= string_fmt) 'constant' else int_const_or_var write( unit= log_file% io_unit, fmt= string_fmt) 'variable' end if int_const_or_var integer_defined: if( symbol_ptr% defined )then write( unit= log_file% io_unit, fmt= integer_fmt) 'value: ', symbol_ptr% integer_value write( unit= line_no_str, fmt= conversion_fmt) symbol_ptr% defined_line write( unit= log_file% io_unit, fmt= string_fmt) 'defined in file: ' // trim( symbol_ptr% defined_file) & // ' at line: ' // trim( adjustl( line_no_str)) else integer_defined write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' end if integer_defined ! ---------------------------------------------------------------------- ! macro data type is( macro_t) macro_args: if( allocated( symbol_ptr% dummy_args) )then macro_parens: if( symbol_ptr% args_in_parens )then write( unit= log_file% io_unit, fmt= string_fmt) 'type: macro with arguments in parenthesis' else macro_parens write( unit= log_file% io_unit, fmt= string_fmt) 'type: macro with arguments' end if macro_parens args_line = null_string line_macro: do i = 1, size( symbol_ptr% dummy_args) args_line = trim( args_line) // blank // trim( symbol_ptr% dummy_args( i)) end do line_macro write( unit= log_file% io_unit, fmt= string_fmt) 'dummy arguments: ' // trim( args_line) else macro_args write( unit= log_file% io_unit, fmt= string_fmt) 'type: macro' end if macro_args write( unit= log_file% io_unit, fmt= string_fmt) 'value: ' // trim( symbol_ptr% macro_value) ! ---------------------------------------------------------------------- ! text data type is( text_t) text_args: if( allocated( symbol_ptr% dummy_args) )then text_parens: if( symbol_ptr% args_in_parens )then write( unit= log_file% io_unit, fmt= string_fmt) 'type: text with arguments in parenthesis' else text_parens write( unit= log_file% io_unit, fmt= string_fmt) 'type: text with arguments' end if text_parens args_line = null_string line_text: do i = 1, size( symbol_ptr% dummy_args) args_line = trim( args_line) // blank // trim( symbol_ptr% dummy_args( i)) end do line_text write( unit= log_file% io_unit, fmt= string_fmt) 'dummy arguments: ' // trim( args_line) else text_args write( unit= log_file% io_unit, fmt= string_fmt) 'type: text' end if text_args write( unit= log_file% io_unit, fmt= string_fmt) 'block:' write_block: do i = 1, size( symbol_ptr% text_lines) write( unit= log_file% io_unit, fmt= string_fmt) trim( symbol_ptr% text_lines( i)) end do write_block ! ---------------------------------------------------------------------- class default call msg_quit( 'error: type is unknown') end select print_type symbol_ptr => symbol_ptr% next end do all_symbols write( unit= log_file% io_unit, fmt= string_fmt) 'end symbols' ! ---------------------------------------------------------------------- ! write_symbols() exit return ! ********************************************************************** ! write_symbols() end subroutine write_symbols ! ********************************************************************** ! ********************************************************************** ! %%% seek and process the set file (if any) ! ********************************************************************** ! ********************************************************************** ! seek_set_file() find a set file to open or don't read one subroutine seek_set_file() ! ********************************************************************** ! seek_set_file constants ! ---------------------------------------------------------------------- ! default set_file name character( len= *), parameter :: default_name = 'coco.set' ! default set_file name environment variable name character( len= *), parameter :: env_var_name = 'COCO_SET_FILE' integer :: env_stat ! ********************************************************************** ! seek_set_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! see if there is name for the set_file from the command line cl_named_set_file: if( cl_set_file% named_file )then ! inquire by file looking for named set file inquire( file= cl_set_file% name_str, exist= cl_set_file% named_file, iostat= cl_set_file% io_status, iomsg= processor_msg) cl_inq_named: if( cl_set_file% io_status > 0 )then call msg_quit( "can't inquire set file named on command line: " // trim( cl_set_file% name_str)) end if cl_inq_named end if cl_named_set_file ! ---------------------------------------------------------------------- ! see if the set_file from the command line was found named_set_file: if( cl_set_file% named_file )then ! if so, use it set_file = cl_set_file ! see if there is name for the set_file from the source file names else if( set_file% named_file )then named_set_file ! inquire by file looking for named set file inquire( file= set_file% name_str, exist= set_file% named_file, iostat= set_file% io_status, iomsg= processor_msg) inq_named: if( set_file% io_status > 0 )then call msg_quit( "can't inquire set file: " // trim( set_file% name_str)) end if inq_named ! done checking set file name end if named_set_file ! ---------------------------------------------------------------------- ! if no set file so far see if there is an environment variable with a set file name env_named_set_file: if( .not. set_file% named_file )then call get_environment_variable( name= env_var_name, value= set_file% name_str, status= env_stat) found_env_var: if( env_stat == 0 .and. set_file% name_str /= blank )then ! inquire by file looking for named set file inquire( file= set_file% name_str, exist= set_file% named_file, iostat= set_file% io_status, iomsg= processor_msg) env_inq_named: if( set_file% io_status > 0 )then call msg_quit( "can't inquire set file named from environment: " // trim( set_file% name_str)) end if env_inq_named else found_env_var set_file% name_str = null_string end if found_env_var end if env_named_set_file ! if no named set file then try to find the default set file default_set_file: if( .not. set_file% named_file )then ! inquire by file looking for default set file inquire( file= default_name, exist= set_file% named_file, iostat= set_file% io_status, iomsg= processor_msg) inq_default: if( set_file% io_status > 0 )then call msg_quit( "can't inquire default set file: " // default_name) end if inq_default ! if found the default set file ensure the variable correctly specifies it use_default: if( set_file% named_file )then set_file% name_str = default_name end if use_default end if default_set_file ! ---------------------------------------------------------------------- ! if have set file, open it, process it, close it read_set_file: if( set_file% named_file )then call process_set_file() else read_set_file set_file% name_str = '' end if read_set_file ! ---------------------------------------------------------------------- ! seek_set_file() exit return ! ********************************************************************** ! seek_set_file() end subroutine seek_set_file ! ********************************************************************** ! ********************************************************************** ! process_sefile() open, process, close the coco set file subroutine process_set_file() ! ********************************************************************** ! process_set_file() steps ! 1. open the set file ! 2. open the set scratch file ! 2. read the set file line by line ! 3. call blank_compress_lower_case() to construct a coco statement ! 4. ignore coco comments ! 5. call process_set_statement() to process coco set statement ! 6. close set file ! ********************************************************************** ! process_set_file() local ! ---------------------------------------------------------------------- ! process the set file statement by statement character( len= buffer_len) :: set_statement ! ---------------------------------------------------------------------- ! signal complete statement logical :: complete ! ********************************************************************** ! process_set_file() text continue ! ---------------------------------------------------------------------- ! open the set file for reading call open_file( set_file) ! ---------------------------------------------------------------------- ! count files processed total% input_files = total% input_files + 1 ! as if finished a complete statement at beginning of file complete = .true. ! ---------------------------------------------------------------------- ! main read set file lines loop read_lines: do ! ---------------------------------------------------------------------- ! read a set file line read( unit= set_file% io_unit, fmt= set_file% format_str, iostat= set_file% io_status, iomsg= processor_msg) set_file% line read_set: if( set_file% io_status > 0 )then call msg_quit( "can't read set file: " // trim( set_file% name_str)) end if read_set ! ---------------------------------------------------------------------- ! read until end of file read_eof: if( set_file% io_status < 0 )then ! reset statement processing for the next file call blank_compress_lower_case( set_statement, null_string) ! if in a statement continuation sequence premature_eof: if( .not. complete )then call msg_quit( "end of file encountered within a continuation sequence") end if premature_eof ! exit the read lines loop exit read_lines end if read_eof ! count set file lines set_file% lines_transfered = set_file% lines_transfered + 1 ! ---------------------------------------------------------------------- ! process set file lines or error if source lines coco_line: if( line( 1: len( coco_key)) == coco_key )then ! count coco lines total% coco_lines = total% coco_lines + 1 ! process set file lines, ignore coco comments coco_statement: if( is_coco_statement( line( len( coco_key) + 1: )) )then ! ---------------------------------------------------------------------- ! read a complete statement line by line call gather_coco_statement( line, set_statement, complete) ! if not yet a complete statement go get the rest of it get_statement: if( .not. complete )then cycle read_lines end if get_statement ! process the complete set file statement call process_set_statement( set_statement) ! process set file lines, ignore coco comments end if coco_statement ! source line in set file else coco_line allow_blank_lines: if( line /= blank .or. .not. complete )then call msg_quit( "source lines are not allowed in the set file") end if allow_blank_lines ! end processing set statements end if coco_line ! ---------------------------------------------------------------------- ! end main read set file lines loop end do read_lines total% input_lines = total% input_lines + set_file% lines_transfered ! ---------------------------------------------------------------------- ! close the set file call close_file( set_file) ! ---------------------------------------------------------------------- ! process_set_file() exit return ! ********************************************************************** ! process_set_file() end subroutine process_set_file ! ********************************************************************** ! ********************************************************************** ! copy_set_file() copy set file to output file subroutine copy_set_file() ! ********************************************************************** ! copy_set_file() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! open the set file call open_file( set_file) ! ---------------------------------------------------------------------- ! count lines correctly when appending the set file to the output set_file% lines_transfered = 0 ! copy each line copy_lines: do ! read a line read( unit= set_file% io_unit, fmt= set_file% format_str, iostat= set_file% io_status, iomsg= processor_msg) set_file% line read_set_file: if( set_file% io_status > 0 )then call msg_quit( "can't copy set file") ! read entire set file else if( set_file% io_status < 0 )then read_set_file exit copy_lines end if read_set_file ! count lines for possible line numbering set_file% lines_transfered = set_file% lines_transfered + 1 ! write a line call write_coco_line( output_file) end do copy_lines ! ---------------------------------------------------------------------- ! close the set file call close_file( set_file) ! ---------------------------------------------------------------------- ! copy_set_file() exit return ! ********************************************************************** ! copy_set_file() end subroutine copy_set_file ! ********************************************************************** ! ********************************************************************** ! %%% process statements many of which may appear only in the set file ! ********************************************************************** ! ********************************************************************** ! process_set_statement() process set line subroutine process_set_statement( set_stmt) ! ********************************************************************** ! process_set_statement() interface ! ---------------------------------------------------------------------- ! the statement string from the set file character( len= *), intent( in) :: set_stmt ! ********************************************************************** ! entry: set_stmt is blank_compress_lower_case set statement past the coco key ! "alter:..." | "integer..." | "logical..." | "directory'...'" | "form:..." | ! "input'...'" | "keys:..." | "logfile'...'" | "mark:..." | "number:..." | ! "output'...'" | "post:..." | "report:..." | "verbose:..." | "wrap:..." ! exit: set_stmt is processed or error exit ! ********************************************************************** ! process_set_statement() text continue ! ---------------------------------------------------------------------- ! catergorize set file statement: alter, integer, logical, directory, wrap ! ---------------------------------------------------------------------- ! if the directive is an alter directive which_directive: if( set_stmt( 1: len( alter_str)) == alter_str )then call process_alter_directive( set_stmt( len( alter_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file integer declaration else if( set_stmt( 1: len( integer_str)) == integer_str )then which_directive call process_sf_integer_declaration( set_stmt( len( integer_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! integer constant declaration else if( set_stmt( 1: len( integer_constant_str)) == integer_constant_str )then which_directive call process_sf_integer_declaration( set_stmt( len( integer_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! if the directive is a set file logical declaration else if( set_stmt( 1: len( logical_str)) == logical_str )then which_directive call process_sf_logical_declaration( set_stmt( len( logical_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! logical constant declaration else if( set_stmt( 1: len( logical_constant_str)) == logical_constant_str )then which_directive call process_sf_logical_declaration( set_stmt( len( logical_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! if the directive is a set file directory directive else if( set_stmt( 1: len( directory_str)) == directory_str )then which_directive call process_directory_directive( set_stmt( len( directory_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file form directive else if( set_stmt( 1: len( form_str)) == form_str )then which_directive call process_form_directive( set_stmt( len( form_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file input directive else if( set_stmt( 1: len( input_str)) == input_str )then which_directive call process_input_directive( set_stmt( len( input_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file keys directive else if( set_stmt( 1: len( keys_str)) == keys_str )then which_directive call process_key_directive( set_stmt( len( keys_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file log file directive else if( set_stmt( 1: len( logfile_str)) == logfile_str )then which_directive call process_logfile_directive( set_stmt( len( logfile_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file mark: directive else if( set_stmt( 1: len( mark_str)) == mark_str )then which_directive call process_mark_directive( set_stmt( len( mark_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file number: directive else if( set_stmt( 1: len( number_str)) == number_str )then which_directive call process_number_directive( set_stmt( len( number_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file output directive else if( set_stmt( 1: len( output_str)) == output_str )then which_directive call process_output_directive( set_stmt( len( output_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file post: directive else if( set_stmt( 1: len( post_str)) == post_str )then which_directive call process_post_directive( set_stmt( len( post_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file report: directive else if( set_stmt( 1: len( summary_str)) == summary_str )then which_directive call process_summary_directive( set_stmt( len( summary_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file verbose directive else if( set_stmt( 1: len( verbose_str)) == verbose_str )then which_directive call process_verbose_directive( set_stmt( len( verbose_str) + 1: )) ! ---------------------------------------------------------------------- ! if the directive is a set file wrap directive else if( set_stmt( 1: len( wrap_str)) == wrap_str )then which_directive call process_wrap_directive( set_stmt( len( wrap_str) + 1: )) ! ---------------------------------------------------------------------- ! otherwise complain about the unknown directive else which_directive call msg_quit( "unknown set file directive: " // trim( set_stmt)) ! catergorize set file statement: alter or integer or logical or extension end if which_directive ! ---------------------------------------------------------------------- ! process_set_statement() exit return ! ********************************************************************** ! process_set_statement() end subroutine process_set_statement ! ********************************************************************** ! ********************************************************************** ! process_alter_directive() process alter directives subroutine process_alter_directive( alter_dir) ! ********************************************************************** ! process_alter_directive() interface ! ---------------------------------------------------------------------- ! the alter directive from the set file character( len= *), intent( in) :: alter_dir ! ********************************************************************** ! entry: alter_dir is blank_compress_lower_case alter directive past the colon ! "delete" | "blank" | "shift0" | "shift1" | "shift3" ! exit: alter_dir is processed or error exit ! ********************************************************************** ! process_alter_directive() constants ! ---------------------------------------------------------------------- ! possible alter strings character( len= *), parameter :: delete_str = 'delete' character( len= *), parameter :: blank_str = 'blank' character( len= *), parameter :: shift0_str = 'shift0' character( len= *), parameter :: shift1_str = 'shift1' character( len= *), parameter :: shift3_str = 'shift3' ! ********************************************************************** ! process_alter_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_alter_statements = .false. ! ********************************************************************** ! process_alter_directive() text continue ! ---------------------------------------------------------------------- ! only one alter directive per set file too_many_alters: if( too_many_alter_statements )then call msg_quit( "too many alter statements") else too_many_alters too_many_alter_statements = .true. end if too_many_alters ! if the alter state has not been set from the command line not_set: if( options% alter_state == alter_none )then ! ---------------------------------------------------------------------- ! legal alter statement or error ! ---------------------------------------------------------------------- ! decode alter state alter_value_str: select case( alter_dir) ! alter delete case( delete_str) alter_value_str options% alter_state = alter_delete ! alter blank case( blank_str) alter_value_str options% alter_state = alter_blank ! alter shift1 case( shift1_str) alter_value_str options% alter_state = alter_shift_1 ! alter shift0 case( shift0_str) alter_value_str options% alter_state = alter_shift_0 ! alter shift3 case( shift3_str) alter_value_str options% alter_state = alter_shift_3 ! unknown alter case default alter_value_str call msg_quit( "unknown alter directive: " // trim( alter_dir)) ! legal alter statement or error end select alter_value_str end if not_set ! ---------------------------------------------------------------------- ! process_alter_directive() exit return ! ********************************************************************** ! process_alter_directive() end subroutine process_alter_directive ! ********************************************************************** ! ********************************************************************** ! process_form_directive() process form directives subroutine process_form_directive( form_dir) ! ********************************************************************** ! process_form_directive() interface ! ---------------------------------------------------------------------- ! the wrap directive from the set file character( len= *), intent( in) :: form_dir ! ********************************************************************** ! entry: wrap_dir is blank_compress_lower_case wrap directive ! it must be a number string ! exit: wrap_dir is processed or error exit ! ********************************************************************** ! process_form_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_form_statements = .false. ! check for characters after directive integer :: next_char ! ********************************************************************** ! process_form_directive() text continue ! ---------------------------------------------------------------------- ! only one form statement per set file too_many_forms: if( too_many_form_statements )then call msg_quit( "too many form statements") else too_many_forms too_many_form_statements = .true. end if too_many_forms ! ---------------------------------------------------------------------- ! process form value if not already set on command line forms: if( form_dir( 1: len( free_str)) == free_str )then ! check directive for correctness and use value from command line or default next_char = len( free_str) + 1 else if( form_dir( 1: len( fixed_str)) == fixed_str )then forms ! check directive for correctness and use fixed form options% free_form = .false. next_char = len( fixed_str) + 1 else forms ! directive not correct call msg_quit( "bad form: " // trim( form_dir)) end if forms ! error if characters after directive error_chars: if( form_dir( next_char: ) /= blank )then call msg_quit( "extra characters after form directive: " // trim( form_dir)) end if error_chars ! ---------------------------------------------------------------------- ! process_form_directive() exit return ! ********************************************************************** ! process_form_directive() end subroutine process_form_directive ! ********************************************************************** ! ********************************************************************** ! process_directory_directive() process include directory options subroutine process_directory_directive( directory_dir) ! ********************************************************************** ! process_directory_directive() interface ! ---------------------------------------------------------------------- ! the directory directive from the set file character( len= *), intent( in) :: directory_dir ! ********************************************************************** ! entry: directory_opt is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_opt is on the list ! ********************************************************************** ! process_directory_directive() local ! ---------------------------------------------------------------------- ! point to a directory type type( path_t), pointer :: directory_ptr ! the name of a directory character( len= file_name_len) :: name_str ! count length of quoted string integer :: directive_len ! count length of unquoted string integer :: name_len ! ********************************************************************** ! process_directory_directive() text continue ! ---------------------------------------------------------------------- ! unquote string to find path string call unquote_string( directory_dir, name_str, directive_len, name_len ) badly_quoted: if( name_len == 0 )then call msg_quit( "null directory name: " // trim( directory_dir) ) else if( directive_len > len_trim( directory_str) )then badly_quoted call msg_quit( "badly quoted directory name: " // trim( directory_dir) ) end if badly_quoted ! ---------------------------------------------------------------------- ! if name is already on the path call seek_directory( name_str, directory_ptr) on_list_or_add: if( associated( directory_ptr) )then call msg_continue( "redundant include directory ignored: " // trim( directory_dir) ) ! if name is not already on the path else on_list_or_add call add_directory( name_str) end if on_list_or_add ! ---------------------------------------------------------------------- ! process_directory_directive() exit return ! ********************************************************************** ! process_directory_directive() end subroutine process_directory_directive ! ********************************************************************** ! ********************************************************************** ! seek_directory() return a pointer to directory_str or null() subroutine seek_directory( name_str, directory_ptr) ! ********************************************************************** ! seek_directory() interface ! ---------------------------------------------------------------------- ! the name of the directory to seek character( len= *), intent( in) :: name_str ! a pointer to the directory entry if found or null() type( path_t), pointer :: directory_ptr ! ********************************************************************** ! entry: directory_str is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_str is on the list ! ********************************************************************** ! seek_directory() text continue ! ---------------------------------------------------------------------- ! search from beginning to end of path list nullify( directory_ptr) directory_ptr => first_directory ! if the name is already in the path scan_path: do if( .not. associated( directory_ptr) ) exit scan_path found_name: if( name_str == directory_ptr% name_str )then exit scan_path end if found_name directory_ptr => directory_ptr% next end do scan_path ! ---------------------------------------------------------------------- ! seek_directory() exit return ! ********************************************************************** ! seek_directory() end subroutine seek_directory ! ********************************************************************** ! ********************************************************************** ! add_directory() return a pointer to directory_str or null() subroutine add_directory( directory_str) ! ********************************************************************** ! add_directory() interface ! ---------------------------------------------------------------------- ! the name of the directory to add to the directory list character( len= *), intent( in) :: directory_str ! ********************************************************************** ! entry: directory_str is a directory to be added to the list ! of directories to be searched for inlcude files ! exit: directory_str is on the list ! ********************************************************************** ! add_directory() local ! ---------------------------------------------------------------------- ! end of linked list, null() if no linked list yet type( path_t), save, pointer :: current_directory => null() ! check allocation status integer :: astat ! ********************************************************************** ! add_directory() text continue ! ---------------------------------------------------------------------- ! append to list start_or_append: if( associated( first_directory) )then allocate( current_directory% next, stat= astat, errmsg= processor_msg) append_status: if( astat > 0 )then call msg_quit( "can't append to include path list: " // trim( directory_str) ) end if append_status current_directory => current_directory% next ! start list else start_or_append allocate( first_directory, stat= astat, errmsg= processor_msg) start_status: if( astat > 0 )then call msg_quit( "can't start path list: " // trim( directory_str) ) end if start_status current_directory => first_directory end if start_or_append ! update new entry current_directory% name_str = directory_str current_directory% times_accessed = 0 nullify( current_directory% next) ! ---------------------------------------------------------------------- ! add_directory() exit return ! ********************************************************************** ! add_directory() end subroutine add_directory ! ********************************************************************** ! ********************************************************************** ! process_input_directive() process input file directives subroutine process_input_directive( input_dir) ! ********************************************************************** ! process_input_directive() interface ! ---------------------------------------------------------------------- ! the input directive from the set file character( len= *), intent( in) :: input_dir ! ********************************************************************** ! entry: input_dir is a file file to be listed as an input file ! exit: input_dir is on the list ! ********************************************************************** ! process_input_directive() local ! ---------------------------------------------------------------------- ! the name of the file to be opened character( len= file_name_len) :: input_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len ! check whether the scratch file for names is already open logical :: name_open ! ********************************************************************** ! process_input_directive() text continue ! ---------------------------------------------------------------------- ! unquote string on directive call unquote_string( input_dir, input_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on input directive: " // trim( input_dir) ) else if( unquoted_len > len_trim( input_dir) )then badly_quoted call msg_quit( "badly quoted name found on input directive: " // trim( input_dir) ) end if badly_quoted ! ---------------------------------------------------------------------- ! if input named on command line ignore the directive already_named: if( input_file% named_file )then call msg_continue( "command line overrides set file, input directive ignored: " // trim( input_dir) ) ! if input not named on command line open the named file else already_named number_of_names = number_of_names + 1 inquire( unit= name_file% io_unit, opened= name_open) open_first: if( .not. name_open )then call open_scratch( name_file) end if open_first write( unit= name_file% io_unit, iostat= name_file% io_status, iomsg= processor_msg) input_name end if already_named ! ---------------------------------------------------------------------- ! process_input_directive() exit return ! ********************************************************************** ! process_input_directive() end subroutine process_input_directive ! ********************************************************************** ! ********************************************************************** ! process_key_directive() process keys directives subroutine process_key_directive( key_dir) ! ********************************************************************** ! process_key_directive() interface ! ---------------------------------------------------------------------- ! the key characters from the set file or command line character( len= *), intent( in) :: key_dir ! ********************************************************************** ! entry: cc + blanks ! exit: keys characters processed is processed or error exit ! ********************************************************************** ! process_key_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_keys_directives = .false. ! ********************************************************************** ! process_key_directive() text continue ! ---------------------------------------------------------------------- ! only one key statement per set file too_many_keys: if( too_many_keys_directives )then call msg_quit( "too many keys statements") else too_many_keys too_many_keys_directives = .true. end if too_many_keys ! ---------------------------------------------------------------------- ! process number switch on_off: if( key_dir( 3: ) == blank )then options% keychars = key_dir( 1: 2) else on_off call msg_quit( "extra characters at end of key directive: " // trim( key_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_key_directive() exit return ! ********************************************************************** ! process_key_directive() end subroutine process_key_directive ! ********************************************************************** ! ********************************************************************** ! process_logfile_directive() process log file directive subroutine process_logfile_directive( logfile_dir) ! ********************************************************************** ! process_logfile_directive() interface ! ---------------------------------------------------------------------- ! the logfile directive from the set file character( len= *), intent( in) :: logfile_dir ! ********************************************************************** ! entry: logfile_opt is a file file to be opened as the log file ! exit: logfile_opt is on the list ! ********************************************************************** ! process_logfile_directive() local ! ---------------------------------------------------------------------- ! the name of the file to be opened character( len= file_name_len) :: logfile_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len ! count number of some statements to disallow more than one logical, save :: too_many_logfile_statements = .false. ! ********************************************************************** ! process_logfile_directive() text continue ! ---------------------------------------------------------------------- ! only one log file statement per set file too_many_logfiles: if( too_many_logfile_statements )then call msg_quit( "too many log file statements") else too_many_logfiles too_many_logfile_statements = .true. end if too_many_logfiles ! unquote string on directive call unquote_string( logfile_dir, logfile_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on log file directive: " // trim( logfile_dir)) else if( unquoted_len > len_trim( logfile_dir) )then badly_quoted call msg_quit( "badly quoted name found on log file directive: " // trim( logfile_dir)) end if badly_quoted ! ---------------------------------------------------------------------- ! if log file named on command line ignore the directive already_named: if( log_file% named_file )then call msg_continue( "command line overrides set file, log file directive ignored: " // trim( logfile_dir) ) ! if log file not named on command line open the named file else already_named log_file% io_unit = log_unit log_file% name_str = logfile_name log_file% named_file = .true. call open_file( log_file) end if already_named ! ---------------------------------------------------------------------- ! process_logfile_directive() exit return ! ********************************************************************** ! process_logfile_directive() end subroutine process_logfile_directive ! ********************************************************************** ! ********************************************************************** ! process_mark_directive() process mark directives subroutine process_mark_directive( mark_dir) ! ********************************************************************** ! process_mark_directive() interface ! ---------------------------------------------------------------------- ! the mark directive from the set file character( len= *), intent( in) :: mark_dir ! ********************************************************************** ! entry: mark_dir is blank_compress_lower_case mark directive ! it must be "on" or "off" ! exit: mark_dir is processed or error exit ! ********************************************************************** ! process_mark_directive() local ! ---------------------------------------------------------------------- ! count mark of some statements to disallow more than one logical, save :: too_many_mark_statements = .false. ! ********************************************************************** ! process_mark_directive() text continue ! ---------------------------------------------------------------------- ! only one mark statement per set file too_many_mark: if( too_many_mark_statements )then call msg_quit( "too many mark statements") else too_many_mark too_many_mark_statements = .true. end if too_many_mark ! ---------------------------------------------------------------------- ! process mark switch on_off: if( mark_dir == on_str )then options% mark_input = .true. else if( mark_dir == off_str )then on_off options% mark_input = .false. else on_off call msg_quit( "unknown option on mark directive: " // trim( mark_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_mark_directive() exit return ! ********************************************************************** ! process_mark_directive() end subroutine process_mark_directive ! ********************************************************************** ! ********************************************************************** ! process_number_directive() process number directives subroutine process_number_directive( number_dir) ! ********************************************************************** ! process_number_directive() interface ! ---------------------------------------------------------------------- ! the number directive from the set file character( len= *), intent( in) :: number_dir ! ********************************************************************** ! entry: number_dir is blank_compress_lower_case number directive ! it must be "on" or "off" ! exit: number_dir is processed or error exit ! ********************************************************************** ! process_number_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_number_statements = .false. ! ********************************************************************** ! process_number_directive() text continue ! ---------------------------------------------------------------------- ! only one number statement per set file too_many_number: if( too_many_number_statements )then call msg_quit( "too many number statements") else too_many_number too_many_number_statements = .true. end if too_many_number ! ---------------------------------------------------------------------- ! process number switch on_off: if( number_dir == on_str )then options% number_source = .true. else if( number_dir == off_str )then on_off options% number_source = .false. else on_off call msg_quit( "unknown option on number directive: " // trim( number_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_number_directive() exit return ! ********************************************************************** ! process_number_directive() end subroutine process_number_directive ! ********************************************************************** ! ********************************************************************** ! process_output_directive() process output directive subroutine process_output_directive( output_dir) ! ********************************************************************** ! process_output_directive() interface ! ---------------------------------------------------------------------- ! the output directive from the set file character( len= *), intent( in) :: output_dir ! ********************************************************************** ! entry: output_dir is a file file to be opened as the output file ! exit: output_dir is set ! ********************************************************************** ! process_output_directive() local ! ---------------------------------------------------------------------- ! the name of the file to be opened character( len= file_name_len) :: output_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len ! count number of some statements to disallow more than one logical, save :: too_many_output_statements = .false. ! ********************************************************************** ! process_output_directive() text continue ! ---------------------------------------------------------------------- ! only one log file statement per set file too_many_outputs: if( too_many_output_statements )then call msg_quit( "too many output statements") else too_many_outputs too_many_output_statements = .true. end if too_many_outputs ! unquote string on directive call unquote_string( output_dir, output_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on output directive: " // trim( output_dir) ) else if( unquoted_len > len_trim( output_dir) )then badly_quoted call msg_quit( "badly quoted name found on output directive: " // trim( output_dir) ) end if badly_quoted ! ---------------------------------------------------------------------- ! if log file named on command line ignore the directive already_named: if( output_file% named_file )then call msg_continue( "command line overrides set file, output directive ignored: " // trim( output_dir) ) ! if log file not named on command line open the named file else already_named number_of_names = number_of_names + 1 output_file% io_unit = write_unit output_file% name_str = output_name output_file% named_file = .true. end if already_named ! ---------------------------------------------------------------------- ! process_output_directive() exit return ! ********************************************************************** ! process_output_directive() end subroutine process_output_directive ! ********************************************************************** ! ********************************************************************** ! process_post_directive() process post directives subroutine process_post_directive( post_dir) ! ********************************************************************** ! process_post_directive() interface ! ---------------------------------------------------------------------- ! the post directive from the set file character( len= *), intent( in) :: post_dir ! ********************************************************************** ! entry: post_dir is blank_compress_lower_case post directive ! it must be "on" or "off" ! exit: post_dir is processed or error exit ! ********************************************************************** ! process_post_directive() local ! ---------------------------------------------------------------------- ! count post of some statements to disallow more than one logical, save :: too_many_post_statements = .false. ! ********************************************************************** ! process_post_directive() text continue ! ---------------------------------------------------------------------- ! only one post statement per set file too_many_post: if( too_many_post_statements )then call msg_quit( "too many post statements") else too_many_post too_many_post_statements = .true. end if too_many_post ! ---------------------------------------------------------------------- ! process post switch on_off: if( post_dir == on_str )then options% postpend_setfile = .true. else if( post_dir == off_str )then on_off options% postpend_setfile = .false. else on_off call msg_quit( "unknown option on post directive: " // trim( post_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_post_directive() exit return ! ********************************************************************** ! process_post_directive() end subroutine process_post_directive ! ********************************************************************** ! ********************************************************************** ! process_summary_directive() process report directives subroutine process_summary_directive( report_dir) ! ********************************************************************** ! process_summary_directive() interface ! ---------------------------------------------------------------------- ! the srap directive from the set file character( len= *), intent( in) :: report_dir ! ********************************************************************** ! entry: report_dir is blank_compress_lower_case report directive ! it must be "on" or "off" ! exit: report_dir is processed or error exit ! ********************************************************************** ! process_summary_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_report_statements = .false. ! ********************************************************************** ! process_summary_directive() text continue ! ---------------------------------------------------------------------- ! only one report statement per set file too_many_reports: if( too_many_report_statements )then call msg_quit( "too many report statements") else too_many_reports too_many_report_statements = .true. end if too_many_reports ! ---------------------------------------------------------------------- ! process report switch on_off: if( report_dir == on_str )then options% print_report = .true. else if( report_dir == off_str)then on_off options% print_report = .false. else on_off call msg_quit( "unknown option on report directive: " // trim( report_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_summary_directive() exit return ! ********************************************************************** ! process_summary_directive() end subroutine process_summary_directive ! ********************************************************************** ! ********************************************************************** ! process_verbose_directive() process verbose directives subroutine process_verbose_directive( verbose_dir) ! ********************************************************************** ! process_verbose_directive() interface ! ---------------------------------------------------------------------- ! the verbose directive from the set file character( len= *), intent( in) :: verbose_dir ! ********************************************************************** ! entry: verbose_dir is blank_compress_lower_case verbose directive ! it must be "on" or "off" ! exit: verbose_dir is processed or error exit ! ********************************************************************** ! process_verbose_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_verbose_statements = .false. ! ********************************************************************** ! process_verbose_directive() text continue ! ---------------------------------------------------------------------- ! only one verbose statement per set file too_many_verboses: if( too_many_verbose_statements )then call msg_quit( "too many verbose statements") else too_many_verboses too_many_verbose_statements = .true. end if too_many_verboses ! ---------------------------------------------------------------------- ! process verbose switch if not already set on command line on_off: if( verbose_dir == on_str )then options% verbose_mode = .true. else if( verbose_dir == off_str)then on_off options% verbose_mode = .false. else on_off call msg_quit( "unknown option on verbose directive: " // trim( verbose_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_verbose_directive() exit return ! ********************************************************************** ! process_verbose_directive() end subroutine process_verbose_directive ! ********************************************************************** ! ********************************************************************** ! process_wrap_directive() process wrap directives subroutine process_wrap_directive( wrap_dir) ! ********************************************************************** ! process_wrap_directive() interface ! ---------------------------------------------------------------------- ! the wrap directive from the set file character( len= *), intent( in) :: wrap_dir ! ********************************************************************** ! entry: wrap_dir is blank_compress_lower_case wrap directive ! it must be "on" or "off" ! exit: wrap_dir is processed or error exit ! ********************************************************************** ! process_wrap_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_wrap_statements = .false. ! ********************************************************************** ! process_wrap_directive() text continue ! ---------------------------------------------------------------------- ! only one wrap statement per set file too_many_wrap: if( too_many_wrap_statements )then call msg_quit( "too many wrap statements") else too_many_wrap too_many_wrap_statements = .true. end if too_many_wrap ! ---------------------------------------------------------------------- ! process wrap switch on_off: if( wrap_dir == on_str )then options% wrapping_lines = .true. else if( wrap_dir == off_str )then on_off options% wrapping_lines = .false. else on_off call msg_quit( "unknown option on wrap directive: " // trim( wrap_dir) ) end if on_off ! ---------------------------------------------------------------------- ! process_wrap_directive() exit return ! ********************************************************************** ! process_wrap_directive() end subroutine process_wrap_directive ! ********************************************************************** ! ********************************************************************** ! get_sf_symbol_name() extract symbol name and determine its length subroutine get_sf_symbol_name( decl_stmt, symbol_name, name_len) ! ********************************************************************** ! get_sf_symbol_name() interface ! ---------------------------------------------------------------------- ! a declaration statement with a symbol name character( len= *), intent( in) :: decl_stmt ! the name of the symbol character( len= *), intent( out) :: symbol_name ! the length of the symbol name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name=..." ! exit: a valid symbol name and its length or error exit ! ********************************************************************** ! get_sf_symbol_name() constants ! ---------------------------------------------------------------------- ! characters which must end a symbol name character( len= *), parameter :: end_of_name = equals // blank ! ********************************************************************** ! get_sf_symbol_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_sf_symbol_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) name_error: if( char_idx == 0 )then call msg_quit( "can't find name in set file declaration: " // trim( decl_stmt)) end if name_error ! length of name is one less than first character past name name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is a valid new name call valid_new_sf_name( decl_stmt( 1: name_len)) ! return name symbol_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_sf_symbol_name() exit return ! ********************************************************************** ! get_sf_symbol_name() end subroutine get_sf_symbol_name ! ********************************************************************** ! ********************************************************************** ! process_sf_integer_declaration() process integer declarations subroutine process_sf_integer_declaration( integer_stmt, is_const) ! ********************************************************************** ! process_sf_integer_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: integer_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_stmt is blank_compress_lower_case integer declaration past the integer keyword ! "::..." | ",parameter::..." ! exit: int_stmt is processed or error exit ! ********************************************************************** ! process_sf_integer_declaration() constants ! ---------------------------------------------------------------------- ! mark the end of a definition character( len= *), parameter :: end_of_def = comma // blank ! ********************************************************************** ! process_sf_integer_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: def_len ! ********************************************************************** ! process_sf_integer_declaration() text continue ! ---------------------------------------------------------------------- next_char = 1 ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string def_len = scan( integer_stmt( next_char: ), end_of_def) + next_char - 1 symbol_str = integer_stmt( next_char: def_len - 1) ! extract symbol name call get_symbol_name( symbol_str, symbol_name, symbol_len) ! check for valid new set file name call valid_new_sf_name( symbol_name( 1: symbol_len)) ! store symbol in symbol list call add_sf_integer( symbol_str( symbol_len + 1: def_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( integer_stmt( def_len: def_len) == blank )then exit all_symbols end if all_done ! move to next symbol next_char = def_len + 1 ! extract all symbols on directive end do all_symbols ! ---------------------------------------------------------------------- ! process_sf_integer_declaration() exit return ! ********************************************************************** ! process_sf_integer_declaration() end subroutine process_sf_integer_declaration ! ********************************************************************** ! ********************************************************************** ! add_sf_integer() store integer declaration in symbol table subroutine add_sf_integer( int_decl_str, integer_name, is_const) ! ********************************************************************** ! add_sf_integer() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: int_decl_str ! the symbol name character( len= *), intent( in) :: integer_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case integer declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: integer declaration is added to the integer symbol list or error exit ! ********************************************************************** ! add_sf_integer() local ! ---------------------------------------------------------------------- ! expression defining integer symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! add_sf_integer() text continue ! ---------------------------------------------------------------------- ! allocate new integer allocate( integer_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate set file integer: " // trim( integer_name)) end if alloc_error ! build new integer on list subsequent_or_first: if( associated( first_sf_symbol) )then last_sf_symbol% next => integer_ptr last_sf_symbol => last_sf_symbol% next else subsequent_or_first first_sf_symbol => integer_ptr last_sf_symbol => first_sf_symbol end if subsequent_or_first nullify( integer_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members integer_ptr% name_str = integer_name integer_ptr% declared_file = current_file% name_str integer_ptr% declared_line = current_file% lines_transfered ! ---------------------------------------------------------------------- ! store whether integer is a constant integer_ptr% constant = is_const ! determine if declaration specifies a value got_eq: if( len( int_decl_str) > 0 )then integer_ptr% defined = int_decl_str( 1: len( equals)) == equals else got_eq integer_ptr% defined = .false. end if got_eq ! there must be a value in the set file to compute and store constant_value: if( .not. integer_ptr% defined )then call msg_quit( "a set file integer constant must have a value: " // trim( integer_name) // trim( int_decl_str) ) end if constant_value ! decode the value process_value: if( integer_ptr% defined )then all_constants = .true. expr_str = int_decl_str( len( equals) + 1: ) call eval_int_expr( expr_str, integer_ptr% integer_value) non_const: if( integer_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define set file integer constant: " // trim( integer_name)) end if non_const integer_ptr% defined_file = current_file% name_str integer_ptr% defined_line = current_file% lines_transfered end if process_value ! ---------------------------------------------------------------------- ! add_sf_integer() exit return ! ********************************************************************** ! add_sf_integer() end subroutine add_sf_integer ! ********************************************************************** ! ********************************************************************** ! process_sf_logical_declaration() process logical declarations subroutine process_sf_logical_declaration( logical_stmt, is_const) ! ********************************************************************** ! process_sf_logical_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the logical declaration character( len= *), intent( in) :: logical_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: logical_stmt is blank_compress_lower_case logical declaration past the logical keyword ! "::..." | ",parameter::..." ! exit: logical declaration is processed or error exit ! ********************************************************************** ! process_sf_logical_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: decl_len ! ********************************************************************** ! process_sf_logical_declaration() text continue next_char = 1 ! ---------------------------------------------------------------------- ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string decl_len = scan( logical_stmt( next_char: ), end_of_decl) + next_char - 1 symbol_str = logical_stmt( next_char: decl_len - 1) ! extract symbol name call get_sf_symbol_name( symbol_str, symbol_name, symbol_len) ! check for valid new set file name call valid_new_sf_name( symbol_name( 1: symbol_len)) ! store symbol in symbol list call add_sf_logical( symbol_str( symbol_len + 1: decl_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( logical_stmt( decl_len: decl_len) == blank )then exit all_symbols end if all_done ! reset for next symbol next_char = decl_len + 1 ! extract all symbols on directive end do all_symbols ! ---------------------------------------------------------------------- ! process_sf_logical_declaration() exit return ! ********************************************************************** ! process_sf_logical_declaration() end subroutine process_sf_logical_declaration ! ********************************************************************** ! ********************************************************************** ! add_sf_logical() store logical declaration in symbol table subroutine add_sf_logical( log_decl_str, logical_name, is_const) ! ********************************************************************** ! add_sf_logical() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: log_decl_str ! the valid logical name character( len= *), intent( in) :: logical_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case logical declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_sf_logical() local ! ---------------------------------------------------------------------- ! expression defining logical symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! add_sf_logical() text continue ! ---------------------------------------------------------------------- ! allocate new logical allocate( logical_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate set file logical: " // trim( logical_name)) end if alloc_error ! build new logical on list subsequent_or_first: if( associated( first_sf_symbol) )then last_sf_symbol% next => logical_ptr last_sf_symbol => last_sf_symbol% next else subsequent_or_first first_sf_symbol => logical_ptr last_sf_symbol => first_sf_symbol end if subsequent_or_first nullify( logical_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members logical_ptr% name_str = logical_name logical_ptr% declared_file = current_file% name_str logical_ptr% declared_line = current_file% lines_transfered ! ---------------------------------------------------------------------- ! store whether logical is a constant logical_ptr% constant = is_const ! store whether symbol is declared in the set file logical_ptr% sf_defined = .false. ! determine if declaration specifies a value got_eq: if( len( log_decl_str) > 0 )then logical_ptr% defined = log_decl_str( 1: len( equals)) == equals else got_eq logical_ptr% defined = .false. end if got_eq ! there must be a value in the set file to compute and store constant_value: if( .not. logical_ptr% defined )then call msg_quit( "a set file logical constant must have a value: " & // trim( logical_name) // trim( log_decl_str) ) end if constant_value ! decode the value process_value: if( logical_ptr% defined )then all_constants = .true. expr_str = log_decl_str( len( equals) + 1: ) call eval_log_expr( expr_str, logical_ptr% logical_value) non_const: if( logical_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define logical constant: " // trim( logical_name)) end if non_const logical_ptr% defined_file = current_file% name_str logical_ptr% defined_line = current_file% lines_transfered end if process_value ! ---------------------------------------------------------------------- ! add_sf_logical() exit return ! ********************************************************************** ! add_sf_logical() end subroutine add_sf_logical ! ********************************************************************** ! ********************************************************************** ! %%% read and write files, and process coco lines and statements ! ********************************************************************** ! ********************************************************************** ! process_input_file() reads a coco source file, recurse upon include files recursive subroutine process_input_file( this_file) ! ********************************************************************** ! process_input_file() interface ! ---------------------------------------------------------------------- ! the file to be processed type( file_t), target, intent( in out) :: this_file ! ********************************************************************** ! entry: source file to be processed ! exit: source file has been processed or error ! ********************************************************************** ! process_input_file() local ! ---------------------------------------------------------------------- ! statement buffer character( len= buffer_len) :: statement ! signal complete statement logical :: complete ! get if block nesting correct at file open and close type( if_t), pointer :: file_if_level ! store to line macro character( len= conversion_len) :: line_str ! ********************************************************************** ! process_input_file() text continue ! the if level at the start of this file file_if_level => if_construct ! open source file call open_file( this_file) ! count files total% input_files = total% input_files + 1 ! set file predefined macro predefined_macros( file_idx)% macro_value = this_file% name_str ! as if finished a complete statement at beginning of file complete = .true. ! ---------------------------------------------------------------------- ! main read lines loop read_lines: do ! read from input file read( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & this_file% line read_source: if( this_file% io_status > 0 )then call msg_quit( "can't read input file: " // trim( this_file% name_str)) end if read_source ! ---------------------------------------------------------------------- ! read until end of file or complete statement read_eof: if( this_file% io_status < 0 )then call blank_compress_lower_case( statement, null_string) continuation_eof: if( .not. complete )then call msg_quit( "end of file encountered in a continued coco statement") end if continuation_eof exit read_lines end if read_eof ! ---------------------------------------------------------------------- ! count lines this_file% lines_transfered = this_file% lines_transfered + 1 write( unit= line_str, fmt= conversion_fmt) this_file% lines_transfered predefined_macros( line_idx)% macro_value = adjustl( line_str) ! process coco lines or source lines process_coco: if( line( 1: len( coco_key)) == coco_key )then ! count lines total% coco_lines = total% coco_lines + 1 ! write coco line to the output call write_coco_line( output_file) ! if line is not a coco comment coco_statement: if( is_coco_statement( line( len( coco_key) + 1: )) )then ! read a complete statement call gather_coco_statement( line, statement, complete) ! ---------------------------------------------------------------------- ! process coco directives ! ---------------------------------------------------------------------- ! directive is a coco include directive process_directive: if( statement( 1: len( include_str)) == include_str )then ! cannot continue an include line continue_include: if( .not. complete )then call msg_quit( "include line cannot be continued") end if continue_include ! process (possibly recursive) include directives (include 'a' --> include 'b' and so on) call process_include_directive( statement( len( include_str) + 1: )) ! reset current file current_file => this_file ! reset file predefined macro predefined_macros( file_idx)% macro_value = this_file% name_str ! directive is a coco endfile directive else if( statement( 1: len( endfile_str)) == endfile_str )then process_directive ! cannot continue an endfile line continue_endfile: if( .not. complete )then call msg_quit( "endfile line cannot be continued") end if continue_endfile active_endfile: if( if_construct% now_selected )then call process_endfile_directive( statement, file_if_level) exit read_lines end if active_endfile ! process any other directive else process_directive ! if not yet a complete statement go get the rest of it get_statement: if( ( .not. complete) )then cycle read_lines end if get_statement ! process other (not possibly recursive) coco directives call process_coco_statement( statement) end if process_directive ! if line is not a coco comment end if coco_statement ! ---------------------------------------------------------------------- ! process source lines else process_coco ! error if a source line is mixed into a continued coco statement continuation_error: if( .not. complete )then call msg_quit( "source line encountered in a continued coco statement") end if continuation_error ! if within the active block of a coco if construct active_source: if( if_construct% now_selected )then ! if left key characters present, edit source line edit_line: if( index( string= line, substring= l_key) > 0 )then call edit_source_line( line) end if edit_line end if active_source ! copy source lines call write_source_line( output_file) ! end processing coco lines end if process_coco ! end main read lines loop end do read_lines total% input_lines = total% input_lines + this_file% lines_transfered ! ---------------------------------------------------------------------- ! no open if blocks no_blocks: if( .not. associated( if_construct, file_if_level) )then call msg_quit( "badly nested if-block at end of file: " // trim( this_file% name_str)) end if no_blocks nullify( file_if_level) ! end of file call close_file( this_file) ! ---------------------------------------------------------------------- ! process_input_file() exit return ! ********************************************************************** ! process_input_file() end subroutine process_input_file ! ********************************************************************** ! ********************************************************************** ! gather_coco_statement() examine lines and signal a complete statement subroutine gather_coco_statement( line, statement, complete) ! ********************************************************************** ! gather_coco_statement() interface ! ---------------------------------------------------------------------- ! the current input file character( len= *), intent( in) :: line ! the statement as it is built character( len= *), intent( in out) :: statement ! true when a complete statement has been seen logical, intent( out) :: complete ! ********************************************************************** ! entry: statement is a line ! "..." ! exit: statement is accumulated, complete is true when whole ! ********************************************************************** ! gather_coco_statement() local ! ---------------------------------------------------------------------- ! count continuation lines integer, save :: continuation_lines = 0 ! ---------------------------------------------------------------------- ! number of characters processed so far integer, save :: statement_len = 0 ! ********************************************************************** ! gather_coco_statement() text continue ! ---------------------------------------------------------------------- ! blank compress lower case call blank_compress_lower_case( statement, line( len( coco_key) + 1: ) ) ! if statement length hasn't changed and statement is not a comment null_stmt: if( statement_len == len_trim( statement) )then call msg_quit( "null statement encountered in continuation sequence") end if null_stmt ! if not a complete statement yet statement_len = len_trim( statement) ! last character is continuation means more to read to get a complete statement incomplete: if( statement( statement_len: statement_len) == continuation )then ! if too many continuation lines too_many: if( continuation_lines > max_continuations )then call msg_quit( "too many continuations") end if too_many ! count continuation lines continuation_lines = continuation_lines + 1 ! go get the rest of the statement complete = .false. return end if incomplete ! coco statement is complete continuation_lines = 0 statement_len = 0 complete = .true. ! ---------------------------------------------------------------------- ! gather_coco_statement() exit return ! ********************************************************************** ! gather_coco_statement() end subroutine gather_coco_statement ! ********************************************************************** ! ********************************************************************** ! is_coco_statement() true if coco statement is a coco construct and not a coco comment logical function is_coco_statement( coco_stmt) ! ********************************************************************** ! is_coco_statement() interface ! ---------------------------------------------------------------------- ! the coco statement to be categorized character( len= *), intent( in) :: coco_stmt ! ********************************************************************** ! entry: coco_stmt is coco statement past the coco key ! "..." ! exit: true if statement is a coco construct, ! false if statement is a coco comment ! ********************************************************************** ! is_coco_statement() local ! ---------------------------------------------------------------------- ! locations of specific characters integer :: char_idx ! ********************************************************************** ! is_coco_statement() text continue ! ---------------------------------------------------------------------- ! scan from first character (past coco key) for non-whitespace char_idx = verify( coco_stmt, white_space) ! if found other than whitespace white_space_or_comment: if( char_idx > 0 )then ! is construct if first character past the white space is not comment is_coco_statement = coco_stmt( char_idx: char_idx) /= comment ! all whitespace else white_space_or_comment ! is not a construct is_coco_statement = .false. end if white_space_or_comment ! ---------------------------------------------------------------------- ! is_coco_statement() exit return ! ********************************************************************** ! is_coco_statement() end function is_coco_statement ! ********************************************************************** ! ********************************************************************** ! write_coco_line() write a coco line of output subroutine write_coco_line( this_file) ! ********************************************************************** ! write_coco_line() interface ! ---------------------------------------------------------------------- ! the file to receive the output type( file_t), intent( in out) :: this_file ! ********************************************************************** ! entry: out_unit is the logical unit connected to the output file ! coco_line is a line to be written as per the current alter state ! exit: line has been written or error exit ! ********************************************************************** ! write_coco_line() constants ! ---------------------------------------------------------------------- ! line prefix when alter state is shift 3 character( len= *), parameter :: shift3_prefix = '!?>' ! ********************************************************************** ! write_coco_line() local ! ---------------------------------------------------------------------- ! maximum line length character( len= buffer_len) :: line_buffer ! ********************************************************************** ! write_coco_line() text continue ! ---------------------------------------------------------------------- ! write output as per alter state alter_print: select case( options% alter_state) ! delete the line case( alter_delete) alter_print return ! blank line case( alter_blank) alter_print write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & null_string ! comment the line case( alter_shift_0) alter_print line_buffer = comment // this_file% line( len( comment) + 1: ) ! check whether to number the source line want_numbers_shift_0: if( options% number_source )then ! if so, go number the atring call add_number_to_line( line_buffer) end if want_numbers_shift_0 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( line_buffer) ! shift one or comment the line case( alter_shift_1) alter_print line_buffer = comment // this_file% line( 1: len( this_file% line) - len( comment)) ! check whether to number the source line want_numbers_shift_1: if( options% number_source )then ! if so, go number the atring call add_number_to_line( line_buffer) end if want_numbers_shift_1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( line_buffer) ! shift three or comment the line case( alter_shift_3) alter_print line_buffer = shift3_prefix // this_file% line( 1: len( this_file% line) - len( shift3_prefix)) ! check whether to number the source line want_numbers_shift_3: if( options% number_source )then ! if so, go number the atring call add_number_to_line( line_buffer) end if want_numbers_shift_3 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( line_buffer) end select alter_print ! ---------------------------------------------------------------------- ! check write iostat write_this_file: if( this_file% io_status > 0 )then call msg_quit( "error writing source output: " // trim( this_file% name_str) ) end if write_this_file ! ---------------------------------------------------------------------- ! write_coco_line() exit return ! ********************************************************************** ! write_coco_line() end subroutine write_coco_line ! ********************************************************************** ! ********************************************************************** ! write_source_line() write a line of output subroutine write_source_line( this_file) ! ********************************************************************** ! write_source_line() interface ! ---------------------------------------------------------------------- ! the file to receive the output type( file_t), intent( in out) :: this_file ! ********************************************************************** ! entry: out_unit is the logical unit connected to the output file ! source_line is the line of Fortran source to be written ! exit: the line is written or error exit ! ********************************************************************** ! write_source_line() text continue ! ---------------------------------------------------------------------- ! if currently printing output process_line: if( if_construct% now_selected )then ! check whether to number the source line want_numbers: if( options% number_source )then ! if so, go number the atring call add_number_to_line( this_file% line) end if want_numbers ! write source output write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status, iomsg= processor_msg) & trim( this_file% line) ! check for write error write_error: if( this_file% io_status > 0 )then call msg_quit( "error writing source output: " // trim( this_file% name_str) ) end if write_error ! count lines written this_file% lines_transfered = this_file% lines_transfered + 1 total% selected_lines = total% selected_lines + 1 else process_line ! otherwise print as per the alter state call write_coco_line( this_file) total% elided_lines = total% elided_lines + 1 end if process_line ! ---------------------------------------------------------------------- ! write_source_line() exit return ! ********************************************************************** ! write_source_line() end subroutine write_source_line ! ********************************************************************** ! ********************************************************************** ! add_number_to_line() write a line of output subroutine add_number_to_line( output_line) ! ********************************************************************** ! add_number_to_line() interface ! ---------------------------------------------------------------------- ! the file to receive the output character( len= buffer_len), intent( in out) :: output_line ! ********************************************************************** ! entry: output_line is a line of output ! exit: the line has numbers added or error exit ! ********************************************************************** ! add_number_to_line() constants character( len= *), parameter :: name_prefix = '! ' character( len= *), parameter :: number_prefix = ': ' integer, parameter :: number_pad = 1 ! ********************************************************************** ! add_number_to_line() local ! ---------------------------------------------------------------------- ! character line number character( len= conversion_len) :: number_str ! where to put the line numbering integer, save :: number_len = card_image_len ! format a label ! file-name:line-number character( len= file_name_len) :: label ! ********************************************************************** ! add_number_to_line() text continue ! ---------------------------------------------------------------------- ! avoid touching current_file for lines not associated with an input file from_input: if( associated( current_file) )then ! get the line number as a string write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered ! prepare label label = name_prefix // trim( current_file% name_str) // number_prefix // adjustl( number_str) ! pick a length number_len = max( number_len, len_trim( output_line) + number_pad) ! add ! file: number output_line = output_line( 1: number_len) // trim( label) end if from_input ! ---------------------------------------------------------------------- ! add_number_to_line() exit return ! ********************************************************************** ! add_number_to_line() end subroutine add_number_to_line ! ********************************************************************** ! ********************************************************************** ! process_endfile_directive() process a coco endfile directive subroutine process_endfile_directive( endfile_dir, if_ptr) ! ********************************************************************** ! process_endfile_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an endfile directive character( len= *), intent( in) :: endfile_dir ! a pointer to the if block containing the first if block in this source type( if_t), pointer :: if_ptr ! ********************************************************************** ! entry: endfile_dir is blank_compress_lower_case if directive ! exit: the directive is processed or error exit ! ********************************************************************** ! process_endfile_directive() text continue ! ---------------------------------------------------------------------- ! check for a well formed if directive endfile_extra_chars: if( endfile_dir( len( endfile_str) + 1: ) /= blank )then call msg_quit( "extra characters after endfile directive: " // trim( endfile_dir)) end if endfile_extra_chars ! ---------------------------------------------------------------------- ! if this endfile is enclosed within selected lines active_lines: if( if_construct% enclosing% now_selected )then ! reset the if-block state so the next input starts ok pop_ifs: do if( associated( if_construct, if_ptr) ) exit pop_ifs call delete_block() end do pop_ifs end if active_lines ! ---------------------------------------------------------------------- ! process_endfile_directive() exit return ! ********************************************************************** ! process_endfile_directive() end subroutine process_endfile_directive ! ********************************************************************** ! ********************************************************************** ! process_include_directive() process an include directive recursive subroutine process_include_directive( include_dir) ! ********************************************************************** ! process_include_directive() interface ! ---------------------------------------------------------------------- ! the include directive character( len= *), intent( in) :: include_dir ! ********************************************************************** ! entry: inc_name is inlcude file name ! exit: inc_name is inlcude file name with directory prepended ! ********************************************************************** ! process_include_directive() constants ! ---------------------------------------------------------------------- ! mark the beginning and end of include files as per the standard character( len= *), parameter :: begin_inc = '??! include ' character( len= *), parameter :: end_inc = '??! end include ' ! ********************************************************************** ! process_include_directive() local ! ---------------------------------------------------------------------- ! file variable of file named on the include directive type( file_t), target :: include_file ! ---------------------------------------------------------------------- ! length of quoted include file name integer :: construct_len ! length of unquoted include file name integer :: name_len ! ********************************************************************** ! process_include_directive() text continue ! ---------------------------------------------------------------------- ! check the include syntax: unquote the include file name call unquote_string( include_dir, include_file% name_str, construct_len, name_len ) badly_quoted: if( name_len == 0 )then call msg_quit( "null include file name: " // trim( include_dir)) else if( construct_len > len_trim( include_dir) )then badly_quoted call msg_quit( "badly quoted include file name: " // trim( include_dir)) end if badly_quoted ! ---------------------------------------------------------------------- ! if active block, process include directive active_inc: if( if_construct% now_selected )then ! see if the include file exists inquire( file= include_file% name_str, & exist= include_file% named_file, iostat= include_file% io_status, iomsg= processor_msg) inquire_error: if( include_file% io_status > 0 )then call msg_quit( "can't inquire include file: " // trim( include_file% name_str) ) end if inquire_error ! if not found, check directories seek_inc: if( include_file% named_file )then count_include_in_dot = count_include_in_dot + 1 else seek_inc call seek_include_file( include_file) end if seek_inc ! if still not found, complain and quit no_name: if( .not. include_file% named_file )then call msg_quit( "can't find include file: " // trim( include_file% name_str) ) end if no_name ! ---------------------------------------------------------------------- ! build include_file to pass to process_input_file() ! ---------------------------------------------------------------------- ! get new unit include_unit: if( current_file% io_unit == input_unit )then include_file% io_unit = read_unit else include_unit include_file% io_unit = current_file% io_unit + 1 end if include_unit ! include file components include_file% format_str = current_file% format_str include_file% line => null() include_file% io_status = 0 include_file% lines_transfered = 0 include_file% named_file = .true. include_file% create = .false. ! ---------------------------------------------------------------------- ! mark include file in output line = begin_inc // include_file% name_str call write_coco_line( output_file) ! push dummy block on the if block list to catch badly nested if blocks call new_block( phase= include_block) ! prepare to process include file total% include_files = total% include_files + 1 ! process include file call process_input_file( include_file) ! push dummy block on the if block list to catch badly nested if blocks call delete_block( phase= include_block) ! mark include file in output line = end_inc // include_file% name_str call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! if active block, process include directive end if active_inc ! end processing include statement ! ---------------------------------------------------------------------- ! process_include_directive() exit return ! ********************************************************************** ! process_include_directive() end subroutine process_include_directive ! ********************************************************************** ! ********************************************************************** ! seek_include_file() seek inlcude file in directories subroutine seek_include_file( include_file) ! ********************************************************************** ! seek_include_file() interface ! ---------------------------------------------------------------------- ! the include file name to be sought type( file_t), intent( in out) :: include_file ! ********************************************************************** ! entry: include_file is inlcude file name ! exit: include_file is inlcude file name with directory prepended ! ********************************************************************** ! seek_include_file() local ! ---------------------------------------------------------------------- ! pointer to directories on path type( path_t), pointer :: directory ! construct path/names to check for existance character( len= file_name_len) :: trial_name ! ********************************************************************** ! seek_include_file() text continue ! ---------------------------------------------------------------------- ! search list for directory/file nullify( directory) directory => first_directory ! last directory in path is not associated search_path: do if( .not. associated( directory) ) exit search_path ! construct full name trial_name = trim( directory% name_str) // include_file% name_str ! check file existence inquire( file= trial_name, exist= include_file% named_file, iostat= include_file% io_status, iomsg= processor_msg) inquire_error: if( include_file% io_status > 0 )then call msg_quit( "can't inquire include file: " // trim( trial_name)) end if inquire_error ! found file name name_match: if( include_file% named_file )then ! found a file in this directory directory% times_accessed = directory% times_accessed + 1 ! rewrite include file name to include directory include_file% name_str = trial_name exit search_path end if name_match ! file name not yet found so try next directory directory => directory% next end do search_path ! ---------------------------------------------------------------------- ! seek_include_file() exit return ! ********************************************************************** ! seek_include_file() end subroutine seek_include_file ! ********************************************************************** ! ********************************************************************** ! %%% edit Fortran source lines ! ********************************************************************** ! ********************************************************************** ! edit_source_line() edit source lines subroutine edit_source_line( source_line) ! ********************************************************************** ! edit_source_line() interface ! ---------------------------------------------------------------------- ! source line to be edited character( len= *), intent( in out) :: source_line ! ********************************************************************** ! entry: line is a line of Fortran source ! with (possibly) ?file?, ?line?, ?date?, ?time?, ?integer?, ?logical?, ?macro? ! exit: line has any ?macro? etc. strings replaced with their values ! ********************************************************************** ! edit_source_line() local ! ---------------------------------------------------------------------- ! copy of line since editing may expand the line beyond its length character( len= buffer_len) :: edit_line ! make lower case copy of line character( len= buffer_len) :: lower_case_line ! ********************************************************************** ! edit_source_line() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! the line may be expanded by editing, so edit a long buffer edit_line = source_line ! make lower case copy of line lower_case_line = to_lower( source_line) ! ---------------------------------------------------------------------- ! process the predefined macros call edit_coco_strings( edit_line, lower_case_line) ! ---------------------------------------------------------------------- ! replace ?name? with the current integer value of name call edit_integer_strings( edit_line, lower_case_line) call edit_logical_strings( edit_line, lower_case_line) ! ---------------------------------------------------------------------- ! replace ?name? with the current string value of name call edit_macro_strings( edit_line, lower_case_line) ! ---------------------------------------------------------------------- ! remove any line length overflow if( options% wrapping_lines ) call wrap_source_line( edit_line) source_line = edit_line ! ---------------------------------------------------------------------- ! edit_source_line() exit return ! ********************************************************************** ! edit_source_line() end subroutine edit_source_line ! ********************************************************************** ! ********************************************************************** ! edit_coco_strings() process ?coco? strings subroutine edit_coco_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_coco_strings() interface ! ---------------------------------------------------------------------- ! the source line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?integer ! exit: line has any ?name strings replaced with their values ! ********************************************************************** ! edit_coco_strings() local ! ---------------------------------------------------------------------- ! make substring character( len= symbol_name_len) :: search_str integer :: search_len ! find substring index integer :: search_idx ! loop index integer :: i ! ********************************************************************** ! edit_coco_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace remaining predefined macros with their values edit_predefined: do i = 1, size( predefined_macros) search_str = l_key // trim( predefined_macros( i)% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) go_edit: if( search_idx > 0 )then call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), & trim( predefined_macros( i)% macro_value), search_idx) predefined_macros( i)% referenced = .true. predefined_macros( i)% referenced_file = current_file% name_str predefined_macros( i)% referenced_line = current_file% lines_transfered end if go_edit end do edit_predefined ! ---------------------------------------------------------------------- ! edit_coco_strings() exit return ! ********************************************************************** ! edit_coco_strings() end subroutine edit_coco_strings ! ********************************************************************** ! ********************************************************************** ! edit_integer_strings() process ?integer? strings subroutine edit_integer_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_integer_strings() interface ! ---------------------------------------------------------------------- ! the source line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?integer? ! exit: line has any ?name? strings replaced with their values ! ********************************************************************** ! edit_integer_strings() local ! ---------------------------------------------------------------------- ! string containing integer value character( len= conversion_len) :: value_str ! target string to be replaced character( len= target_len) :: search_str ! length of target string integer :: search_len ! point to integers on symbol list type( integer_t), pointer :: integer_ptr ! point to search_str location in line integer :: search_idx ! ********************************************************************** ! edit_integer_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace ?integer? with the current string value of integer nullify( integer_ptr) ! test the occurance of each integer on symbol list each_integer: do call get_next_integer( integer_ptr) if( .not. associated( integer_ptr) ) exit each_integer ! does ?integer? appear on line search_str = l_key // trim( integer_ptr% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) ! if found the target, try to replace it with its value go_integer: if( search_idx > 0 )then ! if integer has a value no_value: if( .not. integer_ptr% defined )then call msg_quit( "edit integer symbol not defined: " // trim( integer_ptr% name_str) ) end if no_value write( unit= value_str, fmt= conversion_fmt) integer_ptr% integer_value value_str = adjustl( value_str) ! go replace the string with its value call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), trim( value_str), & search_idx) end if go_integer end do each_integer ! ---------------------------------------------------------------------- ! edit_integer_strings() exit return ! ********************************************************************** ! edit_integer_strings() end subroutine edit_integer_strings ! ********************************************************************** ! ********************************************************************** ! edit_logical_strings() process ?logical? strings subroutine edit_logical_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_logical_strings() interface ! ---------------------------------------------------------------------- ! the source line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?logical ! exit: line has any ?name strings replaced with their values ! ********************************************************************** ! edit_logical_strings() local ! ---------------------------------------------------------------------- ! string containing logical value character( len= conversion_len) :: value_str ! target string to be replaced character( len= target_len) :: search_str ! length of target string integer :: search_len ! point to logicals on symbol list type( logical_t), pointer :: logical_ptr ! point to search_str location in line integer :: search_idx ! ********************************************************************** ! edit_logical_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace ?logical? with the current string value of logical nullify( logical_ptr) each_logical: do call get_next_logical( logical_ptr) if( .not. associated( logical_ptr) ) exit each_logical ! does ?logical? appear on line search_str = l_key // trim( logical_ptr% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) go_logical: if( search_idx > 0 )then ! if logical has a value no_value: if( .not. logical_ptr% defined )then call msg_quit( "edit logical symbol not defined: " // trim( logical_ptr% name_str) ) end if no_value decode: if( logical_ptr% logical_value )then value_str = true_str else decode value_str = false_str end if decode call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), & trim( value_str), search_idx) end if go_logical end do each_logical ! ---------------------------------------------------------------------- ! edit_logical_strings() exit return ! ********************************************************************** ! edit_logical_strings() end subroutine edit_logical_strings ! ********************************************************************** ! ********************************************************************** ! edit_macro_strings() process ?macro? strings subroutine edit_macro_strings( edit_line, lower_case_line) ! ********************************************************************** ! edit_macro_strings() interface ! ---------------------------------------------------------------------- ! the osurce line to be edited character( len= *), intent( in out) :: edit_line ! the source line in lower case to enable searches character( len= *), intent( in out) :: lower_case_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?macro ! exit: line has any ?macro strings replaced with their values ! ********************************************************************** ! edit_macro_strings() local ! ---------------------------------------------------------------------- ! string containing macro value character( len= target_len) :: search_str ! length of ?macro? integer :: search_len ! point to ?macro? integer :: search_idx ! argument strings character( len= buffer_len) :: value_str ! scan for macros type( macro_t), pointer :: macro_ptr ! end of substrings integer :: close_paren_idx integer :: open_paren_idx integer :: value_len ! ********************************************************************** ! edit_macro_strings() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! replace ?macro? with the current string value of macro nullify( macro_ptr) each_macro: do call get_next_macro( macro_ptr) end_of_list: if( .not. associated( macro_ptr) )then exit each_macro end if end_of_list ! ---------------------------------------------------------------------- ! does ?macro? appear on line search_str = l_key // trim( macro_ptr% name_str) // r_key search_len = len_trim( search_str) search_idx = index( lower_case_line, search_str( 1: search_len)) ! ---------------------------------------------------------------------- ! if macro appears on line found_macro: if( search_idx > 0 )then macro_ptr% referenced = .true. macro_ptr% referenced_file = current_file% name_str macro_ptr% referenced_line = current_file% lines_transfered ! macro definition has a dummy arg list have_arg_list: if( allocated( macro_ptr% dummy_args) )then ! must rebuild the macro value with each new set of actual args next_dummy_args: do if( search_idx == 0 ) exit next_dummy_args ! check for actual arg list open_paren_idx = search_idx + search_len no_actual_args: if( edit_line( open_paren_idx: open_paren_idx) /= open_paren )then call msg_quit( "macro args missing: " // trim( macro_ptr% name_str) ) end if no_actual_args ! have an actual arg list, find the close parenthesis call seek_close_paren( edit_line, open_paren_idx, close_paren_idx) no_close_paren: if( close_paren_idx > len_trim( edit_line) )then call msg_quit( "can't find close parenthesis on line to be edited: " // trim( edit_line)) end if no_close_paren call make_actual_array( edit_line( open_paren_idx + 1: close_paren_idx - 1) // comma, & macro_ptr% actual_args, macro_ptr% args_in_parens) ! build the new macro value call process_actual_arglist( macro_ptr% actual_args, & value_str, macro_ptr% macro_value, macro_ptr% dummy_args) ! substitute it value_len = len_trim( value_str) ! replace whole "?macro?(args)" with computed macro value edit_line = edit_line( 1: search_idx - 1) // value_str( 1: value_len) & // edit_line( close_paren_idx + 1: ) lower_case_line = lower_case_line( 1: search_idx - 1) // value_str( 1: value_len) & // lower_case_line( close_paren_idx + 1: ) ! find the next occurance of ?macro? search_idx = index( lower_case_line, trim( search_str( 1: search_len)) ) end do next_dummy_args ! ---------------------------------------------------------------------- ! no arg list so macro value doesn't change else have_arg_list ! insert macro into the line value_len = len_trim( macro_ptr% macro_value) call replace_substring( edit_line, lower_case_line, search_str( 1: search_len), & macro_ptr% macro_value( 1: value_len), search_idx) end if have_arg_list ! ---------------------------------------------------------------------- ! done with this macro end if found_macro ! ---------------------------------------------------------------------- ! go try the next macro end do each_macro ! ---------------------------------------------------------------------- ! edit_macro_strings() exit return ! ********************************************************************** ! edit_macro_strings() end subroutine edit_macro_strings ! ********************************************************************** ! ********************************************************************** ! make_actual_array() process actual arglist strings to actual arg array subroutine make_actual_array( actual_args, actual_array, must_parens) ! ********************************************************************** ! make_actual_array() interface ! ---------------------------------------------------------------------- ! the actual args from the source line character( len= *), intent( in) :: actual_args ! the actual args one per element character( len= *), dimension( :), intent( out) :: actual_array ! true if must enclose actual arguments in parenthesis logical, intent( in) :: must_parens ! ********************************************************************** ! entry: actual_args is a single string with the actual args ! exit: actual array is the actual args one per array element ! ********************************************************************** ! make_actual_array() local ! ---------------------------------------------------------------------- ! index the actual args array integer :: i_arg ! index characters integer :: i_char ! mark the previous character integer :: prev_char ! mark the close parenthesis integer :: close_paren_idx ! ********************************************************************** ! make_actual_array() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! scan through the actual arguments string to find a comma outside parenthesis i_char = 1 prev_char = 1 i_arg = 1 each_char: do ! find a comma outside parenthesis find_actual: select case( actual_args( i_char: i_char)) ! at open paren, skip to matching paren case( open_paren) find_actual call seek_close_paren( actual_args, i_char, close_paren_idx) no_close_paren: if( close_paren_idx > len_trim( actual_args) )then call msg_quit( "can't find close parenthesis in actual argument list: " // trim( actual_args)) end if no_close_paren i_char = close_paren_idx + 1 ! actual argument is isolated before comma outside parenthesis case( comma) find_actual ensure_parens: if( must_parens )then call seek_close_paren( actual_args, prev_char, close_paren_idx) needs_parens: if( close_paren_idx == i_char - 1 )then actual_array( i_arg) = adjustl( actual_args( prev_char: i_char - 1)) else needs_parens actual_array( i_arg) = open_paren // trim( adjustl( actual_args( prev_char: i_char - 1))) // close_paren end if needs_parens else ensure_parens actual_array( i_arg) = adjustl( actual_args( prev_char: i_char - 1)) end if ensure_parens if( i_arg == size( actual_array) ) exit each_char i_arg = i_arg + 1 i_char = i_char + 1 prev_char = i_char ! otherwise, keep checking characters case default find_actual i_char = i_char + 1 end select find_actual end do each_char ! ---------------------------------------------------------------------- ! make_actual_array() exit return ! ********************************************************************** ! make_actual_array() end subroutine make_actual_array ! ********************************************************************** ! ********************************************************************** ! process_actual_arglist() process macro actual arglist strings subroutine process_actual_arglist( actual_args, value_str, macro_value_str, dummy_args) ! ********************************************************************** ! process_actual_arglist() interface ! ---------------------------------------------------------------------- ! the comma separated actual args from the macro instance character( len= *), dimension( :), intent( in) :: actual_args ! the value of the macro after editing character( len= *), intent( out) :: value_str ! the macro value character( len= *), intent( in) :: macro_value_str ! the macro dummy args character( len= symbol_name_len), dimension( :), intent( in) :: dummy_args ! ********************************************************************** ! entry: arg_list is an actual argument list ! macro is a macro variable ! exit: value_buf has the macro's value with all dummy args replaced by actuals ! ********************************************************************** ! process_actual_arglist() local ! ---------------------------------------------------------------------- ! search lower case copy macro text with actual args character( len= len( value_str)) :: lc_value_str ! ---------------------------------------------------------------------- ! construct macro text with actual args character( len= target_len) :: search_str integer :: search_len ! ---------------------------------------------------------------------- ! index argument loop integer :: i ! character pointers integer :: dummy_idx ! ********************************************************************** ! process_actual_arglist() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! the value will be edited with the actual args value_str = macro_value_str lc_value_str = to_lower( value_str) ! loop thru each dummy arg each_arg: do i = 1, size( dummy_args) ! prepare the ?dummy? string search_str = l_key // trim( dummy_args( i) ) // r_key search_len = len_trim( search_str) dummy_idx = index( lc_value_str, search_str( 1: search_len)) substitute: if( dummy_idx > 0 )then call replace_substring( mixed_case_str= value_str, & lower_case_str= lc_value_str, search_str= search_str( 1: search_len), & replace_str= trim( actual_args( i)), first_idx= dummy_idx) end if substitute end do each_arg ! ---------------------------------------------------------------------- ! process_actual_arglist() exit return ! ********************************************************************** ! process_actual_arglist() end subroutine process_actual_arglist ! ********************************************************************** ! ********************************************************************** ! wrap_source_line() ensure lines are not too long subroutine wrap_source_line( wrap_line) ! ********************************************************************** ! wrap_source_line() interface ! ---------------------------------------------------------------------- ! the line to be wrapped character( len= *), target, intent( in out) :: wrap_line ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) more than 132 characters ! exit: line has continuations written and fewer than 132 source lines ! ********************************************************************** ! wrap_source_line() constants ! ---------------------------------------------------------------------- ! start in the right column for fixed format integer, parameter :: start_col = 5 ! fixed format start of line character( len= *), parameter :: blank_str = repeat( blank, start_col) ! fixed format start of line integer, parameter :: no_comment = huge( 0) ! ********************************************************************** ! wrap_source_line() local ! ---------------------------------------------------------------------- ! length of source line integer :: output_len ! index of comment integer :: comment_idx ! ********************************************************************** ! wrap_source_line() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! initialize output_len = len_trim( wrap_line) comment_idx = no_comment ! ---------------------------------------------------------------------- ! while line is too long wrap_lines: do if( output_len <= wrap_len ) exit wrap_lines ! seek a comment prior to the wrap length call seek_comment_idx( wrap_line( 1: output_len), comment_idx) if( comment_idx <= wrap_len ) exit wrap_lines ! process fixed format differently fix_length: if( options% free_form )then ! free format line up to the breakpoint, then the continuation character line = wrap_line( 1: wrap_len - len( continuation)) // continuation ! the continuation character, then the rest of the line wrap_line = continuation // wrap_line( wrap_len: ) else fix_length if( line( 1: 1) == 'c' .or. line( 1: 1) == 'C' .or. line( 1: 1) == '*' ) exit wrap_lines ! fixed format line up to the breakpoint, then blanks to column 72, then continuation in column 73 line = wrap_line( 1: wrap_len) ! blanks up to column 6, then continuation in column 6, then the rest of the line wrap_line = blank_str // continuation // wrap_line( wrap_len + 1: ) end if fix_length ! write lines as they are made call write_source_line( output_file) ! reset line to check for another wrap output_len = len_trim( wrap_line) ! ---------------------------------------------------------------------- ! while line is too long end do wrap_lines ! ---------------------------------------------------------------------- ! wrap_source_line() exit return ! ********************************************************************** ! wrap_source_line() end subroutine wrap_source_line ! ********************************************************************** ! ********************************************************************** ! seek_comment_idx() ensure lines are not too long subroutine seek_comment_idx( wrap_line, comment_idx) ! ********************************************************************** ! seek_comment_idx() interface ! ---------------------------------------------------------------------- ! the line to be wrapped character( len= *), target, intent( in out) :: wrap_line ! the index of a comment or unchanged integer, intent( in out) :: comment_idx ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) more than 132 characters ! exit: comment_idx indicates the start of an in-line comment or is unchanged ! ********************************************************************** ! seek_comment_idx() local ! ---------------------------------------------------------------------- ! length of source line integer :: line_len ! loop through line integer :: char_idx ! the quote that starts a character context character( len= 1), save :: quote ! whether in character context or not logical, save :: char_context = .false. ! ********************************************************************** ! seek_comment_idx() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! initialize line_len = len( wrap_line) ! ---------------------------------------------------------------------- ! loop through line each_char: do char_idx = 1, line_len in_char_context: if( char_context )then found_the_quote: if( wrap_line( char_idx: char_idx) == quote )then char_context = .false. quote = blank end if found_the_quote else in_char_context found_comment: if( ( wrap_line( char_idx: char_idx) == comment) )then comment_idx = char_idx exit each_char end if found_comment found_a_quote: if( ( wrap_line( char_idx: char_idx) == single_quote) & .or. ( wrap_line( char_idx: char_idx) == double_quote) )then quote = wrap_line( char_idx: char_idx) char_context = .true. end if found_a_quote end if in_char_context end do each_char ! ---------------------------------------------------------------------- ! seek_comment_idx() exit return ! ********************************************************************** ! seek_comment_idx() end subroutine seek_comment_idx ! ********************************************************************** ! ********************************************************************** ! blank_compress_lower_case() blank compress or convert to lower case subroutine blank_compress_lower_case( out_str, in_str) ! ********************************************************************** ! blank_compress_lower_case() interface ! ---------------------------------------------------------------------- ! a coco line with blanks, quoted strings and comments character( len= *), intent( in) :: in_str ! a blank compressed lower case coco statement character( len= *), intent( out) :: out_str ! ********************************************************************** ! entry: in_str is a coco line ! exit: out_str is a coco statement, possibly complete only up to hwm ! ********************************************************************** ! blank_compress_lower_case() local ! ---------------------------------------------------------------------- ! quote used for the current quoted string character( len= 1), save :: quote ! length of in_str integer :: in_str_len ! input pointer reset for each line integer :: in_idx ! output pointer reset for each statement integer, save :: out_idx = 0 ! asis pointer follows output pointer integer, save :: asis_idx ! character pointer reset by each intrinsic use integer :: char_idx ! ********************************************************************** ! blank_compress_lower_case() text continue ! ---------------------------------------------------------------------- ! null input signals end-of-file reached on input file cleanup: if( in_str == null_string )then out_idx = 0 return end if cleanup ! ---------------------------------------------------------------------- ! initialize line length in_str_len = len_trim( in_str) ! setup pointers initialize: if( out_idx == 0 )then in_idx = 1 out_idx = 1 asis_idx = 1 out_str = null_string asis_stmt = null_string quote = null_string else initialize char_idx = verify( in_str, white_space) ! check whether first character is a continuation skip_contin: if( in_str( char_idx: char_idx) == continuation )then in_idx = char_idx + 1 else skip_contin in_idx = char_idx end if skip_contin end if initialize ! ********************************************************************** ! scan each character until end of input string scan_line: do if( in_idx > in_str_len) exit scan_line ! ---------------------------------------------------------------------- ! if in quoted string char_literal: select case( quote) ! ---------------------------------------------------------------------- case( single_quote, double_quote) char_literal ! if found matching quote end_of_string: if( in_str( in_idx: in_idx) == quote )then ! out of string so set quote to null quote = null_string end if end_of_string ! copy the character out_str( out_idx: out_idx) = in_str( in_idx: in_idx) asis_stmt( asis_idx: asis_idx) = in_str( in_idx: in_idx) ! update the pointers in_idx = in_idx + 1 out_idx = out_idx + 1 asis_idx = asis_idx + 1 ! ---------------------------------------------------------------------- ! not in quoted string case default char_literal ! white space is not copied skip_ws: select case( in_str( in_idx: in_idx) ) ! blanks or tabs case( blank, tab) skip_ws in_idx = in_idx + 1 asis_idx = asis_idx + 1 ! all others case default skip_ws ! check for special characters spec_char: select case( in_str( in_idx: in_idx) ) ! found quoted string case( single_quote, double_quote) spec_char quote = in_str( in_idx: in_idx) ! found coco comment case( comment) spec_char exit scan_line end select spec_char ! ---------------------------------------------------------------------- ! copy non-blank characters to lower case out_str( out_idx: out_idx) = to_lower( in_str( in_idx: in_idx)) asis_stmt( asis_idx: asis_idx) = in_str( in_idx: in_idx) ! update pointers in_idx = in_idx + 1 out_idx = out_idx + 1 asis_idx = asis_idx + 1 end select skip_ws ! ---------------------------------------------------------------------- end select char_literal ! process next character end do scan_line ! ---------------------------------------------------------------------- ! check whether last character is continuation line_complete: if( out_str( out_idx - 1: out_idx - 1) == continuation )then ! next line is a continuation line out_idx = out_idx - 1 asis_idx = asis_idx - 1 else line_complete ! next line is an initial line asis_len = asis_idx out_idx = 0 end if line_complete ! ---------------------------------------------------------------------- ! blank_compress_lower_case() exit return ! ********************************************************************** ! blank_compress_lower_case() end subroutine blank_compress_lower_case ! ********************************************************************** ! ********************************************************************** ! process_coco_statement() process a coco directive subroutine process_coco_statement( coco_stmt) ! ********************************************************************** ! process_coco_statement() interface ! ---------------------------------------------------------------------- ! the coco statement to be processed character( len= *), intent( in) :: coco_stmt ! ********************************************************************** ! entry: coco_stmt is a blank_compress_lower_case coco directive past the coco key ! "stop..." | "message..." | "if..." | "else if..." | "else..." | ! "end if..." | "integer..." | "logical..." | "assert..." | "=..." | ! "text..." | "copy..." | "symbols" | "options" | "report" | ! exit: the directive is processed or error exit ! If a directive might have something after the keyword, the keyword ! match is checked by "keyword( : len( keyword) ) == string", otheriwse, ! if the directive must not have anything after the keyword, the ! keyword match is checked by "keyword == string". Thus, a directive ! with unknown nonblank characters after the keyword is an unknown directive. ! ********************************************************************** ! process_coco_statement() local ! ---------------------------------------------------------------------- ! point to location of symbol on symbol list class( symbol_t), pointer :: symbol_ptr type( integer_t), pointer :: integer_ptr type( logical_t), pointer :: logical_ptr ! possible index of equals integer :: eq_idx ! expression string is after the equals integer :: expr_idx ! ********************************************************************** ! process_coco_statement() text continue ! ---------------------------------------------------------------------- ! detect assignment statements assigning to named variables nullify( symbol_ptr) eq_idx = scan( coco_stmt( 1: symbol_name_len + len( equals)), equals) got_equals: if( eq_idx > 0 )then call seek_symbol_name( coco_stmt( 1: eq_idx - 1), symbol_ptr) end if got_equals ! ---------------------------------------------------------------------- ! which directive? ! ---------------------------------------------------------------------- ! assignment directive which_directive: if( associated( symbol_ptr) )then ! up to the equals must be a declared name expr_idx = eq_idx + len( equals) ! must be an integer or logical variable integer_or_logical_or_error: select type( symbol_ptr) type is( integer_t) integer_or_logical_or_error integer_ptr => symbol_ptr call process_integer_assignment( coco_stmt( expr_idx: ), integer_ptr) type is( logical_t) integer_or_logical_or_error logical_ptr => symbol_ptr call process_logical_assignment( coco_stmt( expr_idx: ), logical_ptr) class default integer_or_logical_or_error call msg_quit( "target of assignment must be type integer or logical: " // trim( symbol_ptr% name_str) ) end select integer_or_logical_or_error ! ---------------------------------------------------------------------- ! stop directive else if( coco_stmt == stop_str )then which_directive call process_stop_directive( coco_stmt( len( stop_str) + 1: ) ) ! ---------------------------------------------------------------------- ! message directive else if( coco_stmt( 1: len( message_str)) == message_str )then which_directive call process_message_directive( coco_stmt( len( message_str) + 1: ) ) ! ---------------------------------------------------------------------- ! if directive else if( coco_stmt( 1: len( if_str)) == if_str )then which_directive call process_if_directive( coco_stmt( len( if_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else if directive else if( coco_stmt( 1: len( elseif_str)) == elseif_str )then which_directive call process_elseif_directive( coco_stmt( len( elseif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else directive else if( coco_stmt( 1: len( else_str)) == else_str )then which_directive call process_else_directive( coco_stmt( len( else_str) + 1: ) ) ! ---------------------------------------------------------------------- ! endif directive else if( coco_stmt( 1: len( endif_str)) == endif_str )then which_directive call process_endif_directive( coco_stmt( len( endif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! integer declaration else if( coco_stmt( 1: len( integer_str)) == integer_str )then which_directive call process_integer_declaration( coco_stmt( len( integer_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! integer constant declaration else if( coco_stmt( 1: len( integer_constant_str)) == integer_constant_str )then which_directive call process_integer_declaration( coco_stmt( len( integer_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! logical declaration else if( coco_stmt( 1: len( logical_str)) == logical_str )then which_directive call process_logical_declaration( coco_stmt( len( logical_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! logical constant declaration else if( coco_stmt( 1: len( logical_constant_str)) == logical_constant_str )then which_directive call process_logical_declaration( coco_stmt( len( logical_constant_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! macro declaration else if( coco_stmt( 1: len( macro_str)) == macro_str )then which_directive call process_macro_declaration( coco_stmt( len( macro_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! macro, parens declaration else if( coco_stmt( 1: len( macro_parens_str)) == macro_parens_str )then which_directive call process_macro_declaration( coco_stmt( len( macro_parens_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! assert directive else if( coco_stmt( 1: len( assert_str)) == assert_str )then which_directive call process_assert_directive( coco_stmt( len( assert_str) + 1: )) ! ---------------------------------------------------------------------- ! cmdline directive else if( coco_stmt( 1: len( cmdline_str)) == cmdline_str )then which_directive call process_cmdline_directive( coco_stmt( len( cmdline_str) + 1: )) ! ---------------------------------------------------------------------- ! document directive else if( coco_stmt( 1: len( document_str)) == document_str )then which_directive call process_document_directive( coco_stmt( len( document_str) + 1: )) ! ---------------------------------------------------------------------- ! options directive else if( coco_stmt( 1: len( options_str)) == options_str )then which_directive call process_options_directive( coco_stmt( len( options_str) + 1: )) ! ---------------------------------------------------------------------- ! report directive else if( coco_stmt( 1: len( report_str)) == report_str )then which_directive call process_report_directive( coco_stmt( len( report_str) + 1: )) ! ---------------------------------------------------------------------- ! symbols directive else if( coco_stmt( 1: len( symbols_str)) == symbols_str )then which_directive call process_symbols_directive( coco_stmt( len( symbols_str) + 1: )) ! ---------------------------------------------------------------------- ! text directive else if( coco_stmt( 1: len( text_str)) == text_str )then which_directive call process_text_directive( coco_stmt( len( text_str) + 1: ), .false.) ! ---------------------------------------------------------------------- ! text, parens directive else if( coco_stmt( 1: len( text_parens_str)) == text_parens_str )then which_directive call process_text_directive( coco_stmt( len( text_parens_str) + 1: ), .true.) ! ---------------------------------------------------------------------- ! copy directive else if( coco_stmt( 1: len( copy_str)) == copy_str )then which_directive call process_copy_directive( coco_stmt( len( copy_str) + 1: )) ! ---------------------------------------------------------------------- ! cannot process this directive else which_directive call msg_quit( "unknown coco directive: " // trim( coco_stmt)) ! ---------------------------------------------------------------------- ! which directive? end if which_directive ! ---------------------------------------------------------------------- ! process_coco_statement() exit return ! ********************************************************************** ! process_coco_statement() end subroutine process_coco_statement ! ********************************************************************** ! ********************************************************************** ! process_integer_assignment() process a coco stop directive subroutine process_integer_assignment( assign_dir, integer_ptr) ! ********************************************************************** ! process_integer_assignment() interface ! ---------------------------------------------------------------------- ! the integer assignment directive character( len= *), intent( in) :: assign_dir ! a pointer to the integer symbol type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! entry: stop_dir is blank_compress_lower_case coco stop directive, past the coco key word ! exit: coco processing stops ! ********************************************************************** ! process_integer_assignment() local ! ********************************************************************** ! process_integer_assignment() text continue ! ---------------------------------------------------------------------- ! process assignment directive if on an active line active_line: if( if_construct% now_selected ) then ! do not allow redefinition of constants redefine_constant: if( integer_ptr% constant )then call msg_quit( "attempt to redefine a constant: " // trim( integer_ptr% name_str) ) end if redefine_constant ! assign the value call eval_int_expr( assign_dir, integer_ptr% integer_value) integer_ptr% defined = .true. integer_ptr% defined_file = current_file% name_str integer_ptr% defined_line = current_file% lines_transfered end if active_line ! ---------------------------------------------------------------------- ! process_integer_assignment() exit return ! ********************************************************************** ! process_integer_assignment() end subroutine process_integer_assignment ! ********************************************************************** ! ********************************************************************** ! process_logical_assignment() process a coco stop directive subroutine process_logical_assignment( assign_dir, logical_ptr) ! ********************************************************************** ! process_logical_assignment() interface ! ---------------------------------------------------------------------- ! the logical assignment directive character( len= *), intent( in) :: assign_dir ! a pointer to the logical symbol type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! entry: stop_dir is blank_compress_lower_case coco stop directive, past the coco key word ! exit: coco processing stops ! ********************************************************************** ! process_logical_assignment() local ! ********************************************************************** ! process_logical_assignment() text continue ! ---------------------------------------------------------------------- ! process stop directive if on an active line active_line: if( if_construct% now_selected )then ! do not allow redefinition of constants redefine_constant: if( logical_ptr% constant )then call msg_quit( "attempt to redefine a constant: " // trim( logical_ptr% name_str) ) end if redefine_constant ! assign the value call eval_log_expr( assign_dir, logical_ptr% logical_value) logical_ptr% defined = .true. logical_ptr% defined_file = current_file% name_str logical_ptr% defined_line = current_file% lines_transfered end if active_line ! ---------------------------------------------------------------------- ! process_logical_assignment() exit return ! ********************************************************************** ! process_logical_assignment() end subroutine process_logical_assignment ! ********************************************************************** ! ********************************************************************** ! process_stop_directive() process a coco stop directive subroutine process_stop_directive( stop_dir) ! ********************************************************************** ! process_stop_directive() interface ! ---------------------------------------------------------------------- ! the stop directive character( len= *), intent( in) :: stop_dir ! ********************************************************************** ! entry: stop_dir is blank_compress_lower_case coco stop directive, past the coco key word ! exit: coco processing stops ! ********************************************************************** ! process_stop_directive() text continue ! ---------------------------------------------------------------------- ! process stop directive if on an active line active_line: if( if_construct% now_selected )then verbose_output: if( options% verbose_mode )then call msg_continue( "coco stop directive encountered: " // trim( stop_dir)) end if verbose_output output_file% line = stop_dir call write_coco_line( output_file) stop 'coco stop directive encountered' end if active_line ! ---------------------------------------------------------------------- ! process_stop_directive() exit return ! ********************************************************************** ! process_stop_directive() end subroutine process_stop_directive ! ********************************************************************** ! ********************************************************************** ! process_message_directive() process a coco message directive subroutine process_message_directive( message_dir) ! ********************************************************************** ! process_message_directive() interface ! ---------------------------------------------------------------------- ! the message directive character( len= *), intent( in) :: message_dir ! ********************************************************************** ! entry: message_dir is blank_compress_lower_case coco message directive, past the message key word ! exit: message is written to error unit ! ********************************************************************** ! process_message_directive() local ! ---------------------------------------------------------------------- character( len= buffer_len) :: msg_buffer integer :: in_idx integer :: out_idx integer :: comma_idx integer :: quoted_len integer :: unquoted_len integer :: integer_value integer :: istat logical :: logical_value logical :: is_integer character( len= buffer_len) :: expr_str character( len= conversion_len) :: conversion_str ! ********************************************************************** ! process_message_directive() text continue ! ---------------------------------------------------------------------- ! process if on active line active_line: if( if_construct% now_selected )then ! ---------------------------------------------------------------------- ! initialize in_idx = 1 out_idx = 1 msg_buffer = blank ! loop thru message list items list_items: do if( in_idx > len_trim( message_dir) ) exit list_items ! ---------------------------------------------------------------------- ! a list item can be a quoted string or an expression string_expr: select case( message_dir( in_idx: in_idx) ) ! ---------------------------------------------------------------------- ! process quoted strings case( single_quote, double_quote) string_expr ! try to unquote the string call unquote_string( message_dir( in_idx: ), msg_buffer( out_idx: ), quoted_len, unquoted_len) ! if the matching quote is found within the string got_string: if( quoted_len <= len( message_dir( in_idx: )) )then ! found quote, update the character pointers in_idx = in_idx + quoted_len + index( message_dir( in_idx + quoted_len - 1: ), comma) - 1 out_idx = out_idx + unquoted_len - 1 ! found not quote, complain and quit else got_string call msg_quit( "bad message string: " // trim( message_dir) ) end if got_string ! ---------------------------------------------------------------------- ! process expressions case( 'a': 'z', '0': '9', dot, plus, minus, open_paren) string_expr ! expression ends at a comma comma_idx = scan( message_dir( in_idx: ), comma) ! find the comma or the end of the expression end_of_string: if( comma_idx == 0 )then comma_idx = len_trim( message_dir) + 1 else end_of_string comma_idx = in_idx + comma_idx - 1 end if end_of_string ! encode integer or logical call integer_or_logical( message_dir( in_idx: comma_idx - 1), is_integer) ! an integer expression int_log: if( is_integer )then expr_str = message_dir( in_idx: comma_idx - 1) call eval_int_expr( expr_str, integer_value) write( unit= conversion_str, fmt= conversion_fmt, iostat= istat, iomsg= processor_msg) integer_value ! trap internal write errors encode: if( istat > 0 )then call msg_quit( "can't encode: " // message_dir( in_idx: comma_idx - 1) ) end if encode msg_buffer( out_idx: ) = adjustl( conversion_str) ! a logical expression else int_log expr_str = message_dir( in_idx: comma_idx - 1) call eval_log_expr( expr_str, logical_value) t_or_f: if( logical_value )then msg_buffer( out_idx: ) = '.true.' else t_or_f msg_buffer( out_idx: ) = '.false.' end if t_or_f end if int_log ! update pointers and add to output buffer adjust: if( msg_buffer( out_idx: out_idx) == blank )then msg_buffer( out_idx + 1: ) = adjustl( msg_buffer( out_idx + 1: ) ) end if adjust in_idx = comma_idx + 1 out_idx = len_trim( msg_buffer) + 2 ! ---------------------------------------------------------------------- ! list item isn't a string, a symbol or a literal case default string_expr call msg_quit( "bad message list item: " // message_dir( in_idx: ) ) ! ---------------------------------------------------------------------- end select string_expr ! loop thru message list items end do list_items ! ---------------------------------------------------------------------- ! make the message available verbose_output: if( options% verbose_mode )then call msg_continue( msg_buffer( 1: out_idx) ) end if verbose_output ! copy for the log file write( unit= log_file% io_unit, fmt= string_fmt) 'coco message: ' // msg_buffer( 1: out_idx) ! copy for the output file if( options% wrapping_lines ) call wrap_source_line( msg_buffer( 1: out_idx)) ! add a leading blank to avoid shift 0 from deleting a character line = blank // msg_buffer( 1: len( line) - 1) call write_coco_line( output_file) end if active_line ! ---------------------------------------------------------------------- ! process_message_directive() exit return ! ********************************************************************** ! process_message_directive() end subroutine process_message_directive ! ********************************************************************** ! ********************************************************************** ! %%% process declarations of integers and logicals ! ********************************************************************** ! ********************************************************************** ! get_symbol_name() extract symbol name and determine its length subroutine get_symbol_name( decl_stmt, symbol_name, name_len) ! ********************************************************************** ! get_symbol_name() interface ! ---------------------------------------------------------------------- ! a declaration statement with a symbol name character( len= *), intent( in) :: decl_stmt ! the name of the symbol character( len= *), intent( out) :: symbol_name ! the length of the symbol name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name=..." ! exit: a valid symbol name and its length or error exit ! ********************************************************************** ! get_symbol_name() constants ! ---------------------------------------------------------------------- ! characters which must end a symbol name character( len= *), parameter :: end_of_name = equals // blank ! ********************************************************************** ! get_symbol_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_symbol_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) name_error: if( char_idx == 0 )then call msg_quit( "can't find name in declaration: " // trim( decl_stmt)) end if name_error ! length of name is one less than first character past name name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is a valid new name call valid_new_name( decl_stmt( 1: name_len)) ! return name symbol_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_symbol_name() exit return ! ********************************************************************** ! get_symbol_name() end subroutine get_symbol_name ! ********************************************************************** ! ********************************************************************** ! process_integer_declaration() process integer declarations subroutine process_integer_declaration( integer_stmt, is_const) ! ********************************************************************** ! process_integer_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: integer_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_stmt is blank_compress_lower_case integer declaration past the integer keyword ! "::..." | ",parameter::..." ! exit: int_stmt is processed or error exit ! ********************************************************************** ! process_integer_declaration() constants ! ---------------------------------------------------------------------- ! mark the end of a definition character( len= *), parameter :: end_of_def = comma // blank ! ********************************************************************** ! process_integer_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: def_len ! ********************************************************************** ! process_integer_declaration() text continue ! ---------------------------------------------------------------------- ! if active line, process the declaration active_line: if( if_construct% now_selected )then next_char = 1 ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string def_len = scan( integer_stmt( next_char: ), end_of_def) + next_char - 1 symbol_str = integer_stmt( next_char: def_len - 1) ! extract symbol name call get_symbol_name( symbol_str, symbol_name, symbol_len) ! store symbol in symbol list call add_integer( symbol_str( symbol_len + 1: def_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( integer_stmt( def_len: def_len) == blank )then exit all_symbols end if all_done ! move to next symbol next_char = def_len + 1 ! extract all symbols on directive end do all_symbols ! if active line, process the declaration end if active_line ! ---------------------------------------------------------------------- ! process_integer_declaration() exit return ! ********************************************************************** ! process_integer_declaration() end subroutine process_integer_declaration ! ********************************************************************** ! ********************************************************************** ! add_integer() store integer declaration in symbol table subroutine add_integer( int_decl_str, integer_name, is_const) ! ********************************************************************** ! add_integer() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: int_decl_str ! the symbol name character( len= *), intent( in) :: integer_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case integer declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: integer declaration is added to the integer symbol list or error exit ! ********************************************************************** ! add_integer() local ! ---------------------------------------------------------------------- ! expression defining integer symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! add_integer() text continue ! ---------------------------------------------------------------------- ! allocate new integer allocate( integer_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate integer: " // trim( integer_name)) end if alloc_error ! build new integer on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => integer_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => integer_ptr last_symbol => first_symbol end if subsequent_or_first nullify( integer_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members integer_ptr% name_str = integer_name integer_ptr% declared_file = current_file% name_str integer_ptr% declared_line = current_file% lines_transfered integer_ptr% referenced = .false. integer_ptr% referenced_file = null_string integer_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! store whether integer is a constant integer_ptr% constant = is_const ! store whether symbol is declared in the set file integer_ptr% sf_defined = .false. integer_ptr% cl_defined = .false. ! determine if declaration specifies a value got_eq: if( len( int_decl_str) > 0 )then integer_ptr% defined = int_decl_str( 1: len( equals)) == equals else got_eq integer_ptr% defined = .false. end if got_eq ! compute and store the value if there is one constant_value: if( integer_ptr% constant .and. .not. integer_ptr% defined )then call msg_quit( "an integer constant must have a value: " // trim( integer_name) // trim( int_decl_str) ) end if constant_value ! decode the value process_value: if( integer_ptr% defined )then all_constants = .true. expr_str = int_decl_str( len( equals) + 1: ) call eval_int_expr( expr_str, integer_ptr% integer_value) non_const: if( integer_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define integer constant: " // trim( integer_name)) end if non_const integer_ptr% defined_file = current_file% name_str integer_ptr% defined_line = current_file% lines_transfered end if process_value ! allow a value from the set file and/or the command line to overwrite the source file value call get_int_value_from_setfile( integer_ptr) call get_int_value_from_cmdline( integer_ptr) ! ---------------------------------------------------------------------- ! add_integer() exit return ! ********************************************************************** ! add_integer() end subroutine add_integer ! ********************************************************************** ! ********************************************************************** ! process_logical_declaration() process logical declarations subroutine process_logical_declaration( logical_stmt, is_const) ! ********************************************************************** ! process_logical_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the logical declaration character( len= *), intent( in) :: logical_stmt ! true if declaration is of constants logical, intent( in) :: is_const ! ********************************************************************** ! entry: logical_stmt is blank_compress_lower_case logical declaration past the logical keyword ! "::..." | ",parameter::..." ! exit: logical declaration is processed or error exit ! ********************************************************************** ! process_logical_declaration() local ! ---------------------------------------------------------------------- ! string containing a single symbol declaration symbol character( len= buffer_len) :: symbol_str ! name of symbol character( len= symbol_name_len) :: symbol_name ! results of decoding statement integer :: symbol_len ! ---------------------------------------------------------------------- ! point to next character to be decoded integer :: next_char integer :: decl_len ! ********************************************************************** ! process_logical_declaration() text continue next_char = 1 ! ---------------------------------------------------------------------- ! if active line, process the declaration active_line: if( if_construct% now_selected )then ! extract all symbols on directive all_symbols: do ! one symbol at a time to the symbol string decl_len = scan( logical_stmt( next_char: ), end_of_decl) + next_char - 1 symbol_str = logical_stmt( next_char: decl_len - 1) ! extract symbol name call get_symbol_name( symbol_str, symbol_name, symbol_len) ! store symbol in symbol list call add_logical( symbol_str( symbol_len + 1: decl_len - 1), symbol_name, is_const) ! comma separates symbols, blank is end of statement all_done: if( logical_stmt( decl_len: decl_len) == blank )then exit all_symbols end if all_done ! reset for next symbol next_char = decl_len + 1 ! extract all symbols on directive end do all_symbols ! if active line, process the declaration end if active_line ! ---------------------------------------------------------------------- ! process_logical_declaration() exit return ! ********************************************************************** ! process_logical_declaration() end subroutine process_logical_declaration ! ********************************************************************** ! ********************************************************************** ! add_logical() store logical declaration in symbol table subroutine add_logical( log_decl_str, logical_name, is_const) ! ********************************************************************** ! add_logical() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: log_decl_str ! the valid logical name character( len= *), intent( in) :: logical_name ! true if the symbol is a constant logical, intent( in) :: is_const ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case logical declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_logical() local ! ---------------------------------------------------------------------- ! expression defining logical symbol character( len= buffer_len) :: expr_str ! check allocation status integer :: astat ! type pointer to allocate type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! add_logical() text continue ! ---------------------------------------------------------------------- ! allocate new logical allocate( logical_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate logical: " // trim( logical_name)) end if alloc_error ! build new logical on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => logical_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => logical_ptr last_symbol => first_symbol end if subsequent_or_first nullify( logical_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members logical_ptr% name_str = logical_name logical_ptr% declared_file = current_file% name_str logical_ptr% declared_line = current_file% lines_transfered logical_ptr% referenced = .false. logical_ptr% referenced_file = null_string logical_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! store whether logical is a constant logical_ptr% constant = is_const ! store whether symbol is declared in the set file logical_ptr% sf_defined = .false. logical_ptr% cl_defined = .false. ! determine if declaration specifies a value got_eq: if( len( log_decl_str) > 0 )then logical_ptr% defined = log_decl_str( 1: len( equals)) == equals else got_eq logical_ptr% defined = .false. end if got_eq ! compute and store the value if there is one constant_value: if( logical_ptr% constant .and. .not. logical_ptr% defined )then call msg_quit( "an logical constant must have a value: " & // trim( logical_name) // trim( log_decl_str) ) end if constant_value ! decode the value process_value: if( logical_ptr% defined )then all_constants = .true. expr_str = log_decl_str( len( equals) + 1: ) call eval_log_expr( expr_str, logical_ptr% logical_value) non_const: if( logical_ptr% constant .and. .not. all_constants )then call msg_quit( "non constant expression used to define logical constant: " // trim( logical_name)) end if non_const logical_ptr% defined_file = current_file% name_str logical_ptr% defined_line = current_file% lines_transfered end if process_value ! allow a value from the set file and/or the command line to overwrite the source file value call get_log_value_from_setfile( logical_ptr) call get_log_value_from_cmdline( logical_ptr) ! ---------------------------------------------------------------------- ! add_logical() exit return ! ********************************************************************** ! add_logical() end subroutine add_logical ! ********************************************************************** ! ********************************************************************** ! %%% process if constructs: if, else if, else, end if ! ********************************************************************** ! ********************************************************************** ! new_block() pushes a new block on the block list subroutine new_block( phase) ! ********************************************************************** ! new_block() interface ! ---------------------------------------------------------------------- ! the phase of the new block, or if_block if not present integer, intent( in), optional :: phase ! ********************************************************************** ! entry: a phase and the block list ! exit: the block list has a new entry with the required phase ! ********************************************************************** ! new_block() local ! ---------------------------------------------------------------------- ! status of allocating a new if block integer :: astat ! ********************************************************************** ! new_block() text continue ! ---------------------------------------------------------------------- ! append new if construct at end of list allocate( if_construct% nested, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "allocate block failed") end if alloc_error ! establish pointers if_construct% nested% enclosing => if_construct ! make new if construct the active if construct if_construct => if_construct% nested nullify( if_construct% nested) ! if the phase is specified use_phase: if( present( phase) )then ! this phase is as requested if_construct% phase = phase ! if this is processed, it's an active statement if_construct% now_selected = .true. else use_phase ! otherwise, this phase is an if block if_construct% phase = if_block end if use_phase ! ---------------------------------------------------------------------- ! new_block() exit return ! ********************************************************************** ! new_block() end subroutine new_block ! ********************************************************************** ! ********************************************************************** ! delete_block() pops a block on the block list subroutine delete_block( phase) ! ********************************************************************** ! delete_block() interface ! ---------------------------------------------------------------------- ! the phase of the popped block, no required phase if not present integer, intent( in), optional :: phase ! ********************************************************************** ! entry: a phase and the block list ! exit: the block list has an entry removed or error ! ********************************************************************** ! delete_block() local ! ---------------------------------------------------------------------- ! status of deallocating a block integer :: astat ! ********************************************************************** ! delete_block() text continue ! ---------------------------------------------------------------------- ! if requires phase, enforce it have_phase: if( present( phase) )then must_be: if( if_construct% phase /= phase )then call msg_quit( "blocks bested badly") end if must_be end if have_phase ! ---------------------------------------------------------------------- ! decrement if level if_construct => if_construct% enclosing deallocate( if_construct% nested, stat= astat) next_error: if( astat > 0 )then call msg_quit( "deallocate block failed") end if next_error nullify( if_construct% nested) ! ---------------------------------------------------------------------- ! delete_block() exit return ! ********************************************************************** ! delete_block() end subroutine delete_block ! ********************************************************************** ! ********************************************************************** ! process_if_directive() process a coco if( )then directive subroutine process_if_directive( if_dir) ! ********************************************************************** ! process_if_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an if directive character( len= *), intent( in) :: if_dir ! ********************************************************************** ! entry: if_dir is blank_compress_lower_case if directive, past the coco key and the "if(" ! ")then" ! exit: the directive is processed or error exit ! ********************************************************************** ! process_if_directive() local ! ---------------------------------------------------------------------- ! pointer to ')then' integer :: then_idx ! value of logical expression logical :: expression_value ! copy expression string for evaluation character( len= buffer_len) :: expr_str ! ********************************************************************** ! process_if_directive() text continue ! ---------------------------------------------------------------------- ! check for a well formed if directive then_idx = index( if_dir, then_str) syntax_check: if( then_idx == 0 )then call msg_quit( "no 'then' in if directive: " // trim( if_dir) ) end if syntax_check extra_chars_check: if( if_dir( then_idx + len( then_str): ) /= blank )then call msg_quit( "extra characters after if directive: " // trim( if_dir) ) end if extra_chars_check ! ---------------------------------------------------------------------- ! append new if construct at end of list call new_block() ! ---------------------------------------------------------------------- ! if this if block is enclosed within selected lines active_lines: if( if_construct% enclosing% now_selected )then ! ---------------------------------------------------------------------- ! evaluate logical expression only when enclosing if block is selected expr_str = if_dir( 1: then_idx - 1) call eval_log_expr( expr_str, expression_value) ! set if value accordingly if_construct% now_selected = expression_value if_construct% ever_selected = expression_value ! ---------------------------------------------------------------------- ! the enclosing if block is not selected else active_lines if_construct% now_selected = .false. if_construct% ever_selected = .true. end if active_lines ! ---------------------------------------------------------------------- ! process_if_directive() exit return ! ********************************************************************** ! process_if_directive() end subroutine process_if_directive ! ********************************************************************** ! ********************************************************************** ! process_elseif_directive() process a coco elseif( )then directive subroutine process_elseif_directive( elseif_dir) ! ********************************************************************** ! process_elseif_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an elseif directive character( len= *), intent( in) :: elseif_dir ! ********************************************************************** ! entry: elseif_dir is blank_compress_lower_case elseif directive, past the coco key ! exit: the directive is processed or error exit ! ********************************************************************** ! process_elseif_directive() local ! ---------------------------------------------------------------------- ! location of closing )then integer :: then_idx ! value of logical expression logical :: expression_value character( len= buffer_len) :: expr_str ! ********************************************************************** ! process_elseif_directive() text continue ! ---------------------------------------------------------------------- ! if not in if-block, elseif is misplaced if_sequence: select case( if_construct% phase) case( outside_block ) if_sequence call msg_quit( "else if outside if construct: " // trim( elseif_dir) ) case( else_block ) if_sequence call msg_quit( "else if after else: " // trim( elseif_dir) ) case( text_block ) if_sequence call msg_quit( "else if badly nested in text block: " // trim( elseif_dir) ) case( include_block ) if_sequence call msg_quit( "else if badly nested in include file: " // trim( elseif_dir) ) end select if_sequence ! ---------------------------------------------------------------------- ! logical expression must be between 'if(' and ')then' then_idx = index( elseif_dir, then_str) syntax_check: if( then_idx == 0 )then call msg_quit( "no 'then' in else if directive: " // trim( elseif_dir) ) end if syntax_check extra_chars_check: if( elseif_dir( then_idx + len( then_str): ) /= blank )then call msg_quit( "extra characters after else if directive: " // trim( elseif_dir) ) end if extra_chars_check ! this phase is an elseif block if_construct% phase = elseif_block ! ---------------------------------------------------------------------- ! if this if block is enclosed within selected lines active_lines: if( if_construct% enclosing% now_selected )then previous_true: if( if_construct% ever_selected )then if_construct% now_selected = .false. else previous_true ! evaluate logical expression expr_str = elseif_dir( 1: then_idx - 1) call eval_log_expr( expr_str, expression_value) ! set if value accordingly if_construct% now_selected = expression_value if_construct% ever_selected = expression_value end if previous_true end if active_lines ! ---------------------------------------------------------------------- ! process_elseif_directive() exit return ! ********************************************************************** ! process_elseif_directive() end subroutine process_elseif_directive ! ********************************************************************** ! ********************************************************************** ! process_else_directive() process a coco else directive subroutine process_else_directive( else_dir) ! ********************************************************************** ! process_else_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an else directive character( len= *), intent( in) :: else_dir ! ********************************************************************** ! entry: else_dir is blank_compress_lower_case else directive, past the coco key ! exit: the directive is processed or error exit ! ********************************************************************** ! process_else_directive() text continue ! ---------------------------------------------------------------------- ! if not in if-block, else is misplaced if_sequence: select case( if_construct% phase) case( outside_block ) if_sequence call msg_quit( "else outside if construct: " // trim( else_dir) ) case( else_block ) if_sequence call msg_quit( "else after else: " // trim( else_dir) ) case( text_block ) if_sequence call msg_quit( "else badly nested in text block: " // trim( else_dir) ) case( include_block ) if_sequence call msg_quit( "else badly nested in include file: " // trim( else_dir) ) end select if_sequence ! must have nothing after 'else' syntax_error: if( else_dir /= blank )then call msg_quit( "extra characters after else directive: " // trim( else_dir) ) end if syntax_error ! ---------------------------------------------------------------------- ! this phase is an else block if_construct% phase = else_block ! ---------------------------------------------------------------------- ! select else block if this if ithe enclosing block is active and no previous block has been selected if_construct% now_selected = if_construct% enclosing% now_selected & .and. .not. if_construct% ever_selected ! ---------------------------------------------------------------------- ! process_else_directive() exit return ! ********************************************************************** ! process_else_directive() end subroutine process_else_directive ! ********************************************************************** ! ********************************************************************** ! process_endif_directive() process a coco endif directive subroutine process_endif_directive( endif_dir) ! ********************************************************************** ! process_endif_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an endif directive character( len= *), intent( in) :: endif_dir ! ********************************************************************** ! entry: endif_dir is blank_compress_lower_case endif directive, past the coco key ! exit: the directive is processed or error exit ! ********************************************************************** ! process_endif_directive() local ! ********************************************************************** ! process_endif_directive() text continue ! ---------------------------------------------------------------------- ! if not in if-block, endif is misplaced if_sequence: select case( if_construct% phase) case( outside_block ) if_sequence call msg_quit( "end if outside any if construct: " // trim( endif_dir) ) case( text_block ) if_sequence call msg_quit( "end if badly nested in text block: " // trim( endif_dir) ) case( include_block ) if_sequence call msg_quit( "end if badly nested in include file: " // trim( endif_dir) ) end select if_sequence ! must have nothing after 'endif' syntax_error: if( endif_dir /= blank )then call msg_quit( "extra characters after end if directive: " // trim( endif_dir) ) end if syntax_error ! ---------------------------------------------------------------------- ! decrement if level call delete_block() ! ---------------------------------------------------------------------- ! process_endif_directive() exit return ! ********************************************************************** ! process_endif_directive() end subroutine process_endif_directive ! ********************************************************************** ! ********************************************************************** ! process extensions assert, macro, text, copy ! ********************************************************************** ! ********************************************************************** ! process_assert_directive() process an assert directive subroutine process_assert_directive( assert_dir) ! ********************************************************************** ! process_assert_directive() interface ! ---------------------------------------------------------------------- ! a statement containing an assert directive character( len= *), intent( in) :: assert_dir ! ********************************************************************** ! entry: assert_dir is quoted assert condition ! exit: assertion code is written to the output ! ********************************************************************** ! process_assert_directive() constants ! ---------------------------------------------------------------------- ! pieces of the assert output character( len= *), parameter :: if_prt = 'if( .not. ' character( len= *), parameter :: then_prt = ')then' character( len= *), parameter :: write_prt = 'write( unit= *, fmt= *) "assertion failed: ' character( len= *), parameter :: stop_prt = 'stop "assertion failed"' character( len= *), parameter :: endif_prt = 'end if' ! ---------------------------------------------------------------------- ! starting column of output integer, parameter :: free_start_col = 1 integer, parameter :: fixed_start_col = 7 ! ********************************************************************** ! process_assert_directive() local ! ---------------------------------------------------------------------- ! the column to start writing output source integer, save :: start_col = free_start_col ! the length of the assert condition integer :: cond_len ! start of the condition in the as-is buffer integer :: open_idx ! assemble the output line character( len= buffer_len) :: edit_line ! ---------------------------------------------------------------------- ! convert the current input line number to characters character( len= conversion_len) :: conversion_str ! ********************************************************************** ! process_assert_directive() text continue ! ---------------------------------------------------------------------- ! check syntax- condition must be within parentheses find_open_praen: if( assert_dir( 1: 1) /= open_paren )then call msg_quit( "can't find open parenthesis: " // trim( assert_dir)) end if find_open_praen call seek_close_paren( assert_dir, 1, cond_len) find_close_praen: if( assert_dir( cond_len: cond_len) /= close_paren )then call msg_quit( "can't find close parenthesis in assert directive: " // trim( assert_dir)) else if( len_trim( assert_dir) <= len( open_paren // close_paren) )then find_close_praen call msg_quit( "can't find condition in assert directive: " // trim( assert_dir)) end if find_close_praen ! check syntax- directive must be blank after condition extra_chars: if( assert_dir( cond_len + 1: ) /= blank )then call msg_quit( "extra characters after assert condition: " // trim( assert_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! if active block, process assert directive active_line: if( if_construct% now_selected )then ! use the condition from the as-is buffer open_idx = index( asis_stmt, open_paren) ! set start column per the source form if( .not. options% free_form ) start_col = fixed_start_col ! write the if statement if( start_col > 1 ) edit_line( 1: start_col - 1) = blank edit_line( start_col: ) = if_prt // asis_stmt( open_idx: asis_len) // then_prt ! remove any line length overflow if( options% wrapping_lines ) call wrap_source_line( edit_line) ! ---------------------------------------------------------------------- ! write assembled if-then statement line = edit_line( 1: len( line)) call write_source_line( output_file) ! ---------------------------------------------------------------------- ! write the write statement if( start_col > 1 ) edit_line( 1: start_col - 1) = blank ! get the current line number write( unit= conversion_str, fmt= conversion_fmt) current_file% lines_transfered ! construct the assertion complaint edit_line( start_col: ) = write_prt // trim( current_file% name_str) & // ": " // trim( adjustl( conversion_str)) & // ': " // ' // '"' // trim( asis_stmt( open_idx: asis_len)) // '"' ! remove any line length overflow if( options% wrapping_lines ) call wrap_source_line( edit_line) ! ---------------------------------------------------------------------- ! write assembled write statement line = edit_line( 1: len( line)) call write_source_line( output_file) ! ---------------------------------------------------------------------- ! blank until the start column for the stop and end if if( start_col > 1 ) line( 1: start_col - 1) = blank ! write the stop statement line( start_col: ) = stop_prt call write_source_line( output_file) ! ---------------------------------------------------------------------- ! blank until the start column for the stop and end if if( start_col > 1 ) line( 1: start_col - 1) = blank ! write the end if statement line( start_col: ) = endif_prt call write_source_line( output_file) ! ---------------------------------------------------------------------- end if active_line ! ---------------------------------------------------------------------- ! process_assert_directive() exit return ! ********************************************************************** ! process_assert_directive() end subroutine process_assert_directive ! ********************************************************************** ! ********************************************************************** ! %%% process coco macros ! ********************************************************************** ! ********************************************************************** ! get_macro_name() verify macro name and determine its length subroutine get_macro_name( decl_stmt, macro_name, name_len) ! ********************************************************************** ! get_macro_name() interface ! ---------------------------------------------------------------------- ! the directive containing the macro character( len= *), intent( in) :: decl_stmt ! the name of the macro character( len= *), intent( out) :: macro_name ! the length of the macro name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name=..." | "name(..." ! exit: name is valid and its length is known or error exit ! ********************************************************************** ! get_macro_name() constants ! ---------------------------------------------------------------------- ! equals or open parenthesis may end a macro name character( len= *), parameter :: end_of_name = equals // open_paren ! ********************************************************************** ! get_macro_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_macro_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) ! if no equals or open paren found no_eq_op: if( char_idx == 0 )then call msg_quit( "can't find name in macro declaration: " // trim( decl_stmt)) end if no_eq_op name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is not in use and has a valid form call valid_new_name( decl_stmt( 1: name_len)) macro_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_macro_name() exit return ! ********************************************************************** ! get_macro_name() end subroutine get_macro_name ! ********************************************************************** ! ********************************************************************** ! process_macro_declaration() process macro declarations subroutine process_macro_declaration( mac_stmt, must_parens) ! ********************************************************************** ! process_macro_declaration() interface ! ---------------------------------------------------------------------- ! the statement containing the macro declaration character( len= *), intent( in) :: mac_stmt ! this macro must have actual args in parens logical, intent( in) :: must_parens ! ********************************************************************** ! entry: mac_stmt is blank_compress_lower_case logical declaration ! past the macro keyword "::..." ! exit: macro declaration is processed or error exit ! ********************************************************************** ! process_macro_declaration() local ! ---------------------------------------------------------------------- ! name of symbol character( len= symbol_name_len) :: macro_name ! results of decoding statement integer :: name_len ! ********************************************************************** ! process_macro_declaration() text continue ! ---------------------------------------------------------------------- ! extract symbol name call get_macro_name( mac_stmt, macro_name, name_len) ! if active line, process the declaration active_line: if( if_construct% now_selected )then ! store symbol in symbol list call add_macro( mac_stmt( name_len + 1: ), macro_name, must_parens) end if active_line ! ---------------------------------------------------------------------- ! process_macro_declaration() exit return ! ********************************************************************** ! process_macro_declaration() end subroutine process_macro_declaration ! ********************************************************************** ! ********************************************************************** ! add_macro() store macro declaration in symbol table subroutine add_macro( mac_decl_str, macro_name, must_parens) ! ********************************************************************** ! add_macro() interface ! ---------------------------------------------------------------------- ! the statement containing the declaration character( len= *), intent( in) :: mac_decl_str ! the symbol name character( len= *), intent( in) :: macro_name ! wrap actual args in parens logical, intent( in) :: must_parens ! ********************************************************************** ! entry: int_decl_str is blank_compress_lower_case macro declaration statement past the name ! "" | "=..." ! sym_name is the symbol name ! is_const is true if this is a constant declaration ! exit: macro declaration is added to the macro symbol list or error exit ! ********************************************************************** ! add_macro() local ! ---------------------------------------------------------------------- ! check allocation status integer :: astat ! type pointer to allocate type( macro_t), pointer :: macro_ptr ! index of the = integer :: eq_idx ! length of arglist if there is one integer :: arglist_len ! ********************************************************************** ! add_macro() text continue ! ---------------------------------------------------------------------- ! allocate new macro allocate( macro_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate macro: " // trim( macro_name)) end if alloc_error ! build new macro on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => macro_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => macro_ptr last_symbol => first_symbol end if subsequent_or_first nullify( macro_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members macro_ptr% name_str = macro_name macro_ptr% declared_file = current_file% name_str macro_ptr% declared_line = current_file% lines_transfered macro_ptr% referenced = .false. macro_ptr% referenced_file = null_string macro_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! check for dummy argument list got_paren: if( mac_decl_str( 1: len( open_paren)) == open_paren )then ! arglist_len is zero if no close paren arglist_len = index( mac_decl_str, close_paren) bad_arg_list_len: if( arglist_len <= len( open_paren // close_paren) )then call msg_quit( "bad macro dummy argument list: " // trim( mac_decl_str)) end if bad_arg_list_len ! must have something between parens call process_dummy_arglist( mac_decl_str( len( open_paren) + 1: arglist_len - 1), macro_ptr% dummy_args) allocate( macro_ptr% actual_args( size( macro_ptr% dummy_args)), stat= astat, errmsg= processor_msg) actual_error: if( astat /= 0 )then call msg_quit( "can't aloocate macro actual args array: " // trim( macro_ptr% name_str)) end if actual_error else got_paren ! declared must have parenthesis on actual arguments but no dummy arguments parens_no_args: if( must_parens )then call msg_quit( "macro actual args declared to need parens but no dummy args: " // trim( macro_ptr% name_str)) end if parens_no_args end if got_paren ! ---------------------------------------------------------------------- ! must have equals eq_idx = index( mac_decl_str, equals) no_eq: if( eq_idx == 0 )then call msg_quit( "a macro definition must have an equals sign: " // trim( mac_decl_str)) end if no_eq ! process the macro value call verify_macro_value( macro_ptr% dummy_args, mac_decl_str( eq_idx + 1: )) ! assign the macro value from the as-is buffer eq_idx = index( asis_stmt, equals) macro_ptr% macro_value = adjustl( asis_stmt( eq_idx + 1: asis_len)) ! finish the macro definition macro_ptr% args_in_parens = must_parens ! ---------------------------------------------------------------------- ! add_macro() exit return ! ********************************************************************** ! add_macro() end subroutine add_macro ! ********************************************************************** ! ********************************************************************** ! process_dummy_arglist() process macro or text dummy argument list subroutine process_dummy_arglist( arglist, arg_array) ! ********************************************************************** ! process_dummy_arglist() interface ! ---------------------------------------------------------------------- ! the non-null comma separated dummy argument list character( len= *), intent( in) :: arglist ! an allocatable array one dummy arg per word character( len= symbol_name_len), dimension( :), allocatable :: arg_array ! ********************************************************************** ! entry: arglist is a character with the arglist ! exit: symbol_ptr has its arglist array allocated or defined ! ********************************************************************** ! process_dummy_arglist() constants character( len= *), parameter :: end_of_arg = blank // comma ! ********************************************************************** ! process_dummy_arglist() local ! ---------------------------------------------------------------------- ! number of dummy arguments found integer :: number_of_args ! an element in arg_array or character in arg list integer :: i ! beginning and end of an arg integer :: b_arg, e_arg ! allocation status integer :: astat ! ********************************************************************** ! process_dummy_arglist() text continue ! ---------------------------------------------------------------------- ! count macro dummy arguments number_of_args = 1 count_args: do i = 1, len( arglist) found_another: select case( arglist( i: i)) case( comma) found_another number_of_args = number_of_args + 1 end select found_another end do count_args ! ---------------------------------------------------------------------- ! allocate array to hold dummy args allocate( arg_array( 1: number_of_args), stat= astat, errmsg= processor_msg) arg_error: if( astat > 0 )then call msg_quit( "allocate dummy argument list failed: " // trim( arglist)) end if arg_error ! ---------------------------------------------------------------------- ! put each dummy arg into its own array element b_arg = 1 get_args: do i = 1, number_of_args ! find end of each arg e_arg = scan( arglist( b_arg: ) // blank, end_of_arg) - 2 + b_arg ! store arg arg_array( i) = arglist( b_arg: e_arg) ! shift off that arg b_arg = e_arg + 2 end do get_args ! check the dummy arg names call verify_dummy_args( arg_array) ! ---------------------------------------------------------------------- ! process_dummy_arglist() exit return ! ********************************************************************** ! process_dummy_arglist() end subroutine process_dummy_arglist ! ********************************************************************** ! ********************************************************************** ! verify_dummy_args() process macro or text dummy argument list subroutine verify_dummy_args( arg_array) ! ********************************************************************** ! verify_dummy_args() interface ! ---------------------------------------------------------------------- ! an array of dummy args character( len= symbol_name_len), dimension( :), intent( in) :: arg_array ! ********************************************************************** ! entry: macro or text dummy arg list ! exit: macro's dummy arguments are valid and may be substituted in value ! ********************************************************************** ! verify_dummy_args() local ! ---------------------------------------------------------------------- ! index args array integer :: i integer :: j ! ********************************************************************** ! verify_dummy_args() text continue ! ---------------------------------------------------------------------- ! macro or text dummy arguments must be valid names check_names: do i = 1, size( arg_array) call valid_new_name( trim( arg_array( i))) dup_name: do j = 1, i - 1 got_dup: if( arg_array( i) == arg_array( j) )then call msg_quit( "found duplicated dummy argument name: " // trim( arg_array( i))) end if got_dup end do dup_name end do check_names ! ---------------------------------------------------------------------- ! verify_dummy_args() exit return ! ********************************************************************** ! verify_dummy_args() end subroutine verify_dummy_args ! ********************************************************************** ! ********************************************************************** ! verify_macro_value() process macro dummy argument list subroutine verify_macro_value( arglist, value_str) ! ********************************************************************** ! verify_macro_value() interface ! ---------------------------------------------------------------------- ! a pointer to the macro definition so far character( len= symbol_name_len), dimension( :), allocatable :: arglist ! the macro value string is the declaration past the = character( len=*), intent( in) :: value_str ! ********************************************************************** ! entry: macro or its coridate value ! exit: macro's value is valid & may be assigned to macro ! ********************************************************************** ! verify_macro_value() local ! ---------------------------------------------------------------------- ! check all symbol names class( symbol_t), pointer :: symbol_ptr ! make ?name? string character( len= target_len) :: search_str ! point to characters integer :: arg_idx ! point to dummy args integer :: i ! ********************************************************************** ! verify_macro_value() text continue ! ---------------------------------------------------------------------- ! check for null valued macros null_macro: if( len_trim( value_str) == 0 )then call msg_quit( "macro has null value") end if null_macro ! ---------------------------------------------------------------------- ! check that all the dummy args all appear in the macro value have_dummy_args: if( allocated( arglist) )then scan_dummy_args: do i = 1, size( arglist) search_str = l_key // trim( arglist( i)) // r_key arg_idx = index( value_str, trim( search_str)) arg_not_used: if( arg_idx == 0 )then call msg_quit( "macro argument unused: " // trim( arglist( i))) end if arg_not_used end do scan_dummy_args end if have_dummy_args ! ---------------------------------------------------------------------- ! check that no symbol ?name? appear in macro value (includes recursion) nullify( symbol_ptr) call get_next_symbol( symbol_ptr) check_all_symbols: do if( .not. associated( symbol_ptr) ) exit check_all_symbols search_str = l_key // trim( symbol_ptr% name_str) // r_key arg_idx = index( value_str, trim( search_str)) name_defined: if( arg_idx > 0 )then call msg_quit( "macro definition has name already defined: " // trim( symbol_ptr% name_str)) end if name_defined call get_next_symbol( symbol_ptr) end do check_all_symbols ! ---------------------------------------------------------------------- ! verify_macro_value() exit return ! ********************************************************************** ! verify_macro_value() end subroutine verify_macro_value ! ********************************************************************** ! ********************************************************************** ! %%% process coco text and copy ! ********************************************************************** ! ********************************************************************** ! get_text_name() verify text name and determine its length subroutine get_text_name( decl_stmt, text_name, name_len) ! ********************************************************************** ! get_text_name() interface ! ---------------------------------------------------------------------- ! the statement containing the text name character( len= *), intent( in) :: decl_stmt ! the text name character( len= *), intent( out) :: text_name ! the length of the text name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name(..." ! exit: name is valid and its length is known or error exit ! ********************************************************************** ! get_text_name() constants ! ---------------------------------------------------------------------- ! blank or open parenthesis may end a name character( len= *), parameter :: end_of_name = blank // open_paren ! ********************************************************************** ! get_text_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_text_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) ! if no equals found no_eq_op: if( char_idx == 0 )then call msg_quit( "can't find name in text statement: " // trim( decl_stmt)) end if no_eq_op name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! check that name is not in use and has a valid form call valid_new_name( decl_stmt( 1: name_len)) text_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_text_name() exit return ! ********************************************************************** ! get_text_name() end subroutine get_text_name ! ********************************************************************** ! ********************************************************************** ! process_text_directive() process an text declaration subroutine process_text_directive( text_dir, must_parens) ! ********************************************************************** ! process_text_directive() interface ! ---------------------------------------------------------------------- ! a statement containing a text directive character( len= *), intent( in) :: text_dir ! true if actual arguments must be in parenthesis logical, intent( in) :: must_parens ! ********************************************************************** ! entry: text_dir is quoted text condition ! exit: text code is stored in the text variable on the symbol list ! ********************************************************************** ! process_text_directive() local ! ---------------------------------------------------------------------- ! name of symbol character( len= symbol_name_len) :: text_name ! results of decoding statement integer :: name_len ! ********************************************************************** ! process_text_directive() text continue ! ---------------------------------------------------------------------- ! extract text name call get_text_name( text_dir, text_name, name_len) ! if active block, process text declaration active_line: if( if_construct% now_selected )then ! add a block to the if-block list to ensure correct nesting call new_block( text_block) ! store text in symbol list call add_text( text_dir( name_len + 1: ), text_name, must_parens) ! end of text so remove text block from if block list call delete_block( text_block) ! count text blocks total% text_blocks = total% text_blocks + 1 end if active_line ! ---------------------------------------------------------------------- ! process_text_directive() exit return ! ********************************************************************** ! process_text_directive() end subroutine process_text_directive ! ********************************************************************** ! ********************************************************************** ! add_text() copy text block to symbol table subroutine add_text( text_decl_str, text_name, must_parens) ! ********************************************************************** ! add_text() interface ! ---------------------------------------------------------------------- ! a statement containing a text declaration character( len= *), intent( in) :: text_decl_str ! the name of the text character( len= *), intent( in) :: text_name ! true if actual args are wrapped in parentheses logical, intent( in) :: must_parens ! ********************************************************************** ! entry: text_decl_str is blank_compress_lower_case logical declaration statement past the double colon ! "" | "(...)" ! text_name is the symbol name ! must_parens is true if this is a constant declaration ! exit: logical declaration is added to the logical symbol list or error exit ! ********************************************************************** ! add_text() local ! ---------------------------------------------------------------------- ! length of the dummy arglist integer :: arglist_len ! allocation status integer :: astat ! type pointer to allocate type( text_t), pointer :: text_ptr ! ********************************************************************** ! add_text() text continue ! ---------------------------------------------------------------------- ! allocate new text allocate( text_ptr, stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate text: " // trim( text_name)) end if alloc_error ! build new text on list subsequent_or_first: if( associated( first_symbol) )then last_symbol% next => text_ptr last_symbol => last_symbol% next else subsequent_or_first first_symbol => text_ptr last_symbol => first_symbol end if subsequent_or_first nullify( text_ptr% next) ! ---------------------------------------------------------------------- ! set symbol members text_ptr% name_str = text_name text_ptr% declared_file = current_file% name_str text_ptr% declared_line = current_file% lines_transfered text_ptr% referenced = .false. text_ptr% referenced_file = null_string text_ptr% referenced_line = 0 ! ---------------------------------------------------------------------- ! check for dummy argument list got_paren: if( text_decl_str( 1: len( open_paren)) == open_paren )then ! arglist_len is zero if no close paren arglist_len = index( text_decl_str, close_paren) bad_arg_list_len: if( arglist_len <= len( open_paren // close_paren) )then call msg_quit( "bad text dummy argument list: " // trim( text_decl_str)) end if bad_arg_list_len ! must have something between parens call process_dummy_arglist( text_decl_str( len( open_paren) + 1: arglist_len - 1), text_ptr% dummy_args) allocate( text_ptr% actual_args( size( text_ptr% dummy_args)), stat= astat, errmsg= processor_msg) actual_error: if( astat /= 0 )then call msg_quit( "can't aloocate text actual args array: " // trim( text_ptr% name_str)) end if actual_error else got_paren ! declared must have parenthesis on actual arguments but no dummy arguments parens_no_args: if( must_parens )then call msg_quit( "text actual args declared to need parens but no dummy args: " // trim( text_ptr% name_str)) end if parens_no_args arglist_len = 0 end if got_paren ! ---------------------------------------------------------------------- ! must have nothing after name or close paren extra_chars: if( text_decl_str( arglist_len + 1: ) /= blank )then call msg_quit( "extra characters at end of text declaration: " // trim( text_decl_str)) end if extra_chars ! ---------------------------------------------------------------------- ! assign the text value call assign_text_value( text_name, text_ptr% dummy_args, text_ptr% text_lines) ! finish the text definition text_ptr% args_in_parens = must_parens ! ---------------------------------------------------------------------- ! add_text() exit return ! ********************************************************************** ! add_text() end subroutine add_text ! ********************************************************************** ! ********************************************************************** ! assign_text_value() copy text block to symbol table subroutine assign_text_value( text_name, args_array, lines_array) ! ********************************************************************** ! assign_text_value() interface ! ---------------------------------------------------------------------- ! the name of the text block character( len= symbol_name_len), intent( in) :: text_name ! the array to contain the text dummy args character( len= symbol_name_len), dimension( :), allocatable, intent( in) :: args_array ! the array to contain the text block character( len= buffer_len), dimension( :), allocatable, intent( out) :: lines_array ! ********************************************************************** ! entry: the array dummy args ! exit: the lines array is complete ! ********************************************************************** ! assign_text_value() constants ! ---------------------------------------------------------------------- ! end of a text block character( len= *), parameter :: endtext_str = 'endtext' ! ********************************************************************** ! assign_text_value() local ! ---------------------------------------------------------------------- ! the text scratch file type( file_t) :: text_file ! ---------------------------------------------------------------------- ! copy buffer character( len= buffer_len) :: statement ! lines of text in the text block integer :: i integer :: j ! seek dummy argments in text block character( len= target_len) :: search_str integer :: arg_idx integer :: arg_len ! true when complete statement has been read logical :: complete ! allocation status integer :: astat ! ---------------------------------------------------------------------- ! line number string character( len= conversion_len) :: line_str ! ********************************************************************** ! assign_text_value() text continue ! ---------------------------------------------------------------------- ! store text value (read into scratch file, count lines, allocate storage, copy to storage) ! ---------------------------------------------------------------------- ! initialize the text file variable text_file = file_t( io_unit= text_unit, name_str= null_file_name, & format_str= null_string, line= null(), & io_status= 0, lines_transfered= 0, & named_file= .false., create= .true.) ! open the set text file call open_scratch( text_file) ! start as if with a complete statement complete = .true. ! ---------------------------------------------------------------------- ! main read text block lines loop read_lines: do ! ---------------------------------------------------------------------- ! read a text line from the current source file read( unit= current_file% io_unit, fmt= current_file% format_str, & iostat= current_file% io_status, iomsg= processor_msg) current_file% line read_error: if( current_file% io_status > 0 )then call msg_quit( "read text failed: " // trim( current_file% name_str)) end if read_error ! ---------------------------------------------------------------------- ! read until end of file or complete statement read_eof: if( current_file% io_status < 0 )then total% input_lines = total% input_lines + current_file% lines_transfered call msg_quit( "end of file encountered within text block") end if read_eof ! count lines current_file% lines_transfered = current_file% lines_transfered + 1 write( unit= line_str, fmt= conversion_fmt) current_file% lines_transfered predefined_macros( line_idx)% macro_value = line_str total% text_lines = total% text_lines + 1 ! write all lines to the output as coco lines call write_coco_line( output_file) ! write the text line write( unit= text_file% io_unit, iostat= text_file% io_status, iomsg= processor_msg) text_file% line write_text: if( text_file% io_status > 0 )then call msg_quit( "write text file failed: " // trim( text_file% line)) end if write_text ! count text lines text_file% lines_transfered = text_file% lines_transfered + 1 ! ---------------------------------------------------------------------- ! process coco lines coco_line: if( current_file% line( 1: len( coco_key)) == coco_key )then ! count coco lines total% coco_lines = total% coco_lines + 1 ! ignore coco comments coco_statement: if( is_coco_statement( current_file% line( len( coco_key) + 1: )) )then ! gather a complete statement call gather_coco_statement( current_file% line, statement, complete) ! if incomplete, go get rest of statement got_statement: if( .not. complete )then cycle read_lines end if got_statement ! ---------------------------------------------------------------------- ! check for the end text statement end_text: if( trim( statement) == endtext_str & .or. trim( statement) == endtext_str // trim( text_name) )then exit read_lines end if end_text ! check for certain directives in the text block call verify_text_directive( statement) end if coco_statement ! source lines else coco_line continuation_error: if( .not. complete )then call msg_quit( "source line in continued coco statement in text " // trim( text_name)) end if continuation_error ! end processing text statements end if coco_line ! end main read set file lines loop end do read_lines ! ---------------------------------------------------------------------- ! check for no lines in text block or remove the end text statement null_text: if( text_file% lines_transfered < 2 )then call close_scratch( text_file) call msg_quit( "text block has no lines: " // trim( text_name)) else null_text text_file% lines_transfered = text_file% lines_transfered - 1 end if null_text ! ---------------------------------------------------------------------- ! allocate array for text allocate( lines_array( 1: text_file% lines_transfered), stat= astat, errmsg= processor_msg) alloc_error: if( astat > 0 )then call msg_quit( "allocate text block failed") end if alloc_error ! count text lines defined total% text_lines = total% text_lines + 1 ! rewind text scratch file rewind( unit= text_file% io_unit, iostat= text_file% io_status, iomsg= processor_msg) rewind_text: if( text_file% io_status > 0 )then call msg_quit( "rewind text scratch file failed") end if rewind_text ! copy text scratch file to array copy: do i = 1, size( lines_array) read( unit= text_file% io_unit, iostat= text_file% io_status, iomsg= processor_msg) lines_array( i) read_text: if( text_file% io_status > 0 )then call msg_quit( "read text scratch file failed " // trim( text_name)) end if read_text end do copy ! close text scratch file call close_scratch( text_file) ! verify whether each dummy arg appears in the text block somewhere has_dummy_args: if( allocated( args_array) )then check_arg: do j = 1, size( args_array) arg_idx = 0 search_str = l_key // trim( args_array( j) ) // r_key arg_len = len_trim( search_str) check_line: do i = 1, size( lines_array) arg_idx = max( arg_idx, index( to_lower( lines_array( i)), search_str( 1: arg_len) ) ) end do check_line not_found: if( arg_idx == 0 )then call msg_quit( "dummy arg " // search_str( 1: arg_len) // " not found in text " // trim( text_name)) end if not_found end do check_arg end if has_dummy_args ! ---------------------------------------------------------------------- ! assign_text_value() exit return ! ********************************************************************** ! assign_text_value() end subroutine assign_text_value ! ********************************************************************** ! ********************************************************************** ! verify_text_directive() check that no invalid directives appear in a text block subroutine verify_text_directive( text_stmt) ! ********************************************************************** ! verify_text_directive() interface ! ---------------------------------------------------------------------- ! a statement from a text block character( len= *), intent( in) :: text_stmt ! ********************************************************************** ! entry: text_stmt is a blank_compress_lower_case coco directive past the coco key ! which must contain only: ! assignment | "stop" | "message" | "if..." | "else if..." | ! "else" | "end if" | "assert..." ! exit: if any other directive exists, the directive is found and flagged ! ********************************************************************** ! verify_text_directive() local ! presence/location of equals integer :: eq_idx ! walk symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! verify_text_directive() text continue ! ---------------------------------------------------------------------- ! detect assignment statements assigning to named variables nullify( symbol_ptr) eq_idx = index( text_stmt( 1: symbol_name_len + len( equals)), equals) got_equals: if( eq_idx > 0 )then call seek_symbol_name( text_stmt( 1: eq_idx - 1), symbol_ptr) end if got_equals ! ---------------------------------------------------------------------- ! which directive? which_directive: if( associated( symbol_ptr) )then ! assignment is ok continue ! ---------------------------------------------------------------------- ! stop directive else if( text_stmt( 1: len( stop_str)) == stop_str )then which_directive ! stop is ok continue ! ---------------------------------------------------------------------- ! message directive else if( text_stmt( 1: len( message_str)) == message_str )then which_directive ! message is ok continue ! ---------------------------------------------------------------------- ! if directive else if( text_stmt( 1: len( if_str)) == if_str )then which_directive ! process the if statement to check for correct nesting call process_if_directive( text_stmt( len( if_str) + 1: )) ! just store the if in the text block- evaluate it when the block is copied if_construct% now_selected = .true. ! ---------------------------------------------------------------------- ! else if directive else if( text_stmt( 1: len( elseif_str)) == elseif_str )then which_directive ! process the else if statement to check for correct nesting call process_elseif_directive( text_stmt( len( elseif_str) + 1: )) ! just store the elseif in the text block- evaluate it when the block is copied if_construct% now_selected = .true. ! ---------------------------------------------------------------------- ! else directive else if( text_stmt( 1: len( else_str)) == else_str )then which_directive ! process the else statement to check for correct nesting call process_else_directive( text_stmt( len( else_str) + 1: )) ! just store the else in the text block- evaluate it when the block is copied if_construct% now_selected = .true. ! ---------------------------------------------------------------------- ! end if directive else if( text_stmt( 1: len( endif_str)) == endif_str )then which_directive ! process the if statement to check for correct nesting call process_endif_directive( text_stmt( len( endif_str) + 1: )) ! ---------------------------------------------------------------------- ! assert statement else if( text_stmt( 1: len( assert_str)) == assert_str )then which_directive ! assert is ok continue ! ---------------------------------------------------------------------- ! all else fails else which_directive ! something other than a good one call msg_quit( "illegal directive in text block: " // trim( text_stmt)) ! ---------------------------------------------------------------------- ! which directive? end if which_directive ! ---------------------------------------------------------------------- ! verify_text_directive() exit return ! ********************************************************************** ! verify_text_directive() end subroutine verify_text_directive ! ********************************************************************** ! ********************************************************************** ! process_copy_directive() process a coco copy directive subroutine process_copy_directive( copy_dir) ! ********************************************************************** ! process_copy_directive() interface ! ---------------------------------------------------------------------- ! a statement containing a copy directive character( len= *), intent( in) :: copy_dir ! ********************************************************************** ! entry: copy directive ! exit: the directive is processed or error exit ! ********************************************************************** ! process_copy_directive() constants ! ---------------------------------------------------------------------- ! mark beginning and end of text character( len= *), parameter :: begin_txt = '?? ! text ' character( len= *), parameter :: end_txt = '?? ! end text ' ! ********************************************************************** ! process_copy_directive() local ! ---------------------------------------------------------------------- ! use name from directive to find text block pointer character( len= symbol_name_len) :: text_name ! length of text block name integer :: name_len ! find beginning of name integer :: name_idx ! find end of name integer :: end_name_idx ! pointer to text block type( text_t), pointer :: text_ptr ! gather a coco statement from the text block character( len= buffer_len) :: statement ! expanded lines character( len= buffer_len) :: expand_line ! loop through the text block lines integer :: i ! find open parenthesis on copy directive integer :: open_paren_idx ! find close parenthesis integer :: close_paren_idx ! communicate with gather_statement() logical :: complete ! ********************************************************************** ! process_copy_directive() text continue ! ---------------------------------------------------------------------- ! check for valid directive name_idx = 1 call get_copy_name( copy_dir, text_name, name_len) end_name_idx = name_idx + name_len - 1 call get_text_ptr( copy_dir( name_idx: end_name_idx), text_ptr) ! ---------------------------------------------------------------------- ! if active block, process text declaration active_line: if( if_construct% now_selected )then text_ptr% referenced = .true. text_ptr% referenced_file = current_file% name_str text_ptr% referenced_line = current_file% lines_transfered ! test first character after name open_paren_idx = end_name_idx + 1 ! check that if text has dummy args, copy has actual args, and vice versa have_args: if( allocated( text_ptr% dummy_args) )then ! text with args no_args: if( copy_dir( open_paren_idx: open_paren_idx) /= open_paren )then call msg_quit( "no actual arguments for text: " // trim( text_ptr% name_str) ) end if no_args open_paren_idx = index( asis_stmt, open_paren) call seek_close_paren( asis_stmt, open_paren_idx, close_paren_idx) no_close_paren: if( close_paren_idx > len_trim( asis_stmt) )then call msg_quit( "can't find close parenthesis in copy directive: " // trim( asis_stmt)) end if no_close_paren call make_actual_array( asis_stmt( open_paren_idx + 1: close_paren_idx - 1) // comma, text_ptr% actual_args, & text_ptr% args_in_parens) else have_args ! text without args got_args: if( copy_dir( open_paren_idx: open_paren_idx) == open_paren )then call msg_quit( "no dummy arguments for text: " // trim( copy_dir)) end if got_args ! block has/has not args end if have_args ! ---------------------------------------------------------------------- ! mark the beginning of the text line = begin_txt // text_ptr% name_str call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! loop thru text block lines copy_lines: do i = 1, size( text_ptr% text_lines) line = text_ptr% text_lines( i) ! coco lines or source lines coco_lines: if( line( 1: len( coco_key)) == coco_key )then ! write coco line to the output call write_coco_line( output_file) ! ---------------------------------------------------------------------- ! process coco lines, ignore coco comments coco_construct: if( is_coco_statement( line( len( coco_key) + 1: )) )then ! gather a complete coco statement call gather_coco_statement( line, statement, complete) ! if not yet a complete statement, get next line incomplete: if( .not. complete )then cycle copy_lines end if incomplete ! process (permitted in a block) directives call process_block_directive( statement) output_file% line => line end if coco_construct ! ---------------------------------------------------------------------- ! source lines else coco_lines ! allow for macro expansion to lengthen the line expand_line = text_ptr% text_lines( i) ! if args substitute in text line go_args: if( allocated( text_ptr% dummy_args) )then call process_actual_arglist( text_ptr% actual_args, & expand_line, text_ptr% text_lines( i), text_ptr% dummy_args) if( options% wrapping_lines ) call wrap_source_line( expand_line) end if go_args ! if ? present, edit source line edit_line_args: if( index( expand_line, l_key) > 0 )then call edit_source_line( expand_line) end if edit_line_args ! finally, write out the line line = expand_line( 1: len( line)) call write_source_line( output_file) end if coco_lines end do copy_lines total% copied_lines = total% copied_lines + size( text_ptr% text_lines) ! mark the end of the text line = end_txt // text_ptr% name_str call write_coco_line( output_file) ! process active lines only end if active_line ! ---------------------------------------------------------------------- ! process_copy_directive() exit return ! ********************************************************************** ! process_copy_directive() end subroutine process_copy_directive ! ********************************************************************** ! ********************************************************************** ! get_copy_name() verify text name and determine its length subroutine get_copy_name( decl_stmt, text_name, name_len) ! ********************************************************************** ! get_copy_name() interface ! ---------------------------------------------------------------------- ! the statement containing the text name character( len= *), intent( in) :: decl_stmt ! the text name character( len= *), intent( out) :: text_name ! the length of the text name integer, intent( out) :: name_len ! ********************************************************************** ! entry: decl_stmt is blank_compress_lower_case declaration statement past the double colon ! "name" | "name(..." ! exit: name is valid and its length is known or error exit ! ********************************************************************** ! get_copy_name() constants ! ---------------------------------------------------------------------- ! blank or open parenthesis may end a name character( len= *), parameter :: end_of_name = blank // open_paren ! ********************************************************************** ! get_copy_name() local ! ---------------------------------------------------------------------- ! pointers to characters in decl_stmt integer :: char_idx ! ********************************************************************** ! get_copy_name() text continue ! ---------------------------------------------------------------------- ! look for equals following separator char_idx = scan( decl_stmt, end_of_name) ! if no equals found no_eq_op: if( char_idx == 0 )then call msg_quit( "can't find name in copy statement: " // trim( decl_stmt)) end if no_eq_op name_len = char_idx - 1 ! ---------------------------------------------------------------------- ! return the name text_name = decl_stmt( 1: name_len) ! ---------------------------------------------------------------------- ! get_copy_name() exit return ! ********************************************************************** ! get_copy_name() end subroutine get_copy_name ! ********************************************************************** ! ********************************************************************** ! process_block_directive() process a coco text block directive subroutine process_block_directive( block_stmt) ! ********************************************************************** ! process_block_directive() interface ! ---------------------------------------------------------------------- ! a statement from a text block character( len= *), intent( in) :: block_stmt ! ********************************************************************** ! entry: coco_stmt is a blank_compress_lower_case coco directive past the coco key ! "stop..." | "message..." | "if..." | "else if..." | "else..." | ! "end if..." | "assert..." | "name=..." ! exit: the directive is processed or error exit ! ********************************************************************** ! process_block_directive() local ! ---------------------------------------------------------------------- ! point to location of symbol class( symbol_t), pointer :: symbol_ptr ! specific type pointers type( integer_t), pointer :: integer_ptr type( logical_t), pointer :: logical_ptr ! pointer to equals integer :: eq_idx ! expression string is after the equals integer :: expr_idx ! ********************************************************************** ! process_block_directive() text continue ! ---------------------------------------------------------------------- ! which directive? ! ---------------------------------------------------------------------- ! detect assignment statements assigning to variables named by keywords nullify( symbol_ptr) eq_idx = scan( block_stmt( 1: symbol_name_len + 1), equals) got_equals: if( eq_idx > 0 )then call seek_symbol_name( block_stmt( 1: eq_idx - 1), symbol_ptr) end if got_equals ! ---------------------------------------------------------------------- ! which directive? ! ---------------------------------------------------------------------- ! assignment directive which_directive: if( associated( symbol_ptr) )then ! up to the equals must be a declared name expr_idx = eq_idx + len( equals) ! must be an integer or logical variable integer_or_logical_or_error: select type( symbol_ptr) type is( integer_t) integer_or_logical_or_error integer_ptr => symbol_ptr call process_integer_assignment( block_stmt( expr_idx: ), integer_ptr) type is( logical_t) integer_or_logical_or_error logical_ptr => symbol_ptr call process_logical_assignment( block_stmt( expr_idx: ), logical_ptr) class default integer_or_logical_or_error call msg_quit( "assignment variable must be an integer or a logical: " // trim( symbol_ptr% name_str) ) end select integer_or_logical_or_error nullify( symbol_ptr) ! ---------------------------------------------------------------------- ! stop directive else if( block_stmt( 1: len( stop_str)) == stop_str )then which_directive call process_stop_directive( block_stmt( len( stop_str) + 1: ) ) ! ---------------------------------------------------------------------- ! message directive else if( block_stmt( 1: len( message_str)) == message_str )then which_directive call process_message_directive( block_stmt( len( message_str) + 1: ) ) ! ---------------------------------------------------------------------- ! if directive else if( block_stmt( 1: len( if_str)) == if_str )then which_directive call process_if_directive( block_stmt( len( if_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else if directive else if( block_stmt( 1: len( elseif_str)) == elseif_str )then which_directive call process_elseif_directive( block_stmt( len( elseif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! else directive else if( block_stmt( 1: len( else_str)) == else_str )then which_directive call process_else_directive( block_stmt( len( else_str) + 1: ) ) ! ---------------------------------------------------------------------- ! endif directive else if( block_stmt( 1: len( endif_str)) == endif_str )then which_directive call process_endif_directive( block_stmt( len( endif_str) + 1: ) ) ! ---------------------------------------------------------------------- ! assert declaration else if( block_stmt( 1: len( assert_str)) == assert_str )then which_directive call process_assert_directive( block_stmt( len( assert_str) + 1: )) ! ---------------------------------------------------------------------- ! cannot process this directive else which_directive call msg_quit( "error: unknown block directive: " // trim( block_stmt)) ! ---------------------------------------------------------------------- ! which directive? end if which_directive ! ---------------------------------------------------------------------- ! process_block_directive() exit return ! ********************************************************************** ! process_block_directive() end subroutine process_block_directive ! ********************************************************************** ! ********************************************************************** ! process_document_directive() process a coco stop directive subroutine process_document_directive( document_dir) ! ********************************************************************** ! process_document_directive() interface ! ---------------------------------------------------------------------- ! document string character( len= *), intent( in) :: document_dir ! ********************************************************************** ! process_document_directive() constants ! ---------------------------------------------------------------------- ! document text character( len= *), dimension( 1: 15), parameter :: document_text = [ & '! ', & '! Preprocessor executed: ?date? ?time?', & '! ', & '! Preprocessor command line: ?cmdline?', & '! Preprocessor set file: ?setfile? ', & '! Preprocessor log file: ?logfile? ', & '! Preprocessor version: ?coco? ', & '! ', & '! Source file: ?file? line: ?line? ', & '! Compile file: ?output? ', & '! Include path: ?incpath? ', & '! ', & '! User: ?user? ', & '! Current directory: ?cwd? ', & '! ' ] ! ********************************************************************** ! process_document_directive() local ! ---------------------------------------------------------------------- ! loop through document text integer :: i ! save any selected arg keys character( len= 1) :: save_l_key character( len= 1) :: save_r_key ! ********************************************************************** ! process_document_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters extra_chars: if( document_dir /= blank )then call msg_quit( "extra characters at end of document directive: " // trim( document_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! process assignment directive if on an active line active_line: if( if_construct% now_selected ) then save_l_key = l_key save_r_key = r_key l_key = arg_key r_key = arg_key text_to_output: do i = 1, size( document_text) line = document_text( i) ! if ? present, edit source line edit_line: if( index( document_text( i), arg_key) > 0 )then call edit_source_line( line) end if edit_line ! copy source lines call write_source_line( output_file) end do text_to_output l_key = save_l_key r_key = save_r_key end if active_line ! ---------------------------------------------------------------------- ! process_document_directive() exit return ! ********************************************************************** ! process_document_directive() end subroutine process_document_directive ! ********************************************************************** ! ********************************************************************** ! process_options_directive() process a coco options directive subroutine process_options_directive( options_dir) ! ********************************************************************** ! process_options_directive() interface ! ---------------------------------------------------------------------- ! the options directive character( len= *), intent( in) :: options_dir ! ********************************************************************** ! entry: options_dir is blank_compress_lower_case coco options directive, past the coco key word ! exit: coco processing optionss ! ********************************************************************** ! process_options_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters at end of directive extra_chars: if( options_dir /= blank )then call msg_quit( "extra characters at end of options directive: " // trim( options_dir)) end if extra_chars ! process options directive if on an active line active_line: if( if_construct% now_selected )then call write_options() end if active_line ! ---------------------------------------------------------------------- ! process_options_directive() exit return ! ********************************************************************** ! process_options_directive() end subroutine process_options_directive ! ********************************************************************** ! ********************************************************************** ! process_report_directive() process a coco report directive subroutine process_report_directive( report_dir) ! ********************************************************************** ! process_report_directive() interface ! ---------------------------------------------------------------------- ! the report directive character( len= *), intent( in) :: report_dir ! ********************************************************************** ! entry: report_dir is blank_compress_lower_case coco report directive, past the coco key word ! exit: coco processing reports ! ********************************************************************** ! process_report_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters at end of directive extra_chars: if( report_dir /= blank )then call msg_quit( "extra characters at end of report directive: " // trim( report_dir)) end if extra_chars ! process report directive if on an active line active_line: if( if_construct% now_selected )then call write_report() end if active_line ! ---------------------------------------------------------------------- ! process_report_directive() exit return ! ********************************************************************** ! process_report_directive() end subroutine process_report_directive ! ********************************************************************** ! ********************************************************************** ! process_symbols_directive() process a coco symbols directive subroutine process_symbols_directive( symbols_dir) ! ********************************************************************** ! process_symbols_directive() interface ! ---------------------------------------------------------------------- ! the symbols directive character( len= *), intent( in) :: symbols_dir ! ********************************************************************** ! entry: symbols_dir is blank_compress_lower_case coco symbols directive, past the coco key word ! exit: coco processing symbolss ! ********************************************************************** ! process_symbols_directive() text continue ! ---------------------------------------------------------------------- ! check for extra characters at end of directive extra_chars: if( symbols_dir /= blank )then call msg_quit( "extra characters at end of symbols directive: " // trim( symbols_dir)) end if extra_chars ! process symbols directive if on an active line active_line: if( if_construct% now_selected )then call write_symbols() end if active_line ! ---------------------------------------------------------------------- ! process_symbols_directive() exit return ! ********************************************************************** ! process_symbols_directive() end subroutine process_symbols_directive ! ********************************************************************** ! ********************************************************************** ! seek_symbol_name() seek symbol on symbol list subroutine seek_symbol_name( name_str, symbol_ptr) ! ********************************************************************** ! seek_symbol_name() interface ! ---------------------------------------------------------------------- ! the name of the symbol being sought character( len= *), intent( in) :: name_str ! a pointer to the symbol found class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! seek_symbol_name() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_symbol all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols name_match: if( name_str == symbol_ptr% name_str )then exit all_symbols end if name_match symbol_ptr => symbol_ptr% next end do all_symbols ! ---------------------------------------------------------------------- ! seek_symbol_name() exit return ! ********************************************************************** ! seek_symbol_name() end subroutine seek_symbol_name ! ********************************************************************** ! ********************************************************************** ! seek_cl_symbol_name() seek symbol on symbol list subroutine seek_cl_symbol_name( name_str, symbol_ptr) ! ********************************************************************** ! seek_cl_symbol_name() interface ! ---------------------------------------------------------------------- ! the name of the symbol being sought character( len= *), intent( in) :: name_str ! a pointer to the symbol found class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! seek_cl_symbol_name() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_cl_symbol all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols name_match: if( name_str == symbol_ptr% name_str )then exit all_symbols end if name_match symbol_ptr => symbol_ptr% next end do all_symbols ! ---------------------------------------------------------------------- ! seek_cl_symbol_name() exit return ! ********************************************************************** ! seek_cl_symbol_name() end subroutine seek_cl_symbol_name ! ********************************************************************** ! ********************************************************************** ! seek_sf_symbol_name() seek symbol on symbol list subroutine seek_sf_symbol_name( name_str, symbol_ptr) ! ********************************************************************** ! seek_sf_symbol_name() interface ! ---------------------------------------------------------------------- ! the name of the symbol being sought character( len= *), intent( in) :: name_str ! a pointer to the symbol found class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! seek_sf_symbol_name() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_sf_symbol all_symbols: do if( .not. associated( symbol_ptr) ) exit all_symbols name_match: if( name_str == symbol_ptr% name_str )then exit all_symbols end if name_match symbol_ptr => symbol_ptr% next end do all_symbols ! ---------------------------------------------------------------------- ! seek_sf_symbol_name() exit return ! ********************************************************************** ! seek_sf_symbol_name() end subroutine seek_sf_symbol_name ! ********************************************************************** ! ********************************************************************** ! get_integer_value() seek symbol on symbol list subroutine get_integer_value( integer_str, return_value) ! ********************************************************************** ! get_integer_value() interface ! ---------------------------------------------------------------------- ! the name of the integer whose value is sought character( len= *), intent( in) :: integer_str ! the value of the integer integer, intent( out) :: return_value ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_integer_value() local ! ---------------------------------------------------------------------- ! pointer to search the integer sublist of the symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_integer_value() text continue ! ---------------------------------------------------------------------- ! search integer list symbol_ptr => first_symbol search_list: do if( .not. associated( symbol_ptr) ) exit search_list check_integers: select type( symbol_ptr) type is( integer_t) check_integers name_match: if( integer_str == symbol_ptr% name_str )then value_defined: if( symbol_ptr% defined )then return_value = symbol_ptr% integer_value symbol_ptr% referenced = .true. symbol_ptr% referenced_file = current_file% name_str symbol_ptr% referenced_line = current_file% lines_transfered return else value_defined call msg_quit( "integer not defined: " // trim( integer_str) ) end if value_defined end if name_match end select check_integers symbol_ptr => symbol_ptr% next end do search_list ! ---------------------------------------------------------------------- ! integer not found call msg_quit( "unknown integer: " // trim( integer_str) ) ! ---------------------------------------------------------------------- ! get_integer_value() exit return ! ********************************************************************** ! get_integer_value() end subroutine get_integer_value ! ********************************************************************** ! ********************************************************************** ! get_logical_value() seek symbol on symbol list subroutine get_logical_value( logical_str, return_value) ! ********************************************************************** ! get_logical_value() interface ! ---------------------------------------------------------------------- ! the name of the logical whose value is sought character( len= *), intent( in) :: logical_str ! the value of the logical logical, intent( out) :: return_value ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_logical_value() local ! ---------------------------------------------------------------------- ! pointer to search symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_logical_value() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_symbol search_list: do if( .not. associated( symbol_ptr) ) exit search_list check_logicals: select type( symbol_ptr) type is( logical_t) check_logicals name_match: if( logical_str == symbol_ptr% name_str )then value_defined: if( symbol_ptr% defined )then return_value = symbol_ptr% logical_value symbol_ptr% referenced = .true. symbol_ptr% referenced_file = current_file% name_str symbol_ptr% referenced_line = current_file% lines_transfered return else value_defined call msg_quit( "logical not defined: " // trim( logical_str) ) end if value_defined end if name_match end select check_logicals symbol_ptr => symbol_ptr% next end do search_list ! ---------------------------------------------------------------------- ! logical not found call msg_quit( "unknown logical: " // trim( logical_str) ) ! ---------------------------------------------------------------------- ! get_logical_value() exit return ! ********************************************************************** ! get_logical_value() end subroutine get_logical_value ! ********************************************************************** ! ********************************************************************** ! get_text_ptr() seek symbol on symbol list subroutine get_text_ptr( name_str, text_ptr) ! ********************************************************************** ! get_text_ptr() interface ! ---------------------------------------------------------------------- ! the name of the text whose pointer is sought character( len= *), intent( in) :: name_str ! the pointer to the text type( text_t), pointer :: text_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case text symbol name ! exit: symbol found or not in text symbol array ! ********************************************************************** ! get_text_ptr() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_text_ptr() text continue ! ---------------------------------------------------------------------- ! search symbol list symbol_ptr => first_symbol search_list: do if( .not. associated( symbol_ptr) ) exit search_list check_text: select type( symbol_ptr) type is( text_t) check_text name_match: if( name_str == symbol_ptr% name_str )then text_ptr => symbol_ptr return end if name_match end select check_text symbol_ptr => symbol_ptr% next end do search_list ! ---------------------------------------------------------------------- ! text not found call msg_quit( "unknown text: " // trim( text_str)) ! ---------------------------------------------------------------------- ! get_text_ptr() exit return ! ********************************************************************** ! get_text_ptr() end subroutine get_text_ptr ! ********************************************************************** ! ********************************************************************** ! get_next_symbol() seek symbol on symbol list subroutine get_next_symbol( symbol_ptr) ! ********************************************************************** ! get_next_symbol() interface ! ---------------------------------------------------------------------- ! a pointer to the next symbol on the symbol list class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_symbol() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous symbol start_or_continue: if( associated( symbol_ptr) )then symbol_ptr => symbol_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! ---------------------------------------------------------------------- ! get_next_symbol() exit return ! ********************************************************************** ! get_next_symbol() end subroutine get_next_symbol ! ********************************************************************** ! ********************************************************************** ! get_next_integer() seek symbol on symbol list subroutine get_next_integer( integer_ptr) ! ********************************************************************** ! get_next_integer() interface ! ---------------------------------------------------------------------- ! a pointer to the next integer on the symbol list type( integer_t), pointer :: integer_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_integer() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_next_integer() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous integer start_or_continue: if( associated( integer_ptr) )then symbol_ptr => integer_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! scan to the next integer find_next: do if( .not. associated( symbol_ptr) ) exit find_next check_next: select type( symbol_ptr) type is( integer_t) check_next integer_ptr => symbol_ptr return end select check_next symbol_ptr => symbol_ptr% next end do find_next ! end of the integer list nullify( integer_ptr) ! ---------------------------------------------------------------------- ! get_next_integer() exit return ! ********************************************************************** ! get_next_integer() end subroutine get_next_integer ! ********************************************************************** ! ********************************************************************** ! get_next_logical() seek symbol on symbol list subroutine get_next_logical( logical_ptr) ! ********************************************************************** ! get_next_logical() interface ! ---------------------------------------------------------------------- ! a pointer to the next logical on the symbol list type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_logical() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_next_logical() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous logical start_or_continue: if( associated( logical_ptr) )then symbol_ptr => logical_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! scan to the next logical find_next: do if( .not. associated( symbol_ptr) ) exit find_next check_next: select type( symbol_ptr) type is( logical_t) check_next logical_ptr => symbol_ptr return end select check_next symbol_ptr => symbol_ptr% next end do find_next ! end of the logical list nullify( logical_ptr) ! ---------------------------------------------------------------------- ! get_next_logical() exit return ! ********************************************************************** ! get_next_logical() end subroutine get_next_logical ! ********************************************************************** ! ********************************************************************** ! get_next_macro() seek symbol on symbol list subroutine get_next_macro( macro_ptr) ! ********************************************************************** ! get_next_macro() interface ! ---------------------------------------------------------------------- ! a pointer to the next macro on the symbol list type( macro_t), pointer :: macro_ptr ! ********************************************************************** ! entry: symbol_str is blank_compress_lower_case logical symbol directive ! "name..." ! exit: symbol found or not in logical symbol array ! ********************************************************************** ! get_next_macro() local class( symbol_t), pointer :: symbol_ptr ! ********************************************************************** ! get_next_macro() text continue ! ---------------------------------------------------------------------- ! start at the symbol list head or continue from previous macro start_or_continue: if( associated( macro_ptr) )then symbol_ptr => macro_ptr% next else start_or_continue symbol_ptr => first_symbol end if start_or_continue ! scan to the next macro find_next: do if( .not. associated( symbol_ptr) ) exit find_next check_next: select type( symbol_ptr) type is( macro_t) check_next macro_ptr => symbol_ptr return end select check_next symbol_ptr => symbol_ptr% next end do find_next ! end of macro list nullify( macro_ptr) ! ---------------------------------------------------------------------- ! get_next_macro() exit return ! ********************************************************************** ! get_next_macro() end subroutine get_next_macro ! ********************************************************************** ! ********************************************************************** ! %%% diagnose and evaluate expressions ! ********************************************************************** ! ********************************************************************** ! integer_or_logical() determine type of expression subroutine integer_or_logical( expr_str, flag) ! ********************************************************************** ! integer_or_logical() interface ! ---------------------------------------------------------------------- ! an expression whose type is to be assertained character( len= *), intent( in) :: expr_str ! true if the type is integer logical, intent( out) :: flag ! ********************************************************************** ! entry: symbol_str is string "..." ! exit: flag is true if string is an integer expression and false otherwise ! ********************************************************************** ! integer_or_logical() constants ! ---------------------------------------------------------------------- ! search for a character which must be part of a logical expression character( len= *), parameter :: logical_chars = '.<>=' ! search for a character which may be part of an integer expression character( len= *), parameter :: integer_chars = '+-*/\' ! ********************************************************************** ! integer_or_logical() local ! ---------------------------------------------------------------------- ! search results integer :: char_idx ! search integer or logical lists type( integer_t), pointer :: integer_ptr type( logical_t), pointer :: logical_ptr ! ********************************************************************** ! integer_or_logical() text continue ! ---------------------------------------------------------------------- ! does string contain a character which is only in logical expressions? char_idx = scan( expr_str, logical_chars) got_dot: if( char_idx > 0 )then flag = .false. return end if got_dot ! does string contain a character which is only in integer expressions? char_idx = scan( expr_str, integer_chars) got_op: if( char_idx > 0 )then flag = .true. return end if got_op ! ---------------------------------------------------------------------- ! is string an integer or a logical symbol name? char_idx = verify( expr_str, alphanum_chars) got_name: if( char_idx == 0 )then nullify( integer_ptr) search_integers: do call get_next_integer( integer_ptr) if( .not. associated( integer_ptr) ) exit search_integers match_int_name: if( expr_str == trim( integer_ptr% name_str) )then flag = .true. return end if match_int_name end do search_integers nullify( logical_ptr) search_logicals: do call get_next_logical( logical_ptr) if( .not. associated( logical_ptr) ) exit search_logicals match_log_name: if( expr_str == trim( logical_ptr% name_str) )then flag = .false. return end if match_log_name end do search_logicals end if got_name ! ---------------------------------------------------------------------- ! is string all digits? char_idx = verify( expr_str, digit_chars) got_digits: if( char_idx == 0 )then flag = .true. return end if got_digits ! ---------------------------------------------------------------------- ! can't classify the expression so punt call msg_quit( "can't classify: " // trim( expr_str) ) ! ---------------------------------------------------------------------- ! integer_or_logical() exit return ! ********************************************************************** ! integer_or_logical() end subroutine integer_or_logical ! ********************************************************************** ! ********************************************************************** ! eval_int_expr() evaluate int_expr as an integer recursive subroutine eval_int_expr( int_expr, value) ! ********************************************************************** ! eval_int_expr() interface ! ---------------------------------------------------------------------- ! the integer expression to be evaluated character( len= *), intent( in) :: int_expr ! the value of the integer expression integer, intent( out) :: value ! ********************************************************************** ! entry: int_expr is blank_compress_lower_case integer int_expr ! exit: true if value is int_expr value, false otherwise ! ********************************************************************** ! eval_int_expr() constants ! ---------------------------------------------------------------------- ! addition operators integer, parameter :: add_op_len = max( len( plus), len( minus) ) ! multiplication operators (times is defined in the main program) character( len= *), parameter :: divby = slash character( len= *), parameter :: remby = backslash integer, parameter :: mul_op_len = max( len( times), len( divby), len( remby) ) ! length of operators integer, parameter :: op_len = max( len( plus), len( minus), len( times), len( divby), len( remby) ) ! ********************************************************************** ! eval_int_expr() local ! ---------------------------------------------------------------------- ! operations to be done character( len= add_op_len) :: add_op character( len= mul_op_len) :: mul_op ! ---------------------------------------------------------------------- ! next operation character( len= op_len) :: next_op ! ---------------------------------------------------------------------- ! partial values of the int_expr integer :: l_add, r_add integer :: l_mul, r_mul ! ---------------------------------------------------------------------- ! pointers to characters integer :: next_char integer :: next_op_idx integer :: expr_len integer :: primary_len ! ********************************************************************** ! eval_int_expr() text continue ! ---------------------------------------------------------------------- ! limits of scan next_char = 1 expr_len = len_trim( int_expr) ! initialize adds add_op = plus l_add = 0 ! ---------------------------------------------------------------------- ! scan thru int_expr add_ops: do if( next_char > expr_len) exit add_ops ! find a primary call eval_int_primary( int_expr( next_char: ), primary_len, r_add) next_op_idx = next_char + primary_len ! find next operator or end of expression add_end: if( next_op_idx <= expr_len )then next_op = int_expr( next_op_idx: next_op_idx) next_char = next_op_idx + 1 else add_end next_op = blank next_char = next_op_idx end if add_end ! ---------------------------------------------------------------------- ! initialize for a set of mul ops mul_op = next_op l_mul = r_add ! ---------------------------------------------------------------------- ! process a set of mul ops mul_ops: do if( .not. ( next_op == times .or. next_op == divby .or. next_op == remby) ) exit mul_ops ! find a primary call eval_int_primary( int_expr( next_char: ), primary_len, r_mul) next_op_idx = next_char + primary_len ! find next operator or end of expression mul_end: if( next_op_idx <= expr_len )then next_op = int_expr( next_op_idx: next_op_idx) next_char = next_op_idx + 1 else mul_end next_op = blank next_char = next_op_idx end if mul_end ! do the pending add op mul_div: select case( mul_op) case( times) mul_div l_mul = l_mul * r_mul case( divby) mul_div l_mul = l_mul / r_mul case( remby) mul_div l_mul = mod( l_mul, r_mul) end select mul_div mul_op = next_op end do mul_ops ! product is the right operand r_add = l_mul ! ---------------------------------------------------------------------- ! do the pending add op add_sub: select case( add_op) case( blank, plus) add_sub l_add = l_add + r_add case( minus) add_sub l_add = l_add - r_add case default add_sub call msg_quit( "unknown arithmetic operator: " // add_op) end select add_sub add_op = next_op end do add_ops ! ---------------------------------------------------------------------- ! value of integer expression value = l_add ! ---------------------------------------------------------------------- ! eval_int_expr() exit return ! ********************************************************************** ! eval_int_expr() end subroutine eval_int_expr ! ********************************************************************** ! ********************************************************************** ! eval_log_expr() expression is evaluated as a logical recursive subroutine eval_log_expr( log_expr, value) ! ********************************************************************** ! eval_log_expr() interface ! ---------------------------------------------------------------------- ! the logical expression to be evaluated character( len= *), intent( in) :: log_expr ! the value of the expression logical, intent( out) :: value ! ********************************************************************** ! entry: expression is blank_compress_lower_case logical expression ! exit: value is expression value ! ********************************************************************** ! eval_log_expr() constants integer, parameter :: eqv_op_len = max( len( eqv_str), len( neqv_str)) ! length of the next operator integer, parameter :: next_op_len = max( len( or_str), len( and_str), len( eqv_str), len( neqv_str)) ! ********************************************************************** ! eval_log_expr() local ! ---------------------------------------------------------------------- ! the current eqv operator character( len= eqv_op_len) :: eqv_op ! the next operator character( len= next_op_len) :: next_op ! ---------------------------------------------------------------------- ! point to characters not yet decoded integer :: next_char integer :: next_op_idx integer :: expr_len integer :: primary_len ! false if and but no eqv logical :: do_or ! expression values logical :: l_eqv, l_or, l_and logical :: r_eqv, r_or, r_and ! ********************************************************************** ! eval_log_expr() text continue ! ---------------------------------------------------------------------- ! limits of scan next_char = 1 expr_len = len_trim( log_expr) ! initialize equivalences eqv_op = eqv_str l_eqv = .true. ! ---------------------------------------------------------------------- ! scan thru log_expr eqv_ops: do if( next_char > expr_len) exit eqv_ops ! find a primary and return its length and value call eval_log_primary( log_expr( next_char: ), primary_len, r_eqv) next_op_idx = next_char + primary_len ! find next operator or end of expression eqv_or_end: if( next_op_idx <= expr_len )then ! decode which operator eqv_next_op: if( log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) == eqv_str )then next_op = log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) next_char = next_op_idx + len( eqv_str) else if( log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) == neqv_str )then eqv_next_op next_op = log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) next_char = next_op_idx + len( neqv_str) else if( log_expr( next_op_idx: next_op_idx + len( or_str) - 1) == or_str )then eqv_next_op next_op = log_expr( next_op_idx: next_op_idx + len( or_str) - 1) next_char = next_op_idx + len( or_str) else if( log_expr( next_op_idx: next_op_idx + len( and_str) - 1) == and_str )then eqv_next_op next_op = log_expr( next_op_idx: next_op_idx + len( and_str) - 1) next_char = next_op_idx + len( and_str) else eqv_next_op call msg_quit( "unknown logical operator: " // trim( log_expr( next_op_idx: ) )) end if eqv_next_op ! past end of expression else eqv_or_end next_op = blank next_char = next_op_idx end if eqv_or_end ! ---------------------------------------------------------------------- ! initialize for a set of or ops l_or = r_eqv ! ---------------------------------------------------------------------- ! process a set of and ops or_ops: do if( .not. ( next_op == or_str .or. next_op == and_str) ) exit or_ops do_or = next_op == or_str or_next: select case( do_or) case( .true.) or_next ! find a primary and return its length and value call eval_log_primary( log_expr( next_char: ), primary_len, r_or) next_op_idx = next_char + primary_len ! find next operator or end of expression or_end: if( next_op_idx <= expr_len )then ! decode which operator or_next_op: if( log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) == eqv_str )then next_op = log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) next_char = next_op_idx + len( eqv_str) else if( log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) == neqv_str )then or_next_op next_op = log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) next_char = next_op_idx + len( neqv_str) else if( log_expr( next_op_idx: next_op_idx + len( or_str) - 1) == or_str )then or_next_op next_op = log_expr( next_op_idx: next_op_idx + len( or_str) - 1) next_char = next_op_idx + len( or_str) else if( log_expr( next_op_idx: next_op_idx + len( and_str) - 1) == and_str )then or_next_op next_op = log_expr( next_op_idx: next_op_idx + len( and_str) - 1) next_char = next_op_idx + len( and_str) else or_next_op call msg_quit( "unknown logical operator: " // trim( log_expr( next_op_idx: ) ) ) end if or_next_op else or_end next_op = blank next_char = next_op_idx end if or_end case default or_next r_or = l_or end select or_next ! ---------------------------------------------------------------------- ! initialize for a set of and ops l_and = r_or ! ---------------------------------------------------------------------- ! process a set of and ops and_ops: do if( next_op /= and_str ) exit and_ops ! find a primary call eval_log_primary( log_expr( next_char: ), primary_len, r_and) next_op_idx = next_char + primary_len ! find next operator or end of expression and_end: if( next_op_idx <= expr_len )then ! decode which operator and_next_op: if( log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) == eqv_str )then next_op = log_expr( next_op_idx: next_op_idx + len( eqv_str) - 1) next_char = next_op_idx + len( eqv_str) else if( log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) == neqv_str )then and_next_op next_op = log_expr( next_op_idx: next_op_idx + len( neqv_str) - 1) next_char = next_op_idx + len( neqv_str) else if( log_expr( next_op_idx: next_op_idx + len( and_str) - 1) == and_str )then and_next_op next_op = log_expr( next_op_idx: next_op_idx + len( and_str) - 1) next_char = next_op_idx + len( and_str) else if( log_expr( next_op_idx: next_op_idx + len( or_str) - 1) == or_str )then and_next_op next_op = log_expr( next_op_idx: next_op_idx + len( or_str) - 1) next_char = next_op_idx + len( or_str) else and_next_op call msg_quit( "unknown logical operator: " // trim( log_expr( next_op_idx: ) ) ) end if and_next_op else and_end next_op = blank next_char = next_op_idx end if and_end ! do the pending and op l_and = l_and .and. r_and end do and_ops ! product is the right operand r_or = l_and ! ---------------------------------------------------------------------- ! do the pending or op this_or: select case( do_or) case( .true.) this_or l_or = l_or .or. r_or case default this_or l_or = r_or end select this_or end do or_ops ! product is the right operand r_eqv = l_or ! ---------------------------------------------------------------------- ! do the pending eqv op eqv_neqv: select case( eqv_op) case( blank, eqv_str) eqv_neqv l_eqv = l_eqv .eqv. r_eqv case( neqv_str) eqv_neqv l_eqv = l_eqv .neqv. r_eqv end select eqv_neqv eqv_op = next_op end do eqv_ops ! ---------------------------------------------------------------------- value = l_eqv ! ---------------------------------------------------------------------- ! eval_log_expr() exit return ! ********************************************************************** ! eval_log_expr() end subroutine eval_log_expr ! ********************************************************************** ! ********************************************************************** ! eval_rel_expr() a relational expression is evaluated as a logical subroutine eval_rel_expr( rel_expr, value) ! ********************************************************************** ! eval_rel_expr() interface ! ---------------------------------------------------------------------- ! the relational expression ot be evaluated character( len= *), intent( in) :: rel_expr ! the value of the relational expression logical, intent( out) :: value ! ********************************************************************** ! entry: expression is blank_compress_lower_case relational expression ! exit: value is expression value ! ********************************************************************** ! eval_rel_expr() local ! ---------------------------------------------------------------------- ! index of symbol entry integer :: dot_idx integer :: eq_idx, ne_idx, gt_idx, ge_idx, le_idx, lt_idx integer :: l_val, r_val character( len= buffer_len) :: expr_str ! ********************************************************************** ! eval_rel_expr() text continue ! ---------------------------------------------------------------------- dot_idx = index( rel_expr, dot) ! ---------------------------------------------------------------------- ! find a dot? got_dot: if( dot_idx > 0 )then ! seek all operators with dot eq_idx = index( rel_expr, dot_eq) ne_idx = index( rel_expr, dot_ne) gt_idx = index( rel_expr, dot_gt) ge_idx = index( rel_expr, dot_ge) le_idx = index( rel_expr, dot_le) lt_idx = index( rel_expr, dot_lt) ! ---------------------------------------------------------------------- ! find one dot_rel_op: if( eq_idx > 0 )then expr_str = rel_expr( 1: eq_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( eq_idx + len( dot_eq): ) call eval_int_expr( expr_str, r_val) value = l_val == r_val else if( ne_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: ne_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ne_idx + len( dot_ne): ) call eval_int_expr( expr_str, r_val) value = l_val /= r_val else if( ge_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: ge_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ge_idx + len( dot_ge): ) call eval_int_expr( expr_str, r_val) value = l_val >= r_val else if( le_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: le_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( le_idx + len( dot_le): ) call eval_int_expr( expr_str, r_val) value = l_val <= r_val else if( gt_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: gt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( gt_idx + len( dot_gt): ) call eval_int_expr( expr_str, r_val) value = l_val > r_val else if( lt_idx > 0 )then dot_rel_op expr_str = rel_expr( 1: lt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( lt_idx + len( dot_lt): ) call eval_int_expr( expr_str, r_val) value = l_val < r_val ! ---------------------------------------------------------------------- ! unknown relational operator else dot_rel_op call msg_quit( "no relational operator (.eq., .ne., .gt., .ge., .le., .lt.): " // rel_expr) end if dot_rel_op ! ---------------------------------------------------------------------- ! operator without dot else got_dot ! seek all comparison ops eq_idx = index( rel_expr, ch_eq) ne_idx = index( rel_expr, ch_ne) gt_idx = index( rel_expr, ch_gt) ge_idx = index( rel_expr, ch_ge) le_idx = index( rel_expr, ch_le) lt_idx = index( rel_expr, ch_lt) ! ---------------------------------------------------------------------- ! find one ch_rel_op: if( eq_idx > 0 )then expr_str = rel_expr( 1: eq_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( eq_idx + len( ch_eq): ) call eval_int_expr( expr_str, r_val) value = l_val == r_val else if( ne_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: ne_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ne_idx + len( ch_ne): ) call eval_int_expr( expr_str, r_val) value = l_val /= r_val else if( ge_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: ge_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( ge_idx + len( ch_ge): ) call eval_int_expr( expr_str, r_val) value = l_val >= r_val else if( le_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: le_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( le_idx + len( ch_le): ) call eval_int_expr( expr_str, r_val) value = l_val <= r_val else if( gt_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: gt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( gt_idx + len( ch_gt): ) call eval_int_expr( expr_str, r_val) value = l_val > r_val else if( lt_idx > 0 )then ch_rel_op expr_str = rel_expr( 1: lt_idx - 1) call eval_int_expr( expr_str, l_val) expr_str = rel_expr( lt_idx + len( ch_lt): ) call eval_int_expr( expr_str, r_val) value = l_val < r_val ! ---------------------------------------------------------------------- ! unknown relational operator else ch_rel_op call msg_quit( "no relational operator (==, /=, >, >=, <=, <): " // rel_expr) end if ch_rel_op end if got_dot ! ---------------------------------------------------------------------- ! eval_rel_expr() exit return ! ********************************************************************** ! eval_rel_expr() end subroutine eval_rel_expr ! ********************************************************************** ! ********************************************************************** ! seek_log_primary() a relational expression is evaluated as a logical subroutine seek_log_primary( log_expr, op_idx, rel_op_idx) ! ********************************************************************** ! seek_log_primary() interface ! ---------------------------------------------------------------------- ! the logical primary to be evaluated character( len= *), intent( in) :: log_expr ! the index of the next operator or end of line after the primary integer, intent( out) :: op_idx ! the index of the next relational operator or zero integer, intent( out) :: rel_op_idx ! ********************************************************************** ! entry: find log op before first (if any) open paren or after matching ! exit: length to first log op ! ********************************************************************** ! seek_log_primary() local integer :: paren_level ! ********************************************************************** ! seek_log_primary() text continue ! initialize while loop parameters op_idx = 1 paren_level = 0 rel_op_idx = 0 ! ---------------------------------------------------------------------- ! scan through expression scan_stmt: do if( op_idx > len_trim( log_expr)) exit scan_stmt ! check each character which_char: select case( log_expr( op_idx: op_idx)) ! need to track parenthesis level case( open_paren) which_char paren_level = paren_level + 1 op_idx = op_idx + len( open_paren) cycle scan_stmt case( close_paren) which_char paren_level = paren_level - 1 op_idx = op_idx + len( close_paren) cycle scan_stmt case( dot) which_char log_op_at_level_zero: if( paren_level == 0 )then ! find logical operator find_log_op: if( log_expr( op_idx: op_idx + len( or_str) - 1) == or_str )then exit scan_stmt else if( log_expr( op_idx: op_idx + len( and_str) - 1) == and_str )then find_log_op exit scan_stmt else if( log_expr( op_idx: op_idx + len( eqv_str) - 1) == eqv_str )then find_log_op exit scan_stmt else if( log_expr( op_idx: op_idx + len( neqv_str) - 1) == neqv_str )then find_log_op exit scan_stmt end if find_log_op end if log_op_at_level_zero end select which_char ! check for relational operator (which diagnoses a relational expression) rel_op_at_level_zero: if( paren_level == 0 )then found_rel_op: if( log_expr( op_idx: op_idx + len( dot_eq) - 1) == dot_eq & .or. log_expr( op_idx: op_idx + len( dot_ne) - 1) == dot_ne & .or. log_expr( op_idx: op_idx + len( dot_lt) - 1) == dot_lt & .or. log_expr( op_idx: op_idx + len( dot_le) - 1) == dot_le & .or. log_expr( op_idx: op_idx + len( dot_ge) - 1) == dot_ge & .or. log_expr( op_idx: op_idx + len( dot_gt) - 1) == dot_gt & .or. log_expr( op_idx: op_idx + len( ch_eq) - 1) == ch_eq & .or. log_expr( op_idx: op_idx + len( ch_ne) - 1) == ch_ne & .or. log_expr( op_idx: op_idx + len( ch_lt) - 1) == ch_lt & .or. log_expr( op_idx: op_idx + len( ch_le) - 1) == ch_le & .or. log_expr( op_idx: op_idx + len( ch_ge) - 1) == ch_ge & .or. log_expr( op_idx: op_idx + len( ch_gt) - 1) == ch_gt )then rel_op_idx = op_idx end if found_rel_op end if rel_op_at_level_zero ! catch unbalanced parenthesis in logical expression unbalanced_parens: if( paren_level < 0 )then call msg_quit( "unbalanced parenthesis in expression: " // trim( log_expr) ) end if unbalanced_parens ! scan next character op_idx = op_idx + 1 end do scan_stmt ! point to last character in primary op_idx = op_idx - 1 ! ---------------------------------------------------------------------- ! seek_log_primary() exit return ! ********************************************************************** ! seek_log_primary() end subroutine seek_log_primary ! ********************************************************************** ! ********************************************************************** ! eval_int_primary() decode a string to get an integer value recursive subroutine eval_int_primary( primary_str, primary_len, value) ! ********************************************************************** ! eval_int_primary() interface ! ---------------------------------------------------------------------- ! the integer primary to be evaluated character( len= *), intent( in) :: primary_str ! the length of the inetger primary integer, intent( out) :: primary_len ! the value of the primary integer, intent( out) :: value ! ********************************************************************** ! entry: primary_str is a string containing a literal integer ! exit: primary_len is the length decoded, value is integer value ! ********************************************************************** ! eval_int_primary() local ! ---------------------------------------------------------------------- ! decode integer literal via internal read integer :: conversion_iostat ! process sign separately integer :: isign ! pointers to characters integer :: next_char integer :: char_idx integer :: match_paren ! decode digit strings character( len= conversion_len) :: conversion_str ! string containing expressions character( len= buffer_len) :: expr_str ! ********************************************************************** ! eval_int_primary() text continue ! ---------------------------------------------------------------------- ! decode unary operator next_char = 1 ! evaluate the primary using the expression string expr_str = primary_str ! ---------------------------------------------------------------------- ! test first character is minus process_sign: select case( expr_str( next_char: next_char) ) ! ---------------------------------------------------------------------- case( minus) process_sign next_char = next_char + len( minus) primary_len = len( minus) isign = -1 ! ---------------------------------------------------------------------- ! test first character is plus case( plus) process_sign next_char = next_char + len( plus) primary_len = len( plus) isign = 1 ! ---------------------------------------------------------------------- ! test first character is neither plus nor minus case default process_sign primary_len = 0 isign = 1 end select process_sign ! ---------------------------------------------------------------------- ! find the value of a variable, a literal, or a parenthesized primary_str get_value: select case( expr_str( next_char: next_char) ) ! ---------------------------------------------------------------------- ! get the value from the variable case( 'a': 'z') get_value ! seek the value of the symbol name char_idx = verify( expr_str( next_char: ) // blank, alphanum_chars) + next_char - 2 call get_integer_value( expr_str( next_char: char_idx), value) ! processed the alphanumeric characters primary_len = primary_len + char_idx ! ---------------------------------------------------------------------- ! get the value of a literal case( '0': '9') get_value ! find the first character which is not a digit char_idx = verify( expr_str( next_char: ) // blank, digit_chars) + next_char - 2 ! decode digits conversion_str = expr_str( next_char: char_idx) conversion_str = adjustr( conversion_str) read( unit= conversion_str, fmt= conversion_fmt, iostat= conversion_iostat, iomsg= processor_msg) value ! check read error decode: if( conversion_iostat > 0 )then call msg_quit( "can't decode: " // primary_str) end if decode ! processed the digit string primary_len = primary_len + char_idx ! ---------------------------------------------------------------------- ! get the value of an primary_str case( open_paren) get_value call seek_close_paren( expr_str, next_char, match_paren) found_match: if( match_paren <= len_trim( primary_str) )then ! go evaluate the nested expression expr_str = primary_str( next_char + 1: match_paren - 1) call eval_int_expr( expr_str, value) ! unmatched parenthesis so complain and quit else found_match call msg_quit( "unmatched parenthesis: " // trim( primary_str)) end if found_match ! processed up to the closing parenthesis primary_len = match_paren ! ---------------------------------------------------------------------- ! error: cannot get the value case default get_value call msg_quit( "bad integer expression: " // trim( primary_str) ) end select get_value ! ---------------------------------------------------------------------- ! apply sign value = value * isign ! ---------------------------------------------------------------------- ! eval_int_primary() exit return ! ********************************************************************** ! eval_int_primary() end subroutine eval_int_primary ! ********************************************************************** ! ********************************************************************** ! eval_log_primary() decode a string to get an logical value recursive subroutine eval_log_primary( primary_str, primary_len, value) ! ********************************************************************** ! eval_log_primary() interface ! ---------------------------------------------------------------------- ! the logical primary to be evaluated character( len= *), intent( in) :: primary_str ! the length of the logical primary integer, intent( out) :: primary_len ! the value of the logical primary logical, intent( out) :: value ! ********************************************************************** ! entry: primary_str is a string containing a literal logical ! exit: value is logical value ! ********************************************************************** ! eval_log_primary() local ! ---------------------------------------------------------------------- ! logical "sign" logical :: lsign integer :: rel_op_idx ! next character to be decoded integer :: next_char integer :: match_paren character( len= buffer_len) :: expr_str ! ********************************************************************** ! eval_log_primary() text continue ! ---------------------------------------------------------------------- ! find length of primary and whether it is a relational expression call seek_log_primary( primary_str, primary_len, rel_op_idx) ! decode unary operator next_char = 1 ! ---------------------------------------------------------------------- ! expression too short to contain a .not. process_sign: if( primary_len <= len( not_str) )then lsign = .true. ! expression has a .not. else if( primary_str( next_char: len( not_str)) == not_str )then process_sign next_char = next_char + len( not_str) lsign = .false. ! no .not. else process_sign lsign = .true. end if process_sign ! ---------------------------------------------------------------------- ! a logical primary is either a logical expression or a relational expression log_or_rel: if( rel_op_idx == 0 )then ! ---------------------------------------------------------------------- ! find the value of a variable, a literal, or a parenthesized expression get_value: select case( primary_str( next_char: next_char) ) ! ---------------------------------------------------------------------- ! get the value from the variable case( 'a': 'z') get_value ! check whether it's a logical name or error call get_logical_value( primary_str( next_char: primary_len), value) ! ---------------------------------------------------------------------- ! get the value of a literal case( dot) get_value ! decode literal value literal_value: if( primary_str( next_char: next_char + len( true_str) - 1) == true_str )then ! found a .true. string value = .true. else if( primary_str( next_char: next_char + len( false_str) - 1) == false_str )then literal_value ! found a .false. string value = .false. ! complain and quit else literal_value call msg_quit( "bad logical literal: " // trim( primary_str) ) end if literal_value ! ---------------------------------------------------------------------- ! get the value of an expression case( open_paren) get_value ! seek the closing parenthesis call seek_close_paren( primary_str, next_char, match_paren) ! if found, determine whether it is a logical or (part of a) relational expression found_match: if( match_paren <= len_trim( primary_str) )then ! evaluate the logical expression within parenthesis expr_str = primary_str( next_char + 1: match_paren - 1) call eval_log_expr( expr_str, value) ! unmatched parenthesis so complain and quit else found_match call msg_quit( "unmatched parenthesis: " // trim( primary_str)) end if found_match ! ---------------------------------------------------------------------- ! error: can't decode logical value case default call msg_quit( "bad logical primary: " // trim( primary_str)) end select get_value ! ---------------------------------------------------------------------- ! evaluate the relational expression else log_or_rel call eval_rel_expr( primary_str( next_char: primary_len), value) end if log_or_rel ! ---------------------------------------------------------------------- ! apply sign value = value .eqv. lsign ! ---------------------------------------------------------------------- ! eval_log_primary() exit return ! ********************************************************************** ! eval_log_primary() end subroutine eval_log_primary ! ********************************************************************** ! ********************************************************************** ! %%% string utilities- editing, parenthesis and quotes ! ********************************************************************** ! ********************************************************************** ! replace_substring() edit source lines subroutine replace_substring( mixed_case_str, lower_case_str, search_str, replace_str, first_idx) ! ********************************************************************** ! replace_substring() interface ! ---------------------------------------------------------------------- ! mixed case string to be printed character( len= *), intent( in out), optional :: mixed_case_str ! lower case string to be searched character( len= *), intent( in out) :: lower_case_str ! substring to be replaced character( len= *), intent( in) :: search_str ! string to replace target character( len= *), intent( in) :: replace_str ! location of first occurance integer, intent( in) :: first_idx ! ********************************************************************** ! entry: line is a line of Fortran source with (possibly) ?target? ! exit: line has any ?target? strings replaced ! ********************************************************************** ! replace_substring() local ! ---------------------------------------------------------------------- ! beginning and end of target within lines integer :: end_idx integer :: search_idx integer :: search_len ! ********************************************************************** ! replace_substring() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! initialize search_idx = first_idx search_len = len( search_str) ! ---------------------------------------------------------------------- ! if mixed case is present mixed_present: if( present( mixed_case_str) )then ! replace in both strings edit_mixed: do if( search_idx == 0 ) exit edit_mixed end_idx = search_idx + search_len end_mixed: if( search_idx == 1 )then mixed_case_str = replace_str // mixed_case_str( end_idx: ) lower_case_str = replace_str // lower_case_str( end_idx: ) else if( end_idx > len( lower_case_str) )then end_mixed mixed_case_str = mixed_case_str( 1: search_idx - 1) & // replace_str lower_case_str = lower_case_str( 1: search_idx - 1) & // replace_str else end_mixed mixed_case_str = mixed_case_str( 1: search_idx - 1) & // replace_str & // mixed_case_str( end_idx: ) lower_case_str = lower_case_str( 1: search_idx - 1) & // replace_str & // lower_case_str( end_idx: ) end if end_mixed search_idx = index( lower_case_str, search_str) end do edit_mixed ! ---------------------------------------------------------------------- ! mixed case is not present else mixed_present ! replace in lower case only edit_string: do if( search_idx == 0 ) exit edit_string end_idx = search_idx + search_len end_lower: if( search_idx == 1 )then lower_case_str = replace_str // lower_case_str( end_idx: ) else if( end_idx > len( lower_case_str) )then end_lower lower_case_str = lower_case_str( 1: search_idx - 1) // replace_str else end_lower lower_case_str = lower_case_str( 1: search_idx - 1) & // replace_str & // lower_case_str( end_idx: ) end if end_lower search_idx = index( lower_case_str, search_str) end do edit_string end if mixed_present ! ---------------------------------------------------------------------- ! replace_substring() exit return ! ********************************************************************** ! replace_substring() end subroutine replace_substring ! ********************************************************************** ! ********************************************************************** ! seek_close_paren() true if successfully found matching () subroutine seek_close_paren( string, start, match) ! ********************************************************************** ! seek_close_paren() interface ! ---------------------------------------------------------------------- ! the string starting with open parenthesis character( len= *), intent( in) :: string ! the index of the open parenthesis integer, intent( in) :: start ! the index of the matching close parenthesis integer, intent( out) :: match ! ********************************************************************** ! seek_close_paren() local ! ---------------------------------------------------------------------- ! counters and pointers integer :: level integer :: string_len ! ********************************************************************** ! seek_close_paren() text continue ! ---------------------------------------------------------------------- ! initialize string_len = len_trim( string) level = 0 ! ---------------------------------------------------------------------- search: do match = start + 1, string_len levels: select case( string( match: match) ) case( open_paren) levels level = level + 1 case( close_paren) levels eureka: if( level == 0 )then exit search end if eureka level = level - 1 end select levels end do search ! ---------------------------------------------------------------------- ! seek_close_paren() exit return ! ********************************************************************** ! seek_close_paren() end subroutine seek_close_paren ! ********************************************************************** ! ********************************************************************** ! unquote_string() true if extracts string from between quotes subroutine unquote_string( quoted_str, unquoted_str, in_len, out_len) ! ********************************************************************** ! unquote_string() interface ! ---------------------------------------------------------------------- ! the quoted string to be unquoted character( len= *), intent( in) :: quoted_str ! the unquoted string character( len= *), intent( out) :: unquoted_str ! the length of the quoted string integer, intent( out) :: in_len ! the length of the unquoted string integer, intent( out) :: out_len ! ********************************************************************** ! unquote_string() local ! ---------------------------------------------------------------------- ! which quote is to be used character( len= 1) :: quote ! ********************************************************************** ! unquote_string() text continue ! ---------------------------------------------------------------------- ! which quote is the first quote (if either) which_quote: select case( quoted_str( 1: 1) ) ! ---------------------------------------------------------------------- ! string delimited by single quote case( single_quote) which_quote quote = single_quote ! ---------------------------------------------------------------------- ! string delimited by double quote case( double_quote) which_quote quote = double_quote ! ---------------------------------------------------------------------- ! string delimited by neither quote- nothing to do case default which_quote in_len = 0 out_len = len_trim( quoted_str) unquoted_str = quoted_str return end select which_quote ! ---------------------------------------------------------------------- ! initialize scan loop in_len = 2 out_len = 1 unquoted_str = blank ! scan thru the quoted string scan_string: do if( in_len > len_trim( quoted_str) ) exit scan_string ! ---------------------------------------------------------------------- ! if find one matching quote next_char: if( quoted_str( in_len: in_len) == quote )then ! check for a pair of quotes next_quote: if( quoted_str( in_len + 1: in_len + 1) == quote )then unquoted_str( out_len: out_len) = quoted_str( in_len: in_len) in_len = in_len + 1 out_len = out_len + 1 else next_quote exit scan_string end if next_quote ! check next character in_len = in_len + 1 ! ---------------------------------------------------------------------- ! character is not a matching quote else next_char unquoted_str( out_len: out_len) = quoted_str( in_len: in_len) in_len = in_len + 1 out_len = out_len + 1 end if next_char end do scan_string ! ---------------------------------------------------------------------- ! unquote_string() exit return ! ********************************************************************** ! unquote_string() end subroutine unquote_string ! ********************************************************************** ! ********************************************************************** ! to_lower() string is returned all lower case pure function to_lower( string) result( lc_str) ! ********************************************************************** ! to_lower() interface ! ---------------------------------------------------------------------- ! the string to be lowercased character( len= *), intent( in) :: string ! the lower case string character( len= len( string)) :: lc_str ! ********************************************************************** ! to_lower() local ! ---------------------------------------------------------------------- ! ascii characters change case integer, parameter :: change_case = 32 ! ---------------------------------------------------------------------- ! index characters in string integer :: i ! ********************************************************************** ! to_lower() text continue ! ---------------------------------------------------------------------- ! check every character in string scan_string: do i = 1, len( string) check_char: select case( string( i: i)) case( 'A': 'Z') check_char lc_str( i: i) = char( ichar( string( i: i)) + change_case) case default check_char lc_str( i: i) = string( i: i) end select check_char end do scan_string ! ---------------------------------------------------------------------- ! to_lower() exit return ! ********************************************************************** ! to_lower() end function to_lower ! ********************************************************************** ! ********************************************************************** ! format_date() date string is with slashes pure function format_date( string) result( fmt_str) ! ********************************************************************** ! format_date() interface ! ---------------------------------------------------------------------- ! the date string to be formatted character( len= 8), intent( in) :: string ! the lower case string character( len= 10) :: fmt_str ! ********************************************************************** ! format_date() text continue ! ---------------------------------------------------------------------- ! build the new string fmt_str = string( 1: 4) // slash // string( 5: 6) // slash // string( 7: 8) ! ---------------------------------------------------------------------- ! format_date() exit return ! ********************************************************************** ! format_date() end function format_date ! ********************************************************************** ! ********************************************************************** ! format_time() time string is with colons pure function format_time( string) result( fmt_str) ! ********************************************************************** ! format_time() interface ! ---------------------------------------------------------------------- ! the time string to be formatted character( len= 10), intent( in) :: string ! the lower case string character( len= 12) :: fmt_str ! ********************************************************************** ! format_time() text continue ! ---------------------------------------------------------------------- ! build the new string fmt_str = string( 1: 2) // colon // string( 3: 4) // colon // string( 5: 10) ! ---------------------------------------------------------------------- ! format_time() exit return ! ********************************************************************** ! format_time() end function format_time ! ********************************************************************** ! ********************************************************************** ! valid_new_name() returns if string is a valid name subroutine valid_new_name( string) ! ********************************************************************** ! valid_new_name() interface ! ---------------------------------------------------------------------- ! the name to be checked character( len= *), intent( in) :: string ! ---------------------------------------------------------------------- ! predefined macro index integer :: i ! character index integer :: char_idx ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! valid_new_name() text continue ! ---------------------------------------------------------------------- ! check that initial character is alphabetic char_idx = verify( string( 1: 1), alpha_chars) initial_ok: if( char_idx > 0 )then call msg_quit( "illegal initial character in name: " // string ) end if initial_ok ! check that following characters are legal char_idx = verify( string( 2: ), alphanum_chars) name_ok: if( char_idx > 0 )then call msg_quit( "illegal character in name: " // string ) end if name_ok ! ---------------------------------------------------------------------- ! check that name isn't predefined not_predefined: do i = 1, size( predefined_macros) not_name: if( string == trim( predefined_macros( i)% name_str) )then call msg_quit( "attempt to redefine a predefined macro: " // string) end if not_name end do not_predefined ! ---------------------------------------------------------------------- ! check that name doesn't exist on list yet nullify( symbol_ptr) call seek_symbol_name( string, symbol_ptr) duplicate_name: if( associated( symbol_ptr) )then call msg_quit( "attempt to declare duplicate name: " // string ) end if duplicate_name ! ---------------------------------------------------------------------- ! valid_new_name() exit return ! ********************************************************************** ! valid_new_name() end subroutine valid_new_name ! ********************************************************************** ! ********************************************************************** ! valid_new_cl_name() returns if string is a valid name subroutine valid_new_cl_name( string) ! ********************************************************************** ! valid_new_cl_name() interface ! ---------------------------------------------------------------------- ! the name to be checked character( len= *), intent( in) :: string ! ---------------------------------------------------------------------- ! index predefined macros integer :: i ! character index integer :: char_idx ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! valid_new_cl_name() text continue ! ---------------------------------------------------------------------- ! check that initial character is alphabetic char_idx = verify( string( 1: 1), alpha_chars) initial_ok: if( char_idx > 0 )then call msg_quit( "illegal initial character in name: " // string ) end if initial_ok ! check that following characters are legal char_idx = verify( string( 2: ), alphanum_chars) name_ok: if( char_idx > 0 )then call msg_quit( "illegal character in name: " // string ) end if name_ok ! ---------------------------------------------------------------------- ! check that name isn't predefined not_predefined: do i = 1, size( predefined_macros) not_name: if( string == trim( predefined_macros( i)% name_str) )then call msg_quit( "command line attempt to redefine a predefined macro: " // string) end if not_name end do not_predefined ! ---------------------------------------------------------------------- ! check that name doesn't exist on list yet nullify( symbol_ptr) call seek_cl_symbol_name( string, symbol_ptr) duplicate_name: if( associated( symbol_ptr) )then call msg_quit( "attempt to declare duplicate command line name: " // string ) end if duplicate_name ! ---------------------------------------------------------------------- ! valid_new_cl_name() exit return ! ********************************************************************** ! valid_new_cl_name() end subroutine valid_new_cl_name ! ********************************************************************** ! ********************************************************************** ! valid_new_sf_name() returns if string is a valid name subroutine valid_new_sf_name( string) ! ********************************************************************** ! valid_new_sf_name() interface ! ---------------------------------------------------------------------- ! the name to be checked character( len= *), intent( in) :: string ! ---------------------------------------------------------------------- ! index predefined macros integer :: i ! character index integer :: char_idx ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! valid_new_sf_name() text continue ! ---------------------------------------------------------------------- ! check that initial character is alphabetic char_idx = verify( string( 1: 1), alpha_chars) initial_ok: if( char_idx > 0 )then call msg_quit( "illegal initial character in name: " // string ) end if initial_ok ! check that following characters are legal char_idx = verify( string( 2: ), alphanum_chars) name_ok: if( char_idx > 0 )then call msg_quit( "illegal character in name: " // string ) end if name_ok ! ---------------------------------------------------------------------- ! check that name isn't predefined not_predefined: do i = 1, size( predefined_macros) not_name: if( string == trim( predefined_macros( i)% name_str) )then call msg_quit( "set file attempt to redefine a predefined macro: " // string) end if not_name end do not_predefined ! ---------------------------------------------------------------------- ! check that name doesn't exist on list yet nullify( symbol_ptr) call seek_sf_symbol_name( string, symbol_ptr) duplicate_name: if( associated( symbol_ptr) )then call msg_quit( "attempt to declare duplicate set file name: " // string ) end if duplicate_name ! ---------------------------------------------------------------------- ! valid_new_sf_name() exit return ! ********************************************************************** ! valid_new_sf_name() end subroutine valid_new_sf_name ! ********************************************************************** ! ********************************************************************** ! get_int_value_from_setfile() overwrites the integer value with one from the set file subroutine get_int_value_from_setfile( integer_ptr) ! ********************************************************************** ! get_int_value_from_setfile() interface ! ---------------------------------------------------------------------- ! the name to be checked type( integer_t), pointer :: integer_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_int_value_from_setfile() text continue ! ---------------------------------------------------------------------- ! check each symbol on the set file symbol list symbol_ptr => first_sf_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == integer_ptr% name_str )then types_match: select type( symbol_ptr) type is( integer_t) types_match constant_eqv: if( symbol_ptr% constant .eqv. integer_ptr% constant )then integer_ptr% defined = .true. integer_ptr% defined_file = symbol_ptr% defined_file integer_ptr% defined_line = symbol_ptr% defined_line integer_ptr% sf_defined = .true. integer_ptr% integer_value = symbol_ptr% integer_value else constant_eqv call msg_quit( "parameter mismatch set file versus source file: " // trim( integer_ptr% name_str)) end if constant_eqv class default types_match call msg_quit( "type mismatch set file versus source: " // trim( integer_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_int_value_from_setfile() exit return ! ********************************************************************** ! get_int_value_from_setfile() end subroutine get_int_value_from_setfile ! ********************************************************************** ! ********************************************************************** ! get_log_value_from_setfile() overwrites the logical value with one from the set file subroutine get_log_value_from_setfile( logical_ptr) ! ********************************************************************** ! get_log_value_from_setfile() interface ! ---------------------------------------------------------------------- ! the name to be checked type( logical_t), pointer :: logical_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_log_value_from_setfile() text continue ! ---------------------------------------------------------------------- ! check each symbol on the set file symbol list symbol_ptr => first_sf_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == logical_ptr% name_str )then types_match: select type( symbol_ptr) type is( logical_t) types_match constant_eqv: if( symbol_ptr% constant .eqv. logical_ptr% constant )then logical_ptr% defined = .true. logical_ptr% defined_file = symbol_ptr% defined_file logical_ptr% defined_line = symbol_ptr% defined_line logical_ptr% sf_defined = .true. logical_ptr% logical_value = symbol_ptr% logical_value else constant_eqv call msg_quit( "parameter mismatch set file versus source file: " // trim( logical_ptr% name_str)) end if constant_eqv class default types_match call msg_quit( "type mismatch set file versus source: " // trim( logical_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_log_value_from_setfile() exit return ! ********************************************************************** ! get_log_value_from_setfile() end subroutine get_log_value_from_setfile ! ********************************************************************** ! ********************************************************************** ! get_int_value_from_cmdline() overwrites the integer value with one from the command line subroutine get_int_value_from_cmdline( integer_ptr) ! ********************************************************************** ! get_int_value_from_cmdline() interface ! ---------------------------------------------------------------------- ! the name to be checked type( integer_t), pointer :: integer_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_int_value_from_cmdline() text continue ! ---------------------------------------------------------------------- ! check each symbol on the command line symbol list symbol_ptr => first_cl_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == integer_ptr% name_str )then types_match: select type( symbol_ptr) type is( integer_t) types_match integer_ptr% defined = .true. integer_ptr% defined_file = '' integer_ptr% defined_line = 0 integer_ptr% cl_defined = .true. integer_ptr% integer_value = symbol_ptr% integer_value class default types_match call msg_quit( "type mismatch command line versus source: " // trim( integer_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_int_value_from_cmdline() exit return ! ********************************************************************** ! get_int_value_from_cmdline() end subroutine get_int_value_from_cmdline ! ********************************************************************** ! ********************************************************************** ! get_log_value_from_cmdline() overwrites the logical value with one from the command line subroutine get_log_value_from_cmdline( logical_ptr) ! ********************************************************************** ! get_log_value_from_cmdline() interface ! ---------------------------------------------------------------------- ! the name to be checked type( logical_t), pointer :: logical_ptr ! ---------------------------------------------------------------------- ! search symbol list class( symbol_t), pointer :: symbol_ptr ! ---------------------------------------------------------------------- ! get_log_value_from_cmdline() text continue ! ---------------------------------------------------------------------- ! check each symbol on the command line symbol list symbol_ptr => first_cl_symbol check_all_symbols: do if( .not. associated( symbol_ptr ) ) exit check_all_symbols names_match: if( symbol_ptr% name_str == logical_ptr% name_str )then types_match: select type( symbol_ptr) type is( logical_t) types_match logical_ptr% defined = .true. logical_ptr% defined_file = '' logical_ptr% defined_line = 0 logical_ptr% cl_defined = .true. logical_ptr% logical_value = symbol_ptr% logical_value class default types_match call msg_quit( "type mismatch command line versus source: " // trim( logical_ptr% name_str)) end select types_match end if names_match symbol_ptr => symbol_ptr% next end do check_all_symbols ! ---------------------------------------------------------------------- ! get_log_value_from_cmdline() exit return ! ********************************************************************** ! get_log_value_from_cmdline() end subroutine get_log_value_from_cmdline ! ********************************************************************** ! ********************************************************************** ! get_cl_arg_check_len() overwrites the logical value with one from the command line subroutine get_cl_arg_check_len( iarg, buffer) ! ********************************************************************** ! get_cl_arg_check_len() interface ! ---------------------------------------------------------------------- ! which word integer, intent( in) :: iarg ! buffer to be filled character( len= *), intent( out) :: buffer ! ---------------------------------------------------------------------- ! communicate with get_command_argument integer :: cl_stat integer :: cl_arg_len ! ---------------------------------------------------------------------- ! get_cl_arg_check_len() text continue ! ---------------------------------------------------------------------- ! get the length then the value call get_command_argument( number= iarg, length= cl_arg_len, status= cl_stat) ! problem accessing the command line len_stat: if( cl_stat > 0 )then call msg_quit( "can't get command argument length") end if len_stat ! argument is too long for the buffer len_error: if( cl_arg_len > len( buffer) )then call msg_quit( "command line argument too long") end if len_error ! return it call get_command_argument( number= iarg, value= buffer) ! ---------------------------------------------------------------------- ! get_cl_arg_check_len() exit return ! ********************************************************************** ! get_cl_arg_check_len() end subroutine get_cl_arg_check_len ! ********************************************************************** ! ********************************************************************** ! check_key_chars_ok() overwrites the logical value with one from the command line pure function check_key_chars_ok( keys) result( ok) ! ********************************************************************** ! check_key_chars_ok() interface logical :: ok ! ---------------------------------------------------------------------- ! keys to check character( len= 2), intent( in) :: keys ! ---------------------------------------------------------------------- ! check_key_chars_ok() text continue ! ---------------------------------------------------------------------- ! check the list ok = verify( keys, ok_key_list) == 0 ! ---------------------------------------------------------------------- ! check_key_chars_ok() exit return ! ********************************************************************** ! check_key_chars_ok() end function check_key_chars_ok ! ********************************************************************** ! ********************************************************************** ! coco ! $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ********************************************************************** end program coco @ 2.8 log @enforce coding standard wrt first character of substrings @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.7 2011/12/23 14:58:32 dan Exp dan $ d46 5 d55 1 d69 1 a69 1 ! named set file- name taken from the output filename, or coco.set d100 1 a100 1 ! file_t- filename and unit d123 1 a123 1 ! 1. call process_command_line() to read command line, get filenames & options d159 1 a159 1 ! program source filename supplied by RCS d162 1 a162 1 '$Id: coco.f90,v 2.7 2011/12/23 14:58:32 dan Exp dan $' d196 1 a196 1 ! log file unit else use error_unit, +4 tries to avoid plot_unit, punch_unit, others d200 1 a200 1 ! scratch unit for name scratch files d248 1 a248 1 ! conversion of strings to integers- 10 digits supports 32 bit integers d258 1 a258 1 character( len= *), parameter :: conversion_fmt = '(i10)' d270 4 d280 1 a280 1 integer, parameter :: free_form_len = 131 d286 1 a286 1 ! length of character storing filenames d298 8 d353 1 a353 1 ! . separates filenames from extensions, delimits logical operators & literals a388 4 ! blank character character( len= *), parameter :: blank = ' ' d797 7 a803 1 integer, parameter :: pdm_size = cmdline_idx d826 1 a826 1 ! output filename constants d830 13 a842 1 ! suffix used to construct output filename if one name is on the command line d844 11 a854 1 character( len= *), parameter :: output_suffix = dot // 'f90' d858 1 a858 1 character( len= *), parameter :: fixed_suffix = dot // 'f' d910 22 a973 2 type( logical_t), pointer :: next_logical a993 2 type( integer_t), pointer :: next_integer a1007 2 type( macro_t), pointer :: next_macro a1021 2 type( text_t), pointer :: next_text d1074 4 a1157 14 ! sublists for each type of symbol type( integer_t), pointer :: first_integer type( integer_t), pointer :: last_integer type( logical_t), pointer :: first_logical type( logical_t), pointer :: last_logical type( macro_t), pointer :: first_macro type( macro_t), pointer :: last_macro type( text_t), pointer :: first_text type( text_t), pointer :: last_text a1164 8 ! sublists for each type of symbol type( integer_t), pointer :: first_sf_integer type( integer_t), pointer :: last_sf_integer type( logical_t), pointer :: first_sf_logical type( logical_t), pointer :: last_sf_logical a1171 8 ! sublists for each type of symbol type( integer_t), pointer :: first_cl_integer type( integer_t), pointer :: last_cl_integer type( logical_t), pointer :: first_cl_logical type( logical_t), pointer :: last_cl_logical d1176 1 a1176 1 type( macro_t), dimension( 1: pdm_size) :: predefined_macros d1232 4 d1242 1 a1242 1 ! number of filenames d1276 2 d1304 1 a1304 1 ! loop index of filename args d1324 1 a1324 1 ! process command line to get options and filenames d1473 1 a1473 1 keychars= blank) d1484 1 a1484 1 input_file = file_t( io_unit= input_unit, name_str= '', format_str= string_fmt, & d1487 3 a1489 1 output_file = file_t( io_unit= output_unit, name_str= '', format_str= string_fmt, & d1492 3 a1494 1 set_file = file_t( io_unit= set_unit, name_str= null_string, format_str= string_fmt, & d1499 1 a1499 1 log_file = file_t( io_unit= error_unit, name_str= '', format_str= integer_fmt, & d1502 3 a1504 1 name_file = file_t( io_unit= name_unit, name_str= null_string, format_str= null_string, & a1530 12 nullify( first_integer) nullify( last_integer) nullify( first_logical) nullify( last_logical) nullify( first_macro) nullify( last_macro) nullify( first_text) nullify( last_text) a1535 6 nullify( first_sf_integer) nullify( last_sf_integer) nullify( first_sf_logical) nullify( last_sf_logical) a1540 6 nullify( first_cl_integer) nullify( last_cl_integer) nullify( first_cl_logical) nullify( last_cl_logical) d1551 2 d1557 27 a1583 44 predefined_macros( file_idx) = macro_t( name_str= 'file', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= '', next_macro= null()) predefined_macros( line_idx) = macro_t( name_str= 'line', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= null_string, next_macro= null()) predefined_macros( date_idx) = macro_t( name_str= 'date', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= null_string, next_macro= null()) predefined_macros( time_idx) = macro_t( name_str= 'time', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= null_string, next_macro= null()) predefined_macros( coco_idx) = macro_t( name_str= 'coco', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= null_string, next_macro= null()) predefined_macros( setfile_idx) = macro_t( name_str= 'setfile', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= null_string, next_macro= null()) predefined_macros( logfile_idx) = macro_t( name_str= 'logfile', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= '', next_macro= null()) predefined_macros( output_idx) = macro_t( name_str= 'output', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= '', next_macro= null()) predefined_macros( cmdline_idx) = macro_t( name_str= 'cmdline', declared_file= 'predefined', declared_line= 0, & referenced= .false., referenced_file= null_string, referenced_line= 0, & next= null(), args_in_parens= .false., dummy_args= null(), actual_args= null(), & macro_value= null_string, next_macro= null()) d1685 2 a1686 1 iostat= this_file% io_status) d1765 2 a1766 1 iostat= this_file% io_status) d1825 2 a1826 1 iostat= this_file% io_status) d1899 2 a1900 1 iostat= this_file% io_status) a1953 8 ! the length of the command line integer :: cmdline_len ! check command line status integer :: cl_stat d1972 1 a1972 1 ! if input file names didn't come from the command line, get tehm from the set file d1978 1 a1978 1 rewind( unit= name_file% io_unit, iostat= name_file% io_status) d1982 1 a1982 1 call msg_quit( "can't rewind input list tmp file") d1992 1 a1992 1 read( unit= name_file% io_unit, iostat= name_file% io_status) input_file% name_str d1996 1 a1996 1 call msg_quit( "can't read input name tmp file") d2013 1 a2013 1 allocate( source_file_list( 2: number_of_names), stat= astat) d2028 1 a2028 1 read( unit= name_file% io_unit, iostat= name_file% io_status) source_file_list( i)% name_str d2100 2 d2158 77 d2243 1 a2243 1 command_line_too_long: if( cmdline_len > len( predefined_macros( cmdline_idx)% macro_value) )then d2249 24 a2272 1 call get_command( command= predefined_macros( cmdline_idx)% macro_value) d2276 390 a2665 1 ! set_option_defaults() exit d2671 1 a2671 1 ! set_option_defaults() d2673 1 a2673 1 end subroutine set_option_defaults d2704 4 d2718 12 d2754 1 a2754 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco error: file: ' & d2756 1 a2756 1 // ', ' // ', iostat: ' // trim( adjustl( iostat_str)) // ': ' // msg) d2768 1 a2768 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco error: file: ' & d2770 1 a2770 1 // ', ' // msg) d2780 1 a2780 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( 'coco error: ' // msg) d2879 1 a2879 1 ! process_command_line gets filenames from the command line d2883 1 a2883 1 ! default coco filenames constants d2887 1 a2887 1 ! input filename constants d2891 1 a2891 1 ! suffix used to construct input filename if one name is on the command line d2936 1 a2936 1 ! input filenames d2944 1 a2944 1 ! loop through input filenames d3118 1 a3118 1 ! process filenames d3120 1 a3120 1 filenames: select case( number_of_names) d3124 1 a3124 1 ! one filename arg d3126 1 a3126 1 case( 1) filenames d3132 1 a3132 1 call msg_quit( 'filename too long: ' // trim( optarg) ) d3136 1 a3136 1 ! use basename to make input filename d3144 1 a3144 1 ! use basename to make output filename d3152 1 a3152 1 ! if set file is (still) unnamed, use basename to make set file filename d3162 1 a3162 1 ! more than one filename arg d3164 1 a3164 1 case( 2: ) filenames d3174 1 a3174 1 allocate( source_file_list( 2: number_of_names), stat= astat) d3208 1 a3208 1 ! if set file is (still) unnamed, use basename to make set file filename d3236 1 a3236 1 end select filenames d3679 4 d3691 1 a3691 15 ! build new integer on list subsequent_or_first: if( associated( first_cl_integer) )then allocate( last_cl_integer% next_integer, stat= astat) alloc_error: if( astat > 0 )then call msg_quit( "can't allocate -D integer: " // trim( integer_name)) end if alloc_error last_cl_integer => last_cl_integer% next_integer last_cl_symbol% next => last_cl_integer last_cl_symbol => last_cl_symbol% next d3693 1 a3693 1 else subsequent_or_first d3695 1 a3695 1 allocate( first_cl_integer, stat= astat) d3697 1 a3697 1 first_alloc_error: if( astat > 0 )then d3699 1 a3699 1 call msg_quit( "can't allocate first -D integer: " // trim( integer_name)) d3701 1 a3701 1 end if first_alloc_error d3703 1 a3703 1 last_cl_integer => first_cl_integer d3705 1 a3705 1 start_list: if( associated( first_cl_symbol) )then d3707 1 a3707 2 last_cl_symbol% next => last_cl_integer last_cl_symbol => last_cl_symbol% next d3709 1 a3709 1 else start_list d3711 1 a3711 2 first_cl_symbol => first_cl_integer last_cl_symbol => first_cl_symbol d3713 1 a3713 1 end if start_list d3717 2 d3723 1 a3723 3 last_cl_symbol% name_str = integer_name nullify( last_cl_symbol% next) d3729 1 a3729 3 call eval_int_expr( int_decl_str( len( equals) + 1: ), last_cl_integer% integer_value) nullify( last_cl_integer% next_integer) d3778 4 d3790 5 a3794 1 ! build new logical on list d3796 1 a3796 1 subsequent_or_first: if( associated( first_cl_logical) )then d3798 1 a3798 1 allocate( last_cl_logical% next_logical, stat= astat) d3800 1 a3800 1 alloc_error: if( astat > 0 )then d3802 1 a3802 1 call msg_quit( "can't allocate logical: " // trim( logical_name)) d3804 1 a3804 1 end if alloc_error a3805 2 last_cl_logical => last_cl_logical% next_logical last_cl_symbol% next => last_cl_logical d3810 1 a3810 1 allocate( first_cl_logical, stat= astat) d3812 1 a3812 1 first_alloc_error: if( astat > 0 )then d3814 1 a3814 7 call msg_quit( "can't allocate first logical: " // trim( logical_name)) end if first_alloc_error last_cl_logical => first_cl_logical start_list: if( associated( first_cl_symbol) )then d3816 1 a3816 11 last_cl_symbol% next => last_cl_logical last_cl_symbol => last_cl_symbol% next else start_list first_cl_symbol => first_cl_logical last_cl_symbol => first_cl_symbol end if start_list end if subsequent_or_first d3822 1 a3822 3 last_cl_symbol% name_str = logical_name nullify( last_cl_symbol% next) d3828 1 a3828 3 last_cl_logical% logical_value = .true. nullify( last_cl_logical% next_logical) d3928 1 a3928 1 ' -I directory/ search directory for include files (after .) ', & d3962 1 a3962 1 write( unit= error_unit, fmt= string_fmt) ( trim( options_msg( i)), i= 1, size( options_msg)) d4876 14 d4995 10 a5004 1 write( unit= log_file% io_unit, fmt= log_file% format_str, advance= 'NO') 'include path: .' d5015 1 a5015 1 blank // trim( path_ptr% name_str) // open_paren, path_ptr% times_accessed, close_paren d5399 6 d5421 1 a5421 1 inquire( file= cl_set_file% name_str, exist= cl_set_file% named_file, iostat= cl_set_file% io_status) a5428 2 ! done checking set file name d5447 1 a5447 1 inquire( file= set_file% name_str, exist= set_file% named_file, iostat= set_file% io_status) d5461 26 d5493 1 a5493 1 inquire( file= default_name, exist= set_file% named_file, iostat= set_file% io_status) d5604 1 a5604 1 read( unit= set_file% io_unit, fmt= set_file% format_str, iostat= set_file% io_status) set_file% line d5749 1 a5749 1 read( unit= set_file% io_unit, fmt= set_file% format_str, iostat= set_file% io_status) set_file% line d5817 2 a5818 1 ! "logfile'...'" | "number:..." | "report:..." | "verbose:..." d5930 1 a5930 1 ! if the directive is a set file post: directive d5932 1 a5932 1 else if( set_stmt( 1: len( post_str)) == post_str )then which_directive d5934 1 a5934 1 call process_post_directive( set_stmt( len( post_str) + 1: )) d5938 1 a5938 1 ! if the directive is a set file output directive d5940 1 a5940 1 else if( set_stmt( 1: len( output_str)) == output_str )then which_directive d5942 1 a5942 1 call process_output_directive( set_stmt( len( output_str) + 1: )) d6454 1 a6454 1 allocate( current_directory% next, stat= astat) d6468 1 a6468 1 allocate( first_directory, stat= astat) d6589 1 a6589 1 write( unit= name_file% io_unit, iostat= name_file% io_status) input_name d7682 4 d7694 5 a7698 1 ! build new integer on list d7700 1 a7700 1 subsequent_or_first: if( associated( first_sf_integer) )then d7702 1 a7702 1 allocate( last_sf_integer% next_integer, stat= astat) d7704 1 a7704 1 alloc_error: if( astat > 0 )then d7706 1 a7706 1 call msg_quit( "can't allocate set file integer: " // trim( integer_name)) d7708 1 a7708 1 end if alloc_error a7709 2 last_sf_integer => last_sf_integer% next_integer last_sf_symbol% next => last_sf_integer d7714 1 a7714 1 allocate( first_sf_integer, stat= astat) d7716 1 a7716 1 first_alloc_error: if( astat > 0 )then d7718 1 a7718 3 call msg_quit( "can't allocate first set file integer: " // trim( integer_name)) end if first_alloc_error d7720 1 a7720 15 last_sf_integer => first_sf_integer start_list: if( associated( first_symbol) )then last_sf_symbol% next => last_sf_integer last_sf_symbol => last_sf_symbol% next else start_list first_sf_symbol => first_sf_integer last_sf_symbol => first_sf_symbol end if start_list end if subsequent_or_first d7726 1 a7726 4 last_sf_symbol% name_str = integer_name last_sf_symbol% declared_file = current_file% name_str last_sf_symbol% declared_line = current_file% lines_transfered d7728 2 a7729 1 nullify( last_sf_symbol% next) d7735 1 a7735 1 last_sf_integer% constant = is_const d7741 1 a7741 1 last_sf_integer% defined = int_decl_str( 1: len( equals)) == equals d7745 1 a7745 1 last_sf_integer% defined = .false. d7751 1 a7751 1 constant_value: if( .not. last_sf_integer% defined )then d7759 1 a7759 1 process_value: if( last_sf_integer% defined )then d7765 1 a7765 1 call eval_int_expr( expr_str, last_sf_integer% integer_value) d7767 1 a7767 1 non_const: if( last_sf_integer% constant .and. .not. all_constants )then d7773 2 a7774 2 last_sf_integer% defined_file = current_file% name_str last_sf_integer% defined_line = current_file% lines_transfered a7777 2 nullify( last_sf_integer% next_integer) d7952 4 d7964 5 a7968 1 ! build new logical on list d7970 1 a7970 1 subsequent_or_first: if( associated( first_sf_logical) )then d7972 1 a7972 1 allocate( last_sf_logical% next_logical, stat= astat) d7974 1 a7974 1 alloc_error: if( astat > 0 )then d7976 1 a7976 1 call msg_quit( "can't allocate logical: " // trim( logical_name)) d7978 1 a7978 1 end if alloc_error a7979 2 last_sf_logical => last_sf_logical% next_logical last_sf_symbol% next => last_sf_logical d7984 1 a7984 1 allocate( first_sf_logical, stat= astat) d7986 1 a7986 1 first_alloc_error: if( astat > 0 )then d7988 1 a7988 3 call msg_quit( "can't allocate first set filelogical: " // trim( logical_name)) end if first_alloc_error d7990 1 a7990 15 last_sf_logical => first_sf_logical start_list: if( associated( first_sf_symbol) )then last_sf_symbol% next => last_sf_logical last_sf_symbol => last_sf_symbol% next else start_list first_sf_symbol => first_sf_logical last_sf_symbol => first_sf_symbol end if start_list end if subsequent_or_first d7996 1 a7996 4 last_sf_symbol% name_str = logical_name last_sf_symbol% declared_file = current_file% name_str last_sf_symbol% declared_line = current_file% lines_transfered d7998 2 a7999 1 nullify( last_sf_symbol% next) d8005 1 a8005 1 last_sf_logical% constant = is_const d8009 1 a8009 1 last_sf_logical% sf_defined = .false. d8015 1 a8015 1 last_sf_logical% defined = log_decl_str( 1: len( equals)) == equals d8019 1 a8019 1 last_sf_logical% defined = .false. d8025 1 a8025 1 constant_value: if( .not. last_sf_logical% defined )then d8034 1 a8034 1 process_value: if( last_sf_logical% defined )then d8040 1 a8040 1 call eval_log_expr( expr_str, last_sf_logical% logical_value) d8042 1 a8042 1 non_const: if( last_sf_logical% constant .and. .not. all_constants )then d8048 2 a8049 2 last_sf_logical% defined_file = current_file% name_str last_sf_logical% defined_line = current_file% lines_transfered a8052 2 nullify( last_sf_logical% next_logical) d8149 1 a8149 1 read( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & d8296 1 a8296 1 ! if ? present, edit source line d8298 1 a8298 1 edit_line: if( index( line, l_key) > 0 )then d8607 2 a8608 1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) null_string d8626 2 a8627 1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) trim( line_buffer) d8645 2 a8646 1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) trim( line_buffer) d8664 2 a8665 1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) trim( line_buffer) d8739 2 a8740 1 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) trim( this_file% line) d9007 1 a9007 1 ! check the include syntax: unquote the include filename d9030 1 a9030 1 exist= include_file% named_file, iostat= include_file% io_status) d9040 5 a9044 1 seek_inc: if( .not. include_file% named_file )then d9203 1 a9203 1 inquire( file= trial_name, exist= include_file% named_file, iostat= include_file% io_status) d9227 1 a9227 1 ! filename not yet found so try next directory d10119 138 a10256 1 end do each_arg d10260 1 a10260 1 ! process_actual_arglist() exit d10266 1 a10266 1 ! process_actual_arglist() d10268 1 a10268 1 end subroutine process_actual_arglist d10273 1 a10273 1 ! wrap_source_line() ensure lines are not too long d10275 1 a10275 1 subroutine wrap_source_line( wrap_line) d10279 1 a10279 1 ! wrap_source_line() interface d10287 4 d10295 1 a10295 1 ! exit: line has continuations written and fewer than 132 source lines d10299 1 a10299 1 ! wrap_source_line() constants d10303 1 a10303 1 ! start in the right column for fixed format d10305 1 a10305 1 integer, parameter :: start_col = 5 d10307 1 a10307 1 ! fixed format start of line d10309 1 a10309 1 character( len= *), parameter :: blank_str = repeat( blank, start_col) d10311 1 a10311 1 ! ********************************************************************** d10313 1 a10313 3 ! wrap_source_line() local ! ---------------------------------------------------------------------- d10315 1 a10315 1 ! length of source line d10317 1 a10317 1 integer :: output_len d10321 1 a10321 1 ! wrap_source_line() text d10331 1 a10331 1 output_len = len_trim( wrap_line) d10335 1 a10335 5 ! while line is too long wrap_lines: do if( output_len <= wrap_len ) exit wrap_lines d10337 1 a10337 1 ! process fixed format differently d10339 1 a10339 1 fix_length: if( options% free_form )then d10341 1 a10341 1 ! free format line up to the breakpoint, then the continuation character d10343 2 a10344 1 line = wrap_line( 1: wrap_len - len( continuation)) // continuation d10346 1 a10346 1 ! the continuation character, then the rest of the line d10348 1 a10348 1 wrap_line = continuation // wrap_line( wrap_len: ) d10350 1 a10350 1 else fix_length d10352 2 a10353 1 ! fixed format line up to the breakpoint, then blanks to column 72, then continuation in column 73 d10355 1 a10355 1 line = wrap_line( 1: wrap_len) d10357 2 a10358 1 ! blanks up to column 6, then continuation in column 6, then the rest of the line d10360 2 a10361 1 wrap_line = blank_str // continuation // wrap_line( wrap_len + 1: ) d10363 1 a10363 1 end if fix_length d10365 1 a10365 1 ! write lines as they are made d10367 1 a10367 11 call write_source_line( output_file) ! reset line to check for another wrap output_len = len_trim( wrap_line) ! ---------------------------------------------------------------------- ! while line is too long end do wrap_lines d10371 1 a10371 1 ! wrap_source_line() exit d10377 1 a10377 1 ! wrap_source_line() d10379 1 a10379 1 end subroutine wrap_source_line d11291 1 a11291 1 write( unit= conversion_str, fmt= conversion_fmt, iostat= istat) integer_value d11666 4 d11678 5 a11682 1 ! build new integer on list d11684 1 a11684 1 subsequent_or_first: if( associated( first_integer) )then d11686 1 a11686 1 allocate( last_integer% next_integer, stat= astat) d11688 1 a11688 1 alloc_error: if( astat > 0 )then d11690 1 a11690 1 call msg_quit( "can't allocate integer: " // trim( integer_name)) d11692 1 a11692 1 end if alloc_error a11693 2 last_integer => last_integer% next_integer last_symbol% next => last_integer d11698 1 a11698 1 allocate( first_integer, stat= astat) d11700 1 a11700 1 first_alloc_error: if( astat > 0 )then d11702 1 a11702 15 call msg_quit( "can't allocate first integer: " // trim( integer_name)) end if first_alloc_error last_integer => first_integer start_list: if( associated( first_symbol) )then last_symbol% next => last_integer last_symbol => last_symbol% next else start_list first_symbol => first_integer last_symbol => first_symbol d11704 1 a11704 3 end if start_list end if subsequent_or_first d11710 1 a11710 1 last_symbol% name_str = integer_name d11712 2 a11713 2 last_symbol% declared_file = current_file% name_str last_symbol% declared_line = current_file% lines_transfered d11715 3 a11717 5 last_symbol% referenced = .false. last_symbol% referenced_file = null_string last_symbol% referenced_line = 0 nullify( last_symbol% next) d11723 1 a11723 1 last_integer% constant = is_const d11727 2 a11728 2 last_integer% sf_defined = .false. last_integer% cl_defined = .false. d11734 1 a11734 1 last_integer% defined = int_decl_str( 1: len( equals)) == equals d11738 1 a11738 1 last_integer% defined = .false. d11744 1 a11744 1 constant_value: if( last_integer% constant .and. .not. last_integer% defined )then d11752 1 a11752 1 process_value: if( last_integer% defined )then d11758 1 a11758 1 call eval_int_expr( expr_str, last_integer% integer_value) d11760 1 a11760 1 non_const: if( last_integer% constant .and. .not. all_constants )then d11766 2 a11767 2 last_integer% defined_file = current_file% name_str last_integer% defined_line = current_file% lines_transfered a11770 2 nullify( last_integer% next_integer) d11773 2 a11774 2 call get_int_value_from_setfile( last_integer) call get_int_value_from_cmdline( last_integer) d11954 4 d11966 5 a11970 1 ! build new logical on list d11972 1 a11972 1 subsequent_or_first: if( associated( first_logical) )then d11974 1 a11974 1 allocate( last_logical% next_logical, stat= astat) d11976 1 a11976 1 alloc_error: if( astat > 0 )then d11978 1 a11978 1 call msg_quit( "can't allocate logical: " // trim( logical_name)) d11980 1 a11980 1 end if alloc_error a11981 2 last_logical => last_logical% next_logical last_symbol% next => last_logical d11986 1 a11986 1 allocate( first_logical, stat= astat) d11988 1 a11988 1 first_alloc_error: if( astat > 0 )then d11990 1 a11990 15 call msg_quit( "can't allocate first logical: " // trim( logical_name)) end if first_alloc_error last_logical => first_logical start_list: if( associated( first_symbol) )then last_symbol% next => last_logical last_symbol => last_symbol% next else start_list first_symbol => first_logical last_symbol => first_symbol d11992 1 a11992 3 end if start_list end if subsequent_or_first d11998 1 a11998 1 last_symbol% name_str = logical_name d12000 2 a12001 2 last_symbol% declared_file = current_file% name_str last_symbol% declared_line = current_file% lines_transfered d12003 3 a12005 5 last_symbol% referenced = .false. last_symbol% referenced_file = null_string last_symbol% referenced_line = 0 nullify( last_symbol% next) d12011 1 a12011 1 last_logical% constant = is_const d12015 2 a12016 2 last_logical% sf_defined = .false. last_logical% cl_defined = .false. d12022 1 a12022 1 last_logical% defined = log_decl_str( 1: len( equals)) == equals d12026 1 a12026 1 last_logical% defined = .false. d12032 1 a12032 1 constant_value: if( last_logical% constant .and. .not. last_logical% defined )then d12041 1 a12041 1 process_value: if( last_logical% defined )then d12047 1 a12047 1 call eval_log_expr( expr_str, last_logical% logical_value) d12049 1 a12049 1 non_const: if( last_logical% constant .and. .not. all_constants )then d12055 2 a12056 2 last_logical% defined_file = current_file% name_str last_logical% defined_line = current_file% lines_transfered a12059 2 nullify( last_logical% next_logical) d12062 2 a12063 2 call get_log_value_from_setfile( last_logical) call get_log_value_from_cmdline( last_logical) d12125 1 a12125 1 allocate( if_construct% nested, stat= astat) d13105 4 d13125 5 a13129 1 ! build new macro on list d13131 1 a13131 1 subsequent_or_first: if( associated( first_macro) )then d13133 1 a13133 1 allocate( last_macro% next_macro, stat= astat) d13135 1 a13135 1 alloc_error: if( astat > 0 )then d13137 1 a13137 1 call msg_quit( "can't allocate macro: " // trim( macro_name)) d13139 1 a13139 1 end if alloc_error a13140 2 last_macro => last_macro% next_macro last_symbol% next => last_macro d13145 1 a13145 1 allocate( first_macro, stat= astat) d13147 1 a13147 1 first_alloc_error: if( astat > 0 )then d13149 1 a13149 15 call msg_quit( "can't allocate first macro: " // trim( macro_name)) end if first_alloc_error last_macro => first_macro start_list: if( associated( first_symbol) )then last_symbol% next => last_macro last_symbol => last_symbol% next else start_list first_symbol => first_macro last_symbol => first_symbol d13151 1 a13151 3 end if start_list end if subsequent_or_first d13157 1 a13157 1 last_symbol% name_str = macro_name d13159 2 a13160 2 last_symbol% declared_file = current_file% name_str last_symbol% declared_line = current_file% lines_transfered d13162 3 a13164 5 last_symbol% referenced = .false. last_symbol% referenced_file = null_string last_symbol% referenced_line = 0 nullify( last_symbol% next) d13184 1 a13184 1 call process_dummy_arglist( mac_decl_str( len( open_paren) + 1: arglist_len - 1), last_macro% dummy_args) d13186 1 a13186 1 allocate( last_macro% actual_args( size( last_macro% dummy_args)), stat= astat) d13190 1 a13190 1 call msg_quit( "can't aloocate macro actual args array: " // trim( last_macro% name_str)) d13200 1 a13200 1 call msg_quit( "macro actual args declared to need parens but no dummy args: " // trim( last_macro% name_str)) d13220 1 a13220 1 call verify_macro_value( last_macro% dummy_args, mac_decl_str( eq_idx + 1: )) d13226 1 a13226 1 last_macro% macro_value = adjustl( asis_stmt( eq_idx + 1: asis_len)) d13230 1 a13230 3 last_macro% args_in_parens = must_parens nullify( last_macro% next_macro) d13327 1 a13327 1 allocate( arg_array( 1: number_of_args), stat= astat) d13805 4 d13817 5 a13821 1 ! build new text on list d13823 1 a13823 1 subsequent_or_first: if( associated( first_text) )then d13825 1 a13825 1 allocate( last_text% next_text, stat= astat) d13827 1 a13827 1 alloc_error: if( astat > 0 )then d13829 1 a13829 1 call msg_quit( "can't allocate text: " // trim( text_name)) d13831 1 a13831 1 end if alloc_error a13832 2 last_text => last_text% next_text last_symbol% next => last_text d13837 1 a13837 1 allocate( first_text, stat= astat) d13839 1 a13839 1 first_alloc_error: if( astat > 0 )then d13841 1 a13841 1 call msg_quit( "can't allocate first text: " // trim( text_name)) d13843 1 a13843 17 end if first_alloc_error last_text => first_text start_list: if( associated( first_symbol) )then last_symbol% next => last_text last_symbol => last_symbol% next else start_list first_symbol => first_text last_symbol => first_symbol end if start_list end if subsequent_or_first d13849 1 a13849 1 last_symbol% name_str = text_name d13851 2 a13852 2 last_symbol% declared_file = current_file% name_str last_symbol% declared_line = current_file% lines_transfered d13854 3 a13856 5 last_symbol% referenced = .false. last_symbol% referenced_file = null_string last_symbol% referenced_line = 0 nullify( last_symbol% next) d13864 1 a13864 1 ! arglist_len is zero if no close paren d13876 1 a13876 1 call process_dummy_arglist( text_decl_str( len( open_paren) + 1: arglist_len - 1), last_text% dummy_args) d13878 1 a13878 1 allocate( last_text% actual_args( size( last_text% dummy_args)), stat= astat) d13882 1 a13882 1 call msg_quit( "can't aloocate text actual args array: " // trim( last_text% name_str)) d13892 1 a13892 1 call msg_quit( "text actual args declared to need parens but no dummy args: " // trim( last_text% name_str)) d13914 1 a13914 1 call assign_text_value( text_name, last_text% dummy_args, last_text% text_lines) d13918 1 a13918 3 last_text% args_in_parens = must_parens nullify( last_text% next_text) d14031 1 a14031 1 text_file = file_t( io_unit= text_unit, name_str= null_string, & d14055 1 a14055 1 iostat= current_file% io_status) current_file% line d14091 1 a14091 1 write( unit= text_file% io_unit, iostat= text_file% io_status) text_file% line d14172 1 a14172 1 call msg_quit( "text block has no lines " // trim( text_name)) d14184 1 a14184 1 allocate( lines_array( 1: text_file% lines_transfered), stat= astat) d14198 1 a14198 1 rewind( unit= text_file% io_unit, iostat= text_file% io_status) d14210 1 a14210 1 read( unit= text_file% io_unit, iostat= text_file% io_status) lines_array( i) d15020 1 a15020 1 character( len= *), dimension( 1: 12), parameter :: document_text = [ & d15027 1 a15027 2 '! Preprocessor version: ', & '! ?coco? ', & d15031 4 d15527 1 a15527 1 type( integer_t), pointer :: integer_ptr d15539 1 a15539 1 integer_ptr => first_integer d15543 3 a15545 1 if( .not. associated( integer_ptr) ) exit search_list d15547 1 a15547 1 name_match: if( integer_str == integer_ptr% name_str )then d15549 1 a15549 1 value_defined: if( integer_ptr% defined )then d15551 1 a15551 1 return_value = integer_ptr% integer_value d15553 1 a15553 3 integer_ptr% referenced = .true. integer_ptr% referenced_file = current_file% name_str integer_ptr% referenced_line = current_file% lines_transfered d15555 7 a15561 1 return d15563 1 a15563 1 else value_defined d15565 1 a15565 1 call msg_quit( "integer not defined: " // trim( integer_str) ) d15567 1 a15567 1 end if value_defined d15569 1 a15569 1 end if name_match d15571 1 a15571 1 integer_ptr => integer_ptr% next_integer d15629 1 a15629 1 type( logical_t), pointer :: logical_ptr d15641 1 a15641 1 logical_ptr => first_logical d15645 1 a15645 1 if( .not. associated( logical_ptr) ) exit search_list d15647 1 a15647 1 name_match: if( logical_str == logical_ptr% name_str )then d15649 1 a15649 1 value_defined: if( logical_ptr% defined )then d15651 1 a15651 1 return_value = logical_ptr% logical_value d15653 1 a15653 3 logical_ptr% referenced = .true. logical_ptr% referenced_file = current_file% name_str logical_ptr% referenced_line = current_file% lines_transfered d15655 9 a15663 1 return d15665 1 a15665 1 else value_defined d15667 1 a15667 1 call msg_quit( "logical not defined: " // trim( logical_str) ) d15669 1 a15669 1 end if value_defined d15671 1 a15671 1 end if name_match d15673 1 a15673 1 logical_ptr => logical_ptr% next_logical d15726 2 d15738 1 a15738 1 text_ptr => first_text d15742 7 a15748 1 if( .not. associated( text_ptr) ) exit search_list d15750 1 a15750 1 name_match: if( name_str == text_ptr% name_str )then d15752 3 a15754 1 return d15756 1 a15756 1 end if name_match d15758 1 a15758 1 text_ptr => text_ptr% next_text d15862 6 d15878 1 a15878 1 integer_ptr => integer_ptr% next_integer d15882 1 a15882 1 integer_ptr => first_integer d15886 24 d15948 6 d15964 1 a15964 1 logical_ptr => logical_ptr% next_logical d15968 1 a15968 1 logical_ptr => first_logical d15972 24 d16034 6 d16050 1 a16050 1 macro_ptr => macro_ptr% next_macro d16054 1 a16054 1 macro_ptr => first_macro d16058 24 d16197 1 a16197 1 integer_ptr => first_integer d16199 1 a16199 1 search_integers: do a16210 2 integer_ptr => integer_ptr% next_integer d16215 1 a16215 1 logical_ptr => first_logical d16217 1 a16217 1 search_logicals: do a16228 2 logical_ptr => logical_ptr% next_logical d16249 1 a16249 1 ! can't classify the expression, punt d17465 1 a17465 1 read( unit= conversion_str, fmt= conversion_fmt, iostat= conversion_iostat) value d18821 1 a18821 1 integer_ptr% defined_file = 'command line' d18896 1 a18896 1 logical_ptr% defined_file = 'command line' d19046 1 a19046 1 ! $Id: coco.f90,v 2.7 2011/12/23 14:58:32 dan Exp dan $ @ 2.7 log @fix line counting in text blocks; add mark option and directive @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.6 2011/12/23 02:15:15 dan Exp dan $ d156 1 a156 1 '$Id: coco.f90,v 2.6 2011/12/23 02:15:15 dan Exp dan $' d192 1 a192 1 integer, parameter :: log_unit = max( input_unit, output_unit, error_unit) + 4 d9025 1 a9025 1 call replace_substring( edit_line, lower_case_line, search_str( : search_len), trim( value_str), & d9123 1 a9123 1 search_idx = index( lower_case_line, search_str( : search_len)) d9145 1 a9145 1 call replace_substring( edit_line, lower_case_line, search_str( : search_len), & d9257 1 a9257 1 search_idx = index( lower_case_line, search_str( : search_len)) d9321 1 a9321 1 search_idx = index( lower_case_line, trim( search_str( : search_len)) ) d9335 2 a9336 2 call replace_substring( edit_line, lower_case_line, search_str( : search_len), & macro_ptr% macro_value( : value_len), search_idx) d11724 1 a11724 1 expr_str = if_dir( : then_idx - 1) d11863 1 a11863 1 expr_str = elseif_dir( : then_idx - 1) d14281 1 a14281 1 eq_idx = scan( block_stmt( : symbol_name_len + 1), equals) d14285 1 a14285 1 call seek_symbol_name( block_stmt( : eq_idx - 1), symbol_ptr) d14331 1 a14331 1 else if( block_stmt( : len( stop_str)) == stop_str )then which_directive d14339 1 a14339 1 else if( block_stmt( : len( message_str)) == message_str )then which_directive d14347 1 a14347 1 else if( block_stmt( : len( if_str)) == if_str )then which_directive d14355 1 a14355 1 else if( block_stmt( : len( elseif_str)) == elseif_str )then which_directive d14363 1 a14363 1 else if( block_stmt( : len( else_str)) == else_str )then which_directive d14371 1 a14371 1 else if( block_stmt( : len( endif_str)) == endif_str )then which_directive d14379 1 a14379 1 else if( block_stmt( : len( assert_str)) == assert_str )then which_directive d16251 1 a16251 1 expr_str = rel_expr( : eq_idx - 1) d16263 1 a16263 1 expr_str = rel_expr( : ne_idx - 1) d16275 1 a16275 1 expr_str = rel_expr( : ge_idx - 1) d16287 1 a16287 1 expr_str = rel_expr( : le_idx - 1) d16299 1 a16299 1 expr_str = rel_expr( : gt_idx - 1) d16311 1 a16311 1 expr_str = rel_expr( : lt_idx - 1) d16357 1 a16357 1 expr_str = rel_expr( : eq_idx - 1) d16369 1 a16369 1 expr_str = rel_expr( : ne_idx - 1) d16381 1 a16381 1 expr_str = rel_expr( : ge_idx - 1) d16393 1 a16393 1 expr_str = rel_expr( : le_idx - 1) d16405 1 a16405 1 expr_str = rel_expr( : gt_idx - 1) d16417 1 a16417 1 expr_str = rel_expr( : lt_idx - 1) d17141 1 a17141 1 mixed_case_str = mixed_case_str( : search_idx - 1) & d17144 1 a17144 1 lower_case_str = lower_case_str( : search_idx - 1) & d17149 1 a17149 1 mixed_case_str = mixed_case_str( : search_idx - 1) & d17153 1 a17153 1 lower_case_str = lower_case_str( : search_idx - 1) & d17183 1 a17183 1 lower_case_str = lower_case_str( : search_idx - 1) // replace_str d17187 1 a17187 1 lower_case_str = lower_case_str( : search_idx - 1) & d18349 1 a18349 1 ! $Id: coco.f90,v 2.6 2011/12/23 02:15:15 dan Exp dan $ @ 2.6 log @improve report; allow blank lines in set file (not in continuation sequence) @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.5 2011/12/22 20:24:02 dan Exp dan $ d156 1 a156 1 '$Id: coco.f90,v 2.5 2011/12/22 20:24:02 dan Exp dan $' d305 5 d533 4 d802 1 a802 1 'usage: coco [ -V | -h | [[opts] [--] [ basename | output input [...]]]' d1004 2 d1330 10 d1435 3 a1437 2 options = state_t( alter_state= alter_none, free_form= .true., number_source= .false., print_report= .false., & verbose_mode= .false., postpend_setfile= .true., wrapping_lines= .true., keychars= blank) d2091 1 d2418 1 a2418 1 character( len= *), parameter :: opt_letters = 'a:D:FhI:k:l:nprs:vVw ' d2518 6 d3444 1 a3444 1 character( len= *), dimension( 15), parameter :: options_msg = [ & d3452 1 d3749 59 d3814 1 a3814 1 ! entry: d3873 1 a3873 1 ! entry: d3883 1 a3883 1 ! allow only one -n per command line d3932 1 a3932 1 ! entry: d4314 14 d5382 8 d6268 84 d13582 1 a13582 1 null_text: if( text_file% lines_transfered == 0 )then d14389 1 a14389 1 call msg_quit( "unknown block directive: " // trim( block_stmt)) a17452 133 ! seek_match_quote() true if extracts string from between quotes subroutine seek_match_quote( quoted_str, start_char, in_len) ! ********************************************************************** ! seek_match_quote() interface ! ---------------------------------------------------------------------- ! the quoted string to be unquoted character( len= *), intent( in) :: quoted_str ! the length of the quoted string integer, intent( in) :: start_char ! the length of the quoted string integer, intent( out) :: in_len ! ********************************************************************** ! seek_match_quote() local ! ---------------------------------------------------------------------- ! which quote is to be used character( len= 1) :: quote ! ********************************************************************** ! seek_match_quote() text continue ! ---------------------------------------------------------------------- ! which quote is the first quote (if either) which_quote: select case( quoted_str( start_char: start_char) ) ! ---------------------------------------------------------------------- ! string delimited by single quote case( single_quote) which_quote quote = single_quote ! ---------------------------------------------------------------------- ! string delimited by double quote case( double_quote) which_quote quote = double_quote ! ---------------------------------------------------------------------- ! string delimited by neither quote- nothing to do case default which_quote in_len = 0 return end select which_quote ! ---------------------------------------------------------------------- ! initialize scan loop in_len = start_char + 1 ! scan thru the quoted string scan_string: do if( in_len > len_trim( quoted_str) ) exit scan_string ! ---------------------------------------------------------------------- ! if find one matching quote next_char: if( quoted_str( in_len: in_len) == quote )then ! check next character in_len = in_len + 1 ! check for a pair of quotes next_quote: if( quoted_str( in_len: in_len) == quote )then in_len = in_len + 1 else next_quote exit scan_string end if next_quote ! ---------------------------------------------------------------------- ! character is not a matching quote else next_char in_len = in_len + 1 end if next_char end do scan_string ! ---------------------------------------------------------------------- ! seek_match_quote() exit return ! ********************************************************************** ! seek_match_quote() end subroutine seek_match_quote ! ********************************************************************** ! ********************************************************************** d18349 1 a18349 1 ! $Id: coco.f90,v 2.5 2011/12/22 20:24:02 dan Exp dan $ @ 2.5 log @fix bug in message + alter shift 0 processing @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.4 2011/12/22 20:06:53 dan Exp dan $ d49 1 d156 1 a156 1 '$Id: coco.f90,v 2.4 2011/12/22 20:06:53 dan Exp dan $' d4081 63 d4225 15 a4239 1 ! identify whether printing coco report d4241 1 a4241 1 rpt_prt: if( options% print_report )then d4243 1 a4243 1 output_line = 'printing coco report' d4245 1 a4245 1 else rpt_prt d4247 1 a4247 1 output_line = 'not printing coco report' d4249 1 a4249 1 end if rpt_prt d4253 1 a4253 1 ! identify whether printing "! file: line" on source lines d4255 1 a4255 1 rpt_number: if( options% number_source )then d4257 1 a4257 1 output_line = 'numbering source lines' d4259 1 a4259 1 else rpt_number d4261 1 a4261 1 output_line = 'not numbering source lines' d4263 1 a4263 1 end if rpt_number a4775 58 ! process_cmdline_directive() write command line to the log file subroutine process_cmdline_directive( cmdline_dir) ! ********************************************************************** ! process_cmdline_directive() text ! ---------------------------------------------------------------------- character( len= *), intent( in) :: cmdline_dir ! ********************************************************************** ! process_cmdline_directive() text ! ---------------------------------------------------------------------- continue ! ---------------------------------------------------------------------- ! check for well formed directive extra_chars: if( cmdline_dir /= blank )then call msg_quit( "extra characters at end of cmdline directive: " // trim( cmdline_dir)) end if extra_chars ! ---------------------------------------------------------------------- ! if an active line active_line: if( if_construct% now_selected )then ! write command line to stderr or the log file write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco command line: ' & // trim( predefined_macros( cmdline_idx)% macro_value) end if active_line ! ---------------------------------------------------------------------- ! process_cmdline_directive() exit return ! ********************************************************************** ! process_cmdline_directive() end subroutine process_cmdline_directive ! ********************************************************************** ! ********************************************************************** d5010 1 a5010 1 coco_line: if( line( : len( coco_key)) == coco_key )then d5046 5 a5050 1 call msg_quit( "source lines are not allowed in the set file") d5492 1 a5492 1 ! process_directory_directive() process include directory options d5494 1 a5494 1 subroutine process_directory_directive( directory_dir) d5498 1 a5498 1 ! process_directory_directive() interface d5502 1 a5502 1 ! the directory directive from the set file d5504 1 a5504 1 character( len= *), intent( in) :: directory_dir d5508 2 a5509 2 ! entry: directory_opt is a directory to be added to the list ! of directories to be searched for inlcude files d5511 1 a5511 1 ! exit: directory_opt is on the list d5515 1 a5515 1 ! process_directory_directive() local d5519 7 a5525 1 ! point to a directory type d5527 1 a5527 1 type( path_t), pointer :: directory_ptr d5529 1 a5529 1 ! the name of a directory d5531 1 a5531 1 character( len= file_name_len) :: name_str d5533 1 a5533 1 ! count length of quoted string d5535 1 a5535 1 integer :: directive_len d5537 1 a5537 1 ! count length of unquoted string d5539 1 a5539 1 integer :: name_len d5541 1 a5541 1 ! ********************************************************************** d5543 1 a5543 1 ! process_directory_directive() text d5545 1 a5545 1 continue d5549 1 a5549 1 ! unquote string to find path string d5551 1 a5551 1 call unquote_string( directory_dir, name_str, directive_len, name_len ) d5553 1 a5553 1 badly_quoted: if( name_len == 0 )then d5555 1 a5555 1 call msg_quit( "null directory name: " // trim( directory_dir) ) d5557 1 a5557 1 else if( directive_len > len_trim( directory_str) )then badly_quoted d5559 1 a5559 1 call msg_quit( "badly quoted directory name: " // trim( directory_dir) ) d5561 1 a5561 1 end if badly_quoted d5563 1 a5563 1 ! ---------------------------------------------------------------------- d5565 1 a5565 1 ! if name is already on the path d5567 1 a5567 1 call seek_directory( name_str, directory_ptr) d5569 1 a5569 1 on_list_or_add: if( associated( directory_ptr) )then d5571 1 a5571 1 call msg_continue( "redundant include directory ignored: " // trim( directory_dir) ) d5573 1 a5573 1 ! if name is not already on the path d5575 1 a5575 1 else on_list_or_add d5577 1 a5577 1 call add_directory( name_str) d5579 1 a5579 1 end if on_list_or_add d5583 1 a5583 1 ! process_directory_directive() exit d5589 1 a5589 1 ! process_directory_directive() d5591 1 a5591 1 end subroutine process_directory_directive d5596 1 a5596 1 ! seek_directory() return a pointer to directory_str or null() d5598 1 a5598 1 subroutine seek_directory( name_str, directory_ptr) d5602 1 a5602 1 ! seek_directory() interface d5606 1 a5606 1 ! the name of the directory to seek d5608 1 a5608 5 character( len= *), intent( in) :: name_str ! a pointer to the directory entry if found or null() type( path_t), pointer :: directory_ptr d5612 1 a5612 1 ! entry: directory_str is a directory to be added to the list d5615 103 a5717 1 ! exit: directory_str is on the list d5965 1 a5965 1 ! process_logfile_directive() process log file directive d5967 1 a5967 1 subroutine process_logfile_directive( logfile_dir) d5971 1 a5971 1 ! process_logfile_directive() interface d5975 1 a5975 1 ! the logfile directive from the set file d5977 1 a5977 1 character( len= *), intent( in) :: logfile_dir d5981 1 a5981 1 ! entry: logfile_opt is a file file to be opened as the log file d5983 1 a5983 1 ! exit: logfile_opt is on the list d5987 1 a5987 1 ! process_logfile_directive() local a5990 12 ! the name of the file to be opened character( len= file_name_len) :: logfile_name ! the length of the quoted string integer :: quoted_len ! the length of the unquoted string integer :: unquoted_len d5993 1 a5993 1 logical, save :: too_many_logfile_statements = .false. d5997 1 a5997 1 ! process_logfile_directive() text d6003 1 a6003 1 ! only one log file statement per set file d6005 1 a6005 1 too_many_logfiles: if( too_many_logfile_statements )then d6007 1 a6007 1 call msg_quit( "too many log file statements") d6009 1 a6009 1 else too_many_logfiles d6011 1 a6011 1 too_many_logfile_statements = .true. d6013 1 a6013 15 end if too_many_logfiles ! unquote string on directive call unquote_string( logfile_dir, logfile_name, unquoted_len, quoted_len) badly_quoted: if( quoted_len == 0 )then call msg_quit( "null name found on log file directive: " // trim( logfile_dir)) else if( unquoted_len > len_trim( logfile_dir) )then badly_quoted call msg_quit( "badly quoted name found on log file directive: " // trim( logfile_dir)) end if badly_quoted d6017 1 a6017 1 ! if log file named on command line ignore the directive d6019 1 a6019 1 already_named: if( log_file% named_file )then d6021 1 a6021 1 call msg_continue( "command line overrides set file, log file directive ignored: " // trim( logfile_dir) ) d6023 1 a6023 1 ! if log file not named on command line open the named file d6025 1 a6025 1 else already_named d6027 1 a6027 9 log_file% io_unit = log_unit log_file% name_str = logfile_name log_file% named_file = .true. call open_file( log_file) end if already_named d6031 1 a6031 1 ! process_logfile_directive() exit d6037 1 a6037 1 ! process_logfile_directive() d6039 1 a6039 1 end subroutine process_logfile_directive d6044 1 a6044 1 ! process_output_directive() process output directive d6046 1 a6046 1 subroutine process_output_directive( output_dir) d6050 1 a6050 1 ! process_output_directive() interface d6054 1 a6054 1 ! the output directive from the set file d6056 1 a6056 1 character( len= *), intent( in) :: output_dir d6060 1 a6060 1 ! entry: output_dir is a file file to be opened as the output file d6062 1 a6062 1 ! exit: output_dir is set d6066 1 a6066 1 ! process_output_directive() local d6072 1 a6072 1 character( len= file_name_len) :: output_name d6084 1 a6084 1 logical, save :: too_many_output_statements = .false. d6088 1 a6088 1 ! process_output_directive() text d6096 1 a6096 1 too_many_outputs: if( too_many_output_statements )then d6098 1 a6098 1 call msg_quit( "too many output statements") d6100 1 a6100 1 else too_many_outputs d6102 1 a6102 1 too_many_output_statements = .true. d6104 1 a6104 1 end if too_many_outputs d6108 1 a6108 1 call unquote_string( output_dir, output_name, unquoted_len, quoted_len) d6112 1 a6112 1 call msg_quit( "null name found on output directive: " // trim( output_dir) ) d6114 1 a6114 1 else if( unquoted_len > len_trim( output_dir) )then badly_quoted d6116 1 a6116 1 call msg_quit( "badly quoted name found on output directive: " // trim( output_dir) ) d6124 1 a6124 1 already_named: if( output_file% named_file )then d6126 1 a6126 1 call msg_continue( "command line overrides set file, output directive ignored: " // trim( output_dir) ) d6132 1 a6132 1 number_of_names = number_of_names + 1 d6134 1 a6134 1 output_file% io_unit = write_unit d6136 1 a6136 1 output_file% name_str = output_name d6138 1 a6138 1 output_file% named_file = .true. d6144 1 a6144 1 ! process_output_directive() exit d6150 1 a6150 1 ! process_output_directive() d6152 1 a6152 1 end subroutine process_output_directive d6241 1 a6241 1 ! process_post_directive() process post directives d6243 1 a6243 1 subroutine process_post_directive( post_dir) d6247 1 a6247 1 ! process_post_directive() interface d6251 1 a6251 1 ! the post directive from the set file d6253 1 a6253 1 character( len= *), intent( in) :: post_dir d6257 1 a6257 2 ! entry: post_dir is blank_compress_lower_case post directive ! it must be "on" or "off" d6259 1 a6259 1 ! exit: post_dir is processed or error exit d6263 1 a6263 1 ! process_post_directive() local d6267 13 a6279 1 ! count post of some statements to disallow more than one d6281 1 a6281 1 logical, save :: too_many_post_statements = .false. d6285 1 a6285 1 ! process_post_directive() text d6291 15 a6305 1 ! only one post statement per set file d6307 1 a6307 1 too_many_post: if( too_many_post_statements )then d6309 1 a6309 1 call msg_quit( "too many post statements") d6311 1 a6311 1 else too_many_post d6313 1 a6313 1 too_many_post_statements = .true. d6315 1 a6315 1 end if too_many_post d6319 5 a6323 1 ! process post switch d6325 1 a6325 1 on_off: if( post_dir == on_str )then d6327 1 a6327 1 options% postpend_setfile = .true. d6329 1 a6329 1 else if( post_dir == off_str )then on_off d6331 1 a6331 1 options% postpend_setfile = .false. d6333 1 a6333 1 else on_off d6335 1 a6335 1 call msg_quit( "unknown option on post directive: " // trim( post_dir) ) d6337 1 a6337 1 end if on_off d6341 1 a6341 1 ! process_post_directive() exit d6347 1 a6347 1 ! process_post_directive() d6349 1 a6349 1 end subroutine process_post_directive d6354 1 a6354 1 ! process_key_directive() process keys directives d6356 1 a6356 1 subroutine process_key_directive( key_dir) d6360 1 a6360 1 ! process_key_directive() interface d6364 1 a6364 1 ! the key characters from the set file or command line d6366 1 a6366 1 character( len= *), intent( in) :: key_dir d6370 2 a6371 1 ! entry: cc + blanks d6373 1 a6373 1 ! exit: keys characters processed is processed or error exit d6377 1 a6377 1 ! process_key_directive() local d6381 1 a6381 1 ! count number of some statements to disallow more than one d6383 1 a6383 1 logical, save :: too_many_keys_directives = .false. d6387 1 a6387 1 ! process_key_directive() text d6393 1 a6393 1 ! only one key statement per set file d6395 1 a6395 1 too_many_keys: if( too_many_keys_directives )then d6397 1 a6397 1 call msg_quit( "too many keys statements") d6399 1 a6399 1 else too_many_keys d6401 1 a6401 1 too_many_keys_directives = .true. d6403 1 a6403 1 end if too_many_keys d6407 5 a6411 1 ! process number switch d6413 1 a6413 1 on_off: if( key_dir( 3: ) == blank )then d6415 1 a6415 1 options% keychars = key_dir( 1: 2) d6419 1 a6419 1 call msg_quit( "extra characters at end of key directive: " // trim( key_dir) ) d6425 1 a6425 1 ! process_key_directive() exit d6431 1 a6431 1 ! process_key_directive() d6433 1 a6433 1 end subroutine process_key_directive a6521 104 ! process_form_directive() process form directives subroutine process_form_directive( form_dir) ! ********************************************************************** ! process_form_directive() interface ! ---------------------------------------------------------------------- ! the wrap directive from the set file character( len= *), intent( in) :: form_dir ! ********************************************************************** ! entry: wrap_dir is blank_compress_lower_case wrap directive ! it must be a number string ! exit: wrap_dir is processed or error exit ! ********************************************************************** ! process_form_directive() local ! ---------------------------------------------------------------------- ! count number of some statements to disallow more than one logical, save :: too_many_form_statements = .false. ! check for characters after directive integer :: next_char ! ********************************************************************** ! process_form_directive() text continue ! ---------------------------------------------------------------------- ! only one form statement per set file too_many_forms: if( too_many_form_statements )then call msg_quit( "too many form statements") else too_many_forms too_many_form_statements = .true. end if too_many_forms ! ---------------------------------------------------------------------- ! process form value if not already set on command line forms: if( form_dir( 1: len( free_str)) == free_str )then ! check directive for correctness and use value from command line or default next_char = len( free_str) + 1 else if( form_dir( 1: len( fixed_str)) == fixed_str )then forms ! check directive for correctness and use fixed form options% free_form = .false. next_char = len( fixed_str) + 1 else forms ! directive not correct call msg_quit( "bad form: " // trim( form_dir)) end if forms ! error if characters after directive error_chars: if( form_dir( next_char: ) /= blank )then call msg_quit( "extra characters after form directive: " // trim( form_dir)) end if error_chars ! ---------------------------------------------------------------------- ! process_form_directive() exit return ! ********************************************************************** ! process_form_directive() end subroutine process_form_directive ! ********************************************************************** ! ********************************************************************** d18287 1 a18287 1 ! $Id: coco.f90,v 2.4 2011/12/22 20:06:53 dan Exp dan $ @ 2.4 log @fix bug in file macro; fix bug in unquoting; improve syntax checks @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.3 2011/12/22 16:23:57 dan Exp dan $ d155 1 a155 1 '$Id: coco.f90,v 2.3 2011/12/22 16:23:57 dan Exp dan $' d10508 3 a10510 1 line = msg_buffer( 1: len( line)) d18263 1 a18263 1 ! $Id: coco.f90,v 2.3 2011/12/22 16:23:57 dan Exp dan $ @ 2.3 log @fix bug in numbering, improve numbering, add post and wrap @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.2 2011/12/21 14:41:15 dan Exp dan $ d155 1 a155 1 '$Id: coco.f90,v 2.2 2011/12/21 14:41:15 dan Exp dan $' d3523 1 a3523 1 is_quoted: select case( directory_opt( 1: 1) ) d3525 1 a3525 1 case( single_quote, double_quote) is_quoted d3527 1 a3527 1 call unquote_string( directory_opt, directory_str, quoted_len, unquoted_len) d3529 1 a3529 1 null_unquoted: if( quoted_len == 0 .or. unquoted_len == 0 )then d3531 1 a3531 1 call msg_quit( "null name passed to -I option") d3533 1 a3533 7 end if null_unquoted case default is_quoted directory_str = directory_opt end select is_quoted d4698 1 a4698 1 ! write_cmdline() write command line to the log file d4700 1 a4700 1 subroutine write_cmdline() d4704 9 a4712 1 ! write_cmdline() text d4720 10 d4737 1 a4737 1 // trim( predefined_macros( cmdline_idx)% macro_value) d4743 1 a4743 1 ! write_cmdline() exit d4749 1 a4749 1 ! write_cmdline() d4751 1 a4751 1 end subroutine write_cmdline d5283 1 a5283 1 call process_report_directive( set_stmt( len( summary_str) + 1: )) d5523 1 a5523 3 no_name_str: if( name_len == 0 .or. directive_len == 0 )then call msg_quit( "no directory name: " // trim( directory_dir) ) d5525 1 a5525 1 end if no_name_str d5527 1 a5527 1 ! verify no extra characters beyond name d5529 1 a5529 1 extra_chars: if( directory_dir( directive_len + 1: ) /= blank )then d5531 1 a5531 3 call msg_quit( "extra characters after directory path name: " // trim( directory_dir)) end if extra_chars d5786 1 a5786 3 no_name: if( unquoted_len == 0 .or. quoted_len == 0 )then call msg_quit( "no name found on input directive: " // trim( input_dir) ) d5788 1 a5788 1 end if no_name d5790 1 a5790 1 ! verify no extra characters beyond name d5792 1 a5792 1 extra_chars: if( input_dir( unquoted_len + 1: ) /= blank )then d5794 1 a5794 3 call msg_quit( "extra characters after input file name: " // trim( input_dir)) end if extra_chars d5903 1 a5903 3 no_name: if( unquoted_len == 0 .or. quoted_len == 0 )then call msg_quit( "no name found on log file directive: " // trim( logfile_dir) ) d5905 1 a5905 1 end if no_name d5907 1 a5907 1 ! verify no extra characters beyond name d5909 1 a5909 1 extra_chars: if( logfile_dir( unquoted_len + 1: ) /= blank )then d5911 1 a5911 3 call msg_quit( "extra characters after log file file name: " // trim( logfile_dir)) end if extra_chars d6016 1 a6016 3 no_name: if( unquoted_len == 0 .or. quoted_len == 0 )then call msg_quit( "no name found on output directive: " // trim( output_dir) ) d6018 1 a6018 1 end if no_name d6020 1 a6020 1 ! verify no extra characters beyond name d6022 1 a6022 1 extra_chars: if( output_dir( unquoted_len + 1: ) /= blank )then d6024 1 a6024 3 call msg_quit( "extra characters after output file name: " // trim( output_dir)) end if extra_chars d6310 1 a6310 1 ! process_report_directive() process report directives d6312 1 a6312 1 subroutine process_report_directive( report_dir) d6316 1 a6316 1 ! process_report_directive() interface d6333 1 a6333 1 ! process_report_directive() local d6343 1 a6343 1 ! process_report_directive() text d6381 1 a6381 1 ! process_report_directive() exit d6387 1 a6387 1 ! process_report_directive() d6389 1 a6389 1 end subroutine process_report_directive d7501 1 a7501 1 ! process (possibly recursive) include directives (include 'a' --> include 'b' &c) d7509 4 d8283 1 a8283 1 no_name_str: if( name_len == 0 .or. construct_len == 0 )then d8285 1 a8285 1 call msg_quit( "no include file name: " // trim( include_dir)) d8287 5 a8291 1 end if no_name_str d9987 1 a9987 1 else if( coco_stmt == cmdline_str )then which_directive d9989 1 a9989 1 call write_cmdline() d9995 1 a9995 1 else if( coco_stmt == document_str )then which_directive d9997 1 a9997 1 call process_document_directive() d10003 1 a10003 1 else if( coco_stmt == options_str )then which_directive d10005 1 a10005 1 call write_options() d10011 1 a10011 1 else if( coco_stmt == report_str )then which_directive d10013 1 a10013 1 call write_report() d10019 1 a10019 1 else if( coco_stmt == symbols_str )then which_directive d10021 1 a10021 1 call write_symbols() d11316 4 d14193 11 a14203 1 subroutine process_document_directive() d14251 10 d14309 177 d17152 1 a17152 1 out_len = 0 d17154 1 a17154 1 unquoted_str = null_string a17180 4 ! check next character in_len = in_len + 1 d17183 1 a17183 1 next_quote: if( quoted_str( in_len: in_len) == quote )then d17197 4 d18261 1 a18261 1 ! $Id: coco.f90,v 2.2 2011/12/21 14:41:15 dan Exp dan $ @ 2.2 log @require endfile all on one line, repair bug in macro actual args processing @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.1 2011/12/19 23:17:09 dan Exp dan $ d155 1 a155 1 '$Id: coco.f90,v 2.1 2011/12/19 23:17:09 dan Exp dan $' d225 1 a225 1 character( len= *), parameter :: integer_fmt = '( a, i10)' d229 1 a229 1 character( len= *), parameter :: directory_fmt = '( a, i0, a)' d271 2 a274 4 ! length used to write lines is free_form_len + len( '!?>') + len( blank) integer, parameter :: source_line_len = free_form_len + len( '!?>') + len( ' ') d285 1 a285 1 integer, parameter :: buffer_len = ( max_continuations + 1) * source_line_len + 1 d531 4 d543 4 d830 1 a830 1 character( len= free_form_len), pointer :: line d952 1 a952 1 character( len= free_form_len), dimension( :), allocatable :: text_lines d992 2 d998 2 d1002 1 a1002 1 logical :: free_form d1208 3 a1210 1 character( len= free_form_len), target :: line d1214 1 a1214 1 character( len= free_form_len), target :: log_line d1332 1 a1332 1 ! if the output file has content, copy the set file to it d1334 1 a1334 1 made_output: if( output_file% lines_transfered > 0 )then d1413 2 a1414 2 options = state_t( alter_state= alter_none, number_source= .false., print_report= .false., & verbose_mode= .false., free_form= .true., keychars= blank) d1459 2 d1500 2 a1505 4 log_file% line => log_line output_file% line => line a1660 2 current_file => this_file a1668 2 nullify( current_file) a1804 2 current_file => this_file d1817 3 a1819 1 ! file is not connected d1821 5 a1825 1 nullify( current_file) a1873 2 current_file => this_file d2069 1 d2111 4 d2394 1 a2394 1 character( len= *), parameter :: opt_letters = 'a:D:FhI:k:l:nrs:vV ' d2500 6 d2532 6 a3011 59 ! process_fixed_option() process fixed arguments subroutine process_fixed_option() ! ********************************************************************** ! entry: ! exit: -F is processed or error exit ! ********************************************************************** ! process_fixed_option() local ! ---------------------------------------------------------------------- ! allow only one -a per command line logical, save :: too_many_fixed_options = .false. ! ********************************************************************** ! process_fixed_option() text continue ! ---------------------------------------------------------------------- ! execute only once too_many: if( too_many_fixed_options )then call msg_quit( "too many fixed options on command line") else too_many too_many_fixed_options = .true. end if too_many ! ---------------------------------------------------------------------- cl_options% free_form = .false. ! ---------------------------------------------------------------------- ! process_fixed_option() exit return ! ********************************************************************** ! process_fixed_option() end subroutine process_fixed_option ! ********************************************************************** ! ********************************************************************** d3337 59 d3414 1 a3414 1 character( len= *), dimension( 13), parameter :: options_msg = [ & d3423 1 d3428 1 d3600 1 a3600 1 ! count number of some statements to disallow more than one d3675 1 a3675 1 ! allow only one -a per command line d3740 1 a3740 1 ! allow only one -a per command line d3783 59 d3858 1 a3858 1 ! allow only one -a per command line d3923 1 a3923 1 ! allow only one -a per command line d3984 1 a3984 1 ! allow only one -a per command line d4027 59 d4119 1 a4119 1 character( len= source_line_len) :: output_line d4153 14 d4209 1 a4209 1 ! identify whether verbose mode is on d4211 1 a4211 1 rpt_form: if( options% free_form )then d4213 1 a4213 1 output_line = 'processing free form source: wrap len:' d4215 1 a4215 1 else rpt_form d4217 1 a4217 1 output_line = 'processing fixed form source: wrap len:' d4219 1 a4219 1 end if rpt_form d4221 1 a4221 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) // blank, wrap_len d4718 4 d4724 4 a4727 2 write( unit= log_file% io_unit, fmt= log_file% format_str) 'coco command line: ' & // trim( predefined_macros( cmdline_idx)% macro_value) d5069 4 d5079 1 a5079 2 read( unit= set_file% io_unit, fmt= set_file% format_str, & iostat= set_file% io_status) set_file% line d5093 4 d5251 8 d5279 9 a5287 1 call process_verbose_directive( set_stmt( len( verbose_str) + 1: )) d6151 84 d6273 1 a6273 1 ! only one number statement per set file d6586 84 d7509 4 d7525 1 a7525 1 call process_endfile_directive( statement, file_if_level) d7527 1 a7527 1 active_endfile: if( if_construct% now_selected )then d7539 1 a7539 1 get_statement: if( ( .not. complete) )then d7541 1 a7541 1 cycle read_lines d7543 1 a7543 1 end if get_statement a7550 4 ! reset current file current_file => this_file d7860 1 a7860 5 character( len= source_line_len) :: line_buffer ! detect lines longer than free_form_len logical :: long_lines a7871 4 long_lines = .false. ! ---------------------------------------------------------------------- d7884 1 a7884 2 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & null_string d7892 11 a7902 2 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & trim( line_buffer) d7908 9 a7916 1 line_buffer = comment // this_file% line d7918 1 a7918 1 long_lines = len_trim( line_buffer) > free_form_len d7920 1 a7920 2 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & trim( line_buffer) d7926 7 a7932 1 line_buffer = shift3_prefix // this_file% line d7934 1 a7934 1 long_lines = len_trim( line_buffer) > free_form_len d7936 3 a7938 2 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & trim( line_buffer) a7953 12 ! complain if source line too long len_warning: if( long_lines )then call msg_continue( "line longer than 132 characters:") call msg_continue( trim( line_buffer)) end if len_warning ! ---------------------------------------------------------------------- a7989 22 ! write_source_line() constants character( len= *), parameter :: name_prefix = '! ' character( len= *), parameter :: number_prefix = ': ' ! ********************************************************************** ! write_source_line() local ! ---------------------------------------------------------------------- ! character line number character( len= conversion_len) :: number_str ! format a label ! file-name:line-number character( len= file_name_len) :: label ! ********************************************************************** d8004 1 a8004 1 write( unit= number_str, fmt= conversion_fmt) current_file% lines_transfered d8006 1 a8006 1 label = name_prefix // trim( current_file% name_str) // number_prefix // adjustl( number_str) d8008 1 a8008 6 ! write source output with label write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & this_file% line( 1: wrap_len) // trim( label) else want_numbers d8010 1 a8010 1 ! write source output with label d8012 1 a8012 4 write( unit= this_file% io_unit, fmt= this_file% format_str, iostat= this_file% io_status) & trim( this_file% line) end if want_numbers d8053 93 d8358 1 a8358 1 line = begin_inc // include_file% name_str( 1: len( line) - len( begin_inc)) d8380 1 a8380 1 line = end_inc // include_file% name_str( 1: len( line) - len( end_inc)) d8594 1 a8594 1 call wrap_source_line( edit_line) d10502 1 a10502 1 call wrap_source_line( msg_buffer( 1: out_idx)) d11929 4 d11965 1 a11965 1 call wrap_source_line( edit_line) d11993 1 a11993 1 call wrap_source_line( edit_line) d13140 1 a13140 1 character( len= free_form_len), dimension( :), allocatable, intent( out) :: lines_array d13850 1 a13850 1 call wrap_source_line( expand_line) d18056 1 a18056 1 ! $Id: coco.f90,v 2.1 2011/12/19 23:17:09 dan Exp dan $ @ 2.1 log @added document, input, output; fixed small bugs; more checking @ text @d8 1 a8 1 ! $Id: coco.f90,v 2.0 2011/12/17 00:48:06 dan Exp dan $ d155 1 a155 1 '$Id: coco.f90,v 2.0 2011/12/17 00:48:06 dan Exp dan $' a7128 8 ! if not yet a complete statement go get the rest of it get_statement: if( ( .not. complete) .and. ( statement( 1: len( include_str)) == include_str) )then cycle read_lines end if get_statement d7139 2 d7155 8 d7175 8 a8815 6 no_close_paren_arg: if( close_paren_idx > len_trim( actual_args) )then call msg_quit( "can't find close parenthesis in actual argument: " // trim( actual_args)) end if no_close_paren_arg d11968 1 a11968 1 last_macro% macro_value = asis_stmt( eq_idx + 1: asis_len) d17629 1 a17629 1 ! $Id: coco.f90,v 2.0 2011/12/17 00:48:06 dan Exp dan $ @ 2.0 log @New coco for testing and conformance with web page. @ text @d8 1 a8 1 ! $Id: coco.f90,v 1.30 2007/06/25 19:08:22 dan Exp dan $ d40 1 a40 1 ! $ fc -std -o coco coco.f90 d46 1 a46 1 ! ifort -warn all -std -check all coco.f90 -o coco d50 5 d133 1 a133 1 ! define these below just before the other units d138 1 a138 1 ! you might use f2kcli available from www.winteracter.com/f2kcli d155 1 a155 1 '$Id: coco.f90,v 1.30 2007/06/25 19:08:22 dan Exp dan $' d193 4 d199 1 a199 1 integer, parameter :: text_unit = log_unit + 1 d287 1 a287 1 integer, parameter :: buffer_len = ( max_continuations + 1) * source_line_len d337 6 d351 1 a351 1 ! substitution key d355 4 d417 12 d517 8 d533 7 a539 1 ! summary directive causes writing a summary report after processing d541 1 a541 1 character( len= *), parameter :: summary_str = 'summary:' d543 1 a543 1 ! form directive allows setting free form or fixed form from the set file d545 1 a545 1 character( len= *), parameter :: form_str = 'form:' d547 1 a547 1 ! verbose directive causes operation with more messages issued d549 1 a549 1 character( len= *), parameter :: verbose_str = 'verbose:' d647 4 d669 1 a669 1 ! text directive d689 1 a689 25 ! these strings are replaced when editing source lines ! ---------------------------------------------------------------------- ! provide file, line, date, time strings in programs character( len= *), parameter :: file_str = '?file?' character( len= *), parameter :: line_str = '?line?' character( len= *), parameter :: date_str = '?date?' character( len= *), parameter :: time_str = '?time?' ! provide coco rcs id string in programs character( len= *), parameter :: coco_str = '?coco?' ! provide set file name string in programs character( len= *), parameter :: setfile_str = '?setfile?' ! provide command line of this coco invocation character( len= *), parameter :: cmdline_str = '?cmdline?' d723 1 a723 1 integer, parameter :: alter_shift_1 = 3 d725 1 a725 1 integer, parameter :: alter_shift_0 = 4 d767 2 d994 2 d1038 1 a1038 1 ! options actually used and set from set file d1048 7 d1124 1 a1124 1 type( macro_t), dimension( file_idx: cmdline_idx) :: predefined_macros d1188 5 a1192 1 integer :: number_of_names d1246 1 a1246 1 integer :: input_idx d1302 1 a1302 1 ! process several input files d1304 1 a1304 1 read_all_files: do input_idx = 2, number_of_names d1308 1 a1308 1 call process_input_file( source_file_list( input_idx) ) d1356 1 a1356 1 summary: if( options% print_report )then d1360 1 a1360 1 end if summary d1402 1 a1402 1 verbose_mode= .false., free_form= .true.) d1427 3 d1669 1 a1669 1 case( input_unit, set_unit, read_unit: ) d1675 1 a1675 1 case( output_unit) d1679 1 a1679 1 case( log_unit) d1922 8 d1940 74 d2044 1 a2044 1 name_from_basename: if( number_of_names == 1 )then d2062 1 a2062 1 ! verbose mode makes a summary as well d2066 34 d2379 1 a2379 1 character( len= *), parameter :: opt_letters = 'a:D:FhI:l:nrs:vV ' d2393 1 a2393 1 character( len= buffer_len) :: argword d2401 1 a2401 1 integer :: i_word d2451 1 a2451 1 cl_options% free_form = .false. d2457 1 a2457 1 call print_help d2467 1 a2467 1 ! set log file (NOTE: optarg has len= file_name_len, so no overflow can occur.) d2469 1 a2469 1 case( 'l') which_option d2471 1 a2471 1 log_file% io_unit = log_unit d2473 1 a2473 1 log_file% name_str = optarg d2475 1 a2475 1 log_file% named_file = .true. d2477 1 a2477 1 call open_file( log_file) d2483 1 a2483 1 cl_options% number_source = .true. d2489 1 a2489 1 cl_options% print_report = .true. d2495 1 a2495 3 cl_set_file% name_str = optarg cl_set_file% named_file = .true. d2501 1 a2501 1 cl_options% verbose_mode = .true. a2618 8 ! check that output name is not too long output_too_long: if( len_trim( optarg) > file_name_len )then call msg_quit( 'output filename too long: ' // trim( optarg) ) end if output_too_long d2655 1 a2655 1 list_inputs: do i_word = 2, number_of_names d2659 1 a2659 1 source_file_list( i_word) = input_file d2667 1 a2667 9 ! check that output name is not too long next_too_long: if( len_trim( argword) > file_name_len )then call msg_quit( 'input filename too long: ' // trim( optarg) ) end if next_too_long source_file_list( i_word)% name_str = argword( 1: len( source_file_list( i_word)% name_str)) d2712 1 a2712 3 character( len= *), parameter :: dash = '-' character( len= *), parameter :: colon = ':' d2884 6 d2898 14 d2985 59 d3387 1 a3387 1 character( len= *), dimension( 12), parameter :: options_msg = [ & d3392 1 d3545 1 a3545 1 ! write_options() write options in effect to the log file d3547 1 a3547 1 subroutine write_options() d3551 1 a3551 1 ! write_options() constants d3555 1 a3555 1 ! possible alter states d3557 1 a3557 1 integer, parameter :: lower_alter = min( alter_delete, alter_blank, alter_shift_1, alter_shift_0, alter_shift_3) d3559 1 a3559 1 integer, parameter :: upper_alter = max( alter_delete, alter_blank, alter_shift_1, alter_shift_0, alter_shift_3) d3561 1 a3561 1 ! possible alter state labels d3563 1 a3563 6 character( len= 16), dimension( lower_alter: upper_alter), parameter :: alter_labels = [ & 'deleted ', & 'blank line ', & 'initial ! ', & 'shifted 1 + ! ', & 'shifted 3 + !?> ' ] d3567 1 a3567 1 ! write_options() local d3571 1 a3571 1 ! construct output lines d3573 1 a3573 1 character( len= source_line_len) :: output_line d3577 1 a3577 3 ! write_options() text ! ---------------------------------------------------------------------- d3583 1 a3583 1 ! write a header d3585 1 a3585 1 write( unit= log_file% io_unit, fmt= log_file% format_str) "coco options:" d3587 1 a3587 1 ! ---------------------------------------------------------------------- d3589 1 a3589 1 ! identify the alter state d3591 1 a3591 1 check_index: select case( options% alter_state) d3593 1 a3593 1 case( lower_alter: upper_alter) check_index d3595 1 a3595 1 output_line = 'alter state causes lines to be ' // alter_labels( options% alter_state) d3597 1 a3597 1 case default check_index d3599 1 a3599 1 output_line = 'alter state is undefined' d3601 1 a3601 1 end select check_index d3603 1 a3603 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) d3605 1 a3605 1 ! identify whether printing coco report d3607 1 a3607 1 rpt_prt: if( options% print_report )then d3609 1 a3609 1 output_line = 'printing coco report' d3611 1 a3611 1 else rpt_prt d3613 1 a3613 1 output_line = 'not printing coco report' d3615 1 a3615 1 end if rpt_prt d3617 1 a3617 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) d3619 1 a3619 1 ! identify whether printing "! file: line" on source lines d3621 2 a3622 1 rpt_number: if( options% number_source )then d3624 1 a3624 1 output_line = 'numbering source lines' d3626 1 a3626 1 else rpt_number d3628 1 a3628 1 output_line = 'not numbering source lines' d3630 1 a3630 1 end if rpt_number d3632 1 a3632 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) d3634 1 a3634 1 ! identify whether verbose mode is on d3636 1 a3636 1 rpt_verbose: if( options% verbose_mode )then d3638 1 a3638 1 output_line = 'verbose mode is on' d3640 1 a3640 1 else rpt_verbose d3642 1 a3642 1 output_line = 'verbose mode is off' d3644 1 a3644 1 end if rpt_verbose d3646 1 a3646 1 write( unit= log_file% io_unit, fmt= log_file% format_str) trim( output_line) d3648 401 a4048 1 ! identify whether verbose mode is on d4062 6 d4109 1 a4109 1 integer :: file_idx d4148 1 a4148 1 more_than_one: do file_idx = 2, number_of_names d4151 1 a4151 1 blank // trim( source_file_list( file_idx)% name_str) d4258 1 a4258 1 ! write_symbols() write summary report to the log file d4280 1 a4280 5 ! block line index integer :: line_idx ! predefined macros index d4298 1 a4298 1 all_predefined: do i = file_idx, cmdline_idx d4399 1 a4399 1 write( unit= log_file% io_unit, fmt= string_fmt) 'value: undefined' d4432 1 a4432 1 write( unit= log_file% io_unit, fmt= string_fmt) 'value: undefined' d4508 1 a4508 1 write_block: do line_idx = 1, size( symbol_ptr% text_lines) d4510 1 a4510 1 write( unit= log_file% io_unit, fmt= string_fmt) trim( symbol_ptr% text_lines( line_idx)) d4973 1 a4973 1 ! "logfile'...'" | "number:..." | "summary:..." | "verbose:..." d5007 25 a5031 1 else if( set_stmt( 1: len( integer_constant_str)) == integer_constant_str )then which_directive d5033 1 a5033 1 call process_sf_integer_declaration( set_stmt( len( integer_constant_str) + 1: ), .true.) d5037 1 a5037 1 ! if the directive is a set file logical declaration d5039 1 a5039 1 else if( set_stmt( 1: len( logical_str)) == logical_str )then which_directive d5041 1 a5041 1 call process_sf_logical_declaration( set_stmt( len( logical_str) + 1: ), .false.) d5045 1 a5045 1 ! logical constant declaration d5047 1 a5047 1 else if( set_stmt( 1: len( logical_constant_str)) == logical_constant_str )then which_directive d5049 1 a5049 1 call process_sf_logical_declaration( set_stmt( len( logical_constant_str) + 1: ), .true.) d5053 1 a5053 1 ! if the directive is a set file directory directive d5055 1 a5055 1 else if( set_stmt( 1: len( directory_str)) == directory_str )then which_directive d5057 1 a5057 1 call process_directory_directive( set_stmt( len( directory_str) + 1: )) d5069 1 a5069 1 ! if the directive is a set file form directive d5071 1 a5071 1 else if( set_stmt( 1: len( form_str)) == form_str )then which_directive d5073 1 a5073 1 call process_form_directive( set_stmt( len( form_str) + 1: )) d5077 1 a5077 1 ! if the directive is a set file number: directive d5079 1 a5079 1 else if( set_stmt( 1: len( number_str)) == number_str )then which_directive d5081 1 a5081 1 call process_number_directive( set_stmt( len( number_str) + 1: )) d5085 1 a5085 1 ! if the directive is a set file summary: directive d5089 1 a5089 1 call process_summary_directive( set_stmt( len( summary_str) + 1: )) d5534 110 a5643 1 ! process_logfile_directive() process include log file options d5760 117 d5942 80 a6021 1 call msg_quit( "unknown option on number directive: " // trim( number_dir) ) d6027 1 a6027 1 ! process_number_directive() exit d6033 1 a6033 1 ! process_number_directive() d6035 1 a6035 1 end subroutine process_number_directive d6040 1 a6040 1 ! process_summary_directive() process summary directives d6042 1 a6042 1 subroutine process_summary_directive( summary_dir) d6046 1 a6046 1 ! process_summary_directive() interface d6052 1 a6052 1 character( len= *), intent( in) :: summary_dir d6056 1 a6056 1 ! entry: summary_dir is blank_compress_lower_case summary directive d6059 1 a6059 1 ! exit: summary_dir is processed or error exit d6063 1 a6063 1 ! process_summary_directive() local d6069 1 a6069 1 logical, save :: too_many_summary_statements = .false. d6073 1 a6073 1 ! process_summary_directive() text d6079 1 a6079 1 ! only one summary statement per set file d6081 1 a6081 1 too_many_summarys: if( too_many_summary_statements )then d6083 1 a6083 1 call msg_quit( "too many summary statements") d6085 1 a6085 1 else too_many_summarys d6087 1 a6087 1 too_many_summary_statements = .true. d6089 1 a6089 1 end if too_many_summarys d6093 1 a6093 1 ! process summary switch d6095 1 a6095 1 on_off: if( summary_dir == on_str )then d6099 1 a6099 1 else if( summary_dir == off_str)then on_off d6105 1 a6105 1 call msg_quit( "unknown option on summary directive: " // trim( summary_dir) ) d6111 1 a6111 1 ! process_summary_directive() exit d6117 1 a6117 1 ! process_summary_directive() d6119 1 a6119 1 end subroutine process_summary_directive d7034 4 d7056 4 d7105 4 d7131 1 a7131 1 get_statement: if( .not. complete )then d7145 7 a7151 1 process_directive: if( statement( : len( include_str)) == include_str )then d7159 1 a7159 1 else if( statement == endfile_str )then process_directive d7161 1 a7161 1 ! if line is active read no more from this input file a7164 10 ! reset the if-block state so the next input starts ok pop_ifs: do if( associated( if_construct, file_if_level) ) exit pop_ifs call delete_block() end do pop_ifs d7207 1 a7207 1 edit_line: if( index( line, arg_key) > 0 )then d7713 73 a7944 4 ! relink pointers output_file% line => line a8209 6 ! the character line number character( len= conversion_len) :: line_number_str ! ---------------------------------------------------------------------- a8233 36 ! replace ?file? with the current filename search_idx = index( lower_case_line, file_str) go_file: if( search_idx > 0 )then call replace_substring( edit_line, lower_case_line, file_str, trim( current_file% name_str), & search_idx) predefined_macros( file_idx)% referenced = .true. predefined_macros( file_idx)% referenced_file = current_file% name_str predefined_macros( file_idx)% referenced_line = current_file% lines_transfered end if go_file ! replace ?line? with the current line number search_idx = index( lower_case_line, line_str) go_line: if( search_idx > 0 )then write( unit= line_number_str, fmt= conversion_fmt) current_file% lines_transfered line_number_str = adjustl( line_number_str) call replace_substring( edit_line, lower_case_line, line_str, trim( line_number_str), & search_idx) predefined_macros( line_idx)% referenced = .true. predefined_macros( line_idx)% referenced_file = current_file% name_str predefined_macros( line_idx)% referenced_line = current_file% lines_transfered end if go_line ! ---------------------------------------------------------------------- d8236 1 a8236 1 remaining_predefined: do i = date_idx, size( predefined_macros) d8238 1 a8238 1 search_str = arg_key // trim( predefined_macros( i)% name_str) // arg_key d8254 1 a8254 1 end do remaining_predefined d8345 1 a8345 1 search_str = arg_key // trim( integer_ptr% name_str) // arg_key d8463 1 a8463 1 search_str = arg_key // trim( logical_ptr% name_str) // arg_key d8597 1 a8597 1 search_str = arg_key // trim( macro_ptr% name_str) // arg_key d8637 7 a8643 1 call make_actual_array( lower_case_line( open_paren_idx + 1: close_paren_idx - 1) // comma, & d8790 6 d8806 6 d8899 6 d8913 1 a8913 1 ! array pointers d8915 1 a8915 1 integer :: i_arg d8934 1 d8938 1 a8938 1 each_arg: do i_arg = 1, size( dummy_args) d8942 1 a8942 1 search_str = arg_key // trim( dummy_args( i_arg) ) // arg_key d8946 1 a8946 1 dummy_idx = index( value_str, search_str( 1: search_len)) d8950 3 a8952 2 call replace_substring( lower_case_str= value_str, search_str= search_str( 1: search_len), & replace_str= trim( actual_args( i_arg)), first_idx= dummy_idx) d9428 1 a9428 1 integer_or_logical: select type( symbol_ptr) d9430 1 a9430 1 type is( integer_t) integer_or_logical d9436 1 a9436 1 type is( logical_t) integer_or_logical d9442 1 a9442 1 class default integer_or_logical d9446 1 a9446 1 end select integer_or_logical d9969 1 a9969 1 case( 'a': 'z', '0':'9', dot, plus, minus, open_paren) string_expr d11500 1 a11500 1 call msg_quit( "can't find close parenthesis: " // trim( assert_dir)) d12027 1 a12027 1 ! point to next character to be decoded d12029 1 a12029 5 integer :: next_char ! an element in arg_array integer :: i_arg d12051 1 a12051 1 count_args: do next_char = 1, len( arglist) d12053 1 a12053 1 found_another: select case( arglist( next_char: next_char)) d12081 1 a12081 1 get_args: do i_arg = 1, number_of_args d12089 1 a12089 1 arg_array( i_arg) = arglist( b_arg: e_arg) d12142 1 a12142 1 ! point to characters d12144 1 a12144 1 integer :: i_arg d12146 1 a12146 1 integer :: dup_idx d12158 1 a12158 1 check_names: do i_arg = 1, size( arg_array) d12160 1 a12160 1 call valid_new_name( trim( arg_array( i_arg))) d12162 1 a12162 1 dup_name: do dup_idx = 1, i_arg - 1 d12164 1 a12164 1 got_dup: if( arg_array( i_arg) == arg_array( dup_idx) )then d12166 1 a12166 1 call msg_quit( "found duplicated dummy argument name: " // trim( arg_array( i_arg))) d12233 1 a12233 1 integer :: i_arg d12257 1 a12257 1 scan_dummy_args: do i_arg = 1, size( arglist) d12259 1 a12259 1 search_str = arg_key // trim( arglist( i_arg)) // arg_key d12265 1 a12265 1 call msg_quit( "macro argument unused: " // trim( arglist( i_arg))) d12285 1 a12285 1 search_str = arg_key // trim( symbol_ptr% name_str) // arg_key d12745 3 a12747 1 integer :: i_line d12749 1 a12749 1 integer :: i_arg d12757 2 d12765 6 d12833 4 d12843 14 d12906 1 a12906 1 call msg_quit( "source line in continued coco statement") a12913 14 ! write the text line write( unit= text_file% io_unit, iostat= text_file% io_status) text_file% line write_text: if( text_file% io_status > 0 )then call msg_quit( "write text file failed: " // trim( text_file% line)) end if write_text ! count text lines text_file% lines_transfered = text_file% lines_transfered + 1 d12920 1 a12920 1 ! check for no lines in text block d12926 5 a12930 1 call msg_quit( "text block has no lines") d12962 1 a12962 1 copy: do i_line = 1, size( lines_array) d12964 1 a12964 1 read( unit= text_file% io_unit, iostat= text_file% io_status) lines_array( i_line) d12968 1 a12968 1 call msg_quit( "read text scratch file failed") a12971 4 ! force lines to lower case lines_array( i_line) = to_lower( lines_array( i_line)) d12982 1 a12982 1 check_arg: do i_arg = 1, size( args_array) d12986 1 a12986 1 search_str = arg_key // trim( args_array( i_arg) ) // arg_key d12990 1 a12990 1 check_line: do i_line = 1, size( lines_array) d12992 1 a12992 1 arg_idx = max( arg_idx, index( lines_array( i_line), search_str( 1: arg_len) ) ) d12998 1 a12998 1 call msg_quit( "dummy arg " // search_str( 1: arg_len) // " not found in text") d13068 1 a13068 1 eq_idx = scan( text_stmt( 1: symbol_name_len + len( equals)), equals) d13261 4 d13267 1 a13267 1 integer :: i_line d13325 12 a13336 1 call seek_close_paren( copy_dir, open_paren_idx, close_paren_idx) d13364 1 a13364 1 copy_lines: do i_line = 1, size( text_ptr% text_lines) d13366 1 a13366 1 line = text_ptr% text_lines( i_line) d13408 4 d13416 2 a13417 2 call make_actual_array( copy_dir( open_paren_idx + 1: close_paren_idx - 1) // comma, text_ptr% actual_args, & text_ptr% args_in_parens) d13419 1 a13419 2 call process_actual_arglist( text_ptr% actual_args, & line, text_ptr% text_lines( i_line), text_ptr% dummy_args) d13425 1 a13425 1 edit_line_args: if( index( line, arg_key) > 0 )then d13427 1 a13427 1 call edit_source_line( line) d13433 2 d13645 1 a13645 1 integer_or_logical: select type( symbol_ptr) d13647 1 a13647 1 type is( integer_t) integer_or_logical d13653 1 a13653 1 type is( logical_t) integer_or_logical d13659 1 a13659 1 class default integer_or_logical d13661 1 a13661 1 call msg_quit( "variable must be an integer or a logical: " // trim( symbol_ptr% name_str) ) d13663 1 a13663 1 end select integer_or_logical d13789 5 d13806 6 d13830 3 d14592 4 a14595 1 class( symbol_t), pointer :: symbol_ptr d14637 15 a14651 1 ! call seek_integer_name( expr_str, symbol_ptr) d14653 1 a14653 1 int_name: if( associated( symbol_ptr) )then d14655 1 a14655 1 flag = .true. d14657 17 a14673 1 return d14675 1 a14675 1 end if int_name d14748 1 a14748 3 ! multiplication operators character( len= *), parameter :: times = '*' d14750 1 a14750 1 character( len= *), parameter :: divby = '/' d14752 1 a14752 1 character( len= *), parameter :: remby = '\' d16403 2 a16406 2 level = 0 d16804 1 a16804 1 ! format_date() date string is with colons a16823 10 ! format_date() constants ! ---------------------------------------------------------------------- ! character to separate hh and mm, and mm and ss character( len= *), parameter :: slash = '/' ! ********************************************************************** a16868 10 ! format_time() constants ! ---------------------------------------------------------------------- ! character to separate hh and mm, and mm and ss character( len= *), parameter :: colon = ':' ! ********************************************************************** d17580 43 d17625 1 a17625 1 ! $Id: coco.f90,v 1.30 2007/06/25 19:08:22 dan Exp dan $ @ Day-III/06-coco/coco.inc100777 0 0 1757 11660472364 10131 0?? macro :: timestamp = "20111115 091932.178" ?? macro :: compiler = "gfortran 4.6" ?? integer, parameter :: PREF66 = 0 ?? integer, parameter :: F66 = 1 ?? integer, parameter :: F77 = 2 ?? integer, parameter :: F90 = 3 ?? integer, parameter :: F95 = 4 ?? integer, parameter :: F03 = 5 ?? integer, parameter :: F08 = 6 ?? integer, parameter :: STD = F95 ?? logical, parameter :: ISO_VARYING_STRINGS_T = .false. ?? logical, parameter :: BYTE_K = .true. ?? logical, parameter :: SHORT_K = .true. ?? logical, parameter :: INT_K = .true. ?? logical, parameter :: LONG_K = .true. ?? logical, parameter :: SINGLE_K = .true. ?? logical, parameter :: DOUBLE_K = .true. ?? logical, parameter :: QUAD_K = .true. ?? logical, parameter :: L_BYTE_K = .true. ?? logical, parameter :: L_SHORT_K = .true. ?? logical, parameter :: L_INT_K = .true. ?? logical, parameter :: L_LONG_K = .true. ?? logical, parameter :: ASCII_K = .true. ?? logical, parameter :: EBCDIC_K = .false. ?? logical, parameter :: ISO_10646_K = .false. Day-III/06-coco/coco.o100777 0 0 4161064 11740036652 7673 0 ( __text__TEXT  K__data__DATA p `N@__cstring__TEXTb OPe __bss__DATA __const__TEXT (` __eh_frame__TEXT  `4 h@! P8UHH@}HuEHMHH HHH1@0@HHH@HH@HHHHH1@0@H0H@HHHHH1@0@HHH@HHHHH1@0@H`H@HHHHH 0Hψw6HH HxHHH0HLjEHHu@HZ:H5@0@?HH0H0?H )ȉEȋEȃ|EHcH H9HHH)H HH UHcH5 HHHFHHZLE0ɉ,Hlj(΋(H ‹,H DIHMHcH(HHHHHhDžppE EăEċEă|HhMHcɊ< tۋEăEċEĉEEHcZHHljHxHxHHtHHHljHhHhHEHEHHtIHEHHMHMHH0HHHHHHE$HEH H0HHHEHEH0HHEHEHHt8HEHMHcHUHUHUHuHHHHE EHcHMHUHHHHEHH H`HHpHh0HωƈpHcHh>HH=HHωHƋHH0HH@]DfDUHH@H}uHDž0HDž8HDž@HH0t@HG!H5@0@/HH H /HHHt,HHHH CH9uHHHP HDžPHPHHP@$<u@HGnH5@0@HHHHP@t@HGpH5@0@HHHHP@ tOHP@ H GH51HHHAHP@$<u@HGoH5@0@HHHHPf@ftcHPf@H GsH=AE0HHω֋HDAHPHbHPH@Hf@ff tnHGSH5H=AE0HHHHHDIDAHPH@Hf@fftnHGYH5H=AE0HHHHHDIDAHPH@Hf@f f $< HPH@Hf@f f fHGH=A E0HHlj֋HHDADAHPH@Hf@ff tnHG[H5H=AE0HHHxHxHDtItDsAsESEHcH G/E0HhHωd֋dHhDcIcHEH Hlj\H΋\LLE#ppHcGHHljHhHhHEHEHHtIHEHHMHMHH#HHPHHPHHE$HEH H#HHHEHEH#HHEHEHHt8HEHMHcHUHUHUHuHHHHE EHcHMHUHHHHEHH HpHh0HωƈpHcHhGH=HHHωDHƋDHHE Džp1EpHEHHHHHhpHhH%Hω@H։‹@LLEppHcGHHljHhHhHEHEHHtIHEHHMHMHHHH8HH8HHE$HEH HHHHEHEHHHEHEHHt8HEHMHcHUHUHUHuHHHHE EHcHMHUHHHHEHH HHHpHh0HωƈpHcHhGH=H0Hω,HƋ,H0DžHH~ H ~mHHcHHA HH GLE0ɉ(Hω$֋$(D#I#HHcH HHHHHHXDž``E EEE|HXMHcɊ< tۋEEEpEHcGHHljHhHhHHtM9~Dž8CHcH @.@0@Hω֋HE싍)ȃ8HEHcHHHH0HH H8H0HH@0@HHHH9EM9~Dž8CHcH @.@0@Hω֋HEM9~DEHcMHcH@/E0H׋DIE)ȃ8HEHcHHHH08H0HHωH։‹ɉMMEM9~Dž8CHcH @.@0@Hω|֋|HEM9~DEHcMHcH@/E0xH׋xDwIwE)ȃ8HEHcHHHH0HHxH0Hp88E8)MEEEQHpHxHxHHHxHpHHHpEEEM9|E.Hx HxHHHxEEEM9|ȋ EM9~Dž8CHcH @.@0@vHωp֋pHvEM9~DEHcMHcH@/E0lH׋lDkIkE)ȃ8HEHcHHHH08H0HHωdH։‹dɉMMEM9~Dž8CHcH @.@0@cHω\֋\HcEM9~DEHcMHcH@/E0XH׋XDWIWE)ȃ8HEHcHHHH0HHxH0Hp88E8)MEEEQHpHxHxHHHxHpHHHpEEEM9|E.Hx HxHHHxEEEM9|ȋC EM9~Dž8CHcH @.@0@VHωP֋PHVEM9~DEHcMHcH@/E0LH׋LDKIKE)ȃ8HEHcHHHH08H0HHωDH։‹DɉMMEM9~Dž8CHcH @.@0@CHω<֋!H5@0@3HH(H(3HHHt,HHHH YH9uHHHH HDžHHHHHH@$<u@H>nH5@0@'HHH'HH@t@H>pH5@0@HHHHH@ tOHH@ H >H51HHHAHH@$<u@H>oH5@0@HHHHHf@ftcHHf@H >sH=AE0HHω֋HDAHHHbHHH@Hf@ff tnH>SH5H=AE0HHHHHDIDAHHH@Hf@fftnH>YH5H=AE0HHHHHDIDAHHH@Hf@f f $< HHH@Hf@f f fH>H=A E0HHlj֋HHDADAHHH@Hf@ff tnH>[H5H=AE0HHHHHD|I|D{A{HHHHHH@H@f@ff tnH>SH5H=AE0HpHHhHhHpDdIdDcAcHHH@H@f@fftnH>YH5H=AE0HXHHPHPHXDLILDKAKHHH@H@f@fftnH>gH5H=AE0H@HH8H8H@D4I4D3A3HHH@H@f@f f $<HHH@H@f@f f fH>H=AE0H(Hlj$֋$H( H DADAHHH@H@f@ff tnH>[H5H=AE0HHHHHDIDAHEMHHljH։ʋ44HHHteHHH@H@f@fft@H)?H5@0@HHHHE HEMHHljH։ʋ44HHHteHHH@H@f@fft@H5?H5@0@HHHHE HEMH%HljH։ʋ44EHDž@HH HH@0HLjH@HH9uGH@H I?H5HHHHDH@H$EEnH@HtH@HH9uGH@H K?H5HHHHDE EEE|H@MHcɊD$< tڋEEEhEHcK?HHljH`H`HHtIH`HMHcH@H$HH`HHHHHE3EHcH@H$HH`HHHHEhH`HUuH׉H΋MhHcH`K?LHH΋LE$EEHHHteHHH@H@f@fft@HM?H5@0@HHHHEHDž8HH HHHH80HLjH8HH9uGH8H [?H5HHHHDH8H$EEnH8HtH8HH9uGH8H ]?H5HHHHDE EEE|H8MHcɊD$< tڋEEEhEHc]?HHljH`H`HHtIH`HMHcH8H$HH`HHHHHE3EHcH8H$HH`HHHHEȋhH`HUuH׉H΋MhHcH`]?LHH΋LE$EEHHHteHHH@H@f@fft@H_?H5@0@HHpHpHEHEMH HljlH։ʋl44HHHteHHH@H@f@fft@Hq?H5@0@kHH`H`kHEEE EEE|HEMHcɊ< tދEEEhEHc{?HHljH`H`HHt:H`HMHcH`HuHuHHHHE#EHcH`HUHHHHEЋhXXHc{?HHljHPHPHEHEHHtIHEHHMHMHHHHXHHXHHE$HEH HHHHEHEHHHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHEhHcH`{?H5HHPHƉLHPH HH0HHXHP@0@KH׉ΊKXHcHPHHƋLHPH@HH8HH]fDfDUHHH}HEHEHEHHEt4H>!H5@0@}HHuHMEHHHt)HHHH ^H9uHHHEHEHEHHEȋ@$<u4H>nH5@0@}HHuHMEHEȋ@t4H>pH5@0@}HHuHMEHEȋ@ tLHEȋ@ H >H51|HHpHp|AHEȋ@$<u@H>oH5@0@oHH`H`oHEf@ft`HEf@H >sH=AE0HXHωT֋THXDSASHEHUHEH@Hf@ff $<tnH>UH5H=AE0HHHH@H@HHDYH5H=AE0H0HH(H(H0D$I$D#A#HEH@Hf@f f $< HEH@Hf@f f fH>H=A E0HHlj֋HHD A D A HEH@Hf@ff tnH>[H5H=AE0HHHHHDIDAHEHHH9uDHEH >H5HHHHDHEHH$E؋E؃HEHHtHEHHH9uDHEH >H5HHHHDHEHHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHTHHEHHEHHEHEHtHEH@HEHEHHEHMHHHEHH9uDHEH >H5HHHHDHEH$E؋E؃HEHtHEHH9uDHEH >H5HHHHDHEH HHH9HEHEHEHtaHEH@Hf@fft@H>H5@0@HHHHEHMHHEHPHH*HEHtHEHH9uDHEH >H5HHHHDHEHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHHEHtaHEH@Hf@fft@H>H5@0@HHHHEHHEHHĀ]UHHH}HEHEHEHHEt4H7>!H5@0@}HHuHMEHHHt)HHHH ^H9uHHHEHEHEHHEȋ@$<u4H7>nH5@0@}HHuHMEHEȋ@t4H7>pH5@0@}HHuHMEHEȋ@ tLHEȋ@ H 7>H51|HHpHp|AHEȋ@$<u@H7>oH5@0@oHH`H`oHEf@ft`HEf@H 7>sH=AE0HXHωT֋THXDSASHEHUHEH@Hf@ff $<tnH7>UH5H=AE0HHHH@H@HHDYH5H=AE0H0HH(H(H0D$I$D#A#HEH@Hf@f f $< HEH@Hf@f f fH7>H=A E0HHlj֋HHD A D A HEH@Hf@ff tnH7>[H5H=AE0HHHHHDIDAHEHHH9uDHEH Z>H5HHHHDHEHH$E؋E؃HEHHtHEHHH9uDHEH \>H5HHHHDHEHHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHTHHEHHEHHEHEHtHEH@HEHEHHEHMHHHEHH9uDHEH h>H5HHHHDHEH$E؋E؃HEHtHEHH9uDHEH j>H5HHHHDHEH HHH9HEHEHEHtaHEH@Hf@fft@Hn>H5@0@HHHHEHMHHEH`HH*HEHtHEHH9uDHEH t>H5HHHHDHEHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHHEHtaHEH@Hf@fft@Hz>H5@0@HHHHEHHEHHĀ]UHHH}HEHEHEHHEt4H=!H5@0@}HHuHMEHHHt)HHHH ^H9uHHHEHEHEHHEȋ@$<u4H=nH5@0@}HHuHMEHEȋ@t4H=pH5@0@}HHuHMEHEȋ@ tLHEȋ@ H =H51|HHpHp|AHEȋ@$<u@H=oH5@0@oHH`H`oHEf@ft`HEf@H =sH=AE0HXHωT֋THXDSASHEHUHEH@Hf@ff $<tnH=UH5H=AE0HHHH@H@HHDH5HHHHDHEHH$E؋E؃HEHHtHEHHH9uDHEH >H5HHHHDHEHHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHTHHEHHEHHEHEHtHEH@HEHEHHEHMHHHEHH9uDHEH >H5HHHHDHEH$E؋E؃HEHtHEHH9uDHEH >H5HHHHDHEH HHH9HEHEHEHtaHEH@Hf@fft@H>H5@0@HHHHEHMHHEH`HH*HEHtHEHH9uDHEH >H5HHHHDHEHHMHHHMH@HEHEHtHEH@HEHEHHEHMHHHEHtaHEH@Hf@fft@H$>H5@0@HHHHEHHEHHĀ]UHH0H}t4H=!H5@0@}HHuȉHMȊEHHHt)HHHH H9uHHHEHEHEHHE؋@$<u4H=nH5@0@}HHuHMEHE؋@t4H=pH5@0@}HHuHMEHE؋@ t@HE؋@ H =H51}HHuHUMAHE؋@$<u4H=oH5@0@}HHuHMEHEf@ftZHEf@H =sH=AE0H}Hω|֋|HMD{A{HEHUHEH@Hf@ff $<tnH=cH5H=AE0HpHHhHhHpDdIdDcAcHEH@Hf@fftnH=YH5H=AE0HXHHPHPHXDLILDKAKHEH@Hf@f f $< HEH@Hf@f f fH=H=A E0H@Hlj<֋ESEHcH >8/E0HHω֋HDIHEH HHΉɉM̋M̃ttE E+EEHEHHHHHEHH H`HHEHM0Hωƈ/ESEHcH H8/E0HHω֋HDIHEH HHΉɉM̋M̃EE EȃEȋEȃ|HEMHcɊ< tދEȃEȋEȉEEHcV8HHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E!EEHcV8HHljHEHEHEHEHHtIHEHHMHMHH!HHHHHHE$HEH H!HHHEHEH!HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHMV8H5HHHƉHH HHxHHMHU@0@H׉ΊEHcHMHHƋHHhHH`]fDfDUHSHHHHEH}HuHU؉MDEDM̋t@Hq6!H5@0@WHHHHHWHHHt,HHHH VH9uHHHh HDžhHhHHh@$<u@Hq6nH5@0@GHH8H8GHh@t@Hq6pH5@0@7HH(H(7Hh@ tOHh@ H q6H51$HHH$AHh@$<u@Hq6oH5@0@HHHHhf@ftcHhf@H q6sH=AE0HHω֋HDAHhHHhH@H@f@ff $<tnHq6NH5H=AE0HHHHHDIDAHhH@H@f@fftnHq6YH5H=AE0HHHHHDIDAHhH@H@f@f f $< HhH@H@f@f f fHq6H=A E0HHlj֋HHDADAHhH@H@f@ff $<HhH@H@f@ff fHHHq6H5H=AE0HHHHHDIDAHEHHtnHEH@HHHMH Hq6H=AHHHHHDIDHEHHhH/HhH@H@f@ff $<tnHq6NH5H=AE0HHHxHxHDtItDsAsHhH@H@f@fftnHq6YH5H=AE0HhHH`H`HhD\I\D[A[HhH@H@f@fftnHq6gH5H=AE0HPHHHHHHPDDIDDCACHhH@H@f@f f $< HhH@H@f@f f fHq6H=A E0H8Hlj4֋4H80H0D,A,D+A+HhH@H@f@ff $<HhH@H@f@ff fHHHq6H5H=AE0H HHHH DIDAEԃ{EHcHHH{6 H5H=AE0HHHHHLIHDIHhHbHhH@Hf@ff tnHq6SH5H=AE0HHHHHDIDAHhH@Hf@fftnHq6YH5H=AE0HHHHHDIDAHhH@Hf@f f $< HhH@Hf@f f fHq6H=A E0HHlj֋HHDADAHhH@Hf@ff tnHq6[H5H=AE0HHHHHDIDAHhHHhHH(HHHHHHHHHHH HHHh0HψHH(IL |HNj|‰DždHHtHHH9uDH6HH5xHHpHpDxHHtHHH9uDH6HH5lHH`H`DlHHtHHH9uDH6HH5\HHPHPD\H@H HH5ALHH@H@LD2/E0HHω|֋|HHD{I{HHD‰HHHH~DžDžDžWHHHHHHHHHH9|Dž4H HHHH9|=~DžCHcH B2.@0@zHωt֋tHz)HcH HHHHHHHH~DžDžDžWHHHHHHHHHH9|Dž4H HHHH9|HH HHHH0HLjHHHMH9u HĐ]fUHH0H}ut@H21!H5@0@HHHHHHt,HHHH uH9uHHH HDžHHH@$<u@H21nH5@0@HHHH@t@H21pH5@0@HHHH@ tOH@ H 21H51HHHAH@$<u@H21oH5@0@HHHHf@ftcHf@H 21sH=AE0HHω֋HDAHHbHH@Hf@ff tnH21SH5H=AE0HHHHHDIDAHH@Hf@fftnH21YH5H=AE0HHHHHDIDAHH@Hf@f f $< HH@Hf@f f fH21H=A E0HHlj|֋|HxHxDtAtDsAsHH@Hf@ff tnH21[H5H=AE0HhHH`H`HhD\I\D[A[HHtHHH9uDHR1HH5THHHHHDTH@DDDjEE EEE|HEMHcɊ< tދEEE8EHcV1HHljH0H0HHt:H0HMHcH0HuHuHHHHE#EHcH0HUHHHHE8!((HcV1HHljH H HEHEHHtIHEHHMHMHH!HH8HH8HHE$HEH H!HHHEHEH!HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHHE8HcH0V1H5HH0HƉ,H0H HH(H @0@+H׉Ί+(HcH HHƋ,H0EE EEE|HEMHcɊ< tދEEE8EHcZ1HHljH0H0HHt:H0HMHcH0HuHuHHHHE#EHcH0HUHHHHE8#((HcZ1HHljH H HEHEHHtIHEHHMHMHH#HH HH HHE$HEH H#HHHEHEH#HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHHE8HcH0Z1H5HHHƉHH HHHH(H @0@H׉Ί(HcH HHƋHEE EEE|HEMHcɊ< tދEEE8EHc^1HHljH0H0HHt:H0HMHcH0HuHuHHHHE#EHcH0HUHHHHE8%((Hc^1HHljH H HEHEHHtIHEHHMHMHH%HHHHHHE$HEH H%HHHEHEH%HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHHEЋ8HcH0^1H5HHHƉHH HH0HH(H @0@H׉Ί(HcH HHƋHHEMHHljH։ʋEE EEE|HEMHcɊ< tދEEE8EHcf1HHljH0H0HHt:H0HMHcH0HuHuHHHHE#EHcH0HUHHHHE؋8)((Hcf1HHljH H HEHEHHtIHEHHMHMHH)HHHHHHE$HEH H)HHHEHEH)HHEHEHHt=HEH8HcH0HuHuHHHHHE&8HcH0HUHHHHE苅8HcH0f1H5HHHƉHH HHHHH(H @0@H׉Ί(HcH HHƋHHH H`HH10HLjH0]DfDUHHH}ut@H0!H5@0@HHHHHHt,HHHH uH9uHHH HDžHHH@$<u@H0nH5@0@HHHH@t@H0pH5@0@HHHH@ tOH@ H 0H51HHHAH@$<u@H0oH5@0@HHHHf@ftcHf@H 0sH=AE0HHω֋HDAHHbHH@Hf@ff tnH0SH5H=AE0HHHHHD|I|D{A{HH@Hf@fftnH0YH5H=AE0HpHHhHhHpDdIdDcAcHH@Hf@f f $< HH@Hf@f f fH0H=A E0HXHljT֋THXPHPDLALDKAKHH@Hf@ff tnH0[H5H=AE0H@HH8H8H@D4I4D3A3HHtHHH9uDH0HH5,HH H D,H@H HQHHHcHEtttt|HEtHcɊ< tҋttttHc0HHljHHHHt@HHtHcHHuHuHHHHx)tHcHHUHHHHxHc0HHljHHHhHhHHtRHhHHhHhHHHHHHHHE'HhH HHHHEHhHHHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHHEHcH0H5HHHƉHH HHH@0@H׉ΊHcHHHƋHO Etttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHHHE&tHcHHUHHHHEHc1HHljHHHhHhHHtRHhHHhHhHHHHHHHHE'HhH HHHHEHhHHHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHHEHcH1H5HHHƉHH HHHHH@0@H׉ΊHcHHHƋH3Etttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHHHE&tHcHHUHHHHE!Hc1HHljHHHhHhHHtRHhHHhHhHH!HHHHHHE'HhH H!HHHEHhH!HHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHHEHcH1H5HHHƉHH HH0HHH@0@H׉ΊHcHHHƋHEtttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHHHE&tHcHHUHHHHE#Hc1HHljHHHhHhHHtRHhHHhHhHH#HHHHHHE'HhH H#HHHEHhH#HHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHHEЋHcH1H5HHHƉHH HHHHHH@0@H׉ΊHcHHHƋHHEMHHljH։ʋEtttt|HEtHcɊ< tҋttttHc1HHljHHHHt=HHtHcHHuHuHHHHE&tHcHHUHHHHE؋'Hc1HHljHHHhHhHHtRHhHHhHhHH'HHHHHHE'HhH H'HHHEHhH'HHhHhHHtFHhHHcHHhHhHHHHHE)HcHHhHHHHE苅HcH1H5HHHƉHH HH`HHH@0@H׉ΊHcHHHƋHHHtHHH9uDH1HH5HHHDH@HHtHHH9uDH1HH5HHxHxDHH@HtHH@HH9uTHHHH 1H5tHHhHHhDtHHtHHH9uDH1HH5dHHXHXDdHHtHHH9uDH1HH5THHHHHDTHH HIIH@tH@u EEEH@AH]f''@UHHHHHEH}ut@HY0!H5@0@HHHHHHt,HHHH gH9uHHH HDžHHH@$<u@HY0nH5@0@HHHH@t@HY0pH5@0@HHHH@ tOH@ H Y0H51HHHAH@$<u@HY0oH5@0@HHHHf@ftcHf@H Y0sH=AE0HHω֋HDAHHbHH@Hf@ff tnHY0SH5H=AE0HHHHHDIDAHH@Hf@fftnHY0YH5H=AE0HHHxHxHDtItDsAsHH@Hf@f f $< HH@Hf@f f fHY0H=A E0HhHljd֋dHh`H`D\A\D[A[HH@Hf@ff tnHY0[H5H=AE0HPHHHHHHPDDIDDCACHHtHHH9uDH0HH5HxHpAE0HhHHhDDDHH HxHHHfH@0H@g֊gHXHXHIL THNjT‰HEHtaHEH@Hf@fft@Ht$H5@0@SHHHHHSHEHEHfHEE=~EԡE-E E܉EEE?HEHMȈHEHHHEHEHHHEE؃E؋E؋M9|E%HE HEHHHEȋE؃E؋E؋M9|HHHMH9u Hİ*[A^]fUHHPHHHEH}HH@t@H#!H5@0@?HH0H0?HHHt,HHHH YH9uHHHH HDžHHHHHH@$<u@H#nH5@0@/HH H /HH@t@H#pH5@0@HHHHH@ tOHH@ H #H51 HHH AHH@$<u@H#oH5@0@HHHHHf@ftcHHf@H #sH=AE0HHω֋HDAHHHHHH@Hf@ff tnH#SH5H=AE0HHHHHDIDAHHH@Hf@fftnH#YH5H=AE0HHHHHDIDAHHH@Hf@fftnH#eH5H=AE0HHHHHDIDAHHH@Hf@f f $< HHH@Hf@f f fH#H=A E0HHlj֋HHDADAHHH@Hf@ff tnH#[H5H=AE0HxHHpHpHxDlIlDkAkHDž@HH@H@HHHH@HH9uGH@H #H5dHHXHHXDdH@H$EEY H@HtH@HH9uGH@H #H5THHHHHHDTE EEE|H@MHcɊD < tڋEEEhEHc#HHljH`H`HHtIH`HMHcH@H HH`HHHHHE3EHcH@H HH`HHHHEhXXHc#HHljHPHPHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHEȋhHMHcHHMHEHHtSHEHHMHHHUHUHHH@HH@HHE.HEHHHMHHHHEЋhHcH`#H5HH8HH8H@HEHPHEX=XEX)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|ыXHcHP#H5HH0HH0HEHHH@H5IAL,HH΋,HEL$D$D$MMuHHHHHtdHHH@Hf@fft@H#H5@0@+HH H +HEMH HE@ E EEE|EHc@< tދEEEhEHc#HHljH`H`HHt9H`HMHcH`H@HHHHE&EHcH`H@HHHHE؋hXXHc#HHljHPHPHEHEHHtIHEHHMHMHHHHHHHHE$HEH HHHHEHEHHHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHE苅hHcH`#H5HHHƉ HH HHXHP@0@ H׉Ί XHcHPHHƋ HHE@H@HtH@HH9uGH@H $H5HHHHDH@HtH@HH9uGH@H $H5HHHHDH@H@IHHHHtdHHH@Hf@fft@H$H5@0@HHHHEHHHEH@HEE?HEHMHEHHHEHEHHHEEEE=~H@HtH@HH9uGH@H $H5HHHHDH@HH@H@HHH(H@HHHHMH9u HP]fUHHH}uHHHt,HHHH H9uHHH HDžHHH@$<u@H"nH5@0@HHxHxH@t@H"pH5@0@wHHhHhwH@ tOH@ H "H51dHHXHXdAH@$<u@H"oH5@0@WHHHHHWHf@ftcHf@H "sH=AE0H@Hω<֋HH5HHHDHHtHHH9uGHH >H5HHHHDHHCHH0HHHH DžHWH H0H0HHH0H HHH HHH=~HHtHHH9uDH?HH5HHHDHHtHHH9uGHH ?H5HHHHDHH IHHHtHHH9uGHH EH5HHHHDHHM PHHtHHH9uGHH IH5HHHHDHǀTE܃E܃SEHcH O/E0HHω֋HDIHHtHHH9uGHH OH5HHxHHxDHHM =ɉH{HHtHHH9uGHH SH5tHHhHHhDtHǀHHHtHHH9uGHH YH5dHHXHHXDdHH$@@E؃HHHH|HE苍HHcɊ< tҋHHHHHc[HHljHHHHt=HHHHcHHuHuHHHHE&HHcHHUHHHHE/Hc[HHljHHH0H0HHtRH0HH0H0HH/HHPHHPHHE'H0H H/HHHEH0H/HH0H0HHtFH0HHcHH0H0HHHHHE)HcHH0HHHHEHcH[H5HHHHHHE܃<<<<|HEH5@0@HHHlHMHEM9~GEHcHM HcHD/E0H׋DIHEHEHED‰EHH HHHEHM0HωƈHpHteHpH@H@f@fft@HHH5@0@HHHHEM9~GEHcHM HcHH/E0H׋DIHEHEHED‰EHEHEHEHEEM9}EEEM)M EEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|HĀ]DfDUHHPH}ut4H!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHE@$<u@HnH5@0@HHpHpHE@t@HpH5@0@oHH`H`oHE@ tLHE@ H H51\HHPHP\AHE@$<u@HoH5@0@OHH@H@OHEf@ft`HEf@H sH=AE0H8Hω4֋4H8D3A3HEHSHEH@Hf@ff tnHSH5H=AE0H(HH H H(DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH[H5H=AE0HHHHHDIDAt-HH HH0HljΈ HEMHHljH։ʋuHEMHHljH։ʋuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E"EEHcHHljHEHEHEHEHHtIHEHHMHMHH"HHHHHHE$HEH H"HHHEHEH"HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHMH5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHP]f.UHHPH}ut4HS!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHE@$<u@HSnH5@0@HHpHpHE@t@HSpH5@0@oHH`H`oHE@ tLHE@ H SH51\HHPHP\AHE@$<u@HSoH5@0@OHH@H@OHEf@ft`HEf@H SsH=AE0H8Hω4֋4H8D3A3HEHSHEH@Hf@ff tnHSSH5H=AE0H(HH H H(DIDAHEH@Hf@fftnHSYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHSH=A E0HHlj֋HHDADAHEH@Hf@ff tnHS[H5H=AE0HHHHHDIDAt-HH HH0HljΈ HEMHHljH։ʋuHEMHHljH։ʋuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E%EEHcHHljHEHEHEHEHHtIHEHHMHMHH%HHHHHHE$HEH H%HHHEHEH%HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHMH5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHP]f.UHHPH}ut4H!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHE@$<u@HnH5@0@HHpHpHE@t@HpH5@0@oHH`H`oHE@ tLHE@ H H51\HHPHP\AHE@$<u@HoH5@0@OHH@H@OHEf@ft`HEf@H sH=AE0H8Hω4֋4H8D3A3HEHSHEH@Hf@ff tnHSH5H=AE0H(HH H H(DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH5H=AE0HHHHHDIDAt-HH HH0HljΈ HEMHHljH։ʋu HEMHHljH։ʋu EE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHc>HHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E$EEHc>HHljHEHEHEHEHHtIHEHHMHMHH$HHHHHHE$HEH H$HHHEHEH$HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHM>H5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHP]f.UHHPH}ut4H!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHE@$<u@HnH5@0@HHpHpHE@t@HpH5@0@oHH`H`oHE@ tLHE@ H H51\HHPHP\AHE@$<u@HoH5@0@OHH@H@OHEf@ft`HEf@H sH=AE0H8Hω4֋4H8D3A3HEHSHEH@Hf@ff tnHSH5H=AE0H(HH H H(DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH5H=AE0HHHHHDIDAt-HH HH0HljΈ HEMHHljH։ʋuHEMHHljH։ʋuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E"EEHcHHljHEHEHEHEHHtIHEHHMHMHH"HHHHHHE$HEH H"HHHEHEH"HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHMH5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHP]f.UHHHHHEH}ut@H:!H5@0@HHHHHHt,HHHH gH9uHHH( HDž(H(HH(@$<u@H:nH5@0@HHHH(@t@H:pH5@0@HHHH(@ tOH(@ H :H51HHHAH(@$<u@H:oH5@0@HHHH(f@ftcH(f@H :sH=AE0HHω֋HDAH(HbH(H@Hf@ff tnH:SH5H=AE0HHHHHDIDAH(H@Hf@fftnH:YH5H=AE0HHHHHDIDAH(H@Hf@f f $< H(H@Hf@f f fH:H=A E0HHlj֋HHD|A|D{A{H(H@Hf@ff tnH:5H=AE0HpHHhHhHpDdIdDcAct-HH HH0HljΈ HH HHHHEH UH H$AE0HXHHPHHPLHHXLDHAHDGAG$EE EEE|HEMHcɊ< tދEEEHEHc|HHljH@H@HHt:H@HMHcH@HuHuHHHHE#EHcH@HUHHHHEH%88Hc|HHljH0H0HEHEHHtIHEHHMHMHH%HH8HH8HHE$HEH H%HHHEHEH%HHEHEHHt=HEHHHcH@HuHuHHHHHE&HHcH@HUHHHHEHHcH@|H5HH0HƉ,H0H HH0HH8H0@0@+H׉Ί+8HcH0HHƋ,H0'EE EEE|HEMHcɊ< tދEE M9$EEEE EEE|HEMHcɊ< tދEEEHEHcHHljH@H@HHt:H@HMHcH@HuHuHHHHE#EHcH@HUHHHHEH-88HcHHljH0H0HEHEHHtIHEHHMHMHH-HH HH HHE$HEH H-HHHEHEH-HHEHEHHt=HEHHHcH@HuHuHHHHHE&HHcH@HUHHHHEȋHHcH@H5HHHƉHH HHHHH8H0@0@H׉Ί8HcH0HHƋHEE EEE|HEMHcɊ< tދEEEHEHcHHljH@H@HHt:H@HMHcH@HuHuHHHHE#EHcH@HUHHHHEЋH;88HcHHljH0H0HEHEHHtIHEHHMHMHH;HHHHHHE$HEH H;HHHEHEH;HHEHEHHt=HEHHHcH@HuHuHHHHHE&HHcH@HUHHHHEHHcH@H5HHHƉHH HH`HH8H0@0@H׉Ί8HcH0HHƋHHHHHEH HEE?HEHMHEHHHEHEHHHEEEE=~HHHMH9u H]UHHPH}ut4H!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHE@$<u@HnH5@0@HHpHpHE@t@HpH5@0@oHH`H`oHE@ tLHE@ H H51\HHPHP\AHE@$<u@HoH5@0@OHH@H@OHEf@ft`HEf@H sH=AE0H8Hω4֋4H8D3A3HEHSHEH@Hf@ff tnHSH5H=AE0H(HH H H(DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH[H5H=AE0HHHHHDIDAt-HH HH0HljΈ HEMHHljH։ʋuHEMHHljH։ʋuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHc%HHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E$EEHc%HHljHEHEHEHEHHtIHEHHMHMHH$HHHHHHE$HEH H$HHHEHEH$HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHM%H5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHP]f.UHHPH}ut4H!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHE@$<u@HnH5@0@HHpHpHE@t@HpH5@0@oHH`H`oHE@ tLHE@ H H51\HHPHP\AHE@$<u@HoH5@0@OHH@H@OHEf@ft`HEf@H sH=AE0H8Hω4֋4H8D3A3HEHSHEH@Hf@ff tnHSH5H=AE0H(HH H H(DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH[H5H=AE0HHHHHDIDAt-HH HH0HljΈ HEMHHljH։ʋuHEMHHljH։ʋuEE EԃEԋEԃ|HEMHcɊ< tދEԃEԋEԉEEHcHHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E"EEHcHHljHEHEHEHEHHtIHEHHMHMHH"HHHHHHE$HEH H"HHHEHEH"HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHMH5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHP]f.UHHHHHEH}ut@H!!H5@0@HHHHHHt,HHHH gH9uHHH( HDž(H(HH(@$<u@H!nH5@0@HHHH(@t@H!pH5@0@HHHH(@ tOH(@ H !H51HHHAH(@$<u@H!oH5@0@HHHH(f@ftcH(f@H !sH=AE0HHω֋HDAH(HbH(H@Hf@ff tnH!SH5H=AE0HHHHHDIDAH(H@Hf@fftnH!YH5H=AE0HHHHHDIDAH(H@Hf@f f $< H(H@Hf@f f fH!H=A E0HHlj֋HHD|A|D{A{H(H@Hf@ff tnH![H5H=AE0HpHHhHhHpDdIdDcAct-HH HH0HljΈ HH HHHHEH(UH H$AE0HXHHPHHPLHHXLDHAHDGAG$EE EEE|HEMHcɊ< tދEEEHEHccHHljH@H@HHt:H@HMHcH@HuHuHHHHE#EHcH@HUHHHHEH'88HccHHljH0H0HEHEHHtIHEHHMHMHH'HH8HH8HHE$HEH H'HHHEHEH'HHEHEHHt=HEHHHcH@HuHuHHHHHE&HHcH@HUHHHHEHHcH@cH5HH0HƉ,H0H HH0HH8H0@0@+H׉Ί+8HcH0HHƋ,H0'EE EEE|HEMHcɊ< tދEE M9$EEEE EEE|HEMHcɊ< tދEEEHEHcgHHljH@H@HHt:H@HMHcH@HuHuHHHHE#EHcH@HUHHHHEH/88HcgHHljH0H0HEHEHHtIHEHHMHMHH/HH HH HHE$HEH H/HHHEHEH/HHEHEHHt=HEHHHcH@HuHuHHHHHE&HHcH@HUHHHHEȋHHcH@gH5HHHƉHH HHHHH8H0@0@H׉Ί8HcH0HHƋHEE EEE|HEMHcɊ< tދEEEHEHcqHHljH@H@HHt:H@HMHcH@HuHuHHHHE#EHcH@HUHHHHEЋH=88HcqHHljH0H0HEHEHHtIHEHHMHMHH=HHHHHHE$HEH H=HHHEHEH=HHEHEHHt=HEHHHcH@HuHuHHHHHE&HHcH@HUHHHHEHHcH@qH5HHHƉHH HH`HH8H0@0@H׉Ί8HcH0HHƋH HHHHEH(HEE?HEHMHEHHHEHEHHHEEEE=~HH HxHHH0HLjHH(IL HNj‰HHHMH9u H]fDUHHpH}ut:H!H5@0@}HHxHxEHHHt)HHHH {H9uHHHEHEHEHHE@$<u@HnH5@0@wHHhHhwHE@t@HpH5@0@gHHXHXgHE@ tLHE@ H H51THHHHHTAHE@$<u@HoH5@0@GHH8H8GHEf@ft`HEf@H sH=AE0H0Hω,֋,H0D+A+HEHSHEH@Hf@ff tnHSH5H=AE0H HHHH DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH[H5H=AE0HHHHHDIDAt-HH HH0HljΈ E E+EEHEHHHHHEEHMHHωH։‹ɉMԋMԃESEHcH /E0HHω֋HDIHH$HHEHEHEHEHMȈHEHHHEHEHHHEHEHMȈHEHHHEHEHHHEEE EЃEЋEЃ|HEMHcɊ< tދEЃEЋEЉEEHc HHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E*EEHc HHljHEHEHEHEHHtIHEHHMHMHH*HHHHHHE$HEH H*HHHEHEH*HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHM H5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHp]UHH@HHHEH}ut@Hi!H5@0@#HHH#HHHt,HHHH gH9uHHH0 HDž0H0HH0@$<u@HinH5@0@HHHH0@t@HipH5@0@HHHH0@ tOH0@ H iH51HHHAH0@$<u@HioH5@0@HHHH0f@ftcH0f@H isH=AE0HHω֋HDAH0HbH0H@Hf@ff tnHiSH5H=AE0HHHHHDIDAH0H@Hf@fftnHiYH5H=AE0HHHHHDIDAH0H@Hf@f f $< H0H@Hf@f f fHiH=A E0HHlj֋HHDADAH0H@Hf@ff tnHi[H5H=AE0HxHHpHpHxDlIlDkAkHH HHEH$UH$H(AE0H`HHXHHXTHH`TDPAPDOAO(EE EEE|HEMHcɊ< tދEEEPEHcHHljHHHHHHt:HHHMHcHHHuHuHHHHE#EHcHHHUHHHHEP$@@HcHHljH8H8HEHEHHtIHEHHMHMHH$HH@HH@HHE$HEH H$HHHEHEH$HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHHHEPHcHHH5HH8HƉ4H8H HHHH@H8@0@3H׉Ί3@HcH8HHƋ4H8'EE EEE|HEMHcɊ< tދEE$M9$EEEE EEE|HEMHcɊ< tދEEEPEHcHHljHHHHHHt:HHHMHcHHHuHuHHHHE#EHcHHHUHHHHEP,@@HcHHljH8H8HEHEHHtIHEHHMHMHH,HH(HH(HHE$HEH H,HHHEHEH,HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHHHEȋPHcHHH5HH HƉH H HH0HH@H8@0@H׉Ί@HcH8HHƋH EE EEE|HEMHcɊ< tދEEEPEHcHHljHHHHHHt:HHHMHcHHHuHuHHHHE#EHcHHHUHHHHEЋP:@@HcHHljH8H8HEHEHHtIHEHHMHMHH:HHHHHHE$HEH H:HHHEHEH:HHEHEHHt=HEHPHcHHHuHuHHHHHE&PHcHHHUHHHHEPHcHHH5HHHƉHH HHHHH@H8@0@H׉Ί@HcH8HHƋHHcH HHωHƋHAH,HHH,upHH H`HHH0HLjHH(IL HNj‰H$HIL ljH֋HHLIHLIHH$ME HHHMH9u H@]fUHH H}ut@H !H5@0@CHH8H8CHHHt,HHHH uH9uHHHH HDžHHHHHH@$<u@H nH5@0@7HH(H(7HH@t@H pH5@0@'HHH'HH@ tOHH@ H H51HHHAHH@$<u@H oH5@0@HHHHHf@ftcHHf@H sH=AE0HHω֋HDAHHHbHHH@Hf@ff tnH SH5H=AE0HHHHHDIDAHHH@Hf@fftnH YH5H=AE0HHHHHDIDAHHH@Hf@f f $< HHH@Hf@f f fH H=A E0HHlj֋HHDADAHHH@Hf@ff tnH [H5H=AE0HHHHHDIDAHHH9uDH4HH5HHxHxDHH$EEEHHtHHH9uDH6HH5tHHhHhDtHHM6H5HH`HH`HEHEHEHEHtHHMHHEHHHHHHEDEtEH HDEE EEE|HEMHcɊ< tދEEEhEHc:HHljH`H`HHt:H`HMHcH`HuHuHHHHE#EHcH`HUHHHHEh#XXHc:HHljHPHPHEHEHHtIHEHHMHMHH#HHXHHXHHE$HEH H#HHHEHEH#HHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHEЋhHcH`:H5HHPHƉLHPH HHXHP@0@KH׉ΊKXHcHPHHƋLHPHHtHHH9uDH>HH5DHH8H8DDHHHHHHHEHHMDH5HH0HH0HEHEHEHEHtHEHHEHHHHHHEDEtEH HDEE EEE|HEMHcɊ< tދEEEhEHcHHHljH`H`HHt:H`HMHcH`HuHuHHHHE#EHcH`HUHHHHE؋hXXHcHHHljHPHPHEHEHHtIHEHHMHMHHHH(HH(HHE$HEH HHHHEHEHHHEHEHHt=HEHhHcH`HuHuHHHHHE&hHcH`HUHHHHE苅hHcH`HH5HH HƉH H HHHHXHP@0@H׉ΊXHcHPHHƋH HHHHHHHHtHHH9uDHRHH5HHHDHH HHEHEHEE=EEE)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|HHtHHH9uDHTHH5HHHDH@HHtHHH9uDHVHH5HHHDHHH ]UHHH}HuUt4H!H5@0@}HHuȉHMȊEHHHt)HHHH }H9uHHHEHEHEHHE؋@$<u4HnH5@0@}HHuHMEHE؋@t4HpH5@0@}HHuHMEHE؋@ t@HE؋@ H H51}HHuHUMAHE؋@$<u4HoH5@0@}HHuHMEHEf@ftZHEf@H sH=AE0H}Hω|֋|HMD{A{HEHZHEH@H@f@ff $<tnHUH5H=AE0HpHHhHhHpDdIdDcAcHEH@H@f@fftnHYH5H=AE0HXHHPHPHXDLILDKAKHEH@H@f@f f $< HEH@H@f@f f fHH=A E0H@Hlj<֋H5HHHHDH@@ H HωHxHxHHxƉtHʋtAAHLxpLljlHƋl‹pH@HtH@HH9uGH@H @H5hHH`HH`DhDž|H@HcɊC< tˋ Hc@HHljHHHHtOHHHcH@HCHHHHHHH9HcH@HCHHHHHH Hc@HHljHHHhHhHHtUHhHHhHhHHHHXHHXHH*HhH HHHHHhHHHhHhHHtIHhH HcHHhHhHHHHH, HcHHhHHHH HcH@H5HHPHƉLHP HcHNjLHPHHH`H`HHtIH`HHcHH`H`HHHHH,HcHH`HHHHH`HcHH`H`HHtUH`HH`H`HH HH@HH@HH*H`H H HHHHcH@H5HH8HH8H!H5@0@}HHuHMEHHHt)HHHH H9uHHHEHEHEHHEЋ@$<u4H>nH5@0@}HHuHMEHEЋ@t4H>pH5@0@}HHuHMEHEЋ@ t@HEЋ@ H >H51}HHuHUMAHEЋ@$<u4H>oH5@0@}HHuHMEHEf@ft`HEf@H >sH=AE0HxHωt֋tHxDsAsHEHSHEH@Hf@ff tnH>SH5H=AE0HhHH`H`HhD\I\D[A[HEH@Hf@fftnH>YH5H=AE0HPHHHHHHPDDIDDCACHEH@Hf@f f $< HEH@Hf@f f fH>H=A E0H8Hlj4֋4H80H0D,A,D+A+HEH@Hf@ff tnH>[H5H=AE0H HHHH DIDAt-HH HH)0HljΈ  HHHHEHEHE؋E=EEE)MEEE?HE؊HMHEHHHEHEHHHE؋EEEM9|E%HE HEHHHEEEEM9|HH HHHH0HLjHH(IL HNj ‰H]UHHpH}ut:H!H5@0@}HHxHxEHHHt)HHHH {H9uHHHEHEHEHHE@$<u@HnH5@0@wHHhHhwHE@t@HpH5@0@gHHXHXgHE@ tLHE@ H H51THHHHHTAHE@$<u@HoH5@0@GHH8H8GHEf@ft`HEf@H sH=AE0H0Hω,֋,H0D+A+HEHSHEH@Hf@ff tnHSH5H=AE0H HHHH DIDAHEH@Hf@fftnHYH5H=AE0HHHHHDIDAHEH@Hf@f f $< HEH@Hf@f f fHH=A E0HHlj֋HHDADAHEH@Hf@ff tnH[H5H=AE0HHHHHDIDAt-HH HH0HljΈ E E+EEHEHHHHHEEHMHHωH։‹ɉMԋMԃESEHcH %/E0HHω֋HDIHH$HHEHEHEHEHMȈHEHHHEHEHHHEHEHMȈHEHHHEHEHHHEEE EЃEЋEЃ|HEMHcɊ< tދEЃEЋEЉEEHc)HHljHEHEHHt4HEHMHcHUHuHuHHHHE EHcHMHUHHHHE؋E*EEHc)HHljHEHEHEHEHHtIHEHHMHMHH*HHHHHHE$HEH H*HHHEHEH*HHEHEHHt7HEHMHcHUHuHuHHHHHE EHcHMHUHHHHEEHcHM)H5HHHƉHH HHHHMHU@0@H׉ΊEHcHMHHƋHHp]UHHHHHEH}uHHpt@H!H5@0@oHH`H`oHHHt)HHHH VH9uHHHEHEHEHHE@$<u@HnH5@0@_HHPHP_HE@t@HpH5@0@OHH@H@OHE@ tLHE@ H H51HH0H0>HHHt,HHHH uH9uHHH@ HDž@H@HH@@$<u@HH nH5@0@/HH H /H@@t@HH pH5@0@HHHH@@ tOH@@ H H H51 HHH AH@@$<u@HH oH5@0@HHHH@f@ftcH@f@H H sH=AE0HHω֋HDAH@HbH@H@Hf@ff tnHH SH5H=AE0HHHHHDIDAH@H@Hf@fftnHH YH5H=AE0HHHHHDIDAH@H@Hf@f f $< H@H@Hf@f f fHH H=A E0HHlj֋HHDADAH@H@Hf@ff tnHH [H5H=AE0HHHHHDIDAt-HH HH&0HljΈ EE EEE|HEMHcɊ< tދEEE$EEEE EEE|HEMHcɊ< tދEEE`EHc HHljHXHXHHt:HXHMHcHXHuHuHHHHE#EHcHXHUHHHHE`PPHc HHljHHHHHEHEHHtIHEHHMHMHHHHxHHxHHE$HEH HHHHEHEHHHEHEHHt=HEH`HcHXHuHuHHHHHE&`HcHXHUHHHHEЋ`HcHX H5HHpHƉlHpH HHHHPHH@0@kH׉ΊkPHcHHHHƋlHpESEHcH /E0H`Hω\֋\H`D[I[HH H0HHHE0HljΈHxH?HHQHuHxHEEEEE)MEEE?HEHMHEHHHEHEHHHEEEEM9|E%HE HEHHHEEEEM9|Hx HHlj?aT#T0t[T1tAT3tTaTbtTduK EE EEE|HEMHcɊ< tދEEE`EHc HHljHXHXHHt:HXHMHcHXHuHuHHHHE#EHcHXHUHHHHE؋`PPHc HHljHHHHHEHEHHtIHEHHMHMHHHHHHHHHHE$HEH HHHHEHEHHHEHEHHt=HEH`HcHXHuHuHHHHHE&`HcHXHUHHHHE苅`HcHX H5HH@HƉHcAHHljHHH0H0HHtRH0HHH0H0H)HHxHHxHHE'HH0H)HHHEH0H)HH0H0HHtRH0HH0H0HHHHpHHpHHE'H0H HHHHEHcHAH5HHhHƉdHhDžJHcHNjdHhHHH(H(HHtRH(HHH(H(H>HHXHHXHHE'HH(H>HHHEH(H>HH(H(HHtRH(HH(H(HH HHPHHPHHE'H(H H HHHEHcHAH5HHHHƉDHHH HHHHHJ@0@CHω֊CHcHHHƋDHHHH$HH Hlj( >( ** * 0H`x 8Ph D(  E( 0H`x H(  H( 0H`x iK( 0H` 0H`x N( 0H  *P( P( 'Q(  Q(    `x 8T( P X(  0 \( 0H ^( L^( 0H _(  _( _(  J`(  `(   `(  7a(  0H`x 8Phb( d(  e( 0H`0  H`xBi( Tk(  &l( 0H`0  H`xo(  p( q( q( r( r( s( s( t( t(    u( u( u( 0H`xv( v( w( w( x(   x( iy( y(  0H`xz( {( 0H  |( |( |(  `xJ~( ~( 0H  l( ́(  H(  `x( ^( ( 0(  (                  5( 0H`x 8Ph Ɖ(  0H (  ( (   (  0H`x( ,( ( ^( 0HV(    deleted blank line initial ! shifted 1 + ! shifted 3 + !?> !( ( l( ( ( ݬ( 9( ( $(  ( ( 0H  *( G(  (  `x -a ? set alter state, ? = { b, d, 0, 1, 3} -D name[=n] provide integer =n or logical true value -F treat source as fixed form source -h print this help message and quit -k cc sets the left and right key characters to cc -I directory search directory for include files (after .) -l log-file write log messages to log-file (default stderr) -m mark subsequent input files in the output file -n print line numbers on source lines -p disable the copy of set file at end of output -r print summary report at end of processing -s set-file read set-file as the set file (default coco.set) -v report file opening and closing -V print coco version and quit -w disable line wrapping -- optionally separate options from source file names( ( 5(  0  (  0H`x .( (  D( 0H   0H޺(  D(  ( ( (  0H`x 8P(  (  (  (  (  ( 0H( (  ( +( ( (  (  (  0H`x 8Ph   ( ( i( 5 "( >( ( FILE_TPATH_TPREDEFINED_TSYMBOL_TLOGICAL_TINTEGER_TMACRO_TTEXT_TIF_TSTATE_TREPORT_Tcoco.f90SOURCE_FILE_LIST?? End of file - next file is COCO:PROCESS_INPUT_FILE?? This was produced using the following SET fileCOCO:CLOSE_FILEcoco normal exitCOCO:CHECK_KEY_CHARS_OKCHECK_KEY_CHARS_OKKEYS?~`@#$^{}|\:COCO:GET_CL_ARG_CHECK_LENGET_CL_ARG_CHECK_LENIARGBUFFERcan't get command argument lengthcommand line argument too longCOCO:GET_LOG_VALUE_FROM_CMDLINEGET_LOG_VALUE_FROM_CMDLINELOGICAL_PTRSYMBOL_PTRtype mismatch command line versus source: COCO:GET_INT_VALUE_FROM_CMDLINEGET_INT_VALUE_FROM_CMDLINEINTEGER_PTRCOCO:GET_LOG_VALUE_FROM_SETFILEGET_LOG_VALUE_FROM_SETFILEparameter mismatch set file versus source file: type mismatch set file versus source: COCO:GET_INT_VALUE_FROM_SETFILEGET_INT_VALUE_FROM_SETFILECOCO:VALID_NEW_SF_NAMEVALID_NEW_SF_NAMESTRINGabcdefghijklmnopqrstuvwxyzillegal initial character in name: abcdefghijklmnopqrstuvwxyz0123456789_illegal character in name: PREDEFINED_MACROSset file attempt to redefine a predefined macro: attempt to declare duplicate set file name: COCO:VALID_NEW_CL_NAMEVALID_NEW_CL_NAMEcommand line attempt to redefine a predefined macro: attempt to declare duplicate command line name: COCO:VALID_NEW_NAMEVALID_NEW_NAMEattempt to redefine a predefined macro: attempt to declare duplicate name: COCO:FORMAT_TIMEFORMAT_TIME:COCO:FORMAT_DATEFORMAT_DATE/COCO:TO_LOWERTO_LOWERAZCOCO:UNQUOTE_STRINGUNQUOTE_STRINGQUOTED_STRUNQUOTED_STRIN_LENOUT_LEN COCO:SEEK_CLOSE_PARENSEEK_CLOSE_PARENSTARTMATCHCOCO:REPLACE_SUBSTRINGREPLACE_SUBSTRINGMIXED_CASE_STRSEARCH_STRLOWER_CASE_STRREPLACE_STRFIRST_IDXCOCO:EVAL_LOG_PRIMARYEVAL_LOG_PRIMARYVALUEPRIMARY_STRPRIMARY_LEN.not.az..true..false.bad logical literal: (unmatched parenthesis: bad logical primary: COCO:EVAL_INT_PRIMARYEVAL_INT_PRIMARY090123456789( i10)can't decode: bad integer expression: COCO:SEEK_LOG_PRIMARYSEEK_LOG_PRIMARYOP_IDXREL_OP_IDXLOG_EXPR.or..and..eqv..neqv..eq..ne..lt..le..ge..gt.==/=<<=>=>unbalanced parenthesis in expression: COCO:EVAL_REL_EXPREVAL_REL_EXPRREL_EXPRno relational operator (.eq., .ne., .gt., .ge., .le., .lt.): no relational operator (==, /=, >, >=, <=, <): COCO:EVAL_LOG_EXPREVAL_LOG_EXPRunknown logical operator: COCO:EVAL_INT_EXPREVAL_INT_EXPRINT_EXPRunknown arithmetic operator: COCO:INTEGER_OR_LOGICALINTEGER_OR_LOGICALEXPR_STRFLAG.<>=+-*/\can't classify: COCO:GET_NEXT_MACROGET_NEXT_MACROMACRO_PTRCOCO:GET_NEXT_LOGICALGET_NEXT_LOGICALCOCO:GET_NEXT_INTEGERGET_NEXT_INTEGERCOCO:GET_NEXT_SYMBOLGET_NEXT_SYMBOLCOCO:GET_TEXT_PTRGET_TEXT_PTRTEXT_PTRNAME_STRunknown text: text::COCO:GET_LOGICAL_VALUEGET_LOGICAL_VALUELOGICAL_STRRETURN_VALUECURRENT_FILElogical not defined: unknown logical: COCO:GET_INTEGER_VALUEGET_INTEGER_VALUEINTEGER_STRinteger not defined: unknown integer: COCO:SEEK_SF_SYMBOL_NAMESEEK_SF_SYMBOL_NAMECOCO:SEEK_CL_SYMBOL_NAMESEEK_CL_SYMBOL_NAMECOCO:SEEK_SYMBOL_NAMESEEK_SYMBOL_NAMECOCO:PROCESS_SYMBOLS_DIRECTIVEPROCESS_SYMBOLS_DIRECTIVESYMBOLS_DIRextra characters at end of symbols directive: IF_CONSTRUCTCOCO:PROCESS_REPORT_DIRECTIVEPROCESS_REPORT_DIRECTIVEREPORT_DIRextra characters at end of report directive: COCO:PROCESS_OPTIONS_DIRECTIVEPROCESS_OPTIONS_DIRECTIVEOPTIONS_DIRextra characters at end of options directive: COCO:PROCESS_DOCUMENT_DIRECTIVEPROCESS_DOCUMENT_DIRECTIVEDOCUMENT_DIRextra characters at end of document directive: DOCUMENT_TEXT?COCO:PROCESS_BLOCK_DIRECTIVEPROCESS_BLOCK_DIRECTIVEBLOCK_STMT=assignment variable must be an integer or a logical: stopmessageif(elseif(elseendifasserterror: unknown block directive: COCO:GET_COPY_NAMEGET_COPY_NAMENAME_LENDECL_STMTTEXT_NAME (can't find name in copy statement: COCO:PROCESS_COPY_DIRECTIVEPROCESS_COPY_DIRECTIVECOPY_DIRno actual arguments for text: can't find close parenthesis in copy directive: ,no dummy arguments for text: ?? ! text TEXT_PTR%TEXT_LINES??COCO:WRAP_SOURCE_LINE?? ! end text COCO:VERIFY_TEXT_DIRECTIVEVERIFY_TEXT_DIRECTIVETEXT_STMTillegal directive in text block: COCO:ASSIGN_TEXT_VALUEASSIGN_TEXT_VALUEARGS_ARRAYLINES_ARRAYCOCO:OPEN_SCRATCHread text failed: end of file encountered within text blockTEXT_FILE%LINEwrite text file failed: CURRENT_FILE%LINEendtextsource line in continued coco statement in text COCO:CLOSE_SCRATCHtext block has no lines: allocate text block failedrewind text scratch file failedread text scratch file failed dummy arg not found in text COCO:ADD_TEXTADD_TEXTTEXT_DECL_STRMUST_PARENScan't allocate text: FIRST_SYMBOLLAST_SYMBOL)bad text dummy argument list: TEXT_PTR%DUMMY_ARGScan't aloocate text actual args array: text actual args declared to need parens but no dummy args: extra characters at end of text declaration: COCO:PROCESS_TEXT_DIRECTIVEPROCESS_TEXT_DIRECTIVETEXT_DIRCOCO:GET_TEXT_NAMEGET_TEXT_NAMEcan't find name in text statement: COCO:VERIFY_MACRO_VALUEVERIFY_MACRO_VALUEARGLISTVALUE_STRmacro has null valuemacro argument unused: macro definition has name already defined: COCO:VERIFY_DUMMY_ARGSVERIFY_DUMMY_ARGSARG_ARRAYfound duplicated dummy argument name: COCO:PROCESS_DUMMY_ARGLISTPROCESS_DUMMY_ARGLISTallocate dummy argument list failed: ,COCO:ADD_MACROADD_MACROMACRO_NAMEMAC_DECL_STRcan't allocate macro: bad macro dummy argument list: MACRO_PTR%DUMMY_ARGScan't aloocate macro actual args array: macro actual args declared to need parens but no dummy args: a macro definition must have an equals sign: COCO:PROCESS_MACRO_DECLARATIONPROCESS_MACRO_DECLARATIONMAC_STMTCOCO:GET_MACRO_NAMEGET_MACRO_NAME=(can't find name in macro declaration: COCO:PROCESS_ASSERT_DIRECTIVEPROCESS_ASSERT_DIRECTIVEASSERT_DIRcan't find open parenthesis: can't find close parenthesis in assert directive: can't find condition in assert directive: extra characters after assert condition: if( .not. )thenwrite( unit= *, fmt= *) "assertion failed: : : " // "stop "assertion failed"end ifCOCO:PROCESS_ENDIF_DIRECTIVEPROCESS_ENDIF_DIRECTIVEENDIF_DIRend if outside any if construct: end if badly nested in text block: end if badly nested in include file: extra characters after end if directive: COCO:PROCESS_ELSE_DIRECTIVEPROCESS_ELSE_DIRECTIVEELSE_DIRelse outside if construct: else after else: else badly nested in text block: else badly nested in include file: extra characters after else directive: IF_CONSTRUCT%ENCLOSINGCOCO:PROCESS_ELSEIF_DIRECTIVEPROCESS_ELSEIF_DIRECTIVEELSEIF_DIRelse if outside if construct: else if after else: else if badly nested in text block: else if badly nested in include file: no 'then' in else if directive: extra characters after else if directive: COCO:PROCESS_IF_DIRECTIVEPROCESS_IF_DIRECTIVEIF_DIRno 'then' in if directive: extra characters after if directive: COCO:DELETE_BLOCKDELETE_BLOCKPHASEblocks bested badlydeallocate block failedCOCO:NEW_BLOCKNEW_BLOCKallocate block failedIF_CONSTRUCT%NESTEDCOCO:ADD_LOGICALADD_LOGICALIS_CONSTLOGICAL_NAMELOG_DECL_STRcan't allocate logical: an logical constant must have a value: non constant expression used to define logical constant: COCO:PROCESS_LOGICAL_DECLARATIONPROCESS_LOGICAL_DECLARATIONLOGICAL_STMT, COCO:ADD_INTEGERADD_INTEGERINT_DECL_STRINTEGER_NAMEcan't allocate integer: an integer constant must have a value: non constant expression used to define integer constant: COCO:PROCESS_INTEGER_DECLARATIONPROCESS_INTEGER_DECLARATIONINTEGER_STMTCOCO:GET_SYMBOL_NAMEGET_SYMBOL_NAMESYMBOL_NAME= can't find name in declaration: COCO:PROCESS_MESSAGE_DIRECTIVEPROCESS_MESSAGE_DIRECTIVEMESSAGE_DIR'bad message string: +-can't encode: bad message list item: ( a)coco message: COCO:PROCESS_STOP_DIRECTIVEPROCESS_STOP_DIRECTIVESTOP_DIRcoco stop directive encountered: OUTPUT_FILE%LINEcoco stop directive encounteredCOCO:PROCESS_LOGICAL_ASSIGNMENTPROCESS_LOGICAL_ASSIGNMENTASSIGN_DIRattempt to redefine a constant: COCO:PROCESS_INTEGER_ASSIGNMENTPROCESS_INTEGER_ASSIGNMENTCOCO:PROCESS_COCO_STATEMENTPROCESS_COCO_STATEMENTCOCO_STMTtarget of assignment must be type integer or logical: integer::integer,parameter::logical::logical,parameter::macro::macro,parens::cmdlinedocumentoptionsreportsymbolstext::text,parens::copy::unknown coco directive: COCO:BLANK_COMPRESS_LOWER_CASEBLANK_COMPRESS_LOWER_CASEOUT_STRIN_STR COCO:SEEK_COMMENT_IDXSEEK_COMMENT_IDXWRAP_LINECOMMENT_IDXWRAP_SOURCE_LINE& &COCO:PROCESS_ACTUAL_ARGLISTPROCESS_ACTUAL_ARGLISTACTUAL_ARGSDUMMY_ARGSMACRO_VALUE_STRCOCO:MAKE_ACTUAL_ARRAYMAKE_ACTUAL_ARRAYACTUAL_ARRAYcan't find close parenthesis in actual argument list: COCO:EDIT_MACRO_STRINGSEDIT_MACRO_STRINGSLOWER_CASE_LINEEDIT_LINEmacro args missing: can't find close parenthesis on line to be edited: COCO:EDIT_LOGICAL_STRINGSEDIT_LOGICAL_STRINGSedit logical symbol not defined: COCO:EDIT_INTEGER_STRINGSEDIT_INTEGER_STRINGSedit integer symbol not defined: COCO:EDIT_COCO_STRINGSEDIT_COCO_STRINGSCOCO:EDIT_SOURCE_LINEEDIT_SOURCE_LINESOURCE_LINECOCO:SEEK_INCLUDE_FILESEEK_INCLUDE_FILEINCLUDE_FILEDIRECTORYcan't inquire include file: COCO:PROCESS_INCLUDE_DIRECTIVEPROCESS_INCLUDE_DIRECTIVEINCLUDE_DIRnull include file name: badly quoted include file name: can't find include file: ??! include ??! end include COCO:PROCESS_ENDFILE_DIRECTIVEPROCESS_ENDFILE_DIRECTIVEENDFILE_DIRIF_PTRextra characters after endfile directive: COCO:ADD_NUMBER_TO_LINEADD_NUMBER_TO_LINEOUTPUT_LINE! COCO:WRITE_SOURCE_LINEWRITE_SOURCE_LINETHIS_FILETHIS_FILE%LINEerror writing source output: COCO:WRITE_COCO_LINEWRITE_COCO_LINE!!?>COCO:IS_COCO_STATEMENTIS_COCO_STATEMENTCOCO:GATHER_COCO_STATEMENTGATHER_COCO_STATEMENTCOMPLETESTATEMENTLINEnull statement encountered in continuation sequencetoo many continuationsPROCESS_INPUT_FILEcan't read input file: end of file encountered in a continued coco statementincludeinclude line cannot be continuedendfileendfile line cannot be continuedsource line encountered in a continued coco statementFILE_IF_LEVELbadly nested if-block at end of file: COCO:ADD_SF_LOGICALADD_SF_LOGICALcan't allocate set file logical: FIRST_SF_SYMBOLLAST_SF_SYMBOLa set file logical constant must have a value: COCO:PROCESS_SF_LOGICAL_DECLARATIONPROCESS_SF_LOGICAL_DECLARATIONCOCO:ADD_SF_INTEGERADD_SF_INTEGERcan't allocate set file integer: a set file integer constant must have a value: non constant expression used to define set file integer constant: COCO:PROCESS_SF_INTEGER_DECLARATIONPROCESS_SF_INTEGER_DECLARATIONCOCO:GET_SF_SYMBOL_NAMEGET_SF_SYMBOL_NAMEcan't find name in set file declaration: COCO:PROCESS_WRAP_DIRECTIVEPROCESS_WRAP_DIRECTIVEWRAP_DIRtoo many wrap statementsonoffunknown option on wrap directive: COCO:PROCESS_VERBOSE_DIRECTIVEPROCESS_VERBOSE_DIRECTIVEVERBOSE_DIRtoo many verbose statementsunknown option on verbose directive: COCO:PROCESS_SUMMARY_DIRECTIVEPROCESS_SUMMARY_DIRECTIVEtoo many report statementsunknown option on report directive: COCO:PROCESS_POST_DIRECTIVEPROCESS_POST_DIRECTIVEPOST_DIRtoo many post statementsunknown option on post directive: COCO:PROCESS_OUTPUT_DIRECTIVEPROCESS_OUTPUT_DIRECTIVEOUTPUT_DIRtoo many output statementsnull name found on output directive: badly quoted name found on output directive: command line overrides set file, output directive ignored: COCO:PROCESS_NUMBER_DIRECTIVEPROCESS_NUMBER_DIRECTIVENUMBER_DIRtoo many number statementsunknown option on number directive: COCO:PROCESS_MARK_DIRECTIVEPROCESS_MARK_DIRECTIVEMARK_DIRtoo many mark statementsunknown option on mark directive: COCO:PROCESS_LOGFILE_DIRECTIVEPROCESS_LOGFILE_DIRECTIVELOGFILE_DIRtoo many log file statementsnull name found on log file directive: badly quoted name found on log file directive: command line overrides set file, log file directive ignored: COCO:OPEN_FILECOCO:PROCESS_KEY_DIRECTIVEPROCESS_KEY_DIRECTIVEKEY_DIRtoo many keys statementsextra characters at end of key directive: COCO:PROCESS_INPUT_DIRECTIVEPROCESS_INPUT_DIRECTIVEINPUT_DIRnull name found on input directive: badly quoted name found on input directive: command line overrides set file, input directive ignored: COCO:ADD_DIRECTORYADD_DIRECTORYDIRECTORY_STRFIRST_DIRECTORYCURRENT_DIRECTORYcan't append to include path list: can't start path list: COCO:SEEK_DIRECTORYSEEK_DIRECTORYDIRECTORY_PTRCOCO:PROCESS_DIRECTORY_DIRECTIVEPROCESS_DIRECTORY_DIRECTIVEDIRECTORY_DIRnull directory name: badly quoted directory name: redundant include directory ignored: COCO:PROCESS_FORM_DIRECTIVEPROCESS_FORM_DIRECTIVEFORM_DIRtoo many form statementsfreefixedbad form: extra characters after form directive: COCO:PROCESS_ALTER_DIRECTIVEPROCESS_ALTER_DIRECTIVEALTER_DIRtoo many alter statementsdeleteblankshift1shift0shift3unknown alter directive: COCO:PROCESS_SET_STATEMENTPROCESS_SET_STATEMENTSET_STMTalter:directoryform:inputkeys:logfilemark:number:outputpost:report:verbose:wrap:unknown set file directive: COCO:COPY_SET_FILECOPY_SET_FILEcan't copy set fileCOCO:PROCESS_SET_FILEPROCESS_SET_FILEcan't read set file: end of file encountered within a continuation sequencesource lines are not allowed in the set fileCOCO:SEEK_SET_FILESEEK_SET_FILEcan't inquire set file named on command line: can't inquire set file: COCO_SET_FILEcan't inquire set file named from environment: coco.setcan't inquire default set file: coco.setCOCO:WRITE_SYMBOLSWRITE_SYMBOLSpredefined symbolsname: value: referenced in file: at line: never referencednext symboldeclared in file: type: logical constantvariablevalue: .true.value: .false.defined in file: value: type: integer ( a: i10)type: macro with arguments in parenthesistype: macro with argumentsdummy arguments: type: macrotype: text with arguments in parenthesistype: text with argumentstype: textblock:error: type is unknownend symbolsCOCO:WRITE_REPORTWRITE_REPORTcoco executed: set file: output: input:input: ( a: i0: a)include path: .include path: . (PATH_PTRfiles read: include files read: set lines read: coco lines read: source lines read: source lines written: selected source lines: elided source lines: text blocks read: text lines read: text lines written: COCO:WRITE_OPTIONSWRITE_OPTIONScoco options:ALTER_LABELSalter state causes lines to be alter state is undefinedprocessing free form source: wrap len:processing fixed form source: wrap len:marking subsequent input filesnot marking subsequent input filesnumbering source linesnot numbering source linespostpending set file not postpending set file printing coco reportnot printing coco reportverbose mode is onverbose mode is offwrapping source linesnot wrapping source linesfound directory separator character no directory separator character foundthe left argument key: "" the right argument key: "COCO:PROCESS_CMDLINE_DIRECTIVEPROCESS_CMDLINE_DIRECTIVECMDLINE_DIRextra characters at end of cmdline directive: coco command line: COCO:PROCESS_WRAP_OPTIONPROCESS_WRAP_OPTIONtoo many wrap options on command lineCOCO:PROCESS_VERBOSE_OPTIONPROCESS_VERBOSE_OPTIONtoo many verbose options on command lineCOCO:PROCESS_SET_FILE_OPTIONPROCESS_SET_FILE_OPTIONSET_FILE_ARGtoo many set file options on command lineCOCO:PROCESS_REPORT_OPTIONPROCESS_REPORT_OPTIONtoo many report options on command lineCOCO:PROCESS_POSTPEND_OPTIONPROCESS_POSTPEND_OPTIONtoo many postpend options on command lineCOCO:PROCESS_NUMBER_OPTIONPROCESS_NUMBER_OPTIONtoo many number options on command lineCOCO:PROCESS_MARK_OPTIONPROCESS_MARK_OPTIONtoo many mark options on command lineCOCO:PROCESS_LOG_FILE_OPTIONPROCESS_LOG_FILE_OPTIONLOG_FILE_ARGtoo many log file options on command lineCOCO:PROCESS_KEY_OPTIONPROCESS_KEY_OPTIONKEY_OPTtoo many -k optionssCOCO:PROCESS_INCLUDE_OPTIONPROCESS_INCLUDE_OPTIONDIRECTORY_OPTnull name passed to -I optionbadly quoted name passed to -I optionCOCO:PRINT_HELPPRINT_HELPusage: coco [ -V | -h | [[ opts ] [--] [ basename | output input [...]]]OPTIONS_MSGCOCO:PROCESS_FIXED_OPTIONPROCESS_FIXED_OPTIONtoo many fixed options on command lineCOCO:ADD_CL_LOGICALADD_CL_LOGICALcan't allocate -D logical: FIRST_CL_SYMBOLLAST_CL_SYMBOLCOCO:ADD_CL_INTEGERADD_CL_INTEGERcan't allocate -D integer: COCO:PROCESS_DEFINE_OPTIONPROCESS_DEFINE_OPTIONSYMBOL_OPTCOCO:PROCESS_ALTER_OPTIONPROCESS_ALTER_OPTIONALTER_OPTtoo many alter options on command linegarbled -a option: unknown -a option: COCO:GETOPTGETOPTOPTSTRINGCOCO:PROCESS_COMMAND_LINEPROCESS_COMMAND_LINEa:D:FhI:k:l:mnprs:vVw $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $coco error exitfile name too long: .fpp.f90.setcan't allocate input file arrayset file name too long: COCO:MSG_CONTINUEMSG_CONTINUEMSGcoco message: file: , line: COCO:MSG_QUITMSG_QUIT coco error: file: , iostat: coco error: COCO:CHECK_INCPATH_DIRSCHECK_INCPATH_DIRSCOCO:SEEK_SEP_CHARSEEK_SEP_CHARPWD\COCO:BUILD_INCPATH_VALUEBUILD_INCPATH_VALUEMACRO_VALUECOCO:GET_PWD_ENVIRONMENT_VALUEGET_PWD_ENVIRONMENT_VALUEcan't access environment variable: PWDenvironment variable too long for macro value: PWDCOCO:GET_USER_ENVIRONMENT_VALUEGET_USER_ENVIRONMENT_VALUEUSERcan't access environment variable: USERenvironment variable too long for macro value: USERLOGNAMEcan't access environment variable: LOGNAMEenvironment variable too long for macro value: LOGNAMECOCO:GET_COMMAND_LINE_VALUEGET_COMMAND_LINE_VALUEcan't access the command linecommand line too long for macro valueCOCO:SET_OPTION_DEFAULTSSET_OPTION_DEFAULTScan't rewind input list scratch filecan't read input name scratch filecan't allocate input file listcan't read input list tmp file.funusable key characters from set file: must be chosen from unusable key characters from command line: CLOSE_SCRATCHcan't close scratch file: CLOSE_FILEkeepcan't close file: closed file: OPEN_SCRATCHreadwriteunformattedscratchcan't open scratch file: OPEN_FILEreplacewriteoldreadcan't open file: opened file: COCO:INITIALIZE_COCOINITIALIZE_COCOfilelinedatetimecocosetfileusercwdincpath  5 5 5   ( a)  ( a) ( a)  ( a: i10)   zRx ,;  ,Lf ,|r , , ,  ,< ,l , , , ,,  ,\M  ,!  , ,  ,EA ,LJ$ ,|* ,& ,< , H ,< ,l ,A  ,A  ,A  ,,  ,\s  , , ,V  ,V  ,LV  ,|; ,; ,; ,   ,< ,l- ,3 , ,BI ,,G- ,\  , ,! ,  ,  ,L 1 ,| L  ,  , @ , U ,<  ,l 2 ,  ,  ,  ,, * ,\ Q  , * , Q  ,  , b0 ,L }  ,|  ,  , ( ,  ,<  ,l  ,  , "" , 9 ,,c ,\ ,) 4   , ,$  ,T  ,% ,  ,l , ,D ,t ,' ,  ,%' ,4  ,d ,6 ,6 ,6 ,$6 ,T ,6 ,6 , ,)  ,D> ,t ,Y  , ,  ,4  ,d , ,y  ,c ,$ ,T3 ,7 ,  ,y ,y ,D ,ty ,y ,y ,y ,4M ,d)  ,2  ,C ,y ,$  ,T  ,q  ,l  ,  ,S+ ,D ,t> , ,} ,  ,4T ,d ,W ,# ,# ,$  ,T , , , ,a ,D ,t , ,  - ; -  - ͺ - -X - - - -A - -̸ -{ -E  -Ķ  - - -M -& -ش -W z x T p TW 2 Tw R Tͬ  T Ȫ T  Tϧ  T l TS . T  Tע  T -t [ TP F ; 0 % 1 F @  - !ܡ !ʡ !á - -w p j d ^ X R L E > 7 0 -  -    -Ҟ ˞ -   -  -  y -] V -F ? L - -  -  3  -  -ޙ ~י ̙ y y y y y    ~ w p i b [ T M }F ? }8 1 }* # }  } -Ԙ |Ø  - {v \ -? |3  - {ޗ Ɨ - { ` =G =7 =, z& - {  zܖ -– = p - y -b Q  -ܕ ѕ -  ? -#  - ߔ  -  X -. q- w = -ȓ  - -% - x -ْ x - g -5 -ב -͑ w l -B *- w = - ̐ - -F -1 v - v -  -V - -  -$  -   u tP sĆ r -C < +  -  N -    -m f U * -ۃ ԃ à  -P q?  -   - q ` -8 '  - Ӂ  =u =e =Z pT -,   p =Ӏ k̀ -  -~ m ; *- o n = -   -v o mR -*  ~ -~ ~ ~ ^~ -~ } } -]} V} E} } -| | | | -K| D| 3| | -{ l{ { -{ z{ `{ -C{ l7{ { -z z z -z z dz =Kz =;z =0z k*z -z y y ky ey y -oy q-9y i2y =+y - y x -x -rx -]x jLx -&x jw -w w -w -9w -/w v v -v *-~v iwv =pv -Qv 7v -v -u -u hu -ku h(u -u t -t -~t -tt  t -s s s -Os Cs g5s - s r r -er ^r Mr (r -q q pq -!q q  q p -p p wp Lp -o o o o -ro fao ;o -o o n -n fn n -Zn In .n -n m m =m =m =|m evm -Nm =m 1m em al *-l dl cl =l -|l pl bl -:l )l k -k k k nk -k k j -mj fj Uj -j -i i i i -[i Ti Ci i -h bh h -h h ph -Sh bGh h -h g g -g g tg =[g =Kg =@g a:g -g  g g af -f =f Sf +-f Wf =f f /-pf TKf 5-7f Tf :-e Te A-e Te L-je TPe WIe =d ad Tc yc Tb b Ta a T` T` h-` W` =_ T_ m-]_ WV_ =O_ -^ ^ ^ ^ ^ -~^ *-F^ W?^ =8^ -^ ] -] !] -] !N] -%] -\ -\ -d\ D\ -/\ _\ -[ _[ -p[ -Z -Z +Z Z -Y `Y -Y `dY -ZY 6Y ;0Y *Y :$Y  Y -X X WX =X -X X X -bX *-*X W#X =X -W W -W !W -W !2W - W -V -gV -HV (V -V _U -U _}U -TU -T -T T S -S ^S -S ^HS ->S S ;S S :S R -R R WR =R -R wR pR RR GR AR #R R R Q Q Q Q Q Q Q Q Q gQ \Q hP ]/P P -O O -oO O -N N N N N N N N tN jN _N YN SN HN BN -*N  N N -M M WM =M M M M *-M \M W~M =rM lM ^M -M YL L L L -{L eL QL AL 7L #L L K K K -K K K K -zK -jK ;K 4K -J J J J J J J dJ ]J WJ -/J J J J I I I I *-I [I WI =I -I H H H H H -H kH WH LH EH H H H G G G G G G G G *-G ZoG WhG =\G VG HG -F YF F F F F F *-F XF WF =tF nF fF -FF ?F *F -F -F -E VE E -E U{E UE --E TE D -D UD D -tD TcD HD - D TD C =C =C =C SC -hC TWC KC S>C =C MC -B -B 9B B *-vB R_B PXB =GB *-4B Q*B P#B =B -A -A 9A NA ]A -A 9@ @ -\@ 9U@ ND@ @ -? 9? N? ? ->? 97? N&? > -> O> > -~> Nm> S> -6> O*> > -= N= = -= N= W= =>= =.= =#= M= -= N< < M< B< *-< K< F< =q< q-^< JG< F@< =,< -; I; -q; Ij; *-W; H@; F9; =*; q-; G ; F; =: -: E: -7: E0: -9 99 C9 9 -K9 9:9 8 -8 98 C8 f8 -8 98 C7 7 -7 97 Cv7 F7 -7 D 7 6 -6 C6 6 -6 Dz6 R6 -66 C%6  6 -5 C5 5 =5 =~5 =s5 Bm5 -Q5 C@5 45 B5 ;4 -4 34 *-4 @t4 >m4 =^4 q-K4 ?A4 >:4 =+4 -3 33 -3 9z3 <i3 G3 -2 92 2 -F2 9?2 <.2 2 -1 91 <1 w1 -.1 9'1 <1 0 -0 =0 0 -n0 <]0 C0 -&0 =0 / -/ </ / -/ </ G/ =./ =/ =/ ; / -. <. . ;. -. 6. -_. -2. Y&. - -- , -, , -, -, -+ -+ -y+ S+ -&+ Y+ * -* z* [* -3* -) -) ) -) --) -#) ( -( 9( ?( -( Y( ' -' & & -& 9& x& -)& 9"& 7& % -% 9% 4% -$ 9$ 7$ $ -S$ 9L$ 7;$ $ -# 9# 7# s# -6# 8%# " -" 7" " -" 8t" F" -" 7 " ! -! 7! t! =[! =K! =@! 6:! -! 7!  6 0   -z lf _ L -. 4   - q - 3{ 1j H - 3  -G 3@ 1/  - 3 1 v -K 2:  - 1  - 2  -f 1U = -! 1  = = = 0 - 1p d 09 -) , - - Y   -< % -  - Y Q = -  -  -h Y\  - Y y -L Y@ " -  - .  -u -d J -- .!  - -  - - N =5 =% = , - -  , -   - -c -O $; -  - -[ -F *2 -  * -  -] -  -  -P I - $  - - - $ -j -K + - - -` - -  - -> -4  -  J - -B - - -  - - - -s -i < - - -  -  z -O - - - u -J - - ' - '3 -)  -  - e -[   -      -A : -  - - $  -    t m -5 . - $ - ) - -t -` $L -" -  - -: - - - f -8 - - p -W  | -N - - - -j G - - -s - -  - -K -A  - m -X (A - ( - -# - - " J - -` -1 - -  - - - - -{ K - - - ' -   -U - - - x -J - - ' - '- -#  -  - Y -O   -     z -5 . -  - - $  -   u h a -) " - - & - - $w p -F ? 3    -  - $ -Y %( ! -      - - k -W $< -$  -  - d 7 -      -   t g ` -  - $   -j ^ W > 7 -       -~ w k U 4 -  -  - v -P  - -X -N   - -% -  - #  -v o !^ 9 -   -2 + !  -  ! R - "  - !  -_ "S % - !  - ! S =: =* =  - !   - =  - -[ -G 3 -  - -r -h  - -\ -G s3 - s -  -K D -   - - -  -p P -% - - R -9  - - -Y - - -   - -. - - -  -k - - -_ -U ( - - -  -  f -; - - - a -6 - -  -q  -  -  - K -A   -    s l -'  -  - -   -  } g Z S -  -  - t m -C < 0   -Ŀ    -+  Ͼ - y h = -  ֽ  -c R , -  ּ -  s -K :  -   = =x =m g -? . "  = - =z   -h R > . $   ݸ и -    "-_ A : =3 * $ - - ɷ · -} g S C 9 %    -     -g <   - -R -H   -  v p -F *-  = -  x -M - - - s -H -Ү -  - 1 -'  - ʭ - l -b * Ƭ  -^ J ث     *- x q =_ -P Ī     -p > *     ۩ ©     -s 0 ) - ͦ  -} - - ߥ -ѥ  - f -\ /    -ۤ   -x 5  - -y -o G -9  - Π -Ġ  l b \ -C   -  x -M - -ל  -  -y 6 -,  ԛ ʛ ě - *-a Z =S -4  - -s -^ J -$ ҙ -ș  - x -j ' -   _ Y N H @ "-    =   ڗ җ ̗  - ? } -q S L =E -; / ( - -  -ǖ r -{ o -Z S =L -B 6 / -# -  -Ε rǕ - v -a Z =N -; $  = -  = -Ԕ ͔ = -  = - } =q -^ G @ =4 -!   = - ͓ Ɠ = -   -  =z -e ^ =R -? ( ! = -   = -   =  - -  u -M <  -   -  h -@ /  =я = =  - w k ^ =L -& =    "-  } v =o f / -  - j - ?   "- ي Ҋ =ˊ Š > ?3 $   -ɉ ‰   -3 " ݈ -  v N -    -z i I -!   -ʆ   -l [ C -  х = = =  -o ^ R > =  - *-  = - e -= -ك -ă  - J -@  - - - = .     -  r-  = -> ) - *-  = - y -Q -~ -~ ~ -~ ^~ -T~ ,~ -~ -} -} } | *-| | | =| | -v| o| ^| 9| -{ { { -2{ +{ { z -z z z Rz -z z y -y y y -_y Sy %y -x x x -x x Sx =:x =*x =x x -w w w w -w =w w -^ -^ ^ -] ] ] -] t] Y] -1]  ] \ =\ =\ =\ \ -y\ h\ \\ \ - \ [ -[ 0[ Z -Z 0|Z =Z -Z 0Z Y -Y Y Y Y Y 1Y Y 1{Y tY 1mY -bY 1EY 18Y 11Y 1#Y 1Y Y 1X -X X X X X X X X -kX dX XX BX 5X .X -X X W W W W W W -W {W oW YW LW *W 1#W -V V 1V V 1V -V *-sV lV =eV -FV &V -U -U -U tU -NU  U -U T -T -bT -XT S -S S -S -gS FS -R >R R R -^R >MR R -Q >Q Q pQ -!Q >Q  Q P -P P _P -7P &P  P -O O O -~O mO RO -*O O N =N =N =N N -rN aN UN N N N M *-M M M =M M -M M pM -TM CM )M - M M L -L L L -wL fL -L =L =L =K K -K K K K K -K hK -AK +K -K  K -J -J -J ?J ,J -I I I -I -[I -OI -9I 2I -H rH -H H -fH UH 5H - H G G -G G G -oG ^G FG -*G G F =F =F =F F -F yF mF NF -4F =-F -F F -E E =E -E q-E |E =uE -VE  > > > -v> e> E> ->  > = -= = = -m= \= D= -=  = < =< =< =< < -p< _< S< .< =< < -; *-; ; =; -~; d; -B; -: -: : -: [: -Q: 2: -: -9 -9 8 8 -8 i8 -K8 7 7 *-7 7 7 =7 7 -p7 i7 X7 67 -6 6 6 -56 .6 6 5 -5 5 5 ^5 -!5 5 4 -4 4 4 -t4 h4 @4 -4 4 3 -3 3 }3 =d3 =T3 =I3 C3 -!3 3 3 2 2 -2 2 2 -2 t2 m2 =b2 1 1 w1 o1 *-\1 R1 K1 =?1 91 -0 0 0 0 -T0 C0 / -/ / / o/ - / / / . -. . j. -N. =. #. -. - - -- - - -q- `- '- =- =, =, , -, , , , , w, o, *-\, R, K, =?, 9, -, , + -+ + + -|+ p+ H+ -,+ + + -* * * =* =t* =i* c* -G* 6* **  * * ) ) *-) ) ) =) ) -) ) `) -D) 3) ) -( ( ( -( ( ( -g( V( ( =( =' =' ' -' ' ' ' ' w' o' *-\' R' K' =?' 9' -' ' & -& & & -|& p& H& -,& & & -% % % =% =t% =i% c% -G% 6% *%  % % $ $ *-$ $ $ =$ $ -$ $ `$ -D$ 3$ $ -# # # -# # # -g# V# # =# =" =" " -" " " " x" ! ! ! *-|! r! k! =_! Y! - ! !   -t c  -    -@ 9 (  -   -n ] C -&   -   -  G =. = =   -       *-| r k =_ Y -1    -   -  h -L ; # -   = = =  -g V J + !   *-   =  -   -d S 9 -   -   - v = =$ = =   -     - -q -] I -*  - - -{ j -D  -  - -e -[  T -  -D = % ! - " !  ! ! - *-a Z =S -4  - - - t -N   -  - -t -j  -  -  ~ Y -   -R K :  -   r -5 $  -   - s E -   -  s =Z =J =? 9 -    - = e - -} a -M h5 - - - B -  - h  -  -   - -O -% -  ;u -L - - - k -V B -  - - -  : -l ~X -2 ~ - - - h -T h< - - - I -  - h  } - g A -, | - | - n h -\ -5  - h - -n -d  -  -i hb  { z  - -g K -7 h - - - , -  - h  y x  - - } -i hQ -& - - ^ -  - h  w" v  - -  - h -X - -  -K D - h  -  -  -w  - u - uz -p L -3 : -  - r -] tF - t -   - -c G -3 h - - - " -  - h  s r  - - s -_ hD - - - N -  - h  q p  - -  - - h| -]   - -0 -&  - -y -o  -  -t hm  o n  - -r V -B h' - - - 1 -  - h  m -  - lu f -/ l  - k -} k+ -!  - j    s m -a -K iD -  - h  -l g[ 5 - f  - g | -T fC ( - f  = = =v ep -H f7 + e = - = - L - - y - d -d -< 6 -* - y - c - -  - - y -o bh -C -  - - y - a - -  -y -k ye -O `H -# -  - -  - _ - -k e -Y -K yE -/ ^( - -  - - y - ] -m -E ? -3 -%  - \ - -  - - y -s [l -G -  - - y - Z - -  -} -- & - O  - -u Yi 8 -, -  - O - Y  -Y -L O8 -   -^ - - - 9  - -} -N -/  - - J -  -p - -  -g Y[ * - V - - O e -8 Y,  -  - -  -  - Xy -A V: -. - O  - -  -  -s W -@ O bu -L - - O ) - W -ڿ W -W VP -D - O   -׾ - - O -f F - -Ż U - w -\ ? -$ ޺ -Ժ  Z -  -ɹ O¹  - -f _ - O  -޸ - - O -m M -" -| ` -V . - - -   -   r h T D !  - ۴ δ Ǵ - { -o -* O#   - - Tٳ -  - -< O5 %  - - -Բ O -  -V - S - j -O 2 - Ѯ -Ǯ  M -  -ϭ ɭ - - - Ok -L , - - -v Rb -< R -  -  -e  - Ѫ  -V O -  - - - O - l -@ - - - - h- P = -t   - -< -2  - -[ -F Q/ - Q - m-O PH =A -  -ǣ O  -? ' - Nܢ  - M} ` -7 N+  -ա Mġ  - Mp + = = = L -ɠ M  L =m -S =L -9 '3 -' - K -ҟ r˟ - * t - - 2؞  *- J I =W -K -$  - *ܝ - -Z -P  -h R  - g -/ r( - *ܚ  - t -h -R HK - r -Ǚ *  - - G -Y rR - *  - -Ř - * -~ ^ -3 - - C -n C -  - -k -a  - r -s *l C -*  -Ó -  -Y - - -M -C  - - -  -   -  -   -Ў -d -Z 2 - - -  -  -v -` FY -! r -Ջ *΋ Ë - - E -b r[ - *   - -n -Z *F -'  -܉ - -j -` 8 - - - ! - r - *  - -n Dg -/ r( - *܄ ф -ń - - *s -T 4 - - -~ Cj -D C -  - -A -7 ́ - r -I *B  -  - -z W -) -~ -~ -~ - ~ } -} -X} -N} | -i| S| { -{ h{ -O{ z z -z -"z -z y -y -ky -ay x -x :x -.x -x Bx -w rw -w *w {w -ow -Yw ARw -w rw -v *v ov \v -Pv -:v =3v -u ru -u *u u -u -gu -Su *?u -u -t t -t --t -s -s -s Ys -+s -r -r 5q -q p -p 0p -p 0Ip -p -o -o -ao >o -o -n -n <kn -En <m -m m -m -m -m l -zl rsl -Kl El -9l -l -k k -k -k @zk -nk -Sk -=k -6k -j ?j -j *j j -j -mj 8fj -.j r'j -i *i i -i -i 7i -oi rhi -#i *i i -h -h >h -h rh -h -Gh *@h h h -g -g =g -g rg -Vg *Og Dg -8g -g -f *f -f -f zf -Lf -e -e -:e -0e e -d -~d -td b -b b -b 0tb -Nb 0a -a -Va -'a -a ` -` ->` -)` <` -_ <_ -_ e_ -*_ -^ -^ K^ -!^ r^ -] ] -] -] -] ] -D] *=] -] ;] -\ -\ :\ -\ r\ -S\ *L\ A\ -5\ -\ 9\ -[ r[ -[ *[ [[ -O[ -9[ 82[ -Z rZ -Z *Z Z -Z -zZ 7sZ -;Z r4Z -Y *Y Y -Y -Y 6Y -kY rdY -XY -Y * Y X X -X 2X jX -^X -HX 1AX - X rX -W *W W -W -uW -aW *MW -#W -W V -V -;V - V -U -U gU -9U -T -T CS -*S S -R 0R -R 0WR -)R -Q -Q -oQ LQ -Q -P -P /yP -SP /P -O O -O --O -#O N -N 2yN HN -N r N -M M -M -M *M -vM 2jM 9M -M L -L *L -L 5\L -/L 2#L K -K -K -K *K -jK -KK (K -J -J -TJ -I -I I -I -,I -"I G -qG NG -9G 0"G -F 0F -pF -F -E -E E -eE -D -D 4D -D 4HD ->D D -C -tC -jC B -B 2B B -ZB rSB -!B B -B -A *A -A 2A A -KA DA -A -@ 3@ -@ -@ q@ -Z@ *E@ - @ -= ,= -= = -s= 2g= 6= -= -< < -< -< 2< -y< rr< --< *&< ; -; 2; ; -; -y; r; -:; r3; -: *: : -: : {: V: -J: -4: 1-: -9 r9 -9 *9 9 -9 -a9 -M9 *99 -9 -8 8 -8 -'8 -7 -7 -7 S7 -%7 -6 -6 /5 -5 4 -4 04 -4 0C4 -4 -3 -z3 -[3 83 - 3 -2 -|2 /e2 -?2 /1 -1 1 -1 -31 -)1 0 Tu0 -@0 S*0 / -/ r/ -/ {/ -o/ -^/ *C/ T0/ -. S. . -u. n. -3. *,. -- .- T- -- Si- 1- -%- -, -, *, -, , -c, - * -) -) ) -) -7) --) ( Ty( -D( S.( ' -' r' -' ' -s' -L' 0' -' *' -& T& -\& Tj$ ,N$ -D$ %$ -# S# # -j# rc# -# *# # -" -" +" -" r" -U" *N" H" -" )! ! -! (! ! -X! )L! ! - (  - ( L =3 =# = ' - (  ' =b  &  -  =  $z j d *-Q %: 3 =' !  -  - | p $i Y    - *-  = -q Q -) - - # -y #6 -,  -  - q -g /    -  - P I 7 -   -  "w q -G *-  = -  - -5 -  ! - ! - t -Y ? -$  -  o i ` -X D -     -  -r k _ Y -/ *-  = -  - -* -  -  - i -N 4 -  -  d ^ U -M 9 -     -^ M ' -   -  n -F 5  -   = =s =h b -: )   - =  -   = y  y *-} f _ =I -( !  -  = u-  x =` t-9 2 =  y y - s    *-   =t -F ( ! =  - *-  = - m -K - -  - d -Z ; -    -  - x H B 4 -,  -   -   -` O H ; y2 y, -    = -   -u d J -!   -   -t c * = = =  -    =z t -h Q J => -2   =     *-   =   -  -t m Y -+ $   -     -   = -d S 3 -  -  - n V-: ) === -  } YS-/*-=- --5-  - - -a-- a-=6- - l-='- - u-{t=-- }-le= -- -]V=-- s-NG=--~ d-?8=--o U-0)=--` F-!=--Q 7- =--B (-=-y-3 -=-uj-$  I-=d-H=- I-=7-- W-xq= -- W-KD=--p V->7=--n Y-  -tc - -@9( - -bQ 7- - -aP ===- xr-N*-= - --T-?.-- --:-0  - -lU H-* - - wo*-\RK=?9- -TC - o-  - j-B1 - - i-A0 ===- ]W--*-=- ------ o-M-- -t4- -*-jc=\-= #---}-W-  --}-s  -- I--"- *-=-6/ - A- -`YH - -ve H- - -iX ===- o-U=N-;5- =-q-=-k K-#---s0-& ---}  - -oh=a-7*-=- --%--- d-?-- ~-T*-= - --B---- -\- - x-"=- -, -zi >- -dS -- - t-L;  - ==y=nh-@/ #=ؾ;--vj <- -|-OC -Ƽ -yr-J9 -ӻ» -@9( - T- Ź-vo^ .-߸ظǸ -H7 - `-  ƶ-~ ^-B1 - Ƶ- -eT ===-Ŵ rk-A:.  -̳ų -{ eXQ-<5.'-*-ı=- w-O--ְŰ-\-R *--- I-:- Ѯ- -}vle-;4( -ԭ*-=-{ [-3-Ϭ--@-6 --- ---Ϫ- -UNB ,-ũ -F?.  - Q- -piX "-Ԧ -u X-/# -ͥ -yh #= ==- -p=e_Q-ޣУʣ--ha=O-C---ע-q-tm=f-G '---u-O - ڠ--c-Y -ϟ*-=-i I-!---q.-$ -ם--{ ͜-*-jc=\-= ---|k-E- К--Y-O x-qj=c-  ט-{j -Зɗ ->7& - |-TC &- Õ- o-G6 =ؔ=Ȕ=-~ r^=82-*-ۓԓ=͓- -r---Ȓ- b-@--  -ː -{-%*-=- f-  -e^M %-֍ύ -Q@  - ͌- p-H7 - ===ys-Q@ 4-=-̊-{=p-q-|=u-V 6----^- -ć-r-h -ކ*-=-x X-0-̅--=-3  --- ܃-*-yr=k-L ,---z-T- ߁--h-^ x-sl=aY*-F<5=)#- -;* ~-~~x~ M~-}}} }-s}b} <}-}} |-|| |-[|J| /|-|{ {={={=}{w{-O{>{ 2{{=zz-z*-zz=z-kz Qz-/z-y-yy-yHy->y y-x-x-x Vx Ix-+xjx x-wiww*-www=ww-JwCw2w w-vv ^v-vvu u-uyuhu 8u-tt t-tt wt-NtBt t-ss s-ss Ws=>s=.s=#ss-sr rrr-r*-XrQr=Jr-+r r-q-q-|qkq-Eqq-p p-p-wp-mp p  p-ojo o-oioo*-|oroko=_oYo- oon n-tncn n-mmm m-@m9m(m l-ll l-blQl 7l-ll k-kk k-akPk k=j=j=jj-jj j~j-dj=YjOjiiiii-iq-SiLi=Ei-&i i-h-zh-ehTh-.hg-g g-g-Bg-8g ff-f*-ufnf=gf-Hf (f-f-e-eve-Pe e-e d-d-dd-Zd c-c*-IcBc=;c-c b-b-pb-[bJb-$ba-a a-a-8a-.a `x-C`<`=1`)`*-` ``=__-___ g_- _^ ^-`^Y^H^ ^-]]] ]-C]2]  ]-\\ \-\\ S\-+\\ [-[[ [=h[=X[=M[G[-[[ [Z=Z~Z-Z*-hZaZ=ZZ-;Z !Z-Y-Y-Y{Y-UYY-Y X-X-X-}X &X X-WjW W-WiWW*-WW{W=oWiW-WWW V-VsV .V-UUU U-PUIU8U U-TT T-rTaT GT-TT S-SS S-qS`S 'S=S=R=R~R-RR R~RvR-[R*-(Rz!R=R-Q Q-Q-aQ-LQ|;Q-Q|P-P P-P-GP-=P O O-OjO O-yOigOy_O*-LO{BOz;O=/Oy)O-N(NwN N-DN(3N M-M(MwM _M-M( MwL L-LxzL ZL-2Lw!L L-KxK K-KwqK YK-1Kw K J=J=J=JvJ-JwJ tJvEJm?J-J*-IrI=I-I I-I-!I- ItH-HtH-H oH-MH-H-G G G-{GjdG WG-9Gi'GqG*- GsGrF=FqF-FpFnF `F-FpE E-_EpXEnGE E-DpDnD D-KDo:D D-CnC C-CoC jC-BCn1C C-BnB B=B=~B=sBmmB-QBn@B 4BmBbA-A*-AgA=A-{A aA-?A-@-@k@-@kX@-N@ /@- @-?-? f? Y?-;?j$? ?->i>f>*->h>g>=>f>-Z>eS>cB>  >-=e= n=-=e=c= <-<e<cx< H<- <d; ;-;c; ;-^;dR; *;-;c: :-:c: g:=N:=>:=3:b-:-:c: 9b9\8-8 8-]8`L8 8I-7`7=7-7 \7-47_#7 6-6*-6`6=6-m6 S6-16-5-5_5-5_D5-:5 5-4-4-4 D4-&4a4-3`3]3 3-/3`3 2-2`{2]j2 >2-1`1]1 1-\1`U1]D1  1-0`0]0 0-%0`0 /-z/`s/]b/ 7/-.`.]. .-K._D.]3.  .--_- b---_ -], ,-,_y,]h, <,-+_+]+ +-a+^P+ *+-+]* *-*^* q*-I*]8* *-)]) )=)=v)=k)\e)-=)],)  )\(-(=(X(-b( ?(- ( 'O-'['=S'- ' &-& }&I-X&[Q&=&&-% %L-j%[c%=`$-/$ $-# #-n#J.#-" "-n"=g"YV" 3"-!=! !-0!=)!Y!  - = Y  W - [ Y -r[a -[Y ->[7Y& -Z -`YO 5- Z -Y -_YN ===X-Y X~=a-G=@--P-: -|ui SF-l:` /- -*-eT^=W-8 --w-bVN-(V- -|-'- Cl-?:3 -T=-|:p C-:t C-*-T=-- i->---2-( --~-t - --.-U- U -  [ -3 - -  ; - :   - :  5 - :   -  Q -$ :    - :  i -? 8 ,    ~\-/:# - k->:2 -: -~FaFTFMFF@?F8@1F*@#-@@@@@@-FtFgF`FUFJF@F9-GF FF-FFF|Fd]FNFG-GF  FF@-E@{ e@^-4*-T=- ---S-Sm-c 8- -- 3-$-- `-R Q -wRf -RQ -7R0Q -QQ \-Q -UQNQ= -QQ u-&=Q -={ .-=Q -L=EQ4 -R -aQP 3- R -Q |-TQC ===P-Q PN=8-=J- -L 1?-M=-J 3- I-M=f- N-M=-o R- -Jn-; -IK t-I -sIlK[ 3-IK -M=FK5 -= ^-=K -=xKg 6-L -K u-LL@ -K -K U=<=,=!J-K J=-=-x@i[-.0" - -0 z-PI= '-*-D=- c-8--D-sD!- --r-h C-0~ M-D=-0  C-0 -d*-+D$=-- ----}-s F--- S-: --y-dHP-*H- -~-)- -Y0M  -0 -S0G - -q0e !-0 -v0j 9- N,-0 - ob;-0 -0 Y-NF1F$FF@F@F@-@@@@@@u-jFDF7F0F%FFF -GF FF-FmF]FLF4-FF-GF FF@-^EW@K 5@.-*-D=- -Z--C-C=-3 ---~ --p-W 0-?A -H?7 -?A Z- ?A -n>gAV 0-> v-'> A ->A| E-=A -\=K -=A k-=A -B Y-1A  -B -xAg L-$A ο===@-lA[ O@=-=-Ӿ-5=44U-- ٽ-*-v5o=h-I )--->w-Q>- ܻ--L-B ĺ!!-=w S-)""! !yy߹A-ӹ5=@-5}=o-N:G2!+-"! ظ!˸!ĸ*-<5=|-R5K=.-5=Է!ͷ-"! z!m!f*-S;<55=-:9T2- -5ڵ=*-9w5p=S-68(u-Ҵ5=t-8'- 5=yڳyɳ-sT ----k--ܰ˰ *-{7d5]=K-5=-*-~5w=p-Q 1- --6-Y6-  --T-J ۬---J- -ë Tyy-5=4r49- ȩ-!-OH7 - Z-  ȧ-yra 6-Ϧ -\3K %- ϥ-3 l-D3 -ߤ ==q=N="'-*٣ /1-[*J 11*-2ޢ.ע=ˢ1/-j `/M/G-  ///*-0.=j/.-.=--_-7+& -,( j-, -i,b(Q )-ڝ,ӝ( -C+<(+ -+ T-+( ě-u+n(] 4-+ޚ(͚ -M*F(5 -* ^-*( Θ-*x(g >-*(ח -i)X 8-( -–) -r(a I--( =ʕ=='-(| p'%$-ʔ -z T-6(-ٓғ% -C2 -% ^-% Ǒ-& _-C%2 -& -% }-a%P ===$ݏ-% $x-^=SM-#*-"=܎- -u---ō-x P--- G-? 0- - ΋--U-K -ʊ -aP B-  щ -"= -u -Lj-ʇ#- -[O  - -چ - -l-- - g-' -τ  -m"f=Z T-; --!-ق - ?-7 (-  -ށ Ɓ--M-C -€ -YH :-  -"= -z ~-~-;~!"~-~ }-}} L}-D} 0}- }} }-| |-{|j| \|-4|#| { {-c{\{K{ &{-zz nz-zzz y-yyuy Jy-xxx x-px_x 9x-xx w-ww w-XwGw ,w-wv v=v=v=zvtv-Lv;v /vv=uuyuyu-uu=uuku-Cu2u tytyt-tt dt-@t*- tt=s-s s-s-Fs-1s s-rr-r r-er-r- r q-qq-jq Oq-Bq0q- q-p-p jp-=p1p o-oo-hoWoIo-!oo n -nn=n-qn :n "n!n-m"m!m m!m!m-em^mMm (m-ll pl-!ll l k-kkwk Lk-jjj j-rjaj ;j-jj i-ii i-ZiIi .i-ih h=h=h=|hvh-Nh=h 1hh-g=g g-g Ef-,f  f-e-le-Ae-d-d d-vd-%d-d cc-\c RcEc?c-cc bbxb-_b La-3a a-`-i`->`-_-_ ^-^ ]]-]-]-\-\ \-\-[u[-k[ C[-![[-ZZ-Z qZPZ-&ZZZ YYY-Y-YYY-YY~Y hY[YTY-YY-XX-X{XtX-JXCX7X !XX-WW W W-2W!W V-VV oV DV-UU U U-cU\U KU U-TT T T-STBT T-S S S-SS cS-;S *S S-R R R=xR=hR=]R WR-/R R R Q=QQ-Q Q={Q!gQ!`Q-3Q'Q Q-P"P!P P!P!P-bPVP BP!(P!P!P-O"O!O O!O!O-O*-_O XO=QO-2O O-N-N-N rN-LN N-N M-M-~M-tM  M-LL-RLKL:L L-KK cK-K KJ J-J}JlJ 9J-III I-TICI H-HHH oH- HHH G-GG jG-BG1G G-FF F-FF iF-AF0F E=E=E=EE-EE xEJE-+E$E E-D-DDD=D-D CC-oC-B-BB-B?B-B-A -AyAyA-:A-A@@=@-@ ??-?-?->>->p>-f> :m:-C:<:0: : :99-999 99a9Z9-09)99 988-8*-88=8-c8 C8-8-7-7y7-S77-6 6-6-66-,6 5-55=5w5f5-<5*-54=4-4 4-4-4-43-3t3-j3 B3- 3-2-2 2-1-1<1!51- 1"1!0 0!0!0-0*-k0d0=]0->0 0-/-}/-h/T/-./.-. .-.--.-#. <---*-,,=,-, ,-a,-+-++-+D+-:+ +-*-*-*  *x-))=`)-) )( (-x(g( (-''' '-;'4'#' &-&& y&-Q&@& #&-%% %-%% l%-D%3% $=$=$=$-$=$-v$k$->$-$$ ]#-5#$# "-"" k"->"2" !-!*-!!=!-n! N!-&!- -  -v 3 -)   ---~ - --U9- - ------ t-?-- -TH - -uc-  -{j - ->7& - ^-! - -k_ 1-  - _=F=6=+%- =-=-{ I-1x w-= -W---\U=N-D _r-G@=9"%-     -@ /   -    [ -     -} v e  5 -    -   t -K ?   -    -   T =; =+ =  - =-=HT;+-S -~wk UHT-mSW - T-YSC  - -KD=9--- -T-S m-$  - F/- n-- v-] a-H ;--N-- --3:- --l-b T-S~ 7- -O> - a-  -yh 2- -I8 - X-  -vo^ '- -z ]-4( - -~m (===- =y-_=X-E:- -mf=[-3-- _- -q 8!- --ua-4:( --}v-G9-*-=- -a---n-d <--- I-: -: 7-- ?-& - ;l-A--- g-?-:- c-.-- p-C:7 -: -qj=X-  -p_ - -3, - S- -jY  - y-*# - H-  - ~-UI - - I=0= =- =-e=^-K@- -sl=a-9-- e- -w >'- ia3-0 -*-f_=X-9 ---xg-A- --6-, -0 H-0 -p-' - - !;--e-6- -->:%- --]-S -0 t-G0; -=- \- -UN= - -1* -| V- -MF5  - v-'  ؼ- d-<+ -ٻ -r W-/ ٺ===-wf Z.=-=-۹й-F?=- -nb - R-* ɶ-hW õ- O-3 -޴--\-R -m R-9 i-P 0---e-- -[ --q-F-ڭ-Э }-4 - -eT - 2- -Ω-Y-.-¨- W-$ ڧ--:--- F- - V-. v- =-k P-# - - ơ- \-5 o-Ġ=-} ՟- -i] ݞn--!- - d-1 ٜ-*-vo=h-I )---s_-9-ݚ --2-( F-=Ә-p*-70=)-  --@-+-- g-,-ȕ- P-# - b-/ “- RD-  ڒ- z͑- c-92& - m--͏ ]-D  - ;]-/-Ì--u R-$-~:b-X ---- -݉ -WK '- =- l- -e^M "-ӆ̆ -A:) - f-  -]VE -ʃà -70 - t-L; - - g-?. =Ѐ==-v j>=- p~-+~~ |-| `|-/| |-{ {-t{c{ %{- { y-yy 5y-y xx-ax-w-w-w w-\w-vv-kv-Lv ,v-v-u-u @t-6t s-s s-hs %s-rr r-r hq-#q q o-o Xo-'o  o-n n-ln[n  n-mm=m-bm*-)m"m=m-l l-l-Pl-;l*l-lk-k k-jk-k-k ej-$jj=i-i i-]i $i-hhh h-I-I H-xHgH H-GGG G-8G1G G F-9F2F!F E-nE]E E-DDD D-1D*DD C-CC mC-EC4C C-BB B-B{B `B-8B'B A=A=A=AA-AoA cA>A=A@A-@@@=@-@ B?- ?-==-v= /=-< <<-<< 4;; ;-: ::::::-p: ,9- 9-8x8-n8 88'8!8-7 7777-77 O7-67 555-x5-'5-5 4-4 44 s4g4-9424=+443-3 l3-D333 22-U2N2x=2 2-11 i1-11x1 0-00xs0 K0-//x/ /-w/f/ F/-/x / .-.. .-n.x]. E.-.x . -=-=-=---q-x`- T-%--,,-, ,-i, ,-+ +-+ x+-G+ *+-* *-** E*-* )-) )m))p)-?) ")-( ((-d(](L( )(-'' '-5'.'' &-&&& d&-&&% %-}%v%e% C%-$$ $-B$;$*$ $-### s#-$## # "-"" n"-R"A" '"- "! !-!! !-u!d! +!=!=!=  -      ~ x p g a X / - - |smdCl93- - -N 1- - - -j `VEr-=- - q-I8 - -j - - wA- - mlc]-  - -x [-( - -m cXR-! - - 1- - N- - k-Mll-D3 -gY-  -sb - -<5$ - j-   -i b Q  ) -     -K D 3   -    -m \  B -    -    -x g  . = = =  -     -v -g -T N -$ *-=- -v----y Q-,-- ze-OH=--r X-=-|-6 -=g-K@- -=E-)- $-=#-- +-qj=-- z3-OH=--r X--&=--P 6Y- =-Xt-. -=_-C8- -=#-- E-^W=--z `E-"=--> $W-=o-SH- W-=3- - W-z=-V- U-_X=-T- hS-=6=-R-` FQ-=-P-> $O-=-mNb- M-=y-[LH-*-=- -p- --}-s K--- X-+2 J-=b-/ -I-\U=- -dV-)2 -2 ^f-*#=- -fG[- - i-  -b[J - -E4 - - U-- - =j=Z=OI-! {-N:B - J+-: - qdL-: -=zF-:  -*-=-h N-,---E-; --- ;-: -: ?!8-"! !!-{j H- -G@/ - p-!:  -:y 2-: -S:L; - -ra G- - -q` '===- x|i[-.0" - * -0 -zsg QD,-0 -x=qZ&-0 -*-un=g-H .- ---b%- --u-k -0 -k0_ !-"! !!-b[}J (- v-' } -} P-0} -j0Y -0} -30,} -~ z-R}A '-~ -} y-Q}@ ===|-} |\tV-L{@ 9--y=E>-z  -q-y=-` F-$-ƿ-x-zx=-3 --- K 3!,-"! ٽ!̽!Ž-vwou^ <-wϼ -;w4u# -wu d-'v -κu -zvn F-u  -͹u =j=Z=OtI-!u t޸-ĸ=d-i=-i Էɷ--Ҷ-ȶ -uxTw-i=ߵ- p j-^-7 -n-Ĵ-N-9s%-s- U-  -r-knd^q-3i,=-  -Z >*-i =-ְ-`-Kp7-p- Y-& - -l - - (-ߩ ©- I- -| 6-i=- m-: - G-  *-٠iҠ=Ǡ--&-o-ןo-{ - ў- >-6n"-n-ݝ֝n-n{-;m--i=- d-1 ߚ-i=X-'  -י &-n- G-+-l-ɗk-{-_J-.--Ȗ-*-RiK=D-% -ڕ-d-Oj;-jÔ- -l-- -mn- -R x-i=f-3 Đ- O-3-hƏ- r-? <!-Ѝ"ɍ! !!-Dg=e, -g O-ge -nggeV  -fҊ -es V--f! -ˉe -wef !===d-e d=d]y-H %-` `-c=_-. -ԅ_Å -c*-:c3=,-  -ф-s-^bM-'b-ڃ --S-I -Ƃa-i`b^Q +-ρ` q-"`^  ހ-`^w K-`^ -^`W^F !-~`~ i~-~`~^~ }-}`}^p} :}-|_|^| |-[|_O| |-{_{^{ o{- {_{^{ z-z_z^uz >z-z_y y-y^y ty-Ky_?y y-x^x x-x^x ?x=&x=x= x]x-w^w w]w-sw=hwX(w-v v-v vM-%v\v=u-u u-Uu uL-t\t=s-s bs-/s r-rJ~r-Kr q!q-q"q!q q!q!q->q=7qY&q q-p=p Op-p=oYo o-po=ioYXo 'o-n[nYn n-Bn[1n m-m[mYm ]m-m[mYl l-lZxl Xl-0lYl l-kZk k-kYok Wk-/kYk j=j=j=jXj-jYrj fjXNj=0j-j=j-iNi6-iD-iTi=xiji-=i:1i i-hhh hhhg-g:g g-_gXgLg 6g)g"g-f*-fTf=f-f rf-Gf-e-eVe-eV0e-&e d-d-d-wd cCc-c:c \c-cT c=c-b:b /aCa-`:` `-s`*-:`T3`=,`-`-_ _-_-#_-^-^-^ U^--^-]-] b]-I] )]-\-\-s\U_\-9\U[-[ [-[-8[-.[ vZ-IZ:=Z  Z-Y:Y Y-dY:XY Y-X:X X-VX $X-W:W W-|W:pW ,W-V:V V-V:{V U-U:U jU-=U:1U TT-T:T T-XTQTET /T"TSuS-HS:C-B=BOB B-\B=UBODB  B-APA A-qAO`A CA-APA @-@O@ @-d@OS@ @=?=?=?N?-?O? ?N^?==?-#?=?F>-> >-Q> 6>9-=K===-O= 8=-= <L-j<Kc<=`;-/; ;-: :-n:J.:-9 9!9-9"}9!q9 [9!N9!=9-8I8G8 8-X8IG8 8-7I7G7 s7-$7I7G 7 6-6=6Gu6 R6-5=5 5-O5=H5G75 5-4=4G4 v4-94H(4 4-3G3 3-3H3 X3-03G3 3-2G2 2=|2=l2=a2F[2-32G"2 2F1=1-1=1-1:1,-u1<-?1A81=(11-000 0-00s0 ]0P0//-v/0j/ 9/-//. ...-.*-o.Ah.=a.-B. ".-----l-DX--2-D,-, ,-,-1,-', +Cv+-I+0=+  +-*A*=*-*0z* (C(-(0~( M(-#(*-'A'='-'-' s'-H'-&-&-<&-2& &-%-%-~% %-$ $-$-8$-#$B$-#B#-# e#-=#-"-" &"-!0! !-!0! A!-!0!  - 0}  L -  -0 Y-,0  -0 d-70+ -e0Y -0 -o0c 2- G%-0 -~ h[4-0 -0 R-G! -|qe-Z4'  - -]M<$- x-NG; %-*-A=- x-J--@-@--# --x-n --`-G  -?; -8?' -?;u J-?; -^>W;F  - >  f - > ;   - >} ;l  5 - = ;   -L =;   - = ;  [ - = ;   - <o  I -! ;  -< -h;W <-; ===:-\;K ?:=3!-"! ~!q!a!Z-0")! !!!-"! !!|-T/C !-"! !!-!!!-X"Q!E /!"!-!!!-8 !!q!j-@"9!- ! !*-76=--!m!P-7 -"! !!-`/Y4H &-/ -4/-4 -/4 O-5 -4 -5w O-34"  -4 =={=p3j-N4= 13,!-"! !!*-s2\0U=9!2- !-"! !u!g-R!K!@!9-"! !!*-10=!-Z/I 8-"! !!-t/m-\ :-/ -H/A-0 -/- c-8.' -- -. o-S-B *-- ===,-n-] Q,9-=%!-"! !!!-a"Z!N 8!+!!-"! !!!-n"g![ E!8!1-*=- {!t-G; '! !!-"! !!-p*i=b-8*-*=- --&-+-+- e-@-- v-X- -~*-R*K=D-% --y-d)S--)- --A-7 --T(M&< -( _-( & -~(w&f 0-' -& f-='1 -& -&v 1===%-& %=n-T=I:!3- "! !!!-"! i!\!U-=- R!K-!"! !!!-"! v!i!F!?- !!!-"! m!`!R!K-!"! !!-*-z=s-T 4- --~$j-D$- --C-9 -@-  -*-d]=V-7 --v-a#M-'#- -{-&- -{m-C*- =- ---"-"{-q I-!-- Q-'*-=- -v--!-!_-U ---- 5- *-=- -Z-- - =-3 ---~  -*-=- g-9---n- --g-] !-"!} g!Z!S- -kZ - }-.' - l-D3 - -z _-7& ===-n bN=!!!-"! k!^!W--"&! !!- !!x!q-G"@!4 !!!-"! !!-k*-2+=$- --D-/-- q-I-- s-UG-*-ݾ=־- -l--ͽ-U-K #--- +-*-Ȼ=- {-P-ں-ź-9-/ -߹-- -*-=- _-4---o- -ö-n-d -ɵ*-=-p P-%---`- ٳ--Y-O !-"{!o Y!L!E-ޱ -]L - o-  ү- ^-6% -߮Ӯ -}l Q-) ӭ===-q` T$- =-Ȭ*- =-b B----j'- -Ъ-~-t --©*- ={-\ <--- -d !- -ʧ-x-n -*- =- h-@-ܥ-ǥ - M-C --- D-*- =- -y-- -ɢ -| T-/-ݡ-ӡ S!L-""! !!- ~ Y-  -R K: -  r-5$ -֝ŝ -s E-  -ɜ s=Z=J=?9- ӛ-=A-~=qE;("- ڙzs-* A-̗ŗ=oi-6 ,!-q K<6A-* =y-ax:w-= ے-’ ^KE- ې- W2---l-B-# -؎-c-8-̍- -j--  l_Y- - -m ݊--F-- ݇--!--Ȇ- -^---R-H --- - . -ށ-r-C-$ -ـ-c-N:-- -nX-3~-~ ~|~-R~K~?~ )~~~- ~-}}}-}}} }}}-H}A}-}|-|{}{-4{ {zzA-zzz=Czk-k j-j-Uj-@j)j-ji-i |i-Qi-h-h h-g*-gg=g-g ]g-/g-f-ff-dff-f e-e-]e-Se d-d cd-0d d-cc=c-c*-YcRc=Kc-,c  c-b-bb-Mb6b-ba-a a-^a- a-` n`-(` `-___ _-+__ ^-^y^h^ =^-]]] ]-c]R] ,]-]\ \-\\ s\-K\:\ \-[[ [=[=x[=m[g[-?[.[ "[[=ZY-Y Y-}YlY 3Y`-YY=X-X |X-TX_CX  X-W*-WW=W-W sW-QW-V-VV-VdV-ZV ;V-V-U-U dU-FU8U-T`TT T-PT`?T S-S`SS bS-S` SR R-vRoR^R 8R-QQ ~Q-/Q(QQ P-PPP XP- PPO O-kO_dOSO -O-N_N N-3N_,NN M-M_MM \M- M_ML L-LpL JL-"LL K-KK K-iKXK =K-KK J=J=J=JJ-]JLJ @JJ-I=II-II=UI-"I H!H-H"H!H H!xH!qH-H H=H-GGG |G- GG F-{FtFcF ;F-EEE E-UENE=E E-DD fD-DDC C-CCoC >C-CB B-BB }B-TBHB  B-AA A-AA iA=PA=@A=5A/A-AA @@=@-@@-\@P@ @-@ >->> =-< <l<<-[< Q<D<><- < ;;-;G;l;-);";=:-: j:-=:1: :-9*-99=9-p9 P9-%9-8-88-`88-8 7-7-_7-U7 6-6G6-|6*-C6<6=56-6 5-5-U5-@5,5-54-4 4-J4-3-3 n3-A353 2-2*-22=2-`2 @2-2-1-1v1-P10-0 0-0-00-&0 /-// ?/-0/.-. .--- ---- --,, ,-;,4,=-,-,+ +-^+ +-**-**=*-* b*-7*-)-))-r) )-) (-(-q(-g( '-''-M' *'-&& X&-+&& %-%% p%b%-5%)% $-$$$ $$ $#-## #-W#P#D# .#!#!-!! !-U!I! !- !         - x k d V B 7 + - - l_X-F#- zmE>-  -*-=-a >---k-E- -->-4 --- -sl[ 6- ~-/( - O- -fU - u-& -p J- -A:) - _-" - -l` 2-  - `=G=7=,&- -ib=[D-|k Q -   z -R A   -   -n  7 -    -  z -\   - -s -i   - -`*-4-=&- --d-O>-- --/-% --v j-9 - -ZSB -| /- -MF5 - p- -ibQ &- -L; - - \-4# - =q=a=VP-(  -b*-)"=- --b-M<-- --7-- -nX --U? - +- `-=--W-M -x - &- h-  -aZI - -B1  - - R-* - =g=W=LF-  -=--x=q-G*-=- -- - --u M--- 9- 2 - -O-$-- \-C - ;_-4---z Z-/-:m-c ;--- '-2 -h2\ 8-=-*-vo=h-I )---s_-9- --3-) -K5 -t Q-5 ---a-W - - ;--Y-*-  --:- -->-4 -V@ - N-& *-=X-  -o^ - ~-/( -y "- j- -q 9- - o-F:  - - :=!==- n=DY-( -a `-ng=?- -_ j-C*-= - --S->--- -y-3-) -b-IaB1  -a Q-a -oahW +-a ->`7& -` I-` -h`aP -_ -;_/ -_{ O-_ -m_fU -н -q T-+ -ɼ -ud ===- {-a=VPyGyA- -=j-7 -߹=!-"!{ e!X!Q-=-~ [- -XQ@ -ȶ -0) - D-ݴ -f_N -г -w ]-4( -زDz - I=0= =- ֱ=-n-A5 -qj=c-6* -̯ -e*-,%=- ߮-->-)-- k-C-- U-7- h->*-=-ت ----ȩv-l D- -- 0- -*-OH=A-" -צ-a-L8-- -V-- z-MA -- Ԣ- -SG С- \-=-  Q-  ԟ-*-qj=c-D $---nZ-4-؝ --3-) -U- - - -ui 2$- -} gZϘ-t C- - D-  ڕ-ϕyrk-`:-&--WPD .!-Փē-e^R </-֒ϒÒ -|*-PI=B-# -ґ-Y-D--- -U-- {-lH-- r-#a  -ax +-܌aՌČ -IaB1 - m- -d]L  -щʉ -3, - >-ׇ -]VE -҆ -sb E- - -fU ===܄ք- N-3=,--ƃ*-=-U-6 --v-K-߁-Ձ --+-! - ~-iU-/--=-3  -~-j~-U~A~-~}-} q}-(} |-| |-B|-{ {r-{{={o{5{-zz Rz-*zz y-yy Fy--y w-w nw;Iw-w-v-v-dv Dv-v-su:Wu-Mu "u-t-t-t s-ss s-rr r-{rjr Er--rr-qq=q-q*-OqHq=Aq-"q p-p-Xp-Cp,p-po-o o-To-n-n hn- nnm-mm l-ll l-jlYl El*-2lll=k-kkykyk*-kkk={k-lk3k-k !j-i*-ii=i-i ni-@i-h-hh-uh#h-h g-g-ng-dg f-ff-ff=vf-Lf*-f f=f-e e-e-e-ed-dxd-nd Cd-d-c-c ;c{-c c=b-b-]b-b-a a-a-R_6_-,_ _-^-^-w^ ^-]-]-z] ]-\ \-\\-i\-\- \ [u-N[7[0[=)[-Z ZZZZ-ZZyZ cZVZ8Zt-ZZ=YY-YY YrYbY[Y-1Y*YY YXXyXyX-XsXX-hX\X UXW-W V-V-UV-@V)V-VU-U |U-NU-T-T T-STGT S-SSS-SS~S=wSynSy~RTwR-kR-ZRPRIR-RR R QQQ-QQ-hQaQ-2QQQ Q-PPP PPP-|PuPiP SPFP?P*-,PPP=PyOOyO-OOO OOeO^O-4O-O!O  ONN-N*-NN=N-gN DN-N-M-MqM-KML-L L-LL-dL%L-L KK-K|KpK ZKMK#KK-JJJ JJJJ-J{J-kJaJZJ-0J)JJ JII-III-II8I.I'I-HHH HHH-HHH mH`HYH-/H(HH HGG-GG-GG=G-fG-AGG-FaFF F-7Fa&F E-EaEtE IE-DaDD D-\DaUDDD )D-CCC iC- CB B-`BYBHB B-AAA A-:A3A"A @-@@ n@-@@@ ?-R?A? >->>> a>-> >= =-=s= M=-%== <-<< <-l<[< @<-<< ;=;=;=;;-`;O; C;;=:-:|:-:*-::=y:-Z: @:-:-9-99-t979--9 9-8-8-8 18-8X 8-7 7W-7~7="7-7V6-6 6!6-c6"\6!P6 :6!-6!&6U-65=5-~5Ts5--5  5!5-4"4!4 4!4!4S-y4r4=4-3R3-3 3!}3-S3"L3!@3 *3!3!3Q-22=2-n2Pc2-2 1-1N1-~1 L1-01L%1-0 0-{02o0 K0f-00=/-/ /-h/G]/-/ .-..}. n.-.. --m-f-}U- ---,,}, ,-Y,~H, (,-,}+ +-+~+ x+-P+}?+ '+-*}* *=*=*=*|{*-S*}B* 6*|)-)=)-)f)-))jy)=r)-Y) ''-'-'-&z&-&zr&-h& I&-&& %y%y%-%r% o%-B%6% $A-$$j$=,$%$@-#j#=#-#:#-#xx#w-6#j/#=# #v-"j"= "-! !-!! c!-!r! \ -8   - <- - d-7+ U-r N-* - -}vB-LjE=/u-j=t-XG-+j =-s-XrB -r W-* -r v-I=  -j=- LA- -|-gqS--q- -y H-*-j=- -m--p-pV-L $--- - -z Z-3 o- j = - {   -   -g [   n - - -   l -j  M -   - *-_ jX =Q -2   --q-\mH-"m- -ls-el- lcl--lj=-l-t*-;j4=-- --M-8k$-k- w-<-- `-3' - r-? - vh-;/ - - -]VJ 4'- !-_"X!L 6!)!"-j=-g D- [-\jU=D-ig -\iK -ig n-ig -h ]-5g$ -h -|gk P-(g ===f-pg_ Sf.= \!- -a L-$_ -*-d=|-] C-!--c-wc4-*  --- 4-b-a] {-a -rak]Z .-a] -LaE]4 -`] q-` -j`c]R '-`] -;_4]# -_ R-_] -p_i]X ,-_] -Q^@ -] -^ a-9](  -] =v=f=[\U--] \---C-{*-BH;=4- --i-TZC-Z- --1-' Y-H=6-X- W-H}=-V- U-bH[=-T- kS-@H9=-R-c IQ-H=-P-A 'O-H=-pNe- M-H=j-NLC- -*-uHn=g-H (---Kv-PK - --E-; -2 yJ-8H1=- -@-I-H=-s <--2 K-2 f-H=-W -G- -6F/D -F A-FD -`FYDH -E -vDe H-E -D -iDX ===C-D C)4#;:A-9=@-9=k-J?@>*-< =-< d;m]:mQ;E:-!&-"! !!-*-u9n=g-H .- --8-b8%- --- 1--75 |- 7 -{7t5c ;-75 -g6V 6-5 -6 -^5M 5- 5 ===4-a5P D4,2-1=!-"! !z!s-O*-)1"=- --b-M0<-0ٿ-Ͽ --H-> -Ǿ-j/c-R 0-Խ/ý ~-//(- -/- X-.  -»- -n.b :-- -- w=^=N=C,=-!- ,ڹ%Թ-*=!-p"i!] G!:!3-*-*=۸- --"- )-ַ)- p-N-- -y-*(#& -( >-(&״ -`(Y&H -۳'ʳ -&q W-.'" -Ҳ& -&p 7===%-&б ı%#-} v=a!Z-0")! !!-ϰ*- =-| b-@--ͯ-Y-O 0--Ȯ- e-G9-ҭ -TC - o-  ث- j-B1 - - i-A0 =ީ=Ω=é- UJ--¨2 -`2O -ȧ-2 ?-2 --_2N -̥2ť -52$ ݤ-2v M-2 -d]L *-΢ x-)" - R- -  -zn F-* -ԟ ==r=ga-E4 (--b2V (-2 -h-;2/ ߜ-2 -G1<121'-2 -l2eT 1-՚2Ě }-.2' -2 S- ʘ-n] -ɗ— -:3" - -bQ 7- -ʕ -t ;="==-Ԕ Ȕ-/-2 ȓ-2 ?--ے2ϒ -R2F %-@ܑ@ґ@Ǒ-2 [- 2 ѐ-u2d -Ώ2Ǐ ->27& - j- -ibQ )-ڌӌŒ -UD $- ׋- -jY A-% ۊ=Š==-t h:-' !-*-=- q-I--Ј-V-L $--- M--2 -V*-*#=- ݅--<-'-- i-D-- -WPD .!-qj^ H;- -4&-2 -m2a =-- p J-~~ ~-P~I~ 8~  ~-}} } y}-*}#} } |-| | t| O|-{ { {-H{ A{ 0{ {-z z z hz-+z z y-y y y-uy iy ;y-y y x-x x ix=Px=@x=5x /x-x w w w-vwpw-Fw*- ww=v-v v-v-4v-v v-u u-u su-Nu-t-t t-9t- t2t s-s*-ysrs=ks-Ls ,s-s-r-vrbr-> >>-Z>2N> >-=2= =-y=n=c=Z=- =-<< <-S<G< &<-;;; ;-A;0; :-::: \:- ::9 9-9u9 U9--99 9-88 8-8x8 `8-D838 7=7=7=77-77 777-(7-77-6*-66=6-6 _6-76-5-55-5D5-:5 5-4-4-4 14- 43 3-3h3-@3/3 2-2 2-k2-62-1-1 x1-K10?1 0-000 0-l0e0=?0-00 /-/ s/-B/- /-.-. O.-".:. ---:- f--P-I-= ---Q,-,, \,->,!,-++ +-z+l+-+++ *-*r* %*-))) )-C)<)+) (-((( a(-( (' '-y'h' '-&&& &-<&5&$& %-%% z%-R%A% $%-$$ $-$$ m$-E$4$ #=#=#=##-#|# p#*#-#" "-" v"*-O"H"=!-!!-!a!-W! U -$   - -\U="- |-K .- -=V-# -PI8 - p-!  -y P- -ibQ /- }-.' - W-  - -ma 9- - =i=Y=- -g-F1-=#-*-=- s-H---1-'  - - -y   -  ? -   -  ^ -@  -   -s  - -n --s V-# -n Q- -T-# - O- - n-P- - -=|-I --f*--&=- --?-*-- l-D-- W-$ -{ ^-+ -a-0 - \-+ - {-]- -  - - +- - s-@ - n-; -q-@ #- -/(=- \-;"---Y*- =- --2- -- _-7-- J- -n Q- -T-# - O- - n-P- - - -~ -- f-3 -~ a-. -d-3 - x-/(=- o-  -u (- -F?. - d- -|k  - -?8' - }-UD '- - p-H7 ===-=-Y C*-= ---ve-?- - P- =- -ib=s-B - }-?8=;- -=-o - -le=h-5 -=Ϳ- C-  ׾-=-b .-=-ɻ p-H7 -ƺ=¹- ^- =*- -~m :-=-ŵ -SL=]-, -dz-v-Q;--ز²--j T*-/(=---v-P-  Ͱ- a-#=- -zs=-S -Ҭ -PI=L- -=- '- -}v=y-F -Ԧͦ=ޥ- T-, -=-s ?-= -ڡ -YH -נР=ӟ- o-1*=;-  -~ K- = -֛ -qj={-J  -ϙ--oY-4!--Ș-}-.' - ?-ؖ -`YH -Еɕ -81  - L- -ngV &-ؒ - e-<0 -ϑ -~ E=,== -Ґ Ɛ=u-M< -Ǐ }-S*-' =- ڎ--N-9(-- -h--  -xg  -Ћ--yZ-<--Š-f-H)- -Ή-r-T-׈ - -އ - - ņ- - Ʌ- - Є- "- ԃ- &- ؂- *- ܁- .- - 2- - 6- ~-~ :~- ~ }-} J}-,}|-| |-_| {-{{-d{ G{-{ z-zJz-z y-y iy-Kyx-x x-~x x-ww w-[wJw v-v mv-:v u-uu 7u-ut t-vtot^t 9t-ss s-2s+ss r-rrr Rr-rqq q-sqgq q-ppp p-8p1p p o-ooo Vo-oon n-wnkn n-mmm m-B-B B-AAA cA-&AA @-@@ @-p@d@ 6@-@? ?-?? d?=K?=;?=?=?->=>->> W>->>= >==-==  =-< <-< G<-<*-;;=;-; ;-l;-:-::-:U:-K: #:-9-9-9 L9-"9*-88=8-8 8-q8-7-77-7Z7-P7 (7-7-6-6 Q6-66=655-5~5  4-3 3-3 2-22=2-h2U2-+2*-11=1-1 1-z1-1-00-0c0-Y0 10- 0-/-/ P/-(// .-.W.-&.  .-- --\-K- ,-,,-Z, =,- , +-++-O+H+=A+*+*-** C*-* )-) w)-[)B)-&)(-( (-c( '-''-L' 7'-' &-^&W&=P&9&%-%% %->%7%&% %-$$ U$-$## #-s#l#[# /#-""" "-B";"*" "-!! M!-     -l e T   - -5$ -p D- -b[J - -wf I-  - -jY ====-l-S -j J-----  -u :---z-- - T-, - --[-0-- m-<  - -i  -j - - -l -b   -   -r a   - -  - -r---`-V - -\---O-E - -m\ #-  :- - ----t-j  - -wf N-&---- - _-7& - - ----z-p #- - N-5 e-=, --y-K-- -W %- - T-; d-6---2-( - `-8' - - -----x - -w f->- -QJ9 - h- -n 7- -N= - ]- -piX 2- x-)" -~ R- -e^M '- m- -s <- -TC - f- -~m )- -| _-6* - -o *===- \- -i 4-  -6M/ -M J-M -lMeT $- -H< - e- -n =- -aU - ~-/( - x-VE +- - -yh /===- yj-B1 -~ a-0  - - k-8 -} -u~d "- -~n - - w-F #- -} ?- - d-3 - -~}m 0- -~ -]}L - d-<~+ - l-z - =-z־ -^WzF -νǽz -6~/z -~ V-~z ƻ-w~pz_ 6-~zϺ -O}Hz7 -} `-} z и-}zzi @-}zٷ -Y|RzA -ö| m-|z ޵-|zw G- { ٴ-z -]{Q )-z ޳-³z x=_=O=Dy>-"z ys`-/ -߱ ʱ- |-I -߰ °- z-I ,- ٯ-w-v[-*  -ڮ - -DM=t,  -M X- Mt ɬ-zMstb -ګuɫ -tp V-*u -̪t -tp 7===s-tЩ ĩs-=nq-Mo v-M -oMhoW ,-ݟM֟oş -?M8o'  -Ϟp -po_ B-p ڝ-o -^oM ==ߜ=ԜnΜ-o nn=U-;=0ilb-M j ֔-zMi -ϓMȓj -=M6j% -Mj l-/k -Бj -vkj :-j -j h=O=?=4i.-j iΏ=-a-h L*-!d=---ygh-Bg- -2y Uf-d=- *-udn=c-A--͋e-eS-I  - Ί--u-!- T~-IS3 -ň *-~dw=l-J--ևRŇ-R\-R -Q-| `*-Bd;=0---O-cO - ބ-N-l W-Mb ˃-oM^ -ĂMb -2M+b -c p-Hb7 -c -b~ c-;b* ===a-br fa-~Y~-~ ~*-~\z~=o~-M~-}-}_}-}__}-U} }-|2| |^-z|\s|=C|-| |*-{\{={-{-B{--{]{-z]z-z kz-Oz .z-y-y-y-wy xTx-xSx Lx-%x  x*-w\w=w-w-Kw-6wR%w-vRv-v zv-\vQv-u u*-u\u=u-nu-u-tOt-tOt-vt >t-tNt-s s-hsMasZPs +s-rMr sr-$rMrZ r q-qMqZzq Dq-q[p p-pZp zp-Qp[Ep p-oZo o-oZo Eo=,o=o=oY o-nZn nYhn-UnJOn-(n  n*-mPm=m-m-Nm-9mW(m-mWl-l rl-El29l lV-kPk=k-|k `k*-5kP.k=#k-k-j-jU|j-VjUj- j i-i i-]i-5i-h-h QhT>h- hSg g-g ig*->gP7g=,g- g-f-fRf-_fRf-f e-eQce-_ #_-^K^ ^=^=|^=q^Jk^-C^K2^ &^J]-]E]-C]-]2 ] \-\*-v\Ho\=h\-I\ )\-[-[-s[C_[-9[CZ-Z Z-Z-Z-Z Y-Y:Y VY-,Y*-YHX=X-X X-X-'X-XAX-WAW-W fW-1W-V-V sV-FV::V U-U:U xU-KU:?U T-T:T S-S:sS 4S-S:R R-pR:dR RR-Q2Q Q-0> >w>-J>2>> =-=-=0s= E=-=2 = <-<2< \<-<@ <@;@;-;0;>; j;-;0: :-c:0\:>K:  :-909>9 9-D9?39  9-8>8 8-8?8 T8-,8>8 8-7>7 7=i7=Y7=N7=H7- 7>7 7=6-676-06-625 5-5*-p5;i5=b5-C5 )5-5-4-444-]444-4 3-3-d3-Z3  3-2:2 2-Z2:N2 2-1:1 1-j1:^1 030-X0:L0  0-/:/ /w/-J/2>/ .-.-.:s. E.-.2 . ---2- \---1 -1,1,-,:,8, j,-,:+ +-c+:\+8K+  +-*:*8* *-D*93*  *-)8) )-)9) T)-,)8) )-(8( (=i(=Y(=N(7H(- (8( (7'-'-'-0'-'2& &-&*-p&5i&=b&-C& )&-&-%-%4%-]%4%-% $-$-d$-Z$  $-#0# #-Z#0N# #-"0" "-j"0^" !3!-X!0L!  !- 0  w -J 2> --0s E-2  -2 \-1 11-0. j-0 -c0\.K  -0. -D/3  -. -/ T-,. -. =i=Y=N-H- . -#-d*-Q+:(3="*-)(=--_'X$G $-' p-!'$  -'$y P-'$ -i&b$Q /-& -=&6$% -&$ f-/% -$ -% f-J$9 !-$ ===#-e$T H#-!-p iX 6-  -5 .  -   ^ -    -   -c R 8 -   -   - p 7 = = =  -    -7 -- !  -   -   = -  = z -n W P =I -2 + =  - =\QA 2!    - -= -;%        -v i b-V?8=1- -&-  --j-UD-- --0-&  -Q; '       -  o ` Q H= -1=---x-L--&=-Ф Ȥq * h X P* УpPHq80* آТ*+x/h`5PH:80A LhmءС**xp`X*H@*0(**ؠРȠp*؞О*ph*XPq@8*( qx*h`qP"*؜М**"pXH@(ЛțhXP@8( ؚКȚ0 ""ph*XPr@8*( *phXXP@8X( rP@8( **xh`*0qАȐ**xxph`XPXPH@0(***hH80**ȍ*xp*H80**Ȍ*xp*@؋hȋmxh`*8 **؊*Ȋ*8( *؉uȉt*x*h`XPH@80 Ї*xp`XP8 ІȆ*aluph}XP@8( ؅ȅ~I}xIh|`WP{HW8y0 zzzzzzzzz؄zЄzȄzzzzzzzzzz`zPxH*8v0* ww؁uЁ*t*r*ss0s qpqo؀nЀ*m*kxllllxlpl(xlplhl`lPjH*8h0* i~i~g~~f~q~e~*~d~*x~bp~xh~c`~cX~cP~c8~}c}cx}cp}c`}aX}*H}_@}*0}`|`|^||]|q|\|*|[|*|Zx|xh|X`|*X|YP|YH|Y@|Y8|Y0|Y(|Y |Y|0{Y {W{*{U{*zVzVzTz*zRz*pzS8zS(zQ zqzPz*yOy*yNyxyLy*yMyMyMyMyMyMyMxMxKx*xIx*pxJ0xJ xHx*xFx*wGwGwEw*wCw*pwD0wD wBw*w@w*vAvAv?vIv=v*pv>8v>(v< vOv;vIu9uLu:u:u:u:u:u:u:t8t*t7tt6t*t4t*t5t5t5xt5s5s3s?s2sIs0sNs1s1s1s1r1r1r1r/r*r.rr-xr*hr+`r*Pr,Hr,@r,8r,q,q*qq)q*xq(pqA`q'Xq@Hq&@q*0q%(qq$qq#p*p"pp!p*p pupptpppphp*XpPp@p8p*(p pp4p4p4p4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4o4xo4`o0onmmhm`m*PmHm*8m0m(m- m-m-m-ll*ll plhl XlPl @l8l0lkkkkk*kk pkhkPkkkjj j*j j j jpj hjXj Pj @j8j(j jjj*iiii*ii*ii*iixiixipihi`iXiPiHi@i(ihhhgggggg*gpghgwXgPg@g8g(g gggffrffffffffffeeexepehe`edddd*dddxdpdhd`dXdcccccxc*hc`cPcHc@c8c0c(cbxbhb`bPbHbv8b0bo bb*bbaa*aaaaaaaaaaapaha`aXaPaHa@a0a_x_h_`_P_H_*8_0_ ____P^H^@^0^(^^^r^]]]]]0](]A]]]]\\\\r`\P\H\*8\0\e \\\\[[[[$[[+[[3[[x[p[Y`[X[H[@[0[([E[[E[ZWZZWZZWZZUZZSZZQpZhZOXZPZM@Z8Z*(Z ZJZZIYYfYYYYYYYYYYYYYYxYpYhY`YXYPYHY@Y8Y0Y(Y YYYYYXXXXXUUxUXUPU@U8U(U U*UUTTTTT*pThTTTSSSqSSSSxShS`SwPSHSq8S0S* SSSS*RRRRRR*RRxRRRRxRpRhR`RXRPRHR@R(RPPPPPP`xPpP*`P PPPMOOLOOO0O(O OOO6NNDNN*NNNN*NN*NxNpNhN`NXN@N(NMMM9xMpML`MXMPMLLLLL,xLpL<`LXL*HL@L0L(L*LL*LKKKKKKK(KKK*JJJ*JJ*J`JPJHJ8J0J JJ*JJ*IIIIXIHI@I0I(I*II*IH*HH*HH*HH*HHHHHxHpHGGG*GxG*hG`G*PGHG*8G0G* GGGGFxFpF`FXF*HF@F*0F(F*F~F*FEEE`EHE}@EA0E|(EAE{EAEzDwDyDADxDwDwD*DvD*DuD*pDthDXDrPD*HDs@Ds8Ds0Ds(Ds DsDsDsDsDsCsCsCCCpCBsBqB`xBopB*`Bp BpBnBAlAAmAmAm0Am(Am AmAkA@j@*@i@*@h@*@g@@f@*x@dp@*`@eX@eP@eH@e@@e8@e0@e(@e@?e0?c(??b?*?>>a>*>_>`>`H>`8>^0> >]>*>\>=[=*=Y=*=Z=Z=Z=Z=`= =Z=X=`<V<*<W<W<U<x<Tp<`<SX<H<Q@<8<R0<R(<R <R<R@;R8;R0;R;P;;O:*:N:*:M:*:L::K:*:I:*p:Jh:J`:JX:JP:JH:J@:J8:J0:J89J(9H 9*9G9r8F88E8*8D8*8C8*8B8*8Ax8h8@`8*P8?H8{88>08u 8=8t8<8*7;77:7*797*787777x7p7h7`7X7P7H7@78707(7 77776H65@505 575*565W454U444S434Q414f42424242x42332323033/3Ax3.p3@`3-X3wH3,@3v03+(3B3*3u3)2t2(22'22&2*2%2o2$2*p2#h2X2"P2*@2!82(2 2[2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 x1 p1 h1 `1 X1 P1 H1 011//.. x. p. X.P.* ...*--Y--W--U--S--Q-x-Oh-`-MP-H-*8-0-J --I--f,,,,,,,,,,,,,+x+H+(+ +&&Ap&h&@X& P&*@& 8&  &% %2% %*% h%X%P%* % %#$$*$$$*$$*$@$0$($*$$*$###*#x#p#*`#X#H#@#0#(#"""""*""""""x"p"!!!!!*x!p!`!X!*H!@!0!(!*!!!!       ph*XP@8( xh`PH80* xp`XH@0(xph`XPH@80( *ph*XP*@8( *xp*`X*H@0(*xph`*f**xp*`XPH@*x^h`*PH*80* hXP*@8V( *** *  *    *x p *` (   *   *   *x p *` (             p h X P 8            p X @ (   pph`X@0p^^x^xH^H^^^^X^X(^(^^^Lh^hA8^8:^5^/^+x^x*H^Hq^^^^X^X(^(^^^h^h8^8^^^x^xH^H^^^^2X^X(^(#~^}^|^h{^h8z^8y^x^w^xv^xHu^Ht^s^r^q^Xp^X(o^(}n^um^ll^ahk^hN8j^8Wi^Oh^Ig^?xf^x He^Hud^tc^b^Aa^ X`^X(_^(^^]^@\^`[^`0Z^0Y^ X^ o W^ vp V^p w@ U^@  T^  S^  R^ I Q^ JP P^P M O^ O N^ L M^ W L^ M` K^` E0 J^0 9 I^  H^  G^ Qp F^p S@ E^@ U D^ W C^ Y B^  A^ P @^P  ?^ >^=^<^`;^`0:^09^8^{7^ep6^p[@5^@B4^33^+2^$1^P0^Pf /^ ^.^V-^,^`+^`0*^0)^(^'^p&^p@%^@$^#^"^!^P ^P ^ ^^x^r`^`m0^0h^`^X^Ip^pD@^@<^6^,^"^P^P ^ : W pP  0C    @ @9h F Y ub ~c @ c  v7c Pc  p  m   5  I c R c [  w ( c c c c 0 , c c d d 0   d   - Hd 6 Z 0 f hd o d x d P d d d  ' 4  e  e  ;e   < 6` 8 l He u he ~  e 0 e PJ < e  f  ' ]B @ N #f W :f ` Lf i Sf r pf {  f f f ` f P (g n  & Ug / lg 8  U g ^ { g     g g 0 h  @h  $dh -uh 6h ?`T `h ih rh { h h h h  h h h h h h i : F i Oi X0i a6i jp ` X vwqj sj uj  j j @j   j j j (j 2j <j Fj Pj Zk d k nk xk k k "k 'k *k -k /k 2k 5k 8k p  _k rk %k / Mk Wk al kl u !l l H fI@l P7 l l l    m m  --m 7Cm A@SZ gTm qim {`Z ym m m m p m  m m m m # ;n En O m$n w 6n Mn _n kn P n  n n  n n  #n -o 7pZ go q7o {Qo `o   o   o o )o 3o = [~ p /p Ip Xp p  0  p #p -p 7p A _ p q `  q  h@ $ q -q *Eq 4Pq > \pXq q q q -q 7@Yq c@q q [q ( q q r & r 0r :r D(r N l , Lr hr r  r @ r r ^#r -r 7s As KfP0A@-s "1s )$"@s [s $qs .` Ls V;q("~s s s s  ` y s 0"s t `%, ;2t EAt OZt Ylt cxt mf t t t t u  7u Bu `h& Vu du  mu ! {u + u 5 @ S u ]  t u ~ u u  u u v Xv  l&!v !v !v $! B!Y! l!@!p&!v !v !v ! !`!t&! w !$w "7w "?w " :"Iw D"^w N"xw X"s"x&"w "w "w "P "w "|&"w "x "0x " #Vx # 3#F#&S#Yx ]#hx g#rx q#}x {#x #0 #x #x #x #y #Py #&#@ $&$y #$y -$y 7$ U$ Jm$&z$y $y $y $y $0 $&$z $-z $Fz $Qz $ %pz %z '%z 1% C%{ M% { W%&m%'|%{ %D{ %G{ %O{ %Q{ %i{ %*%p{ %{ %{ %{ % &{ &| &(| )&*6&R| @&n| J&| T&| ^& |&| &| &| &} &8} &*&O} &m} &} &} &p '} '} '} ' ~ )'H~ 3'*@'s~ J'~ T'~ ^'~ h' '~ '*'~ ' '  'p ' '' '*'? (N ( ,(X 6(n @(U(*b( l( v( ( ( ( ( ( (*( (1)*)H %)i /) 9) C)0 a)wz)P?)*) ) ) ) )̀ )P ) ) *@j%*+2*P <*q F* P* n*+{* * * *ˁ *Ё *0 *+* * *1 *= +` +? (+T 2+V <++R+ ,a+X k+g u+ + + +H/+ + +Ƃ +Ђ + + + ,L/,( ,H ',c 1,p ;,@ Y, s,P/, , , , ,,T/,Ӄ - - - 5- ?-G I-Q S-e ]-o g- q- {- - - - - - -„ -Ʉ -ׄ -ބ - .X/(. 2. <.1 F.9 P.@ Z.\/j.`/{.d/.A .P . .h/.D .Z .k .u /l//p/#/t/0/ :/x/N/p h/ / / /|// / /΅ /څ / / / 0/0 (0 20 <0 Z00 d000/0g 0 0 0 0 0 0@ 0Ȇ 1 1/,1 61 @1 ! ^10 h1@ 11/1R 1l 1P" 1 1/102p! (2C23P2 Z2 d2" ~2P# 232Ӈ 2 2 2p# 2$ 233'3 13 ;3/ E3 `3< j33y3F 3p% 3$3h 3 3 3P' 4 4Ȉ 4744 >4 H4 R4`Eu4 74( 4G 4a 4m 4x 4( 4Q474 5 5Ή 5 7/508>5ډ H5( [5X;h5݉ r5 |5 5@) 5`;5 5 5( 5>5= 5R 6>6b 6* 96d C6AP6h Z6 d6Aq6 {6 6Š 6ˊ 6Պ 6p* 6* 6A6 6A7 7+ *7@+ D7- b7> l7X v7 7 7 7ȋ 7 7& 78 77A7_ 7s 7 7 0 8 '80 A8 K8Ќ U8}8A8 8( 8p1 8)8@8A8G 9[ 9p 9`2 99 C9ȍ M9pu9A9 98 93 9A9W 9o 9 9@4 99:A*: 4:Ύ >: H:Ai:4 : : : : : B:A:8 :W :q :A!;@5 ?;} I; S;`Jv;A;ȏ ; ;A;5 ; ; ;R <A<E #<a -<x 7<AX<@6 v< < <Z<A<Ð < < <B<7 = "= ,=H 6=x @=jb=Bo= y=ґ = =B=@8 = = =r> B>= >Y #>p ->BN>8 l>y v> >{>B> >ߒ > >B> : ? ?( $?P .? 8? B? a?Bn?͓ x? ? ? B?; ? ? ?P@$B @K @h !@ +@0< I@ S@ ]@ g@@B|@pC@ @@F@# @6 @D @R @FAb Ax A< 2A A3 AI Bh B+BF8B BB LB VBFwB`? Bʖ B B B B BpBFB( BE C] CF5C? SCg ]C gC qC {C C C CCFC Cؗ C C CB D D D )D 3D =D" GD( QD0 [D7 eD= oDE yDN DT DFDq D D0E DFD D DI E E E G >EJME͘ WE aE kE(MxEM E` E@MEpNEp EH E E Eș E F F1 FQ#F? -FR 7FQFF` PFs ZFz dFTzF F F F FUF FVFҚ F F F G GX"G ,G" 6G5 @GD JGYaGP kGz uG G G G G G G I G G$ GZG0 GB H ZHI 1HO ;H_ EHj OHs YHz cH mH wH H H HƜ Hۜ H H H H) HA HW Hj H| HH]I I IP])I 3I =IН GII VI `I jI8 tI` ~I I I I՞ I I I I3 IF IZ Ip I I Jߟ J Jx`!J +J7 5JQ ?J` IJ0J gJ`vJ J JcJ J JcJpJ JР KcK@ :KcGK QK [Kc|KJ K0 K KcKY Kv K KcLJ 0L :L" YLcfLʡ pL zLcL0K L L % LdL( LE Md&MpK DM` NM' mMdzM M M dMK M M * MdN N Nd2NK PN ZN, {NdN> N[ Ns NdNPL N N2 O dO #O£ -Oգ 7O$dXOL vOݣ O < O(dO O O% O@N O3 OX O`F P,dP~ (P 2P0dAP KP UPN dPK PXgP P P\gP S P( P0N Q`gQO Qc #Qr -Q`S KQ UQp oQ yQ0\ QdgQ Q QХ QS Q@m QhgR R R $RT BRw `RlgmR( wRB RW RpgRU Rh R R R0 RtgS Sæ Sʦ !S 3SxgDS VSV tS|gSԦ S SX S SgS SV Sf S{ S S T T Tj)Tɧ 3Tۧ =T GTj^TkmT wT TnT T T( TnT rT0sT) T< T@tUG U :UHuGUT QUl [UP rULuU U U U U UPuU U UӬ U. VTuV )V 3V [ QV [VH eV 5 VXuV V V V[ V V V V( VX W< $W\u1W ;W EW\ cW® mW wW`uW W WpuW^ W8 W` W` W W Wǯ XЯ X X $Xx1X< ;X` YXP cXxpXt zX X X` X XxX X a Xb Yа YxY (Y 2Y ZbZ qZs {Zx Z} Z Z Z Z Z Z Zb Zb Zb Zb Zb Zb Zb [b [b [b [b #[ F[ _[x [ [ [ [ \ 3\ V\ o\ \` \p \ \ ] -] F] i]` ]p ] ] ] ^ '^ J^ m^ ^( ^0 ^ ^ _ 5_ X_h {_p _ _ _ _ ` D`8 h`H `P `h `x ` a @aP da` ap a a a b@ g Xg0 |gH g g g h &hH JhP dh h h h h i@ (i Li fi i i@ iP i j j Dj hj j jX jh jx k 6k Zk ~k k k k l 4l Xl rl0 lP l l l m8 @m@ dmX m` mh mp m n >n cn n n n nx o 5o8 Yo@ }oH oP oX o p 1p Up yp p p p q -q Qq vq( q0 q8 q@ rH /rP Tr xr r r r r "s Fs js s s s s t` 8tp Rt vt t th tp tx u Du hu u@ u u u v ,v Pv tv v v v w (w Bw fw w w w` wp x *x Nx rx x x x y &y Jy oy  y0 y y y z =zH azP {z z z z {h /{p I{0 m{8 {@ {H {P {X !| E|  _| | | |  |0 }` -} Q} k} } } } } ~ 9~ ]~` ~ ~ ~` ~p ~ ! E0 i8 @     7 Q  u`   ׀  ( C0 g@ H P ӁX P ` 5 Y }( p ł    ' K o   ۃ  # G k   ڄ  0 $@ IP nX ` h ݅p x ' L q    ߆0   A e    LJ  8 3 W {   È@ ` 8 / S wh! "  "  # `$ +h$ Ox$ s$ $ $ ߊ@% P% % A% [' ' ' Nj'  ' (' 30' W8' {@' H' ČX( `( ( &( J() n0) ) ) Ѝ) ) * <* `* * 8- ̎@- H- X- 8`- \h- p- - ȏ- - - 5- Z- - - ɐ- - x/ 7/ Q/ u0 0 0 0 H1 P1 C1 g1 82 @2 ɒP2 2 2 +3 O3 s3 4 04 Փp4 4 4 74 [5 u05 p5 5 ה5 5 6 906 ]p6 6 @7 `7 h7 p7 +7 O8 i08 p8 8 ˖8 8 9 -9 Q: u: : : : : : C0; gP; < < ɘ < (< < 5< O< s = @= 0> ՙ8> @> P> AX> e> ? H? ǚP? ? ? )? M @ q0@ @B PB ӛ`B pB B ?B cB B B ϜB B B >B cB B B ҝB D D 5E YE } E E ŞE ߞF F 'F KF oF G G ۟G G #H =`H ahH pH H ͠I 8I @I %pI IJ mJ HJ PJ šJ J J 'J AK eK HK PK K K K K 9L ]L w@L L L ٣L M ! M ;N _N  N 0N ˤ8N R S -8S Q@S kxS S S ͥT  T T /T ST wT XU `U ٦U U !U E@V iPV V V ˧W hX pX -xX QX uX X X X X -X RX wX Z Z ک[ P[ "`[ <[ `[ [ @\ ̪P\ \ \ .\ HP^ lX^ `^ h^ ثp^ x^ ^ D^ h^ ^ ^ ֬^ ^ ^ E^ jh` p` ` ̭` `   Ȱ (a La f(b 0b `b Ȯг ׮  P  9 `  @ կp   , D0 \` q   ǰ P   8 R l@ p  ñ  0 ` 3 Q q  P Բ   F j@ p  ɳ  0 ` 9 X v  P Դ   8 [@ p   е 0 ` ( P l  P ܶ  & L i@ p  Ƿ  0 (` F c  ( ͸X   & D fH x  ˹  8 0h S y  º( X  / U w H x л   ?8 ah {   ̼( X  % E h H x ҽ   88 Wh z   ;( X  + > _ xH x  ƿ  8 3h V v  ( X   G e 2@ F   r [ / ]` @p  hp    ` H 0 x     s KtT =j3C[/u#7_,VM~_main_f90_init___NAGf90_procref___NAGf90_rterr___NAGf90_line_Alloc_zvar___memcpy_chk___NAGf90_line_DeAlloc_o___NAGf90_disassociate_target_because___NAGf90_stop_line___NAGf90_pu_bad_cdtype_line___NAGf90_verify___NAGf90_getarg___NAGf90_associate_pointer___NAGf90_badptr3_line___NAGf90_charcmp_coco_DT_logical_tHEADER___NAGf90_destroy_pointer_coco_DT_integer_tHEADER___stack_chk_guard___stack_chk_fail___NAGf90_chindex1___NAGf90_scalar_ifilex___NAGf90_read_internal_file___NAGf90_establish_format___NAGf90_fmt_read_i___NAGf90_end_read_internal___NAGf90_scan_coco_DT_macro_tHEADER_coco_DT_text_tHEADER___NAGf90_cdangling_aDeAlloc_memcpy___NAGf90_read_sequential___NAGf90_fmt_read_ch___NAGf90_end_read_sequential___NAGf90_write_ifile___NAGf90_fmt_write_i___NAGf90_end_write_ifile___NAGf90_writeu_optf2___NAGf90_line_Allocate_aac___NAGf90_stat_errmsg___NAGf90_rewindf___NAGf90_readu_optf2___NAGf90_line_chfree___NAGf90_line_Allocate_s___NAGf90_cdangle_Deallocate_s___NAGf90_write_sequential___NAGf90_fmt_write_ch___NAGf90_end_write_sequential___NAGf90_inquire_file___NAGf90_end_inquire___NAGf90_inquire_unit___NAGf90_inquire_opened___NAGf90_getenv___NAGf90_set_ioctx_nonadvancing___NAGf90_date_and_time_line___NAGf90_iargc___NAGf90_chindex1b___NAGf90_getcmd___NAGf90_closef___NAGf90_openf2_coco_MP__macro_tcopy___NAGf90_zaAlloc_coco_MP__macro_tfinalise_coco_MP__macro_tinitialise_coco_MP__text_tcopy_coco_MP__text_tfinalise_coco_MP__text_tinitialise_coco_DT_file_tHEADER_coco_DT_path_tHEADER_coco_DT_predefined_tHEADER_coco_DT_symbol_tHEADER_coco_DT_if_tHEADER_coco_DT_state_tHEADER_coco_DT_report_tHEADER_main.eh_coco_MP__macro_tcopy.eh_coco_MP__macro_tfinalise.eh_coco_MP__macro_tinitialise.eh_coco_MP__text_tcopy.eh_coco_MP__text_tfinalise.eh_coco_MP__text_tinitialise.eh___NAGf90_Check_Procref.6185_coco_IP_initialize_coco_coco_IP_process_command_line_coco_IP_seek_set_file_coco_IP_set_option_defaults_coco_VAR_output_file__coco_IP_open_file_coco_VAR_number_of_names__coco_VAR_input_file__coco_IP_process_input_file_coco_VAR_i__coco_VAR_options__coco_VAR_source_file_list_L_.str11L_.str12___inline_memcpy_chkL_.str13_coco_VAR_line__coco_IP_write_coco_lineL_.str14L_.str15_coco_VAR_set_file__coco_IP_copy_set_file_coco_IP_close_file_coco_IP_write_report_coco_VAR_log_file_L_.str16L_.str17_coco_IP_check_key_chars_ok__ftf_.6366L_.str18L_.str19L_.str20L_.str21_coco_IP_get_cl_arg_check_len__ftf_.6443L_.str22L_.str23L_.str24L_.str25___NAGf90_Check_Procref.6441L_.str26_coco_IP_msg_quitL_.str27_coco_IP_get_log_value_from_cmdline__ftf_.6561L_.str28L_.str29L_.str30_coco_VAR_first_cl_symbol_L_.str31L_.str32L_.str33___NAGf90_Check_Procref.6558_coco_IP_get_int_value_from_cmdline__ftf_.6824L_.str34L_.str35L_.str36___NAGf90_Check_Procref.6821_coco_IP_get_log_value_from_setfile__ftf_.7093L_.str37L_.str38_coco_VAR_first_sf_symbol_L_.str39___NAGf90_Check_Procref.7090L_.str40_coco_IP_get_int_value_from_setfile__ftf_.7451L_.str41L_.str42___NAGf90_Check_Procref.7448_coco_IP_valid_new_sf_name__ftf_.7808L_.str43L_.str44L_.str45L_.str46L_.str47___NAGf90_Check_Procref.7803L_.str48L_.str49L_.str50_coco_VAR_predefined_macros_L_.str51_coco_IP_seek_sf_symbol_nameL_.str52_coco_IP_valid_new_cl_name__ftf_.8066L_.str53L_.str54___NAGf90_Check_Procref.8061L_.str55_coco_IP_seek_cl_symbol_nameL_.str56_coco_IP_valid_new_name__ftf_.8324L_.str57L_.str58___NAGf90_Check_Procref.8319L_.str59_coco_IP_seek_symbol_nameL_.str60_coco_IP_format_time__ftf_.8584L_.str61L_.str62L_.str63_coco_IP_format_date__ftf_.8705L_.str64L_.str65L_.str66_coco_IP_to_lower__ftf_.8815L_.str67L_.str68L_.str69L_.str70_coco_IP_unquote_string__ftf_.8961L_.str71L_.str72L_.str73L_.str74L_.str75L_.str76L_.str77_coco_IP_seek_close_paren__ftf_.9355L_.str78L_.str79L_.str80L_.str81_coco_IP_replace_substring__ftf_.9540L_.str82L_.str83L_.str84L_.str85L_.str86L_.str87L_.str88_coco_IP_eval_log_primaryL_.str89L_.str90L_.str91L_.str92L_.str93___NAGf90_Check_Arg.10539___NAGf90_Check_Procref.10548_coco_IP_seek_log_primaryL_.str94L_.str95L_.str96_coco_IP_get_logical_valueL_.str97L_.str98L_.str99L_.str100L_.str101_coco_IP_eval_log_exprL_.str102L_.str103_coco_IP_eval_rel_expr_coco_IP_eval_int_primaryL_.str104L_.str105___NAGf90_Check_Arg.11139___NAGf90_Check_Procref.11146_coco_IP_get_integer_valueL_.str106L_.str107L_.str108_coco_VAR_processor_msg_L_.str109L_.str110_coco_IP_eval_int_exprL_.str111__ftf_.11813L_.str112L_.str113L_.str114L_.str115L_.str116L_.str117L_.str118L_.str119L_.str120L_.str121L_.str122L_.str123L_.str124L_.str125L_.str126L_.str127L_.str128L_.str129L_.str130L_.str131L_.str132L_.str133___NAGf90_Check_Procref.11810__ftf_.12522L_.str134L_.str135L_.str136___NAGf90_Check_Procref.12510L_.str137L_.str138L_.str139L_.str140___NAGf90_Check_Procref.13319L_.str141L_.str142L_.str143L_.str144___NAGf90_Check_Procref.14318L_.str145_coco_IP_integer_or_logical__ftf_.14556L_.str146L_.str147L_.str148L_.str149L_.str150L_.str151___NAGf90_Check_Procref.14551_coco_IP_get_next_integer_coco_IP_get_next_logicalL_.str152_coco_IP_get_next_macro__ftf_.14858L_.str153L_.str154L_.str155_coco_VAR_first_symbol___ftf_.15011L_.str156L_.str157__ftf_.15164L_.str158L_.str159_coco_IP_get_next_symbol__ftf_.15315L_.str160L_.str161_coco_IP_get_text_ptr__ftf_.15439L_.str162L_.str163L_.str164L_.str165___NAGf90_Check_Procref.15436L_.str166__ftf_.15605L_.str167L_.str168L_.str169L_.str170_coco_VAR_current_file_L_.str171L_.str172___NAGf90_Check_Procref.15602L_.str173__ftf_.15912L_.str174L_.str175L_.str176L_.str177___NAGf90_Check_Procref.15909L_.str178__ftf_.16204L_.str179L_.str180__ftf_.16361L_.str181L_.str182__ftf_.16518L_.str183L_.str184_coco_IP_process_symbols_directive__ftf_.16681L_.str185L_.str186L_.str187L_.str188___NAGf90_Check_Procref.16679_coco_VAR_if_construct_L_.str189_coco_IP_write_symbols_coco_IP_process_report_directive__ftf_.16824L_.str190L_.str191L_.str192L_.str193___NAGf90_Check_Procref.16822_coco_IP_process_options_directive__ftf_.16967L_.str194L_.str195L_.str196L_.str197___NAGf90_Check_Procref.16965_coco_IP_write_options_coco_IP_process_document_directive__ftf_.17117L_.str198L_.str199L_.str200L_.str201___NAGf90_Check_Procref.17114_coco_VAR_l_key__coco_VAR_r_key_L_.str202_aConst1.17108_aConst2.17109L_.str203_coco_IP_edit_source_line_coco_IP_write_source_line_coco_IP_process_block_directive__ftf_.17315L_.str204L_.str205L_.str206L_.str207___NAGf90_Check_Procref.17308_coco_IP_process_integer_assignment_coco_IP_process_logical_assignmentL_.str208L_.str209_coco_IP_process_stop_directiveL_.str210_coco_IP_process_message_directiveL_.str211_coco_IP_process_if_directiveL_.str212_coco_IP_process_elseif_directiveL_.str213_coco_IP_process_else_directiveL_.str214_coco_IP_process_endif_directiveL_.str215_coco_IP_process_assert_directiveL_.str216_coco_IP_get_copy_name__ftf_.17693L_.str217L_.str218L_.str219L_.str220L_.str221L_.str222L_.str223___NAGf90_Check_Procref.17690_coco_IP_process_copy_directive__ftf_.17957L_.str224L_.str225L_.str226___NAGf90_Check_Procref.17945L_.str227_coco_VAR_asis_stmt_L_.str228L_.str229_coco_IP_make_actual_arrayL_.str230L_.str231L_.str232L_.str233_coco_IP_is_coco_statement_coco_IP_gather_coco_statement_coco_IP_process_actual_arglist_coco_IP_wrap_source_lineL_.str234_coco_VAR_total_L_.str235_coco_IP_verify_text_directive__ftf_.18756L_.str236L_.str237L_.str238___NAGf90_Check_Procref.18752L_.str239_coco_IP_assign_text_value__ftf_.19070L_.str240L_.str241L_.str242L_.str243_dConst1.19038___NAGf90_Check_Procref.19058_coco_IP_open_scratchL_.str244__ioctx_.19067L_.str245L_.str246___ifile_tmp_2_.19069_BSInfo1.19039L_.str247L_.str248L_.str249L_.str250L_.str251_coco_IP_close_scratchL_.str252L_.str253L_.str254L_.str255L_.str256___NAGf90_Check_Arg.19040L_.str257L_.str258_coco_IP_add_text__ftf_.20237L_.str259L_.str260L_.str261L_.str262L_.str263___NAGf90_Check_Procref.20234L_.str264_coco_VAR_last_symbol_L_.str265L_.str266L_.str267_coco_IP_process_dummy_arglistL_.str268L_.str269L_.str270L_.str271_coco_IP_process_text_directive__ftf_.20974L_.str272L_.str273L_.str274___NAGf90_Check_Procref.20971_coco_IP_get_text_name_coco_IP_new_block_coco_IP_delete_block__ftf_.21108L_.str275L_.str276L_.str277___NAGf90_Check_Procref.21105_coco_IP_verify_macro_value__ftf_.21375L_.str278L_.str279L_.str280L_.str281___NAGf90_Check_Procref.21369L_.str282L_.str283L_.str284_coco_IP_verify_dummy_args__ftf_.21930L_.str285L_.str286L_.str287___NAGf90_Check_Procref.21926L_.str288__ftf_.22185L_.str289L_.str290L_.str291___NAGf90_Check_Procref.22179L_.str292___NAGf90_Check_Arg.22176_coco_IP_add_macro__ftf_.22519L_.str293L_.str294L_.str295L_.str296L_.str297___NAGf90_Check_Procref.22515L_.str298L_.str299L_.str300L_.str301L_.str302_coco_VAR_asis_len__coco_IP_process_macro_declaration__ftf_.23310L_.str303L_.str304L_.str305___NAGf90_Check_Procref.23306_coco_IP_get_macro_name__ftf_.23441L_.str306L_.str307L_.str308L_.str309___NAGf90_Check_Procref.23438__ftf_.23733L_.str310L_.str311L_.str312L_.str313___NAGf90_Check_Procref.23728L_.str314L_.str315L_.str316_start_col_.23731L_.str317L_.str318___ifile_tmp_3_.23730__ioctx_.23732L_.str319L_.str320L_.str321L_.str322L_.str323L_.str324__ftf_.24823L_.str325L_.str326L_.str327L_.str328___NAGf90_Check_Procref.24821L_.str329L_.str330L_.str331__ftf_.25145L_.str332L_.str333L_.str334L_.str335___NAGf90_Check_Procref.25143L_.str336L_.str337L_.str338L_.str339L_.str340__ftf_.25586L_.str341L_.str342L_.str343L_.str344___NAGf90_Check_Procref.25581L_.str345L_.str346L_.str347L_.str348L_.str349__ftf_.26123L_.str350L_.str351L_.str352L_.str353___NAGf90_Check_Procref.26118L_.str354__ftf_.26397L_.str355L_.str356L_.str357___NAGf90_Check_Procref.26395L_.str358L_.str359__ftf_.26518L_.str360L_.str361___NAGf90_Check_Procref.26516L_.str362L_.str363_coco_IP_add_logical__ftf_.26709L_.str364L_.str365L_.str366L_.str367L_.str368L_.str369___NAGf90_Check_Procref.26705L_.str370_coco_VAR_all_constants_L_.str371_coco_IP_process_logical_declaration__ftf_.27407L_.str372L_.str373L_.str374L_.str375___NAGf90_Check_Procref.27402_coco_IP_get_symbol_name_coco_IP_add_integer__ftf_.27608L_.str376L_.str377L_.str378L_.str379L_.str380___NAGf90_Check_Procref.27604L_.str381L_.str382_coco_IP_process_integer_declaration__ftf_.28306L_.str383L_.str384L_.str385___NAGf90_Check_Procref.28301__ftf_.28494L_.str386L_.str387L_.str388L_.str389L_.str390___NAGf90_Check_Procref.28491__ftf_.28766L_.str391L_.str392L_.str393L_.str394___NAGf90_Check_Procref.28753L_.str395L_.str396L_.str397___ifile_tmp_4_.28763__ioctx_.28760L_.str398L_.str399_coco_IP_msg_continueL_.str400L_.str401__ftf_.29453L_.str402L_.str403L_.str404L_.str405___NAGf90_Check_Procref.29451L_.str406L_.str407__ftf_.29615L_.str408L_.str409L_.str410L_.str411___NAGf90_Check_Procref.29613___NAGf90_Check_Arg.29610__ftf_.29866L_.str412L_.str413___NAGf90_Check_Procref.29864___NAGf90_Check_Arg.29861_coco_IP_process_coco_statement__ftf_.30151L_.str414L_.str415L_.str416___NAGf90_Check_Procref.30144L_.str417L_.str418L_.str419L_.str420L_.str421L_.str422L_.str423L_.str424_coco_IP_process_cmdline_directiveL_.str425L_.str426L_.str427L_.str428L_.str429L_.str430L_.str431L_.str432_coco_IP_blank_compress_lower_case__ftf_.30781L_.str433L_.str434L_.str435L_.str436L_.str437_out_idx_.30778_asis_idx_.30779_quote_.30782L_.str438___NAGf90_Check_Procref.30774_coco_IP_seek_comment_idx__ftf_.31122L_.str439L_.str440L_.str441L_.str442_char_context_.31125_quote_.31124__ftf_.31314L_.str443_coco_VAR_wrap_len____NAGf90_Check_Arg.31307___NAGf90_Check_Procref.31310L_.str444L_.str445__ftf_.31682L_.str446L_.str447L_.str448L_.str449L_.str450___NAGf90_Check_Arg.31673___NAGf90_Check_Procref.31676__ftf_.32119L_.str451L_.str452L_.str453___NAGf90_Check_Procref.32112L_.str454_coco_IP_edit_macro_strings__ftf_.32703L_.str455L_.str456L_.str457L_.str458___NAGf90_Check_Procref.32693L_.str459___NAGf90_Check_Arg.32685L_.str460_coco_IP_edit_logical_strings__ftf_.33648L_.str461L_.str462___NAGf90_Check_Procref.33641L_.str463___NAGf90_Check_Arg.33637_coco_IP_edit_integer_strings__ftf_.34066L_.str464L_.str465___NAGf90_Check_Procref.34058L_.str466___ifile_tmp_5_.34067__ioctx_.34065___NAGf90_Check_Arg.34054_coco_IP_edit_coco_strings__ftf_.34487L_.str467L_.str468___NAGf90_Check_Arg.34479___NAGf90_Check_Procref.34481__ftf_.34816L_.str469L_.str470L_.str471___NAGf90_Check_Arg.34807___NAGf90_Check_Procref.34814_coco_IP_seek_include_file__ftf_.34953L_.str472L_.str473L_.str474_coco_VAR_first_directory_L_.str475__ioctx_.34950L_.str476___NAGf90_Check_Procref.34948_coco_IP_process_include_directiveL_.str477L_.str478L_.str479___NAGf90_Check_Procref.35253L_.str480L_.str481_coco_VAR_count_include_in_dot_L_.str482L_.str483L_.str484_coco_IP_process_endfile_directive__ftf_.35770L_.str485L_.str486L_.str487L_.str488L_.str489___NAGf90_Check_Procref.35768_coco_IP_add_number_to_line__ftf_.36003L_.str490L_.str491L_.str492___ifile_tmp_6_.36002__ioctx_.36001L_.str493_number_len_.36004__ftf_.36356L_.str494L_.str495L_.str496___NAGf90_Check_Procref.36353__ioctx_.36355L_.str497L_.str498___NAGf90_Check_Arg.36349__ftf_.36607L_.str499L_.str500__ioctx_.36606L_.str501___NAGf90_Check_Procref.36604L_.str502__ftf_.37002L_.str503L_.str504__ftf_.37095L_.str505L_.str506L_.str507L_.str508L_.str509___NAGf90_Check_Arg.37087___NAGf90_Check_Procref.37091_statement_len_.37094L_.str510_continuation_lines_.37093L_.str511L_.str512___NAGf90_Check_Arg.37304___NAGf90_Check_Procref.37322L_.str513L_.str514L_.str515L_.str516L_.str517L_.str518L_.str519L_.str520L_.str521_coco_IP_add_sf_logical__ftf_.37724L_.str522L_.str523L_.str524___NAGf90_Check_Procref.37720L_.str525_coco_VAR_last_sf_symbol_L_.str526L_.str527_coco_IP_process_sf_logical_declaration__ftf_.38374L_.str528L_.str529___NAGf90_Check_Procref.38369_coco_IP_get_sf_symbol_name_coco_IP_add_sf_integer__ftf_.38572L_.str530L_.str531L_.str532___NAGf90_Check_Procref.38568L_.str533L_.str534_coco_IP_process_sf_integer_declaration__ftf_.39214L_.str535L_.str536___NAGf90_Check_Procref.39209__ftf_.39401L_.str537L_.str538L_.str539___NAGf90_Check_Procref.39398_coco_IP_process_wrap_directive__ftf_.39641L_.str540L_.str541L_.str542_too_many_wrap_statements_.39640___NAGf90_Check_Procref.39638L_.str543L_.str544L_.str545L_.str546_coco_IP_process_verbose_directive__ftf_.39783L_.str547L_.str548L_.str549_too_many_verbose_statements_.39784___NAGf90_Check_Procref.39781L_.str550L_.str551_coco_IP_process_summary_directive__ftf_.39927L_.str552L_.str553_too_many_report_statements_.39926___NAGf90_Check_Procref.39924L_.str554L_.str555_coco_IP_process_post_directive__ftf_.40069L_.str556L_.str557L_.str558_too_many_post_statements_.40070___NAGf90_Check_Procref.40067L_.str559L_.str560_coco_IP_process_output_directive__ftf_.40222L_.str561L_.str562L_.str563_too_many_output_statements_.40224___NAGf90_Check_Procref.40218L_.str564L_.str565L_.str566L_.str567_coco_IP_process_number_directive__ftf_.40493L_.str568L_.str569L_.str570_too_many_number_statements_.40492___NAGf90_Check_Procref.40490L_.str571L_.str572_coco_IP_process_mark_directive__ftf_.40636L_.str573L_.str574L_.str575_too_many_mark_statements_.40635___NAGf90_Check_Procref.40633L_.str576L_.str577_coco_IP_process_logfile_directive__ftf_.40791L_.str578L_.str579L_.str580_too_many_logfile_statements_.40789___NAGf90_Check_Procref.40785L_.str581L_.str582L_.str583L_.str584L_.str585_coco_IP_process_key_directive__ftf_.41060L_.str586L_.str587L_.str588_too_many_keys_directives_.41061___NAGf90_Check_Procref.41058L_.str589L_.str590_coco_IP_process_input_directive__ftf_.41225L_.str591L_.str592L_.str593___NAGf90_Check_Procref.41218L_.str594L_.str595L_.str596_coco_VAR_name_file___ioctx_.41224_BSInfo1.41211_coco_IP_add_directory__ftf_.41504L_.str597L_.str598L_.str599L_.str600_current_directory_.41503L_.str601L_.str602___NAGf90_Check_Procref.41501L_.str603_coco_IP_seek_directory__ftf_.41770L_.str604L_.str605L_.str606_coco_IP_process_directory_directive__ftf_.41935L_.str607L_.str608L_.str609___NAGf90_Check_Procref.41929L_.str610L_.str611L_.str612_coco_IP_process_form_directive__ftf_.42198L_.str613L_.str614L_.str615_too_many_form_statements_.42197___NAGf90_Check_Procref.42195L_.str616L_.str617L_.str618L_.str619L_.str620_coco_IP_process_alter_directive__ftf_.42419L_.str621L_.str622L_.str623_too_many_alter_statements_.42418___NAGf90_Check_Procref.42416L_.str624L_.str625L_.str626L_.str627L_.str628L_.str629L_.str630_coco_IP_process_set_statement__ftf_.42603L_.str631L_.str632L_.str633L_.str634___NAGf90_Check_Procref.42601L_.str635L_.str636L_.str637L_.str638L_.str639L_.str640L_.str641L_.str642L_.str643L_.str644L_.str645L_.str646L_.str647__ftf_.43019L_.str648L_.str649___NAGf90_Check_Procref.43016__ioctx_.43018L_.str650_coco_IP_process_set_file__ftf_.43096L_.str651L_.str652___NAGf90_Check_Procref.43092__ioctx_.43095L_.str653L_.str654L_.str655__ftf_.43254L_.str656L_.str657_coco_VAR_cl_set_file___ioctx_.43252L_.str658___NAGf90_Check_Procref.43250L_.str659L_.str660L_.str661L_.str662L_.str663L_.str664__ftf_.43660L_.str665L_.str666__ioctx_.43657L_.str667L_.str668L_.str669___ifile_tmp_8_.43652L_.str670L_.str671L_.str672L_.str673___ifile_tmp_9_.43653L_.str674___ifile_tmp_10_.43654L_.str675L_.str676L_.str677L_.str678L_.str679___ifile_tmp_11_.43655L_.str680L_.str681L_.str682L_.str683___ifile_tmp_12_.43656L_.str684L_.str685L_.str686L_.str687L_.str688L_.str689L_.str690L_.str691___NAGf90_Check_Procref.43650L_.str692L_.str693__ftf_.45441L_.str694L_.str695__ioctx_.45438___NAGf90_Check_Procref.45436L_.str696L_.str697L_.str698L_.str699L_.str700L_.str701L_.str702L_.str703L_.str704L_.str705L_.str706L_.str707L_.str708L_.str709L_.str710L_.str711L_.str712L_.str713L_.str714L_.str715__ftf_.46031L_.str716L_.str717__ioctx_.46029L_.str718L_.str719L_.str720_aConst1.46027L_.str721L_.str722L_.str723L_.str724L_.str725L_.str726L_.str727L_.str728L_.str729L_.str730L_.str731L_.str732L_.str733L_.str734L_.str735L_.str736L_.str737L_.str738L_.str739__ftf_.46730L_.str740L_.str741L_.str742L_.str743___NAGf90_Check_Procref.46727__ioctx_.46729L_.str744_coco_IP_process_wrap_option__ftf_.46927L_.str745L_.str746_too_many_wrap_options_.46926___NAGf90_Check_Procref.46924L_.str747_coco_VAR_cl_options__coco_IP_process_verbose_option__ftf_.46971L_.str748L_.str749_too_many_verbose_options_.46972___NAGf90_Check_Procref.46969L_.str750_coco_IP_process_set_file_option__ftf_.47023L_.str751L_.str752L_.str753_too_many_set_file_options_.47024___NAGf90_Check_Procref.47021L_.str754_coco_IP_process_report_option__ftf_.47105L_.str755L_.str756_too_many_report_options_.47104___NAGf90_Check_Procref.47102L_.str757_coco_IP_process_postpend_option__ftf_.47150L_.str758L_.str759_too_many_postpend_options_.47149___NAGf90_Check_Procref.47147L_.str760_coco_IP_process_number_option__ftf_.47194L_.str761L_.str762_too_many_number_options_.47195___NAGf90_Check_Procref.47192L_.str763_coco_IP_process_mark_option__ftf_.47240L_.str764L_.str765_too_many_mark_options_.47239___NAGf90_Check_Procref.47237L_.str766_coco_IP_process_log_file_option__ftf_.47293L_.str767L_.str768L_.str769_too_many_log_file_options_.47292___NAGf90_Check_Procref.47290L_.str770_coco_IP_process_key_option__ftf_.47384L_.str771L_.str772L_.str773_too_many_keys_directives_.47385___NAGf90_Check_Procref.47382L_.str774_coco_IP_process_include_option__ftf_.47547L_.str775L_.str776L_.str777___NAGf90_Check_Procref.47541L_.str778L_.str779_coco_IP_print_help__ftf_.47695L_.str780L_.str781__ioctx_.47693L_.str782L_.str783_aConst1.47691_coco_IP_process_fixed_option__ftf_.47776L_.str784L_.str785_too_many_fixed_options_.47775___NAGf90_Check_Procref.47773L_.str786_coco_IP_add_cl_logical__ftf_.47835L_.str787L_.str788L_.str789___NAGf90_Check_Procref.47832L_.str790_coco_VAR_last_cl_symbol_L_.str791_coco_IP_add_cl_integer__ftf_.48088L_.str792L_.str793L_.str794___NAGf90_Check_Procref.48085_coco_IP_process_define_option__ftf_.48376L_.str795L_.str796L_.str797___NAGf90_Check_Procref.48372_coco_IP_process_alter_option__ftf_.48524L_.str798L_.str799L_.str800_too_many_alter_options_.48526___NAGf90_Check_Procref.48522L_.str801L_.str802L_.str803_coco_IP_getopt__ftf_.48752L_.str804L_.str805L_.str806_coco_VAR_optind__coco_VAR_nargs__coco_VAR_optarg____NAGf90_Check_Procref.48747__ftf_.48915L_.str807L_.str808___NAGf90_Check_Procref.48908L_.str809__ioctx_.48913L_.str810L_.str811L_.str812L_.str813L_.str814L_.str815L_.str816L_.str817__ftf_.49520L_.str818L_.str819L_.str820___ifile_tmp_13_.49521__ioctx_.49519L_.str821L_.str822__ftf_.49975L_.str823L_.str824L_.str825__ioctx_.49974___ifile_tmp_14_.49976___ifile_tmp_15_.49977L_.str826L_.str827___ifile_tmp_16_.49972L_.str828_coco_IP_check_incpath_dirs__ftf_.50956L_.str829L_.str830_coco_IP_seek_sep_char__ftf_.51071L_.str831L_.str832L_.str833L_.str834_coco_IP_build_incpath_value__ftf_.51158L_.str835L_.str836L_.str837_coco_IP_get_pwd_environment_value__ftf_.51381L_.str838L_.str839___NAGf90_Check_Procref.51378L_.str840L_.str841_coco_IP_get_user_environment_value__ftf_.51464L_.str842L_.str843L_.str844___NAGf90_Check_Procref.51461L_.str845L_.str846L_.str847L_.str848L_.str849_coco_IP_get_command_line_value__ftf_.51558L_.str850L_.str851___NAGf90_Check_Procref.51556L_.str852L_.str853__ftf_.51681L_.str854L_.str855__ioctx_.51680___NAGf90_Check_Procref.51677L_.str856_BSInfo1.51659L_.str857L_.str858L_.str859L_.str860L_.str861L_.str862L_.str863__ftf_.52139L_.str864___NAGf90_Check_Procref.52137L_.str865__ftf_.52230L_.str866L_.str867L_.str868___NAGf90_Check_Procref.52228L_.str869__ftf_.52456L_.str870___open_specs_tmp_17_.52457___NAGf90_Check_Procref.52454L_.str874__ftf_.52560L_.str875L_.str876L_.str877L_.str878L_.str879L_.str880___NAGf90_Check_Procref.52557L_.str881_coco_VAR_log_line___ftf_.52861L_.str882L_.str883_dConst1.52851_dConst3.52853L_.str884_dConst4.52854L_.str885_dConst5.52855_dConst6.52856L_.str886_dConst7.52857_dConst8.52858_coco_VAR_outside_any_if_construct__dConst9.52859L_.str887L_.str888L_.str889L_.str890L_.str891L_.str892L_.str893L_.str894L_.str895L_.strL_.str1L_.str2L_.str3L_.str4L_.str5L_.str6L_.str7L_.str8L_.str9L_.str10___NAGf90_Check_Procref_Args4.6178___NAGf90_Check_Arg.6177___NAGf90_Check_Procref_Args5.6179___NAGf90_Check_Procref_Args6.6180___NAGf90_Check_Procref_Args7.6181___NAGf90_Check_Procref_Args8.6182___NAGf90_Check_Procref_Args10.6183___NAGf90_Check_Procref_Args12.6184___NAGf90_Check_Procref_Args0.6439___NAGf90_Check_Arg.6438___NAGf90_Check_Procref_Args1.6440___NAGf90_Check_Procref_Args0.6557___NAGf90_Check_Arg.6556___NAGf90_Check_Procref_Args0.6820___NAGf90_Check_Arg.6819___NAGf90_Check_Procref_Args0.7088___NAGf90_Check_Arg.7087___NAGf90_Check_Procref_Args1.7089___NAGf90_Check_Procref_Args0.7446___NAGf90_Check_Arg.7445___NAGf90_Check_Procref_Args1.7447___NAGf90_Check_Procref_Args0.7798___NAGf90_Check_Arg.7797___NAGf90_Check_Procref_Args1.7799___NAGf90_Check_Procref_Args2.7800___NAGf90_Check_Procref_Args3.7801___NAGf90_Check_Procref_Args4.7802___NAGf90_Check_Procref_Args0.8056___NAGf90_Check_Arg.8055___NAGf90_Check_Procref_Args1.8057___NAGf90_Check_Procref_Args2.8058___NAGf90_Check_Procref_Args3.8059___NAGf90_Check_Procref_Args4.8060___NAGf90_Check_Procref_Args0.8314___NAGf90_Check_Arg.8313___NAGf90_Check_Procref_Args1.8315___NAGf90_Check_Procref_Args2.8316___NAGf90_Check_Procref_Args3.8317___NAGf90_Check_Procref_Args4.8318___NAGf90_Check_Procref_Args0.10540___NAGf90_Check_Procref_Args1.10541___NAGf90_Check_Procref_Args2.10542___NAGf90_Check_Procref_Args3.10543___NAGf90_Check_Procref_Args4.10544___NAGf90_Check_Procref_Args5.10545___NAGf90_Check_Procref_Args6.10546___NAGf90_Check_Procref_Args7.10547___NAGf90_Check_Procref_Args0.11140___NAGf90_Check_Procref_Args1.11141___NAGf90_Check_Procref_Args2.11142___NAGf90_Check_Procref_Args3.11143___NAGf90_Check_Procref_Args4.11144___NAGf90_Check_Procref_Args5.11145___NAGf90_Check_Procref_Args0.11809___NAGf90_Check_Arg.11808___NAGf90_Check_Procref_Args0.12484___NAGf90_Check_Arg.12483___NAGf90_Check_Procref_Args1.12485___NAGf90_Check_Procref_Args2.12486___NAGf90_Check_Procref_Args3.12487___NAGf90_Check_Procref_Args4.12488___NAGf90_Check_Procref_Args5.12489___NAGf90_Check_Procref_Args6.12490___NAGf90_Check_Procref_Args7.12491___NAGf90_Check_Procref_Args8.12492___NAGf90_Check_Procref_Args9.12493___NAGf90_Check_Procref_Args10.12494___NAGf90_Check_Procref_Args11.12495___NAGf90_Check_Procref_Args12.12496___NAGf90_Check_Procref_Args13.12497___NAGf90_Check_Procref_Args14.12498___NAGf90_Check_Procref_Args15.12499___NAGf90_Check_Procref_Args16.12500___NAGf90_Check_Procref_Args17.12501___NAGf90_Check_Procref_Args18.12502___NAGf90_Check_Procref_Args19.12503___NAGf90_Check_Procref_Args20.12504___NAGf90_Check_Procref_Args21.12505___NAGf90_Check_Procref_Args22.12506___NAGf90_Check_Procref_Args23.12507___NAGf90_Check_Procref_Args24.12508___NAGf90_Check_Procref_Args25.12509___NAGf90_Check_Procref_Args0.13313___NAGf90_Check_Arg.13312___NAGf90_Check_Procref_Args1.13314___NAGf90_Check_Procref_Args2.13315___NAGf90_Check_Procref_Args3.13316___NAGf90_Check_Procref_Args4.13317___NAGf90_Check_Procref_Args5.13318___NAGf90_Check_Procref_Args0.14315___NAGf90_Check_Arg.14314___NAGf90_Check_Procref_Args1.14316___NAGf90_Check_Procref_Args2.14317___NAGf90_Check_Procref_Args0.14548___NAGf90_Check_Arg.14547___NAGf90_Check_Procref_Args1.14549___NAGf90_Check_Procref_Args2.14550___NAGf90_Check_Procref_Args0.15435___NAGf90_Check_Arg.15434___NAGf90_Check_Procref_Args0.15600___NAGf90_Check_Arg.15599___NAGf90_Check_Procref_Args1.15601___NAGf90_Check_Procref_Args0.15907___NAGf90_Check_Arg.15906___NAGf90_Check_Procref_Args1.15908___NAGf90_Check_Procref_Args0.16678___NAGf90_Check_Arg.16677___NAGf90_Check_Procref_Args0.16821___NAGf90_Check_Arg.16820___NAGf90_Check_Procref_Args0.16964___NAGf90_Check_Arg.16963___NAGf90_Check_Procref_Args0.17111___NAGf90_Check_Arg.17110___NAGf90_Check_Procref_Args1.17112___NAGf90_Check_Procref_Args2.17113___NAGf90_Check_Procref_Args0.17296___NAGf90_Check_Arg.17295___NAGf90_Check_Procref_Args1.17297___NAGf90_Check_Procref_Args2.17298___NAGf90_Check_Procref_Args3.17299___NAGf90_Check_Procref_Args4.17300___NAGf90_Check_Procref_Args5.17301___NAGf90_Check_Procref_Args6.17302___NAGf90_Check_Procref_Args7.17303___NAGf90_Check_Procref_Args8.17304___NAGf90_Check_Procref_Args9.17305___NAGf90_Check_Procref_Args10.17306___NAGf90_Check_Procref_Args11.17307___NAGf90_Check_Procref_Args0.17689___NAGf90_Check_Arg.17688___NAGf90_Check_Procref_Args0.17928___NAGf90_Check_Arg.17927___NAGf90_Check_Procref_Args1.17929___NAGf90_Check_Procref_Args2.17930___NAGf90_Check_Procref_Args3.17931___NAGf90_Check_Procref_Args4.17932___NAGf90_Check_Procref_Args5.17933___NAGf90_Check_Procref_Args6.17934___NAGf90_Check_Procref_Args7.17935___NAGf90_Check_Procref_Args8.17936___NAGf90_Check_Procref_Args9.17937___NAGf90_Check_Procref_Args10.17938___NAGf90_Check_Procref_Args11.17939___NAGf90_Check_Procref_Args12.17940___NAGf90_Check_Procref_Args13.17941___NAGf90_Check_Procref_Args14.17942___NAGf90_Check_Procref_Args15.17943___NAGf90_Check_Procref_Args16.17944___NAGf90_Check_Procref_Args0.18746___NAGf90_Check_Arg.18745___NAGf90_Check_Procref_Args1.18747___NAGf90_Check_Procref_Args2.18748___NAGf90_Check_Procref_Args3.18749___NAGf90_Check_Procref_Args4.18750___NAGf90_Check_Procref_Args5.18751___NAGf90_Check_Procref_Args0.19041___NAGf90_Check_Procref_Args1.19042___NAGf90_Check_Procref_Args2.19043___NAGf90_Check_Procref_Args3.19044___NAGf90_Check_Procref_Args4.19045___NAGf90_Check_Procref_Args5.19046___NAGf90_Check_Procref_Args6.19047___NAGf90_Check_Procref_Args7.19048___NAGf90_Check_Procref_Args8.19049___NAGf90_Check_Procref_Args9.19050___NAGf90_Check_Procref_Args10.19051___NAGf90_Check_Procref_Args11.19052___NAGf90_Check_Procref_Args12.19053___NAGf90_Check_Procref_Args13.19054___NAGf90_Check_Procref_Args14.19055___NAGf90_Check_Procref_Args15.19056___NAGf90_Check_Procref_Args16.19057___NAGf90_Check_Procref_Args0.20227___NAGf90_Check_Arg.20226___NAGf90_Check_Procref_Args1.20228___NAGf90_Check_Procref_Args2.20229___NAGf90_Check_Procref_Args3.20230___NAGf90_Check_Procref_Args4.20231___NAGf90_Check_Procref_Args5.20232___NAGf90_Check_Procref_Args6.20233___NAGf90_Check_Procref_Args0.20967___NAGf90_Check_Arg.20966___NAGf90_Check_Procref_Args1.20968___NAGf90_Check_Procref_Args2.20969___NAGf90_Check_Procref_Args3.20970___NAGf90_Check_Procref_Args0.21103___NAGf90_Check_Arg.21102___NAGf90_Check_Procref_Args1.21104___NAGf90_Check_Procref_Args0.21364___NAGf90_Check_Arg.21363___NAGf90_Check_Procref_Args1.21365___NAGf90_Check_Procref_Args2.21366___NAGf90_Check_Procref_Args3.21367___NAGf90_Check_Procref_Args4.21368___NAGf90_Check_Procref_Args0.21924___NAGf90_Check_Arg.21923___NAGf90_Check_Procref_Args1.21925___NAGf90_Check_Procref_Args0.22177___NAGf90_Check_Procref_Args1.22178___NAGf90_Check_Procref_Args0.22508___NAGf90_Check_Arg.22507___NAGf90_Check_Procref_Args1.22509___NAGf90_Check_Procref_Args2.22510___NAGf90_Check_Procref_Args3.22511___NAGf90_Check_Procref_Args4.22512___NAGf90_Check_Procref_Args5.22513___NAGf90_Check_Procref_Args6.22514___NAGf90_Check_Procref_Args0.23304___NAGf90_Check_Arg.23303___NAGf90_Check_Procref_Args1.23305___NAGf90_Check_Procref_Args0.23436___NAGf90_Check_Arg.23435___NAGf90_Check_Procref_Args1.23437___NAGf90_Check_Procref_Args0.23717___NAGf90_Check_Arg.23716___NAGf90_Check_Procref_Args1.23718___NAGf90_Check_Procref_Args2.23719___NAGf90_Check_Procref_Args3.23720___NAGf90_Check_Procref_Args4.23721___NAGf90_Check_Procref_Args5.23722___NAGf90_Check_Procref_Args6.23723___NAGf90_Check_Procref_Args7.23724___NAGf90_Check_Procref_Args8.23725___NAGf90_Check_Procref_Args9.23726___NAGf90_Check_Procref_Args10.23727___NAGf90_Check_Procref_Args0.24816___NAGf90_Check_Arg.24815___NAGf90_Check_Procref_Args1.24817___NAGf90_Check_Procref_Args2.24818___NAGf90_Check_Procref_Args3.24819___NAGf90_Check_Procref_Args4.24820___NAGf90_Check_Procref_Args0.25138___NAGf90_Check_Arg.25137___NAGf90_Check_Procref_Args1.25139___NAGf90_Check_Procref_Args2.25140___NAGf90_Check_Procref_Args3.25141___NAGf90_Check_Procref_Args4.25142___NAGf90_Check_Procref_Args0.25574___NAGf90_Check_Arg.25573___NAGf90_Check_Procref_Args1.25575___NAGf90_Check_Procref_Args2.25576___NAGf90_Check_Procref_Args3.25577___NAGf90_Check_Procref_Args4.25578___NAGf90_Check_Procref_Args5.25579___NAGf90_Check_Procref_Args6.25580___NAGf90_Check_Procref_Args0.26114___NAGf90_Check_Arg.26113___NAGf90_Check_Procref_Args1.26115___NAGf90_Check_Procref_Args2.26116___NAGf90_Check_Procref_Args3.26117___NAGf90_Check_Procref_Args0.26393___NAGf90_Check_Arg.26392___NAGf90_Check_Procref_Args1.26394___NAGf90_Check_Procref_Args0.26515___NAGf90_Check_Arg.26514___NAGf90_Check_Procref_Args0.26699___NAGf90_Check_Arg.26698___NAGf90_Check_Procref_Args1.26700___NAGf90_Check_Procref_Args2.26701___NAGf90_Check_Procref_Args3.26702___NAGf90_Check_Procref_Args4.26703___NAGf90_Check_Procref_Args5.26704___NAGf90_Check_Procref_Args0.27400___NAGf90_Check_Arg.27399___NAGf90_Check_Procref_Args1.27401___NAGf90_Check_Procref_Args0.27598___NAGf90_Check_Arg.27597___NAGf90_Check_Procref_Args1.27599___NAGf90_Check_Procref_Args2.27600___NAGf90_Check_Procref_Args3.27601___NAGf90_Check_Procref_Args4.27602___NAGf90_Check_Procref_Args5.27603___NAGf90_Check_Procref_Args0.28299___NAGf90_Check_Arg.28298___NAGf90_Check_Procref_Args1.28300___NAGf90_Check_Procref_Args0.28489___NAGf90_Check_Arg.28488___NAGf90_Check_Procref_Args1.28490___NAGf90_Check_Procref_Args0.28743___NAGf90_Check_Arg.28742___NAGf90_Check_Procref_Args1.28744___NAGf90_Check_Procref_Args2.28745___NAGf90_Check_Procref_Args3.28746___NAGf90_Check_Procref_Args4.28747___NAGf90_Check_Procref_Args5.28748___NAGf90_Check_Procref_Args6.28749___NAGf90_Check_Procref_Args7.28750___NAGf90_Check_Procref_Args8.28751___NAGf90_Check_Procref_Args9.28752___NAGf90_Check_Procref_Args0.29449___NAGf90_Check_Arg.29448___NAGf90_Check_Procref_Args1.29450___NAGf90_Check_Procref_Args0.29611___NAGf90_Check_Procref_Args1.29612___NAGf90_Check_Procref_Args0.29862___NAGf90_Check_Procref_Args1.29863___NAGf90_Check_Procref_Args0.30118___NAGf90_Check_Arg.30117___NAGf90_Check_Procref_Args1.30119___NAGf90_Check_Procref_Args2.30120___NAGf90_Check_Procref_Args3.30121___NAGf90_Check_Procref_Args4.30122___NAGf90_Check_Procref_Args5.30123___NAGf90_Check_Procref_Args6.30124___NAGf90_Check_Procref_Args7.30125___NAGf90_Check_Procref_Args8.30126___NAGf90_Check_Procref_Args9.30127___NAGf90_Check_Procref_Args10.30128___NAGf90_Check_Procref_Args11.30129___NAGf90_Check_Procref_Args12.30130___NAGf90_Check_Procref_Args13.30131___NAGf90_Check_Procref_Args14.30132___NAGf90_Check_Procref_Args15.30133___NAGf90_Check_Procref_Args16.30134___NAGf90_Check_Procref_Args17.30135___NAGf90_Check_Procref_Args18.30136___NAGf90_Check_Procref_Args19.30137___NAGf90_Check_Procref_Args20.30138___NAGf90_Check_Procref_Args21.30139___NAGf90_Check_Procref_Args22.30140___NAGf90_Check_Procref_Args23.30141___NAGf90_Check_Procref_Args24.30142___NAGf90_Check_Procref_Args25.30143___NAGf90_Check_Procref_Args0.30773___NAGf90_Check_Arg.30772___NAGf90_Check_Procref_Args0.31308___NAGf90_Check_Procref_Args1.31309___NAGf90_Check_Procref_Args0.31674___NAGf90_Check_Procref_Args1.31675___NAGf90_Check_Procref_Args0.32109___NAGf90_Check_Arg.32108___NAGf90_Check_Procref_Args1.32110___NAGf90_Check_Procref_Args2.32111___NAGf90_Check_Procref_Args0.32686___NAGf90_Check_Procref_Args1.32687___NAGf90_Check_Procref_Args2.32688___NAGf90_Check_Procref_Args3.32689___NAGf90_Check_Procref_Args4.32690___NAGf90_Check_Procref_Args5.32691___NAGf90_Check_Procref_Args6.32692___NAGf90_Check_Procref_Args0.33638___NAGf90_Check_Procref_Args1.33639___NAGf90_Check_Procref_Args2.33640___NAGf90_Check_Procref_Args0.34055___NAGf90_Check_Procref_Args1.34056___NAGf90_Check_Procref_Args2.34057___NAGf90_Check_Procref_Args0.34480___NAGf90_Check_Procref_Args0.34808___NAGf90_Check_Procref_Args1.34809___NAGf90_Check_Procref_Args2.34810___NAGf90_Check_Procref_Args3.34811___NAGf90_Check_Procref_Args4.34812___NAGf90_Check_Procref_Args5.34813___NAGf90_Check_Procref_Args0.34947___NAGf90_Check_Arg.34946___NAGf90_Check_Procref_Args0.35242___NAGf90_Check_Arg.35241___NAGf90_Check_Procref_Args1.35243___NAGf90_Check_Procref_Args2.35244___NAGf90_Check_Procref_Args3.35245___NAGf90_Check_Procref_Args4.35246___NAGf90_Check_Procref_Args5.35247___NAGf90_Check_Procref_Args6.35248___NAGf90_Check_Procref_Args7.35249___NAGf90_Check_Procref_Args8.35250___NAGf90_Check_Procref_Args9.35251___NAGf90_Check_Procref_Args10.35252___NAGf90_Check_Procref_Args0.35766___NAGf90_Check_Arg.35765___NAGf90_Check_Procref_Args1.35767___NAGf90_Check_Procref_Args0.36350___NAGf90_Check_Procref_Args1.36351___NAGf90_Check_Procref_Args2.36352___NAGf90_Check_Procref_Args0.36600___NAGf90_Check_Arg.36599___NAGf90_Check_Procref_Args1.36601___NAGf90_Check_Procref_Args2.36602___NAGf90_Check_Procref_Args3.36603___NAGf90_Check_Procref_Args0.37088___NAGf90_Check_Procref_Args1.37089___NAGf90_Check_Procref_Args2.37090___NAGf90_Check_Procref_Args0.37305___NAGf90_Check_Procref_Args1.37306___NAGf90_Check_Procref_Args2.37307___NAGf90_Check_Procref_Args3.37308___NAGf90_Check_Procref_Args4.37309___NAGf90_Check_Procref_Args5.37310___NAGf90_Check_Procref_Args6.37311___NAGf90_Check_Procref_Args7.37312___NAGf90_Check_Procref_Args8.37313___NAGf90_Check_Procref_Args9.37314___NAGf90_Check_Procref_Args10.37315___NAGf90_Check_Procref_Args11.37316___NAGf90_Check_Procref_Args12.37317___NAGf90_Check_Procref_Args13.37318___NAGf90_Check_Procref_Args14.37319___NAGf90_Check_Procref_Args15.37320___NAGf90_Check_Procref_Args16.37321___NAGf90_Check_Procref_Args0.37716___NAGf90_Check_Arg.37715___NAGf90_Check_Procref_Args1.37717___NAGf90_Check_Procref_Args2.37718___NAGf90_Check_Procref_Args3.37719___NAGf90_Check_Procref_Args0.38366___NAGf90_Check_Arg.38365___NAGf90_Check_Procref_Args1.38367___NAGf90_Check_Procref_Args2.38368___NAGf90_Check_Procref_Args0.38564___NAGf90_Check_Arg.38563___NAGf90_Check_Procref_Args1.38565___NAGf90_Check_Procref_Args2.38566___NAGf90_Check_Procref_Args3.38567___NAGf90_Check_Procref_Args0.39206___NAGf90_Check_Arg.39205___NAGf90_Check_Procref_Args1.39207___NAGf90_Check_Procref_Args2.39208___NAGf90_Check_Procref_Args0.39396___NAGf90_Check_Arg.39395___NAGf90_Check_Procref_Args1.39397___NAGf90_Check_Procref_Args0.39636___NAGf90_Check_Arg.39635___NAGf90_Check_Procref_Args1.39637___NAGf90_Check_Procref_Args0.39779___NAGf90_Check_Arg.39778___NAGf90_Check_Procref_Args1.39780___NAGf90_Check_Procref_Args0.39922___NAGf90_Check_Arg.39921___NAGf90_Check_Procref_Args1.39923___NAGf90_Check_Procref_Args0.40065___NAGf90_Check_Arg.40064___NAGf90_Check_Procref_Args1.40066___NAGf90_Check_Procref_Args0.40213___NAGf90_Check_Arg.40212___NAGf90_Check_Procref_Args1.40214___NAGf90_Check_Procref_Args2.40215___NAGf90_Check_Procref_Args3.40216___NAGf90_Check_Procref_Args4.40217___NAGf90_Check_Procref_Args0.40488___NAGf90_Check_Arg.40487___NAGf90_Check_Procref_Args1.40489___NAGf90_Check_Procref_Args0.40631___NAGf90_Check_Arg.40630___NAGf90_Check_Procref_Args1.40632___NAGf90_Check_Procref_Args0.40779___NAGf90_Check_Arg.40778___NAGf90_Check_Procref_Args1.40780___NAGf90_Check_Procref_Args2.40781___NAGf90_Check_Procref_Args3.40782___NAGf90_Check_Procref_Args4.40783___NAGf90_Check_Procref_Args5.40784___NAGf90_Check_Procref_Args0.41056___NAGf90_Check_Arg.41055___NAGf90_Check_Procref_Args1.41057___NAGf90_Check_Procref_Args0.41213___NAGf90_Check_Arg.41212___NAGf90_Check_Procref_Args1.41214___NAGf90_Check_Procref_Args2.41215___NAGf90_Check_Procref_Args3.41216___NAGf90_Check_Procref_Args4.41217___NAGf90_Check_Procref_Args0.41499___NAGf90_Check_Arg.41498___NAGf90_Check_Procref_Args1.41500___NAGf90_Check_Procref_Args0.41923___NAGf90_Check_Arg.41922___NAGf90_Check_Procref_Args1.41924___NAGf90_Check_Procref_Args2.41925___NAGf90_Check_Procref_Args3.41926___NAGf90_Check_Procref_Args4.41927___NAGf90_Check_Procref_Args5.41928___NAGf90_Check_Procref_Args0.42192___NAGf90_Check_Arg.42191___NAGf90_Check_Procref_Args1.42193___NAGf90_Check_Procref_Args2.42194___NAGf90_Check_Procref_Args0.42414___NAGf90_Check_Arg.42413___NAGf90_Check_Procref_Args1.42415___NAGf90_Check_Procref_Args0.42583___NAGf90_Check_Arg.42582___NAGf90_Check_Procref_Args1.42584___NAGf90_Check_Procref_Args2.42585___NAGf90_Check_Procref_Args3.42586___NAGf90_Check_Procref_Args4.42587___NAGf90_Check_Procref_Args5.42588___NAGf90_Check_Procref_Args6.42589___NAGf90_Check_Procref_Args7.42590___NAGf90_Check_Procref_Args8.42591___NAGf90_Check_Procref_Args9.42592___NAGf90_Check_Procref_Args10.42593___NAGf90_Check_Procref_Args11.42594___NAGf90_Check_Procref_Args12.42595___NAGf90_Check_Procref_Args13.42596___NAGf90_Check_Procref_Args14.42597___NAGf90_Check_Procref_Args15.42598___NAGf90_Check_Procref_Args16.42599___NAGf90_Check_Procref_Args17.42600___NAGf90_Check_Procref_Args0.43012___NAGf90_Check_Arg.43011___NAGf90_Check_Procref_Args1.43013___NAGf90_Check_Procref_Args2.43014___NAGf90_Check_Procref_Args3.43015___NAGf90_Check_Procref_Args0.43083___NAGf90_Check_Arg.43082___NAGf90_Check_Procref_Args1.43084___NAGf90_Check_Procref_Args2.43085___NAGf90_Check_Procref_Args3.43086___NAGf90_Check_Procref_Args4.43087___NAGf90_Check_Procref_Args5.43088___NAGf90_Check_Procref_Args6.43089___NAGf90_Check_Procref_Args7.43090___NAGf90_Check_Procref_Args8.43091___NAGf90_Check_Procref_Args0.43246___NAGf90_Check_Arg.43245___NAGf90_Check_Procref_Args1.43247___NAGf90_Check_Procref_Args2.43248___NAGf90_Check_Procref_Args3.43249___NAGf90_Check_Procref_Args0.43649___NAGf90_Check_Arg.43648___NAGf90_Check_Procref_Args0.45434___NAGf90_Check_Arg.45433___NAGf90_Check_Procref_Args1.45435___NAGf90_Check_Procref_Args0.46726___NAGf90_Check_Arg.46725___NAGf90_Check_Procref_Args0.46923___NAGf90_Check_Arg.46922___NAGf90_Check_Procref_Args0.46968___NAGf90_Check_Arg.46967___NAGf90_Check_Procref_Args0.47020___NAGf90_Check_Arg.47019___NAGf90_Check_Procref_Args0.47101___NAGf90_Check_Arg.47100___NAGf90_Check_Procref_Args0.47146___NAGf90_Check_Arg.47145___NAGf90_Check_Procref_Args0.47191___NAGf90_Check_Arg.47190___NAGf90_Check_Procref_Args0.47236___NAGf90_Check_Arg.47235___NAGf90_Check_Procref_Args0.47288___NAGf90_Check_Arg.47287___NAGf90_Check_Procref_Args1.47289___NAGf90_Check_Procref_Args0.47380___NAGf90_Check_Arg.47379___NAGf90_Check_Procref_Args1.47381___NAGf90_Check_Procref_Args0.47535___NAGf90_Check_Arg.47534___NAGf90_Check_Procref_Args1.47536___NAGf90_Check_Procref_Args2.47537___NAGf90_Check_Procref_Args3.47538___NAGf90_Check_Procref_Args4.47539___NAGf90_Check_Procref_Args5.47540___NAGf90_Check_Procref_Args0.47772___NAGf90_Check_Arg.47771___NAGf90_Check_Procref_Args0.47831___NAGf90_Check_Arg.47830___NAGf90_Check_Procref_Args0.48083___NAGf90_Check_Arg.48082___NAGf90_Check_Procref_Args1.48084___NAGf90_Check_Procref_Args0.48367___NAGf90_Check_Arg.48366___NAGf90_Check_Procref_Args1.48368___NAGf90_Check_Procref_Args2.48369___NAGf90_Check_Procref_Args3.48370___NAGf90_Check_Procref_Args4.48371___NAGf90_Check_Procref_Args0.48518___NAGf90_Check_Arg.48517___NAGf90_Check_Procref_Args1.48519___NAGf90_Check_Procref_Args2.48520___NAGf90_Check_Procref_Args3.48521___NAGf90_Check_Procref_Args0.48745___NAGf90_Check_Arg.48744___NAGf90_Check_Procref_Args1.48746___NAGf90_Check_Procref_Args0.48895___NAGf90_Check_Arg.48894___NAGf90_Check_Procref_Args1.48896___NAGf90_Check_Procref_Args2.48897___NAGf90_Check_Procref_Args5.48898___NAGf90_Check_Procref_Args6.48899___NAGf90_Check_Procref_Args7.48900___NAGf90_Check_Procref_Args12.48901___NAGf90_Check_Procref_Args15.48902___NAGf90_Check_Procref_Args16.48903___NAGf90_Check_Procref_Args17.48904___NAGf90_Check_Procref_Args18.48905___NAGf90_Check_Procref_Args19.48906___NAGf90_Check_Procref_Args20.48907___NAGf90_Check_Procref_Args0.51376___NAGf90_Check_Arg.51375___NAGf90_Check_Procref_Args1.51377___NAGf90_Check_Procref_Args0.51457___NAGf90_Check_Arg.51456___NAGf90_Check_Procref_Args1.51458___NAGf90_Check_Procref_Args2.51459___NAGf90_Check_Procref_Args3.51460___NAGf90_Check_Procref_Args0.51554___NAGf90_Check_Arg.51553___NAGf90_Check_Procref_Args1.51555___NAGf90_Check_Procref_Args0.51661___NAGf90_Check_Arg.51660___NAGf90_Check_Procref_Args1.51662___NAGf90_Check_Procref_Args2.51663___NAGf90_Check_Procref_Args3.51664___NAGf90_Check_Procref_Args4.51665___NAGf90_Check_Procref_Args5.51666___NAGf90_Check_Procref_Args6.51667___NAGf90_Check_Procref_Args7.51668___NAGf90_Check_Procref_Args8.51669___NAGf90_Check_Procref_Args9.51670___NAGf90_Check_Procref_Args10.51671___NAGf90_Check_Procref_Args11.51672___NAGf90_Check_Procref_Args12.51673___NAGf90_Check_Procref_Args13.51674___NAGf90_Check_Procref_Args14.51675___NAGf90_Check_Procref_Args15.51676___NAGf90_Check_Procref_Args0.52136___NAGf90_Check_Arg.52135___NAGf90_Check_Procref_Args0.52226___NAGf90_Check_Arg.52225___NAGf90_Check_Procref_Args1.52227L_.str871L_.str872L_.str873___NAGf90_Check_Procref_Args0.52453___NAGf90_Check_Arg.52452___NAGf90_Check_Procref_Args0.52555___NAGf90_Check_Arg.52554___NAGf90_Check_Procref_Args1.52556_dConst2.52852EH_frame0___inline_memcpy_chk.eh_coco_IP_check_key_chars_ok.eh_coco_IP_get_cl_arg_check_len.eh_coco_IP_get_log_value_from_cmdline.eh_coco_IP_get_int_value_from_cmdline.eh_coco_IP_get_log_value_from_setfile.eh_coco_IP_get_int_value_from_setfile.eh_coco_IP_valid_new_sf_name.eh_coco_IP_valid_new_cl_name.eh_coco_IP_valid_new_name.eh_coco_IP_format_time.eh_coco_IP_format_date.eh_coco_IP_to_lower.eh_coco_IP_unquote_string.eh_coco_IP_seek_close_paren.eh_coco_IP_replace_substring.eh_coco_IP_eval_log_primary.eh_coco_IP_eval_int_primary.eh_coco_IP_seek_log_primary.eh_coco_IP_eval_rel_expr.eh_coco_IP_eval_log_expr.eh_coco_IP_eval_int_expr.eh_coco_IP_integer_or_logical.eh_coco_IP_get_next_macro.eh_coco_IP_get_next_logical.eh_coco_IP_get_next_integer.eh_coco_IP_get_next_symbol.eh_coco_IP_get_text_ptr.eh_coco_IP_get_logical_value.eh_coco_IP_get_integer_value.eh_coco_IP_seek_sf_symbol_name.eh_coco_IP_seek_cl_symbol_name.eh_coco_IP_seek_symbol_name.eh_coco_IP_process_symbols_directive.eh_coco_IP_process_report_directive.eh_coco_IP_process_options_directive.eh_coco_IP_process_document_directive.eh_coco_IP_process_block_directive.eh_coco_IP_get_copy_name.eh_coco_IP_process_copy_directive.eh_coco_IP_verify_text_directive.eh_coco_IP_assign_text_value.eh_coco_IP_add_text.eh_coco_IP_process_text_directive.eh_coco_IP_get_text_name.eh_coco_IP_verify_macro_value.eh_coco_IP_verify_dummy_args.eh_coco_IP_process_dummy_arglist.eh_coco_IP_add_macro.eh_coco_IP_process_macro_declaration.eh_coco_IP_get_macro_name.eh_coco_IP_process_assert_directive.eh_coco_IP_process_endif_directive.eh_coco_IP_process_else_directive.eh_coco_IP_process_elseif_directive.eh_coco_IP_process_if_directive.eh_coco_IP_delete_block.eh_coco_IP_new_block.eh_coco_IP_add_logical.eh_coco_IP_process_logical_declaration.eh_coco_IP_add_integer.eh_coco_IP_process_integer_declaration.eh_coco_IP_get_symbol_name.eh_coco_IP_process_message_directive.eh_coco_IP_process_stop_directive.eh_coco_IP_process_logical_assignment.eh_coco_IP_process_integer_assignment.eh_coco_IP_process_coco_statement.eh_coco_IP_blank_compress_lower_case.eh_coco_IP_seek_comment_idx.eh_coco_IP_wrap_source_line.eh_coco_IP_process_actual_arglist.eh_coco_IP_make_actual_array.eh_coco_IP_edit_macro_strings.eh_coco_IP_edit_logical_strings.eh_coco_IP_edit_integer_strings.eh_coco_IP_edit_coco_strings.eh_coco_IP_edit_source_line.eh_coco_IP_seek_include_file.eh_coco_IP_process_include_directive.eh_coco_IP_process_endfile_directive.eh_coco_IP_add_number_to_line.eh_coco_IP_write_source_line.eh_coco_IP_write_coco_line.eh_coco_IP_is_coco_statement.eh_coco_IP_gather_coco_statement.eh_coco_IP_process_input_file.eh_coco_IP_add_sf_logical.eh_coco_IP_process_sf_logical_declaration.eh_coco_IP_add_sf_integer.eh_coco_IP_process_sf_integer_declaration.eh_coco_IP_get_sf_symbol_name.eh_coco_IP_process_wrap_directive.eh_coco_IP_process_verbose_directive.eh_coco_IP_process_summary_directive.eh_coco_IP_process_post_directive.eh_coco_IP_process_output_directive.eh_coco_IP_process_number_directive.eh_coco_IP_process_mark_directive.eh_coco_IP_process_logfile_directive.eh_coco_IP_process_key_directive.eh_coco_IP_process_input_directive.eh_coco_IP_add_directory.eh_coco_IP_seek_directory.eh_coco_IP_process_directory_directive.eh_coco_IP_process_form_directive.eh_coco_IP_process_alter_directive.eh_coco_IP_process_set_statement.eh_coco_IP_copy_set_file.eh_coco_IP_process_set_file.eh_coco_IP_seek_set_file.eh_coco_IP_write_symbols.eh_coco_IP_write_report.eh_coco_IP_write_options.eh_coco_IP_process_cmdline_directive.eh_coco_IP_process_wrap_option.eh_coco_IP_process_verbose_option.eh_coco_IP_process_set_file_option.eh_coco_IP_process_report_option.eh_coco_IP_process_postpend_option.eh_coco_IP_process_number_option.eh_coco_IP_process_mark_option.eh_coco_IP_process_log_file_option.eh_coco_IP_process_key_option.eh_coco_IP_process_include_option.eh_coco_IP_print_help.eh_coco_IP_process_fixed_option.eh_coco_IP_add_cl_logical.eh_coco_IP_add_cl_integer.eh_coco_IP_process_define_option.eh_coco_IP_process_alter_option.eh_coco_IP_getopt.eh_coco_IP_process_command_line.eh_coco_IP_msg_continue.eh_coco_IP_msg_quit.eh_coco_IP_check_incpath_dirs.eh_coco_IP_seek_sep_char.eh_coco_IP_build_incpath_value.eh_coco_IP_get_pwd_environment_value.eh_coco_IP_get_user_environment_value.eh_coco_IP_get_command_line_value.eh_coco_IP_set_option_defaults.eh_coco_IP_close_scratch.eh_coco_IP_close_file.eh_coco_IP_open_scratch.eh_coco_IP_open_file.eh_coco_IP_initialize_coco.ehDay-III/06-coco/coco.set100777 0 0 40 11660474412 10067 0?? alter: delete ?? number: off Day-III/06-coco/document.inc100777 0 0 371 11672747726 11005 0! ! Preprocessor executed: ?date? ?time? ! ! Preprocessor command line: ?cmdline? ! Preprocessor set file: ?setfile? ! Preprocessor log file: ?logfile? ! Preprocessor version: ! ?coco? ! ! Source file: ?file? line: ?line? ! Compile file: ?output? ! Day-III/06-coco/environ.f90100777 0 0 221646 11740030312 10532 0! bof ! environ.fpp: 1 ! ********************************************************************** ! environ.fpp: 2 ! Fortran 95 module environment ! environ.fpp: 3 ! environ.fpp: 4 ! ********************************************************************** ! environ.fpp: 5 ! Source Control Strings ! environ.fpp: 6 ! environ.fpp: 7 ! $Id: environ.fpp 1.4 2003/10/03 19:35:55Z Dan Release $ ! environ.fpp: 8 ! environ.fpp: 9 ! ********************************************************************** ! environ.fpp: 10 ! copyright 2003 Purple Sage Computing Solutions, Inc. ! environ.fpp: 11 ! environ.fpp: 12 ! ********************************************************************** ! environ.fpp: 13 ! some unix f77 subprograms ! environ.fpp: 14 ! environ.fpp: 15 ! ********************************************************************** ! environ.fpp: 16 ! Summary of License ! environ.fpp: 17 ! environ.fpp: 18 ! This library is free software; you can redistribute it and/or ! environ.fpp: 19 ! modify it under the terms of the GNU Library General Public ! environ.fpp: 20 ! License as published by the Free Software Foundation; either ! environ.fpp: 21 ! version 2 of the License, or (at your option) any later version. ! environ.fpp: 22 ! environ.fpp: 23 ! This library is distributed in the hope that it will be useful, ! environ.fpp: 24 ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! environ.fpp: 25 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! environ.fpp: 26 ! Library General Public License for more details. ! environ.fpp: 27 ! environ.fpp: 28 ! You should have received a copy of the GNU Library General Public ! environ.fpp: 29 ! License along with this library; if not, write to the Free ! environ.fpp: 30 ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! environ.fpp: 31 ! environ.fpp: 32 ! To report bugs, suggest enhancements, etc. to the Authors, ! environ.fpp: 33 ! Contact: ! environ.fpp: 34 ! Purple Sage Computing Solutions, Inc. ! environ.fpp: 35 ! send email to dnagle@erols.com ! environ.fpp: 36 ! or fax to 703 471 0684 (USA) ! environ.fpp: 37 ! or mail to 12142 Purple Sage Ct. ! environ.fpp: 38 ! Reston, VA 20194-5621 USA ! environ.fpp: 39 ! environ.fpp: 40 ! ********************************************************************** ! environ.fpp: 41 ! use standard_types ! environ.fpp: 42 ! environ.fpp: 43 ! ********************************************************************** ! environ.fpp: 44 ! environ.fpp: 45 ! environment constants ! environ.fpp: 46 ! environ.fpp: 47 ! unknown_option= character returned by getopt meaning 'unknown option' ! environ.fpp: 48 ! end_of_options= integer getopt return value meaning 'no more words' ! environ.fpp: 49 ! environ.fpp: 50 ! environment variables ! environ.fpp: 51 ! environ.fpp: 52 ! optarg= character getopt returns option string ! environ.fpp: 53 ! optind= integer pointing to next word for getopt to process ! environ.fpp: 54 ! environ.fpp: 55 ! environment library ! environ.fpp: 56 ! environ.fpp: 57 ! abort( code) ! environ.fpp: 58 ! environ.fpp: 59 ! assert( expression, string) ! environ.fpp: 60 ! environ.fpp: 61 ! getopt( optstring) sets optarg, optind ! environ.fpp: 62 ! environ.fpp: 63 ! lshift() left and ! environ.fpp: 64 ! rshift() right shifts ! environ.fpp: 65 ! environ.fpp: 66 ! cut( string, sep, nsubs, substrings, subslengths, stat) ! environ.fpp: 67 ! environ.fpp: 68 ! swab() copy words swapping even and odd bytes ! environ.fpp: 69 ! environ.fpp: 70 ! environ.fpp: 72 ! environ.fpp: 74 ! environ.fpp: 76 ! environ.fpp: 78 ! ********************************************************************** ! environ.fpp: 79 ! environ.fpp: 80 ! environment ! environ.fpp: 81 ! environ.fpp: 82 ! ********************************************************************** ! environ.fpp: 83 ! environ.fpp: 84 module environment ! environ.fpp: 85 ! environ.fpp: 86 ! ********************************************************************** ! environ.fpp: 87 ! environ.fpp: 88 ! use standard processor description ! environ.fpp: 89 ! environ.fpp: 90 use standard_types ! environ.fpp: 91 ! environ.fpp: 92 ! ********************************************************************** ! environ.fpp: 93 ! environ.fpp: 94 ! explicit declarations ! environ.fpp: 95 ! environ.fpp: 96 implicit none ! no implicit typing ! environ.fpp: 97 ! environ.fpp: 98 ! ********************************************************************** ! environ.fpp: 99 ! environ.fpp: 100 ! explicit export ! environ.fpp: 101 ! environ.fpp: 102 private ! no implicit exporting ! environ.fpp: 103 ! environ.fpp: 104 ! ********************************************************************** ! environ.fpp: 105 ! environ.fpp: 106 ! RCS strings ! environ.fpp: 107 ! environ.fpp: 108 ! ********************************************************************** ! environ.fpp: 109 ! environ.fpp: 110 character( len= *), public, parameter :: environment_rcs_id = & ! environ.fpp: 111 '$Id: environ.fpp 1.4 2003/10/03 19:35:55Z Dan Release $' ! environ.fpp: 112 ! environ.fpp: 113 ! ********************************************************************** ! environ.fpp: 114 ! environ.fpp: 115 ! communication with getopt() ! environ.fpp: 116 ! environ.fpp: 117 ! ---------------------------------------------------------------------- ! environ.fpp: 118 ! environ.fpp: 119 ! getopt() 'no more arguments' ! environ.fpp: 120 ! environ.fpp: 121 integer, public, parameter :: end_of_args = -1 ! environ.fpp: 122 ! environ.fpp: 123 ! getopt() 'not in optltrs' ! environ.fpp: 124 ! environ.fpp: 125 character( len= 1), public, parameter :: unknown_option = '?' ! environ.fpp: 126 ! environ.fpp: 127 ! getopt() out string ! environ.fpp: 128 ! environ.fpp: 129 integer, public, parameter :: optarg_len = 1024 ! environ.fpp: 130 ! environ.fpp: 131 character( len= optarg_len), public, save :: optarg = unknown_option ! environ.fpp: 132 ! environ.fpp: 133 ! getopt() out index ! environ.fpp: 134 ! environ.fpp: 135 integer, public, save :: optind = 0 ! environ.fpp: 136 ! environ.fpp: 137 ! ********************************************************************** ! environ.fpp: 138 ! environ.fpp: 139 ! library ! environ.fpp: 140 ! environ.fpp: 141 ! ********************************************************************** ! environ.fpp: 142 ! environ.fpp: 143 ! unix f77 shift routines ! environ.fpp: 144 ! environ.fpp: 145 public :: lshift ! use generic ! environ.fpp: 146 ! environ.fpp: 147 interface lshift ! generic name ! environ.fpp: 148 module procedure byte_lshift ! environ.fpp: 150 module procedure short_lshift ! environ.fpp: 153 module procedure int_lshift ! environ.fpp: 156 module procedure long_lshift ! environ.fpp: 159 end interface ! environ.fpp: 161 ! environ.fpp: 162 public :: rshift ! use generic ! environ.fpp: 163 ! environ.fpp: 164 interface rshift ! generic name ! environ.fpp: 165 module procedure byte_rshift ! environ.fpp: 167 module procedure short_rshift ! environ.fpp: 170 module procedure int_rshift ! environ.fpp: 173 module procedure long_rshift ! environ.fpp: 176 end interface ! environ.fpp: 178 ! environ.fpp: 179 ! ********************************************************************** ! environ.fpp: 180 ! environ.fpp: 181 ! module procedures ! environ.fpp: 182 ! environ.fpp: 183 public :: abort ! environ.fpp: 184 public :: assert ! environ.fpp: 185 ! environ.fpp: 186 public :: getopt ! environ.fpp: 187 ! environ.fpp: 188 public :: cut ! environ.fpp: 189 public :: swab ! environ.fpp: 190 ! environ.fpp: 191 ! ********************************************************************** ! environ.fpp: 192 ! environ.fpp: 193 ! library ! environ.fpp: 194 ! environ.fpp: 195 contains ! environ ! environ.fpp: 196 ! environ.fpp: 197 ! ********************************************************************** ! environ.fpp: 198 ! environ.fpp: 199 ! public abort: terminate program with nonzero exit status ! environ.fpp: 200 ! environ.fpp: 201 subroutine abort( code) ! environ.fpp: 202 ! environ.fpp: 203 integer, intent( in), optional :: code ! environ.fpp: 204 ! environ.fpp: 205 ! local ! environ.fpp: 206 ! environ.fpp: 207 integer :: icode ! environ.fpp: 208 ! environ.fpp: 209 ! abort() text ! environ.fpp: 210 ! environ.fpp: 211 continue ! abort() ! environ.fpp: 212 ! environ.fpp: 213 default_code: if( present( code) )then ! if called with code ! environ.fpp: 214 ! environ.fpp: 215 icode = code ! environ.fpp: 216 ! environ.fpp: 217 else default_code ! else use default ! environ.fpp: 218 ! environ.fpp: 219 icode = 1 ! environ.fpp: 220 ! environ.fpp: 221 endif default_code ! environ.fpp: 222 ! environ.fpp: 223 write( unit= error_unit, fmt= *) ' abort: ', icode ! complain ! environ.fpp: 224 ! environ.fpp: 225 stop 'abort' ! quit status code or 1 ! environ.fpp: 226 ! environ.fpp: 227 ! abort() ! environ.fpp: 228 ! environ.fpp: 229 end subroutine abort ! environ.fpp: 230 ! environ.fpp: 231 ! ********************************************************************** ! environ.fpp: 232 ! environ.fpp: 233 ! public assert: verify assertion ! environ.fpp: 234 ! environ.fpp: 235 subroutine assert( expression, string) ! environ.fpp: 236 ! environ.fpp: 237 logical, intent( in) :: expression ! environ.fpp: 238 ! environ.fpp: 239 character( len= *), intent( in) :: string ! environ.fpp: 240 ! environ.fpp: 241 ! assert() text ! environ.fpp: 242 ! environ.fpp: 243 continue ! assert() ! environ.fpp: 244 ! environ.fpp: 245 assertion_fails: if( .not. expression )then ! expression false ! environ.fpp: 246 ! environ.fpp: 247 write( unit= error_unit, fmt= *) ' assertion failed: ' // string ! environ.fpp: 248 ! environ.fpp: 249 stop 'assertion failed' ! punt ! environ.fpp: 250 ! environ.fpp: 251 endif assertion_fails ! expression false ! environ.fpp: 252 ! environ.fpp: 253 return ! assert() ! environ.fpp: 254 ! environ.fpp: 255 ! assert() ! environ.fpp: 256 ! environ.fpp: 257 end subroutine assert ! environ.fpp: 258 ! environ.fpp: 259 ! ********************************************************************** ! environ.fpp: 260 ! environ.fpp: 261 ! public getopt: return next known option from command line or unknown ! environ.fpp: 262 ! environ.fpp: 263 integer function getopt( optstring) ! environ.fpp: 264 ! environ.fpp: 265 character( len= *), intent( in) :: optstring ! environ.fpp: 266 ! environ.fpp: 267 ! getopt() local ! environ.fpp: 268 ! environ.fpp: 269 character( len= optarg_len) :: optword ! environ.fpp: 270 character( len= 1) :: firstchar, secndchar, thirdchar ! environ.fpp: 271 ! environ.fpp: 272 ! character constants ! environ.fpp: 273 ! environ.fpp: 274 character( len= 1), parameter :: dash = '-' ! environ.fpp: 275 character( len= 1), parameter :: colon = ':' ! environ.fpp: 276 character( len= 1), parameter :: blank = ' ' ! environ.fpp: 277 ! environ.fpp: 278 ! integers ! environ.fpp: 279 ! environ.fpp: 280 integer :: iopt ! environ.fpp: 281 ! environ.fpp: 282 ! external symbols ! environ.fpp: 283 ! environ.fpp: 284 integer, external :: iargc ! environ.fpp: 285 ! environ.fpp: 286 external :: getarg ! environ.fpp: 287 ! environ.fpp: 288 ! ********************************************************************** ! environ.fpp: 289 ! environ.fpp: 290 ! getopt() text ! environ.fpp: 291 ! environ.fpp: 292 continue ! getopt() ! environ.fpp: 293 ! environ.fpp: 294 ! initialize for next option ! environ.fpp: 295 ! environ.fpp: 296 optarg = blank ! reset ! environ.fpp: 297 ! environ.fpp: 298 check_inc: if( optind >= iargc() )then ! if no unread options ! environ.fpp: 299 ! environ.fpp: 300 optarg = unknown_option ! complain ! environ.fpp: 301 getopt = end_of_args ! and ! environ.fpp: 302 ! environ.fpp: 303 return ! quit ! environ.fpp: 304 ! environ.fpp: 305 endif check_inc ! if no unread options ! environ.fpp: 306 ! environ.fpp: 307 ! get next option ! environ.fpp: 308 ! environ.fpp: 309 optind = optind + 1 ! next arg to get ! environ.fpp: 310 ! environ.fpp: 311 call getarg( optind, optword) ! get next arg word ! environ.fpp: 312 ! environ.fpp: 313 firstchar = optword( 1: 1) ! examine optword ! environ.fpp: 314 secndchar = optword( 2: 2) ! character by ! environ.fpp: 315 thirdchar = optword( 3: 3) ! character ! environ.fpp: 316 ! environ.fpp: 317 ! if word is not -x ! environ.fpp: 318 ! environ.fpp: 319 not_an_option: if( firstchar /= dash )then ! if word is not an option ! environ.fpp: 320 ! environ.fpp: 321 optarg = optword ! return word ! environ.fpp: 322 getopt = ichar( unknown_option) ! mark unrecognized ! environ.fpp: 323 ! environ.fpp: 324 return ! quit ! environ.fpp: 325 ! environ.fpp: 326 ! if word is -- ! environ.fpp: 327 ! environ.fpp: 328 elseif( secndchar == dash )then not_an_option ! if -- ! environ.fpp: 329 ! environ.fpp: 330 optarg = optword ! return -- ! environ.fpp: 331 getopt = end_of_args ! signal end of options ! environ.fpp: 332 ! environ.fpp: 333 return ! quit ! environ.fpp: 334 ! environ.fpp: 335 endif not_an_option ! environ.fpp: 336 ! environ.fpp: 337 ! optword is -x (not --) ! environ.fpp: 338 ! environ.fpp: 339 iopt = index( optstring, secndchar) ! find optletter in string ! environ.fpp: 340 ! environ.fpp: 341 is_opt: if( iopt > substring_not_found )then ! if found in optstring ! environ.fpp: 342 ! environ.fpp: 343 ! if this optltr must have another word ! environ.fpp: 344 ! environ.fpp: 345 opt_string: if( optstring( iopt+1: iopt+1) == colon )then ! environ.fpp: 346 ! environ.fpp: 347 ! it can be separated by a blank ! environ.fpp: 348 ! environ.fpp: 349 next_word: if( thirdchar == blank )then ! in which case ! environ.fpp: 350 ! environ.fpp: 351 optind = optind + 1 ! increment index ! environ.fpp: 352 call getarg( optind, optarg) ! get next word ! environ.fpp: 353 ! environ.fpp: 354 ! or not be separated by a blank ! environ.fpp: 355 ! environ.fpp: 356 else next_word ! environ.fpp: 357 ! environ.fpp: 358 optarg = optword( 3: ) ! option field is rest of word ! environ.fpp: 359 ! environ.fpp: 360 endif next_word ! environ.fpp: 361 ! environ.fpp: 362 endif opt_string ! environ.fpp: 363 ! environ.fpp: 364 getopt = ichar( secndchar) ! option found ! environ.fpp: 365 ! environ.fpp: 366 ! if this optltr must not have another word ! environ.fpp: 367 ! environ.fpp: 368 else is_opt ! if not found in optstring ! environ.fpp: 369 ! environ.fpp: 370 optarg = optword ! return word and ! environ.fpp: 371 getopt = ichar( unknown_option) ! complain ! environ.fpp: 372 ! environ.fpp: 373 endif is_opt ! environ.fpp: 374 ! environ.fpp: 375 return ! getopt() ! environ.fpp: 376 ! environ.fpp: 377 ! getopt() ! environ.fpp: 378 ! environ.fpp: 379 end function getopt ! environ.fpp: 380 ! environ.fpp: 381 ! ********************************************************************** ! environ.fpp: 382 ! environ.fpp: 383 ! lshift()/rshift() ! environ.fpp: 384 ! environ.fpp: 385 ! ********************************************************************** ! environ.fpp: 409 ! environ.fpp: 409 ! ?kind_lshift(): lshift for kind byte ! environ.fpp: 409 ! environ.fpp: 409 elemental integer function byte_lshift( i, j) ! environ.fpp: 409 ! environ.fpp: 409 integer( kind= byte_k), intent( in) :: i, j ! environ.fpp: 409 ! environ.fpp: 409 ! byte_lshift() text ! environ.fpp: 409 ! environ.fpp: 409 continue ! lshift() ! environ.fpp: 409 ! environ.fpp: 409 byte_lshift = ishft( i, abs( j)) ! environ.fpp: 409 ! environ.fpp: 409 return ! lshift() ! environ.fpp: 409 ! environ.fpp: 409 ! byte_lshift() ! environ.fpp: 409 ! environ.fpp: 409 end function byte_lshift ! environ.fpp: 409 ! environ.fpp: 409 ! ********************************************************************** ! environ.fpp: 412 ! environ.fpp: 412 ! ?kind_lshift(): lshift for kind short ! environ.fpp: 412 ! environ.fpp: 412 elemental integer function short_lshift( i, j) ! environ.fpp: 412 ! environ.fpp: 412 integer( kind= short_k), intent( in) :: i, j ! environ.fpp: 412 ! environ.fpp: 412 ! short_lshift() text ! environ.fpp: 412 ! environ.fpp: 412 continue ! lshift() ! environ.fpp: 412 ! environ.fpp: 412 short_lshift = ishft( i, abs( j)) ! environ.fpp: 412 ! environ.fpp: 412 return ! lshift() ! environ.fpp: 412 ! environ.fpp: 412 ! short_lshift() ! environ.fpp: 412 ! environ.fpp: 412 end function short_lshift ! environ.fpp: 412 ! environ.fpp: 412 ! ********************************************************************** ! environ.fpp: 415 ! environ.fpp: 415 ! ?kind_lshift(): lshift for kind int ! environ.fpp: 415 ! environ.fpp: 415 elemental integer function int_lshift( i, j) ! environ.fpp: 415 ! environ.fpp: 415 integer( kind= int_k), intent( in) :: i, j ! environ.fpp: 415 ! environ.fpp: 415 ! int_lshift() text ! environ.fpp: 415 ! environ.fpp: 415 continue ! lshift() ! environ.fpp: 415 ! environ.fpp: 415 int_lshift = ishft( i, abs( j)) ! environ.fpp: 415 ! environ.fpp: 415 return ! lshift() ! environ.fpp: 415 ! environ.fpp: 415 ! int_lshift() ! environ.fpp: 415 ! environ.fpp: 415 end function int_lshift ! environ.fpp: 415 ! environ.fpp: 415 ! ********************************************************************** ! environ.fpp: 418 ! environ.fpp: 418 ! ?kind_lshift(): lshift for kind long ! environ.fpp: 418 ! environ.fpp: 418 elemental integer function long_lshift( i, j) ! environ.fpp: 418 ! environ.fpp: 418 integer( kind= long_k), intent( in) :: i, j ! environ.fpp: 418 ! environ.fpp: 418 ! long_lshift() text ! environ.fpp: 418 ! environ.fpp: 418 continue ! lshift() ! environ.fpp: 418 ! environ.fpp: 418 long_lshift = ishft( i, abs( j)) ! environ.fpp: 418 ! environ.fpp: 418 return ! lshift() ! environ.fpp: 418 ! environ.fpp: 418 ! long_lshift() ! environ.fpp: 418 ! environ.fpp: 418 end function long_lshift ! environ.fpp: 418 ! environ.fpp: 418 ! ********************************************************************** ! environ.fpp: 443 ! environ.fpp: 443 ! byte_rshift(): rshift for kind byte ! environ.fpp: 443 ! environ.fpp: 443 elemental integer function byte_rshift( i, j) ! environ.fpp: 443 ! environ.fpp: 443 integer( kind= byte_k), intent( in) :: i, j ! environ.fpp: 443 ! environ.fpp: 443 ! byte_rshift() text ! environ.fpp: 443 ! environ.fpp: 443 continue ! rshift() ! environ.fpp: 443 ! environ.fpp: 443 byte_rshift = ishft( i, -abs( j)) ! environ.fpp: 443 ! environ.fpp: 443 return ! rshift() ! environ.fpp: 443 ! environ.fpp: 443 ! byte_rshift() ! environ.fpp: 443 ! environ.fpp: 443 end function byte_rshift ! environ.fpp: 443 ! environ.fpp: 443 ! ********************************************************************** ! environ.fpp: 446 ! environ.fpp: 446 ! short_rshift(): rshift for kind short ! environ.fpp: 446 ! environ.fpp: 446 elemental integer function short_rshift( i, j) ! environ.fpp: 446 ! environ.fpp: 446 integer( kind= short_k), intent( in) :: i, j ! environ.fpp: 446 ! environ.fpp: 446 ! short_rshift() text ! environ.fpp: 446 ! environ.fpp: 446 continue ! rshift() ! environ.fpp: 446 ! environ.fpp: 446 short_rshift = ishft( i, -abs( j)) ! environ.fpp: 446 ! environ.fpp: 446 return ! rshift() ! environ.fpp: 446 ! environ.fpp: 446 ! short_rshift() ! environ.fpp: 446 ! environ.fpp: 446 end function short_rshift ! environ.fpp: 446 ! environ.fpp: 446 ! ********************************************************************** ! environ.fpp: 449 ! environ.fpp: 449 ! int_rshift(): rshift for kind int ! environ.fpp: 449 ! environ.fpp: 449 elemental integer function int_rshift( i, j) ! environ.fpp: 449 ! environ.fpp: 449 integer( kind= int_k), intent( in) :: i, j ! environ.fpp: 449 ! environ.fpp: 449 ! int_rshift() text ! environ.fpp: 449 ! environ.fpp: 449 continue ! rshift() ! environ.fpp: 449 ! environ.fpp: 449 int_rshift = ishft( i, -abs( j)) ! environ.fpp: 449 ! environ.fpp: 449 return ! rshift() ! environ.fpp: 449 ! environ.fpp: 449 ! int_rshift() ! environ.fpp: 449 ! environ.fpp: 449 end function int_rshift ! environ.fpp: 449 ! environ.fpp: 449 ! ********************************************************************** ! environ.fpp: 452 ! environ.fpp: 452 ! long_rshift(): rshift for kind long ! environ.fpp: 452 ! environ.fpp: 452 elemental integer function long_rshift( i, j) ! environ.fpp: 452 ! environ.fpp: 452 integer( kind= long_k), intent( in) :: i, j ! environ.fpp: 452 ! environ.fpp: 452 ! long_rshift() text ! environ.fpp: 452 ! environ.fpp: 452 continue ! rshift() ! environ.fpp: 452 ! environ.fpp: 452 long_rshift = ishft( i, -abs( j)) ! environ.fpp: 452 ! environ.fpp: 452 return ! rshift() ! environ.fpp: 452 ! environ.fpp: 452 ! long_rshift() ! environ.fpp: 452 ! environ.fpp: 452 end function long_rshift ! environ.fpp: 452 ! environ.fpp: 452 ! ********************************************************************** ! environ.fpp: 454 ! environ.fpp: 455 ! cut(): return input string broken at separators in output array ! environ.fpp: 456 ! environ.fpp: 457 pure subroutine cut( string, sep, substrings, substring_len, number) ! environ.fpp: 458 ! environ.fpp: 459 character( len= *), intent( in) :: string ! input string ! environ.fpp: 460 character( len= 1), intent( in) :: sep ! separator ! environ.fpp: 461 ! environ.fpp: 462 character( len= *), dimension( :), optional, intent( out) :: substrings ! environ.fpp: 463 integer, dimension( *), optional, intent( out) :: substring_len ! environ.fpp: 464 ! environ.fpp: 465 integer, optional, intent( out) :: number ! environ.fpp: 466 ! environ.fpp: 467 ! cut() local ! environ.fpp: 468 ! environ.fpp: 469 integer :: index_sep ! index of next separator ! environ.fpp: 470 integer :: next_substring ! start of next substring ! environ.fpp: 471 integer :: number_substring ! number of substring found ! environ.fpp: 472 ! environ.fpp: 473 ! cut() text ! environ.fpp: 474 ! environ.fpp: 475 continue ! cut() ! environ.fpp: 476 ! environ.fpp: 477 ! initialize ! environ.fpp: 478 ! environ.fpp: 479 next_substring = 1 ! start of next substring ! environ.fpp: 480 number_substring = 0 ! number found so far ! environ.fpp: 481 ! environ.fpp: 482 index_sep = index( string( next_substring: ), sep) ! index of first separator ! environ.fpp: 483 ! environ.fpp: 484 ! loop while more separators in string ! environ.fpp: 485 ! environ.fpp: 486 more_subs: do while( index_sep > substring_not_found) ! while more separators ! environ.fpp: 487 ! environ.fpp: 488 number_substring = number_substring + 1 ! one more substring ! environ.fpp: 489 ! environ.fpp: 490 set_substring: if( present( substrings) )then ! next substring ! environ.fpp: 491 ! environ.fpp: 492 substrings( number_substring) = string( next_substring: next_substring + index_sep - 2) ! environ.fpp: 493 ! environ.fpp: 494 endif set_substring ! next substring ! environ.fpp: 495 ! environ.fpp: 496 set_len: if( present( substring_len) )then ! next length ! environ.fpp: 497 ! environ.fpp: 498 substring_len( number_substring) = index_sep - 1 ! environ.fpp: 499 ! environ.fpp: 500 endif set_len ! next length ! environ.fpp: 501 ! environ.fpp: 502 next_substring = next_substring + index_sep ! start of next substring ! environ.fpp: 503 ! environ.fpp: 504 index_sep = index( string( next_substring: ), sep) ! index of next separator ! environ.fpp: 505 ! environ.fpp: 506 enddo more_subs ! while more separators ! environ.fpp: 507 ! environ.fpp: 508 ! last substring ! environ.fpp: 509 ! environ.fpp: 510 number_substring = number_substring + 1 ! one more substring ! environ.fpp: 511 ! environ.fpp: 512 last_substring: if( present( substrings) )then ! rest of string is last substring ! environ.fpp: 513 ! environ.fpp: 514 substrings( number_substring) = string( next_substring: ) ! environ.fpp: 515 ! environ.fpp: 516 endif last_substring ! rest of string is last substring ! environ.fpp: 517 ! environ.fpp: 518 len_arg: if( present( substring_len) )then ! environ.fpp: 519 ! environ.fpp: 520 substring_len( number_substring) = len_trim( string( next_substring: )) ! environ.fpp: 521 ! environ.fpp: 522 endif len_arg ! environ.fpp: 523 ! environ.fpp: 524 ! return number of substring of requested ! environ.fpp: 525 ! environ.fpp: 526 number_arg: if( present( number) )then ! environ.fpp: 527 ! environ.fpp: 528 number = number_substring ! count if requested ! environ.fpp: 529 ! environ.fpp: 530 endif number_arg ! environ.fpp: 531 ! environ.fpp: 532 return ! cut() ! environ.fpp: 533 ! environ.fpp: 534 ! cut() ! environ.fpp: 535 ! environ.fpp: 536 end subroutine cut ! environ.fpp: 537 ! environ.fpp: 538 ! ********************************************************************** ! environ.fpp: 539 ! environ.fpp: 540 ! swab(): return input string broken at separators in output array ! environ.fpp: 541 ! environ.fpp: 542 pure subroutine swab( a, b) ! environ.fpp: 543 ! environ.fpp: 544 integer( kind= int_k), dimension( :), intent( in) :: a ! environ.fpp: 545 ! environ.fpp: 546 integer( kind= int_k), dimension( :), intent( out) :: b ! environ.fpp: 547 ! environ.fpp: 548 ! swab() local ! environ.fpp: 549 ! environ.fpp: 550 integer( kind= byte_k), dimension( csu_per_nsu) :: temp ! environ.fpp: 551 ! environ.fpp: 552 integer( kind= int_k) :: iword ! environ.fpp: 553 ! environ.fpp: 554 ! swab() text ! environ.fpp: 555 ! environ.fpp: 556 continue ! swab() ! environ.fpp: 557 ! environ.fpp: 558 copy: do iword = 1, min( size(a), size( b) ) ! copy words ! environ.fpp: 559 ! environ.fpp: 560 temp = transfer( a( iword), temp) ! to byte array ! environ.fpp: 561 ! environ.fpp: 562 temp( 1: 2) = temp( 2: 1: -1) ! swap low bytes ! environ.fpp: 563 temp( 3: 4) = temp( 4: 3: -1) ! swap hi bytes ! environ.fpp: 564 ! environ.fpp: 565 b( iword) = transfer( temp, b( iword) ) ! from byte array ! environ.fpp: 566 ! environ.fpp: 567 enddo copy ! copy words ! environ.fpp: 568 ! environ.fpp: 569 return ! swab() ! environ.fpp: 570 ! environ.fpp: 571 ! swab() ! environ.fpp: 572 ! environ.fpp: 573 end subroutine swab ! environ.fpp: 574 ! environ.fpp: 575 ! ********************************************************************** ! environ.fpp: 576 ! environ.fpp: 577 ! environment ! environ.fpp: 578 ! environ.fpp: 579 ! $Id: environ.fpp 1.4 2003/10/03 19:35:55Z Dan Release $ ! environ.fpp: 580 ! ********************************************************************** ! environ.fpp: 581 ! environ.fpp: 582 end module environment ! eof ! environ.fpp: 583 Day-III/06-coco/environ.fpp100777 0 0 42466 11731457202 10715 0! bof ! ********************************************************************** ! Fortran 95 module environment ! ********************************************************************** ! Source Control Strings ! $Id: environ.fpp 1.4 2003/10/03 19:35:55Z Dan Release $ ! ********************************************************************** ! copyright 2003 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! some unix f77 subprograms ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! use standard_types ! ********************************************************************** ! environment constants ! unknown_option= character returned by getopt meaning 'unknown option' ! end_of_options= integer getopt return value meaning 'no more words' ! environment variables ! optarg= character getopt returns option string ! optind= integer pointing to next word for getopt to process ! environment library ! abort( code) ! assert( expression, string) ! getopt( optstring) sets optarg, optind ! lshift() left and ! rshift() right shifts ! cut( string, sep, nsubs, substrings, subslengths, stat) ! swab() copy words swapping even and odd bytes ?? ! ******************************************************************* ?? ! preprocessor definitions ?? include 'coco.inc' ?? ! ******************************************************************* ! ********************************************************************** ! environment ! ********************************************************************** module environment ! ********************************************************************** ! use standard processor description use standard_types ! ********************************************************************** ! explicit declarations implicit none ! no implicit typing ! ********************************************************************** ! explicit export private ! no implicit exporting ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), public, parameter :: environment_rcs_id = & '$Id: environ.fpp 1.4 2003/10/03 19:35:55Z Dan Release $' ! ********************************************************************** ! communication with getopt() ! ---------------------------------------------------------------------- ! getopt() 'no more arguments' integer, public, parameter :: end_of_args = -1 ! getopt() 'not in optltrs' character( len= 1), public, parameter :: unknown_option = '?' ! getopt() out string integer, public, parameter :: optarg_len = 1024 character( len= optarg_len), public, save :: optarg = unknown_option ! getopt() out index integer, public, save :: optind = 0 ! ********************************************************************** ! library ! ********************************************************************** ! unix f77 shift routines public :: lshift ! use generic interface lshift ! generic name ?? if( byte_k )then module procedure byte_lshift ?? endif ?? if( short_k )then module procedure short_lshift ?? endif ?? if( int_k )then module procedure int_lshift ?? endif ?? if( long_k )then module procedure long_lshift ?? endif end interface public :: rshift ! use generic interface rshift ! generic name ?? if( byte_k )then module procedure byte_rshift ?? endif ?? if( short_k )then module procedure short_rshift ?? endif ?? if( int_k )then module procedure int_rshift ?? endif ?? if( long_k )then module procedure long_rshift ?? endif end interface ! ********************************************************************** ! module procedures public :: abort public :: assert public :: getopt public :: cut public :: swab ! ********************************************************************** ! library contains ! environ ! ********************************************************************** ! public abort: terminate program with nonzero exit status subroutine abort( code) integer, intent( in), optional :: code ! local integer :: icode ! abort() text continue ! abort() default_code: if( present( code) )then ! if called with code icode = code else default_code ! else use default icode = 1 endif default_code write( unit= error_unit, fmt= *) ' abort: ', icode ! complain stop 'abort' ! quit status code or 1 ! abort() end subroutine abort ! ********************************************************************** ! public assert: verify assertion subroutine assert( expression, string) logical, intent( in) :: expression character( len= *), intent( in) :: string ! assert() text continue ! assert() assertion_fails: if( .not. expression )then ! expression false write( unit= error_unit, fmt= *) ' assertion failed: ' // string stop 'assertion failed' ! punt endif assertion_fails ! expression false return ! assert() ! assert() end subroutine assert ! ********************************************************************** ! public getopt: return next known option from command line or unknown integer function getopt( optstring) character( len= *), intent( in) :: optstring ! getopt() local character( len= optarg_len) :: optword character( len= 1) :: firstchar, secndchar, thirdchar ! character constants character( len= 1), parameter :: dash = '-' character( len= 1), parameter :: colon = ':' character( len= 1), parameter :: blank = ' ' ! integers integer :: iopt ! external symbols integer, external :: iargc external :: getarg ! ********************************************************************** ! getopt() text continue ! getopt() ! initialize for next option optarg = blank ! reset check_inc: if( optind >= iargc() )then ! if no unread options optarg = unknown_option ! complain getopt = end_of_args ! and return ! quit endif check_inc ! if no unread options ! get next option optind = optind + 1 ! next arg to get call getarg( optind, optword) ! get next arg word firstchar = optword( 1: 1) ! examine optword secndchar = optword( 2: 2) ! character by thirdchar = optword( 3: 3) ! character ! if word is not -x not_an_option: if( firstchar /= dash )then ! if word is not an option optarg = optword ! return word getopt = ichar( unknown_option) ! mark unrecognized return ! quit ! if word is -- elseif( secndchar == dash )then not_an_option ! if -- optarg = optword ! return -- getopt = end_of_args ! signal end of options return ! quit endif not_an_option ! optword is -x (not --) iopt = index( optstring, secndchar) ! find optletter in string is_opt: if( iopt > substring_not_found )then ! if found in optstring ! if this optltr must have another word opt_string: if( optstring( iopt+1: iopt+1) == colon )then ! it can be separated by a blank next_word: if( thirdchar == blank )then ! in which case optind = optind + 1 ! increment index call getarg( optind, optarg) ! get next word ! or not be separated by a blank else next_word optarg = optword( 3: ) ! option field is rest of word endif next_word endif opt_string getopt = ichar( secndchar) ! option found ! if this optltr must not have another word else is_opt ! if not found in optstring optarg = optword ! return word and getopt = ichar( unknown_option) ! complain endif is_opt return ! getopt() ! getopt() end function getopt ! ********************************************************************** ! lshift()/rshift() ?? text :: lshift( kind) ! ********************************************************************** ! ?kind_lshift(): lshift for kind ?kind? elemental integer function ?kind?_lshift( i, j) integer( kind= ?kind?_k), intent( in) :: i, j ! ?kind?_lshift() text continue ! lshift() ?kind?_lshift = ishft( i, abs( j)) return ! lshift() ! ?kind?_lshift() end function ?kind?_lshift ?? end text lshift ?? if( byte_k )then ?? copy :: lshift( byte) ?? endif ?? if( short_k )then ?? copy :: lshift( short) ?? endif ?? if( int_k )then ?? copy :: lshift( int) ?? endif ?? if( long_k )then ?? copy :: lshift( long) ?? endif ?? text :: rshift( kind) ! ********************************************************************** ! ?kind?_rshift(): rshift for kind ?kind? elemental integer function ?kind?_rshift( i, j) integer( kind= ?kind?_k), intent( in) :: i, j ! ?kind?_rshift() text continue ! rshift() ?kind?_rshift = ishft( i, -abs( j)) return ! rshift() ! ?kind?_rshift() end function ?kind?_rshift ?? end text rshift ?? if( byte_k )then ?? copy :: rshift( byte) ?? endif ?? if( short_k )then ?? copy :: rshift( short) ?? endif ?? if( int_k )then ?? copy :: rshift( int) ?? endif ?? if( long_k )then ?? copy :: rshift( long) ?? endif ! ********************************************************************** ! cut(): return input string broken at separators in output array pure subroutine cut( string, sep, substrings, substring_len, number) character( len= *), intent( in) :: string ! input string character( len= 1), intent( in) :: sep ! separator character( len= *), dimension( :), optional, intent( out) :: substrings integer, dimension( *), optional, intent( out) :: substring_len integer, optional, intent( out) :: number ! cut() local integer :: index_sep ! index of next separator integer :: next_substring ! start of next substring integer :: number_substring ! number of substring found ! cut() text continue ! cut() ! initialize next_substring = 1 ! start of next substring number_substring = 0 ! number found so far index_sep = index( string( next_substring: ), sep) ! index of first separator ! loop while more separators in string more_subs: do while( index_sep > substring_not_found) ! while more separators number_substring = number_substring + 1 ! one more substring set_substring: if( present( substrings) )then ! next substring substrings( number_substring) = string( next_substring: next_substring + index_sep - 2) endif set_substring ! next substring set_len: if( present( substring_len) )then ! next length substring_len( number_substring) = index_sep - 1 endif set_len ! next length next_substring = next_substring + index_sep ! start of next substring index_sep = index( string( next_substring: ), sep) ! index of next separator enddo more_subs ! while more separators ! last substring number_substring = number_substring + 1 ! one more substring last_substring: if( present( substrings) )then ! rest of string is last substring substrings( number_substring) = string( next_substring: ) endif last_substring ! rest of string is last substring len_arg: if( present( substring_len) )then substring_len( number_substring) = len_trim( string( next_substring: )) endif len_arg ! return number of substring of requested number_arg: if( present( number) )then number = number_substring ! count if requested endif number_arg return ! cut() ! cut() end subroutine cut ! ********************************************************************** ! swab(): return input string broken at separators in output array pure subroutine swab( a, b) integer( kind= int_k), dimension( :), intent( in) :: a integer( kind= int_k), dimension( :), intent( out) :: b ! swab() local integer( kind= byte_k), dimension( csu_per_nsu) :: temp integer( kind= int_k) :: iword ! swab() text continue ! swab() copy: do iword = 1, min( size(a), size( b) ) ! copy words temp = transfer( a( iword), temp) ! to byte array temp( 1: 2) = temp( 2: 1: -1) ! swap low bytes temp( 3: 4) = temp( 4: 3: -1) ! swap hi bytes b( iword) = transfer( temp, b( iword) ) ! from byte array enddo copy ! copy words return ! swab() ! swab() end subroutine swab ! ********************************************************************** ! environment ! $Id: environ.fpp 1.4 2003/10/03 19:35:55Z Dan Release $ ! ********************************************************************** end module environment ! eof Day-III/06-coco/makefile100777 0 0 400 11740026604 10142 0#FC=gfortran -c #FC=ifort -c FC=nagfor -c #FFLAGS=-std=f2008 -Wall -fcheck=all #FFLAGS=-std -warn all -check all FFLAGS=-f2008 -w=all -C=all #LD=gfortran #LD=ifort LD=nagfor coco: coco.o ${LD} coco.o -o coco coco.o: coco.f90 ${FC} ${FFLAGS} coco.f90 Day-III/06-coco/make_pm100777 0 0 1564530 11660472354 10132 0 H__PAGEZERO(__TEXT__text__TEXTXX__stubs__TEXT__stub_helper__TEXT__cstring__TEXT__const__TEXTt__eh_frame__TEXTXXx__DATA  __dyld__DATA8__nl_symbol_ptr__DATA88,__la_symbol_ptr__DATAH`H.__data__DATA __const__DATA __bss2__DATA __common__DATA H__LINKEDIT X"00x PRRY-(Z /usr/lib/dyldKc:Im{$ *X H/usr/local/gfortran/lib/libgfortran.3.dylib 8/usr/lib/libSystem.B.dylib H/usr/local/gfortran/lib/libgcc_s.1.dylib H/usr/local/gfortran/lib/libquadmath.0.dylib&@jHHH}HuHHHH9uH$3ASLcAS%[%ZUHAUATSH8HLHHDž!HHHHHDžHĪHDžHHDžDž CDž HHHH@HDž!HTHDžDžDž HH貥HuHEH H躥E܃ HHHDHѥHHMЋU܋E܃ IAH ̩ HމͤE܅~HEHtH聥E܍P HHHQHHtHYHHeH2HDž!HFHDžDžDž HH褤HH5H迤HH耤HHDž!HɨHDžDžDž HH'HHH5HBHHH8HDž!HLHDžDžDž HH誣H$H5aHţHH膣HHDž!DžDž HHEHH<HqHDž!HHDžDžDž HHHHH5RHHH迢HHDž!HHDžDžDž HHfHH5AH聢HHBHwHDž!DžDž HHHHH-HDž!HAHDžDžDž HH蟡H9H5H躡HH{HHDž!DžDž HH:HH1HfHDž!HzHDžDžDž HHؠHHH5GHHH贠HHDž!HHDžDžDž HH[H7H5HvHH7HlHDž!DžDž HHHHH"HDž!H6HDžDžDž HH蔟HHH5H诟HHpHHDž!HHDžDžDž HHHH5H2HHH(HDž!DžDž HH貞HH詞HޠHDž!HHDžDžDž HHPHHH5ףHkHH,HaHDž!HuHDžDžDž HHӝHHH5HHH话HHDž!HHDžDžDž HHVHEH5mHqHH2HgHDž!H{HDžDžDž HHٜH'H58HHH赜HHDž!DžDž HHtHHkHHDž!HHDžDžDž HHHCH5H-HHH#HDž!H7HDžDžDž HH蕛HBH5dH谛HHqHHDž!HHDžDžDž HHHAH5/H3HHH)HDž!H=HDžDžDž HH蛚H0H5H趚HHwHHDž!DžDž HH6HH-HbHDž!HvHDžDžDž HHԙHEH5cHHH谙HHDž!HHDžDžDž HHWH?H5.HrHH3HhHDž!H|HDžDžDž HHژH=H5HHH趘HHDž!DžDž HHuHHlHHDž!HHDžDžDž HHH<H5jH.HHH$HDž!H8HDžDžDž HH薗H H5)H豗HHrHHDž!HHDžDžDž HHH*H5H4HHH*HDž!H>HDžDžDž HH蜖H>H5kH跖HHxHHDž!HHDžDžDž HHH@H5.H:HHH0HDž!HDHDžDžDž HH袕HCH5H轕HH~HHDž!HǙHDžDžDž HH%HGH5H@HHH6HDž!DžDž HHHH跔HHDž!HHDžDžDž HH^HHH5͘HyHH:HoHDž!HHDžDžDž HHH<H5HHH轓HHDž!DžDž HH|HHsHHDž!HHDžDžDž HHHHH5H5HHH+HDž!H?HDžDžDž HH蝒HH5H踒HHyHHDž!DžDž HH8HH/HdHDž!HxHDžDžDž HH֑HHH5EHHH貑HHDž!DžDž HHqHHhHHDž!HHDžDžDž HHHH5FH*HHH HDž!DžDž HH誐HH衐H֒HDž!HHDžDžDž HHHH4H5HcHH$HYHDž!DžDž HHHHڏHHDž!H#HDžDžDž HH聏HH5H蜏HH]HHDž"DžDž HHHHHHHDž"H\HDžDžDž HH躎H H5UHՎHH薎HːHDž"DžDž HHUHHLHHDž"HHDžDžDž HHHH5HHHύHHDž"DžDž HH莍HH腍HHDž"HΑHDžDžDž HH,HH5HGHHH=HDž"DžDž HHnjHH辌HHDž"HHDžDžDž HHeHH5?H而HHAHvHDž"DžDž HHHHH,HDž "H@HDžDžDž HH螋H H59H蹋HHzHHDž "DžDž HH9HH0HeHDž "HyHDžDžDž HH׊HHH5FHHH賊HHDž "DžDž HHrHHiHHDž "HHDžDžDž HHHH5H+HHH!HDž"DžDž HH諉HH袉H׋HDž"HHDžDžDž HHIHHH5HdHH%HZHDž"DžDž HHHHۈHHDž"H$HDžDžDž HH肈HH5H蝈HH^HHDž"DžDž HHHHHIHDž"H]HDžDžDž HH軇HHH5*HևHH藇H̉HDž"DžDž HHVHHMHHDž"HHDžDžDž HHH$H5HHHІHHDž"DžDž HH菆HH膆HHDž"HϊHDžDžDž HH-HH5pHHHH ?H/HDž"DžDž HH蹅HH谅HHDž"HHDžDžDž HHWH!H5HrHH3HhHDž"DžDž HHHHHHDž"H2HDžDžDž HH萄HHH5H諄HHlHHDž "HHDžDžDž HHHH5H.HHH$HDž!"DžDž HH讃HH襃HڅHDž""HHDžDžDž HHLH H5HgHH(H]HDž#"DžDž HHHHނHHDž$"H'HDžDžDž HH腂HHH5H蠂HHaHHDž%"DžDž HH HHHLHDž&"H`HDžDžDž HH辁HH5cHفHH蚁HσHDž'"DžDž HHYHHPHHDž("HHDžDžDž HHHHH5fHHHӀHHDž)"DžDž HH蒀HH艀HHDž*"H҄HDžDžDž HH0H*H5HKHH HAHDž+"DžDž HHHHHHDž,"H HDžDžDž HHiH;H5`HHHEHzHDž-"HHDžDžDž HH~H<H5#HHH~HHDž."DžDž HH~HH~~HHDž/"HǂHDžDžDž HH%~HHH5H@~HH~H6HDž0"DžDž HH}HH}HHDž1"HHDžDžDž HH^}H"H5ՉHy}HH:}HoHDž2"HHDžDžDž HH|HHuHEHѺH|Ẽ HHHDH|IHMŰẼ IAH 8 L{E̅~HEHtH|Ẽ!HHHDH|IċE̍P Ẽ!L ALL{LHtHU|E̍P!HLH%|LHtH-|HH{H ~HDž3"DžDž HH{HH{H}HDž4"HHDžDžDž HH3{HHH5HN{HH{HD}HDž5"DžDž HHzHHzH|HDž6"HHDžDžDž HHlzHH5,HzHHHzH}|HDž7"DžDž HHzHHyH3|HDž8"HG~HDžDžDž HHyHHH5~HyHHyH{HDž9"DžDž HH@yHH7yHl{HDž:"H}HDžDžDž HHxH$H5HxHHxHzHDž;"DžDž HHyxHHpxHzHDž<"H|HDžDžDž HHxHH5H2xHHwH(zHDž="H<|HDžDžDž HHwHH5HwHHvwHyHDž>"H{HDžDžDž HHwHH5[H8wHHvH.yHDž?"DžDž HHvHHvHxHDž@"HzHDžDžDž HHVvHH5HqvHH2vHgxHDžA"DžDž HHuHHuHxHDžB"H1zHDžDžDž HHuH H5HuHHkuHwHDžC"DžDž HH*uHH!uHVwHDžD"HjyHDžDžDž HHtHH5gHtHHtHvHDžE"DžDž HHctHHZtHvHDžF"HxHDžDžDž HHtHH5HtHHsHvHDžG"DžDž HHsHHsHuHDžH"HwHDžDžDž HH:sHH5 HUsHHsHKuHDžI"DžDž HHrHHrHuHDžJ"HwHDžDžDž HHsrH H5[HrHHOrHtHDžK"DžDž HHrHHrH:tHDžL"HNvHDžDžDž HHqHH5HqHHqHsHDžM"DžDž HHGqHH>qHssHDžN"HuHDžDžDž HHpH1H5~HqHHpHrHDžO"DžDž HHpHHwpHrHDžP"HtHDžDžDž HHpHH5f~H9pHHoH/rHDžQ"DžDž HHoHHoHqHDžR"HsHDžDžDž HHWoH'H5}HroHH3oHhqHDžS"H|sHDžDžDž HHnH)H5i}HnHHnHpHDžT"DžDž HHunHHlnHpHDžU"HrHDžDžDž HHnHH5|H.nHHmH$pHDžV"DžDž HHmHHmHoHDžW"HqHDžDžDž HHLmHH5|HgmHH(mH]oHDžX"DžDž HHlHHlHoHDžY"H'qHDžDžDž HHlHHH5pHlHHalHnHDžZ"DžDž HH lHHlHLnHDž["H`pHDžDžDž HHkHH5zHkHHkHmHDž\"DžDž HHYkHHPkHmHDž]"HoHDžDžDž HHjHVH5yHkHHjHmHDž^"DžDž HHjHHjHlHDž_"HnHDžDžDž HH0jHHH5nHKjHH jHAlHDž`"DžDž HHiHHiHkHDža"H nHDžDžDž HHiiH H5xHiHHEiHzkHDžb"DžDž HHiHHhH0kHDžc"HDmHDžDžDž HHhHH5xHhHH~hHjHDžd"DžDž HH=hHH4hHijHDže"H}lHDžDžDž HHgH,H5bwHgHHgHiHDžf"DžDž HHvgHHmgHiHDžg"HkHDžDžDž HHgHH5zvH/gHHfH%iHDžh"DžDž HHfHHfHhHDži"HjHDžDžDž HHMfHHH5jHhfHH)fH^hHDžj"DžDž HHeHHeHhHDžk"H(jHDžDžDž HHeHH59uHeHHbeHgHDžl"DžDž HH!eHHeHMgHDžm"HaiHDžDžDž HHdH,H5tHdHHdHfHDžn"DžDž HHZdHHQdHfHDžo"HhHDžDžDž HHcHH5^sHdHHcH fHDžp"DžDž HHcHHcHeHDžq"HgHDžDžDž HH1cH)H5(sHLcHH cHBeHDžr"DžDž HHbHHbHdHDžs"H gHDžDžDž HHjbHEH5rHbHHFbH{dHDžt"DžDž HHbHHaH1dHDžu"HEfHDžDžDž HHaHH5 qHaHHaHcHDžv"DžDž HH>aHH5aHjcHDžw"H~eHDžDžDž HH`HBH5KqH`HH`HbHDžx"DžDž HHw`HHn`HbHDžy"HdHDžDžDž HH`HH5{oH0`HH_H&bHDžz"DžDž HH_HH_HaHDž{"HcHDžDžDž HHN_H"H5pHi_HH*_H_aHDž|"DžDž HH^HH^HaHDž}"H)cHDžDžDž HH^H@H5foH^HHc^H`HDž~"HbHDžDžDž HH ^H>H5)oH%^HH]H`HDž"H/bHDžDžDž HH]H4H5nH]HHi]H_HDž"HaHDžDžDž HH]H@H5nH+]HH\H!_HDž"DžDž HH\HH\H^HDž"H`HDžDžDž HHI\HH5kHd\HH%\HZ^HDž"DžDž HH[HH[H^HDž"H$`HDžDžDž HH[H0H5YmH[HH^[H]HDž"DžDž HH[HH[HI]HDž"H]_HDžDžDž HHZHSH5lHZHHZH\HDž"DžDž HHVZHHMZH\HDž"H^HDžDžDž HHYHH5ZiHZHHYH\HDž"DžDž HHYHHYH[HDž"H]HDžDžDž HH-YHHH5]HHYHH YH>[HDž"DžDž HHXHHXHZHDž"H]HDžDžDž HHfXHEH5jHXHHBXHwZHDž"DžDž HHXHHWH-ZHDž"HA\HDžDžDž HHWHDH5FjHWHH{WHYHDž"DžDž HH:WHH1WHfYHDž"Hz[HDžDžDž HHVHQH5iHVHHVHXHDž"DžDž HHsVHHjVHXHDž"HZHDžDžDž HHVHH5QiH,VHHUH"XHDž"DžDž HHUHHUHWHDž"HYHDžDžDž HHJUHH5hHeUHH&UH[WHDž"DžDž HHTHHTHWHDž"H%YHDžDžDž HHTHEH5fHTHH_THVHDž"DžDž HHTHHTHJVHDž"H^XHDžDžDž HHSHEH5#gHSHHSHUHDž"DžDž HHWSHHNSHUHDž"HWHDžDžDž HHRHQH5eHSHHRHUHDž"DžDž HHRHHRHTHDž"HVHDžDžDž HH.RHH5neHIRHH RH?THDž"DžDž HHQHHQHSHDž"H VHDžDžDž HHgQHH5dHQHHCQHxSHDž"DžDž HHQHHPH.SHDž"HBUHDžDžDž HHPHHH5UHPHH|PHRHDž"DžDž HH;PHH2PHgRHDž"H{THDžDžDž HHOH!H5cHOHHOHQHDž"DžDž HHtOHHkOHQHDž"HSHDžDžDž HHOH8H5bH-OHHNH#QHDž"DžDž HHNHHNHPHDž"HRHDžDžDž HHKNHH5]HfNHH'NH\PHDž"DžDž HHMHHMHPHDž"H&RHDžDžDž HHMHQH5aHMHH`MHOHDž"DžDž HHMHHMHKOHDž"H_QHDžDžDž HHLHUH5$aHLHHLHNHDž"DžDž HHXLHHOLHNHDž"HPHDžDžDž HHKHKH5`HLHHKHNHDž"DžDž HHKHHKHMHDž"HOHDžDžDž HH/KH;H5>`HJKHH KH@MHDž"DžDž HHJHHJHLHDž"H OHDžDžDž HHhJHAH5_HJHHDJHyLHDž"DžDž HHJHHIH/LHDž"HCNHDžDžDž HHIHH5YHIHH}IHKHDž"DžDž HHEHsGHDž"DžDž HHDHHDH)GHDž"H=IHDžDžDž HHDHH5THDHHwDHFHDž"DžDž HH6DHH-DHbFHDž"HvHHDžDžDž HHCH>H5ZHCHHCHEHDž"DžDž HHoCHHfCHEHDž"HGHDžDžDž HH CHH5sRH(CHHBHEHDž"DžDž HHBHHBHDHDž"HFHDžDžDž HHFBH@H5YHaBHH"BHWDHDž"HkFHDžDžDž HHAHBH5XYHAHHAHCHDž"DžDž HHdAHH[AHCHDž"HEHDžDžDž HHAH&H5XHAHH@HCHDž"H'EHDžDžDž HH@H:H5XH@HHa@HBHDž"HDHDžDžDž HH@HH5AXH#@HH?HBHDž"H-DHDžDžDž HH?HCH5WH?HHg?HAHDž"HCHDžDžDž HH?HH5kRH)?HH>HAHDž"DžDž HH>HH>H@HDž"HBHDžDžDž HHG>H@H5VHb>HH#>HX@HDž"DžDž HH=HH=H@HDž"H"BHDžDžDž HH=HH5OVH=HH\=H?HDž"HAHDžDžDž HH=H9H5UH=HH<H?HDž"H(AHDžDžDž HH<HH5TH<HHb<H>HDž"H@HDžDžDž HH <HAH58UH$<HH;H>HDž"H.@HDžDžDž HH;HH5NH;HHh;H=HDž"DžDž HH';HH;HS=HDž"DžDž HH:HH:H =HDž"H?HDžDžDž HH{:HH5SH:HHW:H<HDž"H>HDžDžDž HH9HBH5SH:HH9H<HDž"H#>HDžDžDž HH9HH5QH9HH]9H;HDž"H=HDžDžDž HH9HJH5RH9HH8H;HDž"H)=HDžDžDž HH8HH5KH8HHc8H:HDž"DžDž HH"8HH8HN:HDž"Hb<HDžDžDž HH7HH5QH7HH7H9HDž"H;HDžDžDž HHC7HBH5QH^7HH7HT9HDž"Hh;HDžDžDž HH6HH5NH6HH6H8HDž"H:HDžDžDž HHI6HJH5 PHd6HH%6HZ8HDž"Hn:HDžDžDž HH5HH5)IH5HH5H7HDž"DžDž HHg5HH^5H7HDž"H9HDžDžDž HH5H_H5OH 5HH4H7HDž"H*9HDžDžDž HH4H^H5oOH4HHd4H6HDž"H8HDžDžDž HH 4HH5POH&4HH3H6HDž"H08HDžDžDž HH3HGH5NH3HHj3H5HDž"H7HDžDžDž HH3HH5JKH,3HH2H"5HDž"H67HDžDžDž HH2HOH5;NH2HHp2H4HDž"H6HDžDžDž HH2HH5tEH22HH1H(4HDž"DžDž HH1HH1H3HDž"HMHDž DžDž HHP1H2H5WMHk1HHHHS1HH1HC3HDž"HLHDž DžDž HH0H0H5LH0HHHH0HHs0H2HDž"HWLHDž DžDž HH0HHH5LH50HHHH0HH/H 2HDž"DžDž HH/HH/H1HDž"H3HDžDžDž HH5/HKH5CHP/HH/HF1HDž"HZ3HDžDžDž HH.H<H5oKH.HH.H0HDž"H2HDžDžDž HH;.HH5=HV.HH.HL0HDž#DžDž HH-HH-H0HDž#H2HDžDžDž HHt-HIH5kJH-HHP-H/HDž#DžDž HH-HH-H;/HDž#HO1HDžDžDž HH,HH5<H,HH,H.HDž#DžDž HHH,HH?,Ht.HDž#H0HDžDžDž HH+H?H5-IH,HH+H-HDž#DžDž HH+HHx+H-HDž#H/HDžDžDž HH+H H5HH:+HH*H0-HDž#HD/HDžDžDž HH*H7H5IHH*HH~*H,HDž #DžDž HH=*HH4*Hi,HDž #H}.HDžDžDž HH)H"H5GH)HH)H+HDž #H.HDžDžDž HH^)H9H5eGHy)HH:)Ho+HDž #H-HDžDžDž HH(H%H5(GH(HH(H*HDž #H-HDžDžDž HHd(H;H5FH(HH@(Hu*HDž#DžDž HH'HH'H+*HDž#H?,HDžDžDž HH'HH5GFH'HHy'H)HDž#H+HDžDžDž HH 'H7H5EH;'HH&H1)HDž#HE+HDžDžDž HH&HH5>H&HH&H(HDž#H*HDžDžDž HH&&H7H5%EHA&HH&H7(HDž#HK*HDžDžDž HH%HH59H%HH%H'HDž#DžDž HHD%HH;%Hp'HDž#H)HDžDžDž HH$HH5DH$HH$H&HDž#H)HDžDžDž HHe$H<H5CH$HHA$Hv&HDž#H(HDžDžDž HH#HH5!<H$HH#H%HDž#H (HDžDžDž HHk#H@H5BH#HHG#H|%HDž#H'HDžDžDž HH"HH5K6H #HH"H$HDž#DžDž HH"HH"H$HDž#H&HDžDžDž HH'"HH51HB"HH"H8$HDž#DžDž HH!HH!H#HDž#H&HDžDžDž HH`!H,H5/AH{!HHHHHjH HDž%#H"HDžDžDž HHHH5J6H,HHH" HDž&#H6"HDžDžDž HHH.H5 >HHHpHHDž'#H!HDžDžDž HHH-H5=H2HHH(HDž(#H#HHDžDžDž HHHH5G+H)HHHHDž?#H3HDžDžDž HHH,H505HHHmHHDž@#HHDžDžDž HHHH5q%H/HHH%HDžA#DžDž HHHHHHDžB#HHDžDžDž HHMH#H54HhHH)H^HDžC#DžDž HHHHHHDžD#H(HDžDžDž HHH!H5}3HHHbHHDžE#HHDžDžDž HH H8H5(3H$HHHHDžF#H.HDžDžDž HHHH5'HHHhHHDžG#HHDžDžDž HHH3H5f2H*HHH HDžH#H4HDžDžDž HHHH5!HHHnHHDžI#DžDž HH-HH$HYHDžJ#HmHDžDžDž HH H!H5Z1H HH HHDžK#HHDžDžDž HHN H9H51Hi HH* H_HDžL#HsHDžDžDž HH HH5 %H HH HHDžM#HHDžDžDž HHT H4H5K0Ho HH0 HeHDžN#HyHDžDžDž HH HH54H HH H HDžO#DžDž HHr HHi H HDžP#HHDžDžDž HH H!H5?/H+ HH H! HDžQ#H5HDžDžDž HH H7H5.H HHo H HDžR#HHDžDžDž HH HH5O"H1 HH H' HDžS#H;HDžDžDž HH H2H5(.H HHu H HDžT#H HDžDžDž HH HH5yH7 HHH- HDžU#DžDž HHHHH HDžV#H HDžDžDž HHUH!H5-HpHH1Hf HDžW#Hz HDžDžDž HHH7H5,HHHH HDžX#H HDžDžDž HH[HH5HvHH7Hl HDžY#H HDžDžDž HHH2H5,HHHHHDžZ#H HDžDžDž HHaHH5H|HH=HrHDž[#DžDž HHHHH(HDž\#H< HDžDžDž HHH!H5*HHHvHHDž]#H HDžDžDž HHH8H5*H8HHH.HDž^#HB HDžDžDž HHHH5HHH|HHDž_#HHDžDžDž HH#H3H5)H>HHH4HDž`#HHHDžDžDž HHHH5HHHHHDža#DžDž HHAHH8HmHDžb#HHDžDžDž HHH!H5(HHHHHDžc#HHDžDžDž HHbH:H5(H}HH>HsHDžd#HHDžDžDž HHHH5HHHHHDže#H HDžDžDž HHhH5H5'HHHDHyHDžf#HHDžDžDž HHHH5HHHHHHDžg#DžDž HHHH}HHDžh#HHDžDžDž HH$H!H5&H?HHH5HDži#HIHDžDžDž HHH:H5f&HHHHHDžj#HHDžDžDž HH*HH5cHEHHH;HDžk#HOHDžDžDž HHH5H5%HHHHHDžl#HHDžDžDž HH0HH5HKHH HAHDžm#DžDž HHHHHHDžn#H HDžDžDž HHiH!H5$HHHEHzHDžo#HHDžDžDž HHH8H5K$HHHHHDžp#HHDžDžDž HHoHH5HHHKHHDžq#HHDžDžDž HHH3H5#H HHHHDžr#HHDžDžDž HHuHH5HHHQHHDžs#DžDž HHHHH<HDžt#HPHDžDžDž HHHH5x"HHHHHDžu#HHDžDžDž HH1HH5"HLHH HBHDžv#HVHDžDžDž HHH,H5!HHHHHDžw#HHDžDžDž HH7HH5pHRHHHHHDžx#H\HDžDžDž HHH+H5 HHHHHDžy#HHDžDžDž HH=HH5 HXHHHNHDžz#DžDž HHHHHHDž{#HHDžDžDž HHvHH5HHHRHHDž|#DžDž HHHHH=HDž}#HQHDžDžDž HHHHH5HHHHHDž~#DžDž HHJHHAHvHDž#HHDžDžDž HHHH5:HHHHHDž#DžDž HHHHzHHDž#HHDžDžDž HH!H*H5H<HHH2HDž#HFHDžDžDž HHHH5 HHHHHDž#DžDž HH?HH63H]HDž#H HDž DžDž HHH.H5nHHDžHDžHDžHDžHEHHDžH H\HHHHH tHUHMHHH:HHH*HDž#HHDž DžDž HHH,H5kHLC0H{8HCPLKXHL9/H4:HHHHHHLHLtH̉MHMHHHSHHCH5HDž#H HDž DžDž HHH,H5HHDžHDžHDžHDžHEHHDžHHtHH(HHH HH tHUHMHHHHHHHDž#H HDž DžDž HHdH)H5HH;HKHC LC(L9H4Hk\HHP6tH݉UHMHHH0HHH HDž#DžDž HHHHHHDž#HHDžDžDž HHHHH5HcHH$HYHDž#DžDž HHHHHHDž#H#HDžDžDž HHH;H5HHH]HHDž#HHDžDžDž HHH7H5HHHHHDž#H)HDžDžDž HHH<H5^HHHcHHDž#HHDžDžDž HH H6H5!H%HHHHDž#DžDž HHHHHHDž#HHDžDžDž HHCHH5H^HHHTHDž#DžDž HHHHHHDž#HHDžDžDž HHnHHH5HHHJHHDž#DžDž HH HHH5HDž#HIHDžDžDž HHHH5HHHHHDž#DžDž HHBHH9HnHDž#HHDžDžDž HHH,H5GHHHHHDž#HHDžDžDž HHcHH5H~HH?HtHDž#DžDž HHHHH*HDž#H>HDžDžDž HHHH5/HHHxHHDž#HHDžDžDž HHH/H5H:HHH0HDž#DžDž HHHHHHDž#HHDžDžDž HHXH.H57HsHH4 >H[HDž#HoHDžDžDž HHH1H5HHHHHDž#HHDžDžDž HHPHAH5HkHH,HaHDž#DžDž HHHHHHDž#H+HDžDžDž HHHAH5HHHeHHDž#HHDžDžDž HH HAH5H'HHHHDž#DžDž HHHHHHDž#HHDžDžDž HHEHH5H`HH!HVHDž#HjHDžDžDž HHHH5HHHHHDž#HHDžDžDž HHKH2H5jHfHH'H\HDž#DžDž HHHHHHDž#H&HDžDžDž HHHH5HHH`HHDž#HHDžDžDž HHHH5dH"HHHHDž#DžDž HHHHHHDž#HHDžDžDž HH@HH5 H[HHHQHDž#HeHDžDžDž HHH0H52 HHHHHDž#DžDž HH^HHUHHDž#HHDžDžDž HHH/H5 HHH\>HHDž#HHDžDžDž HHqH2H5@ HHHMHHDž#HHDžDžDž HHHBH5 HHHHHDž#DžDž HHHHHHDž#HHDžDžDž HH-HBH5| HHHH H>HDž#HRHDžDžDž HHHBH5G HHHHHDž#DžDž HHKHHBHwHDž#HHDžDžDž HHHH5)HHHHHDž#HHDžDžDž HHlHH5HHHHH}HDž#HHDžDžDž HHH3H5 H HHHHDž#DžDž HHHHHHDž#HHDžDžDž HH(HH5hHCHHH9HDž#HMHDžDžDž HHHH5HHHHHDž#DžDž HHFHH=HrHDž#HHDžDžDž HHHH5HHHHHDž#H HDžDžDž HHgH3H5HHHCHxHDž#DžDž HHHHH.HDž#HBHDžDžDž HHH2H5HHH|>HHDž#HHDžDžDž HHH5H5H0HHH&HDž#H:HDžDžDž HHHEH5oHHHtHHDž#DžDž HH3HH*H_HDž#HsHDžDžDž HHHEH5HHHHHDž#HHDžDžDž HHTHEH5HoHH0HeHDž#DžDž HHHHHHDž#H/HDžDžDž HHHH5HHHiHHDž#HHDžDžDž HHHH5IH+HHH!HDž#H5HDžDžDž HHH6H5BHHHoHHDž#DžDž HH.HH%HZHDž#HnHDžDžDž HHHH5 HHHHHDž#HHDžDžDž HHOHH5HjHH+H`HDž#DžDž HHHHHHDž#H*HDžDžDž HHHHH5HHHdHHDž#DžDž HH#HHHOHDž#HcHDžDžDž HHHH5HHHHHDž#DžDž HH\HHSHHDž#HHDžDžDž HHH*H5HHHH HDž#HHDžDžDž HH}HH5HHHYHHDž#DžDž HHHHHDHDž#HXHDžDžDž HHHH5HHHHHDž#HHDžDžDž HH9H,H5HTHHHJHDž#DžDž HHHHHHDž#HHDžDžDž HHrH-H5HHHNHK0$HcHC8HHHHHHHHHLHIHDž#H]HDžDžDž HHH0H5bHHHHHDž#HHDžDžDž HH>H>H5HYHHHOHDž#DžDž HHHHHHDž#HHDžDžDž HHwH6H5HHHSHHDž#HHDžDžDž HHH8H5IHHHH HDž#DžDž HHHHHHDž#HHDžDžDž HH3H:H5HNHHHDHDž#HXHDžDžDž HHH8H5}HHHHHDž#DžDž HHQHHHH}HDž$HHDžDžDž HHHH5/H HHHHDž$HHDžDžDž HHrHH5HHHNHHDž$HHDžDžDž HHH/H5HHHHHDž$DžDž HHHHHHDž$HHDžDžDž HH.HH5nHIHH H?HDž$HSHDžDžDž HHHH5HHHHHDž$DžDž HHLHHCHxHDž $HHDžDžDž HHHH5HHHHHDž $HHDžDžDž HHmH-H5HHHIH~HDž $DžDž HHHHH4HDž $HHHDžDžDž HHH.H5HHHHK0\HcHC8HHHHHHHHHLH}HDž$HHDžDžDž HHH1H5H HHHHDž$HHDžDžDž HHrH?H5QHHHNHHDž$DžDž HH HHH9HDž$HMHDžDžDž HHH7H5HHHHHDž$HHDžDžDž HH.H9H5HIHH H?HDž$DžDž HHHHHHDž$H HDžDžDž HHgH;H5HHHCHxHDž$HHDžDžDž HHH9H5HHHHHDž$DžDž HHHH|HHDž$HHDžDžDž HH#HH5cH>HHH4HDž$HHHDžDžDž HHHH5HHHHHDž$HHDžDžDž HH)H0H5@HDHHH:HDž$DžDž HHĿHH軿HHDž$HHDžDžDž HHbHH5H}HH>HsHDž$HHDžDžDž HHHH5BHHHHHDž $DžDž HH耾HHwHHDž!$HHDžDžDž HHHH5eH9HHH/HDž"$HCHDžDžDž HH衽H+H5H輽HH}HHDž#$DžDž HH<HH3HhHDž$$H|HDžDžDž HHڼH,H5iHHH趼HK0HcHC8HHHHHHHHHLHHDž'$HHDžDžDž HH#H/H5H>HHH4HDž($HHHDžDžDž HH覻H=H5HHH肻HHDž)$DžDž HHAHH8HmHDž*$HHDžDžDž HHߺH5H5HHH軺HHDž+$HHDžDžDž HHbH7H5H}HH>HsHDž,$DžDž HHHHH)HDž-$H=HDžDžDž HH蛹H9H5:H趹HHwHHDž.$HHDžDžDž HHH7H5H9HHH/HDž/$DžDž HH蹸HH谸HHDž2$HHDžDžDž HHWHH5HrHH3HhHDž3$H|HDžDžDž HHڷHH5HHH趷HHDž4$HHDžDžDž HH]H.H5tHxHH9HnHDž5$DžDž HHHHH$HDž6$H8HDžDžDž HH薶HH5H豶HHrHHDž7$HHDžDžDž HHHH5vH4HHH*HDž8$DžDž HH贵HH諵HHDž9$HHDžDžDž HHRHH5HmHH.HcHDž:$HwHDžDžDž HHմH,H54HHH豴HHDž;$DžDž HHpHHgHHDž<$HHDžDžDž HHH-H5H)HHHK0̺HcHC8HHHHHHHHHLHHDž?$HHDžDžDž HHWH0H5HrHH3HhHDž@$H|HDžDžDž HHڲH>H5HHH趲HHDžA$DžDž HHuHHlHHDžB$HHDžDžDž HHH6H5BH.HHH$HDžC$H8HDžDžDž HH薱H8H5H豱HHrHHDžD$DžDž HH1HH(H]HDžE$HqHDžDžDž HHϰH:H5nHHH諰HHDžF$HHDžDžDž HHRH8H51HmHH.HcHDžG$DžDž HHHHHHDžJ$H-HDžDžDž HH苯HH5H覯HHgHHDžK$HHDžDžDž HHHH5GH)HHHHDžL$H3HDžDžDž HH葮H/H5H謮HHmHHDžM$DžDž HH,HH#HXHDžN$HlHDžDžDž HHʭHH5 HHH覭HۯHDžO$HHDžDžDž HHMHH5HhHH)H^HDžP$DžDž HHHH߬2HHDžS$HHDžDžDž HHxHHH5H蓬HHTHHDžT$DžDž HHHH H?HDžU$HSHDžDžDž HH豫HH5H̫HH荫H­HDžV$DžDž HHLHHCHxHDžW$HHDžDžDž HHH*H5IHHHƪHHDžX$HHDžDžDž HHmHH5ӹH航HHIH~HDžY$DžDž HHHHH4HDž[$HHHDžDžDž HH覩HH5/HHH肩HHDž\$H˭HDžDžDž HH)H,H5HDHHH:HDž]$DžDž HHĨHH軨HHDž`$HHDžDžDž HHTH/H5+HoHH0HeHDža$HyHDžDžDž HHקH2H5HHH賧HHDžb$HHDžDžDž HHZHEH5HuHH6HkHDžc$DžDž HHHHH!HDžf$H5HDžDžDž HH蓦HH5ӹH讦HHoHHDžg$HHDžDžDž HHHH5OH1HHH'HDžh$H;HDžDžDž HH虥H/H5 H败HHuHHDži$DžDž HH4HH+H`HDžj$HtHDžDžDž HHҤHH5HHH认HHDžk$HHDžDžDž HHUHH5HpHH1HfHDžl$DžDž HHHHHHDžn$H0HDžDžDž HH莣HH5DH詣HHjHHDžo$HHDžDžDž HHH-H5H,HHH"HDžp$DžDž HH謢HH裢tHʤHDžs$HަHDžDžDž HH<H0H5CHWHHHMHDžt$HaHDžDžDž HH迡H3H5HڡHH蛡HУHDžu$HHDžDžDž HHBHFH5H]HHHSHDžv$DžDž HHݠHHԠH HDžy$HHDžDžDž HH{HH5H薠HHWHHDžz$HHDžDžDž HHHH57HHHڟHHDž{$H#HDžDžDž HH聟H0H58H蜟HH]HHDž|$DžDž HHHHHHHDž}$H\HDžDžDž HH躞HH5H՞HH薞HˠHDž~$HߢHDžDžDž HH=HH5HXHHHNHDž$DžDž HH؝HHϝHHDž$HHDžDžDž HHvHH5]H葝HHRHHDž$HHDžDžDž HHH+H5HHH՜H HDž$DžDž HH蔜HH苜(HHDž$HƠHDžDžDž HH$H.H5SH?HHH5HDž$HIHDžDžDž HH觛H1H5H›HH胛HHDž$H̟HDžDžDž HH*HDH5HEHHH;HDž$DžDž HHŚHH輚HHDž$HHDžDžDž HHcHH5H~HH?HtHDž$HHDžDžDž HHHH5HHH™HHDž$H HDžDžDž HHiH.H5HH脙HHEHzHDž$DžDž HHHHH0HDž$HDHDžDžDž HH袘HH5H轘HH~HHDž$HǜHDžDžDž HH%HH5H@HHH6HDž$DžDž HHHH跗HHDž$HHDžDžDž HH^HH5kHyHH:HoHDž$HHDžDžDž HHH,H5HHH轖HHDž$DžDž HH|HHsHHDž$HHDžDžDž HH H/H5cH'HHHHDž$H1HDžDžDž HH菕H2H5H誕HHkHHDž$HHDžDžDž HHHEH5H-HHH#HDž$DžDž HH譔HH褔HٖHDž$HHDžDžDž HHKHH5HfHH'H\HDž$HpHDžDžDž HHΓHH5HHH誓HߕHDž$HHDžDžDž HHQH/H5XHlHH-HbHDž$DžDž HHHHHHDž$H,HDžDžDž HH芒HH5ʥH襒HHfHHDž$HHDžDžDž HH HH5jH(HHHHDž$DžDž HH訑HH蟑HԓHDž$HHDžDžDž HHFHHH5HaHH"HWHDž$DžDž HHHHؐH HDž$H!HDžDžDž HHHH5H蚐HH[HHDž$DžDž HHHHHFHDž$HZHDžDžDž HH踏H'H5HӏHH蔏HɑHDž$HݓHDžDžDž HH;HH5HVHHHLHDž$DžDž HH֎HH͎HHDž$HHDžDžDž HHtHH5H菎HHPHHDž$HHDžDžDž HHH+H5HHHӍHHDž$DžDž HH蒍HH艍HHDž$HґHDžDžDž HH0H/H5HKHH HHcHCHHk\HHPS HHDž$H-HDžDžDž HH苌H2H5zH覌HHgHHDž$HHDžDžDž HHHBH55H)HHHHDž$DžDž HH詋HH蠋HՍHDž$HHDžDžDž HHGH:H5HbHH#HXHDž$HlHDžDžDž HHʊH:H5yHHH覊HیHDž$HHDžDžDž HHMHLH5<HhHH)H^HDž$DžDž HHHH߉HHDž$H(HDžDžDž HH膉HHH5H衉HHbHHDž$HHDžDžDž HH HHH5H$HHHHDž$DžDž HH褈HH蛈HЊHDž$HHDžDžDž HHBH<H5H]HHHSHDž$DžDž HH݇HHԇH HDž$HHDžDžDž HH{H>H5H薇HHWHHDž$HHDžDžDž HHH<H5MHHHچHHDž$DžDž HH虆HH萆HňHDž$HيHDžDžDž HH7HBH5HRHHHHHDž$H\HDžDžDž HH躅HBH5HՅHH薅HˇHDž$DžDž HHUHHLHHDž$HHDžDžDž HHH@H5HHHτHHDž$HHDžDžDž HHvHDH5H葄HHRHHDž$DžDž HHHHH=HDž$HQHDžDžDž HH诃HNH5VHʃHH苃HHDž$HԇHDžDžDž HH2HDH5)HMHHHCHDž$HWHDžDžDž HH赂H@H5HЂHH葂HƄHDž$DžDž HHPHHGH|HDž$HHDžDžDž HHHH5.H HHʁHHDž$HHDžDžDž HHqHH5H茁HHMHHDž$HHDžDžDž HHH.H5sHHHЀHHDž$DžDž HH菀HH膀HHDž$HτHDžDžDž HH-HH5mHHHH H>HDž$HRHDžDžDž HHHH5 HHHHHDž$DžDž HHKHHBHwHDž$HHDžDžDž HH~HH5HHH~HHDž$HHDžDžDž HHl~H+H53H~HHH~H}HDž$DžDž HH~HH}H3HDž$HGHDžDžDž HH}H/H5H}HH}HxHcHCHHk\HHPS HHDž$HHDžDžDž HH}H2H5'H}HH|HHDž$H%HDžDžDž HH|HBH5H|HH_|H~HDž$DžDž HH|HH|HJ~HDž$H^HDžDžDž HH{H:H5cH{HH{H}HDž$HHDžDžDž HH?{H:H5&HZ{HH{HP}HDž$HdHDžDžDž HHzHLH5HzHHzH|HDž$DžDž HH]zHHTzH|HDž$H~HDžDžDž HHyHHH5rHzHHyH |HDž$H ~HDžDžDž HH~yHHH5=HyHHZyH{HDž$DžDž HHyHHyHE{HDž$HY}HDžDžDž HHxH<H5HxHHxHzHDž$DžDž HHRxHHIxH~zHDž$H|HDžDžDž HHwH>H57H xHHwHzHDž$H|HDžDžDž HHswH<H5HwHHOwHyHDž$DžDž HHwHHwH:yHDž$HN{HDžDžDž HHvHBH5sHvHHvHxHDž$HzHDžDžDž HH/vHBH5>HJvHH vH@xHDž$DžDž HHuHHuHwHDž$H zHDžDžDž HHhuH@H5HuHHDuHywHDž$HyHDžDžDž HHtHDH5HuHHtHvHDž$DžDž HHtHH}tHvHDž$HxHDžDžDž HH$tHNH5H?tHHtH5vHDž$HIxHDžDžDž HHsHDH5ֺHsHHsHuHDž$HwHDžDžDž HH*sH@H5HEsHHsH;uHDž$DžDž HHrHHrHtHDž$HwHDžDžDž HHcrHH5H~rHH?rHttHDž$HvHDžDžDž HHqHH5HrHHqHsHDž$H vHDžDžDž HHiqH.H5 HqHHEqHzsHDž$DžDž HHqHHpH0sHDž$HDuHDžDžDž HHpHH5HpHH~pHrHDž$HtHDžDžDž HH%pHH5H@pHHpH6rHDž$DžDž HHoHHoHqHDž%HtHDžDžDž HH^oHH5CHyoHH:oHoqHDž%HsHDžDžDž HHnH)H5HnHHnHpHDž%DžDž HH|nHHsnHpHDž%HrHDžDžDž HHnH-H5IH5nHHmHtHcHCHHk\HHPS HpHDž%HrHDžDžDž HHumH0H5ԵHmHHQmHoHDž%HqHDžDžDž HHlH@H5HmHHlH oHDž%DžDž HHlHHlHnHDž %HpHDžDžDž HH1lH8H5HLlHH lHBnHDž %HVpHDžDžDž HHkH8H5HkHHkHmHDž %DžDž HHOkHHFkH{mHDž %HoHDžDžDž HHjHFH5,HkHHjHlHDž %HoHDžDžDž HHpjHFH5HjHHLjHlHDž%HnHDžDžDž HHiHJH5³HjHHiHlHDž%DžDž HHiHHiHkHDž%HmHDžDžDž HH,iH:H5KHGiHHiH=kHDž%DžDž HHhHHhHjHDž%HmHDžDžDž HHehH<H5IJHhHHAhHvjHDž%HlHDžDžDž HHgH:H5HhHHgHiHDž%DžDž HHgHHzgHiHDž%HkHDžDžDž HH!gH@H5HH5<HeHHeHgHDž%HjHDžDžDž HH`eHBH5H{eHHH5HcHH{cHeHDž %DžDž HH:cHH1cHfeHDž!%HzgHDžDžDž HHbHH5vHbHHbHdHDž"%HfHDžDžDž HH[bHH5zHvbHH7bHldHDž#%HfHDžDžDž HHaH,H5HaHHaHcHDž$%DžDž HHyaHHpaHcHDž%%HeHDžDžDž HHaHH5WtH2aHH`H(cHDž&%H%H|]HDžDžDž HHXHOH5AHXHHXHZHDžA%DžDž HHuXHHlXHZHDžB%H\HDžDžDž HHXHH5SkH.XHHWH$ZHDžC%H8\HDžDžDž HHWHH5oHWHHrWHYHDžD%H[HDžDžDž HHWH1H5ХH4WHHVH*YHDžE%DžDž HHVHHVHXHDžF%HZHDžDžDž HHRVHH5iHmVHH.VHcXHDžG%HwZHDžDžDž HHUHH52iHUHHUHWHDžH%DžDž HHpUHHgUHWHDžI%HYHDžDžDž HHUHH5H)UHHTHWHDžJ%H3YHDžDžDž HHTH.H5HTHHmTHVHDžK%DžDž HH,THH#THXVHDžL%HlXHDžDžDž HHSH/H5HSHHSHZHcHCHHk\HHPHUHDžO%HWHDžDžDž HH%SH2H5LH@SHHSH6UHDžQ%HJWHDžDžDž HHRHWH5ǡHRHHRHTHDžR%DžDž HHCRHH:RHoTHDžT%HVHDžDžDž HHQHUH5XHQHHQHSHDžV%HVHDžDžDž HHdQHOH53HQHH@QHuSHDžX%HUHDžDžDž HHPHOH5HQHHPHRHDž[%DžDž HHPHHyPHRHDž\%HTHDžDžDž HH PHH5`cH;PHHOH1RHDž]%HETHDžDžDž HHOHH5gHOHHOHQHDž^%HSHDžDžDž HH&OH1H5HAOHHOH7QHDž_%DžDž HHNHHNHPHDž`%HSHDžDžDž HH_NHH5aHzNHH;NHpPHDža%HRHDžDžDž HHMHH5?aHMHHMHOHDžb%DžDž HH}MHHtMHOHDžc%HQHDžDžDž HHMHH5H6MHHLH,OHDžd%H@QHDžDžDž HHLH,H5EHLHHzLHNHDže%DžDž HH9LHH0LHeNHDžf%HyPHDžDžDž HHKH-H5HKHHKHRHcHCHHk\HHPHMHDži%HOHDžDžDž HH2KH0H5HMKHHKHCMHDžk%HWOHDžDžDž HHJHUH5HJHHJHLHDžl%DžDž HHPJHHGJH|LHDžn%HNHDžDžDž HHIHSH5H JHHIHKHDžp%HNHDžDžDž HHqIHMH5HIHHMIHKHDžr%HMHDžDžDž HHHHMH5˚HIHHHHKHDžu%DžDž HHHHHHHJHDžv%HLHDžDžDž HH-HHH5m[HHHHH HH>JHDžw%HRLHDžDžDž HHGHH5_HGHHGHIHDžx%HKHDžDžDž HH3GH/H5ZHNGHHGHDIHDžy%DžDž HHFHHFHHHDžz%HKHDžDžDž HHlFHH5YHFHHHFH}HHDž{%HJHDžDžDž HHEHH5LYH FHHEHHHDž|%DžDž HHEHHEHGHDž}%HIHDžDžDž HH(EHVH5HCEHHEH9GHDž~%DžDž HHDHHDHFHDž%HIHDžDžDž HHaDHHH5HH|DHH=DHrFHDž%DžDž HHCHHCH(FHDž%HtH8AHDžHLCHDžDžDžHH>HH5ґH>HH>"H=Α{>H@HDžHBHDžDžDž HH>HH5H7>HH=H-@HDžHABHDžDžDž HH=H7H5H=HH{=$A A H5?H=?<HL ~?A H g? Hƿ<HHHHPH@H)?HDžH=AHDžDžDž HH<HHHIAH ? Hƿ;HHHH|<HH=<Hr>HDžH@HDžDžDž HH;HH5H;HH;HHtH tH=HDžH?HDžDžDž HHF;H!H5Ha;HH";"H=j;tyH<=HDžHP?HDžDžDž HH:HH5H:HH:}H<HDžH>HDžDžDž HH/:HH5:HJ:HH :U<EH<E;<E.<E܋!<E؋<Eԋ<EE}kEHcH;A<w;EHcH; EHcH; }EtH|;H= I8H;HDžH=HDžDžDž HHx8H&H5H8HHT8IH H5:P7:Fort:ran f:95: ~: x: r: l: f: `: Z: T: N: H: B: <: 6: 0: *: $: f: H9HDžH;HDžDžDž HH6H&H5>H7HH6HH H529P"6]9Fort9ran f 9909 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 f8 H8HDž H:HDžDžDž HHv5H(H5H5HHR5FH H57P47Fort7ran 720037 }7 w7 q7 k7 e7 _7 Y7 S7 M7 G7 A7 ;7 57 /7 )7 #7 H6HDžH8HDžDžDž HH3H(H5H4HH3 EH H586P(3c6Fort6ran 62008 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 H5HDž.H&7HDžDžDž HH2HHH 4H2 HHHDH2IH IAH  L1~HHtH;2.HHHDH%2HËP .L A!LHމ1LHtH1P.HHH1HHtH1HHX1"H=M1E}nEHcH4A<w;EHcH3 EHcH3 }EtH3H=mAL0!H2HDžRH4HDžDžDž HH80HH5(HS0HH0JAEH:2HDžZHN4HDžDžDž HH/HH5H/HH/@H1HDžbH3HDžDžDž HH /HH5<H;/HH.2@-H51.H 1HDžoH3HDžDžDž HH{.HHH H1H}.HHHDH.IHIAH XL-~HHtH2.AHHHDH.HËPAL A0LHމ-LHtH-PAHHH-HHtH-HHO-"H=D-Hs/HDžwH1HDžDžDž HH,HH5\H-HH,=tH.HDžH0HDžDžDž HH],H&H5Hx,HH9,}Hl.HDžH0HDžDžDž HH+H.H5H+HH+HI¸7|2t <<HDž@)HDžP<HHXHDžH<HHcHt-HHH?HHtHHH 0 0 H9t 0 <tHHHHHHHÉȅtDžH0Hu2HDžHHDH*Hu DžIH0Hw*HDžHHDHb*Hu DžDžH0HDž8ttH+HDžH.HDžDžDž HHp)H,H5_H)HHL)"H=|A)HbyteHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 Dž*DžDžDžH0Z/HcH8HHHHHHHHHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHPPHshor@tHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: Dž)DžDžDžH0-HcH8HHHHHHHHHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHPPHfin@tHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< Dž=(DžDžDžH0,HcH8HHHHHHHHHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHPPHlongHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 Dž&DžDžDžH0D+HcH8HHHHHHHHHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHPP*tHI¸L0r*HcH8HH=%#HHHHHHLH@L0/*HcH8HH=%"HHHHHHLH@L0)HcH8HH=G%"HHHHHHLH@L0)HcH8HH=%I"HHHHHHLH@H0V)HcH8HH0<)HcH8HHHHHHHHH@H0(HcH8HHHHHHHHH@8L0(HcH8HHHHHHHLH@9t }tHHHHHHHHLH0\(HcH8HH0B(HcH8HHHHHHHHH@H0(HcH8HHHHHHHHH@8L0'HcH8HHHHHHHLH@9t }tHHHHHHHHLH0b'HcH8HH0H'HcH8HHHHHHHHH@H0'HcH8HHHHHHHHH@8L0&HcH8HHHHHHHLH@9t }tHHHHHHHHLH0h&HcH8HH0N&HcH8HHHHHHHHH@~ }tHHHHHHHHLH8!HDžH uHDžH4#HDžDž0Dž HHHH5tHHHnH0A%HcH8HHHHHHHHHLHc HDžH7tHDžH_"HDžDž0Dž HHHH5sHHHH0p$HcH8HHHHHHHHHLHHDžHbsHDžH!HDžDž0Dž HHHH5!sHHHH0#HcH8HHHHHHHHHLHHDžHrHDžH HDžDž0Dž HHHH5RrH.HHH0"HcH8HHHHHHHHHLHHDžHqHDžHHDžDž0Dž HH>HH5qHYHHHOHDžDžDž HHHHL0H8HPLXHL9/H4:HHHHHHLHLtH̉M̃}}HHDžHHDžDžDž HHH"H5epH1HHH0 HcH8HH0 HcH8HHHHHHHHHLtDH0o HcH8HHHHHHHHH@uHHHHHHHHPH0 HcH8HH0HcH8HHHHHHHHHLtDH0HcH8HHHHHHHHH@uHHHHHHHHPH0SHcH8HH09HcH8HHHHHHHHHLtDH0HcH8HHHHHHHHH@uHHHHHHHHPH0HcH8HH0HcH8HHHHHHHHHLtDH0DHcH8HHHHHHHHH@uHHHHHHHHPH3HDž(HmHDžH/HDžDž0Dž HHHH5lHHHiH0<HcH8HHHHHHHHHPH^HDž.H2lHDžHZHDžDž0Dž HHHH5kHHH#H0fHcH8HHHHHHHHHPHHDž4HXkHDžHHDžDž0Dž HHHH5kHHHIH0HcH8HHHHHHHHHPHHDž:H~jHDžHHDžDž0Dž HHHH5CjHHHoH0HcH8HHHHHHHHHPHHDž@HiHDžHHDžDž0Dž HH*HH5miHEHHH6HDžFH iHDžH2HDžDž0Dž HHH'H5iHHHlHHDžJDžDž HH+HH"L0H8HPLXHL9/H4:HHHHHHLHPtH̉M̃}HHDžTHHDžDžDž HHdH+H5hHHH@}~}HjHDžXH~HDžDžDž HHH)H5gHHHt !9~!!HDž)HDž !HH(HDž!HHcHt-HHH?HHtHHH,d! YH9t 0!tHHk\ȅtDžHHu2HDžHHDHHu DžIHHHDžHHDHHu DžDžHHDžttHHDžpH0HDžDžDž HHH)H5eHHHj"H=a_Hsingf@leHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 Dž$DžDžDžDžHuHcHHHk\HHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHHHPPPXHdoubf@leHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 DžCDžDžDžDžH HcHHHk\HHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHHHPPPXHquadHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 DžO DžDžDžDžHHcHHHk\HHHHHPHHPHHPHHP HHP(HHP0HHP8HHP@HHPHHHPPPXtHI¸YHHcHL$H5H= f Ik\HH@HHcHL$H5H= & Ik\HH@HhHcHL$H5JH= Ik\HH@HHcHLHHcHHHk\HH@~_HHcHHHk\HH@HHcHHHk\HH@9t }tIk\HHPHiHcHLHNHcHHHk\HH@~_H#HcHHHk\HH@HHcHHHk\HH@9t }tIk\HHPHHcHH<HHcHHHk\HH@~ }tHk\HHPH HDžHc]HDžH HDžDž0Dž HHHH5!^HHHH HcHHHk\HHPHHDžH\HDžH HDžDž0Dž HH%HH5q]H@HHH HcHHHk\HHPHHDžH[HDžH HDžDž0Dž HHaHH5\H|HH=H8 HcHHHk\HHPHCHDžH[HDžH? HDžDž0Dž HHHH5[HHHyHHDžDžDž HH8HH/H HcHH<H HcHHHk\HHPt3H HcHHHk\HH@uHk\HHTH HcHH<H| HcHHHk\HHPt3HQ HcHHHk\HH@uHk\HHTH HcHH<H HcHHHk\HHPt3H HcHHHk\HH@uHk\HHTHHDžHXHDžHHDžDž0Dž HHHH5|YH8HHHHcHHHk\HHTHHDžHWHDžHHDžDž0Dž HHYHH5XHtHH5'H#HcHHHk\HHTH6HDžH WHDžH2HDžDž0Dž HHHH5WHHHl^HbHcHHHk\HHTHmHDžHAVHDžHiHDžDž0Dž HHHH5!WHHHHHDžHUHDžHHDžDž0Dž HH-H$H5VHHHH H>HDžDžDž HHHHHHcHH<HHcHHHk\HHPt3HdHcHHHk\HH@uHk\HHXH'HcHH<H HcHHHk\HHPt3HHcHHHk\HH@uHk\HHXHHcHH<HHcHHHk\HHPt3H^HcHHHk\HH@uHk\HHXHSHDžH'SHDžHOHDžDž0Dž HHHH5HTHHHHtHcHHHk\HHXHHDžHcRHDžHHDžDž0Dž HHHH55SHHH'HHcHHHk\HHXHHDžHQHDžHHDžDž0Dž HH HH5sRH;HH^HHcHHHk\HHXHHDžHPHDžHHDžDž0Dž HHWHH5QHrHH3HcHDžH7PHDžH_HDžDž0Dž HHH(H5tQHHHHHDž DžDž HHXHHOHHH L(L9H4Hk\HHP6tH݃}H;HDžHOHDžDžDž HHH)H5PHHHHHH L(L9H4Hk\HHT6tH݉Ũ}HmHDžHHDžDžDž HHH'H5OHHH}~}HHDž"HHDžDžDž HHWH%H5OHrHH3HHH L(L9H4Hk\HHX6tH݉Ũ}HHDž*H+HDžDžDž HHH)H5NHHHe}~}HHDž.HHDžDžDž HHH'H5NHHHHHDž@H&HDžDžDž HHH4H5;NHHH`Hasci@iHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: }DžHHLASCI@IHHQHH HfHH~HHHHHdH HHHHHHebcdf@icHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 }DžHHLEBCDf@ICHHRHH fHH~HHHHHHHHHHH HHHiso_@1064@6HH @ @ @ @ @ @ @ @ @$ @( @, @0 f@4 @6 y}cDžHHLISO_@1064@6HHUHH HfH~HHHHHH HHHHHu\u tHHDžlHGHDžHHDžDž0Dž HHHH5JH4HHHHDžrHFHDžH HDžDž0Dž HHhHH5kIHHHD\HkHDžxH?FHDžHgHDžDž0Dž HHHH5HHHH/HHDž~HEHDžHHDžDž0Dž HH"H H52HH=HHH.HDžHEHDžH*HDžDž0Dž HHHH5GHHHdHHDžDžDž HH#HHHOHDžH#DHDžHKHDžDž0Dž HHHH5FHHHctu\tXu`t uH)HDžHBHDžH%HDžDž0Dž HHHH5EHHH_`HHDžHZBHDžHHDžDž0Dž HHHH5DHHH/HHDžHAHDžHHDžDž0Dž HH=H H5MDHXHHHIHDžHAHDžH DHDž Dž0Dž HHHH5CHHHHHDžDžDž HH>HH5tHI¸c) H0HcH8HHHHHHHHHLfHl_byf@teHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 H0HcH8HHHHHHHHH@DžDžHH|HHHHHHHHHHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< DžDžDžHH|HHHHHHHHHHHHHHHHH0HcH8HHHHHHHHHLhHl_shf@or@tHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 H0UHcH8HHHHHHHHH@DžDžHH0HH8HH@HHHHHPHHXHH`HHhHHpxH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< DžDžDžHH0HH8HH@HHHHHPHHXHH`HHhHHpxH0ZHcH8HHHHHHHHHLhHl_in@tHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: H0HcH8HHHHHHHHH@DžDžHHHHHHHHHHHH HHHHHH$,H @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< DžDžDžHHHHHHHHHHHH HHHHHH$,H0HcH8HHHHHHHHHLfHl_lof@ngHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 H0HcH8HHHHHHHHH@DžDžHHHHHHHHHHHHHHHHHH H @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< DžDžDžHHHHHHHHHHHHHHHHHH >Hl_byf@teHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 s}DžDžHH|HHHHHHHHHHHHHHHH*H @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< D}DžDžHH|HHHHHHHHHHHHHHHH@Hl_shf@or@tHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 }DžDžHH0HH8HH@HHHHHPHHXHH`HHhHHpx*H @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< }DžDžHH0HH8HH@HHHHHPHHXHH`HHhHHpx @Hl_in@tHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: }DžDžHHHHHHHHHHHH HHHHHH$,*H @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< \}DžDžHHHHHHHHHHHH HHHHHH$,>Hl_lof@ngHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 }DžDžHHHHHHHHHHHHHHHHHH*H @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< }DžDžHHHHHHHHHHHHHHHHHH~p9tp~p$9tt$~$9t(utu(u tHwHDžHHK*HDžHsHDžDž0Dž HHHH5-HHHHHDžNH)HDžHHDžDž0Dž HH HH5T)H;HHtH#HDžTH(HDžHHDžDž0Dž HH}HH5(HHHY(HHDžZHT(HDžH|HDžDž0Dž HHHH5(HHH/HHDž`H'HDžHHDžDž0Dž HH7HH5z'HRHHHCHDžfH'HDžH?HDžDž0Dž HHHH5)HHHyHHDžjDžDž HH8HH/tuttpux(t$u,tuHHDž|H%HDžHHDžDž0Dž HH"HH5(H=HHHHDžH$HDžHHDžDž0Dž HHqHH5$HHHMxHtHDžHH$HDžHpHDžDž0Dž HHHH5$HHH,HHDžH#HDžHHDžDž0Dž HH+HH5j#HFHH/H.HDžH#HDžH*HDžDž0Dž HHHH5"HHHdHHDžHh"HDžHk%HDž Dž0Dž HHHH5a%HHHHHDžDžDž HHHHtHI¸XlHI¸>HuHDžHHDžDžDž HHH$H5^$HHH HHDžHHDžDžDž HHeHHH 2HgHHHDH{HHIAH #Hމn~HHtHPHHHHHtHHHHHtHIHt5HHDžHHDžDžDž HHHHH HHHHDH,HHIAH b"Hމ~HHtHPHHHHHtHHHK"H=@HoHDžHHDžDžDž HHHpH|H H|HHHDHIHp||IAH D!L|~HpHtH| HHHDHHË|P| L ALHމ{LHtH7|P HHHHHtH HHHHDžHHDžDžDž HH[H`HlH H]lHHHDHqHH`llIAH Hމdl~H`HtHlPHHHHHtHHHHHtHIHst5HHDžHHDžDžDž HH HPH\H 9H\HHHDH"HHP\\IAH XHމ\~HPHtH\PHHHHHtHHHA"H=6HeHDžHyHDžDžDž HHH@HLH HLHHHDHIH@LLIAH :LL~H@HtHL HHHDHxHËLPL L ALHމqLHtH-LP HHHHHtHHHHHDžHHDžDžDž HHRH0HH5 HHH裰HزHDžHHDžDžDž HHJHFH5 HeHH&H[HDžDžDž HHHHܯHHDž H%HDžDžDž HH胯H<H5ڷH螯HH_HHDž!HHDžDžDž HHH H5H!HHHHDž"H+HDžDžDž HH艮H*H5(H褮HHeHHDž#HHDžDžDž HH H>H5۶H'HHHHDž$H1HDžDžDž HH菭H@H5H読HHkHHDž%HHDžDžDž HHHCH5aH-HHH#HDž&H7HDžDžDž HH蕬HGH5,H谬HHqHHDž'DžDž HH0HH'H\HDž(HpHDžDžDž HHΫHHH5=HHH誫H߭HDž)HHDžDžDž HHQHTH5HlHH-HbHDž*DžDž HHHHHHDž+H,HDžDžDž HH芪HHH5H襪HHfHHDž,DžDž HH%HHHQHDž-HeHDžDžDž HHéH=H5HީHH蟩HԫHDž.HHDžDžDž HHFH4H5HaHH"HWHDž/HkHDžDžDž HHɨH9H5XHHH襨HڪHDž0HHDžDžDž HHLHAH5HgHH(H]HDž1HqHDžDžDž HHϧHAH5HHH諧HHDž2HHDžDžDž HHRHGH5HmHH.HcHDž3HwHDžDžDž HHզHAH5|HHH豦HHDž4DžDž HHpHHgHHDž5HHDžDžDž HHHEH5H)HHHHDž6H3HDžDžDž HH葥H:H5H謥HHmHHDž7DžDž HH,HH#HXHDž8HlHDžDžDž HHʤHEH5AHHH覤HۦHDž9HHDžDžDž HHMHDH5 HhHH)H^HDž:HrHDžDžDž HHУH(H5HHH謣HHDž;DžDž HHkHHbHHDž<HHDžDžDž HH HHH58H$HHHHDž=H.HDžDžDž HH茢HGH5H觢HHhHHDž>HHDžDžDž HHHIH5H*HHH HDž?H4HDžDžDž HH蒡HFH5H譡HHnHHDž@HHDžDžDž HHHH5jH0HHH&HDžADžDž HH谠HH觠HܢHDžBHHDžDžDž HHNHEH5HiHH*H_HDžCHsHDžDžDž HHџHBH5HHH譟HHDžDHHDžDžDž HHTHEH5KHoHH0HeHDžEHyHDžDžDž HHמHCH5HHH賞HHDžFHHDžDžDž HHZHEH5HuHH6HkHDžGHHDžDžDž HHݝH4H5HHH蹝HHDžHDžDž HHxHHoHHDžIHHDžDžDž HHHEH5H1HHH'HDžJH;HDžDžDž HH虜H?H5H贜HHuHHDžKDžDž HH4HH+H`HDžLHtHDžDžDž HHқHCH5aHHH讛HHDžMHHDžDžDž HHUHH5'HpHH1HfHDžNDžDž HHHHHHDžOH0HDžDžDž HH莚HHH5H詚HHjHHDžPHHDžDžDž HHHH5H,HHH"HDžQDžDž HH謙HH裙H؛HDžRHHDžDžDž HHJHHH5HeHH&H[HDžSDžDž HHHHܘHHDžTH%HDžDžDž HH胘HH5{H螘HH_HHDžUDžDž HHHHHJHDžVH^HDžDžDž HH輗H H5WHחHH蘗H͙HDžWDžDž HHWHHNHHDžXHHDžDžDž HHH*H5 HHHіHHDžYDžDž HH萖HH臖HHDžZHКHDžDžDž HH.H#H5uHIHH H?HDž[DžDž HHɕHHHHDž\H HDžDžDž HHgH?H5H肕HHCHxHDž]DžDž HHHHH.HDž^HBHDžDžDž HH蠔H;H5OH軔HH|HHDž_HŘHDžDžDž HH#H.H5H>HHH4HDž`HHHDžDžDž HH覓H=H5HHH肓HHDžaH˗HDžDžDž HH)HCH5HDHHH:HDžbDžDž HHĒHH軒HHDžcHHDžDžDž HHbHHH5 H}HH>HsHDždDžDž HHHHH)HDžeH=HDžDžDž HH蛑H5H5H趑HHwHHDžfHHDžDžDž HHH3H5EH9HHH/HDžgHCHDžDžDž HH衐H;H5H輐HH}HHDžhHƔHDžDžDž HH$HBH5H?HHH5HDžiDžDž HH迏HH趏HHDžjHHDžDžDž HH]HFH5DHxHH9HnHDžkHHDžDžDž HHH@H5HHH輎HHDžlDžDž HH{HHrHHDžmHHDžDžDž HHH9H5H4HHH*HDžnH>HDžDžDž HH蜍H=H5KH跍HHxHHDžoHHDžDžDž HHH3H5H:HHH0HDžpDžDž HH躌HH豌HHDžqHHDžDžDž HHXH4H5HsHH4HiHDžrH}HDžDžDž HHۋH:H5:HHH跋HHDžsDžDž HHvHHmHHDžtHHDžDžDž HHH@H5H/HHH%HDžuH9HDžDžDž HH藊HBH5vH貊HHsHHDžvHHDžDžDž HHHAH5AH5HHH+HDžwH?HDžDžDž HH蝉HAH5 H踉HHyHHDžxHHDžDžDž HH HNH5H;HHH1HDžyHEHDžDžDž HH裈HMH5H辈HHHHDžzHȌHDžDžDž HH&HQH5}HAHHH7HDž{DžDž HHHH踇HHDž}HHDžDžDž HH_HH5HzHH;HpHDž~DžDž HHHHH&HDžH:HDžDžDž HH蘆H H53H賆HHtHHDžDžDž HH3HH*H_HDžHsHDžDžDž HHхH#H5HHH譅HHDžDžDž HHlHHcHHDžHHDžDžDž HH H H5H%HHHHDžDžDž HH襄HH蜄HцHDžHHDžDžDž HHCH#H5:H^HHHTHDžDžDž HHރHHՃH HDžHHDžDžDž HH|H H5H藃HHXHHDžDžDž HHHHHCHDžHWHDžDžDž HH赂H@H5HЂHH葂HƄHDžDžDž HHPHHGH|HDžHHDžDžDž HHHDH5MH HHʁHHDžDžDž HH艁HH老HHDžHɅHDžDžDž HH'H!H5HBHHH8HDžDžDž HH€HH蹀HHDžHHDžDžDž HH`H<H5/H{HH<HqHDžDžDž HHHHH'HDžH;HDžDžDž HHH1H5HHHuHHDžHHDžDžDž HHH;H5cH7HH~H-HDžDžDž HH~HH~HHDžHHDžDžDž HHU~H:H5Hp~HH1~HfHDžHzHDžDžDž HH}H;H5H}HH}HHDžDžDž HHs}HHj}HHDžHHDžDžDž HH}H;H5H,}HH|H"HDžH6HDžDžDž HH|H;H5H|HHp|H~HDžHHDžDžDž HH|HAH5H2|HH{H(~HDžDžDž HH{HH{H}HDžHHDžDžDž HHP{HMH5Hk{HH,{Ha}HDžDžDž HHzHHzH}HDžH+HDžDžDž HHzHHH5~HzHHezH|HDžDžDž HH$zHHzHP|HDžHd~HDžDžDž HHyHH5HyHHyH{HDžDžDž HH]yHHTyH{HDžH}HDžDžDž HHxHHH5j}HyHHxH {HDžDžDž HHxHHxHzHDžH|HDžDžDž HH4xHH5iHOxHHxHEzHDžDžDž HHwHHwHyHDžH|HDžDžDž HHmwHHH5{HwHHIwH~yHDžDžDž HHwHHvH4yHDžHH{HDžDžDž HHvH H5HvHHvHxHDžDžDž HHAvHH8vHmxHDžHzHDžDžDž HHuHHH5NzHuHHuHwHDžDžDž HHzuHHquHwHDžHyHDžDžDž HHuH$H5wH3uHHtH)wHDžDžDž HHtHHtHvHDžHxHDžDžDž HHQtH H5HltHH-tHbvHDžDžDž HHsHHsHvHDžH,xHDžDžDž HHsHHH5wHsHHfsHuHDžDžDž HH%sHHsHQuHDžHewHDžDžDž HHrHH5FHrHHrHtHDžDžDž HH^rHHUrHtHDžHvHDžDžDž HHqHH5HrHHqH tHDžDžDž HHqHHqHsHDžHuHDžDžDž HH5qHHH5uHPqHHqHFsHDžDžDž HHpHHpHrHDžHuHDžDžDž HHnpH&H5HpHHJpHrHDžDžDž HH pHHpH5rHDžHItHDžDžDž HHoHH5tHoHHoHqHDžDžDž HHBoHH9oHnqHDžHsHDžDžDž HHnHHH5OsHnHHnHpHDžDžDž HH{nHHrnHpHDžHrHDžDžDž HHnH%H5H4nHHmH*pHDžDžDž HHmHHmHoHDžHqHDžDžDž HHRmHHH5qHmmHH.mHcoHDžDžDž HHlHHlHoHDžH-qHDžDžDž HHlH)H5HlHHglHnHDžDžDž HH&lHHlHRnHDžHfpHDžDžDž HHkHJH5HkHHkHmHDžHoHDžDžDž HHGkH<H5~wHbkHH#kHXmHDžDžDž HHjHHjHmHDžH"oHDžDžDž HHjHHH5nHjHH\jHlHDžDžDž HHjHHjHGlHDžH[nHDžDžDž HHiHHH58HiHHiHkHDžHmHDžDžDž HHLHDž?DžDž HHIHHIHKHDž@HNHDžDžDž HHfIH&H5 HIHHBIHwKHDžADžDž HHIHHH\HKHDžGHdHDž DžDž HHHH(H5`HHHXHHHHHHOH}HJHDžLHLHDžDžDž HHGH+H5HHHHGHJHDžODžDž HHGHHGHIHDžPHKHDžDžDž HH-GHH5OHHGHH GH>IHDžQDžDž HHFHHFWHHHDžWHJHDžDžDž HHWFHLH5HrFHH3FHhHHDžXDžDž HHEHHE(H HHDžbHaHDž DžDž HH}EH+H5 HEH HHHEHH;E}HnGHDžgHIHDžDžDž HHDH.H5HDHHDHFHDžlDžDž HH{DHHrDHFHDžrHHHDžDžDž HHDHHH5HH4DHHCH*FHDžsDžDž HHCHHCHEHDžtHGHDžDžDž HHRCHH5?HmCHH.CHcEHDžuDžDž HHBHHBHEHDžvH-GHDžDžDž HHBHHH5FHBHHgBHDHDžwDžDž HH&BHHBHRDHDžxHfFHDžDžDž HHAH*H5˷HAHHAHCHDžyDžDž HH_AHHVAHK0,HHcHC8HHHHHHHHHUHWCHDžDžDž HH@HH@H CHDžH!EHDžDžDž HH@H+H5H@HH[@HBHDžDžDž HH@HH@HK0FHcHC8HHHHHHHHHHBHDžDžDž HH?HH?HAHDžHCHDžDžDž HH:?H+H5HU?HH?HKAHDžDžDž HH>HH>HK0EHcHC8HHHHHHHHHˬH@HDžDžDž HHW>HHN>H@HDžHBHDžDžDž HH=H,H5H>HH=H@HDžDžDž HH=HH=HK0iDHcHC8HHHHHHHHH膫H?HDžDžDž HH=HH =D%JNED9eC9EC9EtzC9EtoC9EtdHK0EHcHC8HHHHHHHHHLt1HK0EHcHC8HHHHHHHHH荪D9eEU9 Hk>HDžH@HDžDžDž HH;HHH5L@H;HH;H=HDžDžDž HHx;HHo;H=HDžH?HDžDžDž HH;HH5ٱH1;HH:H'=HDžDžDž HH:HH:H<HDžH>HDžDžDž HHO:HHH5>Hj:HH+:H`<HDžDžDž HH9HH9H<HDžH*>HDžDžDž HH9H*H5gH9HHd9H;HDžDžDž HH#9HH9HA;HDžHTHDž DžDž HH8H(H5¯H8HHHH8HHq8}H:HDžH<HDžDžDž HH8H+H5MH18HH7H':HDžDžDž HH7HH7H9HDžH;HDžDžDž HHO7H+H5Hj7HH+7H`9HDžDžDž HH6HH6tH9HDžHRHDž DžDž HHz6H)H5H6HpHHH}6HH86}Hk8HDžH:HDžDžDž HH5H,H5H5HH5H7HDžDžDž HHx5HHo5H7HDžH9HDžDžDž HH5H)H5 H15HH4H'7HDžDžDž HH4HH4(H6HDžH~PHDž DžDž HHA4H'H5hH\4H$HHHD4HH3}H26HDžHF8HDžDžDž HH3H*H5H3HH3H5HDžDžDž HH?3HH63Hk5HDžH7HDžDžDž HH2H*H5\H2HH2H4HDžDžDž HHx2HHo2H4HDžHENHDž DžDž HH2H(H5H#2HHHH 2HH1}H3HDžH 6HDžDžDž HHk1H+H5BH1HHG1H|3HDžDžDž HH1HH0H23HDžHF5HDžDžDž HH0HHH55H0HH0H2HDžDžDž HH?0HH60Hk2HDžH4HDžDžDž HH/H(H5H/HH/H1HDžDžDž HHx/HHo/H1HDžH3HDžDžDž HH/HHH53H1/HH.H'1HDžDžDž HH.HH.H5HcHCHHk\HHRH0HDžDžDž HHE.HH<.H35HcHCHHk\HHHO0HDžDžDž HH-HH-H4HcHCHHk\HHzD%>ED9ev49EtV49EtK49Et@HEHcHCHHk\HHPtHEHcHCHHk\HHD9eEtHY/HDžDžDž HH,HH,H/HDžH#1HDžDžDž HH,HHH50H,HH],H.HDžDžDž HH,HH,HH.HDž H\0HDžDžDž HH+H8H5H+HH+H-HDž!H/HDžDžDž HH=+H8H5HX+HH+HN-HDž"Hb/HDžDžDž HH*H7H5_H*HH*H,HDž#H.HDžDžDž HHC*HH5H^*HH*HT,HDž$DžDž HH)HH)H ,HDž%H.HDžDžDž HH|)HHH5-H)HHX)H+HDž&DžDž HH)HH)HC+HDž'HW-HDžDžDž HH(H$H5H(HH(H*HDž(DžDž HHP(HHG(H|*HDž)H,HDžDžDž HH'HHH5],H (HH'H)HDž*DžDž HH'HH'8uH)HDž0H+HDžDžDž HH'H H57H3'HH&H))HDž1DžDž HH&HH&H(HDž2HBHDž DžDž HHQ&H4H5Hl&HH5}7HW&HH&HG(HDž3DžDž HH%HH%H'HDž4H*HDžDžDž HHo%H"H5H%HHK%H'HDž5DžDž HH %HH%H6'HDž6H@HDž DžDž HH$H6H5GH$HH55H$HHi$H&HDž7DžDž HH($HH$HT&HDž8Hh(HDžDžDž HH#HH5H#HH#H%HDž9DžDž HHa#HHX#H%HDž=HEHDžDžHH"HH5W4H-#HH"HE64H%HDžAH>HDž DžDž HH"H@H5|H"HH53H"HHF"H{$HDžBDžDž HH"HH!H1$HDžFHE&HDžDžDž HH!HIH5ڜH!HH!H#HDžGDžDž HH>!HH5!HH Hƿ IHB#HDžJHV%HDžDžDž HH H:H5;H HH H"HDžKDžDž HHO HHF H{"HDžLH$HDžDžDž HHH;H5H HHDH!HDžNH $HDžDžDž HHkH;H5rHHHGH|!HDžODžDž HHHHH2!HDžPHF#HDžDžDž HHH:H5HHHH HDžSDžDž HH?HH6Hk HDžTH"HDžDžDž HHH9H5dHHHHHDžUDžDž HHxHHoIHHDžZH!HDžDžDž HHH4H5ϙH#HHHHDž[DžDž HHHHHHDž\H HDžDžDž HHAH8H5@H\HHDHMHDžaHa HDžDžDž HHH5H5HHHHHDžbDžDž HHZHHQHHDžcHHDžDžDž HHH7H5gHHHH HDžeDžDž HHHH+RHHDžjDžDž HH:HH1HfHDžkHzHDžDžDž HHHHH5GHHHHHDžlDžDž HHsHHjHHDžmHHDžDžDž HHH.H5H,HHH"HDžnDžDž HHHHHHDžoH4HDž DžDž HHJH*H5!HeHH5n'HPHH H@HDžpDžDž HHHHHHDžqH HDžDžDž HHhH/H5oHHHDHyHDžrDžDž HHHHH/HDžsH2HDž DžDž HHH+H5ؔHHH5%HHHbHHDžtDžDž HH!HHHMHDžuHaHDžDžDž HHHFH5&HHHHHDžvDžDž HHZHHQ$HxHDž{HHDžDžDž HHH6H5HHHHHDžH0HDž DžDž HHhH*H5OHHH5#HnHH)H^HDžDžDž HHHH%HHDžHHDžDžDž HHwHHH5HHHSHHDžDžDž HHHH H>HDžHRHDžDžDž HHH/H5ǑHHHHHDžDžDž HHKHHBHwHDžHHDžDžDž HHHH5/HHHHHDžDžDž HHHH{HHDžH_-HDž DžDž HH"H"H5yH=HHHH%HHHHDžDžDž HHHHHHDžHHDžDžDž HH=HH5HXHHHNHDžDžDž HHHHHHDžH+HDž DžDž HHvH"H5HHHHHyHH4HiHDžDžDž HHHHHHDžH3HDžDžDž HHHHH5HHHmHHDžDžDž HH,HH#HXHDžHlHDžDžDž HH H'H5H HH HHDžDžDž HHe HH\ HHDžHHDžDžDž HH HHpH|HѺH |=HHHDH IHp||=IAH =L |~HpHtH |>HHHDH Iċ|P=|>L ALL LHtHV |P>HLH# LHtH+ HH H HDžDžDž HH HH H HDžHHDžDžDž HH1 HHH5HL HH HB HDžDžDž HH HH H HDžH HDžDžDž HHj HCH5H HHF H{ HDžDžDž HH HH H1 HDžH%HDž DžDž HH H+H5 H HHHH HHa H HDžDžDž HH HH HL HDžH$HDž DžDž HHH+H5UHHHHHHH|H HDžDžDž HH;HH2Hg HDžH{ HDžDžDž HHH5H5HHHH HDžDžDž HHtHHktH HDžH HDžDžDž HHH3H5H#HH}H HDžH+ HDžDžDž HHH4H5HHHeHHDžDžDž HH$HHHPHDžHd HDžDžDž HHHHH51 HHHHHDžDžDž HH]HHTHHDžH HDžDžDž HHH+H5jHHHH HDžDžDž HHHHtHHDžHHDžDžDž HH*H4H5ɅHEHH}H9HDžHMHDžDžDž HHH5H5HHHHHDžDžDž HHFHH=HrHDžHHDžDžDž HHH.H5HHHHHDžDžDž HHHHvtHHDžHHDžDžDž HHH5H5RH.HH}H"HDžH6HDžDžDž HHH6H5 HHHpHHDžDžDž HH/HH&C|tHTHDžHhHDžDžDž HHH5H5uHHH}HHDžHHDžDžDž HHGH6H5.HbHH#HXHDžDžDž HHHHHHDžH"HDžDžDž HHHHH5HHH\HHDžDžDž HHHHHGHDžH[HDžDžDž HHH3H5؁HHHHHDžDžDž HHTHHKHHDžH/HDž DžDž HHH(H5IH HKxHHHHHHHDžDžDž HHrHHiHHDžHHDžDžDž HHHMH5H+HHH!HDžDžDž HHHHHHDžHHDž DžDž HHIH5H5HdHHHHLHHH<HDžDžDž HHHHHHDžHHDžDžDž HHdHHH5HHH@HuHDžDžDž HHHHH+HDžH?HDžDžDž HHH<H5~HHHyHHDžHHDžDžDž HH HCH5g~H;HHH1HDžDžDž HHHHHEغHǸ%HHDžH{HDž DžDž HH>H0H5}HYHMHHHDHHH4HDžDžDž HHHHHHDžHHDžDžDž HH\HHH5HwHH8HmHDžDžDž HHHHH#HDžH7HDžDžDž HHH8H5T|HHHqHHDžHHDžDžDž HHHEH5|H3HHH)HDžDžDž HHHHtHHDžHHDžDžDž HHGH1H5{HbHH#}HVHDž HjHDžDžDž HHH2H5?{HHHHHDž DžDž HHcHHZHHDžHHDžDžDž HHHHH5pHHHHHDžDžDž HHHHHHDžHHDžDžDž HH:H7H5yHUHHHKHDžDžDž HHHHtHHDžH HDžDžDž HHiH1H5PyHHHE}HxHDžHHDžDžDž HHH2H5 yHHHHHDžDžDž HHHH|HHDž#HHDžDžDž HH#HHH5H>HHH4HDž$DžDž HHHHHHDž%HHDžDžDž HH\H!H5]HwHH8HmHDž&DžDž HHHHH#HDž'H7HDžDžDž HHHHH5HHHqHHDž(DžDž HH0HH'H\HDž)HpHDžDžDž HHHAH5%vHHHHHDž*DžDž HHiHH`HHDž+HHDžDžDž HHHDH5uH"HHHHDž,DžDž HHHHHHDž-HHDžDžDž HH@H$H5'uH[HHHQHDž.DžDž HHHHHHDž/HHDžDžDž HHyH(H5tHHHUHHDž0DžDž HHHH H@HDž1HTHDžDžDž HHH=H5sHHHHHDž2DžDž HHMHHDHyHDž3HHDžDžDž HHH(H5bsHHHHHDž4DžDž HHHH}HHDž5HHDžDžDž HH$HCH5rH?HHH5HDž6HIHDžDžDž HHHFH5rHHHHHDž7DžDž HHBHH9HnHDž8HHDžDžDž HHHHH5OHHHHHDž9DžDž HH{HHrHHDž:HHDžDžDž HHH(H5HqH4HHH*HDž;DžDž HHHHHHDž<HHDžDžDž HHRHHH5HmHH.HcHDž=DžDž HHHHHHDž>H-HDžDžDž HHHFH5oHHHgHHDž?DžDž HH&HHS~HGHDžDH[HDžDžDž HHHWH5XoHHH}HHDžFHHDžDžDž HH:HWH51oHUHHHKHDžIDžDž HHHHHHDžJHHDžDžDž HHsHNH5nHHHOHHDžKDžDž HHHHH:HDžLHNHDžDžDž HHHH5InHHH t}HHDžQHHDžDžDž HH%H"H5mH@HH\t}H,HDžWH@HDžDžDž HHH#H5umHHHzt}HHDž]HHDžDžDž HHH&H5mH2HH"t}HHDžgH$HDžDžDž HHH#H5lHHH^tt}HHDžmHHDžDžDž HHH$H5JlHHH(t}HHDžsHHDžDžDž HHtH"H5kHHHPHwHDžyHHDžDžDž HHH#H5kHHH}HHDžH HDžDžDž HHjH"H51kHHHFH5HcHCHHk\HHPt}HWHDžHkHDžDžDž HHH#H5jHHHHHcHCHHk\HHPt}HHDžHHDžDžDž HH(H#H5?jHCHHHHcHCHHk\HHPt}HHDžH)HDžDžDž HHH!H5iHHHcHRHcHCHHk\HHPt}HtHDžHHDžDžDž HHH+H5MiHHHHHcHCHHk\HHPt}HHDžHHDžDžDž HHEH+H5hH`HH!H HcHCHHk\HHPt}H2HDžHFHDžDžDž HHH)H5khHHHHHDžHHDžDžDž HH'H H5hHBHHH8HDžDžDž HHHHHHDžHHDžDžDž HH`HHH5H{HH<HqHDžDžDž HHHHH'HDžH;HDžDžDž HHH#H5fHHHuHHDžDžDž HH4HH+H`HDžHtHDžDžDž HHHHH5AHHHHHDžDžDž HHmHHdHHDžHHDžDžDž HH HH5-eH&HHHHDžDžDž HHHH~HHDžHHDžDžDž HH9HWH5xdHTHH}HHHDžH\HDžDžDž HHHWH5QdHHHHHDžDžDž HHUHHLHHDžHHDžDžDž HHHNH5cHHHHHDžDžDž HHHHHHDžHHDžDžDž HH,H H5icHGHH"t}H%HDžH9HDžDžDž HHHH5bHHHstt}HHDžHHDžDžDž HHHH5bH+HH(t}HHDžH+HDžDžDž HHHH5bHHHeHHDžHHDžDžDž HHHH5aHHH}H HDžH!HDžDžDž HHHH5HaHHH[HHDžHHDžDžDž HHH H5^HHHHHDžDžDž HHHHHHDžHHDžDžDž HH;HHH5HVHHHLHDžDžDž HHHHHHDžHHDžDžDž HHtH'H5[_HHHPHHDžDžDž HHHHH;HDžHOHDžDžDž HHHHH5HHHHHDžDžDž HHHHH?HtHDžHHDžDžDž HHHH5]HHHHHDžDžDž HHHHx~HHDžHHDžDžDž HHHWH5C]H/HH}H#HDžH7HDžDžDž HHHWH5]HHHqHHDžDžDž HH0HH'H\HDžHpHDžDžDž HHHNH5\HHHHHDžDžDž HHiHH`HHDžHHDžDžDž HHHH54\H"HHHK0HcHC8HHHHHHHHHLt}HHDžHHDžDžDž HHTH H5[HoHH0HK0 HcHC8HHHHHHHHHLt}H/HDžHCHDžDžDž HHH!H5[HHH}HK0[HcHC8HHHHHHHHHLt}H|HDžHHDžDžDž HHHH5uZH HHHK0HcHC8HHHHHHHHHLt}HHDžHHDžDžDž HH;H H5YHVHHHLHDžH`HDžDžDž HHH H5UHHHHHDžDžDž HHYHHPHHDžHHDžDžDž HHHHH5fHHHHHDžDžDž HHHHHHDžHHDžDžDž HH0H7H5WHKHH HAHDžDžDž HHHHHHDžH HDžDžDž HHiHHH5HHHEHzHDžDžDž HHHHH0HDžHDHDžDžDž HHH%H5VHHH~HHDžDžDž HH=HH4j~H^HDžHrHDžDžDž HHHWH5UHHH}HHDž!HHDžDžDž HHQHWH5UHlHH-HbHDž$DžDž HHHHHHDž%H,HDžDžDž HHHNH5aUHHHfHHDž&DžDž HH%HHHQHDž(HeHDžDžDž HHHH5THHH t}HHDž-HHDžDžDž HH<HH5oTHWHH\t}HCHDž3HWHDžDžDž HHHH5 THHHt}HHDž9HHDžDžDž HH.H"H5SHIHH HHcHCHHk\HHPt}HHDž?H/HDžDžDž HHH'H5,SHHHiH`HcHCHHk\HHPt}HzHDžEHHDžDžDž HHH'H5RHHHHHcHCHHk\HHPt}HHDžKHHDžDžDž HHKH%H5:RHfHH'H\HDžNHpHDžDžDž HHοH H5KHHH調HHDžODžDž HHiHH`HHDžPHHDžDžDž HHHHH5vH"HHHHDžQDžDž HH袾HH虾HHDžRHHDžDžDž HH@H%H5WPH[HHHQHDžSDžDž HH۽HHҽ~HHDžXHHDžDžDž HHnHWH5OH艽HHJ}H}HDžZHHDžDžDž HHHWH5OH HH˼HHDž]DžDž HH芼HH聼HHDž^HHDžDžDž HH(HNH5OHCHHH9HDž_DžDž HHûHH躻HHDžaHHDžDžDž HHaHH5NH|HH= t}HhHDžfH|HDžDžDž HHںHH5%NHHH趺\t}HHDžlHHDžDžDž HHSHH5MHnHH/t}HZHDžrHnHDžDžDž HH̹H"H5[MHHH訹HHcHCHHk\HHPt}HHDžxHͽHDžDžDž HH+H'H5LHFHHHHcHCHHk\HHPt}HHDž~H,HDžDžDž HH芸H'H5iLH襸HHfHeHcHCHHk\HHPt}HwHDžHHDžDžDž HHH%H5KHHHŷHHDžHHDžDžDž HHlH H5\CH臷HHHH}HDžDžDž HHHHH3HDžHGHDžDžDž HH襶HHH5HHH聶HHDžDžDž HH@HH7HlHDžHHDžDžDž HH޵HH5 JHHH躵HHDžDžDž HHyHHp~HHDžHHDžDžDž HH HWH5[IH'HH}HHDžH/HDžDžDž HH荴HWH54IH訴HHiHHDžDžDž HH(HHHTHDžHhHDžDžDž HHƳHNH5HHHH袳H׵HDžDžDž HHaHHXHHDžHHDžDžDž HHHH5LHHHH۲HʹHcHCHHk\HHPt}HHDžHHDžDžDž HH^H*H5GHyHH:H1HcHCHHk\HHPt}HKHDžH_HDžDžDž HH轱H*H5LGHرHH虱HHcHCHHk\HHPt}HHDžHHDžDžDž HHH(H5FH7HHH-HDžHAHDžDžDž HH蟰H H5<H躰HH{HHDžDžDž HH:HH1HfHDžHzHDžDžDž HHدHHH5GHHH贯HHDžDžDž HHsHHjHHDžHHDžDžDž HHH5H5DH,HHH"HDžH6HDžDžDž HH蔮HH5DH诮HHpHHDžDžDž HH/HH&H[HDžHoHDžDžDž HHͭHHH5<HHH詭HޯHDžDžDž HHhHH_HHDžHHDžDžDž HHH!H5ECH!HHHHDžDžDž HH衬HH蘬HͮHDžHHDžDžDž HH?HNH5BHZHHHPHDžDžDž HHګHHѫHHDžHHDžDžDž HHxHH5-BH蓫HHTHCHcHCHHk\HHPt}HeHDžHyHDžDžDž HHתH(H5AHHH質HHcHCHHk\HHPt}HĬHDžHخHDžDžDž HH6H(H5-AHQHHHHcHCHHk\HHPt}H#HDžH7HDžDžDž HH蕩H&H5@H谩HHqHHDžHHDžDžDž HHH H55H3HHH)HDžDžDž HH賨HH誨`HЪHDžHHDžDžDž HHBHHH5H]HHHSHDžDžDž HHݧHHԧH HDžHHDžDžDž HH{H/H5>H薧HHWHHDžDžDž HHHH HBHDžHVHDžDžDž HH账HHH5#HϦHH萦HŨHDžDžDž HHOHHFH{HDžHHDžDžDž HHHH5c=HHHɥHHDžDžDž HH舥HHHHDžHȩHDžDžDž HH&HNH5<HAHHH7HDžHKHDžDžDž HH詤HNH5<HĤHH腤HHDžDžDž HHDHH;qHaHDžHuHDžDžDž HHӣHHH5BHHH诣HHDžDžDž HHnHHeHHDžHHDžDžDž HH H H5C;H'HHHHDžDžDž HH觢HH螢HӤHDžDžDž HH]HHTHHDžHHDžDžDž HHHNH5R:HHHסH HDžDžDž HH薡HH荡H£HDžH֥HDžDžDž HH4HH59HOHHHHcHCHHk\HHPt}H!HDžH5HDžDžDž HH蓠H#H5J9H讠HHoHfHcHCHHk\HHPt}HHDžHHDžDžDž HHH#H58H HHΟHͦHcHCHHk\HHPt}HߡHDžHHDžDžDž HHQH!H5X8HlHH-HbHDžHvHDžDžDž HHԞH H5*HHH谞HHDžDžDž HHoHHfHHDžHHDžDžDž HH HHH5|H(HHHHDžDžDž HH訝HH蟝HԟHDžHHDžDžDž HHFHH5n6HaHH"HWHDžDžDž HHHH؜H HDžH!HDžDžDž HHHHH5H蚜HH[HHDžDžDž HHHHHFHDžHZHDžDžDž HH踛H]H54HӛHH蔛HɝHDžDžDž HHSHHJHHDžHHDžDžDž HHHHH5`H HH͚HHDžDžDž HH茚HH胚HHDžH̞HDžDžDž HH*HAH53HEHHH;HDžDžDž HHřHH輙HHDžHHDžDžDž HHcHDH5H~HH?HtHDžDžDž HHHHH*HDžH>HDžDžDž HH蜘HHH5 H跘HHxHHDžDžDž HH7HH.HcHDžHwHDžDžDž HH՗HDH51HHH豗HHDž HHDžDžDž HHXHH51HsHH4HiHDž!DžDž HHHHHHDž"H3HDžDžDž HH葖HHH5H謖HHmHHDž#DžDž HH,HH#HXHDž$HlHDžDžDž HHʕHHH50HHH覕HۗHDž%DžDž HHeHH\ t H5/H=/\t H5/H=/t H5/H=/"lHHDžGHHDžDžDž HHdHHH5ӘHHH@HuHDžHDžDž HHHHH+HDžIH?HDžDžDž HH蝓H5H5L.H踓HHyHHDžJDžDž HH8HH/eHUHDžOH)HDžHQHDžDž0Dž HH诒H H5-HʒHH苒HHDžRHԖHDžDžDž HH2H%H5!-HMHHHCHDžSDžDž HH͑HHđHHDžUH HDžDžDž HHkHbH5,H膑HHGH|HDžVDžDž HHHHH2HDžWHFHDžDžDž HH褐HH5,H运HH耐HHDžXDžDž HH?HH6HkHDžZHHDžDžDž HHݏHQH5t+HHH蹏HHDž[DžDž HHxHHoHHDž]HHDžDžDž HHHWH5+H1HHH'HDž^DžDž HH豎HH討HݐHDž`HHDžDžDž HHOHQH5*HjHH+H`HDžaDžDž HHHHHHDžbH*HDžDžDž HH舍HH5 *H裍HHdHHDžcDžDž HH#HHHOHDždHcHDžDžDž HHHH5m)H܌HH蝌HҎHDžeDžDž HH\HHSH5)H=)txlHMHDž{HaHDžDžDž HH迋HHH5.HڋHH蛋HЍHDž|DžDž HHZHHQHHDž}HHDžDžDž HHH7H5'HHHԊH HDž~DžDž HH蓊HH芊HHDžHHDžHHDžDž0Dž HH H H5$H%HHHHDžH/HDžDžDž HH草H&H5&H訉HHiHHDžDžDž HH(HHHTHDžHhHDžDžDž HHƈHbH5%HHH袈H׊HDžDžDž HHaHHXHHDžHHDžDžDž HHHH5%HHHۇHHDžDžDž HH蚇HH葇HƉHDžHڋHDžDžDž HH8HQH5"HSHHHIHDžDžDž HHӆHHʆHHDžHHDžDžDž HHqHXH5($H茆HHMHHDžDžDž HH HHH8HDžHLHDžDžDž HH誅HQH5!HŅHH膅HHDžDžDž HHEHH<HqHDžHHDžDžDž HHHH5"HHH迄HHDžDžDž HH~HHuHHDžHHDžDžDž HHHH5@"H7HHH-HDžDžDž HH跃HH讃H5!H=o u(,lHHDžHHDžDžDž HHHHH5H5HHH+HDžDžDž HH赂HH謂HHDžHHDžDžDž HHSH3H5 HnHH/HdHDžDžDž HHHHH HDžHHDžHHDžDž0Dž HHeH H5IH老HHAHvHDžHHDžDžDž HHH$H5oHHHĀHHDžDžDž HH胀HHzHHDžHÄHDžDžDž HH!HbH5H<HHH2HDžDžDž HHHHHHDžHHDžDžDž HHZHH5kHuHH6HkHDžDžDž HH~HH~H!HDžH5HDžDžDž HH~HQH5*H~HHo~HHDžDžDž HH.~HH%~HZHDžHnHDžDžDž HH}HVH5H}HH}HHDžDžDž HHg}HH^}HHDžHHDžDžDž HH}HQH5LH }HH|HHDžDžDž HH|HH|H~HDžHHDžDžDž HH>|HH5HY|HH|HO~HDžDžDž HH{HH{H~HDžHHDžDžDž HHw{HH5H{HHS{H}HDžDžDž HH{HH {H5H= oH}HDžHHDžDžDž HHuzHHH5~HzHHQzH|HDžDžDž HHzHHzH<|HDžHP~HDžDžDž HHyH5H5mHyHHyH{HDžDžDž HHIyHH@yvHf{HDžH:HDžHb}HDžDž0Dž HHxH H5HxHHxHzHDžH|HDžDžDž HHCxH%H5:H^xHHxHTzHDžDžDž HHwHHwH zHDžH|HDžDžDž HH|wHbH5HwHHXwHyHDžDžDž HHwHHwHCyHDžHW{HDžDžDž HHvHH56HvHHvHxHDžDžDž HHPvHHGvH|xHDžHzHDžDžDž HHuHQH5H vHHuHwHDžDžDž HHuHHuHwHDžHyHDžDžDž HH'uH_H5HBuHHuH8wHDžDžDž HHtHHtHvHDžHyHDžDžDž HH`tHQH5H{tHHHmHDžDžDž HHchH/H5 H~hHH?hHtjHDž?DžDž HHgHHg+yHjHDžDHHDžHlHDžDž0Dž HHugH H5YHgHHQgHiHDžGHkHDžDžDž HHfH%H5 HgHHfH iHDžHDžDž HHfHHfHhHDžJHjHDžDžDž HH1fHbH58 HLfHH fHBhHDžKDžDž HHeHHeHgHDžLH jHDžDžDž HHjeHH5HeHHFeH{gHDžMDžDž HHeHHdH1gHDžOHEiHDžDžDž HHdHQH5:HdHHdHfHDžPDžDž HH>dHH5dHjfHDžRH~hHDžDžDž HHcHcH5cHcHHcHeHDžSDžDž HHwcHHncHeHDžUHgHDžDžDž HHcHQH5\H0cHHbH&eHDžVDžDž HHbHHbHdHDžWHfHDžDžDž HHNbHH58HibHH*bH_dHDžXDžDž HHaHHaHdHDžYH)fHDžDžDž HHaHH5HaHHcaHcHDžZDžDž HH"aHHaH5-H=,HgHcHCHHk\HHPx HgHcHCHHk\HHTu(HgHcHCHHk\HHT HbHDžpHdHDžDžDž HH-`HHH5dHH`HH `H>bHDžqDžDž HH_HH_HaHDžrHdHDžDžDž HHf_H/H5H_HHB_HwaHDžsDžDž HH_HH^.pHaHDžxHHDžHcHDžDž0Dž HHx^H H5\H^HHT^H`HDž{HbHDžDžDž HH]H%H5RH^HH]H `HDž|DžDž HH]HH]H_HDž~HaHDžDžDž HH4]HbH5HO]HH]HE_HDžDžDž HH\HH\H^HDžHaHDžDžDž HHm\HH5NH\HHI\H~^HDžDžDž HH\HH[H4^HDžHH`HDžDžDž HH[HQH5=H[HH[H]HDžDžDž HHA[HH8[H/bHcHCHHk\HHTtHI]HDžH]_HDžDžDž HHZHcH5HZHHZ}H\HDžH^HDžDžDž HHUHDžDžDž HHPHdH5HPHHxPHRHDžDžDž HH7PHH.PHcRHDžHwTHDžDžDž HHOHQH5HOHHOHQHDžDžDž HHpOHHgOHQHDžHSHDžDžDž HHOHH5H)OHHNHQHDžDžDž HHNHHNHPHDžHRHDžDžDž HHGNHH5HbNHH#NHXPHDžDžDž HHMHHMH5H=蠓HTHcHCHHk\HHPHOHDžHQHDžDžDž HH9MHHH5QHTMHHMHJOHDžDžDž HHLHHLHOHDžHQHDžDžDž HHrLH?H5QHLHHNLHNHDžDžDž HH LHHL:]HRHcHCHHk\HHTHNHDžH֡HDžHOHDžDž0Dž HH\KH H5@HwKHH8KHmMHDžHOHDžDžDž HHJH-H5HJHHJHLHDžDžDž HHzJHHqJHLHDžHNHDžDžDž HHJHbH5gH3JHHIH)LHDžDžDž HHIHHIHKHDžHMHDžDžDž HHQIHH5HlIHH-IHbKHDžDžDž HHHHHHHKHDžH,MHDžDžDž HHHHQH5!HHHHfHHJHDžDžDž HH%HHHHHQJHDžHeLHDžDžDž HHGH?H5HGHHGHIHDžDžDž HH^GHHUGHIHDžHKHDžDžDž HHFHQH5CHGHHFH IHDžDžDž HHFHHFHHHDžHJHDžDžDž HH5FHH5HPFHHFHFHHDžDžDž HHEHHEHGHDžHJHDžDžDž HHnEH$H5}HEHHJEHGHDžDžDž HH EHHEHKHcHCHHk\HHPH GHDž H!IHDžDžDž HHDHHH5HHDHH[DHFHDžDžDž HHDHHDHFFHDžHZHHDžDžDž HHCH?H5HCHHCHEHDžDžDž HHSCHHJCTH*JHcHCHHk\HHTu(HJHcHCHHk\HHTH$EHDžHHDžH GHDžDž0Dž HH~BH H5bHBHHZBHDHDžHFHDžDžDž HHBH-H5xHBHHAHDHDžDžDž HHAHHAHCHDžHEHDžDžDž HH:AHbH5HUAHHAHKCHDžDžDž HH@HH@HCHDžHEHDžDžDž HHs@HH5|H@HHO@HBHDžDžDž HH@HH@H:BHDž!HNDHDžDžDž HH?HQH5CH?HH?HAHDž"DžDž HHG?HH>?HsAHDž$HCHDžDžDž HH>H?H5 H?HH>H@HDž%DžDž HH>HHw>H@HDž'HBHDžDžDž HH>HQH5eH9>HH=H/@HDž(DžDž HH=HH=H?HDž)HAHDžDžDž HHW=HH5`Hr=HH3=Hh?HDž*DžDž HH<HH<H?HDž+H2AHDžDžDž HH<H$H5H<HHl<H>HDž,DžDž HH+<HH"<H!CHcHCHHk\HHPH/>HDž2HC@HDžDžDž HH;HHH5@H;HH};H=HDž3DžDž HH<;HH3;Hh=HDž4H|?HDžDžDž HH:H;H5iH:HH:H<HDž5DžDž HHu:HHl:KHTAHcHCHHk\HHTHj<HDž:H>HDžHf>HDžDž0Dž HH9H H5H9HH9H;HDž=H=HDžDžDž HHG9H+H5Hb9HH#9HX;HDž>DžDž HH8HH8H;HDž@H"=HDžDžDž HH8HbH5H8HH\8H:HDžADžDž HH8HH8HG:HDžBH[<HDžDžDž HH7HH5H7HH7H9HDžCDžDž HHT7HHK7H9HDžEH;HDžDžDž HH6HQH5H 7HH6H9HDžFDžDž HH6HH6H8HDžHH:HDžDžDž HH+6H9H5HF6HH6H<8HDžIDžDž HH5HH5H7HDžKH:HDžDžDž HHd5HQH5H5HH@5Hu7HDžLDžDž HH4HH4H+7HDžMH?9HDžDžDž HH4HH5H4HHy4H6HDžNDžDž HH84HH/4Hd6HDžOHx8HDžDžDž HH3H"H5H3HH3H5HDžPDžDž HHq3HHh3H5HDžSH7HDžDžDž HH3HHH5~7H*3HH2H 5HDžTDžDž HH2HH2H4HDžUH6HDžDžDž HHH2H4H5/Hc2HH$2HY4HDžVDžDž HH1HH1q1M H3HDž_H6HDžDžDž HHe1HHH55H1HHA1Hv3HDž`DžDž HH1HH0H,3HDžaH@5HDžDžDž HH0H%H5H0HHz0H2HDžbDžDž HH90HH00fAHV2HDžgH*HDžHR4HDžDž0Dž HH/H H5H/HH/H1HDžjH3HDžDžDž HH3/H H5zHN/HH/HD1HDžkDžDž HH.HH.H0HDžlH3HDžDžDž HHl.H+H5H.HHH.H}0HDžmDžDž HH.HH-H30HDžnHG2HDžDžDž HH-HH57H-HH-H/HDžoDžDž HH@-HH7-Hl/HDžqH1HDžDžDž HH,HLH5H,HH,H.HDžrDžDž HHy,HHp,H.HDžsH0HDžDžDž HH,HMH5H2,HH+H(.HDžtDžDž HH+HH+H-HDžuH/HDžDžDž HHP+HKH5Hk+HH,+Ha-HDžvDžDž HH*HH*H-HDžwH+/HDžDžDž HH*HKH5 H*HHe*H,HDžxDžDž HH$*HH*HP,HDžyHd.HDžDžDž HH)HLH5H)HH)H+HDžzDžDž HH])HHT)H+HDž{H-HDžDžDž HH(HKH52H)HH(H +HDž|DžDž HH(HH(H*HDž}H,HDžDžDž HH4(HMH5HO(HH(HE*HDž~DžDž HH'HH'H)HDžH,HDžDžDž HHm'HLH5DH'HHI'H~)HDžDžDž HH'HH&H4)HDžHH+HDžDžDž HH&HH58H&HH&H(HDžDžDž HHA&HH8&Hm(HDžH*HDžDžDž HH%HH5H%HH%H'HDžDžDž HHz%HHq%tM H'HDžH)HDžDžDž HH %HHH5y)H%%HH$H'HDžDžDž HH$HH$H&HDžH(HDžDžDž HHC$H'H5H^$HH$HT&HDžDžDž HH#HH# 5H%HDžHyHDžH'HDžDž0Dž HHU#H H59Hp#HH1#Hf%HDžHz'HDžDžDž HH"H!H5?H"HH"H$HDžDžDž HHs"HHj"H$HDžH&HDžDžDž HH"H,H5H,"HH!H"$HDžDžDž HH!HH!H#HDžH%HDžDžDž HHJ!HH5He!HH&!H[#HDžDžDž HH HH H#HDžH%%HDžDžDž HH HLH5*H HH_ H"HDžDžDž HH HH HJ"HDžH^$HDžDžDž HHHKH5HHHH!HDžDžDž HHWHHNH!HDžH#HDžDžDž HHHKH5HHHH!HDžDžDž HHHHH HDžH"HDžDžDž HH.HKH5HIHH H? HDžDžDž HHHHHHDžH "HDžDžDž HHgHLH5&HHHCHxHDžDžDž HHHHH.HDžHB!HDžDžDž HHHKH5HHH|HHDžDžDž HH;HH2HgHDžH{ HDžDžDž HHHMH5`HHHHHDžDžDž HHtHHkHHDžHHDžDžDž HHHLH5H-HHH#HDžDžDž HHHHHHDžHHDžDžDž HHKHH5HfHH'H\HDžDžDž HHHHHHDžH&HDžDžDž HHHH5HHH`HHDžDžDž HHHH(M H=HDžHQHDžDžDž HHHHH5HHHHHDžDžDž HHJHHAHvHDžHHDžDžDž HHH#H5_HHHHHDžDžDž HHHHz(HHDžHtmHDžHHDžDž0Dž HHH H5ޱHHHH HDžHHDžDžDž HH}HH5HHHYHHDžDžDž HHHHHDHDžHXHDžDžDž HHH*H5uHHHHHDžDžDž HHQHHHH}HDžHHDžDžDž HHHH5H HHHHDžDžDž HHHHHHDžHHDžDžDž HH(HLH5HCHHH9HDžDžDž HHHHHHDžHHDžDžDž HHaHKH5XH|HH=HrHDžDžDž HHHHH(HDžH<HDžDžDž HHHKH5HHHvHHDžDžDž HH5HH,HaHDžHuHDžDžDž HHHKH5jHHHHHDžDžDž HHnHHeHHDžHHDžDžDž HH HLH5H'HHHHDžDžDž HHHHHHDžHHDžDžDž HHEHKH5|H`HH!HVHDžDžDž HHHHH HDžH HDžDžDž HH~HMH5HHHZHHDžDžDž HHHHHEHDžHYHDžDžDž HHHLH5HHHHHDžDžDž HHRHHIH~HDžHHDžDžDž HH HH5ٿH HH HHDžDžDž HH HH HHDžHHDžDžDž HH) HH5HD HH H:HDžDžDž HH HH HHDžHHDžDžDž HHT HHH5Ho HH0 HeHDžDžDž HH HH HHDžH/HDžDžDž HH H%H5,H HHi H HDžDžDž HH( HH UHE HDžHaHDžHAHDžDž0Dž HH H H5H HH{ H HDžHHDžDžDž HH" H H5H= HH H3 HDžDžDž HH HH H HDžH HDžDžDž HH[ H+H5BHv HH7 Hl HDžDžDž HHHHH" HDžH6 HDžDžDž HHHH5HHHpH HDžDžDž HH/HH&H[ HDžHo HDžDžDž HHHLH5tHHHH HDžDžDž HHhHH_H HDžH HDžDžDž HHHKH5-H!HHH HDžDžDž HHHHHHDžH HDžDžDž HH?HKH5HZHHHPHDžDžDž HHHHHHDžH HDžDžDž HHxHKH5?HHHTHHDžDžDž HHHH H?HDžHS HDžDžDž HHHLH5ȹHHHHHDžDžDž HHLHHCHxHDžHHDžDžDž HHHKH5QHHHHHDžDžDž HHHH|HHDžHHDžDžDž HH#HMH5H>HHH4HDžDžDž HHHHHHDžHHDžDžDž HH\HLH53HwHH8HmHDžDžDž HHHHH#HDžH7HDžDžDž HHHH5HHHqHHDžDžDž HH0HH'H\HDžHpHDžDžDž HHHH5HHHHHDž DžDž HHiHH`M HHDžHHDžDžDž HHHHH5qHHHHHDžDžDž HHHHHHDžHHDžDžDž HH;H#H5 HVHHHLHDžDžDž HHHHHHDžHTHDžHHDžDž0Dž HHMH H51HhHH)H^HDžHrHDžDžDž HHHH5dzHHHHHDžDžDž HHkHHbHHDžHHDžDžDž HH HH5H$HHHHDžDžDž HHHHHHDžHHDžDžDž HHBHH5rH]HHHSHDžDžDž HHHHH HDž!HHDžDžDž HH{HLH5"HHHWHHDž"DžDž HHHH HBHDž$HVHDžDžDž HHHKH5HHHHHDž%DžDž HHOHHFH{HDž'HHDžDžDž HHHKH5|HHHHHDž(DžDž HHHHHHDž*HHDžDžDž HH&HKH5HAHHH7HDž+DžDž HHHHHHDž-HHDžDžDž HH_HLH5HzHH;HpHDž.DžDž HHHHH&HDž0H:HDžDžDž HHHKH5HHHtHHDž1DžDž HH3HH*H_HDž3HsHDžDžDž HHHMH5XHHHHHDž4DžDž HHlHHcHHDž6HHDžDžDž HH HLH5H%HHHHDž7DžDž HHHHHHDž8HHDžDžDž HHCHH5sH^HHHTHDž9DžDž HHHHH HDž:HHDžDžDž HH|HH5FHHHXHHDž;DžDž HHHHHCHDž>HWHDžDžDž HHHHH5$HHHHHDž?DžDž HHPHHGH|HDž@HHDžDžDž HHH<H5ժH HHHHDžADžDž HHHHHK0VHcHC8HHHHHHHHHLjH{HDžFHHDžDžDž HHHHH5\HHHHHDžGDžDž HHHHHHDžHHHDžDžDž HH&H)H5MHAHHH7HDžIDžDž HHHHHHDžNHFHDžHHDžDž0Dž HH8H H5HSHHHIHDžQH]HDžDžDž HHH"H5HHHHHDžRDžDž HHVHHMHHDžSHHDžDžDž HHH)H5sHHHHHDžTDžDž HHHHHHDžUHHDžDžDž HH-HH5զHHHH H>HDžVDžDž HHHHHHDžXHHDžDžDž HHfHPH5%HHHBHwHDžYDžDž HHHHH-HDž[HAHDžDžDž HHHQH5HHH{HHDž\DžDž HH:HH1HfHDž^HzHDžDžDž HHHPH5?HHHHHDž_DžDž HHsHHjHHDž`HHDžDžDž HHHH5H,HHH"HDžaDžDž HHHHHHDžbHHDžDžDž HHJHH5HeHH&H[HDžcDžDž HHHHHK0HcHC8HHHHHHHHHLjHHDžiHHDžDžDž HHIHHH5HdHH%HZHDžjDžDž HHHHHHDžkH$HDžDžDž HHH+H5YHHH^HHDžlDžDž HHHHJH:HDžqH>HDžH6HDžDž0Dž HHH H5xHHHpHHDžtHHDžDžDž HHH#H5H2HHH(HDžuDžDž HHHHHHDžvHHDžDžDž HHPH*H5HkHH,HaHDžwDžDž HHHHHHDžxH+HDžDžDž HHHH5HHHeHHDžyDžDž HH$HHHPHDž{HdHDžDžDž HHHPH5HHHHHDž|DžDž HH]HHTHHDž~HHDžDžDž HHHQH5jHHHH HDžDžDž HHHHHHDžHHDžDžDž HH4HPH5HOHHHEHDžDžDž HHHHHHDžHHDžDžDž HHmHH5ƜHHHIH~HDžDžDž HHHHH4HDžHHHDžDžDž HHHH5fHHHHHDžDžDž HHAHH8HK0HcHC8HHHHHHHHHLjH3HDžHGHDžDžDž HHHHH5HHHHHDžDžDž HH@HH7HlHDžHHDžDžDž HHH'H5HHHHHDžDžDž HHyHHpHHDžHj5HDžHHDžDž0Dž HHH H5yH HHHHDžHHDžDžDž HHsH!H5zHHHOHHDžDžDž HHHHH:HDžHNHDžDžDž HHH(H5ۘHHHHHDžDžDž HHGHH>HsHDžHHDžDžDž HHHH5<HHHHHDžDžDž HHHHwHHDžHHDžDžDž HHHPH5ݔH9HHH/HDžDžDž HHHHHHDžHHDžDžDž HHWHQH5HrHH3HhHDžDžDž HHHHHHDžH2HDžDžDž HHHPH5HHHlHHDžDžDž HH+HH"HWHDžHkHDžDžDž HHHH5 HHHHHDžDžDž HHdHH[HHDžHHDžDžDž HHHH5HHHHHDžDžDž HHHHHK0vHcHC8HHHHHHHHHLjHHDžHHDžDžDž HHHHH5pHHHHHDžDžDž HHHHHHDžHHDžDžDž HH:H)H5HUHHHKHDžDžDž HHHHHHDžH,HDžHHDžDž0Dž HHLH H50qHgHH(H]HDžHqHDžDžDž HHH"H5֑HHHHHDžDžDž HHjHHaHHDžHHDžDžDž HHH)H57H#HHHHDžDžDž HHHHHHDžHHDžDžDž HHAHH5H\HHHRHDžDžDž HHHHHHDžHHDžDžDž HHzHPH59HHHVHHDžDžDž HHHH HAHDžHUHDžDžDž HHHQH5"HHHHHDžDžDž HHNHHEHzHDžHHDžDžDž HHHPH5SHHHHHDžDžDž HHHH~HHDžHHDžDžDž HH%HH5}H@HHH6HDžDžDž HHHHHHDžHHDžDžDž HH^HH5HyHH:HoHDžDžDž HHHHH%HDžH9HDžDžDž HHHHH5HHHsHHDžDžDž HH2HH)H^HDžHrHDžDžDž HHHEH5HHHHHDžHHDžDžDž HHSHEH5zHnHH/HdHDžHxHDžDžDž HHHDH5EHHHHHDžHHDžDžDž HHYH@H5HtHH5HjHDžH~HDžDžDž HHHFH5ӊHHHHHDžHHDžDžDž HH_H?H5HzHH;HpHDžHHDžDžDž HHHDH5aHHHHHDžHHDžDžDž HHeH0H5,HHHAHvHDžDžDž HHHH?6HHDžH2HDžDžDž HHHHH5HHHlHHDžDžDž HH+HH"HWHDžHkHDžDžDž HHH$H5HHHHHDžDžDž HHdHH[HHDžHHDžDžDž HHHHH5qHHHHHDžDžDž HHHHHHDžHHDžDžDž HH;HAH5ZHVHHHLHDžH`HDžDžDž HHHH5HHHHHDžDžDž HHYHHP HwHDžHHDžDžDž HHHHH5XHHHHHDžDžDž HHHH{HHDžHHDžDžDž HH"H%H5H=HHH3HDžDžDž HHHHHHDžHHDžHHDžDž0Dž HH4H H5`HOHHHEHDžHYHDžDžDž HHH:H5^HHHHHDžDžDž HHRHHIH~HDžHHDžDžDž HHH4H5׃H HHHHDžDžDž HHHHHHDžHHDžDžDž HH)HH5DHDHHH:HDžDžDž HHHHHHDžHHDžDžDž HHbHMH5H}HH>HsHDžDžDž HHHHH)HDžH=HDžDžDž HHHUH5HHHwHHDžDžDž HH6HH-HbHDžHvHDžDžDž HHHMH5HHHHHDžDžDž HHoHHfHHDžHHDžDžDž HH HH5(H(HHHHDžDžDž HH訿HH蟿HHDžHHDžDžDž HHFHH5jHaHH"HWHDžDžDž HHHHؾH HDžH!HDžDžDž HHHHH5H蚾HH[HHDž DžDž HHHHHFHDž HZHDžDžDž HH踽H%H5~HӽHH蔽HɿHDž DžDž HHSHHJHpHDžHDHDžHlHDžDž0Dž HHʼH H5WHHH覼H۾HDžHHDžDžDž HHMH:H5}HhHH)H^HDžDžDž HHHH߻HHDžH(HDžDžDž HH膻H4H5m{H衻HHbHHDžDžDž HH!HHHMHDžHaHDžDžDž HH迺HH5`|HںHH蛺HмHDžDžDž HHZHHQHHDžHHDžDžDž HHHMH5{HHHԹH HDžDžDž HH蓹HH芹HHDžHӽHDžDžDž HH1HVH58{HLHH HBHDžDžDž HH̸HHøHHDžH HDžDžDž HHjHMH5zH腸HHFH{HDžDžDž HHHHH1HDž HEHDžDžDž HH裷HH5DyH辷HHHHDž!DžDž HH>HH5HjHDž"H~HDžDžDž HHܶHH5yHHH踶HHDž#DžDž HHwHHn\HHDž)HHDžDžDž HHHHH5vH"HHHHDž*DžDž HH袵HH虵HηHDž+HHDžDžDž HH@H'H5xH[HHHQHDž,DžDž HH۴HHҴHHDž1H HDžHHDžDž0Dž HHRH H56OHmHH.HcHDž4HwHDžDžDž HHճH<H5vHHH豳HHDž5DžDž HHpHHgHHDž6HHDžDžDž HHH5H5=vH)HHHHDž7DžDž HH該HH蠲HմHDž8HHDžDžDž HHGHH5uHbHH#HXHDž9DžDž HHHHٱHHDž:H"HDžDžDž HH耱HMH5qH蛱HH\HHDž;DžDž HHHHHGHDž=H[HDžDžDž HH蹰HSH50tH԰HH蕰HʲHDž>DžDž HHTHHKHHDž?HHDžDžDž HHHMH5pH HHίHHDž@DžDž HH药HH脯HHDžAHͳHDžDžDž HH+HH5rHFHHH<HDžBDžDž HHƮHH轮HHDžCHHDžDžDž HHdHH5.rHHH@HuHDžDDžDž HHHHH+HDžEH?HDžDžDž HH蝭HHH5 H踭HHyHHDžFDžDž HH8HH/HdHDžGHxHDžDžDž HH֬H'H5pHHH責HHDžHDžDž HHqHHhHHDžMHbHDžHHDžDž0Dž HHH H5FHHHīHHDžPH HDžDžDž HHkH<H5zoH膫HHGH|HDžQDžDž HHHHH2HDžRHFHDžDžDž HH褪H5H5mH迪HH耪HHDžSDžDž HH?HH6HkHDžTHHDžDžDž HHݩHH5(nHHH蹩HHDžUDžDž HHxHHoHHDžVHHDžDžDž HHHMH5jH1HHH'HDžWDžDž HH豨HH訨HݪHDžYHHDžDžDž HHOHUH5lHjHH+H`HDžZDžDž HHHHHHDž[H*HDžDžDž HH舧HMH5iH裧HHdHHDž\DžDž HH#HHHOHDž]HcHDžDžDž HHHH5 kHܦHH蝦HҨHDž^DžDž HH\HHSHHDž_HHDžDžDž HHHH5jHHH֥H HDž`DžDž HH蕥HH茥HHDžfHǩHDžDžDž HH%HHH5H@HHH6HDžgDžDž HHHH跤HHDžhHHDžDžDž HH^H-H5-iHyHH:HoHDžiDžDž HHHH&HHDžnHHDžHHDžDž0Dž HHpH H5T>H苣HHLHHDžqHHDžDžDž HHHBH5gHHHϢHHDžrDžDž HH莢HH腢HHDžsHΦHDžDžDž HH,H8H5sgHGHHH=HDžtDžDž HHǡHH辡HHDžuHHDžDžDž HHeHH5fH耡HHAHvHDžvDžDž HHHHH,HDžwH@HDžDžDž HH螠HMH5`H蹠HHzHHDžxDžDž HH9HH0HeHDžzHyHDžDžDž HHןH[H5neHHH賟HHDž{DžDž HHrHHiHHDž|HHDžDžDž HHHMH5_H+HHH!HDž}DžDž HH諞HH袞HנHDž~HHDžDžDž HHIHH5cHdHH%HZHDžDžDž HHHH۝HHDžH$HDžDžDž HH肝HH5tcH蝝HH^HHDžDžDž HHHHHIHDžH]HDžDžDž HH軜HHH5*H֜HH藜H̞HDžDžDž HHVHHMHHDžHHDžDžDž HHH-H5bHHHЛHHDžDžDž HH菛HH膛HHDžHHDžHHDžDž0Dž HHH H55H!HHHHDžH+HDžDžDž HH艚HBH5`H褚HHeHHDžDžDž HH$HHHPHDžHdHDžDžDž HH™H8H5 _HݙHH螙HӛHDžDžDž HH]HHTHHDžHHDžDžDž HHHH5|_HHHטH HDžDžDž HH薘HH荘HšHDžH֜HDžDžDž HH4HMH5YHOHHHEHDžDžDž HHϗHHƗHHDžHHDžDžDž HHmHXH5^H舗HHIH~HDžDžDž HHHHH4HDžHHHDžDžDž HH視HMH5YHHH肖HHDžDžDž HHAHH8HmHDžHHDžDžDž HHߕHH5`\HHH軕HHDžDžDž HHzHHqHHDžHHDžDžDž HHHH5\H3HHH)HDžDžDž HH賔HH誔HߖHDžHHDžDžDž HHQHHH5HlHH-HbHDžDžDž HHHHHHDžH,HDžDžDž HH芓HBH5ZH襓HHfHHDžHHDžDžDž HH HHH5dZH(HHHHDžH2HDžDžDž HH萒HHH5/ZH諒HHlHHDžHHDžDžDž HHH&H5YH.HHH$HDžDžDž HH讑HH襑HړHDžHHDžDžDž HHLHHH5HgHH(H]HDžDžDž HHHHސHHDžH'HDžDžDž HH腐HH5XH蠐HHaHHDžDžDž HH HHHHcHCHHk\HHPjH$HDžH8HDžDžDž HH薏HHH5H豏HHrHHDžDžDž HH1HH(H]HDžHqHDžDžDž HHώH7H5VHHH諎HHDžDžDž HHjHHaHHDžH[HDžHHDžDž0Dž HHH H5(HHH轍HHDžHHDžDžDž HHdH7H5UHHH@HuHDžDžDž HHHHH+HDžH?HDžDžDž HH蝌H+H5KH*HHH HDžDžDž HH誊HH衊H֌HDžHHDžDžDž HHHH1H5/SHcHH$HYHDžDžDž HHHHډHHDžH#HDžDžDž HH聉HMH5XJH蜉HH]HHDžDžDž HHHHHHHDžH\HDžDžDž HH躈HH5QHՈHH薈HˊHDžDžDž HHUHHLHHDžHHDžDžDž HHH H5QHHHχHHDžDžDž HH莇HH腇H|HcHCHHk\HHPjHHDžHHDžDžDž HHHHH5sHHHHHDžDžDž HH蟆HH薆HˈHDžHߊHDžDžDž HH=H7H5|OHXHHHNHDžDžDž HH؅HHυHHDžHHDžHHDžDž0Dž HHOH H53 HjHH+H`HDžHtHDžDžDž HH҄H7H5INHHH讄HHDžDžDž HHmHHdHHDžHHDžDžDž HH H+H5MH&HHHHDžDžDž HH覃HH蝃H҅HDžHHDžDžDž HHDHH5MH_HH HUHDžDžDž HH߂HHւH HDžHHDžDžDž HH}HMH5BH蘂HHYHHDžDžDž HHHHHDHDžHXHDžDžDž HH趁H1H5KHсHH蒁HǃHDžDžDž HHQHHHH}HDžHHDžDžDž HHHMH5AH HHˀHHDžDžDž HH芀HH聀HHDžHʄHDžDžDž HH(HH5JHCHHH9HDžDžDž HHHHHHDžHHDžDžDž HHaH H5IH|HH=HrHDžDžDž HH~HH~HHcHCHHk\HHPjHHDžHHDžDžDž HHr~HHH5H~HHN~HHDžDžDž HH ~HH~H9HDžHMHDžDžDž HH}H3H5GH}HH}HHDžDžDž HHF}HH=}sHcHDžH7HDžH_HDžDž0Dž HH|H H5H|HH|H~HDžHHDžDžDž HH@|H3H5FH[|HH|HQ~HDžDžDž HH{HH{H~HDžHHDžDžDž HHy{H)H58FH{HHU{H}HDžDžDž HH{HH {H@}HDžHTHDžDžDž HHzHH5EHzHHzH|HDž DžDž HHMzHHDzHy|HDž H~HDžDžDž HHyHMH5:HzHHyH{HDž DžDž HHyHH}yH{HDž H}HDžDžDž HH$yH/H5#DH?yHHyH5{HDž DžDž HHxHHxHzHDž H|HDžDžDž HH]xHMH549HxxHH9xHnzHDž DžDž HHwHHwH$zHDž H8|HDžDžDž HHwHH5~BHwHHrwHyHDž DžDž HH1wHH(wH]yHDž Hq{HDžDžDž HHvHH5AHvHHvHxHDž DžDž HHjvHHavHxHDž HzHDžDžDž HHvHHH5wzH#vHHuHxHDž DžDž HHuHHuHwHDž HyHDžDžDž HHAuHBH5@H\uHHuHRwHDž HfyHDžDžDž HHtH2H5[@HtHHtHvHDž DžDž HH_tHHVtHvHDž HxHDžDžDž HHsHHH5lxHtHHsHvHDž DžDž HHsHHsHuHDž HwHDžDžDž HH6sHH5>HQsHHsHGuHDž DžDž HHrHHrHyHcHCHHk\HHPjHtHDž HvHDžDžDž HHGrHHH5vHbrHH#rHXtHDž DžDž HHqHHqHtHDž H"vHDžDžDž HHqH7H5g=HqHH\qHsHDž DžDž HHqHHqHH8sHDž" H HDžH4uHDžDž0Dž HHpH H5v HpHHnpHrHDž% HtHDžDžDž HHpH7H54<H0pHHoH&rHDž& DžDž HHoHHoHqHDž' HsHDžDžDž HHNoH+H57HioHH*oH_qHDž( DžDž HHnHHnHqHDž) H)sHDžDžDž HHnHH5:HnHHcnHpHDž* DžDž HH"nHHnHNpHDž+ HbrHDžDžDž HHmHMH5w/HmHHmHoHDž, DžDž HH[mHHRmHoHDž- HqHDžDžDž HHlH1H5h9HmHHlH oHDž. DžDž HHlHHlHnHDž/ HpHDžDžDž HH2lHMH5.HMlHHlHCnHDž0 DžDž HHkHHkHmHDž1 H pHDžDžDž HHkkHH57HkHHGkH|mHDž2 DžDž HHkHHjH2mHDž3 HFoHDžDžDž HHjH H5K7HjHHjHlHDž4 DžDž HH?jHH6jH-qHcHCHHk\HHPjHClHDž: HWnHDžDžDž HHiHHH5$nHiHHiHkHDž; DžDž HHPiHHGiH|kHDž< HmHDžDžDž HHhH7H55H iHHhHjHDž= DžDž HHhHHhyHjHDžB HzHDžHlHDžDž0Dž HHhH H5HhHHgHjHDžE H%lHDžDžDž HHgH7H54HgHH_gHiHDžF DžDž HHgHHgHJiHDžG H^kHDžDžDž HHfH+H5k0HfHHfHhHDžH DžDž HHWfHHNfHhHDžI HjHDžDžDž HHeHH5+3HfHHeHhHDžJ DžDž HHeHHeHgHDžK HiHDžDžDž HH.eHMH5&HIeHH eH?gHDžL DžDž HHdHHdHfHDžM H iHDžDžDž HHgdH1H51HdHHCdHxfHDžN DžDž HHdHHcH.fHDžO HBhHDžDžDž HHcHMH5%HcHH|cHeHDžP DžDž HH;cHH2cHgeHDžQ H{gHDžDžDž HHbHH50HbHHbHdHDžR DžDž HHtbHHkbHdHDžS HfHDžDžDž HHbH H5/H-bHHaH#dHDžT DžDž HHaHHaHhHcHCHHk\HHPjHcHDžZ HeHDžDžDž HH#aHHH5eH>aHH`H4cHDž[ DžDž HH`HH`HbHDž\ HdHDžDžDž HH\`H3H5.Hw`HH8`HmbHDž] DžDž HH_HH_$qHbHDžb HHDžHdHDžDž0Dž HHn_H H5RH_HHJ_HaHDže HcHDžDžDž HH^H3H5,H _HH^HaHDžf DžDž HH^HH^H`HDžg HbHDžDžDž HH*^H)H5(HE^HH^H;`HDžh DžDž HH]HH]H_HDži HbHDžDžDž HHc]HH5u+H~]HH?]Ht_HDžj DžDž HH\HH\H*_HDžk H>aHDžDžDž HH\HMH5SH\HHx\H^HDžl DžDž HH7\HH.\Hc^HDžm Hw`HDžDžDž HH[H/H5*H[HH[H]HDžn DžDž HHp[HHg[H]HDžo H_HDžDžDž HH[HMH5mH)[HHZH]HDžp DžDž HHZHHZH\HDžq H^HDžDžDž HHGZHH5Y(HbZHH#ZHX\HDžr DžDž HHYHHYH\HDžs H"^HDžDžDž HHYHH5'HYHH\YH[HDžt DžDž HHYHHYHG[HDžw H[]HDžDžDž HHXHHH5(]HXHHXHZHDžx DžDž HHTXHHKXHZHDžy H\HDžDžDž HHWHHH5q&H XHHWHZHDžz H\HDžDžDž HHuWHDH5<&HWHHQWHYHDž{ H[HDžDžDž HHVHIH5&HWHHVH YHDž| DžDž HHVHHVHXHDž} HZHDžDžDž HH1VHHH5ZHLVHH VHBXHDž~ DžDž HHUHHUHWHDž H ZHDžDžDž HHjUHH5$HUHHFUH{WHDž DžDž HHUHHTH[HcHCHHk\HHPjH WHDž HYHDžDžDž HH{THHH5XHTHHWTHVHDž DžDž HHTHH THBVHDž HVXHDžDžDž HHSH=H5+#HSHHSHUHDž DžDž HHOSHHFS|dHlUHDž H@HDžHhWHDžDž0Dž HHRH H5HRHHRHTHDž HVHDžDžDž HHIRH:H5"HdRHH%RHZTHDž DžDž HHQHHQHTHDž H$VHDžDžDž HHQH+H5!HQHH^QHSHDž DžDž HHQHHQHISHDž H]UHDžDžDž HHPHH5 HPHHPHRHDž DžDž HHVPHHMPHRHDž HTHDžDžDž HHOHPH5 HPHHOHRHDž DžDž HHOHHOHQHDž HSHDžDžDž HH-OH6H5HHOHH OH>QHDž DžDž HHNHHNHPHDž HSHDžDžDž HHfNHPH5HNHHBNHwPHDž DžDž HHNHHMH-PHDž HARHDžDžDž HHMHH5HMHH{MHOHDž DžDž HH:MHH1MHfOHDž HzQHDžDžDž HHLH#H5HLHHLHNHDž DžDž HHsLHHjLHaSHcHCHHk\HHPjHwNHDž HPHDžDžDž HHKHHH5XPHLHHKHMHDž DžDž HHKHH{KHMHDž HOHDžDžDž HH"KH=H51H=KHHJH3MHDž DžDž HHJHHJ[HLHDž HHDžHNHDžDž0Dž HH4JH H5HOJHHJHELHDž HYNHDžDžDž HHIH:H5HIHHIHKHDž DžDž HHRIHHIIH~KHDž HMHDžDžDž HHHH+H5H IHHHHKHDž DžDž HHHHHHHJHDž HLHDžDžDž HH)HHH5HDHHHHH:JHDž DžDž HHGHHGHIHDž HLHDžDžDž HHbGHPH5qH}GHH>GHsIHDž DžDž HHFHHFH)IHDž H=KHDžDžDž HHFH6H5BHFHHwFHHHDž DžDž HH6FHH-FHbHHDž HvJHDžDžDž HHEHPH5kHEHHEHGHDž DžDž HHoEHHfEHGHDž HIHDžDžDž HH EHH5H(EHHDHGHDž DžDž HHDHHDHFHDž HHHDžDžDž HHFDH#H5%HaDHH"DHWFHDž DžDž HHCHHCHJHcHCHHk\HHPjHEHDž HGHDžDžDž HHWCHHH5GHrCHH3CHhEHDž DžDž HHBHHBHEHDž H2GHDžDžDž HHBH9H5HBHHlBHDHDž DžDž HH+BHH"BXSHHDHDž HHDžHDFHDžDž0Dž HHAH H5HAHH~AHCHDž HEHDžDžDž HH%AH6H5lH@AHHAH6CHDž DžDž HH@HH@HBHDž HEHDžDžDž HH^@H)H5 Hy@HH:@HoBHDž DžDž HH?HH?H%BHDž H9DHDžDžDž HH?HH5H?HHs?HAHDž DžDž HH2?HH)?H^AHDž HrCHDžDžDž HH>HPH5H>HH>H@HDž DžDž HHk>HHb>H@HDž HBHDžDžDž HH >H4H5H$>HH=H@HDž DžDž HH=HH=H?HDž HAHDžDžDž HHB=HPH5 H]=HH=HS?HDž DžDž HH<HH<H ?HDž HAHDžDžDž HH{<HH5H<HHW<H>HDž DžDž HH<HH <HB>HDž HV@HDžDžDž HH;H!H5H;HH;H=HDž DžDž HHO;HHF;H{=HDž H?HDžDžDž HH:HHH5\?H;HH:H<HDž DžDž HH:HH:H<HDž H>HDžDžDž HH&:H7H5 HA:HH:H7<HDž HK>HDžDžDž HH9H-H5 H9HH9H;HDž DžDž HHD9HH;9Hp;HDž H=HDžDžDž HH8HHH5Q=H8HH8H:HDž DžDž HH}8HHt8H:HDž H<HDžDžDž HH8H!H5ZH68HH7H,:HDž DžDž HH7HH7H>HcHCHHk\HHPH9HDž H;HDžDžDž HH,7HHH5;HG7HH7H=9HDž DžDž HH6HH6H8HDž H;HDžDžDž HHe6H>H5 H6HHA6Hv8HDž DžDž HH6HH5-GH8HDž HHDžH:HDžDž0Dž HHw5H H5[H5HHS5H7HDž H9HDžDžDž HH4H8H5H5HH4H 7HDž DžDž HH4HH4H6HDž H8HDžDžDž HH34H(H5 HN4HH4HD6HDž DžDž HH3HH3H5HDž H8HDžDžDž HHl3HH5kH3HHH3H}5HDž DžDž HH3HH2H35HDž!HG7HDžDžDž HH2HVH5H2HH2H4HDž!DžDž HH@2HH72Hl4HDž!H6HDžDžDž HH1HFH5UH1HH1H3HDž!H6HDžDžDž HHa1HLH5 H|1HH=1Hr3HDž!DžDž HH0HH0H(3HDž!H<5HDžDžDž HH0HVH5H0HHv0H2HDž!DžDž HH50HH,0Ha2HDž!Hu4HDžDžDž HH/HH5H/HH/H1HDž!DžDž HHn/HHe/H1HDž !H3HDžDžDž HH /H!H5sH'/HH.H1HDž !DžDž HH.HH.H5HcHCHHk\HHPH0HDž!H2HDžDžDž HH.HHH52H8.HH-H.0HDž!DžDž HH-HH-H/HDž!H1HDžDžDž HHV-H>H5Hq-HH2-Hg/HDž!DžDž HH,HH,>H/HDž!HHDžH 1HDžDž0Dž HHh,H H5LH,HHD,Hy.HDž!H0HDžDžDž HH+H8H5H,HH+H-HDž!DžDž HH+HH}+H-HDž!H/HDžDžDž HH$+H(H5+H?+HH+H5-HDž!DžDž HH*HH*H,HDž!H.HDžDžDž HH]*HH5Hx*HH9*Hn,HDž !DžDž HH)HH)H$,HDž!!H8.HDžDžDž HH)HVH5H)HHr)H+HDž"!DžDž HH1)HH()H]+HDž#!Hq-HDžDžDž HH(HFH5H(HH(H*HDž$!H,HDžDžDž HHR(HLH5Hm(HH.(Hc*HDž%!DžDž HH'HH'H*HDž&!H-,HDžDžDž HH'HVH5H'HHg'H)HDž'!DžDž HH&'HH'HR)HDž(!Hf+HDžDžDž HH&HH5H&HH&H(HDž)!DžDž HH_&HHV&H(HDž*!H*HDžDžDž HH%H!H5H&HH%H(HDž+!DžDž HH%HH%H,HcHCHHk\HHPH'HDž1!H)HDžDžDž HH%HHH5})H)%HH$H'HDž2!DžDž HH$HH$H&HDž3!H(HDžDžDž HHG$H4H5VHb$HH#$HX&HDž4!DžDž HH#HH#5H%HDž9!HyHDžH'HDžDž0Dž HHY#H H5=Ht#HH5#Hj%HDž!H&HDžDžDž HH"H&H5H0"HH!H&$HDž?!DžDž HH!HH!H#HDž@!H%HDžDžDž HHN!HH5Hi!HH*!H_#HDžA!DžDž HH HH H#HDžB!H)%HDžDžDž HH HVH5H HHc H"HDžC!DžDž HH" HH HN"HDžD!Hb$HDžDžDž HHHBH5HHHH!HDžE!H#HDžDžDž HHCHFH5JH^HHHT!HDžF!DžDž HHHHH !HDžG!H#HDžDžDž HH|HVH5HHHXH HDžH!DžDž HHHHHC HDžI!HW"HDžDžDž HHHH5ZHHHHHDžJ!DžDž HHPHHGH|HDžK!H!HDžDžDž HHHH5=H HHHHDžL!DžDž HHHH-HHDžR!H HDžDžDž HHHHH5 H3HHH)HDžS!DžDž HHHHHHDžT!HHDžDžDž HHQHCH5HlHH-HbHDžU!HvHDžDžDž HHH@H5HHHHHDžV!HHDžDžDž HHWHHH5NHrHH3HhHDžW!DžDž HHHHHHDžY!H2HDžDžDž HHHHH5HHHlHHDžZ!DžDž HH+HH"HWHDž[!HkHDžDžDž HHH>H5HHHHHDž\!DžDž HHdHH[HHDž]!HHDžDžDž HHHHH5qHHHHHDž^!DžDž HHHHHHDž_!HHDžDžDž HH;H1H5HVHHHLHDž`!DžDž HHHH(HHDže!HlHDžHHDžDž0Dž HHMHH5HhHH)H^HDžh!HrHDžDžDž HHH'H5HHHHHDži!DžDž HHkHHbHHDžj!HHDžDžDž HH HH5H$HHHHDžk!DžDž HHHHHHDžl!HHDžDžDž HHBHH5>H]HHHSHDžm!DžDž HHHHH HDžn!HHDžDžDž HH{HVH5HHHWHHDžo!DžDž HHHH HBHDžp!HVHDžDžDž HHHPH5HHHHHDžq!DžDž HHOHHFH{HDžr!HHDžDžDž HHHVH5HHHHHDžs!DžDž HHHHHHDžt!HHDžDžDž HH&HH5"HAHHH7HDžu!DžDž HHHHHHDžv!HHDžDžDž HH_HH5lHzHH;HpHDžw!DžDž HHHHH&HDžx!H:HDžDžDž HHHHH5HHHtHHDžy!DžDž HH3HH*H_HDžz!HsHDžDžDž HHH1H5HHHHHDž{!DžDž HHlHHcHHDž!H]dHDžHHDžDž0Dž HH HH5H HH HHDž!HHDžDžDž HHf H'H5H HHB HwHDž!DžDž HH HH H-HDž!HAHDžDžDž HH HH5}H HH{ HHDž!DžDž HH: HH1 HfHDž!HzHDžDžDž HH HH5^H HH H HDž!DžDž HHs HHj H HDž!HHDžDžDž HH HVH5H, HH H" HDž!DžDž HH HH H HDž!HHDžDžDž HHJ HPH5AHe HH& H[ HDž!DžDž HH HH H HDž!H%HDžDžDž HH HVH5H HH_ H HDž!DžDž HH HH HJ HDž!H^ HDžDžDž HHHH5BHHHH HDž!DžDž HHWHHNH HDž!H HDžDžDž HHHH5HHHH HDž!DžDž HHHHH HDž!H HDžDžDž HH.HHH5 HIHH H? HDž!DžDž HHHHHHDž!H HDžDžDž HHgHH5tHHHCHxHDž!DžDž HHHHH.HDž!HB HDžDžDž HHH9H5 HHH|HHDž!H HDžDžDž HH#HHH5 H>HHH4HDž!DžDž HHHHHHDž!HHDžDžDž HH\HRH5HwHH8HmHDž!HxHxHHWHDžDžDž HHHx$HHDž!HHDžDžDž HH`H`HlH HblHHHDHvHH`llIAH VHމil~H`HtHlPHHHHHtHHHHx[A\A]]UHAUATSH8HLHHDžFHHHHHDžHvHDžHHDžHMHDžDž cDžHHHHHDžJHHDžDžDž HHLHuHEH HTE܃ HHHDHkHHMЋU܋E܃ IAH f HމgE܅~HEHtHE܍P HHHHHtHHHoFRN.GDHHDž^HHDžDžDžHHHHEIAH $Hƿ-rHUHL AHѺ-Hƿ.EHH.HHHHHHDžbHHDžDžDžHHCHuHEH PHKẼHHHDHbIHMŰẼIAH 'L^E̅~HEHtHẼHHHDHIċE̍PẼL ALLLHtHE̍PHLHLHtHHH;HpHDžfHHDžDžDžHHH#H5)HHHHHDžhHHDžDžDžHHeH H5HHHAHvHDžjHHDžDžDžHHH H5wHHHHHDžlH HDžDžDžHHkH H5HHHGH|HDžnHHDžDžDžHHH H5H HHHHDžpHHDžDžDžHHqH H5`HHHMHHDžrHHDžDžDžHHH H5HHH  tHHDžxHHDžDžDžHHBH"H5qH]HHHNHDž|HbHDžDžDžHHH"H5HHHHHDžHHDžDžDžHH>H"H5HYHH~HMHDžHaHDžDžDžHHH"H5fHHH tHHDžHHDžDžDžHH7H7H5HRHH}HFHDžHZHDžDžDžHHH8H5HHHHK0jHcHC8HHHHHHHHHLtHHDžHHDžDžDžHHH(H5DH HH}HHDžH(HDžDžDžHHH)H5HHHbHK0<HcHC8HHHHHHHHHLtHaHDžHuHDžDžDžHHH)H5jHHH}HHDžHHDžDžDžHHTH*H5HoHH0HK0HcHC8HHHHHHHHHLtH/HDžHCHDžDžDžHHH'H5HHH}}HHDžHHDžDžDžHH"H(H5AH=HHHK0HcHC8HHHHHHHHHLtHHDžHHDžDžDžHHoH(H5HHHK}H~HDžHHDžDžDžHHH)H5_H HHHHcHCHHk\HHPtHHDžHHDžDžDžHHOH*H5HjHH+}H^HDžHrHDžDžDžHHH+H5HHHHHcHCHHk\HHPtHHDžHHDžDžDžHH/H*H5.HJHH }H>HDžHRHDžDžDžHHH+H5HHHHHcHCHHk\HHPtHHDžHHDžDžDžHHH(H5nH*HH}HHDžH2HDžDžDžHHH)H5HHHltHHDžHHDžDžDžHH H*H5H$HH}HHDžH,HDžDžDžHHH+H5qHHHfttHHDžHHDžDžDžHHH+H5HHH}HHDžH&HDžDžDžHHH,H5HHH`(tHHDžHHDžDžDžHHH)H5tHHH}H HDžH HDžDžDžHH~H*H5%HHHZtHHDžHHDžDžDžHHH*H5HHH}HHDžHHDžDžDžHHxH+H5HHHT tHHDž HHDžDžDžHHH)H5(H HH}HHDžHHDžDžDžHHrH*H5HHHN\tHyHDžHHDžDžDžHHH*H5HHH}HHDžHHDžDžDžHHlH+H53HHHHHoHDž HHDžDžDžHHH-H5HHH-HHDž$HHDžDžDžHH_H.H5HzHH;,HkHDž0HHDžDžDžHHHH52HHHHHDž2HHDžDžDžHH`HH5H{HH<HqHDž4HHDžDžDžHHHH5YHHHHHDž6HHDžDžDžHHfHH5HHHBHwHDž8HHDžDžDžHHHH5}HHHHHDž:HHDžDžDžHHlHH5HHHHH}HDž<HHDžDžDžHHHH5H HH tHHDžBHHDžDžDžHH=HH5HXHHHIHDžFH]HDžDžDžHHHH5HHHHHDžJHHDžDžDžHH9HH5HTHH~HHHDžNH\HDžDžDžHHHH5HHHtHHDžVHHDžDžDžHH2HH57HMHH}HAHDžZHUHDžDžDžHHHH5HHHHK0eHcHC8HHHHHHHHHLtHHDžbHHDžDžDžHHHH5?HHH}HHDžfH#HDžDžDžHHHH5HHH]HK07HcHC8HHHHHHHHHLtH\HDžlHpHDžDžDžHHHH5)HHH}HHDžpHHDžDžDžHHOHH5HjHH+HK0 HcHC8HHHHHHHHHLtH*HDžvH>HDžDžDžHHH H5HHHx}HHDžzHHDžDžDžHHH H5H8HHHK0HcHC8HHHHHHHHHLtHHDžH HDžDžDžHHjHH5HHHF}HyHDžHHDžDžDžHHHH5HHHHHcHCHHk\HHPtHHDžHHDžDžDžHHJHH5HeHH&}HYHDžHmHDžDžDžHHHH5HHHHHcHCHHk\HHPtHHDžHHDžDžDžHH*HH5HEHH}H9HDžHMHDžDžDžHHHH5HHHHHcHCHHk\HHPtHHDžHHDžDžDžHH HH5H%HH}HHDžH-HDžDžDžHHHH5HHHgtHHDžHHDžDžDžHHHH5HHH}HHDžH'HDžDžDžHHHH5HHHattHHDžHHDžDžDžHHHH5)HHH}H HDžH!HDžDžDžHHHH5HHH[(tHHDžHHDžDžDžHHHH5EHHH}HHDžHHDžDžDžHHyHH5ռHHHUtHHDžHHDžDžDžHHHH5]H HH}HHDžHHDžDžDžHHsHH5HHHO tHzHDžHHDžDžDžHHHH5wHHH}HHDžHHDžDžDžHHmHH5HHHI\tHtHDžHHDžDžDžHHHH5HHH}HHDžH HDžDžDžHHgHH5 HHHCHjHDžH~HDžDžDžHHHH5HHHHHDžHHDžDžDžHHZHH56HuHH6HfHDžHzHDžDžDžHHHH5ǸHHHHHDžHHDžDžDžHH[H H5ZHvHH7HlHDžHHDžDžDžHHH H5HHHHHDžHHDžDžDžHHaH H5zH|HH=HrHDžHHDžDžDžHHH H5 HHHHHDžH HDžDžDžHHgH H5HHHCHxHDžHHDžDžDžHHH H5*HHH tHHDž HHDžDžDžHH8HH5HSHHHDHDžHXHDžDžDžHHHH5HHHHHDžHHDžDžDžHH4HH5HOHH~HCHDžHWHDžDžDžHHHH5/HHHtHHDž HHDžDžDžHH-HH5HHHH }H<HDž$HPHDžDžDžHHHH5аHHHHK0`HcHC8HHHHHHHHHLtHHDž,HHDžDžDžHHHH5HHH}H HDž0HHDžDžDžHH|HH5ɯHHHXHK02HcHC8HHHHHHHHHLtHWHDž6HkHDžDžDžHHHH5}HHH}HHDž:HHDžDžDžHHJHH5HeHH&HK0HcHC8HHHHHHHHHLtH%HDž@H9HDžDžDžHHH H5ZHHHs}HHDžDHHDžDžDžHHH H5H3HHHK0HcHC8HHHHHHHHHLtHHDžJHHDžDžDžHHeHH55HHHA}HtHDžNHHDžDžDžHHHH5HHHHHcHCHHk\HHPtHHDžVHHDžDžDžHHEHH5#H`HH!}HTHDžZHhHDžDžDžHHHH5HHHHHcHCHHk\HHPtHHDž`HHDžDžDžHH%HH5H@HH}H4HDždHHHDžDžDžHHHH5HHHHHcHCHHk\HHPtHHDžjHHDžDžDžHHHH5H HH}HHDžnH(HDžDžDžHHHH5HHHbtHHDžvHHDžDžDžHHHH5 HHH}HHDžzH"HDžDžDžHHHH5HHH\ttHHDžHHDžDžDžHHHH5HHH}HHDžHHDžDžDžHHzHH5HHHV(tHHDžHHDžDžDžHHHH5 HHH}HHDžHHDžDžDžHHtHH5ЦHHHPtH{HDžHHDžDžDžHHHH5)HHHɿ}HHDžHHDžDžDžHHnHH5H艿HHJ tHuHDžHHDžDžDžHHHH53HHHþ}HHDžH HDžDžDžHHhHH5H胾HHD\tHoHDžHHDžDžDžHHHH5<HHH载}HHDžHHDžDžDžHHbHH5H}HH>HeHDžHyHDžDžDžHH׼HH5BHHH購HHDžHHDžDžDžHHUHH51HpHH1~HdHDžHxHDžDžDž HHֻH*H5UHHH費HHDžHHHHHDžDžDžHHH HgHDžH{HDžDžDž HHٺHuHEH HEHHHDHHHMUEIAH HމE~HEHtH診EPHHHxHHtH耺HH)H8[A\A]]UHATSH HHHHHEIAHѺHƿ>HEfEHHDžHH8Dž@DžDž HH^HHH5ͽHyHH:HoHDžDžDž HHHHH%HDžH9H8Dž@DžDž HH藸HHHDHϸHËHIAH Hމ·#HHHDHxIċP#L ĠA HLqHHtH-HHHDHHËP##HIALHމLHtH·P#HHH荷HHtH蕷HH>HsHDžDžDž HHHH*HHDžH HHDžDHH8Dž@Dž0Dž HHtH H5XQH菶HHPHHDžHH8Dž@DžDž HHHHHDH/IċHIAH L"HHHDHصHËPL UA LHމѴLHtH荵HHHDHwIċPHMIAHLpHHtH,HHHDHHËPL ALHމLHtH˴PHHH蘴HHtH蠴HHIH~HDžDžDž HHHHHH N UH HDžH H8Dž@DžDž HH~HHHDH足HËHIAH 5Hމ該-HHHDH_IċP-L AHLXHHtH/HHHDHHËP-/HMIALHމLHtH賲P/HHH耲HHtH舲HH1SHaHDžHuH8Dž@DžDž HHӱHHHDH IċxHL AHщLHHHDH谱HËPHIALHމ蝰LHtHYHHHDH:IċzL ͙AHىL$HHtHHHHDHHËPHMIALHމ訯LHtHdPHHH(HHtH0HHٯHHDžDžDž HH蘯HH華HıHDžHسH8Dž@DžDž HH6HHHDHnIċHIAH LaHHHDHHËPL ՗ALHމLHtḪPHHH虮HHtH衮HHJHHDžDžDž HH HHHH H VJH HDžH!H8Dž@DžDž HHHHHDH跭IċHIAH |L説?HHHDH`HËP?L LA#LHމYLHtHP?HHHHHtHHH蓬:HîHDžHװH8Dž@DžDž HH5HHHDHmIċHIAH rL` HHHDHHËP L ̔ALHމLHtH˫ HHHDH诫IċP HIAHL蜪HHtHX #HHHDH9HË  z#L A#LH#LHtHߪ P#HHH裪HHtH諪HHTHHDžDžDž HHHH H?HDžHSH8Dž@DžDž HH豩HHHDHIċHIAH %LܨHHHDH蒩HËPL ALHމ苨LHtHGPHHHHHtHHHŨHHDžDžDž HH脨HH{HHDžHĬH8Dž@DžDž HH"HQH5CH=HHH3HDžDžDž HH轧HH货HHDžHH8Dž@DžDž HH[HHHDH蓧IċHIAH L膦,HHHDH<HËP,L `A)LHމ5LHtHP,HHH辦HHtHƦHHoHHDžDžDž HH.HH%HZHDžHnH8Dž@DžDž HH̥HQH5BHHH訥HݧHDž DžDž HHgHH^HHDž$HH8Dž@DžDž HHHHHDH=IċHIAH yL0HHHDHHËPL 3A LHމߣLHtH蛤PHHHhHHtHpHHHNHDž%DžDž HHأHHϣHHDž&HH8Dž@DžDž HHv HHHDH讣Iċ HIAH  L衢HHHDHWHËP L A LHމPLHtH PHHH٢HHtHHH芢HHDž'DžDž HHIHH@H [A\]UHATSHHHHƿ@EB}H/HDž{HCHHDžPDžDž HH衡}IE HHHDHҡIH}IU}IE IAH & L赠}IEHHHDHdHø}IEP }IEL ЊA LHމOLHtH }IEPHHHѠHHtH٠HH肠xHHDž}HƤHHDžPDžDž HH$}IEHHHDHUIH}IU}IEIAH L8}IE HHHDHHø}IEP}IE L SA LHމҞLHtH莟}IEP HHHTHHtH\HHH:HDžDžDž HHĞHH軞H@PHޠHDžH~HHDžPDžDž HHP}IEHHHDH聞IH}IU}IEIAH Ld}IE6HHHDHHø}IEP}IE6L ‡ALHމLHtH躝}IEP6HHH耝HHtH舝HHHDHHHTHHHHHHH2HH H@@twHHDžH HHDžPDžDž HHi}IEHHHDH蚜IH}IU}IEIAH L}}IE%HHHDH,Hø}IEP}IE%L ALHމLHtHӛ}IEP%HHH虛HHtH衛HHJl HzHDžHHHDžPDžDž HH}IEHHHDHIH}IU}IEIAH L}IE%HHHDH诚Hø}IEP}IE%L }ALHމ蚙LHtHV}IEP%HHHHHtH$HH͙HHDžHHHDžPDžDž HHo}IEHHHDH蠙IH}IU}IEIAH %L胘}IE%HHHDH2Hø}IEP}IE%L ALHމLHtH٘}IEP%HHH蟘HHtH觘HHPrH@@+HnHDžHHHDžPDžDž HH}IEHHHDHIH}IU}IEIAH L}IE6HHHDH裗Hø}IEP}IE6L RALHމ莖LHtHJ}IEP6HHHHHtHHH5HHH5HЖHH苖HHDžHԚHHDžPDžDž HH2}IE HHHDHcIH}IU}IE IAH 3 LF}IEHHHDHHø}IEP }IEL ALHމLHtH蜕}IEPHHHbHHtHjHH4HCHDžHHHDžP DžDž HH赔}IEHHHDHIH}IU}IEIAH k~Lɓ}IE"HHHDHxHø}IEP}IE"L k~ALHމcLHtH}IEP"HHHHHtHHHH@HHH蹓HHtHHDžHXHHDžP DžDž HH}IE HHHDHLIH}IU}IE IAH } L/}IE%HHHDHޒHø}IEP }IE%L |ALHމɑLHtH腒}IEP%HHHKHHtHSHHH@HHHHHڑH[A\]UHATSHHHHƿ@趑EH֓HDžBHHHDžPDžDž HHH}IEHHHDHyIH}IU}IEIAH yL\}IEHHHDH Hø}IEP}IEL {ALHމLHtH貐}IEPHHHxHHtH耐HH)H^HDžCDžDž HHHHߏH@LHHDžKHNzHHDžPDžDž HHt}IEHHHDH襏IH}IU}IEIAH *yL舎}IE5HHHDH7Hø}IEP}IE5L jyALHމ"LHtHގ}IEP5HHH褎HHtH謎HHHDHHHxHH3xHcHDžRHwHHDžPDžDž HHՍ}IEHHHDHIH}IU}IEIAH wL}IE%HHHDH蘍Hø}IEP}IE%L _wALHމ背LHtH?}IEP%HHHHHtH HH趌H[A\]UHAUATSH8LH̎HDžCtHCtHDž DžHH&Ct;HtHDžHHDžDžDž HHH7H5vHHH‹CxHH¾H HуHt HHуHt fHHуHt HHHHtHtfHtHǃǃǃ)H9HDžHCxHDžDžHH舊HHDžHEHHHpDžxDž@DžHH*EԅHAH DuHƿ;E܃}~@E܃HƄ#E܃H<0uE܃HƄ#mHAH tHƿ؉E܃}+EHHHHDH׉IċE܃HHH4+EܺIи+EܹHIAH AtL览+E܅+EܺHDhIcH=vHLHI:IcHLH2IcźH)HIcHȾ HLHHHH¾H HуHt HHуHt fHHуHt HHHHtHtfHtHH5HDž/HIHDžDžDžHH觇HH5rH‡HH胇HHDž0H̋HDžDžDžHH*HH5)rHEHHH;HDž2DžDžHH蹆ǃHHDž:ǃHHHHDžHqqHDžDž 0DžHHHMHHH?HH@ǃuH"HDžDǃHHHpHDžDž DžHHdHH[wHHDžLDžDžHH!HhHDžNDžDžHHHHHHHHHHHH譄HHDžPDžDžHH`HHDžRHgoHDžDžDžHHHMH(HH.HH݃HEAH nHƿ(ރHHDžZCtHCtHHnHDžDžDžHH#Ctt}HHDž^HHDžDžDž HHH>H5nHHHۂHHDžiCtHCtHH nHDžHmHDžDžDžDžHH0CtH~HDžoHHDžDžDž HHHBH5WmH HH́ǃCpHHDžyHDžDžDžHHjHH5hlH腁HHFH{HDžzHDžDžDžHHHH5kHHHրH HDž|ǃHHHDžDž DžHHZHMHHH臀HH6HHDž}CpHCpHHDžDž DžHHHMHHHHHCp9HHDžHHDžDžDž HHbHHH5kH}HH>HsHDžH"HDž DžDž HH~HH5jHHHHH~HH~H؀HDžHHDž DžDž HHJ~HH5]jHe~HKpHHHP~HH ~uCp~ CpH&HDžCtHCtHHhHDžDžDžHHP}Ctt}HHDžH΁HDžDžDž HH,}HIH5ciHG}HH}iEHEH @ @ @ @ @ @ @ @ f@$ @& E H~HDžHEHDž(HDžDžHhHDžDžPHH.|HMHHHO|HH |HUH(Hb{HHHUHPHUHPHUHPHUH@ HEE<+uǃE<1uǃH}HDžHHDžDžDž HH={H'H5gHX{HH{"H=a{gEHEH @ @ @ @ @ @ @ @ f@$ @& m=EH|HDžHEHDž(HDžDžH gHDž DžPHH-zHMHHHTzHH zHUH(HayHHHUHPHUHPHUHPHUH@ HEE<0uǃE<.uǃH{HDžH}HDžDžDž HHNH=px p%HbHDž H eHXDž`DžDž HHk`H2H5RH`HHG`H={opoH]bHDž HqdHXDž`DžDž HH_H2H5QH_HH_ nnt}HaHDž HcHXDž`DžDž HH9_H1H5@QHT_HH_H[]UHSHLӋp9HaHDžH"cH8Dž@DžDž HH^H=H5PH^HH\^"H=Q^$9Hl`HDž$HbH8Dž@DžDž HH]H;H5]PH]HH]"H=]9H_HDž+HaH8Dž@DžDž HH<]H<H5OHW]HH]"H=` ]tDp$9H_HDž:H.aH8Dž@DžDž HH\H<H5OH\HHh\"H=]\p9Hx^HDžAH`H8Dž@DžDž HH[H=H5)OH\HH["H=[($9H]HDžPH_H8Dž@DžDž HH:[H;H5NHU[HH["H=^ [HK0aHcHC8HHHHHHHHHLt}H\HDžaH_H8Dž@DžDž HHeZH<H5$NHZHHAZtHK0 aHcHC8HHHHHHHHHLt}H/\HDžlHC^H8Dž@DžDž HHYH>H5MHYHH}Y(HK0M`HcHC8HHHHHHHHHLt}Hk[HDžwH]H8Dž@DžDž HHXH:H5MHXHHXHK0_HcHC8HHHHHHHHHLt}HZHDžH\H8Dž@DžDž HHXH<H5LH4XHHWH*ZHDžH>\H8Dž@DžDž HHWH7H5[LHWHHxWHDžHDžHDžHDžHEHHDžHHxHH,HHH HH tHU}HXHDžH [H8Dž@DžDž HHjVH*H5aKHVHHFV}~}HpXHDžHZH8Dž@DžDž HHUH(H5 KHUHHUH[]UHHLЋ D X9HWHDž HYHXDž`DžDž HH+UH/H5zJHFUHHU"H=OT 9HWHDž H+YHXDž`DžDž HHTH2H5JHTHHeT"H=ZT\X 9HgVHDž H{XHXDž`DžDž HHSH3H5IHSHHS"H=SHDž HDž(HDž0HDž8HMHHDžH 1H`qHAHH tHU}H4UHDž HHWHXDž`DžDž HHRH,H5HHRHHR}~}HTHDž HVHXDž`DžDž HHRH*H5=HH9RHHQUHATSHHLExT@EEH@H*YE}pK Q^(,*.҅t  tE돐ED`H@D*YE*M\{QAHPLC`H@LB;}V~"wv+t|o=~E-w^LH@LH@L H@L@H@LH@L~HRHDž HXlHHDžP DžDž HHPH4H5jFH6PHHOH[A\]UHH H}EHEHHDHEHHgOEHE@@;EuUHEPHEEUHATSHLEEHEH OEHEHcHCHHk\HHP@E܉H EHcHCH‹EHk\HHDE܉EHEHNE܃}y6HEHcHCHHk\HHHS(HC H9E;EHEHcHCHHk\HHHEHcHCHHk\HHPEH EHcHCH‹EHk\HHDHEHcHCHHk\HHP@E܉E܉E H EHcHCH‹EHk\HHDEEHC(AED9eHEHcHCHHk\HIHHEHcHCHHk\HH@HOHhDžp Dž`Džd H`HQMH`H5CHlMHUHcHSHHk\H@H H`HH?MH`H5CHMHUHcHSHHk\H@HHHH`HHLH`H5]CHLHUHcHSHHk\H@HHHH`HHLH`H5CH|LHUHcHSHHk\H@HHH H`HHLLH`HLD9eEHS(HC H9|HC(AED9eeHEHcHCHHk\HHHH EHcHCHHk\HHH9HMHhDžp Dž`Džd H`HH@H`IA@H 6HƿA>HEHcHCHHk\H H`@HH?HEHcHCHHk\HHPD9eEEEE9EH UHcHSHHk\HHPHEHcHCHHk\Hsingf@leHUHcHSHHk\HH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 ED9E҃EDEE9EH UHcHSHHk\HHPHEHcHCHHk\Hdoubf@leHUHcHSHHk\HH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 EC9E҃ECEE9EH UHcHSHHk\HHPHEHcHCHHk\HquadHUHcHSHHk\HH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 EB9E҃EHĐ[A\]UHHEEHEH:;EHEH!;E}x"E;EtEEEEEE뿐H~=HDž | DžDž HH;HH5,2H#;HMHHH;HH:E LUHHHLҸxT@EEH@D*YE(*E(^(,*.Ʌt  tE뤐EHHHHB`H@H!}N| ~wr':|kB~Ctw^LH@HH@HH@H H@H@H@H~H;HDž  HnUHXDž` DžDž HH19H7H5x0HL9HH 9UHATSHLEEHEH8EHK0EHcHC8HHHHHHHHHP@EHs0EHcHC8H‹MHHHHHHHHDEEHEH 8E}E;EEHK0EHcHC8HHHHHHHHHP@EHs0EHcHC8H‹MHHHHHHHHDHK0EHcHC8HHHHHHHHHLEE2Hs0EHcHC8H‹MHHHHHHHHDEEHSXHCPH9|HCXAEED9HK0EHcHC8HHHHHHHHIHFHK0EHcHC8HHHHHHHHH@oH9HxDž DžpDžt HpH6HpH5 .H6HK0EHcHC8HHHHHHHH@HHpHHi6HpH5-HH6HK0EHcHC8HHHHHHHH@HHHHpHH6HpH5,H5HK0EHcHC8HHHHHHHH@HHHHpHH5HpH^5ED9UUC`DeED9eVHK0EHcHC8HHHHHHHHHD` t  E;HK0EHcHC8HHHHHHHHHD6HK0EHcHC8HHHHHHHHbyteHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 HK0EHcHC8HHHHHHHHHL)Ed:HK0EHcHC8HHHHHHHHHD5HK0EHcHC8HHHHHHHHshor@tHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: HK0EHcHC8HHHHHHHHHLE'9HK0EHcHC8HHHHHHHHHDb4HK0EHcHC8HHHHHHHHfin@tHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< HK0EHcHC8HHHHHHHHHLE7HK0EHcHC8HHHHHHHHHD%3HK0EHcHC8HHHHHHHHlongHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 HK0EHcHC8HHHHHHHHHLmH2HxDž HEHDž@HDžDžtDžp@HpHl/HK0EHcHC8HHHHHHHH@HHHHpHH`/HpH/HUHP@Hs.HPHpIA@H &HƿCO.HK0EHcHC8HHHHHHHHHp@HH.HK0EHcHC8HHHHHHHHHLD9eE$DeED9eeHK0EHcHC8HHHHHHHHHDHHHcHHfTT:::V4EE4HK0EHcHC8HHHHHHHHHD/HK0EHcHC8HHHHHHHHbyteHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 HK0EHcHC8HHHHHHHHHLS3EE3HK0EHcHC8HHHHHHHHHD<.HK0EHcHC8HHHHHHHHshor@tHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: HK0EHcHC8HHHHHHHHHL1E1HK0EHcHC8HHHHHHHHHD,HK0EHcHC8HHHHHHHHfin@tHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< HK0EHcHC8HHHHHHHHHL|0Ek0HK0EHcHC8HHHHHHHHHD+HK0EHcHC8HHHHHHHHlongHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 HK0EHcHC8HHHHHHHHHLmH*HxDž] HEHDž@HDžDžtDžp@HpH'HK0EHcHC8HHHHHHHH@HHHHpHH'HpH'HUHP@H&HPHpIA@H HƿC&HK0EHcHC8HHHHHHHHHp@HHt'HK0EHcHC8HHHHHHHHHLD9eE-4ME9M!Hs0EHcHC8HHHHHHHHHLHK0EHcHC8HHHHHHHHbyteHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 E,9MEg,;ME9M(Hs0EHcHC8HHHHHHHHHLHK0EHcHC8HHHHHHHHshor@tHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 f@8 @: E;+9ME"+;ME9M(Hs0EHcHC8HHHHHHHHHLHK0EHcHC8HHHHHHHHfin@tHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 @< E)9ME)4ME9M!Hs0EHcHC8HHHHHHHHHLHK0EHcHC8HHHHHHHHlongHK0EHcHC8HHHHHHHHH @ @ @ @ @ @ @ @ @$ @( @, @0 @4 @8 E(9MEHĀ[A\]UHHEEHEH*!EHEH!E}x"E;EtEEEEEEɐH~#HDž = DžDž HH!HH5H#!HMHHH!HH E2UHSHXHHHHH։ E HH @ @ @ @ @ @ f@ @ EE9EHUHcAw9HUHc҃ UHc҈$HUHc UHc҈9E҃EqHHHJH!HDžmHHHH6 HDžDž Dž HHHHHHHHH~ HH HDžH"HDžDžDž HH=HHHDHuHËHIAH HމhPHHHHHtH HHHAH & HƿE}aEH<&IEEHE܃HH4+EܺHAH 3EE؋U܋E؉U9EbUHcAw5UHc҃ UHc҈9E҃EtHE܃HH4E܋U؉)ȃHHHѺ BHHHDžHHHDž Dž HHHHHDžDžDž HHHHHDHHËHIAH ?HމPHHHjHHtHrHHHX[]UHHHH+HDž @HHpDžx HEH8Dž@DžHHbEIHHDž IHHH0HOH@Dž< HAHHDžPH9HxDžHHDžDž cDž HHHHHDž MHHXDž`DžDž HHmHH5mHHHInH\HHEHH=:UEH=HDž eHHH0HHDž|Dž HA0AH H5HyHA0AHH5#HKHA0AHH5 HDž HHHHHH%HDž kH9HXDž`DžDž HHH-H5HHHsHHDž qHqHDž|DžHA0AHH5JHHA0AHcH5"HHA0AH<H5HDž HHHHHHDž sDžDž HH5HHEHH=jE5HRHDž }HHH0H<HDž|Dž HAAH4H5$HHAAH H5$H`HAAHH5&H2HAAHH5l&HDž HHHHHH HDž H HXDž`DžDž HH~H*H5 HHHZHHDž H HDž|DžHAAHH55#HHAAH`H5#HHAAH;H5$HHAAHH5$HWDž HHDHH;HpHDž DžDž HHHHEHH=l #EH HDž HHH0H" HDž|Dž HAAHH5!HGHAAHH5u!HHAAHH5C!HHA0AHH5=HHA0APHoH5HHA0APHJH51!HaHA0APH%H5 H3Dž HHHHHH;HDž HOHXDž`DžDž HHH*H5, HHHHHDž HHDž|DžHAAHH5pHHAAHH5>HHAAHH5 HHA0AHbH5HHA0APH8H5HXHA0APHH5H*HA0APHH5lHDž HHHHHHDž DžDž HHHHEHH=AEHHDž HHH0HHDž|Dž HAAHH5 H HAAHH5H HAAHH5H HAAHsH5Hb HAAHMH5`H4 HAAH(H56H HAAHH5 H HAAHH5H HAAHH5H| Dž HHQ HHH HHHDž HHXDž`DžDž HH H-H5H HH HHDž HdHDž|DžHAAHSH5yHY HAAH+H5OH+ HAAHH5%H HAAHH5'H HAAHH5H HAAHH5Hs HAAHoH5yHE HAAHJH5OH HAAH#H5%H Dž HH HH H HDž DžDž HH HHEHH=aEH HDž HHH0HHDž|Dž HAAH H5HHAAH H5 HHAAH H5H}HAAH H5 HOHAAHu H51H!HAAHJ H5o HHAAH H5HDž HHHHHH HDž H HXDž`DžDž HH?H-H5&HZHH@HK HDž HHDž|DžHAAH H5 HHAAH H5HtHAAH H5N HFHAAHi H5HHAAH> H5 HHAAH H58HHAAH H5 HDž HH{HHrHHDž DžDž HH%HHEHH=>ZEcHBHDž HHH0HHDž|Dž HAAHH5n H~HAAHH5HPHAAHH5H"HAAH_H5`HHAAH4H56HDž HHHHHHHDž HHXDž`DžDž HH@H-H5_H[HHAHLHDž HHDž|DžHAAHH5 HHAAHH5HuHAAHH5HGHAAHH5HHAAHYH5[HDž HHHHHHDž HHH0HTH8Dž@DžDž HH%H~}HHDž HHXDž`DžDž HHHH5GHHHUHH}HuHUEH։fH5)[Ð%T%V%X%Z%\%^%`%b%d%f%h%j%l%n%p%r%t%v%x%z%|%~%%%%%%%%%%%%%%%%%%%%%%hhh*hJhih|hrhhh^hTh%JhI@hr6h,h"hhhh hCh]hwhhhhhh,hKhmhhxhnhdhZhBPhhFhu<h2h(hhh hLAS%ymake_pm.f90Integer overflow when calculating the amount of memory to allocateAllocation would exceed memory limitchar_targetAttempting to allocate already allocated variable '%s'At line 3923 of file make_pm.f90Attempt to DEALLOCATE unallocated '%s'At line 3935 of file make_pm.f90pdnamepmnameincnameieeefptwoscompbytesizewordsizestdinstdoutstderrstdcom_verscom_sernos_versasciiebcdiciso_10646stringslogeqintlogbytelogshortlogintloglongautorealspsrdpdrqpqrautointbdsdidldREPLACEWRITE( a)can't open ! bof! **********************************************************************! Fortran 95 program processor_model! Source Control Strings! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $! Copyright 2004 Purple Sage Computing Solutions, Inc.! Summary of License! This program is free software; you can redistribute it and/or modify! it under the terms of the GNU General Public License as published by! the Free Software Foundation; either version 2 of the License, or! (at your option) any later version.! This program is distributed in the hope that it will be useful,! but WITHOUT ANY WARRANTY; without even the implied warranty of! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! GNU General Public License for more details.! You should have received a copy of the GNU General Public License! along with this program; if not, write to the Free Software! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.! To report bugs, suggest enhancements, etc. to the Authors,! Contact:! Purple Sage Computing Solutions, Inc.! send email to dnagle@erols.com! or fax to 703 471 0684 (USA)! or mail to 12142 Purple Sage Ct.! Reston, VA 20194-5621 USA! prints a description of the processor model to output_unit! use processor_dependencies! processor_model uses! processor_dependencies describes the processor! processor_model reads! none! processor_model writes! output_unit all output! processor_model library! processor modelprogram processor_model! use standard kind definitions, &cuse processor_dependenciesuse, intrinsic :: iso_fortran_env! declare all variablesimplicit none! processor_model RCS strings! program source filename supplied by RCScharacter (len= *), parameter :: processor_model_rcs_id = & '$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $'character( len= *), parameter :: & processor_model_timestamp = ''! processor_model data! date_and_time() character buffers character( len= 8) :: dbuff character( len= 10) :: tbuff character( len= 5) :: zbuff! date_and_time() values array integer, dimension( 8) :: val! system_clock() arguments integer :: im, ir, ic! cpu_time() argument real :: ct! random_number() seed array integer, dimension( random_seed_size) :: iseed! logical true and false logical, parameter :: ltrue = .true. logical, parameter :: lfalse = .false.! integer true and false integer :: itrue, ifalse! processor_model textcontinue ! processor_model! banner write( unit= *, fmt= *) write( unit= *, fmt= *) 'Processor Model'! version control write( unit= *, fmt= *) 'Version Control'! report processor_model version strings write( unit= *, fmt= *) 'processor_model ', processor_model_rcs_id write( unit= *, fmt= *) 'timestamp ', processor_model_timestamp! report compiler version strings write( unit= *, fmt= *) 'compiler_version ', compiler_version write( unit= *, fmt= *) 'compiler_serial ', compiler_serial write( unit= *, fmt= *) 'os_version ', os_version write( unit= *, fmt= *) 'standard_version ', standard_version! report processor_dependencies version strings write( unit= *, fmt= *) 'processor_dependencies ', processor_dependencies_rcs_id! detect mismatch between processor_dependencies and processor_model if( processor_dependencies_rcs_id /= processor_model_rcs_id )then write( unit= *, fmt= *) 'processor_dependencies - processor_model mismatch' write( unit= *, fmt= *) endif if( processor_depends_timestamp /= processor_model_timestamp )then! processor dependent parameters write( unit= *, fmt= *) 'Processor Memory Parameters' write( unit= *, fmt= *) 'size of a numeric storage unit', numeric_storage_size write( unit= *, fmt= *) 'size of a character storage unit', character_storage_size write( unit= *, fmt= *) 'size of a file storage unit', file_storage_size if( is_big_endian ) write( unit= *, fmt= *) 'big endian' if( is_little_endian ) write( unit= *, fmt= *) 'little endian' write( unit= *, fmt= *) 'Processor Software Parameters' write( unit= *, fmt= *) 'processor supports Fortran 90 Standard' write( unit= *, fmt= *) 'processor supports Fortran 95 Standard' write( unit= *, fmt= *) 'processor supports Fortran 2003 Standard' if( has_varying_strings ) write( unit= *, fmt= *) 'processor supports iso_varying_string' write( unit= *, fmt= *) 'Processor Input/Output Parameters' write( unit= *, fmt= *) 'preconnected input unit', input_unit write( unit= *, fmt= *) 'preconnected output unit', output_unit if( output_unit == error_unit )then write( unit= *, fmt= *) 'no preconnected error unit' else write( unit= *, fmt= *) 'preconnected error unit', error_unit write( unit= *, fmt= *) 'default filename ', default_filename if( opt_plus_sign )then write( unit= *, fmt= *) 'writes optional plus sign' write( unit= *, fmt= *) 'does not write optional plus sign' if( leading_zero_f )then write( unit= *, fmt= *) 'writes leading zero using f format' write( unit= *, fmt= *) 'does not write leading zero using f format' if( leading_zero_e )then write( unit= *, fmt= *) 'writes leading zero using e format' write( unit= *, fmt= *) 'smallest decimal exponemt with list-directed f format', ld_fmt_fmin write( unit= *, fmt= *) 'largest deciaml exponent with list-directed f format', ld_fmt_fmax if( ld_fmt_comma )then write( unit= *, fmt= *) 'writes comma using list directed format' write( unit= *, fmt= *) 'does not write comma using list directed format'( a, 1x, i20) write( unit= *, fmt= *) 'end of record iostat', write( unit= *, fmt= *) 'end of file iostat', write( unit= *, fmt= *) 'direct access read undefined record iostat', write( unit= *, fmt= *) 'maximum record length', max_recl write( unit= *, fmt= *) 'Miscelleanous Processor Dependent Parameters' write( unit= *, fmt= *) 'random seed size', random_seed_size call random_seed( get= iseed) write( unit= *, fmt= *) 'initial random seed', iseed itrue = transfer( ltrue, itrue) write( unit= *, fmt= *) 'integer value of true', itrue ifalse = transfer( lfalse, ifalse) write( unit= *, fmt= *) 'integer value of false', ifalse if( is_ieee_fp )then write( unit= *, fmt= *) 'fp uses ieee 754 format' write( unit= *, fmt= *) 'fp uses non-ieee format' if( is_2s_comp )then write( unit= *, fmt= *) 'integers are twos complement' write( unit= *, fmt= *) 'integers are not twos complement' write( unit= *, fmt= *) 'Processor Clock' call system_clock( ic, ir, im) if( ic == -huge( 0) )then write( unit= *, fmt= *) 'processor has no clock' write( unit= *, fmt= *) 'clock rate', ir write( unit= *, fmt= *) 'clock max', im call date_and_time( date= dbuff) if( dbuff == ' ' )then write( unit= *, fmt= *) 'date not available' write( unit= *, fmt= *) 'date ', dbuff call date_and_time( time= tbuff) if( tbuff == ' ' )then write( unit= *, fmt= *) 'time not available' write( unit= *, fmt= *) 'time ', tbuff call date_and_time( zone= zbuff) if( zbuff == ' ' )then write( unit= *, fmt= *) 'zone not available' write( unit= *, fmt= *) 'zone ', zbuff call date_and_time( values= val) if( val( 1) == -huge( 0) )then write( unit= *, fmt= *) 'value year not available' write( unit= *, fmt= *) 'value year', val( 1) if( val( 2) == -huge( 0) )then write( unit= *, fmt= *) 'value month not available' write( unit= *, fmt= *) 'value month', val( 2) if( val( 3) == -huge( 0) )then write( unit= *, fmt= *) 'value day not available' write( unit= *, fmt= *) 'value day', val( 3) if( val( 4) == -huge( 0) )then write( unit= *, fmt= *) 'value utc not available' write( unit= *, fmt= *) 'value utc', val( 4) if( val( 5) == -huge( 0) )then write( unit= *, fmt= *) 'value hour not available' write( unit= *, fmt= *) 'value hour', val( 5) if( val( 6) == -huge( 0) )then write( unit= *, fmt= *) 'value minute not available' write( unit= *, fmt= *) 'value minute', val( 6) if( val( 7) == -huge( 0) )then write( unit= *, fmt= *) 'value second not available' write( unit= *, fmt= *) 'value second', val( 7) if( val( 8) == -huge( 0) )then write( unit= *, fmt= *) 'value msec not available' write( unit= *, fmt= *) 'value msec', val( 8) call cpu_time( ct) if( ct >= 0.0 )then write( unit= *, fmt= *) 'has cpu time' write( unit= *, fmt= *) 'no cpu time'! report kinds summary write( unit= *, fmt= *) 'Kinds Summary' write( unit= *, fmt= *) 'character kinds ', write( unit= *, fmt= *) 'integer kinds ', write( unit= *, fmt= *) 'logical kinds ', write( unit= *, fmt= *) 'real kinds ', write( unit= *, fmt= *) 'default character ', kind( ' ') write( unit= *, fmt= *) 'default integer ', kind( 0) write( unit= *, fmt= *) 'default logical ', kind( .true.) write( unit= *, fmt= *) 'default real ', kind( 0.0)! report character kinds write( unit= *, fmt= *) 'Character Kinds' if( ascii_k > 0 )then write( unit= *, fmt= *) 'ascii character' write( unit= *, fmt= *) 'kind ', ascii_k write( unit= *, fmt= *) 'parameter ascii_k' write( unit= *, fmt= *) 'bit_size ', bit_size( ascii_k_' ') write( unit= *, fmt= *) 'huge', ichar( huge( ascii_k_' ') ) write( unit= *, fmt= *) 'tiny', ichar( tiny( ascii_k_' ') ) write( unit= *, fmt= *) 'no ascii character' if( ebcdic_k > 0 )then write( unit= *, fmt= *) 'ebcdic character' write( unit= *, fmt= *) 'kind ', ebcdic_k write( unit= *, fmt= *) 'parameter ebcdic_k' write( unit= *, fmt= *) 'bit_size ', bit_size( ebcdic_k_' ') write( unit= *, fmt= *) 'huge', ichar( huge( ebcdic_k_' ') ) write( unit= *, fmt= *) 'tiny', ichar( tiny( ebcdic_k_' ') ) write( unit= *, fmt= *) 'no ebcdic character' if( iso_10646_k > 0 )then write( unit= *, fmt= *) 'iso_10646 character' write( unit= *, fmt= *) 'kind ', iso_10646_k write( unit= *, fmt= *) 'parameter iso_10646_k' write( unit= *, fmt= *) 'bit_size ', bit_size( iso_10646_k_' ') write( unit= *, fmt= *) 'huge', ichar( huge( iso_10646_k_' ') ) write( unit= *, fmt= *) 'tiny', ichar( tiny( iso_10646_k_' ') ) write( unit= *, fmt= *) 'no iso_10646 character'! report integer kinds write( unit= *, fmt= *) 'Integer Kinds' if( byte_k > 0 )then write( unit= *, fmt= *) 'byte integer' write( unit= *, fmt= *) 'kind ', byte_k write( unit= *, fmt= *) 'parameter byte_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_byte_k) write( unit= *, fmt= *) 'huge ', huge( 0_byte_k) write( unit= *, fmt= *) 'range ', range( 0_byte_k) write( unit= *, fmt= *) 'digits ', digits( 0_byte_k) write( unit= *, fmt= *) 'radix ', radix( 0_byte_k) write( unit= *, fmt= *) 'no byte integer' if( short_k > 0 )then write( unit= *, fmt= *) 'short integer' write( unit= *, fmt= *) 'kind ', short_k write( unit= *, fmt= *) 'parameter short_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_short_k) write( unit= *, fmt= *) 'huge ', huge( 0_short_k) write( unit= *, fmt= *) 'range ', range( 0_short_k) write( unit= *, fmt= *) 'digits ', digits( 0_short_k) write( unit= *, fmt= *) 'radix ', radix( 0_short_k) write( unit= *, fmt= *) 'no short integer' if( int_k > 0 )then write( unit= *, fmt= *) 'int integer' write( unit= *, fmt= *) 'kind ', int_k write( unit= *, fmt= *) 'parameter int_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_int_k) write( unit= *, fmt= *) 'huge ', huge( 0_int_k) write( unit= *, fmt= *) 'range ', range( 0_int_k) write( unit= *, fmt= *) 'digits ', digits( 0_int_k) write( unit= *, fmt= *) 'radix ', radix( 0_int_k) write( unit= *, fmt= *) 'no int integer' if( long_k > 0 )then write( unit= *, fmt= *) 'long integer' write( unit= *, fmt= *) 'kind ', long_k write( unit= *, fmt= *) 'parameter long_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_long_k) write( unit= *, fmt= *) 'huge ', huge( 0_long_k) write( unit= *, fmt= *) 'range ', range( 0_long_k) write( unit= *, fmt= *) 'digits ', digits( 0_long_k) write( unit= *, fmt= *) 'radix ', radix( 0_long_k) write( unit= *, fmt= *) 'no long integer'! report logical kinds write( unit= *, fmt= *) 'Logical Kinds' if( l_byte_k > 0 )then write( unit= *, fmt= *) 'byte logical' write( unit= *, fmt= *) 'kind ', l_byte_k write( unit= *, fmt= *) 'parameter l_byte_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_byte_k) write( unit= *, fmt= *) 'no byte logical' if( l_short_k > 0 )then write( unit= *, fmt= *) 'short logical' write( unit= *, fmt= *) 'kind ', l_short_k write( unit= *, fmt= *) 'parameter l_short_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_short_k) write( unit= *, fmt= *) 'no short logical' if( l_int_k > 0 )then write( unit= *, fmt= *) 'int logical' write( unit= *, fmt= *) 'kind ', l_int_k write( unit= *, fmt= *) 'parameter l_int_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_int_k) write( unit= *, fmt= *) 'no int logical' if( l_long_k > 0 )then write( unit= *, fmt= *) 'long logical' write( unit= *, fmt= *) 'kind ', l_long_k write( unit= *, fmt= *) 'parameter l_long_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_long_k) write( unit= *, fmt= *) 'no long logical'! report real kinds write( unit= *, fmt= *) 'Real Kinds' if( single_k > 0 )then write( unit= *, fmt= *) 'single real' write( unit= *, fmt= *) 'kind ', single_k write( unit= *, fmt= *) 'parameter single_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_single_k) write( unit= *, fmt= *) 'huge ', huge( 1.0_single_k) write( unit= *, fmt= *) 'tiny ', tiny( 1.0_single_k) write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_single_k) write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_single_k) write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_single_k) write( unit= *, fmt= *) 'range ', range( 1.0_single_k) write( unit= *, fmt= *) 'digits ', digits( 1.0_single_k) write( unit= *, fmt= *) 'radix ', radix( 1.0_single_k) write( unit= *, fmt= *) 'exponent ', exponent( 1.0_single_k) write( unit= *, fmt= *) 'fraction ', fraction( 1.0_single_k) write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_single_k) write( unit= *, fmt= *) 'precision ', precision( 1.0_single_k) write( unit= *, fmt= *) 'nearest ', nearest( 1.0_single_k, 2.0_single_k) write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_single_k) write( unit= *, fmt= *) 'spacing ', spacing( 1.0_single_k) write( unit= *, fmt= *) 'no single real' if( double_k > 0 )then write( unit= *, fmt= *) 'double real' write( unit= *, fmt= *) 'kind ', double_k write( unit= *, fmt= *) 'parameter double_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_double_k) write( unit= *, fmt= *) 'huge ', huge( 1.0_double_k) write( unit= *, fmt= *) 'tiny ', tiny( 1.0_double_k) write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_double_k) write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_double_k) write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_double_k) write( unit= *, fmt= *) 'range ', range( 1.0_double_k) write( unit= *, fmt= *) 'digits ', digits( 1.0_double_k) write( unit= *, fmt= *) 'radix ', radix( 1.0_double_k) write( unit= *, fmt= *) 'exponent ', exponent( 1.0_double_k) write( unit= *, fmt= *) 'fraction ', fraction( 1.0_double_k) write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_double_k) write( unit= *, fmt= *) 'precision ', precision( 1.0_double_k) write( unit= *, fmt= *) 'nearest ', nearest( 1.0_double_k, 2.0_double_k) write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_double_k) write( unit= *, fmt= *) 'spacing ', spacing( 1.0_double_k) write( unit= *, fmt= *) 'no double real' if( quad_k > 0 )then write( unit= *, fmt= *) 'quad real' write( unit= *, fmt= *) 'kind ', quad_k write( unit= *, fmt= *) 'parameter quad_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_quad_k) write( unit= *, fmt= *) 'huge ', huge( 1.0_quad_k) write( unit= *, fmt= *) 'tiny ', tiny( 1.0_quad_k) write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_quad_k) write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_quad_k) write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_quad_k) write( unit= *, fmt= *) 'range ', range( 1.0_quad_k) write( unit= *, fmt= *) 'digits ', digits( 1.0_quad_k) write( unit= *, fmt= *) 'radix ', radix( 1.0_quad_k) write( unit= *, fmt= *) 'exponent ', exponent( 1.0_quad_k) write( unit= *, fmt= *) 'fraction ', fraction( 1.0_quad_k) write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_quad_k) write( unit= *, fmt= *) 'precision ', precision( 1.0_quad_k) write( unit= *, fmt= *) 'nearest ', nearest( 1.0_quad_k, 2.0_quad_k) write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_quad_k) write( unit= *, fmt= *) 'spacing ', spacing( 1.0_quad_k) write( unit= *, fmt= *) 'no quad real'! report complex kinds write( unit= *, fmt= *) 'Complex Kinds' write( unit= *, fmt= *) 'single complex' write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'no single complex' write( unit= *, fmt= *) 'double complex' write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'no double complex' write( unit= *, fmt= *) 'quad complex' write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'no quad complex'stop 'processor_model' ! processor_model! processor_modelend program processor_model ! eofKEEPtrouble closing make_pm.logERROR: can't open make_pm.logmake_processor_model: not completemake_processor_model$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $timestamp: reading make_pm.inERROR: trouble reading make_pm.inno make_pm.in foundread make_pm.in okprocessor supports Fortran 95 standardprocessor supports Fortran 90 standardprocessor supports Fortran 2003 standardprocessor supports Fortran 2008 standardERROR: std = : std must = f90, f95, f03 or f08include file for cocoinclude file for f90pprinclude file for fpp/cppERROR: incname = : incname must = coco.inc, f90ppr.inc or fpp.incno preprocessor include fileprocessor supports iso_varying_stringsprocessor does not support iso_varying_stringsERROR: trouble allocating integer kind arrayNOassigned integer kinds: byte short int longWARNING: no integer kinds detecteddefault integer kind: WARNING: default integer not detected!WARNING: default integer kind not detected!WARNING: default integer kind not unique!ERROR: trouble allocating real kind arrayassigned real kinds: single double quaddefault real kind: WARNING: default real not detected!double precision kind: WARNING: double precision not detected!WARNING: fewer than 2 real kinds detectedWARNING: default real kind not detectedWARNING: default real kind not uniqueWARNING: default double kind not detectedWARNING: default double kind not uniquedefault integer kind same value as default real kinddefined character kinds: ascii ebcdic iso_10646 nonedefault character kind:( 1x, i20)defined logical kinds:default logical kind:no preprocessor include file writtenwriting ERROR: trouble writing wrote okmake_processor_model: complete! Fortran 95 module processor_dependencies! This library is free software; you can redistribute it and/or! modify it under the terms of the GNU Library General Public! License as published by the Free Software Foundation; either! version 2 of the License, or (at your option) any later version.! This library is distributed in the hope that it will be useful,! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU! Library General Public License for more details.! You should have received a copy of the GNU Library General Public! License along with this library; if not, write to the Free! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.! processor_dependencies describes the processor: kinds, processor dependencies, &c! Module processor_dependencies provides standard definitions! of Fortran type kind parameters, and other Fortran! processor dependent quantities. The porting of Fortran! programs from processor to processor is eased because symbolic,! rather than 'magic number' constants and conditions may be used! by the programmer. The understanding of Fortran programs is enhanced! because constants and subprograms have easily undertsood names.! The compiler to which this file applies and the RCS strings of this! file are available as default-kind character parameters.! A set of kinds is defined, each a parameter whose name is _k.! The number of bits per numeric storage unit, per character storage! and per file storage unit are defined.! The intrinsic bit_size() is extended to all types and kinds (a complex! kind is by definition twice the same real kind, but bit_size() should! exist for all kinds). The intrinsics tiny() and huge() are extended to! character and complex kinds. The intrinsic epsilon() is extended to! complex kinds.! Quantities defined include the input and output units preconnected,! and whether there is a preconnected error unit. The size of the! processor's random number generator seed is defined to allow static! declaration of the seed. A flag is defined whether the processor! uses ieee 754 floating point format. A flag is defined whether the! processor uses twos compliment integer arithmetic.! Suggestions for other behavior of Fortran processors which could be! codified in this module are very much welcomed by the author.! A summary listing of defined parameters, and a listing of defined! procedures follows.! use no modules! processor_dependencies uses! *** all parameters are default kind ***! processor_dependencies constants! processor_dependencies_rcs_id= this file's RCS Identifier! compiler_version= compiler to which this file applies! compiler_serial= compiler license serial! os_version= operating system to which this file applies! compiler_standard= Fortran standard supported by the compiler! has_varying_strings- true if processor supports iso_varying_string! ascii_k, ebcdic_k, iso_10646_k= character kinds! byte_k, short_k, int_k, long_k= integer kinds! l_byte_k, l_short_k, l_int_k, l_long_k= logical kinds! single_k, double_k, quad_k= real kinds (& thf complex kinds)! byte_int, short_int, int_int, long_int= type( integer_inquiry_t)! single_real, double_real, quad_real= type( real_inquiry_t)! numeric_storage_size= bits per numeric storage unit! character_storage_size= bits per character storage unit! file_storage_size= bits per file storage unit! is_big_endian= true if processor is big endian! is_little_endian= true if processor is little endian! default_filename= filename of a unit opened without a name! opt_plus_sign= true if optional plus with i, e, f, g formats! leading_zero_f= true if optional leading zero with f format! leading_zero_e= true if optional leading zero with e format! ld_fmt_fmin= smallest exponent list-directed format writes with f format! ld_fmt_fmax= largest exponent list-directed format writes with f format! da_undefined_record= iostat value returned when reading an undefined record! processor_dependencies types! processor_dependencies variables! processor_dependencies operators! *** all integer and logical functions return default kind ***! *** some functions use their argument only to select specific ***! processor_dependencies library! bit_size() for character, logical, real, complex types! int() for logical returns 1 or 0 for T or F! logical() for integers, returns T or F for non-0 or 0! huge() for character kinds ( largest character code)! tiny() for character kinds ( smallest character code)! huge() for complex kinds ( returns sqrt( real huge) )! tiny() for complex kinds ( returns sqrt( real tiny) )! epsilon() for complex kinds ( returns sqrt( real epsilon) )! max_exact_int() largest integer a real kind increments (by one) exactly! processor_dependenciesmodule processor_dependencies! use none! explicit declaration of all names! all variables are staticsave! explicit export of all module namesprivate! processor_dependencies RCS strings! module source filename supplied by RCScharacter( len= *), public, parameter :: processor_dependencies_rcs_id = &character( len= *), public, parameter :: processor_depends_timestamp = & '! processor_dependencies data! compiler & OS version to which this file applies! compiler version used to generate this filecharacter( len= *), public, parameter :: compiler_version = &! compiler serial number used to generate this filecharacter( len= *), public, parameter :: compiler_serial = &! operating system version used to generate this filecharacter( len= *), public, parameter :: os_version = &! standard supported by this compilercharacter( len= *), public, parameter :: standard_version = & 'Fortran 90' 'Fortran 95' 'Fortran 2003' 'Fortran 2008' 'Fortran'! *** all parameters are of default kind ***! modules available to the processorlogical, public, parameter :: has_varying_strings = .true.logical, public, parameter :: has_varying_strings = .false.! The first section defines the kind parameters supported by the processor.! First, the kind parameters are defined.! processor dependent kinds! processor character kinds! ascii characters (seven bit codes stored in eight bit bytes)integer, public, parameter :: ascii_k = selected_char_kind( 'ASCII')integer, public, parameter :: ascii_k =integer, public, parameter :: ascii_k = -1! ebcdic characters (eight bit bytes)integer, public, parameter :: ebcdic_k =integer, public, parameter :: ebcdic_k = -1! iso_10646 charactersinteger, public, parameter :: iso_10646_k = selected_char_kind( 'ISO_10646')integer, public, parameter :: iso_10646_k =integer, public, parameter :: iso_10646_k = -1! processor integer kinds! 8-bit signed integer ( 1.3+2 = huge() )! 16-bit signed integer ( 3.3+4 = huge() )! 32-bit signed integer ( 2.1+9 = huge() )! 64-bit signed integer ( 4.2+18 = huge() )! processor logical kinds! logical kind using same storage as byteinteger, public, parameter :: l_byte_k =integer, public, parameter :: l_byte_k = -1! logical kind using same storage as shortinteger, public, parameter :: l_short_k =integer, public, parameter :: l_short_k = -1! logical kind using same storage as intinteger, public, parameter :: l_int_k =integer, public, parameter :: l_int_k = -1! logical kind using same storage as longinteger, public, parameter :: l_long_k =integer, public, parameter :: l_long_k = -1! processor real ( & thf complex) kinds! This section sets defines parameters specified by the! Fortran standard as being processor dependent. These! parameters describe hardware, I/O, and the intrinsic! random number generator.! values specified by the processor! bits per numeric storage unitinteger, public, parameter :: numeric_storage_size =! bits per character storage unitinteger, public, parameter :: character_storage_size =! bits per file storage unitinteger, public, parameter :: file_storage_size = bit_size( 0) /! signal whether hardware addresses are byte addresses or word addresses(bytes)logical, public, parameter :: is_byte_addressable = .true.logical, public, parameter :: is_word_addressable = .false.logical, public, parameter :: is_byte_addressable = .false.logical, public, parameter :: is_word_addressable = .true.! signal whether hardware is big endian or little endianlogical, public, parameter :: is_big_endian = .true.logical, public, parameter :: is_little_endian = .false.logical, public, parameter :: is_big_endian = .false.logical, public, parameter :: is_little_endian = .true.! i/o units preconnected for input ( unit= *)integer, public, parameter :: input_unit =! i/o units preconnected for output ( unit= *)integer, public, parameter :: output_unit =! i/o unit preconnected for error messages ( output_unit if no other)integer, public, parameter :: error_unit = output_unitinteger, public, parameter :: error_unit =! end of file and end of record iostat= values! end of fileinteger, parameter :: iostat_end =! end of recordinteger, parameter :: iostat_eor =! name of a file opened without a namecharacter( len= *), public, parameter :: default_filename = '! exponents beyond which list-directed format switches from f to einteger, public, parameter :: ld_fmt_fmin =integer, public, parameter :: ld_fmt_fmax =! optional separator when using list directed formatlogical, public, parameter :: ld_fmt_comma = .true.logical, public, parameter :: ld_fmt_comma = .false.! optional plus sign using numeric formatslogical, public, parameter :: opt_plus_sign = .true.logical, public, parameter :: opt_plus_sign = .false.! optional leading zero using f and e formatslogical, public, parameter :: leading_zero_f = .true.logical, public, parameter :: leading_zero_f = .false.logical, public, parameter :: leading_zero_e = .true.logical, public, parameter :: leading_zero_e = .false.! the maximum record length of a sequential recordinteger, public, parameter :: max_recl =! the iostat value returned when attempting to read a record not yet writteninteger, public, parameter :: read_undefined_record =! number of words in the random number generator seed array! this parameter may be used to statically allocate the seed arrayinteger, public, parameter :: random_seed_size =! true if processor uses ieee 754 floating point format! the intent here is _format_, not all the roundings, exceptions, &clogical, public, parameter :: is_ieee_fp = .true.logical, public, parameter :: is_ieee_fp = .false.! true if processor uses 2's complement integer formatlogical, public, parameter :: is_2s_comp = .true.logical, public, parameter :: is_2s_comp = .false.! The following intrinsic procedures are extended to other types:! bit_size() is extended to type character, logical, real & complex.! int() is extended to type logical.! logical() is extended to type integer.! huge() & tiny() are extended to type character and complex.! epsilon() is extended to type complex.! The generic name is defined for each group of procedures and each! specific name is made private; access is only thru the generic name.! bit_size() specific and generic names! bit_size() for kinds character, logical, real (& thf complex) kindsintrinsic :: bit_size ! extend intrinsicintrinsic bit_size ! extend intrinsicpublic :: bit_size ! genericinterface bit_size module procedure ascii_bit_size module procedure ebcdic_bit_size module procedure iso_10646_bit_size module procedure l_byte_bit_size module procedure l_short_bit_size module procedure l_int_bit_size module procedure l_long_bit_size module procedure l_def_bit_size module procedure single_bit_size module procedure double_bit_size module procedure quad_bit_size module procedure single_complex_bit_size module procedure double_complex_bit_size module procedure quad_complex_bit_sizeend interface! int() specific and generic names! int() for logical kindsintrinsic :: int ! extend intrinsicintrinsic int ! extend intrinsicpublic :: int ! genericinterface int module procedure l_byte_int module procedure l_short_int module procedure l_int_int module procedure l_long_int module procedure l_def_int! logical() specific and generic names! logical() for integer kindsintrinsic :: logical ! extend intrinsicintrinsic logical ! extend intrinsicpublic :: logical ! genericinterface logical module procedure byte_logical module procedure short_logical module procedure int_logical module procedure long_logical! epsilon(), huge(), tiny() specific and generic names! huge for character & complex kindsintrinsic :: huge ! extend intrinsicintrinsic huge ! extend intrinsicpublic :: huge ! genericinterface huge module procedure ascii_huge module procedure ebcdic_huge module procedure iso_10646_huge module procedure single_complex_huge module procedure double_complex_huge module procedure quad_complex_huge! tiny for character & complex kindsintrinsic :: tiny ! extend intrinsicintrinsic tiny ! extend intrinsicpublic :: tiny ! genericinterface tiny module procedure ascii_tiny module procedure ebcdic_tiny module procedure iso_10646_tiny module procedure single_complex_tiny module procedure double_complex_tiny module procedure quad_complex_tiny! epsilon for complex kindsintrinsic :: epsilon ! extend intrinsicintrinsic epsilon ! extend intrinsicpublic :: epsilon ! genericinterface epsilon module procedure single_complex_epsilon module procedure double_complex_epsilon module procedure quad_complex_epsilon! max_exact_int() is the largest integer a real kind! can exactly increment by 1.0! max_exact_int() for real kindspublic :: max_exact_int ! genericinterface max_exact_int module procedure single_max_exact_int module procedure double_max_exact_int module procedure quad_max_exact_int! defined in iso_fortran_env with Fortran 2003! interpret iostat valuespublic :: is_iostat_end ! exportpublic :: is_iostat_eor ! export! cpu_time() for f90 processorspublic :: cpu_time ! genericinterface cpu_time module procedure single_cpu_time module procedure double_cpu_time module procedure quad_cpu_time! module procedurescontains ! processor_dependencies! *** all integer and logical functions return default kinds ***! These specific procedures extend bit_size() to character, logical,! real and complex kinds.! bit_size() extend intrinsic bit_size() to all defined processor kindsasciicharacterebcdiciso_10646! l_byte_bit_size() bit_size() for kind byte logicalelemental integer function l_byte_bit_size( bl)logical( kind= l_byte_k), intent( in) :: bl ! selects specific bit_size()! l_byte_bit_size() textcontinue ! bit_size() l_byte_bit_size = bit_size( 0) ! 1 l_byte per nsureturn ! bit_size()! l_byte_bit_size()end function l_byte_bit_sizel_bytelogical! l_short_bit_size() bit_size() for kind short logicalinteger function l_short_bit_size( sl)logical( kind= l_short_k), intent( in) :: sl ! selects specific bit_size()! l_short_bit_size() text l_short_bit_size = bit_size( 0) ! 1 l_short per nsu! l_short_bit_size()end function l_short_bit_sizel_short! l_int_bit_size() bit_size() for kind int logicalinteger function l_int_bit_size( il)logical( kind= l_int_k), intent( in) :: il ! selects specific bit_size()! l_int_bit_size() text l_int_bit_size = bit_size( 0) ! 1 l_int per nsu! l_int_bit_size()end function l_int_bit_sizel_int! l_long_bit_size() bit_size() for kind long logicalinteger function l_long_bit_size( ll)logical( kind= l_long_k), intent( in) :: ll ! selects specific bit_size()! l_long_bit_size() text l_long_bit_size = bit_size( 0) ! 1 l_long per default nsu! l_long_bit_size()end function l_long_bit_sizel_long! l_def_bit_size() bit_size() for kind int logicalinteger function l_def_bit_size( dl)logical, intent( in) :: dl ! selects specific bit_size()! l_def_bit_size() text l_def_bit_size = bit_size( 0) ! default logical per default integer! l_def_bit_size()end function l_def_bit_size! single_bit_size() bit_size() for kind singleinteger function single_bit_size( sr)real( kind= single_k), intent( in) :: sr ! selects specific bit_size()! single_bit_size() text single_bit_size = bit_size( 0) ! 1 single per default integer! single_bit_size()end function single_bit_sizesinglereal! double_bit_size() bit_size() for kind doubleinteger function double_bit_size( dr)real( kind= double_k), intent( in) :: dr ! selects specific bit_size()! double_bit_size() text double_bit_size = bit_size( 0) ! 1 double per default integer double_bit_size = 2 * bit_size( 0) ! 1 double per 2 default integers! double_bit_size()end function double_bit_sizedouble! quad_bit_size() bit_size() for kind quadinteger function quad_bit_size( qr)real( kind= quad_k), intent( in) :: qr ! selects specific bit_size()! quad_bit_size() text quad_bit_size = bit_size( 0) ! 1 quad per default integer quad_bit_size = 2 * bit_size( 0) ! 1 quad per 2 default integers! quad_bit_size()end function quad_bit_sizequad! single_complex_bit_size() bit_size() for kind single_complexinteger function single_complex_bit_size( sc)complex( kind= single_k), intent( in) :: sc ! selects specific bit_size()! single_complex_bit_size() single_complex_bit_size = 2 * single_bit_size( 0.0_single_k)end function single_complex_bit_size! double_complex_bit_size() bit_size() for kind double_complexinteger function double_complex_bit_size( dc)complex( kind= double_k), intent( in) :: dc ! selects specific bit_size()! double_complex_bit_size() double_complex_bit_size = 2 * double_bit_size( 0.0_double_k)end function double_complex_bit_size! quad_complex_bit_size() bit_size() for kind quad_complexinteger function quad_complex_bit_size( qc)complex( kind= quad_k), intent( in) :: qc ! selects specific bit_size()! quad_complex_bit_size() quad_complex_bit_size = 2 * quad_bit_size( 0.0_quad_k)end function quad_complex_bit_size! int() extend intrinsic int() to all logical kinds! l_byte_int() int() for kind l_byteinteger function l_byte_int( bl)logical( kind= l_byte_k), intent( in) :: bl! l_byte_int()continue ! int() true_or_false: select case( bl) ! t or f case( .true._l_byte_k) true_or_false ! true l_byte_int = 1 ! is 1 case( .false._l_byte_k) true_or_false ! false l_byte_int = 0 ! is 0 end select true_or_false ! t or freturn ! int()end function l_byte_int! l_short_int() int() for kind l_shortinteger function l_short_int( sl)logical( kind= l_short_k), intent( in) :: sl! l_short_int() true_or_false: select case( sl) ! true case( .true._l_short_k) true_or_false ! true l_short_int = 1 ! is 1 case( .false._l_short_k) true_or_false ! false l_short_int = 0 ! is 0end function l_short_int! l_int_int() int() for kind l_intinteger function l_int_int( il)logical( kind= l_int_k), intent( in) :: il! l_int_int() true_or_false: select case( il) ! true case( .true._l_int_k) true_or_false ! true l_int_int = 1 ! is 1 case( .false._l_int_k) true_or_false ! false l_int_int = 0 ! is 0end function l_int_int! l_long_int() int() for kind l_longinteger function l_long_int( ll)logical( kind= l_long_k), intent( in) :: ll! l_long_int() true_or_false: select case( ll) ! true case( .true._l_long_k) true_or_false ! true l_long_int = 1 ! is 1 case( .false._l_long_k) true_or_false ! false l_long_int = 0 ! is 0end function l_long_int! l_def_int() int() for kind l_definteger function l_def_int( dl)logical, intent( in) :: dl! l_def_int() true_or_false: select case( dl) ! true case( .true.) true_or_false ! true l_def_int = 1 ! is 1 case( .false.) true_or_false ! false l_def_int = 0 ! is 0end function l_def_int! logical() extend intrinsic logical() to all integer kinds! byte_logical() logical() for kind bytelogical function byte_logical( ib)integer( kind= byte_k), intent( in) :: ib! byte_logical()continue ! logical() byte_logical = ib /= 0_byte_k ! 0 is falsereturn ! logical()end function byte_logical! short_logical() logical() for kind shortlogical function short_logical( is)integer( kind= short_k), intent( in) :: is! short_logical() short_logical = is /= 0_short_k ! 0 is falseend function short_logical! int_logical() logical() for kind intlogical function int_logical( ii)integer( kind= int_k), intent( in) :: ii! int_logical() int_logical = ii /= 0_int_k ! 0 is falseend function int_logical! long_logical() logical() for kind longlogical function long_logical( il)integer( kind= long_k), intent( in) :: il! long_logical() long_logical = il /= 0_long_k ! 0 is falseend function long_logical! These specific procedures extend huge() and tiny() to character (if! defined) and complex kinds. The character huge() and tiny() return! the characters with the largest and smallest character codes. The! complex huge() and tiny() return the square root of their real! counterparts. The choice of sqrts defines the range where magnitude! comparisons are valid. [ |z| = sqrt( r^2 + i^2) ] So if two! complex numbers have components within sqrt( real epsilon) of each! other, they will compare with equal magnitude.! huge()/tiny() for character kinds! The ascii huge and tiny return characters with the largest and! smallest character codes.! ascii_huge() huge() for kind asciicharacter( len= 1, kind= ascii_k) function ascii_huge( ac)character( len= *, kind= ascii_k), intent( in) :: ac! ascii_huge()continue ! huge() ascii_huge = achar( 127) ! largest is delreturn ! huge()end function ascii_huge! ascii_tiny() tiny() for kind asciicharacter( len= 1, kind= ascii_k) function ascii_tiny( ac)! ascii_tiny()continue ! tiny() ascii_tiny = achar( 0) ! smallest is nulreturn ! tiny()end function ascii_tiny! ebcdic_huge() huge() for kind ebcdiccharacter( len= 1, kind= ebcdic_k) function ebcdic_huge( ic)character( len= *, kind= ebcdic_k), intent( in) :: ic! ebcdic_huge() ebcdic_huge = char( 255, kind= ebcdic_k) ! largest is 255end function ebcdic_huge! ebcdic_tiny() tiny() for kind ebcdiccharacter( len= 1, kind= ebcdic_k) function ebcdic_tiny( ic)! ebcdic_tiny() ebcdic_tiny = char( 0, kind= ebcdic_k) ! smallest is zeroend function ebcdic_tiny! iso_10646_huge() huge() for kind iso_10646character( len= 1, kind= iso_10646_k) function iso_10646_huge( uc)character( len= *, kind= iso_10646_k), intent( in) :: uc! iso_10646_huge() iso_10646_huge = char( huge( 0), kind= iso_10646_k) ! largest is huge( 0)end function iso_10646_huge! iso_10646_tiny() tiny() for kind iso_10646character( len= 1, kind= iso_10646_k) function iso_10646_tiny( uc)! iso_10646_tiny() iso_10646_tiny = char( 0, kind= iso_10646_k) ! smallest is zeroend function iso_10646_tiny! These specific procedures extend huge() to type complex. huge()! returns the square root of its real counterpart. The sqrt is returned! so magnitude comparisons may be made [ sqrt( x^2 + y^2) = |z| < huge()! or sqrt( x^2 + y^2) = |z| > tiny() ]! huge() for complex kinds! single_complex_huge() huge() for kind single complexreal( kind= single_k) function single_complex_huge( sc)complex( kind= single_k), intent( in) :: sc! single_complex_huge() single_complex_huge = sqrt( huge( real( sc)) )end function single_complex_huge! double_complex_huge() huge() for kind double complexreal( kind= double_k) function double_complex_huge( dc)complex( kind= double_k), intent( in) :: dc! double_complex_huge() double_complex_huge = sqrt( huge( real( dc)) )end function double_complex_huge! quad_complex_huge() huge() for kind quad complexreal( kind= quad_k) function quad_complex_huge( qc)complex( kind= quad_k), intent( in) :: qc! quad_complex_huge() quad_complex_huge = sqrt( huge( real( qc)) )end function quad_complex_huge! These specific procedures extend tiny() to type complex. tiny()! returns the square root of its real counterpart.! tiny() for complex kinds! single_complex_tiny() tiny() for kind single complexreal( kind= single_k) function single_complex_tiny( sc)! single_complex_tiny() single_complex_tiny = sqrt( tiny( real( sc)) )end function single_complex_tiny! double_complex_tiny() tiny() for kind double complexreal( kind= double_k) function double_complex_tiny( dc)! double_complex_tiny() double_complex_tiny = sqrt( tiny( real( dc)) )end function double_complex_tiny! quad_complex_tiny() tiny() for kind quad complexreal( kind= quad_k) function quad_complex_tiny( qc)! quad_complex_tiny() quad_complex_tiny = sqrt( tiny( real( qc)) )end function quad_complex_tiny! These specific procedures extend epsilon() to type complex. epsilon()! returns the square root of its real counterpart. The magnitude of! two complex numbers differ if the numbers differ by more than epsilon()! epsilon() for complex kinds! single_complex_epsilon() epsilon() for kind single complexreal( kind= single_k) function single_complex_epsilon( sc)! single_complex_epsilon()continue ! epsilon() single_complex_epsilon = sqrt( epsilon( abs( sc)) )return ! epsilon()end function single_complex_epsilon! double_complex_epsilon() epsilon() for kind double complexreal( kind= double_k) function double_complex_epsilon( dc)! double_complex_epsilon() double_complex_epsilon = sqrt( epsilon( abs( dc)) )end function double_complex_epsilon! quad_complex_epsilon() epsilon() for kind quad complexreal( kind= quad_k) function quad_complex_epsilon( qc)! quad_complex_epsilon() quad_complex_epsilon = sqrt( epsilon( abs( qc)) )end function quad_complex_epsilon! These specific procedures compute the largest integer! which may be stored exactly in a real kind.! single_max_exact_int() max_exact_int() for kind single realreal( kind= single_k) function single_max_exact_int( sr)real( kind= single_k), intent( in) :: sr! single_max_exact_int()continue ! max_exact_int() single_max_exact_int = nearest( real( radix( sr), kind= single_k) & ** real( digits( sr), kind= single_k), -1.0_single_k)return ! max_exact_int()end function single_max_exact_int! double_max_exact_int() max_exact_int() for kind double realreal( kind= double_k) function double_max_exact_int( dr)real( kind= double_k), intent( in) :: dr! double_max_exact_int() double_max_exact_int = nearest( real( radix( dr), kind= double_k) & ** real( digits( dr), kind= double_k), -1.0_double_k)end function double_max_exact_int! quad_max_exact_int() epsilon() for kind quad realreal( kind= quad_k) function quad_max_exact_int( qr)real( kind= quad_k), intent( in) :: qr! quad_max_exact_int() quad_max_exact_int = nearest( real( radix( qr), kind= quad_k) & ** real( digits( qr), kind= quad_k), -1.0_quad_k)end function quad_max_exact_int! The following functions detect the conditions indicated according! to rules specified by the Fortran standard. The iostat return! value is required to be an error code, an end code, or a success code.! is_iostat_eof(), is_iostat_eor() detect standard conditions! is_iostat_end() true if iostat indicates errorpure logical function is_iostat_end( iostat)integer, intent( in) :: iostat! is_iostat_end()continue ! is_iostat_end() is_iostat_end = any( (/ iostat_end /) == iostat) ! eof conditionreturn ! is_iostat_end()end function is_iostat_end! is_iostat_eor() true if iostat indicates errorlogical function is_iostat_eor( iostat)! is_iostat_eor()continue ! is_iostat_eor() is_iostat_eor = any( (/ iostat_eor /) == iostat) ! eor conditionreturn ! is_iostat_eor()end function is_iostat_eorend module processor_dependencies ! eofREWIND?? macro :: timestamp = ""?? macro :: compiler = "?? integer, parameter :: PREF66 = 0?? integer, parameter :: F66 = 1?? integer, parameter :: F77 = 2?? integer, parameter :: F90 = 3?? integer, parameter :: F95 = 4?? integer, parameter :: F03 = 5?? integer, parameter :: F08 = 6?? integer, parameter :: STD = F90?? integer, parameter :: STD = F95?? integer, parameter :: STD = F03?? integer, parameter :: STD = F08?? logical, parameter :: ISO_VARYING_STRINGS_T = .true.?? logical, parameter :: ISO_VARYING_STRINGS_T = .false.?? logical, parameter :: BYTE_K = .true.?? logical, parameter :: BYTE_K = .false.?? logical, parameter :: SHORT_K = .true.?? logical, parameter :: SHORT_K = .false.?? logical, parameter :: INT_K = .true.?? logical, parameter :: INT_K = .false.?? logical, parameter :: LONG_K = .true.?? logical, parameter :: LONG_K = .false.?? logical, parameter :: SINGLE_K = .true.?? logical, parameter :: SINGLE_K = .false.?? logical, parameter :: DOUBLE_K = .true.?? logical, parameter :: DOUBLE_K = .false.?? logical, parameter :: QUAD_K = .true.?? logical, parameter :: QUAD_K = .false.?? logical, parameter :: L_BYTE_K = .true.?? logical, parameter :: L_BYTE_K = .false.?? logical, parameter :: L_SHORT_K = .true.?? logical, parameter :: L_SHORT_K = .false.?? logical, parameter :: L_INT_K = .true.?? logical, parameter :: L_INT_K = .false.?? logical, parameter :: L_LONG_K = .true.?? logical, parameter :: L_LONG_K = .false.?? logical, parameter :: ASCII_K = .true.?? logical, parameter :: ASCII_K = .false.?? logical, parameter :: EBCDIC_K = .true.?? logical, parameter :: EBCDIC_K = .false.?? logical, parameter :: ISO_10646_K = .true.?? logical, parameter :: ISO_10646_K = .false.$define PREF66 = 0$define F66 = 1$define F77 = 2$define F90 = 3$define F95 = 4$define F03 = 5$define F08 = 6$define STD = F90$define STD = F95$define STD = F03$define STD = F08$define ISO_VARYING_STRINGS_T!define ISO_VARYING_STRINGS_T$define BYTE_K!define BYTE_K$define SHORT_K!define SHORT_K$define INT_K!define INT_K$define LONG_K!define LONG_K$define SINGLE_K!define SINGLE_K$define DOUBLE_K!define DOUBLE_K$define QUAD_K!define QUAD_K$define L_BYTE_K!define L_BYTE_K$define L_SHORT_K!define L_SHORT_K$define L_INT_K!define L_INT_K$define L_LONG_K!define L_LONG_K$define ASCII_K!define ASCII_K$define EBCDIC_K!define EBCDIC_K$define ISO_10646_K!define ISO_10646_K#define PREF66 0#define F66 1#define F77 2#define F90 3#define F95 4#define F03 5#define F08 6#define STD F90#define STD F95#define STD F03#define STD F08#define ISO_VARYING_STRINGS_T#define BYTE_K#define SHORT_K#define INT_K#define LONG_K#define SINGLE_K#define DOUBLE_K#define QUAD_K#define L_BYTE_K#define L_SHORT_K#define L_INT_K#define L_LONG_K#define ASCII_K#define EBCDIC_K#define ISO_10646_K WARNING: unknown preprocessor file format! _bit_size() bit_size() for kind integer function _bit_size( )character( len= *, kind= _k), intent( in) :: ( kind= _bit_size() local character( len= 1, kind= _k), dimension( bit_size( 0)) :: tk _bit_size() text_bit_size = size( transfer( tk, (/ 0/) ))_bit_size()end function _bit_size! IEEE 754 real kind( a, 1x, i5, ", ", i5, ")")integer, public, parameter :: _k = selected_real_kind(_k = -1_k = -2_k = -3WARNING: _k: not unique_k =_k: non-standard error code: signed integer( a, 1x, i5, ")")_k = selected_int_kind(WARNING: trouble opening file to diagnose io parameters3/\:PATH12(a1)(/)(a),DELETEWARNING: trouble closing file opened to diagnose io parametersSCRATCHDIRECTWARNING: trouble opening file to diagnose direct access parametersWARNING: missing direct access record is not the same beyond last recordread unwritten record iostatread beyond last record iostatWARNING: trouble closing file opened to diagnose direct access parameters ( s, i3)WARNING: test optional plus sign failed( ss, f6.3)WARNING: test leading zero f format failed( ss, e16.8)WARNING: test leading zero e format failedEeNOTE: word size is not a power of twoNOTE: character size is not a power of twoNOTE: smallest integer size is not a power of twosmallest integer size is same as character storage unit sizeWARNING: measured numerical storage unit size is not a multiple of measured character storage unit sizeinteger appears to be two's compliment integer formatWARNING: claims two's compliment integer format but appears not to beWARNING: claimed byte size equals claimed word sizebits per bytebytes per wordWARNING: measured numerical storage unit size is not a multiple of input character storage unit sisebits per numeric storage unit (word size)WARNING: claims word addressable yet input wordsize is not one numeric storage unitbyte addressableword addressableNOTE: storage size is not a power of twosize of storage units is a power of tworeal appears to be an IEEE 754 real single formatWARNING: default real does not appear to be valid IEEE 754 single formatreal appears to be an IEEE 754 real format double formatWARNING: default real does not appear to be valid IEEE 754 double formatreal appears to be IEEE 754 Extended single formatreal appears to be IEEE 754 Extended double formatWARNING: claims IEEE format but appears not to beWARNING: byte logical and short logical have same kind value!WARNING: byte logical and int logical have same kind value!WARNING: byte logical and long logical have same kind value!WARNING: short logical and int logical have same kind value!WARNING: short logical and long logical have same kind value!WARNING: int logical and long logical have same kind value!WARNING: logical byte defined but integer byte not detected!WARNING: logical short defined but integer short not detected!WARNING: logical int defined but integer int not detected!WARNING: logical long defined but integer long not detected!default integer kind same value as default logical kindWARNING: default logical kind not detectedWARNING: default logical kind not uniqueWARNING: ascii and ebcdic have same kind value!WARNING: ascii and iso_10646 have same kind value!WARNING: ebcdic and iso_10646 have same kind value!WARNING: default character kind not detectedWARNING: default character kind not uniqueWARNING: estimated real size not nearly a power of 2found real kind: supporting precision: supporting range: estimated bit size: NOTE: range does not increase with increasing precisionkind values: ranges: rnumber of real kinds found: WARNING: estimated integer size not nearly a power of 2found integer kind: supporting digits: intnumber of integer kinds found: error seeking namelist group ,!/make_pm.inOLDREADcan't open make_pm.infilesERROR: trouble reading namelist group "files"hwERROR: trouble reading namelist group "hw"swERROR: trouble reading namelist group "sw"kindsERROR: trouble reading namelist group "kinds"floatERROR: trouble reading namelist group "float"fixedERROR: trouble reading namelist group "fixed"trouble closing make_pm.inf03f08f90f95coco.incf90ppr.incfpp.inc A@zRx <8_g  f 4\Ԃ  <Hz  i <lH  [H <J   <Tbg  X <r#   <w(   4  4Ln  4J  4&  4  4,ގ6 1 <d܎y d 4e X 4BV  I 4`  <L   4V Q <б   4g  4<.  <ta  R 4  4~  4$4 / 4\= 8 __  *4>HR\fpzʰ԰ް$.8BLV`jt~  !f95 %3Cprocdep.f90 pm.f90 OS Version Compiler S/N  ##&&)),,4 4 >>"UB`,0p(Q@dyld_stub_binderQr8rH@___powisf2rP@__gfortran_adjustlrX@__gfortran_compare_stringr`@__gfortran_concat_stringrh@__gfortran_date_and_timerp@__gfortran_os_errorrx@__gfortran_random_seed_i4r@__gfortran_runtime_errorr@__gfortran_runtime_error_atr@__gfortran_select_stringr@__gfortran_selected_int_kindr@__gfortran_selected_real_kind2008r@__gfortran_set_argsr@__gfortran_set_optionsr@__gfortran_st_backspacer@__gfortran_st_closer@__gfortran_st_inquirer@__gfortran_st_iolengthr@__gfortran_st_iolength_doner@__gfortran_st_openr@__gfortran_st_readr@__gfortran_st_read_doner@__gfortran_st_rewindr@__gfortran_st_set_nml_varr@__gfortran_st_writer@__gfortran_st_write_doner@__gfortran_stop_stringr@__gfortran_string_indexr@__gfortran_string_len_trimr@__gfortran_string_scanr@__gfortran_string_trimr@__gfortran_string_verifyr@__gfortran_transfer_characterr@__gfortran_transfer_character_writer@__gfortran_transfer_integer_writer@__gfortran_transfer_real_writer@_exitr@_freer@_lroundfr@_mallocr@_memcpyr@_memmover@_memsetr@_realloc_ startK_'mainPNXArgVenvironjmh_execute_headerG_prognamepc^vd<ԅ / 06 V'. 4.JoRujP ";;#*;D>;\R;tf;;LzPY]_3_Is`t|zvۍƎ|H  ʱ Ա& ر/ ܱ8 A J S \ f u ` ` d h l p t x |    ( 4 A Q ` n }      ľ Ⱦ ̾ о  @ & @; J X f         X#=Vo*>Um7Kd{ 7 Y x ~        YZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@YZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ dyld_stub_binding_helper__dyld_func_lookup_write_processor_model.1536_MAIN___write_processor_dependencies.1539_write_include_file.1542_write_bit_size.1545_write_real_kind.1560_write_integer_kind.1570_diagnose_input_output.1573_check_2s_comp.1575_check_ieee_double_extended.1578_check_ieee_single_extended.1581_check_ieee_double.1584_check_ieee_single.1587_is_power_of_2.1590_basic_hardware_parameters.1593_check_hardware_values.1595_check_logical_kinds.1597_check_character_kinds.1599_find_real_bit_size.1601_seek_range_this_precision.1604_seek_real_kinds.1607_count_real_kinds.1609_find_integer_bit_size.1611_seek_integer_kinds.1614_count_integer_kinds.1616_seek_namelist_group.1618_read_input_file.1624_options.3149.6147_A.2826.5192_run_date.5669_run_time.5670_bd.5489_sd.5491_id.5493_ld.5495_sp.5002_dp.5395_qp.5398_std.5631_com_vers.2836_incname.4543_autoint.5659_byte_idx.2243_short_idx.2265_int_idx.2287_long_idx.2309_autoreal.5652_sr.5003_single_idx.2406_dr.5396_double_idx.2444_qr.5399_quad_idx.2482_ascii.5638_ebcdic.5639_iso_10646.5640_logeqint.5641_logbyte.5642_logshort.5643_logint.5644_loglong.5645_pdname.2603_pmname.1628_twoscomp.3196_ieeefp.3187_stderr.3089_stdout.3084_stdin.3079_os_vers.2870_com_sern.2853_jumptable.2963.5733_jumptable.2976.5766_standard.1713_ppr_inc.4554_strings.2906_number_of_integers.2966_number_of_reals.3012_bytesize.3042_wordsize.3037_io_len.2600_NXArgc_NXArgv___progname__mh_execute_header_environ_mainstart___powisf2__gfortran_adjustl__gfortran_compare_string__gfortran_concat_string__gfortran_date_and_time__gfortran_os_error__gfortran_random_seed_i4__gfortran_runtime_error__gfortran_runtime_error_at__gfortran_select_string__gfortran_selected_int_kind__gfortran_selected_real_kind2008__gfortran_set_args__gfortran_set_options__gfortran_st_backspace__gfortran_st_close__gfortran_st_inquire__gfortran_st_iolength__gfortran_st_iolength_done__gfortran_st_open__gfortran_st_read__gfortran_st_read_done__gfortran_st_rewind__gfortran_st_set_nml_var__gfortran_st_write__gfortran_st_write_done__gfortran_stop_string__gfortran_string_index__gfortran_string_len_trim__gfortran_string_scan__gfortran_string_trim__gfortran_string_verify__gfortran_transfer_character__gfortran_transfer_character_write__gfortran_transfer_integer_write__gfortran_transfer_real_write_exit_free_lroundf_malloc_memcpy_memmove_memset_reallocdyld_stub_binderDay-III/06-coco/make_pm.f90100777 0 0 1512616 11660471434 10523 0! bof ! ********************************************************************** ! Fortran 95 program make_processor_model ! ********************************************************************** ! Source Control Strings ! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ ! ********************************************************************** ! Copyright 2004 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! Summary of License ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@erols.com ! or mail to 10483 Malone Ct. ! Fairfax, VA 22032 USA ! ********************************************************************** ! writes a processor_dependencies module and a processor_model program ! ********************************************************************** ! use none ! ********************************************************************** ! make_processor_model uses ! ! make_processor_model includes ! ! make_processor_model reads ! make_pm.in: an optional namelist file of quantities beyond diagnosis ! make_processor_model writes ! make_pm.log: logfile of make_processor_model actions ! coco.inc | f90ppr.inc | fpp.inc: optional file of preprocessor definitions ! procdep.f90: fortran 95 source code module processor_dependencies ! pm.f90: fortran 95 source code to display processor model ! make_processor_model library ! read_input_file() reads the processor description file, if present ! seek_namelist_group() tries to find a namelist group in the input file ! seek_integer_kinds() seeks integer kinds ! seek_real_kinds() seeks real kinds ! check_character_kinds() checks user specified character kinds ! check_logical_kinds() checks user specified logical kinds ! check_hardware_values() experiments to verify claims about the hardware ! is_power_of_2() returns true if its positive argument is a power of two ! check_ieee_single() experiments to verify ieee single format ! check_ieee_double() experiments to verify ieee double format ! check_ieee_single_extended() experiments to verify ieee single extended format ! check_ieee_double_extended() experiments to verify ieee double extended format ! diagnose_input_output() experiments on input/output processor dependencies ! write_bit_size() writes a bit_size() using the Method of Olagnon ! write_include_file() write preprocessor include file ! write_processor_dependencies() writes the processor_dependencies module ! write_processor_model() writes the processor_model program ! ********************************************************************** ! make_processor_model ! ********************************************************************** program make_processor_model ! ********************************************************************** ! use no module ! ********************************************************************** ! declare all variable names implicit none ! no implicit declarations ! ********************************************************************** ! make_processor_model RCS strings ! ********************************************************************** ! program identifier string supplied by RCS character( len= *), parameter :: make_pm_rcs_id = & '$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $' ! ********************************************************************** ! make_processor_model stop character codes ! ********************************************************************** ! program normal exit character( len= *), parameter :: normal_stop_code = & 'make_processor_model: complete' ! program error exit character( len= *), parameter :: error_stop_code = & 'make_processor_model: not complete' ! ********************************************************************** ! make_processor_model logical units ! ********************************************************************** ! make_pm.log unit integer, parameter :: log_unit = 10 ! write logfile ! make_pm.in unit integer, parameter :: nml_unit = 11 ! read namelist ! procdep.f90 unit integer, parameter :: pd_unit = 12 ! write module source ! pm.f90 unit integer, parameter :: pm_unit = 13 ! write program source ! preprocessor include file integer, parameter :: inc_unit = 14 ! write include file ! ---------------------------------------------------------------------- ! unit to use to guess the name of a file opened without a name integer, parameter :: fn_unit = 3 ! logical unit number character( len= *), parameter :: ch_fn_unit = '3' ! search for this character ! unit for direct access experiments integer, parameter :: da_unit = fn_unit + 1 ! use another unit ! ********************************************************************** ! make_processor_model formats ! ********************************************************************** ! format for fortran source output character( len= *), parameter :: fmtpr = '( a)' ! string ! format for default kind values (non-advancing i/o) character( len= *), parameter :: fmti = '( 1x, i20)' ! + integer ! formats for fortran source output with single integer character( len= *), parameter :: fmtpri = '( a, 1x, i20)' ! string + integer ! format for fortran source output with single digit integer & closing paren character( len= *), parameter :: fmtprip = '( a, 1x, i5, ")")' ! string + integer + ")" ! format for fortran source output with 2 integers & closing paren character( len= *), parameter :: fmtpriip = & '( a, 1x, i5, ", ", i5, ")")' ! string + integer + "," + integer + ")" ! ********************************************************************** ! make_processor_model constants ! ********************************************************************** ! character buffer length reserved for file names integer, parameter :: name_len = 1024 ! hopefully long enough ! character component length reserved for kind names integer, parameter :: kind_len = 64 ! must be long enough ! ---------------------------------------------------------------------- ! this can't be changed because it's the name of the file containing the namelists character( len= *), parameter :: rc_name = 'make_pm.in' ! nml_unit ! this can't be changed because it's opened before make_pm.in is read character( len= *), parameter :: logname = 'make_pm.log' ! log_unit ! ---------------------------------------------------------------------- ! ascii change case integer, parameter :: change_case = 32 ! compare lower case ! ---------------------------------------------------------------------- ! denotes a kind not supported integer, parameter :: not_supported = -1 ! internal code ! ********************************************************************** ! codes for various standards integer, parameter :: no_std = 0 ! any standard pre-f90 (no modules) integer, parameter :: f90_std = no_std + 1 ! f90 integer, parameter :: f95_std = f90_std + 1 ! f95 integer, parameter :: f03_std = f95_std + 1 ! f03 integer, parameter :: f08_std = f03_std + 1 ! f08 ! ********************************************************************** ! codes for various preprocessors integer, parameter :: no_inc = 0 ! no preprocessor file integer, parameter :: coco_inc = no_inc + 1 ! coco.inc integer, parameter :: f90ppr_inc = coco_inc + 1 ! f90ppr.inc integer, parameter :: fpp_inc = f90ppr_inc + 1 ! fpp.inc character( len= *), parameter :: coco_name = 'coco.inc' ! coco include filename character( len= *), parameter :: f90ppr_name = 'f90ppr.inc' ! f90ppr include filename character( len= *), parameter :: fpp_name = 'fpp.inc' ! fpp include filename ! ********************************************************************** ! complaints, messages, etc. character( len= *), parameter :: cant_open = "can't open " ! announce failure character( len= *), parameter :: write_ln = ' write( unit= *, fmt= *)' character( len= *), parameter :: star_banner = & '! **********************************************************************' character( len= *), parameter :: wa_str = '(words)' ! units for message character( len= *), parameter :: ba_str = '(bytes)' ! units for message ! ********************************************************************** ! default number of (named) kinds integer, parameter :: default_number_of_integers = 4 ! byte, short, int, long integer, parameter :: default_number_of_reals = 3 ! single, double, quad ! ********************************************************************** ! make_processor_model() types ! ********************************************************************** ! an integer kind type :: integer_kind_t ! describe an integer kind character( len= kind_len) :: kind_name ! the kinds name (less the '_k') integer :: kind_value ! integers have kind values integer :: max_digits ! most digits this kind supports integer :: integer_bit_size ! estimated size in bits logical :: supported ! kind is byte, short, int, long, or int logical :: default_kind ! one kind is the default end type integer_kind_t ! describe an integer kind ! ********************************************************************** ! a real kind (& therefore a complex kind) type :: real_kind_t ! describe an real kind character( len= kind_len) :: kind_name ! the kinds name (less the '_k') integer :: kind_value ! reals have kind values integer :: max_precision ! reals support a precision integer :: max_range ! reals support a range integer :: real_bit_size ! estimated size in bits logical :: supported ! kind is one of single, double, quad logical :: default_kind ! one kind is the default real logical :: default_dp_kind ! one kind is the default double precision end type real_kind_t ! describe an real kind ! ********************************************************************** ! a logical kind type :: logical_kind_t ! describe a logical kind character( len= kind_len) :: kind_name ! the kinds name (less the '_k') integer :: kind_value ! logicals have kind values logical :: supported ! kind is one of single, double, quad logical :: default_kind ! one kind is the default end type logical_kind_t ! describe a logical kind ! ********************************************************************** ! a character kind type :: character_kind_t ! describe a character kind character( len= kind_len) :: kind_name ! the kinds name (less the '_k') integer :: kind_value ! characters have kind values logical :: supported ! kind is one of single, double, quad logical :: default_kind ! one kind is the default character( len= name_len) :: inquiry_string ! argument to selected_char_kind() end type character_kind_t ! describe a character kind ! ********************************************************************** ! make_processor_model data ! ********************************************************************** ! configuration data ! ********************************************************************** ! standard code designates the standard supported by the processor integer :: standard = no_std ! set via namelist string character( len= *), parameter :: f90_str = 'Fortran 90' character( len= *), parameter :: f95_str = 'Fortran 95' character( len= *), parameter :: f03_str = 'Fortran 2003' character( len= *), parameter :: f08_str = 'Fortran 2008' ! ********************************************************************** ! preprocessor code designates the preprocessor, if any, of the include file integer :: ppr_inc = no_inc ! set via namelist string ! ********************************************************************** ! status date and time strings integer, parameter :: dt_len = 10 ! long enough for date string integer, parameter :: tm_len = 10 ! long enough for time string character( len= dt_len) :: run_date = ' ' ! date for logfile character( len= tm_len) :: run_time = ' ' ! time for logfile integer, parameter :: ts_len = dt_len + tm_len ! long enough for both character( len= ts_len) :: timestamp ! timestamp pd & pm ! ********************************************************************** ! data which are computed by make_processor_model ! ********************************************************************** ! measured hardware values logical :: storage_size_is_2n ! true when all storage units appear to be 2^n integer :: measured_word_size ! from bit_size() integer :: measured_char_size ! from size-transfer integer :: measured_byte_size ! from size-transfer integer, parameter :: ua_len = max( len( ba_str), len( wa_str)) character( len= ua_len) :: ua_str ! ********************************************************************** ! describes the integer kinds found integer :: number_of_integers = 0 ! from count_integer_kinds() type( integer_kind_t), allocatable, dimension( :) :: integer_kinds ! array of integers found ! indexes to integer kind array integer :: byte_idx = 1 integer :: short_idx = 2 integer :: int_idx = 3 integer :: long_idx = 4 ! from seek_integer_kinds() ! describes the real kinds found integer :: number_of_reals = 0 ! from count_real_kinds() type( real_kind_t), allocatable, dimension( :) :: real_kinds ! array of kinds found ! indexes to real kind array integer :: single_idx = 1 integer :: double_idx = 2 integer :: quad_idx = 3 ! from seek_real_kinds() ! ********************************************************************** ! values obtained via I/O experiments ! ---------------------------------------------------------------------- ! maximum record length integer :: mrecl ! from inquire() ! name of a file opened without a name character( len= name_len) :: def_fn ! from inquire() ! iostat end-of-record and end-of-file codes integer :: eor_flag, eof_flag ! from read() ! flags from leading zero experiments logical :: lz_f_flag, lz_e_flag ! from write() ! flag from leading plus experiments logical :: plus_flag ! from write() ! see if list directed format uses separator ( comma or dot) logical :: has_ld_sep ! from write() ! values of list-directed format experiments integer :: ld_min, ld_max ! from write() ! iostat values when trying to read missing records within direct access files integer :: da_missing, da_eof ! from read() ! ---------------------------------------------------------------------- ! big_endian or little_endian logical :: measured_big_endian ! true if big endian ! ********************************************************************** ! data which must be read from the input file ! ********************************************************************** ! logical kinds read from input file type( logical_kind_t) :: byte_logical ! logical kinds type( logical_kind_t) :: short_logical type( logical_kind_t) :: int_logical type( logical_kind_t) :: long_logical logical :: define_logicals ! true if defining logical kinds ! ---------------------------------------------------------------------- ! character kinds read from input file type( character_kind_t) :: ascii_character ! ascii characters type( character_kind_t) :: ebcdic_character ! ebcdic characters type( character_kind_t) :: iso_10646_character ! iso_10646 characters logical :: define_characters ! true if defining character kinds ! ---------------------------------------------------------------------- ! mark type/kind not to be investigated logical :: want_ib ! allow user to defeat any mention of integer byte logical :: want_is ! allow user to defeat any mention of integer short logical :: want_ii ! allow user to defeat any mention of integer int logical :: want_il ! allow user to defeat any mention of integer long logical :: want_rs ! allow user to defeat any mention of real single logical :: want_rd ! allow user to defeat any mention of real double logical :: want_rq ! allow user to defeat any mention of real quad ! ********************************************************************** ! the namelist input file ! ********************************************************************** ! namelists to be read from make_pm.in ! note that the values specified here are the defaults ! ---------------------------------------------------------------------- ! namelist of file names character( len= name_len) :: pdname = 'procdep.f90' ! module processor_dependencies character( len= name_len) :: pmname = 'pm.f90' ! program processor_model character( len= name_len) :: incname = '' ! preprocessor include file ( none by default) namelist /files/ pdname, pmname, incname ! file names ! ---------------------------------------------------------------------- ! namelist of hardware variables logical :: ieeefp = .true. ! ieee 754 format logical :: twoscomp = .true. ! 2's complement integers integer :: bytesize = 0 ! default is diagnosed byte size integer :: wordsize = 0 ! if > 0, word addressable namelist /hw/ ieeefp, twoscomp, bytesize, wordsize ! hardware ! ---------------------------------------------------------------------- ! namelist of software variables integer :: stdin = 5 ! unit= * for input integer :: stdout = 6 ! unit= * for output integer :: stderr = -1 ! no preconnected error unit character( len= 3) :: std = 'f95' ! f90, f95 or f03 standard integer, parameter :: vers_len = 80 ! length of version strings character( len= vers_len) :: com_vers = '' ! Example: 'Acme Fortran 90 v 1.0a' character( len= vers_len) :: com_sern = 'Compiler S/N' ! Example: 'S/N: 007' character( len= vers_len) :: os_vers = 'OS Version' ! Example: 'Ajax Z80 Unix v 19.5.e' namelist /sw/ stdin, stdout, stderr, & ! preconnected units std, com_vers, com_sern, os_vers ! versions ! ---------------------------------------------------------------------- ! namelist of kinds variables for kinds which can't be diagnosed integer :: ascii = 1 ! default character is ascii integer :: ebcdic = not_supported ! no ebcdic integer :: iso_10646 = not_supported ! no iso_10646 logical :: strings = .false. ! true if ISO Varying String module is available logical :: logeqint = .true. ! make logicals same kinds as integers integer :: logbyte = not_supported ! off by default integer :: logshort = not_supported ! off by default integer :: logint = not_supported ! off by default integer :: loglong = not_supported ! off by default namelist /kinds/ ascii, ebcdic, iso_10646, strings, & ! character kinds logeqint, logbyte, logshort, logint, loglong ! logical kinds ! ---------------------------------------------------------------------- ! namelist of floating point parameters ( xp= x's precision, xr= x's range, x= { single | double | quad}) logical :: autoreal = .true. ! attempt automatic kind detection integer :: sp = 6, sr = 37 ! an ieee 32 bit ( single) integer :: dp = 15, dr = 307 ! an ieee 64 bit ( double) integer :: qp = 33, qr = 4931 ! an 'ieee' 128 bit ( quad) namelist /float/ autoreal, & ! search for reals sp, sr, dp, dr, qp, qr ! floating point parameters ! ---------------------------------------------------------------------- ! namelist of integer parameters ( xd= x's digits, x= { byte | short | int | long}) logical :: autoint = .true. ! attempt automatic kind detection integer :: bd = 2, sd = 4, id = 9, ld = 18 ! integer digits for byte, short, int, long namelist /fixed/ autoint, & ! search for integers bd, sd, id, ld ! integer parameters ! ********************************************************************** ! make_processor_model local ! ********************************************************************** ! status flag from subroutines integer :: istat ! ok = 0, error > 0, something < 0 ! index of change case loops integer :: char_ptr ! loop through strings ! count numbers of various kinds integer :: count_kinds ! number of kinds etc detected ! ********************************************************************** ! make_processor_model text ! ********************************************************************** continue ! make_processor_model ! ********************************************************************** ! open logfile or quit open( unit= log_unit, file= logname, status= 'REPLACE', & ! attempt open action= 'WRITE', iostat= istat) ! if can't open the logfile, complain to stdout and quit open_error: if( istat > 0 )then ! if error with open write( unit= *, fmt= fmtpr) 'ERROR: ' // cant_open // logname ! add filename to complaint stop error_stop_code ! and quit endif open_error ! if error with open ! write banner in logfile write( unit= log_unit, fmt= fmtpr) 'make_processor_model' ! program name write( unit= log_unit, fmt= fmtpr) make_pm_rcs_id ! program version ! write date/time in logfile call date_and_time( date= run_date, time= run_time) ! time of this run timestamp = run_date // run_time ! combine write( unit= log_unit, fmt= fmtpr) 'timestamp: ' // timestamp ! log timestamp ! ********************************************************************** ! try to read namelist input file write( unit= log_unit, fmt= fmtpr) 'reading ' // rc_name ! log attempt call read_input_file( istat) ! read file 'make_pm.in' ! check results of attempt to read input read_input_file_status: if( istat > 0 )then ! if error reading make_pm.in write( unit= log_unit, fmt= fmtpr) 'ERROR: trouble reading ' // rc_name stop error_stop_code ! quit elseif( istat < 0 )then read_input_file_status ! no file named 'make_pm.in' write( unit= log_unit, fmt= fmtpr) 'no ' // rc_name // ' found' else read_input_file_status ! read file 'make_pm.in' write( unit= log_unit, fmt= fmtpr) 'read ' // rc_name // ' ok' endif read_input_file_status ! handle return code from read_input_file() ! ---------------------------------------------------------------------- ! search for only those kinds requested want_ib = bd > 0 ! seek byte integers ? want_is = sd > 0 ! seek short integers ? want_ii = id > 0 ! seek int integers ? want_il = ld > 0 ! seek long integers ? want_rs = sp > 0 ! seek single reals ? want_rd = dp > 0 ! seek double reals ? want_rq = qp > 0 ! seek quad reals ? ! ********************************************************************** ! write processor_dependencies and processor_model for f90 or f95 or f03 ! ********************************************************************** ! make character comaprisons in lower case only each_character_std: do char_ptr = 1, len( std) ! loop thru first to last to_lower_case_std: select case( std( char_ptr: char_ptr)) ! examine each character case( 'A': 'Z') to_lower_case_std ! upper case to lower case std( char_ptr: char_ptr) = achar( iachar( std( char_ptr: char_ptr)) + change_case) end select to_lower_case_std ! ignore other characters enddo each_character_std ! examine each character ! ---------------------------------------------------------------------- ! check std is 'f90' or 'f95' or 'f03' or 'f08' which_standard: select case( std) ! convert std to integer code ! standard supported is Fortran 95 case( 'f95') which_standard ! write for f95 write( unit= log_unit, fmt= fmtpr) 'processor supports Fortran 95 standard' standard = f95_std ! set default compiler version string if it's null f95_version: if( com_vers == '' )then ! f95 default string com_vers = f95_str endif f95_version ! f95 default string ! standard supported is Fortran 90 case( 'f90') which_standard ! write for f90 write( unit= log_unit, fmt= fmtpr) 'processor supports Fortran 90 standard' standard = f90_std ! support f90 standard ! set default compiler version string if it's null f90_version: if( com_vers == '' )then ! f90 default string com_vers = f90_str endif f90_version ! f90 default string ! standard supported is Fortran 2003 case( 'f03') which_standard ! write for f03 write( unit= log_unit, fmt= fmtpr) 'processor supports Fortran 2003 standard' standard = f03_std ! support f03 standard ! set default compiler version string if it's null f03_version: if( com_vers == '' )then ! f03 default string com_vers = f03_str endif f03_version ! f03 default string ! standard supported is Fortran 2003 case( 'f08') which_standard ! write for f03 write( unit= log_unit, fmt= fmtpr) 'processor supports Fortran 2008 standard' standard = f08_std ! support f08 standard ! set default compiler version string if it's null f08_version: if( com_vers == '' )then ! f08 default string com_vers = f08_str endif f08_version ! f08 default string ! no earlier standard is supported ( must have modules) case default which_standard ! must be f90 or f95 or f03 write( unit= log_unit, fmt= fmtpr) 'ERROR: std = ' & // trim( std) // ': std must = f90, f95, f03 or f08' ! must have modules! stop error_stop_code ! quit end select which_standard ! check f90 or f95 or f03 ! ********************************************************************** ! write preprocessor include file for coco or f90ppr or fpp or none ! ********************************************************************** ! make character comaprisons in lower case only each_character_inc: do char_ptr = 1, len( incname) ! loop thru first to last to_lower_case: select case( incname( char_ptr: char_ptr)) ! examine each character case( 'A': 'Z') to_lower_case ! upper case to lower case incname( char_ptr: char_ptr) = achar( iachar( incname( char_ptr: char_ptr)) + change_case) end select to_lower_case ! ignore other characters enddo each_character_inc ! examine each character ! ---------------------------------------------------------------------- ! check preprocessor is coco or f90ppr or fpp select_preprocessor: select case( incname) ! which preprocessor ! preprocessor is coco ( Part 3 of the Standard) case( coco_name) select_preprocessor ! write for coco write( unit= log_unit, fmt= fmtpr) 'include file for coco' ppr_inc = coco_inc ! preprocessor is f90ppr ( Moware) case( f90ppr_name) select_preprocessor ! write for f90ppr write( unit= log_unit, fmt= fmtpr) 'include file for f90ppr' ppr_inc = f90ppr_inc ! f90ppr preprocessor ! preprocessor is fpp/cpp or ... case( fpp_name) select_preprocessor ! write for fpp/cpp write( unit= log_unit, fmt= fmtpr) 'include file for fpp/cpp' ppr_inc = fpp_inc ! fpp/cpp preprocessor ! only formats supported case default select_preprocessor ! must be coco or f90ppr or fpp ! so other names are errors null_string_ok: if( len_trim( incname) > 0 )then ! null string means no preprocessor file write( unit= log_unit, fmt= fmtpr) 'ERROR: incname = ' & // trim( incname) // ': incname must = coco.inc, f90ppr.inc or fpp.inc' stop error_stop_code ! quit ! no name is the default else null_string_ok ! null string means no preprocessor file write( unit= log_unit, fmt= fmtpr) 'no preprocessor include file' endif null_string_ok ! null string means no preprocessor file end select select_preprocessor ! which preprocessor ! ---------------------------------------------------------------------- ! log iso_varying_strings has_varying_strings: if( strings )then ! report strings write( unit= log_unit, fmt= fmtpr) 'processor supports iso_varying_strings' else has_varying_strings ! report strings write( unit= log_unit, fmt= fmtpr) 'processor does not support iso_varying_strings' endif has_varying_strings ! report strings ! ********************************************************************** ! check hardware parameters before doing anything else call check_hardware_values ! check user input ! ********************************************************************** ! get kinds via selected__kind() or make_pm.in ! ********************************************************************** ! determine integer kinds --------------------------------------------- ! ********************************************************************** ! seek integer kinds if requested detect_ints: if( autoint )then ! want automatic search call count_integer_kinds ! find out how many integer kinds endif detect_ints ! want automatic search number_of_integers = max( number_of_integers, default_number_of_integers) allocate( integer_kinds( number_of_integers), stat= istat) ! array of integer kinds int_alloc_error: if( istat > 0 )then write( unit=log_unit, fmt= fmtpr) 'ERROR: trouble allocating integer kind array' stop error_stop_code ! quit endif int_alloc_error ! name string, kind value, number of digits, bit size, is supported, is the default kind integer_kinds( byte_idx) = integer_kind_t( 'byte', 0, bd, 0, .false., .false.) integer_kinds( short_idx) = integer_kind_t( 'short', 0, sd, 0, .false., .false.) integer_kinds( int_idx) = integer_kind_t( 'int', 0, id, 0, .false., .false.) integer_kinds( long_idx) = integer_kind_t( 'long', 0, ld, 0, .false., .false.) ! automatically find integer kinds find_ints: if( autoint )then ! want automatic search call seek_integer_kinds ! values of array of integer kinds endif find_ints ! want automatic search ! ********************************************************************** ! detect integer kinds ! ********************************************************************** ! processor kind values integer_kinds( byte_idx)% kind_value = selected_int_kind( bd) ! byte kind integer_kinds( short_idx)% kind_value = selected_int_kind( sd) ! short kind integer_kinds( int_idx)% kind_value = selected_int_kind( id) ! int kind integer_kinds( long_idx)% kind_value = selected_int_kind( ld) ! long kind ! byte is supported if it exists and is not the same as short and the user wants it integer_kinds( byte_idx)% supported = ( integer_kinds( byte_idx)% kind_value > 0) & .and. ( integer_kinds( byte_idx)% kind_value /= integer_kinds( short_idx)% kind_value) & .and. want_ib ! short is supported if it exists and is not the same as int and the user wants it integer_kinds( short_idx)% supported = ( integer_kinds( short_idx)% kind_value > 0) & .and. ( integer_kinds( short_idx)% kind_value /= integer_kinds( int_idx)% kind_value) & .and. want_is ! int is supported if it exists and is not the same as long and the user wants it integer_kinds( int_idx)% supported = ( integer_kinds( int_idx)% kind_value > 0) & .and. ( integer_kinds( int_idx)% kind_value /= integer_kinds( long_idx)% kind_value) & .and. want_ii ! long is supported if it exists and the user wants it integer_kinds( long_idx)% supported = ( integer_kinds( long_idx)% kind_value > 0) & .and. want_il ! ---------------------------------------------------------------------- ! write integer kinds in logfile write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'assigned integer kinds:' ! processor has bytes has_byte: if( integer_kinds( byte_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' byte' endif has_byte ! processor has shorts has_short: if( integer_kinds( short_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' short' endif has_short ! processor has ints has_int: if( integer_kinds( int_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' int' endif has_int ! processor has longs has_long: if( integer_kinds( long_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' long' endif has_long write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! complain if there isn't at least one integer kind detected count_kinds = count( integer_kinds% supported) ! count supported integer kinds count_integers: if( count_kinds < 1 )then ! report bad count write( unit= log_unit, fmt= fmtpr) 'WARNING: no integer kinds detected' endif count_integers ! report bad count ! ---------------------------------------------------------------------- ! detect default integer kind integer_kinds( byte_idx)% default_kind = integer_kinds( byte_idx)% supported & .and. integer_kinds( byte_idx)% kind_value == kind( 0) ! default is byte integer_kinds( short_idx)% default_kind = integer_kinds( short_idx)% supported & .and. integer_kinds( short_idx)% kind_value == kind( 0) ! default is short integer_kinds( int_idx)% default_kind = integer_kinds( int_idx)% supported & .and. integer_kinds( int_idx)% kind_value == kind( 0) ! default is int integer_kinds( long_idx)% default_kind = integer_kinds( long_idx)% supported & .and. integer_kinds( long_idx)% kind_value == kind( 0) ! default is long ! report default integer kind write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'default integer kind:' ! default is byte def_integer: if( integer_kinds( byte_idx)% default_kind )then ! default integer write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' byte' ! default is short elseif( integer_kinds( short_idx)% default_kind )then def_integer ! default integer write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' short' ! default is int elseif( integer_kinds( int_idx)% default_kind )then def_integer ! default integer write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' int' ! default is long elseif( integer_kinds( long_idx)% default_kind )then def_integer ! default integer write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' long' ! default is not found else def_integer ! no default integer write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' WARNING: default integer not detected!' endif def_integer ! default integer write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! complain if there isn't exactly one default integer kind detected count_kinds = count( integer_kinds% default_kind) ! count default integer kinds count_def_integers: if( count_kinds < 1 )then ! complain if too few write( unit= log_unit, fmt= fmtpr) 'WARNING: default integer kind not detected!' elseif( count_kinds > 1 )then count_def_integers ! complain if too few write( unit= log_unit, fmt= fmtpr) 'WARNING: default integer kind not unique!' endif count_def_integers ! possible complaints ! ********************************************************************** ! determine real kinds ------------------------------------------------ ! ********************************************************************** ! seek real kinds if requested detect_reals: if( autoreal )then ! want automatic search call count_real_kinds ! find out how many real kinds endif detect_reals ! want automatic search number_of_reals = max( default_number_of_reals, number_of_reals) allocate( real_kinds( number_of_reals), stat= istat) real_alloc_error: if( istat > 0 )then write( unit=log_unit, fmt= fmtpr) 'ERROR: trouble allocating real kind array' stop error_stop_code ! quit endif real_alloc_error ! name string, kind value, precision, range, bit size, is supported, is the default kind, is the default double real_kinds( single_idx) = & real_kind_t( 'single', 0, sp, sr, 0, .false., .false., .false.) real_kinds( double_idx) = & real_kind_t( 'double', 0, dp, dr, 0, .false., .false., .false.) real_kinds( quad_idx) = & real_kind_t( 'quad', 0, qp, qr, 0, .false., .false., .false.) ! automatically find real kinds find_reals: if( autoreal )then ! want automatic search call seek_real_kinds ! try to detect real kinds endif find_reals ! want automatic search ! ********************************************************************** ! detect real kinds ! ********************************************************************** ! get kind values real_kinds( single_idx)% kind_value = selected_real_kind( sp, sr) ! single kind real_kinds( double_idx)% kind_value = selected_real_kind( dp, dr) ! double kind real_kinds( quad_idx)% kind_value = selected_real_kind( qp, qr) ! quad kind ! single is supported if it exists and is no the same as double and the user wants it real_kinds( single_idx)% supported = ( real_kinds( single_idx)% kind_value > 0) & .and. ( real_kinds( single_idx)% kind_value /= real_kinds( double_idx)% kind_value) & .and. want_rs ! double is supported if it exists and is no the same as quad and the user wants it real_kinds( double_idx)% supported = ( real_kinds( double_idx)% kind_value > 0) & .and. ( real_kinds( double_idx)% kind_value /= real_kinds( quad_idx)% kind_value) & .and. want_rd ! quad is supported if it exists and the user wants it real_kinds( quad_idx)% supported = real_kinds( quad_idx)% kind_value > 0 & .and. want_rq ! ---------------------------------------------------------------------- ! log real kinds write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'assigned real kinds:' has_single: if( real_kinds( single_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' single' endif has_single has_double: if( real_kinds( double_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' double' endif has_double has_quad: if( real_kinds( quad_idx)% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' quad' endif has_quad write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! detect default real kind real_kinds( single_idx)% default_kind = real_kinds( single_idx)% supported & .and. real_kinds( single_idx)% kind_value == kind( 0.0) ! default is single real_kinds( double_idx)% default_kind = real_kinds( double_idx)% supported & .and. real_kinds( double_idx)% kind_value == kind( 0.0) ! default is double real_kinds( quad_idx)% default_kind = real_kinds( quad_idx)% supported & .and. real_kinds( quad_idx)% kind_value == kind( 0.0) ! default is quad ! report default real kind write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'default real kind:' def_real: if( real_kinds( single_idx)% default_kind )then ! default real write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' single' elseif( real_kinds( double_idx)% default_kind )then def_real ! default real write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' double' elseif( real_kinds( quad_idx)% default_kind )then def_real ! default real write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' quad' else def_real ! no default real write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' WARNING: default real not detected!' endif def_real ! default real write( unit= log_unit, fmt= *) ! end of record ! single is the default double precision kind if it exists and has the kind of 0.0d0 real_kinds( single_idx)% default_dp_kind = real_kinds( single_idx)% supported & .and. real_kinds( single_idx)% kind_value == kind( 0.0d0) ! double precision is single ! double is the default double precision kind if it exists and has the kind of 0.0d0 real_kinds( double_idx)% default_dp_kind = real_kinds( double_idx)% supported & .and. real_kinds( double_idx)% kind_value == kind( 0.0d0) ! double precision is double ! quad is the default double precision kind if it exists and has the kind of 0.0d0 real_kinds( quad_idx)% default_dp_kind = real_kinds( quad_idx)% supported & .and. real_kinds( quad_idx)% kind_value == kind( 0.0d0) ! double precision is quad ! ---------------------------------------------------------------------- ! report the double precision kind write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'double precision kind:' def_dp: if( real_kinds( single_idx)% default_dp_kind )then ! double precision write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' single' elseif( real_kinds( double_idx)% default_dp_kind )then def_dp ! double precision write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' double' elseif( real_kinds( quad_idx)% default_dp_kind )then def_dp ! double precision write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' quad' else def_dp ! no double precision write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' WARNING: double precision not detected!' endif def_dp ! double precision write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! complain if there aren't at least two real kinds detected count_reals: if( count( real_kinds% supported) < 2 )then ! count supported real kinds write( unit= log_unit, fmt= fmtpr) 'WARNING: fewer than 2 real kinds detected' endif count_reals ! count supported real kinds ! ---------------------------------------------------------------------- ! complain if there aren't exactly two default real kinds detected count_kinds = count( real_kinds% default_kind) ! count supported default real kinds count_def_reals: if( count_kinds < 1 )then ! complain if too few write( unit= log_unit, fmt= fmtpr) 'WARNING: default real kind not detected' elseif( count_kinds > 1 )then count_def_reals ! complain if too many write( unit= log_unit, fmt= fmtpr) 'WARNING: default real kind not unique' endif count_def_reals ! possible complaints count_kinds = count( real_kinds% default_dp_kind) ! count supported default real kinds count_def_dp_reals: if( count_kinds < 1 )then ! complain if too few write( unit= log_unit, fmt= fmtpr) 'WARNING: default double kind not detected' elseif( count_kinds > 1 )then count_def_dp_reals ! complain if too many write( unit= log_unit, fmt= fmtpr) 'WARNING: default double kind not unique' endif count_def_dp_reals ! possible complaints ! ********************************************************************** ! check correspondence between default real and double precision kinds s_dp_real: if( kind( 0.0) == kind( 0.0d0) )then ! single real <-> dp real write( unit= log_unit, fmt= fmtpr) 'default real kind same value as double precision real kind' endif s_dp_real ! single real <-> dp real ! try to guess correspondence between real and integer kinds int_real: if( kind( 0) == kind( 0.0) )then ! default integer <-> default real write( unit= log_unit, fmt= fmtpr) 'default integer kind same value as default real kind' elseif( kind( 0) == kind( 0.0d0) )then int_real ! default integer <-> default dp write( unit= log_unit, fmt= fmtpr) 'default integer kind same value as double precision kind' else int_real write( unit= log_unit, fmt= fmtpr) 'NOTE: integer kind <-> real kind correspondence not detected!' endif int_real ! default integer <-> default real ! ********************************************************************** ! process character kinds from input valiables ! ********************************************************************** ! name string, kind value, is supported, is the default, string passed to selected_char_kind() ! ---------------------------------------------------------------------- ! ascii characters ascii_character = character_kind_t( 'ascii', max( ascii, not_supported), ascii > 0, .false., 'ASCII') ! ebcdic characters ebcdic_character = character_kind_t( 'ebcdic', max( ebcdic, not_supported), ebcdic > 0, .false., 'EBCDIC') ! iso_10646 characters iso_10646_character = character_kind_t( 'iso_10646', max( iso_10646, not_supported), iso_10646 > 0, .false., & 'ISO_10646') ! found any character kinds define_characters = ascii_character% supported .or. ebcdic_character% supported & .or. iso_10646_character% supported ! ---------------------------------------------------------------------- ! log character kinds write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'defined character kinds:' want_char: if( define_characters )then ! if characters defined define_ascii: if( ascii_character% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' ascii' endif define_ascii define_ebcdic: if( ebcdic_character% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' ebcdic' endif define_ebcdic define_iso_10646: if( iso_10646_character% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' iso_10646' endif define_iso_10646 else want_char ! if characters defined write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' none' endif want_char ! if characters defined write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! default character kind write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'default character kind:' default_char: if( define_characters )then ! default character ascii_character% default_kind = ascii_character% supported .and. ascii_character% kind_value == kind( ' ') ebcdic_character% default_kind = ebcdic_character% supported & .and. ebcdic_character% kind_value == kind( ' ') iso_10646_character% default_kind = iso_10646_character% supported & .and. iso_10646_character% kind_value == kind ( ' ') default_ascii: if( ascii_character% default_kind )then ! default is ascii write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' ascii' endif default_ascii ! default is ascii default_ebcdic: if( ebcdic_character% default_kind )then ! default is ebcdic write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' ebcdic' endif default_ebcdic ! default is ebcdic default_iso_10646: if( iso_10646_character% default_kind )then ! default is iso 10646 write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' iso_10646' endif default_iso_10646 ! default is iso 10646 else default_char ! default character write( unit= log_unit, fmt= fmti, advance= 'NO') kind( ' ') ! no name so print value endif default_char ! default character write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! character kinds sanity check define_char: if( define_characters )then ! if defined character kinds call check_character_kinds ! check user input endif define_char ! if defined character kinds ! ********************************************************************** ! process logical kinds from input variables ! ********************************************************************** ! name string, kind value, is supported, is the default ! ---------------------------------------------------------------------- ! if logical kinds correspond to integer kinds log_eq_int: if( logeqint )then ! make logicals same as integers ! byte kind same_byte: if( integer_kinds( byte_idx)% supported )then byte_logical = logical_kind_t( 'l_byte', integer_kinds( byte_idx)% kind_value, .true., .false.) else same_byte byte_logical = logical_kind_t( '', not_supported, .false., .false.) endif same_byte ! short kind same_short: if( integer_kinds( short_idx)% supported )then short_logical = logical_kind_t( 'l_short', integer_kinds( short_idx)% kind_value, .true., .false.) else same_short short_logical = logical_kind_t( '', not_supported, .false., .false.) endif same_short ! int kind same_int: if( integer_kinds( int_idx)% supported )then int_logical = logical_kind_t( 'l_int', integer_kinds( int_idx)% kind_value, .true., .false.) else same_int int_logical = logical_kind_t( '', not_supported, .false., .false.) endif same_int ! long kind same_long: if( integer_kinds( long_idx)% supported )then long_logical = logical_kind_t( 'l_long', integer_kinds( long_idx)% kind_value, .true., .false.) else same_long long_logical = logical_kind_t( '', not_supported, .false., .false.) endif same_long ! logical kinds specified individually else log_eq_int ! byte kind want_bl: if( logbyte > 0 )then byte_logical = logical_kind_t( 'l_byte', max( logbyte, not_supported), .true., .false.) else want_bl byte_logical = logical_kind_t( '', max( logbyte, not_supported), .false., .false.) endif want_bl ! short kind want_sl: if( logshort > 0 )then short_logical = logical_kind_t( 'l_short', max( logshort, not_supported), .true., .false.) else want_sl short_logical = logical_kind_t( '', max( logshort, not_supported), .false., .false.) endif want_sl ! int kind want_intl: if( logint > 0 )then int_logical = logical_kind_t( 'l_int', max( logint, not_supported), .true., .false.) else want_intl int_logical = logical_kind_t( '', max( logint, not_supported), .false., .false.) endif want_intl ! long kind want_ll: if( loglong > 0 )then long_logical = logical_kind_t( 'l_long', max( loglong, not_supported), .true., .false.) else want_ll long_logical = logical_kind_t( '', max( loglong, not_supported), .false., .false.) endif want_ll endif log_eq_int ! make logicals same as integers ! ---------------------------------------------------------------------- ! ensure unique logical kind values byte_logical% supported = byte_logical% kind_value > 0 & .and. byte_logical% kind_value /= short_logical% kind_value short_logical% supported = short_logical% kind_value > 0 & .and. short_logical% kind_value /= int_logical% kind_value int_logical% supported = int_logical% kind_value > 0 & .and. int_logical% kind_value /= long_logical% kind_value long_logical% supported = long_logical% kind_value > 0 ! found any logical kinds define_logicals = byte_logical% supported .or. short_logical% supported & .or. int_logical% supported .or. long_logical% supported ! ---------------------------------------------------------------------- ! log logical kinds write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'defined logical kinds:' report_logicals: if( define_logicals )then ! if logicals defined report_logical_byte: if( byte_logical% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' byte' endif report_logical_byte report_logical_short: if( short_logical% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' short' endif report_logical_short report_logical_int: if( int_logical% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' int' endif report_logical_int report_logical_long: if( long_logical% supported )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' long' endif report_logical_long else report_logicals ! if logicals defined write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' none' endif report_logicals ! if logicals defined write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! default logical kind byte_logical% default_kind = byte_logical% supported & .and. byte_logical% kind_value == kind( .true.) ! default logical is byte short_logical% default_kind = short_logical% supported & .and. short_logical% kind_value == kind( .true.) ! default logical is short int_logical% default_kind = int_logical% supported & .and. int_logical% kind_value == kind( .true.) ! default logical is int long_logical% default_kind = long_logical% supported & .and. long_logical% kind_value == kind( .true.) ! default logical is long write( unit= log_unit, fmt= fmtpr, advance= 'NO') 'default logical kind:' report_default_logical: if( define_logicals )then ! if logicals defined report_default_logical_byte: if( byte_logical% default_kind )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' byte' endif report_default_logical_byte report_default_logical_short: if( short_logical% default_kind )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' short' endif report_default_logical_short report_default_logical_int: if( int_logical% default_kind )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' int' endif report_default_logical_int report_default_logical_long: if( long_logical% default_kind )then write( unit= log_unit, fmt= fmtpr, advance= 'NO') ' long' endif report_default_logical_long else report_default_logical ! if logicals defined write( unit= log_unit, fmt= fmti, advance= 'NO') kind( .true.) ! no name so print value endif report_default_logical ! if logicals defined write( unit= log_unit, fmt= *) ! end of record ! ---------------------------------------------------------------------- ! sanity check and promotion of logical kinds check_logicals: if( define_logicals )then ! defined logical kinds call check_logical_kinds ! check user input endif check_logicals ! defined logical kinds ! ********************************************************************** ! try to diagnose (some) i/o parameters call diagnose_input_output ! basic io tests ! ********************************************************************** ! write the defines include file ! ********************************************************************** ! write which kinds are defined to preprocessor include file got_incfile: select case( ppr_inc) ! inc file was named ! no include file was requested case( no_inc) got_incfile ! inc file was named write( unit= log_unit, fmt= fmtpr) 'no preprocessor include file written' ! an include file was requested case default got_incfile ! inc file was named write( unit= log_unit, fmt= fmtpr) 'writing ' // trim( incname) call write_include_file( istat) ! write module processor_dependencies write_include_file_error: if( istat > 0 )then ! if error writing stdtype.f90 write( unit= log_unit, fmt= fmtpr) 'ERROR: trouble writing ' // trim( incname) stop error_stop_code ! quit else write_include_file_error ! trouble closing write( unit= log_unit, fmt= fmtpr) 'wrote ' // trim( incname) // ' ok' endif write_include_file_error ! if error writing stdtype.f90 end select got_incfile ! inc file was named ! ********************************************************************** ! write the Fortran source for processor_dependencies and processor_model ! ********************************************************************** ! write procdep.f90 write( unit= log_unit, fmt= fmtpr) 'writing ' // trim( pdname) ! log attempt call write_processor_dependencies( istat) ! write module processor_dependencies ! verify status write_processor_depend_error: if( istat > 0 )then ! if error writing procdep.f90 write( unit= log_unit, fmt= fmtpr) 'ERROR: trouble writing ' // trim( pdname) stop error_stop_code ! quit else write_processor_depend_error ! if error writing procdep.f90 write( unit= log_unit, fmt= fmtpr) 'wrote ' // trim( pdname) // ' ok' endif write_processor_depend_error ! if error writing procdep.f90 ! ********************************************************************** ! write pm.f90 write( unit= log_unit, fmt= fmtpr) 'writing ' // trim( pmname) ! log attempt call write_processor_model( istat) ! write program processor_model ! verify status write_processor_model_error: if( istat > 0 )then ! if error writing pm.f90 write( unit= log_unit, fmt= fmtpr) 'ERROR: trouble writing ' // trim( pmname) stop error_stop_code ! quit else write_processor_model_error ! if error writing pm.f90 write( unit= log_unit, fmt= fmtpr) 'wrote ' // trim( pmname) // ' ok' endif write_processor_model_error ! if error writing pm.f90 ! ********************************************************************** ! write date/time in logfile call date_and_time( date= run_date, time= run_time) ! time of this run timestamp = run_date // run_time ! combine write( unit= log_unit, fmt= fmtpr) 'timestamp: ' // timestamp ! log timestamp ! close logfile close( unit= log_unit, status= 'KEEP') ! keep logfile ! ********************************************************************** ! make_processor_model stop normal_stop_code ! make_processor_model ! ********************************************************************** ! make_processor_model library ! ********************************************************************** contains ! make_processor_model ! ********************************************************************** ! read_input_file() reads the user provided configuration file, if accessible subroutine read_input_file( istat) ! ********************************************************************** ! read_input_file() interface integer, intent( out) :: istat ! status ! ********************************************************************** ! read_input_file() local logical :: have_rc ! true if make_pm.in file exists logical :: found ! found a namelist group character( len= *), parameter :: error_msg = 'ERROR: trouble reading namelist group ' ! ********************************************************************** ! read_input_file() text continue ! read_input_file() ! detect file make_pm.in inquire( file= rc_name, exist= have_rc) ! does rc_name exist? ! if file make_pm.in exists rc_exists: if( have_rc )then ! make_pm.in exists ! open file make_pm.in to read from the beginning open( unit= nml_unit, file= rc_name, iostat= istat, position= 'REWIND', & action= 'READ', status= 'OLD') open_error: if( istat > 0 )then ! can't open make_pm.in write( unit= log_unit, fmt= fmtpr) cant_open // rc_name ! complain return ! read_input_file() endif open_error ! can't open make_pm.in else rc_exists ! make_pm.in exists ! no make_pm.in file was found istat = -1 ! ok, use defaults return ! read_input_file() endif rc_exists ! make_pm.in exists ! ---------------------------------------------------------------------- ! read namelist group 'files' call seek_namelist_group( 'files', found, istat) found_files: if( found )then read( unit= nml_unit, nml= files, iostat= istat) ! filenames endif found_files files_error: if( istat > 0 )then ! can't read files write( unit= log_unit, fmt= fmtpr) error_msg // '"files"' ! complain return ! read_input_file() endif files_error ! can't read files write( unit= log_unit, nml= files) ! echo to logfile rewind( unit= nml_unit) ! read namelist groups in any order ! ---------------------------------------------------------------------- ! read namelist group 'hw' call seek_namelist_group( 'hw', found, istat) found_hw: if( found )then read( unit= nml_unit, nml= hw, iostat= istat) ! hardware endif found_hw hw_error: if( istat > 0 )then ! can't read hw write( unit= log_unit, fmt= fmtpr) error_msg // '"hw"' ! complain return ! read_input_file() endif hw_error ! can't read hw write( unit= log_unit, nml= hw) ! echo to logfile rewind( unit= nml_unit) ! read namelist groups in any order ! ---------------------------------------------------------------------- ! read namelist group 'sw' call seek_namelist_group( 'sw', found, istat) found_sw: if( found )then read( unit= nml_unit, nml= sw, iostat= istat) ! basic software endif found_sw sw_error: if( istat > 0 )then ! can't read sw write( unit= log_unit, fmt= fmtpr) error_msg // '"sw"' ! complain return ! read_input_file() endif sw_error ! can't read sw write( unit= log_unit, nml= sw) ! echo to logfile rewind( unit= nml_unit) ! read namelist groups in any order ! ---------------------------------------------------------------------- ! read namelist group 'kinds' call seek_namelist_group( 'kinds', found, istat) found_kinds: if( found )then read( unit= nml_unit, nml= kinds, iostat= istat) ! non-numeric kinds endif found_kinds kinds_error: if( istat > 0 )then ! can't read kinds write( unit= log_unit, fmt= fmtpr) error_msg // '"kinds"' ! complain return ! read_input_file() endif kinds_error ! can't read kinds write( unit= log_unit, nml= kinds) ! echo to logfile rewind( unit= nml_unit) ! read namelist groups in any order ! ---------------------------------------------------------------------- ! read namelist group 'float' call seek_namelist_group( 'float', found, istat) found_float: if( found )then read( unit= nml_unit, nml= float, iostat= istat) ! real, complex kinds endif found_float float_error: if( istat > 0 )then ! can't read float write( unit= log_unit, fmt= fmtpr) error_msg // '"float"' ! complain return ! read_input_file() endif float_error ! can't read float write( unit= log_unit, nml= float) ! echo to logfile rewind( unit= nml_unit) ! read namelist groups in any order ! ---------------------------------------------------------------------- ! read namelist group 'fixed' call seek_namelist_group( 'fixed', found, istat) found_fixed: if( found )then read( unit= nml_unit, nml= fixed, iostat= istat) ! integer kinds endif found_fixed fixed_error: if( istat > 0 )then ! can't read fixed write( unit= log_unit, fmt= fmtpr) error_msg // '"fixed"' ! complain return ! read_input_file() endif fixed_error ! can't read fixed write( unit= log_unit, nml= fixed) ! echo to logfile ! ---------------------------------------------------------------------- ! close file make_pm.in close( unit= nml_unit, iostat= istat, status= 'KEEP') ! (tried to) read all groups close_error: if( istat > 0 )then ! trouble closing write( unit= log_unit, fmt= fmtpr) 'trouble closing ' // rc_name endif close_error ! trouble closing return ! read_input_file() ! ********************************************************************** ! read_input_file() end subroutine read_input_file ! ********************************************************************** ! seek_namelist_group() reads the user provided configuration file, if accessible subroutine seek_namelist_group( group_name, found, istat) ! ********************************************************************** ! seek_namelist_group() interface character( len= *), intent( in) :: group_name ! name of namelist to seek logical, intent( out) :: found ! true if found otherwise false integer, intent( out) :: istat ! status ! ********************************************************************** ! seek_namelist_group() constants character( len= *), parameter :: error_msg = 'error seeking namelist group ' character( len= *), parameter :: afmt = '(a)' ! read format ! introduce namelist group name character( len= *), parameter :: signal = '&' ! start of namelist group name ! ignore blanks character( len= *), parameter :: blank = ' ' ! may appear before & ! namelist separators character( len= *), parameter :: separators = ' ,!/' ! may appear after a group name ! ********************************************************************** ! seek_namelist_group() local character( len= 1024) :: input_buffer ! read with a format character( len= 32) :: lower_case_name ! lower case namelist group name integer :: name_len ! length of group name integer :: input_name_len ! length of name in input integer :: name_ptr ! point to characters in name integer :: signal_ptr ! point to signal in input buffer integer :: input_name_loc ! first character in input buffer name integer :: input_name_ptr ! point to characters in input buffer name ! ********************************************************************** ! seek_namelist_group() text continue ! seek_namelist_group() ! get name length & convert name to lc name_len = len_trim( group_name) ! length of name lower_case_name = blank ! set to blanks ! loop through each character in name name_to_lower_case: do name_ptr = 1, name_len ! each character in name ! examine each character in name each_character: select case( group_name( name_ptr: name_ptr)) ! examine ! if upper case letter case( 'A': 'Z') each_character ! find upper case ! convert upper case letter to lower case letter lower_case_name( name_ptr: name_ptr) = achar( iachar( group_name( name_ptr: name_ptr)) + change_case) ! otherwise case default each_character ! find something else ! copy character lower_case_name( name_ptr: name_ptr) = group_name( name_ptr: name_ptr) end select each_character ! examine enddo name_to_lower_case ! each character in name ! ---------------------------------------------------------------------- ! initialize read records loop istat = 0 ! no errors nor end found = .false. ! not found yet ! read until end of file or nemalist group is found seek_name: do while( istat == 0 ) ! read til found or eof ! read a record as a character string read( unit= nml_unit, fmt = afmt, iostat= istat) input_buffer ! read record as characters ! case of istat read_status: select case( istat) ! check io status ! encountered an end case( : -1) read_status ! must be eof ! end of file istat = 0 ! eof without finding group name exit seek_name ! quit ! read error case( 1: ) read_status ! read error ! complain & quit write( unit= log_unit, fmt= fmtpr) error_msg // group_name ! add name to complaint exit seek_name ! quit ! ---------------------------------------------------------------------- ! got record to decode case default read_status ! read a string ! seek signal of namelist group name signal_ptr = verify( input_buffer, blank) ! find first non blank ! if one is found first_non_blank: if( signal_ptr > 0 )then ! point to first non blank ! if possible group name found_signal: if( input_buffer( signal_ptr: signal_ptr) == signal )then ! name starts at next character after signal input_name_loc = signal_ptr + 1 ! first character of name ! find separator in input buffer input_name_len = scan( input_buffer( input_name_loc: ), separators) + signal_ptr ! convert any upper case letter to lower case to match name input_name_to_lower_case: do input_name_ptr = input_name_loc, input_name_len ! examine each character input_each_character: select case( input_buffer( input_name_ptr: input_name_ptr)) ! upper case letter case( 'A': 'Z') input_each_character ! upper case to lower case ! convert to lower case letter input_buffer( input_name_ptr: input_name_ptr) = & achar( iachar( input_buffer( input_name_ptr: input_name_ptr)) + change_case) end select input_each_character ! upper case to lower case enddo input_name_to_lower_case ! do each character ! look for a name match name_eq: if( input_buffer( input_name_loc: input_name_len) == lower_case_name )then ! found name following signal found = .true. ! eureka ! if match, backspace so caller can reread record backspace( unit= nml_unit, iostat= istat) ! put it back ! check for backspace error back_error: if( istat > 0 )then ! if error write( unit= log_unit, fmt= *) error_msg // group_name endif back_error ! if error ! exit from read loop exit seek_name ! quit successfully ! name match endif name_eq ! name found in input_buffer ! found signal endif found_signal ! & found in input_buffer ! nonblank record endif first_non_blank ! skip blanks in input_buffer ! ---------------------------------------------------------------------- ! read iostat case end select read_status ! read not error nor end ! read to eof enddo seek_name ! read til found or eof ! return return ! seek_namelist_group() ! ********************************************************************** ! seek_namelist_group() end subroutine seek_namelist_group ! ********************************************************************** ! count_integer_kinds() counts integer kinds subroutine count_integer_kinds ! ********************************************************************** ! This subroutine counts the number of integer kinds this processor supports. ! ********************************************************************** ! count_integer_kinds() local integer :: count_kinds ! count the number of integer kinds integer :: this_kind ! find kinds integer :: previous_kind ! the previous kind found integer :: this_digits ! loop through digits ! ********************************************************************** ! count_integer_kinds() continue ! count_integer_kinds() ! ********************************************************************** ! The search assumes the following: ! There must be at least one kind of integer. ! One kind of integer will support at least one digit. ! All integer kinds can be found by searching through increasing numbers of digits supported. ! A negative kind value will be returned only when all kinds have been found. ! ********************************************************************** ! initialize search for integer kinds count_kinds = 1 ! number of kinds found so far this_digits = 1 ! digits tested by selected_int_kind() previous_kind = selected_int_kind( this_digits) ! must support one integer kind ! ---------------------------------------------------------------------- ! do until all kinds are found find_all_kinds: do ! loop over digits this_kind = selected_int_kind( this_digits) ! kind with this digits ! branch: or all kinds found --> quit, found new kind --> count new_or_same_kind: if( this_kind < 0 )then ! not a kind value exit find_all_kinds ! found all kinds elseif( this_kind /= previous_kind )then new_or_same_kind ! found new kind count_kinds = count_kinds + 1 ! new kind previous_kind = this_kind ! update previous kind endif new_or_same_kind ! case of kind value this_digits = this_digits + 1 ! try one more digit ! do until kind value is negative enddo find_all_kinds ! loop over digits ! ---------------------------------------------------------------------- ! report and record number of integer kinds write( unit= log_unit, fmt= *) 'number of integer kinds found: ', count_kinds number_of_integers = count_kinds ! count of kinds ! ********************************************************************** ! return with integer kind values known return ! count_integer_kinds() ! ********************************************************************** ! count_integer_kinds() end subroutine count_integer_kinds ! ********************************************************************** ! seek_integer_kinds() seeks integer kinds subroutine seek_integer_kinds ! ********************************************************************** ! This subroutine finds the integer kinds available and ! tries to map them to the byte, short, int, and long kind names. ! ********************************************************************** ! seek_integer_kinds() constants ! ---------------------------------------------------------------------- ! prefix of nondefault integer kind names character( len= *), parameter :: kind_prefix = 'int' ! int ! ********************************************************************** ! seek_integer_kinds() local ! ---------------------------------------------------------------------- integer :: previous_kind ! last valid kind value found integer :: selected_kind ! returned by selected_int_kind() integer :: this_digits ! loop over digits integer :: kinds_count ! count kinds found integer :: match_count ! try to assign each kind found character( len= kind_len) :: name_buffer ! construct unusual names ! ********************************************************************** ! seek_integer_kinds() continue ! seek_integer_kinds() ! ********************************************************************** ! The search assumes the following: ! There must be at least one kind of integer. ! One kind of integer will support at least one digit. ! All integer kinds can be found by searching through increasing numbers of digits supported. ! A negative kind value will be returned only when all kinds have been found. ! ********************************************************************** ! initialize search for integer kinds kinds_count = 1 ! start with the first kind to be found this_digits = 1 ! which must have at least one digit selected_kind = selected_int_kind( r= this_digits) ! must support one integer kind integer_kinds( kinds_count)% kind_value = selected_kind ! first kind value found integer_kinds( kinds_count)% max_digits = this_digits ! last digits used to select this kind previous_kind = selected_kind ! kind already found ! ---------------------------------------------------------------------- ! do until kind value is negative find_all_kinds: do ! loop over digits selected_kind = selected_int_kind( r= this_digits) ! kind with one more digit ! branch: all kinds found, found new kind, or found old kind again new_or_same_kind: if( selected_kind < 0 )then ! not a kind value exit find_all_kinds ! found all kinds elseif( selected_kind /= previous_kind )then new_or_same_kind ! found new kind kinds_count = kinds_count + 1 ! new kind integer_kinds( kinds_count)% kind_value = selected_kind ! store kind value integer_kinds( kinds_count)% max_digits = this_digits ! most digits supported integer_kinds( kinds_count)% supported = .false. ! not named yet previous_kind = selected_kind ! update previous kind else new_or_same_kind ! same kind value integer_kinds( kinds_count)% max_digits = this_digits ! supports one more digit endif new_or_same_kind ! case of kind value ! go find next kind this_digits = this_digits + 1 ! try one more digit enddo find_all_kinds ! loop over digits ! ---------------------------------------------------------------------- ! found up to max_kinds integer kinds report_kinds: do this_digits = 1, ubound( array= integer_kinds, dim= 1) call find_integer_bit_size( integer_kinds( this_digits)) report_supported: if( integer_kinds( this_digits)% kind_value > 0 )then write( unit= log_unit, fmt= *) 'found integer kind: ', integer_kinds( this_digits)% kind_value, & ' supporting digits: ', integer_kinds( this_digits)% max_digits, & ' estimated bit size: ', integer_kinds( this_digits)% integer_bit_size endif report_supported enddo report_kinds ! ********************************************************************** ! The mapping assumes the following: ! All kinds supported were found by the above search. ! The integer kinds will support approximately 2, 4, 9 or 18 digits. ! A kind may be missing. ! There are no more than four kinds of integers. ! These kinds may be sensibly mapped to byte, short, int and long. ! ********************************************************************** ! try to set integer kinds parameters set_digits: if( storage_size_is_2n )then ! (probably) a power of 2 word size ! ---------------------------------------------------------------------- ! try to match exactly each kind found with one of byte, short, int, long assign_kinds_exactly: do match_count = 1, kinds_count ! search thru kinds found kinds_2n: select case( integer_kinds( match_count)% max_digits ) case( 2) kinds_2n ! byte digits byte_idx = match_count bd = integer_kinds( match_count)% max_digits ! set byte digits inquiry integer_kinds( match_count)% kind_name = 'byte' integer_kinds( match_count)% supported = .true. ! this kind is assigned to byte case( 4) kinds_2n ! short digits short_idx = match_count sd = integer_kinds( match_count)% max_digits ! set short digits inquiry integer_kinds( match_count)% kind_name = 'short' integer_kinds( match_count)% supported = .true. ! this kind assigned to short case( 9) kinds_2n ! int digits int_idx = match_count id = integer_kinds( match_count)% max_digits ! set int digits inquiry integer_kinds( match_count)% kind_name = 'int' integer_kinds( match_count)% supported = .true. ! this kind assigned to int case( 18) kinds_2n ! long digits long_idx = match_count ld = integer_kinds( match_count)% max_digits ! set long digits inquiry integer_kinds( match_count)% kind_name = 'long' integer_kinds( match_count)% supported = .true. ! this kind assigned to long case default kinds_2n ! odd sizes in 2^n word write( unit= name_buffer, fmt= *) integer_kinds( match_count)% max_digits integer_kinds( match_count)% kind_name = kind_prefix // adjustl( name_buffer) integer_kinds( match_count)% supported = .true. ! this kind assigned to long end select kinds_2n ! select range enddo assign_kinds_exactly ! search thru kinds found ! ---------------------------------------------------------------------- ! processor word size is not a power of 2 else set_digits ! ---------------------------------------------------------------------- ! try to match approximately each kind found with one of byte, short, int, long assign_kinds: do match_count = 1, kinds_count ! search thru kinds found kinds_odd: select case( integer_kinds( match_count)% max_digits ) case( 2: 3) kinds_odd ! byte range one_byte: if( byte_idx == 0 )then ! only one byte byte_idx = match_count bd = integer_kinds( match_count)% max_digits ! set byte digits inquiry integer_kinds( match_count)% kind_name = 'byte' integer_kinds( match_count)% supported = .true. ! this kind is assigned to byte endif one_byte ! only one byte case( 4: 5) kinds_odd ! short range one_short: if( short_idx == 0 )then ! only one short short_idx = match_count sd = integer_kinds( match_count)% max_digits ! set short digits inquiry integer_kinds( match_count)% kind_name = 'short' integer_kinds( match_count)% supported = .true. ! this kind assigned to short endif one_short ! only one short case( 9: 10) kinds_odd ! int range one_int: if( int_idx == 0 )then ! only one int int_idx = match_count id = integer_kinds( match_count)% max_digits ! set int digits inquiry integer_kinds( match_count)% kind_name = 'int' integer_kinds( match_count)% supported = .true. ! this kind assigned to int endif one_int ! only one int case( 18: 20) kinds_odd ! long range one_long: if( long_idx == 0 )then ! only one long long_idx = match_count ld = integer_kinds( match_count)% max_digits ! set long digits inquiry integer_kinds( match_count)% kind_name = 'long' integer_kinds( match_count)% supported = .true. ! this kind assigned to long endif one_long ! only one long case default kinds_odd ! odd sized integer kind write( unit= name_buffer, fmt= *) integer_kinds( match_count)% max_digits integer_kinds( match_count)% kind_name = kind_prefix // adjustl( name_buffer) integer_kinds( match_count)% supported = .true. ! this kind assigned to i end select kinds_odd ! select range enddo assign_kinds ! search thru kinds found endif set_digits ! ---------------------------------------------------------------------- ! ensure that byte, short, int, long have entries ensure_byte: if( byte_idx == 0 )then ! if byte has not been assigned find_byte: do match_count = 1, kinds_count ! scan small to large byte_slot: if( .not. integer_kinds( match_count)% supported )then integer_kinds( match_count)% kind_name = 'byte' ! first is byte byte_idx = match_count ! set index exit find_byte ! done endif byte_slot ! find unnamed kind enddo find_byte ! scan small to large endif ensure_byte ! if byte has not been assigned ensure_short: if( short_idx == 0 )then ! if short has not been assigned find_short: do match_count = 1, kinds_count ! scan small to large short_slot: if( .not. integer_kinds( match_count)% supported )then integer_kinds( match_count)% kind_name = 'short' ! next is short short_idx = match_count ! set index exit find_short ! done endif short_slot ! find unnamed kind enddo find_short ! scan small to large endif ensure_short ! if short has not been assigned ensure_int: if( int_idx == 0 )then ! if int has not been assigned find_int: do match_count = 1, kinds_count ! scan small to large int_slot: if( .not. integer_kinds( match_count)% supported )then integer_kinds( match_count)% kind_name = 'int' ! next is int int_idx = match_count ! set index exit find_int ! done endif int_slot ! find unnamed kind enddo find_int ! scan small to large endif ensure_int ! if int has not been assigned ensure_long: if( long_idx == 0 )then ! if long has not been assigned find_long: do match_count = 1, kinds_count ! scan small to large long_slot: if( .not. integer_kinds( match_count)% supported )then integer_kinds( match_count)% kind_name = 'long' ! next is long long_idx = match_count ! set index exit find_long ! done endif long_slot ! find unnamed kind enddo find_long ! scan small to large endif ensure_long ! if long has not been assigned ! ********************************************************************** ! return with integer kind values known return ! seek_integer_kinds() ! ********************************************************************** ! seek_integer_kinds() end subroutine seek_integer_kinds ! ********************************************************************** ! find_integer_bit_size() counts integer kinds subroutine find_integer_bit_size( this_integer) ! ********************************************************************** ! This subroutine finds the range of a real kind whose precision is known. ! ********************************************************************** ! find_integer_bit_size() interface type( integer_kind_t), intent( inout) :: this_integer ! find the range of this precision ! ********************************************************************** ! find_integer_bit_size() constants integer, parameter :: sign_bit = 1 ! bits in the sign bit ! ********************************************************************** ! find_integer_bit_size() local integer :: this_bits ! loop through powers of two real :: recip_log10_radix ! ********************************************************************** ! find_integer_bit_size() continue ! find_integer_bit_size() ! ********************************************************************** ! initialize search for integer bit size recip_log10_radix = 1.0 / log10( real( radix( 0)) ) ! convert decimal to radix this_bits = 1 ! initialize ! find power of two nearly equal to the digits range find_digits_bits: do ! loop over range digits_range: if( ceiling( ( this_integer% max_digits * recip_log10_radix) / this_bits) > 1 )then this_bits = this_bits + 1 ! one more bit cycle find_digits_bits ! try again else digits_range exit find_digits_bits ! quit endif digits_range ! case of kind value enddo find_digits_bits ! loop over range this_integer% integer_bit_size = sign_bit + this_bits ! estimate ! if a power of two sized processor, round to nearest power of two if_2n_hw: if( storage_size_is_2n )then ! hw is 2n round_2n: select case( this_integer% integer_bit_size) ! select power of two case( 6: 9) round_2n this_integer% integer_bit_size = 8 ! round to nearest case( 14: 17) round_2n this_integer% integer_bit_size = 16 ! round to nearest case( 29: 33) round_2n this_integer% integer_bit_size = 32 ! round to nearest case( 58: 66) round_2n this_integer% integer_bit_size = 64 ! round to nearest case( 116: 132) round_2n this_integer% integer_bit_size = 128 ! round to nearest case default round_2n ! remark difficulty write( unit= log_unit, fmt= fmtpri) 'WARNING: estimated integer size not nearly a power of 2' end select round_2n ! select power of two endif if_2n_hw ! hw is 2n ! ********************************************************************** ! return with integer kind values known return ! find_integer_bit_size() ! ********************************************************************** ! find_integer_bit_size() end subroutine find_integer_bit_size ! ********************************************************************** ! count_real_kinds() counts real kinds subroutine count_real_kinds ! ********************************************************************** ! This subroutine counts the number of real kinds available. ! ********************************************************************** ! count_real_kinds() local integer :: count_kinds ! count the number of integer kinds integer :: this_kind ! find kinds integer :: this_precision ! loop through precision integer :: previous_kind ! the previous kind found ! ********************************************************************** ! count_real_kinds() continue ! count_real_kinds() ! ********************************************************************** ! The search assumes the following: ! There must be at least one kind of integer. ! One kind of integer will support at least one digit. ! All integer kinds can be found by searching through increasing numbers of digits supported. ! A negative kind value will be returned only when all kinds have been found. ! ********************************************************************** ! initialize search for integer kinds count_kinds = 1 ! number of valid results so far this_precision = 1 ! arg of selected_int_kind() previous_kind = selected_real_kind( p= this_precision) ! must support one integer kind ! ---------------------------------------------------------------------- ! do until kind value is negative find_all_kinds: do ! loop over digits this_kind = selected_real_kind( p= this_precision) ! kind with one more digit ! branch: all kinds found --> quit, or found new kind --> count new_or_same_kind: if( this_kind < 0 )then ! not a kind value so all kinds found exit find_all_kinds ! quit seeking elseif( this_kind /= previous_kind )then new_or_same_kind ! found new kind count_kinds = count_kinds + 1 ! new kind previous_kind = this_kind ! update previous kind endif new_or_same_kind ! case of kind value this_precision = this_precision + 1 ! try one more digit enddo find_all_kinds ! loop over digits ! ---------------------------------------------------------------------- ! report and record number of real kinds write( unit= log_unit, fmt= *) 'number of real kinds found: ', count_kinds number_of_reals = count_kinds ! count of kinds ! ********************************************************************** ! return with integer kind values known return ! count_real_kinds() ! ********************************************************************** ! count_real_kinds() end subroutine count_real_kinds ! ********************************************************************** ! seek_real_kinds() seeks real kinds subroutine seek_real_kinds ! ********************************************************************** ! seek_real_kinds() constants ! ---------------------------------------------------------------------- character( len= *), parameter :: kind_prefix = 'r' ! prefix of nonstandard kind names character( len= *), parameter :: range_complaint = & ! warn of the unexpected 'NOTE: range does not increase with increasing precision' ! ********************************************************************** ! seek_real_kinds() local integer :: precision_count ! count by precision integer :: kinds_count ! count kinds found integer :: this_kind ! loop through kinds integer :: selected_kind ! returned by selected_real_kind() integer :: previous_kind ! previous kind found integer :: match_count ! try to assign each kind found character( len= kind_len) :: name_buf ! construct names of kinds ! ********************************************************************** ! seek_real_kinds() continue ! seek_real_kinds() ! ********************************************************************** ! initialize search for real kinds by precision kinds_count = 1 ! start with the first kind to be found precision_count = 1 ! which must have a precision of at least 1 selected_kind = selected_real_kind( p= precision_count) ! must support two real kinds real_kinds( kinds_count)% kind_value = selected_kind ! first kind value found real_kinds( kinds_count)% max_precision = precision_count ! precision used to select this kind previous_kind = selected_kind ! kind already found ! ---------------------------------------------------------------------- ! do until kind value is negative find_all_kinds: do ! loop over precision selected_kind = selected_real_kind( p= precision_count) ! next kind ! this precision is too great so seek range of previous kind new_old_all_prec: if( selected_kind < 0 )then ! to much precision ! complete the previous real kind call seek_range_this_precision( real_kinds( kinds_count)) ! seek range ! beyond the last kind available exit find_all_kinds ! found all kinds by precision ! found a different kind value greater than zero elseif( selected_kind /= previous_kind )then new_old_all_prec ! found new kind ! complete the previous real kind call seek_range_this_precision( real_kinds( kinds_count)) ! seek range real_kinds( kinds_count)% supported = .false. ! not yet assigned a name ! start new real kind kinds_count = kinds_count + 1 ! try to find a new kind real_kinds( kinds_count)% max_precision = precision_count ! at least this precision real_kinds( kinds_count)% kind_value = selected_kind ! start new kind previous_kind = selected_kind ! update ! still finding the same kind value else new_old_all_prec ! same as old kind real_kinds( kinds_count)% max_precision = precision_count ! at least this precision endif new_old_all_prec ! case of kind value precision_count = precision_count + 1 ! next precision enddo find_all_kinds ! loop over precision ! ---------------------------------------------------------------------- ! report real kinds report_kinds: do this_kind = 1, ubound( array= real_kinds, dim= 1) call find_real_bit_size( real_kinds( this_kind)) report_supported: if( real_kinds( this_kind)% kind_value > 0 )then write( unit= log_unit, fmt= *) 'found real kind: ', real_kinds( this_kind)% kind_value, & ' supporting precision: ', real_kinds( this_kind)% max_precision, & ' supporting range: ', real_kinds( this_kind)% max_range, & ' estimated bit size: ', real_kinds( this_kind)% real_bit_size endif report_supported enddo report_kinds ! ********************************************************************** ! check for range anomalies range_check: do this_kind = 2, ubound( array= real_kinds, dim= 1) ! check all pairs of kinds anomalie: if( real_kinds( this_kind - 1)% max_range >= real_kinds( this_kind)% max_range )then write( unit= log_unit, fmt= *) range_complaint write( unit= log_unit, fmt= *) & 'kind values: ', real_kinds( this_kind - 1)% kind_value, real_kinds( this_kind)% kind_value write( unit= log_unit, fmt= *) & 'ranges: ', real_kinds( this_kind - 1)% max_range, real_kinds( this_kind)% max_range endif anomalie enddo range_check ! check all pairs of kinds ! ********************************************************************** ! try to set real kinds parameters set_kinds: if( storage_size_is_2n )then ! word size is 2^n (probably 32 or 64) ! ---------------------------------------------------------------------- ! try to match kinds found exactly with single, double, quad assign_kinds_exactly: do match_count = 1, ubound( array= real_kinds, dim= 1) call find_real_bit_size( real_kinds( match_count)) kinds_2n: select case( real_kinds( match_count)% real_bit_size ) case( 32) kinds_2n ! single precision single_idx = match_count sp = real_kinds( match_count)% max_precision ! set single precision value sr = real_kinds( match_count)% max_range ! set single range value real_kinds( match_count)% kind_name = 'single' real_kinds( match_count)% supported = .true. ! this kind assigned case( 64) kinds_2n ! double precision double_idx = match_count dp = real_kinds( match_count)% max_precision ! set double precision value dr = real_kinds( match_count)% max_range ! set double range value real_kinds( match_count)% kind_name = 'double' real_kinds( match_count)% supported = .true. ! this kind assigned case( 128) kinds_2n ! quad range quad_idx = match_count qp = real_kinds( match_count)% max_precision ! set quad precision qr = real_kinds( match_count)% max_range ! set quad range real_kinds( match_count)% kind_name = 'quad' real_kinds( match_count)% supported = .true. ! this kind assigned case default kinds_2n write( unit= name_buf, fmt= *) real_kinds( match_count)% max_precision real_kinds( match_count)% kind_name = kind_prefix // adjustl( name_buf) real_kinds( match_count)% supported = .true. ! this kind assigned end select kinds_2n ! select range enddo assign_kinds_exactly ! search thru kinds found ! ---------------------------------------------------------------------- ! not a power of 2 word size else set_kinds ! want to auto detect ! ---------------------------------------------------------------------- ! try to match kinds found with single, double, quad assign_kinds: do match_count = 1, ubound( array= real_kinds, dim= 1) kinds_odd: select case( real_kinds( match_count)% max_precision ) case( 28: 36) kinds_odd ! single precision one_single: if( single_idx == 0 )then ! only one single single_idx = match_count sp = real_kinds( match_count)% max_precision ! set single precision value sr = real_kinds( match_count)% max_range ! set single range value real_kinds( match_count)% kind_name = 'single' real_kinds( match_count)% supported = .true. ! this kind assigned endif one_single ! only one single case( 58: 72) kinds_odd ! double precision one_double: if( double_idx == 0 )then ! only one double double_idx = match_count dp = real_kinds( match_count)% max_precision ! set double precision value dr = real_kinds( match_count)% max_range ! set double range value real_kinds( match_count)% kind_name = 'double' real_kinds( match_count)% supported = .true. ! this kind assigned endif one_double ! only one double case( 120: 144) kinds_odd ! quad precision one_quad: if( quad_idx == 0 )then ! only one quad quad_idx = match_count qp = real_kinds( match_count)% max_precision ! set quad precision value qr = real_kinds( match_count)% max_range ! set quad range value real_kinds( match_count)% kind_name = 'quad' real_kinds( match_count)% supported = .true. ! this kind assigned endif one_quad ! only one quad case default kinds_odd write( unit= name_buf, fmt= *) real_kinds( match_count)% max_precision real_kinds( match_count)% kind_name = kind_prefix // adjustl( name_buf) real_kinds( match_count)% supported = .true. ! this kind assigned to long end select kinds_odd ! select range enddo assign_kinds ! search thru kinds found endif set_kinds ! ---------------------------------------------------------------------- ! ensure that single, double, quad have entries ensure_single: if( single_idx == 0 )then ! if single has not been assigned find_single: do match_count = 1, kinds_count ! scan small to large single_slot: if( .not. real_kinds( match_count)% supported )then real_kinds( match_count)% kind_name = 'single' ! first is single single_idx = match_count ! set index exit find_single ! done endif single_slot ! if unnamed enddo find_single ! scan small to large endif ensure_single ! if single has not been assigned ensure_double: if( double_idx == 0 )then ! if double has not been assigned find_double: do match_count = 1, kinds_count ! scan small to large double_slot: if( .not. real_kinds( match_count)% supported )then real_kinds( match_count)% kind_name = 'double' ! next is double double_idx = match_count ! set index exit find_double ! done endif double_slot ! if unnamed enddo find_double ! scan small to large endif ensure_double ! if double has not been assigned ensure_quad: if( quad_idx == 0 )then ! if quad has not been assigned find_quad: do match_count = 1, kinds_count ! scan small to large quad_slot: if( .not. real_kinds( match_count)% supported )then real_kinds( match_count)% kind_name = 'quad' ! next is quad quad_idx = match_count ! set index exit find_quad ! done endif quad_slot ! if unnamed enddo find_quad ! scan small to large endif ensure_quad ! if quad has not been assigned ! ********************************************************************** ! return with real kinds values known return ! seek_real_kinds() ! ********************************************************************** ! seek_real_kinds() end subroutine seek_real_kinds ! ********************************************************************** ! seek_range_this_precision() computes the range of real kinds subroutine seek_range_this_precision( this_real) ! ********************************************************************** ! This subroutine finds the range of a real kind whose precision is known. ! ********************************************************************** ! seek_range_this_precision() local type( real_kind_t), intent( inout) :: this_real ! count the number of integer kinds ! ********************************************************************** ! seek_range_this_precision() local integer :: range_count ! loop through range integer :: selected_kind ! ********************************************************************** ! seek_range_this_precision() continue ! seek_range_this_precision() ! ********************************************************************** ! The search assumes the following: ! The real has been found. ! The precision has been found and stored in this_real. ! The range can be found by holding the precision constant. ! The range can be found by incrementing the range. ! ********************************************************************** ! initialize search for integer kinds range_count = 1 ! initialize range count find_last_max_range: do ! loop over range selected_kind = selected_real_kind( p= this_real% max_precision, r= range_count) ! this range gives the same kind value as the previous range until new kind value or no more kinds last_range: if( selected_kind /= this_real% kind_value )then exit find_last_max_range ! quit else last_range ! case of kind value this_real% max_range = range_count ! update range endif last_range ! case of kind value range_count = range_count + 1 ! next range enddo find_last_max_range ! loop over range ! ********************************************************************** ! return with integer kind values known return ! seek_range_this_precision() ! ********************************************************************** ! seek_range_this_precision() end subroutine seek_range_this_precision ! ********************************************************************** ! find_real_bit_size() counts integer kinds subroutine find_real_bit_size( this_real) ! ********************************************************************** ! This subroutine finds the range of a real kind whose precision is known. ! ********************************************************************** ! find_real_bit_size() interface type( real_kind_t), intent( inout) :: this_real ! find the range of this precision ! ********************************************************************** ! find_real_bit_size() constants integer, parameter :: sign_bit = 1 ! bits in the sign bit ! ********************************************************************** ! find_real_bit_size() local integer :: this_bits ! loop through powers of two integer :: k ! as per the standard model of reals real :: recip_log10_radix ! ********************************************************************** ! find_real_bit_size() continue ! find_real_bit_size() ! ********************************************************************** ! The calculation assumes the following: ! There is one bit used as the sign bit. ! The range is (nearly) a power of two. ! There is some number of bits in the precision. ! There are no unused bits. ! ********************************************************************** ! initialize search for real bit size k_0_1: if( log10( real( radix( 0.0)) ) == anint( log10( real( radix( 0.0)) )) )then k = 1 else k_0_1 k = 0 endif k_0_1 recip_log10_radix = 1.0 / log10( real( radix( 0.0)) ) ! convert decimal to radix this_bits = 1 ! initialize find_exponent_bits: do ! loop over range ! find power of two nearly equal to the exponent range exp_range: if( ceiling( ( this_real% max_range * recip_log10_radix) / 2.0**this_bits) > 1 )then this_bits = this_bits + 1 ! one more bit cycle find_exponent_bits ! try again else exp_range exit find_exponent_bits ! quit endif exp_range ! case of kind value enddo find_exponent_bits ! loop over range this_real% real_bit_size = sign_bit + this_bits + nint( ( this_real% max_precision + 1) * recip_log10_radix - k) ! if a power of two sized processor, round to nearest power of two if_2n_hw: if( storage_size_is_2n )then ! hw is 2n round_2n: select case( this_real% real_bit_size) ! select power of two case( 14: 17) round_2n this_real% real_bit_size = 16 ! round to nearest case( 29: 33) round_2n this_real% real_bit_size = 32 ! round to nearest case( 59: 66) round_2n this_real% real_bit_size = 64 ! round to nearest case( 116: 132) round_2n this_real% real_bit_size = 128 ! round to nearest case( 244: 264) round_2n this_real% real_bit_size = 256 ! round to nearest case default round_2n ! remark difficulty write( unit= log_unit, fmt= fmtpri) 'WARNING: estimated real size not nearly a power of 2' end select round_2n ! select power of two endif if_2n_hw ! hw is 2n ! ********************************************************************** ! return with integer kind values known return ! find_real_bit_size() ! ********************************************************************** ! find_real_bit_size() end subroutine find_real_bit_size ! ********************************************************************** ! check_character_kinds() perform sanity checks on logical kinds subroutine check_character_kinds ! ********************************************************************** ! check_character_kinds() local integer :: count_chars ! count number of kinds ! ********************************************************************** ! check_character_kinds() text continue ! check_character_kinds() ! check that there are no duplicate kind values check_ascii: if( ascii_character% supported )then warn_ascii_dup: if( ascii_character% kind_value == ebcdic_character% kind_value )then write( unit= log_unit, fmt= fmtpr) 'WARNING: ascii and ebcdic have same kind value!' stop error_stop_code ! must be wrong elseif( ascii_character% kind_value == iso_10646_character% kind_value )then warn_ascii_dup write( unit= log_unit, fmt= fmtpr) 'WARNING: ascii and iso_10646 have same kind value!' stop error_stop_code ! must be wrong endif warn_ascii_dup endif check_ascii check_ebcdic: if( ebcdic_character% supported )then warn_ebcdic_dup: if( ebcdic_character% kind_value > iso_10646_character% kind_value )then write( unit= log_unit, fmt= fmtpr) 'WARNING: ebcdic and iso_10646 have same kind value!' stop error_stop_code ! must be wrong endif warn_ebcdic_dup endif check_ebcdic ! check for duplicate values ! complain if there isn't exactly one default character kind detected count_chars = count( (/ ascii_character% default_kind, ebcdic_character% default_kind, & iso_10646_character% default_kind /)) count_def_chars: if( count_chars < 1 )then write( unit= log_unit, fmt= fmtpr) 'WARNING: default character kind not detected' elseif( count_chars > 1)then count_def_chars ! count default character kinds write( unit= log_unit, fmt= fmtpr) 'WARNING: default character kind not unique' endif count_def_chars ! count default character kinds return ! check_character_kinds() ! ********************************************************************** ! check_character_kinds() end subroutine check_character_kinds ! ********************************************************************** ! check_logical_kinds() perform sanity checks on logical kinds subroutine check_logical_kinds ! ********************************************************************** ! check_logical_kinds() local integer :: count_logicals ! ********************************************************************** ! check_logical_kinds() text continue ! check_logical_kinds() ! check for duplicate integer kind definitions check_byte: if( byte_logical% supported )then ! logical byte duplicate value ! check byte == short, int, long warn_byte_dup: if( byte_logical% kind_value == short_logical% kind_value )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: byte logical and short logical have same kind value!' stop error_stop_code ! must be wrong elseif( byte_logical% kind_value == int_logical% kind_value )then warn_byte_dup write( unit= log_unit, fmt= fmtpr) & 'WARNING: byte logical and int logical have same kind value!' stop error_stop_code ! must be wrong elseif( byte_logical% kind_value == long_logical% kind_value )then warn_byte_dup write( unit= log_unit, fmt= fmtpr) & 'WARNING: byte logical and long logical have same kind value!' stop error_stop_code ! must be wrong endif warn_byte_dup ! byte duplicates long endif check_byte ! logical byte duplicate value ! if logical short defined with a duplicate defined, complain and quit check_short: if( short_logical% supported )then ! logical short duplicate value warn_short_dup: if( short_logical% kind_value == int_logical% kind_value )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: short logical and int logical have same kind value!' stop error_stop_code ! must be wrong elseif( short_logical% kind_value == long_logical% kind_value )then warn_short_dup write( unit= log_unit, fmt= fmtpr) & 'WARNING: short logical and long logical have same kind value!' stop error_stop_code ! must be wrong endif warn_short_dup ! short duplicates long endif check_short ! logical short duplicate value ! if logical int defined with a duplicate defined, complain and quit check_int: if( int_logical% supported )then ! logical int duplicate value warn_int_dup: if( int_logical% kind_value == long_logical% kind_value )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: int logical and long logical have same kind value!' stop error_stop_code ! must be wrong endif warn_int_dup ! int duplicates long endif check_int ! logical int duplicate value ! ---------------------------------------------------------------------- ! warn if logical kind is defined and the corresponding integer isn't user_byte_logical: if( byte_logical% supported )then ! user defined byte logical no_byte_integer: if( .not. integer_kinds( byte_idx)% supported )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: logical byte defined but integer byte not detected!' endif no_byte_integer ! but byte integer wasn't detected endif user_byte_logical ! user defined byte logical user_short_logical: if( short_logical% supported )then ! user defined short logical no_short_integer: if( .not. integer_kinds( short_idx)% supported )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: logical short defined but integer short not detected!' endif no_short_integer ! but short integer wasn't detected endif user_short_logical ! user defined short logical user_int_logical: if( int_logical% supported )then ! user defined int logical no_int_integer: if( .not. integer_kinds( int_idx)% supported )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: logical int defined but integer int not detected!' endif no_int_integer ! but int integer wasn't detected endif user_int_logical ! user defined int logical user_long_logical: if( long_logical% supported )then ! user defined long logical no_long_integer: if( .not. integer_kinds( long_idx)% supported )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: logical long defined but integer long not detected!' endif no_long_integer ! but long integer wasn't detected endif user_long_logical ! user defined long logical ! ********************************************************************** ! try to guess correspondence between logical and integer kinds def_int_logical: if( kind( 0) == kind( .true.) )then ! default integer <-> default real write( unit= log_unit, fmt= fmtpr) 'default integer kind same value as default logical kind' else def_int_logical ! default integer <-> default real write( unit= log_unit, fmt= fmtpr) 'WARNING: integer kind <-> logical kind correspondence not detected!' endif def_int_logical ! default integer <-> default real ! complain if there isn't exactly one default logical kind detected count_logicals = count( (/ byte_logical% default_kind, short_logical% default_kind, & int_logical% default_kind, long_logical% default_kind /)) count_def_log: if( count_logicals < 1 )then write( unit= log_unit, fmt= fmtpr) 'WARNING: default logical kind not detected' elseif( count_logicals > 1 )then count_def_log ! count default logical kinds write( unit= log_unit, fmt= fmtpr) 'WARNING: default logical kind not unique' endif count_def_log ! count default logical kinds return ! check_logical_kinds() ! ********************************************************************** ! check_logical_kinds() end subroutine check_logical_kinds ! ********************************************************************** ! check_hardware_values() perform sanity checks on hardware values subroutine check_hardware_values ! ********************************************************************** ! check_hardware_values() text continue ! check_hardware_values() ! check basic hardware parameters call basic_hardware_parameters ! check sizes, endian ! if claims IEEE 754 ieee_32_64: if( ieeefp )then ! claims IEEE fp ! if ieeefp then nsu = 32 bits or 64 bits word_32_64: select case( measured_word_size ) ! IEEE sanity ! 32 bit words case( 32) word_32_64 ! IEEE single ! perform a few checks to see if real has the values expected of IEEE 32 bit call check_ieee_single( ieeefp) ! sanity check IEEE claim appears_ok_32: if( ieeefp )then ! ok write( unit= log_unit, fmt= fmtpr) & 'real appears to be an IEEE 754 real single format' else appears_ok_32 ! not ok write( unit= log_unit, fmt= fmtpr) & 'WARNING: default real does not appear to be valid IEEE 754 single format' endif appears_ok_32 ! check 32 ! 64 bit words case( 64) word_32_64 ! IEEE double ! perform a few checks to see if real has the values expected of IEEE 64 bit call check_ieee_double( ieeefp) ! sanity check IEEE claim appears_ok_64: if( ieeefp )then ! ok write( unit= log_unit, fmt= fmtpr) & 'real appears to be an IEEE 754 real format double format' else appears_ok_64 ! not ok write( unit= log_unit, fmt= fmtpr) & 'WARNING: default real does not appear to be valid IEEE 754 double format' endif appears_ok_64 ! check 64 ! check for IEEE 754 Extended types case default word_32_64 ! extended or problem word_extended: select case( measured_word_size) ! IEEE extended sanity case( 43: 78) word_extended ! IEEE extended sanity call check_ieee_single_extended( ieeefp) pass_single_extended: if( ieeefp )then write( unit= log_unit, fmt= fmtpr) 'real appears to be IEEE 754 Extended single format' endif pass_single_extended case( 79: ) word_extended ! IEEE extended sanity call check_ieee_double_extended( ieeefp) pass_double_extended: if( ieeefp )then write( unit= log_unit, fmt= fmtpr) 'real appears to be IEEE 754 Extended double format' endif pass_double_extended case default word_extended ! IEEE extended sanity ieeefp = .false. ! wrong word size end select word_extended ! IEEE extended sanity appears_ok_extended: if( .not. ieeefp )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: claims IEEE format but appears not to be' endif appears_ok_extended end select word_32_64 ! IEEE sanity endif ieee_32_64 ! claims IEEE fp ! sanity checked return ! check_hardware_values() ! ********************************************************************** ! check_hardware_values() end subroutine check_hardware_values ! ********************************************************************** ! basic_hardware_parameters() perform sanity checks on hardware values subroutine basic_hardware_parameters ! ********************************************************************** ! basic_hardware_parameters() constants integer, parameter :: smallest_kind = selected_int_kind( 1) ! ********************************************************************** ! basic_hardware_parameters() local character( len= 1), allocatable, dimension( :) :: char_target ! allocate as needed integer, dimension( 1) :: size_target ! transfer target logical :: word_size_is_2n ! true if word size is 2^n logical :: char_size_is_2n ! true if character size is 2^n logical :: byte_size_is_2n ! true if byte size is 2^n ! ********************************************************************** ! basic_hardware_parameters() text continue ! basic_hardware_parameters() ! check word size is a power of 2 measured_word_size = bit_size( 0) ! assume model size is storage size word_size_is_2n = is_power_of_2( measured_word_size) ! word size is 2^n word_2n: if( .not. word_size_is_2n )then ! remark write( unit= log_unit, fmt= fmtpr) & "NOTE: word size is not a power of two" ! not 2^n endif word_2n ! remark ! ---------------------------------------------------------------------- ! allocate character array to check whether it's a power of 2 and to check endian allocate( char_target( measured_word_size)) ! target of transfer ! compute character size measured_char_size = size( transfer( char_target, size_target)) ! count ! check processor endian via char_target while it's allocated char_target = transfer( (/ 1 /), char_target, measured_word_size) ! words to bytes measured_big_endian = ichar( char_target( 1)) == 0 ! which byte deallocate( char_target) ! target of transfer ! check whether character size is a power of 2 char_size_is_2n = is_power_of_2( measured_char_size) ! compute if is power of 2 char_2n: if( .not. char_size_is_2n )then ! complain if not power of 2 write( unit= log_unit, fmt= fmtpr) & "NOTE: character size is not a power of two" endif char_2n ! complain if not power of 2 ! ---------------------------------------------------------------------- ! does the processor have byte integers? might_have_bytes: if( smallest_kind /= kind( 0) )then ! if smallest integer isn't default ! find out how big the smallest integer is measured_byte_size = bit_size( 0_smallest_kind) ! size of smallest integer byte_size_is_2n = is_power_of_2( measured_byte_size) ! compute if size is 2^n byte_2n: if( .not. byte_size_is_2n )then ! if not, complain write( unit= log_unit, fmt= fmtpr) & "NOTE: smallest integer size is not a power of two" endif byte_2n ! if not, complain ! see if size of char is size of smallest integer char_eq_byte: if( measured_byte_size == measured_char_size )then write( unit= log_unit, fmt= fmtpr) & ! note conclusion in log "smallest integer size is same as character storage unit size" endif char_eq_byte ! char size is smallest integer size endif might_have_bytes ! if smallest integer isn't default ! ********************************************************************** ! check that measured byte size is a multiple of measured word size measured_words_to_bytes: if( mod( measured_word_size, measured_byte_size) /= 0 )then write( unit= log_unit, fmt= fmtpr) & 'WARNING: measured numerical storage unit size is not a multiple of measured character storage unit size' endif measured_words_to_bytes ! ********************************************************************** ! check claim of two's compliment twos_comp_int: if( twoscomp )then ! claim 2s compliment format call check_2s_comp( twoscomp) ! sanity check 2s compliment format appears_ok_int: if( twoscomp )then ! claim upheld write( unit= log_unit, fmt= fmtpr) & "integer appears to be two's compliment integer format" else appears_ok_int ! claim not upheld write( unit= log_unit, fmt= fmtpr) & "WARNING: claims two's compliment integer format but appears not to be" endif appears_ok_int ! check claim endif twos_comp_int ! claim 2s compliment format ! ********************************************************************** ! if byte addressable then not word addressable byte_and_word: if( bytesize > 0 .and. wordsize > 0 )then ! input bytesize and wordsize byte_eq_word: if( bytesize == wordsize )then ! bytesize equals wordsize write( unit= log_unit, fmt= fmtpri) & 'WARNING: claimed byte size equals claimed word size', bytesize endif byte_eq_word ! bytesize equals wordsize endif byte_and_word ! have bytesize and wordsize ! if bytesize > 0 then (nsu .mod. bytesize) = 0 byte_addressable: if( bytesize > 0 )then ! check even number of bytes per word word_eq_some_bytes: if( mod( measured_word_size, bytesize) == 0 )then write( unit= log_unit, fmt= fmtpri) 'bits per byte', bytesize write( unit= log_unit, fmt= fmtpri) 'bytes per word', bit_size( 0) / bytesize else word_eq_some_bytes write( unit= log_unit, fmt= fmtpr) & 'WARNING: measured numerical storage unit size is not a multiple of input character storage unit sise' endif word_eq_some_bytes endif byte_addressable ! check even number of bytes per word ! or if wordsize > 0 then wordsize = bit_size( 0) word_addressable: if( wordsize > 0 )then ! check wordsize is default integer size word_eq_nsu: if( measured_word_size == wordsize )then write( unit= log_unit, fmt= fmtpri) & 'bits per numeric storage unit (word size)', wordsize else word_eq_nsu write( unit= log_unit, fmt= fmtpr) & 'WARNING: claims word addressable yet input wordsize is not one numeric storage unit' endif word_eq_nsu endif word_addressable ! check wordsize is default integer size ! if bytesize is not set, set it set_byte_size: if( bytesize == 0 )then ! bytesize not set in input file bytesize = measured_byte_size ! set bytesize endif set_byte_size ! bytesize not set in input file ! finally, set wordsize to measured value set_word_size: if( wordsize == 0 )then ! if not specified wordsize = measured_word_size ! set as determined ua_str = ba_str ! label address unit is bytes write( unit= log_unit, fmt= fmtpr) 'byte addressable' ! address mode in logfile else set_word_size ! if not specified ua_str = wa_str ! label address unit as words write( unit= log_unit, fmt= fmtpr) 'word addressable' ! address mode in logfile endif set_word_size ! if not specified ! ********************************************************************** ! set and report storage size summary storage_size_is_2n = word_size_is_2n .and. char_size_is_2n .and. byte_size_is_2n storage_2n: if( .not. storage_size_is_2n )then ! remark write( unit= log_unit, fmt= fmtpr) & "NOTE: storage size is not a power of two" ! not 2^n else storage_2n ! remark write( unit= log_unit, fmt= fmtpr) & "size of storage units is a power of two" endif storage_2n ! remark ! ********************************************************************** ! basic hardware checked return ! basic_hardware_parameters() ! ********************************************************************** ! basic_hardware_parameters() end subroutine basic_hardware_parameters ! ********************************************************************** ! is_power_of_2() verify that the positive integer argument is a power of 2 logical function is_power_of_2( i) integer, intent( in) :: i ! subject of test ! ********************************************************************** ! is_power_of_2() text continue ! is_power_of_2() is_power_of_2 = iand( not( i), i - 1) == ( i - 1) return ! is_power_of_2() ! ********************************************************************** ! is_power_of_2() end function is_power_of_2 ! ********************************************************************** ! check_ieee_single() try to verify default real is ieee 32 bit format subroutine check_ieee_single( flag) logical, intent( out) :: flag ! ok or not ! ********************************************************************** ! check_ieee_single() text continue ! check_ieee_single() ! this procedure is only called if the word size is 32 bits flag = radix( 0.0) == 2 & ! 754 is base 2 .and. ( maxexponent( 0.0) - minexponent( 0.0)) == 253 & ! binary exponent less 2 extrema .and. digits( 0.0) == 24 ! bits of significand return ! check_ieee_single() ! ********************************************************************** ! check_ieee_single() end subroutine check_ieee_single ! ********************************************************************** ! check_ieee_double() try to verify default real is ieee 64 bit format subroutine check_ieee_double( flag) logical, intent( out) :: flag ! ok or not ! ********************************************************************** ! check_ieee_double() text continue ! check_ieee_double() ! this procedure is only called if the word size is 64 bits flag = radix( 0.0) == 2 & ! 754 is base 2 .and. ( maxexponent( 0.0) - minexponent( 0.0)) == 2045 & ! binary exponent less 2 extrema .and. digits( 0.0) == 53 ! bits of significand return ! check_ieee_double() ! ********************************************************************** ! check_ieee_double() end subroutine check_ieee_double ! ********************************************************************** ! check_ieee_single_extended() try to verify default real is ieee 64 bit format subroutine check_ieee_single_extended( flag) logical, intent( out) :: flag ! ok or not ! ********************************************************************** ! check_ieee_single_extended() text continue ! check_ieee_single_extended() ! this procedure is only called if the word size is 43 to 78 bits flag = radix( 0.0) == 2 & ! 754 is base 2 .and. ( maxexponent( 0.0) - minexponent( 0.0)) >= 2045 & ! binary exponent less 2 extrema .and. digits( 0.0) >= 32 ! bits of significand return ! check_ieee_single_extended() ! ********************************************************************** ! check_ieee_single_extended() end subroutine check_ieee_single_extended ! ********************************************************************** ! check_ieee_double_extended() try to verify default real is ieee 64 bit format subroutine check_ieee_double_extended( flag) logical, intent( out) :: flag ! ok or not ! ********************************************************************** ! check_ieee_double_extended() text continue ! check_ieee_double_extended() ! this procedure is only called if the word size is >78 bits flag = radix( 0.0) == 2 & ! 754 is base 2 .and. ( maxexponent( 0.0) - minexponent( 0.0)) >= 32765 & ! binary exponent less 2 extrema .and. digits( 0.0) >= 64 ! bits of significand return ! check_ieee_double_extended() ! ********************************************************************** ! check_ieee_double_extended() end subroutine check_ieee_double_extended ! ********************************************************************** ! check_2s_comp() try to verify default real is ieee 64 bit format subroutine check_2s_comp( flag) logical, intent( out) :: flag ! ok or not ! ********************************************************************** ! check_2s_comp() text continue ! check_2s_comp() ! this procedure attempts to detect 2s compliment integers flag = radix( 0) == 2 & ! binary integers .and. not( 0) == -1 ! 2s compliment return ! check_2s_comp() ! ********************************************************************** ! check_2s_comp() end subroutine check_2s_comp ! ********************************************************************** ! diagnose_input_output() perform experiments on the input output system subroutine diagnose_input_output ! ********************************************************************** ! diagnose_input_output local character( len= *), parameter :: fmt_eof = '(/)' ! new record character( len= *), parameter :: fmt_eor = '(a1)' ! read one character integer, parameter :: da_recl = 1 ! record length in default characters ! variables for optional plus and leading zero experiments integer :: op_fmt_val ! value to write real :: lz_fmt_val ! value to write character( len= 40) :: io_diag_buf ! buffer to be written ! index of unit number in default filename integer :: fn_idx ! index result of searching filename ! if guess of name of a file inquire returned a name logical :: got_fn ! from inquire() ! test list-directed format d1, d2 real :: x ! value to write fmt= * ! test missing records character( len= 1) :: ch_var ! variable to read from missing record ! ********************************************************************** ! diagnose_input_output() text continue ! diagnose_input_output() ! ---------------------------------------------------------------------- ! try to get a file name for a connection without one open( unit= fn_unit, iostat= istat) ! file with no name fn_guess: if( istat /= 0 )then ! io filename diagnosis failed write( unit= log_unit, fmt= fmtpr) 'WARNING: trouble opening file to diagnose io parameters' mrecl = 0 ! unable to diagnose def_fn = '' ! null filename eor_flag = 0 eof_flag = 0 has_ld_sep = .false. else fn_guess ! io filename diagnosis working so far ! get maximum record length inquire( unit= fn_unit, recl= mrecl) ! sequential formatted record ! get default filename inquire( unit= fn_unit, named= got_fn, name= def_fn) ! processor's filename fn_obtained: if( got_fn )then ! inquire returned filename ! where is unit number in filename? fn_idx = index( def_fn, ch_fn_unit, back= .true.) ! try to find unit number (from the right) found_unit: if( fn_idx > 0 )then ! unit encoded within name ! seek leading zeros of unit number in filename def_fn( fn_idx: fn_idx) = '#' ! where the unit number is do while( def_fn( fn_idx - 1: fn_idx - 1) == '0' ) ! zero in filename def_fn( fn_idx - 1: fn_idx - 1) = '#' ! set leading 0's to #'s fn_idx = fn_idx - 1 ! check next character enddo ! zero in filename endif found_unit ! unit encoded within name ! is a path present? fn_idx = scan( def_fn, '/\:', back= .true.) ! cover unix, win-dos, mac anyway got_path: if( fn_idx > 0 )then ! found a path def_fn = 'PATH' // def_fn( fn_idx: ) ! remove path directory names endif got_path ! found a path ! file name not returned else fn_obtained ! inquire returned filename def_fn = "" ! no filename endif fn_obtained ! inquire returned filename ! ---------------------------------------------------------------------- ! diagnose eor and eof write( unit= fn_unit, fmt= fmtpr) '1' ! write a record write( unit= fn_unit, fmt= fmtpr) '2' ! write another record rewind( unit= fn_unit) ! back to the beginning of file ! find eor eor_flag = 0 ! initialize iostat flag search_eor: do while( eor_flag == 0) ! loop til end of record encountered read( unit= fn_unit, fmt= fmt_eor, advance= 'NO', iostat= eor_flag) io_diag_buf( 1: 1) enddo search_eor ! loop til end of record encountered ! find eof eof_flag = 0 ! initialize iostat flag search_eof: do while( eof_flag == 0) ! loop til end of file encountered read( unit= fn_unit, fmt= fmt_eof, iostat= eof_flag) enddo search_eof ! loop til end of file encountered ! ---------------------------------------------------------------------- ! check for separator (comma or dot with f03) when using list directed format rewind( unit= fn_unit) ! back to the beginning of file write( unit= fn_unit, fmt= *) eor_flag, eof_flag ! write record with two integers rewind( unit= fn_unit) ! back to the beginning of file read( unit= fn_unit, fmt= '(a)') io_diag_buf ! read record as string has_ld_sep = index( io_diag_buf, ',') > 0 ! seek comma ! ---------------------------------------------------------------------- ! clean up close( unit= fn_unit, status= 'DELETE', iostat= istat) ! finished with test file close_error: if( istat /= 0 )then ! error closing trial unit write( unit= log_unit, fmt= fmtpr) 'WARNING: trouble closing file opened to diagnose io parameters' endif close_error ! error closing trial unit endif fn_guess ! io filename diagnosis ! ---------------------------------------------------------------------- ! try to get iostat= values for unwritten records open( unit= da_unit, status= 'SCRATCH', & access= 'DIRECT', recl= da_recl, iostat= istat) ! scratch direct access file ! open failed so report trouble da_get_iostat: if( istat /= 0 )then ! open direct access failed write( unit= log_unit, fmt= fmtpr) 'WARNING: trouble opening file to diagnose direct access parameters' da_missing = 0 ! unable to diagnose da_eof = 0 ! open succeeded so test missing records iostat else da_get_iostat ! direct access diagnosis working so far write( unit= da_unit, rec= 1) '1' write( unit= da_unit, rec= 3) '3' read( unit= da_unit, rec= 2, iostat= da_missing) ch_var read( unit= da_unit, rec= 4, iostat= da_eof) ch_var ! complain in log file when iostat values are not the same not_same: if( da_missing /= da_eof )then write( unit= log_unit, fmt= fmtpr) 'WARNING: missing direct access record is not the same beyond last record' write( unit= log_unit, fmt= fmtpri) 'read unwritten record iostat', da_missing write( unit= log_unit, fmt= fmtpri) 'read beyond last record iostat', da_eof ! reading an undefined record must be considered an error ! zero is the status-ok iostat value, so change it must_be_error: if( da_missing == 0 .and. da_eof > 0 )then da_missing = da_eof endif must_be_error endif not_same ! clean up close( unit= da_unit, status= 'DELETE', iostat= istat) ! finished with test file close_da_error: if( istat /= 0 )then ! error closing trial unit write( unit= log_unit, fmt= fmtpr) 'WARNING: trouble closing file opened to diagnose direct access parameters' endif close_da_error ! error closing trial unit endif da_get_iostat ! direct access diagnosis working so far ! ---------------------------------------------------------------------- ! diagnose optional plus sign on integer and real formats io_diag_buf = ' ' ! blank out buffer for test op_fmt_val = 12 ! test value ! write value to buffer with processor default for optional leading plus sign write( unit= io_diag_buf, fmt= '( s, i3)' ) op_fmt_val io_diag_buf = adjustl( io_diag_buf) ! remove leading blanks ! first character should be '+' or '1' or test failed op_i: if( io_diag_buf( 1: 1) == '+' )then ! got '+' plus_flag = .true. ! set flag elseif( io_diag_buf( 1: 1) == '1' )then op_i ! got '1' plus_flag = .false. ! set flag else op_i ! got ??? write( unit= log_unit, fmt= fmtpr) 'WARNING: test optional plus sign failed' stop error_stop_code ! must be wrong endif op_i ! diagnose leading zeros on f and e formats io_diag_buf = ' ' ! blank out buffer for test lz_fmt_val = 0.123 ! test value ! write value to buffer suppressing optional leading plus sign write( unit= io_diag_buf, fmt= '( ss, f6.3)' ) lz_fmt_val io_diag_buf = adjustl( io_diag_buf) ! remove leading blanks ! first character should be '0' or '.' or test failed lz_f: if( io_diag_buf( 1: 1) == '0' )then ! got '0' lz_f_flag = .true. ! set flag elseif( io_diag_buf( 1: 1) == '.' )then lz_f ! got '.' lz_f_flag = .false. ! set flag else lz_f ! got ??? write( unit= log_unit, fmt= fmtpr) 'WARNING: test leading zero f format failed' stop error_stop_code ! must be wrong endif lz_f ! reset for e format test io_diag_buf = ' ' ! blank out buffer for test ! write value to buffer suppressing optional leading plus sign write( unit= io_diag_buf, fmt= '( ss, e16.8)' ) lz_fmt_val io_diag_buf = adjustl( io_diag_buf) ! remove leading blanks ! first character should be '0' or '.' or test failed lz_e: if( io_diag_buf( 1: 1) == '0' )then ! got '0' lz_e_flag = .true. ! set flag elseif( io_diag_buf( 1: 1) == '.' )then lz_e ! got '.' lz_e_flag = .false. ! set flag else lz_e ! got ??? write( unit= log_unit, fmt= fmtpr) 'WARNING: test leading zero e format failed' stop error_stop_code ! must be wrong endif lz_e ! ---------------------------------------------------------------------- ! diagnose list-directed format switch between f and e formats ld_min = 0 ! start at 10^0 x = 3.0 ! start in the middle of a decade ld_fmt_min: do ! forever io_diag_buf = ' ' ! blank out buffer x = x / 10 ! test next decade write( unit= io_diag_buf, fmt= *) x ! list-directed format if( scan( io_diag_buf, 'Ee') > 0 ) exit ld_fmt_min ! quit upon E format ld_min = ld_min - 1 ! still F format enddo ld_fmt_min ! forever ld_max = 0 ! start at 10^0 x = 3.0 ! start in the middle of a decade ld_fmt_max: do ! forever io_diag_buf = ' ' ! blank out buffer write( unit= io_diag_buf, fmt= *) x ! list-directed format x = x * 10 ! test next decade if( scan( io_diag_buf, 'Ee') > 0 ) exit ld_fmt_max ! quit upon E format ld_max = ld_max + 1 ! still F format enddo ld_fmt_max ! forever ! ---------------------------------------------------------------------- return ! diagnose_input_output() ! ********************************************************************** ! diagnose_input_output() end subroutine diagnose_input_output ! ********************************************************************** ! write_integer_kind() writes an integer kind parameter & integer type subroutine write_integer_kind( int_var) ! ********************************************************************** ! write_integer_kind() interface type( integer_kind_t), intent( in) :: int_var ! name of kind ! ********************************************************************** ! write_integer_kind() local integer :: kind_name_len ! ********************************************************************** ! write_integer_kind() text continue ! write_integer_kind() kind_name_len = len_trim( int_var% kind_name) write( unit= pd_unit, fmt= fmtpr) "! " // int_var% kind_name( 1: kind_name_len) // " signed integer" write( unit= pd_unit, fmt= *) ! ?kind? integers if( int_var% supported )then ! has this kind write( unit= pd_unit, fmt= fmtprip) & "integer, public, parameter :: " // int_var% kind_name( 1: kind_name_len) & // "_k = selected_int_kind(", int_var% max_digits ! ?kind? integers else ! has this kind write( unit= pd_unit, fmt= fmtpr) & "integer, public, parameter :: " // int_var% kind_name( 1: kind_name_len) // "_k = -1" endif ! has this kind return ! write_integer_kind() ! ********************************************************************** ! write_integer_kind() end subroutine write_integer_kind ! ********************************************************************** ! write_real_kind() writes an real kind parameter & real type subroutine write_real_kind( real_var) ! ********************************************************************** ! write_real_kind() interface type( real_kind_t), intent( in) :: real_var ! name of kind ! ********************************************************************** ! write_real_kind() local integer :: kind_name_len ! ********************************************************************** ! write_real_kind() text continue ! write_real_kind() kind_name_len = len_trim( real_var% kind_name) ! comment real single kind if( ieeefp )then ! ieee single write( unit= pd_unit, fmt= fmtpr) "! IEEE 754 " // real_var% kind_name( 1: kind_name_len) // " real kind" else ! ieee single write( unit= pd_unit, fmt= fmtpr) "! " // real_var% kind_name( 1: kind_name_len) // " real kind" endif ! ieee single write( unit= pd_unit, fmt= *) ! has single real if( real_var% supported )then ! has ?kind? reals write( unit= pd_unit, fmt= fmtpriip) & "integer, public, parameter :: " // real_var% kind_name( 1: kind_name_len) // & "_k = selected_real_kind(", real_var% max_precision, real_var% max_range else ! has ?kind? reals ! no ?kind? real select case( real_var% kind_value) ! select error code case( -1) ! select no such precision write( unit= pd_unit, fmt= fmtpr) & "integer, public, parameter :: " // real_var% kind_name( 1: kind_name_len) // "_k = -1" case( -2) ! select no such range write( unit= pd_unit, fmt= fmtpr) & "integer, public, parameter :: " // real_var% kind_name( 1: kind_name_len) // "_k = -2" case( -3) ! select no such real write( unit= pd_unit, fmt= fmtpr) & "integer, public, parameter :: " // real_var% kind_name( 1: kind_name_len) // "_k = -3" case default ! non-standard error code or single_k not unique ! ?kind? real is not unique if( real_var% kind_value > 0 )then ! ?kind? not unique write( unit= pd_unit, fmt= fmtpriip) & "integer, public, parameter :: " // real_var% kind_name( 1: kind_name_len) // "_k = selected_real_kind(", sp, sr write( unit= log_unit, fmt= fmtpr) "WARNING: " // real_var% kind_name( 1: kind_name_len) // "_k: not unique" ! no ?kind? real else ! non-standard error code write( unit= pd_unit, fmt= fmtpri) & "integer, public, parameter :: " // real_var% kind_name( 1: kind_name_len) // "_k =", real_var% kind_value write( unit= log_unit, fmt= fmtpri) & "WARNING: " // real_var% kind_name( 1: kind_name_len) // "_k: non-standard error code:", real_var% kind_value endif ! ?kind? not unique end select ! select error code endif ! has ?kind? reals return ! write_real_kind() ! ********************************************************************** ! write_real_kind() end subroutine write_real_kind ! ********************************************************************** ! write_bit_size() writes a Method of Olagnon bit_size() function subroutine write_bit_size( type_str, kind_str) ! ********************************************************************** ! write_bit_size() interface character( len= *), intent( in) :: type_str ! name of type character( len= *), intent( in) :: kind_str ! name of kind ! ********************************************************************** ! write_bit_size() local character( len= 2) :: arg_name ! name bit_size() argument ! ********************************************************************** ! write_bit_size() text continue ! write_bit_size() ! form ?kind_bit_size() dummy argument name arg_name = kind_str( 1: 1) // type_str( 1: 1) ! kt ! write ?kind_bit_size() header write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "! " // kind_str // "_bit_size() bit_size() for kind " // kind_str write( unit= pd_unit, fmt= *) ! standards prior to f95 do not support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 ! function declaration write( unit= pd_unit, fmt= fmtpr) & "integer function " // kind_str // "_bit_size( " // arg_name // ")" write( unit= pd_unit, fmt= *) ! character types need a length if( type_str == 'character' )then write( unit= pd_unit, fmt= fmtpr) & "character( len= *, kind= " // kind_str // "_k), intent( in) :: " // arg_name ! non character types have no length else write( unit= pd_unit, fmt= fmtpr) & type_str // "( kind= " // kind_str // "_k), intent( in) :: " // arg_name endif write( unit= pd_unit, fmt= *) ! ?kind_bit_size() local write( unit= pd_unit, fmt= fmtpr) "! " // kind_str // "_bit_size() local" write( unit= pd_unit, fmt= *) ! character local must have length one if( type_str == 'character' )then write( unit= pd_unit, fmt= fmtpr) & " character( len= 1, kind= " // kind_str // "_k), dimension( bit_size( 0)) :: tk" ! non character local must have no length else write( unit= pd_unit, fmt= fmtpr) & " " // type_str // "( kind= " // kind_str // "_k), dimension( bit_size( 0)) :: tk" endif ! ?kind_bit_size() text write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! " // kind_str // "_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) ! compute by Method of Olagnon write( unit= pd_unit, fmt= fmtpr) " " // kind_str // "_bit_size = size( transfer( tk, (/ 0/) ))" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) ! ?kind_bit_size() end function write( unit= pd_unit, fmt= fmtpr) "! " // kind_str // "_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function " // kind_str // "_bit_size" write( unit= pd_unit, fmt= *) return ! write_bit_size() ! ********************************************************************** ! write_bit_size() end subroutine write_bit_size ! ********************************************************************** ! write_include_file() writes the define include file in user specified format subroutine write_include_file( istat) ! ********************************************************************** ! write_include_file() interface integer, intent( out) :: istat ! status ! ********************************************************************** ! write_include_file() text continue ! write_include_file() ! open file defines include file open( unit= inc_unit, file= incname, iostat= istat, position= 'REWIND', & action= 'WRITE', status= 'REPLACE') open_error: if( istat > 0 )then ! can't open defines include file write( unit= log_unit, fmt= fmtpr) cant_open // trim( incname) return ! write_include_file() endif open_error ! can't open defines include file ! ---------------------------------------------------------------------- ! select defines format select_fpp: select case( ppr_inc) ! include file format ! ---------------------------------------------------------------------- ! write defined kinds in coco format case( coco_inc) select_fpp ! coco ! write timestamp for version checks write( unit= inc_unit, fmt= fmtpr) '?? macro :: timestamp = "' // timestamp // '"' ! write compiler version for version checks write( unit= inc_unit, fmt= fmtpr) '?? macro :: compiler = "' // trim( com_vers) // '"' ! write standard diagnostic write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: PREF66 = 0' write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: F66 = 1' write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: F77 = 2' write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: F90 = 3' write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: F95 = 4' write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: F03 = 5' write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: F08 = 6' select_std_coco: select case( standard) case( f90_std) select_std_coco write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: STD = F90' case( f95_std) select_std_coco write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: STD = F95' case( f03_std) select_std_coco write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: STD = F03' case( f08_std) select_std_coco write( unit= inc_unit, fmt= fmtpr) '?? integer, parameter :: STD = F08' end select select_std_coco ! define module parameters strings_coco: if( strings )then ! iso_varying_string write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: ISO_VARYING_STRINGS_T = .true.' else strings_coco ! iso_varying_string write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: ISO_VARYING_STRINGS_T = .false.' endif strings_coco ! iso_varying_string ! define integer kind parameters byte_coco: if( integer_kinds( byte_idx)% supported )then ! integer byte write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: BYTE_K = .true.' else byte_coco ! integer byte write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: BYTE_K = .false.' endif byte_coco ! integer byte short_coco: if( integer_kinds( short_idx)% supported )then ! integer short write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: SHORT_K = .true.' else short_coco ! integer short write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: SHORT_K = .false.' endif short_coco ! integer short int_coco: if( integer_kinds( int_idx)% supported )then ! integer int write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: INT_K = .true.' else int_coco ! integer int write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: INT_K = .false.' endif int_coco ! integer int long_coco: if( integer_kinds( long_idx)% supported )then ! integer long write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: LONG_K = .true.' else long_coco ! integer long write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: LONG_K = .false.' endif long_coco ! integer long ! define real (& complex) kind parameters single_coco: if( real_kinds( single_idx)% supported )then ! real single write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: SINGLE_K = .true.' else single_coco ! real single write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: SINGLE_K = .false.' endif single_coco ! real single double_coco: if( real_kinds( double_idx)% supported )then ! real double write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: DOUBLE_K = .true.' else double_coco ! real double write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: DOUBLE_K = .false.' endif double_coco ! real double quad_coco: if( real_kinds( quad_idx)% supported )then ! real quad write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: QUAD_K = .true.' else quad_coco ! real quad write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: QUAD_K = .false.' endif quad_coco ! real quad ! define logical kind parameters l_byte_coco: if( byte_logical% supported )then ! logical byte write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_BYTE_K = .true.' else l_byte_coco ! logical byte write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_BYTE_K = .false.' endif l_byte_coco ! logical byte l_short_coco: if( short_logical% supported )then ! logical short write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_SHORT_K = .true.' else l_short_coco ! logical short write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_SHORT_K = .false.' endif l_short_coco ! logical short l_int_coco: if( int_logical% supported )then ! logical int write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_INT_K = .true.' else l_int_coco ! logical int write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_INT_K = .false.' endif l_int_coco ! logical int l_long_coco: if( long_logical% supported )then ! logical long write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_LONG_K = .true.' else l_long_coco ! logical long write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: L_LONG_K = .false.' endif l_long_coco ! logical long ! define character kind parameters ascii_coco: if( ascii_character% supported )then ! character ascii write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: ASCII_K = .true.' else ascii_coco ! character ascii write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: ASCII_K = .false.' endif ascii_coco ! character ascii ebcdic_coco: if( ebcdic_character% supported )then ! character ebcdic write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: EBCDIC_K = .true.' else ebcdic_coco ! character ebcdic write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: EBCDIC_K = .false.' endif ebcdic_coco ! character ebcdic iso_10646_coco: if( iso_10646_character% supported )then ! character iso_10646 write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: ISO_10646_K = .true.' else iso_10646_coco ! character iso_10646 write( unit= inc_unit, fmt= fmtpr) '?? logical, parameter :: ISO_10646_K = .false.' endif iso_10646_coco ! character iso_10646 ! ---------------------------------------------------------------------- ! write defined kinds in f90ppr format case( f90ppr_inc) select_fpp ! f90ppr ! write standard diagnostic write( unit= inc_unit, fmt= fmtpr) '$define PREF66 = 0' write( unit= inc_unit, fmt= fmtpr) '$define F66 = 1' write( unit= inc_unit, fmt= fmtpr) '$define F77 = 2' write( unit= inc_unit, fmt= fmtpr) '$define F90 = 3' write( unit= inc_unit, fmt= fmtpr) '$define F95 = 4' write( unit= inc_unit, fmt= fmtpr) '$define F03 = 5' write( unit= inc_unit, fmt= fmtpr) '$define F08 = 6' select_std_f90ppr: select case( standard) case( f90_std) select_std_f90ppr write( unit= inc_unit, fmt= fmtpr) '$define STD = F90' case( f95_std) select_std_f90ppr write( unit= inc_unit, fmt= fmtpr) '$define STD = F95' case( f03_std) select_std_f90ppr write( unit= inc_unit, fmt= fmtpr) '$define STD = F03' case( f08_std) select_std_f90ppr write( unit= inc_unit, fmt= fmtpr) '$define STD = F08' end select select_std_f90ppr ! define module parameters strings_f90ppr: if( strings )then ! iso_varying_string write( unit= inc_unit, fmt= fmtpr) '$define ISO_VARYING_STRINGS_T' else strings_f90ppr ! iso_varying_string write( unit= inc_unit, fmt= fmtpr) '!define ISO_VARYING_STRINGS_T' endif strings_f90ppr ! iso_varying_string ! define (or not) integer kind parameters byte_f90ppr: if( integer_kinds( byte_idx)% supported )then ! integer byte write( unit= inc_unit, fmt= fmtpr) '$define BYTE_K' else byte_f90ppr ! integer byte write( unit= inc_unit, fmt= fmtpr) '!define BYTE_K' endif byte_f90ppr ! integer byte short_f90ppr: if( integer_kinds( short_idx)% supported )then ! integer short write( unit= inc_unit, fmt= fmtpr) '$define SHORT_K' else short_f90ppr ! integer short write( unit= inc_unit, fmt= fmtpr) '!define SHORT_K' endif short_f90ppr ! integer short int_f90ppr: if( integer_kinds( int_idx)% supported )then ! integer int write( unit= inc_unit, fmt= fmtpr) '$define INT_K' else int_f90ppr ! integer int write( unit= inc_unit, fmt= fmtpr) '!define INT_K' endif int_f90ppr ! integer int long_f90ppr: if( integer_kinds( long_idx)% supported )then ! integer long write( unit= inc_unit, fmt= fmtpr) '$define LONG_K' else long_f90ppr ! integer long write( unit= inc_unit, fmt= fmtpr) '!define LONG_K' endif long_f90ppr ! integer long ! define (or not) real (& complex) kind parameters single_f90ppr: if( real_kinds( single_idx)% supported )then ! real single write( unit= inc_unit, fmt= fmtpr) '$define SINGLE_K' else single_f90ppr ! real single write( unit= inc_unit, fmt= fmtpr) '!define SINGLE_K' endif single_f90ppr ! real single double_f90ppr: if( real_kinds( double_idx)% supported )then ! real double write( unit= inc_unit, fmt= fmtpr) '$define DOUBLE_K' else double_f90ppr ! real double write( unit= inc_unit, fmt= fmtpr) '!define DOUBLE_K' endif double_f90ppr ! real double quad_f90ppr: if( real_kinds( quad_idx)% supported )then ! real quad write( unit= inc_unit, fmt= fmtpr) '$define QUAD_K' else quad_f90ppr ! real quad write( unit= inc_unit, fmt= fmtpr) '!define QUAD_K' endif quad_f90ppr ! real quad ! define (or not) logical kind parameters l_byte_f90ppr: if( byte_logical% supported )then ! logical byte write( unit= inc_unit, fmt= fmtpr) '$define L_BYTE_K' else l_byte_f90ppr ! logical byte write( unit= inc_unit, fmt= fmtpr) '!define L_BYTE_K' endif l_byte_f90ppr ! logical byte l_short_f90ppr: if( short_logical% supported )then ! logical short write( unit= inc_unit, fmt= fmtpr) '$define L_SHORT_K' else l_short_f90ppr ! logical short write( unit= inc_unit, fmt= fmtpr) '!define L_SHORT_K' endif l_short_f90ppr ! logical short l_int_f90ppr: if( int_logical% supported )then ! logical int write( unit= inc_unit, fmt= fmtpr) '$define L_INT_K' else l_int_f90ppr ! logical int write( unit= inc_unit, fmt= fmtpr) '!define L_INT_K' endif l_int_f90ppr ! logical int l_long_f90ppr: if( long_logical% supported )then ! logical long write( unit= inc_unit, fmt= fmtpr) '$define L_LONG_K' else l_long_f90ppr ! logical long write( unit= inc_unit, fmt= fmtpr) '!define L_LONG_K' endif l_long_f90ppr ! logical long ! define (or not) character kind parameters ascii_f90ppr: if( ascii_character% supported )then ! character ascii write( unit= inc_unit, fmt= fmtpr) '$define ASCII_K' else ascii_f90ppr ! character ascii write( unit= inc_unit, fmt= fmtpr) '!define ASCII_K' endif ascii_f90ppr ! character ascii ebcdic_f90ppr: if( ebcdic_character% supported )then ! character ebcdic write( unit= inc_unit, fmt= fmtpr) '$define EBCDIC_K' else ebcdic_f90ppr ! character ebcdic write( unit= inc_unit, fmt= fmtpr) '!define EBCDIC_K' endif ebcdic_f90ppr ! character ebcdic iso_10646_f90ppr: if( iso_10646_character% supported )then ! character iso_10646 write( unit= inc_unit, fmt= fmtpr) '$define ISO_10646_K' else iso_10646_f90ppr ! character iso_10646 write( unit= inc_unit, fmt= fmtpr) '!define ISO_10646_K' endif iso_10646_f90ppr ! character iso_10646 ! ---------------------------------------------------------------------- ! write defined kinds in fpp/cpp format case( fpp_inc) select_fpp ! fpp/cpp ! write standard diagnostic write( unit= inc_unit, fmt= fmtpr) '#define PREF66 0' write( unit= inc_unit, fmt= fmtpr) '#define F66 1' write( unit= inc_unit, fmt= fmtpr) '#define F77 2' write( unit= inc_unit, fmt= fmtpr) '#define F90 3' write( unit= inc_unit, fmt= fmtpr) '#define F95 4' write( unit= inc_unit, fmt= fmtpr) '#define F03 5' write( unit= inc_unit, fmt= fmtpr) '#define F08 6' select_std_fpp: select case( standard) case( f90_std) select_std_fpp write( unit= inc_unit, fmt= fmtpr) '#define STD F90' case( f95_std) select_std_fpp write( unit= inc_unit, fmt= fmtpr) '#define STD F95' case( f03_std) select_std_fpp write( unit= inc_unit, fmt= fmtpr) '#define STD F03' case( f08_std) select_std_fpp write( unit= inc_unit, fmt= fmtpr) '#define STD F08' end select select_std_fpp ! define module parameters strings_fpp: if( strings )then ! iso_varying_string write( unit= inc_unit, fmt= fmtpr) '#define ISO_VARYING_STRINGS_T' else strings_fpp ! iso_varying_string write( unit= inc_unit, fmt= fmtpr) '!define ISO_VARYING_STRINGS_T' endif strings_fpp ! iso_varying_string ! define (or not) integer kind parameters byte_fpp: if( integer_kinds( byte_idx)% supported )then ! integer byte write( unit= inc_unit, fmt= fmtpr) '#define BYTE_K' else byte_fpp ! integer byte write( unit= inc_unit, fmt= fmtpr) '!define BYTE_K' endif byte_fpp ! integer byte short_fpp: if( integer_kinds( short_idx)% supported )then ! integer short write( unit= inc_unit, fmt= fmtpr) '#define SHORT_K' else short_fpp ! integer short write( unit= inc_unit, fmt= fmtpr) '!define SHORT_K' endif short_fpp ! integer short int_fpp: if( integer_kinds( int_idx)% supported )then ! integer int write( unit= inc_unit, fmt= fmtpr) '#define INT_K' else int_fpp ! integer int write( unit= inc_unit, fmt= fmtpr) '!define INT_K' endif int_fpp ! integer int long_fpp: if( integer_kinds( long_idx)% supported )then ! integer long write( unit= inc_unit, fmt= fmtpr) '#define LONG_K' else long_fpp ! integer long write( unit= inc_unit, fmt= fmtpr) '!define LONG_K' endif long_fpp ! integer long ! define (or not) real (& complex) kind parameters single_fpp: if( real_kinds( single_idx)% supported )then ! real single write( unit= inc_unit, fmt= fmtpr) '#define SINGLE_K' else single_fpp ! real single write( unit= inc_unit, fmt= fmtpr) '!define SINGLE_K' endif single_fpp ! real single double_fpp: if( real_kinds( double_idx)% supported )then ! real double write( unit= inc_unit, fmt= fmtpr) '#define DOUBLE_K' else double_fpp ! real double write( unit= inc_unit, fmt= fmtpr) '!define DOUBLE_K' endif double_fpp ! real double quad_fpp: if( real_kinds( quad_idx)% supported )then ! real quad write( unit= inc_unit, fmt= fmtpr) '#define QUAD_K' else quad_fpp ! real quad write( unit= inc_unit, fmt= fmtpr) '!define QUAD_K' endif quad_fpp ! real quad ! define (or not) logical kind parameters l_byte_fpp: if( byte_logical% supported )then ! logical byte write( unit= inc_unit, fmt= fmtpr) '#define L_BYTE_K' else l_byte_fpp ! logical byte write( unit= inc_unit, fmt= fmtpr) '!define L_BYTE_K' endif l_byte_fpp ! logical byte l_short_fpp: if( short_logical% supported )then ! logical short write( unit= inc_unit, fmt= fmtpr) '#define L_SHORT_K' else l_short_fpp ! logical short write( unit= inc_unit, fmt= fmtpr) '!define L_SHORT_K' endif l_short_fpp ! logical short l_int_fpp: if( int_logical% supported )then ! logical int write( unit= inc_unit, fmt= fmtpr) '#define L_INT_K' else l_int_fpp ! logical int write( unit= inc_unit, fmt= fmtpr) '!define L_INT_K' endif l_int_fpp ! logical int l_long_fpp: if( long_logical% supported )then ! logical long write( unit= inc_unit, fmt= fmtpr) '#define L_LONG_K' else l_long_fpp ! logical long write( unit= inc_unit, fmt= fmtpr) '!define L_LONG_K' endif l_long_fpp ! logical long ! define (or not) character kind parameters ascii_fpp: if( ascii_character% supported )then ! character ascii write( unit= inc_unit, fmt= fmtpr) '#define ASCII_K' else ascii_fpp ! character ascii write( unit= inc_unit, fmt= fmtpr) '!define ASCII_K' endif ascii_fpp ! character ascii ebcdic_fpp: if( ebcdic_character% supported )then ! character ebcdic write( unit= inc_unit, fmt= fmtpr) '#define EBCDIC_K' else ebcdic_fpp ! character ebcdic write( unit= inc_unit, fmt= fmtpr) '!define EBCDIC_K' endif ebcdic_fpp ! character ebcdic iso_10646_fpp: if( iso_10646_character% supported )then ! character iso_10646 write( unit= inc_unit, fmt= fmtpr) '#define ISO_10646_K' else iso_10646_fpp ! character iso_10646 write( unit= inc_unit, fmt= fmtpr) '!define ISO_10646_K' endif iso_10646_fpp ! character iso_10646 ! ---------------------------------------------------------------------- ! unknown preprocessor include filename case default select_fpp ! catch errors write( unit= log_unit, fmt= fmtpr) ' WARNING: unknown preprocessor file format' ! ---------------------------------------------------------------------- end select select_fpp ! include file format ! ---------------------------------------------------------------------- ! close define include file close( unit= inc_unit, iostat= istat, status= 'KEEP') ! (tried to) read all groups close_error: if( istat > 0 )then ! trouble closing write( unit= log_unit, fmt= fmtpr) 'trouble closing ' // trim( incname) endif close_error ! trouble closing return ! write_include_file() ! ********************************************************************** ! write_include_file() end subroutine write_include_file ! ********************************************************************** ! write_processor_dependencies() writes customized standard_type module subroutine write_processor_dependencies( istat) ! ********************************************************************** ! write_processor_dependencies() interface integer, intent( out) :: istat ! status ! ********************************************************************** ! write_processor_dependencies() local integer :: rs_size ! random seed size integer :: io_len = 0 ! test file storage units integer :: i ! integer, real kinds loop index ! ********************************************************************** ! write_processor_dependencies() text continue ! write_processor_dependencies() ! write a new processor_dependencies open( unit= pd_unit, file= pdname, iostat= istat, action= 'WRITE', status= 'REPLACE') open_error: if( istat > 0 )then ! can't open stdtype.f90 write( unit= log_unit, fmt= fmtpr) cant_open // trim( pdname) return ! write_processor_dependencies() endif open_error ! can't open stdtype.f90 ! write stdtype.f90 write( unit= pd_unit, fmt= fmtpr) "! bof" write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= fmtpr) "! Fortran 95 module processor_dependencies" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= fmtpr) "! Source Control Strings" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= fmtpr) "! Copyright 2004 Purple Sage Computing Solutions, Inc." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! This library is free software; you can redistribute it and/or" write( unit= pd_unit, fmt= fmtpr) "! modify it under the terms of the GNU Library General Public" write( unit= pd_unit, fmt= fmtpr) "! License as published by the Free Software Foundation; either" write( unit= pd_unit, fmt= fmtpr) "! version 2 of the License, or (at your option) any later version." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! This library is distributed in the hope that it will be useful," write( unit= pd_unit, fmt= fmtpr) "! but WITHOUT ANY WARRANTY; without even the implied warranty of" write( unit= pd_unit, fmt= fmtpr) "! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU" write( unit= pd_unit, fmt= fmtpr) "! Library General Public License for more details." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! You should have received a copy of the GNU Library General Public" write( unit= pd_unit, fmt= fmtpr) "! License along with this library; if not, write to the Free" write( unit= pd_unit, fmt= fmtpr) "! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! To report bugs, suggest enhancements, etc. to the Authors," write( unit= pd_unit, fmt= fmtpr) "! Contact:" write( unit= pd_unit, fmt= fmtpr) "! Purple Sage Computing Solutions, Inc." write( unit= pd_unit, fmt= fmtpr) "! send email to dnagle@erols.com" write( unit= pd_unit, fmt= fmtpr) "! or fax to 703 471 0684 (USA)" write( unit= pd_unit, fmt= fmtpr) "! or mail to 12142 Purple Sage Ct." write( unit= pd_unit, fmt= fmtpr) "! Reston, VA 20194-5621 USA" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies describes the processor: kinds, processor dependencies, &c" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! Module processor_dependencies provides standard definitions" write( unit= pd_unit, fmt= fmtpr) "! of Fortran type kind parameters, and other Fortran" write( unit= pd_unit, fmt= fmtpr) "! processor dependent quantities. The porting of Fortran" write( unit= pd_unit, fmt= fmtpr) "! programs from processor to processor is eased because symbolic," write( unit= pd_unit, fmt= fmtpr) "! rather than 'magic number' constants and conditions may be used" write( unit= pd_unit, fmt= fmtpr) "! by the programmer. The understanding of Fortran programs is enhanced" write( unit= pd_unit, fmt= fmtpr) "! because constants and subprograms have easily undertsood names." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The compiler to which this file applies and the RCS strings of this" write( unit= pd_unit, fmt= fmtpr) "! file are available as default-kind character parameters." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! A set of kinds is defined, each a parameter whose name is _k." write( unit= pd_unit, fmt= fmtpr) "! The number of bits per numeric storage unit, per character storage" write( unit= pd_unit, fmt= fmtpr) "! and per file storage unit are defined." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The intrinsic bit_size() is extended to all types and kinds (a complex" write( unit= pd_unit, fmt= fmtpr) "! kind is by definition twice the same real kind, but bit_size() should" write( unit= pd_unit, fmt= fmtpr) "! exist for all kinds). The intrinsics tiny() and huge() are extended to" write( unit= pd_unit, fmt= fmtpr) "! character and complex kinds. The intrinsic epsilon() is extended to" write( unit= pd_unit, fmt= fmtpr) "! complex kinds." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! Quantities defined include the input and output units preconnected," write( unit= pd_unit, fmt= fmtpr) "! and whether there is a preconnected error unit. The size of the" write( unit= pd_unit, fmt= fmtpr) "! processor's random number generator seed is defined to allow static" write( unit= pd_unit, fmt= fmtpr) "! declaration of the seed. A flag is defined whether the processor" write( unit= pd_unit, fmt= fmtpr) "! uses ieee 754 floating point format. A flag is defined whether the" write( unit= pd_unit, fmt= fmtpr) "! processor uses twos compliment integer arithmetic." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! Suggestions for other behavior of Fortran processors which could be" write( unit= pd_unit, fmt= fmtpr) "! codified in this module are very much welcomed by the author." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! A summary listing of defined parameters, and a listing of defined" write( unit= pd_unit, fmt= fmtpr) "! procedures follows." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= fmtpr) "! use no modules" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies uses" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! none" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! *** all parameters are default kind ***" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies constants" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies_rcs_id= this file's RCS Identifier" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! compiler_version= compiler to which this file applies" write( unit= pd_unit, fmt= fmtpr) "! compiler_serial= compiler license serial" write( unit= pd_unit, fmt= fmtpr) "! os_version= operating system to which this file applies" write( unit= pd_unit, fmt= fmtpr) "! compiler_standard= Fortran standard supported by the compiler" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! has_varying_strings- true if processor supports iso_varying_string" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_k, ebcdic_k, iso_10646_k= character kinds" write( unit= pd_unit, fmt= fmtpr) "! byte_k, short_k, int_k, long_k= integer kinds" write( unit= pd_unit, fmt= fmtpr) "! l_byte_k, l_short_k, l_int_k, l_long_k= logical kinds" write( unit= pd_unit, fmt= fmtpr) "! single_k, double_k, quad_k= real kinds (& thf complex kinds)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! byte_int, short_int, int_int, long_int= type( integer_inquiry_t)" write( unit= pd_unit, fmt= fmtpr) "! single_real, double_real, quad_real= type( real_inquiry_t)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! numeric_storage_size= bits per numeric storage unit" write( unit= pd_unit, fmt= fmtpr) "! character_storage_size= bits per character storage unit" write( unit= pd_unit, fmt= fmtpr) "! file_storage_size= bits per file storage unit" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_big_endian= true if processor is big endian" write( unit= pd_unit, fmt= fmtpr) "! is_little_endian= true if processor is little endian" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! default_filename= filename of a unit opened without a name" write( unit= pd_unit, fmt= fmtpr) "! opt_plus_sign= true if optional plus with i, e, f, g formats" write( unit= pd_unit, fmt= fmtpr) "! leading_zero_f= true if optional leading zero with f format" write( unit= pd_unit, fmt= fmtpr) "! leading_zero_e= true if optional leading zero with e format" write( unit= pd_unit, fmt= fmtpr) "! ld_fmt_fmin= smallest exponent list-directed format writes with f format" write( unit= pd_unit, fmt= fmtpr) "! ld_fmt_fmax= largest exponent list-directed format writes with f format" write( unit= pd_unit, fmt= fmtpr) "! da_undefined_record= iostat value returned when reading an undefined record" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies types" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! none" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies variables" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! none" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies operators" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! none" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! *** all integer and logical functions return default kind ***" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! *** some functions use their argument only to select specific ***" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies library" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bit_size() for character, logical, real, complex types" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int() for logical returns 1 or 0 for T or F" write( unit= pd_unit, fmt= fmtpr) "! logical() for integers, returns T or F for non-0 or 0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! huge() for character kinds ( largest character code)" write( unit= pd_unit, fmt= fmtpr) "! tiny() for character kinds ( smallest character code)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! huge() for complex kinds ( returns sqrt( real huge) )" write( unit= pd_unit, fmt= fmtpr) "! tiny() for complex kinds ( returns sqrt( real tiny) )" write( unit= pd_unit, fmt= fmtpr) "! epsilon() for complex kinds ( returns sqrt( real epsilon) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! max_exact_int() largest integer a real kind increments (by one) exactly" write( unit= pd_unit, fmt= *) ! ********************************************************************** ! write processor_dependencies module declarations ! ********************************************************************** write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "module processor_dependencies" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! use none" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! explicit declaration of all names" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "implicit none" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! all variables are static" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "save" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! explicit export of all module names" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "private" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies RCS strings" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! module source filename supplied by RCS" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *), public, parameter :: processor_dependencies_rcs_id = &" write( unit= pd_unit, fmt= fmtpr) " '$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $'" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *), public, parameter :: processor_depends_timestamp = &" write( unit= pd_unit, fmt= fmtpr) " '" // trim( timestamp) // "'" write( unit= pd_unit, fmt= *) ! ********************************************************************** ! write processor_dependencies constant declarations ! ********************************************************************** write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies data" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! compiler & OS version to which this file applies" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! compiler version used to generate this file" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *), public, parameter :: compiler_version = &" write( unit= pd_unit, fmt= fmtpr) " '" // trim( com_vers) // "'" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! compiler serial number used to generate this file" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *), public, parameter :: compiler_serial = &" write( unit= pd_unit, fmt= fmtpr) " '" // trim( com_sern) // "'" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! operating system version used to generate this file" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *), public, parameter :: os_version = &" write( unit= pd_unit, fmt= fmtpr) " '" // trim( os_vers) // "'" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! standard supported by this compiler" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *), public, parameter :: standard_version = &" select_std_coco: select case( standard) case( f90_std) select_std_coco write( unit= pd_unit, fmt= fmtpr) " 'Fortran 90'" case( f95_std) select_std_coco write( unit= pd_unit, fmt= fmtpr) " 'Fortran 95'" case( f03_std) select_std_coco write( unit= pd_unit, fmt= fmtpr) " 'Fortran 2003'" case( f08_std) select_std_coco write( unit= pd_unit, fmt= fmtpr) " 'Fortran 2008'" case default select_std_coco write( unit= pd_unit, fmt= fmtpr) " 'Fortran'" end select select_std_coco write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! *** all parameters are of default kind ***" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! modules available to the processor" write( unit= pd_unit, fmt= *) if( strings )then write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: has_varying_strings = .true." else write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: has_varying_strings = .false." endif write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The first section defines the kind parameters supported by the processor." write( unit= pd_unit, fmt= fmtpr) "! First, the kind parameters are defined." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor dependent kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner ! ********************************************************************** ! if defining character kinds if( define_characters )then ! want character kinds write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor character kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii characters (seven bit codes stored in eight bit bytes)" write( unit= pd_unit, fmt= *) ! select ascii characters starting with f03 if( standard >= f03_std )then ! has ascii write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: ascii_k = selected_char_kind( 'ASCII')" ! use input value before f03 elseif( ascii_character% supported )then ! has ascii write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: ascii_k =", ascii_character% kind_value ! no ascii else ! has ascii write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: ascii_k = -1" endif ! has ascii ! ebcdic characters write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic characters (eight bit bytes)" write( unit= pd_unit, fmt= *) ! use input value only if( ebcdic_character% supported )then ! has ebcdic write( unit= pd_unit, fmt= fmtpri) & "integer, public, parameter :: ebcdic_k =", ebcdic_character% kind_value ! no ebcdic else ! has ebcdic write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: ebcdic_k = -1" endif ! has ebcdic write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646 characters" write( unit= pd_unit, fmt= *) ! select iso_10646 characters starting with f03 if( standard >= f03_std )then ! has iso_10646 write( unit= pd_unit, fmt= fmtpr) & "integer, public, parameter :: iso_10646_k = selected_char_kind( 'ISO_10646')" write( unit= pd_unit, fmt= *) ! use input value else ! has iso_10646 ! use input value requests iso_10646 if( iso_10646_character% supported )then write( unit= pd_unit, fmt= fmtpri) & "integer, public, parameter :: iso_10646_k =", iso_10646_character% kind_value ! no iso_10646 else write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: iso_10646_k = -1" endif endif ! iso_10646 endif ! want character kinds write( unit= pd_unit, fmt= *) ! ********************************************************************** ! processor integers write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor integer kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! 8-bit signed integer ( 1.3+2 = huge() )" write( unit= pd_unit, fmt= *) ! byte integers call write_integer_kind( integer_kinds( byte_idx)) write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! 16-bit signed integer ( 3.3+4 = huge() )" write( unit= pd_unit, fmt= *) ! short integers call write_integer_kind( integer_kinds( short_idx)) write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! 32-bit signed integer ( 2.1+9 = huge() )" write( unit= pd_unit, fmt= *) ! int integers call write_integer_kind( integer_kinds(int_idx)) write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! 64-bit signed integer ( 4.2+18 = huge() )" write( unit= pd_unit, fmt= *) ! long integers call write_integer_kind( integer_kinds( long_idx)) write( unit= pd_unit, fmt= *) ! any unusual integers do i = 1, number_of_integers if( .not. ( i == byte_idx .or. i == short_idx .or. i == int_idx .or. i == long_idx ) )then if( integer_kinds( i)% supported )then call write_integer_kind( integer_kinds( i)) endif endif enddo ! ********************************************************************** ! if defining logical kinds if( define_logicals )then ! want logical kinds write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor logical kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner ! byte logicals write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical kind using same storage as byte" write( unit= pd_unit, fmt= *) if( byte_logical% supported )then ! has byte logical write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: l_byte_k =", byte_logical% kind_value else ! has byte logical ! no byte logical write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: l_byte_k = -1" endif ! has byte logical ! short logical write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical kind using same storage as short" write( unit= pd_unit, fmt= *) if( short_logical% supported )then ! has short logical write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: l_short_k =", short_logical% kind_value else ! has short logical ! no short logical write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: l_short_k = -1" endif ! has short logical ! int logical write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical kind using same storage as int" write( unit= pd_unit, fmt= *) if( int_logical% supported )then ! has int logical write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: l_int_k =", int_logical% kind_value else ! has int logical ! no int logical write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: l_int_k = -1" endif ! has int logical ! long logical write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical kind using same storage as long" write( unit= pd_unit, fmt= *) if( long_logical% supported )then ! has long logical write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: l_long_k =", long_logical% kind_value ! no long logical else ! has long logical write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: l_long_k = -1" endif ! has long logical write( unit= pd_unit, fmt= *) endif ! want logical kinds ! ********************************************************************** ! processor reals write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor real ( & thf complex) kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) call write_real_kind( real_kinds( single_idx)) write( unit= pd_unit, fmt= *) call write_real_kind( real_kinds( double_idx)) write( unit= pd_unit, fmt= *) call write_real_kind( real_kinds( quad_idx)) ! any unusual reals do i = 1, number_of_reals if( .not. ( i == single_idx .or. i == double_idx .or. i == quad_idx ) )then if( real_kinds( i)% supported )then call write_real_kind( real_kinds( i)) endif endif enddo ! ********************************************************************** ! processor dependencies write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! This section sets defines parameters specified by the" write( unit= pd_unit, fmt= fmtpr) "! Fortran standard as being processor dependent. These" write( unit= pd_unit, fmt= fmtpr) "! parameters describe hardware, I/O, and the intrinsic" write( unit= pd_unit, fmt= fmtpr) "! random number generator." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! values specified by the processor" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) ! storage sizes are defined in f03 if( standard < f03_std )then write( unit= pd_unit, fmt= fmtpr) "! bits per numeric storage unit" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: numeric_storage_size =", wordsize write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bits per character storage unit" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: character_storage_size =", bytesize write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bits per file storage unit" write( unit= pd_unit, fmt= *) ! number of file storage units per default integer inquire( iolength= io_len) io_len ! length of one word record ! compute bits per file storage unit write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: file_storage_size = bit_size( 0) /", io_len write( unit= pd_unit, fmt= *) endif write( unit= pd_unit, fmt= fmtpr) "! signal whether hardware addresses are byte addresses or word addresses" write( unit= pd_unit, fmt= *) if( ua_str == ba_str )then write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_byte_addressable = .true." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_word_addressable = .false." else write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_byte_addressable = .false." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_word_addressable = .true." endif write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! signal whether hardware is big endian or little endian" write( unit= pd_unit, fmt= *) ! is big endian if( measured_big_endian )then ! is big/little endian write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_big_endian = .true." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_little_endian = .false." ! or is little endian else ! is big/little endian write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_big_endian = .false." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_little_endian = .true." endif ! is big/little endian write( unit= pd_unit, fmt= *) ! defined in iso_fortran_env if f03 or later if( standard < f03_std )then ! f03 uses iso_fortran_env write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! i/o units preconnected for input ( unit= *)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: input_unit =", stdin write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! i/o units preconnected for output ( unit= *)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: output_unit =", stdout write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! i/o unit preconnected for error messages ( output_unit if no other)" write( unit= pd_unit, fmt= *) ! set stderr to stdout if no stderr if( stderr < 0 )then ! has stderr write( unit= pd_unit, fmt= fmtpr) "integer, public, parameter :: error_unit = output_unit" ! has a stderr else ! has stderr write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: error_unit =", stderr endif ! has stderr endif ! f03 uses iso_fortran_env write( unit= pd_unit, fmt= *) if( standard < f03_std )then write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! end of file and end of record iostat= values" write( unit= pd_unit, fmt= *) ! default filename determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpr) "! end of file" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, parameter :: iostat_end =", eof_flag write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! end of record" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, parameter :: iostat_eor =", eor_flag write( unit= pd_unit, fmt= *) endif write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! name of a file opened without a name" write( unit= pd_unit, fmt= *) ! default filename determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpr) & "character( len= *), public, parameter :: default_filename = '" // trim( def_fn) // "'" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) ! smallest list directed real F format exponent determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpr) "! exponents beyond which list-directed format switches from f to e" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: ld_fmt_fmin =", ld_min write( unit= pd_unit, fmt= *) ! largest list directed real F format exponent determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: ld_fmt_fmax =", ld_max write( unit= pd_unit, fmt= *) ! comma separator in list directed format determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpr) "! optional separator when using list directed format" write( unit= pd_unit, fmt= *) if( has_ld_sep )then write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: ld_fmt_comma = .true." else write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: ld_fmt_comma = .false." endif write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) ! optional plus sign determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpr) "! optional plus sign using numeric formats" write( unit= pd_unit, fmt= *) if( plus_flag )then write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: opt_plus_sign = .true." else write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: opt_plus_sign = .false." endif write( unit= pd_unit, fmt= *) ! optional leading zero with F format determined by experiment in diagnose_input_output() write( unit= pd_unit, fmt= fmtpr) "! optional leading zero using f and e formats" write( unit= pd_unit, fmt= *) if( lz_f_flag )then write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: leading_zero_f = .true." else write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: leading_zero_f = .false." endif write( unit= pd_unit, fmt= *) ! optional leading zero with E format determined by experiment in diagnose_input_output() if( lz_e_flag )then write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: leading_zero_e = .true." else write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: leading_zero_e = .false." endif write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner ! maximum formatted record size found in diagnose_input_output() write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! the maximum record length of a sequential record" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: max_recl =", mrecl ! undefined direct access record iostat write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! the iostat value returned when attempting to read a record not yet written" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: read_undefined_record =", da_missing write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! number of words in the random number generator seed array" write( unit= pd_unit, fmt= fmtpr) "! this parameter may be used to statically allocate the seed array" write( unit= pd_unit, fmt= *) ! determine random number generator seed size call random_seed( size= rs_size) ! get random seed size write( unit= pd_unit, fmt= fmtpri) "integer, public, parameter :: random_seed_size =", rs_size write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! true if processor uses ieee 754 floating point format" write( unit= pd_unit, fmt= fmtpr) "! the intent here is _format_, not all the roundings, exceptions, &c" write( unit= pd_unit, fmt= *) ! verified by check_ieee_single() or check_ieee_double() if( ieeefp )then ! uses ieee fp write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_ieee_fp = .true." else ! uses ieee fp write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_ieee_fp = .false." endif ! uses ieee fp write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! true if processor uses 2's complement integer format" write( unit= pd_unit, fmt= *) ! verified by check_hardware_values() if( twoscomp )then ! uses 2's compliment integers write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_2s_comp = .true." else ! uses 2's compliment integers write( unit= pd_unit, fmt= fmtpr) "logical, public, parameter :: is_2s_comp = .false." endif ! uses 2's compliment integers write( unit= pd_unit, fmt= *) ! ********************************************************************** ! write processor_dependencies procedure interfaces ! ********************************************************************** write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies library" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The following intrinsic procedures are extended to other types:" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bit_size() is extended to type character, logical, real & complex." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int() is extended to type logical." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical() is extended to type integer." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! huge() & tiny() are extended to type character and complex." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! epsilon() is extended to type complex." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The generic name is defined for each group of procedures and each" write( unit= pd_unit, fmt= fmtpr) "! specific name is made private; access is only thru the generic name." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bit_size() specific and generic names" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bit_size() for kinds character, logical, real (& thf complex) kinds" write( unit= pd_unit, fmt= *) ! standards before f95 don't support the :: if( standard >= f95_std )then ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic :: bit_size ! extend intrinsic" else ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic bit_size ! extend intrinsic" endif ! add :: if f95 write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: bit_size ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface bit_size" ! bit_size() for ascii characters if( ascii_character% supported )then ! has ascii write( unit= pd_unit, fmt= fmtpr) " module procedure ascii_bit_size" endif ! has ascii ! bit_size() for ebcdic characters if( ebcdic_character% supported )then ! has ebcdic write( unit= pd_unit, fmt= fmtpr) " module procedure ebcdic_bit_size" endif ! has ebcdic ! bit_size() for iso_10646 characters if( iso_10646_character% supported )then ! has iso_10646 write( unit= pd_unit, fmt= fmtpr) " module procedure iso_10646_bit_size" endif ! has iso_10646 ! if defining logical kinds if( define_logicals )then ! has logicals ! bit_size() for byte logicals if( byte_logical% supported )then ! has byte logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_byte_bit_size" endif ! has byte logical ! bit_size() for short logicals if( short_logical% supported )then ! has short logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_short_bit_size" endif ! has short logical ! bit_size() for int logicals if( int_logical% supported )then ! has int logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_int_bit_size" endif ! has int logical ! bit_size() for long logicals if( long_logical% supported )then ! has long logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_long_bit_size" endif ! has long logical ! bit_size() for default logicals else ! has logicals write( unit= pd_unit, fmt= fmtpr) " module procedure l_def_bit_size" endif ! has logicals ! bit_size() for single reals if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_bit_size" endif ! has single ! bit_size() for double reals if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_bit_size" endif ! has double ! bit_size() for quad reals if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_bit_size" endif ! has quad ! bit_size() for single complexs if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_complex_bit_size" endif ! has single ! bit_size() for double complexs if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_complex_bit_size" endif ! has double ! bit_size() for quad complexs if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_complex_bit_size" endif ! has quad write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int() specific and generic names" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int() for logical kinds" write( unit= pd_unit, fmt= *) ! standards before f95 don't support the :: if( standard >= f95_std )then ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic :: int ! extend intrinsic" else ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic int ! extend intrinsic" endif ! add :: if f95 write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: int ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface int" ! if defining logical kinds if( define_logicals )then ! has logicals ! int() for byte logicals if( byte_logical% supported )then ! has byte logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_byte_int" endif ! has byte logical ! int() for short logicals if( short_logical% supported )then ! has short logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_short_int" endif ! has short logical ! int() for int logicals if( int_logical% supported )then ! has int logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_int_int" endif ! has int logical ! int() for long logicals if( long_logical% supported )then ! has long logical write( unit= pd_unit, fmt= fmtpr) " module procedure l_long_int" endif ! has long logical ! int() for default logicals else ! has logicals write( unit= pd_unit, fmt= fmtpr) " module procedure l_def_int" endif ! has logicals write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical() specific and generic names" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical() for integer kinds" write( unit= pd_unit, fmt= *) ! standards before f95 don't support the :: if( standard >= f95_std )then ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic :: logical ! extend intrinsic" else ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic logical ! extend intrinsic" endif ! add :: if f95 write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: logical ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface logical" ! logical() for byte integers if( integer_kinds( byte_idx)% supported )then ! has byte int write( unit= pd_unit, fmt= fmtpr) " module procedure byte_logical" endif ! has byte int ! logical() for short integers if( integer_kinds( short_idx)% supported )then ! has short int write( unit= pd_unit, fmt= fmtpr) " module procedure short_logical" endif ! has short int ! logical() for int integers if( integer_kinds( int_idx)% supported )then ! has int int write( unit= pd_unit, fmt= fmtpr) " module procedure int_logical" endif ! has int int ! logical() for long integers if( integer_kinds( long_idx)% supported )then ! has long int write( unit= pd_unit, fmt= fmtpr) " module procedure long_logical" endif ! has long int write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! epsilon(), huge(), tiny() specific and generic names" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! huge for character & complex kinds" write( unit= pd_unit, fmt= *) ! standards before f95 don't support the :: if( standard >= f95_std )then ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic :: huge ! extend intrinsic" else ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic huge ! extend intrinsic" endif ! add :: if f95 write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: huge ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface huge" ! huge() for ascii characters if( ascii_character% supported )then ! has ascii write( unit= pd_unit, fmt= fmtpr) " module procedure ascii_huge" endif ! has ascii ! huge() for ebcdic characters if( ebcdic_character% supported )then ! has ebcdic write( unit= pd_unit, fmt= fmtpr) " module procedure ebcdic_huge" endif ! has ebcdic ! huge() for iso_10646 characters if( iso_10646_character% supported )then ! has iso_10646 write( unit= pd_unit, fmt= fmtpr) " module procedure iso_10646_huge" endif ! has iso_10646 ! huge() for single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_complex_huge" endif ! has single ! huge() for double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_complex_huge" endif ! has double ! huge() for quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_complex_huge" endif ! has quad write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! tiny for character & complex kinds" write( unit= pd_unit, fmt= *) ! standards before f95 don't support the :: if( standard >= f95_std )then ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic :: tiny ! extend intrinsic" else ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic tiny ! extend intrinsic" endif ! add :: if f95 write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: tiny ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface tiny" ! tiny() for ascii characters if( ascii_character% supported )then ! has ascii write( unit= pd_unit, fmt= fmtpr) " module procedure ascii_tiny" endif ! has ascii ! tiny() for ebcdic characters if( ebcdic_character% supported )then ! has ebcdic write( unit= pd_unit, fmt= fmtpr) " module procedure ebcdic_tiny" endif ! has ebcdic ! tiny() for iso_10646 characters if( iso_10646_character% supported )then ! has iso_10646 write( unit= pd_unit, fmt= fmtpr) " module procedure iso_10646_tiny" endif ! has iso_10646 ! tiny() for single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_complex_tiny" endif ! has single ! tiny() for double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_complex_tiny" endif ! has double ! tiny() for quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_complex_tiny" endif ! has quad write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! epsilon for complex kinds" write( unit= pd_unit, fmt= *) ! standards before f95 don't support the :: if( standard >= f95_std )then ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic :: epsilon ! extend intrinsic" else ! add :: if f95 write( unit= pd_unit, fmt= fmtpr) "intrinsic epsilon ! extend intrinsic" endif ! add :: if f95 write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: epsilon ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface epsilon" ! epsilon() for single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_complex_epsilon" endif ! has single ! epsilon() for double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_complex_epsilon" endif ! has double ! epsilon() for quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_complex_epsilon" endif ! has quad write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! max_exact_int() is the largest integer a real kind" write( unit= pd_unit, fmt= fmtpr) "! can exactly increment by 1.0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! max_exact_int() for real kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: max_exact_int ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface max_exact_int" ! max_exact_int() for single real if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_max_exact_int" endif ! has single ! max_exact_int() for double real if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_max_exact_int" endif ! has double ! max_exact_int() for quad real if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_max_exact_int" endif ! has quad write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) ! defined in iso_fortran_env in f03 and later if( standard < f03_std )then write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! defined in iso_fortran_env with Fortran 2003" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! interpret iostat values" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: is_iostat_end ! export" write( unit= pd_unit, fmt= fmtpr) "public :: is_iostat_eor ! export" write( unit= pd_unit, fmt= *) endif ! standards before f95 might not support cpu_time() need_cputime: if( standard < f95_std )then ! add cpu_time() if f90 write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! cpu_time() for f90 processors" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "public :: cpu_time ! generic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "interface cpu_time" ! cpu_time() for single real single_cputime: if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) " module procedure single_cpu_time" endif single_cputime ! has single ! cpu_time() for double real double_cputime: if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) " module procedure double_cpu_time" endif double_cputime ! has double ! cpu_time() for quad real quad_cputime: if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) " module procedure quad_cpu_time" endif quad_cputime ! has quad write( unit= pd_unit, fmt= fmtpr) "end interface" write( unit= pd_unit, fmt= *) endif need_cputime ! add cpu_time() if f90 ! ********************************************************************** ! write processor_dependencies procedure declarations ! ********************************************************************** write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! module procedures" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "contains ! processor_dependencies" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! *** all integer and logical functions return default kinds ***" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! *** some functions use their argument only to select specific ***" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! These specific procedures extend bit_size() to character, logical," write( unit= pd_unit, fmt= fmtpr) "! real and complex kinds." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! bit_size() extend intrinsic bit_size() to all defined processor kinds" write( unit= pd_unit, fmt= *) ! write bit_size() for ascii characters if( ascii_character% supported )then ! has ascii call write_bit_size( 'character', 'ascii') endif ! has ascii ! write bit_size() for ebcdic characters if( ebcdic_character% supported )then ! has ebcdic call write_bit_size( 'character', 'ebcdic') endif ! has ebcdic ! write bit_size() for iso_10646 characters if( iso_10646_character% supported )then ! has iso_10646 call write_bit_size( 'character', 'iso_10646') endif ! has iso_10646 ! if defining logical kinds if( define_logicals )then ! has logicals ! if has byte logical if( byte_logical% supported )then ! has byte logical ! default logical is byte if( byte_logical% default_kind )then ! default byte logical ! bit_size() for byte logical (default) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_byte_bit_size() bit_size() for kind byte logical" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_byte_bit_size( bl)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "logical( kind= l_byte_k), intent( in) :: bl ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_byte_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_byte_bit_size = bit_size( 0) ! 1 l_byte per nsu" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_byte_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_byte_bit_size" write( unit= pd_unit, fmt= *) ! if byte logical is not default kind else ! default byte logical ! bit_size() for byte logical call write_bit_size( 'logical', 'l_byte') endif ! default byte logical endif ! has byte logical ! if has short logical if( short_logical% supported )then ! has short logical ! default logical is short if( short_logical% default_kind )then ! default short logical ! bit_size() for short logical (default) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_short_bit_size() bit_size() for kind short logical" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_short_bit_size( sl)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "logical( kind= l_short_k), intent( in) :: sl ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_short_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_short_bit_size = bit_size( 0) ! 1 l_short per nsu" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_short_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_short_bit_size" write( unit= pd_unit, fmt= *) ! if short logical is not default kind else ! default short logical ! bit_size() for short logical call write_bit_size( 'logical', 'l_short') endif ! default short logical endif ! has short logical ! if has int logical if( int_logical% supported )then ! has int logical ! default logical is int if( int_logical% default_kind )then ! default int logical ! bit_size() for int logical (default) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_int_bit_size() bit_size() for kind int logical" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_int_bit_size( il)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "logical( kind= l_int_k), intent( in) :: il ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_int_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_int_bit_size = bit_size( 0) ! 1 l_int per nsu" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_int_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_int_bit_size" write( unit= pd_unit, fmt= *) ! if int logical is not default kind else ! default int logical ! bit_size() for int logical call write_bit_size( 'logical', 'l_int') endif ! default int logical endif ! has int logical ! has long logical if( long_logical% supported )then ! has long logical ! default logical is long if( long_logical% default_kind )then ! default long logical ! bit_size() for long logical (default) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_long_bit_size() bit_size() for kind long logical" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_long_bit_size( ll)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "logical( kind= l_long_k), intent( in) :: ll ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_long_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_long_bit_size = bit_size( 0) ! 1 l_long per default nsu" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_long_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_long_bit_size" write( unit= pd_unit, fmt= *) ! if long logical is not default kind else ! default long logical ! bit_size() for long logical call write_bit_size( 'logical', 'l_long') endif ! default long logical endif ! has long logical else ! has logical ! bit_size() for default logical write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_def_bit_size() bit_size() for kind int logical" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_def_bit_size( dl)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "logical, intent( in) :: dl ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_def_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_def_bit_size = bit_size( 0) ! default logical per default integer" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_def_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_def_bit_size" write( unit= pd_unit, fmt= *) endif ! has logical ! if has single real if( real_kinds( single_idx)% supported )then ! has single ! if single real is default kind if( real_kinds( single_idx)% default_kind )then ! default single ! bit_size() for single real (default known) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_bit_size() bit_size() for kind single" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function single_bit_size( sr)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "real( kind= single_k), intent( in) :: sr ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " single_bit_size = bit_size( 0) ! 1 single per default integer" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function single_bit_size" write( unit= pd_unit, fmt= *) ! if single real is not default kind else ! default single ! bit_size() for single real call write_bit_size( 'real', 'single') endif ! default single endif ! has single ! if has double real if( real_kinds( double_idx)% supported )then ! has double ! if single or double real is default kind if( real_kinds( single_idx)% default_kind .or. real_kinds( double_idx)% default_kind )then ! bit_size() for double real (default known) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_bit_size() bit_size() for kind double" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function double_bit_size( dr)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "real( kind= double_k), intent( in) :: dr ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) ! double is default if( real_kinds( double_idx)% default_kind )then ! default is double write( unit= pd_unit, fmt= fmtpr) & " double_bit_size = bit_size( 0) ! 1 double per default integer" ! single is default else ! single is default write( unit= pd_unit, fmt= fmtpr) & " double_bit_size = 2 * bit_size( 0) ! 1 double per 2 default integers" endif ! corresponds to double write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function double_bit_size" write( unit= pd_unit, fmt= *) ! single or double real is not the default kind else ! default single or double ! bit_size() for double real call write_bit_size( 'real', 'double') endif ! default single or double endif ! default double ! if has quad real if( real_kinds( quad_idx)% supported )then ! has quad ! if default is double or quad real if( real_kinds( double_idx)% default_kind .or. real_kinds( quad_idx)% default_kind )then ! bit_size() for quad real (default known) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_bit_size() bit_size() for kind quad" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function quad_bit_size( qr)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "real( kind= quad_k), intent( in) :: qr ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_bit_size() text" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) ! default is quad real if( real_kinds( quad_idx)% default_kind )then ! quad is default write( unit= pd_unit, fmt= fmtpr) & " quad_bit_size = bit_size( 0) ! 1 quad per default integer" ! default is double real else ! double is default write( unit= pd_unit, fmt= fmtpr) & " quad_bit_size = 2 * bit_size( 0) ! 1 quad per 2 default integers" endif ! default kind write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function quad_bit_size" write( unit= pd_unit, fmt= *) ! if default is not double or quad real else ! default double or quad ! bit_size() for quad real call write_bit_size( 'real', 'quad') endif ! default double or quad endif ! has quad ! has single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_bit_size() bit_size() for kind single_complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std .and. real_kinds( single_idx)% default_kind )then write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function single_complex_bit_size( sc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "complex( kind= single_k), intent( in) :: sc ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " single_complex_bit_size = 2 * single_bit_size( 0.0_single_k)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function single_complex_bit_size" write( unit= pd_unit, fmt= *) endif ! has single ! has double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_bit_size() bit_size() for kind double_complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std .and. & ( real_kinds( single_idx)% default_kind .or. real_kinds( double_idx)% default_kind) )then write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function double_complex_bit_size( dc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "complex( kind= double_k), intent( in) :: dc ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " double_complex_bit_size = 2 * double_bit_size( 0.0_double_k)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function double_complex_bit_size" write( unit= pd_unit, fmt= *) endif ! has double ! has quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_bit_size() bit_size() for kind quad_complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std .and. real_kinds( double_idx)% default_kind )then write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "integer function quad_complex_bit_size( qc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "complex( kind= quad_k), intent( in) :: qc ! selects specific bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " quad_complex_bit_size = 2 * quad_bit_size( 0.0_quad_k)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_bit_size()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function quad_complex_bit_size" write( unit= pd_unit, fmt= *) endif ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int() extend intrinsic int() to all logical kinds" write( unit= pd_unit, fmt= *) ! if defining logical kinds if( define_logicals )then ! has logicals ! has byte logical if( byte_logical% supported )then ! has l_byte write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_byte_int() int() for kind l_byte" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_byte_int( bl)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical( kind= l_byte_k), intent( in) :: bl" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_byte_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " true_or_false: select case( bl) ! t or f" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .true._l_byte_k) true_or_false ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_byte_int = 1 ! is 1" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .false._l_byte_k) true_or_false ! false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_byte_int = 0 ! is 0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " end select true_or_false ! t or f" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_byte_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_byte_int" write( unit= pd_unit, fmt= *) endif ! has l_byte ! has short logical if( short_logical% supported )then ! has l_short write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_short_int() int() for kind l_short" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_short_int( sl)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical( kind= l_short_k), intent( in) :: sl" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_short_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " true_or_false: select case( sl) ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .true._l_short_k) true_or_false ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_short_int = 1 ! is 1" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .false._l_short_k) true_or_false ! false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_short_int = 0 ! is 0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " end select true_or_false ! t or f" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_short_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_short_int" write( unit= pd_unit, fmt= *) endif ! has l_short ! has int logical if( int_logical% supported )then ! has l_int write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_int_int() int() for kind l_int" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_int_int( il)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical( kind= l_int_k), intent( in) :: il" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_int_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " true_or_false: select case( il) ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .true._l_int_k) true_or_false ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_int_int = 1 ! is 1" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .false._l_int_k) true_or_false ! false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_int_int = 0 ! is 0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " end select true_or_false ! t or f" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_int_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_int_int" write( unit= pd_unit, fmt= *) endif ! has l_int ! has long logical if( long_logical% supported )then ! has l_long write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_long_int() int() for kind l_long" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_long_int( ll)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical( kind= l_long_k), intent( in) :: ll" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_long_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " true_or_false: select case( ll) ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .true._l_long_k) true_or_false ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_long_int = 1 ! is 1" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " case( .false._l_long_k) true_or_false ! false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " l_long_int = 0 ! is 0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " end select true_or_false ! t or f" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_long_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_long_int" write( unit= pd_unit, fmt= *) endif ! has l_long ! if not defining logical make for default logical else ! has logicals write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_def_int() int() for kind l_def" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "integer function l_def_int( dl)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "logical, intent( in) :: dl" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_def_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " true_or_false: select case( dl) ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " case( .true.) true_or_false ! true" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_def_int = 1 ! is 1" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " case( .false.) true_or_false ! false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " l_def_int = 0 ! is 0" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " end select true_or_false ! t or f" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! l_def_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function l_def_int" write( unit= pd_unit, fmt= *) endif ! has logicals write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! logical() extend intrinsic logical() to all integer kinds" write( unit= pd_unit, fmt= *) ! has byte integer if( integer_kinds( byte_idx)% supported )then ! has byte write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! byte_logical() logical() for kind byte" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "logical function byte_logical( ib)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "integer( kind= byte_k), intent( in) :: ib" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! byte_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " byte_logical = ib /= 0_byte_k ! 0 is false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! byte_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function byte_logical" write( unit= pd_unit, fmt= *) endif ! has byte ! has short integer if( integer_kinds( short_idx)% supported )then ! has short write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! short_logical() logical() for kind short" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "logical function short_logical( is)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "integer( kind= short_k), intent( in) :: is" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! short_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " short_logical = is /= 0_short_k ! 0 is false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! short_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function short_logical" write( unit= pd_unit, fmt= *) endif ! has short ! has int integer if( integer_kinds( int_idx)% supported )then ! has int write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int_logical() logical() for kind int" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "logical function int_logical( ii)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "integer( kind= int_k), intent( in) :: ii" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " int_logical = ii /= 0_int_k ! 0 is false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! int_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function int_logical" write( unit= pd_unit, fmt= *) endif ! has int ! has long integer if( integer_kinds( long_idx)% supported )then ! has long write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! long_logical() logical() for kind long" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add elemental if f95 write( unit= pd_unit, fmt= fmtpr) "logical function long_logical( il)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "integer( kind= long_k), intent( in) :: il" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! long_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "continue ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " long_logical = il /= 0_long_k ! 0 is false" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & "return ! logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! long_logical()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function long_logical" write( unit= pd_unit, fmt= *) endif ! has long write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! These specific procedures extend huge() and tiny() to character (if" write( unit= pd_unit, fmt= fmtpr) "! defined) and complex kinds. The character huge() and tiny() return" write( unit= pd_unit, fmt= fmtpr) "! the characters with the largest and smallest character codes. The" write( unit= pd_unit, fmt= fmtpr) "! complex huge() and tiny() return the square root of their real" write( unit= pd_unit, fmt= fmtpr) "! counterparts. The choice of sqrts defines the range where magnitude" write( unit= pd_unit, fmt= fmtpr) "! comparisons are valid. [ |z| = sqrt( r^2 + i^2) ] So if two" write( unit= pd_unit, fmt= fmtpr) "! complex numbers have components within sqrt( real epsilon) of each" write( unit= pd_unit, fmt= fmtpr) "! other, they will compare with equal magnitude." write( unit= pd_unit, fmt= *) ! if defining character kinds if( define_characters )then ! wants character kinds write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! huge()/tiny() for character kinds" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The ascii huge and tiny return characters with the largest and" write( unit= pd_unit, fmt= fmtpr) "! smallest character codes." write( unit= pd_unit, fmt= *) ! has ascii character if( ascii_character% supported )then ! has ascii write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_huge() huge() for kind ascii" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "character( len= 1, kind= ascii_k) function ascii_huge( ac)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *, kind= ascii_k), intent( in) :: ac" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " ascii_huge = achar( 127) ! largest is del" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function ascii_huge" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_tiny() tiny() for kind ascii" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "character( len= 1, kind= ascii_k) function ascii_tiny( ac)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *, kind= ascii_k), intent( in) :: ac" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " ascii_tiny = achar( 0) ! smallest is nul" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ascii_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function ascii_tiny" write( unit= pd_unit, fmt= *) endif ! has ascii ! has ebcdic if( ebcdic_character% supported )then ! has ebcdic write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic_huge() huge() for kind ebcdic" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "character( len= 1, kind= ebcdic_k) function ebcdic_huge( ic)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *, kind= ebcdic_k), intent( in) :: ic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " ebcdic_huge = char( 255, kind= ebcdic_k) ! largest is 255" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function ebcdic_huge" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic_tiny() tiny() for kind ebcdic" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "character( len= 1, kind= ebcdic_k) function ebcdic_tiny( ic)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *, kind= ebcdic_k), intent( in) :: ic" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " ebcdic_tiny = char( 0, kind= ebcdic_k) ! smallest is zero" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! ebcdic_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function ebcdic_tiny" write( unit= pd_unit, fmt= *) endif ! has ebcdic ! has iso_10646 if( iso_10646_character% supported )then ! has iso_10646 write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646_huge() huge() for kind iso_10646" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "character( len= 1, kind= iso_10646_k) function iso_10646_huge( uc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *, kind= iso_10646_k), intent( in) :: uc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " iso_10646_huge = char( huge( 0), kind= iso_10646_k) ! largest is huge( 0)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function iso_10646_huge" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646_tiny() tiny() for kind iso_10646" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "character( len= 1, kind= iso_10646_k) function iso_10646_tiny( uc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "character( len= *, kind= iso_10646_k), intent( in) :: uc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) & " iso_10646_tiny = char( 0, kind= iso_10646_k) ! smallest is zero" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! iso_10646_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function iso_10646_tiny" write( unit= pd_unit, fmt= *) endif ! has iso_10646 endif ! wants character kinds write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! These specific procedures extend huge() to type complex. huge()" write( unit= pd_unit, fmt= fmtpr) "! returns the square root of its real counterpart. The sqrt is returned" write( unit= pd_unit, fmt= fmtpr) "! so magnitude comparisons may be made [ sqrt( x^2 + y^2) = |z| < huge()" write( unit= pd_unit, fmt= fmtpr) "! or sqrt( x^2 + y^2) = |z| > tiny() ]" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! huge() for complex kinds" write( unit= pd_unit, fmt= *) ! has single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_huge() huge() for kind single complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= single_k) function single_complex_huge( sc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= single_k), intent( in) :: sc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " single_complex_huge = sqrt( huge( real( sc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function single_complex_huge" write( unit= pd_unit, fmt= *) endif ! has single ! has double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_huge() huge() for kind double complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= double_k) function double_complex_huge( dc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= double_k), intent( in) :: dc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " double_complex_huge = sqrt( huge( real( dc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function double_complex_huge" write( unit= pd_unit, fmt= *) endif ! has double ! has quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_huge() huge() for kind quad complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= quad_k) function quad_complex_huge( qc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= quad_k), intent( in) :: qc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " quad_complex_huge = sqrt( huge( real( qc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_huge()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function quad_complex_huge" write( unit= pd_unit, fmt= *) endif ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! These specific procedures extend tiny() to type complex. tiny()" write( unit= pd_unit, fmt= fmtpr) "! returns the square root of its real counterpart." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! tiny() for complex kinds" write( unit= pd_unit, fmt= *) ! has single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_tiny() tiny() for kind single complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= single_k) function single_complex_tiny( sc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= single_k), intent( in) :: sc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " single_complex_tiny = sqrt( tiny( real( sc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function single_complex_tiny" write( unit= pd_unit, fmt= *) endif ! has single ! has double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_tiny() tiny() for kind double complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= double_k) function double_complex_tiny( dc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= double_k), intent( in) :: dc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " double_complex_tiny = sqrt( tiny( real( dc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function double_complex_tiny" write( unit= pd_unit, fmt= *) endif ! has double ! has quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_tiny() tiny() for kind quad complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= quad_k) function quad_complex_tiny( qc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= quad_k), intent( in) :: qc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " quad_complex_tiny = sqrt( tiny( real( qc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_tiny()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function quad_complex_tiny" write( unit= pd_unit, fmt= *) endif ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! These specific procedures extend epsilon() to type complex. epsilon()" write( unit= pd_unit, fmt= fmtpr) "! returns the square root of its real counterpart. The magnitude of" write( unit= pd_unit, fmt= fmtpr) "! two complex numbers differ if the numbers differ by more than epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! epsilon() for complex kinds" write( unit= pd_unit, fmt= *) ! has single complex if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_epsilon() epsilon() for kind single complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= single_k) function single_complex_epsilon( sc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= single_k), intent( in) :: sc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " single_complex_epsilon = sqrt( epsilon( abs( sc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_complex_epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function single_complex_epsilon" write( unit= pd_unit, fmt= *) endif ! has single ! has double complex if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_epsilon() epsilon() for kind double complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= double_k) function double_complex_epsilon( dc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= double_k), intent( in) :: dc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " double_complex_epsilon = sqrt( epsilon( abs( dc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_complex_epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function double_complex_epsilon" write( unit= pd_unit, fmt= *) endif ! has double ! has quad complex if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_epsilon() epsilon() for kind quad complex" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= quad_k) function quad_complex_epsilon( qc)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "complex( kind= quad_k), intent( in) :: qc" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " quad_complex_epsilon = sqrt( epsilon( abs( qc)) )" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_complex_epsilon()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function quad_complex_epsilon" write( unit= pd_unit, fmt= *) endif ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! These specific procedures compute the largest integer" write( unit= pd_unit, fmt= fmtpr) "! which may be stored exactly in a real kind." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! max_exact_int() for real kinds" write( unit= pd_unit, fmt= *) ! has single real if( real_kinds( single_idx)% supported )then ! has single write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_max_exact_int() max_exact_int() for kind single real" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= single_k) function single_max_exact_int( sr)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "real( kind= single_k), intent( in) :: sr" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " single_max_exact_int = nearest( real( radix( sr), kind= single_k) &" write( unit= pd_unit, fmt= fmtpr) " ** real( digits( sr), kind= single_k), -1.0_single_k)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! single_max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function single_max_exact_int" write( unit= pd_unit, fmt= *) endif ! has single ! has double real if( real_kinds( double_idx)% supported )then ! has double write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_max_exact_int() max_exact_int() for kind double real" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= double_k) function double_max_exact_int( dr)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "real( kind= double_k), intent( in) :: dr" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " double_max_exact_int = nearest( real( radix( dr), kind= double_k) &" write( unit= pd_unit, fmt= fmtpr) " ** real( digits( dr), kind= double_k), -1.0_double_k)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! double_max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function double_max_exact_int" write( unit= pd_unit, fmt= *) endif ! has double ! has quad real if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_max_exact_int() epsilon() for kind quad real" write( unit= pd_unit, fmt= *) ! standards before f95 don't support elemental if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "elemental " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "real( kind= quad_k) function quad_max_exact_int( qr)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "real( kind= quad_k), intent( in) :: qr" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " quad_max_exact_int = nearest( real( radix( qr), kind= quad_k) &" write( unit= pd_unit, fmt= fmtpr) " ** real( digits( qr), kind= quad_k), -1.0_quad_k)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! quad_max_exact_int()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function quad_max_exact_int" write( unit= pd_unit, fmt= *) endif ! has quad ! these are part of iso_fortran_env starting with f03 if( standard < f03_std )then write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! The following functions detect the conditions indicated according" write( unit= pd_unit, fmt= fmtpr) "! to rules specified by the Fortran standard. The iostat return" write( unit= pd_unit, fmt= fmtpr) "! value is required to be an error code, an end code, or a success code." write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_eof(), is_iostat_eor() detect standard conditions" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_end() true if iostat indicates error" write( unit= pd_unit, fmt= *) ! standards before f95 don't support pure if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "pure " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "logical function is_iostat_end( iostat)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "integer, intent( in) :: iostat" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_end()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! is_iostat_end()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " is_iostat_end = any( (/ iostat_end /) == iostat) ! eof condition" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! is_iostat_end()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_end()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function is_iostat_end" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_eor() true if iostat indicates error" write( unit= pd_unit, fmt= *) ! standards before f95 don't support pure if( standard >= f95_std )then ! add pure if f95 write( unit= pd_unit, fmt= fmtpr, advance= 'NO') "pure " endif ! add pure if f95 write( unit= pd_unit, fmt= fmtpr) "logical function is_iostat_eor( iostat)" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "integer, intent( in) :: iostat" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_eor()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "continue ! is_iostat_eor()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) " is_iostat_eor = any( (/ iostat_eor /) == iostat) ! eor condition" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "return ! is_iostat_eor()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! is_iostat_eor()" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end function is_iostat_eor" write( unit= pd_unit, fmt= *) endif write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! processor_dependencies" write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $" write( unit= pd_unit, fmt= fmtpr) star_banner write( unit= pd_unit, fmt= *) write( unit= pd_unit, fmt= fmtpr) "end module processor_dependencies ! eof" ! end of stdtype.f90 close( unit= pd_unit, iostat= istat, status= 'KEEP') close_error: if( istat > 0 )then ! error closing stdtype.f90 write( unit= log_unit, fmt= fmtpr) 'trouble closing ' // trim( pdname) endif close_error ! error closing stdtype.f90 return ! write_processor_dependencies() ! write_processor_dependencies() end subroutine write_processor_dependencies ! ********************************************************************** ! write_processor_model() writes prototype program_model subroutine write_processor_model( istat) ! ********************************************************************** ! write_processor_model() interface integer, intent( out) :: istat ! status ! ********************************************************************** ! write_processor_model() text continue ! write_processor_model() ! write a new processor_model open( unit= pm_unit, file= pmname, iostat= istat, action= 'WRITE', status= 'REPLACE') open_error: if( istat > 0 )then ! can't open pm.f90 write( unit= log_unit, fmt= fmtpr) cant_open // trim( pmname) return ! write_processor_model() endif open_error ! can't open pm.f90 ! write pm.f90 write( unit= pm_unit, fmt= fmtpr) "! bof" write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! Fortran 95 program processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! Source Control Strings" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! Copyright 2004 Purple Sage Computing Solutions, Inc." write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! Summary of License" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! This program is free software; you can redistribute it and/or modify" write( unit= pm_unit, fmt= fmtpr) "! it under the terms of the GNU General Public License as published by" write( unit= pm_unit, fmt= fmtpr) "! the Free Software Foundation; either version 2 of the License, or" write( unit= pm_unit, fmt= fmtpr) "! (at your option) any later version." write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! This program is distributed in the hope that it will be useful," write( unit= pm_unit, fmt= fmtpr) "! but WITHOUT ANY WARRANTY; without even the implied warranty of" write( unit= pm_unit, fmt= fmtpr) "! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" write( unit= pm_unit, fmt= fmtpr) "! GNU General Public License for more details." write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! You should have received a copy of the GNU General Public License" write( unit= pm_unit, fmt= fmtpr) "! along with this program; if not, write to the Free Software" write( unit= pm_unit, fmt= fmtpr) "! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA." write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! To report bugs, suggest enhancements, etc. to the Authors," write( unit= pm_unit, fmt= fmtpr) "! Contact:" write( unit= pm_unit, fmt= fmtpr) "! Purple Sage Computing Solutions, Inc." write( unit= pm_unit, fmt= fmtpr) "! send email to dnagle@erols.com" write( unit= pm_unit, fmt= fmtpr) "! or fax to 703 471 0684 (USA)" write( unit= pm_unit, fmt= fmtpr) "! or mail to 12142 Purple Sage Ct." write( unit= pm_unit, fmt= fmtpr) "! Reston, VA 20194-5621 USA" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! prints a description of the processor model to output_unit" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! use processor_dependencies" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model uses" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_dependencies describes the processor" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model reads" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! none" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model writes" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! output_unit all output" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model library" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! none" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "program processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! use standard kind definitions, &c" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "use processor_dependencies" if( standard >= f03_std )then write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "use, intrinsic :: iso_fortran_env" endif write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= fmtpr) "! declare all variables" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "implicit none" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model RCS strings" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! program source filename supplied by RCS" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "character (len= *), parameter :: processor_model_rcs_id = &" write( unit= pm_unit, fmt= fmtpr) " '$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "character( len= *), parameter :: &" write( unit= pm_unit, fmt= fmtpr) " processor_model_timestamp = " // "'" // trim( timestamp) // "'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model data" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! date_and_time() character buffers" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " character( len= 8) :: dbuff" write( unit= pm_unit, fmt= fmtpr) " character( len= 10) :: tbuff" write( unit= pm_unit, fmt= fmtpr) " character( len= 5) :: zbuff" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! date_and_time() values array" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " integer, dimension( 8) :: val" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! system_clock() arguments" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " integer :: im, ir, ic" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! cpu_time() argument" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " real :: ct" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! random_number() seed array" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " integer, dimension( random_seed_size) :: iseed" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! logical true and false" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " logical, parameter :: ltrue = .true." write( unit= pm_unit, fmt= fmtpr) " logical, parameter :: lfalse = .false." write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! integer true and false" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " integer :: itrue, ifalse" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model text" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "continue ! processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! banner" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Processor Model'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! version control" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Version Control'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report processor_model version strings" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor_model ', processor_model_rcs_id" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'timestamp ', processor_model_timestamp" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report compiler version strings" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'compiler_version ', compiler_version" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'compiler_serial ', compiler_serial" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'os_version ', os_version" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'standard_version ', standard_version" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report processor_dependencies version strings" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor_dependencies ', processor_dependencies_rcs_id" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! detect mismatch between processor_dependencies and processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( processor_dependencies_rcs_id /= processor_model_rcs_id )then" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor_dependencies - processor_model mismatch'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! detect mismatch between processor_dependencies and processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( processor_depends_timestamp /= processor_model_timestamp )then" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor_dependencies - processor_model mismatch'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor dependent parameters" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Processor Memory Parameters'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'size of a numeric storage unit', numeric_storage_size" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'size of a character storage unit', character_storage_size" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'size of a file storage unit', file_storage_size" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( is_big_endian ) write( unit= *, fmt= *) 'big endian'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( is_little_endian ) write( unit= *, fmt= *) 'little endian'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Processor Software Parameters'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) select case( standard) case( f90_std) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor supports Fortran 90 Standard'" case( f95_std) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor supports Fortran 95 Standard'" case( f03_std) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor supports Fortran 2003 Standard'" end select write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) & " if( has_varying_strings ) write( unit= *, fmt= *) 'processor supports iso_varying_string'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Processor Input/Output Parameters'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'preconnected input unit', input_unit" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'preconnected output unit', output_unit" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( output_unit == error_unit )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no preconnected error unit'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'preconnected error unit', error_unit" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'default filename ', default_filename" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( opt_plus_sign )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'writes optional plus sign'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'does not write optional plus sign'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( leading_zero_f )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'writes leading zero using f format'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'does not write leading zero using f format'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( leading_zero_e )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'writes leading zero using e format'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'does not write leading zero using f format'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'smallest decimal exponemt with list-directed f format', ld_fmt_fmin" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'largest deciaml exponent with list-directed f format', ld_fmt_fmax" write( unit= pm_unit, fmt= fmtpr) " if( ld_fmt_comma )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'writes comma using list directed format'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'does not write comma using list directed format'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpri) " write( unit= *, fmt= *) 'end of record iostat',", eor_flag write( unit= pm_unit, fmt= fmtpri) " write( unit= *, fmt= *) 'end of file iostat',", eof_flag write( unit= pm_unit, fmt= fmtpri) " write( unit= *, fmt= *) 'direct access read undefined record iostat',", da_missing write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'size of a file storage unit', file_storage_size" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'maximum record length', max_recl" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Miscelleanous Processor Dependent Parameters'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'random seed size', random_seed_size" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call random_seed( get= iseed)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'initial random seed', iseed" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " itrue = transfer( ltrue, itrue)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'integer value of true', itrue" write( unit= pm_unit, fmt= fmtpr) " ifalse = transfer( lfalse, ifalse)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'integer value of false', ifalse" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( is_ieee_fp )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'fp uses ieee 754 format'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'fp uses non-ieee format'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( is_2s_comp )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'integers are twos complement'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'integers are not twos complement'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Processor Clock'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call system_clock( ic, ir, im)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( ic == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'processor has no clock'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'clock rate', ir" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'clock max', im" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call date_and_time( date= dbuff)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( dbuff == ' ' )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'date not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'date ', dbuff" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call date_and_time( time= tbuff)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( tbuff == ' ' )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'time not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'time ', tbuff" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call date_and_time( zone= zbuff)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( zbuff == ' ' )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'zone not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'zone ', zbuff" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call date_and_time( values= val)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 1) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value year not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value year', val( 1)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 2) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value month not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value month', val( 2)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 3) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value day not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value day', val( 3)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 4) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value utc not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value utc', val( 4)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 5) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value hour not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value hour', val( 5)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 6) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value minute not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value minute', val( 6)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 7) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value second not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value second', val( 7)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( val( 8) == -huge( 0) )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value msec not available'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'value msec', val( 8)" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " call cpu_time( ct)" write( unit= pm_unit, fmt= fmtpr) " if( ct >= 0.0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'has cpu time'" write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no cpu time'" write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report kinds summary" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Kinds Summary'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) if( define_characters )then ! wants character kinds write( unit= pm_unit, fmt= fmtpri) & " write( unit= *, fmt= *) 'character kinds ',", count( (/ ascii_character% supported, & ebcdic_character% supported, iso_10646_character% supported /) ) endif ! wants character kinds write( unit= pm_unit, fmt= fmtpri) & " write( unit= *, fmt= *) 'integer kinds ',", count( integer_kinds% supported ) if( define_logicals )then ! wants logical kinds write( unit= pm_unit, fmt= fmtpri) & " write( unit= *, fmt= *) 'logical kinds ',", count( (/ byte_logical% supported, short_logical% supported, & int_logical% supported, long_logical% supported /) ) endif ! wants logical kinds write( unit= pm_unit, fmt= fmtpri) & " write( unit= *, fmt= *) 'real kinds ',", count( real_kinds% supported ) write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'default character ', kind( ' ')" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'default integer ', kind( 0)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'default logical ', kind( .true.)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'default real ', kind( 0.0)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) if( define_characters )then ! wants character kinds write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report character kinds" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Character Kinds'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( ascii_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'ascii character'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', ascii_k" if( ascii_character% supported )then ! has ascii write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter ascii_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( ascii_k_' ')" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge', ichar( huge( ascii_k_' ') )" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'tiny', ichar( tiny( ascii_k_' ') )" endif ! has ascii write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no ascii character'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( ebcdic_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'ebcdic character'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', ebcdic_k" if( ebcdic_character% supported )then ! has ebcdic write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter ebcdic_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( ebcdic_k_' ')" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge', ichar( huge( ebcdic_k_' ') )" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'tiny', ichar( tiny( ebcdic_k_' ') )" endif ! has ebcdic write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no ebcdic character'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( iso_10646_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'iso_10646 character'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', iso_10646_k" if( iso_10646_character% supported )then ! has iso_10646 write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter iso_10646_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( iso_10646_k_' ')" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge', ichar( huge( iso_10646_k_' ') )" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'tiny', ichar( tiny( iso_10646_k_' ') )" endif ! has iso_10646 write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no iso_10646 character'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) endif ! wants character kinds write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report integer kinds" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Integer Kinds'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( byte_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'byte integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', byte_k" if( integer_kinds( byte_idx)% supported )then ! has byte write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter byte_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 0_byte_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 0_byte_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 0_byte_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 0_byte_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 0_byte_k)" write( unit= pm_unit, fmt= *) endif ! has byte write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no byte integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( short_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'short integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', short_k" if( integer_kinds( short_idx)% supported )then ! has short write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter short_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 0_short_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 0_short_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 0_short_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 0_short_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 0_short_k)" write( unit= pm_unit, fmt= *) endif ! has short write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no short integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( int_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'int integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', int_k" if( integer_kinds( int_idx)% supported )then ! has int write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter int_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 0_int_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 0_int_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 0_int_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 0_int_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 0_int_k)" write( unit= pm_unit, fmt= *) endif ! has int write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no int integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( long_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'long integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', long_k" if( integer_kinds( long_idx)% supported )then ! has long write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter long_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 0_long_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 0_long_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 0_long_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 0_long_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 0_long_k)" write( unit= pm_unit, fmt= *) endif ! has long write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no long integer'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) if( define_logicals )then ! wants logical kinds write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report logical kinds" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Logical Kinds'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( l_byte_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'byte logical'" write( unit= pm_unit, fmt= *) if( byte_logical% supported )then ! has byte logical write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', l_byte_k" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter l_byte_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_byte_k)" write( unit= pm_unit, fmt= *) endif ! has byte logical write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no byte logical'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( l_short_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'short logical'" write( unit= pm_unit, fmt= *) if( short_logical% supported )then ! has short logical write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', l_short_k" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter l_short_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_short_k)" write( unit= pm_unit, fmt= *) endif ! has short logical write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no short logical'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( l_int_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'int logical'" write( unit= pm_unit, fmt= *) if( int_logical% supported )then ! has int logical write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', l_int_k" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter l_int_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_int_k)" write( unit= pm_unit, fmt= *) endif ! has int logical write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no int logical'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( l_long_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'long logical'" write( unit= pm_unit, fmt= *) if( long_logical% supported )then ! has long logical write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', l_long_k" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter l_long_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_long_k)" write( unit= pm_unit, fmt= *) endif ! has long logical write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no long logical'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) endif ! wants logical kinds write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report real kinds" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Real Kinds'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( single_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'single real'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', single_k" if( real_kinds( single_idx)% supported )then ! has single write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter single_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'tiny ', tiny( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'exponent ', exponent( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'fraction ', fraction( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'precision ', precision( 1.0_single_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'nearest ', nearest( 1.0_single_k, 2.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_single_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'spacing ', spacing( 1.0_single_k)" endif ! has single write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no single real'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( double_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'double real'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', double_k" if( real_kinds( double_idx)% supported )then ! has double write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter double_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'tiny ', tiny( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'exponent ', exponent( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'fraction ', fraction( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'precision ', precision( 1.0_double_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'nearest ', nearest( 1.0_double_k, 2.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_double_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'spacing ', spacing( 1.0_double_k)" endif ! has double write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no double real'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( quad_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'quad real'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', quad_k" if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter quad_k'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'huge ', huge( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'tiny ', tiny( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'range ', range( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'digits ', digits( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'radix ', radix( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'exponent ', exponent( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'fraction ', fraction( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'precision ', precision( 1.0_quad_k)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'nearest ', nearest( 1.0_quad_k, 2.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_quad_k)" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'spacing ', spacing( 1.0_quad_k)" endif ! has quad write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no quad real'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! report complex kinds" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'Complex Kinds'" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *)" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( single_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'single complex'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', single_k" if( real_kinds( single_idx)% supported )then ! has single write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter single_k'" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= single_k) )" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= single_k) )" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= single_k) )" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= single_k) )" endif ! has single write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no single complex'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( double_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'double complex'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', double_k" if( real_kinds( double_idx)% supported )then ! has double write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter double_k'" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= double_k) )" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= double_k) )" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= double_k) )" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= double_k) )" endif ! has double write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no double complex'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " if( quad_k > 0 )then" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'quad complex'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'kind ', quad_k" if( real_kinds( quad_idx)% supported )then ! has quad write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'parameter quad_k'" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= quad_k) )" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= quad_k) )" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= quad_k) )" write( unit= pm_unit, fmt= fmtpr) & " write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= quad_k) )" endif ! has quad write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " else" write( unit= pm_unit, fmt= fmtpr) " write( unit= *, fmt= *) 'no quad complex'" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) write_ln write( unit= pm_unit, fmt= fmtpr) " endif" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "stop 'processor_model' ! processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! processor_model" write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $" write( unit= pm_unit, fmt= fmtpr) star_banner write( unit= pm_unit, fmt= *) write( unit= pm_unit, fmt= fmtpr) "end program processor_model ! eof" ! write pm.f90 close( unit= pm_unit, iostat= istat, status= 'KEEP') close_error: if( istat > 0 )then ! error closing pm.f90 write( unit= log_unit, fmt= fmtpr) 'trouble closing ' // trim( pmname) endif close_error ! error closing pm.f90 return ! write_processor_model() ! write_processor_model() end subroutine write_processor_model ! ********************************************************************** ! make_processor_model ! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ ! ********************************************************************** end program make_processor_model ! eof Day-III/06-coco/make_pm.in100777 0 0 202 11660472300 10402 0&files incname="coco.inc" / &sw stderr = 0, com_vers = "gfortran 4.6", com_sern = "GPL", os_vers = "Mac OS X 10.7" / Day-III/06-coco/make_pm.log100777 0 0 14637 11660472364 10650 0make_processor_model $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ timestamp: 20111115 091932.178 reading make_pm.in &FILES PDNAME="procdep.f90 ", PMNAME="pm.f90 ", INCNAME="coco.inc ", / &HW IEEEFP=T, TWOSCOMP=T, BYTESIZE= 0, WORDSIZE= 0, / &SW STDIN= 5, STDOUT= 6, STDERR= 0, STD="f95", COM_VERS="gfortran 4.6 ", COM_SERN="GPL ", OS_VERS="Mac OS X 10.7 ", / &KINDS ASCII= 1, EBCDIC= -1, ISO_10646= -1, STRINGS=F, LOGEQINT=T, LOGBYTE= -1, LOGSHORT= -1, LOGINT= -1, LOGLONG= -1, / &FLOAT AUTOREAL=T, SP= 6, SR= 37, DP= 15, DR= 307, QP= 33, QR= 4931, / &FIXED AUTOINT=T, BD= 2, SD= 4, ID= 9, LD= 18, / read make_pm.in ok processor supports Fortran 95 standard include file for coco processor does not support iso_varying_strings smallest integer size is same as character storage unit size integer appears to be two's compliment integer format byte addressable size of storage units is a power of two real appears to be an IEEE 754 real single format number of integer kinds found: 5 found integer kind: 1 supporting digits: 2 estimated bit size: 8 found integer kind: 2 supporting digits: 4 estimated bit size: 16 found integer kind: 4 supporting digits: 9 estimated bit size: 32 found integer kind: 8 supporting digits: 18 estimated bit size: 64 found integer kind: 16 supporting digits: 38 estimated bit size: 128 assigned integer kinds: byte short int long default integer kind: int WARNING: default integer kind not unique! number of real kinds found: 4 found real kind: 4 supporting precision: 6 supporting range: 37 estimated bit size: 32 found real kind: 8 supporting precision: 15 supporting range: 307 estimated bit size: 64 WARNING: estimated real size not nearly a power of 2 found real kind: 10 supporting precision: 18 supporting range: 4931 estimated bit size: 78 found real kind: 16 supporting precision: 33 supporting range: 4931 estimated bit size: 128 NOTE: range does not increase with increasing precision kind values: 10 16 ranges: 4931 4931 WARNING: estimated real size not nearly a power of 2 assigned real kinds: single double quad default real kind: single double precision kind: double default integer kind same value as default real kind defined character kinds: ascii default character kind: ascii defined logical kinds: byte short int long default logical kind: int default integer kind same value as default logical kind WARNING: missing direct access record is not the same beyond last record read unwritten record iostat 0 read beyond last record iostat 5002 writing coco.inc wrote coco.inc ok writing procdep.f90 wrote procdep.f90 ok writing pm.f90 wrote pm.f90 ok timestamp: 20111115 091932.227 Day-III/06-coco/next.f90100777 0 0 163 11666506304 7755 0!?>?? logical :: doit = .true. !?>?? if( doit )then !?>?? text :: what !?>?? else !?>?? end text what !?>?? end if Day-III/06-coco/pm.f90100777 0 0 57315 11660472364 7470 0! bof ! ********************************************************************** ! Fortran 95 program processor_model ! ********************************************************************** ! Source Control Strings ! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ ! ********************************************************************** ! Copyright 2004 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! Summary of License ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! prints a description of the processor model to output_unit ! ********************************************************************** ! use processor_dependencies ! ********************************************************************** ! processor_model uses ! processor_dependencies describes the processor ! processor_model reads ! none ! processor_model writes ! output_unit all output ! processor_model library ! none ! ********************************************************************** ! processor model ! ********************************************************************** program processor_model ! ********************************************************************** ! use standard kind definitions, &c use processor_dependencies ! ********************************************************************** ! declare all variables implicit none ! ********************************************************************** ! processor_model RCS strings ! ********************************************************************** ! program source filename supplied by RCS character (len= *), parameter :: processor_model_rcs_id = & '$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $' ! ********************************************************************** character( len= *), parameter :: & processor_model_timestamp = '20111115 091932.178' ! ********************************************************************** ! processor_model data ! ********************************************************************** ! date_and_time() character buffers character( len= 8) :: dbuff character( len= 10) :: tbuff character( len= 5) :: zbuff ! date_and_time() values array integer, dimension( 8) :: val ! system_clock() arguments integer :: im, ir, ic ! cpu_time() argument real :: ct ! random_number() seed array integer, dimension( random_seed_size) :: iseed ! logical true and false logical, parameter :: ltrue = .true. logical, parameter :: lfalse = .false. ! integer true and false integer :: itrue, ifalse ! ********************************************************************** ! processor_model text continue ! processor_model ! ********************************************************************** ! banner write( unit= *, fmt= *) write( unit= *, fmt= *) 'Processor Model' write( unit= *, fmt= *) ! ********************************************************************** ! version control write( unit= *, fmt= *) 'Version Control' write( unit= *, fmt= *) ! report processor_model version strings write( unit= *, fmt= *) 'processor_model ', processor_model_rcs_id write( unit= *, fmt= *) write( unit= *, fmt= *) 'timestamp ', processor_model_timestamp write( unit= *, fmt= *) ! report compiler version strings write( unit= *, fmt= *) 'compiler_version ', compiler_version write( unit= *, fmt= *) 'compiler_serial ', compiler_serial write( unit= *, fmt= *) 'os_version ', os_version write( unit= *, fmt= *) 'standard_version ', standard_version write( unit= *, fmt= *) ! report processor_dependencies version strings write( unit= *, fmt= *) 'processor_dependencies ', processor_dependencies_rcs_id write( unit= *, fmt= *) ! ********************************************************************** ! detect mismatch between processor_dependencies and processor_model if( processor_dependencies_rcs_id /= processor_model_rcs_id )then write( unit= *, fmt= *) 'processor_dependencies - processor_model mismatch' write( unit= *, fmt= *) endif ! detect mismatch between processor_dependencies and processor_model if( processor_depends_timestamp /= processor_model_timestamp )then write( unit= *, fmt= *) 'processor_dependencies - processor_model mismatch' write( unit= *, fmt= *) endif ! ********************************************************************** ! processor dependent parameters write( unit= *, fmt= *) 'Processor Memory Parameters' write( unit= *, fmt= *) write( unit= *, fmt= *) 'size of a numeric storage unit', numeric_storage_size write( unit= *, fmt= *) 'size of a character storage unit', character_storage_size write( unit= *, fmt= *) 'size of a file storage unit', file_storage_size if( is_big_endian ) write( unit= *, fmt= *) 'big endian' if( is_little_endian ) write( unit= *, fmt= *) 'little endian' write( unit= *, fmt= *) write( unit= *, fmt= *) 'Processor Software Parameters' write( unit= *, fmt= *) write( unit= *, fmt= *) 'processor supports Fortran 95 Standard' if( has_varying_strings ) write( unit= *, fmt= *) 'processor supports iso_varying_string' write( unit= *, fmt= *) write( unit= *, fmt= *) 'Processor Input/Output Parameters' write( unit= *, fmt= *) write( unit= *, fmt= *) 'preconnected input unit', input_unit write( unit= *, fmt= *) 'preconnected output unit', output_unit if( output_unit == error_unit )then write( unit= *, fmt= *) 'no preconnected error unit' else write( unit= *, fmt= *) 'preconnected error unit', error_unit endif write( unit= *, fmt= *) 'default filename ', default_filename if( opt_plus_sign )then write( unit= *, fmt= *) 'writes optional plus sign' else write( unit= *, fmt= *) 'does not write optional plus sign' endif if( leading_zero_f )then write( unit= *, fmt= *) 'writes leading zero using f format' else write( unit= *, fmt= *) 'does not write leading zero using f format' endif if( leading_zero_e )then write( unit= *, fmt= *) 'writes leading zero using e format' else write( unit= *, fmt= *) 'does not write leading zero using f format' endif write( unit= *, fmt= *) 'smallest decimal exponemt with list-directed f format', ld_fmt_fmin write( unit= *, fmt= *) 'largest deciaml exponent with list-directed f format', ld_fmt_fmax if( ld_fmt_comma )then write( unit= *, fmt= *) 'writes comma using list directed format' else write( unit= *, fmt= *) 'does not write comma using list directed format' endif write( unit= *, fmt= *) 'end of record iostat', -2 write( unit= *, fmt= *) 'end of file iostat', -1 write( unit= *, fmt= *) 'direct access read undefined record iostat', 5002 write( unit= *, fmt= *) 'size of a file storage unit', file_storage_size write( unit= *, fmt= *) 'maximum record length', max_recl write( unit= *, fmt= *) write( unit= *, fmt= *) 'Miscelleanous Processor Dependent Parameters' write( unit= *, fmt= *) write( unit= *, fmt= *) 'random seed size', random_seed_size call random_seed( get= iseed) write( unit= *, fmt= *) 'initial random seed', iseed itrue = transfer( ltrue, itrue) write( unit= *, fmt= *) 'integer value of true', itrue ifalse = transfer( lfalse, ifalse) write( unit= *, fmt= *) 'integer value of false', ifalse if( is_ieee_fp )then write( unit= *, fmt= *) 'fp uses ieee 754 format' else write( unit= *, fmt= *) 'fp uses non-ieee format' endif if( is_2s_comp )then write( unit= *, fmt= *) 'integers are twos complement' else write( unit= *, fmt= *) 'integers are not twos complement' endif write( unit= *, fmt= *) write( unit= *, fmt= *) 'Processor Clock' write( unit= *, fmt= *) call system_clock( ic, ir, im) if( ic == -huge( 0) )then write( unit= *, fmt= *) 'processor has no clock' else write( unit= *, fmt= *) 'clock rate', ir write( unit= *, fmt= *) 'clock max', im endif call date_and_time( date= dbuff) if( dbuff == ' ' )then write( unit= *, fmt= *) 'date not available' else write( unit= *, fmt= *) 'date ', dbuff endif call date_and_time( time= tbuff) if( tbuff == ' ' )then write( unit= *, fmt= *) 'time not available' else write( unit= *, fmt= *) 'time ', tbuff endif call date_and_time( zone= zbuff) if( zbuff == ' ' )then write( unit= *, fmt= *) 'zone not available' else write( unit= *, fmt= *) 'zone ', zbuff endif call date_and_time( values= val) if( val( 1) == -huge( 0) )then write( unit= *, fmt= *) 'value year not available' else write( unit= *, fmt= *) 'value year', val( 1) endif if( val( 2) == -huge( 0) )then write( unit= *, fmt= *) 'value month not available' else write( unit= *, fmt= *) 'value month', val( 2) endif if( val( 3) == -huge( 0) )then write( unit= *, fmt= *) 'value day not available' else write( unit= *, fmt= *) 'value day', val( 3) endif if( val( 4) == -huge( 0) )then write( unit= *, fmt= *) 'value utc not available' else write( unit= *, fmt= *) 'value utc', val( 4) endif if( val( 5) == -huge( 0) )then write( unit= *, fmt= *) 'value hour not available' else write( unit= *, fmt= *) 'value hour', val( 5) endif if( val( 6) == -huge( 0) )then write( unit= *, fmt= *) 'value minute not available' else write( unit= *, fmt= *) 'value minute', val( 6) endif if( val( 7) == -huge( 0) )then write( unit= *, fmt= *) 'value second not available' else write( unit= *, fmt= *) 'value second', val( 7) endif if( val( 8) == -huge( 0) )then write( unit= *, fmt= *) 'value msec not available' else write( unit= *, fmt= *) 'value msec', val( 8) endif call cpu_time( ct) if( ct >= 0.0 )then write( unit= *, fmt= *) 'has cpu time' else write( unit= *, fmt= *) 'no cpu time' endif write( unit= *, fmt= *) ! ********************************************************************** ! report kinds summary write( unit= *, fmt= *) 'Kinds Summary' write( unit= *, fmt= *) write( unit= *, fmt= *) 'character kinds ', 1 write( unit= *, fmt= *) 'integer kinds ', 5 write( unit= *, fmt= *) 'logical kinds ', 4 write( unit= *, fmt= *) 'real kinds ', 4 write( unit= *, fmt= *) write( unit= *, fmt= *) 'default character ', kind( ' ') write( unit= *, fmt= *) 'default integer ', kind( 0) write( unit= *, fmt= *) 'default logical ', kind( .true.) write( unit= *, fmt= *) 'default real ', kind( 0.0) write( unit= *, fmt= *) ! ********************************************************************** ! report character kinds write( unit= *, fmt= *) 'Character Kinds' write( unit= *, fmt= *) if( ascii_k > 0 )then write( unit= *, fmt= *) 'ascii character' write( unit= *, fmt= *) 'kind ', ascii_k write( unit= *, fmt= *) 'parameter ascii_k' write( unit= *, fmt= *) 'bit_size ', bit_size( ascii_k_' ') write( unit= *, fmt= *) 'huge', ichar( huge( ascii_k_' ') ) write( unit= *, fmt= *) 'tiny', ichar( tiny( ascii_k_' ') ) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no ascii character' write( unit= *, fmt= *) endif if( ebcdic_k > 0 )then write( unit= *, fmt= *) 'ebcdic character' write( unit= *, fmt= *) 'kind ', ebcdic_k write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no ebcdic character' write( unit= *, fmt= *) endif if( iso_10646_k > 0 )then write( unit= *, fmt= *) 'iso_10646 character' write( unit= *, fmt= *) 'kind ', iso_10646_k write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no iso_10646 character' write( unit= *, fmt= *) endif ! ********************************************************************** ! report integer kinds write( unit= *, fmt= *) 'Integer Kinds' write( unit= *, fmt= *) if( byte_k > 0 )then write( unit= *, fmt= *) 'byte integer' write( unit= *, fmt= *) 'kind ', byte_k write( unit= *, fmt= *) 'parameter byte_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_byte_k) write( unit= *, fmt= *) 'huge ', huge( 0_byte_k) write( unit= *, fmt= *) 'range ', range( 0_byte_k) write( unit= *, fmt= *) 'digits ', digits( 0_byte_k) write( unit= *, fmt= *) 'radix ', radix( 0_byte_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no byte integer' write( unit= *, fmt= *) endif if( short_k > 0 )then write( unit= *, fmt= *) 'short integer' write( unit= *, fmt= *) 'kind ', short_k write( unit= *, fmt= *) 'parameter short_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_short_k) write( unit= *, fmt= *) 'huge ', huge( 0_short_k) write( unit= *, fmt= *) 'range ', range( 0_short_k) write( unit= *, fmt= *) 'digits ', digits( 0_short_k) write( unit= *, fmt= *) 'radix ', radix( 0_short_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no short integer' write( unit= *, fmt= *) endif if( int_k > 0 )then write( unit= *, fmt= *) 'int integer' write( unit= *, fmt= *) 'kind ', int_k write( unit= *, fmt= *) 'parameter int_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_int_k) write( unit= *, fmt= *) 'huge ', huge( 0_int_k) write( unit= *, fmt= *) 'range ', range( 0_int_k) write( unit= *, fmt= *) 'digits ', digits( 0_int_k) write( unit= *, fmt= *) 'radix ', radix( 0_int_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no int integer' write( unit= *, fmt= *) endif if( long_k > 0 )then write( unit= *, fmt= *) 'long integer' write( unit= *, fmt= *) 'kind ', long_k write( unit= *, fmt= *) 'parameter long_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 0_long_k) write( unit= *, fmt= *) 'huge ', huge( 0_long_k) write( unit= *, fmt= *) 'range ', range( 0_long_k) write( unit= *, fmt= *) 'digits ', digits( 0_long_k) write( unit= *, fmt= *) 'radix ', radix( 0_long_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no long integer' write( unit= *, fmt= *) endif ! ********************************************************************** ! report logical kinds write( unit= *, fmt= *) 'Logical Kinds' write( unit= *, fmt= *) if( l_byte_k > 0 )then write( unit= *, fmt= *) 'byte logical' write( unit= *, fmt= *) 'kind ', l_byte_k write( unit= *, fmt= *) 'parameter l_byte_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_byte_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no byte logical' write( unit= *, fmt= *) endif if( l_short_k > 0 )then write( unit= *, fmt= *) 'short logical' write( unit= *, fmt= *) 'kind ', l_short_k write( unit= *, fmt= *) 'parameter l_short_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_short_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no short logical' write( unit= *, fmt= *) endif if( l_int_k > 0 )then write( unit= *, fmt= *) 'int logical' write( unit= *, fmt= *) 'kind ', l_int_k write( unit= *, fmt= *) 'parameter l_int_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_int_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no int logical' write( unit= *, fmt= *) endif if( l_long_k > 0 )then write( unit= *, fmt= *) 'long logical' write( unit= *, fmt= *) 'kind ', l_long_k write( unit= *, fmt= *) 'parameter l_long_k' write( unit= *, fmt= *) 'bit_size ', bit_size( .true._l_long_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no long logical' write( unit= *, fmt= *) endif ! ********************************************************************** ! report real kinds write( unit= *, fmt= *) 'Real Kinds' write( unit= *, fmt= *) if( single_k > 0 )then write( unit= *, fmt= *) 'single real' write( unit= *, fmt= *) 'kind ', single_k write( unit= *, fmt= *) 'parameter single_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_single_k) write( unit= *, fmt= *) 'huge ', huge( 1.0_single_k) write( unit= *, fmt= *) 'tiny ', tiny( 1.0_single_k) write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_single_k) write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_single_k) write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_single_k) write( unit= *, fmt= *) 'range ', range( 1.0_single_k) write( unit= *, fmt= *) 'digits ', digits( 1.0_single_k) write( unit= *, fmt= *) 'radix ', radix( 1.0_single_k) write( unit= *, fmt= *) 'exponent ', exponent( 1.0_single_k) write( unit= *, fmt= *) 'fraction ', fraction( 1.0_single_k) write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_single_k) write( unit= *, fmt= *) 'precision ', precision( 1.0_single_k) write( unit= *, fmt= *) 'nearest ', nearest( 1.0_single_k, 2.0_single_k) write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_single_k) write( unit= *, fmt= *) 'spacing ', spacing( 1.0_single_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no single real' write( unit= *, fmt= *) endif if( double_k > 0 )then write( unit= *, fmt= *) 'double real' write( unit= *, fmt= *) 'kind ', double_k write( unit= *, fmt= *) 'parameter double_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_double_k) write( unit= *, fmt= *) 'huge ', huge( 1.0_double_k) write( unit= *, fmt= *) 'tiny ', tiny( 1.0_double_k) write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_double_k) write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_double_k) write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_double_k) write( unit= *, fmt= *) 'range ', range( 1.0_double_k) write( unit= *, fmt= *) 'digits ', digits( 1.0_double_k) write( unit= *, fmt= *) 'radix ', radix( 1.0_double_k) write( unit= *, fmt= *) 'exponent ', exponent( 1.0_double_k) write( unit= *, fmt= *) 'fraction ', fraction( 1.0_double_k) write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_double_k) write( unit= *, fmt= *) 'precision ', precision( 1.0_double_k) write( unit= *, fmt= *) 'nearest ', nearest( 1.0_double_k, 2.0_double_k) write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_double_k) write( unit= *, fmt= *) 'spacing ', spacing( 1.0_double_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no double real' write( unit= *, fmt= *) endif if( quad_k > 0 )then write( unit= *, fmt= *) 'quad real' write( unit= *, fmt= *) 'kind ', quad_k write( unit= *, fmt= *) 'parameter quad_k' write( unit= *, fmt= *) 'bit_size ', bit_size( 1.0_quad_k) write( unit= *, fmt= *) 'huge ', huge( 1.0_quad_k) write( unit= *, fmt= *) 'tiny ', tiny( 1.0_quad_k) write( unit= *, fmt= *) 'minexponent ', minexponent( 1.0_quad_k) write( unit= *, fmt= *) 'maxexponent ', maxexponent( 1.0_quad_k) write( unit= *, fmt= *) 'max_exact_int ', max_exact_int( 1.0_quad_k) write( unit= *, fmt= *) 'range ', range( 1.0_quad_k) write( unit= *, fmt= *) 'digits ', digits( 1.0_quad_k) write( unit= *, fmt= *) 'radix ', radix( 1.0_quad_k) write( unit= *, fmt= *) 'exponent ', exponent( 1.0_quad_k) write( unit= *, fmt= *) 'fraction ', fraction( 1.0_quad_k) write( unit= *, fmt= *) 'epsilon ', epsilon( 1.0_quad_k) write( unit= *, fmt= *) 'precision ', precision( 1.0_quad_k) write( unit= *, fmt= *) 'nearest ', nearest( 1.0_quad_k, 2.0_quad_k) write( unit= *, fmt= *) 'rrspacing ', rrspacing( 1.0_quad_k) write( unit= *, fmt= *) 'spacing ', spacing( 1.0_quad_k) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no quad real' write( unit= *, fmt= *) endif ! ********************************************************************** ! report complex kinds write( unit= *, fmt= *) 'Complex Kinds' write( unit= *, fmt= *) if( single_k > 0 )then write( unit= *, fmt= *) 'single complex' write( unit= *, fmt= *) 'kind ', single_k write( unit= *, fmt= *) 'parameter single_k' write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= single_k) ) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no single complex' write( unit= *, fmt= *) endif if( double_k > 0 )then write( unit= *, fmt= *) 'double complex' write( unit= *, fmt= *) 'kind ', double_k write( unit= *, fmt= *) 'parameter double_k' write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= double_k) ) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no double complex' write( unit= *, fmt= *) endif if( quad_k > 0 )then write( unit= *, fmt= *) 'quad complex' write( unit= *, fmt= *) 'kind ', quad_k write( unit= *, fmt= *) 'parameter quad_k' write( unit= *, fmt= *) 'bit_size ', bit_size( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'epsilon ', epsilon( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'huge ', huge( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) 'tiny ', tiny( cmplx( 0.0, 0.0, kind= quad_k) ) write( unit= *, fmt= *) else write( unit= *, fmt= *) 'no quad complex' write( unit= *, fmt= *) endif stop 'processor_model' ! processor_model ! ********************************************************************** ! processor_model ! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ ! ********************************************************************** end program processor_model ! eof Day-III/06-coco/procdep.f90100777 0 0 130537 11660472364 10526 0! bof ! ********************************************************************** ! Fortran 95 module processor_dependencies ! ********************************************************************** ! Source Control Strings ! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ ! ********************************************************************** ! Copyright 2004 Purple Sage Computing Solutions, Inc. ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! processor_dependencies describes the processor: kinds, processor dependencies, &c ! ********************************************************************** ! Module processor_dependencies provides standard definitions ! of Fortran type kind parameters, and other Fortran ! processor dependent quantities. The porting of Fortran ! programs from processor to processor is eased because symbolic, ! rather than 'magic number' constants and conditions may be used ! by the programmer. The understanding of Fortran programs is enhanced ! because constants and subprograms have easily undertsood names. ! The compiler to which this file applies and the RCS strings of this ! file are available as default-kind character parameters. ! A set of kinds is defined, each a parameter whose name is _k. ! The number of bits per numeric storage unit, per character storage ! and per file storage unit are defined. ! The intrinsic bit_size() is extended to all types and kinds (a complex ! kind is by definition twice the same real kind, but bit_size() should ! exist for all kinds). The intrinsics tiny() and huge() are extended to ! character and complex kinds. The intrinsic epsilon() is extended to ! complex kinds. ! Quantities defined include the input and output units preconnected, ! and whether there is a preconnected error unit. The size of the ! processor's random number generator seed is defined to allow static ! declaration of the seed. A flag is defined whether the processor ! uses ieee 754 floating point format. A flag is defined whether the ! processor uses twos compliment integer arithmetic. ! Suggestions for other behavior of Fortran processors which could be ! codified in this module are very much welcomed by the author. ! A summary listing of defined parameters, and a listing of defined ! procedures follows. ! ********************************************************************** ! use no modules ! ********************************************************************** ! processor_dependencies uses ! none ! *** all parameters are default kind *** ! processor_dependencies constants ! processor_dependencies_rcs_id= this file's RCS Identifier ! compiler_version= compiler to which this file applies ! compiler_serial= compiler license serial ! os_version= operating system to which this file applies ! compiler_standard= Fortran standard supported by the compiler ! has_varying_strings- true if processor supports iso_varying_string ! ascii_k, ebcdic_k, iso_10646_k= character kinds ! byte_k, short_k, int_k, long_k= integer kinds ! l_byte_k, l_short_k, l_int_k, l_long_k= logical kinds ! single_k, double_k, quad_k= real kinds (& thf complex kinds) ! byte_int, short_int, int_int, long_int= type( integer_inquiry_t) ! single_real, double_real, quad_real= type( real_inquiry_t) ! numeric_storage_size= bits per numeric storage unit ! character_storage_size= bits per character storage unit ! file_storage_size= bits per file storage unit ! is_big_endian= true if processor is big endian ! is_little_endian= true if processor is little endian ! default_filename= filename of a unit opened without a name ! opt_plus_sign= true if optional plus with i, e, f, g formats ! leading_zero_f= true if optional leading zero with f format ! leading_zero_e= true if optional leading zero with e format ! ld_fmt_fmin= smallest exponent list-directed format writes with f format ! ld_fmt_fmax= largest exponent list-directed format writes with f format ! da_undefined_record= iostat value returned when reading an undefined record ! processor_dependencies types ! none ! processor_dependencies variables ! none ! processor_dependencies operators ! none ! *** all integer and logical functions return default kind *** ! *** some functions use their argument only to select specific *** ! processor_dependencies library ! bit_size() for character, logical, real, complex types ! int() for logical returns 1 or 0 for T or F ! logical() for integers, returns T or F for non-0 or 0 ! huge() for character kinds ( largest character code) ! tiny() for character kinds ( smallest character code) ! huge() for complex kinds ( returns sqrt( real huge) ) ! tiny() for complex kinds ( returns sqrt( real tiny) ) ! epsilon() for complex kinds ( returns sqrt( real epsilon) ) ! max_exact_int() largest integer a real kind increments (by one) exactly ! ********************************************************************** ! processor_dependencies ! ********************************************************************** module processor_dependencies ! ********************************************************************** ! use none ! ********************************************************************** ! explicit declaration of all names implicit none ! ********************************************************************** ! all variables are static save ! ********************************************************************** ! explicit export of all module names private ! ********************************************************************** ! processor_dependencies RCS strings ! ********************************************************************** ! module source filename supplied by RCS character( len= *), public, parameter :: processor_dependencies_rcs_id = & '$Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $' ! ********************************************************************** character( len= *), public, parameter :: processor_depends_timestamp = & '20111115 091932.178' ! ********************************************************************** ! processor_dependencies data ! ********************************************************************** ! compiler & OS version to which this file applies ! ********************************************************************** ! compiler version used to generate this file character( len= *), public, parameter :: compiler_version = & 'gfortran 4.6' ! compiler serial number used to generate this file character( len= *), public, parameter :: compiler_serial = & 'GPL' ! operating system version used to generate this file character( len= *), public, parameter :: os_version = & 'Mac OS X 10.7' ! standard supported by this compiler character( len= *), public, parameter :: standard_version = & 'Fortran 95' ! ********************************************************************** ! *** all parameters are of default kind *** ! ********************************************************************** ! modules available to the processor logical, public, parameter :: has_varying_strings = .false. ! ********************************************************************** ! The first section defines the kind parameters supported by the processor. ! First, the kind parameters are defined. ! ********************************************************************** ! processor dependent kinds ! ********************************************************************** ! processor character kinds ! ********************************************************************** ! ascii characters (seven bit codes stored in eight bit bytes) integer, public, parameter :: ascii_k = 1 ! ebcdic characters (eight bit bytes) integer, public, parameter :: ebcdic_k = -1 ! iso_10646 characters integer, public, parameter :: iso_10646_k = -1 ! ********************************************************************** ! processor integer kinds ! ********************************************************************** ! 8-bit signed integer ( 1.3+2 = huge() ) ! byte signed integer integer, public, parameter :: byte_k = selected_int_kind( 2) ! 16-bit signed integer ( 3.3+4 = huge() ) ! short signed integer integer, public, parameter :: short_k = selected_int_kind( 4) ! 32-bit signed integer ( 2.1+9 = huge() ) ! int signed integer integer, public, parameter :: int_k = selected_int_kind( 9) ! 64-bit signed integer ( 4.2+18 = huge() ) ! long signed integer integer, public, parameter :: long_k = selected_int_kind( 18) ! int38 signed integer integer, public, parameter :: int38_k = selected_int_kind( 38) ! ********************************************************************** ! processor logical kinds ! ********************************************************************** ! logical kind using same storage as byte integer, public, parameter :: l_byte_k = 1 ! logical kind using same storage as short integer, public, parameter :: l_short_k = 2 ! logical kind using same storage as int integer, public, parameter :: l_int_k = 4 ! logical kind using same storage as long integer, public, parameter :: l_long_k = 8 ! ********************************************************************** ! processor real ( & thf complex) kinds ! ********************************************************************** ! IEEE 754 single real kind integer, public, parameter :: single_k = selected_real_kind( 6, 37) ! IEEE 754 double real kind integer, public, parameter :: double_k = selected_real_kind( 15, 307) ! IEEE 754 quad real kind integer, public, parameter :: quad_k = selected_real_kind( 33, 4931) ! IEEE 754 r18 real kind integer, public, parameter :: r18_k = selected_real_kind( 18, 4931) ! ********************************************************************** ! This section sets defines parameters specified by the ! Fortran standard as being processor dependent. These ! parameters describe hardware, I/O, and the intrinsic ! random number generator. ! ********************************************************************** ! values specified by the processor ! ********************************************************************** ! bits per numeric storage unit integer, public, parameter :: numeric_storage_size = 32 ! bits per character storage unit integer, public, parameter :: character_storage_size = 8 ! bits per file storage unit integer, public, parameter :: file_storage_size = bit_size( 0) / 4 ! signal whether hardware addresses are byte addresses or word addresses logical, public, parameter :: is_byte_addressable = .true. logical, public, parameter :: is_word_addressable = .false. ! signal whether hardware is big endian or little endian logical, public, parameter :: is_big_endian = .false. logical, public, parameter :: is_little_endian = .true. ! ********************************************************************** ! i/o units preconnected for input ( unit= *) integer, public, parameter :: input_unit = 5 ! i/o units preconnected for output ( unit= *) integer, public, parameter :: output_unit = 6 ! i/o unit preconnected for error messages ( output_unit if no other) integer, public, parameter :: error_unit = 0 ! ********************************************************************** ! end of file and end of record iostat= values ! end of file integer, parameter :: iostat_end = -1 ! end of record integer, parameter :: iostat_eor = -2 ! ********************************************************************** ! name of a file opened without a name character( len= *), public, parameter :: default_filename = 'fort.#' ! ********************************************************************** ! exponents beyond which list-directed format switches from f to e integer, public, parameter :: ld_fmt_fmin = -1 integer, public, parameter :: ld_fmt_fmax = 8 ! optional separator when using list directed format logical, public, parameter :: ld_fmt_comma = .false. ! ********************************************************************** ! optional plus sign using numeric formats logical, public, parameter :: opt_plus_sign = .false. ! optional leading zero using f and e formats logical, public, parameter :: leading_zero_f = .true. logical, public, parameter :: leading_zero_e = .true. ! ********************************************************************** ! the maximum record length of a sequential record integer, public, parameter :: max_recl = -1 ! the iostat value returned when attempting to read a record not yet written integer, public, parameter :: read_undefined_record = 5002 ! ********************************************************************** ! number of words in the random number generator seed array ! this parameter may be used to statically allocate the seed array integer, public, parameter :: random_seed_size = 12 ! ********************************************************************** ! true if processor uses ieee 754 floating point format ! the intent here is _format_, not all the roundings, exceptions, &c logical, public, parameter :: is_ieee_fp = .true. ! ********************************************************************** ! true if processor uses 2's complement integer format logical, public, parameter :: is_2s_comp = .true. ! ********************************************************************** ! processor_dependencies library ! ********************************************************************** ! The following intrinsic procedures are extended to other types: ! bit_size() is extended to type character, logical, real & complex. ! int() is extended to type logical. ! logical() is extended to type integer. ! huge() & tiny() are extended to type character and complex. ! epsilon() is extended to type complex. ! The generic name is defined for each group of procedures and each ! specific name is made private; access is only thru the generic name. ! ********************************************************************** ! bit_size() specific and generic names ! ********************************************************************** ! bit_size() for kinds character, logical, real (& thf complex) kinds intrinsic :: bit_size ! extend intrinsic public :: bit_size ! generic interface bit_size module procedure ascii_bit_size module procedure l_byte_bit_size module procedure l_short_bit_size module procedure l_int_bit_size module procedure l_long_bit_size module procedure single_bit_size module procedure double_bit_size module procedure quad_bit_size module procedure single_complex_bit_size module procedure double_complex_bit_size module procedure quad_complex_bit_size end interface ! ********************************************************************** ! int() specific and generic names ! ********************************************************************** ! int() for logical kinds intrinsic :: int ! extend intrinsic public :: int ! generic interface int module procedure l_byte_int module procedure l_short_int module procedure l_int_int module procedure l_long_int end interface ! ********************************************************************** ! logical() specific and generic names ! ********************************************************************** ! logical() for integer kinds intrinsic :: logical ! extend intrinsic public :: logical ! generic interface logical module procedure byte_logical module procedure short_logical module procedure int_logical module procedure long_logical end interface ! ********************************************************************** ! epsilon(), huge(), tiny() specific and generic names ! ********************************************************************** ! huge for character & complex kinds intrinsic :: huge ! extend intrinsic public :: huge ! generic interface huge module procedure ascii_huge module procedure single_complex_huge module procedure double_complex_huge module procedure quad_complex_huge end interface ! ********************************************************************** ! tiny for character & complex kinds intrinsic :: tiny ! extend intrinsic public :: tiny ! generic interface tiny module procedure ascii_tiny module procedure single_complex_tiny module procedure double_complex_tiny module procedure quad_complex_tiny end interface ! ********************************************************************** ! epsilon for complex kinds intrinsic :: epsilon ! extend intrinsic public :: epsilon ! generic interface epsilon module procedure single_complex_epsilon module procedure double_complex_epsilon module procedure quad_complex_epsilon end interface ! ********************************************************************** ! max_exact_int() is the largest integer a real kind ! can exactly increment by 1.0 ! ********************************************************************** ! max_exact_int() for real kinds public :: max_exact_int ! generic interface max_exact_int module procedure single_max_exact_int module procedure double_max_exact_int module procedure quad_max_exact_int end interface ! ********************************************************************** ! defined in iso_fortran_env with Fortran 2003 ! ********************************************************************** ! interpret iostat values public :: is_iostat_end ! export public :: is_iostat_eor ! export ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! processor_dependencies ! ********************************************************************** ! *** all integer and logical functions return default kinds *** ! *** some functions use their argument only to select specific *** ! ********************************************************************** ! These specific procedures extend bit_size() to character, logical, ! real and complex kinds. ! ********************************************************************** ! bit_size() extend intrinsic bit_size() to all defined processor kinds ! ********************************************************************** ! ascii_bit_size() bit_size() for kind ascii elemental integer function ascii_bit_size( ac) character( len= *, kind= ascii_k), intent( in) :: ac ! ascii_bit_size() local character( len= 1, kind= ascii_k), dimension( bit_size( 0)) :: tk ! ascii_bit_size() text continue ! bit_size() ascii_bit_size = size( transfer( tk, (/ 0/) )) return ! bit_size() ! ascii_bit_size() end function ascii_bit_size ! ********************************************************************** ! l_byte_bit_size() bit_size() for kind l_byte elemental integer function l_byte_bit_size( ll) logical( kind= l_byte_k), intent( in) :: ll ! l_byte_bit_size() local logical( kind= l_byte_k), dimension( bit_size( 0)) :: tk ! l_byte_bit_size() text continue ! bit_size() l_byte_bit_size = size( transfer( tk, (/ 0/) )) return ! bit_size() ! l_byte_bit_size() end function l_byte_bit_size ! ********************************************************************** ! l_short_bit_size() bit_size() for kind l_short elemental integer function l_short_bit_size( ll) logical( kind= l_short_k), intent( in) :: ll ! l_short_bit_size() local logical( kind= l_short_k), dimension( bit_size( 0)) :: tk ! l_short_bit_size() text continue ! bit_size() l_short_bit_size = size( transfer( tk, (/ 0/) )) return ! bit_size() ! l_short_bit_size() end function l_short_bit_size ! ********************************************************************** ! l_int_bit_size() bit_size() for kind int logical elemental integer function l_int_bit_size( il) logical( kind= l_int_k), intent( in) :: il ! selects specific bit_size() ! l_int_bit_size() text continue ! bit_size() l_int_bit_size = bit_size( 0) ! 1 l_int per nsu return ! bit_size() ! l_int_bit_size() end function l_int_bit_size ! ********************************************************************** ! l_long_bit_size() bit_size() for kind l_long elemental integer function l_long_bit_size( ll) logical( kind= l_long_k), intent( in) :: ll ! l_long_bit_size() local logical( kind= l_long_k), dimension( bit_size( 0)) :: tk ! l_long_bit_size() text continue ! bit_size() l_long_bit_size = size( transfer( tk, (/ 0/) )) return ! bit_size() ! l_long_bit_size() end function l_long_bit_size ! ********************************************************************** ! single_bit_size() bit_size() for kind single elemental integer function single_bit_size( sr) real( kind= single_k), intent( in) :: sr ! selects specific bit_size() ! single_bit_size() text continue ! bit_size() single_bit_size = bit_size( 0) ! 1 single per default integer return ! bit_size() ! single_bit_size() end function single_bit_size ! ********************************************************************** ! double_bit_size() bit_size() for kind double elemental integer function double_bit_size( dr) real( kind= double_k), intent( in) :: dr ! selects specific bit_size() ! double_bit_size() text continue ! bit_size() double_bit_size = 2 * bit_size( 0) ! 1 double per 2 default integers return ! bit_size() ! double_bit_size() end function double_bit_size ! ********************************************************************** ! quad_bit_size() bit_size() for kind quad elemental integer function quad_bit_size( qr) real( kind= quad_k), intent( in) :: qr ! quad_bit_size() local real( kind= quad_k), dimension( bit_size( 0)) :: tk ! quad_bit_size() text continue ! bit_size() quad_bit_size = size( transfer( tk, (/ 0/) )) return ! bit_size() ! quad_bit_size() end function quad_bit_size ! ********************************************************************** ! single_complex_bit_size() bit_size() for kind single_complex elemental integer function single_complex_bit_size( sc) complex( kind= single_k), intent( in) :: sc ! selects specific bit_size() ! single_complex_bit_size() continue ! bit_size() single_complex_bit_size = 2 * single_bit_size( 0.0_single_k) return ! bit_size() ! single_complex_bit_size() end function single_complex_bit_size ! ********************************************************************** ! double_complex_bit_size() bit_size() for kind double_complex elemental integer function double_complex_bit_size( dc) complex( kind= double_k), intent( in) :: dc ! selects specific bit_size() ! double_complex_bit_size() continue ! bit_size() double_complex_bit_size = 2 * double_bit_size( 0.0_double_k) return ! bit_size() ! double_complex_bit_size() end function double_complex_bit_size ! ********************************************************************** ! quad_complex_bit_size() bit_size() for kind quad_complex integer function quad_complex_bit_size( qc) complex( kind= quad_k), intent( in) :: qc ! selects specific bit_size() ! quad_complex_bit_size() continue ! bit_size() quad_complex_bit_size = 2 * quad_bit_size( 0.0_quad_k) return ! bit_size() ! quad_complex_bit_size() end function quad_complex_bit_size ! ********************************************************************** ! int() extend intrinsic int() to all logical kinds ! ********************************************************************** ! l_byte_int() int() for kind l_byte elemental integer function l_byte_int( bl) logical( kind= l_byte_k), intent( in) :: bl ! l_byte_int() continue ! int() true_or_false: select case( bl) ! t or f case( .true._l_byte_k) true_or_false ! true l_byte_int = 1 ! is 1 case( .false._l_byte_k) true_or_false ! false l_byte_int = 0 ! is 0 end select true_or_false ! t or f return ! int() ! l_byte_int() end function l_byte_int ! ********************************************************************** ! l_short_int() int() for kind l_short elemental integer function l_short_int( sl) logical( kind= l_short_k), intent( in) :: sl ! l_short_int() continue ! int() true_or_false: select case( sl) ! true case( .true._l_short_k) true_or_false ! true l_short_int = 1 ! is 1 case( .false._l_short_k) true_or_false ! false l_short_int = 0 ! is 0 end select true_or_false ! t or f return ! int() ! l_short_int() end function l_short_int ! ********************************************************************** ! l_int_int() int() for kind l_int elemental integer function l_int_int( il) logical( kind= l_int_k), intent( in) :: il ! l_int_int() continue ! int() true_or_false: select case( il) ! true case( .true._l_int_k) true_or_false ! true l_int_int = 1 ! is 1 case( .false._l_int_k) true_or_false ! false l_int_int = 0 ! is 0 end select true_or_false ! t or f return ! int() ! l_int_int() end function l_int_int ! ********************************************************************** ! l_long_int() int() for kind l_long elemental integer function l_long_int( ll) logical( kind= l_long_k), intent( in) :: ll ! l_long_int() continue ! int() true_or_false: select case( ll) ! true case( .true._l_long_k) true_or_false ! true l_long_int = 1 ! is 1 case( .false._l_long_k) true_or_false ! false l_long_int = 0 ! is 0 end select true_or_false ! t or f return ! int() ! l_long_int() end function l_long_int ! ********************************************************************** ! logical() extend intrinsic logical() to all integer kinds ! ********************************************************************** ! byte_logical() logical() for kind byte elemental logical function byte_logical( ib) integer( kind= byte_k), intent( in) :: ib ! byte_logical() continue ! logical() byte_logical = ib /= 0_byte_k ! 0 is false return ! logical() ! byte_logical() end function byte_logical ! ********************************************************************** ! short_logical() logical() for kind short elemental logical function short_logical( is) integer( kind= short_k), intent( in) :: is ! short_logical() continue ! logical() short_logical = is /= 0_short_k ! 0 is false return ! logical() ! short_logical() end function short_logical ! ********************************************************************** ! int_logical() logical() for kind int elemental logical function int_logical( ii) integer( kind= int_k), intent( in) :: ii ! int_logical() continue ! logical() int_logical = ii /= 0_int_k ! 0 is false return ! logical() ! int_logical() end function int_logical ! ********************************************************************** ! long_logical() logical() for kind long elemental logical function long_logical( il) integer( kind= long_k), intent( in) :: il ! long_logical() continue ! logical() long_logical = il /= 0_long_k ! 0 is false return ! logical() ! long_logical() end function long_logical ! ********************************************************************** ! These specific procedures extend huge() and tiny() to character (if ! defined) and complex kinds. The character huge() and tiny() return ! the characters with the largest and smallest character codes. The ! complex huge() and tiny() return the square root of their real ! counterparts. The choice of sqrts defines the range where magnitude ! comparisons are valid. [ |z| = sqrt( r^2 + i^2) ] So if two ! complex numbers have components within sqrt( real epsilon) of each ! other, they will compare with equal magnitude. ! ********************************************************************** ! huge()/tiny() for character kinds ! ********************************************************************** ! The ascii huge and tiny return characters with the largest and ! smallest character codes. ! ********************************************************************** ! ascii_huge() huge() for kind ascii elemental character( len= 1, kind= ascii_k) function ascii_huge( ac) character( len= *, kind= ascii_k), intent( in) :: ac ! ascii_huge() continue ! huge() ascii_huge = achar( 127) ! largest is del return ! huge() ! ascii_huge() end function ascii_huge ! ********************************************************************** ! ascii_tiny() tiny() for kind ascii elemental character( len= 1, kind= ascii_k) function ascii_tiny( ac) character( len= *, kind= ascii_k), intent( in) :: ac ! ascii_tiny() continue ! tiny() ascii_tiny = achar( 0) ! smallest is nul return ! tiny() ! ascii_tiny() end function ascii_tiny ! ********************************************************************** ! These specific procedures extend huge() to type complex. huge() ! returns the square root of its real counterpart. The sqrt is returned ! so magnitude comparisons may be made [ sqrt( x^2 + y^2) = |z| < huge() ! or sqrt( x^2 + y^2) = |z| > tiny() ] ! ********************************************************************** ! huge() for complex kinds ! ********************************************************************** ! single_complex_huge() huge() for kind single complex elemental real( kind= single_k) function single_complex_huge( sc) complex( kind= single_k), intent( in) :: sc ! single_complex_huge() continue ! huge() single_complex_huge = sqrt( huge( real( sc)) ) return ! huge() ! single_complex_huge() end function single_complex_huge ! ********************************************************************** ! double_complex_huge() huge() for kind double complex elemental real( kind= double_k) function double_complex_huge( dc) complex( kind= double_k), intent( in) :: dc ! double_complex_huge() continue ! huge() double_complex_huge = sqrt( huge( real( dc)) ) return ! huge() ! double_complex_huge() end function double_complex_huge ! ********************************************************************** ! quad_complex_huge() huge() for kind quad complex elemental real( kind= quad_k) function quad_complex_huge( qc) complex( kind= quad_k), intent( in) :: qc ! quad_complex_huge() continue ! huge() quad_complex_huge = sqrt( huge( real( qc)) ) return ! huge() ! quad_complex_huge() end function quad_complex_huge ! ********************************************************************** ! These specific procedures extend tiny() to type complex. tiny() ! returns the square root of its real counterpart. ! ********************************************************************** ! tiny() for complex kinds ! ********************************************************************** ! single_complex_tiny() tiny() for kind single complex elemental real( kind= single_k) function single_complex_tiny( sc) complex( kind= single_k), intent( in) :: sc ! single_complex_tiny() continue ! tiny() single_complex_tiny = sqrt( tiny( real( sc)) ) return ! tiny() ! single_complex_tiny() end function single_complex_tiny ! ********************************************************************** ! double_complex_tiny() tiny() for kind double complex elemental real( kind= double_k) function double_complex_tiny( dc) complex( kind= double_k), intent( in) :: dc ! double_complex_tiny() continue ! tiny() double_complex_tiny = sqrt( tiny( real( dc)) ) return ! tiny() ! double_complex_tiny() end function double_complex_tiny ! ********************************************************************** ! quad_complex_tiny() tiny() for kind quad complex elemental real( kind= quad_k) function quad_complex_tiny( qc) complex( kind= quad_k), intent( in) :: qc ! quad_complex_tiny() continue ! tiny() quad_complex_tiny = sqrt( tiny( real( qc)) ) return ! tiny() ! quad_complex_tiny() end function quad_complex_tiny ! ********************************************************************** ! These specific procedures extend epsilon() to type complex. epsilon() ! returns the square root of its real counterpart. The magnitude of ! two complex numbers differ if the numbers differ by more than epsilon() ! ********************************************************************** ! epsilon() for complex kinds ! ********************************************************************** ! single_complex_epsilon() epsilon() for kind single complex elemental real( kind= single_k) function single_complex_epsilon( sc) complex( kind= single_k), intent( in) :: sc ! single_complex_epsilon() continue ! epsilon() single_complex_epsilon = sqrt( epsilon( abs( sc)) ) return ! epsilon() ! single_complex_epsilon() end function single_complex_epsilon ! ********************************************************************** ! double_complex_epsilon() epsilon() for kind double complex elemental real( kind= double_k) function double_complex_epsilon( dc) complex( kind= double_k), intent( in) :: dc ! double_complex_epsilon() continue ! epsilon() double_complex_epsilon = sqrt( epsilon( abs( dc)) ) return ! epsilon() ! double_complex_epsilon() end function double_complex_epsilon ! ********************************************************************** ! quad_complex_epsilon() epsilon() for kind quad complex elemental real( kind= quad_k) function quad_complex_epsilon( qc) complex( kind= quad_k), intent( in) :: qc ! quad_complex_epsilon() continue ! epsilon() quad_complex_epsilon = sqrt( epsilon( abs( qc)) ) return ! epsilon() ! quad_complex_epsilon() end function quad_complex_epsilon ! ********************************************************************** ! These specific procedures compute the largest integer ! which may be stored exactly in a real kind. ! ********************************************************************** ! max_exact_int() for real kinds ! ********************************************************************** ! single_max_exact_int() max_exact_int() for kind single real elemental real( kind= single_k) function single_max_exact_int( sr) real( kind= single_k), intent( in) :: sr ! single_max_exact_int() continue ! max_exact_int() single_max_exact_int = nearest( real( radix( sr), kind= single_k) & ** real( digits( sr), kind= single_k), -1.0_single_k) return ! max_exact_int() ! single_max_exact_int() end function single_max_exact_int ! ********************************************************************** ! double_max_exact_int() max_exact_int() for kind double real elemental real( kind= double_k) function double_max_exact_int( dr) real( kind= double_k), intent( in) :: dr ! double_max_exact_int() continue ! max_exact_int() double_max_exact_int = nearest( real( radix( dr), kind= double_k) & ** real( digits( dr), kind= double_k), -1.0_double_k) return ! max_exact_int() ! double_max_exact_int() end function double_max_exact_int ! ********************************************************************** ! quad_max_exact_int() epsilon() for kind quad real elemental real( kind= quad_k) function quad_max_exact_int( qr) real( kind= quad_k), intent( in) :: qr ! quad_max_exact_int() continue ! max_exact_int() quad_max_exact_int = nearest( real( radix( qr), kind= quad_k) & ** real( digits( qr), kind= quad_k), -1.0_quad_k) return ! max_exact_int() ! quad_max_exact_int() end function quad_max_exact_int ! ********************************************************************** ! The following functions detect the conditions indicated according ! to rules specified by the Fortran standard. The iostat return ! value is required to be an error code, an end code, or a success code. ! ********************************************************************** ! is_iostat_eof(), is_iostat_eor() detect standard conditions ! ********************************************************************** ! is_iostat_end() true if iostat indicates error pure logical function is_iostat_end( iostat) integer, intent( in) :: iostat ! is_iostat_end() continue ! is_iostat_end() is_iostat_end = any( (/ iostat_end /) == iostat) ! eof condition return ! is_iostat_end() ! is_iostat_end() end function is_iostat_end ! ********************************************************************** ! is_iostat_eor() true if iostat indicates error pure logical function is_iostat_eor( iostat) integer, intent( in) :: iostat ! is_iostat_eor() continue ! is_iostat_eor() is_iostat_eor = any( (/ iostat_eor /) == iostat) ! eor condition return ! is_iostat_eor() ! is_iostat_eor() end function is_iostat_eor ! ********************************************************************** ! processor_dependencies ! $Id: make_pm.f90 2.2 2005/05/30 15:47:01Z Dan Release $ ! ********************************************************************** end module processor_dependencies ! eof Day-III/06-coco/stdfunc.f90100777 0 0 207363 11740030544 10527 0! bof ! ********************************************************************** ! Fortran 95 module standard_functions ! ********************************************************************** ! Source Control Strings ! $Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $ ! ********************************************************************** ! Copyright 2009 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! adds a basic set of operators and functions to Fortran 95 programs ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dannagle@verizon.net ! or mail to 4311-G Bob Ct. ! Fairfax, VA 22030 USA ! ********************************************************************** ! standard_functions constants ! error_short_string integer encode() or decode() passed null or short string ! error_bad_base integer encode() or decode() base larger than translation table ! error_not_in_table integer decode() input character not in translation table ! standard_functions operators ! .xor. binary logicals ! .mod. binary integers, reals ! .modulo. binary integers, reals ! .gcd. binary integers ! .lcm. binary integers ! .cd. binary integers ! .cr. binary integers ! standard_functions library ! iseven() logical( integer) ! isodd() logical( integer) ! gcd() greatest common divisor integer( integer, integer) ! lcm() least common multiple integer( integer, integer) ! cd() ceiling division [ ( j+ k- 1) /k ] integer( integer, integer) ! cr() ceiling remainder [ j- k* cd() ] integer( integer, integer) ! rrint() round up with probability ( a - int( a)) or down integer( real) ! hex() string to integer ! oct() string to integer ! bin() string to integer ! hexstr() integer to string ! octstr() integer to string ! binstr() integer to string ! encode() integer to string, arbitrary base, via translate table ! decode() string to integer, arbitrary base, via translate table ! start_rng() starts the rng ! timestamp() writes a time-stamped message to a file ! pause() subroutine pause() | pause( char*(*)) | pause( integer) ! swap() for all tk ! rev_endian() for all tk size > 1 byte ! rev_bits() for all tk size = 1 byte ! get_logical_unit() a logical i/o unit number which may be opened ! ********************************************************************** module standard_functions ! ********************************************************************** ! use kind parameters use standard_types ! ********************************************************************** ! explicit declaration implicit none ! ********************************************************************** ! explicit export private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), public, parameter :: standard_functions_rcs_id = & '$Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $' ! ********************************************************************** ! standard_functions constants ! ********************************************************************** ! encode()/decode() error codes integer, public, parameter :: error_short_string = 1 integer, public, parameter :: error_bad_base = 2 integer, public, parameter :: error_not_in_table = 3 ! hex()/oct()/bin() string lengths ( note need for ceiling division! ) integer, public, parameter :: hexstr_len = bit_size( 0) / 4 integer, public, parameter :: octstr_len = bit_size( 0)/3 + 1 integer, public, parameter :: binstr_len = bit_size( 0) ! ********************************************************************** ! pause()/stop() formats character( len= *), parameter :: ps_fmt_a = '( a)' character( len= *), parameter :: ps_fmt_ai = '( a, i5.5)' character( len= *), parameter :: ps_fmt_aa = '( a, a)' ! ********************************************************************** ! rev_bits masks and shift counts integer( kind= byte_k) :: bit_1 ; data bit_1 / z'01'/ integer( kind= byte_k) :: bit_2 ; data bit_2 / z'02'/ integer( kind= byte_k) :: bit_3 ; data bit_3 / z'04'/ integer( kind= byte_k) :: bit_4 ; data bit_4 / z'08'/ integer( kind= byte_k) :: bit_5 ; data bit_5 / z'10'/ integer( kind= byte_k) :: bit_6 ; data bit_6 / z'20'/ integer( kind= byte_k) :: bit_7 ; data bit_7 / z'40'/ integer( kind= byte_k) :: bit_8 ; data bit_8 / z'80'/ integer( kind= byte_k), parameter :: sh_1 = 7 integer( kind= byte_k), parameter :: sh_2 = 5 integer( kind= byte_k), parameter :: sh_3 = 3 integer( kind= byte_k), parameter :: sh_4 = 1 integer( kind= byte_k), parameter :: sh_5 = -1 integer( kind= byte_k), parameter :: sh_6 = -3 integer( kind= byte_k), parameter :: sh_7 = -5 integer( kind= byte_k), parameter :: sh_8 = -7 ! ********************************************************************** ! standard_functions library ! ********************************************************************** ! declare specific functions implementing the .xor. operator public :: operator( .xor.) interface operator( .xor.) module procedure l_byte_xor module procedure l_short_xor module procedure l_int_xor module procedure l_long_xor end interface ! ********************************************************************** ! declare specific functions implementing the .mod. operator public :: operator( .mod.) interface operator( .mod.) module procedure byte_mod module procedure short_mod module procedure int_mod module procedure long_mod module procedure single_mod module procedure double_mod module procedure quad_mod end interface ! declare specific functions implementing the .modulo. operator public :: operator( .modulo.) interface operator( .modulo.) module procedure byte_modulo module procedure short_modulo module procedure int_modulo module procedure long_modulo module procedure single_modulo module procedure double_modulo module procedure quad_modulo end interface ! ********************************************************************** ! declare specific functions implementing the .gcd. operator public :: operator( .gcd.) interface operator( .gcd.) module procedure byte_gcd module procedure short_gcd module procedure int_gcd module procedure long_gcd end interface ! declare specific functions implementing the gcd() function public :: gcd interface gcd module procedure byte_gcd module procedure short_gcd module procedure int_gcd module procedure long_gcd end interface ! declare specific functions implementing the .lcm. operator public :: operator( .lcm.) interface operator( .lcm.) module procedure byte_lcm module procedure short_lcm module procedure int_lcm module procedure long_lcm end interface ! declare specific functions implementing the lcm() function public :: lcm interface lcm module procedure byte_lcm module procedure short_lcm module procedure int_lcm module procedure long_lcm end interface ! ********************************************************************** ! declare specific functions implementing the .cd. operator public :: operator( .cd.) interface operator( .cd.) module procedure byte_cd module procedure short_cd module procedure int_cd module procedure long_cd end interface ! declare specific functions implementing the cd() function public :: cd interface cd module procedure byte_cd module procedure short_cd module procedure int_cd module procedure long_cd end interface ! declare specific functions implementing the .cr. operator public :: operator( .cr.) interface operator( .cr.) module procedure byte_cr module procedure short_cr module procedure int_cr module procedure long_cr end interface ! declare specific functions implementing the cr() function public :: cr interface cr module procedure byte_cr module procedure short_cr module procedure int_cr module procedure long_cr end interface ! ********************************************************************** ! integer diagnostic functions ! ********************************************************************** ! declare specific functions implementing the iseven() function public :: iseven interface iseven module procedure byte_iseven module procedure short_iseven module procedure int_iseven module procedure long_iseven end interface ! ********************************************************************** ! declare specific functions implementing the isodd() function public :: isodd interface isodd module procedure byte_isodd module procedure short_isodd module procedure int_isodd module procedure long_isodd end interface ! ********************************************************************** ! real to integer functions ! ********************************************************************** ! declare specific functions implementing the rrint() function public :: rrint interface rrint module procedure single_rrint module procedure double_rrint module procedure quad_rrint end interface ! ********************************************************************** ! rng starter functions ! ********************************************************************** ! declare specific function supporting generic function start_rng() public :: start_rng interface start_rng module procedure single_start_rng module procedure double_start_rng module procedure quad_start_rng end interface ! ********************************************************************** ! subroutines to replace pause statements ! ********************************************************************** ! declare specific subroutines supporting generic subroutine pause() public :: pause interface pause module procedure int_pause module procedure char_pause end interface ! ********************************************************************** ! subroutines to implement the swap() routine ! ********************************************************************** ! declare specific subroutines supporting swap() public :: swap interface swap module procedure ascii_character_swap module procedure byte_integer_swap module procedure short_integer_swap module procedure int_integer_swap module procedure long_integer_swap module procedure l_byte_logical_swap module procedure l_short_logical_swap module procedure l_int_logical_swap module procedure l_long_logical_swap module procedure single_real_swap module procedure double_real_swap module procedure quad_real_swap module procedure single_complex_swap module procedure double_complex_swap module procedure quad_complex_swap end interface ! ********************************************************************** ! subroutines to implement the rev_endian() routine ! ********************************************************************** ! declare specific subroutines supporting rev_endian() public :: rev_endian interface rev_endian module procedure short_rev_endian module procedure int_rev_endian module procedure long_rev_endian module procedure l_short_rev_endian module procedure l_int_rev_endian module procedure l_long_rev_endian module procedure single_rev_endian module procedure double_rev_endian module procedure quad_rev_endian module procedure single_complex_rev_endian module procedure double_complex_rev_endian module procedure quad_complex_rev_endian end interface ! ********************************************************************** ! subroutines to implement the rev_bits() routine ! ********************************************************************** ! declare specific subroutines supporting rev_bits() public :: rev_bits interface rev_bits module procedure ascii_rev_bits module procedure byte_rev_bits module procedure l_byte_rev_bits end interface ! ********************************************************************** ! declare module procedure names public public :: bin public :: oct public :: hex public :: binstr public :: octstr public :: hexstr public :: decode public :: encode public :: get_logical_unit ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! ********************************************************************** ! define .xor. binary operator ! ********************************************************************** ! l_byte_xor: xor() for kind l_byte elemental logical( kind= l_byte_k) function l_byte_xor( l1, l2) logical( kind= l_byte_k), intent( in) :: l1, l2 ! l_byte_xor() continue l_byte_xor = l1 .neqv. l2 return ! l_byte_xor() end function l_byte_xor ! ********************************************************************** ! l_short_xor: xor() for kind l_short elemental logical( kind= l_short_k) function l_short_xor( l1, l2) logical( kind= l_short_k), intent( in) :: l1, l2 ! l_short_xor() continue l_short_xor = l1 .neqv. l2 return ! l_short_xor() end function l_short_xor ! ********************************************************************** ! l_int_xor: xor() for kind l_int elemental logical( kind= l_int_k) function l_int_xor( l1, l2) logical( kind= l_int_k), intent( in) :: l1, l2 ! l_int_xor() continue l_int_xor = l1 .neqv. l2 return ! l_int_xor() end function l_int_xor ! ********************************************************************** ! l_long_xor: xor() for kind l_long elemental logical( kind= l_long_k) function l_long_xor( l1, l2) logical( kind= l_long_k), intent( in) :: l1, l2 ! l_long_xor() continue l_long_xor = l1 .neqv. l2 return ! l_long_xor() end function l_long_xor ! ********************************************************************** ! define .mod. binary operator ! ********************************************************************** ! byte_mod(): .mod. for kind byte elemental integer( kind= byte_k) function byte_mod( a, p) integer( kind= byte_k), intent( in) :: a, p ! byte_mod() continue byte_mod = mod( a, p) return ! byte_mod() end function byte_mod ! ********************************************************************** ! short_mod(): .mod. for kind short elemental integer( kind= short_k) function short_mod( a, p) integer( kind= short_k), intent( in) :: a, p ! short_mod() continue short_mod = mod( a, p) return ! short_mod() end function short_mod ! ********************************************************************** ! int_mod(): .mod. for kind int elemental integer( kind= int_k) function int_mod( a, p) integer( kind= int_k), intent( in) :: a, p ! int_mod() continue int_mod = mod( a, p) return ! int_mod() end function int_mod ! ********************************************************************** ! long_mod(): .mod. for kind long elemental integer( kind= long_k) function long_mod( a, p) integer( kind= long_k), intent( in) :: a, p ! long_mod() continue long_mod = mod( a, p) return ! long_mod() end function long_mod ! ********************************************************************** ! single_mod(): .mod. for kind single elemental real( kind= single_k) function single_mod( a, p) real( kind= single_k), intent( in) :: a, p ! single_mod() continue single_mod = mod( a, p) return ! single_mod() end function single_mod ! ********************************************************************** ! double_mod(): .mod. for kind double elemental real( kind= double_k) function double_mod( a, p) real( kind= double_k), intent( in) :: a, p ! double_mod() continue double_mod = mod( a, p) return ! double_mod() end function double_mod ! ********************************************************************** ! quad_mod(): .mod. for kind quad elemental real( kind= quad_k) function quad_mod( a, p) real( kind= quad_k), intent( in) :: a, p ! quad_mod() continue quad_mod = mod( a, p) return ! quad_mod() end function quad_mod ! ********************************************************************** ! define .modulo. binary operator ! ********************************************************************** ! byte_modulo(): .modulo. for kind byte elemental integer( kind= byte_k) function byte_modulo( a, p) integer( kind= byte_k), intent( in) :: a, p ! byte_modulo() continue byte_modulo = modulo( a, p) return ! byte_modulo() end function byte_modulo ! ********************************************************************** ! short_modulo(): .modulo. for kind short elemental integer( kind= short_k) function short_modulo( a, p) integer( kind= short_k), intent( in) :: a, p ! short_modulo() continue short_modulo = modulo( a, p) return ! short_modulo() end function short_modulo ! ********************************************************************** ! int_modulo(): .modulo. for kind int elemental integer( kind= int_k) function int_modulo( a, p) integer( kind= int_k), intent( in) :: a, p ! int_modulo() continue int_modulo = modulo( a, p) return ! int_modulo() end function int_modulo ! ********************************************************************** ! long_modulo(): .modulo. for kind long elemental integer( kind= long_k) function long_modulo( a, p) integer( kind= long_k), intent( in) :: a, p ! long_modulo() continue long_modulo = modulo( a, p) return ! long_modulo() end function long_modulo ! ********************************************************************** ! single_modulo(): .modulo. for kind single elemental real( kind= single_k) function single_modulo( a, p) real( kind= single_k), intent( in) :: a, p ! single_modulo() continue single_modulo = modulo( a, p) return ! single_modulo() end function single_modulo ! ********************************************************************** ! double_modulo(): .modulo. for kind double elemental real( kind= double_k) function double_modulo( a, p) real( kind= double_k), intent( in) :: a, p ! double_modulo() continue double_modulo = modulo( a, p) return ! double_modulo() end function double_modulo ! ********************************************************************** ! quad_modulo(): .modulo. for kind quad elemental real( kind= quad_k) function quad_modulo( a, p) real( kind= quad_k), intent( in) :: a, p ! quad_modulo() continue quad_modulo = modulo( a, p) return ! quad_modulo() end function quad_modulo ! ********************************************************************** ! define iseven()/isodd() for integer kinds ! ********************************************************************** ! byte_iseven(): iseven() for kind byte elemental logical function byte_iseven( a) integer( kind= byte_k), intent( in) :: a ! byte_iseven() continue byte_iseven = iand( a, 1_byte_k) == 0_byte_k return ! byte_iseven() end function byte_iseven ! ********************************************************************** ! short_iseven(): iseven() for kind short elemental logical function short_iseven( a) integer( kind= short_k), intent( in) :: a ! short_iseven() continue short_iseven = iand( a, 1_short_k) == 0_short_k return ! short_iseven() end function short_iseven ! ********************************************************************** ! int_iseven(): iseven() for kind int elemental logical function int_iseven( a) integer( kind= int_k), intent( in) :: a ! int_iseven() continue int_iseven = iand( a, 1_int_k) == 0_int_k return ! int_iseven() end function int_iseven ! ********************************************************************** ! long_iseven(): iseven() for kind long elemental logical function long_iseven( a) integer( kind= long_k), intent( in) :: a ! long_iseven() continue long_iseven = iand( a, 1_long_k) == 0_long_k return ! long_iseven() end function long_iseven ! ********************************************************************** ! byte_isodd(): isodd() for kind byte elemental logical function byte_isodd( a) integer( kind= byte_k), intent( in) :: a ! byte_isodd() continue byte_isodd = iand( a, 1_byte_k) == 1_byte_k return ! byte_isodd() end function byte_isodd ! ********************************************************************** ! short_isodd(): isodd() for kind short elemental logical function short_isodd( a) integer( kind= short_k), intent( in) :: a ! short_isodd() continue short_isodd = iand( a, 1_short_k) == 1_short_k return ! short_isodd() end function short_isodd ! ********************************************************************** ! int_isodd(): isodd() for kind int elemental logical function int_isodd( a) integer( kind= int_k), intent( in) :: a ! int_isodd() continue int_isodd = iand( a, 1_int_k) == 1_int_k return ! int_isodd() end function int_isodd ! ********************************************************************** ! long_isodd(): isodd() for kind long elemental logical function long_isodd( a) integer( kind= long_k), intent( in) :: a ! long_isodd() continue long_isodd = iand( a, 1_long_k) == 1_long_k return ! long_isodd() end function long_isodd ! ********************************************************************** ! define gcd()/lcm() ! ********************************************************************** ! byte_gcd() gcd() for kind byte_k elemental integer( kind= byte_k) function byte_gcd( a, b) integer( kind= byte_k), intent( in) :: a, b ! byte_gcd() local integer( kind= byte_k) :: a_gcd, b_gcd, rnp1, rn, rnm1 ! byte_gcd() continue ! if a or b zero, abs( other) is gcd zero_a: if( a == 0_byte_k )then byte_gcd = abs( b) return endif zero_a zero_b: if( b == 0_byte_k )then byte_gcd = abs( a) return endif zero_b ! set |a| >= |b| ( > 0) ! r1 = a .mod. b ! r0 = b a_gcd = max( abs( a), abs( b)) b_gcd = min( abs( a), abs( b)) rn = a_gcd .mod. b_gcd rnm1 = b_gcd ! while rn /= 0 ! compute rn+1 = rn .mod. rn-1 ! gcd() = rnm1 zero_rem: do while( rn /= 0_byte_k) rnp1 = rnm1 .mod. rn rnm1 = rn rn = rnp1 enddo zero_rem byte_gcd = rnm1 return ! byte_gcd() end function byte_gcd ! ********************************************************************** ! short_gcd() gcd() for kind short_k elemental integer( kind= short_k) function short_gcd( a, b) integer( kind= short_k), intent( in) :: a, b ! short_gcd() local integer( kind= short_k) :: a_gcd, b_gcd, rnp1, rn, rnm1 ! short_gcd() continue ! if a or b zero, abs( other) is gcd zero_a: if( a == 0_short_k )then short_gcd = abs( b) return endif zero_a zero_b: if( b == 0_short_k )then short_gcd = abs( a) return endif zero_b ! set |a| >= |b| ( > 0) ! r1 = a .mod. b ! r0 = b a_gcd = max( abs( a), abs( b)) b_gcd = min( abs( a), abs( b)) rn = a_gcd .mod. b_gcd rnm1 = b_gcd ! while rn /= 0 ! compute rn+1 = rn .mod. rn-1 ! gcd() = rnm1 zero_rem: do while( rn /= 0_short_k) rnp1 = rnm1 .mod. rn rnm1 = rn rn = rnp1 enddo zero_rem short_gcd = rnm1 return ! short_gcd() end function short_gcd ! ********************************************************************** ! int_gcd() gcd() for kind int_k elemental integer( kind= int_k) function int_gcd( a, b) integer( kind= int_k), intent( in) :: a, b ! int_gcd() local integer( kind= int_k) :: a_gcd, b_gcd, rnp1, rn, rnm1 ! int_gcd() continue ! if a or b zero, abs( other) is gcd zero_a: if( a == 0_int_k )then int_gcd = abs( b) return endif zero_a zero_b: if( b == 0_int_k )then int_gcd = abs( a) return endif zero_b ! set |a| >= |b| ( > 0) ! r1 = a .mod. b ! r0 = b a_gcd = max( abs( a), abs( b)) b_gcd = min( abs( a), abs( b)) rn = a_gcd .mod. b_gcd rnm1 = b_gcd ! while rn /= 0 ! compute rn+1 = rn .mod. rn-1 ! gcd() = rnm1 zero_rem: do while( rn /= 0_int_k) rnp1 = rnm1 .mod. rn rnm1 = rn rn = rnp1 enddo zero_rem int_gcd = rnm1 return ! int_gcd() end function int_gcd ! ********************************************************************** ! long_gcd() gcd() for kind long_k elemental integer( kind= long_k) function long_gcd( a, b) integer( kind= long_k), intent( in) :: a, b ! long_gcd() local integer( kind= long_k) :: a_gcd, b_gcd, rnp1, rn, rnm1 ! long_gcd() continue ! if a or b zero, abs( other) is gcd zero_a: if( a == 0_long_k )then long_gcd = abs( b) return endif zero_a zero_b: if( b == 0_long_k )then long_gcd = abs( a) return endif zero_b ! set |a| >= |b| ( > 0) ! r1 = a .mod. b ! r0 = b a_gcd = max( abs( a), abs( b)) b_gcd = min( abs( a), abs( b)) rn = a_gcd .mod. b_gcd rnm1 = b_gcd ! while rn /= 0 ! compute rn+1 = rn .mod. rn-1 ! gcd() = rnm1 zero_rem: do while( rn /= 0_long_k) rnp1 = rnm1 .mod. rn rnm1 = rn rn = rnp1 enddo zero_rem long_gcd = rnm1 return ! long_gcd() end function long_gcd ! ********************************************************************** ! lcm ! ********************************************************************** ! byte_lcm() lcm() for kind= byte_k elemental integer( kind= byte_k) function byte_lcm( a, b) integer( kind= byte_k), intent( in) :: a, b ! byte_lcm() continue byte_lcm = ( a* b) / gcd( a, b) return ! byte_lcm() end function byte_lcm ! ********************************************************************** ! short_lcm() lcm() for kind= short_k elemental integer( kind= short_k) function short_lcm( a, b) integer( kind= short_k), intent( in) :: a, b ! short_lcm() continue short_lcm = ( a* b) / gcd( a, b) return ! short_lcm() end function short_lcm ! ********************************************************************** ! int_lcm() lcm() for kind= int_k elemental integer( kind= int_k) function int_lcm( a, b) integer( kind= int_k), intent( in) :: a, b ! int_lcm() continue int_lcm = ( a* b) / gcd( a, b) return ! int_lcm() end function int_lcm ! ********************************************************************** ! long_lcm() lcm() for kind= long_k elemental integer( kind= long_k) function long_lcm( a, b) integer( kind= long_k), intent( in) :: a, b ! long_lcm() continue long_lcm = ( a* b) / gcd( a, b) return ! long_lcm() end function long_lcm ! ********************************************************************** ! define cd()/cr() for integer kinds ! ********************************************************************** ! byte_cd(): .cd., cd() for kind byte elemental integer( kind= byte_k) function byte_cd( j, k) integer( kind= byte_k), intent( in) :: j, k ! byte_cd() continue byte_cd = ( j + k - 1_byte_k) / k return ! byte_cd() end function byte_cd ! ********************************************************************** ! short_cd(): .cd., cd() for kind short elemental integer( kind= short_k) function short_cd( j, k) integer( kind= short_k), intent( in) :: j, k ! short_cd() continue short_cd = ( j + k - 1_short_k) / k return ! short_cd() end function short_cd ! ********************************************************************** ! int_cd(): .cd., cd() for kind int elemental integer( kind= int_k) function int_cd( j, k) integer( kind= int_k), intent( in) :: j, k ! int_cd() continue int_cd = ( j + k - 1_int_k) / k return ! int_cd() end function int_cd ! ********************************************************************** ! long_cd(): .cd., cd() for kind long elemental integer( kind= long_k) function long_cd( j, k) integer( kind= long_k), intent( in) :: j, k ! long_cd() continue long_cd = ( j + k - 1_long_k) / k return ! long_cd() end function long_cd ! ********************************************************************** ! byte_cr(): .cr., cr() for kind byte elemental integer( kind= byte_k) function byte_cr( j, k) integer( kind= byte_k), intent( in) :: j, k ! byte_cr() continue byte_cr = j - k * cd( j, k) return ! byte_cr() end function byte_cr ! ********************************************************************** ! short_cr(): .cr., cr() for kind short elemental integer( kind= short_k) function short_cr( j, k) integer( kind= short_k), intent( in) :: j, k ! short_cr() continue short_cr = j - k * cd( j, k) return ! short_cr() end function short_cr ! ********************************************************************** ! int_cr(): .cr., cr() for kind int elemental integer( kind= int_k) function int_cr( j, k) integer( kind= int_k), intent( in) :: j, k ! int_cr() continue int_cr = j - k * cd( j, k) return ! int_cr() end function int_cr ! ********************************************************************** ! long_cr(): .cr., cr() for kind long elemental integer( kind= long_k) function long_cr( j, k) integer( kind= long_k), intent( in) :: j, k ! long_cr() continue long_cr = j - k * cd( j, k) return ! long_cr() end function long_cr ! ********************************************************************** ! define hex()/oct()/bin() integer from string ! ********************************************************************** ! hex() hex string to int integer function hex( hexstr, stat) character( len= *), intent( in) :: hexstr integer, optional, intent( out) :: stat ! hex() local character( len= hexstr_len) :: str integer :: istr, jloc ! hex() digits table character( len= *), parameter :: lc_digits = '0123456789abcdef' ! ********************************************************************** ! hex() continue ! make local copy of input string str = adjustl( hexstr) ! force lower case for A-F digits to_lc: do istr = 1, hexstr_len force_lc: select case( str( istr: istr)) case( 'A': 'F' ) force_lc str( istr: istr) = char( ichar( str( istr: istr)) + 32) end select force_lc enddo to_lc ! initialize for decode loop istr = 1 hex = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits, str( istr: istr)) no_hex: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char hex = 0 return endif no_hex hex = hex * 16 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! hex() end function hex ! ********************************************************************** ! oct() octal string to int integer function oct( octstr, stat) character( len= *), intent( in) :: octstr integer, optional, intent( out) :: stat ! oct() local character( len= octstr_len) :: str integer :: istr, jloc ! oct() digits table character( len= *), parameter :: lc_digits = '01234567' ! ********************************************************************** ! oct() continue ! make local copy of input string str = adjustl( octstr) ! initialize for decode loop istr = 1 oct = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits, str( istr: istr)) no_oct: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char oct = 0 return endif no_oct oct = oct * 8 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! oct() end function oct ! ********************************************************************** ! bin() binary string to int integer function bin( binstr, stat) character( len= *), intent( in) :: binstr integer, optional, intent( out) :: stat ! bin() local character( len= binstr_len) :: str integer :: istr, jloc ! bin() digits table character( len= *), parameter :: lc_digits = '01' ! ********************************************************************** ! bin() continue ! make local copy of input string str = adjustl( binstr) ! initialize for decode loop istr = 1 bin = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits( 1: 2), str( istr: istr)) no_bin: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char bin = 0 return endif no_bin bin = bin * 2 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! bin() end function bin ! ********************************************************************** ! define hexstr()/octstr()/binstr() string from integer ! ********************************************************************** ! hexstr() integer to hex string character( len= hexstr_len) function hexstr( i, lc) integer, intent( in) :: i logical, optional, intent( in) :: lc ! hexstr() digits tables character( len= *), parameter :: lc_digits = '0123456789abcdef' character( len= *), parameter :: uc_digits = '0123456789ABCDEF' ! hexstr() local character( len= len( lc_digits)) :: hex_digits integer :: hex_i, jstr, kdig logical :: hex_lc ! ********************************************************************** ! hexstr() continue ! lc argument is present lc_arg: if( present( lc) )then hex_lc = lc else lc_arg hex_lc = .true. endif lc_arg ! lower case or upper case lc_uc: if( hex_lc )then hex_digits = lc_digits else lc_uc hex_digits = uc_digits endif lc_uc ! initialize encode loop jstr = hexstr_len hexstr = ' ' hexstr( jstr: jstr) = '0' hex_i = i ! encode loop each_digit: do while( hex_i /= 0) kdig = iand( hex_i, 15) + 1 hexstr( jstr: jstr) = hex_digits( kdig: kdig) hex_i = ishft( hex_i, -4) jstr = jstr - 1 enddo each_digit hexstr = adjustl( hexstr) ! successful return return ! hexstr() end function hexstr ! ********************************************************************** ! octstr() integer to octal string character( len= octstr_len) function octstr( i) integer, intent( in) :: i ! octstr() local integer :: oct_i, jstr, kdig ! hex()/oct()/bin() digits table character( len= *), parameter :: lc_digits = '01234567' ! ********************************************************************** ! octstr() continue ! initialize encode loop jstr = octstr_len octstr = ' ' octstr( jstr: jstr) = '0' oct_i = i ! encode loop each_digit: do while( oct_i /= 0) kdig = iand( oct_i, 7) + 1 octstr( jstr: jstr) = lc_digits( kdig: kdig) oct_i = ishft( oct_i, -3) jstr = jstr - 1 enddo each_digit octstr = adjustl( octstr) ! successful return return ! octstr() end function octstr ! ********************************************************************** ! binstr() integer to binary string character( len= binstr_len) function binstr( i) integer, intent( in) :: i ! binstr() local integer :: bin_i, jstr, kdig ! hex()/oct()/bin() digits table character( len= *), parameter :: lc_digits = '01' ! ********************************************************************** ! binstr() continue ! initialize encode loop jstr = binstr_len binstr = ' ' binstr( jstr: jstr) = '0' bin_i = i ! encode loop each_digit: do while( bin_i /= 0) kdig = iand( bin_i, 1) + 1 binstr( jstr: jstr) = lc_digits( kdig: kdig) bin_i = ishft( bin_i, -1) jstr = jstr - 1 enddo each_digit binstr = adjustl( binstr) ! successful return return ! binstr() end function binstr ! ********************************************************************** ! define encode() & decode() ! ********************************************************************** ! encode(): integer to character string using translation table pure subroutine encode( str, i, ttable, stat) character( len= *), intent( out) :: str integer, intent( in) :: i character( len= *), intent( in) :: ttable integer, optional, intent( out) :: stat ! encode() local integer :: base integer :: jstr, lenstr, loci, next_char ! encode() continue ! string lengths lenstr = len( str) base = len( ttable) bad_base: if( base < 1 )then status_error: if( present( stat) )then stat = error_bad_base endif status_error return endif bad_base loci = i str = ' ' ! encode i in str next_char = lenstr + 1 ! do positive i all_chars: do while( loci > 0 ) jstr = (loci .mod. base) + 1 overflow: if( next_char > 1 )then next_char = next_char - 1 str( next_char: next_char) = ttable( jstr: jstr) elseif( next_char == 1 )then overflow str = '*' if( present( stat) ) stat = error_short_string return endif overflow loci = loci / base enddo all_chars status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! encode() end subroutine encode ! ********************************************************************** ! decode(): character string to integer using ttable pure subroutine decode( i, str, ttable, stat) integer, intent( out) :: i character( len= *), intent( in) :: str character( len= *), intent( in) :: ttable integer, optional, intent( out) :: stat ! decode() local character( len= len( str)) :: str_buff integer :: base integer :: jstr ! decode() continue ! check input str_buff = adjustl( str) base = len( ttable) i = 0 bad_base: if( base < 1 )then status_error: if( present( stat) )then stat = error_bad_base endif status_error return endif bad_base ! scan str each_char: do while( str_buff /= ' ') jstr = index( ttable, str_buff( 1: 1)) bad_char: if( jstr == substring_not_found )then i = 0 if( present( stat) ) stat = error_not_in_table return endif bad_char i = i*base + ( jstr - 1) str_buff = str_buff( 2: ) enddo each_char status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! decode() end subroutine decode ! ********************************************************************** ! rrint()- randomly round real to integer ! ********************************************************************** ! single_rrint: rrint() for kind single integer function single_rrint( a) real( kind= single_k), intent( in) :: a ! single_rrint() local real( kind= single_k) :: r integer :: i ! single_rrint() continue overflow: if( int( a) >= huge( i) )then single_rrint = huge( i) return elseif( int( a) <= -huge( i) )then overflow single_rrint = -huge( i) return endif overflow call random_number( r) ! down if close to floor, up if close to ceiling hi_lo: if( ( a - real( floor( a), kind= single_k)) <= r )then i = floor( a) else hi_lo i = ceiling( a) endif hi_lo single_rrint = i return ! single_rrint() end function single_rrint ! ********************************************************************** ! double_rrint: rrint() for kind double integer function double_rrint( a) real( kind= double_k), intent( in) :: a ! double_rrint() local real( kind= double_k) :: r integer :: i ! double_rrint() continue overflow: if( int( a) >= huge( i) )then double_rrint = huge( i) return elseif( int( a) <= -huge( i) )then overflow double_rrint = -huge( i) return endif overflow call random_number( r) ! down if close to floor, up if close to ceiling hi_lo: if( ( a - real( floor( a), kind= double_k)) <= r )then i = floor( a) else hi_lo i = ceiling( a) endif hi_lo double_rrint = i return ! double_rrint() end function double_rrint ! ********************************************************************** ! quad_rrint: rrint() for kind quad integer function quad_rrint( a) real( kind= quad_k), intent( in) :: a ! quad_rrint() local real( kind= quad_k) :: r integer :: i ! quad_rrint() continue overflow: if( int( a) >= huge( i) )then quad_rrint = huge( i) return elseif( int( a) <= -huge( i) )then overflow quad_rrint = -huge( i) return endif overflow call random_number( r) ! down if close to floor, up if close to ceiling hi_lo: if( ( a - real( floor( a), kind= quad_k)) <= r )then i = floor( a) else hi_lo i = ceiling( a) endif hi_lo quad_rrint = i return ! quad_rrint() end function quad_rrint ! ********************************************************************** ! start_rng() for real kinds ! ********************************************************************** ! single_start_rng(): start_rng() for kind single subroutine single_start_rng( rngs, log_unit) ! array of random variables real( kind= single_k), dimension( :), intent( out) :: rngs ! unit to receive the seed value integer, optional, intent( in) :: log_unit ! format of the seed value character( len= *), parameter :: seed_fmt = '( a, 99i10)' ! single_start_rng() local character( len= date_len) :: date_str character( len= time_len) :: time_str integer, dimension( values_size) :: dt_values integer, dimension( :), allocatable :: rng_seed integer :: seed_size ! single_start_rng() continue call random_seed( size = seed_size) allocate( rng_seed( seed_size)) call date_and_time( date= date_str, time= time_str, values= dt_values) rng_seed( 1) = sum( dt_values * dt_values) if( seed_size > 1 ) rng_seed( 2) = sum( dt_values * (/ dt_values( 2: seed_size), dt_values( 1) /) ) if( seed_size > 2 ) rng_seed( 3) = sum( dt_values * (/ dt_values( 3: seed_size), dt_values( 1: 2) /) ) if( seed_size > 3 ) rng_seed( 4) = sum( dt_values * (/ dt_values( 4: seed_size), dt_values( 1: 3) /) ) if( seed_size > 4 ) rng_seed( 5) = sum( dt_values * (/ dt_values( 5: seed_size), dt_values( 1: 4) /) ) if( seed_size > 5 ) rng_seed( 6) = sum( dt_values * (/ dt_values( 6: seed_size), dt_values( 1: 5) /) ) if( seed_size > 6 ) rng_seed( 7) = sum( dt_values * (/ dt_values( 7: seed_size), dt_values( 1: 6) /) ) if( seed_size > 7 ) rng_seed( 8) = sum( dt_values * (/ dt_values( 8: seed_size), dt_values( 1: 7) /) ) if( seed_size > 8 ) rng_seed( 9: ) = 0 got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= seed_fmt) 'random seed is ', rng_seed else got_unit write( unit= *, fmt= seed_fmt) 'random seed is ', rng_seed end if got_unit call random_number( harvest= rngs) return ! single_start_rng() end subroutine single_start_rng ! ********************************************************************** ! double_start_rng(): start_rng() for kind double subroutine double_start_rng( rngs, log_unit) ! array of random variables real( kind= double_k), dimension( :), intent( out) :: rngs ! unit to receive the seed value integer, optional, intent( in) :: log_unit ! format of the seed value character( len= *), parameter :: seed_fmt = '( a, 99i10)' ! double_start_rng() local character( len= date_len) :: date_str character( len= time_len) :: time_str integer, dimension( values_size) :: dt_values integer, dimension( :), allocatable :: rng_seed integer :: seed_size ! double_start_rng() continue call random_seed( size = seed_size) allocate( rng_seed( seed_size)) call date_and_time( date= date_str, time= time_str, values= dt_values) rng_seed( 1) = sum( dt_values * dt_values) if( seed_size > 1 ) rng_seed( 2) = sum( dt_values * (/ dt_values( 2: seed_size), dt_values( 1) /) ) if( seed_size > 2 ) rng_seed( 3) = sum( dt_values * (/ dt_values( 3: seed_size), dt_values( 1: 2) /) ) if( seed_size > 3 ) rng_seed( 4) = sum( dt_values * (/ dt_values( 4: seed_size), dt_values( 1: 3) /) ) if( seed_size > 4 ) rng_seed( 5) = sum( dt_values * (/ dt_values( 5: seed_size), dt_values( 1: 4) /) ) if( seed_size > 5 ) rng_seed( 6) = sum( dt_values * (/ dt_values( 6: seed_size), dt_values( 1: 5) /) ) if( seed_size > 6 ) rng_seed( 7) = sum( dt_values * (/ dt_values( 7: seed_size), dt_values( 1: 6) /) ) if( seed_size > 7 ) rng_seed( 8) = sum( dt_values * (/ dt_values( 8: seed_size), dt_values( 1: 7) /) ) if( seed_size > 8 ) rng_seed( 9: ) = 0 got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= seed_fmt) 'random seed is ', rng_seed else got_unit write( unit= *, fmt= seed_fmt) 'random seed is ', rng_seed end if got_unit call random_number( harvest= rngs) return ! double_start_rng() end subroutine double_start_rng ! ********************************************************************** ! quad_start_rng(): start_rng() for kind quad subroutine quad_start_rng( rngs, log_unit) ! array of random variables real( kind= quad_k), dimension( :), intent( out) :: rngs ! unit to receive the seed value integer, optional, intent( in) :: log_unit ! format of the seed value character( len= *), parameter :: seed_fmt = '( a, 99i10)' ! quad_start_rng() local character( len= date_len) :: date_str character( len= time_len) :: time_str integer, dimension( values_size) :: dt_values integer, dimension( :), allocatable :: rng_seed integer :: seed_size ! quad_start_rng() continue call random_seed( size = seed_size) allocate( rng_seed( seed_size)) call date_and_time( date= date_str, time= time_str, values= dt_values) rng_seed( 1) = sum( dt_values * dt_values) if( seed_size > 1 ) rng_seed( 2) = sum( dt_values * (/ dt_values( 2: seed_size), dt_values( 1) /) ) if( seed_size > 2 ) rng_seed( 3) = sum( dt_values * (/ dt_values( 3: seed_size), dt_values( 1: 2) /) ) if( seed_size > 3 ) rng_seed( 4) = sum( dt_values * (/ dt_values( 4: seed_size), dt_values( 1: 3) /) ) if( seed_size > 4 ) rng_seed( 5) = sum( dt_values * (/ dt_values( 5: seed_size), dt_values( 1: 4) /) ) if( seed_size > 5 ) rng_seed( 6) = sum( dt_values * (/ dt_values( 6: seed_size), dt_values( 1: 5) /) ) if( seed_size > 6 ) rng_seed( 7) = sum( dt_values * (/ dt_values( 7: seed_size), dt_values( 1: 6) /) ) if( seed_size > 7 ) rng_seed( 8) = sum( dt_values * (/ dt_values( 8: seed_size), dt_values( 1: 7) /) ) if( seed_size > 8 ) rng_seed( 9: ) = 0 got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= seed_fmt) 'random seed is ', rng_seed else got_unit write( unit= *, fmt= seed_fmt) 'random seed is ', rng_seed end if got_unit call random_number( harvest= rngs) return ! quad_start_rng() end subroutine quad_start_rng ! ********************************************************************** ! define timestamp() ! ********************************************************************** ! timestamp(): write a timestamped message to a log file subroutine timestamp( log_unit, message) integer, intent( in), optional :: log_unit character( len= *), intent( in) :: message character( len= *), parameter :: message_fmt = '( a)' character( len= *), parameter :: slash = '/' character( len= *), parameter :: colon = ':' ! timestamp() local character( len= date_len) :: date_str character( len= time_len) :: time_str ! timestamp() continue call date_and_time( date= date_str, time= time_str) got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= message_fmt) date_str( 1: 4) // slash // date_str( 5: 6) // date_str( 7: 8) // ' ' & // time_str( 1: 2) // colon // time_str( 3: 4) // time_str( 5: 6) // '.' time_str( 7: time_len) & // trim( message) else got_unit write( unit= *, fmt= message_fmt) date_str( 1: 4) // slash // date_str( 5: 6) // date_str( 7: 8) // ' ' & // time_str( 1: 2) // colon // time_str( 3: 4) // time_str( 5: 6) // '.' time_str( 7: time_len) & // trim( message) end if got_unit return ! timestamp() end subroutine timestamp ! ---------------------------------------------------------------------- ! ********************************************************************** ! define pause() ! ********************************************************************** ! int_pause(): pause or pause n subroutine subroutine int_pause( n) integer, intent( in), optional :: n ! int_pause() continue n_arg: if( present( n) )then write( unit= *, fmt= ps_fmt_ai) ' pause: ', n else n_arg write( unit= *, fmt= ps_fmt_a) ' pause' end if n_arg read( unit= *, fmt= *) return ! int_pause() end subroutine int_pause ! ---------------------------------------------------------------------- ! char_pause(): pause 'string' subroutine subroutine char_pause( string) character( len= *), intent( in) :: string ! char_pause() continue write( unit= *, fmt= ps_fmt_aa) ' pause: ', trim( string) read( unit= *, fmt= *) return ! char_pause() end subroutine char_pause ! ********************************************************************** ! swap() ! ********************************************************************** ! ascii_character_swap() elemental subroutine ascii_character_swap( a, b) character( kind= ascii_k), intent( inout) :: a, b ! ascii_character_swap() local character( kind= ascii_k) :: t1, t2 ! ascii_character_swap() continue t1 = a t2 = b b = t1 a = t2 return ! ascii_character_swap() end subroutine ascii_character_swap ! ********************************************************************** ! byte_integer_swap() elemental subroutine byte_integer_swap( a, b) integer( kind= byte_k), intent( inout) :: a, b ! byte_integer_swap() local integer( kind= byte_k) :: t1, t2 ! byte_integer_swap() continue t1 = a t2 = b b = t1 a = t2 return ! byte_integer_swap() end subroutine byte_integer_swap ! ********************************************************************** ! short_integer_swap() elemental subroutine short_integer_swap( a, b) integer( kind= short_k), intent( inout) :: a, b ! short_integer_swap() local integer( kind= short_k) :: t1, t2 ! short_integer_swap() continue t1 = a t2 = b b = t1 a = t2 return ! short_integer_swap() end subroutine short_integer_swap ! ********************************************************************** ! int_integer_swap() elemental subroutine int_integer_swap( a, b) integer( kind= int_k), intent( inout) :: a, b ! int_integer_swap() local integer( kind= int_k) :: t1, t2 ! int_integer_swap() continue t1 = a t2 = b b = t1 a = t2 return ! int_integer_swap() end subroutine int_integer_swap ! ********************************************************************** ! long_integer_swap() elemental subroutine long_integer_swap( a, b) integer( kind= long_k), intent( inout) :: a, b ! long_integer_swap() local integer( kind= long_k) :: t1, t2 ! long_integer_swap() continue t1 = a t2 = b b = t1 a = t2 return ! long_integer_swap() end subroutine long_integer_swap ! ********************************************************************** ! l_byte_logical_swap() elemental subroutine l_byte_logical_swap( a, b) logical( kind= l_byte_k), intent( inout) :: a, b ! l_byte_logical_swap() local logical( kind= l_byte_k) :: t1, t2 ! l_byte_logical_swap() continue t1 = a t2 = b b = t1 a = t2 return ! l_byte_logical_swap() end subroutine l_byte_logical_swap ! ********************************************************************** ! l_short_logical_swap() elemental subroutine l_short_logical_swap( a, b) logical( kind= l_short_k), intent( inout) :: a, b ! l_short_logical_swap() local logical( kind= l_short_k) :: t1, t2 ! l_short_logical_swap() continue t1 = a t2 = b b = t1 a = t2 return ! l_short_logical_swap() end subroutine l_short_logical_swap ! ********************************************************************** ! l_int_logical_swap() elemental subroutine l_int_logical_swap( a, b) logical( kind= l_int_k), intent( inout) :: a, b ! l_int_logical_swap() local logical( kind= l_int_k) :: t1, t2 ! l_int_logical_swap() continue t1 = a t2 = b b = t1 a = t2 return ! l_int_logical_swap() end subroutine l_int_logical_swap ! ********************************************************************** ! l_long_logical_swap() elemental subroutine l_long_logical_swap( a, b) logical( kind= l_long_k), intent( inout) :: a, b ! l_long_logical_swap() local logical( kind= l_long_k) :: t1, t2 ! l_long_logical_swap() continue t1 = a t2 = b b = t1 a = t2 return ! l_long_logical_swap() end subroutine l_long_logical_swap ! ********************************************************************** ! single_real_swap() elemental subroutine single_real_swap( a, b) real( kind= single_k), intent( inout) :: a, b ! single_real_swap() local real( kind= single_k) :: t1, t2 ! single_real_swap() continue t1 = a t2 = b b = t1 a = t2 return ! single_real_swap() end subroutine single_real_swap ! ********************************************************************** ! double_real_swap() elemental subroutine double_real_swap( a, b) real( kind= double_k), intent( inout) :: a, b ! double_real_swap() local real( kind= double_k) :: t1, t2 ! double_real_swap() continue t1 = a t2 = b b = t1 a = t2 return ! double_real_swap() end subroutine double_real_swap ! ********************************************************************** ! quad_real_swap() elemental subroutine quad_real_swap( a, b) real( kind= quad_k), intent( inout) :: a, b ! quad_real_swap() local real( kind= quad_k) :: t1, t2 ! quad_real_swap() continue t1 = a t2 = b b = t1 a = t2 return ! quad_real_swap() end subroutine quad_real_swap ! ********************************************************************** ! single_complex_swap() elemental subroutine single_complex_swap( a, b) complex( kind= single_k), intent( inout) :: a, b ! single_complex_swap() local complex( kind= single_k) :: t1, t2 ! single_complex_swap() continue t1 = a t2 = b b = t1 a = t2 return ! single_complex_swap() end subroutine single_complex_swap ! ********************************************************************** ! double_complex_swap() elemental subroutine double_complex_swap( a, b) complex( kind= double_k), intent( inout) :: a, b ! double_complex_swap() local complex( kind= double_k) :: t1, t2 ! double_complex_swap() continue t1 = a t2 = b b = t1 a = t2 return ! double_complex_swap() end subroutine double_complex_swap ! ********************************************************************** ! quad_complex_swap() elemental subroutine quad_complex_swap( a, b) complex( kind= quad_k), intent( inout) :: a, b ! quad_complex_swap() local complex( kind= quad_k) :: t1, t2 ! quad_complex_swap() continue t1 = a t2 = b b = t1 a = t2 return ! quad_complex_swap() end subroutine quad_complex_swap ! ********************************************************************** ! rev_endian() ! ********************************************************************** ! short_rev_endian() elemental integer( kind= short_k) function short_rev_endian( a) integer( kind= short_k), intent( in) :: a ! short_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_short_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! short_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) short_rev_endian = transfer( tmp, short_rev_endian) return ! short_rev_endian() end function short_rev_endian ! ---------------------------------------------------------------------- ! int_rev_endian() elemental integer( kind= int_k) function int_rev_endian( a) integer( kind= int_k), intent( in) :: a ! int_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_int_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! int_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) int_rev_endian = transfer( tmp, int_rev_endian) return ! int_rev_endian() end function int_rev_endian ! ---------------------------------------------------------------------- ! long_rev_endian() elemental integer( kind= long_k) function long_rev_endian( a) integer( kind= long_k), intent( in) :: a ! long_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_long_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! long_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) long_rev_endian = transfer( tmp, long_rev_endian) return ! long_rev_endian() end function long_rev_endian ! ---------------------------------------------------------------------- ! l_short_rev_endian() elemental logical( kind= l_short_k) function l_short_rev_endian( a) logical( kind= l_short_k), intent( in) :: a ! l_short_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_short_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_short_rev_endian = transfer( tmp, l_short_rev_endian) return ! l_short_rev_endian() end function l_short_rev_endian ! ---------------------------------------------------------------------- ! l_int_rev_endian() elemental logical( kind= l_int_k) function l_int_rev_endian( a) logical( kind= l_int_k), intent( in) :: a ! l_int_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_int_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_int_rev_endian = transfer( tmp, l_int_rev_endian) return ! l_int_rev_endian() end function l_int_rev_endian ! ---------------------------------------------------------------------- ! l_long_rev_endian() elemental logical( kind= l_long_k) function l_long_rev_endian( a) logical( kind= l_long_k), intent( in) :: a ! l_long_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_long_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_long_rev_endian = transfer( tmp, l_long_rev_endian) return ! l_long_rev_endian() end function l_long_rev_endian ! ---------------------------------------------------------------------- ! single_rev_endian() elemental real( kind= single_k) function single_rev_endian( a) real( kind= single_k), intent( in) :: a ! single_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( csu_per_nsu) :: tmp ! single_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) single_rev_endian = transfer( tmp, single_rev_endian) return ! single_rev_endian() end function single_rev_endian ! ---------------------------------------------------------------------- ! double_rev_endian() elemental real( kind= double_k) function double_rev_endian( a) real( kind= double_k), intent( in) :: a ! double_rev_endian() local integer, parameter :: num_bytes = 2 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! double_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) double_rev_endian= transfer( tmp, double_rev_endian) return ! double_rev_endian() end function double_rev_endian ! ---------------------------------------------------------------------- ! quad_rev_endian() elemental real( kind= quad_k) function quad_rev_endian( a) real( kind= quad_k), intent( in) :: a ! quad_rev_endian() local integer, parameter :: num_bytes = 4 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! quad_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) quad_rev_endian= transfer( tmp, quad_rev_endian) return ! quad_rev_endian() end function quad_rev_endian ! ---------------------------------------------------------------------- ! single_complex_rev_endian() elemental complex( kind= single_k) function single_complex_rev_endian( a) complex( kind= single_k), intent( in) :: a ! single_complex_rev_endian() local integer, parameter :: num_bytes = 2 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! single_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) single_complex_rev_endian = transfer( tmp, single_complex_rev_endian) return ! single_complex_rev_endian() end function single_complex_rev_endian ! ---------------------------------------------------------------------- ! double_complex_rev_endian() elemental complex( kind= double_k) function double_complex_rev_endian( a) complex( kind= double_k), intent( in) :: a ! double_complex_rev_endian() local integer, parameter :: num_bytes = 4 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! double_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) double_complex_rev_endian = transfer( tmp, double_complex_rev_endian) return ! double_complex_rev_endian() end function double_complex_rev_endian ! ---------------------------------------------------------------------- ! quad_complex_rev_endian() elemental complex( kind= quad_k) function quad_complex_rev_endian( a) complex( kind= quad_k), intent( in) :: a ! quad_complex_rev_endian() local integer, parameter :: num_bytes = 8 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! quad_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) quad_complex_rev_endian = transfer( tmp, quad_complex_rev_endian) return ! quad_complex_rev_endian() end function quad_complex_rev_endian ! ********************************************************************** ! rev_bits() ! ********************************************************************** ! ascii_rev_bits() elemental character( kind= ascii_k) function ascii_rev_bits( c) character( len= 1, kind= ascii_k), intent( in) :: c ! ascii_rev_buts() local integer( kind= byte_k) :: loci ! ascii_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_1), sh_1)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_2), sh_2)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_3), sh_3)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_4), sh_4)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_5), sh_5)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_6), sh_6)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_7), sh_7)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_8), sh_8)) ascii_rev_bits = char( loci) return ! ascii_rev_bits() end function ascii_rev_bits ! ---------------------------------------------------------------------- ! byte_rev_bits() elemental integer( kind= byte_k) function byte_rev_bits( i) integer( kind= byte_k), intent( in) :: i ! byte_rev_buts() local integer( kind= byte_k) :: loci ! byte_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( i, bit_1), sh_1)) loci = ior( loci, ishft( iand( i, bit_2), sh_2)) loci = ior( loci, ishft( iand( i, bit_3), sh_3)) loci = ior( loci, ishft( iand( i, bit_4), sh_4)) loci = ior( loci, ishft( iand( i, bit_5), sh_5)) loci = ior( loci, ishft( iand( i, bit_6), sh_6)) loci = ior( loci, ishft( iand( i, bit_7), sh_7)) loci = ior( loci, ishft( iand( i, bit_8), sh_8)) byte_rev_bits = loci return ! rev_bits() end function byte_rev_bits ! ---------------------------------------------------------------------- ! l_byte_rev_bits() elemental logical( kind= l_byte_k) function l_byte_rev_bits( i) logical( kind= l_byte_k), intent( in) :: i ! l_byte_rev_buts() local integer( kind= byte_k) :: loci, locj ! l_byte_rev_bits() continue loci = 0 locj = transfer( i, loci) loci = ior( loci, ishft( iand( locj, bit_1), sh_1)) loci = ior( loci, ishft( iand( locj, bit_2), sh_2)) loci = ior( loci, ishft( iand( locj, bit_3), sh_3)) loci = ior( loci, ishft( iand( locj, bit_4), sh_4)) loci = ior( loci, ishft( iand( locj, bit_5), sh_5)) loci = ior( loci, ishft( iand( locj, bit_6), sh_6)) loci = ior( loci, ishft( iand( locj, bit_7), sh_7)) loci = ior( loci, ishft( iand( locj, bit_8), sh_8)) l_byte_rev_bits = transfer( loci, l_byte_rev_bits) return ! rev_bits() end function l_byte_rev_bits ! ********************************************************************** ! find io unit which may be opened ! upon return: if >0, an io unit to open; else not_a_unit ! ********************************************************************** ! integer function get_logical_unit() integer function get_logical_unit( min_unit, max_unit, exclude) integer, optional, intent( in) :: min_unit integer, optional, intent( in) :: max_unit integer, optional, dimension(:), intent( in) :: exclude ! inquire return values integer :: io_stat, io_unit logical :: is_open, is_unit ! local min_unit, max_unit integer :: l_min, l_max ! get_logical_unit() continue ! prepare search limits set_min: if( present( min_unit) )then l_min = min_unit else set_min l_min = 0 endif set_min set_max: if( present( max_unit) )then l_max = max_unit else set_max l_max = huge( 0) endif set_max ! search loop io_units: do io_unit = l_min, l_max inquire( unit= io_unit, opened= is_open, exist= is_unit, iostat= io_stat) error: if( is_io_error( io_stat) )then get_logical_unit = not_a_unit return endif error ready: if( is_unit .and. (.not. is_open) )then not_list: if( present( exclude) )then on_list: if( any( io_unit == exclude) )then cycle io_units endif on_list endif not_list get_logical_unit = io_unit return endif ready enddo io_units ! none found get_logical_unit = not_a_unit return ! get_logical_unit() end function get_logical_unit ! ********************************************************************** ! standard_functions ! $Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $ ! ********************************************************************** end module standard_functions Day-III/06-coco/stdfunc.fpp100777 0 0 152312 11672233502 10712 0! bof ! ********************************************************************** ! Fortran 95 module standard_functions ! ********************************************************************** ! Source Control Strings ! $Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $ ! ********************************************************************** ! Copyright 2009 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! adds a basic set of operators and functions to Fortran 95 programs ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dannagle@verizon.net ! or mail to 4311-G Bob Ct. ! Fairfax, VA 22030 USA ! ********************************************************************** ! standard_functions constants ! error_short_string integer encode() or decode() passed null or short string ! error_bad_base integer encode() or decode() base larger than translation table ! error_not_in_table integer decode() input character not in translation table ! standard_functions operators ! .xor. binary logicals ! .mod. binary integers, reals ! .modulo. binary integers, reals ! .gcd. binary integers ! .lcm. binary integers ! .cd. binary integers ! .cr. binary integers ! standard_functions library ! iseven() logical( integer) ! isodd() logical( integer) ! gcd() greatest common divisor integer( integer, integer) ! lcm() least common multiple integer( integer, integer) ! cd() ceiling division [ ( j+ k- 1) /k ] integer( integer, integer) ! cr() ceiling remainder [ j- k* cd() ] integer( integer, integer) ! rrint() round up with probability ( a - int( a)) or down integer( real) ! hex() string to integer ! oct() string to integer ! bin() string to integer ! hexstr() integer to string ! octstr() integer to string ! binstr() integer to string ! encode() integer to string, arbitrary base, via translate table ! decode() string to integer, arbitrary base, via translate table ! start_rng() starts the rng ! timestamp() writes a time-stamped message to a file ! pause() subroutine pause() | pause( char*(*)) | pause( integer) ! swap() for all tk ! rev_endian() for all tk size > 1 byte ! rev_bits() for all tk size = 1 byte ! get_logical_unit() a logical i/o unit number which may be opened ?? ! ******************************************************************* ?? ! preprocessor dependencies ?? include 'coco.inc' ?? ! ******************************************************************* ! ********************************************************************** module standard_functions ! ********************************************************************** ! use kind parameters use standard_types ! ********************************************************************** ! explicit declaration implicit none ! ********************************************************************** ! explicit export private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), public, parameter :: standard_functions_rcs_id = & '$Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $' ! ********************************************************************** ! standard_functions constants ! ********************************************************************** ! encode()/decode() error codes integer, public, parameter :: error_short_string = 1 integer, public, parameter :: error_bad_base = 2 integer, public, parameter :: error_not_in_table = 3 ! hex()/oct()/bin() string lengths ( note need for ceiling division! ) integer, public, parameter :: hexstr_len = bit_size( 0) / 4 integer, public, parameter :: octstr_len = bit_size( 0)/3 + 1 integer, public, parameter :: binstr_len = bit_size( 0) ! ********************************************************************** ! pause()/stop() formats character( len= *), parameter :: ps_fmt_a = '( a)' character( len= *), parameter :: ps_fmt_ai = '( a, i5.5)' character( len= *), parameter :: ps_fmt_aa = '( a, a)' ?? if( byte_k )then ! ********************************************************************** ! rev_bits masks and shift counts integer( kind= byte_k) :: bit_1 ; data bit_1 / z'01'/ integer( kind= byte_k) :: bit_2 ; data bit_2 / z'02'/ integer( kind= byte_k) :: bit_3 ; data bit_3 / z'04'/ integer( kind= byte_k) :: bit_4 ; data bit_4 / z'08'/ integer( kind= byte_k) :: bit_5 ; data bit_5 / z'10'/ integer( kind= byte_k) :: bit_6 ; data bit_6 / z'20'/ integer( kind= byte_k) :: bit_7 ; data bit_7 / z'40'/ integer( kind= byte_k) :: bit_8 ; data bit_8 / z'80'/ integer( kind= byte_k), parameter :: sh_1 = 7 integer( kind= byte_k), parameter :: sh_2 = 5 integer( kind= byte_k), parameter :: sh_3 = 3 integer( kind= byte_k), parameter :: sh_4 = 1 integer( kind= byte_k), parameter :: sh_5 = -1 integer( kind= byte_k), parameter :: sh_6 = -3 integer( kind= byte_k), parameter :: sh_7 = -5 integer( kind= byte_k), parameter :: sh_8 = -7 ?? endif ! ********************************************************************** ! standard_functions library ! ********************************************************************** ! declare specific functions implementing the .xor. operator public :: operator( .xor.) interface operator( .xor.) ?? if( l_byte_k )then module procedure l_byte_xor ?? endif ?? if( l_short_k )then module procedure l_short_xor ?? endif ?? if( l_int_k )then module procedure l_int_xor ?? endif ?? if( l_long_k )then module procedure l_long_xor ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the .mod. operator public :: operator( .mod.) interface operator( .mod.) ?? if( byte_k )then module procedure byte_mod ?? endif ?? if( short_k )then module procedure short_mod ?? endif ?? if( int_k )then module procedure int_mod ?? endif ?? if( long_k )then module procedure long_mod ?? endif ?? if( single_k )then module procedure single_mod ?? endif ?? if( double_k )then module procedure double_mod ?? endif ?? if( quad_k )then module procedure quad_mod ?? endif end interface ! declare specific functions implementing the .modulo. operator public :: operator( .modulo.) interface operator( .modulo.) ?? if( byte_k )then module procedure byte_modulo ?? endif ?? if( short_k )then module procedure short_modulo ?? endif ?? if( int_k )then module procedure int_modulo ?? endif ?? if( long_k )then module procedure long_modulo ?? endif ?? if( single_k )then module procedure single_modulo ?? endif ?? if( double_k )then module procedure double_modulo ?? endif ?? if( quad_k )then module procedure quad_modulo ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the .gcd. operator public :: operator( .gcd.) interface operator( .gcd.) ?? if( byte_k )then module procedure byte_gcd ?? endif ?? if( short_k )then module procedure short_gcd ?? endif ?? if( int_k )then module procedure int_gcd ?? endif ?? if( long_k )then module procedure long_gcd ?? endif end interface ! declare specific functions implementing the gcd() function public :: gcd interface gcd ?? if( byte_k )then module procedure byte_gcd ?? endif ?? if( short_k )then module procedure short_gcd ?? endif ?? if( int_k )then module procedure int_gcd ?? endif ?? if( long_k )then module procedure long_gcd ?? endif end interface ! declare specific functions implementing the .lcm. operator public :: operator( .lcm.) interface operator( .lcm.) ?? if( byte_k )then module procedure byte_lcm ?? endif ?? if( short_k )then module procedure short_lcm ?? endif ?? if( int_k )then module procedure int_lcm ?? endif ?? if( long_k )then module procedure long_lcm ?? endif end interface ! declare specific functions implementing the lcm() function public :: lcm interface lcm ?? if( byte_k )then module procedure byte_lcm ?? endif ?? if( short_k )then module procedure short_lcm ?? endif ?? if( int_k )then module procedure int_lcm ?? endif ?? if( long_k )then module procedure long_lcm ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the .cd. operator public :: operator( .cd.) interface operator( .cd.) ?? if( byte_k )then module procedure byte_cd ?? endif ?? if( short_k )then module procedure short_cd ?? endif ?? if( int_k )then module procedure int_cd ?? endif ?? if( long_k )then module procedure long_cd ?? endif end interface ! declare specific functions implementing the cd() function public :: cd interface cd ?? if( byte_k )then module procedure byte_cd ?? endif ?? if( short_k )then module procedure short_cd ?? endif ?? if( int_k )then module procedure int_cd ?? endif ?? if( long_k )then module procedure long_cd ?? endif end interface ! declare specific functions implementing the .cr. operator public :: operator( .cr.) interface operator( .cr.) ?? if( byte_k )then module procedure byte_cr ?? endif ?? if( short_k )then module procedure short_cr ?? endif ?? if( int_k )then module procedure int_cr ?? endif ?? if( long_k )then module procedure long_cr ?? endif end interface ! declare specific functions implementing the cr() function public :: cr interface cr ?? if( byte_k )then module procedure byte_cr ?? endif ?? if( short_k )then module procedure short_cr ?? endif ?? if( int_k )then module procedure int_cr ?? endif ?? if( long_k )then module procedure long_cr ?? endif end interface ! ********************************************************************** ! integer diagnostic functions ! ********************************************************************** ! declare specific functions implementing the iseven() function public :: iseven interface iseven ?? if( byte_k )then module procedure byte_iseven ?? endif ?? if( short_k )then module procedure short_iseven ?? endif ?? if( int_k )then module procedure int_iseven ?? endif ?? if( long_k )then module procedure long_iseven ?? endif end interface ! ********************************************************************** ! declare specific functions implementing the isodd() function public :: isodd interface isodd ?? if( byte_k )then module procedure byte_isodd ?? endif ?? if( short_k )then module procedure short_isodd ?? endif ?? if( int_k )then module procedure int_isodd ?? endif ?? if( long_k )then module procedure long_isodd ?? endif end interface ! ********************************************************************** ! real to integer functions ! ********************************************************************** ! declare specific functions implementing the rrint() function public :: rrint interface rrint ?? if( single_k )then module procedure single_rrint ?? endif ?? if( double_k )then module procedure double_rrint ?? endif ?? if( quad_k )then module procedure quad_rrint ?? endif end interface ! ********************************************************************** ! rng starter functions ! ********************************************************************** ! declare specific function supporting generic function start_rng() public :: start_rng interface start_rng ?? if( single_k )then module procedure single_start_rng ?? endif ?? if( double_k )then module procedure double_start_rng ?? endif ?? if( quad_k )then module procedure quad_start_rng ?? endif end interface ! ********************************************************************** ! subroutines to replace pause statements ! ********************************************************************** ! declare specific subroutines supporting generic subroutine pause() public :: pause interface pause module procedure int_pause module procedure char_pause end interface ! ********************************************************************** ! subroutines to implement the swap() routine ! ********************************************************************** ! declare specific subroutines supporting swap() public :: swap interface swap ?? if( ascii_k )then module procedure ascii_character_swap ?? endif ?? if( ebcdic_k )then module procedure ebcdic_character_swap ?? endif ?? if( byte_k )then module procedure byte_integer_swap ?? endif ?? if( short_k )then module procedure short_integer_swap ?? endif ?? if( int_k )then module procedure int_integer_swap ?? endif ?? if( long_k )then module procedure long_integer_swap ?? endif ?? if( l_byte_k )then module procedure l_byte_logical_swap ?? endif ?? if( l_short_k )then module procedure l_short_logical_swap ?? endif ?? if( l_int_k )then module procedure l_int_logical_swap ?? endif ?? if( l_long_k )then module procedure l_long_logical_swap ?? endif ?? if( single_k )then module procedure single_real_swap ?? endif ?? if( double_k )then module procedure double_real_swap ?? endif ?? if( quad_k )then module procedure quad_real_swap ?? endif ?? if( single_k )then module procedure single_complex_swap ?? endif ?? if( double_k )then module procedure double_complex_swap ?? endif ?? if( quad_k )then module procedure quad_complex_swap ?? endif end interface ! ********************************************************************** ! subroutines to implement the rev_endian() routine ! ********************************************************************** ! declare specific subroutines supporting rev_endian() public :: rev_endian interface rev_endian ?? if( short_k )then module procedure short_rev_endian ?? endif ?? if( int_k )then module procedure int_rev_endian ?? endif ?? if( long_k )then module procedure long_rev_endian ?? endif ?? if( l_short_k )then module procedure l_short_rev_endian ?? endif ?? if( l_int_k )then module procedure l_int_rev_endian ?? endif ?? if( l_long_k )then module procedure l_long_rev_endian ?? endif ?? if( single_k )then module procedure single_rev_endian ?? endif ?? if( double_k )then module procedure double_rev_endian ?? endif ?? if( quad_k )then module procedure quad_rev_endian ?? endif ?? if( single_k )then module procedure single_complex_rev_endian ?? endif ?? if( double_k )then module procedure double_complex_rev_endian ?? endif ?? if( quad_k )then module procedure quad_complex_rev_endian ?? endif end interface ! ********************************************************************** ! subroutines to implement the rev_bits() routine ! ********************************************************************** ! declare specific subroutines supporting rev_bits() public :: rev_bits interface rev_bits ?? if( ascii_k )then module procedure ascii_rev_bits ?? endif ?? if( ebcdic_k )then module procedure ebcdic_rev_bits ?? endif ?? if( byte_k )then module procedure byte_rev_bits ?? endif ?? if( l_byte_k )then module procedure l_byte_rev_bits ?? endif end interface ! ********************************************************************** ! declare module procedure names public public :: bin public :: oct public :: hex public :: binstr public :: octstr public :: hexstr public :: decode public :: encode public :: get_logical_unit ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! ********************************************************************** ! define .xor. binary operator ?? text :: xor( kind) ! ********************************************************************** ! ?kind?_xor: xor() for kind ?kind? elemental logical( kind= ?kind?_k) function ?kind?_xor( l1, l2) logical( kind= ?kind?_k), intent( in) :: l1, l2 ! ?kind?_xor() continue ?kind?_xor = l1 .neqv. l2 return ! ?kind?_xor() end function ?kind?_xor ?? end text xor ?? if( l_byte_k )then ?? copy :: xor( l_byte) ?? endif ?? if( l_short_k )then ?? copy :: xor( l_short) ?? endif ?? if( l_int_k )then ?? copy :: xor( l_int) ?? endif ?? if( l_long_k )then ?? copy :: xor( l_long) ?? endif ! ********************************************************************** ! define .mod. binary operator ?? text :: mod( type, kind) ! ********************************************************************** ! ?kind?_mod(): .mod. for kind ?kind? elemental ?type?( kind= ?kind?_k) function ?kind?_mod( a, p) ?type?( kind= ?kind?_k), intent( in) :: a, p ! ?kind?_mod() continue ?kind?_mod = mod( a, p) return ! ?kind?_mod() end function ?kind?_mod ?? end text mod ?? if( byte_k )then ?? copy :: mod( integer, byte) ?? endif ?? if( short_k )then ?? copy :: mod( integer, short) ?? endif ?? if( int_k )then ?? copy :: mod( integer, int) ?? endif ?? if( long_k )then ?? copy :: mod( integer, long) ?? endif ?? if( single_k )then ?? copy :: mod( real, single) ?? endif ?? if( double_k )then ?? copy :: mod( real, double) ?? endif ?? if( quad_k )then ?? copy :: mod( real, quad) ?? endif ! ********************************************************************** ! define .modulo. binary operator ?? text :: modulo( type, kind) ! ********************************************************************** ! ?kind?_modulo(): .modulo. for kind ?kind? elemental ?type?( kind= ?kind?_k) function ?kind?_modulo( a, p) ?type?( kind= ?kind?_k), intent( in) :: a, p ! ?kind?_modulo() continue ?kind?_modulo = modulo( a, p) return ! ?kind?_modulo() end function ?kind?_modulo ?? end text modulo ?? if( byte_k )then ?? copy :: modulo( integer, byte) ?? endif ?? if( short_k )then ?? copy :: modulo( integer, short) ?? endif ?? if( int_k )then ?? copy :: modulo( integer, int) ?? endif ?? if( long_k )then ?? copy :: modulo( integer, long) ?? endif ?? if( single_k )then ?? copy :: modulo( real, single) ?? endif ?? if( double_k )then ?? copy :: modulo( real, double) ?? endif ?? if( quad_k )then ?? copy :: modulo( real, quad) ?? endif ! ********************************************************************** ! define iseven()/isodd() for integer kinds ?? text :: iseven( kind) ! ********************************************************************** ! ?kind?_iseven(): iseven() for kind ?kind? elemental logical function ?kind?_iseven( a) integer( kind= ?kind?_k), intent( in) :: a ! ?kind?_iseven() continue ?kind?_iseven = iand( a, 1_?kind?_k) == 0_?kind?_k return ! ?kind?_iseven() end function ?kind?_iseven ?? end text iseven ?? if( byte_k )then ?? copy :: iseven( byte) ?? endif ?? if( short_k )then ?? copy :: iseven( short) ?? endif ?? if( int_k )then ?? copy :: iseven( int) ?? endif ?? if( long_k )then ?? copy :: iseven( long) ?? endif ?? text :: isodd( kind) ! ********************************************************************** ! ?kind?_isodd(): isodd() for kind ?kind? elemental logical function ?kind?_isodd( a) integer( kind= ?kind?_k), intent( in) :: a ! ?kind?_isodd() continue ?kind?_isodd = iand( a, 1_?kind?_k) == 1_?kind?_k return ! ?kind?_isodd() end function ?kind?_isodd ?? end text isodd ?? if( byte_k )then ?? copy :: isodd( byte) ?? endif ?? if( short_k )then ?? copy :: isodd( short) ?? endif ?? if( int_k )then ?? copy :: isodd( int) ?? endif ?? if( long_k )then ?? copy :: isodd( long) ?? endif ! ********************************************************************** ! define gcd()/lcm() ?? text :: gcd( kind) ! ********************************************************************** ! ?kind?_gcd() gcd() for kind ?kind?_k elemental integer( kind= ?kind?_k) function ?kind?_gcd( a, b) integer( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_gcd() local integer( kind= ?kind?_k) :: a_gcd, b_gcd, rnp1, rn, rnm1 ! ?kind?_gcd() continue ! if a or b zero, abs( other) is gcd zero_a: if( a == 0_?kind?_k )then ?kind?_gcd = abs( b) return endif zero_a zero_b: if( b == 0_?kind?_k )then ?kind?_gcd = abs( a) return endif zero_b ! set |a| >= |b| ( > 0) ! r1 = a .mod. b ! r0 = b a_gcd = max( abs( a), abs( b)) b_gcd = min( abs( a), abs( b)) rn = a_gcd .mod. b_gcd rnm1 = b_gcd ! while rn /= 0 ! compute rn+1 = rn .mod. rn-1 ! gcd() = rnm1 zero_rem: do while( rn /= 0_?kind?_k) rnp1 = rnm1 .mod. rn rnm1 = rn rn = rnp1 enddo zero_rem ?kind?_gcd = rnm1 return ! ?kind?_gcd() end function ?kind?_gcd ?? end text gcd ?? if( byte_k )then ?? copy :: gcd( byte) ?? endif ?? if( short_k )then ?? copy :: gcd( short) ?? endif ?? if( int_k )then ?? copy :: gcd( int) ?? endif ?? if( long_k )then ?? copy :: gcd( long) ?? endif ! ********************************************************************** ! lcm ?? text :: lcm( kind) ! ********************************************************************** ! ?kind?_lcm() lcm() for kind= ?kind?_k elemental integer( kind= ?kind?_k) function ?kind?_lcm( a, b) integer( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_lcm() continue ?kind?_lcm = ( a* b) / gcd( a, b) return ! ?kind?_lcm() end function ?kind?_lcm ?? end text lcm ?? if( int_k )then ?? copy :: lcm( byte) ?? endif ?? if( short_k )then ?? copy :: lcm( short) ?? endif ?? if( int_k )then ?? copy :: lcm( int) ?? endif ?? if( long_k )then ?? copy :: lcm( long) ?? endif ! ********************************************************************** ! define cd()/cr() for integer kinds ?? text :: cd( kind) ! ********************************************************************** ! ?kind?_cd(): .cd., cd() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_cd( j, k) integer( kind= ?kind?_k), intent( in) :: j, k ! ?kind?_cd() continue ?kind?_cd = ( j + k - 1_?kind?_k) / k return ! ?kind?_cd() end function ?kind?_cd ?? end text cd ?? if( byte_k )then ?? copy :: cd( byte) ?? endif ?? if( short_k )then ?? copy :: cd( short) ?? endif ?? if( int_k )then ?? copy :: cd( int) ?? endif ?? if( long_k )then ?? copy :: cd( long) ?? endif ?? text :: cr( kind) ! ********************************************************************** ! ?kind?_cr(): .cr., cr() for kind ?kind? elemental integer( kind= ?kind?_k) function ?kind?_cr( j, k) integer( kind= ?kind?_k), intent( in) :: j, k ! ?kind?_cr() continue ?kind?_cr = j - k * cd( j, k) return ! ?kind?_cr() end function ?kind?_cr ?? end text cr ?? if( byte_k )then ?? copy :: cr( byte) ?? endif ?? if( short_k )then ?? copy :: cr( short) ?? endif ?? if( int_k )then ?? copy :: cr( int) ?? endif ?? if( long_k )then ?? copy :: cr( long) ?? endif ! ********************************************************************** ! define hex()/oct()/bin() integer from string ! ********************************************************************** ! hex() hex string to int integer function hex( hexstr, stat) character( len= *), intent( in) :: hexstr integer, optional, intent( out) :: stat ! hex() local character( len= hexstr_len) :: str integer :: istr, jloc ! hex() digits table character( len= *), parameter :: lc_digits = '0123456789abcdef' ! ********************************************************************** ! hex() continue ! make local copy of input string str = adjustl( hexstr) ! force lower case for A-F digits to_lc: do istr = 1, hexstr_len force_lc: select case( str( istr: istr)) case( 'A': 'F' ) force_lc str( istr: istr) = char( ichar( str( istr: istr)) + 32) end select force_lc enddo to_lc ! initialize for decode loop istr = 1 hex = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits, str( istr: istr)) no_hex: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char hex = 0 return endif no_hex hex = hex * 16 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! hex() end function hex ! ********************************************************************** ! oct() octal string to int integer function oct( octstr, stat) character( len= *), intent( in) :: octstr integer, optional, intent( out) :: stat ! oct() local character( len= octstr_len) :: str integer :: istr, jloc ! oct() digits table character( len= *), parameter :: lc_digits = '01234567' ! ********************************************************************** ! oct() continue ! make local copy of input string str = adjustl( octstr) ! initialize for decode loop istr = 1 oct = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits, str( istr: istr)) no_oct: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char oct = 0 return endif no_oct oct = oct * 8 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! oct() end function oct ! ********************************************************************** ! bin() binary string to int integer function bin( binstr, stat) character( len= *), intent( in) :: binstr integer, optional, intent( out) :: stat ! bin() local character( len= binstr_len) :: str integer :: istr, jloc ! bin() digits table character( len= *), parameter :: lc_digits = '01' ! ********************************************************************** ! bin() continue ! make local copy of input string str = adjustl( binstr) ! initialize for decode loop istr = 1 bin = 0 ! decode each digit each_digit: do while( str( istr: ) /= ' ' ) jloc = index( lc_digits( 1: 2), str( istr: istr)) no_bin: if( jloc == substring_not_found )then bad_char: if( present( stat) )then stat = istr endif bad_char bin = 0 return endif no_bin bin = bin * 2 + jloc - 1 istr = istr + 1 enddo each_digit ! status and normal exit status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! bin() end function bin ! ********************************************************************** ! define hexstr()/octstr()/binstr() string from integer ! ********************************************************************** ! hexstr() integer to hex string character( len= hexstr_len) function hexstr( i, lc) integer, intent( in) :: i logical, optional, intent( in) :: lc ! hexstr() digits tables character( len= *), parameter :: lc_digits = '0123456789abcdef' character( len= *), parameter :: uc_digits = '0123456789ABCDEF' ! hexstr() local character( len= len( lc_digits)) :: hex_digits integer :: hex_i, jstr, kdig logical :: hex_lc ! ********************************************************************** ! hexstr() continue ! lc argument is present lc_arg: if( present( lc) )then hex_lc = lc else lc_arg hex_lc = .true. endif lc_arg ! lower case or upper case lc_uc: if( hex_lc )then hex_digits = lc_digits else lc_uc hex_digits = uc_digits endif lc_uc ! initialize encode loop jstr = hexstr_len hexstr = ' ' hexstr( jstr: jstr) = '0' hex_i = i ! encode loop each_digit: do while( hex_i /= 0) kdig = iand( hex_i, 15) + 1 hexstr( jstr: jstr) = hex_digits( kdig: kdig) hex_i = ishft( hex_i, -4) jstr = jstr - 1 enddo each_digit hexstr = adjustl( hexstr) ! successful return return ! hexstr() end function hexstr ! ********************************************************************** ! octstr() integer to octal string character( len= octstr_len) function octstr( i) integer, intent( in) :: i ! octstr() local integer :: oct_i, jstr, kdig ! hex()/oct()/bin() digits table character( len= *), parameter :: lc_digits = '01234567' ! ********************************************************************** ! octstr() continue ! initialize encode loop jstr = octstr_len octstr = ' ' octstr( jstr: jstr) = '0' oct_i = i ! encode loop each_digit: do while( oct_i /= 0) kdig = iand( oct_i, 7) + 1 octstr( jstr: jstr) = lc_digits( kdig: kdig) oct_i = ishft( oct_i, -3) jstr = jstr - 1 enddo each_digit octstr = adjustl( octstr) ! successful return return ! octstr() end function octstr ! ********************************************************************** ! binstr() integer to binary string character( len= binstr_len) function binstr( i) integer, intent( in) :: i ! binstr() local integer :: bin_i, jstr, kdig ! hex()/oct()/bin() digits table character( len= *), parameter :: lc_digits = '01' ! ********************************************************************** ! binstr() continue ! initialize encode loop jstr = binstr_len binstr = ' ' binstr( jstr: jstr) = '0' bin_i = i ! encode loop each_digit: do while( bin_i /= 0) kdig = iand( bin_i, 1) + 1 binstr( jstr: jstr) = lc_digits( kdig: kdig) bin_i = ishft( bin_i, -1) jstr = jstr - 1 enddo each_digit binstr = adjustl( binstr) ! successful return return ! binstr() end function binstr ! ********************************************************************** ! define encode() & decode() ! ********************************************************************** ! encode(): integer to character string using translation table pure subroutine encode( str, i, ttable, stat) character( len= *), intent( out) :: str integer, intent( in) :: i character( len= *), intent( in) :: ttable integer, optional, intent( out) :: stat ! encode() local integer :: base integer :: jstr, lenstr, loci, next_char ! encode() continue ! string lengths lenstr = len( str) base = len( ttable) bad_base: if( base < 1 )then status_error: if( present( stat) )then stat = error_bad_base endif status_error return endif bad_base loci = i str = ' ' ! encode i in str next_char = lenstr + 1 ! do positive i all_chars: do while( loci > 0 ) jstr = (loci .mod. base) + 1 overflow: if( next_char > 1 )then next_char = next_char - 1 str( next_char: next_char) = ttable( jstr: jstr) elseif( next_char == 1 )then overflow str = '*' if( present( stat) ) stat = error_short_string return endif overflow loci = loci / base enddo all_chars status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! encode() end subroutine encode ! ********************************************************************** ! decode(): character string to integer using ttable pure subroutine decode( i, str, ttable, stat) integer, intent( out) :: i character( len= *), intent( in) :: str character( len= *), intent( in) :: ttable integer, optional, intent( out) :: stat ! decode() local character( len= len( str)) :: str_buff integer :: base integer :: jstr ! decode() continue ! check input str_buff = adjustl( str) base = len( ttable) i = 0 bad_base: if( base < 1 )then status_error: if( present( stat) )then stat = error_bad_base endif status_error return endif bad_base ! scan str each_char: do while( str_buff /= ' ') jstr = index( ttable, str_buff( 1: 1)) bad_char: if( jstr == substring_not_found )then i = 0 if( present( stat) ) stat = error_not_in_table return endif bad_char i = i*base + ( jstr - 1) str_buff = str_buff( 2: ) enddo each_char status_arg: if( present( stat) )then stat = status_aok endif status_arg return ! decode() end subroutine decode ! ********************************************************************** ! rrint()- randomly round real to integer ?? text :: rrint( kind) ! ********************************************************************** ! ?kind?_rrint: rrint() for kind ?kind? integer function ?kind?_rrint( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_rrint() local real( kind= ?kind?_k) :: r integer :: i ! ?kind?_rrint() continue overflow: if( int( a) >= huge( i) )then ?kind?_rrint = huge( i) return elseif( int( a) <= -huge( i) )then overflow ?kind?_rrint = -huge( i) return endif overflow call random_number( r) ! down if close to floor, up if close to ceiling hi_lo: if( ( a - real( floor( a), kind= ?kind?_k)) <= r )then i = floor( a) else hi_lo i = ceiling( a) endif hi_lo ?kind?_rrint = i return ! ?kind?_rrint() end function ?kind?_rrint ?? end text rrint ?? if( single_k )then ?? copy :: rrint( single) ?? endif ?? if( double_k )then ?? copy :: rrint( double) ?? endif ?? if( quad_k )then ?? copy :: rrint( quad) ?? endif ! ********************************************************************** ! start_rng() for real kinds ?? text :: start_rng( kind) ! ********************************************************************** ! ?kind?_start_rng(): start_rng() for kind ?kind? subroutine ?kind?_start_rng( rngs, log_unit) ! array of random variables real( kind= ?kind?_k), dimension( :), intent( out) :: rngs ! unit to receive the seed value integer, optional, intent( in) :: log_unit ! format of the seed value character( len= *), parameter :: seed_fmt = '( a, 99i10)' ! ?kind?_start_rng() local character( len= date_len) :: date_str character( len= time_len) :: time_str integer, dimension( values_size) :: dt_values integer, dimension( :), allocatable :: rng_seed integer :: seed_size ! ?kind?_start_rng() continue call random_seed( size = seed_size) allocate( rng_seed( seed_size)) call date_and_time( date= date_str, time= time_str, values= dt_values) rng_seed( 1) = sum( dt_values * dt_values) if( seed_size > 1 ) rng_seed( 2) = sum( dt_values * (/ dt_values( 2: seed_size), dt_values( 1) /) ) if( seed_size > 2 ) rng_seed( 3) = sum( dt_values * (/ dt_values( 3: seed_size), dt_values( 1: 2) /) ) if( seed_size > 3 ) rng_seed( 4) = sum( dt_values * (/ dt_values( 4: seed_size), dt_values( 1: 3) /) ) if( seed_size > 4 ) rng_seed( 5) = sum( dt_values * (/ dt_values( 5: seed_size), dt_values( 1: 4) /) ) if( seed_size > 5 ) rng_seed( 6) = sum( dt_values * (/ dt_values( 6: seed_size), dt_values( 1: 5) /) ) if( seed_size > 6 ) rng_seed( 7) = sum( dt_values * (/ dt_values( 7: seed_size), dt_values( 1: 6) /) ) if( seed_size > 7 ) rng_seed( 8) = sum( dt_values * (/ dt_values( 8: seed_size), dt_values( 1: 7) /) ) if( seed_size > 8 ) rng_seed( 9: ) = 0 got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= seed_fmt) 'random seed is ', rng_seed else got_unit write( unit= *, fmt= seed_fmt) 'random seed is ', rng_seed end if got_unit call random_number( harvest= rngs) return ! ?kind?_start_rng() end subroutine ?kind?_start_rng ?? end text start_rng ?? if( single_k )then ?? copy :: start_rng( single) ?? endif ?? if( double_k )then ?? copy :: start_rng( double) ?? endif ?? if( quad_k )then ?? copy :: start_rng( quad) ?? endif ! ********************************************************************** ! define timestamp() ! ********************************************************************** ! timestamp(): write a timestamped message to a log file subroutine timestamp( log_unit, message) integer, intent( in), optional :: log_unit character( len= *), intent( in) :: message character( len= *), parameter :: message_fmt = '( a)' character( len= *), parameter :: slash = '/' character( len= *), parameter :: colon = ':' ! timestamp() local character( len= date_len) :: date_str character( len= time_len) :: time_str ! timestamp() continue call date_and_time( date= date_str, time= time_str) got_unit: if( present( log_unit) )then write( unit= log_unit, fmt= message_fmt) date_str( 1: 4) // slash // date_str( 5: 6) // date_str( 7: 8) // ' ' & // time_str( 1: 2) // colon // time_str( 3: 4) // time_str( 5: 6) // '.' time_str( 7: time_len) & // trim( message) else got_unit write( unit= *, fmt= message_fmt) date_str( 1: 4) // slash // date_str( 5: 6) // date_str( 7: 8) // ' ' & // time_str( 1: 2) // colon // time_str( 3: 4) // time_str( 5: 6) // '.' time_str( 7: time_len) & // trim( message) end if got_unit return ! timestamp() end subroutine timestamp ! ---------------------------------------------------------------------- ! ********************************************************************** ! define pause() ! ********************************************************************** ! int_pause(): pause or pause n subroutine subroutine int_pause( n) integer, intent( in), optional :: n ! int_pause() continue n_arg: if( present( n) )then write( unit= *, fmt= ps_fmt_ai) ' pause: ', n else n_arg write( unit= *, fmt= ps_fmt_a) ' pause' end if n_arg read( unit= *, fmt= *) return ! int_pause() end subroutine int_pause ! ---------------------------------------------------------------------- ! char_pause(): pause 'string' subroutine subroutine char_pause( string) character( len= *), intent( in) :: string ! char_pause() continue write( unit= *, fmt= ps_fmt_aa) ' pause: ', trim( string) read( unit= *, fmt= *) return ! char_pause() end subroutine char_pause ! ********************************************************************** ! swap() ?? text :: swap( type, kind) ! ********************************************************************** ! ?kind?_?type?_swap() elemental subroutine ?kind?_?type?_swap( a, b) ?type?( kind= ?kind?_k), intent( inout) :: a, b ! ?kind?_?type?_swap() local ?type?( kind= ?kind?_k) :: t1, t2 ! ?kind?_?type?_swap() continue t1 = a t2 = b b = t1 a = t2 return ! ?kind?_?type?_swap() end subroutine ?kind?_?type?_swap ?? end text swap ?? if( ascii_k )then ?? copy :: swap( character, ascii) ?? endif ?? if( ebcdic_k )then ?? copy :: swap( character, ebcdic) ?? endif ?? if( byte_k )then ?? copy :: swap( integer, byte) ?? endif ?? if( short_k )then ?? copy :: swap( integer, short) ?? endif ?? if( int_k )then ?? copy :: swap( integer, int) ?? endif ?? if( long_k )then ?? copy :: swap( integer, long) ?? endif ?? if( l_byte_k )then ?? copy :: swap( logical, l_byte) ?? endif ?? if( l_short_k )then ?? copy :: swap( logical, l_short) ?? endif ?? if( l_int_k )then ?? copy :: swap( logical, l_int) ?? endif ?? if( l_long_k )then ?? copy :: swap( logical, l_long) ?? endif ?? if( single_k )then ?? copy :: swap( real, single) ?? endif ?? if( double_k )then ?? copy :: swap( real, double) ?? endif ?? if( quad_k )then ?? copy :: swap( real, quad) ?? endif ?? if( single_k )then ?? copy :: swap( complex, single) ?? endif ?? if( double_k )then ?? copy :: swap( complex, double) ?? endif ?? if( quad_k )then ?? copy :: swap( complex, quad) ?? endif ! ********************************************************************** ! rev_endian() ?? if( short_k )then ! ********************************************************************** ! short_rev_endian() elemental integer( kind= short_k) function short_rev_endian( a) integer( kind= short_k), intent( in) :: a ! short_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_short_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! short_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) short_rev_endian = transfer( tmp, short_rev_endian) return ! short_rev_endian() end function short_rev_endian ?? endif ?? if( int_k )then ! ---------------------------------------------------------------------- ! int_rev_endian() elemental integer( kind= int_k) function int_rev_endian( a) integer( kind= int_k), intent( in) :: a ! int_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_int_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! int_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) int_rev_endian = transfer( tmp, int_rev_endian) return ! int_rev_endian() end function int_rev_endian ?? endif ?? if( long_k )then ! ---------------------------------------------------------------------- ! long_rev_endian() elemental integer( kind= long_k) function long_rev_endian( a) integer( kind= long_k), intent( in) :: a ! long_rev_endian() local integer, parameter :: num_bytes = bit_size( 0_long_k) / bit_size( 0_byte_k) integer( kind= byte_k), dimension( num_bytes) :: tmp ! long_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) long_rev_endian = transfer( tmp, long_rev_endian) return ! long_rev_endian() end function long_rev_endian ?? endif ?? if( l_short_k )then ! ---------------------------------------------------------------------- ! l_short_rev_endian() elemental logical( kind= l_short_k) function l_short_rev_endian( a) logical( kind= l_short_k), intent( in) :: a ! l_short_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_short_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_short_rev_endian = transfer( tmp, l_short_rev_endian) return ! l_short_rev_endian() end function l_short_rev_endian ?? endif ?? if( l_int_k )then ! ---------------------------------------------------------------------- ! l_int_rev_endian() elemental logical( kind= l_int_k) function l_int_rev_endian( a) logical( kind= l_int_k), intent( in) :: a ! l_int_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_int_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_int_rev_endian = transfer( tmp, l_int_rev_endian) return ! l_int_rev_endian() end function l_int_rev_endian ?? endif ?? if( l_long_k )then ! ---------------------------------------------------------------------- ! l_long_rev_endian() elemental logical( kind= l_long_k) function l_long_rev_endian( a) logical( kind= l_long_k), intent( in) :: a ! l_long_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! l_long_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) l_long_rev_endian = transfer( tmp, l_long_rev_endian) return ! l_long_rev_endian() end function l_long_rev_endian ?? endif ?? if( single_k )then ! ---------------------------------------------------------------------- ! single_rev_endian() elemental real( kind= single_k) function single_rev_endian( a) real( kind= single_k), intent( in) :: a ! single_rev_endian() local integer, parameter :: num_bytes = csu_per_nsu integer( kind= byte_k), dimension( csu_per_nsu) :: tmp ! single_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) single_rev_endian = transfer( tmp, single_rev_endian) return ! single_rev_endian() end function single_rev_endian ?? endif ?? if( double_k )then ! ---------------------------------------------------------------------- ! double_rev_endian() elemental real( kind= double_k) function double_rev_endian( a) real( kind= double_k), intent( in) :: a ! double_rev_endian() local integer, parameter :: num_bytes = 2 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! double_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) double_rev_endian= transfer( tmp, double_rev_endian) return ! double_rev_endian() end function double_rev_endian ?? endif ?? if( quad_k )then ! ---------------------------------------------------------------------- ! quad_rev_endian() elemental real( kind= quad_k) function quad_rev_endian( a) real( kind= quad_k), intent( in) :: a ! quad_rev_endian() local integer, parameter :: num_bytes = 4 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! quad_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) quad_rev_endian= transfer( tmp, quad_rev_endian) return ! quad_rev_endian() end function quad_rev_endian ?? endif ?? if( single_k )then ! ---------------------------------------------------------------------- ! single_complex_rev_endian() elemental complex( kind= single_k) function single_complex_rev_endian( a) complex( kind= single_k), intent( in) :: a ! single_complex_rev_endian() local integer, parameter :: num_bytes = 2 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! single_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) single_complex_rev_endian = transfer( tmp, single_complex_rev_endian) return ! single_complex_rev_endian() end function single_complex_rev_endian ?? endif ?? if( double_k )then ! ---------------------------------------------------------------------- ! double_complex_rev_endian() elemental complex( kind= double_k) function double_complex_rev_endian( a) complex( kind= double_k), intent( in) :: a ! double_complex_rev_endian() local integer, parameter :: num_bytes = 4 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! double_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) double_complex_rev_endian = transfer( tmp, double_complex_rev_endian) return ! double_complex_rev_endian() end function double_complex_rev_endian ?? endif ?? if( quad_k )then ! ---------------------------------------------------------------------- ! quad_complex_rev_endian() elemental complex( kind= quad_k) function quad_complex_rev_endian( a) complex( kind= quad_k), intent( in) :: a ! quad_complex_rev_endian() local integer, parameter :: num_bytes = 8 * csu_per_nsu integer( kind= byte_k), dimension( num_bytes) :: tmp ! quad_complex_rev_endian() continue tmp = transfer( a, tmp) tmp( 1: num_bytes) = tmp( num_bytes: 1: -1) quad_complex_rev_endian = transfer( tmp, quad_complex_rev_endian) return ! quad_complex_rev_endian() end function quad_complex_rev_endian ?? endif ! ********************************************************************** ! rev_bits() ?? if( ascii_k )then ! ********************************************************************** ! ascii_rev_bits() elemental character( kind= ascii_k) function ascii_rev_bits( c) character( len= 1, kind= ascii_k), intent( in) :: c ! ascii_rev_buts() local integer( kind= byte_k) :: loci ! ascii_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_1), sh_1)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_2), sh_2)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_3), sh_3)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_4), sh_4)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_5), sh_5)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_6), sh_6)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_7), sh_7)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_8), sh_8)) ascii_rev_bits = char( loci) return ! ascii_rev_bits() end function ascii_rev_bits ?? endif ?? if( ebcdic_k )then ! ********************************************************************** ! ebcdic_rev_bits() elemental character( kind= ebcdic_k) function ebcdic_rev_bits( c) character( len= 1, kind= ebcdic_k), intent( in) :: c ! ebcdic_rev_buts() local integer( kind= byte_k) :: loci ! ebcdic_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_1), sh_1)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_2), sh_2)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_3), sh_3)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_4), sh_4)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_5), sh_5)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_6), sh_6)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_7), sh_7)) loci = ior( loci, ishft( iand( int( ichar( c), kind= byte_k), bit_8), sh_8)) ebcdic_rev_bits = char( loci) return ! ebcdic_rev_bits() end function ebcdic_rev_bits ?? endif ?? if( byte_k )then ! ---------------------------------------------------------------------- ! byte_rev_bits() elemental integer( kind= byte_k) function byte_rev_bits( i) integer( kind= byte_k), intent( in) :: i ! byte_rev_buts() local integer( kind= byte_k) :: loci ! byte_rev_bits() continue loci = 0 loci = ior( loci, ishft( iand( i, bit_1), sh_1)) loci = ior( loci, ishft( iand( i, bit_2), sh_2)) loci = ior( loci, ishft( iand( i, bit_3), sh_3)) loci = ior( loci, ishft( iand( i, bit_4), sh_4)) loci = ior( loci, ishft( iand( i, bit_5), sh_5)) loci = ior( loci, ishft( iand( i, bit_6), sh_6)) loci = ior( loci, ishft( iand( i, bit_7), sh_7)) loci = ior( loci, ishft( iand( i, bit_8), sh_8)) byte_rev_bits = loci return ! rev_bits() end function byte_rev_bits ?? endif ?? if( l_byte_k )then ! ---------------------------------------------------------------------- ! l_byte_rev_bits() elemental logical( kind= l_byte_k) function l_byte_rev_bits( i) logical( kind= l_byte_k), intent( in) :: i ! l_byte_rev_buts() local integer( kind= byte_k) :: loci, locj ! l_byte_rev_bits() continue loci = 0 locj = transfer( i, loci) loci = ior( loci, ishft( iand( locj, bit_1), sh_1)) loci = ior( loci, ishft( iand( locj, bit_2), sh_2)) loci = ior( loci, ishft( iand( locj, bit_3), sh_3)) loci = ior( loci, ishft( iand( locj, bit_4), sh_4)) loci = ior( loci, ishft( iand( locj, bit_5), sh_5)) loci = ior( loci, ishft( iand( locj, bit_6), sh_6)) loci = ior( loci, ishft( iand( locj, bit_7), sh_7)) loci = ior( loci, ishft( iand( locj, bit_8), sh_8)) l_byte_rev_bits = transfer( loci, l_byte_rev_bits) return ! rev_bits() end function l_byte_rev_bits ?? endif ! ********************************************************************** ! find io unit which may be opened ! upon return: if >0, an io unit to open; else not_a_unit ! ********************************************************************** ! integer function get_logical_unit() integer function get_logical_unit( min_unit, max_unit, exclude) integer, optional, intent( in) :: min_unit integer, optional, intent( in) :: max_unit integer, optional, dimension(:), intent( in) :: exclude ! inquire return values integer :: io_stat, io_unit logical :: is_open, is_unit ! local min_unit, max_unit integer :: l_min, l_max ! get_logical_unit() continue ! prepare search limits set_min: if( present( min_unit) )then l_min = min_unit else set_min l_min = 0 endif set_min set_max: if( present( max_unit) )then l_max = max_unit else set_max l_max = huge( 0) endif set_max ! search loop io_units: do io_unit = l_min, l_max inquire( unit= io_unit, opened= is_open, exist= is_unit, iostat= io_stat) error: if( is_io_error( io_stat) )then get_logical_unit = not_a_unit return endif error ready: if( is_unit .and. (.not. is_open) )then not_list: if( present( exclude) )then on_list: if( any( io_unit == exclude) )then cycle io_units endif on_list endif not_list get_logical_unit = io_unit return endif ready enddo io_units ! none found get_logical_unit = not_a_unit return ! get_logical_unit() end function get_logical_unit ! ********************************************************************** ! standard_functions ! $Id: stdfunc.fpp 1.3 2003/10/03 19:41:32Z Dan Release $ ! ********************************************************************** end module standard_functions Day-III/06-coco/Tests/ 40777 0 0 0 12000033650 7457 5Day-III/06-coco/Tests/ass.f100777 0 0 722 11675161770 10523 0 if( .not. ( My Foo > Your Foo ) )then ! ass.fpp: 1 write( unit= *, fmt= *) "assertion failed: ass.fpp: 1: " // "( My ! ass.fpp: 1 &Foo > Your Foo )" ! ass.fpp: 1 stop "assertion failed" ! ass.fpp: 1 end if ! ass.fpp: 1 Day-III/06-coco/Tests/ass.f90100777 0 0 361 11740034306 10656 0!?>?? assert ( My Foo > Your Foo ) if( .not. ( My Foo > Your Foo ) )then write( unit= *, fmt= *) "assertion failed: ass.fpp: 1: " // "( My Foo > Your Foo )" stop "assertion failed" end if !?>?? This was produced using the following SET file Day-III/06-coco/Tests/ass.fpp100777 0 0 40 11674523154 11031 0?? assert ( My Foo > Your Foo ) Day-III/06-coco/Tests/collect.f90100777 0 0 351 11675107370 11525 0!?>?? logical :: mydebug=.false. !?>?? if( mydebug )then !?>! all is well !?>?? else !?>?? endfile !?>?? End of file - now processing hang2.fpp !?>?? logical :: yourdebug=.false. !?>?? if( yourdebug )then !?>! all is well !?>?? else Day-III/06-coco/Tests/debug.set100777 0 0 52 11673246066 11345 0?? logical :: debug = .false. ?? keys: {} Day-III/06-coco/Tests/foo.f100777 0 0 157 11675136506 10521 0 ! Business as usual. ! foo.fpp: 10 Day-III/06-coco/Tests/foo.f90100777 0 0 1224 11740034356 10677 0! 2012/04/07 what a long-winded comment this blather just keeps on going and going oh shut up already no not just one more thing gosh who cares oh my you've been talking for six hours now why oh why 2012/04/07 a( i, j, k)% stuff% morestuff( i, j, k) = a + b - c + d * e / f % and then ! why !? integer :: a = 4, b = 5 !? logical :: debug = .false. !? if( debug )then !? symbols !? end if !? message a+b, a-b, a*b, a/b, a\b !9 -1 20 0 4 !? if( debug )then ! I'm debugging now! !? else ! Business as usual. !? end if !? symbols !? This was produced using the following SET file !? ! why do this? !? alter: shift0 !? ! leave a trail !? logical :: debug = .false. Day-III/06-coco/Tests/foo.fpp100777 0 0 771 11733712274 11060 0! ?date? what a long-winded comment this blather just keeps on going and going oh shut up already no not just one more thing gosh who cares oh my you've been talking for six hours now why oh why ?date? a( i, j, k)% stuff% morestuff( i, j, k) = a + b - c + d * e / f % and then ! why ?? integer :: a = 4, b = 5 ?? logical :: debug = .false. ?? if( debug )then ?? symbols ?? end if ?? message a+b, a-b, a*b, a/b, a\b ?? if( debug )then ! I'm debugging now! ?? else ! Business as usual. ?? end if ?? symbols Day-III/06-coco/Tests/foo.log100777 0 0 2532 11674711210 11062 0coco message: 9 -1 20 0 4 predefined symbols name: file value: foo.fpp never referenced name: line value: 12 never referenced name: date value: 2011/12/22 never referenced name: time value: 15:26:49.281 never referenced name: coco value: $Id: coco.f90,v 2.5 2011/12/22 20:24:02 dan Exp $ never referenced name: setfile value: foo.set never referenced name: logfile value: foo.log never referenced name: output value: foo.f90 never referenced name: cmdline value: ../coco -a3 -p -l foo.log foo never referenced symbols next symbol name: a declared in file: foo.fpp at line: 1 referenced in file: foo.fpp at line: 6 type: integer variable value: 4 defined in file: foo.fpp at line: 1 next symbol name: b declared in file: foo.fpp at line: 1 referenced in file: foo.fpp at line: 6 type: integer variable value: 5 defined in file: foo.fpp at line: 1 next symbol name: debug declared in file: foo.fpp at line: 2 referenced in file: foo.fpp at line: 7 type: logical variable value: .false. defined in file: foo.set at line: 4 end symbols Day-III/06-coco/Tests/foo.set100777 0 0 124 11674525340 11056 0?? ! why do this? ?? alter: shift0 ?? ! leave a trail ?? logical :: debug = .false. Day-III/06-coco/Tests/hang.f90100777 0 0 143 11740034512 11002 0!?>?? logical :: mydebug=.false. !?>?? if( mydebug )then !?>! all is well !?>?? else !?>?? endfile Day-III/06-coco/Tests/hang.fpp100777 0 0 135 11672735542 11211 0?? logical :: mydebug=.false. ?? if( mydebug )then ! all is well ?? else ?? endfile ?? endif Day-III/06-coco/Tests/hang2.f90100777 0 0 131 11740034542 11064 0!?>?? logical :: yourdebug=.false. !?>?? if( yourdebug )then !?>! all is well !?>?? else Day-III/06-coco/Tests/hang2.fpp100777 0 0 115 11672736022 11263 0?? logical :: yourdebug=.false. ?? if( yourdebug )then ! all is well ?? else Day-III/06-coco/Tests/if.f90100777 0 0 326 11740034614 10471 0!?>?? logical :: debug = .false. !?>?? if( debug )then !?>! one !?>?? elseif( debug .or. .not. debug )then ! ok !?>?? else !?>! never !?>?? end if !?>?? symbols !?>?? This was produced using the following SET file Day-III/06-coco/Tests/if.fpp100777 0 0 211 11672735234 10663 0?? logical :: debug = .false. ?? if( debug )then ! one ?? elseif( debug .or. .not. debug )then ! ok ?? else ! never ?? end if ?? symbols Day-III/06-coco/Tests/inc.f90100777 0 0 1167 11740035004 10662 0!?>?? document ! ! Preprocessor executed: 2012/04/07 06:58:44.901 ! ! Preprocessor command line: ../coco inc ! Preprocessor set file: inc.set ! Preprocessor log file: ! Preprocessor version: $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: inc.fpp line: 1 ! Compile file: inc.f90 ! Include path: . whatsit ! ! User: dan ! Current directory: /Users/dan/Projects/Preprocessor/Tests ! !?>?? symbols !?>?? report !?>?? options !?>?? include 'inc.inc' !?>??! include whatsit/inc.inc yea yea !?>??! end include whatsit/inc.inc !?>?? This was produced using the following SET file !?>?? directory 'whatsit' Day-III/06-coco/Tests/inc.fpp100777 0 0 101 11733747116 11034 0?? document ?? symbols ?? report ?? options ?? include 'inc.inc' Day-III/06-coco/Tests/inc.set100777 0 0 27 11733744272 11031 0?? directory 'whatsit' Day-III/06-coco/Tests/key.f90100777 0 0 1224 11740035146 10702 0!?>?? macro,parens :: hypot( x, y) = sqrt( {x}*{x}+{y}*{y}) ! z = sqrt( (42 + 17)*(42 + 17)+(Snafu - Fubar)*(Snafu - Fubar)) !?>?? document ! ! Preprocessor executed: 2012/04/07 07:00:23.064 ! ! Preprocessor command line: ../coco -s debug.set key ! Preprocessor set file: debug.set ! Preprocessor log file: ! Preprocessor version: $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: key.fpp line: 3 ! Compile file: key.f90 ! Include path: . ! ! User: dan ! Current directory: /Users/dan/Projects/Preprocessor/Tests ! !?>?? options !?>?? This was produced using the following SET file !?>?? logical :: debug = .false. !?>?? keys: {} Day-III/06-coco/Tests/key.fpp100777 0 0 167 11673246242 11064 0?? macro,parens :: hypot( x, y) = sqrt( {x}*{x}+{y}*{y}) ! z = {hypot}( 42 + 17, Snafu - Fubar) ?? document ?? options Day-III/06-coco/Tests/mac.f100777 0 0 1617 11671766110 10514 0!?>?? macro :: goo = obleck !?>?? macro, parens :: hypot( x, y) = sqrt( ?x?*?x? + ?y?*?y?) ! mac.fpp: 3 mac.fpp 4 ! mac.fpp: 4 2011/12/13 19:22:32.284 ! mac.fpp: 5 $Id: coco.f90,v 1.30 2007/06/25 19:08:22 dan Exp dan $ ! mac.fpp: 6 ! mac.fpp: 7 ../coco -F -n mac ! mac.fpp: 8 poo = obleck ! mac.fpp: 9 z = sqrt( (a)*(a) + (b)*(b)) ! mac.fpp: 10 z = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) ! mac.fpp: 11 !?>?? This was produced using the following SET file Day-III/06-coco/Tests/mac.f90100777 0 0 1411 11740035372 10651 0! ! ! Preprocessor executed: 2012/04/07 07:02:51.621 ! ! Preprocessor command line: ../coco -Ddebug mac ! Preprocessor set file: mac.set ! Preprocessor log file: ! Preprocessor version: ! $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: ../document.inc line: 10 ! Compile file: mac.f90 ! ! mac.fpp 8 ! 2012/04/07 07:02:51.621 ! 07:02:51.621 2012/04/07 ! 2012/04/07 ! 2012/04/07 $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! mac.set ! ! mac.f90 ! ../coco -Ddebug mac ! debug y/n .true. ! how many = 42 poo = oobleck z = sqrt( (a)*(a) + (b)*(b)) z = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) z = sqrt( (a+b)*(a+b) + (a-b)*(a-b)) z = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) Day-III/06-coco/Tests/mac.fpp100777 0 0 726 11673452314 11034 0?? logical :: debug ?? integer :: counter = 42 ?? macro :: goo = oobleck ?? macro, parens :: hypot( x, y) = sqrt( ?x?*?x? + ?y?*?y?) ?? integer :: i ! ?? include '../document.inc' ! ?file? ?line? ! ?date? ?time? ! ?time? ?date? ! ?date? ! ?date? ?coco? ! ?coco? ! ?setfile? ! ?logfile? ! ?output? ! ?cmdline? ! debug y/n ?debug? ! how many = ?counter? poo = ?goo? z = ?hypot?(a, b) z = ?hypot?(x2-x1, y2-y1) z = ?hypot?(a+b,(a-b)) z = ?hypot?((x2-x1), y2-y1) ?? symbols Day-III/06-coco/Tests/mac.log100777 0 0 3247 11672663760 11061 0predefined symbols name: file value: referenced in file: mac.fpp at line: 7 name: line value: referenced in file: mac.fpp at line: 7 name: date value: 2011/12/16 referenced in file: mac.fpp at line: 11 name: time value: 10:46:57.286 referenced in file: mac.fpp at line: 9 name: coco value: $Id: coco.f90,v 1.30 2007/06/25 19:08:22 dan Exp dan $ referenced in file: mac.fpp at line: 12 name: setfile value: debug.set referenced in file: mac.fpp at line: 13 name: logfile value: mac.log referenced in file: mac.fpp at line: 14 name: output value: mac.f90 referenced in file: mac.fpp at line: 15 name: cmdline value: ../coco -fdebug.set -Ddebug -l mac.log -- mac referenced in file: mac.fpp at line: 16 symbols next symbol name: debug declared in file: mac.fpp at line: 1 never referenced type: logical variable value: .true. defined in file: command line at line: 0 next symbol name: counter declared in file: mac.fpp at line: 2 never referenced type: integer variable value: 42 defined in file: mac.fpp at line: 2 next symbol name: goo declared in file: mac.fpp at line: 3 referenced in file: mac.fpp at line: 19 type: macro value: oobleck next symbol name: hypot declared in file: mac.fpp at line: 4 referenced in file: mac.fpp at line: 23 type: macro with arguments in parenthesis dummy arguments: x y value: sqrt( ?x?*?x? + ?y?*?y?) end symbols Day-III/06-coco/Tests/mac.set100777 0 0 21 11672675264 11020 0?? alter: delete Day-III/06-coco/Tests/names.set100777 0 0 104 11673444742 11401 0?? input 'mac.fpp' ?? output 'mac.f90' ?? logical :: debug = .true. Day-III/06-coco/Tests/nest.f90100777 0 0 157 11740035470 11047 0!?>?? logical :: doit = .true. !?>?? if( doit )then !?>?? text :: what !?>?? else if( what if this works )then Day-III/06-coco/Tests/nest.fpp100777 0 0 216 11666544710 11243 0?? logical :: doit = .true. ?? if( doit )then ?? text :: what ?? else if( what if this works )then ?? end text what ?? end if ?? copy :: what Day-III/06-coco/Tests/stdin.set100777 0 0 55 11673457660 11407 0?? output 'stdout.f90' ?? integer :: jj = 11 Day-III/06-coco/Tests/stdout.f90100777 0 0 523 11674367446 11436 0!?>?? integer :: a = 4, b = 5 !?>?? logical :: debug = .false. !?>?? symbols !?>?? message a+b, a-b, a*b, a/b, a\b !?>9 -1 20 0 4 !?>?? if( debug )then !?>! I'm debugging now! !?>?? else ! Business as usual. !?>?? end if !?>?? symbols !?>?? This was produced using the following SET file !?>?? output 'stdout.f90' !?>?? integer :: jj = 11 Day-III/06-coco/Tests/stdout.set100777 0 0 51 11673457772 11610 0?? input 'foo.fpp' ?? integer :: jj = 11 Day-III/06-coco/Tests/sym.f90100777 0 0 127 11740035550 10702 0!?>?? integer :: foo = 0 what = 0 !?>?? This was produced using the following SET file Day-III/06-coco/Tests/sym.fpp100777 0 0 43 11732071224 11045 0?? integer :: foo = 0 what = ?foo? Day-III/06-coco/Tests/sym1.f90100777 0 0 122 11740035572 10762 0!?>?? integer :: one = 1 ! ? !?>?? This was produced using the following SET file Day-III/06-coco/Tests/sym1.fpp100777 0 0 32 11732233116 11124 0?? integer :: one = 1 ! ? Day-III/06-coco/Tests/sym2.f90100777 0 0 153 11740035612 10762 0!?>?? integer :: one = 1 !?>?? integer :: two = 2 ! ? !?>?? This was produced using the following SET file Day-III/06-coco/Tests/sym2.fpp100777 0 0 60 11732233130 11122 0?? integer :: one = 1 ?? integer :: two = 2 ! ? Day-III/06-coco/Tests/sym3.f90100777 0 0 206 11740035636 10770 0!?>?? integer :: one = 1 !?>?? integer :: two = 2 !?>?? integer :: three = 3 ! ? !?>?? This was produced using the following SET file Day-III/06-coco/Tests/sym3.fpp100777 0 0 110 11732233142 11142 0?? integer :: one = 1 ?? integer :: two = 2 ?? integer :: three = 3 ! ? Day-III/06-coco/Tests/test.f90100777 0 0 0 11731501762 11002 0Day-III/06-coco/Tests/text.f100777 0 0 2742 11740035746 10741 0!?>?? logical :: debug = .false. !?>?? integer :: counter = 0 !?>??text :: foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?>! ?counter? !?>?? if( debug )then !?>! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? end text foo !?>?? document ! ! Preprocessor executed: 2012/04/07 07:06:46.188 ! ! Preprocessor command line: ../coco -F text ! Preprocessor set file: ! Preprocessor log file: ! Preprocessor version: $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: text.fpp line: 13 ! Compile file: text.f ! Include path: . ! ! User: dan ! Current directory: /Users/dan/Projects/Preprocessor/Tests ! ! copy this !?>?? copy :: foo !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?> this is appearance: 1 ! 1 !?>?? if( debug )then !?>! what? me worry! !?>?? else ! just do it !?>?? end if !?>?? ! end text foo !?>?? debug = .true. !?>?? copy :: foo !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?> this is appearance: 2 ! 2 !?>?? if( debug )then ! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? ! end text foo !?>?? copy :: foo !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?> this is appearance: 3 ! 3 !?>?? if( debug )then ! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? ! end text foo !?>??symbols !?>?? This was produced using the following SET file Day-III/06-coco/Tests/text.f90100777 0 0 2741 11740035676 11113 0!?>?? logical :: debug = .false. !?>?? integer :: counter = 0 !?>??text :: foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?>! ?counter? !?>?? if( debug )then !?>! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? end text foo !?>?? document ! ! Preprocessor executed: 2012/04/07 07:06:05.903 ! ! Preprocessor command line: ../coco text ! Preprocessor set file: ! Preprocessor log file: ! Preprocessor version: $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: text.fpp line: 13 ! Compile file: text.f90 ! Include path: . ! ! User: dan ! Current directory: /Users/dan/Projects/Preprocessor/Tests ! ! copy this !?>?? copy :: foo !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?> this is appearance: 1 ! 1 !?>?? if( debug )then !?>! what? me worry! !?>?? else ! just do it !?>?? end if !?>?? ! end text foo !?>?? debug = .true. !?>?? copy :: foo !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?> this is appearance: 2 ! 2 !?>?? if( debug )then ! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? ! end text foo !?>?? copy :: foo !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'this is appearance: ', counter !?> this is appearance: 3 ! 3 !?>?? if( debug )then ! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? ! end text foo !?>??symbols !?>?? This was produced using the following SET file Day-III/06-coco/Tests/text.fpp100777 0 0 514 11673163364 11257 0?? logical :: debug = .false. ?? integer :: counter = 0 ??text :: foo ?? counter = counter + 1 ?? message 'this is appearance: ', counter ! ?counter? ?? if( debug )then ! what? me worry! ?? else ! just do it ?? end if ?? end text foo ?? document ! copy this ?? copy :: foo ?? debug = .true. ?? copy :: foo ?? copy :: foo ??symbols Day-III/06-coco/Tests/text2.f100777 0 0 711 11673151200 10762 0! ! Preprocessor executed: 2011/12/17 12:33:52.684 ! ! Preprocessor command line: ../coco -ad -F text2 ! Preprocessor set file: ! Preprocessor log file: ! Preprocessor version: ! $Id: coco.f90,v 2.0 2011/12/17 00:48:06 dan Exp dan $ ! ! Source file: text2.fpp line: 14 ! Compile file: text2.f ! ! copy this ! 1 what is the what word ! just do it ! 2 what is the me word ! what? me worry! ! 3 what is the worry word ! what? me worry! Day-III/06-coco/Tests/text2.f90100777 0 0 3344 11740036002 11155 0!?>?? logical :: debug = .false. !?>?? integer :: counter = 0 !?>?? macro :: fubar( x) = f?x?cked up beyond ALL recognition !?>??cmdline ! fAcked up beyond ALL recognition !?>??text :: foo(word) !?>?? counter = counter + 1 !?>?? message 'copy number ', counter, counter > 1 !?>! ?counter? !?>WHAT IS THE ?WORD? WORD !?>?? if( debug )then !?>! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? end text foo !?>?? document ! ! Preprocessor executed: 2012/04/07 07:07:14.034 ! ! Preprocessor command line: ../coco text2 ! Preprocessor set file: ! Preprocessor log file: ! Preprocessor version: $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: text2.fpp line: 17 ! Compile file: text2.f90 ! Include path: . ! ! User: dan ! Current directory: /Users/dan/Projects/Preprocessor/Tests ! ! copy this !?>?? copy :: foo(what) !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'copy number ', counter, counter > 1 !?> copy number 1 .false. ! 1 WHAT IS THE what WORD !?>?? if( debug )then !?>! what? me worry! !?>?? else ! just do it !?>?? end if !?>?? ! end text foo !?>?? debug = .true. !?>?? copy :: foo(ME) !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'copy number ', counter, counter > 1 !?> copy number 2 .true. ! 2 WHAT IS THE ME WORD !?>?? if( debug )then ! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? ! end text foo !?>?? copy :: foo(worry) !?>?? ! text foo !?>?? counter = counter + 1 !?>?? message 'copy number ', counter, counter > 1 !?> copy number 3 .true. ! 3 WHAT IS THE worry WORD !?>?? if( debug )then ! what? me worry! !?>?? else !?>! just do it !?>?? end if !?>?? ! end text foo !?>??symbols !?>?? report !?>?? This was produced using the following SET file Day-III/06-coco/Tests/text2.fpp100777 0 0 734 11673202450 11333 0?? logical :: debug = .false. ?? integer :: counter = 0 ?? macro :: fubar( x) = f?x?cked up beyond ALL recognition ??cmdline ! ?fubar?(A) ??text :: foo(word) ?? counter = counter + 1 ?? message 'copy number ', counter, counter > 1 ! ?counter? WHAT IS THE ?WORD? WORD ?? if( debug )then ! what? me worry! ?? else ! just do it ?? end if ?? end text foo ?? document ! copy this ?? copy :: foo(what) ?? debug = .true. ?? copy :: foo(ME) ?? copy :: foo(worry) ??symbols ?? report Day-III/06-coco/Tests/text3.f90100777 0 0 477 11740036014 11145 0!?>?? text :: doit( what, how) !?>call Fubar( ?what?, ?how?) !?>?? end text doit !?>?? copy :: doit( Snafu, Bohica) !?>?? ! text doit call Fubar( Snafu, Bohica) !?>?? ! end text doit !?>??copy :: doit( or2, Bohica) !?>?? ! text doit call Fubar( or2, Bohica) !?>?? ! end text doit !?>?? text :: null !?>?? end text null Day-III/06-coco/Tests/text3.fpp100777 0 0 246 11675110132 11327 0?? text :: doit( what, how) call Fubar( ?what?, ?how?) ?? end text doit ?? copy :: doit( Snafu, Bohica) ??copy :: doit( or2, Bohica) ?? text :: null ?? end text null Day-III/06-coco/Tests/text4.f90100777 0 0 1312 11740036066 11162 0!?>?? text :: foo !?>! yea, foo! !?>?? end text foo ! !?>?? copy :: foo !?>?? ! text foo ! yea, foo! !?>?? ! end text foo !?>?? text :: bar !?>! ho, bar! !?>?? end text bar !?>?? copy :: bar !?>?? ! text bar ! ho, bar! !?>?? ! end text bar !?>?? document ! ! Preprocessor executed: 2012/04/07 07:08:07.350 ! ! Preprocessor command line: ../coco text4 ! Preprocessor set file: ! Preprocessor log file: ! Preprocessor version: $Id: coco.f90,v 2.8 2011/12/23 20:39:40 dan Exp dan $ ! ! Source file: text4.fpp line: 11 ! Compile file: text4.f90 ! Include path: . ! ! User: dan ! Current directory: /Users/dan/Projects/Preprocessor/Tests ! !?>?? This was produced using the following SET file Day-III/06-coco/Tests/text4.fpp100777 0 0 203 11731502476 11332 0?? text :: foo ! yea, foo! ?? end text foo ! ?? copy :: foo ?? text :: bar ! ho, bar! ?? end text bar ?? copy :: bar ?? document Day-III/06-coco/Tests/whatsit/ 40777 0 0 0 12000033650 11142 5Day-III/06-coco/Tests/whatsit/inc.inc100777 0 0 10 11733747162 12463 0yea yea Day-III/06-coco/trigfunc.f90100777 0 0 165456 11740033636 10715 0! bof ! ********************************************************************** ! Fortran 95 module trig_functions ! ********************************************************************** ! Source Control Strings ! $Id: trigfunc.fpp 1.3 2003/10/03 19:44:06Z Dan Release $ ! ********************************************************************** ! Copyright 2003 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! trigonometric functions for real kinds ! ********************************************************************** ! trig_functions library ! cot() cotangent function cot() for reals ! acot() arccotangent functions acot(), acot2() for reals ! acot2() ! sec() secant, arcsecant functions sec(), asec() for reals ! asec() ! csc() cosecant, arccosecant functions csc(), acsc() for reals ! acsc() ! asinh() arc hyperbolic sine(), cosine() for reals ! acosh() ! atanh() arc hyperbolic tangent functions atanh(), atanh2() for reals ! atanh2() ! coth() hyperbolic cotangent function coth() for reals ! acoth() arc hyperbolic cotangent functions acoth(), acoth2() for reals ! acoth2() ! sech() hyperbolic secant functions sech(), csch() for reals ! csch() ! asech() arc hyperbolic secant functions asech(), acsch() for reals ! acsch() ! sind() degrees: sind(), cosd(), tand(), cotd(), secd(), cscd() for reals ! cosd() ! tand() ! cotd() ! secd() ! cscd() ! asind() degrees: asind(), acosd(), asecd(), acscd() for reals ! acosd() ! asecd() ! acscd() ! atand() degrees: atand(), atan2d(), acotd(), acot2d() for reals ! atan2d() ! acotd() ! acot2d() ! ********************************************************************** module trig_functions ! ********************************************************************** ! use standard parameterization of processor dependencies use standard_types ! ********************************************************************** ! declare all variables implicit none ! ********************************************************************** ! export names private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), parameter :: trig_functions_rcs_id = & '$Id: trigfunc.fpp 1.3 2003/10/03 19:44:06Z Dan Release $' ! ********************************************************************** ! trig_functions library ! ********************************************************************** ! declare specific functions supporting generic function cot() public :: cot interface cot module procedure single_cot module procedure double_cot module procedure quad_cot end interface ! declare specific functions supporting generic function acot() public :: acot interface acot module procedure single_acot module procedure double_acot module procedure quad_acot end interface ! declare specific functions supporting generic function acot2() interface acot2 module procedure single_acot2 module procedure double_acot2 module procedure quad_acot2 end interface ! declare specific functions supporting generic function sec() public :: sec interface sec module procedure single_sec module procedure double_sec module procedure quad_sec end interface ! declare specific functions supporting generic function asec() public :: asec interface asec module procedure single_asec module procedure double_asec module procedure quad_asec end interface ! declare specific functions supporting generic function csc() public :: csc interface csc module procedure single_csc module procedure double_csc module procedure quad_csc end interface ! declare specific functions supporting generic function acsc() public :: acsc interface acsc module procedure single_acsc module procedure double_acsc module procedure quad_acsc end interface ! declare specific functions supporting generic function asinh() public :: asinh interface asinh module procedure single_asinh module procedure double_asinh module procedure quad_asinh end interface ! declare specific functions supporting generic function acosh() public :: acosh interface acosh module procedure single_acosh module procedure double_acosh module procedure quad_acosh end interface ! declare specific functions supporting generic function atanh() public :: atanh interface atanh module procedure single_atanh module procedure double_atanh module procedure quad_atanh end interface ! declare specific functions supporting generic function atanh2() public :: atanh2 interface atanh2 module procedure single_atanh2 module procedure double_atanh2 module procedure quad_atanh2 end interface ! declare specific functions supporting generic function coth() public :: coth interface coth module procedure single_coth module procedure double_coth module procedure quad_coth end interface ! declare specific functions supporting generic function acoth() public :: acoth interface acoth module procedure single_acoth module procedure double_acoth module procedure quad_acoth end interface ! declare specific functions supporting generic function acoth2() public :: acoth2 interface acoth2 module procedure single_acoth2 module procedure double_acoth2 module procedure quad_acoth2 end interface ! declare specific functions supporting generic function sech() public :: sech interface sech module procedure single_sech module procedure double_sech module procedure quad_sech end interface ! declare specific functions supporting generic function asech() public :: asech interface asech module procedure single_asech module procedure double_asech module procedure quad_asech end interface ! declare specific functions supporting generic function csch() public :: csch interface csch module procedure single_csch module procedure double_csch module procedure quad_csch end interface ! declare specific functions supporting generic function acsch() public :: acsch interface acsch module procedure single_acsch module procedure double_acsch module procedure quad_acsch end interface ! declare specific functions supporting generic function sind() public :: sind interface sind module procedure single_sind module procedure double_sind module procedure quad_sind end interface ! declare specific functions supporting generic function asind() public :: asind interface asind module procedure single_asind module procedure double_asind module procedure quad_asind end interface ! declare specific functions supporting generic function cosd() public :: cosd interface cosd module procedure single_cosd module procedure double_cosd module procedure quad_cosd end interface ! declare specific functions supporting generic function acosd() public :: acosd interface acosd module procedure single_acosd module procedure double_acosd module procedure quad_acosd end interface ! declare specific functions supporting generic function tand() public :: tand interface tand module procedure single_tand module procedure double_tand module procedure quad_tand end interface ! declare specific functions supporting generic function atand() public :: atand interface atand module procedure single_atand module procedure double_atand module procedure quad_atand end interface ! declare specific functions supporting generic function atan2d() public :: atan2d interface atan2d module procedure single_atan2d module procedure double_atan2d module procedure quad_atan2d end interface ! declare specific functions supporting generic function cotd() public :: cotd interface cotd module procedure single_cotd module procedure double_cotd module procedure quad_cotd end interface ! declare specific functions supporting generic function acotd() public :: acotd interface acotd module procedure single_acotd module procedure double_acotd module procedure quad_acotd end interface ! declare specific functions supporting generic function acotd() public :: acot2d interface acot2d module procedure single_acot2d module procedure double_acot2d module procedure quad_acot2d end interface ! declare specific functions supporting generic function secd() public :: secd interface secd module procedure single_secd module procedure double_secd module procedure quad_secd end interface ! declare specific functions supporting generic function asecd() public :: asecd interface asecd module procedure single_asecd module procedure double_asecd module procedure quad_asecd end interface ! declare specific functions supporting generic function cscd() public :: cscd interface cscd module procedure single_cscd module procedure double_cscd module procedure quad_cscd end interface ! declare specific functions supporting generic function acscd() public :: acscd interface acscd module procedure single_acscd module procedure double_acscd module procedure quad_acscd end interface ! ********************************************************************** ! trig_functions module procedures ! ********************************************************************** contains ! ********************************************************************** ! cotangent, arccotangent functions for real kinds ! ********************************************************************** ! ?kind_cot(): cot() for kind single real( kind= single_k) function single_cot( a) real( kind= single_k), intent( in) :: a ! single_cot() continue ! cot() single_cot = cos( a) / sin( a) return ! cot() ! single_cot() end function single_cot ! ********************************************************************** ! ?kind_cot(): cot() for kind double real( kind= double_k) function double_cot( a) real( kind= double_k), intent( in) :: a ! double_cot() continue ! cot() double_cot = cos( a) / sin( a) return ! cot() ! double_cot() end function double_cot ! ********************************************************************** ! ?kind_cot(): cot() for kind quad real( kind= quad_k) function quad_cot( a) real( kind= quad_k), intent( in) :: a ! quad_cot() continue ! cot() quad_cot = cos( a) / sin( a) return ! cot() ! quad_cot() end function quad_cot ! ********************************************************************** ! single_acot(): acot() for kind single real( kind= single_k) function single_acot( a) real( kind= single_k), intent( in) :: a ! single_acot() continue ! acot() single_acot = atan( 1.0_single_k / a) return ! acot() ! single_acot() end function single_acot ! ********************************************************************** ! double_acot(): acot() for kind double real( kind= double_k) function double_acot( a) real( kind= double_k), intent( in) :: a ! double_acot() continue ! acot() double_acot = atan( 1.0_double_k / a) return ! acot() ! double_acot() end function double_acot ! ********************************************************************** ! quad_acot(): acot() for kind quad real( kind= quad_k) function quad_acot( a) real( kind= quad_k), intent( in) :: a ! quad_acot() continue ! acot() quad_acot = atan( 1.0_quad_k / a) return ! acot() ! quad_acot() end function quad_acot ! ********************************************************************** ! single_acot2(): acot2() for kind single real( kind= single_k) function single_acot2( a, b) real( kind= single_k), intent( in) :: a, b ! single_acot2 continue ! acot2() single_acot2 = atan2( b, a) return ! acot2() ! single_acot2() end function single_acot2 ! ********************************************************************** ! double_acot2(): acot2() for kind double real( kind= double_k) function double_acot2( a, b) real( kind= double_k), intent( in) :: a, b ! double_acot2 continue ! acot2() double_acot2 = atan2( b, a) return ! acot2() ! double_acot2() end function double_acot2 ! ********************************************************************** ! quad_acot2(): acot2() for kind quad real( kind= quad_k) function quad_acot2( a, b) real( kind= quad_k), intent( in) :: a, b ! quad_acot2 continue ! acot2() quad_acot2 = atan2( b, a) return ! acot2() ! quad_acot2() end function quad_acot2 ! ********************************************************************** ! secant, arcsecant, cosecant, arccosecant functions for real kinds ! ********************************************************************** ! single_sec(): sec() for kind single real( kind= single_k) function single_sec( a) real( kind= single_k), intent( in) :: a ! single_sec() continue ! sec() single_sec = 1.0_single_k / cos( a) return ! sec() ! single_sec() end function single_sec ! ********************************************************************** ! double_sec(): sec() for kind double real( kind= double_k) function double_sec( a) real( kind= double_k), intent( in) :: a ! double_sec() continue ! sec() double_sec = 1.0_double_k / cos( a) return ! sec() ! double_sec() end function double_sec ! ********************************************************************** ! quad_sec(): sec() for kind quad real( kind= quad_k) function quad_sec( a) real( kind= quad_k), intent( in) :: a ! quad_sec() continue ! sec() quad_sec = 1.0_quad_k / cos( a) return ! sec() ! quad_sec() end function quad_sec ! ********************************************************************** ! single_asec(): asec() for kind single real( kind= single_k) function single_asec( a) real( kind= single_k), intent( in) :: a ! single_asec() continue ! asec() single_asec = acos( 1.0_single_k / a) return ! asec() ! single_asec() end function single_asec ! ********************************************************************** ! double_asec(): asec() for kind double real( kind= double_k) function double_asec( a) real( kind= double_k), intent( in) :: a ! double_asec() continue ! asec() double_asec = acos( 1.0_double_k / a) return ! asec() ! double_asec() end function double_asec ! ********************************************************************** ! quad_asec(): asec() for kind quad real( kind= quad_k) function quad_asec( a) real( kind= quad_k), intent( in) :: a ! quad_asec() continue ! asec() quad_asec = acos( 1.0_quad_k / a) return ! asec() ! quad_asec() end function quad_asec ! ********************************************************************** ! single_csc(): csc() for kind single real( kind= single_k) function single_csc( a) real( kind= single_k), intent( in) :: a ! single_csc() continue ! csc() single_csc = 1.0_single_k / sin( a) return ! csc() ! single_csc() end function single_csc ! ********************************************************************** ! double_csc(): csc() for kind double real( kind= double_k) function double_csc( a) real( kind= double_k), intent( in) :: a ! double_csc() continue ! csc() double_csc = 1.0_double_k / sin( a) return ! csc() ! double_csc() end function double_csc ! ********************************************************************** ! quad_csc(): csc() for kind quad real( kind= quad_k) function quad_csc( a) real( kind= quad_k), intent( in) :: a ! quad_csc() continue ! csc() quad_csc = 1.0_quad_k / sin( a) return ! csc() ! quad_csc() end function quad_csc ! ********************************************************************** ! single_acsc(): acsc() for kind single real( kind= single_k) function single_acsc( a) real( kind= single_k), intent( in) :: a ! single_acsc() continue ! acsc() single_acsc = asin( 1.0_single_k / a) return ! acsc() ! single_acsc() end function single_acsc ! ********************************************************************** ! double_acsc(): acsc() for kind double real( kind= double_k) function double_acsc( a) real( kind= double_k), intent( in) :: a ! double_acsc() continue ! acsc() double_acsc = asin( 1.0_double_k / a) return ! acsc() ! double_acsc() end function double_acsc ! ********************************************************************** ! quad_acsc(): acsc() for kind quad real( kind= quad_k) function quad_acsc( a) real( kind= quad_k), intent( in) :: a ! quad_acsc() continue ! acsc() quad_acsc = asin( 1.0_quad_k / a) return ! acsc() ! quad_acsc() end function quad_acsc ! ********************************************************************** ! hyperbolic arcsine, arccosine functions for real kinds ! ********************************************************************** ! single_asinh(): asinh() for kind single real( kind= single_k) function single_asinh( a) real( kind= single_k), intent( in) :: a ! single_sinh() continue ! asinh() single_asinh = log( a + sqrt( a*a + 1.0_single_k) ) return ! asinh() ! single_asinh() end function single_asinh ! ********************************************************************** ! double_asinh(): asinh() for kind double real( kind= double_k) function double_asinh( a) real( kind= double_k), intent( in) :: a ! double_sinh() continue ! asinh() double_asinh = log( a + sqrt( a*a + 1.0_double_k) ) return ! asinh() ! double_asinh() end function double_asinh ! ********************************************************************** ! quad_asinh(): asinh() for kind quad real( kind= quad_k) function quad_asinh( a) real( kind= quad_k), intent( in) :: a ! quad_sinh() continue ! asinh() quad_asinh = log( a + sqrt( a*a + 1.0_quad_k) ) return ! asinh() ! quad_asinh() end function quad_asinh ! ********************************************************************** ! single_acosh(): acosh() for kind single real( kind= single_k) function single_acosh( a) real( kind= single_k), intent( in) :: a ! single_acosh() continue ! acosh() single_acosh = log( a + sqrt( a*a - 1.0_single_k) ) return ! acosh() ! single_acosh() end function single_acosh ! ********************************************************************** ! double_acosh(): acosh() for kind double real( kind= double_k) function double_acosh( a) real( kind= double_k), intent( in) :: a ! double_acosh() continue ! acosh() double_acosh = log( a + sqrt( a*a - 1.0_double_k) ) return ! acosh() ! double_acosh() end function double_acosh ! ********************************************************************** ! quad_acosh(): acosh() for kind quad real( kind= quad_k) function quad_acosh( a) real( kind= quad_k), intent( in) :: a ! quad_acosh() continue ! acosh() quad_acosh = log( a + sqrt( a*a - 1.0_quad_k) ) return ! acosh() ! quad_acosh() end function quad_acosh ! ********************************************************************** ! hyperbolic arctangent functions for real kinds ! ********************************************************************** ! single_atanh(): atanh() for kind single real( kind= single_k) function single_atanh( a) real( kind= single_k), intent( in) :: a ! single_atanh() continue ! atanh() single_atanh = 0.5_single_k * log( ( a + 1.0_single_k) / ( a - 1.0_single_k) ) return ! atanh() ! single_atanh() end function single_atanh ! ********************************************************************** ! double_atanh(): atanh() for kind double real( kind= double_k) function double_atanh( a) real( kind= double_k), intent( in) :: a ! double_atanh() continue ! atanh() double_atanh = 0.5_double_k * log( ( a + 1.0_double_k) / ( a - 1.0_double_k) ) return ! atanh() ! double_atanh() end function double_atanh ! ********************************************************************** ! quad_atanh(): atanh() for kind quad real( kind= quad_k) function quad_atanh( a) real( kind= quad_k), intent( in) :: a ! quad_atanh() continue ! atanh() quad_atanh = 0.5_quad_k * log( ( a + 1.0_quad_k) / ( a - 1.0_quad_k) ) return ! atanh() ! quad_atanh() end function quad_atanh ! ********************************************************************** ! single_atanh2(): atanh2() for kind single real( kind= single_k) function single_atanh2( a, b) real( kind= single_k), intent( in) :: a, b real( kind= single_k) :: r ! single_atanh2() continue ! atanh2() r = a / b single_atanh2 = 0.5_single_k * log( ( r + 1.0_single_k) / ( r - 1.0_single_k) ) return ! atanh2() ! single_atanh2() end function single_atanh2 ! ********************************************************************** ! double_atanh2(): atanh2() for kind double real( kind= double_k) function double_atanh2( a, b) real( kind= double_k), intent( in) :: a, b real( kind= double_k) :: r ! double_atanh2() continue ! atanh2() r = a / b double_atanh2 = 0.5_double_k * log( ( r + 1.0_double_k) / ( r - 1.0_double_k) ) return ! atanh2() ! double_atanh2() end function double_atanh2 ! ********************************************************************** ! quad_atanh2(): atanh2() for kind quad real( kind= quad_k) function quad_atanh2( a, b) real( kind= quad_k), intent( in) :: a, b real( kind= quad_k) :: r ! quad_atanh2() continue ! atanh2() r = a / b quad_atanh2 = 0.5_quad_k * log( ( r + 1.0_quad_k) / ( r - 1.0_quad_k) ) return ! atanh2() ! quad_atanh2() end function quad_atanh2 ! ********************************************************************** ! hyperbolic cotangent, arccotangent functions for real kinds ! ********************************************************************** ! single_coth(): coth() for kind single real( kind= single_k) function single_coth( a) real( kind= single_k), intent( in) :: a real( kind= single_k) :: ep, em ! single_coth() continue ! coth() ep = exp( a) em = exp( -a) single_coth = ( ep + em) / ( ep - em) return ! coth() ! single_coth() end function single_coth ! ********************************************************************** ! double_coth(): coth() for kind double real( kind= double_k) function double_coth( a) real( kind= double_k), intent( in) :: a real( kind= double_k) :: ep, em ! double_coth() continue ! coth() ep = exp( a) em = exp( -a) double_coth = ( ep + em) / ( ep - em) return ! coth() ! double_coth() end function double_coth ! ********************************************************************** ! quad_coth(): coth() for kind quad real( kind= quad_k) function quad_coth( a) real( kind= quad_k), intent( in) :: a real( kind= quad_k) :: ep, em ! quad_coth() continue ! coth() ep = exp( a) em = exp( -a) quad_coth = ( ep + em) / ( ep - em) return ! coth() ! quad_coth() end function quad_coth ! ********************************************************************** ! hyperbolic arccotangent functions for real kinds ! ********************************************************************** ! single_acoth(): acoth() for kind single real( kind= single_k) function single_acoth( a) real( kind= single_k), intent( in) :: a ! single_acoth() continue ! acoth() single_acoth = 0.5_single_k * log( ( a - 1.0_single_k) / ( a + 1.0_single_k) ) return ! acoth() ! single_acoth() end function single_acoth ! ********************************************************************** ! double_acoth(): acoth() for kind double real( kind= double_k) function double_acoth( a) real( kind= double_k), intent( in) :: a ! double_acoth() continue ! acoth() double_acoth = 0.5_double_k * log( ( a - 1.0_double_k) / ( a + 1.0_double_k) ) return ! acoth() ! double_acoth() end function double_acoth ! ********************************************************************** ! quad_acoth(): acoth() for kind quad real( kind= quad_k) function quad_acoth( a) real( kind= quad_k), intent( in) :: a ! quad_acoth() continue ! acoth() quad_acoth = 0.5_quad_k * log( ( a - 1.0_quad_k) / ( a + 1.0_quad_k) ) return ! acoth() ! quad_acoth() end function quad_acoth ! ********************************************************************** ! single_acoth2(): acoth2() for kind single real( kind= single_k) function single_acoth2( a, b) real( kind= single_k), intent( in) :: a, b real( kind= single_k) :: r ! single_acoth2() continue ! acoth2() r = a / b single_acoth2 = 0.5_single_k * log( ( r - 1.0_single_k) / ( r + 1.0_single_k) ) return ! acoth2() ! single_acoth2() end function single_acoth2 ! ********************************************************************** ! double_acoth2(): acoth2() for kind double real( kind= double_k) function double_acoth2( a, b) real( kind= double_k), intent( in) :: a, b real( kind= double_k) :: r ! double_acoth2() continue ! acoth2() r = a / b double_acoth2 = 0.5_double_k * log( ( r - 1.0_double_k) / ( r + 1.0_double_k) ) return ! acoth2() ! double_acoth2() end function double_acoth2 ! ********************************************************************** ! quad_acoth2(): acoth2() for kind quad real( kind= quad_k) function quad_acoth2( a, b) real( kind= quad_k), intent( in) :: a, b real( kind= quad_k) :: r ! quad_acoth2() continue ! acoth2() r = a / b quad_acoth2 = 0.5_quad_k * log( ( r - 1.0_quad_k) / ( r + 1.0_quad_k) ) return ! acoth2() ! quad_acoth2() end function quad_acoth2 ! ********************************************************************** ! hyperbolic secant, cosecant functions for real kinds ! ********************************************************************** ! single_sech(): sech() for kind single real( kind= single_k) function single_sech( a) real( kind= single_k), intent( in) :: a ! single_sech() continue ! sech() single_sech = 1.0_single_k / cosh( a) return ! sech() ! single_sech() end function single_sech ! ********************************************************************** ! double_sech(): sech() for kind double real( kind= double_k) function double_sech( a) real( kind= double_k), intent( in) :: a ! double_sech() continue ! sech() double_sech = 1.0_double_k / cosh( a) return ! sech() ! double_sech() end function double_sech ! ********************************************************************** ! quad_sech(): sech() for kind quad real( kind= quad_k) function quad_sech( a) real( kind= quad_k), intent( in) :: a ! quad_sech() continue ! sech() quad_sech = 1.0_quad_k / cosh( a) return ! sech() ! quad_sech() end function quad_sech ! ********************************************************************** ! single_csch(): csch() for kind single real( kind= single_k) function single_csch( a) real( kind= single_k), intent( in) :: a ! single_csch() continue ! csch() single_csch = 1.0_single_k / sinh( a) return ! csch() ! single_csch() end function single_csch ! ********************************************************************** ! double_csch(): csch() for kind double real( kind= double_k) function double_csch( a) real( kind= double_k), intent( in) :: a ! double_csch() continue ! csch() double_csch = 1.0_double_k / sinh( a) return ! csch() ! double_csch() end function double_csch ! ********************************************************************** ! quad_csch(): csch() for kind quad real( kind= quad_k) function quad_csch( a) real( kind= quad_k), intent( in) :: a ! quad_csch() continue ! csch() quad_csch = 1.0_quad_k / sinh( a) return ! csch() ! quad_csch() end function quad_csch ! ********************************************************************** ! hyperbolic arcsecant, arccosecant functions for real kinds ! ********************************************************************** ! single_asech(): asech() for kind single real( kind= single_k) function single_asech( a) real( kind= single_k), intent( in) :: a real( kind= single_k) :: ai ! single_asech() continue ! asech() ai = 1.0_single_k / a single_asech = log( ai + sqrt( ai*ai - 1.0_single_k) ) return ! asech() ! single_asech() end function single_asech ! ********************************************************************** ! double_asech(): asech() for kind double real( kind= double_k) function double_asech( a) real( kind= double_k), intent( in) :: a real( kind= double_k) :: ai ! double_asech() continue ! asech() ai = 1.0_double_k / a double_asech = log( ai + sqrt( ai*ai - 1.0_double_k) ) return ! asech() ! double_asech() end function double_asech ! ********************************************************************** ! quad_asech(): asech() for kind quad real( kind= quad_k) function quad_asech( a) real( kind= quad_k), intent( in) :: a real( kind= quad_k) :: ai ! quad_asech() continue ! asech() ai = 1.0_quad_k / a quad_asech = log( ai + sqrt( ai*ai - 1.0_quad_k) ) return ! asech() ! quad_asech() end function quad_asech ! ********************************************************************** ! single_acsch(): acsch() for kind single real( kind= single_k) function single_acsch( a) real( kind= single_k), intent( in) :: a real( kind= single_k) :: ai ! single_acsch() continue ! acsch() ai = 1.0_single_k / a single_acsch = log( ai + sqrt( ai*ai + 1.0_single_k) ) return ! acsch() ! single_acsch() end function single_acsch ! ********************************************************************** ! double_acsch(): acsch() for kind double real( kind= double_k) function double_acsch( a) real( kind= double_k), intent( in) :: a real( kind= double_k) :: ai ! double_acsch() continue ! acsch() ai = 1.0_double_k / a double_acsch = log( ai + sqrt( ai*ai + 1.0_double_k) ) return ! acsch() ! double_acsch() end function double_acsch ! ********************************************************************** ! quad_acsch(): acsch() for kind quad real( kind= quad_k) function quad_acsch( a) real( kind= quad_k), intent( in) :: a real( kind= quad_k) :: ai ! quad_acsch() continue ! acsch() ai = 1.0_quad_k / a quad_acsch = log( ai + sqrt( ai*ai + 1.0_quad_k) ) return ! acsch() ! quad_acsch() end function quad_acsch ! ********************************************************************** ! sind(), cosd(), tand(), cotd(), secd(), cscd()- arcs in degrees ! ********************************************************************** ! single_sind(): sind() for kind single real( kind= single_k) function single_sind( a) real( kind= single_k), intent( in) :: a ! single_sind() continue ! sind() single_sind = sin( 0.017453292519943295769236907684886125_single_k * a) return ! sind() ! single_sind() end function single_sind ! ********************************************************************** ! double_sind(): sind() for kind double real( kind= double_k) function double_sind( a) real( kind= double_k), intent( in) :: a ! double_sind() continue ! sind() double_sind = sin( 0.017453292519943295769236907684886125_double_k * a) return ! sind() ! double_sind() end function double_sind ! ********************************************************************** ! quad_sind(): sind() for kind quad real( kind= quad_k) function quad_sind( a) real( kind= quad_k), intent( in) :: a ! quad_sind() continue ! sind() quad_sind = sin( 0.017453292519943295769236907684886125_quad_k * a) return ! sind() ! quad_sind() end function quad_sind ! ********************************************************************** ! single_cosd(): cosd() for kind single real( kind= single_k) function single_cosd( a) real( kind= single_k), intent( in) :: a ! single_cosd() continue ! cosd() single_cosd = cos( 0.017453292519943295769236907684886125_single_k * a) return ! cosd() ! single_cosd() end function single_cosd ! ********************************************************************** ! double_cosd(): cosd() for kind double real( kind= double_k) function double_cosd( a) real( kind= double_k), intent( in) :: a ! double_cosd() continue ! cosd() double_cosd = cos( 0.017453292519943295769236907684886125_double_k * a) return ! cosd() ! double_cosd() end function double_cosd ! ********************************************************************** ! quad_cosd(): cosd() for kind quad real( kind= quad_k) function quad_cosd( a) real( kind= quad_k), intent( in) :: a ! quad_cosd() continue ! cosd() quad_cosd = cos( 0.017453292519943295769236907684886125_quad_k * a) return ! cosd() ! quad_cosd() end function quad_cosd ! ********************************************************************** ! single_tand(): tand() for kind single real( kind= single_k) function single_tand( a) real( kind= single_k), intent( in) :: a ! single_tand() continue ! tand() single_tand = tan( 0.017453292519943295769236907684886125_single_k * a) return ! tand() ! single_tand() end function single_tand ! ********************************************************************** ! double_tand(): tand() for kind double real( kind= double_k) function double_tand( a) real( kind= double_k), intent( in) :: a ! double_tand() continue ! tand() double_tand = tan( 0.017453292519943295769236907684886125_double_k * a) return ! tand() ! double_tand() end function double_tand ! ********************************************************************** ! quad_tand(): tand() for kind quad real( kind= quad_k) function quad_tand( a) real( kind= quad_k), intent( in) :: a ! quad_tand() continue ! tand() quad_tand = tan( 0.017453292519943295769236907684886125_quad_k * a) return ! tand() ! quad_tand() end function quad_tand ! ********************************************************************** ! single_cotd(): cotd() for kind single real( kind= single_k) function single_cotd( a) real( kind= single_k), intent( in) :: a ! single_cotd() continue ! cotd() single_cotd = 1.0_single_k / tan( 0.017453292519943295769236907684886125_single_k * a) return ! cotd() ! single_cotd() end function single_cotd ! ********************************************************************** ! double_cotd(): cotd() for kind double real( kind= double_k) function double_cotd( a) real( kind= double_k), intent( in) :: a ! double_cotd() continue ! cotd() double_cotd = 1.0_double_k / tan( 0.017453292519943295769236907684886125_double_k * a) return ! cotd() ! double_cotd() end function double_cotd ! ********************************************************************** ! quad_cotd(): cotd() for kind quad real( kind= quad_k) function quad_cotd( a) real( kind= quad_k), intent( in) :: a ! quad_cotd() continue ! cotd() quad_cotd = 1.0_quad_k / tan( 0.017453292519943295769236907684886125_quad_k * a) return ! cotd() ! quad_cotd() end function quad_cotd ! ********************************************************************** ! single_secd(): secd() for kind single real( kind= single_k) function single_secd( a) real( kind= single_k), intent( in) :: a ! single_secd() continue ! secd() single_secd = 1.0_single_k / cos( 0.017453292519943295769236907684886125_single_k * a) return ! secd() ! single_secd() end function single_secd ! ********************************************************************** ! double_secd(): secd() for kind double real( kind= double_k) function double_secd( a) real( kind= double_k), intent( in) :: a ! double_secd() continue ! secd() double_secd = 1.0_double_k / cos( 0.017453292519943295769236907684886125_double_k * a) return ! secd() ! double_secd() end function double_secd ! ********************************************************************** ! quad_secd(): secd() for kind quad real( kind= quad_k) function quad_secd( a) real( kind= quad_k), intent( in) :: a ! quad_secd() continue ! secd() quad_secd = 1.0_quad_k / cos( 0.017453292519943295769236907684886125_quad_k * a) return ! secd() ! quad_secd() end function quad_secd ! ********************************************************************** ! single_cscd(): cscd() for kind single real( kind= single_k) function single_cscd( a) real( kind= single_k), intent( in) :: a ! single_cscd() continue ! cscd() single_cscd = 1.0_single_k / sin( 0.017453292519943295769236907684886125_single_k * a) return ! cscd() ! single_cscd() end function single_cscd ! ********************************************************************** ! double_cscd(): cscd() for kind double real( kind= double_k) function double_cscd( a) real( kind= double_k), intent( in) :: a ! double_cscd() continue ! cscd() double_cscd = 1.0_double_k / sin( 0.017453292519943295769236907684886125_double_k * a) return ! cscd() ! double_cscd() end function double_cscd ! ********************************************************************** ! quad_cscd(): cscd() for kind quad real( kind= quad_k) function quad_cscd( a) real( kind= quad_k), intent( in) :: a ! quad_cscd() continue ! cscd() quad_cscd = 1.0_quad_k / sin( 0.017453292519943295769236907684886125_quad_k * a) return ! cscd() ! quad_cscd() end function quad_cscd ! ********************************************************************** ! asind(), acosd(), atand(), acotd(), asecd(), acscd()- return degrees ! ********************************************************************** ! single_asind(): asind() for kind single real( kind= single_k) function single_asind( a) real( kind= single_k), intent( in) :: a ! single_asind() continue ! asind() single_asind = 57.2957795130823208767981548141052_single_k * asin( a) return ! asind() ! single_asind() end function single_asind ! ********************************************************************** ! double_asind(): asind() for kind double real( kind= double_k) function double_asind( a) real( kind= double_k), intent( in) :: a ! double_asind() continue ! asind() double_asind = 57.2957795130823208767981548141052_double_k * asin( a) return ! asind() ! double_asind() end function double_asind ! ********************************************************************** ! quad_asind(): asind() for kind quad real( kind= quad_k) function quad_asind( a) real( kind= quad_k), intent( in) :: a ! quad_asind() continue ! asind() quad_asind = 57.2957795130823208767981548141052_quad_k * asin( a) return ! asind() ! quad_asind() end function quad_asind ! ********************************************************************** ! single_acosd(): acosd() for kind single real( kind= single_k) function single_acosd( a) real( kind= single_k), intent( in) :: a ! single_acosd() continue ! acosd() single_acosd = 57.2957795130823208767981548141052_single_k * acos( a) return ! acosd() ! single_acosd() end function single_acosd ! ********************************************************************** ! double_acosd(): acosd() for kind double real( kind= double_k) function double_acosd( a) real( kind= double_k), intent( in) :: a ! double_acosd() continue ! acosd() double_acosd = 57.2957795130823208767981548141052_double_k * acos( a) return ! acosd() ! double_acosd() end function double_acosd ! ********************************************************************** ! quad_acosd(): acosd() for kind quad real( kind= quad_k) function quad_acosd( a) real( kind= quad_k), intent( in) :: a ! quad_acosd() continue ! acosd() quad_acosd = 57.2957795130823208767981548141052_quad_k * acos( a) return ! acosd() ! quad_acosd() end function quad_acosd ! ********************************************************************** ! single_atand(): atand() for kind single real( kind= single_k) function single_atand( a) real( kind= single_k), intent( in) :: a ! single_atand() continue ! atand() single_atand = 57.2957795130823208767981548141052_single_k * atan( a) return ! atand() ! single_atand() end function single_atand ! ********************************************************************** ! double_atand(): atand() for kind double real( kind= double_k) function double_atand( a) real( kind= double_k), intent( in) :: a ! double_atand() continue ! atand() double_atand = 57.2957795130823208767981548141052_double_k * atan( a) return ! atand() ! double_atand() end function double_atand ! ********************************************************************** ! quad_atand(): atand() for kind quad real( kind= quad_k) function quad_atand( a) real( kind= quad_k), intent( in) :: a ! quad_atand() continue ! atand() quad_atand = 57.2957795130823208767981548141052_quad_k * atan( a) return ! atand() ! quad_atand() end function quad_atand ! ********************************************************************** ! single_atan2d(): atan2d() for kind single real( kind= single_k) function single_atan2d( a, b) real( kind= single_k), intent( in) :: a, b ! single_atan2d() continue ! atan2d() single_atan2d = 57.2957795130823208767981548141052_single_k * atan2( a, b) return ! atan2d() ! single_atan2d() end function single_atan2d ! ********************************************************************** ! double_atan2d(): atan2d() for kind double real( kind= double_k) function double_atan2d( a, b) real( kind= double_k), intent( in) :: a, b ! double_atan2d() continue ! atan2d() double_atan2d = 57.2957795130823208767981548141052_double_k * atan2( a, b) return ! atan2d() ! double_atan2d() end function double_atan2d ! ********************************************************************** ! quad_atan2d(): atan2d() for kind quad real( kind= quad_k) function quad_atan2d( a, b) real( kind= quad_k), intent( in) :: a, b ! quad_atan2d() continue ! atan2d() quad_atan2d = 57.2957795130823208767981548141052_quad_k * atan2( a, b) return ! atan2d() ! quad_atan2d() end function quad_atan2d ! ********************************************************************** ! single_acotd(): acotd() for kind single real( kind= single_k) function single_acotd( a) real( kind= single_k), intent( in) :: a ! single_acotd() continue ! acotd() single_acotd = 57.2957795130823208767981548141052_single_k * atan( 1.0_single_k / a) return ! acotd() ! single_acotd() end function single_acotd ! ********************************************************************** ! double_acotd(): acotd() for kind double real( kind= double_k) function double_acotd( a) real( kind= double_k), intent( in) :: a ! double_acotd() continue ! acotd() double_acotd = 57.2957795130823208767981548141052_double_k * atan( 1.0_double_k / a) return ! acotd() ! double_acotd() end function double_acotd ! ********************************************************************** ! quad_acotd(): acotd() for kind quad real( kind= quad_k) function quad_acotd( a) real( kind= quad_k), intent( in) :: a ! quad_acotd() continue ! acotd() quad_acotd = 57.2957795130823208767981548141052_quad_k * atan( 1.0_quad_k / a) return ! acotd() ! quad_acotd() end function quad_acotd ! ********************************************************************** ! single_acot2d(): acot2d() for kind single real( kind= single_k) function single_acot2d( a, b) real( kind= single_k), intent( in) :: a, b ! single_acot2d() continue ! acot2d() single_acot2d = 57.2957795130823208767981548141052_single_k * atan2( b, a) return ! acot2d() ! single_acot2d() end function single_acot2d ! ********************************************************************** ! double_acot2d(): acot2d() for kind double real( kind= double_k) function double_acot2d( a, b) real( kind= double_k), intent( in) :: a, b ! double_acot2d() continue ! acot2d() double_acot2d = 57.2957795130823208767981548141052_double_k * atan2( b, a) return ! acot2d() ! double_acot2d() end function double_acot2d ! ********************************************************************** ! quad_acot2d(): acot2d() for kind quad real( kind= quad_k) function quad_acot2d( a, b) real( kind= quad_k), intent( in) :: a, b ! quad_acot2d() continue ! acot2d() quad_acot2d = 57.2957795130823208767981548141052_quad_k * atan2( b, a) return ! acot2d() ! quad_acot2d() end function quad_acot2d ! ********************************************************************** ! single_asecd(): asecd() for kind single real( kind= single_k) function single_asecd( a) real( kind= single_k), intent( in) :: a ! single_asecd() continue ! asecd() single_asecd = 57.2957795130823208767981548141052_single_k * acos( 1.0_single_k / a) return ! asecd() ! single_asecd() end function single_asecd ! ********************************************************************** ! double_asecd(): asecd() for kind double real( kind= double_k) function double_asecd( a) real( kind= double_k), intent( in) :: a ! double_asecd() continue ! asecd() double_asecd = 57.2957795130823208767981548141052_double_k * acos( 1.0_double_k / a) return ! asecd() ! double_asecd() end function double_asecd ! ********************************************************************** ! quad_asecd(): asecd() for kind quad real( kind= quad_k) function quad_asecd( a) real( kind= quad_k), intent( in) :: a ! quad_asecd() continue ! asecd() quad_asecd = 57.2957795130823208767981548141052_quad_k * acos( 1.0_quad_k / a) return ! asecd() ! quad_asecd() end function quad_asecd ! ********************************************************************** ! single_acscd(): acscd() for kind single real( kind= single_k) function single_acscd( a) real( kind= single_k), intent( in) :: a ! single_acscd() continue ! acscd() single_acscd = 57.2957795130823208767981548141052_single_k * asin( 1.0_single_k / a) return ! acscd() ! single_acscd() end function single_acscd ! ********************************************************************** ! double_acscd(): acscd() for kind double real( kind= double_k) function double_acscd( a) real( kind= double_k), intent( in) :: a ! double_acscd() continue ! acscd() double_acscd = 57.2957795130823208767981548141052_double_k * asin( 1.0_double_k / a) return ! acscd() ! double_acscd() end function double_acscd ! ********************************************************************** ! quad_acscd(): acscd() for kind quad real( kind= quad_k) function quad_acscd( a) real( kind= quad_k), intent( in) :: a ! quad_acscd() continue ! acscd() quad_acscd = 57.2957795130823208767981548141052_quad_k * asin( 1.0_quad_k / a) return ! acscd() ! quad_acscd() end function quad_acscd ! ********************************************************************** ! trig_functions ! $Id: trigfunc.fpp 1.3 2003/10/03 19:44:06Z Dan Release $ ! ********************************************************************** end module trig_functions ! eof Day-III/06-coco/trigfunc.fpp100777 0 0 116074 11672233502 11072 0! bof ! ********************************************************************** ! Fortran 95 module trig_functions ! ********************************************************************** ! Source Control Strings ! $Id: trigfunc.fpp 1.3 2003/10/03 19:44:06Z Dan Release $ ! ********************************************************************** ! Copyright 2003 Purple Sage Computing Solutions, Inc. ! ********************************************************************** ! Summary of License ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! trigonometric functions for real kinds ! ********************************************************************** ! trig_functions library ! cot() cotangent function cot() for reals ! acot() arccotangent functions acot(), acot2() for reals ! acot2() ! sec() secant, arcsecant functions sec(), asec() for reals ! asec() ! csc() cosecant, arccosecant functions csc(), acsc() for reals ! acsc() ! asinh() arc hyperbolic sine(), cosine() for reals ! acosh() ! atanh() arc hyperbolic tangent functions atanh(), atanh2() for reals ! atanh2() ! coth() hyperbolic cotangent function coth() for reals ! acoth() arc hyperbolic cotangent functions acoth(), acoth2() for reals ! acoth2() ! sech() hyperbolic secant functions sech(), csch() for reals ! csch() ! asech() arc hyperbolic secant functions asech(), acsch() for reals ! acsch() ! sind() degrees: sind(), cosd(), tand(), cotd(), secd(), cscd() for reals ! cosd() ! tand() ! cotd() ! secd() ! cscd() ! asind() degrees: asind(), acosd(), asecd(), acscd() for reals ! acosd() ! asecd() ! acscd() ! atand() degrees: atand(), atan2d(), acotd(), acot2d() for reals ! atan2d() ! acotd() ! acot2d() ?? ! ******************************************************************* ?? ! preprocessor definitions ?? include 'coco.inc' ?? ! ******************************************************************* ! ********************************************************************** module trig_functions ! ********************************************************************** ! use standard parameterization of processor dependencies use standard_types ! ********************************************************************** ! declare all variables implicit none ! ********************************************************************** ! export names private ! ********************************************************************** ! RCS strings ! ********************************************************************** character( len= *), parameter :: trig_functions_rcs_id = & '$Id: trigfunc.fpp 1.3 2003/10/03 19:44:06Z Dan Release $' ! ********************************************************************** ! trig_functions library ! ********************************************************************** ! declare specific functions supporting generic function cot() public :: cot interface cot ?? if( single_k )then module procedure single_cot ?? endif ?? if( double_k )then module procedure double_cot ?? endif ?? if( quad_k )then module procedure quad_cot ?? endif end interface ! declare specific functions supporting generic function acot() public :: acot interface acot ?? if( single_k )then module procedure single_acot ?? endif ?? if( double_k )then module procedure double_acot ?? endif ?? if( quad_k )then module procedure quad_acot ?? endif end interface ! declare specific functions supporting generic function acot2() interface acot2 ?? if( single_k )then module procedure single_acot2 ?? endif ?? if( double_k )then module procedure double_acot2 ?? endif ?? if( quad_k )then module procedure quad_acot2 ?? endif end interface ! declare specific functions supporting generic function sec() public :: sec interface sec ?? if( single_k )then module procedure single_sec ?? endif ?? if( double_k )then module procedure double_sec ?? endif ?? if( quad_k )then module procedure quad_sec ?? endif end interface ! declare specific functions supporting generic function asec() public :: asec interface asec ?? if( single_k )then module procedure single_asec ?? endif ?? if( double_k )then module procedure double_asec ?? endif ?? if( quad_k )then module procedure quad_asec ?? endif end interface ! declare specific functions supporting generic function csc() public :: csc interface csc ?? if( single_k )then module procedure single_csc ?? endif ?? if( double_k )then module procedure double_csc ?? endif ?? if( quad_k )then module procedure quad_csc ?? endif end interface ! declare specific functions supporting generic function acsc() public :: acsc interface acsc ?? if( single_k )then module procedure single_acsc ?? endif ?? if( double_k )then module procedure double_acsc ?? endif ?? if( quad_k )then module procedure quad_acsc ?? endif end interface ! declare specific functions supporting generic function asinh() public :: asinh interface asinh ?? if( single_k )then module procedure single_asinh ?? endif ?? if( double_k )then module procedure double_asinh ?? endif ?? if( quad_k )then module procedure quad_asinh ?? endif end interface ! declare specific functions supporting generic function acosh() public :: acosh interface acosh ?? if( single_k )then module procedure single_acosh ?? endif ?? if( double_k )then module procedure double_acosh ?? endif ?? if( quad_k )then module procedure quad_acosh ?? endif end interface ! declare specific functions supporting generic function atanh() public :: atanh interface atanh ?? if( single_k )then module procedure single_atanh ?? endif ?? if( double_k )then module procedure double_atanh ?? endif ?? if( quad_k )then module procedure quad_atanh ?? endif end interface ! declare specific functions supporting generic function atanh2() public :: atanh2 interface atanh2 ?? if( single_k )then module procedure single_atanh2 ?? endif ?? if( double_k )then module procedure double_atanh2 ?? endif ?? if( quad_k )then module procedure quad_atanh2 ?? endif end interface ! declare specific functions supporting generic function coth() public :: coth interface coth ?? if( single_k )then module procedure single_coth ?? endif ?? if( double_k )then module procedure double_coth ?? endif ?? if( quad_k )then module procedure quad_coth ?? endif end interface ! declare specific functions supporting generic function acoth() public :: acoth interface acoth ?? if( single_k )then module procedure single_acoth ?? endif ?? if( double_k )then module procedure double_acoth ?? endif ?? if( quad_k )then module procedure quad_acoth ?? endif end interface ! declare specific functions supporting generic function acoth2() public :: acoth2 interface acoth2 ?? if( single_k )then module procedure single_acoth2 ?? endif ?? if( double_k )then module procedure double_acoth2 ?? endif ?? if( quad_k )then module procedure quad_acoth2 ?? endif end interface ! declare specific functions supporting generic function sech() public :: sech interface sech ?? if( single_k )then module procedure single_sech ?? endif ?? if( double_k )then module procedure double_sech ?? endif ?? if( quad_k )then module procedure quad_sech ?? endif end interface ! declare specific functions supporting generic function asech() public :: asech interface asech ?? if( single_k )then module procedure single_asech ?? endif ?? if( double_k )then module procedure double_asech ?? endif ?? if( quad_k )then module procedure quad_asech ?? endif end interface ! declare specific functions supporting generic function csch() public :: csch interface csch ?? if( single_k )then module procedure single_csch ?? endif ?? if( double_k )then module procedure double_csch ?? endif ?? if( quad_k )then module procedure quad_csch ?? endif end interface ! declare specific functions supporting generic function acsch() public :: acsch interface acsch ?? if( single_k )then module procedure single_acsch ?? endif ?? if( double_k )then module procedure double_acsch ?? endif ?? if( quad_k )then module procedure quad_acsch ?? endif end interface ! declare specific functions supporting generic function sind() public :: sind interface sind ?? if( single_k )then module procedure single_sind ?? endif ?? if( double_k )then module procedure double_sind ?? endif ?? if( quad_k )then module procedure quad_sind ?? endif end interface ! declare specific functions supporting generic function asind() public :: asind interface asind ?? if( single_k )then module procedure single_asind ?? endif ?? if( double_k )then module procedure double_asind ?? endif ?? if( quad_k )then module procedure quad_asind ?? endif end interface ! declare specific functions supporting generic function cosd() public :: cosd interface cosd ?? if( single_k )then module procedure single_cosd ?? endif ?? if( double_k )then module procedure double_cosd ?? endif ?? if( quad_k )then module procedure quad_cosd ?? endif end interface ! declare specific functions supporting generic function acosd() public :: acosd interface acosd ?? if( single_k )then module procedure single_acosd ?? endif ?? if( double_k )then module procedure double_acosd ?? endif ?? if( quad_k )then module procedure quad_acosd ?? endif end interface ! declare specific functions supporting generic function tand() public :: tand interface tand ?? if( single_k )then module procedure single_tand ?? endif ?? if( double_k )then module procedure double_tand ?? endif ?? if( quad_k )then module procedure quad_tand ?? endif end interface ! declare specific functions supporting generic function atand() public :: atand interface atand ?? if( single_k )then module procedure single_atand ?? endif ?? if( double_k )then module procedure double_atand ?? endif ?? if( quad_k )then module procedure quad_atand ?? endif end interface ! declare specific functions supporting generic function atan2d() public :: atan2d interface atan2d ?? if( single_k )then module procedure single_atan2d ?? endif ?? if( double_k )then module procedure double_atan2d ?? endif ?? if( quad_k )then module procedure quad_atan2d ?? endif end interface ! declare specific functions supporting generic function cotd() public :: cotd interface cotd ?? if( single_k )then module procedure single_cotd ?? endif ?? if( double_k )then module procedure double_cotd ?? endif ?? if( quad_k )then module procedure quad_cotd ?? endif end interface ! declare specific functions supporting generic function acotd() public :: acotd interface acotd ?? if( single_k )then module procedure single_acotd ?? endif ?? if( double_k )then module procedure double_acotd ?? endif ?? if( quad_k )then module procedure quad_acotd ?? endif end interface ! declare specific functions supporting generic function acotd() public :: acot2d interface acot2d ?? if( single_k )then module procedure single_acot2d ?? endif ?? if( double_k )then module procedure double_acot2d ?? endif ?? if( quad_k )then module procedure quad_acot2d ?? endif end interface ! declare specific functions supporting generic function secd() public :: secd interface secd ?? if( single_k )then module procedure single_secd ?? endif ?? if( double_k )then module procedure double_secd ?? endif ?? if( quad_k )then module procedure quad_secd ?? endif end interface ! declare specific functions supporting generic function asecd() public :: asecd interface asecd ?? if( single_k )then module procedure single_asecd ?? endif ?? if( double_k )then module procedure double_asecd ?? endif ?? if( quad_k )then module procedure quad_asecd ?? endif end interface ! declare specific functions supporting generic function cscd() public :: cscd interface cscd ?? if( single_k )then module procedure single_cscd ?? endif ?? if( double_k )then module procedure double_cscd ?? endif ?? if( quad_k )then module procedure quad_cscd ?? endif end interface ! declare specific functions supporting generic function acscd() public :: acscd interface acscd ?? if( single_k )then module procedure single_acscd ?? endif ?? if( double_k )then module procedure double_acscd ?? endif ?? if( quad_k )then module procedure quad_acscd ?? endif end interface ! ********************************************************************** ! trig_functions module procedures ! ********************************************************************** contains ! ********************************************************************** ! cotangent, arccotangent functions for real kinds ?? text :: cot( kind) ! ********************************************************************** ! ?kind_cot(): cot() for kind ?kind? real( kind= ?kind?_k) function ?kind?_cot( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_cot() continue ! cot() ?kind?_cot = cos( a) / sin( a) return ! cot() ! ?kind?_cot() end function ?kind?_cot ?? end text cot ?? if( single_k )then ?? copy :: cot( single) ?? endif ?? if( double_k )then ?? copy :: cot( double) ?? endif ?? if( quad_k )then ?? copy :: cot( quad) ?? endif ?? text :: acot( kind) ! ********************************************************************** ! ?kind?_acot(): acot() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acot( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acot() continue ! acot() ?kind?_acot = atan( 1.0_?kind?_k / a) return ! acot() ! ?kind?_acot() end function ?kind?_acot ?? end text acot ?? if( single_k )then ?? copy :: acot( single) ?? endif ?? if( double_k )then ?? copy :: acot( double) ?? endif ?? if( quad_k )then ?? copy :: acot( quad) ?? endif ?? text :: acot2( kind) ! ********************************************************************** ! ?kind?_acot2(): acot2() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acot2( a, b) real( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_acot2 continue ! acot2() ?kind?_acot2 = atan2( b, a) return ! acot2() ! ?kind?_acot2() end function ?kind?_acot2 ?? end text acot2 ?? if( single_k )then ?? copy :: acot2( single) ?? endif ?? if( double_k )then ?? copy :: acot2( double) ?? endif ?? if( quad_k )then ?? copy :: acot2( quad) ?? endif ! ********************************************************************** ! secant, arcsecant, cosecant, arccosecant functions for real kinds ?? text :: sec( kind) ! ********************************************************************** ! ?kind?_sec(): sec() for kind ?kind? real( kind= ?kind?_k) function ?kind?_sec( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_sec() continue ! sec() ?kind?_sec = 1.0_?kind?_k / cos( a) return ! sec() ! ?kind?_sec() end function ?kind?_sec ?? end text sec ?? if( single_k )then ?? copy :: sec( single) ?? endif ?? if( double_k )then ?? copy :: sec( double) ?? endif ?? if( quad_k )then ?? copy :: sec( quad) ?? endif ?? text :: asec( kind) ! ********************************************************************** ! ?kind?_asec(): asec() for kind ?kind? real( kind= ?kind?_k) function ?kind?_asec( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_asec() continue ! asec() ?kind?_asec = acos( 1.0_?kind?_k / a) return ! asec() ! ?kind?_asec() end function ?kind?_asec ?? end text asec ?? if( single_k )then ?? copy :: asec( single) ?? endif ?? if( double_k )then ?? copy :: asec( double) ?? endif ?? if( quad_k )then ?? copy :: asec( quad) ?? endif ?? text :: csc( kind) ! ********************************************************************** ! ?kind?_csc(): csc() for kind ?kind? real( kind= ?kind?_k) function ?kind?_csc( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_csc() continue ! csc() ?kind?_csc = 1.0_?kind?_k / sin( a) return ! csc() ! ?kind?_csc() end function ?kind?_csc ?? end text csc ?? if( single_k )then ?? copy :: csc( single) ?? endif ?? if( double_k )then ?? copy :: csc( double) ?? endif ?? if( quad_k )then ?? copy :: csc( quad) ?? endif ?? text :: acsc( kind) ! ********************************************************************** ! ?kind?_acsc(): acsc() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acsc( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acsc() continue ! acsc() ?kind?_acsc = asin( 1.0_?kind?_k / a) return ! acsc() ! ?kind?_acsc() end function ?kind?_acsc ?? end text acsc ?? if( single_k )then ?? copy :: acsc( single) ?? endif ?? if( double_k )then ?? copy :: acsc( double) ?? endif ?? if( quad_k )then ?? copy :: acsc( quad) ?? endif ! ********************************************************************** ! hyperbolic arcsine, arccosine functions for real kinds ?? text :: asinh( kind) ! ********************************************************************** ! ?kind?_asinh(): asinh() for kind ?kind? real( kind= ?kind?_k) function ?kind?_asinh( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_sinh() continue ! asinh() ?kind?_asinh = log( a + sqrt( a*a + 1.0_?kind?_k) ) return ! asinh() ! ?kind?_asinh() end function ?kind?_asinh ?? end text asinh ?? if( single_k )then ?? copy :: asinh( single) ?? endif ?? if( double_k )then ?? copy :: asinh( double) ?? endif ?? if( quad_k )then ?? copy :: asinh( quad) ?? endif ?? text :: acosh( kind) ! ********************************************************************** ! ?kind?_acosh(): acosh() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acosh( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acosh() continue ! acosh() ?kind?_acosh = log( a + sqrt( a*a - 1.0_?kind?_k) ) return ! acosh() ! ?kind?_acosh() end function ?kind?_acosh ?? end text acosh ?? if( single_k )then ?? copy :: acosh( single) ?? endif ?? if( double_k )then ?? copy :: acosh( double) ?? endif ?? if( quad_k )then ?? copy :: acosh( quad) ?? endif ! ********************************************************************** ! hyperbolic arctangent functions for real kinds ?? text :: atanh( kind) ! ********************************************************************** ! ?kind?_atanh(): atanh() for kind ?kind? real( kind= ?kind?_k) function ?kind?_atanh( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_atanh() continue ! atanh() ?kind?_atanh = 0.5_?kind?_k * log( ( a + 1.0_?kind?_k) / ( a - 1.0_?kind?_k) ) return ! atanh() ! ?kind?_atanh() end function ?kind?_atanh ?? end text atanh ?? if( single_k )then ?? copy :: atanh( single) ?? endif ?? if( double_k )then ?? copy :: atanh( double) ?? endif ?? if( quad_k )then ?? copy :: atanh( quad) ?? endif ?? text :: atanh2( kind) ! ********************************************************************** ! ?kind?_atanh2(): atanh2() for kind ?kind? real( kind= ?kind?_k) function ?kind?_atanh2( a, b) real( kind= ?kind?_k), intent( in) :: a, b real( kind= ?kind?_k) :: r ! ?kind?_atanh2() continue ! atanh2() r = a / b ?kind?_atanh2 = 0.5_?kind?_k * log( ( r + 1.0_?kind?_k) / ( r - 1.0_?kind?_k) ) return ! atanh2() ! ?kind?_atanh2() end function ?kind?_atanh2 ?? end text atanh2 ?? if( single_k )then ?? copy :: atanh2( single) ?? endif ?? if( double_k )then ?? copy :: atanh2( double) ?? endif ?? if( quad_k )then ?? copy :: atanh2( quad) ?? endif ! ********************************************************************** ! hyperbolic cotangent, arccotangent functions for real kinds ?? text :: coth( kind) ! ********************************************************************** ! ?kind?_coth(): coth() for kind ?kind? real( kind= ?kind?_k) function ?kind?_coth( a) real( kind= ?kind?_k), intent( in) :: a real( kind= ?kind?_k) :: ep, em ! ?kind?_coth() continue ! coth() ep = exp( a) em = exp( -a) ?kind?_coth = ( ep + em) / ( ep - em) return ! coth() ! ?kind?_coth() end function ?kind?_coth ?? end text coth ?? if( single_k )then ?? copy :: coth( single) ?? endif ?? if( double_k )then ?? copy :: coth( double) ?? endif ?? if( quad_k )then ?? copy :: coth( quad) ?? endif ! ********************************************************************** ! hyperbolic arccotangent functions for real kinds ?? text :: acoth( kind) ! ********************************************************************** ! ?kind?_acoth(): acoth() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acoth( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acoth() continue ! acoth() ?kind?_acoth = 0.5_?kind?_k * log( ( a - 1.0_?kind?_k) / ( a + 1.0_?kind?_k) ) return ! acoth() ! ?kind?_acoth() end function ?kind?_acoth ?? end text acoth ?? if( single_k )then ?? copy :: acoth( single) ?? endif ?? if( double_k )then ?? copy :: acoth( double) ?? endif ?? if( quad_k )then ?? copy :: acoth( quad) ?? endif ?? text :: acoth2( kind) ! ********************************************************************** ! ?kind?_acoth2(): acoth2() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acoth2( a, b) real( kind= ?kind?_k), intent( in) :: a, b real( kind= ?kind?_k) :: r ! ?kind?_acoth2() continue ! acoth2() r = a / b ?kind?_acoth2 = 0.5_?kind?_k * log( ( r - 1.0_?kind?_k) / ( r + 1.0_?kind?_k) ) return ! acoth2() ! ?kind?_acoth2() end function ?kind?_acoth2 ?? end text acoth2 ?? if( single_k )then ?? copy :: acoth2( single) ?? endif ?? if( double_k )then ?? copy :: acoth2( double) ?? endif ?? if( quad_k )then ?? copy :: acoth2( quad) ?? endif ! ********************************************************************** ! hyperbolic secant, cosecant functions for real kinds ?? text :: sech( kind) ! ********************************************************************** ! ?kind?_sech(): sech() for kind ?kind? real( kind= ?kind?_k) function ?kind?_sech( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_sech() continue ! sech() ?kind?_sech = 1.0_?kind?_k / cosh( a) return ! sech() ! ?kind?_sech() end function ?kind?_sech ?? end text sech ?? if( single_k )then ?? copy :: sech( single) ?? endif ?? if( double_k )then ?? copy :: sech( double) ?? endif ?? if( quad_k )then ?? copy :: sech( quad) ?? endif ?? text :: csch( kind) ! ********************************************************************** ! ?kind?_csch(): csch() for kind ?kind? real( kind= ?kind?_k) function ?kind?_csch( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_csch() continue ! csch() ?kind?_csch = 1.0_?kind?_k / sinh( a) return ! csch() ! ?kind?_csch() end function ?kind?_csch ?? end text csch ?? if( single_k )then ?? copy :: csch( single) ?? endif ?? if( double_k )then ?? copy :: csch( double) ?? endif ?? if( quad_k )then ?? copy :: csch( quad) ?? endif ! ********************************************************************** ! hyperbolic arcsecant, arccosecant functions for real kinds ?? text :: asech( kind) ! ********************************************************************** ! ?kind?_asech(): asech() for kind ?kind? real( kind= ?kind?_k) function ?kind?_asech( a) real( kind= ?kind?_k), intent( in) :: a real( kind= ?kind?_k) :: ai ! ?kind?_asech() continue ! asech() ai = 1.0_?kind?_k / a ?kind?_asech = log( ai + sqrt( ai*ai - 1.0_?kind?_k) ) return ! asech() ! ?kind?_asech() end function ?kind?_asech ?? end text asech ?? if( single_k )then ?? copy :: asech( single) ?? endif ?? if( double_k )then ?? copy :: asech( double) ?? endif ?? if( quad_k )then ?? copy :: asech( quad) ?? endif ?? text :: acsch( kind) ! ********************************************************************** ! ?kind?_acsch(): acsch() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acsch( a) real( kind= ?kind?_k), intent( in) :: a real( kind= ?kind?_k) :: ai ! ?kind?_acsch() continue ! acsch() ai = 1.0_?kind?_k / a ?kind?_acsch = log( ai + sqrt( ai*ai + 1.0_?kind?_k) ) return ! acsch() ! ?kind?_acsch() end function ?kind?_acsch ?? end text acsch ?? if( single_k )then ?? copy :: acsch( single) ?? endif ?? if( double_k )then ?? copy :: acsch( double) ?? endif ?? if( quad_k )then ?? copy :: acsch( quad) ?? endif ! ********************************************************************** ! sind(), cosd(), tand(), cotd(), secd(), cscd()- arcs in degrees ?? text :: sind( kind) ! ********************************************************************** ! ?kind?_sind(): sind() for kind ?kind? real( kind= ?kind?_k) function ?kind?_sind( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_sind() continue ! sind() ?kind?_sind = sin( 0.017453292519943295769236907684886125_?kind?_k * a) return ! sind() ! ?kind?_sind() end function ?kind?_sind ?? end text sind ?? if( single_k )then ?? copy :: sind( single) ?? endif ?? if( double_k )then ?? copy :: sind( double) ?? endif ?? if( quad_k )then ?? copy :: sind( quad) ?? endif ?? text :: cosd( kind) ! ********************************************************************** ! ?kind?_cosd(): cosd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_cosd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_cosd() continue ! cosd() ?kind?_cosd = cos( 0.017453292519943295769236907684886125_?kind?_k * a) return ! cosd() ! ?kind?_cosd() end function ?kind?_cosd ?? end text cosd ?? if( single_k )then ?? copy :: cosd( single) ?? endif ?? if( double_k )then ?? copy :: cosd( double) ?? endif ?? if( quad_k )then ?? copy :: cosd( quad) ?? endif ?? text :: tand( kind) ! ********************************************************************** ! ?kind?_tand(): tand() for kind ?kind? real( kind= ?kind?_k) function ?kind?_tand( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_tand() continue ! tand() ?kind?_tand = tan( 0.017453292519943295769236907684886125_?kind?_k * a) return ! tand() ! ?kind?_tand() end function ?kind?_tand ?? end text tand ?? if( single_k )then ?? copy :: tand( single) ?? endif ?? if( double_k )then ?? copy :: tand( double) ?? endif ?? if( quad_k )then ?? copy :: tand( quad) ?? endif ?? text :: cotd( kind) ! ********************************************************************** ! ?kind?_cotd(): cotd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_cotd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_cotd() continue ! cotd() ?kind?_cotd = 1.0_?kind?_k / tan( 0.017453292519943295769236907684886125_?kind?_k * a) return ! cotd() ! ?kind?_cotd() end function ?kind?_cotd ?? end text cotd ?? if( single_k )then ?? copy :: cotd( single) ?? endif ?? if( double_k )then ?? copy :: cotd( double) ?? endif ?? if( quad_k )then ?? copy :: cotd( quad) ?? endif ?? text :: secd( kind) ! ********************************************************************** ! ?kind?_secd(): secd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_secd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_secd() continue ! secd() ?kind?_secd = 1.0_?kind?_k / cos( 0.017453292519943295769236907684886125_?kind?_k * a) return ! secd() ! ?kind?_secd() end function ?kind?_secd ?? end text secd ?? if( single_k )then ?? copy :: secd( single) ?? endif ?? if( double_k )then ?? copy :: secd( double) ?? endif ?? if( quad_k )then ?? copy :: secd( quad) ?? endif ?? text :: cscd( kind) ! ********************************************************************** ! ?kind?_cscd(): cscd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_cscd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_cscd() continue ! cscd() ?kind?_cscd = 1.0_?kind?_k / sin( 0.017453292519943295769236907684886125_?kind?_k * a) return ! cscd() ! ?kind?_cscd() end function ?kind?_cscd ?? end text cscd ?? if( single_k )then ?? copy :: cscd( single) ?? endif ?? if( double_k )then ?? copy :: cscd( double) ?? endif ?? if( quad_k )then ?? copy :: cscd( quad) ?? endif ! ********************************************************************** ! asind(), acosd(), atand(), acotd(), asecd(), acscd()- return degrees ?? text :: asind( kind) ! ********************************************************************** ! ?kind?_asind(): asind() for kind ?kind? real( kind= ?kind?_k) function ?kind?_asind( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_asind() continue ! asind() ?kind?_asind = 57.2957795130823208767981548141052_?kind?_k * asin( a) return ! asind() ! ?kind?_asind() end function ?kind?_asind ?? end text asind ?? if( single_k )then ?? copy :: asind( single) ?? endif ?? if( double_k )then ?? copy :: asind( double) ?? endif ?? if( quad_k )then ?? copy :: asind( quad) ?? endif ?? text :: acosd( kind) ! ********************************************************************** ! ?kind?_acosd(): acosd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acosd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acosd() continue ! acosd() ?kind?_acosd = 57.2957795130823208767981548141052_?kind?_k * acos( a) return ! acosd() ! ?kind?_acosd() end function ?kind?_acosd ?? end text acosd ?? if( single_k )then ?? copy :: acosd( single) ?? endif ?? if( double_k )then ?? copy :: acosd( double) ?? endif ?? if( quad_k )then ?? copy :: acosd( quad) ?? endif ?? text :: atand( kind) ! ********************************************************************** ! ?kind?_atand(): atand() for kind ?kind? real( kind= ?kind?_k) function ?kind?_atand( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_atand() continue ! atand() ?kind?_atand = 57.2957795130823208767981548141052_?kind?_k * atan( a) return ! atand() ! ?kind?_atand() end function ?kind?_atand ?? end text atand ?? if( single_k )then ?? copy :: atand( single) ?? endif ?? if( double_k )then ?? copy :: atand( double) ?? endif ?? if( quad_k )then ?? copy :: atand( quad) ?? endif ?? text :: atan2d( kind) ! ********************************************************************** ! ?kind?_atan2d(): atan2d() for kind ?kind? real( kind= ?kind?_k) function ?kind?_atan2d( a, b) real( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_atan2d() continue ! atan2d() ?kind?_atan2d = 57.2957795130823208767981548141052_?kind?_k * atan2( a, b) return ! atan2d() ! ?kind?_atan2d() end function ?kind?_atan2d ?? end text atan2d ?? if( single_k )then ?? copy :: atan2d( single) ?? endif ?? if( double_k )then ?? copy :: atan2d( double) ?? endif ?? if( quad_k )then ?? copy :: atan2d( quad) ?? endif ?? text :: acotd( kind) ! ********************************************************************** ! ?kind?_acotd(): acotd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acotd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acotd() continue ! acotd() ?kind?_acotd = 57.2957795130823208767981548141052_?kind?_k * atan( 1.0_?kind?_k / a) return ! acotd() ! ?kind?_acotd() end function ?kind?_acotd ?? end text acotd ?? if( single_k )then ?? copy :: acotd( single) ?? endif ?? if( double_k )then ?? copy :: acotd( double) ?? endif ?? if( quad_k )then ?? copy :: acotd( quad) ?? endif ?? text :: acot2d( kind) ! ********************************************************************** ! ?kind?_acot2d(): acot2d() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acot2d( a, b) real( kind= ?kind?_k), intent( in) :: a, b ! ?kind?_acot2d() continue ! acot2d() ?kind?_acot2d = 57.2957795130823208767981548141052_?kind?_k * atan2( b, a) return ! acot2d() ! ?kind?_acot2d() end function ?kind?_acot2d ?? end text acot2d ?? if( single_k )then ?? copy :: acot2d( single) ?? endif ?? if( double_k )then ?? copy :: acot2d( double) ?? endif ?? if( quad_k )then ?? copy :: acot2d( quad) ?? endif ?? text :: asecd( kind) ! ********************************************************************** ! ?kind?_asecd(): asecd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_asecd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_asecd() continue ! asecd() ?kind?_asecd = 57.2957795130823208767981548141052_?kind?_k * acos( 1.0_?kind?_k / a) return ! asecd() ! ?kind?_asecd() end function ?kind?_asecd ?? end text asecd ?? if( single_k )then ?? copy :: asecd( single) ?? endif ?? if( double_k )then ?? copy :: asecd( double) ?? endif ?? if( quad_k )then ?? copy :: asecd( quad) ?? endif ?? text :: acscd( kind) ! ********************************************************************** ! ?kind?_acscd(): acscd() for kind ?kind? real( kind= ?kind?_k) function ?kind?_acscd( a) real( kind= ?kind?_k), intent( in) :: a ! ?kind?_acscd() continue ! acscd() ?kind?_acscd = 57.2957795130823208767981548141052_?kind?_k * asin( 1.0_?kind?_k / a) return ! acscd() ! ?kind?_acscd() end function ?kind?_acscd ?? end text acscd ?? if( single_k )then ?? copy :: acscd( single) ?? endif ?? if( double_k )then ?? copy :: acscd( double) ?? endif ?? if( quad_k )then ?? copy :: acscd( quad) ?? endif ! ********************************************************************** ! trig_functions ! $Id: trigfunc.fpp 1.3 2003/10/03 19:44:06Z Dan Release $ ! ********************************************************************** end module trig_functions ! eof Day-III/06-coco/typerat.f90100777 0 0 76611 11740034050 10525 0! bof ! ********************************************************************** ! Source Control: ! $Id: typerat.fpp 1.3 2003/10/03 02:53:54Z Dan Release $ ! ********************************************************************** ! copyright 2000 Purple Sage Computing Solutions, Inc. ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! Fortran 90 module type_rational ! ********************************************************************** ! a rational number is the ratio of two integers ! ********************************************************************** ! use standard_types ! ********************************************************************** ! type_rational types ! rational_t two int_k integers, numerator & denominator ! type_rational operators ! = ! + unary rational_t ! - negation ! + binary compute rational_t ! - ! * ! / ! .eq. binary compare rational_t ! .ne. ! .lt. ! .le. ! .ge. ! .gt. ! .inverse. exchange numerator & denominator ! .reduce. reduce to lowest terms ! type_rational library ! rat() from int ! int() from rational_t ! nint() from rational_t ! real() from rational_t ! ceiling() ! floor() ! sign() of a rational_t ! abs() ! epsilon() for type rational_t ! huge() ! tiny() ! numerator() numerator ! denominator() denominator ! is_finite() true if ( x / y), y /= 0 ! is_infinity() true if ( x / 0), x /= 0 ! is_nan() true if ( 0 / 0) ! inverse() exchange numerator & denominator ! reduce() reduce to lowest terms ! bit_size() extend bit_size() to type rational_t ! swap() extend swap() to type rational_t ! ********************************************************************** ! type_rational ! ********************************************************************** module type_rational ! ********************************************************************** ! description of processor use standard_types ! ********************************************************************** ! functions use standard_functions ! ********************************************************************** ! declare all variables implicit none ! ********************************************************************** ! declare all exports private ! ********************************************************************** ! type_rational rcs strings character( len= *), public, parameter :: type_rational_rcs_id = & '$Id: typerat.fpp 1.3 2003/10/03 02:53:54Z Dan Release $' ! ********************************************************************** ! type_rational type, public :: rational_t private ! access via library integer :: n ! numerator is default integer integer :: d ! denominator is default integer end type rational_t ! ********************************************************************** ! library ! ********************************************************************** ! assignment for type rational_t public :: assignment( =) ! i = r interface assignment( =) module procedure rational_to_int end interface interface assignment( =) module procedure int_to_rational end interface ! ********************************************************************** ! +, -, unary operators for rational_t public :: operator( +) ! + r, r + r interface operator( +) module procedure rational_plus end interface public :: operator( -) ! - r, r - r interface operator( -) module procedure rational_minus end interface ! ********************************************************************** ! +, -, *, / binary operators for rational_t interface operator( +) module procedure rational_add end interface interface operator( -) module procedure rational_sub end interface public :: operator( *) ! r * r interface operator( *) module procedure rational_mul end interface public :: operator( /) ! r / r interface operator( /) module procedure rational_div end interface ! ********************************************************************** ! ==, /=, <=, <, >, >= operators for rational_t public :: operator( ==) ! r == r interface operator( ==) module procedure rational_eq end interface public :: operator ( /=) ! r /= r interface operator( /=) module procedure rational_ne end interface public :: operator( <) ! r < r interface operator( <) module procedure rational_lt end interface public :: operator( <=) ! r <= r interface operator( <=) module procedure rational_le end interface public :: operator( >=) ! r >= r interface operator( >=) module procedure rational_ge end interface public :: operator( >) ! r > r interface operator( >) module procedure rational_gt end interface ! ********************************************************************** ! rat() for type rational_t public :: rat ! use generic interface rat module procedure byte_rat module procedure short_rat module procedure int_rat module procedure long_rat end interface ! ********************************************************************** ! int() for type rational_t intrinsic :: int ! extend intrinsic public :: int ! use generic interface int module procedure rational_int end interface ! ********************************************************************** ! nint() for type rational_t intrinsic :: nint ! extend intrinsic public :: nint ! use generic interface nint module procedure rational_nint end interface ! ********************************************************************** ! real() for type rational_t intrinsic :: real ! extend intrinsic public :: real ! use generic interface real module procedure rational_real end interface ! ********************************************************************** ! sign() for type rational_t intrinsic :: sign ! extend intrinsic public :: sign ! use generic interface sign module procedure rational_sign end interface ! ********************************************************************** ! abs() for type rational_t intrinsic :: abs ! extend intrinsic public :: abs ! use generic interface abs module procedure rational_abs end interface ! ********************************************************************** ! huge() for type rational_t intrinsic :: huge ! extend intrinsic public :: huge ! use generic interface huge module procedure rational_huge end interface ! ********************************************************************** ! tiny() for type rational_t intrinsic :: tiny ! extend intrinsic public :: tiny ! use generic interface tiny module procedure rational_tiny end interface ! ********************************************************************** ! epsilon() for type rational_t intrinsic :: epsilon ! extend intrinsic public :: epsilon ! use generic interface epsilon module procedure rational_epsilon end interface ! ********************************************************************** ! numerator() for type rational_t public :: numerator ! use generic interface numerator module procedure rational_numerator end interface ! denominator() for type rational_t public :: denominator ! use generic interface denominator module procedure rational_denominator end interface ! ********************************************************************** ! is_finite() for type rational_t public :: is_finite ! use generic interface is_finite module procedure rational_is_finite end interface ! ********************************************************************** ! is_infinity() for type rational_t public :: is_infinity ! use generic interface is_infinity module procedure rational_is_infinity end interface ! ********************************************************************** ! is_nan() for type rational_t public :: is_nan ! use generic interface is_nan module procedure rational_is_nan end interface ! ********************************************************************** ! inverse() for type rational_t public :: operator( .inverse.) ! use generic interface operator( .inverse.) module procedure rational_inverse end interface public :: inverse ! use generic interface inverse module procedure rational_inverse end interface ! ********************************************************************** ! reduce() for type rational_t public :: operator( .reduce.) ! use generic interface operator( .reduce.) module procedure rational_reduce end interface public :: reduce ! use generic interface reduce module procedure rational_reduce end interface ! ********************************************************************** ! bit_size() for type rational_t intrinsic :: bit_size ! extend intrinsic public :: bit_size ! use generic interface bit_size module procedure rational_bit_size end interface ! ********************************************************************** ! swap() for type rational_t public :: swap ! use generic interface swap module procedure rational_swap end interface ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! ********************************************************************** ! rational_to_int(): assign i( 1: 2) = r subroutine rational_to_int( b, a) type( rational_t), intent( in) :: a integer, dimension( 2), intent( out) :: b ! default integer ! rational_to_int() continue ! = b = (/ a% n, a% d /) return ! = ! rational_to_int() end subroutine rational_to_int ! ---------------------------------------------------------------------- ! int_to_rational(): assign r = i( 1: 2) subroutine int_to_rational( b, a) integer, dimension( 2), intent( in) :: a ! default integer type( rational_t), intent( out) :: b ! int_to_rational() continue ! = b = rational_t( a( 1), a( 2) ) return ! = ! int_to_rational() end subroutine int_to_rational ! ********************************************************************** ! rational_plus(): unary + rational elemental type( rational_t) function rational_plus( a) type( rational_t), intent( in) :: a ! rational_plus() continue ! + rational_plus = rational_t( a% n, a% d) return ! + ! rational_plus() end function rational_plus ! ---------------------------------------------------------------------- ! rational_minus(): unary - rational elemental type( rational_t) function rational_minus( a) type( rational_t), intent( in) :: a ! rational_minus() continue ! - rational_minus = rational_t( -a% n , a% d) return ! - ! rational_minus() end function rational_minus ! ********************************************************************** ! rational_add(): add two rationals elemental type( rational_t) function rational_add( a, b) type( rational_t), intent( in) :: a, b ! rational_add() continue ! + rational_add = rational_t( ( a% n * b% d) + ( b% n * a% d), a% d * b% d) return ! + ! rational_add() end function rational_add ! ---------------------------------------------------------------------- ! rational_sub(): subtract two rationals elemental type( rational_t) function rational_sub( a, b) type( rational_t), intent( in) :: a, b ! rational_sub() continue ! - rational_sub = rational_t( ( a% n * b% d) - ( b% n * a% d), a% d * b% d) return ! - ! rational_sub() end function rational_sub ! ---------------------------------------------------------------------- ! rational_mul(): multiply two rationals elemental type( rational_t) function rational_mul( a, b) type( rational_t), intent( in) :: a, b ! rational_mul() continue ! * rational_mul = rational_t( a% n * b% n, a% d * b% d) return ! * ! rational_mul() end function rational_mul ! ---------------------------------------------------------------------- ! rational_div(): divide two rationals elemental type( rational_t) function rational_div( a, b) type( rational_t), intent( in) :: a, b ! rational_div() continue ! / rational_div = rational_t( a% n * b% d, a% d * b% n) return ! / ! rational_div() end function rational_div ! ********************************************************************** ! rational_eq(): eq two rationals elemental logical function rational_eq( a, b) type( rational_t), intent( in) :: a, b ! rational_eq() local type( rational_t) :: ra, rb ! rational_eq() continue ! == ra = reduce( a) rb = reduce( b) rational_eq = ( ra% n == rb% n) .and. ( ra% d == rb% d) return ! == ! rational_eq() end function rational_eq ! ---------------------------------------------------------------------- ! rational_ne(): ne two rationals elemental logical function rational_ne( a, b) type( rational_t), intent( in) :: a, b ! rational_ne() local type( rational_t) :: ra, rb ! rational_ne() continue ! /= ra = reduce( a) rb = reduce( b) rational_ne = ( ra% n /= rb% n) .or. ( ra% d /= rb% d) return ! /= ! rational_ne() end function rational_ne ! ---------------------------------------------------------------------- ! rational_lt(): lt two rationals elemental logical function rational_lt( a, b) type( rational_t), intent( in) :: a, b ! rational_lt() continue ! < rational_lt = sign( 1_int_k, a - b) < 0 return ! < ! rational_lt() end function rational_lt ! ---------------------------------------------------------------------- ! rational_le(): le two rationals elemental logical function rational_le( a, b) type( rational_t), intent( in) :: a, b ! rational_le() continue ! <= rational_le = sign( 1_int_k, a - b) < 0 & .or. a .eq. b return ! <= ! rational_le() end function rational_le ! ---------------------------------------------------------------------- ! rational_ge(): ge two rationals elemental logical function rational_ge( a, b) type( rational_t), intent( in) :: a, b ! rational_ge() continue ! >= rational_ge = sign( 1_int_k, a - b) > 0 & .or. a .eq. b return ! >= ! rational_ge() end function rational_ge ! ---------------------------------------------------------------------- ! rational_gt(): gt two rationals elemental logical function rational_gt( a, b) type( rational_t), intent( in) :: a, b ! rational_gt() continue ! > rational_gt = sign( 1_int_k, a - b) > 0 return ! > ! rational_gt() end function rational_gt ! ********************************************************************** ! byte_rat(): rational_t from integer elemental type( rational_t) function byte_rat( i, j) integer( kind= byte_k), intent( in) :: i ! byte integer integer( kind= byte_k), optional, intent( in) :: j ! byte integer ! byte_rat() continue ! rat() number_of_args: if( present( j) )then byte_rat = rational_t( int( i, kind= int_k), int( j, kind= int_k)) else number_of_args byte_rat = rational_t( int( i, kind= int_k), 1_int_k) endif number_of_args return ! rat() ! byte_rat() end function byte_rat ! ********************************************************************** ! short_rat(): rational_t from integer elemental type( rational_t) function short_rat( i, j) integer( kind= short_k), intent( in) :: i ! short integer integer( kind= short_k), optional, intent( in) :: j ! short integer ! short_rat() continue ! rat() number_of_args: if( present( j) )then short_rat = rational_t( int( i, kind= int_k), int( j, kind= int_k)) else number_of_args short_rat = rational_t( int( i, kind= int_k), 1_int_k) endif number_of_args return ! rat() ! short_rat() end function short_rat ! ********************************************************************** ! int_rat(): rational_t from integer elemental type( rational_t) function int_rat( i, j) integer( kind= int_k), intent( in) :: i ! int integer integer( kind= int_k), optional, intent( in) :: j ! int integer ! int_rat() continue ! rat() number_of_args: if( present( j) )then int_rat = rational_t( int( i, kind= int_k), int( j, kind= int_k)) else number_of_args int_rat = rational_t( int( i, kind= int_k), 1_int_k) endif number_of_args return ! rat() ! int_rat() end function int_rat ! ********************************************************************** ! long_rat(): rational_t from integer elemental type( rational_t) function long_rat( i, j) integer( kind= long_k), intent( in) :: i ! long integer integer( kind= long_k), optional, intent( in) :: j ! long integer ! long_rat() continue ! rat() number_of_args: if( present( j) )then long_rat = rational_t( int( i, kind= int_k), int( j, kind= int_k)) else number_of_args long_rat = rational_t( int( i, kind= int_k), 1_int_k) endif number_of_args return ! rat() ! long_rat() end function long_rat ! ********************************************************************** ! rational_int(): integer from rational_t elemental integer( kind= int_k) function rational_int( r) type( rational_t), intent( in) :: r ! rational_int() continue ! int() rational_int = int( real( r% n, kind= double_k) / real( r% d, kind= double_k) ) return ! int() ! rational_int() end function rational_int ! ---------------------------------------------------------------------- ! rational_nint(): integer from rational_t elemental integer( kind= int_k) function rational_nint( r) type( rational_t), intent( in) :: r ! rational_nint() continue ! nint() rational_nint = nint( real( r% n, kind= double_k) / real( r% d, kind= double_k) ) return ! nint() ! rational_nint() end function rational_nint ! ---------------------------------------------------------------------- ! rational_real(): integer from rational_t elemental real( kind= double_k) function rational_real( r) type( rational_t), intent( in) :: r ! rational_real() continue ! real() rational_real = real( r% n, kind= double_k) / real( r% d, kind= double_k) return ! real() ! rational_real() end function rational_real ! ********************************************************************** ! rational_sign(): integer from rational_t elemental integer function rational_sign( i, r) integer, intent( in) :: i type( rational_t), intent( in) :: r ! rational_sign() continue ! sign() plus_minus: if( sign( 1, r% n) * sign( 1, r% d) > 0 )then rational_sign = abs( i) ! positive integer else plus_minus rational_sign = -abs( i) ! negative integer endif plus_minus return ! sign() ! rational_sign() end function rational_sign ! ********************************************************************** ! rational_abs(): extend abs() to type rational elemental type( rational_t) function rational_abs( r) type( rational_t), intent( in) :: r ! rational_abs() continue ! abs() rational_abs = rational_t( abs( r% n), abs( r% d)) return ! abs() ! rational_abs() end function rational_abs ! ********************************************************************** ! rational_huge(): integer from rational_t elemental type( rational_t) function rational_huge( r) type( rational_t), intent( in) :: r ! rational_huge() continue ! huge() rational_huge = rational_t( huge( 0), 1) return ! huge() ! rational_huge() end function rational_huge ! ********************************************************************** ! rational_tiny(): extend tiny() to type rational elemental type( rational_t) function rational_tiny( r) type( rational_t), intent( in) :: r ! rational_tiny() continue ! tiny() rational_tiny = rational_t( 1, huge( 0)) return ! tiny() ! rational_tiny() end function rational_tiny ! ********************************************************************** ! rational_epsilon(): extend epsilon() to type rational elemental type( rational_t) function rational_epsilon( r) type( rational_t), intent( in) :: r ! rational_epsilon() continue ! epsilon() rational_epsilon = rational_t( 1, ( huge( 0) - 1)) return ! epsilon() ! rational_epsilon() end function rational_epsilon ! ********************************************************************** ! rational_numerator(): return numerator elemental integer( kind= int_k) function rational_numerator( r) type( rational_t), intent( in) :: r ! rational_numerator() continue ! numerator() rational_numerator = r% n return ! numerator() ! rational_numerator() end function rational_numerator ! ********************************************************************** ! rational_denominator(): return denominator elemental integer( kind= int_k) function rational_denominator( r) type( rational_t), intent( in) :: r ! rational_denominator() continue ! denominator() rational_denominator = r% d return ! denominator() ! rational_denominator() end function rational_denominator ! ********************************************************************** ! rational_is_finite(): true if its argument is x/0, x/=0 elemental logical function rational_is_finite( r) type( rational_t), intent( in) :: r ! rational_is_finite() continue ! is_finite() rational_is_finite = r% d /= 0 return ! is_finite() ! rational_is_finite() end function rational_is_finite ! ********************************************************************** ! rational_is_infinity(): true if its argument is x/0, x/=0 elemental logical function rational_is_infinity( r) type( rational_t), intent( in) :: r ! rational_is_infinity() continue ! is_infinity() rational_is_infinity = ( r% n /= 0) .and. ( r% d == 0) return ! is_infinity() ! rational_is_infinity() end function rational_is_infinity ! ********************************************************************** ! rational_is_nan(): true if its argument is 0/0 elemental logical function rational_is_nan( r) type( rational_t), intent( in) :: r ! rational_is_nan() continue ! is_nan() rational_is_nan = ( r% n == 0) .and. ( r% d == 0) return ! is_nan() ! rational_is_nan() end function rational_is_nan ! ********************************************************************** ! rational_inverse(): extend inverse() to type rational elemental type( rational_t) function rational_inverse( r) type( rational_t), intent( in) :: r ! rational_inverse() continue ! .inverse., inverse() rational_inverse = rational_t( r% d, r% n) return ! .inverse., inverse() ! rational_inverse() end function rational_inverse ! ********************************************************************** ! rational_reduce(): extend reduce() to type rational elemental type( rational_t) function rational_reduce( r) type( rational_t), intent( in) :: r ! rational_reduce() local integer( kind= int_k) :: div ! rational_reduce() continue ! .reduce., reduce() div = r% n .gcd. r% d ! greatest common divisor rational_reduce = rational_t( r% n / div, r% d / div) return ! .reduce., reduce() ! rational_reduce() end function rational_reduce ! ********************************************************************** ! rational_bit_size(): extend bit_size() to type rational elemental integer function rational_bit_size( r) type( rational_t), intent( in) :: r ! rational_bit_size() continue ! bit_size() rational_bit_size = bit_size( r% n) + bit_size( r% d) ! assume no padding return ! bit_size() ! rational_bit_size() end function rational_bit_size ! ********************************************************************** ! rational_swap(): extend swap() to type rational elemental subroutine rational_swap( a, b) type( rational_t), intent( inout) :: a, b ! rational_swap() local type( rational_t) :: t1, t2 ! rational_swap() continue ! swap() t1 = a t2 = b b = t1 a = t2 return ! swap() ! rational_swap() end subroutine rational_swap ! ********************************************************************** ! type_rational ! $Id: typerat.fpp 1.3 2003/10/03 02:53:54Z Dan Release $ ! ********************************************************************** end module type_rational ! eof Day-III/06-coco/typerat.fpp100777 0 0 75571 11672233502 10727 0! bof ! ********************************************************************** ! Source Control: ! $Id: typerat.fpp 1.3 2003/10/03 02:53:54Z Dan Release $ ! ********************************************************************** ! copyright 2000 Purple Sage Computing Solutions, Inc. ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Library General Public ! License as published by the Free Software Foundation; either ! version 2 of the License, or (at your option) any later version. ! This library is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! Library General Public License for more details. ! You should have received a copy of the GNU Library General Public ! License along with this library; if not, write to the Free ! Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! To report bugs, suggest enhancements, etc. to the Authors, ! Contact: ! Purple Sage Computing Solutions, Inc. ! send email to dnagle@erols.com ! or fax to 703 471 0684 (USA) ! or mail to 12142 Purple Sage Ct. ! Reston, VA 20194-5621 USA ! ********************************************************************** ! Fortran 90 module type_rational ! ********************************************************************** ! a rational number is the ratio of two integers ! ********************************************************************** ! use standard_types ! ********************************************************************** ! type_rational types ! rational_t two int_k integers, numerator & denominator ! type_rational operators ! = ! + unary rational_t ! - negation ! + binary compute rational_t ! - ! * ! / ! .eq. binary compare rational_t ! .ne. ! .lt. ! .le. ! .ge. ! .gt. ! .inverse. exchange numerator & denominator ! .reduce. reduce to lowest terms ! type_rational library ! rat() from int ! int() from rational_t ! nint() from rational_t ! real() from rational_t ! ceiling() ! floor() ! sign() of a rational_t ! abs() ! epsilon() for type rational_t ! huge() ! tiny() ! numerator() numerator ! denominator() denominator ! is_finite() true if ( x / y), y /= 0 ! is_infinity() true if ( x / 0), x /= 0 ! is_nan() true if ( 0 / 0) ! inverse() exchange numerator & denominator ! reduce() reduce to lowest terms ! bit_size() extend bit_size() to type rational_t ! swap() extend swap() to type rational_t ?? ! ******************************************************************* ?? ! preprocessor definitions ?? include 'coco.inc' ?? ! ******************************************************************* ! ********************************************************************** ! type_rational ! ********************************************************************** module type_rational ! ********************************************************************** ! description of processor use standard_types ! ********************************************************************** ! functions use standard_functions ! ********************************************************************** ! declare all variables implicit none ! ********************************************************************** ! declare all exports private ! ********************************************************************** ! type_rational rcs strings character( len= *), public, parameter :: type_rational_rcs_id = & '$Id: typerat.fpp 1.3 2003/10/03 02:53:54Z Dan Release $' ! ********************************************************************** ! type_rational type, public :: rational_t private ! access via library integer :: n ! numerator is default integer integer :: d ! denominator is default integer end type rational_t ! ********************************************************************** ! library ! ********************************************************************** ! assignment for type rational_t public :: assignment( =) ! i = r interface assignment( =) module procedure rational_to_int end interface interface assignment( =) module procedure int_to_rational end interface ! ********************************************************************** ! +, -, unary operators for rational_t public :: operator( +) ! + r, r + r interface operator( +) module procedure rational_plus end interface public :: operator( -) ! - r, r - r interface operator( -) module procedure rational_minus end interface ! ********************************************************************** ! +, -, *, / binary operators for rational_t interface operator( +) module procedure rational_add end interface interface operator( -) module procedure rational_sub end interface public :: operator( *) ! r * r interface operator( *) module procedure rational_mul end interface public :: operator( /) ! r / r interface operator( /) module procedure rational_div end interface ! ********************************************************************** ! ==, /=, <=, <, >, >= operators for rational_t public :: operator( ==) ! r == r interface operator( ==) module procedure rational_eq end interface public :: operator ( /=) ! r /= r interface operator( /=) module procedure rational_ne end interface public :: operator( <) ! r < r interface operator( <) module procedure rational_lt end interface public :: operator( <=) ! r <= r interface operator( <=) module procedure rational_le end interface public :: operator( >=) ! r >= r interface operator( >=) module procedure rational_ge end interface public :: operator( >) ! r > r interface operator( >) module procedure rational_gt end interface ! ********************************************************************** ! rat() for type rational_t public :: rat ! use generic interface rat ?? if( byte_k )then module procedure byte_rat ?? endif ?? if( short_k )then module procedure short_rat ?? endif ?? if( int_k )then module procedure int_rat ?? endif ?? if( long_k )then module procedure long_rat ?? endif end interface ! ********************************************************************** ! int() for type rational_t intrinsic :: int ! extend intrinsic public :: int ! use generic interface int module procedure rational_int end interface ! ********************************************************************** ! nint() for type rational_t intrinsic :: nint ! extend intrinsic public :: nint ! use generic interface nint module procedure rational_nint end interface ! ********************************************************************** ! real() for type rational_t intrinsic :: real ! extend intrinsic public :: real ! use generic interface real module procedure rational_real end interface ! ********************************************************************** ! sign() for type rational_t intrinsic :: sign ! extend intrinsic public :: sign ! use generic interface sign module procedure rational_sign end interface ! ********************************************************************** ! abs() for type rational_t intrinsic :: abs ! extend intrinsic public :: abs ! use generic interface abs module procedure rational_abs end interface ! ********************************************************************** ! huge() for type rational_t intrinsic :: huge ! extend intrinsic public :: huge ! use generic interface huge module procedure rational_huge end interface ! ********************************************************************** ! tiny() for type rational_t intrinsic :: tiny ! extend intrinsic public :: tiny ! use generic interface tiny module procedure rational_tiny end interface ! ********************************************************************** ! epsilon() for type rational_t intrinsic :: epsilon ! extend intrinsic public :: epsilon ! use generic interface epsilon module procedure rational_epsilon end interface ! ********************************************************************** ! numerator() for type rational_t public :: numerator ! use generic interface numerator module procedure rational_numerator end interface ! denominator() for type rational_t public :: denominator ! use generic interface denominator module procedure rational_denominator end interface ! ********************************************************************** ! is_finite() for type rational_t public :: is_finite ! use generic interface is_finite module procedure rational_is_finite end interface ! ********************************************************************** ! is_infinity() for type rational_t public :: is_infinity ! use generic interface is_infinity module procedure rational_is_infinity end interface ! ********************************************************************** ! is_nan() for type rational_t public :: is_nan ! use generic interface is_nan module procedure rational_is_nan end interface ! ********************************************************************** ! inverse() for type rational_t public :: operator( .inverse.) ! use generic interface operator( .inverse.) module procedure rational_inverse end interface public :: inverse ! use generic interface inverse module procedure rational_inverse end interface ! ********************************************************************** ! reduce() for type rational_t public :: operator( .reduce.) ! use generic interface operator( .reduce.) module procedure rational_reduce end interface public :: reduce ! use generic interface reduce module procedure rational_reduce end interface ! ********************************************************************** ! bit_size() for type rational_t intrinsic :: bit_size ! extend intrinsic public :: bit_size ! use generic interface bit_size module procedure rational_bit_size end interface ! ********************************************************************** ! swap() for type rational_t public :: swap ! use generic interface swap module procedure rational_swap end interface ! ********************************************************************** ! module procedures ! ********************************************************************** contains ! ********************************************************************** ! rational_to_int(): assign i( 1: 2) = r subroutine rational_to_int( b, a) type( rational_t), intent( in) :: a integer, dimension( 2), intent( out) :: b ! default integer ! rational_to_int() continue ! = b = (/ a% n, a% d /) return ! = ! rational_to_int() end subroutine rational_to_int ! ---------------------------------------------------------------------- ! int_to_rational(): assign r = i( 1: 2) subroutine int_to_rational( b, a) integer, dimension( 2), intent( in) :: a ! default integer type( rational_t), intent( out) :: b ! int_to_rational() continue ! = b = rational_t( a( 1), a( 2) ) return ! = ! int_to_rational() end subroutine int_to_rational ! ********************************************************************** ! rational_plus(): unary + rational elemental type( rational_t) function rational_plus( a) type( rational_t), intent( in) :: a ! rational_plus() continue ! + rational_plus = rational_t( a% n, a% d) return ! + ! rational_plus() end function rational_plus ! ---------------------------------------------------------------------- ! rational_minus(): unary - rational elemental type( rational_t) function rational_minus( a) type( rational_t), intent( in) :: a ! rational_minus() continue ! - rational_minus = rational_t( -a% n , a% d) return ! - ! rational_minus() end function rational_minus ! ********************************************************************** ! rational_add(): add two rationals elemental type( rational_t) function rational_add( a, b) type( rational_t), intent( in) :: a, b ! rational_add() continue ! + rational_add = rational_t( ( a% n * b% d) + ( b% n * a% d), a% d * b% d) return ! + ! rational_add() end function rational_add ! ---------------------------------------------------------------------- ! rational_sub(): subtract two rationals elemental type( rational_t) function rational_sub( a, b) type( rational_t), intent( in) :: a, b ! rational_sub() continue ! - rational_sub = rational_t( ( a% n * b% d) - ( b% n * a% d), a% d * b% d) return ! - ! rational_sub() end function rational_sub ! ---------------------------------------------------------------------- ! rational_mul(): multiply two rationals elemental type( rational_t) function rational_mul( a, b) type( rational_t), intent( in) :: a, b ! rational_mul() continue ! * rational_mul = rational_t( a% n * b% n, a% d * b% d) return ! * ! rational_mul() end function rational_mul ! ---------------------------------------------------------------------- ! rational_div(): divide two rationals elemental type( rational_t) function rational_div( a, b) type( rational_t), intent( in) :: a, b ! rational_div() continue ! / rational_div = rational_t( a% n * b% d, a% d * b% n) return ! / ! rational_div() end function rational_div ! ********************************************************************** ! rational_eq(): eq two rationals elemental logical function rational_eq( a, b) type( rational_t), intent( in) :: a, b ! rational_eq() local type( rational_t) :: ra, rb ! rational_eq() continue ! == ra = reduce( a) rb = reduce( b) rational_eq = ( ra% n == rb% n) .and. ( ra% d == rb% d) return ! == ! rational_eq() end function rational_eq ! ---------------------------------------------------------------------- ! rational_ne(): ne two rationals elemental logical function rational_ne( a, b) type( rational_t), intent( in) :: a, b ! rational_ne() local type( rational_t) :: ra, rb ! rational_ne() continue ! /= ra = reduce( a) rb = reduce( b) rational_ne = ( ra% n /= rb% n) .or. ( ra% d /= rb% d) return ! /= ! rational_ne() end function rational_ne ! ---------------------------------------------------------------------- ! rational_lt(): lt two rationals elemental logical function rational_lt( a, b) type( rational_t), intent( in) :: a, b ! rational_lt() continue ! < rational_lt = sign( 1_int_k, a - b) < 0 return ! < ! rational_lt() end function rational_lt ! ---------------------------------------------------------------------- ! rational_le(): le two rationals elemental logical function rational_le( a, b) type( rational_t), intent( in) :: a, b ! rational_le() continue ! <= rational_le = sign( 1_int_k, a - b) < 0 & .or. a .eq. b return ! <= ! rational_le() end function rational_le ! ---------------------------------------------------------------------- ! rational_ge(): ge two rationals elemental logical function rational_ge( a, b) type( rational_t), intent( in) :: a, b ! rational_ge() continue ! >= rational_ge = sign( 1_int_k, a - b) > 0 & .or. a .eq. b return ! >= ! rational_ge() end function rational_ge ! ---------------------------------------------------------------------- ! rational_gt(): gt two rationals elemental logical function rational_gt( a, b) type( rational_t), intent( in) :: a, b ! rational_gt() continue ! > rational_gt = sign( 1_int_k, a - b) > 0 return ! > ! rational_gt() end function rational_gt ?? text :: rat( kind) ! ********************************************************************** ! ?kind?_rat(): rational_t from integer elemental type( rational_t) function ?kind?_rat( i, j) integer( kind= ?kind?_k), intent( in) :: i ! ?kind? integer integer( kind= ?kind?_k), optional, intent( in) :: j ! ?kind? integer ! ?kind?_rat() continue ! rat() number_of_args: if( present( j) )then ?kind?_rat = rational_t( int( i, kind= int_k), int( j, kind= int_k)) else number_of_args ?kind?_rat = rational_t( int( i, kind= int_k), 1_int_k) endif number_of_args return ! rat() ! ?kind?_rat() end function ?kind?_rat ?? end text rat ?? if( byte_k )then ?? copy :: rat( byte) ?? endif ?? if( short_k )then ?? copy :: rat( short) ?? endif ?? if( int_k )then ?? copy :: rat( int) ?? endif ?? if( long_k )then ?? copy :: rat( long) ?? endif ! ********************************************************************** ! rational_int(): integer from rational_t elemental integer( kind= int_k) function rational_int( r) type( rational_t), intent( in) :: r ! rational_int() continue ! int() rational_int = int( real( r% n, kind= double_k) / real( r% d, kind= double_k) ) return ! int() ! rational_int() end function rational_int ! ---------------------------------------------------------------------- ! rational_nint(): integer from rational_t elemental integer( kind= int_k) function rational_nint( r) type( rational_t), intent( in) :: r ! rational_nint() continue ! nint() rational_nint = nint( real( r% n, kind= double_k) / real( r% d, kind= double_k) ) return ! nint() ! rational_nint() end function rational_nint ! ---------------------------------------------------------------------- ! rational_real(): integer from rational_t elemental real( kind= double_k) function rational_real( r) type( rational_t), intent( in) :: r ! rational_real() continue ! real() rational_real = real( r% n, kind= double_k) / real( r% d, kind= double_k) return ! real() ! rational_real() end function rational_real ! ********************************************************************** ! rational_sign(): integer from rational_t elemental integer function rational_sign( i, r) integer, intent( in) :: i type( rational_t), intent( in) :: r ! rational_sign() continue ! sign() plus_minus: if( sign( 1, r% n) * sign( 1, r% d) > 0 )then rational_sign = abs( i) ! positive integer else plus_minus rational_sign = -abs( i) ! negative integer endif plus_minus return ! sign() ! rational_sign() end function rational_sign ! ********************************************************************** ! rational_abs(): extend abs() to type rational elemental type( rational_t) function rational_abs( r) type( rational_t), intent( in) :: r ! rational_abs() continue ! abs() rational_abs = rational_t( abs( r% n), abs( r% d)) return ! abs() ! rational_abs() end function rational_abs ! ********************************************************************** ! rational_huge(): integer from rational_t elemental type( rational_t) function rational_huge( r) type( rational_t), intent( in) :: r ! rational_huge() continue ! huge() rational_huge = rational_t( huge( 0), 1) return ! huge() ! rational_huge() end function rational_huge ! ********************************************************************** ! rational_tiny(): extend tiny() to type rational elemental type( rational_t) function rational_tiny( r) type( rational_t), intent( in) :: r ! rational_tiny() continue ! tiny() rational_tiny = rational_t( 1, huge( 0)) return ! tiny() ! rational_tiny() end function rational_tiny ! ********************************************************************** ! rational_epsilon(): extend epsilon() to type rational elemental type( rational_t) function rational_epsilon( r) type( rational_t), intent( in) :: r ! rational_epsilon() continue ! epsilon() rational_epsilon = rational_t( 1, ( huge( 0) - 1)) return ! epsilon() ! rational_epsilon() end function rational_epsilon ! ********************************************************************** ! rational_numerator(): return numerator elemental integer( kind= int_k) function rational_numerator( r) type( rational_t), intent( in) :: r ! rational_numerator() continue ! numerator() rational_numerator = r% n return ! numerator() ! rational_numerator() end function rational_numerator ! ********************************************************************** ! rational_denominator(): return denominator elemental integer( kind= int_k) function rational_denominator( r) type( rational_t), intent( in) :: r ! rational_denominator() continue ! denominator() rational_denominator = r% d return ! denominator() ! rational_denominator() end function rational_denominator ! ********************************************************************** ! rational_is_finite(): true if its argument is x/0, x/=0 elemental logical function rational_is_finite( r) type( rational_t), intent( in) :: r ! rational_is_finite() continue ! is_finite() rational_is_finite = r% d /= 0 return ! is_finite() ! rational_is_finite() end function rational_is_finite ! ********************************************************************** ! rational_is_infinity(): true if its argument is x/0, x/=0 elemental logical function rational_is_infinity( r) type( rational_t), intent( in) :: r ! rational_is_infinity() continue ! is_infinity() rational_is_infinity = ( r% n /= 0) .and. ( r% d == 0) return ! is_infinity() ! rational_is_infinity() end function rational_is_infinity ! ********************************************************************** ! rational_is_nan(): true if its argument is 0/0 elemental logical function rational_is_nan( r) type( rational_t), intent( in) :: r ! rational_is_nan() continue ! is_nan() rational_is_nan = ( r% n == 0) .and. ( r% d == 0) return ! is_nan() ! rational_is_nan() end function rational_is_nan ! ********************************************************************** ! rational_inverse(): extend inverse() to type rational elemental type( rational_t) function rational_inverse( r) type( rational_t), intent( in) :: r ! rational_inverse() continue ! .inverse., inverse() rational_inverse = rational_t( r% d, r% n) return ! .inverse., inverse() ! rational_inverse() end function rational_inverse ! ********************************************************************** ! rational_reduce(): extend reduce() to type rational elemental type( rational_t) function rational_reduce( r) type( rational_t), intent( in) :: r ! rational_reduce() local integer( kind= int_k) :: div ! rational_reduce() continue ! .reduce., reduce() div = r% n .gcd. r% d ! greatest common divisor rational_reduce = rational_t( r% n / div, r% d / div) return ! .reduce., reduce() ! rational_reduce() end function rational_reduce ! ********************************************************************** ! rational_bit_size(): extend bit_size() to type rational elemental integer function rational_bit_size( r) type( rational_t), intent( in) :: r ! rational_bit_size() continue ! bit_size() rational_bit_size = bit_size( r% n) + bit_size( r% d) ! assume no padding return ! bit_size() ! rational_bit_size() end function rational_bit_size ! ********************************************************************** ! rational_swap(): extend swap() to type rational elemental subroutine rational_swap( a, b) type( rational_t), intent( inout) :: a, b ! rational_swap() local type( rational_t) :: t1, t2 ! rational_swap() continue ! swap() t1 = a t2 = b b = t1 a = t2 return ! swap() ! rational_swap() end subroutine rational_swap ! ********************************************************************** ! type_rational ! $Id: typerat.fpp 1.3 2003/10/03 02:53:54Z Dan Release $ ! ********************************************************************** end module type_rational ! eof Day-III/N1824.pdf100777 0 0 572076 11363512140 6606 0%PDF-1.4 %쏢 5 0 obj <> stream x\[s~wx,s<B(*Pȃ-a %6~}kmlKݝ:"ߗ/}?8HʯgK7(<%чOc1.1;\ХJ|;&*KxS'չ/sKzS.E \'4㥶neQ~V|9}>jWO&뵧EL%ZHoΎue!J0唋 $= z,EBQiHcuXcLP0D J/ZGx;fMW*DG+P]- q}R"mkvHZBQBC:b1M+;M$?Ţm Q&% 6 gݲ,.NDEZA]%~ L$!JE8K01zbIjׂk&W=JOe =%yI #B\ +RK` U+6N lwJ!Xes䴫`~$ӥU'\^^AӉrȨf~OK ah06g"m_1gfW Qa2.6†of$T1սmP&Bbn0q|2ggd:#쯰‘uNrwbKvY?#Qgo-4ߵ8NI=ٸ83>+þ76UW’Y`YtGYW瀿J:"lT BMo~)αߜw1qv`#/]i6Ug  {R/05Ҷa 2.Q+DSl| g26hb-.3yiO=%k>qfAƼʠ$| UIb!<7a͠(3"0,1՞Gy6D7Gf<%P1\Vi^3,Fvwu$RE͆Ҏmlvv5+p{:Rv/0K3|p$=E}M P6"L}Y ZEud?ӆËS- ^lN}#J>A(aJ(w?T@p`j+jڝwO%"x *m$/t_4"yZDMN C)=@%! k@Zyff FK8L'F-a!\SIwC71Oj$un!LP* D F`&>pX~9SZ.b^lEj77U]JZIJ8sx -~m_NCHAdTm4qڋ=T 끵BQj$=-P EZm\9Ͻϥz:h ze PY IG MRL]T?^յw(JňnW]}ׯӳ^Pn`N4sX;L8{I]׺{^U)BMR;N<8YAi9tYKQ,} U^PMfKrbPC;"4SIlgc"'!ΓﶭU⮪^,NJ:ɝI_TMRO~7YL0F봾"mZAc.3G͑SRn1b㕂TJުpZZ/dL+ڵ.Vt>}naQtB+ljj/2blkₕ3V}ƀv7Zr],mTPƺQe(۴ƂԏWKsT%.%PZ_s?q\ީwsq~HVF7c",3 S.!rN\IA1n'tx꿙ʡY]-csSO$yNf4`457ٺj\x0UbR-I?Irs48sX:it%X|*ibeFkɕ$dKZc >U32-rcjc`ZΝRČNZk;i뎸b&jN@Hϱ9-}$eD @#%i<}xsN@o秉{WRNcJ[>P1o.9M6,>oMɞg>Ԥb(j3sT .CP PkoP~[ $|EJS PΘ_ `3]o?xZ5endstream endobj 6 0 obj 4214 endobj 19 0 obj <> stream xYIs7#؝ڗC EQRY`*9P90+_I .5j-/WRztz W7 V EL$Zmj*XҫN-,֊ #_+ӯ&үZ{]]]ݠ.:i-Bnr0Dl~.B>t DP="ȟG+M~=+'UE!~u&;hV c&EFlRQJ(Nz-$4e{9gu,=D%xKauHɗs5n~:|{lƣdHJ$F_EYW%Gp )0c06ugmx;dҎxBLYC0/Ib:F'%Aٺ03~AjYcJk+O$|)+i繱=PIقcX{UP~)&Sܖ4 N0hLTO ,zmSB!mDRnod"]4Q9&8͠[4FvJ!c:%Wۂ=pM9P9c0Rg`ǬjمNĄڡףћ2.i6|}Jdg Ջ6 $)9!9u*d-F<%Z\L~#c5DܪqLpf,`Ԩ67 "a&"4z5$J q2Ts/1XN̳ RCؿi97gܘ҄,?[ Y!8VҼ#nh2n|v~|~hZ\!X.&;RqKMvO C9; 2D")Mhbt93 > stream xWK7 WQs$z"CZov4f ~fmK 0-QH}D6g=w/Rs}sS|w;+4;q(2/DA"(E]UcajzCy}o!IQR3E.'ua:h5Ok|vNUtb9{Rb+nڮhPVM*[nۢ=tAc4Pp{91G}efJA$#$3\>ĕIn+T\mU[Qi&"U1ǡz<޵V[a2gqR1峔tgdn26P68^]5Sdj`}:j-r!SAp=ģM(Ӄ6:=сĥy}%tڇ2ͯV/4LCR3͏~>]%F>gnn6[xZi,-'j|ߙ_U~(՛~}ϟme1endstream endobj 31 0 obj 1016 endobj 35 0 obj <> stream x]YGr~ysS+].}C2oQHzGD^Y=C ]G^Z/|p݃o(z*˫>6bkTW^VWA_ cG/|sGGO-t x-5rv6͢/s~}gxH%l? G1lZY} !pP0jjE'z4W#ܪu۲GMmDsb׸Fx ^UZҕ2u N^?⬶z]k\-&Zs=^kBxx>>&]@ Ex]/kDDq6,գ}7.]y#mq'&p# 76ѯ~vh#xxӆd@OpܗHqmgpUeuK?_K|)H6~wM~ea;sRJz7 ``(*Z#{Qd$~n#M" - &D"-AGw]Ա ZW:}D;w0Pn+h1?``Ґp Ϛ62< JF^ڧPRZ:kTH2n\qr &Ogke;Kn%T .X^^`8 zGC*6S\sC#(U4BLд$W2Dl+l&kwr$ f[FgibM/+Lpۯ[eIB\WEz ho 'krc T0Pw@Ba'{d\݄('ĪUЂL7M{ݛ6^钾d8!ȾL,Z&ia I7!{ l+&8B{Hh# :h. ؈$4$/kMM#Nu!G o/f]xlkgccʝCˢmu0VlmDSvFQoC!hWuPIK'kwB5$%Gtԑ\%`4[8l~Q % ˁqqM/>U2rX<5Y8O`Gy#,,K5abIL^ðܠٲWLkXL/3lmO+Ä6,'|9]c ( @8(H,[m"BxFտ=b_/%d[:(&_5x$C@e-˳z]ߚuxik@B#*,]` &E >&CIiU4  ,jCeHH}kJMGǥJQ%vaI*{ݬr<)G~.xܡeP!wv5i-;dА$#&G?7S#6!Qє}0ZHPI#< _Rnls>KZ7S 6F^/qcwKBUr>c̓HVr@D+˓יEZp\QY!d"PO FAI5TCȜɭy (r;5{!`etL)꺓VSr5ŗsE9nD. .FL$X97]TJ2xV&9;A&Sd VeәR~tX\y4 hw68%;f0M)YGGb_(OGm6!-,zDOoe"N'oX$ǴTk̥ȹa+4A< 4<:ArWsX=gs$c[%qmXk @O:='ޠ%E"3K]-%9gޠE%B^ŋZ5/[KEJ^,TsWSR;Z؃u!SZJ3HA7K*KN)@X -ē@WBDb^xD)cU * >LX;2嬪Yv69RJvl+t%X_Boigg &5:1dkwhR.)zṭE_VKIEߔffZ1>E9ʋMDD{×lgHq #@7LcS_k ѣL9gkDos)җ{yDȎQiLLR(qwQu!f!7'bUJ6,J/^y"=4Ms 6ixS9K1&JTj07)%脩nZ +ZhW<ӊ7P9eMYdqdZJ\j|JCJdž;y D^}>|gHThj|Wҋ0fOAN5$.' B}w^\&I12N' Z THWΐ*Ԭ7W uP%|Ѳd~I){jR }ξUA k5νM@:[Ǡ%Kc(PR<_sOˎβc7 Eb%3!Z Wn83C}g_SܛuXv#9:Ynfʹһp Gh.Q>4&YFI9 pXJ98[r]@ѐzgV1$dq-&PJ"ٔ~W"NӁȇ> E!'}_挚9mX}Fx nUj;_GKrw?ۧbrxPGW[u`F ԙ&}@QN>2~T^3xJ炩S:15Q֍#w*rE1s6JX,Q0,G'LۧYTԺڄ919|޷saa>>,L5>f )֜=Y.zS К I7W ]vߞHVlϝaI sC q w*-۸k*Ekc©?Mk"Iah$9$ ;65,g) R Q@ݐD )ոu+؜NϠ&˔~Ÿ=}TZ^:Requ{~C_yi/_~SMo$ظ N|y#ORT[pqecyz2~nod9OeE3RP U R$ݤ(VVJ)OK7& OX ._v򝞓 (V bEyHQ(fe=(8$ F=ɪyrm\kDZ:o/E35S %6jz{bHsbp;˩| [tFJٖ>57SPNNj +uU٢.3j755yغ#v,~rwkpbᒒL'L}czL>G,SPƊzٵPLISDB>,39ϘI!-LA0dYuT' CEKklsU rE? ׈eu*HP|Vs:0v'}|9)sk2`I[d<3F,)wzO6.v!!Qu[,{yzz]S.G::pgNX֙ql|rC9hwAĚ|2]jPQ{W܄]a1Y'&N(wLtBw͞.N=Jvpg>f^3} ekQa?59+"1]CI:1u3ڥ$¤ѻ8fj8H-]sǘ`Ǜz65 ڥZC޸1Y ZD&W&1dap:W@;xQy3L]^9~4C78N^&C)`mZ+6po,A$]pQ=O9P*ko# k{5Yigi(uWKTUOХx*>zqțԩ|:&徎]R->TJDNVt]96 :9µ]C\Λ&>0‡e&UoPV;yiWW`<%v[df v9R,M|.Z%a$J]q]G6.ju ZSݢ%b8"l,{??`%1|uVn\.R$P.P~ 2Z) \?>~Q vT>1H%\2;~زFG ?sendstream endobj 36 0 obj 5853 endobj 40 0 obj <> stream x]Ys$q3^< zj$ʖDp~X.MrK<3̪XClOOy|eV庨/w._p^텢.^~wsxI+xl.u~. ӗϿZ:uxk|,Zkώ1~>|/i2Mpf..9eۢݨɘ~ߨh`ޑOZe?ٺU~ .1*}~j7w',yWI$ZPdF@-a:O@Wl-dc$ULӀVb}>sa{([}5Z* `q5Xߑt0_2х6m=v.;M-U)pItju,Z=+_JGkm(RNpVq*^T}X&\˚60Ջ~F"R"})D WKvT5+) @#6i`e7P4s:_N4v"v eLn@ OB@huVm%֤;9ՌD,4=laS֖7r8FgPޒ?b 3mK%n C#J8kvoCQ8gT3iIZ]+*sXt`xP#n"h5S+lkޤ.2Eʳ3ڠ+;@j(#;/T c=u_dEZ(lk hr> J p}؀\$z@4I ϒdW,IP'M3lwM WEs.8tMoK~LOOVnz..\mÂNL t7)\_Cg9tq.1!.{_!"H:H`M'qߤ8Z59qaFE8)6ƌ%c3U$y玿"+:?F-F͊KoüiqB$yژ&] -.^.ƝؔlU#V;Fn2OU]AqU)4 Wb~ZO6X;4lۙ!~O0Ū5 8](03ƶ_ewh ڂv-u<~5w܊0>gqVIJ '&sP%/q=뾦gKBHDaFV4K]O)1<wMF>ǞKeF~ijK~1}&"ǎU;48Z 3ОB$3=^e˒i `,meݰ\!C]rؐzJ`c}Z/aFj-(>ªN3G/w|8]mĠMc^@*ᘊjsq 3"ur'Է&25%zCHXƻ҅$0؎@pHm|^d5m%A %EKD$ƄG&VBjiY@ 2x2;r<(-tӠދ+$>jTr%k`B{NzR3n6^e1}IRi` #y^Zj4 CtgPHwZR_U x AIGLh`nأmi!1y+"ω9xL f2 q'$'WS(QMz5I̞n 3d\: 5&sCZ[&2 MfO^%Iܾz6bd8S?2x MH.}]RishȄHZTɧJt{syciH 6#iflBȈˢTF"F LktK ay {7C+" g9"B9 {jgsV0f'X,IB(F.]  FPڲQmIOZƔJu ԗ,iYvc!f}F+lI~u Ѫ!iۥQE8jE6d=c2⬻14!c 3y9:)x\|j(ITZ\b5x:Tŏ\ܥ !YW'Lٛa}uYvyclWe2W3K_H{Y?!Wr@V:fT-2= 22F{)W[lB+[Y{5ӣȬ&L6g|1<;)vSd*㻙OXtDZY3b5&ɷ i Y2O^̰U[Ƶw3st"f˝Kր p#v`)Xgq؄}O*)N ˏ2^ilB|<ԵvmOّ+%>FmnDN $s($ k:|>,8jӥJU"a!`Z̾:oDD "?1usMN| F,Np/nS[BϕHZ 8D ڣ~a5-q2TN`ɬI%-JJQR7kmIivnp¸"3c)Wȑ9.Sְ /+6:|qO@mxcj9^5Lib3CxH ew2ّYbIp4oN L*5$y2(dfdp2l| u@/}+1W{</a?ªHKln !7ؼ0xlg,O]_#\XgHNKr8>qPBr3.Ryk|E*egHy,A&NBg{S5gu;C}+U _# PW~tk0Z"FgZ2aܚlt)}Ԡ)+X8Ԥ!ˉ"5U|AJG路b g.i" %}gLr+ K}ETx~Dg;{=U Xs_m{ &_ lܴдd1},44sE!ʳ]zҧt _!Lh7jHKYSvΨ7<8\5fށ5"iS[PADՉS<22@WrȂ ȒJQHA@rVaPzɕɛЦE[ghb@*-r .tCe2f>׀&r\V"|B@ N_<]5I\z3/tGm 1:j.=Ck"#*I9- }IVHg4: ;ގ&˷Z>Nг0%+[JDEt<,(J!ĖgQǨ:?5ǃ&&b=FjT* b.N{FEY= ]o&U{i8B3kAFwT'-ew?czUP|}]zZ69` JQ^a,ch:mvӉ#Έ\.88jjX*$/xB*]x)8vd xT e/(q0A]ra;!o0nKUrOE~iZ442H.HkX0?55vOgFߜ?RUnt gK͉0Bϛ8g]j7N/"R]O U*rE6K(^1ܝT/Rg^YJ[{V>nSJI9QwUvG.=Nˀa\B(0bDa&R:QL*Ódw)u45۾]Ih =ze $:Bsy!ߒIW&YZo9tC{o%ݤ]t3`8 dvlj9(kTu름8dFUWS&z0GvJ۩ii;h ~6u-)\b`͙xIG\VTAjluC8#T:zK^zQNApK/Z´FOF9c<ՀjrndncKjOՄhBsBbe3JAP"Fk6ioy/>x{"?t1fPR9O.}ų_g>7rr%3dTNB&>qRD[q?Dmɷ ݪOuhagg}۞-٫l\vnWcu>?)endstream endobj 41 0 obj 6204 endobj 57 0 obj <> stream x\IEͭJLngό$A֡&%J~"[.6ղb&K /nnϯv>ͻ_;`z~)4` s/biK^}ӿAc)xkd hpbvG3i&)kqr'h$o\@v:/sκN4F<(  3OluԙOĆǸD f=sE)x r8θP!-4VB_Oe'c$>?^28_m_V]ǟvT0r~Zy-NAo@AxoO C%F^:cHp/q{8')L){.ԑ4h]GM~"n\G(]$xhy>x('kHPn5s%'#,‰:.MvOZ gd9&ɓf엸9HIN@J3&g_|"lз$4[P$/泒ʥgLg ֖׸EV:P8eq5W(&0AXx}#YF~H+@(8ҩFqmZC.AbVguQX¾ek$;wǷ@ &gq*,U e\%-lV᫯/ -+K/IʬW&]g bg>V! S>AL;RtE7vlUCǁAF}4DϿ'ʃ 7MWUՐHT"aQX?@C9sM:h&R-i@E9婲24K>j8" ĢzlnpЉeRAj[רG#WDq~6tV0Ad #?FVIDgP~vf4#4J3yæ<̈shyg9 2NĀmv{iثT]R@wCFچ-aʄ猪/PnOX7iF]fT%L+:Z@gW* b=YeXAՎ3KYZĤfڌy r#`Jt0΅ZD:2 !Cu|1"04`L%yL  7- nBD}mc!qǺ!6 dVTc|[jFlL$֝iY0\ UFZveQ" I8*E=+KU$v)>KZXM#|*gX;$*f8iU'B a6tqac=pe?fs}=D|,E 7! (PSgdBCՄWmyK`_?=쑧R @v@1y }~|?w_Oד?p7v9:E`I z'9E@#FUʺx@`0"d@I%?$ hm߃C >jLӓEOs> /c#܌vP#0/C Nu"gJWxѳ]K`PQ'҂Ro mW^1ClkC.4#͖$Tyk*Q6fl>4#.BOR$-j,޴Oū]!R9$2I]UY0$/B?bZ>*v[>;iP{ln&0U8SP.+ !ng]qEDb.ePb[Wf$S8SOM ڜU Iq^(H6gN%K5Y ͢5% F`?B%+aH*gW^\>=< |e}EyCюͪ?hI1|VAile10c7\̛Dl<̆2 r!Yt%2GU['izU-]PKB$<{鼩sfi5zC [|1S52bP>EDfeUHD*MR H"7([(m0 V%)~3H20Nq8 zf6e <" +uZnGl*%)Va kĤ )vm qT ~u8L>x+j`a rϢnԾɰibY`c70K"Xu-9r؆ zG(hA j[cӊʸ \eYiwV1lU +: cC@i7M*"Ƴ"ɘuPL@6]Ԗ&Ř߶:ۀ+4cZxo Q]h`-5̭hx(bQ~5}eg#[.AfG1U?<ˋ|juHƷ7PǦ~ 2ACEs8aK4uͽ77#X}y8h_?`p~K?L#ޕ }Cn Fls58Ѱ2e̪c\^ؔo5[NLQW ܘ6.hF\Sޠ>A'5hD( Zb?9ڭVAfxPJX{%zRF-wfm[il[g<ȁR;3v2oS=%Z,X~H#FXq/US!ůM[qj!Dt}x~& rg]H97gzPҙ |әH0fB't9bc PƷ|֛ff%ރ30X<!XBR" aș/%py39%})<$_D#/ DV8-k]&y1n:o=\3Њk 51R&9V'9 R2%x>7YXլt=.xeP6d<j~dVup5f[G[wsp[%r9kǹ{` :S5Zf!zgtRxiW1lb+]9~suQGnTV|y17XNte vwo!b<:WMa.ÂkI^z mEȯtu@X3,N96fG+ۊ0`lBv%Mbv1r(jmK MՔßZ:̿iLPԀԩʡ`+%晎ZLѳXMSЛ;SW@ToAEqiױ.al% ހ V Jx=\:WF5:&Sp~Y0]˕V1}|y=rJdXbʟ <1/1Q,b}Cح$d&6X~93+endstream endobj 58 0 obj 5381 endobj 62 0 obj <> stream x\Y\Gyۡ>}\|?Ҍ$ דeթpxt,dWYv'_/^^ᄒ;KQ._Ϋ7И](v1zQJ9xo^jkxI=/_K m`;'o|wnh«6,Br1HM!AV0.Pf :֥x2/˧dփ(5.^]Aa1L00\S^ՅgJ e GR 7 2 h9{QES[e"x A,K_ZQz9`چ=GUEiyzx`Sx/YZdi/Ih_?# &x` _Fkh1[l^59 4B)(5t !]7oK8X.XH3]/XٌnUqC`bI%i/f 7@rc 2c7J:?]&=n$A&}T|վ9*=~r8zJcw4iDpUKմ+t: .AO]=G9AӒLpE6 ʊ_7j@e{މ10ior{~Uo:y [8]eCexUe 1 T UdP[A|P@Y(C)q${a ́FT,}wxi[]|T SVdaB`I"’D^QEt=O)?UʠnO"~S@H&J&mln5,ě4%kraX:R`@M-^NT]i"U t 2252 Dŝ{C;PI)׏[6vy X&`΁Y`5hƺ.v) v釩1u- lcȈQH_/:t7dr5|v Z0Ms[ 2pJk(bEnOda>WcKUv`2E9а([LMNt ^h9hsƈ'EҴ98x$6 :¤j8]f1Vِ=H1t~Ұ,Ey2fQRps%c hj]Հ3@pd;mxd_'L6ڧ,7} ܀oN AY'GId-AFZw[՟ $J*PJS{g'/8a+[c:yຮm`$6hK-}֨d6IYLEO-yڽomVV)}Q’BU6]gNK)he͕C܀=gꀹVls%,["nf{cq)f)7#˒a#{_srj1Vi/ɻK &g 9 δa8AE$°뗳:(S˓""+ϛJ~tMs%w CV(PFoum2lÐlׄNPRܯɣIr9iFs+@G'N{aPR0%F:?m3b"ģd2TH.,]Z*ثy{0NI ѷiQ.IϞfۃ &#dM3ST3˃@ޞ $d3&C0`_1h @>U@sN8DS:4j":b:JQP*$"&k_y5o ͝U!jF8;m犎M47͊>(Y}Ʃm(% һMf.aO/'2o{.&cG$܏VQ '߅qN;+*mˊE w$[|JJI"#Q]]zǟsv;)ͿݿXKzSn>ꀛLބU;r eal!y0R(Gu6|wB:)/G=Z28uDq) DhL RinzU) .?|E|N윊:t*gSJ;p)/>t3j%WPv˨kA9 Kc)'>ǎHKNIt/L4iӜsS(NVkDQ^%PNTc?JP LS!C滥VҖ릵iLhVYd;mz'N#P_}P30NZ9H}Y)eʮpU˞hT"]!oYqhf1'PhNn25}*=24e 0eiVusCWUD(Eqw +; f4π)~VqS,Al Fr(dM-7jEHIh m-i :z%5Zv77lɛt{aI*^6yi}&Y 5+,DѧJX[a3T3j:in/DO𚤤zRNKUV==Yr͛93}*sSfq8=C$ew7YlqpY5Amq,|#hou;D̬&$2!Y"m_7\]~ݝXZ~^b .BVA m*di5koX =ᣮhoSף ""ʅD)`i4+ Օ%gt]JcKI\X~u!Ts}Y{]|Yo~贩};\@1YT_F]Ҍ7_z+j+>Y!fbm<8fOT3:1@X<_NS'*}<1' ,Rs?K^/\H5IwٗI!sfPKxVQQ9+IbC2PHOl(77 D*m~ǓME^ݬ 09w}5LO^}xv5w?ӚiM nC@?ЫIG6߬uIDX6,Di<c&ԯ4:o6ĭ=Ѷ tTiش{TZHSy,33#Q[S4Ej [ۜ#.e>/p:~(5ɳi5JOՀPKXs}cA78+$6ȝCI@=n;a3:q7Zb]q.e8m//|zPrf):r a{I~:U(Ř(;c2KQ `-j+xM/@J+m ~Xe6Gd"WGy ;DZUw(H^' gY inL+jx˞:Tzч~?#AZoL>NcH7 ڣ݈2+8f-ew-C=X+}gJ,ĭ!{rM 8V8Ͽ6n v'Dj~:6=HZ[VQ]/@w:`|doD&ڒcTézQs4=M@u&NtT2nL/lQJPAp6͟! XUφ^2~IV[ԦG[ZNJѓOHau%C-VA`cC- HdobY1yKG7ר] xzJ`7]8RՌ(3ބ]־T0U: U*f{U{Mkj t0u>]mY0*e4*{r`\iyv{^(C{[9k|I._#r:㏷ig>v}ӓ c]v7w"3iA;`oogrv > stream x\Yq} eZ–E >@ 4w R zg֙U=8(AuuYy|yTى #ͅLv7/C (=~y_;vXjJ*أ/ϣAC/>*[mWч]ny?}PҤGAp2>UD쵇Z XjQe`bz-XyW_?Z'nP-lphtPD%Z_^n`ZHϗu'"id{ÿmX[^~Ӳ;Oaue(v"s<#^0Y)K:ͮۘlsP׵罊pVC0;d|ϻk/*Be}eu ؎!{ë*y秠vV6Q,U2KBa2b>hq,JBȅ!Ӱ ƹ9! }`)52m 讍=j%InOc3] h"J~EY@'  sB=᪐r5 #hp4 (BHc~2<c 緽 hN#7Ko|?*cL'gt=9K>W!mN/^~j˨DDڗf<Ac΀ [+ӑXAf֣x;]팜Wz[݀J6 A{‘ FZ-můwVVzɠ#.jLtp{\ 'DڪQl7tآh4X}vXk}GκUUAGΧ0Xe֫ߏh`i*$Ty6E6{Y6l̨fz~9)&)%\ء O>}'L=}-:N ,GlMP`QLLapܖR A}jWyʬ^x;j<іT{盽@by""({*je&| $SW&e r&裎6*(1N7xzws$k"+mOIq71OB8)nT2F vZWOYrdr i@^Fh86@ M\feuieX #NRoC6 @N96ƼbuzD8R%<Xd#>}K m(b2W@!QybVAˬ0]OTNW]WE?LM5^S{ x6C/U0D3!&pf!MȪ?ݱh޹O&` ޯ*et/ tMnVBzToť:㎕tw,d27G[wU<8/d"[$ ջQ@t۶84m- YhNLyA?3NѼQP$H7FϥhTP1¶ϚUOEA;S2㡍aJm{ܽuq^ y&!+b8Cd "Y~y%R6dcG$ k&23f42/#C \f!oxRd*c> :p^Kj)RStE93;R.f)3R[Ӥ?wS(o|KQoMA%a=dIheRo!I3r`ɵHRd6Ryc˴~_GdDH嘣_6U'rD{vJ0r$ rΑAN(4k}EH rýbT'=ZgY6ܖP3ވP+S3+kH5% H#'[6Ky̅j  r{@{n0\@5tNC9y~M"х}4G0h:I{^zUoYATYA~7v=n&!wMEidSAȈ9a荪`B,պXg- #Dp0ѸXJJLkhOuS1Oy{%3kJW#J MBKV=U M'/&-`7eh \J\t6jR$VI;en̙h)dѫifɠ,M48[;x48f94}ӕ S-])N.u :/LNaDOj@_yܣ(Il qDfy*UHh3I) W,ךYs4QHҍ6D)!V !dS]w;Jsoܥ^ XZcbUAQN57t x"NJY -P.gG8ݳ+9Ny5]דSB}'zZY8MIg&J2-EtIbC0zvu$O\잤 [8ʀoDC܃y3MG=E.@*,r sWXo%|5QqՍ^8K˹$UXnxb2q25|¬>QA"7OA]쑿>Y=j` t<=)AN? '#P0t׳3NWMVA@a2c#E' c֨T졈jA>ں阯1J :[)QRMzzP7~CX_pD&Q^?_eg2H.I{O0>SnR*_f2?ҔUȥy6,<)3%6?}<0TVe|^hC¹$(BAzcȅWzڨ.%3 /Qlgdq\ژAC8vV6:M 1 FvI1Dp/ P>abcBjk2$Vd\\r8.1A(ocym btҧ_L-!YۭLwTCu m 3#/N6p(+|*ٱR@j'do>Ct>B]KV'&PܴI̴ʎzHuֈn+_)UI>01Mi" Q~,SqG>z\Pb+S`oV|҃ Yyߕri(in;@[0oE~~=K?sTR(|I5~M: k^sCI_,z)sɽG__h¤O?0u\ G䗏.> stream x\Io&iCӮ}aNJ`'6 6lFX1^g ffa/|yŷv{z指Iph=|s,~7VlۯgovzVJ㿦l4%>B'+NB7؟sha2Nq Vz|?I Jo:{j̘sN0VMo`ߎn[)/`>٥Vwv!^N Ʌ^'إr*_y[y\:v, 0ڣigجL;ƣCru ﰍZ;{s TPfE^jvکYJ%k59+S8A"<Ƶ22܋0XQZF0i.d<䶶6~%v}k]QϿ\79p;`@1S )AIY0Ŝ Y ;jW5H8 $DYut Ubx/Z&Y#&#S8 bhY#""m4EZ Y<暐>*˻pvuFg7oΜ4:06`@:\ m!EOA몑_TBDž$'Aֱ`yh^[DC?#pZt䓁r~б5fXƜp[/}V= #$ p>/*Wƙ]S'co_a Zc[Ω UjCW&qϧb ɂ<&vw|;#P 3Gְ JVO q,lCI/jx9j|iퟍZdS=Ї#DX#v<dPFP?z>b6Av8S~,erxC`!`Cu p $h#p$XF2,CN6&}?JTBwg'RQ 1{'V(~)8_#C4r2(dJ.|H Y $RmFbNDTK7SLvH`T1WB1czȍ?-ddpN>jꚝ*>.L}R9/ɬe~\q#&VMY U]*)m#H:HGLDIRMy4Pq fPj̙☁h!%cvh(= ւJh&h1$Ԕ gjkVmv-F*ĚSVLw4lIN,`Uhtdl^Y(,<Hϲ8#-XTs sUr\+*_:mXJol ǡ`kirכ-:RU㷗{+('^>sç[\9{ =l$:5x!s @J.N7$ܘ2Xc"*3h\tkǔFm۱%+#Vn<[xZ)r]h&uZ@1U}bTO #+4^YTFۭ]"|riBN ݴ[V :$T3WmGgBs"v:.V>+vBY2U-o޴ ʦ`lq)EZ蟈Yendstream endobj 75 0 obj 4015 endobj 79 0 obj <> stream x\[s7r~W*̖yvm6OIjVʩ2>Ф,9Hٲd}n3<$͊]Ι`XNbo>Oo_}J7. . i[6uqͫxK_\}xդf;-:ؓ{n/)ljӟK{2lvr=i~ŋu~4z=3\ɇx1t}'4(=«NWy^=ܯ~WvQKm8-5 -&/hKp{Qq/j۲@5Nkd6S i52z+sms7}/9 |\Ӻ0/s[|iwJnd0%v  +p{F>}Fqo~LR~L77'Qu!pڝ,MX/0〳W˫l/pOBk .!€[7T+Q8E%#[BhW&_GL[.n^6=M-_X}dvSL=o2([~Vi 40e7>7˿2Lࢼe!`%4iNpUNTmx94:Ӳ 3&5[|ůF+D]UZMEjyv2@O0Wغ v~ܗm_z8X J3x;4$U@N6\:;}p o|cgF[pIn3LfQfEH b1"-l $0{j`ұGlt?,`~:Y]XxBlFz("S9qcGYM&+߳O000?Es.8ߢ v@t-(eJ&69@P'9 C/,?#VHhְ<6$!P`~oY" HΪÀ7 ;2]zc60c^b,H`^Ȍ#)@ا{D-(~:<6몱V]C*`:Ofg  At+oy<(*xї%8:cLJ $?a|!Q7Qu_g-nppdGYc9X%| Bg\~ 4 2=@}-þobʦBqƆa"#8$548yɎ):jpә1ďW:At K"|FtEUiDQ$@ǝfN8d!H?~&V+hJOH0Ɗ#BXF̜gNؘM.]4/yZD>& :װ#H[kYa@Ɲ1-.$bܞ\9t(y3"k3 Fz;o13cǞr|$x$|qhzNUTwnX$\W ěC7jBwI7KX#?ЏdPqq݊-tW7ޠ7 ăY`bLL-&/&a3kט%-/YE:Hz,y7-wTDhD#ÿcyPEm)LkˤU#+bJ<=.R)DgrfxfKcè `Η.Yj(K;VD,?l}8 ֣t&=iA<5{d%]y?4K1,y|v㸶 Lm6Tc#n_6wq/ŵ^̵/{>KI}T-lb&w}.Q7ՁܫCqƕ7Ԇ:\0t.uL6/[?EUF_f YġZM%S*"Gb2޸+ ),dfw$y M@4S*E%}D-+CQdkrngdy Wf(>1 (JYK[s(W|i%{>VsMt`kWT8:f8m<hDC,Vk+TeVNŗY=bE,{.Dd~cMr8 Y0yQ.%ZuvӨ(9k~U|Ğ`?"/ *am@vr6X1 bk8Z]7slM:SMg84EENYYےQao%g 9kэ#,{i5jzUM|&])Jp-hi&Ws,<,b[yx*tj"X EM UL MY,!-4gXiiLUIEQjSVCrWt"`-ʔ,om`[2i/0x)&YAwuma{sZXsA7|Coh/UH4+IIc:Smgx>6j/a]7J>njva C?0rbϹh)sP_n0ɕˑ|Se/en.5@1mH^q|Q䡊h&hJ}Y^:ȿ G~  q@{u8zAh:\:|f'3cc8IX9`S&)M!&;G7LY%˹-Y BV|;pmU{u7;z|y;ږ?IV;v1ʷTҬ1Yp&6zc=Kox( *D-TSf=9WpؘɥƝ uHmrYܯ0.kCS> E(zǞT?{f0pyϽuJī5V;,1[mjm5#;<׽kf<$;}ZwRGz?+$w]ibBWس??ۻ8}TIB^dZƗf}ަp׫v 6f 04fG'nQDl>[=wm*&iTjx@%:d4VrG+Iąy%6tx!m贺`[tLW$Gn>`.ޒ=Թev6-|L PJ\{ǹU ҠUI!7>zlM-p~gW!<:p3% Vv_U9`m,l[EM'屽B J9hyϢ#+z\ew F47;%DRdP9B;k57}CbF!ne 4~K:*&dᑁdW#Oc|\?m4_z3s/jfygGCCNQs&-AVkkvzO _oF^ٙ4J"!&QS Y^kғs9&id3k G~󜍳=ƓeJ*ҧQnЕD-{BHsJŒ3%k.H<1Y<&̬cx2ɜsjbdá9 މ_8ǎd/%SM ҿK,5̈Je 'w75w]ݜlQ~/P%et)"U;TkizGl͢ǥS^pMG'k8RJO]k\z®Gms%5w)3 䖕(FiYd Xk%TL~?1@Oo *gUzht7vS87cIc?H7,yѦbQ X~w?vendstream endobj 80 0 obj 5159 endobj 84 0 obj <> stream x\Kqs;IvȲ[AaHHy(RZze3:`HAg>2QQoo||n~߼ n?42YV꛻?(Ohn;x*>9xkcLo6)~FĤZ~o?׏~A_LmۣwtԧEtϣ^55wʃN~NtΙ%$XkX->K ti#,(F{x8:mb<Gc00ӄ-4pAsx?tVO~ձmks8D{XgaJp 0>|F-&hƥpxU451^N?bAZ/ӥ^Qysp%ƺ78[yq9u1ֽwc?҂"GouM( =6[8 k5mqEuMHy/ތ3:ޗw Ngpwa&K5 ܧ1"8Aaj z4 y .dwQqb?mnņ5pLוS^A r`7, 4nmMՇAzc)ZێŭDA_:BD7#UDݳpίyhDz^G8VI3m7j45f̮L-hɂ-"eRTz!- (SnhCg: vWhյ[rM)?n-ղ1ϋ(IO(`90ə>o|z(PrARo7 ۮ֕:܂/[C[+4;׶LpNAǩ,Yg@`b..kA#jF&/U|8oڃ\hxЋ|ցKl 8P>'+}ߏDx5ɽF  d@]F/>I͈į ܼwFĮ`㞨xD,-^TuaCKͤ[!@Sa'Y39ILzad",@^8&C@T:6~c9t<@4;DOͿ/Ҿ#0iWq<ѧQjΊVslXTYWBNkxcU({oi]I E61D)aOYu#2 Ga{z \f- -e>~.1B+@[# 6$F쁳e`ܴV%K(ܢNnz.j }op0A <cG#@Lxf2QJP*>싫?F'&i'"֚bÆ8px+E< Qu[@}ԝ887,(Tw1tT6 &#/&dz2˃kw;00z 3>3y2+!0Ⱥي ?=F|\BΆ8͞TU0GNJ~gQQI+x/I.x9>\B96w:Kᑇ{l 3eLJtV\GeWGEգ7F]2팑`+L6*ר@9 Yq09ʚ驍ʱ 1; RØgE`YNPDq^0](CU@m?H!tÃusm$2'#lS6(G i!WU^p'yqŕ],BQg(`W̓ԔM8;B3IR &h|h-X(R&!R8':޹, #CL9bUrV."o XpLFj!7C7H{Ξ[Hv*Sط螫=iXǏ`&E+@I{gC1 NV6D\ j%0\θp ݑWgZ*OwIuG&؎n':s|:0Nh=D³}RrM8T6nRcNJ)j*HZFKgblQx sgrOr瞩%b(5F\~CJl&&-9< G*<x03ypk":Hvdur 8]`Z 'ՂDPq/+,H'nvm ֶc\jaHsBl;!qk5/6{wkYOԺìGK9 33rn5|F1)J~7nٍ3=$U"AgBFМ.Nw&"_OAYc_g}K '>,]'p^X0PD !܋m/5,i-'MiF % 3]n!d$ԭ0_J}(oKȅɹ٭P9 9q-`xK 9#Rr}9,Rɀ\*.XLpϴGt<OiH `J 0+hi#OaVVÔ ma]@Wa'6<2G>!:OBrpUs9;lRN n\}*ݠrMOS yQ\۶ЊQhmPW1ڣ&SC( ?LΙ-;7ǔ,*b;JuFdvq͙U<:ewHZs]"I]֒|ZYB76 oQT HsDKQ>Xgn`aKbn kY˚Ve [_ >X`9ڦlCT{%v8Vq)–"Eꊔ>JSWX~⍫ VDJgL j`R:)* |sʁv+Q}$Eg)k`J *g7 f Qse*cϺJwz!}C/R  d>AEZ*SJO9/A0/2gbkv,@-ANTp[6%hXdA:>QHĎ˃pmuxF_oF®5|rof,x,Z^8m1@֥Y:FE.oLFC^Ԣ4t>q5ׄ`; $){J x\`)z O1e8ARȁ9a,0k pQg]iY1xˋeؕ3̬|qad 9bvrՍZ*83ZaŹ>*PV/^} 9!QF{) Y>]_+ (ۺOmJ']DwSrZZјvԦqQIBգD(W$ aƽ \eқk2 Y$0t~oCM:4(pfspUث6Qב=M/s$qk:ckЫp Gg T(n.Y΋6i' p:G[YKĮ 2[h-n'ED#l<ô] Ji{(DQs9JAC?N;D4 +W&jYQ M+u-]tLC:# #pʰoBsʚ_؃>,; MbJVhsfݵbj۳ӫ90]M _΅`.m!IkHq[ePeQ΁hֱ&3_ԻF2!goCHgdHiLa[r%X~m/JeA;Ne>Wpd#<=ynZ~J5VbdSU.ֽ֨5qԨN8?SVً/k$( EQKR!ZzЗ`U*rHUmk=#ѮZ=]FJ%{-+ofD**pإ1k&`<%E{kMF)vwaqvyqP^Zۆclj7b+Qh@-5;M{RlMm*_*GmL&vɦLɐN#N;~d[” ,O/]:XT7*n޵ꓻ}LЮxwT5޽o7WReendstream endobj 85 0 obj 5320 endobj 89 0 obj <> stream x\Ys3?bB{7q'YٕIbY$u_9{MIYZ}|uެAFѸ ;?zs$cxÅa':(6+'WNC_ru|yl-6f-7㯡f {يObt6[3h'f)'Q|_O/!)_c:sօ`GNxzWƱ'(\ŒbmQq4o62tS]VBJ[S9B3(T= ]H7f#~(~َR+~Vh}km/`@^wqM?Q1(Utʚa0i_^W^ |P#LGǏubTgp:4ʎ7)ns0-,`$|Ge(>qQm$gK[ R_fڢ?iA;Ԁ$ۧ#3 ^H/r\PM>DlФ$iMmxQ//׋_욏C4Y)fXwF*YM.^m@Q4!i y}ujbDai  4ʸ#JINgnoYOK/ѮctƯG][Ih~%^BulEӠY} C66܉TvZݔ_'9UOviia]>æ^}F; <ċϸNsl@ >Ĩ3y]u8_ƺxA?f*|1?m(zQ>ӯkYv^C\}[*qu-+l 7kE8,` tL.ؕ VDoh~H1F[_0#"š4+4=m/,ns\O´&?HSƾ,~`Z[^Wߒlr0|G%)'h){dMncEI$-ۘB^%ExFrhQA^D̊H8:]T0\BP4% DuU4 BEӽa{ơRVE_ DX~9]x >ݿo&ϽQgB,xaZ (d rQa) CۓH_*yrQ1=q( KEt+G踗y=iJ#y{4>0[X,ƒ., ""#7u$z.h #~ ΁!#uD( ?7 !\A f%_+rлeds M}m<(#y۴{ ŠŘ1!Ŀ$ӫU3z@ހDG*^7ƨ0Ĩ"9NcNBgq u]Jmd51@.l,sf}Z= 𭛼mFg#@ŀѡhHSk!|Sv{tD1V48$MA|Q%Ƽ"eC8o!4&,)\m#n!Rg]r "#ZeBHܹ͛0L1 $VoSuqt$vl b]ETCN:GhJWZ< V\Ӿ3</K 'nG%:Ś^qȭoT3MF]=H]>.U q tSW(v0_ ~Hfg+ޠ>'6/E𻳘yd5.ڭ@ORƊPe,Jj]j;mybH3 #8(\G1g?bz8 q(9(}ts#qݴ6J.wD!/,pg`q=P8])׋ei3 +&ԫUQP[FI''M EEIߐ2he1!P"ܠȞmsmA'" ~ :lΏf". Y<" at6vSzkRT>)]URw-d|HQg21|BGhy{5"P'HܰQ0yF+ɒ\' , 9(2Ou XSC$XaxrsVX©@2ܒ1Ȳ)ak@zL1u31;¾2;UX< li6ϰ\`H f )ES N)nbH]( pJd A=3?q6B4mj2Auj<86LQyf4'W%.Ю44j=< YYvwjIw4xJeKaK!\|%Ѫ4/RG*O,9BDYV-è-tDŽr!1&o%l1Kܧ !;tOL嶟YY2\T^rNx!%%8hȀ.ΚKCv6% 2)N}R1ڲ#& XZ֦bf}Vjי\^?4X QSW9)s"A7j8&f[ݳ]/gU 8TPq1E;E;"Y;t^meʎh0Zڔ4i|/lA*ʨ\,0DA޲e2`0ƞ cy$_?4ʷB#63Nk ]Z2l~ϜeiE*kT45 #8T?ן">%x(=rjS"d9kX-M!zu.(0cg}8[;;u1_^J`-&̄L"C"xDp,;5w ũz#|LIb*ب+j U&瘻Zߡqv0g_t%՚-*@2N.&# e@XLFk-b DR{> stream x\YǑYcbdKëADr5OүwDYQ=C<""^nIlf_ޜ=<}}6o<&|v;S؜'7NCgrs~sn/&f#ۛIk۫IJiF_%4rr94rr^lPs;><-}*-Snk@Sy/wb Ex"nO_j-{~wAn{M_zRzu40 hsTГV".b܆CPjw;kZmjxo:gj:w\ɘMqVHV40!=LKcs5eeJ*\FQk|F| TR8RZlQJF*dfZg5qrSl-Ҋmڈ˜ pا;ZIP6Lf2q'.a {|nAaI&9˴yY݀8:RKiCIL&h`B<ڰ2O" A!^(*(v~ !Z6$D;iZV!=y RQ"'d"I&mWk/]!.:nƿIAK7XH @D\QQuU>G'=ۜ 匙rn]{$2E>ʆ@WQdl ,%=SZ.$֏b&= 7YJ""W\,$q59Bڂũ0,ـ/jXރhHE7O#BS}`!Oh4ƪ:w lz- asvt&)Rv jzn c@ ;Y1 ~Ticb-ToU(;ZK"H2D%f[>aV4yŽw3x>YgghYGl~;bJ eMa NAa ZY#*W m6쫳`=^~)#Ggu#7ϟïǿ7_n@]NA0b:ohRcԌ'V*nY" GhLDľ>aAnߗ!J|TvM2(U*3_FS3*c}ϧr'$BxA_yR!84`*] Pa%ʺ9:%r)X!gSG߿6HN&e` zz0+]@W`LD9haAh0u]=e'"I1>߁K$g)j$G~#0#, uӋÞ0 %d֡ABF+@f4N*!"s~K%JPE(hߎs"ši jym~!!w3, OSX1eǝѠ%@5xa!NS."R`Uс'`:9eS0,sĪ ^%Q:.] 3.Lo *]ٴY"8X増1X3mvC\0P"V: ȸ(}$\\ c_< Wu=7*)͇ɨbsGC\wzuhI+k^%g y"2pE7N'ySy϶~|c(Jq X0vqU5(sql>jyR)KۈuFTp",@[.bp0Ais}tȚU?J>2M+Ta'EAJU7ԛL!3ZeNʜ.g]wu5k>r#z6%:5ai謎4&JymFb0؈"\7#HfEʘ]MgdZz:!ɩ- .JXwY]ya),Ԫ^DPZ$9l1&! Hd*eӤ|&̞RMyD_#ʽ`tMty1db ~&^`Т%6^BD b]? ֋=7JfZ=tJxC]+Q]g^quʻOv,a05A"G(Y,oK0$_ha'>f}`:&mFRRiMU%"!ϋcOiA$ AgQOp1 XTu♧dg3+Ԫ1P}YFB~7 6cQ&ZTaQ^q[%+RlIMg,MMED~3~[ElĢ]+jUcceCV`mp20Qvv}yQ֟rͲ?Yc jhZ9d 2Br*VJ`$9M\"KMUyzh}Yh 3 w{(q _>A &y+Ye,G0uK JT)};ư/vhI&bGVw( P^ă [Oc?Z Y >%a ᠋W `w`#\K }uX*v+5a"> EDTGYϥeюX =x:<(iwHIvP7sdҘߤu#% +i8)P5j͢s yR@.urDa`6,+UR5 $%w xjyI;N9=aZe]jZGdZ*Iw9P0w5Pf`GY**}I4UȊ.ގ#˭/E^Έ1ZIݳ_$#bgԚQ,d<'Ҧ4x{vڐʎSh۰f ReG)~bj;ǖj,uuht4pCDLD{8 x3E"J!J-Zp*sshCBu%th*~-}IPCMp#8+r\; V…CM!a D#'[)yN(@4U&فW"d"[I"[O|/Bڻ^^{;*[<{Z#=!'uɚNypVuKc5dgA,JVx"' +Wuzlٻ ζ}w@:tvծ=eN/>pK9پbH@/# x^-h ȎSUd"}r'gQ:}j##c،I YyFme_P?(6Mh63둝pԐa~O SRv[KS.hG^f{ ޼=D("ZcsZd+'N\߸Z5ub1Յ,{Bt6D%E.C3 &#ȖʼnNˆK\,OZ2WMa )O#?(# 7ژޒZexqXC̢㶶 lh_S\a-j&>0.}Q_'N ALtVE*1s𽂽ni'0JwQ#$/=apjZd 5愢b"TABR zw(Wpֳ't7N4&@U2[b4-s=30>bqz,vt41!KNs( AjkxK1ǣ=:kL?V:~]GQ Tn[YE}_>yK jR3:nA0"76 +DX>S]\,]8}bi G9Faf2ހڭ@A`3,>̠}46ı4kF@Wnj3ENeit^54>~諳@?endstream endobj 95 0 obj 5374 endobj 99 0 obj <> stream x\I#&|{7 #pxdfђh4kׯOUVM61쥺ݹߜ}o8{vvw&y^@7ILY|Y{u /nrc.~o`G\ߖya[o)7M a&YO7mk~3]fлeݕ~M~όYuo{Ҭ#_>m(/k(4׽pCqvCucWvt?F._zZns{Q؂qq $Ņߤ8+X;(0|L "f'fiݨݤR0c偭dVNɤu&jLSVO{/ `K!} \' WE.%;- uCHG(!*mRm4\M¶&A+dt0GfVQ`H-zI}sI& lQ~5NvH[&*YB]#tpg*l`*G~1$Ƣ⯫Q ]1c(]Sms'˦ &]-&.$7ve>nȴ- ŦU343qk%ě3v>v*ƳA_#QebKƧ%6 2)ihI@t1&<񣘦Uio*>;CuAM"Zj~d*iq|ljc8ß_6Xx65zY ˞gkGWz?H7J ZuPRm1Ya3qiIFӰ R*M-)~S̗|NF:I&o%/N $-ͫR 3}U@v, C|y.m@[f2F hYeKHzSo{"_jۓNN9 n` Nz|tZ7nBҗ%D6#Xb XՌuYTpDCO <;7w;ARc]daa%*Gct4lEk`y'mcq+q&N@Hsd'm]&/P0g+j?9< Lrç\ DHx%mqr4wSwUvU`{^YG4k`87k_,PǃScsԎD^UߎCy:c}UHֳE1 I6.-*rY` uO*nk: ~?wt&N؄QJ՗u0ďʗΗK|*cY]d o$\\9fKN4ejp*lLLTe) H$5M,: jĴ@8y{N86V=ջ?h°O{cIM̪~oA^o;;p Z fZuMt~s-Sٓ[qyƔY&g͜³ "$AAҵQ;cGJQW/HҴN:N9cSQzc#23&A!v[.<6mlZ BdY 3v4bӒ{W.tu QVn?ˢߩ230}.8Y>퐵]r;?MބABYDu0T`j&, O1XAB3jDt&\1dqJ@WBHsy-q`~\zԌL eg#_kIs]@wk zRzW ;g R@P ==|6am٪V)fg1 <}rRZ@5Gl2;Sfc.HkbݻtZgwDRq6zMNTX!>ʃ>8T. VQpb % ~VƹT{h9\"U&,"$cVOd1ߞgghd,u*Ҏ(:ՁWM2Nۆo=s[,5nAn~Lm 0y<p<$M+_fvPOi=M+Yd;NC#$7D$y_:5O)*AE>۵(%yRWHvL[Vt.TCȷ_e6?T,(VjaSGl>cs:;.}5H- Uc_a:u%IT8uT)w}L#|+vY.1?YPVW 0m`\5rq("m 풔FIv7es ڃ>HlRI܄_`)*EXkr|D=c(Y;\1 inSVM:`f'a% A{}:g%@w_@:=[阴:"jS^$*P+1njSvDhGpᵽK`}%99UH[RY BӼB y ~Fp gzXXcA K4 :yTucuiIo @$6ecqݲ9{r"+sdEjI.ΑE 毪mVT(Y_&_Bּy61Gvr,H,S99Im4Lk9HΙ`Kw2M@OP/ -qI [5F:L ҥF$;)öD~hi Sd{ʘ\\5׮4q!F;];iHD7icY@l%❊*Wsգ[\>SeOsXXDGCs!}.b|^HʎcSiRxcSq#íTgo74X@6Cw&exY M*"Uxr!,}9OΨ)XޑFAyKsY7 p8(,% {Bve<<xdWH y ՞˹CqJotÎT(W҉f&; *s]'$@iaR3<"ef.zI?1KN$zh=2dc!Gl̐ŰPRlА[~IOg>6LS F}}ʥ꼖QZʕoBDy\/-3jE`~,az MrQ0aɩLwpJU|ͻ :d%.5}B@ ZYfE(?&җvSgd}PM֐g}+s|W+sfE)DTăvp'1|[5N{GuUo?~˲b)@zvUCM{^~M(EKZ NDð7fYzA9Ado1!vvpugS.,LZ)nu' ,e?rUDniD/Ɋc;y'CBRƼtsժPޞfX@ C#ώ~>T_p H͇iVF8~<%DSEDc-~+;O#ny8oų kڞ*W-ҳ)tëo e^fUY({f0WtS> |Y-MDi/)4 9soTp%ٿendstream endobj 100 0 obj 4702 endobj 104 0 obj <> stream x\Ɏ@.UI6dق-K>:49r9H#"Ȭ.1d\cy"r~Xfq>]<}}o~鞠.?^^^a ɽpihL^\^>,FLv{3km_N  /I9;/}!tpgQ8] hI=ƿwmm/w\'?/މ95Dx5+Z/`Iu!9c$OoB_, 0"fRN VCHhbyTV.la#ZDA:=]Sgt/Ǐa~WpZ9Mq \F7 o4`v߈n#Ok;fO#4#BOBQA1vxfQex.8 e6=a1T^G:`4פ*˥ߘnWx vXrr1 W]:{j@8ISEƥJ+:`b'pdڵ"M~ip]D{3TYoyJ*h.eBȄn~~M? \"?{8xLot?~mץV>1Cy>1rqyo\Ͽnwh/ՖDD(ԧqQ=q9ڕ-ik`M>ZM[3&Nq~uŧ11u`~M;AF\&F2Z` Fɵ:V_l;/Ӟ5ՒU5هgܽp(3s[Xmqhƶűl qu鹵[qZn?;rўI/8;1VT,yp4>58 U]4W46!NP)ٺE^1)I2q(Y|NI)B= Ϛ!烉1د|uy1Iy:Qܸ.e,p<5D#PB xmUVp{^=)nLugm+D:q`iknaq $v^DũkØ"e S~: Q6 `"̰Z>VқԽt1#,Q­;騋)!T[qM @}1*HN #:DO~gr8],^x/r׊; Th=`K6H0WZ1tl YXƋ(|C3|99 @5Q؅ftl]y<_vF%gQVoo$`LL$oUZ}at( :Ql[FfUl 7@kÜL <[QAі.^T.רAeVcC-|Zo>.7ߔ#W@*E- ͽQ&KNtym$Mme$֐8ʩ4GS*l[ nU`Yږk'DO>A5ή3lT%w+S$=eD4{bרqNc[:ߛK)K| v 09));\1eCQA:l;5T,mhVMG` UL_o]VJ'C &e⢵Ѱ3kUl0^!wX]D,`\b4òXO4!.x1 cʥ3DSAsc-D8KscG@\I |& h6ETD?VV\نԀ*N iGc r,sW9B~JdNV!q帴uKyƝ rFm\$܌uut$ʴeD{kYYv&ZvNR EIJI.T>XPӉ((AO,5!xdOPzT+:Y8hP4DN(<sdTKڦPkp!d Xkخ%xPg#/ܪu8~ACo(/FC62!l?pt%A SpSAdTҌam ZEtP&֛ďM]e}K9K*' JX)wo9lw>+!1mO)]atB*wgQ{~6?,Pc;W Cm -Y/֯1+u`` :PAJ&MHU͊!5] leĽ?MK)c5,~^R|Ϊ7$q>(7RfZ#DϋAJyԺ;__f7ʈ{3 g.zuVuA[\PVR,hBтqu^WyݶNbTdcX€FR-ƍGOFp$qFHۅ6jOg!#b&dۘ]Ods'l~*xsF/IGSY)ݦ؁WǩPCؼ -0`n=4 ۪0mJCm@uE Ћ ad0( Mx_C7,pWfG p|gPI)ߐBty/.} o}endstream endobj 105 0 obj 5006 endobj 111 0 obj <> stream x\Y$~#oyH<eef]{];"Ȭ^32/7l M9{~>{sC˛.g_x;s+έٷ_| =ӓ>W/nI)۝l>b#Gn>G?A#!&6_bsc>Z' 'ka58PrG "Rn\l\3T1V\WQ;%&[Fͫxk2lnwjRyyӓ| _so;c:**q *k ^'t(\ a}$̷LK@_f 1Zrx7_u;PH8>Pcٳ:`ef ӧ :; T@ eWSu t,hڻf Ga"oFp 'G*3lIZb>:۠YugP=&w%g}LP~2M16k^ Xo DdktޘjJl=L 숇zPЄ. &oTUZP0bAu 3Q\F籗8\℆׳Gh7`X&fNB$ (bB$UPFڋ䶾 AN\H} JBZ=Iө9AN̅F}j#j4h9b.8>OQ45/M!RNnd yn A3Nt}JN$}NW+ei&+]8 <%<-0U\iN D)'KKЕ/%U(4E nӫ9Gٸ^:>KdI-JV&J"VkA)Ö+ !0E^EtFN_wIPY:iΑU(W"ey"GWxگ4w.B>^I!qH%M#Yi Mj:W4 e%[ urMC=O:Ew`b^nTX!NmI6{kōVO1zYY"~F~Ԇcj=vj$>SjZRf %IG(Qn{EzIq:xXf't )*W͸t,`晳vv)NIgӦ+3{NFI8q9]5NI[XX=NIMķ.̃(w[Fr-98ǝjrbjX2S>Zh-V e!#H߅`펄xc:c(&CˆӦx5&1iJ 5K#jȡ6D7M() [|4M[!#Tz /.~ia9D}b{D~D8AbՔTK u%+N*'4mZcxKHrfs N0Np]B xYC74+xzv 6urȢ$G(-,- \ v l4ZHCx[{pkophAA ,:szǢO?!WE-a%tca4p=PF-X\BD\ e(XW%J"rHiD.Gؖ.Q5{R"1b-AYBCgu`fl/z̆#<-d.Sn)+0 `hw KS޾&h B u-D N<0pLEEt}`m;\qN%>Ox8r; ]%h%*n=" E6FǘDP;ZL%oTȡ'+;Mȯb6+ѿtMqż>Fƿڪi&U xFHlڢ2pj*P^^ ɶ d8I+C୨\A{0 8zxW(": isnY 7SU8b,#6b qr$L> AMP%o *)3x6%8=x^Fcamx\]joH]=vxȝA [Y0_Z] G$|QQ}$^Tq_uB8ngPtgxL~bwh1ńܳ ?cX&}f{p\Լ͂x#Ӝ,-rѤ-( x`-[ MЉDT=V%$B8iُkzTTQ]ZrStizGP>ŋb5ED k҄ |}4[F[.HBbC}ׄۊ؃.= k9u_%(F7 KRqA؈8I'3;^ۏ{o4%8.q|ҤUGG>/q7$3SFУ\ 'U@I!X)-f8hw .!XFs#^Q2p͖hSb&Rn-0A%Cc1w0J'CWr)}k-Aq8B8y Yu,!^a12 #,[wڢFr5 =)^3q,4D|7&Uo+51E>ղ;"R>A Ւ0Vӡ}q &coF5g.]**JSr S|?Frřzb栰<26繌qlBT cs9xg_*S50maj#0@E<*|r*ܖݷ%2z>+yY֖BT46Z'Kq Ma Lt5ˑ\SH@# rf`_FvJ4IAku$+D*uڱ!uZ~!<{:jc異Q-bg.$`,Ŀ6*iAKj[daWxEh]X߳Uä2J cT' `=!4Un7Aor+VxI=D/-D?8/I(1endstream endobj 112 0 obj 4433 endobj 118 0 obj <> stream x\KǑ+aUY`/lE`CR"g(Rc[̊ΐ> ARMUVVf(nը+`-9cY=(,/%{1 jxOd8YnMO #>؍8Yzss}z1,OA^d2"hk\n2YeOeVx+8Ipe4Pfr cmX}=*W4!^? "/+?Os{d$cEoL.$x-/Y2^ }o3xhMUn=.n g؁aH8mӊ~f1Y&C9N]cz 4 O$[DAQDё|yhn㏒lp ,οY1RE_IZ ?;nȘ5AG=B1Vsk=Q;*B˽uuAdb/qI`&1HvU ?{xY7 50lǦ@M ?H_{6u?)kjWiT㟒!>1sN^i@@p-)`&OR*-.}q̇/_ad QR=GCny N--z+ijDVm0C.uIb@;bfnZFʹȮv?vr<^^ U6(W =?7u;sܪf!`Ǟy@ 5 k\vOD>D>c|37v9F ,]vr'H{6vg;p *=HdW:c#NtSݧ:9<5 $kJ C{#WHB 2fPuM=! NO7Jv:k+~ӽ|8o.1Enkfr*? U?_@QKF0O@ ɐGB^}` QyL EPQs&@'P9RnQ_(6 d|F@BAH@&1KH; %{,DDYYfb$pT2pwH9}A5,؋T| c#r {v˽r GbaIBp?9ZLd"?Ios#55]eqdu%΄/=b֙Z6afKm 'J5̵d&Zyz凥; oZT OkԍM/IWg7l] CҊdM mb%Fy:6[jVMU990eF>fb1iq)ƙ8((WN:VBAX)wЯ=' Y_r;[ m%:lTxHDRmF& _u)S_ U@!he#~+fiLXP%[ou3Ms;8J\mPzl5G.z w R~KZ.\}Ԣ!ArSKx`>ӵ: >91B&9{;(:(b/u%M~' n |</zxmn60}?co}5I u),2a|Rө`ƕu6XN߇uHsqf4t6}.eݸ؟yy{;ZjF#Lkg~ Lb۝,M z0\ ySHdoIr#V۬cZzXK4ݵÏrX]i%tn+z{.qmJ DeNոHcc- )=غڤ ,Io[=M5ZᔐҳfL$pXW -eOShcA5qfLRx`S(v=sk-9KB4n}yb&H.t0a VqU"hzfr_rTYyF d 'M bH#% ֌$w8!QPjH>OH'}\9RlijDWXj 5mcKh;M~ &ʍ,a:5-iۙ}Ujm9Oqd\!Sx uL~5F:ԼŠ9f:G+30ʵx!AF>g@YC+Dh٨P'&OvN&+tx6?1i:+ƌq\+ҵ0r85q3S'-jւ} ʅkZ.X)aT o`er棶Ę|RRe7ګD; (kGY%(ؙK> stream x[YsmΎpc"q䲓8E:\)Q~}Wc\Z+n̫Zbu_~z%_OWV:ӯ4AD'8XZ{sFv3 Ǔ/a|`9{0l8)akGcL [=*܃b'Oo>GcWϠR6_bw s >IICGD NroQ0^Vȍv*oņ'۸ET wz6XZ*W֌Z;a5qsvfFʦV<(܍<6n5`guc|SIyxzsS_ ZZy׵1XK浮\9LAi;Sasݎ04B,C_4RIuBx+c.L a+@'ƬE K$&2M(BHyl O95!=4Wn=OK4^w%)Ҷ,'la$[sbwwwGqn#A#}뻲ftGau';DKnFbzw|4zBւzTܡܷUxXާڧQie'>Ljzώ/{sn``1ڊтd㰘B7{HRJfPC+f*U[7652EzhC51c*7O :%p)4 i8Jm7sXU AtBpke=$cֶ!,C谄&Uַ녖I/"ߘt'sބ% [7j "WQt,{% -QP("?r[۞x(-=ʫIaόqg3o yE+|9,J1DL#zg1b$N( 4\yp*$-:tj-!/2&g-fׯ2OFշ}><T!ShɄ?&(樅?å3!΢9R$W~BΌ}gҎ캅NL);젼:w5|.?@lMT۴2UYAK8KhDK[Y!|l01U?G"dj)T<v`?6}Q?  D7hZ|@ )+T&o@ҋCJI$0ʼ)K?$L:yƴʁ]# : X@SR!/(GMbYⴘbaĊ{-{rK-Ñ{F <,Tn ?V >*ox\6z(C1/t֙[Oeo9\ YdGCv;?-{]*%' =XdɌR8m,n j+`0iBbS59 rB6&5>Q*$YC(B`bC`! `QxBc0wKQ-~hT n*(,.,b-)%P;{=U1zfڷS*6&0<;ZԲ~hxɲͶs,VBC-Qu긻 2ɨt"ŠyXC1Z{HN&ȣgMJc#6KX}Vuj呰 r*\;*GՎdO)b/J_5wbl24 V2ɩXY&W]j7"Qv{n.$ȣN]kȧI@1\!2*LѢhػ&?\x [ݘdTXcp TW>MZ.}r^X%ÌPb&>V unlt/ﰤ%ᰒƩ]RHICYOT0-u.ReY'W46~4{_ƜWyHÅ+!E3*m%]?rM xL<-o>&&qB6 G\Ju_HE|TWd UuS;X!Ѝ{!!1J ˈ5I>R"`6<X^oBǠ|R8@!`?+mSjѝw4Q"%%$SVJ"u,9#uy~QgXzU"M ҫdXb@vm|HN R"+'2fY*;jX7,,/{vNJE x S/3vϔ]V3n pſ∃Z{cX=>~fSH5vˋ2Vy=y٨\L"(_S> stream x\YsOlfhpJv|ȕNrI$E2קgc⡒%s4zzj\NVﰎ?Oן@'Πepc0 _ IxӳQ?^ R*xצ\FN_#t2:q>˺o?c;h́[oxFhjSUam )moܨ-ݶ|v~pQ.{vdçM# Í9p Fhߜ J 7Vj۰20鑧ռ("hگ9hZqFt.꩘Ah %4^DkUرoGxF#R 4ٺ$Й Y.^Es[ڰ/ σ!8xH7x'&J؄dk/AZTv*cJ2;(Ae+rAQgme(8xQ64-;LA/ Os@})oo ^z '#sk :WA&h*iQ-sI@ϢU(Bֿ.Fx@G!f)!;-v6\T1"j]`;^r+4 EC%8jo?4.%6$i f'Zҭ`h&#}(fQ#rRQu+8x2ge$?-$!xi \ C:ܗ P9[2C0N됿3j̻Qkso3T~UPVg!Q'!9 +5!M+u ⴖw G3P g"Ҟ^&&JB)NKpI'M6 ܏lF4X4ѳW&mV -.=S&^n2K ( t^7H$ aµ*HCd~aXeLqiȸKɰhXf*6<@~>qdX7xt+Esp EJdw" @`="}$j!sR<23܋δ{GA\cKP#'}YT2BI"ӠHӶ`I8|Lh sx˘RM&9C]cje_1 #z4l^u:=J.Jú4VH>fƙ; H@Hk28*Pa K;*b`ÍFrBWؘ?f!;&Lh 7GM#O,GoPeō-pɍM2|17Ƴ6?aTa[+7ꀏ^W4ǫDL'ORxQwENa:|y_:@Agל LHs֦ /Zæ%׋~ۂU55mt_v @<)ƧSH 'eLcd&&:ҧƞcgP\vd&ZX9G--W{o;ì?qW8z P{n}LB=qG+\XS:W|?|:MLBUU»ݔx4@n^'[1*g : L3%4`Yg[5@2RRt KM%]{].&шbDb)R<_[`\NCVkdRo-E/ JI=[v,7aswpgm}g RcO$pDw.^bj2VI*跔7vUL{V?ҕ^}?,gt3ܜ)ݑn6Ѳ-r֒;6(fv!!4>ɂ)oK$Zf{mhn۞,Nhю^1;ŽFzYN(%_Y~@paGT4N6lNE$۲J""Kvn["|A]O-Yͭ>sm}CA{Fv&zvx픴lrR6}Gcal2ʚ j8teѨ\X-\.[z&)οٿwvz(ﵲVSޔx2fI_jjd}!k9xH*8Ih+S;={/r>:-B5&oT+ 1\DA#"\H =r@_ b,!XVJSReQTߋF*lր"@ qlJ:r gX !í3 -m1*LB:HB9Pdz(j6REJ{d(U,NB{ ^R*Rh_Fq3 +ГT뿹 y##2hמ*Hzw˷:&b3\sX,AC2`ꗵwO{|VaAiPOW=^=|՛lkg~?m-_sUkxYJ\f7]w*[} 5aBt BD\vUċlTQ٥&|cĒ1'b&ŤLjB`i$sp؈Pڂo8ZDQ$_lIq̀GAD%,`2L"c Oyэ Û)mθ}c_FCuU 3Zr#}N@" ߭ЦjB;#;"Mc9Nr3Z{L .y_CcB ^})xS3[}'- [[$ye@nl#<$ɖ 4ȝWw^ӄAckKi%vj:tN"Bok0WBL˭ݝXKͻ@&%du>> a&vh_N2rgw0endstream endobj 131 0 obj 3726 endobj 135 0 obj <> stream x\YqZ?b66>Ѓ)S2lZЃP YgVu.'lOYy|yT݉EW~}݋b25ؕ_ᄒF,QD"w;vXjw``AIC8su.~å]1ps/aWcW_A#p+ꃒ&xK*Sx诸VUZ=j.{ MmXT,.m-^*+v-d+g/\RϧMK n VEHď{??ߗEIX?.Ξo|h im**_ecط?|޴o?:٥ !MۈUTV/ϝX7r$[m ;ԇf2ݥuB ,[5D~Mn;ckPL!YRY{\=DP͌B°jce2IP@+yG?M.q`3Vu&1t}ڸB5.ڮ4Yآ4ҙ|~ ilqӵا(Ias }$f{hhTiu! n |Ph."Z {ͣ(lFD!#4e(N#QUx^C7Q-n DBGHae 28)GDms۴A۴CE{˕!¢8m00,, =LJ&wB`u3{tBpM? rhWsŚW6ҡa&m2 ڥc27\˰v94vp=z k/p&>ow˨u`}۟]gF%hi'Uޱ@B(e0B`\_W(l tr)q[ S<7xE+-Źz<,҅ iQ>8A—J_NC#fO8 vphFH ?.^PßhCfM Z x6C<|BR!;-*ÓVΊs٬0 [4:>nGG^g؇j}ȑpJZkA'kt  ٥IvPk=P&dPBA'>)+?N e$FI8rKc>N7*ḭpmeIu@MyXzR"]@'#% 7m^Bvî\ kZ?4r[+7]:mfjp`f YW(42CA6+!Yh8isZ(҈b-n }.4ZUc#o<0fw+t쿿tJAt^/<= g{@aENۀڵ2iఉ띦v BxŇ[WBNܗ#m@?5k~HNu2rJDA~^[³v<4%},-QK)In53 Ys9.+t_UBlʦ?lމuM!ǰǣ[皘;_oTƥREbUХ@1 #2fMuBS9<UΆ6Gׇ(L0Zm>XQgLnܘaԋ&ȨճOGLQ)sHbb%/S=61)q{b=8aIG@P!X 3fi$UNȤyVʶw4 yUssgOOl$5>YÅr 4-FDΊ{騒U3:3OWqQ$P6*-UT1s:|No^Q%M Ja#Χj>c2).7%HTQ3{x uZ#䃒\]|{vM>/`b%+\|w>>;y+ɿ'o7a)Ҁq0RJ>u~-q:AH4]:n:Hr.@ѻ3MH&O1L 3?YO{EtJN_yKVު uPug]FF`23U1!x +ò 2,Y=lWK YQiL%K\ͤl9s.Icͤap%T`*sDyXэh DZ6X P$%H:Fo^W#`AâG)?b$xTڋP`*ְ4ZEZ{͝t7/9Tx e}ɑ t45! ;"y"mcsBe:h~,92ZwU2bYjz&\Lל WN|YŁxgЌKh~ YqF~QL=?w69~YI]_\[:cnĜ?8`QÑ48Gz}U6mx-2&'H7Y@֑q۩}+wRL}PcC |^*3z$M ՜]w L=`A%G?DUz$8J ,ޠS>o ]S}m4JkLs\aޒg) %]8q)Oz)%ŊlijfD"\5솧Cr)?oN;\ =r74y~RR 6fA o2 jJJtx^:Ў9J[fbGTj:.<[o\%BZ{* 0Gnf6S`UC !5c =y3,c`*JLn5_NF%}\IyK캸(ѧP) X8T2y)Vp+fHӂ;na`VfAiԴtS=VN9h oaY's~EƪM_ɾ A041+i NS kH5qM+?#SWb(GqpΆZzU;]{hrBQʌNReziq<{^:G$ɧ~cQ'>oJ(],w=*|aN7" (n*^x꧗ {%HmfFρӕR{y[!-.G_6DKCBsو|Խ#EkU8X(Bp<ٷ"Zͦ=Cl2U&hTm%۫Fԛ, 0k{Ax ꪑU*]u 8\N=kJQ=#?ᄨ~>#Ue'FS֘$ޑ-M`wbuRKz;Cկ}:=_aM44:ЀO!QnZ7e 21\Ռް L}*7YjՒ5½a7i"vifdqtGOҌt$f| O1asRk a q-jba0/K>^1(c)a|ݥ`qjF02? X]{ŷa H鿪NX)JjҭuCF[ZtetVڪ8TΊ̬(iG;3KBlv{$ iXYV!K C&婐Z\%ӫZ?j¿5.c8T\ U"¨[<:$ i,*R ZtʐfjSuZȺ%T֗2TX3tZ MteHܚpB1!k.sל^~Yuߊ<#cί}똥zEMo+jR!endstream endobj 136 0 obj 5288 endobj 140 0 obj <> stream x[YoV&ŎcH8^avVT,vWϮ)0dX~?~5?竗+'_'Ϗ`021*Z\; ͳN >Fl̠ǿowjRZy5tҗ|opjs02:? X;ҷ<㇭r0-A7n!.joܞ[k9X'?iqX{~iv'Bv7kB/\nΩk{+zFE:&fw0Ж uVoa99jr3YHJ룿>qm(7AZ񿷻1ޡsqi]BHgT:ܴCՓf 0΄n0PL*dN} =YF=ovJCY"3ߴ Zv_#,]uV@E۹DZz| KFa CN)2qWB cEqXE1gei5B9(x(/yqC\tԅVhAːy g) hnz;ʶzsE 3 Jsm 8 \vPXbiC5MٸM=ũQA/0V7pRapBjOQ>i[7u|JiH̞B$"H6'Ld "E7tQY*7y)mZ􌰠-@"'wJ5u+2ˊ7M$ , ~I04TAj/v@#܅w [ܻ*KUY %bp,1M*Yf aZ46q"y9N _ fK'#% c7#ܸ:Dd5H ;'eu\ʃt6-t[igu ,6xSߖb\+dRةdxU߃*kɑ) H~v Ǒ+#/

m< :q)1u7=Y&GNIX[9$_\]KR>C:gmp3f`j9vPHP&끣8jN)tǢ9!1ל7YSywzʱuV#xn~~w4sUJ.9:آR:U /+/Rx;ԉ΅ !V}=Rpɛ%(/{ьeYهㇱ2;蔯d P !Xc8`I~rC57^QJvlĂΌz9֙ |߇9\Ҭ8r@DO#I~Sg,?y(ݤ5@exF%Yh ,tIsokogv)<,,e05,IG)%0"ybݠjudLoI7=*.^#hLLwS n0/bJ}ܷ42]a&&iy8+=Iy ly8j%ߣ bAɹbA6I9"*l{SBTHx$I%[UkSR &hlJ9Ɔ(7"_[\+O9w`F#2XFag'~kz5|=w/[.NM-l1,inj&h(^bh ~&;}A$$%SUh~ɔ?Fd.)=# :$;Z'eUyJ eeR̮VyeT,һI=L~Ax%pU$[o l1 oTTЯhC H?ou EJf(V:[Jd^ .%gQY eEDK MH(?KR[ԌlLZVp'aP!tԻaZM8e`'dCz+ YRoiQ="^:oA#a6<\Qg`jGWziU4Sa*z4pfjFrrcwD7>Y!J5/:19p-+ՠL"\* _1+vr Ex6Ϻo ˹Be[(~j_ آ$rQҥkZl$C{66hIvΣMZM3Aa1Rhȭ,c/9q½™ sab.Z?-:ؓN{i{&3sV\4y,WYD,?O<1Hx)t4#v$:~vt Q\ 56,h;swPb KtG(Fr4Tt$pN.Y%ϚRѺtޢJj\ЎbS4eDtNqi;ܴ5tN̳/sNEGIY7a`@ @+knsIbӣ{N:EBRja9XgrL 24L $aB6:/@HZs~t>]AlTv#"ED<[=#d 7&m4# f,wL:'5볃*fXh T!k|[fEEg+Y#2}B4mK:.(K3J9̆SPA׺o۩S.kx!ڣg$?$B]p`2@Q֖U!~ѣ+SzG<|Bb0I۷ӷYجβJ}1;+Jro)@ 8&%ؠDQX H:~K4I`0HqPPw]j --DGsn#Q~=dѮ2w%9yLxuBKw8iSk'eO !m;˖nNkԱ8_CJ9ԩ#Uuy)j:̼~&x.7Sk hv4| &qXDq I꽋7&П7~&q^㪹uVH.d5OA 2`Z6A(;{(8]',kT6)za]t%1D2~ @;uBM> $yV}֢ee?U >w1Usv 'aZiqSևO%bGM>RX~ti_H}&'DPr%}xdzXоfijɴY E?WgMvC1Tܐ,,ؤK#1:TfN  8v W)JǏ+lm!Į$TtpkNΕLigS\=!і.}O{p^9p%xul`].L--C/Z}amvsPTQdnJ10 YQ/jWz_)VGgendstream endobj 141 0 obj 3774 endobj 145 0 obj <> stream x\YsU ʎpI!vGv*?yIQD~}q6f0<$ei0@5ߧW닻[]ޭxN^?9N<_^|m*KOVڈ} NƜAnzNBc6/` '7RڊͧI؝fs Zk$8Q厾Mk =J |\3U1V\k-pGf|ն2ay|U fEwMB|鶴]<-SHޙonw"8 6[2n&q5w ! !4VKke"9a_MiflvSO(v!YⲤ#"cDFX-e ([RϣWfs GKe:0S & ZO>9|}'=RÃn>?kSI xk0Ѵ_`JqDyirP@EڹRºqJ!;Xki#0dw-Cɞⷀr̈́lmILtXc)R 1L K'6Hg̍PjDX 6jϺҋx^Jcg`E+M}< s1wVP뾡9rqq90Q[ej ⣰k1+=mִS ƭw\ՄIe8t0c= DjIҩzMt  (QE88r@ O#&-ÌW1bLе FMIy_jcO.g>`T6+|ϊNv/n1=2FT'9W{ak+)nJ3[sj20 b>ؠI: BXgj?)nFb]XOruM,4:'ijHWYKjBAEFo, &މ D'/"'D Y^><˱t3oōDDżN JĘ HC:F++v9Dqﲱ3Sz`;5hNenIcw`&2B*B&vr]Z$ #Qe1QR4EieD/$6̶_L?1uk/V;{S)[p>qڔwV(^RrNTfuK,8OVjւUU +fA`(m]ʶ_@6z åBF 2 5W*g1X~>hm٠[%y8džx H cٚ˟%8]Hޅm ;z&/tY]2=3.gcD?x$#XDOXX ()ƙBrbdl=VK'Ƹ08afG.ʞ3'V.d9<] &+l!ү׺ץ-H\uO0˱6 mcfAN00V]NH1ҕJKJQA5PWGhS}3)=\T}|}R>Z峿?G|yp`#.ig#|[@ռV`<i 9(4wQ0s%lc)d?k @B<Nrn_W'53iO*+~x tq`YS I69TҔ>쁗eF˟+|صdXV;&f鞇m<ˍ(n2jH򬟄)F|.1d̥36 >?S.KhUCO5֥ؑ\\VtbSOcB+:,3|܂A 8- nBID WKn(eny=TxV+$i\#1#1Ux'y8:udJ:ꐞ()BC1/䋩ps4 =(NҼ&Ggrۡᓈ։ "\Y6qQ+olUHʎFA:h {]cE)2ga u >kb-_B55:Hr7\Y  ɭl/ r} ^nu(3S2w0+vw!z7RM PuT $DSݐ.q9o4Rtiop_(~ak7SY [@C۷]?n-0*u0RMƨXrs(~|e 4o^ih&·].G)!?Y+F7^Fv'\.YY*9ڐiG{[8a´ŔB #!'%&m, X0D7!ֈXl,^@# `:':Y1x Msph!\|ǟ k s mv$hKGS٠Yqae#eK]@z6B'2C\~2H#Hr:&DTQ )3USYI18mKԴRU<P2dAp-u]QG:X'ωtlXz&%#__V)Kt*LYGP] 8I2 mL+Jͻ2, ?v=Ғ̍fG.v]̎<͍WDendstream endobj 146 0 obj 4569 endobj 150 0 obj <> stream x\YqļiFitUDPزi#Xp0 Xwf3Ă1[]]GV_?If_ջgvݟW?^aWyn LiNj⇫ ӻ~8)٩n?ͤ~ho't zG+e/&??S Othn,S-iX4 Xȴ{ԄGaɅřɣ($ )_wC=Ihs76܂D}HI:1‹zLy1XԷUIĥZKGZCB>/BlD8{DVm`Q[PʚEke) V싏-kck'%T؀rw}"$Y eWfH rֆJe6U+ߗנ,QSV85gi;TTsQtTN xvP~Kuu `2APL 1na<mf=uBҏ"3ϒ T͂LCF'5͔}㋅{W0hEr˵V Qm^. CƘ`^t4`~]! NPly S8B :2[` [dr:MzvFtS G=kޙymߌ v&P" c`Iֳ %56=:@>e nufSE'Xc,RgD=P2)cPTy9{Ё"/qV3%5}1mv97^wQXgC9.gXR^!:*To,c2 $@p+7yM1 v\kga]e).ڵm V^@YX .'\tvƵ=lPyq'0CZ/]?:8d桻3 ,!8 VIh|sZDz ЃJ&y , sitdDUf!r3XwhmY~)zd?Š9 cL# HF7 8h''q]wk4]$,fėi22fefkfRT2rSYa˟qI>;HhgS9Blzʛ{7'^ш ͂j7%42ă %*EčtL[4\yEy6+;<#ĈO>SDCT~Ba 5-$oikrZ=dƟRHuC0 ic61Pm GWGTg8j)*q~Ջ&R*_q$̅HI.<ށ+ɺ:nMg׾<΃tH֒/%#Nd#67#F8P󓞘5PMoOiRM "qͳ94ZQeM5 Y}.R-)d7BS_挟)]]A2 u\4&Ja4^sH^ \0f܅fe!9K|R@%5)R8풶t 喥P0/npػYE%MFEa#h.2Wq\edWXtRRSYU4¥΂l&{dl,#- Yėg' 8a#rV#T ػqh%ߖ1a/q $2H~gD] җĉM9$ P4TZ}2JF0C狢^J]Pנ g8?0rc.'b3̹=lEBTryC,,2p[9HPy`B]:*IJV;Ex8:/Gn#vɺ/3RJ[?s=I_(U~?*qY΂][@%uᲊDTFEDVk P%H?rqt[`V|0¯9'ThTϳO;FvZLL2tY*>"U ^T4c!AjXz!kHZ¥<L-?K+U}OLUʜq⪀[VsewBǘ[Yg qB\; K@wm;(u)(BV/KH+ⱑbV{wyeSj./mA,ImRM#`yLkE*WDtY՞.[G*@tj Ru5Eaq`uًbTF:i8ͺQ kD7+M.zxT# k Vo:8dݟ<#p.<~ M_cp_P6ɣ}%]KGQbԊ#yexouFuZr48xVG5{&:Υ_;Oo-ny!*ܞ:EE 8XX@t7tbpyd(-Gϙ6\.xMHUs?6م}){*`@e#44y8+ c?lt-[ OHjH_ƛV;K5v5G޳=:`(.oX`Z'px\7~` ߾ ژow&xj|ɼo_={oO^_=~ #OO9SzhO^m}zpǖ^bwsVup$BZYXOyѫ1 =R3N<+;dJ%mqKg'bVKWQ` |Ǘ-XͿO))a7^6ЏWgӪϷK[OH(') :QOqvЂ vp\]]fmu;o]A%dQ9Mlau6pzdl!AfOB JweiqGær**药w~zXn`d똊?1a 9gUul&:t1n/*2cEƵjc5O_)o03Dor,%ݼ:&-0,k=u.ߞցY|͒,^=~%0ƾB"'=7˳` _> :e"> stream xZo6&m*R)>l~Ȋµ7@.Gd;bX"x8XZ],˶]׶"t+G$p":+j'_x,ܒRfҝjl2$˲}!w32#(]p*5܃Wuvnݎ:C)j}-8meU U!uz<wMvlcQе%kMriRfGz%yꅧn=uSgݯW,Jy+ c挋 DaĒ)& VvF!M=Sgb'RRGtЊiE@Daߙg~ȹ_4k;cqQBm\])+A(5Rpu4舫0SNǥ#OE SibdNץo'NAK&;P_53Aslq(hکf~&JD,ZXA/%-t٣JٺΎ=$I>T$(oH a-ĂI-(w v߇ T ͼ~&QEz ;0;MM!AXlG&0_2oHD!}yQ^Y?|՝#%w~<:]q@C).M +RP5,KYt5!5.F?S4$Mh [UC +@gI9; ԕjp3hǽuofPђyj X :5:a@1!,^&L`̌?ژ@NHbд{< x-n|poԜvU"֓#Z:#cl#Rmd;HūQ恥SArהIDr3}* NGZMd'-j6T5!jODpp:$ Հ^jLlm}:8[-> (r?!u68NPN4B#{]>ugck]N"zklsc<%Jq%Nrӡ%`xq3qR{6^y&n/A$m mk[%a#^=z5%iFe*iX1!y.7 )!@yCVaL{(P>%~%iB&f! UGG-Umc0/>1 eMlx@z(zDF+O[gwa`-{1yܨÊ%굟kv/<?fSf56 -9w#m&J g(Е|m-Qh-פ_+Rm~3!|e݂sOJ^|Ժg/!vAC̰h'H6Op{XYѶkM8qb#/t<`M,_tsDkހ>j+#C=2J1KV2[K|-K?'aq8}_Į=mX Ǯ*iTVb I:Abp.T6TCm8eي?EU }QoAo4x?endstream endobj 156 0 obj 2032 endobj 160 0 obj <> stream x\IwΙL}9Ǝ/mÐITZ 4$g zCwU}_- ˛G3 6˛Hp3xY7Vlnv{=(߻l4m^B#+_B#!klϹܞa2xCp'j<VJ _4:6ܧ0K{{?}u~ۍT ; =tX=gG_K_68ӽr g*೼;6_ҹTX;ҟmJ+NJ R*/BwM,K4Pp ,WGul-,ϗZHZw;8aQ1~Q,7xhxK&}>nr6ds]Sy m,hKIg^UkY~15n7uo96_:8ۋzdwuT0U=H'L{, /=Cڤg^/_Ɋ/\A*kӸ3 ‘4\J6 h9@m|ڔz0A֩zEK5gZ%pR(o/B zҡD)PۅHd̦1ҮE˃FcA$ ,ڼj_] ԕQv%*3xg V=hgx^(5]Fu pPthQx8CMyWn/7g$#.!x0EW.`lCxwOi+þ!9ܨA Sd-q } ?zWnk'8xVڍO:/=jD&gfgjqQ @M䁢TRxv j ^up>nEHq VJtA)boXԤ tSxubGیi8̤TwJ;9USoq6۬'z.6j\[u dر2sti$ϊr^ m"H1@Ò{4 !‹ =65wUW 1C߁/*ђc0*܌  _V5<ͳkaL#:kzH89?DȎ)J?OP_SXUN- n!`J;E70WiWtgyw:@ngxp詏0Y2NFgxv_bDVdT{Y#YdL]]niuypQ %3؄u)ZАH|#_o&;K}/AO;i1=Cj; ѤiwLrh$=}Nf~ n7y=\2\^3Bd<EBԬ@Bo!r]^QwumQyM, r@Co^BA\|*J bFQ 84PHU,̓eωLn}f!;V[)$2H:Em>ȒwU]a0Z .ТㅸJZ sRɓՌ ?&Vz&K M IVϑap4@0vhM%z9X0*xRשmdf,k0@v/~q'=ƌڈh.l9qԏρdZ ['IxNFXbܪ}p+WϪsYmw GMY?Ou! lAgD;Krbe H҇RV6짝 WT_t#kDkzs>QDӉIŃiw*h\rk,*'%K<~ &YtTm\l8?UaH' *&;A>P  D~dyX F"V6l*d 3ކ kصzrjO={e:̂ܧuH@iݕֲs;&8R\Há[w5-3!9%C%瓵ȅzpkN>z-RtA K-OlWJUX43 vU'jѷ a\; %D^;&`=~<|pN|^n8nѧb1X^CfKbX@w O`!Par*r4lBHBb6H1~}7`NglJB4BDh Q1?/UmUKXu*Nb $m,?Sx#^mdQh{e5}OV=x(v7Zs)'+N%d̮ho{^RZ7aM8!7#:@@k5߈͠q1~&$Cf]zNHM5oo<Ď6aHȨ'OۉdMvX·M%/g=EPM[Yt$a勮: -l$MFt<؏c1 ?"xCQi9jLE ^H2ҀU#-2^3'j P" [(35ކJ]!ƄFA(#(aJt(-043x/dSPb!!.P `̭f601&Q&,4ⱮtEs=0$cyW24m *l78M,y|ʖ_!=F˼+?5|(<(O-ՑpVuJ`bH*\]|",*uEšrE6Rk4fMjwzmt 14Ff麉GnuǦ'U>< $H\c]~ A(#i ͂Ul^"`F5@”ZlQZE1nnkvv_ NA0 $XxGjQ&D3f@DeʎȏĿW!UjJ E͜$G;4H :F}*N՚S/%IϹXr7|a 9w?(K6Fz׺d>(aRuA~ U!ǵoĻ&k-RrƫBL>Dslg\–{E"ݳ_eb P|s?b#xendstream endobj 161 0 obj 4531 endobj 165 0 obj <> stream x\[wGY8?N<Ź{:{i[hj ?1-_QY5`BC? x3BJzJ}M6zpM޴o Q5>W0@ dGAkUyt:cԒ*WإUAy_i1(ܤ~ۿa0ZKf?vw,(am iuWPf{`G )#7q⠕*|9vq _~ A)F[c<ˣvzWk^hgu[Ajz >a-"O{X?َҺ젡,dmT V}I{+UeXl+.I@C35һ(BvswU\-S7zj xHc"9bx^wSW;4507j‹Z9XQ`?Ub[28:aH9}1S5)]",H SGi_WFa|d5ɄgЅǖ `d궞(>v/-n@wHZnQ}VXR^s $ iD\IsdB4^H@F&7 #҉7xİtĞ6;QY FMILCs/#ћtB%ƭ4(q=qўO$zKLl8x0FN:ADwѰ@k-+( 0&ԇ+JN" Sð9f>oh;o:6\וYH[S?c=l Q~**‹JH`hQPeR%>]H*kU1iy͸2Ä́CƓU9睡pl`Bd7+Zr:ᨤ0]8h8iϜ򌺞+ZE <享8#)E{I%=OؾAJ6#?ܙK0TY@ i@(9'L9|];͸u%)WrEhtN HЀ5f2'ٮa"PB&'*Raנ#3 %'uv1]2)S(¾6wRт[e2Z<WZxV{A"Jc|vlkC65?E "ԮGnpߞ/̀R{Zt *hϐb6hD. NI=,قtiRphEl1am}SFM׵K$-jBˌ\[seljyc2YQM٫rh|}NS u q9;% "\dp&,ĊPas&G}3&|i]5Rqn3sC"C`hC}|kFtSK eClq>}y;yzON|jѕ=Aٗ-E $gvY ;3UR {ggidᯇCBfi׾oz6eonbT_?'jœҀd4XՓz-Z^X?O,dl 8eABm ZpV${ 'z` c-.wGN6sbD<Y}׽87D4;;G?_Yj`61%1񑶕a$` ya|0{WXtʔJ"K%Xx0 ,(GWCCdz^^[TIO5K*1^(^fڟ9N<ۈ5k~,#u,uA4p) 68kWVI=Enq@n";l9ȏʅk"?4o2rbxbwy!*T{ƌJ:+.ju*L ПR^4:XOlRIn ^M.ߙـy+Xj8&A b>Ȣ nٮe9dKJTzeba:Hյqx+MPIlU-^}j?9TjO^gϒ)~ g) Β* ]r)^IЭ-C@/ 0g1eL:Heb,ҎK'a!ƵMMC.t>ÜYq̈́h5OHm$2O+S1%TrD71ƀ#[;50 t%2 [ix=ʨ 21tWH`9 *|6 #l-$9'>zaL3iif^2Hq:N!jUYωQݱ0$;q3%UY"1yώ*\UX v) hm2n(hbzi2{"@M +=o掴h) O&ܝB̶i!6cl{]z Q a佀38$9O[qL$2',\)*;W=.΍>K"$"~d?2bK:h/S5p+4߷±) ~7Bou f^ܦ׻;k(*0>]9UۜIjW\-Q; 1VQ8 J$L9`iI3݄4iso\bD\{3ʊV睏̓Z0k<(1&2L f%(fm+WkUt2ibkzZ eqR"ҹ"JF1}ʍڋ&#bgi~({ֺP}6ޟ+&6ocپK#5<-OfY3nQfjDC'ܝ׎OTKnznFd~0׃ͥmZúGZ/Se/{A Bk7J0شֱSџ']D]H-Nk% }SLf\L?2AӤ19f0ýhue<〕GO0i6ssVI 2ik'UlLƋlD^L.c.8C?rǯr6ͯ|i0'G}G ߠ1 =jA3K 5ي^=*{|W㽰IJt5$늾zVP[#5i.h QP`uQ2Γ h{:gcf 2,}U;`^K=ZڡuO;U?R+iՈ@kSKsOTǏv(h>mї|ml}jt[^m* HZxwt/9+4r|l'in eAXA{4Pb)K|rXqQ?1^b^iK Ȕh8ނь흨HKB%k/A@_p:#PV>j xDPt{Њ׬S ]$⾩E]b~ڨ>?q4)CoFLf?_ūJTH!/Sm!᭬ sMxg9١J"&SFS/3GfMjY8Ojbi/uSшۑ=m=SYle4fc$حWJU`-H0/2ew6 Aq=! M+e\^n.YQZkMJ_&?{,m*P58](5!ͧl:vYcx]{B h .Mz,'ż;{ܗ+V-] ̈́8=k0qA $9OVwZ՝;L_a*endstream endobj 166 0 obj 5174 endobj 170 0 obj <> stream x[IЏk ˒Be@0!eYfvX@ӯ֬/~}hߓw>pGgo,G_ٝwDp<#t-sX8zN-T0:tr·)N0:L7"!<v NX6 uj6&D'o/“ #)cmh!go]26͙'rss}Cz ȴ)-0i5gU%d-K KMc#]BaD+EDǐƈ h5Gnn 0H9E4OD' 0{nApK' W=c}hb"SFXEH‡m M8uE-D*#H Lp"2@ aOt= u8k]>cw$7 jڈڸ.ь[ĀpV9DkBh$D5; IH#b-cϐ 8\LF !Ax$L9ЛxA8ISX<33Lak'vVA ޟʓW3E>Tn3XI,φxCin &mYb+ 0$8M+g\kқ4Mw C@ .4iF'E _T%].??J{)5.A/MWn.}w&%"l ?P \@T Q6 aW6ă4 y𪶽ZmRyX^hOA‹hGb@Ԥ+wf3<5 ~ L0-``bH $m͗&h-N]Mcq^OH H -g,mߴ>Θ&'5DiAO*;𪃕dC_m-USJJ]aL Ӹ7oI FRemr4I#4sC#:M{6igK$'Z>o„5l:` ^igk`:iAQ{1xM5zbi=%[0 A" MAOC= ٖ"գ𑑔>Wci=$U%i=opyjUփ3'T,7io7fvzčQ1>piDl Ұ)DeEOJ--!c‼A8hs .Ub%,pth·2@]j]a-u)S,3eLYvE"FhNՔ05OF.DEY 'F+cqFe{QMߦmt*')V '4^;pf65Hԇ'A),' 3'\18N6[H6:93kDž|m"YZy2i=O1䚉ŗ`Zز-FM<wz&W-L1ouLqH(F%0ݶ SbI(S7Y -};MXp> D`,{S|q:hΕ]d !9CqW0T&/4;#RdC*D<&"cҜnezT8@Z!FX-|~ÀС,& jrą¨Mʫe<٪iI{XIG{<$G~ǭEm[c5a7.'ui|7QM~G*_y񸽾Qi{:^ :moesNAmWѷǥqH4K[ǧ`0b_&zWj/mtV+mH4>*Je:R6,@6%#s]CD5K,dh0v d ;:\T6r{#țfȳzVK>RqM1N#"-+~ٻ:CiV۠5-ɉny2gV>cS?x;ճÑyuzo:;4ri%^K༩1!ܿ) Yumj@QTh_}~m,Ns.f*@FYiT q,ߠn.mԉm^[NH[d:quUv{e &v XlLClm\ӤhI-(6c =z:*dԄHWZ@oX2d(U#In, x`GmE<'< 0G)$Xz}dR6TzU$1Vl8ךY8lތ0EO%S&}uؙ/ٺZѫ&9m) 2m³,mn:1Y/L|7QQTk:7%xv@4=J$7|bXt6_س+cPo$cm,[㨄^.6-Fmr6Gj{X=pU=u,["Lp} ,}jqfq>JָmkQݜ;`&`ך;ڈ >KJ>lqPkf$0ҠazydQRק=4o1z GzKB<Ŝ*}#$P\qCX<*]^+>Q1|i}t\Q~tt\2u|>/Uf  F M)F3P-˭KݷdL-Tε!t+ryb[uioQ2\){rQn!ʍ"ul/s> stream xSKo0WhK({XārvҖ8v{#Q7Ӟq&&>^ 8&A|9u*Pf6$"E톈FR$BTBĵUrł?:l`Ah j1kz2`{-̕D9&̞l/kc2B/&So];)!4yrPQу}%R4J:N=|ry-:F+CΩmfW2D02i+eG&w5h}/[qm^qˑ[=I 2hed?9A?9$( |s7msA 圵QN`J2m*g*0MJ<+wt{)VÚ*QI)T(\Ȭ6 d`7\³]tЀH@{qu]U9.> /Contents 5 0 R >> endobj 18 0 obj <> /Contents 19 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 34 0 obj <> /Contents 35 0 R >> endobj 39 0 obj <> /Contents 40 0 R >> endobj 56 0 obj <> /Contents 57 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 66 0 obj <> /Contents 67 0 R >> endobj 73 0 obj <> /Contents 74 0 R >> endobj 78 0 obj <> /Contents 79 0 R >> endobj 83 0 obj <> /Contents 84 0 R >> endobj 88 0 obj <> /Contents 89 0 R >> endobj 93 0 obj <> /Contents 94 0 R >> endobj 98 0 obj <> /Contents 99 0 R >> endobj 103 0 obj <> /Contents 104 0 R >> endobj 110 0 obj <> /Contents 111 0 R >> endobj 117 0 obj <> /Contents 118 0 R >> endobj 124 0 obj <> /Contents 125 0 R >> endobj 129 0 obj <> /Contents 130 0 R >> endobj 134 0 obj <> /Contents 135 0 R >> endobj 139 0 obj <> /Contents 140 0 R >> endobj 144 0 obj <> /Contents 145 0 R >> endobj 149 0 obj <> /Contents 150 0 R >> endobj 154 0 obj <> /Contents 155 0 R >> endobj 159 0 obj <> /Contents 160 0 R >> endobj 164 0 obj <> /Contents 165 0 R >> endobj 169 0 obj <> /Contents 170 0 R >> endobj 174 0 obj <> /Contents 175 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 18 0 R 29 0 R 34 0 R 39 0 R 56 0 R 61 0 R 66 0 R 73 0 R 78 0 R 83 0 R 88 0 R 93 0 R 98 0 R 103 0 R 110 0 R 117 0 R 124 0 R 129 0 R 134 0 R 139 0 R 144 0 R 149 0 R 154 0 R 159 0 R 164 0 R 169 0 R 174 0 R ] /Count 28 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 16 0 obj <> endobj 17 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 25 0 obj <> endobj 23 0 obj <> endobj 196 0 obj <> endobj 21 0 obj <> endobj 120 0 obj <> endobj 197 0 obj <> endobj 14 0 obj <> endobj 198 0 obj <> endobj 113 0 obj <> endobj 106 0 obj <> endobj 12 0 obj <> endobj 10 0 obj <> endobj 69 0 obj <> endobj 8 0 obj <> endobj 199 0 obj <> endobj 52 0 obj <> endobj 50 0 obj <> endobj 48 0 obj <> endobj 46 0 obj <> endobj 200 0 obj <> endobj 44 0 obj <> endobj 42 0 obj <> endobj 201 0 obj <> endobj 26 0 obj <> endobj 179 0 obj <>stream xY XS׶>!pr(h9V:ԡZjũZDYIvQDX{mնjk:v{;L|{|prv_Z_enFD"2Gg3Nƈ7̄wHa  d%FVoh8 !0c(%V޼,hg[:vΜ?v^2ORPr?v]Whvc% n{YPΰP/XǠ^@-B2Џ##=ڱ[oߜ7O~Sn63g~oE>RoQRNDj5r&S멷 H-Qfj.I}LS)=j5ZMͥ5pvI:ib觟\\Α}S/jtbY6WlͧOðOS ~sao>ҥ.:̘Ď'&BVԮł\ŖȴĔ4N )d[՟Ybw4v~BQOy{Abfށ}|fTFt#bZF ˴.aC =wg7eÊE8V&I WR>Kjbtu4Õ边yx=gAz;B ?] /tKn~3-1 <[QݺUVpnG{pxb-Ga{@r%M}tL09j) aVe}d0SE R]Z|g"W;ֺ=S،~mܵxt`cq.3A|ÇPkBk>̈HKO v9>QO cC"2eفYLmsOgr>$z&MQpn7$'1 tϣ֏:0z[ܒqi $KUm\IE=oY_!m`iEtPK(* xli,(ӾVPLQ9}i >1ѳĝ-<տc[B&,3ݡ_l{RC@)߸}i(ND os\{:텣lmk+wC6鉕ҸJ 25DY*?Y#:]Z x, w^^Rn}HQ o!jiJ]v׷unjEN@hi,7nZԿ⥏4HB5 T Zy @ ba~ q EXBGU7/,ڸ#"/HQ"oBXz'vE0J0P$q j̘vdێ2˵5Uřvi Q!jCYL?3OOu#A9\0kf+)!Qb3y\]~k4@]]RߦPJ(V|r(^l2zgm]MGRޗ=;%#cm0!_md,0٢./?}1DuZNp_la 9wa!Rȟ C~F09 ,^6mXp;zrN2R]Yw -k:h~]H$}W 4wQm=;WU! #NzHDZaVt`2#52VIU$iR*CMD8"+))ddފ%Re"&\3*2}gǓ`Se&u-vDщ.5N1s]X=H`f?JUҊjTkGx' 0=)ҡ5Q2Q' 9MNJ^ZȐK#2)hXݓ^$-U"}S#yM*koZkPqU,,u<[NO' 6G.O>[%ǣ2lsKFZrh o}][U?@,a3=]cbXt$PKsGvǡ&'Dyk4@ ?\aöSP<vgN7;^e?  GO9tĩϷlprssgJLž<~1!VgrvVFLYUaCi}&V>@Z1Ӗ/̷D[c*!:),`4\G(| ϻo#q5lϴ_*tJاasשIJE Rݼ2/*s;x Ww—>~FT;r@~e{s}dH!&@'+vD#'/*.!T[𒺷 '+A05q&d]x 4~*(*‚*++kKPzxԱFmkmʪv},W)4(9\{6"̵?/=w.*g.(w/jEGm8vL2 R Ӣ9DX,oC,te 0Q@<_1~0gWt?i(>#& ԇE~ :EZ~{-6W[ؐt>Nx6*Rce? =.& Ȓ#NcaH,ZM& sT xnXp;zb7Tdm$5<*fѼ!Rn A߰{]Ϛ*#=eÉF 1UxȽw<(y/x_K,T䑦SNGr0U4FHvנ_"N0d=JR" ﶂ-sd0҂,2Z䥩6l呙Ko#Mm:7K s8"@z|%!F$d0J"j&<3#&19 095 1_a4sP@ܢ\{je/Qb-7)PeaBl ۈyAj^SkSRQ.k`= MB--%AP_q@yQ+T죖b}-}14&Xcӱ}SVIsp`oҐoI5 ,&E\!} YGK!B*"iZ/5q+1=2 E01%QeNv~7?YKN*#3zK"tś}D Lk_ 304l)c9 'Dݯ7_yO“EB}FF/yj<)=^s]he1򴒊9q= fH>ȀEL'D',bTCƵ}XANr 1I}aد@t/dP @^O\vΒhd5@keDQ k endstream endobj 24 0 obj <> endobj 180 0 obj <>stream xX Pq`-\{p1.(w\M@6A30,"("2(jQh&Qe4E^=M~n5M{*fLs|eF&KzSwLq|3e|o)X¤o# Þ>m0ra}ྨ`/PImf͟og3555qt af !/ζl0̬%ptrs}6ϵ7bޜ=-ü81fld61)Vf)g3f93q`V0*f6ìab2X1?c f0Cap5gF0oR&Nf/`7@?OENL|iTT-n6W;pz3|y[&t2`C Z2jaNôÞ_8Es׫0Q\])wSB i)QD*%ԁ\JqPwj5gd 2@VW\ U&Ch&ji4yqS5hfe er?O;z/48@A&9$;j8Dg;G!R6dhh!07f>"ݜdy:B;p@td=OFhVV(7м, 7Gx7-7J\G7<m9|5d OY$ ↓dThfeژDH(4oav3XEً矂k\2]RW %l6x8Y"M#d*aQϿ (̸Kpbɒߐ3pqc}DxkT?%t}7-lzef~bd(Wޔ8}|(^qiYM7kE)mK8#ή $I27H#;f蕫g ݮ[U~jRuL\ǿg+h׺k%ÖN*0 ڷ$:1h"WM<4p,ZPHM /DpDq*4{HLTl114St)"oz̜*U: oqФ'*ǐ"bFE VP6f&JL4Pgh2V ):TF G9QY)U`]@έ|VHi^Һ 2s91)EЭd)~nR<L\-) C^ TqJwIf&r[">JP$t*POXZ-B5GdgvQ 'C‹} Ud.(Z >*0ЧAV+LL^#.hK6P 2U9iG!i>Dт6'WMQN0uU)jth4@wr^7NڐX Gj*SQVQZٹLB+U5-#vD)GNuφjl٣sّ +`ϩ*|0eU`>8+Du:%>Z RHd(@r g$@Ѡ,:O H!uچBh !zpn^)X^j 48/Lh&>MHܷr&UрNhq$Qi4FDyĒ0'FrCY4SO/׊SA6WU@)jG9pMJXGA +p"yt3Uzwo= ]@ h.Z0Sna>Y"ǻGU  U-Ƴ=pڣ iU`\!Gc\>@ ~IaMPz:B\JQ|?cBY!Y-Tq/j ڃYJm9;JK\Qj2ӵJB*(:/E}lmHC\^PsǓa-Nũ'@j&#.UzU 7*MtǵMGv@ebKOJ_k?Q:$16pNĵ׾]_\(Ԭ4*'hCl~|v$|v8 sg q[Scu(Q®Nؾ_2?*(W|xԀah#Lj{j[ W4x-(V狂Qv 4WBS|UPu+}SSυ˒3"5)qe6@X)v\%O%Ob3 ewڨCHa^''Q!rF7?OF ~9S%͏7{r2@1iy2R/doA'VQ)$A=X4.Ed+w*J}8P]^W[9U;d6Q6dAS / yE'eO=/{DV|~Пf4K.I6765 deeP%*bڋ}]ﮋ% 2+Kk[w=d^}%ïؿ&*"H"(+*peFT/{GC iVĵϛtKILcX/IӐa#O{}.b2a h!508pUvѪk64ju ^8\KW><tU[籏5g{G>Ϋ.頡GcPp!)^ ǯm\%k`2r_sc p8L /^,FJ:K >`bH2@.8K]\{ Pjs?/+QW)MDY[ E99BQ)uӋ5U]uez5 K+RU8٭E\_Q6?^zْfx;hN9t˻*2SbSB 5,3-M| 84L56c'~YB,=p/lRD5z87!8;r _kk}Qkx0e&L.Jc^I#7\\g>ބq=~?2N5wQNoo;}H;rB6pw?}']|ԞxM&])Ϧ+T!#◒?Z)E&+8J 1y RTl,QXН@ eeztOh*s3Rpru5\:Xu0^Dagg.;Rt !qӉP$7ߦ`wa,gm>֪栺={vqû8-!]}UJޥ$'wW*h2sĮb< U[ ZX2L;O endstream endobj 22 0 obj <> endobj 181 0 obj <>stream x}U{Tqd ԬmĨIX߉T1ԀKPX {fa]vEEXLVA|`Z5&)Mj5&mR$wֻE=s朹o}ǥ(cSX<1Y:r E1@803{%%P M/X-E7ǦK8}Ĺ9o&.6 Md`L\Q`*!qјWQn(6 {l)1ޤ(*!克^]bk&LU8r blF1T܌Ux"9 p+;woW.* =cت Mf"瀧$Pv(J?*^dƘqn@[b ЕE-vȏL»k*~ܸe(SStWdzḭnQf?m/r»زi:@sn'K_|ugpok}ܔ.O I/g<ѕ:q)^48ͼq!>Pr '@@QvnGnF0_ʠwwpXOx0rA !_lBdfhl^&e&I)WdLlueOoS%hjQ,nWxu-ă`sJ4p2Q}tf̌/фv/߃(ޛ~? ϛQ^6O}n>''߃=c3;$ƪL7x02KD;Pku\3_5k?Z*Y$SQA} BqhCq\w]N^5 ]|;zmg`l˷K* l[T<[GUI#&Ĩfq*lĨ{t\¾&AɰB,z[\'GQ\['t] 'c` j#?,ckwz97IbwڪL6lىgiejd]GЦE2`#B߶Z[_:58;:mJax3>к+ݶd#EhFA);@? Q'[SQ З F gO^솯8L:3-p~{_g[B&]v^+4?y XۡJƲ&QMğ9j$FPCTh9WFQ~8!*_Z]uEr=f kU4Kq1Xd Mg|A%Mguw!߾ˢHkJs2="Mz>G2&>鶳 \jñy72VA:|c:CCjK FO! ИiƮ,ߜ) E^ cÃ>B?hԦ?> '(D endstream endobj 121 0 obj <> endobj 182 0 obj <>stream xW TgC$nQSֱڪSz:]@Bd @BIB K-,[mZ.w]:mПsz=m=̝s.<"f,+h?-e~2oKa6f.4?%,֫^ߞ+(f燬ھ:d /lٖ"HJOOOI_C&e ٖrѐ)GS)SwoC&A£DISR3e缸jGˉP"XA"xxx&@#v; .b7D'K`b&C!:DxXY=Na?q800筠d9t9e?#s_=^47rnou|JL.H(b]"P 7xuVӕV#4Q^h״izzZO3*MU=$q̋EGe *cwzХ\urGiMZ:~sbAPJl= dR88 ۷-XwJvmn0ρ8x. Y$4CSd\Kgh&E)h)@:B5Yihcw J)ٌxH|q(4 jmnן|X#R闙QR Oj=檪[9߱[63 n}f~vk32˙+E\=M1fMN3܄Cm'<_"+GM=Q_eg>bWPAtVVrj߶[5c,)cfPb! TJ5af+3o@nEm蛟~z] zvS* 4?yQ_[1GO\y\#q&änN äJ`-M5tZi)$3 B =bC Vҗk_rv0+A˄;.{h5+nj# NldG}\qq Z%Ij@EV꼎#{왯E)hr}?6K/ZG u71 ]D/}|A,\2Rj.im8xr7loHZ)٠ ",sb @֗VK#z9ֺJ*לfnYyv.6>qWALotU0Pb exJ>)ɭg;ӫS Ew$*]*~=@ ScK xUE[5&0v(GkWAU1hKy\~N:v|I[L'3ҙUʩv&L Ivm(rhg[[#U9nh8u=UcdtJJrH/ĵ+o`:)At"YZ %mNC3&]+,bEk7B^ -C~`p?a&WŝjoC"CDY5Y@2lf&YwN51݅' /FyD~m؋i}4=Q ZJtӏӚP=5 ?`gI2Ht GdƈdTȧ#}n~4rgZt,<&7{ BZ'Th. 3OuRgM@~y=NINNHP5hv~5kc0j$_ԍz܄lNch%$Ǜ=g~O.-&]drjڍ #c_5 ]7O DLlw*o}/o|*Vu IE+lڒC1[s1;ޓXztc0WE`ԃ`DSx^=Q|(DTQM/5gWO^H`V~ʎ&TTWhi//,/I#LnL=SA-JzBAQ%wZ[)=z&S[-=E%gX~mL@5nS}VdUS[l \/fހd/e֟jU4h)MjEoY){US;c#@bh~/zˌkZDJ!Y}w-;J' %3zsY_;!2o^Jq5{7wJRKvram06CUC6%1-0?=zѦgx?{pבqq9VT},BLfE #F_GX9̲ FK$:hHElGAQ(I=IoԽIEC6jŚr:Ef <J(Fα]#+i?n!CnKfPkq^ee1Ҙ"4{ҺҤ#D'>9V_;r@Y.Pn=޲Uٍ vPL.*U"e=y5oħ"}JŬgF2=}7zFdF&ܬx{wλ;ٻm.8}8ʿHO^ՂGQw.Qhc1lzq I:-JFiUtlQ< ƯQ5(@H_b.-itr$XfhP\lA##  Rpladg}qW#?JGh!&hqw7XOຼf訁$؃3o΢f쮜= d[f endstream endobj 15 0 obj <> endobj 183 0 obj <>stream xX X֞ȌVQ#v]Qlֶn(j7\Pl(.`}BDaĵkoZ joyB }{32ƪ#˜Ou:V&^&VTk+VM1?NewƆF:?a̙3m'2O$c#c';۶rGx_O;FE;,0̴y!;懆G,z'zN_q~[V޺&xۺxc8M}imf$YɌbV158f-3382,d1S;kfθ2˘r Ǝ3CL?32Jf3e/1iIb.ZӫEmjU eOh){XOx9}cg3Ѧ'pnll*8h= 6blZ7("%r)sؓ;~I\ZѨ?n.p"Ezc^:ѤHXOˌ.4eX̣ZoZ>>`EQalky5{PH#\qBgQvzST.Bڣc's[&(o"ÒijreF8IReu8sp\:!< o8&dݱc/\% U,Wi1u@ W` xpӀ0D)3ɢ(Cޙ9/Tvwe'[@xC|W5G|>.)td(| ̂Uv݀]#2}_s*V_oد$Y'$;2 AvP75ʮˉ-$Q g??ߝBPGd3d ~b|"Hvjބ8\B( ؍i᫨>i;w]8^. ر T =8L72RZ1?Elk]m%z5;s:ٚ3~7 iY0 0(ñ8R-J**W36ksTA 4$':~R!T~;qJR ǐWOSz"*ruM탬vI3rr6Oo{yNe2[$4Ɓ-4ݺ i9Jj+@Ds]# Wħ2,] ΃S)UJUk`64 6ZDMF{Td hNE7o(nv"j#zѷ3;J>a+(8Q'C>SCtk*sˋ}}* .55{mfk91MfR Cp₼/ %HKë&7"H^'(ы3 Y>t 9dٹF ::s[][]=ԩ>3F.̻\yhCa3b?]{4.$EXGi&7u3 .Ś_ei* UO}qJy);U.(doaS?L7`WNysoVw~BpH/g$g r J,$TX\TqI&sV!.D8v'DaGw*ˎfn:w{SV|b>=.ǁ8Nم/c֜U%ȀPU8zje,{9d _s>FX0:xw=V_aψgܱc` e&M,⭈26+13:SԊ@CɖIQQ 6ҘQ1ѱQ|2 8].>Y8n<#]5]hh9tXzc˘!Ey;JuNӗ'|m ̵K>8(]] 'q*=|^cZϖX8)Fx,..7X y[wu\Z&9*% @6'SI/"OHOu (=_pk`{qH yqɸu`C؃zPcEm.$ܢ֥{XWj5%BrW2ssg'R cI׬s>PSE{oD{opڣF5>-<R{b/~=2ߚ6qȓ6sb*UoVȒ锛:S\)o֘2*8ՄT7Bz-vN Z)xsI?X:.4D_߬TI8 lIJF r1Pg\\@Ӥ rX*^X(ۻ)o_TO׆aE endstream endobj 114 0 obj <> endobj 184 0 obj <>stream xmmLeZN4^Xdq.Fh6tnPR^B_^k-hK[(t [lh,jLQb2j$DՐzUr+RAMHqT&oi #G/j5FrYR? .jA>Dڐv}D nd mGJbbBwD{*+|=quJѮcu-V67e/ IlZrOq s]_,SȔ͎Zӭm#]"\mcAwf:n=cRF9Rp)8+ 7I ubmwPcX^;b~uNOP!Ƙ>ھmt8xߥʹ ư_;sV( ,mI*h垘 7 3?:{n!#_=r%SJG||X Y ={Ĝ7w*383ٔ/d#3[Gfj96/5o;tQT/ ?ٙ endstream endobj 107 0 obj <> endobj 185 0 obj <>stream xUPSW}SSvvevuEm-X, ig(?,`@HHKi_"F1DAGqY[[5.UXֶ,ߛPμy{sϹ(Jf?e.*v  2(qGD-*K ?|:SW -'SEdax"LgnO 85 l/>y3?@B-PᒵwE533_KyK޺xk2_IÞ и&7$.r|kzz伡e Ǥ>[ 3N^c#^ + 8U6/3d)I]4?lFÍ_8;@nSƿYZ7v75YX!=pO>jdq_n!'!7߶T-MN`p-;d~gw%D 2=DK:+>'  ic8oՃ75oޕiΩy6]Ⱥ5r}#ޭ9|؁f斎:a%P]d)Ƀ&`77ra|!ab9@D|1$ =_1e3'P'+ȯiߵ~(?.s'wz<_x/aVpW|_1 SM;H/r^`0 u=_Z3ӣO,IO%0' =&fH4;#~ 6SM#?\~ha@f:(%t$=  zقL=EQF&Ԟ endstream endobj 13 0 obj <> endobj 186 0 obj <>stream xViTWT$X1 ljqDxbE J&!l&Fw tfQ6^h.0 cLad2bWLL2sNoU{{IӃ IRbkyO64"<7Y(Z0!"`,˒U,YLV%'%KҢң3/r$"[Wmv"XDe"D"ˆD$1xE ҇TIm.ϕwB΋wRJj^KӂUN'~ C << px'b%#}M^݃%w$ZJ LpzI%6LՍsP^Q]z=:(Y)e7 Gp0ȃc4 _pXȁr$"QҰU0p .iwlM:< 59yIp+0vӀ /^mrofqᯜ|`p>?ŭJ+Ae0Yx{<< rwY,qL 5K彆w8^lj͇u$wH4Tܑ+z (~͉Y%7èyD882+%4&WFT?)Md"|07z-Grgl|Li%SpͿ\~T^@ݞ\gC[Z^l6vex/a:.'Cs3%kb+LEy"t1Cuqi;-@{fpt KljȪ N۩#fi5JMDh\'Zc%#VZ/`<'"bÒEutΧ¢k^A &$o[-}IZ4*g/NJ)ds 7NoNjeh}YK2amρt %d8On]@rZnˁQHY=;Ӻ:0":Lj)K|~w%+$ ЭuTVv6y6**@gذ~faPF|L>4p$1 fI"" >ij>܄X1j%B(`+`.5䗕5xA#T=|"T$[(T$ !}z&ڨ"f)7ͭӀ"w@Į2qSQ ,L|$Ĵi8䎉ջlY"49oFPܘ3)ݲnrZ~Y$B3zaVZ=xEtY(هV3npfCRXA&m@_,jWMRszru%N^cx>H⫕)܄J9R}MN{O#|FuޒBa(N7WOjʋ vT v@ۥg {O,Wtlo405 Z @@/z.6?6&{]S ]c)yV[n[,,r?~>@= [=qϝT%C_F8pɖ{P0ϦT]eNjJMɇ¿ASqKYШB 2!"nށXO8ƽz@4b~A.A:?m%V]sQӝ,U+~ou [Yi#&(І+U zڑkz\+ylFvc#c1*HS"#ޠ!dM` ̹,#`:ךmN a,7F ͹#"7  B?{'EvE39l T.?NOT]*6S*0v9tEɤV&Gѿn#^o11jnw=e%QBh)&ؐ3*,.(g$TڛY :a?=lŭpaW6OR>znoB:1NӇg=Ӭ3 ?̲M endstream endobj 11 0 obj <> endobj 187 0 obj <>stream xkPwh7رJIvթl3R!Cl% .!$,BI\$@!0_Sv&II4=rpWgΞ<$E$) =~t?~Z8m\?y>E'@Q6! )Q2Fs:[)W.>T UdJ űe@? R,>/TRE4(Y\*ı, m(EtRdIs"8J"@"H"^ %"!^&ˆx!Ehd2kMS0}קsap:uz'b;yg e- Ϣˢʿ`2^,c;B[SD]m9AJ=QN gE7L(;~`9`^w:;N w$&NV"y+8]t2ٺ7L]]ÓC| 3{@>de'R[RzKDX8m5fA8 B><=hA]8z7!:ߑϧ{1ɚ`hL ,"mڇ*D_Ml ;+ۭCٕ,H!9޻ }0Jy]R?XC{zע";nQw`ZAy;HCoRsYjërP.15N1H$DAkC :B_1T1&@o<4L*y#Ƴ@cAcwK.԰˻5mn%I!ak74L :uwŻ(kj4-LSsK>Z7K(+f% .6cm#Wt3wlzΧq.%8(ȽG.,FaWv/ txRFՑ+05 T0Kf3vTjzc;9u e,}w@VdpzKƜ04X{խgWǞ~1 rZ8F5K(8I)}jiyqr7cJϜcvEO"וgU(,6-19k|nm3߷0dCL~{OHDh`rdxxb>cSq4 4E`s>YDUلtx @)VQxXuWKM:s]sxBXc,5A8,ֹ+ͭã'$] K VWr~ CJ2SfwpַۢkFԜSC &2AV˃oAV01dGJSm[ڻ!OžEGGtL9]8{ele|fGqrxhv=R.SƌS쏟g3kF =jqQGYW7AF_ޤyA_g bz@i#v%8H^?&W33V?DQM6XΉ}yzJVSǭH%ٔfElr.ٽvoc~Rzw["͔wi 뭑=bo[j{ p} endstream endobj 70 0 obj <> endobj 188 0 obj <>stream xyPgƻfExtC%zl-/VQhDs9\wfF0"x]]6F-ƭXkTSVTm1S_>supmugqa 8>! ݵ^v"Z p|C@Bz{mT){ID#VDIdۜ+4ۤ4ʹ"QQRðk ZMOF,Zab[؇X0ہ`0?,6ao@,yb0/^F`OYpP(8;V^$%'r7Y5.t\.7xHBr;egM8p8ʫ=A{Ky]Ő2dA#A 1I;͐fZ(1 G :ț *ZFtA7tAՑ4"2Kl$`Qȍ-2E/\Vp|!) MMZ`߆C y"ff e%9bDɄM6gp*6eB?'[h 50v/ey>j/`SP&pAhӧȓ撹P* $GTG(I9& v > PCUKXUπD˷h*4;mGX~*q*^O<zVS_^Zo%_bڢ;7Z؁?m@T{D4C虃!zs}U[$ -<q^8 UdbM/bvqE]A<=dz}vvnNV$.4RU$vNffե\6 T}՟AJ T17H">RTVQXر[gmq+1^w"xmp] ;!xH2 J(uzv܄0~e ʹs3f1OGpMzG{Zuz@X+k豮x_t^ٵXQ^{򂭒.4tiZu[b; a11p^{&1bwgF #uE;3,|~7 Pc&g.ivC*@>4-}RE^=:GW;_ۀVRIl]!I ~?y yEY|F7s 7j=% T ZM .%»Ў<{-@'x$=,-Y<Ԥ6XSk=)=}߭i@k;c&oXY0ɠoE?SCr;;œzh ;B5keZ\^7744l.\~~ͯe4NC5t@Y1.>؆ ;1KhFd驥;L;-7g*wE;)%q [I5Wq|B|L2/Y pyP^LWd軲VV<;=8pZ,waoY@2JjN!oJ ŐW>=x4fDǼN$j4 1':h'Ą<Nx)ؠ RyQ1ptxǘǛ ?h7cLWb_`o;Y \$VB{H柿r/]P$c3ZLXE)~y<2(M'U[TlRUX K&@TC-ݏÀw~ڄ40<0F5ϳZ Vre,dւ||tEr~,WqǐL/'nCi7W8KP 7B endstream endobj 9 0 obj <> endobj 189 0 obj <>stream xytT9txLx&U!@57+i$ɔ=3L:P"U@ (AvAP|O|s? ^~ZY9s޽<{DT>H$,Z~T7"~d5Hbطa8%?bJ "ђ[Ąhsgzp ]A u3. vpGzp^]^f:+,5vA , YAؒ"\2}UX5^k}|p1pY}yϟ0pҠqSr:3fLQ){j zK^SoP8j5r&P&Mj3DmQbj zZBMRӨerj:AfRYjj6CEQV5eC FP#)bT?ʖOR j0L Rv0ʒRP,heO@EŢ(`qqߠ--NHBf#SۏN.1 oȠ!Cm >lѰRNWO_ x|66_##n|w|VɦBm۾amm*F[n3`̡qMڑܑ f/7:UlZ:+@HYlar~]#ᘺNØ-aUzmV';,HZNJ@F% ᐦU͘ch{ϒ3_ySOh4Y>V]D^zb#,eGuPEGx29UOO?縞M r6K `!8fW~(E});u#9 `BfK$kG-|b%Q߇E^ơG 6:eGe̝nW>k:죖υ#%ݿߙ{e 8e NYxܱJ^O5jv1Xʸx60&r8;b 9vB#4ÉՇڌ쏬rru>w"t붘68HuP-)yKqt\T\lч ceAL'v (?lyq(YMtOFerf *Am!G*1,:-1-,R );Glg{YxZfdɅ9(4@.g)\dpܣ=j8n o2pyqC|6N/rH{CZ@|~lxݐ|".F]mLXm5*d7H3Lo+ {Q1г,^g'OE^S-jϽ;3'WGo RZLX<x'`h4R_(V8:cF{Dh]Ra0I/p~?KVJ$3i(UM4ЅeYۦ}wvF!@!63:J4RxP&BC1H$>M(%7,#>Dq䗕.DYf,b6z̛shNUIO&RcdؚԼ @WZvH0Mw'<ݲ5e7TF}28mr?SeiijHLTʤdʫvRZ[\) Q|O (z0=ـfKBYw묤{؂}y@v -3>%٠>z&{V6KW ]LR82Q9Od n +_U}P-%D (،D?]D+Ȏˢ1f< hNP2ZyxyT$eps SQw0K|UvD`z1@5@N/@cϯ>)ЂF͏N< 3AJaa ѿmʶcz['`*t@'⎑6E npUBT<ὮTP7yF׉CT'&%7͢2>^@ٜD"AXW5i" Jum:EAΦJ 5m V9HWYg ss}KENNEnGh<pڇ;1#ݧW.]͓i0ZΑG4NAN/v#$ʺ^wX eK "IXκh!F)uZTc=)5BnyDf:!;&(V&d(g4IȐON{}wQ#\UbO(5Z?Mr%weS}hl}J4Nnɦ{Tc<[d.L!S ټx0s8-4VՔke 9|m7-="߬@*pM¼(܅CʸT4GOZy{ÑZLQv *wzpo}/?Gp&PJ̬\uK7B]^L,(7K|TSGz5K%=Tz$sKO',:wT[ /'tBu̚X2h$iio`5#2WNhWe\wybIhb:-!O!xJHal3UQ έ>Gε:U!HPQ?haU]&4Paoa ů<O9 MG "h94> D9^"_clR1x +Cil׸uXWp5jߨ}22Jm@4%Dj5 ~'_KDF}a-d/vA]<u;T1e/nf}A?J^n2%W"roFG{܄-jgWYIcQz΢|!ߤՂ{$<^$}Tq,\gǒ[xH$ђbvX+ū#n`ܬɄ9$jdž1aR?L: e"\A->CŶB>Q2fN{BWAt; ˕2^.b 5T E;X =>; z["p҉ѻ&<9*@31]3YFuoydG9z,Oy4R,#}X;KԉYe7rNk5)g,./^_ܼ]ylC.n^-ޕ~^A+2I˵Gs̕iP 1Dn:|'sΎ)}k+Ã*kk+*H$sȮIXJqǔl'DHҟ ̢z&媍JCCGsS8D~A = m4= E~xf*Jҵ(U`&Y.-grmJ`W/! [2(`-}}^F=tmTD*U5ڏuFb,k5U ^DžFbm:̂9cNr+z{G!@HR tBlS_ئyzi!"R"&ico;J=^plc(:;DM3mώT0=;cc(1G)*ZWvNQ5x֞ʮ56p>ާB:ΊP@ 22 -»uvq.oW<Kt.uI^͂oThȬ +7 U INwk=16sUHOFNd}Rd|5z3EWт"deB Lb4͞ ?Zh($j ^韺hjYb"o*&5C%ϡ7D﫴l<g%DkFhhъV*vw4qp~ 4T&!wrxmQ ( "'j3W I#[b}i?o|6 F+%x0 eLU+ʼDz=$(oe:·\( ?>^^x']OB=qU8b%f{9i+7-Zޗ3b?o:| .0>5u;vSbtέN\^bSX%iwt?|e?#ij墍q+1ؚضja c`ܙ>i?]w7>UΏr$ˬ?l_Ȯ-1E&{.; cm'G&L1ήs,`o'g[ZOsxlls1Mp h36U[@~Gs*1q:#`QsbK 7bGzst% aJԔߑWU h\6OtvdM':1Yܱ} %UE2;-~g]Hs/V<=Gv[;U>QI Qk4`P^OdLVZz||߾yCiu1u0[8%W[!Kd@ hV9J"iR,]m}<<#lq"t}kQ<ڈ.dyGVRdrCUikxV/]<\حtx|tQ+!z-_3)؇g+@):GkEzѠ  i0 RuYt^{x(L讘"]{3$;#1b~לb@F`ˎv2Jp?ӼƖq^6j⁑BOv7&E8w"ohl"Ki'k˄eKYV2xL Wv2 Dorq~fv.RHiwC|KI|hk%hJ;1h,r#N|,# y/r!KV%A(d*QjG ٟR1Ei\&Bd^)(5u*#^Q2v$o%Wt8!y2)I´6\}js Y!7uXD(]̻+,|ۿ[0}y.,H2;W1x໺}V|/?c8OWs*.Ĕuե&tjM.!_Q[+l"+~5:Vt8vw`ӵ 𧧩򚄉,:3r/B6L꒴+5e9q ^&y MEܙI}c v8*5hT\'Ns;sކ2ɅX OKeĠz}0 G?7O_"9o̷g5LG`g>|"%ׅPiR4THѤj vYPlZ:\⺠c_YC{CPԇˑ Uf`ڮ-l%eQ ahcddn]CSώZL50KLN| Ǡr{vL0_bc?7KʊJx3/ND}{$6$K{t$D=}1Aof"{mpa2 jrff6a?S 1\'E,G7[?=\ \*J6ڰd2w&C"iKha?ڪLmJ-J&?uz]1\Da 0q?.'w?hH <qi`JMI{>mq׿l~/Xw endstream endobj 53 0 obj <> endobj 190 0 obj <>stream xeTmLSW^E5q{u b\(~M! 2 J-]VD ˇP>Gԩ[bL;æ2CskΖ'y5snb34eth{a7%+uD $,zY yz.lԅ֞}}yI;zec FM7%'U ` ~q!~nCYllTD݄cr`=FwwG'sQVd+v[uH*g"SbDӅNxYISDtޅ+nW㎋-Zڢr/LRD;L p:M'jGs|H67)xw_]tQ'\16Xye`ޫd\c97t!Aݎޒ^xy[Sxlljv8$]m Z5d"hu֥wq%(u*֧܈?!f5|Xd`w@ |II0DkS,R&0$@x y/2eWaM_Ƭ3>=)?oK`q>D`Sc!)`7pL /H/%  l3ښZԪz &[~.o0fHwŘ~+~(.!,KtQۅwF/ݸml_663$vBD9ݭך^tw_^ٛ@*H:N^Pϕģ:' $GJIw7Բx_nu%N ]6{][{0{T_S?R:vu [|VUUsxUQ[{nqfk@3{)YYSY ^ BriTYQ9EP*  endstream endobj 51 0 obj <> endobj 191 0 obj <>stream xcd`ab`dddu 21T~H3a!cO]nnu?X ~%_PYQᬩ`hiiZXX('gT)8(t+u-(-I-ROI-c```24b`b|?U |e7i|K2_te{wjwz7G ǗseSKHa;0>α)]{yYO?d ߧ~`h[gmgMCKUwm7o.]h'W\r˾K^-[L7b[%+_X:^nѾ/ts|9lk-wnccWWww6?^:{T߉7qb1ùzϽ9< n endstream endobj 49 0 obj <> endobj 192 0 obj <>stream xcd`ab`dddu 1T~H3a!ܭsO]nnu?" ~%_PYQᬩ`hiiZXX('gT)8(t+u-(-I-ROI-c```64b`ab;!a!$-Vi |R;x|/mEJkmf’Z߻f-.)Y=S;V]hQ™r|Xf|)(@.)9X#}Y8LeOבb{>&]cyYwv /K^1_=Atkf> endobj 193 0 obj <>stream xcd`ab`ddds T~H3a!Rnn ~#_PYQᬩ`hiiZXX('gT)8(t+-v-(-I-ROI-c```e LLZ|d|Sgrљ -*sdaLy?̾ Y<< L endstream endobj 45 0 obj <> endobj 194 0 obj <>stream x}}Lw(2܋eiLщFYo::Ty ^k{miyj+DeN4q[,nL_kXe,K.wy|p,>q<1+'gSƲxdv\dB{ II6V@^D8*hZHjJrpA<@](/P 7eݕj2]jFQ8UY^uLPs*  +sv,~öci,[mV`2]»jE3E񊄴x,y\[YѳEHV5MGKusu;c _' ]GJr dnq`aFy@.sqgč-zp `&m1p [[RCHuC2at> 2/y,l0Bh3Xgm]BV7`^O̲LM #k}R*F3%k`H,@&fVE@ՊkPsAp4BIC>}Ű:k5t !rP@HM Z+FtSߡb'G ','p+c GYqkŪG+~| {E3|P/}fN^Ai(0~_W|/Dogd-Q  ha SEVNUwc@w:%=C"lG&x2JŤiH?yr:/tR9=2:SfR+7V2%3JULxUUʪ~l]4I j^{+-S±]vYH PZc1IO4! ]_Gq֒m)u?)1_ 9uGy.v2nl4$m4 $c,606FV^D\ 4mοJ[LM׭vwqOҾnq̆VHpJ'V@~K6*-JjB0`x7v1_N OzlZJo \R $ endstream endobj 43 0 obj <> endobj 195 0 obj <>stream xfCMSY10%J  B=9FL[dCopyright (C) 1997 American Mathematical Society. All Rights ReservedCMSY10Computer Modernlessequalt'àO3"62" 4 .8~wx|}wwwu?  7 S]. endstream endobj 202 0 obj <>stream 2010-04-21T13:45:40+01:00 2010-04-21T13:45:40+01:00 dvips\(k\) 5.96.1 Copyright 2007 Radical Eye Software N1824.dvi endstream endobj 2 0 obj <>endobj xref 0 203 0000000000 65535 f 0000129125 00000 n 0000189176 00000 n 0000128862 00000 n 0000124158 00000 n 0000000015 00000 n 0000004299 00000 n 0000129191 00000 n 0000136120 00000 n 0000173421 00000 n 0000135477 00000 n 0000168548 00000 n 0000135136 00000 n 0000165758 00000 n 0000134085 00000 n 0000156537 00000 n 0000129232 00000 n 0000129262 00000 n 0000124318 00000 n 0000004319 00000 n 0000006418 00000 n 0000133308 00000 n 0000149757 00000 n 0000132759 00000 n 0000144459 00000 n 0000132293 00000 n 0000138201 00000 n 0000129325 00000 n 0000129355 00000 n 0000124480 00000 n 0000006439 00000 n 0000007527 00000 n 0000129429 00000 n 0000129459 00000 n 0000124642 00000 n 0000007548 00000 n 0000013473 00000 n 0000129511 00000 n 0000129541 00000 n 0000124804 00000 n 0000013494 00000 n 0000019770 00000 n 0000137940 00000 n 0000187075 00000 n 0000137692 00000 n 0000185346 00000 n 0000137461 00000 n 0000184838 00000 n 0000137290 00000 n 0000184030 00000 n 0000137133 00000 n 0000183320 00000 n 0000136810 00000 n 0000181638 00000 n 0000129615 00000 n 0000129645 00000 n 0000124974 00000 n 0000019791 00000 n 0000025244 00000 n 0000129752 00000 n 0000129782 00000 n 0000125144 00000 n 0000025265 00000 n 0000030351 00000 n 0000129856 00000 n 0000129886 00000 n 0000125314 00000 n 0000030372 00000 n 0000035599 00000 n 0000135768 00000 n 0000170743 00000 n 0000129960 00000 n 0000129990 00000 n 0000125484 00000 n 0000035620 00000 n 0000039707 00000 n 0000130075 00000 n 0000130105 00000 n 0000125646 00000 n 0000039728 00000 n 0000044959 00000 n 0000130179 00000 n 0000130209 00000 n 0000125808 00000 n 0000044980 00000 n 0000050372 00000 n 0000130272 00000 n 0000130302 00000 n 0000125970 00000 n 0000050393 00000 n 0000055443 00000 n 0000130365 00000 n 0000130395 00000 n 0000126140 00000 n 0000055464 00000 n 0000060910 00000 n 0000130458 00000 n 0000130488 00000 n 0000126310 00000 n 0000060931 00000 n 0000065706 00000 n 0000130551 00000 n 0000130582 00000 n 0000126474 00000 n 0000065728 00000 n 0000070808 00000 n 0000134828 00000 n 0000163772 00000 n 0000130646 00000 n 0000130677 00000 n 0000126640 00000 n 0000070830 00000 n 0000075337 00000 n 0000134638 00000 n 0000162485 00000 n 0000130776 00000 n 0000130807 00000 n 0000126806 00000 n 0000075359 00000 n 0000080245 00000 n 0000133574 00000 n 0000152349 00000 n 0000130917 00000 n 0000130948 00000 n 0000126972 00000 n 0000080267 00000 n 0000084205 00000 n 0000131095 00000 n 0000131126 00000 n 0000127146 00000 n 0000084227 00000 n 0000088027 00000 n 0000131214 00000 n 0000131245 00000 n 0000127320 00000 n 0000088049 00000 n 0000093411 00000 n 0000131309 00000 n 0000131340 00000 n 0000127494 00000 n 0000093433 00000 n 0000097281 00000 n 0000131452 00000 n 0000131483 00000 n 0000127668 00000 n 0000097303 00000 n 0000101946 00000 n 0000131536 00000 n 0000131567 00000 n 0000127842 00000 n 0000101968 00000 n 0000107129 00000 n 0000131666 00000 n 0000131697 00000 n 0000128016 00000 n 0000107151 00000 n 0000109257 00000 n 0000131761 00000 n 0000131792 00000 n 0000128182 00000 n 0000109279 00000 n 0000113884 00000 n 0000131845 00000 n 0000131876 00000 n 0000128356 00000 n 0000113906 00000 n 0000119154 00000 n 0000131940 00000 n 0000131971 00000 n 0000128530 00000 n 0000119176 00000 n 0000123439 00000 n 0000132068 00000 n 0000132099 00000 n 0000128696 00000 n 0000123461 00000 n 0000124137 00000 n 0000132209 00000 n 0000132240 00000 n 0000138721 00000 n 0000144829 00000 n 0000150023 00000 n 0000152673 00000 n 0000156927 00000 n 0000162721 00000 n 0000164034 00000 n 0000166037 00000 n 0000168801 00000 n 0000171025 00000 n 0000173941 00000 n 0000181932 00000 n 0000183534 00000 n 0000184256 00000 n 0000185034 00000 n 0000185590 00000 n 0000187289 00000 n 0000133223 00000 n 0000134000 00000 n 0000134552 00000 n 0000136644 00000 n 0000137605 00000 n 0000138099 00000 n 0000187743 00000 n trailer << /Size 203 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 189381 %%EOF