use warnings;
my @iparray = ( "ab" , "bd" , "d" ) ;
my @sortedarray = sort ( @iparray ) ; my @oparray ;
my $lowerlimit = 0 ;
my $upperlimit = 0 ;
my $count = 0 ;
my $inc = 1 ;
my $mat = 0 ;
my $matchedstring ;
my @regexarray ;
sub shrink
{
my $low = 0 ;
my $up = 1 ;
my $len = scalar @sortedarray ; my $inc = 1 ;
for ( ; $inc < $len ; $inc ++ )
{
if ( $sortedarray [ $low ] eq $sortedarray [ $up ] )
{
splice ( @sortedarray , $up , 1 ) ; }
else
{
$up ++;
$low ++;
}
}
}
sub regexp
{
my $inc = 0 ;
my $regex ;
if ( length ( $matchedstring ne "" ) ) {
$regex = $matchedstring . '[' ;
}
else
{
$regex = '[' ;
}
for ( ; $inc < scalar ( @oparray ) ; $inc ++ ) {
$regex = $regex . $oparray [ $inc ] ;
if ( ( $inc + 1 ) < scalar ( @oparray ) ) {
$regex = $regex . '|' ;
}
}
$regex = $regex . ']' ;
#print $regex;
push @regexarray , $regex ; @oparray = ( ) ;
}
sub splitter
{
#If the match is zero then increase the lowerlimit by one and call the func subroutine to identify other matches
#Else get the matched and unmatched substring from lowerlimit to upperlimit and store it into an array
#Get the matched substring
$matchedstring = substr ( $sortedarray [ $count - 1 ] , 0 , $mat ) ; print ( "\n " , $matchedstring ) ; my $temp = $upperlimit ;
#Traverse from lowerlimit to upperlimit to get the unmatched substring and store it into an array
while ( $temp >= $lowerlimit )
{
$word = substr ( $sortedarray [ $temp ] , $mat , length ( $sortedarray [ $temp ] ) ) ; if ( $word eq "" )
{
}
else
{
}
$temp --;
}
regexp( ) ;
#print ("\n2.",@oparray);
#print("\n3.",$upperlimit);
#If the upperlimit reached the size of the array then endthe application
if ( ( $upperlimit ) == ( scalar ( @sortedarray ) - 1 ) ) {
#print "All the words are parsed";
#last;
}
#Else set the lowerlimit as upperlimit+1
else
{
$lowerlimit = $upperlimit + 1 ;
# print ("4.",$lowerlimit);
$count = $lowerlimit ;
$inc = 1 ;
func( ) ;
}
}
#print "All the words are parsed";
sub func
{
#Get the specified number of characters from the word if it is defined in the array
{
$base = substr ( $sortedarray [ $count ] , 0 , $inc ) ; #print ("\n5.",$base);
}
#Else terminate the application
else
{
}
#Get the specified number of characters from the word if it is defined in the array
if ( defined $sortedarray [ $count + 1 ] ) {
$match = substr ( $sortedarray [ $count + 1 ] , 0 , $inc ) ; #print ("\n6.",$match);
}
#If the second word is not matched then find whether there is a match between the previous two words.
else
{
if ( defined $sortedarray [ $count - 1 ] ) {
$s = substr ( $sortedarray [ $count - 1 ] , 0 , $inc ) ; #print ("\n7.",$sortedarray[$count-1]);
#print ("\n8.",$s);
#print ("\n9.",$count);
}
else
{
if ( $lowerlimit == 0 )
{
$upperlimit = $lowerlimit ;
$mat = $inc - 1 ;
splitter( ) ;
}
}
if ( $s eq $base )
{
$upperlimit = $count ;
$count = $lowerlimit ;
$inc ++;
#print $inc;
func( ) ;
}
else
{
$upperlimit = $lowerlimit ;
$mat = 0 ;
splitter( ) ;
}
}
# print("\n",$base," ",$match);
$count ++;
#print("\n10.",$count);
#Determine whether the the two substrings were matched or not
if ( $base ne $match )
{
#If the mismatch occurs at the lower limit itself means call the splitter to split the word based on the no of matches
if ( ( $count - 1 ) == $lowerlimit )
{
#print ("\n11.",$mat);
if ( ( $mat == 0 ) )
{
if ( ( $inc == 1 ) )
{
$upperlimit = $lowerlimit ;
splitter( ) ;
}
}
my $lcount = $count ;
my $ucount = $count + 1 ;
#print("\n12.",$lcount,$ucount); #If the end of the array is reached , call the splitter to split the unmatched and matched characters.
if ( $ucount >= scalar ( @sortedarray ) ) {
$upperlimit = $count ;
$mat = $inc - 1 ;
# print("\n13.",$mat);
splitter( ) ;
}
#If the mismatch occurs at the lowerlimit ,then parse the array upto the upperlimit and find any other words having the mathch
else
{
my $ulimit = $upperlimit ;
#print ("\n13.",$ulimit);
#print("\n14.",$lcount,"\n",$ucount,"\n",$ulimit);
while ( $ulimit >= $count )
{
my $new = substr ( $sortedarray [ $lcount ] , 0 , $inc ) ; #print("\n15.",$new);
my $new1 = substr ( $sortedarray [ $ucount ] , 0 , $inc ) ; #print("\n16. ",$new1);
#If the any two words have a match, then call the splitter to split the words before the matched words.
if ( $new eq $new1 )
{
$upperlimit = $lcount - 1 ;
#print("\n17.",$upperlimit);
$mat = $inc - 1 ;
#print("\n18.",$mat);
splitter( ) ;
}
#Traverse the array until the end of the array is reached
else
{
$ulimit --;
$lcount ++;
$ucount ++;
#print("\n19.",$lcount,"\n",$ucount,"\n",$ulimit);
}
}
$mat = $inc - 1 ;
#print $mat;
splitter( ) ;
}
}
#Else increment the substring counter and do the same by calling func subroutine
else
{
$inc ++;
#print $inc;
unless ( ( $count ) == $upperlimit )
{
$count = $lowerlimit ;
func( ) ;
}
}
}
#If the substrings were matched change the upper limit and call func subroutine to find whether there is any other words available with the same match.
else
{
$mat = $inc - 1 ;
#print("\n20.",$mat);
$upperlimit = $count ;
func( ) ;
}
}
shrink( ) ;
func( ) ;
dXNlIHdhcm5pbmdzOwpteSBAaXBhcnJheT0oICJhYiIsICAiYmQiLCJkIik7Cm15IEBzb3J0ZWRhcnJheT1zb3J0KEBpcGFycmF5KTsKbXkgQG9wYXJyYXk7Cm15ICRsb3dlcmxpbWl0PTA7Cm15ICR1cHBlcmxpbWl0PTA7Cm15ICRjb3VudD0wOwpteSAkaW5jPTE7Cm15ICRtYXQ9MDsKbXkgJG1hdGNoZWRzdHJpbmc7Cm15IEByZWdleGFycmF5OwpzdWIgc2hyaW5rCnsKCW15ICRsb3cgPSAwOwoJbXkgJHVwID0gMTsKCW15ICRsZW4gPSBzY2FsYXIgQHNvcnRlZGFycmF5OwoJbXkgJGluYyA9IDE7Cglmb3IgKDskaW5jPCAkbGVuOyRpbmMrKykKCXsKCQlpZiAoJHNvcnRlZGFycmF5WyRsb3ddIGVxICRzb3J0ZWRhcnJheVskdXBdKQoJCXsKCQkJc3BsaWNlKEBzb3J0ZWRhcnJheSwgJHVwICwgMSk7CgkJfQoJCWVsc2UKCQl7CgkJCSR1cCsrOwoJCQkkbG93Kys7CgkJfQoJfQp9CnN1YiByZWdleHAKewoJbXkgJGluYyA9IDA7CglteSAkcmVnZXg7CglpZihsZW5ndGgoJG1hdGNoZWRzdHJpbmcgbmUgIiIpKQoJewoJCSRyZWdleCA9ICRtYXRjaGVkc3RyaW5nIC4gJ1snOwoJfQoJZWxzZQoJewoJCSRyZWdleCA9ICdbJzsKCX0KCWZvciAoOyRpbmMgPCBzY2FsYXIoQG9wYXJyYXkpOyAkaW5jKyspCgl7CgkJJHJlZ2V4ID0gJHJlZ2V4IC4gJG9wYXJyYXlbJGluY107CgkJaWYgKCgkaW5jKzEpPHNjYWxhcihAb3BhcnJheSkpCgkJewoJCQkkcmVnZXggPSAkcmVnZXguJ3wnOwoJCX0KCX0KCSRyZWdleCA9ICRyZWdleCAuICddJzsKCSNwcmludCAkcmVnZXg7CglwdXNoIEByZWdleGFycmF5ICwgJHJlZ2V4OwoJQG9wYXJyYXkgPSAoKTsKCXJldHVybjsKfQpzdWIgc3BsaXR0ZXIKewogICAgICAgICNJZiB0aGUgbWF0Y2ggaXMgemVybyB0aGVuIGluY3JlYXNlIHRoZSBsb3dlcmxpbWl0IGJ5IG9uZSBhbmQgY2FsbCB0aGUgZnVuYyBzdWJyb3V0aW5lIHRvIGlkZW50aWZ5IG90aGVyIG1hdGNoZXMKICAgIAogICAgICAgICNFbHNlIGdldCB0aGUgbWF0Y2hlZCBhbmQgdW5tYXRjaGVkIHN1YnN0cmluZyBmcm9tIGxvd2VybGltaXQgdG8gdXBwZXJsaW1pdCBhbmQgc3RvcmUgaXQgaW50byBhbiBhcnJheQogICAgCiAgICAgICAgICAgICAgICAjR2V0IHRoZSBtYXRjaGVkIHN1YnN0cmluZwogICAgICAgICRtYXRjaGVkc3RyaW5nPXN1YnN0cigkc29ydGVkYXJyYXlbJGNvdW50LTFdLDAsJG1hdCk7CnByaW50KCJcbiIsJG1hdGNoZWRzdHJpbmcpOwogICAgICAgIG15ICR0ZW1wPSR1cHBlcmxpbWl0OyAKICAgICAgICBwcmludCgiXG4xLiIsJHRlbXApOyAgIAogICAgICAgICAgICAgICAgI1RyYXZlcnNlIGZyb20gbG93ZXJsaW1pdCB0byB1cHBlcmxpbWl0IHRvIGdldCB0aGUgdW5tYXRjaGVkIHN1YnN0cmluZyBhbmQgc3RvcmUgaXQgaW50byBhbiBhcnJheSAgICAgICAgCiAgICAgICAgd2hpbGUoJHRlbXA+PSRsb3dlcmxpbWl0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkd29yZD1zdWJzdHIoJHNvcnRlZGFycmF5WyR0ZW1wXSwkbWF0LGxlbmd0aCgkc29ydGVkYXJyYXlbJHRlbXBdKSk7CiAgICAgICAgICAgICAgICBpZigkd29yZCBlcSAiIikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAb3BhcnJheSwiXFxzIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQG9wYXJyYXkgLCR3b3JkOwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHRlbXAtLTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IAogICAgICAgICAgICByZWdleHAoKTsgICAgICAgICAgIAogICAgICAgICAjcHJpbnQgKCJcbjIuIixAb3BhcnJheSk7CiAgICAgICAgICAgI3ByaW50KCJcbjMuIiwkdXBwZXJsaW1pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICNJZiB0aGUgdXBwZXJsaW1pdCByZWFjaGVkIHRoZSBzaXplIG9mIHRoZSBhcnJheSB0aGVuIGVuZHRoZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBpZigoJHVwcGVybGltaXQpPT0oc2NhbGFyKEBzb3J0ZWRhcnJheSktMSkpCiAgICAgICAgICAgICAgICB7CgkJCQlwcmludCBAcmVnZXhhcnJheTsKICAgICAgICAgICAgICAgIGRpZSAiVGVybWluYXRlZCAiOwogICAgICAgICAgICAgICAgI3ByaW50ICJBbGwgdGhlIHdvcmRzIGFyZSBwYXJzZWQiOwogICAgICAgICAgICAgICAgI2xhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICNFbHNlIHNldCB0aGUgbG93ZXJsaW1pdCBhcyB1cHBlcmxpbWl0KzEKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJGxvd2VybGltaXQ9JHVwcGVybGltaXQrMTsKICAgICAgICAgICAgICAgIyBwcmludCAoIjQuIiwkbG93ZXJsaW1pdCk7CiAgICAgICAgICAgICAgICAkY291bnQ9JGxvd2VybGltaXQ7CiAgICAgICAgICAgICAgICAkaW5jPTE7CiAgICAgICAgICAgICAgICBmdW5jKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgCn0KI3ByaW50ICJBbGwgdGhlIHdvcmRzIGFyZSBwYXJzZWQiOwpzdWIgZnVuYwp7CiNHZXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSB3b3JkIGlmIGl0IGlzIGRlZmluZWQgaW4gdGhlIGFycmF5CmlmIChkZWZpbmVkICRzb3J0ZWRhcnJheVskY291bnRdKQogICAgICAgIHsKICAgICAgICAkYmFzZT1zdWJzdHIoJHNvcnRlZGFycmF5WyRjb3VudF0sMCwkaW5jKTsKICAgICAgICAjcHJpbnQgKCJcbjUuIiwkYmFzZSk7CiAgICAgICAgfQogICAgICAgICAgICAgICAgI0Vsc2UgdGVybWluYXRlIHRoZSBhcHBsaWNhdGlvbgogICAgICAgIGVsc2UKICAgICAgICB7CgkJcHJpbnQgQHJlZ2V4YXJyYXk7CiAgICAgICAgZGllOwogICAgICAgIH0KICAgICAgICAgICAgICAgICNHZXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSB3b3JkIGlmIGl0IGlzIGRlZmluZWQgaW4gdGhlIGFycmF5CiAgICAgICAgaWYgKGRlZmluZWQgJHNvcnRlZGFycmF5WyRjb3VudCsxXSkKICAgICAgICB7CiAgICAgICAgICAgICAgICAkbWF0Y2g9c3Vic3RyKCRzb3J0ZWRhcnJheVskY291bnQrMV0sMCwkaW5jKSA7CiAgICAgICAgICAgICAgICAjcHJpbnQgKCJcbjYuIiwkbWF0Y2gpOwogICAgICAgIH0KICAgICAgICAgICAgICAgICNJZiB0aGUgc2Vjb25kIHdvcmQgaXMgbm90IG1hdGNoZWQgdGhlbiBmaW5kIHdoZXRoZXIgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSBwcmV2aW91cyB0d28gd29yZHMuCiAgICAgICAgICAgICAgICAKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgIGlmIChkZWZpbmVkICRzb3J0ZWRhcnJheVskY291bnQtMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJHM9c3Vic3RyKCRzb3J0ZWRhcnJheVskY291bnQtMV0sMCwkaW5jKTsKICAgICAgICAgICAgICAgICNwcmludCAoIlxuNy4iLCRzb3J0ZWRhcnJheVskY291bnQtMV0pOwogICAgICAgICAgICAgICAgI3ByaW50ICgiXG44LiIsJHMpOwogICAgICAgICAgICAgICAgI3ByaW50ICgiXG45LiIsJGNvdW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoJGxvd2VybGltaXQ9PTApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHVwcGVybGltaXQ9JGxvd2VybGltaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRtYXQ9JGluYy0xOwogICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZigkcyBlcSAkYmFzZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR1cHBlcmxpbWl0PSRjb3VudDsKICAgICAgICAgICAgICAgICRjb3VudCA9ICRsb3dlcmxpbWl0OwogICAgICAgICAgICAgICAgJGluYysrOwogICAgICAgICAgICAgICAgI3ByaW50ICRpbmM7CiAgICAgICAgICAgICAgICBmdW5jKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdXBwZXJsaW1pdD0kbG93ZXJsaW1pdDsKICAgICAgICAgICAgICAgICRtYXQ9MDsKICAgICAgICAgICAgICAgIHNwbGl0dGVyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICMgcHJpbnQoIlxuIiwkYmFzZSwiICIsJG1hdGNoKTsKICAgICAgICAkY291bnQrKzsKICAgICAgICAjcHJpbnQoIlxuMTAuIiwkY291bnQpOwogICAgICAgICAgICAgICAgI0RldGVybWluZSB3aGV0aGVyIHRoZSB0aGUgdHdvIHN1YnN0cmluZ3Mgd2VyZSBtYXRjaGVkIG9yIG5vdAogICAgICAgIGlmKCRiYXNlIG5lICRtYXRjaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjSWYgdGhlIG1pc21hdGNoIG9jY3VycyBhdCB0aGUgbG93ZXIgbGltaXQgaXRzZWxmIG1lYW5zIGNhbGwgdGhlIHNwbGl0dGVyIHRvIHNwbGl0IHRoZSB3b3JkIGJhc2VkIG9uIHRoZSBubyBvZiBtYXRjaGVzCiAgICAgICAgICAgICAgICBpZigoJGNvdW50LTEpID09ICRsb3dlcmxpbWl0KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAjcHJpbnQgKCJcbjExLiIsJG1hdCk7CmlmKCgkbWF0PT0wKSkKewppZigoJGluYz09MSkpCnsKJHVwcGVybGltaXQ9JGxvd2VybGltaXQ7CnNwbGl0dGVyKCk7Cn0KfQogICAgICAgICAgICAgICAgICAgIG15ICRsY291bnQ9JGNvdW50OwogICAgICAgICAgICAgICAgICAgIG15ICR1Y291bnQ9JGNvdW50KzE7CiAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCgiXG4xMi4iLCRsY291bnQsJHVjb3VudCk7ICAgICAgICAgI0lmIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIHJlYWNoZWQgLCBjYWxsIHRoZSBzcGxpdHRlciB0byBzcGxpdCB0aGUgdW5tYXRjaGVkIGFuZCBtYXRjaGVkIGNoYXJhY3RlcnMuCiAgICAgICAgICAgICAgICAgICAgaWYoJHVjb3VudD49c2NhbGFyKEBzb3J0ZWRhcnJheSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHVwcGVybGltaXQ9JGNvdW50OwogICAgICAgICAgICAgICAgICAgICAgICAkbWF0PSRpbmMtMTsKICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50KCJcbjEzLiIsJG1hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0dGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lmIHRoZSBtaXNtYXRjaCBvY2N1cnMgYXQgdGhlIGxvd2VybGltaXQgLHRoZW4gcGFyc2UgdGhlIGFycmF5IHVwdG8gdGhlIHVwcGVybGltaXQgYW5kIGZpbmQgYW55IG90aGVyIHdvcmRzIGhhdmluZyB0aGUgbWF0aGNoCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkdWxpbWl0PSR1cHBlcmxpbWl0OwogICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgKCJcbjEzLiIsJHVsaW1pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCgiXG4xNC4iLCRsY291bnQsIlxuIiwkdWNvdW50LCJcbiIsJHVsaW1pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCR1bGltaXQgPj0gJGNvdW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJG5ldz1zdWJzdHIoJHNvcnRlZGFycmF5WyRsY291bnRdLDAsJGluYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQoIlxuMTUuIiwkbmV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRuZXcxPXN1YnN0cigkc29ydGVkYXJyYXlbJHVjb3VudF0sMCwkaW5jKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCgiXG4xNi4gIiwkbmV3MSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lmIHRoZSBhbnkgdHdvIHdvcmRzIGhhdmUgYSBtYXRjaCwgdGhlbiBjYWxsIHRoZSBzcGxpdHRlciB0byBzcGxpdCB0aGUgd29yZHMgYmVmb3JlIHRoZSBtYXRjaGVkIHdvcmRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJG5ldyBlcSAkbmV3MSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cHBlcmxpbWl0PSRsY291bnQtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCgiXG4xNy4iLCR1cHBlcmxpbWl0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXQ9JGluYy0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50KCJcbjE4LiIsJG1hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdHRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNUcmF2ZXJzZSB0aGUgYXJyYXkgdW50aWwgdGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgcmVhY2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1bGltaXQtLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1Y291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCgiXG4xOS4iLCRsY291bnQsIlxuIiwkdWNvdW50LCJcbiIsJHVsaW1pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkbWF0PSRpbmMtMTsKICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50ICRtYXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0dGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0Vsc2UgaW5jcmVtZW50IHRoZSBzdWJzdHJpbmcgY291bnRlciBhbmQgZG8gdGhlIHNhbWUgYnkgY2FsbGluZyBmdW5jIHN1YnJvdXRpbmUgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkaW5jKys7CiAgICAgICAgICAgICAgICAgICAgI3ByaW50ICRpbmM7CiAgICAgICAgICAgICAgICAgICAgdW5sZXNzKCgkY291bnQpID09ICR1cHBlcmxpbWl0KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb3VudD0kbG93ZXJsaW1pdDsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYygpOwogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI0lmIHRoZSBzdWJzdHJpbmdzIHdlcmUgbWF0Y2hlZCBjaGFuZ2UgdGhlIHVwcGVyIGxpbWl0IGFuZCBjYWxsIGZ1bmMgc3Vicm91dGluZSB0byBmaW5kIHdoZXRoZXIgdGhlcmUgaXMgYW55IG90aGVyIHdvcmRzIGF2YWlsYWJsZSB3aXRoIHRoZSBzYW1lIG1hdGNoLiAgICAgICAgIAogICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAkbWF0PSRpbmMtMTsKICAgICAgICAgICAgI3ByaW50KCJcbjIwLiIsJG1hdCk7CiAgICAgICAgICAgICR1cHBlcmxpbWl0PSRjb3VudDsKICAgICAgICAgICAgZnVuYygpOwogICAgICAgICAgICB9Cn0Kc2hyaW5rKCk7CmZ1bmMoKTs=