//********************************************************
//
// Assignment 7 - CHARACTER STRINGS
//
// Name: Jesus Castillo
//
// Class: C Programming, Summer, 2025
//
// Date: 7/19/2025
//
// Description: Program which determines overtime and
// gross pay for a set of employees with outputs sent
// to standard output (the screen).
//
// All functions are called by value
//
//********************************************************
#include <stdio.h>
#include <string.h>
// constants
#define SIZE 5
#define OVERTIME_RATE 1.5f
#define STD_WORK_WEEK 40.0f
#define FED_TAX_RATE 0.12f
// function prototypes
struct employee {
char firstName [ 10 ] ;
char lastName [ 10 ] ;
char state[ 5 ] ;
float stateTax;
float fedTax;
float netPay;
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
} ;
float getHours( long int clockNumber) ;
float calcOvertimeHours( float hours) ;
float calcGrossPay( float hours, float wageRate) ;
void printHeader( void ) ;
void printEmp( struct employee emp) ;
void calcTaxes( struct employee * emp) ;
void printSummary( struct employee empArr[ ] , int size) ;
// TODO: Add other function prototypes here as needed
/* Variable Declarations */
int main( ) {
struct employee employeeData[ SIZE] = {
{ "Connie" , "Cobol" , "MA" , 0 , 0 , 0 , 98401 , 10.60 , 0 , 0 , 0 } ,
{ "Mary" , "Apl" , "NH" , 0 , 0 , 0 , 526488 , 9.75 , 0 , 0 , 0 } ,
{ "Frank" , "Fortran" , "VT" , 0 , 0 , 0 , 765349 , 10.50 , 0 , 0 , 0 } ,
{ "Jeff" , "Ada" , "NY" , 0 , 0 , 0 , 34645 , 12.25 , 0 , 0 , 0 } ,
{ "Anton" , "Pascal" , "CA" , 0 , 0 , 0 , 127615 , 8.35 , 0 , 0 , 0 }
} ;
int i;
// function prototypes
// process each employee
for ( i = 0 ; i < SIZE; ++ i)
{
// Read in hours for employee
employeeData[ i] .hours = getHours( employeeData[ i] .clockNumber ) ;
// The code above didn't work
float testHours[ ] = { 51 , 42.5 , 37.0 , 45 , 40 } ;
employeeData[ i] .hours = testHours[ i] ;
// TODO: Function call to calculate overtime hours
employeeData[ i] .overtimeHrs = calcOvertimeHours( employeeData[ i] .hours ) ;
// TODO: Function call to calculate gross pay
employeeData[ i] .grossPay = calcGrossPay( employeeData[ i] .hours , employeeData[ i] .wageRate ) ;
calcTaxes( & employeeData[ i] ) ;
}
// print the header info
printHeader( ) ; {
printf ( "\n \n *** Pay Calculator ***\n " ) ;
printf ( "\n Name State Clock# Wage Hours OT Gross S Tax Fed Net \n " ) ; printf ( "--------------------------------------------------------------------------------------\n " ) ; }
// Print employee data
for ( i = 0 ; i < SIZE; ++ i) {
printEmp( employeeData[ i] ) ;
} printSummary( employeeData, SIZE) ;
return 0 ;
}
//**************************************************************
// Function: getHours
//
// Purpose: Obtains input from user, the number of hours worked
// per employee and stores the result in a local variable
// that is passed back to the calling function.
//
// Parameters: clockNumber - The unique employee ID
//
// Returns: hoursWorked - hours worked in a given week
//
//**************************************************************
float getHours ( long int clockNumber) {
float hoursWorked ; // hours worked in a given week
// Read in hours for employee
printf ( "\n Enter hours worked by emp # %06li: " , clockNumber
) ; scanf ( "%f" , & hoursWorked
) ;
// return hours back to the calling function
return hoursWorked;
} // getHours
float calcOvertimeHours( float hours) {
if ( hours > STD_WORK_WEEK)
return hours - STD_WORK_WEEK;
else
return 0.0f ;
}
float calcGrossPay( float hours, float wageRate) {
float overtime = calcOvertimeHours( hours) ;
if ( hours > STD_WORK_WEEK) {
return ( STD_WORK_WEEK * wageRate) + ( overtime * wageRate * OVERTIME_RATE) ;
} else {
return hours * wageRate;
} }
// overtime pay
void calcTaxes( struct employee * emp) {
if ( strcmp ( emp
-> state
, "MA" ) == 0 ) emp-> stateTax = emp-> grossPay * 0.05f ;
else if ( strcmp ( emp
-> state
, "NH" ) == 0 ) emp-> stateTax = 0.0f ;
else if ( strcmp ( emp
-> state
, "VT" ) == 0 ) emp-> stateTax = emp-> grossPay * 0.065f ;
else if ( strcmp ( emp
-> state
, "NY" ) == 0 ) emp-> stateTax = emp-> grossPay * 0.08f ;
else if ( strcmp ( emp
-> state
, "CA" ) == 0 ) emp-> stateTax = emp-> grossPay * 0.06f ;
else
emp-> stateTax = 0.8f ;
emp-> fedTax = emp-> grossPay * FED_TAX_RATE;
emp-> netPay = emp-> grossPay - ( emp-> stateTax + emp-> fedTax) ;
}
//**************************************************************
// Function: printHeader
//
// Purpose: Prints the initial table header information.
//
// Parameters: none
//
// Returns: void
//
//**************************************************************
void printHeader( void ) {
printf ( "\n --------------------------------------------------------------------------------------" ) ;
}
//*************************************************************
// Function: printEmp
//
// Purpose: Prints out all the information for an employee
// in a nice and orderly table format.
//
// Parameters:
//
// clockNumber - unique employee ID
// wageRate - hourly wage rate
// hours - Hours worked for the week
// overtimeHrs - overtime hours worked in a week
// grossPay - gross pay for the week
//
// Returns: void
//
//**************************************************************
void printEmp( struct employee emp) {
printf ( "%-6s %-8s %-3s %06ld %6.2f %6.1f %6.1f %9.2f %8.2f %8.2f %8.2f\n " , emp.firstName , emp.lastName , emp.state , emp.clockNumber ,
emp.wageRate , emp.hours , emp.overtimeHrs , emp.grossPay ,
emp.stateTax , emp.fedTax , emp.netPay ) ;
} ;
// TODO: Add other functions here as needed
// ... remember your comment block headers for each function
void printSummary( struct employee empArr[ ] , int size) {
float totalWage = 0 , totalHours = 0 , totalOT = 0 ;
float totalGross = 0 , totalStateTax = 0 , totalFedTax = 0 , totalNet = 0 ;
printf ( "\n --------------------------------------------------------------------------------------" ) ;
for ( int i = 0 ; i < size; ++ i) {
totalWage += empArr[ i] .wageRate ;
totalHours += empArr[ i] .hours ;
totalOT += empArr[ i] .overtimeHrs ;
totalGross += empArr[ i] .grossPay ;
totalStateTax += empArr[ i] .stateTax ;
totalFedTax += empArr[ i] .fedTax ;
totalNet += empArr[ i] .netPay ;
}
printf ( "Total: %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n " , totalWage, totalHours, totalOT, totalGross, totalStateTax, totalFedTax, totalNet) ;
//printf("Averages: %.2f\n", totalWage / size);
//printf("Minimum: %.2f\n", totalWage[4]);
//printf("Maximum: %.2f", totalWage[3]);
printf ( "Total Wage Rate: %.2f\n " , totalWage
) ;
printf ( "Total Hours Worked: %.2f\n " , totalHours
) ; printf ( "Total Overtime Hours: %.2f\n " , totalOT
) ; printf ( "Total Gross Pay: %.2f\n " , totalGross
) ; printf ( "Total State Tax: %.2f\n " , totalStateTax
) ; printf ( "Total Federal Tax: %.2f\n " , totalFedTax
) ; printf ( "Total Net Pay: %.2f\n " , totalNet
) ;
printf ( "\n Average Wage Rate: %.2f\n " , totalWage
/ size
) ; printf ( "Average Hours Worked: %.2f\n " , totalHours
/ size
) ; printf ( "Average Overtime Hours: %.2f\n " , totalOT
/ size
) ; printf ( "Average Gross Pay: %.2f\n " , totalGross
/ size
) ; printf ( "Average State Tax: %.2f\n " , totalStateTax
/ size
) ; printf ( "Average Federal Tax: %.2f\n " , totalFedTax
/ size
) ; printf ( "Average Net Pay: %.2f\n " , totalNet
/ size
) ; }
CS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCS8vCgkvLyBBc3NpZ25tZW50IDcgLSBDSEFSQUNURVIgU1RSSU5HUwoJLy8KCS8vIE5hbWU6IEplc3VzIENhc3RpbGxvCgkvLwoJLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIFN1bW1lciwgMjAyNQoJLy8KCS8vIERhdGU6IDcvMTkvMjAyNQoJLy8KCS8vIERlc2NyaXB0aW9uOiBQcm9ncmFtIHdoaWNoIGRldGVybWluZXMgb3ZlcnRpbWUgYW5kIAoJLy8gZ3Jvc3MgcGF5IGZvciBhIHNldCBvZiBlbXBsb3llZXMgd2l0aCBvdXRwdXRzIHNlbnQgCgkvLyB0byBzdGFuZGFyZCBvdXRwdXQgKHRoZSBzY3JlZW4pLgoJLy8KCS8vIEFsbCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB2YWx1ZQoJLy8KCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQoJI2luY2x1ZGUgPHN0ZGlvLmg+CgkjaW5jbHVkZSA8c3RyaW5nLmg+CgkKCS8vIGNvbnN0YW50cwoJI2RlZmluZSBTSVpFIDUKCSNkZWZpbmUgT1ZFUlRJTUVfUkFURSAxLjVmCgkjZGVmaW5lIFNURF9XT1JLX1dFRUsgNDAuMGYKCSNkZWZpbmUgRkVEX1RBWF9SQVRFICAgMC4xMmYgCgkKCS8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKCQoJCglzdHJ1Y3QgZW1wbG95ZWUgewoJCWNoYXIgZmlyc3ROYW1lIFsxMF07CgkgICAgY2hhciBsYXN0TmFtZSAgWzEwXTsKCSAgICBjaGFyIHN0YXRlWzVdOyAKCSAgICBmbG9hdCBzdGF0ZVRheDsKCSAgICBmbG9hdCBmZWRUYXg7CgkgICAgZmxvYXQgbmV0UGF5OwoJICAgIGxvbmcgaW50IGNsb2NrTnVtYmVyOwoJICAgIGZsb2F0IHdhZ2VSYXRlOwoJICAgIGZsb2F0IGhvdXJzOwoJICAgIGZsb2F0IG92ZXJ0aW1lSHJzOwoJICAgIGZsb2F0IGdyb3NzUGF5OwoJICAgIAoJfTsKCQoJCglmbG9hdCBnZXRIb3Vycyhsb25nIGludCBjbG9ja051bWJlcik7CglmbG9hdCBjYWxjT3ZlcnRpbWVIb3VycyhmbG9hdCBob3Vycyk7CglmbG9hdCBjYWxjR3Jvc3NQYXkoZmxvYXQgaG91cnMsIGZsb2F0IHdhZ2VSYXRlKTsKCXZvaWQgcHJpbnRIZWFkZXIodm9pZCk7Cgl2b2lkIHByaW50RW1wKHN0cnVjdCBlbXBsb3llZSBlbXApOwoJdm9pZCBjYWxjVGF4ZXMoc3RydWN0IGVtcGxveWVlICplbXApOwoJdm9pZCBwcmludFN1bW1hcnkoc3RydWN0IGVtcGxveWVlIGVtcEFycltdLCBpbnQgc2l6ZSk7CgoJCgkvLyBUT0RPOiAgQWRkIG90aGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgaGVyZSBhcyBuZWVkZWQKCQoJCgkgICAgLyogVmFyaWFibGUgRGVjbGFyYXRpb25zICovCglpbnQgbWFpbigpIHsKCSAgICBzdHJ1Y3QgZW1wbG95ZWUgZW1wbG95ZWVEYXRhW1NJWkVdID0gewogICAgeyJDb25uaWUiLCAiQ29ib2wiLCAiTUEiLCAwLCAwLCAwLCA5ODQwMSwgMTAuNjAsIDAsIDAsIDB9LAogICAgeyJNYXJ5IiwgIkFwbCIsICJOSCIsIDAsIDAsIDAsIDUyNjQ4OCwgOS43NSwgMCwgMCwgMH0sCiAgICB7IkZyYW5rIiwgIkZvcnRyYW4iLCAiVlQiLCAwLCAwLCAwLCA3NjUzNDksIDEwLjUwLCAwLCAwLCAwfSwKICAgIHsiSmVmZiIsICJBZGEiLCAiTlkiLCAwLCAwLCAwLCAzNDY0NSwgMTIuMjUsIDAsIDAsIDB9LAogICAgeyJBbnRvbiIsICJQYXNjYWwiLCAiQ0EiLCAwLCAwLDAsIDEyNzYxNSwgOC4zNSwgMCwgMCwgMH0KfTsKCQoJCglpbnQgaTsKCS8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKCQoJICAgIAoJICAgIC8vIHByb2Nlc3MgZWFjaCBlbXBsb3llZQoJICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyArK2kpCgkgICAgewoJICAgIC8vIFJlYWQgaW4gaG91cnMgZm9yIGVtcGxveWVlCQoJICAgIAoJICAgIAllbXBsb3llZURhdGFbaV0uaG91cnMgPSBnZXRIb3VycyhlbXBsb3llZURhdGFbaV0uY2xvY2tOdW1iZXIpOwoJICAgIAkvLyBUaGUgY29kZSBhYm92ZSBkaWRuJ3Qgd29yawoJICAgIAlmbG9hdCB0ZXN0SG91cnNbXSA9IHs1MSwgNDIuNSwgMzcuMCwgNDUsIDQwfTsKCSAgICAJCgkJCWVtcGxveWVlRGF0YVtpXS5ob3VycyA9IHRlc3RIb3Vyc1tpXTsKCQoJICAgICAgICAvLyBUT0RPOiBGdW5jdGlvbiBjYWxsIHRvIGNhbGN1bGF0ZSBvdmVydGltZSBob3VycwoJICAgICAgICBlbXBsb3llZURhdGFbaV0ub3ZlcnRpbWVIcnMgPSBjYWxjT3ZlcnRpbWVIb3VycyhlbXBsb3llZURhdGFbaV0uaG91cnMpOwoJCgkgICAgICAgIC8vIFRPRE86IEZ1bmN0aW9uIGNhbGwgdG8gY2FsY3VsYXRlIGdyb3NzIHBheQoJICAgICAgICBlbXBsb3llZURhdGFbaV0uZ3Jvc3NQYXkgPSBjYWxjR3Jvc3NQYXkoZW1wbG95ZWVEYXRhW2ldLmhvdXJzLCBlbXBsb3llZURhdGFbaV0ud2FnZVJhdGUpOwoJCQkKCQkJY2FsY1RheGVzKCZlbXBsb3llZURhdGFbaV0pOwoKCX0KCSAgICAvLyBwcmludCB0aGUgaGVhZGVyIGluZm8KCQlwcmludEhlYWRlcigpOyB7CgkgICAgCgkgICAgcHJpbnRmICgiXG5cbioqKiBQYXkgQ2FsY3VsYXRvciAqKipcbiIpOwoJICAgIAoJICAgIHByaW50ZigiXG5OYW1lICAJIAkgICBTdGF0ZSBDbG9jayMgIFdhZ2UgICBIb3VycyAgIE9UICAgICBHcm9zcyAgICAgIFMgVGF4ICAgIEZlZCAgICAgTmV0IFxuIik7CgkgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CgkgICAgfSAKCQoJICAgIC8vIFByaW50IGVtcGxveWVlIGRhdGEKCSAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CgkgICAgICAgIHByaW50RW1wKGVtcGxveWVlRGF0YVtpXSk7CgkgICAgICAgIAoJICAgIH0gICBwcmludFN1bW1hcnkoZW1wbG95ZWVEYXRhLCBTSVpFKTsKCSAgICByZXR1cm4gMDsKCgl9CgkKCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCS8vIEZ1bmN0aW9uOiBnZXRIb3VycyAKCS8vIAoJLy8gUHVycG9zZTogT2J0YWlucyBpbnB1dCBmcm9tIHVzZXIsIHRoZSBudW1iZXIgb2YgaG91cnMgd29ya2VkIAoJLy8gcGVyIGVtcGxveWVlIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBhIGxvY2FsIHZhcmlhYmxlIAoJLy8gdGhhdCBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGluZyBmdW5jdGlvbi4gCgkvLyAKCS8vIFBhcmFtZXRlcnM6IGNsb2NrTnVtYmVyIC0gVGhlIHVuaXF1ZSBlbXBsb3llZSBJRAoJLy8gCgkvLyBSZXR1cm5zOiBob3Vyc1dvcmtlZCAtIGhvdXJzIHdvcmtlZCBpbiBhIGdpdmVuIHdlZWsKCS8vICAKCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQoJZmxvYXQgZ2V0SG91cnMgKGxvbmcgaW50IGNsb2NrTnVtYmVyKSB7IAoJCQoJICAgIGZsb2F0IGhvdXJzV29ya2VkIDsgLy8gaG91cnMgd29ya2VkIGluIGEgZ2l2ZW4gd2VlawoJICAgIC8vIFJlYWQgaW4gaG91cnMgZm9yIGVtcGxveWVlCgkgICAgCgkgICAgcHJpbnRmKCJcbkVudGVyIGhvdXJzIHdvcmtlZCBieSBlbXAgIyAlMDZsaTogIiwgY2xvY2tOdW1iZXIpOwoJICAgIHNjYW5mKCIlZiIsICZob3Vyc1dvcmtlZCk7CgoJICAgIC8vIHJldHVybiBob3VycyBiYWNrIHRvIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCgkgICAgcmV0dXJuIGhvdXJzV29ya2VkOwoJICAgCgl9IC8vIGdldEhvdXJzCgkKCWZsb2F0IGNhbGNPdmVydGltZUhvdXJzKGZsb2F0IGhvdXJzKSB7CgkgICAgaWYgKGhvdXJzID4gU1REX1dPUktfV0VFSykKCSAgICAgICAgcmV0dXJuIGhvdXJzIC0gU1REX1dPUktfV0VFSzsKCSAgICBlbHNlCgkgICAgICAgIHJldHVybiAwLjBmOwoJfQoJCglmbG9hdCBjYWxjR3Jvc3NQYXkoZmxvYXQgaG91cnMsIGZsb2F0IHdhZ2VSYXRlKSB7CgkgICAgZmxvYXQgb3ZlcnRpbWUgPSBjYWxjT3ZlcnRpbWVIb3Vycyhob3Vycyk7CgkgICAgaWYgKGhvdXJzID4gU1REX1dPUktfV0VFSykgewoJICAgICAgICByZXR1cm4gKFNURF9XT1JLX1dFRUsgKiB3YWdlUmF0ZSkgKyAob3ZlcnRpbWUgKiB3YWdlUmF0ZSAqIE9WRVJUSU1FX1JBVEUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBob3VycyAqIHdhZ2VSYXRlOwoJICAgIH19CgkgICAgCgkvLyBvdmVydGltZSBwYXkKCQoJCgl2b2lkIGNhbGNUYXhlcyhzdHJ1Y3QgZW1wbG95ZWUgKmVtcCkgewoJCQogICAgaWYgKHN0cmNtcChlbXAtPnN0YXRlLCAiTUEiKSA9PSAwKQogICAgICAgIGVtcC0+c3RhdGVUYXggPSBlbXAtPmdyb3NzUGF5ICogMC4wNWY7CiAgICBlbHNlIGlmIChzdHJjbXAoZW1wLT5zdGF0ZSwgIk5IIikgPT0gMCkKICAgICAgICBlbXAtPnN0YXRlVGF4ID0gMC4wZjsKICAgIGVsc2UgaWYgKHN0cmNtcChlbXAtPnN0YXRlLCAiVlQiKSA9PSAwKQogICAgICAgIGVtcC0+c3RhdGVUYXggPSBlbXAtPmdyb3NzUGF5ICogMC4wNjVmOwogICAgZWxzZSBpZiAoc3RyY21wKGVtcC0+c3RhdGUsICJOWSIpID09IDApCiAgICAgICAgZW1wLT5zdGF0ZVRheCA9IGVtcC0+Z3Jvc3NQYXkgKiAwLjA4ZjsKICAgIGVsc2UgaWYgKHN0cmNtcChlbXAtPnN0YXRlLCAiQ0EiKSA9PSAwKQogICAgICAgIGVtcC0+c3RhdGVUYXggPSBlbXAtPmdyb3NzUGF5ICogMC4wNmY7CiAgICBlbHNlCiAgICAgICAgZW1wLT5zdGF0ZVRheCA9IDAuOGY7IAoKICAgIGVtcC0+ZmVkVGF4ID0gZW1wLT5ncm9zc1BheSAqIEZFRF9UQVhfUkFURTsKICAgIGVtcC0+bmV0UGF5ID0gZW1wLT5ncm9zc1BheSAtIChlbXAtPnN0YXRlVGF4ICsgZW1wLT5mZWRUYXgpOwoKfQoJCgkKCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCS8vIEZ1bmN0aW9uOiBwcmludEhlYWRlcgoJLy8gCgkvLyBQdXJwb3NlOiBQcmludHMgdGhlIGluaXRpYWwgdGFibGUgaGVhZGVyIGluZm9ybWF0aW9uLgoJLy8gCgkvLyBQYXJhbWV0ZXJzOiBub25lCgkvLyAKCS8vIFJldHVybnM6IHZvaWQKCS8vICAKCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQoJdm9pZCBwcmludEhlYWRlcih2b2lkKSB7CgkgICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgkgICAgCgl9CgkKCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKCS8vIEZ1bmN0aW9uOiBwcmludEVtcCAKCS8vIAoJLy8gUHVycG9zZTogUHJpbnRzIG91dCBhbGwgdGhlIGluZm9ybWF0aW9uIGZvciBhbiBlbXBsb3llZQoJLy8gaW4gYSBuaWNlIGFuZCBvcmRlcmx5IHRhYmxlIGZvcm1hdC4KCS8vIAoJLy8gUGFyYW1ldGVyczogCgkvLwoJLy8gICAgIGNsb2NrTnVtYmVyIC0gdW5pcXVlIGVtcGxveWVlIElECgkvLyAgICAgd2FnZVJhdGUgLSBob3VybHkgd2FnZSByYXRlCgkvLyAgICAgaG91cnMgLSBIb3VycyB3b3JrZWQgZm9yIHRoZSB3ZWVrCgkvLyAgICAgb3ZlcnRpbWVIcnMgLSBvdmVydGltZSBob3VycyB3b3JrZWQgaW4gYSB3ZWVrCgkvLyAgICAgZ3Jvc3NQYXkgLSBncm9zcyBwYXkgZm9yIHRoZSB3ZWVrCgkvLyAKCS8vIFJldHVybnM6IHZvaWQKCS8vICAKCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQoJdm9pZCBwcmludEVtcChzdHJ1Y3QgZW1wbG95ZWUgZW1wKSB7CiAgICBwcmludGYoIiUtNnMgJS04cyAlLTNzICUwNmxkICU2LjJmICU2LjFmICU2LjFmICU5LjJmICU4LjJmICU4LjJmICU4LjJmXG4iLAogICAgICAgIGVtcC5maXJzdE5hbWUsIGVtcC5sYXN0TmFtZSwgZW1wLnN0YXRlLCBlbXAuY2xvY2tOdW1iZXIsCiAgICAgICAgZW1wLndhZ2VSYXRlLCBlbXAuaG91cnMsIGVtcC5vdmVydGltZUhycywgZW1wLmdyb3NzUGF5LAogICAgICAgIGVtcC5zdGF0ZVRheCwgZW1wLmZlZFRheCwgZW1wLm5ldFBheSk7CiAgICAgICAgCgl9OyAKCQoJCgkvLyBUT0RPOiBBZGQgb3RoZXIgZnVuY3Rpb25zIGhlcmUgYXMgbmVlZGVkCgkvLyAuLi4gcmVtZW1iZXIgeW91ciBjb21tZW50IGJsb2NrIGhlYWRlcnMgZm9yIGVhY2ggZnVuY3Rpb24KCQoJdm9pZCBwcmludFN1bW1hcnkoc3RydWN0IGVtcGxveWVlIGVtcEFycltdLCBpbnQgc2l6ZSkgewogICAgZmxvYXQgdG90YWxXYWdlID0gMCwgdG90YWxIb3VycyA9IDAsIHRvdGFsT1QgPSAwOwogICAgZmxvYXQgdG90YWxHcm9zcyA9IDAsIHRvdGFsU3RhdGVUYXggPSAwLCB0b3RhbEZlZFRheCA9IDAsIHRvdGFsTmV0ID0gMDsKCnByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoJICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICB0b3RhbFdhZ2UgKz0gZW1wQXJyW2ldLndhZ2VSYXRlOwogICAgICAgIHRvdGFsSG91cnMgKz0gZW1wQXJyW2ldLmhvdXJzOwogICAgICAgIHRvdGFsT1QgKz0gZW1wQXJyW2ldLm92ZXJ0aW1lSHJzOwogICAgICAgIHRvdGFsR3Jvc3MgKz0gZW1wQXJyW2ldLmdyb3NzUGF5OwogICAgICAgIHRvdGFsU3RhdGVUYXggKz0gZW1wQXJyW2ldLnN0YXRlVGF4OwogICAgICAgIHRvdGFsRmVkVGF4ICs9IGVtcEFycltpXS5mZWRUYXg7CiAgICAgICAgdG90YWxOZXQgKz0gZW1wQXJyW2ldLm5ldFBheTsKICAgIH0KCiAgICBwcmludGYoIlxuXG4iKTsKICAgIHByaW50ZigiVG90YWw6CQkJCQkJICUuMmYgICUuMmYgICUuMmYgICUuMmYgICAlLjJmICAgJS4yZiAgJS4yZlxuIiAsIAogICAgdG90YWxXYWdlLCB0b3RhbEhvdXJzLCB0b3RhbE9ULCB0b3RhbEdyb3NzLCB0b3RhbFN0YXRlVGF4LCB0b3RhbEZlZFRheCwgdG90YWxOZXQpOwogICAgCiAgICAvL3ByaW50ZigiQXZlcmFnZXM6CQkJCQkJJS4yZlxuIiwgIHRvdGFsV2FnZSAvIHNpemUpOwogICAgLy9wcmludGYoIk1pbmltdW06CQkJCQkJJS4yZlxuIiwgIHRvdGFsV2FnZVs0XSk7CiAgICAvL3ByaW50ZigiTWF4aW11bToJCQkJCQklLjJmIiwgIHRvdGFsV2FnZVszXSk7CiAgICBwcmludGYoIlxuXG5cblxuIik7CiAgICAKICAgIAogICAgCiAgICAKICAgIHByaW50ZigiVG90YWwgV2FnZSBSYXRlOiAgICAgICUuMmZcbiIsIHRvdGFsV2FnZSk7CiAgICAKICAgIHByaW50ZigiVG90YWwgSG91cnMgV29ya2VkOiAgICUuMmZcbiIsIHRvdGFsSG91cnMpOwogICAgcHJpbnRmKCJUb3RhbCBPdmVydGltZSBIb3VyczogJS4yZlxuIiwgdG90YWxPVCk7CiAgICBwcmludGYoIlRvdGFsIEdyb3NzIFBheTogICAgICAlLjJmXG4iLCB0b3RhbEdyb3NzKTsKICAgIHByaW50ZigiVG90YWwgU3RhdGUgVGF4OiAgICAgICUuMmZcbiIsIHRvdGFsU3RhdGVUYXgpOwogICAgcHJpbnRmKCJUb3RhbCBGZWRlcmFsIFRheDogICAgJS4yZlxuIiwgdG90YWxGZWRUYXgpOwogICAgcHJpbnRmKCJUb3RhbCBOZXQgUGF5OiAgICAgICAgJS4yZlxuIiwgdG90YWxOZXQpOwoKICAgIHByaW50ZigiXG5BdmVyYWdlIFdhZ2UgUmF0ZTogICAgICAlLjJmXG4iLCB0b3RhbFdhZ2UgLyBzaXplKTsKICAgIHByaW50ZigiQXZlcmFnZSBIb3VycyBXb3JrZWQ6ICAgJS4yZlxuIiwgdG90YWxIb3VycyAvIHNpemUpOwogICAgcHJpbnRmKCJBdmVyYWdlIE92ZXJ0aW1lIEhvdXJzOiAlLjJmXG4iLCB0b3RhbE9UIC8gc2l6ZSk7CiAgICBwcmludGYoIkF2ZXJhZ2UgR3Jvc3MgUGF5OiAgICAgICUuMmZcbiIsIHRvdGFsR3Jvc3MgLyBzaXplKTsKICAgIHByaW50ZigiQXZlcmFnZSBTdGF0ZSBUYXg6ICAgICAgJS4yZlxuIiwgdG90YWxTdGF0ZVRheCAvIHNpemUpOwogICAgcHJpbnRmKCJBdmVyYWdlIEZlZGVyYWwgVGF4OiAgICAlLjJmXG4iLCB0b3RhbEZlZFRheCAvIHNpemUpOwogICAgcHJpbnRmKCJBdmVyYWdlIE5ldCBQYXk6ICAgICAgICAlLjJmXG4iLCB0b3RhbE5ldCAvIHNpemUpOwp9CgkKCQoJ