def read(self, address, size, force=False):
size = self._get_size(size)<EOL>assert not issymbolic(size)<EOL>if issymbolic(address):<EOL><INDENT>assert solver.check(self.constraints)<EOL>logger.debug(f'<STR_LIT>')<EOL>try:<EOL><INDENT>solutions = self._try_get_solutions(address, size, '<STR_LIT:r>', force=force)<EOL>assert len(solutions) > <NUM_LIT:0><EOL><DEDENT>except TooManySolutions as e:<EOL><INDENT>m, M = solver.minmax(self.constraints, address)<EOL>logger.debug(f'<STR_LIT>')<EOL>crashing_condition = True<EOL>for start, end, perms, offset, name in self.mappings():<EOL><INDENT>if start <= M + size and end >= m:<EOL><INDENT>if '<STR_LIT:r>' in perms:<EOL><INDENT>crashing_condition = Operators.AND(Operators.OR((address + size).ult(start), address.uge(end)), crashing_condition)<EOL><DEDENT><DEDENT><DEDENT>if solver.can_be_true(self.constraints, crashing_condition):<EOL><INDENT>raise InvalidSymbolicMemoryAccess(address, '<STR_LIT:r>', size, crashing_condition)<EOL><DEDENT>logger.info('<STR_LIT>')<EOL>condition = False<EOL>for base in e.solutions:<EOL><INDENT>condition = Operators.OR(address == base, condition)<EOL><DEDENT>from .state import ForkState<EOL>raise ForkState("<STR_LIT>", condition)<EOL><DEDENT>condition = False<EOL>for base in solutions:<EOL><INDENT>condition = Operators.OR(address == base, condition)<EOL><DEDENT>result = []<EOL>for offset in range(size):<EOL><INDENT>for base in solutions:<EOL><INDENT>addr_value = base + offset<EOL>byte = Operators.ORD(self.map_containing(addr_value)[addr_value])<EOL>if addr_value in self._symbols:<EOL><INDENT>for condition, value in self._symbols[addr_value]:<EOL><INDENT>byte = Operators.ITEBV(<NUM_LIT:8>, condition, Operators.ORD(value), byte)<EOL><DEDENT><DEDENT>if len(result) > offset:<EOL><INDENT>result[offset] = Operators.ITEBV(<NUM_LIT:8>, address == base, byte, result[offset])<EOL><DEDENT>else:<EOL><INDENT>result.append(byte)<EOL><DEDENT>assert len(result) == offset + <NUM_LIT:1><EOL><DEDENT><DEDENT>return list(map(Operators.CHR, result))<EOL><DEDENT>else:<EOL><INDENT>result = list(map(Operators.ORD, super().read(address, size, force)))<EOL>for offset in range(size):<EOL><INDENT>if address + offset in self._symbols:<EOL><INDENT>for condition, value in self._symbols[address + offset]:<EOL><INDENT>if condition is True:<EOL><INDENT>result[offset] = Operators.ORD(value)<EOL><DEDENT>else:<EOL><INDENT>result[offset] = Operators.ITEBV(<NUM_LIT:8>, condition, Operators.ORD(value), result[offset])<EOL><DEDENT><DEDENT><DEDENT><DEDENT>return list(map(Operators.CHR, result))<EOL><DEDENT>
Read a stream of potentially symbolic bytes from a potentially symbolic
address

:param address: Where to read from
:param size: How many bytes
:param force: Whether to ignore permissions
:rtype: list