code: func (s *Serf) relayResponse(relayFactor uint8, addr net.UDPAddr, resp *messageQueryResponse) error {
  	if relayFactor == 0 {
  		return nil
  	}
  
  	// Needs to be worth it; we need to have at least relayFactor *other*
  	// nodes. If you have a tiny cluster then the relayFactor shouldn't
  	// be needed.
  	members := s.Members()
  	if len(members) < int(relayFactor)+1 {
  		return nil
  	}
  
  	// Prep the relay message, which is a wrapped version of the original.
  	raw, err := encodeRelayMessage(messageQueryResponseType, addr, &resp)
  	if err != nil {
  		return fmt.Errorf("failed to format relayed response: %v", err)
  	}
  	if len(raw) > s.config.QueryResponseSizeLimit {
  		return fmt.Errorf("relayed response exceeds limit of %d bytes", s.config.QueryResponseSizeLimit)
  	}
  
  	// Relay to a random set of peers.
  	localName := s.LocalMember().Name
  	relayMembers := kRandomMembers(int(relayFactor), members, func(m Member) bool {
  		return m.Status != StatusAlive || m.ProtocolMax < 5 || m.Name == localName
  	})
  	for _, m := range relayMembers {
  		relayAddr := net.UDPAddr{IP: m.Addr, Port: int(m.Port)}
  		if err := s.memberlist.SendTo(&relayAddr, raw); err != nil {
  			return fmt.Errorf("failed to send relay response: %v", err)
  		}
  	}
  	return nil
  }
docs: // relayResponse will relay a copy of the given response to up to relayFactor
  // other members.