+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use IO::Handle;
+
+our %flag;
+our @order, @order_final_maybe;
+
+while (@ARGV && $ARGV[0] =~ m/^\-/) {
+ $_ = shift @ARGV;
+ if (s/^-U//) {
+ $flag{$_}{Result} = 0;
+ push @order_final_maybe, $_;
+ } elsif (s/^-D//) {
+ $flag{$_}{Result} = 1;
+ push @order_final_maybe, $_;
+ } elsif (m/^--$/) {
+ last;
+ } else {
+ die "$0: bad option\n";
+ }
+}
+
+@ARGV==3 or die "$0: bad usage\n";
+
+foreach my $ix (qw(0 1 2)) {
+ open F, '<', $ARGV[$ix] or die "$ix $!";
+ while (<F>) {
+ chomp or die;
+ $flag{$_}{Input}[$ix] = 1;
+ my $ff = $flag{$_};
+ push @order, $_ unless $ff->{InOrder}++;
+ }
+ F->error and die $!;
+ close F or die $!;
+}
+
+foreach $_ (@order_final_maybe) {
+ push @order, $_ unless $flags{$_}{InOrder}++;
+}
+
+open O, '>', "$current.tmp" or die "$current.tmp $!";
+
+foreach $_ (@order) {
+ my $ff = $flag{$_};
+ if (!defined $ff->{Result}) {
+ my $s = '';
+ foreach my $ix (qw(0 1 2)) {
+ $ff->{Input}[$ix] ||= 1;
+ $s .= $ff->{Input}[$ix];
+ }
+ $ff->{Result} =
+ $s eq '000' ? '000' :
+ $s eq '111' ? '111' :
+ $ff->{Input}[1];
+ }
+ if ($ff->{Result}) {
+ print O "$_\n" or die $!;
+ }
+}
+
+close O or die $!;
+rename "$current.tmp", "$current" or die "$current $!";
+exit 0;