<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_ipv6_opts(self, length, extension):
 """Read Destination Options for IPv6. Structure of IPv6-Opts header [RFC 8200]: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Next Header | Hdr Ext Len | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | . . . Options . . . | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Octets Bits Name Description 0 0 opt.next Next Header 1 8 opt.length Header Extensive Length 2 16 opt.options Options """

        if length is None:
            length = len(self)

        _next = self._read_protos(1)
        _hlen = self._read_unpack(1)
        # _opts = self._read_fileng(_hlen*8+6)

        ipv6_opts = dict(
            next=_next,
            length=(_hlen + 1) * 8,
        )

        options = self._read_ipv6_opts_options(_hlen * 8 + 6)
        ipv6_opts['options'] = options[0]       # tuple of option acronyms
        ipv6_opts.update(options[1])            # merge option info to buffer

        length -= ipv6_opts['length']
        ipv6_opts['packet'] = self._read_packet(header=ipv6_opts['length'], payload=length)

        if extension:
            self._protos = None
            return ipv6_opts
        return self._decode_next_layer(ipv6_opts, _next, length)