#wig=Pu+; {QF64\CmӆͿ@>{Rw*Bi.WM5G1ƅ,gBaUPeNM@#S<:CAd~ zFryRkMOJiPl)wD@&Ӟ#tYEnœ?0~sݙ{wVB: aPN`^o1abj +6Y1ND[ᖜp?P#Wo?UAHv^%ֿ\ lE`" C](e?4uq?K"%ґoWC/_`A"ˑ<*Kk{h39r QW9CxdTܬt.A(/ X6G/..!^-2WN:B7LeF:qZ] |NNTN}E.ǟ_|P3$Uqཕ珮nueKY9ڬKl&.7`W|%}0t*]Er%'ؤLX`; eUV 3He ݩ(farI4M0QZ!"ŀ#H)ns/`#U>PWGaXLrB*cle_q T ă:uKnΪ uM؛UۀIړ.+|3J׹ٮ(<}hd0cv'.I`+GXP I6}I|H&sD5 y,SDD Mu !KpyTgj8Ԕ`G&Fr)xYM1޾F{yRswZTxŗoIPDKeC Qlcs5R yY^?G(6We\o=ҖL>cA˰c뼜qpXʁ)kZMQ@?٠U/*Z&e"åfHmSlHtӌDI?Q.FYr:غ:hUlpDFwM)yIܠoD:+q<$.MAވMX+ppu0ojNOq3EbS*( U(LnL# 6L񜰢&-9PG !Pnj5PPdΥwcaO0S^|ۅ<΅כPyFj ߒ#L`@3{bU]KjXϤCّ 6.et%3-ƶRcJAYf=Yҝ `gB+#[gIvOwҋa臸#g5~NL)88/QNp̭%LA֤ <>>nۋ ,Vƫ(.x)Z@$d.)b !pX7Ѣ9U/c #pۏ8ӽMuŠvy>>IC& y9gIaη*nQְ ?s2ңo;5?h.!bsO%d- j n@w=#sa M4$&b6{tHR=f+kH[; h=QXD@/;ϻ vаW3%@XkE@c7fK][}-8Zke+য়lfZƺQTG/0 ORMMJJJ6c^ ƪOg}UQ`"^Cd ^W= ,ť@Z@ J~88]`[H_PrmAUAؑ:v`Al~MDK*a]U -E8r v[a5*xu?l@/J*9G |@o!Ob~L}%iTxOS WzI^h1Z0אe=ECVERAippu057􀐍C0)z! Fk.v<0Y8!ԨC$j.c Q>TpOai 0 +=Upn( ([.AsH Ѐϛ-k\"d;0Wj"`_P! 6TGץ`5h٦[+so7uYs7B* bnH8*$oTP`lBN/YUҭ[&F 7Dg5 M:@.2c^C;LU@q' NסDzl0gĊZnE?n!ls@";ѽ<k^˃K&h 8<#Kt@vLfFH&p)WhbQH׎^HՈTN^ZBp]͔)A0bg" RHU|f ]XA1oNc/kDEi ~T U1:=$hK,qT X[3H72-|,ߪsbnˡ7VZm;xJ2J ٌK|n =\'GpQke g\W^h~H/Nĵ^',ô-%ZeP^lƙwt%3-QT@OO#/(@u2S.2F@J^xZx s[N {I=;.Ӱ#T,Q7?7Rb:D#eR2q[p J=,ڀU_5;ustream); if ($position === false) { throw new RuntimeException; } return $position; } /** * Returns true if the stream is at the end of the stream. * * @return bool */ public function eof(): bool { return feof($this->stream); } /** * Seek to the beginning of the stream. * * If the stream is not seekable, this method will raise an exception; * otherwise, it will perform a seek(0). * * @see seek() * @link http://www.php.net/manual/en/function.fseek.php * @throws RuntimeException on failure. */ public function rewind(): void { $this->seek(0); } /** * Write data to the stream. * * @param string $string The string that is to be written. * @return int Returns the number of bytes written to the stream. * @throws RuntimeException on failure. */ public function write($string): int { if (!$this->isWritable()) { throw new RuntimeException; } if (fwrite($this->stream, $string) === false) { throw new RuntimeException; } return \mb_strlen($string); } /** * Returns whether or not the stream is writable. * * @return bool */ public function isWritable(): bool { $mode = $this->getMetadata('mode'); if (!is_string($mode)) { throw new RuntimeException('Could not get stream mode from metadata!'); } return preg_match('/[waxc+]/', $mode) === 1; } /** * Read data from the stream. * * @param int $length Read up to $length bytes from the object and return * them. Fewer than $length bytes may be returned if underlying stream * call returns fewer bytes. * @return string Returns the data read from the stream, or an empty string * if no bytes are available. * @throws \RuntimeException if an error occurs. */ public function read($length): string { if (!$this->isReadable()) { throw new RuntimeException; } $result = fread($this->stream, $length); if ($result === false) { throw new RuntimeException; } return $result; } /** * Returns whether or not the stream is readable. * * @return bool */ public function isReadable(): bool { $mode = $this->getMetadata('mode'); if (!is_string($mode)) { throw new RuntimeException('Could not get stream mode from metadata!'); } return preg_match('/[r+]/', $mode) === 1; } /** * Returns the remaining contents in a string * * @return string * @throws \RuntimeException if unable to read or an error occurs while * reading. */ public function getContents(): string { if (!$this->isReadable()) { throw new RuntimeException; } $result = stream_get_contents($this->stream); if ($result === false) { throw new RuntimeException; } return $result; } }