code: func (d *state) Read(out []byte) (n int, err error) {
  	// If we're still absorbing, pad and apply the permutation.
  	if d.state == spongeAbsorbing {
  		d.padAndPermute(d.dsbyte)
  	}
  
  	n = len(out)
  
  	// Now, do the squeezing.
  	for len(out) > 0 {
  		n := copy(out, d.buf)
  		d.buf = d.buf[n:]
  		out = out[n:]
  
  		// Apply the permutation if we've squeezed the sponge dry.
  		if len(d.buf) == 0 {
  			d.permute()
  		}
  	}
  
  	return
  }
docs: // Read squeezes an arbitrary number of bytes from the sponge.