#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_TRIES 3
#define MAX_NAME 50
#define ACCOUNT_FILE "account.txt"
#define TRANSACTION_FILE "transactions.txt"
// Structure to hold account information
typedef struct {
int accountNumber;
char name[ MAX_NAME] ;
int pin;
float balance;
} Account;
// Structure to hold a transaction record
typedef struct {
char type[ 10 ] ; // "Deposit" or "Withdrawal"
float amount;
char date[ 11 ] ; // Format: DD/MM/YYYY
} Transaction;
// Function prototypes
int login( Account * acc) ;
void showMenu( ) ;
void checkBalance( Account acc) ;
void deposit( Account * acc) ;
void withdraw( Account * acc) ;
void miniStatement( ) ;
void changePIN( Account * acc) ;
void logTransaction( const char * type, float amount) ;
void loadAccount( Account * acc) ;
void saveAccount( Account acc) ;
// Entry point of the program
int main( ) {
Account user;
loadAccount( & user) ;
int attempts = 0 ;
int loggedIn = 0 ;
while ( attempts < MAX_TRIES && ! loggedIn) {
loggedIn = login( & user) ;
if ( ! loggedIn) {
printf ( "Incorrect PIN. Try again.\n " ) ; attempts++;
}
}
if ( ! loggedIn) {
printf ( "Too many failed attempts. Session terminating.\n " ) ; return 0 ;
}
int choice;
do {
showMenu( ) ;
printf ( "Enter your choice: " ) ; switch ( choice) {
case 1 : checkBalance( user) ; break ;
case 2 : deposit( & user) ; break ;
case 3 : withdraw( & user) ; break ;
case 4 : miniStatement( ) ; break ;
case 5 : changePIN( & user) ; break ;
case 6 :
printf ( "Thank you for using the ATM. Goodbye!\n " ) ; break ;
default :
printf ( "Invalid choice. Please try again.\n " ) ; }
} while ( choice != 6 ) ;
return 0 ;
}
// Reads account information from file into 'acc'
void loadAccount( Account * acc) {
FILE
* file
= fopen ( ACCOUNT_FILE
, "r" ) ; if ( file == NULL) {
// If file does not exist, create a default user
acc-> accountNumber = 12345 ;
strcpy ( acc
-> name
, "Huzaifah" ) ; acc-> pin = 1234 ;
acc-> balance = 5000.0f ;
saveAccount( * acc) ;
} else {
fscanf ( file
, "%d,%49[^,],%d,%f" , & acc-> accountNumber, acc-> name, & acc-> pin, & acc-> balance) ;
}
}
// Writes updated account information back to file
void saveAccount( Account acc) {
FILE
* file
= fopen ( ACCOUNT_FILE
, "w" ) ; if ( file != NULL) {
acc.accountNumber , acc.name , acc.pin , acc.balance ) ;
}
}
// Handles user login by comparing entered PIN to stored PIN
int login( Account * acc) {
int inputPIN;
printf ( "Enter your 4-digit PIN: " ) ; return inputPIN == acc-> pin;
}
// Displays the main menu options
void showMenu( ) {
printf ( "\n ========= ATM MENU =========\n " ) ; printf ( "3. Withdraw Money\n " ) ; printf ( "4. Mini Statement\n " ) ; printf ( "============================\n " ) ; }
// Displays the current account balance
void checkBalance( Account acc) {
printf ( "Your current balance is ₹%.2f\n " , acc.
balance ) ; }
// Processes a deposit transaction
void deposit( Account * acc) {
float amount;
printf ( "Enter amount to deposit: ₹" ) ; if ( amount > 0 ) {
acc-> balance += amount;
saveAccount( * acc) ;
logTransaction( "Deposit" , amount) ;
printf ( "Deposit successful. New balance: ₹%.2f\n " , acc
-> balance
) ; } else {
printf ( "Invalid amount. Please enter a positive value.\n " ) ; }
}
// Processes a withdrawal transaction
void withdraw( Account * acc) {
float amount;
printf ( "Enter amount to withdraw: ₹" ) ; if ( amount > 0 && amount <= acc-> balance) {
acc-> balance -= amount;
saveAccount( * acc) ;
logTransaction( "Withdrawal" , amount) ;
printf ( "Please collect your cash. New balance: ₹%.2f\n " , acc
-> balance
) ; } else {
printf ( "Error: Insufficient balance or invalid amount.\n " ) ; }
}
// Displays the last 5 transactions from the transaction file
void miniStatement( ) {
FILE
* file
= fopen ( TRANSACTION_FILE
, "r" ) ; if ( file == NULL) {
printf ( "No transactions found.\n " ) ; return ;
}
// Read all transactions into memory
Transaction records[ 100 ] ;
int count = 0 ;
while ( fscanf ( file
, "%9[^,],%f,%10s\n " , records[ count] .type ,
& records[ count] .amount ,
records[ count] .date ) == 3 && count < 100 ) {
count++;
}
printf ( "----- Mini Statement -----\n " ) ; int start = ( count < 5 ) ? 0 : count - 5 ;
for ( int i = count - 1 ; i >= start; i-- ) {
records[ i] .type , records[ i] .amount , records[ i] .date ) ;
}
printf ( "--------------------------\n " ) ; }
// Allows the user to change their PIN securely
void changePIN( Account * acc) {
int oldPIN, newPIN, confirmPIN;
printf ( "Enter your current PIN: " ) ; if ( oldPIN != acc-> pin) {
printf ( "Incorrect current PIN.\n " ) ; return ;
}
printf ( "Enter your new PIN: " ) ; printf ( "Confirm your new PIN: " ) ; scanf ( "%d" , & confirmPIN
) ; if ( newPIN == confirmPIN && newPIN != oldPIN) {
acc-> pin = newPIN;
saveAccount( * acc) ;
printf ( "PIN changed successfully.\n " ) ; } else {
printf ( "PIN change failed. PINs did not match or new PIN equals old PIN.\n " ) ; }
}
// Appends a transaction record to the transaction log file
void logTransaction( const char * type, float amount) {
FILE
* file
= fopen ( TRANSACTION_FILE
, "a" ) ; if ( file != NULL) {
char date[ 11 ] ;
snprintf ( date
, sizeof ( date
) , "%02d/%02d/%04d" , tm.tm_mday , tm.tm_mon + 1 , tm.tm_year + 1900 ) ;
fprintf ( file
, "%s,%.2f,%s\n " , type
, amount
, date
) ; }
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgoKI2RlZmluZSBNQVhfVFJJRVMgMwojZGVmaW5lIE1BWF9OQU1FIDUwCiNkZWZpbmUgQUNDT1VOVF9GSUxFICJhY2NvdW50LnR4dCIKI2RlZmluZSBUUkFOU0FDVElPTl9GSUxFICJ0cmFuc2FjdGlvbnMudHh0IgoKLy8gU3RydWN0dXJlIHRvIGhvbGQgYWNjb3VudCBpbmZvcm1hdGlvbgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgYWNjb3VudE51bWJlcjsKICAgIGNoYXIgbmFtZVtNQVhfTkFNRV07CiAgICBpbnQgcGluOwogICAgZmxvYXQgYmFsYW5jZTsKfSBBY2NvdW50OwoKLy8gU3RydWN0dXJlIHRvIGhvbGQgYSB0cmFuc2FjdGlvbiByZWNvcmQKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciB0eXBlWzEwXTsgICAgLy8gIkRlcG9zaXQiIG9yICJXaXRoZHJhd2FsIgogICAgZmxvYXQgYW1vdW50OwogICAgY2hhciBkYXRlWzExXTsgICAgLy8gRm9ybWF0OiBERC9NTS9ZWVlZCn0gVHJhbnNhY3Rpb247CgovLyBGdW5jdGlvbiBwcm90b3R5cGVzCmludCBsb2dpbihBY2NvdW50ICphY2MpOwp2b2lkIHNob3dNZW51KCk7CnZvaWQgY2hlY2tCYWxhbmNlKEFjY291bnQgYWNjKTsKdm9pZCBkZXBvc2l0KEFjY291bnQgKmFjYyk7CnZvaWQgd2l0aGRyYXcoQWNjb3VudCAqYWNjKTsKdm9pZCBtaW5pU3RhdGVtZW50KCk7CnZvaWQgY2hhbmdlUElOKEFjY291bnQgKmFjYyk7CnZvaWQgbG9nVHJhbnNhY3Rpb24oY29uc3QgY2hhciAqdHlwZSwgZmxvYXQgYW1vdW50KTsKdm9pZCBsb2FkQWNjb3VudChBY2NvdW50ICphY2MpOwp2b2lkIHNhdmVBY2NvdW50KEFjY291bnQgYWNjKTsKCi8vIEVudHJ5IHBvaW50IG9mIHRoZSBwcm9ncmFtCmludCBtYWluKCkgewogICAgQWNjb3VudCB1c2VyOwogICAgbG9hZEFjY291bnQoJnVzZXIpOwoKICAgIGludCBhdHRlbXB0cyA9IDA7CiAgICBpbnQgbG9nZ2VkSW4gPSAwOwogICAgd2hpbGUgKGF0dGVtcHRzIDwgTUFYX1RSSUVTICYmICFsb2dnZWRJbikgewogICAgICAgIGxvZ2dlZEluID0gbG9naW4oJnVzZXIpOwogICAgICAgIGlmICghbG9nZ2VkSW4pIHsKICAgICAgICAgICAgcHJpbnRmKCJJbmNvcnJlY3QgUElOLiBUcnkgYWdhaW4uXG4iKTsKICAgICAgICAgICAgYXR0ZW1wdHMrKzsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWxvZ2dlZEluKSB7CiAgICAgICAgcHJpbnRmKCJUb28gbWFueSBmYWlsZWQgYXR0ZW1wdHMuIFNlc3Npb24gdGVybWluYXRpbmcuXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpbnQgY2hvaWNlOwogICAgZG8gewogICAgICAgIHNob3dNZW51KCk7CiAgICAgICAgcHJpbnRmKCJFbnRlciB5b3VyIGNob2ljZTogIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJmNob2ljZSk7CiAgICAgICAgc3dpdGNoIChjaG9pY2UpIHsKICAgICAgICAgICAgY2FzZSAxOiBjaGVja0JhbGFuY2UodXNlcik7IGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6IGRlcG9zaXQoJnVzZXIpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAzOiB3aXRoZHJhdygmdXNlcik7IGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6IG1pbmlTdGF0ZW1lbnQoKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNTogY2hhbmdlUElOKCZ1c2VyKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNjogCiAgICAgICAgICAgICAgICBwcmludGYoIlRoYW5rIHlvdSBmb3IgdXNpbmcgdGhlIEFUTS4gR29vZGJ5ZSFcbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgY2hvaWNlLiBQbGVhc2UgdHJ5IGFnYWluLlxuIik7CiAgICAgICAgfQogICAgfSB3aGlsZSAoY2hvaWNlICE9IDYpOwoKICAgIHJldHVybiAwOwp9CgovLyBSZWFkcyBhY2NvdW50IGluZm9ybWF0aW9uIGZyb20gZmlsZSBpbnRvICdhY2MnCnZvaWQgbG9hZEFjY291bnQoQWNjb3VudCAqYWNjKSB7CiAgICBGSUxFICpmaWxlID0gZm9wZW4oQUNDT1VOVF9GSUxFLCAiciIpOwogICAgaWYgKGZpbGUgPT0gTlVMTCkgewogICAgICAgIC8vIElmIGZpbGUgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhIGRlZmF1bHQgdXNlcgogICAgICAgIGFjYy0+YWNjb3VudE51bWJlciA9IDEyMzQ1OwogICAgICAgIHN0cmNweShhY2MtPm5hbWUsICJIdXphaWZhaCIpOwogICAgICAgIGFjYy0+cGluID0gMTIzNDsKICAgICAgICBhY2MtPmJhbGFuY2UgPSA1MDAwLjBmOwogICAgICAgIHNhdmVBY2NvdW50KCphY2MpOwogICAgfSBlbHNlIHsKICAgICAgICBmc2NhbmYoZmlsZSwgIiVkLCU0OVteLF0sJWQsJWYiLAogICAgICAgICAgICAgICAmYWNjLT5hY2NvdW50TnVtYmVyLCBhY2MtPm5hbWUsICZhY2MtPnBpbiwgJmFjYy0+YmFsYW5jZSk7CiAgICAgICAgZmNsb3NlKGZpbGUpOwogICAgfQp9CgovLyBXcml0ZXMgdXBkYXRlZCBhY2NvdW50IGluZm9ybWF0aW9uIGJhY2sgdG8gZmlsZQp2b2lkIHNhdmVBY2NvdW50KEFjY291bnQgYWNjKSB7CiAgICBGSUxFICpmaWxlID0gZm9wZW4oQUNDT1VOVF9GSUxFLCAidyIpOwogICAgaWYgKGZpbGUgIT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZmlsZSwgIiVkLCVzLCVkLCUuMmZcbiIsCiAgICAgICAgICAgICAgICBhY2MuYWNjb3VudE51bWJlciwgYWNjLm5hbWUsIGFjYy5waW4sIGFjYy5iYWxhbmNlKTsKICAgICAgICBmY2xvc2UoZmlsZSk7CiAgICB9Cn0KCi8vIEhhbmRsZXMgdXNlciBsb2dpbiBieSBjb21wYXJpbmcgZW50ZXJlZCBQSU4gdG8gc3RvcmVkIFBJTgppbnQgbG9naW4oQWNjb3VudCAqYWNjKSB7CiAgICBpbnQgaW5wdXRQSU47CiAgICBwcmludGYoIkVudGVyIHlvdXIgNC1kaWdpdCBQSU46ICIpOwogICAgc2NhbmYoIiVkIiwgJmlucHV0UElOKTsKICAgIHJldHVybiBpbnB1dFBJTiA9PSBhY2MtPnBpbjsKfQoKLy8gRGlzcGxheXMgdGhlIG1haW4gbWVudSBvcHRpb25zCnZvaWQgc2hvd01lbnUoKSB7CiAgICBwcmludGYoIlxuPT09PT09PT09IEFUTSBNRU5VID09PT09PT09PVxuIik7CiAgICBwcmludGYoIjEuIENoZWNrIEJhbGFuY2VcbiIpOwogICAgcHJpbnRmKCIyLiBEZXBvc2l0IE1vbmV5XG4iKTsKICAgIHByaW50ZigiMy4gV2l0aGRyYXcgTW9uZXlcbiIpOwogICAgcHJpbnRmKCI0LiBNaW5pIFN0YXRlbWVudFxuIik7CiAgICBwcmludGYoIjUuIENoYW5nZSBQSU5cbiIpOwogICAgcHJpbnRmKCI2LiBFeGl0XG4iKTsKICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Cn0KCi8vIERpc3BsYXlzIHRoZSBjdXJyZW50IGFjY291bnQgYmFsYW5jZQp2b2lkIGNoZWNrQmFsYW5jZShBY2NvdW50IGFjYykgewogICAgcHJpbnRmKCJZb3VyIGN1cnJlbnQgYmFsYW5jZSBpcyDigrklLjJmXG4iLCBhY2MuYmFsYW5jZSk7Cn0KCi8vIFByb2Nlc3NlcyBhIGRlcG9zaXQgdHJhbnNhY3Rpb24Kdm9pZCBkZXBvc2l0KEFjY291bnQgKmFjYykgewogICAgZmxvYXQgYW1vdW50OwogICAgcHJpbnRmKCJFbnRlciBhbW91bnQgdG8gZGVwb3NpdDog4oK5Iik7CiAgICBzY2FuZigiJWYiLCAmYW1vdW50KTsKICAgIGlmIChhbW91bnQgPiAwKSB7CiAgICAgICAgYWNjLT5iYWxhbmNlICs9IGFtb3VudDsKICAgICAgICBzYXZlQWNjb3VudCgqYWNjKTsKICAgICAgICBsb2dUcmFuc2FjdGlvbigiRGVwb3NpdCIsIGFtb3VudCk7CiAgICAgICAgcHJpbnRmKCJEZXBvc2l0IHN1Y2Nlc3NmdWwuIE5ldyBiYWxhbmNlOiDigrklLjJmXG4iLCBhY2MtPmJhbGFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIkludmFsaWQgYW1vdW50LiBQbGVhc2UgZW50ZXIgYSBwb3NpdGl2ZSB2YWx1ZS5cbiIpOwogICAgfQp9CgovLyBQcm9jZXNzZXMgYSB3aXRoZHJhd2FsIHRyYW5zYWN0aW9uCnZvaWQgd2l0aGRyYXcoQWNjb3VudCAqYWNjKSB7CiAgICBmbG9hdCBhbW91bnQ7CiAgICBwcmludGYoIkVudGVyIGFtb3VudCB0byB3aXRoZHJhdzog4oK5Iik7CiAgICBzY2FuZigiJWYiLCAmYW1vdW50KTsKICAgIGlmIChhbW91bnQgPiAwICYmIGFtb3VudCA8PSBhY2MtPmJhbGFuY2UpIHsKICAgICAgICBhY2MtPmJhbGFuY2UgLT0gYW1vdW50OwogICAgICAgIHNhdmVBY2NvdW50KCphY2MpOwogICAgICAgIGxvZ1RyYW5zYWN0aW9uKCJXaXRoZHJhd2FsIiwgYW1vdW50KTsKICAgICAgICBwcmludGYoIlBsZWFzZSBjb2xsZWN0IHlvdXIgY2FzaC4gTmV3IGJhbGFuY2U6IOKCuSUuMmZcbiIsIGFjYy0+YmFsYW5jZSk7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigiRXJyb3I6IEluc3VmZmljaWVudCBiYWxhbmNlIG9yIGludmFsaWQgYW1vdW50LlxuIik7CiAgICB9Cn0KCi8vIERpc3BsYXlzIHRoZSBsYXN0IDUgdHJhbnNhY3Rpb25zIGZyb20gdGhlIHRyYW5zYWN0aW9uIGZpbGUKdm9pZCBtaW5pU3RhdGVtZW50KCkgewogICAgRklMRSAqZmlsZSA9IGZvcGVuKFRSQU5TQUNUSU9OX0ZJTEUsICJyIik7CiAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJObyB0cmFuc2FjdGlvbnMgZm91bmQuXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAvLyBSZWFkIGFsbCB0cmFuc2FjdGlvbnMgaW50byBtZW1vcnkKICAgIFRyYW5zYWN0aW9uIHJlY29yZHNbMTAwXTsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAoZnNjYW5mKGZpbGUsICIlOVteLF0sJWYsJTEwc1xuIiwKICAgICAgICAgICAgICAgICAgcmVjb3Jkc1tjb3VudF0udHlwZSwKICAgICAgICAgICAgICAgICAgJnJlY29yZHNbY291bnRdLmFtb3VudCwKICAgICAgICAgICAgICAgICAgcmVjb3Jkc1tjb3VudF0uZGF0ZSkgPT0gMyAmJiBjb3VudCA8IDEwMCkgewogICAgICAgIGNvdW50Kys7CiAgICB9CiAgICBmY2xvc2UoZmlsZSk7CgogICAgcHJpbnRmKCItLS0tLSBNaW5pIFN0YXRlbWVudCAtLS0tLVxuIik7CiAgICBpbnQgc3RhcnQgPSAoY291bnQgPCA1KSA/IDAgOiBjb3VudCAtIDU7CiAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IHN0YXJ0OyBpLS0pIHsKICAgICAgICBwcmludGYoIiVzIOKCuSUuMmYgb24gJXNcbiIsCiAgICAgICAgICAgICAgIHJlY29yZHNbaV0udHlwZSwgcmVjb3Jkc1tpXS5hbW91bnQsIHJlY29yZHNbaV0uZGF0ZSk7CiAgICB9CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKfQoKLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGNoYW5nZSB0aGVpciBQSU4gc2VjdXJlbHkKdm9pZCBjaGFuZ2VQSU4oQWNjb3VudCAqYWNjKSB7CiAgICBpbnQgb2xkUElOLCBuZXdQSU4sIGNvbmZpcm1QSU47CiAgICBwcmludGYoIkVudGVyIHlvdXIgY3VycmVudCBQSU46ICIpOwogICAgc2NhbmYoIiVkIiwgJm9sZFBJTik7CiAgICBpZiAob2xkUElOICE9IGFjYy0+cGluKSB7CiAgICAgICAgcHJpbnRmKCJJbmNvcnJlY3QgY3VycmVudCBQSU4uXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwcmludGYoIkVudGVyIHlvdXIgbmV3IFBJTjogIik7CiAgICBzY2FuZigiJWQiLCAmbmV3UElOKTsKICAgIHByaW50ZigiQ29uZmlybSB5b3VyIG5ldyBQSU46ICIpOwogICAgc2NhbmYoIiVkIiwgJmNvbmZpcm1QSU4pOwogICAgaWYgKG5ld1BJTiA9PSBjb25maXJtUElOICYmIG5ld1BJTiAhPSBvbGRQSU4pIHsKICAgICAgICBhY2MtPnBpbiA9IG5ld1BJTjsKICAgICAgICBzYXZlQWNjb3VudCgqYWNjKTsKICAgICAgICBwcmludGYoIlBJTiBjaGFuZ2VkIHN1Y2Nlc3NmdWxseS5cbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIlBJTiBjaGFuZ2UgZmFpbGVkLiBQSU5zIGRpZCBub3QgbWF0Y2ggb3IgbmV3IFBJTiBlcXVhbHMgb2xkIFBJTi5cbiIpOwogICAgfQp9CgovLyBBcHBlbmRzIGEgdHJhbnNhY3Rpb24gcmVjb3JkIHRvIHRoZSB0cmFuc2FjdGlvbiBsb2cgZmlsZQp2b2lkIGxvZ1RyYW5zYWN0aW9uKGNvbnN0IGNoYXIgKnR5cGUsIGZsb2F0IGFtb3VudCkgewogICAgRklMRSAqZmlsZSA9IGZvcGVuKFRSQU5TQUNUSU9OX0ZJTEUsICJhIik7CiAgICBpZiAoZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgdGltZV90IHQgPSB0aW1lKE5VTEwpOwogICAgICAgIHN0cnVjdCB0bSB0bSA9ICpsb2NhbHRpbWUoJnQpOwogICAgICAgIGNoYXIgZGF0ZVsxMV07CiAgICAgICAgc25wcmludGYoZGF0ZSwgc2l6ZW9mKGRhdGUpLCAiJTAyZC8lMDJkLyUwNGQiLAogICAgICAgICAgICAgICAgIHRtLnRtX21kYXksIHRtLnRtX21vbiArIDEsIHRtLnRtX3llYXIgKyAxOTAwKTsKICAgICAgICBmcHJpbnRmKGZpbGUsICIlcywlLjJmLCVzXG4iLCB0eXBlLCBhbW91bnQsIGRhdGUpOwogICAgICAgIGZjbG9zZShmaWxlKTsKICAgIH0KfQoK