| 
					
				 | 
			
			
				@@ -27,6 +27,7 @@ static void online_test(MPCIO &mpcio, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegXS *AX = new RegXS[xs_memsize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     value_t V; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegBS F0, F1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegBS FA, FO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegXS X; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!is_server) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -73,6 +74,14 @@ static void online_test(MPCIO &mpcio, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [&tio, &AX, &F0, nbits](yield_t &yield) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mpc_select(tio, yield, AX[2], F0, AX[0], AX[1], nbits); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    coroutines.emplace_back( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [&tio, &FA, &F0, &F1, nbits](yield_t &yield) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mpc_and(tio, yield, FA, F0, F1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    coroutines.emplace_back( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [&tio, &FO, &F0, &F1, nbits](yield_t &yield) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mpc_or(tio, yield, FO, F0, F1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     run_coroutines(tio, coroutines); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!is_server) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("\n"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,33 +96,43 @@ static void online_test(MPCIO &mpcio, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.queue_peer(&V, sizeof(V)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.queue_peer(&F0, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.queue_peer(&F1, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.queue_peer(&FA, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.queue_peer(&FO, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.queue_peer(&X, sizeof(RegXS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.send(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else if (mpcio.player == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         RegAS *B = new RegAS[as_memsize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         RegXS *BAX = new RegXS[xs_memsize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         RegBS BF0, BF1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RegBS BFA, BFO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         RegXS BX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         value_t BV; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         value_t *S = new value_t[as_memsize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         value_t *Y = new value_t[xs_memsize]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         bit_t SF0, SF1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        bit_t SFA, SFO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         value_t SX; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.recv_peer(B, as_memsize*sizeof(RegAS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.recv_peer(BAX, xs_memsize*sizeof(RegXS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.recv_peer(&BV, sizeof(BV)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.recv_peer(&BF0, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.recv_peer(&BF1, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.recv_peer(&BFA, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.recv_peer(&BFO, sizeof(RegBS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tio.recv_peer(&BX, sizeof(RegXS)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for(size_t i=0; i<as_memsize; ++i) S[i] = A[i].ashare+B[i].ashare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for(size_t i=0; i<xs_memsize; ++i) Y[i] = AX[i].xshare^BAX[i].xshare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         SF0 = F0.bshare ^ BF0.bshare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         SF1 = F1.bshare ^ BF1.bshare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SFA = FA.bshare ^ BFA.bshare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SFO = FO.bshare ^ BFO.bshare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         SX = X.xshare ^ BX.xshare; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("S:\n"); for (size_t i=0; i<as_memsize; ++i) printf("%3lu: %016lX\n", i, S[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("Y:\n"); for (size_t i=0; i<xs_memsize; ++i) printf("%3lu: %016lX\n", i, Y[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("SF0: %01X\n", SF0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("SF1: %01X\n", SF1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        printf("SFA: %01X\n", SFA); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        printf("SFO: %01X\n", SFO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("SX : %016lX\n", SX); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("\n%016lx\n", S[0]*S[1]-S[2]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         printf("%016lx\n", (V*BV)-S[3]); 
			 |