protected EncryptedBlobInfo findEncryptedBitprint( byte[] inputBitprint ) throws IOException {
		byte[] key = hashKeyForMapKey(inputBitprint, 0);
		if( !mapFile.exists() ) return null;
		
		FileInputStream fis = new FileInputStream(mapFile);
		final int hashSize = BitprintDigest.HASH_SIZE;
		final int recordSize = hashSize*2;
		byte[] buf = new byte[recordSize];
		findKey: while( readFully(fis, buf) == recordSize ) {
			for( int z=0; z<hashSize-8; ++z ) {
				if( key[z] != buf[z] ) continue findKey;
			}
			long length =
				((long)((key[hashSize-1]^buf[hashSize-1]) & 0xFF) <<  0) |
				((long)((key[hashSize-2]^buf[hashSize-2]) & 0xFF) <<  8) |
				((long)((key[hashSize-3]^buf[hashSize-3]) & 0xFF) << 16) |
				((long)((key[hashSize-4]^buf[hashSize-4]) & 0xFF) << 24) |
				((long)((key[hashSize-5]^buf[hashSize-5]) & 0xFF) << 32) |
				((long)((key[hashSize-6]^buf[hashSize-6]) & 0xFF) << 40) |
				((long)((key[hashSize-7]^buf[hashSize-7]) & 0xFF) << 48) |
				((long)((key[hashSize-8]^buf[hashSize-8]) & 0xFF) << 56);
			
			byte[] mapped = new byte[hashSize];
			byte[] dec = hashKeyForMapValueEncryption(inputBitprint);
			for( int z=0; z<hashSize; ++z ) {
				mapped[z] = (byte)(buf[z+hashSize] ^ dec[z]);
			}
			return new EncryptedBlobInfo(mapped, length);
		}
		return null;
	}