<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def read(self, subpath=None):
 """ Returns the UTF-8 content of the specified subpath. subpath is expected to already have been normalized. Raises ReadmeNotFoundError if a README for the specified subpath does not exist. Raises werkzeug.exceptions.NotFound if the resulting path would fall out of the root directory. """

        is_binary = self.is_binary(subpath)
        filename = self.readme_for(subpath)
        try:
            if is_binary:
                return self._read_binary(filename)
            return self._read_text(filename)
        # OSError for Python 3 base class, EnvironmentError for Python 2
        except (OSError, EnvironmentError) as ex:
            if ex.errno == errno.ENOENT:
                raise ReadmeNotFoundError(filename)
            raise