code: func (s *SACKScoreboard) IsLost(r header.SACKBlock) bool {
  	nDupSACK := 0
  	nDupSACKBytes := seqnum.Size(0)
  	isLost := false
  	s.ranges.AscendGreaterOrEqual(r, func(i btree.Item) bool {
  		sacked := i.(header.SACKBlock)
  		if sacked.Contains(r) {
  			return false
  		}
  		nDupSACKBytes += sacked.Start.Size(sacked.End)
  		nDupSACK++
  		if nDupSACK >= nDupAckThreshold || nDupSACKBytes >= seqnum.Size((nDupAckThreshold-1)*s.smss) {
  			isLost = true
  			return false
  		}
  		return true
  	})
  	return isLost
  }
docs: // IsLost implements the IsLost(SeqNum) operation defined in RFC 3517 section 4.
  //
  // This routine returns whether the given sequence number is considered to be
  // lost. The routine returns true when either nDupAckThreshold discontiguous
  // SACKed sequences have arrived above 'SeqNum' or (nDupAckThreshold * SMSS)
  // bytes with sequence numbers greater than 'SeqNum' have been SACKed.
  // Otherwise, the routine returns false.