code: func (e *G1) Unmarshal(m []byte) ([]byte, error) {
  	// Each value is a 256-bit number.
  	const numBytes = 256 / 8
  	if len(m) != 2*numBytes {
  		return nil, errors.New("bn256: not enough data")
  	}
  	// Unmarshal the points and check their caps
  	if e.p == nil {
  		e.p = newCurvePoint(nil)
  	}
  	e.p.x.SetBytes(m[0*numBytes : 1*numBytes])
  	if e.p.x.Cmp(P) >= 0 {
  		return nil, errors.New("bn256: coordinate exceeds modulus")
  	}
  	e.p.y.SetBytes(m[1*numBytes : 2*numBytes])
  	if e.p.y.Cmp(P) >= 0 {
  		return nil, errors.New("bn256: coordinate exceeds modulus")
  	}
  	// Ensure the point is on the curve
  	if e.p.x.Sign() == 0 && e.p.y.Sign() == 0 {
  		// This is the point at infinity.
  		e.p.y.SetInt64(1)
  		e.p.z.SetInt64(0)
  		e.p.t.SetInt64(0)
  	} else {
  		e.p.z.SetInt64(1)
  		e.p.t.SetInt64(1)
  
  		if !e.p.IsOnCurve() {
  			return nil, errors.New("bn256: malformed point")
  		}
  	}
  	return m[2*numBytes:], nil
  }
docs: // Unmarshal sets e to the result of converting the output of Marshal back into
  // a group element and then returns e.