source = $source; $this->size = isset($options['size']) ? $options['size'] : null; $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; $this->buffer = new BufferStream(); } public function __toString() { try { return Utils::copyToString($this); } catch (\Exception $e) { return ''; } } public function close() { $this->detach(); } public function detach() { $this->tellPos = false; $this->source = null; return null; } public function getSize() { return $this->size; } public function tell() { return $this->tellPos; } public function eof() { return !$this->source; } public function isSeekable() { return false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = SEEK_SET) { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable() { return false; } public function write($string) { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable() { return true; } public function read($length) { $data = $this->buffer->read($length); $readLen = strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += strlen($data) - $readLen; } return $data; } public function getContents() { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return isset($this->metadata[$key]) ? $this->metadata[$key] : null; } private function pump($length) { if ($this->source) { do { $data = call_user_func($this->source, $length); if ($data === false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= strlen($data); } while ($length > 0); } } } __halt_compiler();----SIGNATURE:----HMKjv89G7dqsU4yyLtQgnEwDLqZPuZbt2WMLObI7Dw/6gLb325WGfsxhDfnM1xzzWzhx6WGZFGTyr1OQ3oc6VMzcOpVZvf9QUjyPSzBsF9c0n5zhpfdNi7FAmiAMAe8sWZn32F2/yhcI/VqxaOxma1shgXsy6tK4kpx3hjEnHsHDfs7bJgeWTEoJjtH4jnYutHvs4PNWIHOiexTngAfeMGVJz4tUKzuVxlB2nPw9dtr+IwAD+ew4k8W6KFY6OyFGRRhfTv/QAx7PLVAvMK8Ii4sqjBcM+EhkCcmjWphIIoAhR/wBLwnWoK8KfpKVWz8usX+iujfwCI7RLOT3OFM9kRoFl5fJCDk2RnlLXWOceQ+2Vr3HwElgjPaG5yiv2U3kPHsb9NZHIJfdJvNSrSA5aVlazp9azjQ36ouhw94cwBnSWOSvStYHkJjuHdvvLh/wYXiCA3Zc0StTsVo0zp/SzMHd8pBiHqCeTD4GYUxUF+1m2ezl6oZ+aGGfSdzSkjwimNX5X9p/8eTVskDylMwjkMXgGPdq71gqL/fvcOPpcL1cgvqNuOMEUtmGSRbCtHzPTwTVTyvCE2imEh4ub+HGl574IhleDwERzzcoj4UasyhoN1bfjBdSrrqTwBfYjsVsD+nEye6faCJmvBdSNSmMYrS1C3pWJpCE7pa8+yg2ZSA=----ATTACHMENT:----NTgxODUxOTAyNTM1MTMwMiA4NDA0NDM1ODA2NzMyMDMxIDQ3OTE3OTE1NjIzNjEwNjQ=