nfTlWNl rn Ѻq$³*%yNk9SVBŹ!SOY˯ID Ѻq$³*%yNk9S8jnM/=Q_dz~'@ P-;:֔|4W٤D̲#cڒr_(TD]ͫ\]*uQlf[*6tdM|砞EAVy<*NVGTrny@Yhgn&aIYu.rN J$\8'b\Ԫ<+4*y?83?z+{xM,A yrLԿ*CL1OMɼI7V:' 8Aq'ϥiu xe:SLaX 7FX",fs'ʢr" Pbea1ֆʆZz=I\&Փ8_Q?z"jT;NT3zZIP2_wpmFzlZK|qpx҅6(g"*grzcJ&s&,ϴrum] 튶,¿կ vG{hٕ9`˞ƗDHs#)q5Κ3Qݾ}[Lɶns 5-X pX7<[ J _ Ck_#% Cʈ fOh-"5TTc͉Y֟`?>CGEA]GGI@V$Xjsؿ} @:^WxXޏEu@{3xjre /fd, ĢQ$3L[>UbS4gnt~0oP w q( ~Wq 6h/]!a*x|nB? ĢQ$3S ۙ|я *[Gbh< zٗ?aiMReۀ@}Ќ{d^$T1L*,@3*񿎐4yʼ/n.,7 ڊY;Ue#騹W!&3 I]C63 ĢQ$3*0Emf'Pk<%2 B`[FC\G]¸`sp;$##QhN@/}t=o6䟲-jІ/e=!V/q3Qָ X$o(U}E ĢQ$3ӪU>vtC:{%.n6 5;]"C+%YnTA ĢQ$3s0}&1X2rwָ X$o(U}E ĢQ$3Pu}pd|#ώi+Z ĢQ$3,VQ6J-V3PUtx|o WfT:7C\hP`կ9 R!qEYc{ ^ ĢQ$3EWڎ3rvz(Iw}U!޵Gh-W{/ ĢQ$3GO5-nݞCָ X$o(U}E .{zŕz&gc*zH^XYr< ĢQ$3Z enKeO寍_9ΰ6M̀='qo)ޠx ĢQ$3B  !cm3B;*DOz{ @rhyNtw;S[EkI*|0rS;QadVD$' 2gێLAft<}f28@ˢn~ \ !c|כ z޾!o+loxY8FlD5X:$qH?eO4AlI R"F;eHѫDQ&_aD^4pleIrwRV +xӫU |/v)NGCX~mrk+bf o#-b1I q/dʥ n/]yt6|*׺b%g'~>#@C|etVux_]IzxʗQJDgL,GoJr.8:3jvhm2.:)B{3!|c[~^ ða)o.tԵ!4*]|Ⱥv2ۍ˕3,IL,l3D<˟X&ocqpCrG(wltmWYe}g{cLhQ);?BN7e #ˮ&ocqpCrGJrݤkv^h49k{Fwt85o76|ՂYa$od 2GX.¶u/1٦V>MjpWc)9-%L㈼QI.͏#v'mA#D8>4gtHw?]lmy/d)yrqQ 'vKd\*ʺ;Pb:d˔]K?B%ݥ܋t12WaH%lgqiht (uE,|0_Zc7P$`m;kV8ɳ8xTL.N6ΡHs:ݖ z4 =-J[zy:CSqpUZ4pP|pw !^@Y{b(4N,6NpZcnKH(Qױ5+0~KhZ4ӠڦlEoq"ES4r8|=B;Np7J8"U/ye[Je6d )J8TJQ9# ; MnU jl3]Yt%A2膽aF3s;qg5j#Ơ]#vB7)󘍟|2@=" hsm"kX˶V@m(\}TOiG7s>@:a7*QLkr7UkJ[NU- KR3JV@"*}!qJ=2 }d96CMހ6?FHm8EC` Z(McJ "_i$S./Y7U[cMC)ܷoLV%qu/%b*-r%&_qg;*(n.DL_U<*oQps5b9& gwɩtDwe3c$Ҷ?vA4igve%o-T8lx=f#.L,qs sSx#+ꁥHjk(;OLEd l"6PKI!Y~TL[_'(0:q,\wE)^p:aQOuHڮ&@EWZ1!kzGԋm9ZN9&|V։`I4t\i߼_Lzg"w{-X`+s3AOqlo}(A'e:^4GB~tH s[ņ(ʪ9Js,/Ֆ\My  b+=r&)); if (!is_numeric($daysBetweenFirstInterestAndSettlement)) { // return date error return $daysBetweenFirstInterestAndSettlement; } return $parValue * $rate * $daysBetweenIssueAndSettlement; } /** * ACCRINTM. * * Returns the accrued interest for a security that pays interest at maturity. * * Excel Function: * ACCRINTM(issue,settlement,rate[,par[,basis]]) * * @param mixed $issue The security's issue date * @param mixed $settlement The security's settlement (or maturity) date * @param mixed $rate The security's annual coupon rate * @param mixed $parValue The security's par value. * If you omit parValue, ACCRINT uses $1,000. * @param mixed $basis The type of day count to use. * 0 or omitted US (NASD) 30/360 * 1 Actual/actual * 2 Actual/360 * 3 Actual/365 * 4 European 30/360 * * @return float|string Result, or a string containing an error */ public static function atMaturity( $issue, $settlement, $rate, $parValue = 1000, $basis = FinancialConstants::BASIS_DAYS_PER_YEAR_NASD ) { $issue = Functions::flattenSingleValue($issue); $settlement = Functions::flattenSingleValue($settlement); $rate = Functions::flattenSingleValue($rate); $parValue = ($parValue === null) ? 1000 : Functions::flattenSingleValue($parValue); $basis = ($basis === null) ? FinancialConstants::BASIS_DAYS_PER_YEAR_NASD : Functions::flattenSingleValue($basis); try { $issue = SecurityValidations::validateIssueDate($issue); $settlement = SecurityValidations::validateSettlementDate($settlement); SecurityValidations::validateSecurityPeriod($issue, $settlement); $rate = SecurityValidations::validateRate($rate); $parValue = SecurityValidations::validateParValue($parValue); $basis = SecurityValidations::validateBasis($basis); } catch (Exception $e) { return $e->getMessage(); } $daysBetweenIssueAndSettlement = Functions::scalar(YearFrac::fraction($issue, $settlement, $basis)); if (!is_numeric($daysBetweenIssueAndSettlement)) { // return date error return $daysBetweenIssueAndSettlement; } return $parValue * $rate * $daysBetweenIssueAndSettlement; } /** @param mixed $arg */ private static function doNothing($arg): bool { return (bool) $arg; } }