/***************************************************** * COMPLETE SINGLE FILE — ALL QUESTIONS 1 THROUGH 8 * *****************************************************/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
/*********************** * 1) REQUIRED MACROS * ***********************/
/* The original macros were incomplete; the names were not followed by parentheses in the definition. */
#define TRIANGLE_PERIMETER(a, b, c) ((a) + (b) + (c))
#define RECTANGLE_AREA(l, w) ((l) * (w))
#define CIRCLE_AREA(r) (3.14159265 * (r) * (r))
#define C_TO_F(c) ((c) * 9.0/5.0 + 32)
#define MAX2(x, y) (((x) > (y)) ? (x) : (y))
/* SWAP should be a statement expression or put in a do-while loop for safety in all contexts */
#define SWAP(a, b, temp) do { temp = a; a = b; b = temp; } while (0)
/*************************************** * 2) FUNCTION: euroTotal() * ***************************************/
float euroTotal( int c1, int c2, int c5, int c10, int c20, int c50, int e1, int e2)
{
float total = 0.0 ;
total += c1 * 0.01 ;
total += c2 * 0.02 ;
total += c5 * 0.05 ;
total += c10 * 0.10 ;
total += c20 * 0.20 ;
total += c50 * 0.50 ;
total += e1 * 1.00 ;
total += e2 * 2.00 ;
return total;
}
/********************************************** * 3) FUNCTION: blackjackHandTotal() * **********************************************/
/* The original code had syntax errors (returning strings/non-ints, missing braces). */
int blackjackHandTotal( char card1, char card2)
{
int value1, value2;
/* Process card1 value */
if ( card1 >= '2' && card1 <= '9' ) {
value1 = card1 - '0' ;
} else if ( card1 == 'T' || card1 == 'K' || card1 == 'Q' || card1 == 'J' ) {
value1 = 10 ;
} else if ( card1 == 'A' ) {
value1 = 11 ;
} else {
return - 1 ; /* Signal an illegal card */
}
/* Process card2 value */
if ( card2 >= '2' && card2 <= '9' ) {
value2 = card2 - '0' ;
} else if ( card2 == 'T' || card2 == 'K' || card2 == 'Q' || card2 == 'J' ) {
value2 = 10 ;
} else if ( card2 == 'A' ) {
value2 = 11 ;
} else {
return - 1 ; /* Signal an illegal card */
}
int total = value1 + value2;
/* Handle the 'Two Aces' case where 11+11 = 22, should be 12 (11+1) */
if ( total == 22 ) {
total = 12 ;
}
return total;
}
/******************************** * 4) FUNCTION: isLegal() * ********************************/
/* Function to check if a single character is a legal card representation (A, 2-9, T, J, Q, K) */
int isLegal( char card) {
/* Convert to uppercase to handle 'a' through 'k' as well */
char upper_card
= toupper ( ( unsigned char ) card
) ;
if ( ( upper_card >= '2' && upper_card <= '9' ) ||
upper_card == 'T' ||
upper_card == 'J' ||
upper_card == 'Q' ||
upper_card == 'K' ||
upper_card == 'A' ) {
return 1 ; /* True, it is legal */
} else {
return 0 ; /* False, it is not legal */
}
}
/************************************** * 5) FUNCTION: arrayAvg() * **************************************/
/* Function to calculate the average of an integer array */
float arrayAvg( int arr[ ] , int size) {
if ( size <= 0 ) {
return 0.0 ; /* Prevent division by zero */
}
long sum = 0 ; /* Use long to prevent potential overflow of sum */
for ( int i = 0 ; i < size; i++ ) {
sum += arr[ i] ;
}
return ( float ) sum / size; /* Cast sum to float for division */
}
/***************************************** * 6) FUNCTION: revString() * *****************************************/
/* Function to reverse a string in place */
void revString( char str[ ] ) {
int start = 0 ;
int end = len - 1 ;
char temp;
while ( start < end) {
/* Use the SWAP macro defined in Q1 */
SWAP( str[ start] , str[ end] , temp) ;
start++;
end--;
}
}
/***************************************** * 7) FUNCTION: checkPalindrome() * *****************************************/
/* Function to check if a string is a palindrome (ignoring case and non-alphanumeric characters) */
int checkPalindrome( const char original[ ] ) {
char processed[ 100 ] ; /* Assuming max 100 useful chars after processing, adjust size as necessary */
int j = 0 ;
/* 1. Process the string: only keep letters/numbers and convert to lowercase */
for ( int i = 0 ; original[ i] != '\0 ' ; i++ ) {
if ( isalnum ( ( unsigned char ) original
[ i
] ) ) { processed
[ j
++ ] = tolower ( ( unsigned char ) original
[ i
] ) ; }
}
processed[ j] = '\0 ' ; /* Null-terminate the new string */
/* 2. Check if the processed string is the same forwards and backwards */
for ( int i = 0 ; i < len / 2 ; i++ ) {
if ( processed[ i] != processed[ len - 1 - i] ) {
return 0 ; /* Not a palindrome */
}
}
return 1 ; /* Is a palindrome */
}
/*********************************** * 8) MAIN FUNCTION AND TESTING * ***********************************/
int main( ) {
printf ( "--- 1) MACRO TESTS ---\n " ) ; float r = 5.0 ;
int l = 10 , w = 5 ;
int a_swap = 10 , b_swap = 20 , temp_swap;
printf ( "Circle Area (r=%.1f): %.2f\n " , r
, CIRCLE_AREA
( r
) ) ; printf ( "Rectangle Area (l=%d, w=%d): %d\n " , l
, w
, RECTANGLE_AREA
( l
, w
) ) ; printf ( "C to F (0C): %.1fF\n " , C_TO_F
( 0 ) ) ; printf ( "Max of (10, 20): %d\n " , MAX2
( 10 , 20 ) ) ; SWAP( a_swap, b_swap, temp_swap) ;
printf ( "After SWAP, a_swap is %d, b_swap is %d\n " , a_swap
, b_swap
) ;
printf ( "\n --- 2) euroTotal() TEST ---\n " ) ; float total_euros = euroTotal( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ) ;
printf ( "Total value of one of each coin/euro: %.2f EUR\n " , total_euros
) ;
printf ( "\n --- 3) blackjackHandTotal() TESTS ---\n " ) ; printf ( "Hand (A, A) total: %d\n " , blackjackHandTotal
( 'A' , 'A' ) ) ; printf ( "Hand (K, 5) total: %d\n " , blackjackHandTotal
( 'K' , '5' ) ) ; printf ( "Hand (T, J) total: %d\n " , blackjackHandTotal
( 'T' , 'J' ) ) ;
printf ( "\n --- 4) isLegal() TESTS ---\n " ) ; printf ( "'K' is legal: %d\n " , isLegal
( 'K' ) ) ; // 1 printf ( "'Z' is legal: %d\n " , isLegal
( 'Z' ) ) ; // 0
printf ( "\n --- 5) arrayAvg() TEST ---\n " ) ; int scores[ ] = { 90 , 85 , 100 , 75 } ;
int num_scores = sizeof ( scores) / sizeof ( scores[ 0 ] ) ;
printf ( "Average of scores: %.2f\n " , arrayAvg
( scores
, num_scores
) ) ;
printf ( "\n --- 6) revString() TEST ---\n " ) ; char s6[ ] = "Hello World" ;
printf ( "Original string: %s\n " , s6
) ; revString( s6) ;
printf ( "Reversed string: %s\n " , s6
) ;
printf ( "\n --- 7) checkPalindrome() TESTS ---\n " ) ; printf ( "'A man, a plan, a canal, Panama' is palindrome: %d\n " , checkPalindrome
( "A man, a plan, a canal, Panama" ) ) ; // 1 printf ( "'Hello World' is palindrome: %d\n " , checkPalindrome
( "Hello World" ) ) ; // 0 printf ( "'Racecar!' is palindrome: %d\n " , checkPalindrome
( "Racecar!" ) ) ; // 1
return 0 ;
}
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICogQ09NUExFVEUgU0lOR0xFIEZJTEUg4oCUIEFMTCBRVUVTVElPTlMgMSBUSFJPVUdIIDggKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgovKioqKioqKioqKioqKioqKioqKioqKiogKiAxKSBSRVFVSVJFRCBNQUNST1MgKiAqKioqKioqKioqKioqKioqKioqKioqKi8KLyogVGhlIG9yaWdpbmFsIG1hY3JvcyB3ZXJlIGluY29tcGxldGU7IHRoZSBuYW1lcyB3ZXJlIG5vdCBmb2xsb3dlZCBieSBwYXJlbnRoZXNlcyBpbiB0aGUgZGVmaW5pdGlvbi4gKi8KI2RlZmluZSBUUklBTkdMRV9QRVJJTUVURVIoYSwgYiwgYykgKChhKSArIChiKSArIChjKSkKI2RlZmluZSBSRUNUQU5HTEVfQVJFQShsLCB3KSAoKGwpICogKHcpKQojZGVmaW5lIENJUkNMRV9BUkVBKHIpICgzLjE0MTU5MjY1ICogKHIpICogKHIpKQojZGVmaW5lIENfVE9fRihjKSAoKGMpICogOS4wLzUuMCArIDMyKQojZGVmaW5lIE1BWDIoeCwgeSkgKCgoeCkgPiAoeSkpID8gKHgpIDogKHkpKQovKiBTV0FQIHNob3VsZCBiZSBhIHN0YXRlbWVudCBleHByZXNzaW9uIG9yIHB1dCBpbiBhIGRvLXdoaWxlIGxvb3AgZm9yIHNhZmV0eSBpbiBhbGwgY29udGV4dHMgKi8KI2RlZmluZSBTV0FQKGEsIGIsIHRlbXApIGRvIHsgdGVtcCA9IGE7IGEgPSBiOyBiID0gdGVtcDsgfSB3aGlsZSAoMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiAyKSBGVU5DVElPTjogZXVyb1RvdGFsKCkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmZsb2F0IGV1cm9Ub3RhbChpbnQgYzEsIGludCBjMiwgaW50IGM1LCBpbnQgYzEwLCBpbnQgYzIwLCBpbnQgYzUwLCBpbnQgZTEsIGludCBlMikKewogICAgZmxvYXQgdG90YWwgPSAwLjA7CiAgICB0b3RhbCArPSBjMSAqIDAuMDE7CiAgICB0b3RhbCArPSBjMiAqIDAuMDI7CiAgICB0b3RhbCArPSBjNSAqIDAuMDU7CiAgICB0b3RhbCArPSBjMTAgKiAwLjEwOwogICAgdG90YWwgKz0gYzIwICogMC4yMDsKICAgIHRvdGFsICs9IGM1MCAqIDAuNTA7CiAgICB0b3RhbCArPSBlMSAqIDEuMDA7CiAgICB0b3RhbCArPSBlMiAqIDIuMDA7CiAgICByZXR1cm4gdG90YWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICogMykgRlVOQ1RJT046IGJsYWNramFja0hhbmRUb3RhbCgpICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogVGhlIG9yaWdpbmFsIGNvZGUgaGFkIHN5bnRheCBlcnJvcnMgKHJldHVybmluZyBzdHJpbmdzL25vbi1pbnRzLCBtaXNzaW5nIGJyYWNlcykuICovCmludCBibGFja2phY2tIYW5kVG90YWwoY2hhciBjYXJkMSwgY2hhciBjYXJkMikKewogICAgaW50IHZhbHVlMSwgdmFsdWUyOwoKICAgIC8qIFByb2Nlc3MgY2FyZDEgdmFsdWUgKi8KICAgIGlmIChjYXJkMSA+PSAnMicgJiYgY2FyZDEgPD0gJzknKSB7CiAgICAgICAgdmFsdWUxID0gY2FyZDEgLSAnMCc7CiAgICB9IGVsc2UgaWYgKGNhcmQxID09ICdUJyB8fCBjYXJkMSA9PSAnSycgfHwgY2FyZDEgPT0gJ1EnIHx8IGNhcmQxID09ICdKJykgewogICAgICAgIHZhbHVlMSA9IDEwOwogICAgfSBlbHNlIGlmIChjYXJkMSA9PSAnQScpIHsKICAgICAgICB2YWx1ZTEgPSAxMTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOyAvKiBTaWduYWwgYW4gaWxsZWdhbCBjYXJkICovCiAgICB9CgogICAgLyogUHJvY2VzcyBjYXJkMiB2YWx1ZSAqLwogICAgaWYgKGNhcmQyID49ICcyJyAmJiBjYXJkMiA8PSAnOScpIHsKICAgICAgICB2YWx1ZTIgPSBjYXJkMiAtICcwJzsKICAgIH0gZWxzZSBpZiAoY2FyZDIgPT0gJ1QnIHx8IGNhcmQyID09ICdLJyB8fCBjYXJkMiA9PSAnUScgfHwgY2FyZDIgPT0gJ0onKSB7CiAgICAgICAgdmFsdWUyID0gMTA7CiAgICB9IGVsc2UgaWYgKGNhcmQyID09ICdBJykgewogICAgICAgIHZhbHVlMiA9IDExOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7IC8qIFNpZ25hbCBhbiBpbGxlZ2FsIGNhcmQgKi8KICAgIH0KCiAgICBpbnQgdG90YWwgPSB2YWx1ZTEgKyB2YWx1ZTI7CgogICAgLyogSGFuZGxlIHRoZSAnVHdvIEFjZXMnIGNhc2Ugd2hlcmUgMTErMTEgPSAyMiwgc2hvdWxkIGJlIDEyICgxMSsxKSAqLwogICAgaWYgKHRvdGFsID09IDIyKSB7CiAgICAgICAgdG90YWwgPSAxMjsKICAgIH0KICAgIAogICAgcmV0dXJuIHRvdGFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiA0KSBGVU5DVElPTjogaXNMZWdhbCgpICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgc2luZ2xlIGNoYXJhY3RlciBpcyBhIGxlZ2FsIGNhcmQgcmVwcmVzZW50YXRpb24gKEEsIDItOSwgVCwgSiwgUSwgSykgKi8KaW50IGlzTGVnYWwoY2hhciBjYXJkKSB7CiAgICAvKiBDb252ZXJ0IHRvIHVwcGVyY2FzZSB0byBoYW5kbGUgJ2EnIHRocm91Z2ggJ2snIGFzIHdlbGwgKi8KICAgIGNoYXIgdXBwZXJfY2FyZCA9IHRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpY2FyZCk7CgogICAgaWYgKCh1cHBlcl9jYXJkID49ICcyJyAmJiB1cHBlcl9jYXJkIDw9ICc5JykgfHwgCiAgICAgICAgdXBwZXJfY2FyZCA9PSAnVCcgfHwgCiAgICAgICAgdXBwZXJfY2FyZCA9PSAnSicgfHwgCiAgICAgICAgdXBwZXJfY2FyZCA9PSAnUScgfHwgCiAgICAgICAgdXBwZXJfY2FyZCA9PSAnSycgfHwgCiAgICAgICAgdXBwZXJfY2FyZCA9PSAnQScpIHsKICAgICAgICByZXR1cm4gMTsgLyogVHJ1ZSwgaXQgaXMgbGVnYWwgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDA7IC8qIEZhbHNlLCBpdCBpcyBub3QgbGVnYWwgKi8KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICogNSkgRlVOQ1RJT046IGFycmF5QXZnKCkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIGFuIGludGVnZXIgYXJyYXkgKi8KZmxvYXQgYXJyYXlBdmcoaW50IGFycltdLCBpbnQgc2l6ZSkgewogICAgaWYgKHNpemUgPD0gMCkgewogICAgICAgIHJldHVybiAwLjA7IC8qIFByZXZlbnQgZGl2aXNpb24gYnkgemVybyAqLwogICAgfQogICAgbG9uZyBzdW0gPSAwOyAvKiBVc2UgbG9uZyB0byBwcmV2ZW50IHBvdGVudGlhbCBvdmVyZmxvdyBvZiBzdW0gKi8KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgc3VtICs9IGFycltpXTsKICAgIH0KICAgIHJldHVybiAoZmxvYXQpc3VtIC8gc2l6ZTsgLyogQ2FzdCBzdW0gdG8gZmxvYXQgZm9yIGRpdmlzaW9uICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqIDYpIEZVTkNUSU9OOiByZXZTdHJpbmcoKSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBGdW5jdGlvbiB0byByZXZlcnNlIGEgc3RyaW5nIGluIHBsYWNlICovCnZvaWQgcmV2U3RyaW5nKGNoYXIgc3RyW10pIHsKICAgIGludCBsZW4gPSBzdHJsZW4oc3RyKTsKICAgIGludCBzdGFydCA9IDA7CiAgICBpbnQgZW5kID0gbGVuIC0gMTsKICAgIGNoYXIgdGVtcDsKCiAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgICAvKiBVc2UgdGhlIFNXQVAgbWFjcm8gZGVmaW5lZCBpbiBRMSAqLwogICAgICAgIFNXQVAoc3RyW3N0YXJ0XSwgc3RyW2VuZF0sIHRlbXApOwogICAgICAgIHN0YXJ0Kys7CiAgICAgICAgZW5kLS07CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqIDcpIEZVTkNUSU9OOiBjaGVja1BhbGluZHJvbWUoKSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBGdW5jdGlvbiB0byBjaGVjayBpZiBhIHN0cmluZyBpcyBhIHBhbGluZHJvbWUgKGlnbm9yaW5nIGNhc2UgYW5kIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycykgKi8KaW50IGNoZWNrUGFsaW5kcm9tZShjb25zdCBjaGFyIG9yaWdpbmFsW10pIHsKICAgIGNoYXIgcHJvY2Vzc2VkWzEwMF07IC8qIEFzc3VtaW5nIG1heCAxMDAgdXNlZnVsIGNoYXJzIGFmdGVyIHByb2Nlc3NpbmcsIGFkanVzdCBzaXplIGFzIG5lY2Vzc2FyeSAqLwogICAgaW50IGogPSAwOwoKICAgIC8qIDEuIFByb2Nlc3MgdGhlIHN0cmluZzogb25seSBrZWVwIGxldHRlcnMvbnVtYmVycyBhbmQgY29udmVydCB0byBsb3dlcmNhc2UgKi8KICAgIGZvciAoaW50IGkgPSAwOyBvcmlnaW5hbFtpXSAhPSAnXDAnOyBpKyspIHsKICAgICAgICBpZiAoaXNhbG51bSgodW5zaWduZWQgY2hhcilvcmlnaW5hbFtpXSkpIHsKICAgICAgICAgICAgcHJvY2Vzc2VkW2orK10gPSB0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKW9yaWdpbmFsW2ldKTsKICAgICAgICB9CiAgICB9CiAgICBwcm9jZXNzZWRbal0gPSAnXDAnOyAvKiBOdWxsLXRlcm1pbmF0ZSB0aGUgbmV3IHN0cmluZyAqLwoKICAgIC8qIDIuIENoZWNrIGlmIHRoZSBwcm9jZXNzZWQgc3RyaW5nIGlzIHRoZSBzYW1lIGZvcndhcmRzIGFuZCBiYWNrd2FyZHMgKi8KICAgIGludCBsZW4gPSBzdHJsZW4ocHJvY2Vzc2VkKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKSB7CiAgICAgICAgaWYgKHByb2Nlc3NlZFtpXSAhPSBwcm9jZXNzZWRbbGVuIC0gMSAtIGldKSB7CiAgICAgICAgICAgIHJldHVybiAwOyAvKiBOb3QgYSBwYWxpbmRyb21lICovCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOyAvKiBJcyBhIHBhbGluZHJvbWUgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICogOCkgTUFJTiBGVU5DVElPTiBBTkQgVEVTVElORyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgbWFpbigpIHsKICAgIHByaW50ZigiLS0tIDEpIE1BQ1JPIFRFU1RTIC0tLVxuIik7CiAgICBmbG9hdCByID0gNS4wOwogICAgaW50IGwgPSAxMCwgdyA9IDU7CiAgICBpbnQgYV9zd2FwID0gMTAsIGJfc3dhcCA9IDIwLCB0ZW1wX3N3YXA7CiAgICBwcmludGYoIkNpcmNsZSBBcmVhIChyPSUuMWYpOiAlLjJmXG4iLCByLCBDSVJDTEVfQVJFQShyKSk7CiAgICBwcmludGYoIlJlY3RhbmdsZSBBcmVhIChsPSVkLCB3PSVkKTogJWRcbiIsIGwsIHcsIFJFQ1RBTkdMRV9BUkVBKGwsIHcpKTsKICAgIHByaW50ZigiQyB0byBGICgwQyk6ICUuMWZGXG4iLCBDX1RPX0YoMCkpOwogICAgcHJpbnRmKCJNYXggb2YgKDEwLCAyMCk6ICVkXG4iLCBNQVgyKDEwLCAyMCkpOwogICAgU1dBUChhX3N3YXAsIGJfc3dhcCwgdGVtcF9zd2FwKTsKICAgIHByaW50ZigiQWZ0ZXIgU1dBUCwgYV9zd2FwIGlzICVkLCBiX3N3YXAgaXMgJWRcbiIsIGFfc3dhcCwgYl9zd2FwKTsKCiAgICBwcmludGYoIlxuLS0tIDIpIGV1cm9Ub3RhbCgpIFRFU1QgLS0tXG4iKTsKICAgIGZsb2F0IHRvdGFsX2V1cm9zID0gZXVyb1RvdGFsKDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpOwogICAgcHJpbnRmKCJUb3RhbCB2YWx1ZSBvZiBvbmUgb2YgZWFjaCBjb2luL2V1cm86ICUuMmYgRVVSXG4iLCB0b3RhbF9ldXJvcyk7CgogICAgcHJpbnRmKCJcbi0tLSAzKSBibGFja2phY2tIYW5kVG90YWwoKSBURVNUUyAtLS1cbiIpOwogICAgcHJpbnRmKCJIYW5kIChBLCBBKSB0b3RhbDogJWRcbiIsIGJsYWNramFja0hhbmRUb3RhbCgnQScsICdBJykpOwogICAgcHJpbnRmKCJIYW5kIChLLCA1KSB0b3RhbDogJWRcbiIsIGJsYWNramFja0hhbmRUb3RhbCgnSycsICc1JykpOwogICAgcHJpbnRmKCJIYW5kIChULCBKKSB0b3RhbDogJWRcbiIsIGJsYWNramFja0hhbmRUb3RhbCgnVCcsICdKJykpOwoKICAgIHByaW50ZigiXG4tLS0gNCkgaXNMZWdhbCgpIFRFU1RTIC0tLVxuIik7CiAgICBwcmludGYoIidLJyBpcyBsZWdhbDogJWRcbiIsIGlzTGVnYWwoJ0snKSk7IC8vIDEKICAgIHByaW50ZigiJ1onIGlzIGxlZ2FsOiAlZFxuIiwgaXNMZWdhbCgnWicpKTsgLy8gMAoKICAgIHByaW50ZigiXG4tLS0gNSkgYXJyYXlBdmcoKSBURVNUIC0tLVxuIik7CiAgICBpbnQgc2NvcmVzW10gPSB7OTAsIDg1LCAxMDAsIDc1fTsKICAgIGludCBudW1fc2NvcmVzID0gc2l6ZW9mKHNjb3JlcykgLyBzaXplb2Yoc2NvcmVzWzBdKTsKICAgIHByaW50ZigiQXZlcmFnZSBvZiBzY29yZXM6ICUuMmZcbiIsIGFycmF5QXZnKHNjb3JlcywgbnVtX3Njb3JlcykpOwoKICAgIHByaW50ZigiXG4tLS0gNikgcmV2U3RyaW5nKCkgVEVTVCAtLS1cbiIpOwogICAgY2hhciBzNltdID0gIkhlbGxvIFdvcmxkIjsKICAgIHByaW50ZigiT3JpZ2luYWwgc3RyaW5nOiAlc1xuIiwgczYpOwogICAgcmV2U3RyaW5nKHM2KTsKICAgIHByaW50ZigiUmV2ZXJzZWQgc3RyaW5nOiAlc1xuIiwgczYpOwoKICAgIHByaW50ZigiXG4tLS0gNykgY2hlY2tQYWxpbmRyb21lKCkgVEVTVFMgLS0tXG4iKTsKICAgIHByaW50ZigiJ0EgbWFuLCBhIHBsYW4sIGEgY2FuYWwsIFBhbmFtYScgaXMgcGFsaW5kcm9tZTogJWRcbiIsIGNoZWNrUGFsaW5kcm9tZSgiQSBtYW4sIGEgcGxhbiwgYSBjYW5hbCwgUGFuYW1hIikpOyAvLyAxCiAgICBwcmludGYoIidIZWxsbyBXb3JsZCcgaXMgcGFsaW5kcm9tZTogJWRcbiIsIGNoZWNrUGFsaW5kcm9tZSgiSGVsbG8gV29ybGQiKSk7IC8vIDAKICAgIHByaW50ZigiJ1JhY2VjYXIhJyBpcyBwYWxpbmRyb21lOiAlZFxuIiwgY2hlY2tQYWxpbmRyb21lKCJSYWNlY2FyISIpKTsgLy8gMQoKICAgIHJldHVybiAwOwp9Cg==