code: func take(tokens int, ls ...*rate.Limiter) {
  	// minBurst is the smallest burst size supported by all limiters.
  	minBurst := int(math.MaxInt32)
  	for _, l := range ls {
  		if burst := l.Burst(); burst < minBurst {
  			minBurst = burst
  		}
  	}
  
  	for tokens > 0 {
  		// chunk is how many tokens we can consume at a time
  		chunk := tokens
  		if chunk > minBurst {
  			chunk = minBurst
  		}
  
  		// maxDelay is the longest delay mandated by any of the limiters for
  		// the chosen chunk size.
  		var maxDelay time.Duration
  		for _, l := range ls {
  			res := l.ReserveN(time.Now(), chunk)
  			if del := res.Delay(); del > maxDelay {
  				maxDelay = del
  			}
  		}
  
  		time.Sleep(maxDelay)
  		tokens -= chunk
  	}
  }
docs: // take is a utility function to consume tokens from a set of rate.Limiters.
  // Tokens are consumed in parallel on all limiters, respecting their
  // individual burst sizes.