docs: async def _receive_forward_tsn_chunk(self, chunk):
          """
          Handle a FORWARD TSN chunk.
          """
          self._sack_needed = True
  
          # it's a duplicate
          if uint32_gte(self._last_received_tsn, chunk.cumulative_tsn):
              return
  
          def is_obsolete(x):
              return uint32_gt(x, self._last_received_tsn)
  
          # advance cumulative TSN
          self._last_received_tsn = chunk.cumulative_tsn
          self._sack_misordered = set(filter(is_obsolete, self._sack_misordered))
          for tsn in sorted(self._sack_misordered):
              if tsn == tsn_plus_one(self._last_received_tsn):
                  self._last_received_tsn = tsn
              else:
                  break
  
          # filter out obsolete entries
          self._sack_duplicates = list(filter(is_obsolete, self._sack_duplicates))
          self._sack_misordered = set(filter(is_obsolete, self._sack_misordered))
  
          # update reassembly
          for stream_id, stream_seq in chunk.streams:
              inbound_stream = self._get_inbound_stream(stream_id)
  
              # advance sequence number and perform delivery
              inbound_stream.sequence_number = uint16_add(stream_seq, 1)
              for message in inbound_stream.pop_messages():
                  self._advertised_rwnd += len(message[2])
                  await self._receive(*message)
  
          # prune obsolete chunks
          for stream_id, inbound_stream in self._inbound_streams.items():
              self._advertised_rwnd += inbound_stream.prune_chunks(self._last_received_tsn)