// Test that binfos aren't erroneously shared between instantiations.

class PK_CryptoSystem
{
};
class PK_Encryptor : public virtual PK_CryptoSystem
{
};
class PK_FixedLengthCryptoSystem : public virtual PK_CryptoSystem
{
public:
	virtual unsigned int CipherTextLength() const =0;
};
class PK_FixedLengthEncryptor : public virtual PK_Encryptor, public virtual PK_FixedLengthCryptoSystem
{
};
class PK_SignatureSystem
{
public:
	virtual ~PK_SignatureSystem() {};
};
class PK_Signer : public virtual PK_SignatureSystem
{
public:
	virtual void Sign() = 0;
};
class PK_Verifier : public virtual PK_SignatureSystem
{
};
class PK_Precomputation
{
};
template <class T> class
PK_WithPrecomputation : public T, public virtual PK_Precomputation
{
};
typedef PK_WithPrecomputation<PK_FixedLengthEncryptor> PKWPFLE;
typedef PK_WithPrecomputation<PK_Signer> PKWPS;
template <class EC> class
ECPublicKey : public PKWPFLE
{
public:
	unsigned int CipherTextLength() const { return 1; }
	EC ec;
};
template <class EC>
class ECPrivateKey : public ECPublicKey<EC>, public PKWPS
{
	void Sign() {}
	int d;
};
template <class EC>
class ECKEP : public ECPrivateKey<EC>
{
};
class GF2NT : public PK_CryptoSystem
{
	int t1;
};
class EC2N : public PK_CryptoSystem
{
	GF2NT field;
	int a;
};
template class ECKEP<EC2N>;
template class ECKEP<int>;

int
main ()
{
  ECKEP<EC2N> foo;

  return 0;
}

