#include<graphics.h>
#include<dos.h>
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<fstream.h>
#include<dir.h>
#include<stdio.h>
#define xy(z) (8*(z-1))
// GLOBAL Funcions
void grap();
void intro();
void box();
void mainwindow();
void faculty();
void student();
void enterdata();
void personaldetial();
void admindetails(char *name);
void seeyearfaculty();
void fullaccessfaculty();
void modifyfaculty();
void deletefaculty();
void prin();
void enterdatast();
void personalst();
void academic(char *name);
void seetotalst();
void fullaccessst();
void modifyst();
void deletest();
void encrypt(char *name);
void closeprog();
void quit();
void typeme(int left,int top,const char *word,int interval);
// GLOBAL Variables
int option,pass,i,access,x,y,status;
char year[10],ch,name[100],temp[200],newfile[100],a[50],mod;
void *p;
size_t area;
void main()
{
grap();
a:clearviewport();
i=0;
rectangle(getmaxx()/2-140,getmaxy()/2-20,getmaxx()/2+135,getmaxy()/2+4);
outtextxy(getmaxx()/2-127,getmaxy()/2-12,"Enter Accesscode:");
gotoxy(43,15);
//Password Code
do
{
pass=getch();
if(pass==13) goto b;
a[i]=char(pass);
cout<<"*";
sound(500);delay(100);nosound();
i++;
}while(pass!=13);
b:a[i]=0;
access=stricmp(a,"nopassword");
if(access==0)
{
cout<<"
Access Granted ..
Press Any Key To Continue.......";
intro();
textcolor(BLACK);
textbackground(YELLOW);
mainwindow();
}
else
{
clearviewport();
cout<<"
Unautorised Access ";
cout<<"
Press Any Key To Continue......... ";
getch();
goto a;
}
}
// INTRODUCTION SCREEN
void intro()
{
int a,b,c,d;
setfillstyle(8,1);
for(a=0,b=getmaxx(),c=getmaxx()/2,d=getmaxx()/2;a<getmaxx()/2+3;a+=5,b-=5,
c-=5,d+=5)
{
line(c,xy(8),d,xy(8));line(c,xy(51),d,xy(51));
bar(0,xy(9),a,xy(50));bar(b,xy(9),getmaxx(),xy(50));
sound(10*(a+250));delay(10);
}
nosound();
char pattern[] ={0xfe,0xbc,0xda,0xe4,0xe2,0xc0,0x88,0x00};
setfillpattern(pattern,1);
bar(0,0,640,480);
settextstyle(1,0,5);
setcolor(10);
outtextxy(100,140,"INSTITUTE MANAGEMENT");
outtextxy(250,200,"SYSTEM");
getch();
setcolor(0);
for(i=0;i<=320;i++)
{
rectangle(0+i,0,640-i,480);
delay(5);
}
closegraph();
}
// DETECTION OF GRAPHICS
void grap()
{
int gd= DETECT, gm, errorcode;
initgraph(&gd, &gm, "c:\tc\bgi");
errorcode = graphresult();
if(errorcode != grOk)
{
printf("Graphics error: %s
", grapherrormsg(errorcode));
exit(1);
}
}
// FUNCTION TO DRAW A BOX
void box(void)
{
int i,x,y;
gotoxy(11,2);
for(i=1; i<=58; i++)
{
putch(196);
}
gotoxy(11,6);
for(i=1; i<=58; i++)
{
putch(196);
}
gotoxy(68,2);
putch(191);
y=3;
for(i=1; i<=21; i++)
{
gotoxy(68,y);
y++;
putch(179);
}
gotoxy(68,24);
putch(217);
gotoxy(11,24);
for(i=1; i<=57; i++)
{
putch(196);
}
gotoxy(11,24);
putch(192);
y=3;
for(i=1; i<=21; i++)
{
gotoxy(11,y);
y++;
putch(179);
}
gotoxy(11,2);
putch(218);
}
// Main Window Function
void mainwindow()
{
clrscr();
box();
gotoxy(26,4);cout<<"INSTITUTE MANAGEMENT SYSTEM ";
gotoxy(26,5);cout<<"===========================";
gotoxy(26,8);cout<<"Choose Your Option .......";
gotoxy(26,10);cout<<"1. Faculty Informaton ";
gotoxy(26,12);cout<<"2. Students Information ";
gotoxy(26,14);cout<<"3. Print Any Information ";
gotoxy(26,16);cout<<"Press 0 To Exit
";
gotoxy(26,18);cout<<"Option -----> ";
cin>>option;
switch(option)
{
case 1 : faculty();
break;
case 2 : student();
break;
case 3 : prin();
break;
default : closeprog();
break;
};
}
// FUNCTION FOR SHOWING A MAIN WINDOW OF FACULTY INFORMATION
void faculty()
{
clrscr();
box();
gotoxy(26,4);cout<<"INSTITUTE MANAGEMENT SYSTEM ";
gotoxy(26,5);cout<<"===========================";
gotoxy(26,8);cout<<"Choose You Option........";
gotoxy(26,10);cout<<"1. Add A New Record ";
gotoxy(26,12);cout<<"2. See All Faculty's ";
gotoxy(26,14);cout<<"3. Full Access To Any Faculty Information ";
gotoxy(26,16);cout<<"4. Modify Any Information ";
gotoxy(26,18);cout<<"5. Delete Any Information ";
gotoxy(26,20);cout<<"Press 0 To Exit....... ";
gotoxy(26,22);cout<<"Option------> ";
cin>>option;
switch(option)
{
case 1 : enterdata();
break;
case 2 : seeyearfaculty();
break;
case 3 : fullaccessfaculty();
break;
case 4 : modifyfaculty();
break;
case 5 : deletefaculty();
break;
default : closeprog();
break;
};
}
// FUNCTION TO INSERT A DATA OF FACULTY
void enterdata()
{
clrscr();
cout<<"
Enter The Year Which you Want To Add The Data ";
cout<<"
============================================= ";
gets(year);
mkdir("data");
chdir("data");
mkdir("faculty");
chdir("faculty");
mkdir(year);
chdir(year);
cout<<"
Enter The Faculty Name : ";
gets(name);
mkdir(name);
chdir(name);
personaldetial();
chdir("\");
mainwindow();
}
// FUNCTION TO ENTER A PERSONAL DETAILS OF A FACULTY
void personaldetial()
{
cout<<"
Enter The Personal Details ";
cout<<"
========================== ";
cout<<"
Enter The The Name Of A Person : ";
gets(name);
mkdir(name);
chdir(name);
strcpy(newfile,"p");
strcat(newfile,name);
strcat(newfile,".txt");
ofstream fout(newfile);
if(!fout)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
fout<<"NAME : "<<name;
cout<<"
Enter The Address : ";
gets(temp);
fout<<"
ADDRESS :"<<temp;
cout<<"
Enter Contact No. : ";
gets(temp);
fout<<"
CONTACT No. :"<<temp;
fout.close();
encrypt(newfile);
admindetails(name);
}
// FUNCTION TO ENTER A ADMINISTRATION DETAILS OF A FACULTY
void admindetails(char *name)
{
clrscr();
cout<<"
Enter The Administration Detials ";
cout<<"
================================ ";
strcpy(newfile,"a");
strcat(newfile,name);
strcat(newfile,".txt");
ofstream foutt(newfile);
if(!foutt)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
foutt<<"NAME : "<<name;
cout<<"
Enter Educational Qualification :";
gets(temp);
foutt<<"
EDUCATIONAL QUALIFICATIONS :"<<temp;
cout<<"
Enter The Name Of The Subjects Taught ";
cout<<"
===================================== ";
foutt<<"
SUBJECTS TAUGHT :";
cout<<"
Subject(s) Taught to First Year: ";
gets(temp);
foutt<<"
First Year :"<<temp;
cout<<"
Type Of Subject (Theory / Practical) :";
gets(temp);
foutt<<"
Type of Subject :"<<temp;
cout<<"
Subject(s) Taught to Second Year: ";
gets(temp);
foutt<<"
Second Year :"<<temp;
cout<<"
Type Of Subject (Theory / Practical) :";
gets(temp);
foutt<<"
Type of Subject :"<<temp;
cout<<"
Subject(s) Taught to Third Year: ";
gets(temp);
foutt<<"
Third Year :"<<temp;
cout<<"
Type Of Subject (Theory / Practical) :";
gets(temp);
foutt<<"
Type of Subject :"<<temp;
cout<<"
Enter Type of Faculty (Permanent / Visiting)";
gets(temp);
foutt<<"
TYPE OF FACULTY :"<<temp;
foutt.close();
encrypt(newfile);
}
// FUNCTION TO ENCRYPT A DATA
void encrypt(char *newfile)
{
ofstream fout("temp.txt");
ifstream fin(newfile);
while(fin)
{
fin.get(ch);
if(ch==EOF)break;
mod=~ch;
fout<<mod;
}
remove(newfile);
rename("temp.txt",newfile);
}
// FUNCTION TO SEE THE TOTAL FACULTY OF A YEAR
void seeyearfaculty()
{
clrscr();
cout<<"
Enter The Year Of Which You Want To See The Faculties
";
gets(year);
chdir("data");
chdir("faculty");
chdir(year);
cout<<"
Enter The Faculty Name
";
gets(name);
chdir(name);
clrscr();
cout<<"
";
cout<<"
These Are The Teachers Of A Stream
";
system("dir /b /ad /w");
getch();
chdir("\");
mainwindow();
}
// FUNCTION TO GET FULL ACCESS TO A PARTICULAR DATA
void fullaccessfaculty()
{
clrscr();
chdir("data");
chdir("faculty");
cout<<"
Enter The Year Of The Faculty : ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of The Faculty : ";
gets(name);
chdir(name);
cout<<"
Enter The Name Of A Person : ";
gets(name);
chdir(name);
cout<<"
What You Want To See Personal Information Or Admin
Information
";
cout<<"
1. Personal ";
cout<<"
2. Adminstration ";
cout<<"
Option------> ";
cin>>option;
clrscr();
cout<<"
";
if(option==1)
{
strcpy(newfile,"p");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
cout<<mod;
}
getch();
fin.close();
}
if(option==2)
{
strcpy(newfile,"a");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
cout<<mod;
}
getch();
fin.close();
}
chdir("\");
mainwindow();
}
// FUNTION TO MODIFY A FACULTY DATA
void modifyfaculty()
{
clrscr();
chdir("data");
chdir("faculty");
cout<<"
Enter The Year : ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of A Faculty : ";
gets(name);
chdir(name);
cout<<"
Enter The Name Of A Person : ";
gets(name);
status=rmdir(name);
if(status==0)
{
personaldetial();
}
else
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
chdir("\");
mainwindow();
}
// FUNTION FOR DELETING A FACULTY DATA
void deletefaculty()
{
clrscr();
chdir("data");
chdir("faculty");
cout<<"
Enter The Year : ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of A Faculty : ";
gets(name);
chdir(name);
cout<<"
Enter The Name Of A Person : ";
gets(name);
cout<<"
Are You Sure You Want To Remove It (y/n) : ";
cin>>ch;
if(ch=='y')
{
status=rmdir(name);
if(status==0)
{
cout<<"
Record Have Been Removed Succesfully ";
cout<<"
Press Any Key To Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
else
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
}
else
{
chdir("\");
mainwindow();
}
}
// FUNCTION FOR PRINTING THE DATA
void prin()
{
clrscr();
cout<<"
Enter The Option ";
cout<<"
1. Faculty ";
cout<<"
2. Student ";
cout<<"
Option------> ";
cin>>option;
chdir("data");
if(option==1)
{
chdir("faculty");
cout<<"
Enter The Year ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of Faculty ";
gets(name);
chdir(name);
cout<<"
Want Take A Print Document Of Personal Or Admin Details ";
cout<<"
1. Personal ";
cout<<"
2. Adminstration ";
cout<<"
Option------> ";
cin>>option;
if(option==1)
{
strcpy(newfile,"p");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin;
fin.open(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
ofstream fout;
fout.open("PRN");
if(!fout)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
fout.put(mod);
}
fout.close();
fin.close();
}
if(option==2)
{
strcpy(newfile,"a");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin;
fin.open(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
ofstream fout;
fout.open("PRN");
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
fout.put(mod);
}
fout.close();
fin.close();
}
}
if(option==2)
{
chdir("student");
cout<<"
Enter The Year ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of Student ";
gets(name);
chdir(name);
cout<<"
Want Take A Print Document Of Personal Or Admin Details ";
cout<<"
1. Personal ";
cout<<"
2. Academic ";
cout<<"
Option------> ";
cin>>option;
if(option==1)
{
strcpy(newfile,"p");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin;
fin.open(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
ofstream fout;
fout.open("PRN");
if(!fout)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
fout.put(mod);
}
fout.close();
fin.close();
}
if(option==2)
{
strcpy(newfile,"a");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin;
fin.open(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
ofstream fout;
fout.open("PRN");
if(!fout)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
fout.put(mod);
}
fout.close();
fin.close();
}
}
chdir("\");
mainwindow();
}
// FUNCTION FOR SHOWING A MAIN WINDOW OF STUDENT INFORMATION
void student()
{
clrscr();
box();
gotoxy(26,4);cout<<"INSTITUTE MANAGEMENT SYSTEM ";
gotoxy(26,5);cout<<"===========================";
gotoxy(26,8);cout<<"Choose You Option........";
gotoxy(26,10);cout<<"1. Add A New Student Record ";
gotoxy(26,12);cout<<"2. See All Students ";
gotoxy(26,14);cout<<"3. Full Access To Any Student Information ";
gotoxy(26,16);cout<<"4. Modify Any Information ";
gotoxy(26,18);cout<<"5. Delete Any Information ";
gotoxy(26,20);cout<<"Press 0 To Exit....... ";
gotoxy(26,22);cout<<"Option------> ";
cin>>option;
switch(option)
{
case 1 : enterdatast();
break;
case 2 : seetotalst();
break;
case 3 : fullaccessst();
break;
case 4 : modifyst();
break;
case 5 : deletest();
break;
default : closeprog();
break;
};
}
// FUNCTION TO ENTER A STUDENT DATA
void enterdatast()
{
clrscr();
cout<<"
Enter The Year Which you Want To Add The Data ";
cout<<"
=============================================== ";
gets(year);
mkdir("data");
chdir("data");
mkdir("student");
chdir("student");
mkdir(year);
chdir(year);
personalst();
chdir("\");
mainwindow();
}
// FUNCTION TO ENTER A PERSONAL DETAILS OF A STUDENT
void personalst()
{
cout<<"
Enter The Personal Details ";
cout<<"
========================== ";
cout<<"
Enter The The Name Of The Student : ";
gets(name);
mkdir(name);
chdir(name);
strcpy(newfile,"p");
strcat(newfile,name);
strcat(newfile,".txt");
ofstream fout(newfile);
if(!fout)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
fout<<" NAME : "<<name;
cout<<"
Fathers Name : ";
gets(temp);
fout<<"
Fathers Name : "<<temp;
cout<<"
Date Of Birth : ";
gets(temp);
fout<<"
Date Of Birth : "<<temp;
cout<<"
Contact Number : ";
gets(temp);
fout<<"
Contact Number : "<<temp;
cout<<"
Address : ";
gets(temp);
fout<<"
ADDRESS :"<<temp;
cout<<"
Course Name : ";
gets(temp);
fout<<"
Course Name : "<<temp;
fout.close();
encrypt(newfile);
academic(name);
}
// FUNCTION TO ENTER A ACADEMIC DETAILS OF A STUDENT
void academic(char *name)
{
clrscr();
cout<<"
Enter The Academic Detials ";
cout<<"
========================== ";
strcpy(newfile,"a");
strcat(newfile,name);
strcat(newfile,".txt");
ofstream foutt(newfile);
if(!foutt)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
foutt<<" NAME : "<<name;
cout<<"
Type Of Course (Semster/Annual) : ";
gets(temp);
foutt<<"
Type Of Course (Semester/Annual) : "<<temp;
cout<<"
Year Of Admission : ";
gets(temp);
foutt<<"
Year Of Admission : "<<temp;
cout<<"
Admission Number : ";
gets(temp);
foutt<<"
Admission Number : "<<temp;
cout<<"
Percentage In Intermediate : ";
gets(temp);
foutt<<"
Percentage In Intermediate : "<<temp;
cout<<"
Percentage In College :";
foutt<<"
Percentage In College : ";
cout<<"
First Year : ";
gets(temp);
foutt<<"
First Year :"<<temp;
cout<<"
Second Year : ";
gets(temp);
foutt<<"
Second Year :"<<temp;
cout<<"
Third Year : ";
gets(temp);
foutt<<"
third Year :"<<temp;
foutt.close();
encrypt(newfile);
}
// FUNCTION TO SEE A TOTAL STUDENTS OF A PARTICULAR YEAR
void seetotalst()
{
clrscr();
chdir("data");
chdir("student");
cout<<"
Enter The Year Of Which You Want To See The Students
";
gets(year);
chdir(year);
cout<<"
These Are The Students
";
system("dir /b /ad /w");
getch();
chdir("\");
mainwindow();
}
// FUNCTION TO SEE ALL DETAILS OF A STUDENT
void fullaccessst()
{
clrscr();
chdir("data");
chdir("student");
cout<<"
Enter The Year Of The Student : ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of The Student : ";
gets(name);
chdir(name);
cout<<"
What You Want To See Personal Information Or Academic
Information ";
cout<<"
1. Personal ";
cout<<"
2. Academic ";
cout<<"
Option------> ";
cin>>option;
clrscr();
cout<<"
";
if(option==1)
{
strcpy(newfile,"p");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
cout<<mod;
}
getch();
fin.close();
}
if(option==2)
{
strcpy(newfile,"a");
strcat(newfile,name);
strcat(newfile,".txt");
ifstream fin(newfile);
if(!fin)
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
while(fin.get(ch)!=0)
{
mod=~ch;
cout<<mod;
}
getch();
fin.close();
}
chdir("\");
mainwindow();
}
// FUNCTION TO MODIFY DETAILS OF A STUDENT
void modifyst()
{
chdir("data");
chdir("student");
cout<<"
Enter The Year Of You Want To Change The Information : ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of A Student : ";
gets(name);
status=rmdir(name);
if(status==0)
{
personalst();
}
else
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
chdir("\");
mainwindow();
}
// FUNCTION TO DELETE A STUDENT RECORD
void deletest()
{
clrscr();
chdir("data");
chdir("student");
cout<<"
Enter The Year : ";
gets(year);
chdir(year);
cout<<"
Enter The Name Of A Student : ";
gets(name);
cout<<"
Are You Sure You Want To Remove It (y/n) : ";
cin>>ch;
if(ch=='y')
{
status=rmdir(name);
if(status==0)
{
cout<<"
Record Have Been Removed Succesfully ";
cout<<"
Press Any Key To Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
else
{
clrscr();
perror("
Cannot Open The File ");
cout<<"
PRESS ANY KEY TO Return To Main Menu ";
getch();
chdir("\");
mainwindow();
}
}
else
{
chdir("\");
mainwindow();
}
}
// FUNCTION TO CLOSE A PROGRAM
void closeprog()
{
grap();
setcolor(6);
for(i=0;i<=220;i++)
{
rectangle(0+i,0+i,640-i,480-i);
delay(15);
}
for(i=0;i<=220;i++)
{
rectangle(100+i,100,540-i,380);
delay(10);
}
quit();
closegraph();
exit(0);
}
void quit()
{
int a,b,c;
setcolor(0);
for(a=1,b=getmaxy()-1,c=200;a<=getmaxy()/2;a++,b--,c--)
{
line(1,a,getmaxx()-1,a);
line(1,b,getmaxx()-1,b);
sound(10*(c+200));
delay(1);
}
delay(300);
nosound();
setcolor(4);
typeme(xy(2),xy(20),"DEVELOPED BY: VIVEK AND SAURABH JAIN",30);
delay(1000);
setcolor(0);
typeme(xy(2),xy(20)," DEVELOPED BY : SAURABH JAIN ",30);
delay(100);
setcolor(4);
typeme(xy(2),xy(20),"FOR YOUR COMMENTS AND YOUR SUGGESTIONS",30);
delay(500);
setcolor(4);
typeme(xy(2),xy(26),"EMAIL ME AT dropurmails_here@yahoo.com",30);
delay(2000);
}
void typeme(int left,int top,const char *word,int interval)
{
char code[2];
int length=strlen(word);
for(int i=0;i<=length;i++)
{
code[0]=word[i];
code[1]='
I2luY2x1ZGU8Z3JhcGhpY3MuaD4KI2luY2x1ZGU8ZG9zLmg+CiNpbmNsdWRlPHN0ZGxpYi5oPgojaW5jbHVkZTxpb3N0cmVhbS5oPgojaW5jbHVkZTxjb25pby5oPgojaW5jbHVkZTxzdHJpbmcuaD4KI2luY2x1ZGU8cHJvY2Vzcy5oPgojaW5jbHVkZTxmc3RyZWFtLmg+CiNpbmNsdWRlPGRpci5oPgojaW5jbHVkZTxzdGRpby5oPgoKI2RlZmluZSB4eSh6KSAoOCooei0xKSkKCi8vIEdMT0JBTCBGdW5jaW9ucwoKdm9pZCBncmFwKCk7CnZvaWQgaW50cm8oKTsKdm9pZCBib3goKTsKdm9pZCBtYWlud2luZG93KCk7CnZvaWQgZmFjdWx0eSgpOwp2b2lkIHN0dWRlbnQoKTsKdm9pZCBlbnRlcmRhdGEoKTsKdm9pZCBwZXJzb25hbGRldGlhbCgpOwp2b2lkIGFkbWluZGV0YWlscyhjaGFyICpuYW1lKTsKdm9pZCBzZWV5ZWFyZmFjdWx0eSgpOwp2b2lkIGZ1bGxhY2Nlc3NmYWN1bHR5KCk7CnZvaWQgbW9kaWZ5ZmFjdWx0eSgpOwp2b2lkIGRlbGV0ZWZhY3VsdHkoKTsKdm9pZCBwcmluKCk7CnZvaWQgZW50ZXJkYXRhc3QoKTsKdm9pZCBwZXJzb25hbHN0KCk7CnZvaWQgYWNhZGVtaWMoY2hhciAqbmFtZSk7CnZvaWQgc2VldG90YWxzdCgpOwp2b2lkIGZ1bGxhY2Nlc3NzdCgpOwp2b2lkIG1vZGlmeXN0KCk7CnZvaWQgZGVsZXRlc3QoKTsKdm9pZCBlbmNyeXB0KGNoYXIgKm5hbWUpOwp2b2lkIGNsb3NlcHJvZygpOwp2b2lkIHF1aXQoKTsKdm9pZCB0eXBlbWUoaW50IGxlZnQsaW50IHRvcCxjb25zdCBjaGFyICp3b3JkLGludCBpbnRlcnZhbCk7CgovLyBHTE9CQUwgVmFyaWFibGVzCgoKaW50IG9wdGlvbixwYXNzLGksYWNjZXNzLHgseSxzdGF0dXM7CgpjaGFyIHllYXJbMTBdLGNoLG5hbWVbMTAwXSx0ZW1wWzIwMF0sbmV3ZmlsZVsxMDBdLGFbNTBdLG1vZDsKCnZvaWQgKnA7CgpzaXplX3QgYXJlYTsKCnZvaWQgbWFpbigpCnsKCWdyYXAoKTsKCWE6Y2xlYXJ2aWV3cG9ydCgpOwoJICBpPTA7CgpyZWN0YW5nbGUoZ2V0bWF4eCgpLzItMTQwLGdldG1heHkoKS8yLTIwLGdldG1heHgoKS8yKzEzNSxnZXRtYXh5KCkvMis0KTsKCSAgb3V0dGV4dHh5KGdldG1heHgoKS8yLTEyNyxnZXRtYXh5KCkvMi0xMiwiRW50ZXIgQWNjZXNzY29kZToiKTsKCSAgZ290b3h5KDQzLDE1KTsKCgovL1Bhc3N3b3JkIENvZGUKCgpkbwp7CglwYXNzPWdldGNoKCk7CglpZihwYXNzPT0xMykgZ290byBiOwoJYVtpXT1jaGFyKHBhc3MpOwoJY291dDw8IioiOwoJc291bmQoNTAwKTtkZWxheSgxMDApO25vc291bmQoKTsKCWkrKzsKfXdoaWxlKHBhc3MhPTEzKTsKCmI6YVtpXT0wOwogIGFjY2Vzcz1zdHJpY21wKGEsIm5vcGFzc3dvcmQiKTsKCiAgaWYoYWNjZXNzPT0wKQogIHsKCSAgY291dDw8IgogQWNjZXNzIEdyYW50ZWQgLi4KUHJlc3MgQW55IEtleSBUbyBDb250aW51ZS4uLi4uLi4iOwoJICBpbnRybygpOwoJICB0ZXh0Y29sb3IoQkxBQ0spOwoJICB0ZXh0YmFja2dyb3VuZChZRUxMT1cpOwoJICBtYWlud2luZG93KCk7CiAgfQoKICBlbHNlCiAgewoJICBjbGVhcnZpZXdwb3J0KCk7CgkgIGNvdXQ8PCIKVW5hdXRvcmlzZWQgQWNjZXNzICI7CgkgIGNvdXQ8PCIKUHJlc3MgQW55IEtleSBUbyBDb250aW51ZS4uLi4uLi4uLiAiOwoJICBnZXRjaCgpOwoJICBnb3RvIGE7CiAgfQp9CgovLyBJTlRST0RVQ1RJT04gU0NSRUVOCgp2b2lkIGludHJvKCkKewoJaW50IGEsYixjLGQ7CglzZXRmaWxsc3R5bGUoOCwxKTsKCmZvcihhPTAsYj1nZXRtYXh4KCksYz1nZXRtYXh4KCkvMixkPWdldG1heHgoKS8yO2E8Z2V0bWF4eCgpLzIrMzthKz01LGItPTUsCmMtPTUsZCs9NSkKCgl7CgkJbGluZShjLHh5KDgpLGQseHkoOCkpO2xpbmUoYyx4eSg1MSksZCx4eSg1MSkpOwoJCWJhcigwLHh5KDkpLGEseHkoNTApKTtiYXIoYix4eSg5KSxnZXRtYXh4KCkseHkoNTApKTsKCQlzb3VuZCgxMCooYSsyNTApKTtkZWxheSgxMCk7Cgl9CgoJbm9zb3VuZCgpOwoJY2hhciBwYXR0ZXJuW10gPXsweGZlLDB4YmMsMHhkYSwweGU0LDB4ZTIsMHhjMCwweDg4LDB4MDB9OwoJc2V0ZmlsbHBhdHRlcm4ocGF0dGVybiwxKTsKCWJhcigwLDAsNjQwLDQ4MCk7CglzZXR0ZXh0c3R5bGUoMSwwLDUpOwoJc2V0Y29sb3IoMTApOwoJb3V0dGV4dHh5KDEwMCwxNDAsIklOU1RJVFVURSBNQU5BR0VNRU5UIik7CglvdXR0ZXh0eHkoMjUwLDIwMCwiU1lTVEVNIik7CglnZXRjaCgpOwoJc2V0Y29sb3IoMCk7CgoJZm9yKGk9MDtpPD0zMjA7aSsrKQoJewoJCXJlY3RhbmdsZSgwK2ksMCw2NDAtaSw0ODApOwoJCWRlbGF5KDUpOwoJfQoKCWNsb3NlZ3JhcGgoKTsKfQoKCi8vIERFVEVDVElPTiBPRiBHUkFQSElDUwoKdm9pZCBncmFwKCkKewoJaW50IGdkPSBERVRFQ1QsIGdtLCBlcnJvcmNvZGU7Cglpbml0Z3JhcGgoJmdkLCAmZ20sICJjOlx0Y1xiZ2kiKTsKCWVycm9yY29kZSA9IGdyYXBocmVzdWx0KCk7CgoKaWYoZXJyb3Jjb2RlICE9IGdyT2spCnsKCXByaW50ZigiR3JhcGhpY3MgZXJyb3I6ICVzCiIsIGdyYXBoZXJyb3Jtc2coZXJyb3Jjb2RlKSk7CglleGl0KDEpOwp9Cgp9CgovLyBGVU5DVElPTiBUTyBEUkFXIEEgQk9YCgp2b2lkIGJveCh2b2lkKQp7CglpbnQgaSx4LHk7Cglnb3RveHkoMTEsMik7CgoJZm9yKGk9MTsgaTw9NTg7IGkrKykKCXsKCQlwdXRjaCgxOTYpOwoJfQoKCWdvdG94eSgxMSw2KTsKCglmb3IoaT0xOyBpPD01ODsgaSsrKQoJewoJCXB1dGNoKDE5Nik7Cgl9CgoJZ290b3h5KDY4LDIpOwoJcHV0Y2goMTkxKTsKCXk9MzsKCglmb3IoaT0xOyBpPD0yMTsgaSsrKQoJewoJCWdvdG94eSg2OCx5KTsKCQl5Kys7CgkJcHV0Y2goMTc5KTsKCX0KCglnb3RveHkoNjgsMjQpOwoJcHV0Y2goMjE3KTsKCWdvdG94eSgxMSwyNCk7CgoJZm9yKGk9MTsgaTw9NTc7IGkrKykKCXsKCQlwdXRjaCgxOTYpOwoJfQoKCWdvdG94eSgxMSwyNCk7CglwdXRjaCgxOTIpOwoJeT0zOwoKCWZvcihpPTE7IGk8PTIxOyBpKyspCgl7CgkJZ290b3h5KDExLHkpOwoJCXkrKzsKCQlwdXRjaCgxNzkpOwoJfQoKCWdvdG94eSgxMSwyKTsKCXB1dGNoKDIxOCk7Cgp9CgoKLy8gTWFpbiBXaW5kb3cgRnVuY3Rpb24KCnZvaWQgbWFpbndpbmRvdygpCnsKCWNscnNjcigpOwoJYm94KCk7CgoJZ290b3h5KDI2LDQpO2NvdXQ8PCJJTlNUSVRVVEUgTUFOQUdFTUVOVCBTWVNURU0gIjsKCWdvdG94eSgyNiw1KTtjb3V0PDwiPT09PT09PT09PT09PT09PT09PT09PT09PT09IjsKCWdvdG94eSgyNiw4KTtjb3V0PDwiQ2hvb3NlIFlvdXIgT3B0aW9uIC4uLi4uLi4iOwoJZ290b3h5KDI2LDEwKTtjb3V0PDwiMS4gRmFjdWx0eSBJbmZvcm1hdG9uICI7Cglnb3RveHkoMjYsMTIpO2NvdXQ8PCIyLiBTdHVkZW50cyBJbmZvcm1hdGlvbiAiOwoJZ290b3h5KDI2LDE0KTtjb3V0PDwiMy4gUHJpbnQgQW55IEluZm9ybWF0aW9uICI7Cglnb3RveHkoMjYsMTYpO2NvdXQ8PCJQcmVzcyAwIFRvIEV4aXQgCiI7Cglnb3RveHkoMjYsMTgpO2NvdXQ8PCJPcHRpb24gLS0tLS0+ICI7CgoJY2luPj5vcHRpb247CgoJc3dpdGNoKG9wdGlvbikKCXsKCQljYXNlIDEgOiBmYWN1bHR5KCk7CgkJCWJyZWFrOwoKCQkJY2FzZSAyIDogc3R1ZGVudCgpOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAzIDogcHJpbigpOwoJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0IDogY2xvc2Vwcm9nKCk7CgkJCQkJCWJyZWFrOwoJfTsKfQoKCi8vIEZVTkNUSU9OIEZPUiBTSE9XSU5HIEEgTUFJTiBXSU5ET1cgT0YgRkFDVUxUWSBJTkZPUk1BVElPTgoKdm9pZCBmYWN1bHR5KCkKewoJY2xyc2NyKCk7Cglib3goKTsKCglnb3RveHkoMjYsNCk7Y291dDw8IklOU1RJVFVURSBNQU5BR0VNRU5UIFNZU1RFTSAiOwoJZ290b3h5KDI2LDUpO2NvdXQ8PCI9PT09PT09PT09PT09PT09PT09PT09PT09PT0iOwoJZ290b3h5KDI2LDgpO2NvdXQ8PCJDaG9vc2UgWW91IE9wdGlvbi4uLi4uLi4uIjsKCWdvdG94eSgyNiwxMCk7Y291dDw8IjEuIEFkZCBBIE5ldyBSZWNvcmQgIjsKCWdvdG94eSgyNiwxMik7Y291dDw8IjIuIFNlZSBBbGwgRmFjdWx0eSdzICI7Cglnb3RveHkoMjYsMTQpO2NvdXQ8PCIzLiBGdWxsIEFjY2VzcyBUbyBBbnkgRmFjdWx0eSBJbmZvcm1hdGlvbiAiOwoJZ290b3h5KDI2LDE2KTtjb3V0PDwiNC4gTW9kaWZ5IEFueSBJbmZvcm1hdGlvbiAiOwoJZ290b3h5KDI2LDE4KTtjb3V0PDwiNS4gRGVsZXRlIEFueSBJbmZvcm1hdGlvbiAiOwoJZ290b3h5KDI2LDIwKTtjb3V0PDwiUHJlc3MgMCBUbyBFeGl0Li4uLi4uLiAiOwoJZ290b3h5KDI2LDIyKTtjb3V0PDwiT3B0aW9uLS0tLS0tPiAiOwoKCWNpbj4+b3B0aW9uOwoKCXN3aXRjaChvcHRpb24pCgl7CgkJY2FzZSAxIDogZW50ZXJkYXRhKCk7CgkJCWJyZWFrOwoKCQkJY2FzZSAyIDogc2VleWVhcmZhY3VsdHkoKTsKCQkJCWJyZWFrOwoKCQkJCWNhc2UgMyA6IGZ1bGxhY2Nlc3NmYWN1bHR5KCk7CgkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgNCA6IG1vZGlmeWZhY3VsdHkoKTsKCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlIDUgOiBkZWxldGVmYWN1bHR5KCk7CgkJCQkJCQlicmVhazsKCgkJCQkJCQlkZWZhdWx0IDogY2xvc2Vwcm9nKCk7CgkJCQkJCQkJYnJlYWs7Cgl9Owp9CgoKLy8gRlVOQ1RJT04gVE8gSU5TRVJUIEEgREFUQSBPRiBGQUNVTFRZCgp2b2lkIGVudGVyZGF0YSgpCnsKCWNscnNjcigpOwoKCWNvdXQ8PCIKCgkJRW50ZXIgVGhlIFllYXIgV2hpY2ggeW91IFdhbnQgVG8gQWRkIFRoZSBEYXRhICI7Cgljb3V0PDwiCgkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICI7CglnZXRzKHllYXIpOwoKCW1rZGlyKCJkYXRhIik7CgljaGRpcigiZGF0YSIpOwoJbWtkaXIoImZhY3VsdHkiKTsKCWNoZGlyKCJmYWN1bHR5Iik7Cglta2Rpcih5ZWFyKTsKCWNoZGlyKHllYXIpOwoKCWNvdXQ8PCIKCSAgICBFbnRlciBUaGUgRmFjdWx0eSBOYW1lIDogIjsKCWdldHMobmFtZSk7CgoJbWtkaXIobmFtZSk7CgljaGRpcihuYW1lKTsKCglwZXJzb25hbGRldGlhbCgpOwoJY2hkaXIoIlwiKTsKCW1haW53aW5kb3coKTsKfQoKCi8vIEZVTkNUSU9OIFRPIEVOVEVSIEEgUEVSU09OQUwgREVUQUlMUyBPRiBBIEZBQ1VMVFkKCnZvaWQgcGVyc29uYWxkZXRpYWwoKQp7Cgljb3V0PDwiCgoJCSAgICAgIEVudGVyIFRoZSBQZXJzb25hbCBEZXRhaWxzICI7Cgljb3V0PDwiCgkJICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT0gIjsKCWNvdXQ8PCIKCglFbnRlciBUaGUgVGhlIE5hbWUgT2YgQSBQZXJzb24gOiAiOwoJZ2V0cyhuYW1lKTsKCglta2RpcihuYW1lKTsKCWNoZGlyKG5hbWUpOwoKCXN0cmNweShuZXdmaWxlLCJwIik7CglzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CglvZnN0cmVhbSBmb3V0KG5ld2ZpbGUpOwoKCWlmKCFmb3V0KQoJewoJCWNscnNjcigpOwoJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCWdldGNoKCk7CgkJY2hkaXIoIlwiKTsKCQltYWlud2luZG93KCk7Cgl9CgoJZm91dDw8Ik5BTUUgOiAiPDxuYW1lOwoKCWNvdXQ8PCIKCUVudGVyIFRoZSBBZGRyZXNzIDogIjsKCWdldHModGVtcCk7CgoJZm91dDw8IgpBRERSRVNTIDoiPDx0ZW1wOwoKCWNvdXQ8PCIKCUVudGVyIENvbnRhY3QgTm8uIDogIjsKCWdldHModGVtcCk7CgoJZm91dDw8IgpDT05UQUNUIE5vLiA6Ijw8dGVtcDsKCglmb3V0LmNsb3NlKCk7CgllbmNyeXB0KG5ld2ZpbGUpOwoJYWRtaW5kZXRhaWxzKG5hbWUpOwp9CgoKLy8gRlVOQ1RJT04gVE8gRU5URVIgQSBBRE1JTklTVFJBVElPTiBERVRBSUxTIE9GIEEgRkFDVUxUWQoKCnZvaWQgYWRtaW5kZXRhaWxzKGNoYXIgKm5hbWUpCnsKCWNscnNjcigpOwoKCWNvdXQ8PCIKCgkJICAgICAgRW50ZXIgVGhlIEFkbWluaXN0cmF0aW9uIERldGlhbHMgIjsKCWNvdXQ8PCIKCQkgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAiOwoKCXN0cmNweShuZXdmaWxlLCJhIik7CglzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CgoJb2ZzdHJlYW0gZm91dHQobmV3ZmlsZSk7CgoJaWYoIWZvdXR0KQoJewoJCWNscnNjcigpOwoJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCWdldGNoKCk7CgkJY2hkaXIoIlwiKTsKCQltYWlud2luZG93KCk7Cgl9CgoJZm91dHQ8PCJOQU1FIDogIjw8bmFtZTsKCgljb3V0PDwiCgoJRW50ZXIgRWR1Y2F0aW9uYWwgUXVhbGlmaWNhdGlvbiA6IjsKCWdldHModGVtcCk7CgoJZm91dHQ8PCIKRURVQ0FUSU9OQUwgUVVBTElGSUNBVElPTlMgOiI8PHRlbXA7CgoJY291dDw8IgoJICAgICAgICAgIEVudGVyIFRoZSBOYW1lIE9mIFRoZSBTdWJqZWN0cyBUYXVnaHQgIjsKCWNvdXQ8PCIKCSAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICI7CgoJZm91dHQ8PCIKU1VCSkVDVFMgVEFVR0hUIDoiOwoKCWNvdXQ8PCIKCglTdWJqZWN0KHMpIFRhdWdodCB0byBGaXJzdCBZZWFyOiAiOwoJZ2V0cyh0ZW1wKTsKCglmb3V0dDw8IgoKCSBGaXJzdCBZZWFyIDoiPDx0ZW1wOwoKCWNvdXQ8PCIKCVR5cGUgT2YgU3ViamVjdCAoVGhlb3J5IC8gUHJhY3RpY2FsKSA6IjsKCWdldHModGVtcCk7CgoJZm91dHQ8PCIKCSBUeXBlIG9mIFN1YmplY3QgOiI8PHRlbXA7CgoJY291dDw8IgoKCVN1YmplY3QocykgVGF1Z2h0IHRvIFNlY29uZCBZZWFyOiAiOwoJZ2V0cyh0ZW1wKTsKCglmb3V0dDw8IgoKCSBTZWNvbmQgWWVhciA6Ijw8dGVtcDsKCgljb3V0PDwiCglUeXBlIE9mIFN1YmplY3QgKFRoZW9yeSAvIFByYWN0aWNhbCkgOiI7CglnZXRzKHRlbXApOwoKCWZvdXR0PDwiCgkgVHlwZSBvZiBTdWJqZWN0IDoiPDx0ZW1wOwoKCWNvdXQ8PCIKCglTdWJqZWN0KHMpIFRhdWdodCB0byBUaGlyZCBZZWFyOiAiOwoJZ2V0cyh0ZW1wKTsKCglmb3V0dDw8IgoKCSBUaGlyZCBZZWFyIDoiPDx0ZW1wOwoKCWNvdXQ8PCIKCVR5cGUgT2YgU3ViamVjdCAoVGhlb3J5IC8gUHJhY3RpY2FsKSA6IjsKCWdldHModGVtcCk7CgoJZm91dHQ8PCIKCSBUeXBlIG9mIFN1YmplY3QgOiI8PHRlbXA7CgoJY291dDw8IgoJRW50ZXIgVHlwZSBvZiBGYWN1bHR5IChQZXJtYW5lbnQgLyBWaXNpdGluZykiOwoJZ2V0cyh0ZW1wKTsKCglmb3V0dDw8IgpUWVBFIE9GIEZBQ1VMVFkgOiI8PHRlbXA7CgoJZm91dHQuY2xvc2UoKTsKCWVuY3J5cHQobmV3ZmlsZSk7Cgp9CgoKLy8gRlVOQ1RJT04gVE8gRU5DUllQVCBBIERBVEEKCnZvaWQgZW5jcnlwdChjaGFyICpuZXdmaWxlKQp7CglvZnN0cmVhbSBmb3V0KCJ0ZW1wLnR4dCIpOwoJaWZzdHJlYW0gZmluKG5ld2ZpbGUpOwoKCXdoaWxlKGZpbikKCXsKCQlmaW4uZ2V0KGNoKTsKCQlpZihjaD09RU9GKWJyZWFrOwoJCW1vZD1+Y2g7CgkJZm91dDw8bW9kOwoJfQoKCXJlbW92ZShuZXdmaWxlKTsKCXJlbmFtZSgidGVtcC50eHQiLG5ld2ZpbGUpOwp9CgoKLy8gRlVOQ1RJT04gVE8gU0VFIFRIRSBUT1RBTCBGQUNVTFRZIE9GIEEgWUVBUgoKdm9pZCBzZWV5ZWFyZmFjdWx0eSgpCnsKCWNscnNjcigpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgWWVhciBPZiBXaGljaCBZb3UgV2FudCBUbyBTZWUgVGhlIEZhY3VsdGllcyAKCiI7CglnZXRzKHllYXIpOwoKCWNoZGlyKCJkYXRhIik7CgljaGRpcigiZmFjdWx0eSIpOwoJY2hkaXIoeWVhcik7CgoJY291dDw8IgoKCUVudGVyIFRoZSBGYWN1bHR5IE5hbWUgCgkiOwoJZ2V0cyhuYW1lKTsKCgljaGRpcihuYW1lKTsKCgljbHJzY3IoKTsKCgljb3V0PDwiCgoiOwoJY291dDw8IgoKCSAgVGhlc2UgQXJlIFRoZSBUZWFjaGVycyBPZiBBIFN0cmVhbSAKCiI7CgoJc3lzdGVtKCJkaXIgL2IgL2FkIC93Iik7CglnZXRjaCgpOwoJY2hkaXIoIlwiKTsKCW1haW53aW5kb3coKTsKfQoKCi8vIEZVTkNUSU9OIFRPIEdFVCBGVUxMIEFDQ0VTUyBUTyBBIFBBUlRJQ1VMQVIgREFUQQoKdm9pZCBmdWxsYWNjZXNzZmFjdWx0eSgpCnsKCWNscnNjcigpOwoKCWNoZGlyKCJkYXRhIik7CgljaGRpcigiZmFjdWx0eSIpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgWWVhciBPZiBUaGUgRmFjdWx0eSA6ICI7CglnZXRzKHllYXIpOwoKCWNoZGlyKHllYXIpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgTmFtZSBPZiBUaGUgRmFjdWx0eSA6ICI7CglnZXRzKG5hbWUpOwoKCWNoZGlyKG5hbWUpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgTmFtZSBPZiBBIFBlcnNvbiA6ICI7CglnZXRzKG5hbWUpOwoKCWNoZGlyKG5hbWUpOwoKCWNvdXQ8PCIKCVdoYXQgWW91IFdhbnQgVG8gU2VlIFBlcnNvbmFsIEluZm9ybWF0aW9uIE9yIEFkbWluIApJbmZvcm1hdGlvbgoiOwoJY291dDw8IgoJMS4gUGVyc29uYWwgIjsKCWNvdXQ8PCIKCTIuIEFkbWluc3RyYXRpb24gIjsKCWNvdXQ8PCIKCgkgT3B0aW9uLS0tLS0tPiAiOwoKCWNpbj4+b3B0aW9uOwoKCWNscnNjcigpOwoKCWNvdXQ8PCIKCgoiOwoKCWlmKG9wdGlvbj09MSkKCXsKCQlzdHJjcHkobmV3ZmlsZSwicCIpOwoJCXN0cmNhdChuZXdmaWxlLG5hbWUpOwoJCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CgoJCWlmc3RyZWFtIGZpbihuZXdmaWxlKTsKCgkJaWYoIWZpbikKCQl7CgkJCWNscnNjcigpOwoJCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQkJY291dDw8IgoKCQlQUkVTUyBBTlkgS0VZIFRPIFJldHVybiBUbyBNYWluIE1lbnUgICI7CgkJCWdldGNoKCk7CgkJCWNoZGlyKCJcIik7CgkJCW1haW53aW5kb3coKTsKCQl9CgoJCXdoaWxlKGZpbi5nZXQoY2gpIT0wKQoJCXsKCQkJbW9kPX5jaDsKCQkJY291dDw8bW9kOwoJCX0KCgkJZ2V0Y2goKTsKCQlmaW4uY2xvc2UoKTsKCX0KCglpZihvcHRpb249PTIpCgl7CgkJc3RyY3B5KG5ld2ZpbGUsImEiKTsKCQlzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCQlzdHJjYXQobmV3ZmlsZSwiLnR4dCIpOwoKCQlpZnN0cmVhbSBmaW4obmV3ZmlsZSk7CgoJCWlmKCFmaW4pCgkJewoJCQljbHJzY3IoKTsKCQkJcGVycm9yKCIKCgoKCgkJQ2Fubm90IE9wZW4gVGhlIEZpbGUgIik7CgkJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCQlnZXRjaCgpOwoJCQljaGRpcigiXCIpOwoJCQltYWlud2luZG93KCk7CgkJfQoKCQl3aGlsZShmaW4uZ2V0KGNoKSE9MCkKCQl7CgkJCW1vZD1+Y2g7CgkJCWNvdXQ8PG1vZDsKCQl9CgoJCWdldGNoKCk7CgkJZmluLmNsb3NlKCk7Cgl9CgoJY2hkaXIoIlwiKTsKCW1haW53aW5kb3coKTsKfQoKCi8vIEZVTlRJT04gVE8gTU9ESUZZIEEgRkFDVUxUWSBEQVRBCgp2b2lkIG1vZGlmeWZhY3VsdHkoKQp7CgljbHJzY3IoKTsKCgljaGRpcigiZGF0YSIpOwoJY2hkaXIoImZhY3VsdHkiKTsKCgljb3V0PDwiCgoJRW50ZXIgVGhlIFllYXIgOiAiOwoJZ2V0cyh5ZWFyKTsKCgljaGRpcih5ZWFyKTsKCgljb3V0PDwiCgoJRW50ZXIgVGhlIE5hbWUgT2YgQSBGYWN1bHR5IDogIjsKCWdldHMobmFtZSk7CgoJY2hkaXIobmFtZSk7CgoJY291dDw8IgoKCUVudGVyIFRoZSBOYW1lIE9mIEEgUGVyc29uIDogIjsKCWdldHMobmFtZSk7CgoJc3RhdHVzPXJtZGlyKG5hbWUpOwoKCWlmKHN0YXR1cz09MCkKCXsKCQlwZXJzb25hbGRldGlhbCgpOwoJfQoKCWVsc2UKCXsKCQljbHJzY3IoKTsKCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQljb3V0PDwiCgoJCVBSRVNTIEFOWSBLRVkgVE8gUmV0dXJuIFRvIE1haW4gTWVudSAgIjsKCQlnZXRjaCgpOwoJCWNoZGlyKCJcIik7CgkJbWFpbndpbmRvdygpOwoJfQoKCWNoZGlyKCJcIik7CgltYWlud2luZG93KCk7Cn0KCi8vIEZVTlRJT04gRk9SIERFTEVUSU5HIEEgRkFDVUxUWSBEQVRBCgp2b2lkIGRlbGV0ZWZhY3VsdHkoKQp7CgljbHJzY3IoKTsKCgljaGRpcigiZGF0YSIpOwoJY2hkaXIoImZhY3VsdHkiKTsKCgljb3V0PDwiCgoJRW50ZXIgVGhlIFllYXIgOiAiOwoJZ2V0cyh5ZWFyKTsKCgljaGRpcih5ZWFyKTsKCgljb3V0PDwiCgoKCUVudGVyIFRoZSBOYW1lIE9mIEEgRmFjdWx0eSA6ICI7CglnZXRzKG5hbWUpOwoKCWNoZGlyKG5hbWUpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgTmFtZSBPZiBBIFBlcnNvbiA6ICI7CglnZXRzKG5hbWUpOwoKCWNvdXQ8PCIKCgkJQXJlIFlvdSBTdXJlIFlvdSBXYW50IFRvIFJlbW92ZSBJdCAoeS9uKSA6ICI7CgljaW4+PmNoOwoKCWlmKGNoPT0neScpCgl7CgkJc3RhdHVzPXJtZGlyKG5hbWUpOwoKCQlpZihzdGF0dXM9PTApCgkJewoJCQljb3V0PDwiCgoJCVJlY29yZCBIYXZlIEJlZW4gUmVtb3ZlZCBTdWNjZXNmdWxseSAiOwoJCQljb3V0PDwiCgkJUHJlc3MgQW55IEtleSBUbyBSZXR1cm4gVG8gTWFpbiBNZW51ICI7CgkJCWdldGNoKCk7CgkJCWNoZGlyKCJcIik7CgkJCW1haW53aW5kb3coKTsKCQl9CgoJCWVsc2UKCQl7CgkJCWNscnNjcigpOwoJCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQkJY291dDw8IgoKCQlQUkVTUyBBTlkgS0VZIFRPIFJldHVybiBUbyBNYWluIE1lbnUgICI7CgkJCWdldGNoKCk7CgkJCWNoZGlyKCJcIik7CgkJCW1haW53aW5kb3coKTsKCQl9Cgl9CgoJZWxzZQoJewoJCWNoZGlyKCJcIik7CgkJbWFpbndpbmRvdygpOwoJfQp9CgoKLy8gRlVOQ1RJT04gRk9SIFBSSU5USU5HIFRIRSBEQVRBCgp2b2lkIHByaW4oKQp7CgljbHJzY3IoKTsKCgljb3V0PDwiCkVudGVyIFRoZSBPcHRpb24gIjsKCWNvdXQ8PCIKMS4gRmFjdWx0eSAiOwoJY291dDw8IgoyLiBTdHVkZW50ICI7Cgljb3V0PDwiCgogT3B0aW9uLS0tLS0tPiAiOwoJY2luPj5vcHRpb247CgoJY2hkaXIoImRhdGEiKTsKCglpZihvcHRpb249PTEpCgl7CgkJY2hkaXIoImZhY3VsdHkiKTsKCgkJY291dDw8IgpFbnRlciBUaGUgWWVhciAiOwoJCWdldHMoeWVhcik7CgoJCWNoZGlyKHllYXIpOwoKCQljb3V0PDwiCkVudGVyIFRoZSBOYW1lIE9mIEZhY3VsdHkgIjsKCQlnZXRzKG5hbWUpOwoKCQljaGRpcihuYW1lKTsKCgkJY291dDw8IgpXYW50IFRha2UgQSBQcmludCBEb2N1bWVudCBPZiBQZXJzb25hbCBPciBBZG1pbiBEZXRhaWxzICI7CgkJY291dDw8IgoxLiBQZXJzb25hbCAiOwoJCWNvdXQ8PCIKMi4gQWRtaW5zdHJhdGlvbiAiOwoJCWNvdXQ8PCIKCiBPcHRpb24tLS0tLS0+ICI7CgoJCWNpbj4+b3B0aW9uOwoKCQlpZihvcHRpb249PTEpCgkJewoJCQlzdHJjcHkobmV3ZmlsZSwicCIpOwoJCQlzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCQkJc3RyY2F0KG5ld2ZpbGUsIi50eHQiKTsKCgkJCWlmc3RyZWFtIGZpbjsKCQkJZmluLm9wZW4obmV3ZmlsZSk7CgoJCQlpZighZmluKQoJCQl7CgkJCQljbHJzY3IoKTsKCQkJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCQkJY291dDw8IgoKCQlQUkVTUyBBTlkgS0VZIFRPIFJldHVybiBUbyBNYWluIE1lbnUgICI7CgkJCQlnZXRjaCgpOwoJCQkJY2hkaXIoIlwiKTsKCQkJCW1haW53aW5kb3coKTsKCQkJfQoKCQkJb2ZzdHJlYW0gZm91dDsKCQkJZm91dC5vcGVuKCJQUk4iKTsKCgkJCWlmKCFmb3V0KQoJCQl7CgkJCQljbHJzY3IoKTsKCQkJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCQkJY291dDw8IgoKCQlQUkVTUyBBTlkgS0VZIFRPIFJldHVybiBUbyBNYWluIE1lbnUgICI7CgkJCQlnZXRjaCgpOwoJCQkJY2hkaXIoIlwiKTsKCQkJCW1haW53aW5kb3coKTsKCQkJfQoKCQkJd2hpbGUoZmluLmdldChjaCkhPTApCgkJCXsKCQkJCW1vZD1+Y2g7CgkJCQlmb3V0LnB1dChtb2QpOwoJCQl9CgoJCQlmb3V0LmNsb3NlKCk7CgkJCWZpbi5jbG9zZSgpOwoJCX0KCgkJaWYob3B0aW9uPT0yKQoJCXsKCQkJc3RyY3B5KG5ld2ZpbGUsImEiKTsKCQkJc3RyY2F0KG5ld2ZpbGUsbmFtZSk7CgkJCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CgoJCQlpZnN0cmVhbSBmaW47CgkJCWZpbi5vcGVuKG5ld2ZpbGUpOwoKCQkJaWYoIWZpbikKCQkJewoJCQkJY2xyc2NyKCk7CgkJCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQkJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCQkJZ2V0Y2goKTsKCQkJCWNoZGlyKCJcIik7CgkJCQltYWlud2luZG93KCk7CgkJCX0KCgkJCW9mc3RyZWFtIGZvdXQ7CgkJCWZvdXQub3BlbigiUFJOIik7CgoJCQlpZighZmluKQoJCQl7CgkJCQljbHJzY3IoKTsKCQkJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCQkJY291dDw8IgoKCQlQUkVTUyBBTlkgS0VZIFRPIFJldHVybiBUbyBNYWluIE1lbnUgICI7CgkJCQlnZXRjaCgpOwoJCQkJY2hkaXIoIlwiKTsKCQkJCW1haW53aW5kb3coKTsKCQkJfQoKCQkJd2hpbGUoZmluLmdldChjaCkhPTApCgkJCXsKCQkJCW1vZD1+Y2g7CgkJCQlmb3V0LnB1dChtb2QpOwoJCQl9CgoJCQlmb3V0LmNsb3NlKCk7CgkJCWZpbi5jbG9zZSgpOwoJCX0KCX0KCglpZihvcHRpb249PTIpCgl7CgkJY2hkaXIoInN0dWRlbnQiKTsKCgkJY291dDw8IgpFbnRlciBUaGUgWWVhciAiOwoJCWdldHMoeWVhcik7CgoJCWNoZGlyKHllYXIpOwoKCQljb3V0PDwiCkVudGVyIFRoZSBOYW1lIE9mIFN0dWRlbnQgIjsKCQlnZXRzKG5hbWUpOwoKCQljaGRpcihuYW1lKTsKCgkJY291dDw8IgpXYW50IFRha2UgQSBQcmludCBEb2N1bWVudCBPZiBQZXJzb25hbCBPciBBZG1pbiBEZXRhaWxzICI7CgkJY291dDw8IgoxLiBQZXJzb25hbCAiOwoJCWNvdXQ8PCIKMi4gQWNhZGVtaWMgIjsKCQljb3V0PDwiCgogT3B0aW9uLS0tLS0tPiAiOwoKCQljaW4+Pm9wdGlvbjsKCgkJaWYob3B0aW9uPT0xKQoJCXsKCQkJc3RyY3B5KG5ld2ZpbGUsInAiKTsKCQkJc3RyY2F0KG5ld2ZpbGUsbmFtZSk7CgkJCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CgoJCQlpZnN0cmVhbSBmaW47CgkJCWZpbi5vcGVuKG5ld2ZpbGUpOwoKCQkJaWYoIWZpbikKCQkJewoJCQkJY2xyc2NyKCk7CgkJCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQkJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCQkJZ2V0Y2goKTsKCQkJCWNoZGlyKCJcIik7CgkJCQltYWlud2luZG93KCk7CgkJCX0KCgkJCW9mc3RyZWFtIGZvdXQ7CgkJCWZvdXQub3BlbigiUFJOIik7CgoJCQlpZighZm91dCkKCQkJewoJCQkJY2xyc2NyKCk7CgkJCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQkJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCQkJZ2V0Y2goKTsKCQkJCWNoZGlyKCJcIik7CgkJCQltYWlud2luZG93KCk7CgkJCX0KCgkJCXdoaWxlKGZpbi5nZXQoY2gpIT0wKQoJCQl7CgkJCQltb2Q9fmNoOwoJCQkJZm91dC5wdXQobW9kKTsKCQkJfQoKCQkJZm91dC5jbG9zZSgpOwoJCQlmaW4uY2xvc2UoKTsKCQl9CgoJCWlmKG9wdGlvbj09MikKCQl7CgkJCXN0cmNweShuZXdmaWxlLCJhIik7CgkJCXN0cmNhdChuZXdmaWxlLG5hbWUpOwoJCQlzdHJjYXQobmV3ZmlsZSwiLnR4dCIpOwoKCQkJaWZzdHJlYW0gZmluOwoJCQlmaW4ub3BlbihuZXdmaWxlKTsKCgkJCWlmKCFmaW4pCgkJCXsKCQkJCWNscnNjcigpOwoJCQkJcGVycm9yKCIKCgoKCgkJQ2Fubm90IE9wZW4gVGhlIEZpbGUgIik7CgkJCQljb3V0PDwiCgoJCVBSRVNTIEFOWSBLRVkgVE8gUmV0dXJuIFRvIE1haW4gTWVudSAgIjsKCQkJCWdldGNoKCk7CgkJCQljaGRpcigiXCIpOwoJCQkJbWFpbndpbmRvdygpOwoJCQl9CgoJCQlvZnN0cmVhbSBmb3V0OwoJCQlmb3V0Lm9wZW4oIlBSTiIpOwoKCQkJaWYoIWZvdXQpCgkJCXsKCQkJCWNscnNjcigpOwoJCQkJcGVycm9yKCIKCgoKCgkJQ2Fubm90IE9wZW4gVGhlIEZpbGUgIik7CgkJCQljb3V0PDwiCgoJCVBSRVNTIEFOWSBLRVkgVE8gUmV0dXJuIFRvIE1haW4gTWVudSAgIjsKCQkJCWdldGNoKCk7CgkJCQljaGRpcigiXCIpOwoJCQkJbWFpbndpbmRvdygpOwoJCQl9CgoJCQl3aGlsZShmaW4uZ2V0KGNoKSE9MCkKCQkJewoJCQkJbW9kPX5jaDsKCQkJCWZvdXQucHV0KG1vZCk7CgkJCX0KCgkJCWZvdXQuY2xvc2UoKTsKCQkJZmluLmNsb3NlKCk7CgkJfQoJfQoKCWNoZGlyKCJcIik7CgltYWlud2luZG93KCk7Cn0KCgovLyBGVU5DVElPTiBGT1IgU0hPV0lORyBBIE1BSU4gV0lORE9XIE9GIFNUVURFTlQgSU5GT1JNQVRJT04KCnZvaWQgc3R1ZGVudCgpCnsKCWNscnNjcigpOwoJYm94KCk7CgoJZ290b3h5KDI2LDQpO2NvdXQ8PCJJTlNUSVRVVEUgTUFOQUdFTUVOVCBTWVNURU0gIjsKCWdvdG94eSgyNiw1KTtjb3V0PDwiPT09PT09PT09PT09PT09PT09PT09PT09PT09IjsKCWdvdG94eSgyNiw4KTtjb3V0PDwiQ2hvb3NlIFlvdSBPcHRpb24uLi4uLi4uLiI7Cglnb3RveHkoMjYsMTApO2NvdXQ8PCIxLiBBZGQgQSBOZXcgU3R1ZGVudCBSZWNvcmQgIjsKCWdvdG94eSgyNiwxMik7Y291dDw8IjIuIFNlZSBBbGwgU3R1ZGVudHMgIjsKCWdvdG94eSgyNiwxNCk7Y291dDw8IjMuIEZ1bGwgQWNjZXNzIFRvIEFueSBTdHVkZW50IEluZm9ybWF0aW9uICI7Cglnb3RveHkoMjYsMTYpO2NvdXQ8PCI0LiBNb2RpZnkgQW55IEluZm9ybWF0aW9uICI7Cglnb3RveHkoMjYsMTgpO2NvdXQ8PCI1LiBEZWxldGUgQW55IEluZm9ybWF0aW9uICI7Cglnb3RveHkoMjYsMjApO2NvdXQ8PCJQcmVzcyAwIFRvIEV4aXQuLi4uLi4uICI7Cglnb3RveHkoMjYsMjIpO2NvdXQ8PCJPcHRpb24tLS0tLS0+ICI7CgoJY2luPj5vcHRpb247CgoJc3dpdGNoKG9wdGlvbikKCXsKCQljYXNlIDEgOiBlbnRlcmRhdGFzdCgpOwoJCQlicmVhazsKCgkJCWNhc2UgMiA6IHNlZXRvdGFsc3QoKTsKCQkJCWJyZWFrOwoKCQkJCWNhc2UgMyA6IGZ1bGxhY2Nlc3NzdCgpOwoJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDQgOiBtb2RpZnlzdCgpOwoJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgNSA6IGRlbGV0ZXN0KCk7CgkJCQkJCQlicmVhazsKCgkJCQkJCQlkZWZhdWx0IDogY2xvc2Vwcm9nKCk7CgkJCQkJCQkJYnJlYWs7Cgl9Owp9CgoKLy8gRlVOQ1RJT04gVE8gRU5URVIgQSBTVFVERU5UIERBVEEKCnZvaWQgZW50ZXJkYXRhc3QoKQp7CgljbHJzY3IoKTsKCgljb3V0PDwiCgoJCUVudGVyIFRoZSBZZWFyIFdoaWNoIHlvdSBXYW50IFRvIEFkZCBUaGUgRGF0YSAiOwoJY291dDw8IgoJCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICI7CglnZXRzKHllYXIpOwoKCW1rZGlyKCJkYXRhIik7CgljaGRpcigiZGF0YSIpOwoJbWtkaXIoInN0dWRlbnQiKTsKCWNoZGlyKCJzdHVkZW50Iik7Cglta2Rpcih5ZWFyKTsKCWNoZGlyKHllYXIpOwoKCXBlcnNvbmFsc3QoKTsKCWNoZGlyKCJcIik7CgltYWlud2luZG93KCk7Cn0KCgovLyBGVU5DVElPTiBUTyBFTlRFUiBBIFBFUlNPTkFMIERFVEFJTFMgT0YgQSBTVFVERU5UCgp2b2lkIHBlcnNvbmFsc3QoKQp7Cgljb3V0PDwiCgoJCSAgICBFbnRlciBUaGUgUGVyc29uYWwgRGV0YWlscyAiOwoJY291dDw8IgoJCSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PSAiOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgVGhlIE5hbWUgT2YgVGhlIFN0dWRlbnQgOiAiOwoJZ2V0cyhuYW1lKTsKCglta2RpcihuYW1lKTsKCWNoZGlyKG5hbWUpOwoKCXN0cmNweShuZXdmaWxlLCJwIik7CglzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CglvZnN0cmVhbSBmb3V0KG5ld2ZpbGUpOwoKCWlmKCFmb3V0KQoJewoJCWNscnNjcigpOwoJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCWdldGNoKCk7CgkJY2hkaXIoIlwiKTsKCQltYWlud2luZG93KCk7Cgl9CgoJZm91dDw8IiBOQU1FIDogIjw8bmFtZTsKCgljb3V0PDwiCglGYXRoZXJzIE5hbWUgOiAiOwoJZ2V0cyh0ZW1wKTsKCWZvdXQ8PCIKIEZhdGhlcnMgTmFtZSA6ICI8PHRlbXA7CgogICAgY291dDw8IgoJRGF0ZSBPZiBCaXJ0aCA6ICI7CglnZXRzKHRlbXApOwoJZm91dDw8IgogRGF0ZSBPZiBCaXJ0aCA6ICI8PHRlbXA7CgogICAgY291dDw8IgoJQ29udGFjdCBOdW1iZXIgOiAiOwoJZ2V0cyh0ZW1wKTsKCWZvdXQ8PCIKIENvbnRhY3QgTnVtYmVyIDogIjw8dGVtcDsKCiAgICBjb3V0PDwiCglBZGRyZXNzIDogIjsKCWdldHModGVtcCk7Cglmb3V0PDwiCiBBRERSRVNTIDoiPDx0ZW1wOwoKICAgIGNvdXQ8PCIKCUNvdXJzZSBOYW1lIDogIjsKCWdldHModGVtcCk7Cglmb3V0PDwiCiBDb3Vyc2UgTmFtZSA6ICI8PHRlbXA7CgoJZm91dC5jbG9zZSgpOwoJZW5jcnlwdChuZXdmaWxlKTsKCWFjYWRlbWljKG5hbWUpOwp9CgoKLy8gRlVOQ1RJT04gVE8gRU5URVIgQSBBQ0FERU1JQyBERVRBSUxTIE9GIEEgU1RVREVOVAoKdm9pZCBhY2FkZW1pYyhjaGFyICpuYW1lKQp7CgljbHJzY3IoKTsKCgljb3V0PDwiCgoJCSAgICBFbnRlciBUaGUgQWNhZGVtaWMgRGV0aWFscyAiOwoJY291dDw8IgoJCSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PSAiOwoKCXN0cmNweShuZXdmaWxlLCJhIik7CglzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CgoJb2ZzdHJlYW0gZm91dHQobmV3ZmlsZSk7CgoJaWYoIWZvdXR0KQoJewoJCWNscnNjcigpOwoJCXBlcnJvcigiCgoKCgoJCUNhbm5vdCBPcGVuIFRoZSBGaWxlICIpOwoJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCWdldGNoKCk7CgkJY2hkaXIoIlwiKTsKCQltYWlud2luZG93KCk7Cgl9CgoJZm91dHQ8PCIgTkFNRSA6ICI8PG5hbWU7CgoJY291dDw8IgoJVHlwZSBPZiBDb3Vyc2UgKFNlbXN0ZXIvQW5udWFsKSA6ICI7CglnZXRzKHRlbXApOwoJZm91dHQ8PCIKIFR5cGUgT2YgQ291cnNlIChTZW1lc3Rlci9Bbm51YWwpIDogIjw8dGVtcDsKCiAgICBjb3V0PDwiCglZZWFyIE9mIEFkbWlzc2lvbiA6ICI7CglnZXRzKHRlbXApOwoJZm91dHQ8PCIKIFllYXIgT2YgQWRtaXNzaW9uIDogIjw8dGVtcDsKCiAgICBjb3V0PDwiCglBZG1pc3Npb24gTnVtYmVyIDogIjsKCWdldHModGVtcCk7Cglmb3V0dDw8IgogQWRtaXNzaW9uIE51bWJlciA6ICI8PHRlbXA7CgogICAgY291dDw8IgoJUGVyY2VudGFnZSBJbiBJbnRlcm1lZGlhdGUgOiAiOwoJZ2V0cyh0ZW1wKTsKCWZvdXR0PDwiCiBQZXJjZW50YWdlIEluIEludGVybWVkaWF0ZSA6ICI8PHRlbXA7CgogICAgY291dDw8IgoJCVBlcmNlbnRhZ2UgSW4gQ29sbGVnZSA6IjsKICAgIGZvdXR0PDwiCgkgUGVyY2VudGFnZSBJbiBDb2xsZWdlIDogIjsKCiAgICBjb3V0PDwiCglGaXJzdCBZZWFyIDogIjsKCWdldHModGVtcCk7Cglmb3V0dDw8IgogRmlyc3QgWWVhciA6Ijw8dGVtcDsKCiAgICBjb3V0PDwiCglTZWNvbmQgWWVhciA6ICI7CglnZXRzKHRlbXApOwoJZm91dHQ8PCIKIFNlY29uZCBZZWFyIDoiPDx0ZW1wOwoKICAgIGNvdXQ8PCIKCVRoaXJkIFllYXIgOiAiOwoJZ2V0cyh0ZW1wKTsKCWZvdXR0PDwiCiB0aGlyZCBZZWFyIDoiPDx0ZW1wOwoKCWZvdXR0LmNsb3NlKCk7CgllbmNyeXB0KG5ld2ZpbGUpOwp9CgoKLy8gRlVOQ1RJT04gVE8gU0VFIEEgVE9UQUwgU1RVREVOVFMgT0YgQSBQQVJUSUNVTEFSIFlFQVIKCnZvaWQgc2VldG90YWxzdCgpCnsKCWNscnNjcigpOwoKCWNoZGlyKCJkYXRhIik7CgljaGRpcigic3R1ZGVudCIpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgWWVhciBPZiBXaGljaCBZb3UgV2FudCBUbyBTZWUgVGhlIFN0dWRlbnRzIAoiOwoJZ2V0cyh5ZWFyKTsKCgljaGRpcih5ZWFyKTsKCgljb3V0PDwiCgoJICBUaGVzZSBBcmUgVGhlIFN0dWRlbnRzIAoKIjsKCglzeXN0ZW0oImRpciAvYiAvYWQgL3ciKTsKCglnZXRjaCgpOwoJY2hkaXIoIlwiKTsKCW1haW53aW5kb3coKTsKfQoKCi8vIEZVTkNUSU9OIFRPIFNFRSBBTEwgREVUQUlMUyBPRiBBIFNUVURFTlQKCnZvaWQgZnVsbGFjY2Vzc3N0KCkKewoJY2xyc2NyKCk7CgoJY2hkaXIoImRhdGEiKTsKCWNoZGlyKCJzdHVkZW50Iik7CgoJY291dDw8IgoKCUVudGVyIFRoZSBZZWFyIE9mIFRoZSBTdHVkZW50IDogIjsKCWdldHMoeWVhcik7CgoJY2hkaXIoeWVhcik7CgoJY291dDw8IgoKCUVudGVyIFRoZSBOYW1lIE9mIFRoZSBTdHVkZW50IDogIjsKCWdldHMobmFtZSk7CgoJY2hkaXIobmFtZSk7CgoJY291dDw8IgoKCVdoYXQgWW91IFdhbnQgVG8gU2VlIFBlcnNvbmFsIEluZm9ybWF0aW9uIE9yIEFjYWRlbWljCkluZm9ybWF0aW9uICI7Cgljb3V0PDwiCgkxLiBQZXJzb25hbCAiOwoJY291dDw8IgoJMi4gQWNhZGVtaWMgIjsKCWNvdXQ8PCIKCgkgT3B0aW9uLS0tLS0tPiAiOwoKCWNpbj4+b3B0aW9uOwoKCWNscnNjcigpOwoKCWNvdXQ8PCIKCgoiOwoKCWlmKG9wdGlvbj09MSkKCXsKCQlzdHJjcHkobmV3ZmlsZSwicCIpOwoJCXN0cmNhdChuZXdmaWxlLG5hbWUpOwoJCXN0cmNhdChuZXdmaWxlLCIudHh0Iik7CgoJCWlmc3RyZWFtIGZpbihuZXdmaWxlKTsKCgkJaWYoIWZpbikKCQl7CgkJCWNscnNjcigpOwoJCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQkJY291dDw8IgoKCQlQUkVTUyBBTlkgS0VZIFRPIFJldHVybiBUbyBNYWluIE1lbnUgICI7CgkJCWdldGNoKCk7CgkJCWNoZGlyKCJcIik7CgkJCW1haW53aW5kb3coKTsKCQl9CgoJCXdoaWxlKGZpbi5nZXQoY2gpIT0wKQoJCXsKCQkJbW9kPX5jaDsKCQkJY291dDw8bW9kOwoJCX0KCgkJZ2V0Y2goKTsKCQlmaW4uY2xvc2UoKTsKCX0KCglpZihvcHRpb249PTIpCgl7CgkJc3RyY3B5KG5ld2ZpbGUsImEiKTsKCQlzdHJjYXQobmV3ZmlsZSxuYW1lKTsKCQlzdHJjYXQobmV3ZmlsZSwiLnR4dCIpOwoKCQlpZnN0cmVhbSBmaW4obmV3ZmlsZSk7CgoJCWlmKCFmaW4pCgkJewoJCQljbHJzY3IoKTsKCQkJcGVycm9yKCIKCgoKCgkJQ2Fubm90IE9wZW4gVGhlIEZpbGUgIik7CgkJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCQlnZXRjaCgpOwoJCQljaGRpcigiXCIpOwoJCQltYWlud2luZG93KCk7CgkJfQoKCQl3aGlsZShmaW4uZ2V0KGNoKSE9MCkKCQl7CgkJCW1vZD1+Y2g7CgkJCWNvdXQ8PG1vZDsKCQl9CgoJCWdldGNoKCk7CgkJZmluLmNsb3NlKCk7Cgl9CgoJY2hkaXIoIlwiKTsKCW1haW53aW5kb3coKTsKfQoKCi8vIEZVTkNUSU9OIFRPIE1PRElGWSBERVRBSUxTIE9GIEEgU1RVREVOVAoKdm9pZCBtb2RpZnlzdCgpCnsKCWNoZGlyKCJkYXRhIik7CgljaGRpcigic3R1ZGVudCIpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgWWVhciBPZiBZb3UgV2FudCBUbyBDaGFuZ2UgVGhlIEluZm9ybWF0aW9uIDogIjsKCWdldHMoeWVhcik7CgoJY2hkaXIoeWVhcik7CgoJY291dDw8IgoKCUVudGVyIFRoZSBOYW1lIE9mIEEgU3R1ZGVudCA6ICI7CglnZXRzKG5hbWUpOwoKCXN0YXR1cz1ybWRpcihuYW1lKTsKCglpZihzdGF0dXM9PTApCgl7CgkJcGVyc29uYWxzdCgpOwoJfQoKCWVsc2UKCXsKCQljbHJzY3IoKTsKCQlwZXJyb3IoIgoKCgoKCQlDYW5ub3QgT3BlbiBUaGUgRmlsZSAiKTsKCQljb3V0PDwiCgoJCVBSRVNTIEFOWSBLRVkgVE8gUmV0dXJuIFRvIE1haW4gTWVudSAgIjsKCQlnZXRjaCgpOwoJCWNoZGlyKCJcIik7CgkJbWFpbndpbmRvdygpOwoJfQoKCWNoZGlyKCJcIik7CgltYWlud2luZG93KCk7Cn0KCgovLyBGVU5DVElPTiBUTyBERUxFVEUgQSBTVFVERU5UIFJFQ09SRAoKdm9pZCBkZWxldGVzdCgpCnsKCWNscnNjcigpOwoKCWNoZGlyKCJkYXRhIik7CgljaGRpcigic3R1ZGVudCIpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgWWVhciA6ICI7CglnZXRzKHllYXIpOwoKCWNoZGlyKHllYXIpOwoKCWNvdXQ8PCIKCglFbnRlciBUaGUgTmFtZSBPZiBBIFN0dWRlbnQgOiAiOwoJZ2V0cyhuYW1lKTsKCgljb3V0PDwiCgoJCUFyZSBZb3UgU3VyZSBZb3UgV2FudCBUbyBSZW1vdmUgSXQgKHkvbikgOiAiOwoJY2luPj5jaDsKCglpZihjaD09J3knKQoJewoJCXN0YXR1cz1ybWRpcihuYW1lKTsKCgkJaWYoc3RhdHVzPT0wKQoJCXsKCQkJY291dDw8IgoKCQlSZWNvcmQgSGF2ZSBCZWVuIFJlbW92ZWQgU3VjY2VzZnVsbHkgIjsKCQkJY291dDw8IgoJCVByZXNzIEFueSBLZXkgVG8gUmV0dXJuIFRvIE1haW4gTWVudSAiOwoJCQlnZXRjaCgpOwoJCQljaGRpcigiXCIpOwoJCQltYWlud2luZG93KCk7CgkJfQoKCQllbHNlCgkJewoJCQljbHJzY3IoKTsKCQkJcGVycm9yKCIKCgoKCgkJQ2Fubm90IE9wZW4gVGhlIEZpbGUgIik7CgkJCWNvdXQ8PCIKCgkJUFJFU1MgQU5ZIEtFWSBUTyBSZXR1cm4gVG8gTWFpbiBNZW51ICAiOwoJCQlnZXRjaCgpOwoJCQljaGRpcigiXCIpOwoJCQltYWlud2luZG93KCk7CgkJfQoJfQoKCWVsc2UKCXsKCQljaGRpcigiXCIpOwoJCW1haW53aW5kb3coKTsKCX0KfQoKCi8vIEZVTkNUSU9OIFRPIENMT1NFIEEgUFJPR1JBTQoKdm9pZCBjbG9zZXByb2coKQp7CglncmFwKCk7CglzZXRjb2xvcig2KTsKCglmb3IoaT0wO2k8PTIyMDtpKyspCgl7CgkJcmVjdGFuZ2xlKDAraSwwK2ksNjQwLWksNDgwLWkpOwoJCWRlbGF5KDE1KTsKCX0KCglmb3IoaT0wO2k8PTIyMDtpKyspCgl7CgkJcmVjdGFuZ2xlKDEwMCtpLDEwMCw1NDAtaSwzODApOwoJCWRlbGF5KDEwKTsKCX0KCglxdWl0KCk7CgljbG9zZWdyYXBoKCk7CglleGl0KDApOwp9CgoKdm9pZCBxdWl0KCkKewoJaW50IGEsYixjOwoJc2V0Y29sb3IoMCk7CgoJZm9yKGE9MSxiPWdldG1heHkoKS0xLGM9MjAwO2E8PWdldG1heHkoKS8yO2ErKyxiLS0sYy0tKQoJewoJCWxpbmUoMSxhLGdldG1heHgoKS0xLGEpOwoJCWxpbmUoMSxiLGdldG1heHgoKS0xLGIpOwoJCXNvdW5kKDEwKihjKzIwMCkpOwoJCWRlbGF5KDEpOwoJfQoKCWRlbGF5KDMwMCk7Cglub3NvdW5kKCk7CglzZXRjb2xvcig0KTsKCgl0eXBlbWUoeHkoMikseHkoMjApLCJERVZFTE9QRUQgQlk6IFZJVkVLIEFORCBTQVVSQUJIIEpBSU4iLDMwKTsKCWRlbGF5KDEwMDApOwoJc2V0Y29sb3IoMCk7CgoJdHlwZW1lKHh5KDIpLHh5KDIwKSwiICBERVZFTE9QRUQgQlkgOiBTQVVSQUJIIEpBSU4gIiwzMCk7CglkZWxheSgxMDApOwoJc2V0Y29sb3IoNCk7CgoJdHlwZW1lKHh5KDIpLHh5KDIwKSwiRk9SIFlPVVIgQ09NTUVOVFMgQU5EIFlPVVIgU1VHR0VTVElPTlMiLDMwKTsKCWRlbGF5KDUwMCk7CglzZXRjb2xvcig0KTsKCgl0eXBlbWUoeHkoMikseHkoMjYpLCJFTUFJTCBNRSBBVCBkcm9wdXJtYWlsc19oZXJlQHlhaG9vLmNvbSIsMzApOwoJZGVsYXkoMjAwMCk7Cn0KCgp2b2lkIHR5cGVtZShpbnQgbGVmdCxpbnQgdG9wLGNvbnN0IGNoYXIgKndvcmQsaW50IGludGVydmFsKQp7CgljaGFyIGNvZGVbMl07CglpbnQgbGVuZ3RoPXN0cmxlbih3b3JkKTsKCWZvcihpbnQgaT0wO2k8PWxlbmd0aDtpKyspCgl7CgkJY29kZVswXT13b3JkW2ldOwoJCWNvZGVbMV09JwogICAKICAgCQogCiAJCgkJCQkJIAogICAgCSAJIAkgCgkgIAkKCSAJCgkKIAkgICAJIAkgCgkKICAKIAogCgogIAkKCgoK