#include <stdio.h>
#include <string.h>
#define MAX 100
typedef struct {
int id;
char studentID[20];
char name[50];
char department[30];
char message[200];
int resolved;
char solution[200];
} Complaint;
Complaint complaints[MAX];
int count = 0;
//function remove new line
void trimNewline(char *s)
{
}
//department chack
int validDepartment(const char *dept)
{
return (strcmp(dept
, "CSE") == 0 || strcmp(dept
, "EEE") == 0 || strcmp(dept
, "CCE") == 0 || strcmp(dept
, "Other") == 0); }
//1)complaint add function
void addComplaint(void) {
if (count >= MAX)
{
puts("Complaint list is full!"); return;
}
complaints[count].id = count + 1;
fgets(complaints
[count
].
studentID, sizeof(complaints
[count
].
studentID), stdin
); trimNewline(complaints[count].studentID);
while(1) {
printf("Department (CSE/EEE/CCE/Other): "); fgets(complaints
[count
].
department, sizeof(complaints
[count
].
department), stdin
); trimNewline(complaints[count].department);
if (validDepartment(complaints[count].department))
break;
else
printf(" Invalid department! Please enter one of: CSE, EEE, CCE, Other.\n"); }
char anon;
printf("Do you want to keep your name anonymous? (Y/N): ");
if (anon == 'Y' || anon == 'y') {
strcpy(complaints
[count
].
name, "Anonymous"); } else {
fgets(complaints
[count
].
name, sizeof(complaints
[count
].
name), stdin
); trimNewline(complaints[count].name);
}
printf("Complaint message : "); fgets(complaints
[count
].
message, sizeof(complaints
[count
].
message), stdin
); trimNewline(complaints[count].message);
complaints[count].resolved = 0;
complaints[count].solution[0] = '\0';
printf(" Complaint submitted with ID #%d\n", complaints
[count
].
id); count++;
}
//2)view all function
void viewAll(void) {
if (count == 0)
{
puts("No complaints yet."); return;
}
puts("\n--- Pending Complaints ---"); for (int i = 0; i < count; i++) {
if (complaints[i].resolved==0) {
printf("\nID : %d\n", complaints
[i
].
id);
if (strcmp(complaints
[i
].
name, "Anonymous") == 0) { printf("Student ID: Hidden\n"); } else {
printf("Student ID: %s\n", complaints
[i
].
studentID); printf("Name : %s\n", complaints
[i
].
name); }
printf("Dept : %s\n", complaints
[i
].
department); printf("Message : %s\n", complaints
[i
].
message); }
}
puts("\n--- Resolved Complaints ---"); for (int i = 0; i < count; i++) {
if (complaints[i].resolved) {
printf("\nID : %d\n", complaints
[i
].
id);
if (strcmp(complaints
[i
].
name, "Anonymous") == 0) { printf("Student ID: Hidden\n"); } else {
printf("Student ID: %s\n", complaints
[i
].
studentID); printf("Name : %s\n", complaints
[i
].
name); }
printf("Dept : %s\n", complaints
[i
].
department); printf("Message : %s\n", complaints
[i
].
message); complaints[i].solution[0] ? complaints[i].solution : "(no details)");
}
}
}
//3)view department complaints
void viewDepartmentComplaints(void)
{
if (count
== 0) { puts("No complaints yet."); return; }
char dept[30];
while(1) {
printf("Enter department to view (CSE/EEE/CCE/Other): "); fgets(dept
, sizeof(dept
), stdin
); trimNewline(dept);
if (validDepartment(dept))
break;
else
printf(" Invalid department! Please enter one of: CSE, EEE, CCE, Other.\n"); }
int found = 0;
printf("\n--- Complaints for %s Department ---\n", dept
); for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0) { found = 1;
printf("\nID : %d\n", complaints
[i
].
id); if (strcmp(complaints
[i
].
name, "Anonymous") == 0) { printf("Student ID: Hidden\n"); } else {
printf("Student ID: %s\n", complaints
[i
].
studentID); printf("Name : %s\n", complaints
[i
].
name); }
printf("Status : %s\n", complaints
[i
].
resolved ? "Resolved" : "Pending"); printf("Message : %s\n", complaints
[i
].
message); if (complaints[i].resolved) {
printf("Solution : %s\n", complaints
[i
].
solution[0] ? complaints
[i
].
solution : "(no details)"); }
}
}
if (!found) {
printf("No complaints found for department %s.\n", dept
); }
}
//4)solvecommplaint function
void solveComplaint(void) {
if (count == 0) {
puts("No complaints to solve."); return;
}
int id;
printf("Enter complaint ID to mark solved: "); if (scanf("%d", &id
) != 1) {
return;
}
if (id < 1 || id > count)
{
return;
}
if (complaints[id - 1].resolved)
{
puts("Already resolved."); return;
}
printf("Enter solution description (optional): "); fgets(complaints
[id
- 1].
solution, sizeof(complaints[id - 1].solution), stdin);
trimNewline(complaints[id - 1].solution);
complaints[id - 1].resolved = 1;
puts("Complaint marked as solved."); }
//5) notice board er function
void noticeBoard(void) {
if (count == 0) {
puts("No complaints yet."); return;
}
puts("\n==== NOTICE BOARD ====");
const char *departments[] = {"CSE", "EEE", "CCE", "Other"};
int numDept = 4;
for (int d = 0; d < numDept; d++) {
const char *dept = departments[d];
int pendingCount = 0, resolvedCount = 0;
// Check complaints count by status
for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0) { if (!complaints[i].resolved)
pendingCount++;
else
resolvedCount++;
}
}
if (pendingCount == 0 && resolvedCount == 0) {
printf("\n-- %s Department --\nNo complaints found.\n", dept
); continue;
}
printf("\n-- %s Department --\n", dept
);
if (pendingCount > 0) {
puts("Pending Complaints:"); for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0 && !complaints
[i
].
resolved) {
printf("#%d | %s\n", complaints
[i
].
id, complaints
[i
].
message);
}
}
} else
{
puts("No pending complaints."); }
if (resolvedCount > 0) {
puts("Resolved Complaints:"); for (int i = 0; i < count; i++)
{
if (strcmp(complaints
[i
].
department, dept
) == 0 && complaints
[i
].
resolved) {
printf("#%d | %s\n", complaints
[i
].
id, complaints
[i
].
message); }
}
} else {
puts("No resolved complaints."); }
}
}
int main(void) {
int choice;
while (1) {
puts("\n===== Complaint Routing System ====="); puts("1. Submit Complaint"); puts("2. View All Complaints"); puts("3. View Complaints by Department"); puts("4. Solve Complaint"); if (scanf("%d", &choice
) != 1) break;
switch (choice) {
case 1: addComplaint(); break;
case 2: viewAll(); break;
case 3: viewDepartmentComplaints(); break;
case 4: solveComplaint(); break;
case 5: noticeBoard(); break;
case 6: puts("Goodbye!"); return 0; default: puts("Invalid choice!"); }
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYIDEwMAoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50ICBpZDsgICAgICAgICAgICAgICAgIAogICAgY2hhciBzdHVkZW50SURbMjBdOyAgICAgIAogICAgY2hhciBuYW1lWzUwXTsgICAgICAgICAgIAogICAgY2hhciBkZXBhcnRtZW50WzMwXTsgICAgIAogICAgY2hhciBtZXNzYWdlWzIwMF07ICAgICAgIAogICAgaW50ICByZXNvbHZlZDsgICAgICAgICAgIAogICAgY2hhciBzb2x1dGlvblsyMDBdOyAgICAgIAp9IENvbXBsYWludDsKCkNvbXBsYWludCBjb21wbGFpbnRzW01BWF07CmludCBjb3VudCA9IDA7Ci8vZnVuY3Rpb24gcmVtb3ZlIG5ldyBsaW5lCgp2b2lkIHRyaW1OZXdsaW5lKGNoYXIgKnMpIAogICAgIHsKICAgICAgICAgc1tzdHJjc3BuKHMsICJcbiIpXSA9ICdcMCc7CiAgICAgfQovL2RlcGFydG1lbnQgY2hhY2sKCmludCB2YWxpZERlcGFydG1lbnQoY29uc3QgY2hhciAqZGVwdCkKIHsKICAgIHJldHVybiAoc3RyY21wKGRlcHQsICJDU0UiKSA9PSAwIHx8IHN0cmNtcChkZXB0LCAiRUVFIikgPT0gMCB8fCBzdHJjbXAoZGVwdCwgIkNDRSIpID09IDAgfHwgc3RyY21wKGRlcHQsICJPdGhlciIpID09IDApOwp9Ci8vMSljb21wbGFpbnQgYWRkIGZ1bmN0aW9uCgp2b2lkIGFkZENvbXBsYWludCh2b2lkKSB7CiAgICBpZiAoY291bnQgPj0gTUFYKQogICAgeyAKICAgICAgICBwdXRzKCJDb21wbGFpbnQgbGlzdCBpcyBmdWxsISIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgZ2V0Y2hhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgY29tcGxhaW50c1tjb3VudF0uaWQgPSBjb3VudCArIDE7ICAgICAgCgogICAgcHJpbnRmKCJTdHVkZW50IElEICAgICAgICAgIDogIik7CiAgICBmZ2V0cyhjb21wbGFpbnRzW2NvdW50XS5zdHVkZW50SUQsIHNpemVvZihjb21wbGFpbnRzW2NvdW50XS5zdHVkZW50SUQpLCBzdGRpbik7CiAgICB0cmltTmV3bGluZShjb21wbGFpbnRzW2NvdW50XS5zdHVkZW50SUQpOwoKICAgIHdoaWxlKDEpIHsKICAgICAgICBwcmludGYoIkRlcGFydG1lbnQgKENTRS9FRUUvQ0NFL090aGVyKTogIik7CiAgICAgICAgZmdldHMoY29tcGxhaW50c1tjb3VudF0uZGVwYXJ0bWVudCwgc2l6ZW9mKGNvbXBsYWludHNbY291bnRdLmRlcGFydG1lbnQpLCBzdGRpbik7CiAgICAgICAgdHJpbU5ld2xpbmUoY29tcGxhaW50c1tjb3VudF0uZGVwYXJ0bWVudCk7CgogICAgICAgIGlmICh2YWxpZERlcGFydG1lbnQoY29tcGxhaW50c1tjb3VudF0uZGVwYXJ0bWVudCkpCiAgICAgICAgYnJlYWs7CiAgICAgICAgZWxzZSAKICAgICAgICBwcmludGYoIiBJbnZhbGlkIGRlcGFydG1lbnQhIFBsZWFzZSBlbnRlciBvbmUgb2Y6IENTRSwgRUVFLCBDQ0UsIE90aGVyLlxuIik7CiAgICB9CgogICAgY2hhciBhbm9uOwogICAgcHJpbnRmKCJEbyB5b3Ugd2FudCB0byBrZWVwIHlvdXIgbmFtZSBhbm9ueW1vdXM/IChZL04pOiAiKTsKICAgIHNjYW5mKCIgJWMiLCAmYW5vbik7ICAgICAgICAgICAgICAgICAgIAogICAgZ2V0Y2hhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgaWYgKGFub24gPT0gJ1knIHx8IGFub24gPT0gJ3knKSB7CiAgICAgICAgc3RyY3B5KGNvbXBsYWludHNbY291bnRdLm5hbWUsICJBbm9ueW1vdXMiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJZb3VyIE5hbWUgICAgICAgICAgOiAiKTsKICAgICAgICBmZ2V0cyhjb21wbGFpbnRzW2NvdW50XS5uYW1lLCBzaXplb2YoY29tcGxhaW50c1tjb3VudF0ubmFtZSksIHN0ZGluKTsKICAgICAgICB0cmltTmV3bGluZShjb21wbGFpbnRzW2NvdW50XS5uYW1lKTsKICAgIH0KCiAgICBwcmludGYoIkNvbXBsYWludCBtZXNzYWdlICAgOiAiKTsKICAgIGZnZXRzKGNvbXBsYWludHNbY291bnRdLm1lc3NhZ2UsIHNpemVvZihjb21wbGFpbnRzW2NvdW50XS5tZXNzYWdlKSwgc3RkaW4pOwogICAgdHJpbU5ld2xpbmUoY29tcGxhaW50c1tjb3VudF0ubWVzc2FnZSk7CgogICAgY29tcGxhaW50c1tjb3VudF0ucmVzb2x2ZWQgPSAwOwogICAgY29tcGxhaW50c1tjb3VudF0uc29sdXRpb25bMF0gPSAnXDAnOwoKICAgIHByaW50ZigiIENvbXBsYWludCBzdWJtaXR0ZWQgd2l0aCBJRCAjJWRcbiIsIGNvbXBsYWludHNbY291bnRdLmlkKTsKICAgIGNvdW50Kys7Cn0KLy8yKXZpZXcgYWxsIGZ1bmN0aW9uCnZvaWQgdmlld0FsbCh2b2lkKSB7CiAgICBpZiAoY291bnQgPT0gMCkgCiAgICB7CiAgICAgICAgIHB1dHMoIk5vIGNvbXBsYWludHMgeWV0LiIpOwogICAgICAgICByZXR1cm47IAogICAgICAgIH0KCiAgICBwdXRzKCJcbi0tLSBQZW5kaW5nIENvbXBsYWludHMgLS0tIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICBpZiAoY29tcGxhaW50c1tpXS5yZXNvbHZlZD09MCkgewogICAgICAgICAgICBwcmludGYoIlxuSUQgICAgICAgIDogJWRcbiIsIGNvbXBsYWludHNbaV0uaWQpOwoKICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLm5hbWUsICJBbm9ueW1vdXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlN0dWRlbnQgSUQ6IEhpZGRlblxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIk5hbWUgICAgICA6IEFub255bW91c1xuIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlN0dWRlbnQgSUQ6ICVzXG4iLCBjb21wbGFpbnRzW2ldLnN0dWRlbnRJRCk7CiAgICAgICAgICAgICAgICBwcmludGYoIk5hbWUgICAgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLm5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwcmludGYoIkRlcHQgICAgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLmRlcGFydG1lbnQpOwogICAgICAgICAgICBwcmludGYoIk1lc3NhZ2UgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0KCiAgICBwdXRzKCJcbi0tLSBSZXNvbHZlZCBDb21wbGFpbnRzIC0tLSIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgaWYgKGNvbXBsYWludHNbaV0ucmVzb2x2ZWQpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbklEICAgICAgICA6ICVkXG4iLCBjb21wbGFpbnRzW2ldLmlkKTsKCiAgICAgICAgICAgIGlmIChzdHJjbXAoY29tcGxhaW50c1tpXS5uYW1lLCAiQW5vbnltb3VzIikgPT0gMCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJTdHVkZW50IElEOiBIaWRkZW5cbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJOYW1lICAgICAgOiBBbm9ueW1vdXNcbiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnRmKCJTdHVkZW50IElEOiAlc1xuIiwgY29tcGxhaW50c1tpXS5zdHVkZW50SUQpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJOYW1lICAgICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5uYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRmKCJEZXB0ICAgICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5kZXBhcnRtZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJNZXNzYWdlICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5tZXNzYWdlKTsKICAgICAgICAgICAgcHJpbnRmKCJTb2x1dGlvbiAgOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgIGNvbXBsYWludHNbaV0uc29sdXRpb25bMF0gPyBjb21wbGFpbnRzW2ldLnNvbHV0aW9uIDogIihubyBkZXRhaWxzKSIpOwogICAgICAgIH0KICAgIH0KfQovLzMpdmlldyBkZXBhcnRtZW50IGNvbXBsYWludHMgCnZvaWQgdmlld0RlcGFydG1lbnRDb21wbGFpbnRzKHZvaWQpIAp7CiAgICBpZiAoY291bnQgPT0gMCkgeyBwdXRzKCJObyBjb21wbGFpbnRzIHlldC4iKTsgcmV0dXJuOyB9CgogICAgY2hhciBkZXB0WzMwXTsKICAgIGdldGNoYXIoKTsgLy8gbmV3bGluZSByZW1vdmUKICAgIHdoaWxlKDEpIHsKICAgICAgICBwcmludGYoIkVudGVyIGRlcGFydG1lbnQgdG8gdmlldyAoQ1NFL0VFRS9DQ0UvT3RoZXIpOiAiKTsKICAgICAgICBmZ2V0cyhkZXB0LCBzaXplb2YoZGVwdCksIHN0ZGluKTsKICAgICAgICB0cmltTmV3bGluZShkZXB0KTsKICAgICAgICBpZiAodmFsaWREZXBhcnRtZW50KGRlcHQpKQogICAgICAgIGJyZWFrOwogICAgICAgIGVsc2UgCiAgICAgICAgcHJpbnRmKCIgSW52YWxpZCBkZXBhcnRtZW50ISBQbGVhc2UgZW50ZXIgb25lIG9mOiBDU0UsIEVFRSwgQ0NFLCBPdGhlci5cbiIpOwogICAgfQoKICAgIGludCBmb3VuZCA9IDA7CiAgICBwcmludGYoIlxuLS0tIENvbXBsYWludHMgZm9yICVzIERlcGFydG1lbnQgLS0tXG4iLCBkZXB0KTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIGlmIChzdHJjbXAoY29tcGxhaW50c1tpXS5kZXBhcnRtZW50LCBkZXB0KSA9PSAwKSB7CiAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgcHJpbnRmKCJcbklEICAgICAgICA6ICVkXG4iLCBjb21wbGFpbnRzW2ldLmlkKTsKICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLm5hbWUsICJBbm9ueW1vdXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlN0dWRlbnQgSUQ6IEhpZGRlblxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIk5hbWUgICAgICA6IEFub255bW91c1xuIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlN0dWRlbnQgSUQ6ICVzXG4iLCBjb21wbGFpbnRzW2ldLnN0dWRlbnRJRCk7CiAgICAgICAgICAgICAgICBwcmludGYoIk5hbWUgICAgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50ZigiU3RhdHVzICAgIDogJXNcbiIsIGNvbXBsYWludHNbaV0ucmVzb2x2ZWQgPyAiUmVzb2x2ZWQiIDogIlBlbmRpbmciKTsKICAgICAgICAgICAgcHJpbnRmKCJNZXNzYWdlICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5tZXNzYWdlKTsKICAgICAgICAgICAgaWYgKGNvbXBsYWludHNbaV0ucmVzb2x2ZWQpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiU29sdXRpb24gIDogJXNcbiIsIGNvbXBsYWludHNbaV0uc29sdXRpb25bMF0gPyBjb21wbGFpbnRzW2ldLnNvbHV0aW9uIDogIihubyBkZXRhaWxzKSIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCFmb3VuZCkgewogICAgICAgIHByaW50ZigiTm8gY29tcGxhaW50cyBmb3VuZCBmb3IgZGVwYXJ0bWVudCAlcy5cbiIsIGRlcHQpOwogICAgfQp9Ci8vNClzb2x2ZWNvbW1wbGFpbnQgZnVuY3Rpb24Kdm9pZCBzb2x2ZUNvbXBsYWludCh2b2lkKSB7CiAgICBpZiAoY291bnQgPT0gMCkgeyAKICAgICAgICBwdXRzKCJObyBjb21wbGFpbnRzIHRvIHNvbHZlLiIpOyAKICAgICAgICByZXR1cm47IAogICAgfQoKICAgIGludCBpZDsKICAgIHByaW50ZigiRW50ZXIgY29tcGxhaW50IElEIHRvIG1hcmsgc29sdmVkOiAiKTsKICAgIGlmIChzY2FuZigiJWQiLCAmaWQpICE9IDEpCiAgICAgeyAKICAgICAgICBwdXRzKCJJbnZhbGlkIGlucHV0LiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgZ2V0Y2hhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICBpZiAoaWQgPCAxIHx8IGlkID4gY291bnQpIAogICAgewogICAgICAgICBwdXRzKCIgSW52YWxpZCBJRC4iKTsKICAgICAgICAgIHJldHVybjsgCiAgICAgfQogICAgaWYgKGNvbXBsYWludHNbaWQgLSAxXS5yZXNvbHZlZCkgCiAgICB7CiAgICAgICAgIHB1dHMoIkFscmVhZHkgcmVzb2x2ZWQuIik7IAogICAgICAgICByZXR1cm47IAogICAgfQoKICAgIHByaW50ZigiRW50ZXIgc29sdXRpb24gZGVzY3JpcHRpb24gKG9wdGlvbmFsKTogIik7CiAgICBmZ2V0cyhjb21wbGFpbnRzW2lkIC0gMV0uc29sdXRpb24sCiAgICAgICAgICBzaXplb2YoY29tcGxhaW50c1tpZCAtIDFdLnNvbHV0aW9uKSwgc3RkaW4pOwogICAgdHJpbU5ld2xpbmUoY29tcGxhaW50c1tpZCAtIDFdLnNvbHV0aW9uKTsKCiAgICBjb21wbGFpbnRzW2lkIC0gMV0ucmVzb2x2ZWQgPSAxOwogICAgcHV0cygiQ29tcGxhaW50IG1hcmtlZCBhcyBzb2x2ZWQuIik7Cn0KLy81KSBub3RpY2UgYm9hcmQgZXIgZnVuY3Rpb24Kdm9pZCBub3RpY2VCb2FyZCh2b2lkKSB7CiAgICBpZiAoY291bnQgPT0gMCkgeyAKICAgICAgICBwdXRzKCJObyBjb21wbGFpbnRzIHlldC4iKTsgCiAgICAgICAgcmV0dXJuOyAKICAgIH0KCiAgICBwdXRzKCJcbj09PT0gTk9USUNFIEJPQVJEID09PT0iKTsKCiAgICBjb25zdCBjaGFyICpkZXBhcnRtZW50c1tdID0geyJDU0UiLCAiRUVFIiwgIkNDRSIsICJPdGhlciJ9OwogICAgaW50IG51bURlcHQgPSA0OwoKICAgIGZvciAoaW50IGQgPSAwOyBkIDwgbnVtRGVwdDsgZCsrKSB7CiAgICAgICAgY29uc3QgY2hhciAqZGVwdCA9IGRlcGFydG1lbnRzW2RdOwogICAgICAgIGludCBwZW5kaW5nQ291bnQgPSAwLCByZXNvbHZlZENvdW50ID0gMDsKCiAgICAgICAgLy8gQ2hlY2sgY29tcGxhaW50cyBjb3VudCBieSBzdGF0dXMKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLmRlcGFydG1lbnQsIGRlcHQpID09IDApIHsKICAgICAgICAgICAgICAgIGlmICghY29tcGxhaW50c1tpXS5yZXNvbHZlZCkgCiAgICAgICAgICAgICAgICBwZW5kaW5nQ291bnQrKzsKICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICByZXNvbHZlZENvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChwZW5kaW5nQ291bnQgPT0gMCAmJiByZXNvbHZlZENvdW50ID09IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJcbi0tICVzIERlcGFydG1lbnQgLS1cbk5vIGNvbXBsYWludHMgZm91bmQuXG4iLCBkZXB0KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBwcmludGYoIlxuLS0gJXMgRGVwYXJ0bWVudCAtLVxuIiwgZGVwdCk7CgogICAgICAgIGlmIChwZW5kaW5nQ291bnQgPiAwKSB7CiAgICAgICAgICAgIHB1dHMoIlBlbmRpbmcgQ29tcGxhaW50czoiKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGNvbXBsYWludHNbaV0uZGVwYXJ0bWVudCwgZGVwdCkgPT0gMCAmJiAhY29tcGxhaW50c1tpXS5yZXNvbHZlZCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIjJWQgfCAlc1xuIiwgY29tcGxhaW50c1tpXS5pZCwgY29tcGxhaW50c1tpXS5tZXNzYWdlKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgCiAgICAgICAgewogICAgICAgICAgICBwdXRzKCJObyBwZW5kaW5nIGNvbXBsYWludHMuIik7CiAgICAgICAgfQoKICAgICAgICBpZiAocmVzb2x2ZWRDb3VudCA+IDApIHsKICAgICAgICAgICAgcHV0cygiUmVzb2x2ZWQgQ29tcGxhaW50czoiKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLmRlcGFydG1lbnQsIGRlcHQpID09IDAgJiYgY29tcGxhaW50c1tpXS5yZXNvbHZlZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiMlZCB8ICVzXG4iLCBjb21wbGFpbnRzW2ldLmlkLCBjb21wbGFpbnRzW2ldLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHV0cygiTm8gcmVzb2x2ZWQgY29tcGxhaW50cy4iKTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIGludCBjaG9pY2U7CiAgICB3aGlsZSAoMSkgewogICAgICAgIHB1dHMoIlxuPT09PT0gQ29tcGxhaW50IFJvdXRpbmcgU3lzdGVtID09PT09Iik7CiAgICAgICAgcHV0cygiMS4gU3VibWl0IENvbXBsYWludCIpOwogICAgICAgIHB1dHMoIjIuIFZpZXcgQWxsIENvbXBsYWludHMiKTsKICAgICAgICBwdXRzKCIzLiBWaWV3IENvbXBsYWludHMgYnkgRGVwYXJ0bWVudCIpOwogICAgICAgIHB1dHMoIjQuIFNvbHZlIENvbXBsYWludCIpOwogICAgICAgIHB1dHMoIjUuIE5vdGljZSBCb2FyZCIpOwogICAgICAgIHB1dHMoIjYuIEV4aXQiKTsKICAgICAgICBwcmludGYoIkVudGVyIGNob2ljZTogIik7CiAgICAgICAgaWYgKHNjYW5mKCIlZCIsICZjaG9pY2UpICE9IDEpIGJyZWFrOwoKICAgICAgICBzd2l0Y2ggKGNob2ljZSkgewogICAgICAgICAgICBjYXNlIDE6IGFkZENvbXBsYWludCgpOyAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjogdmlld0FsbCgpOyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOiB2aWV3RGVwYXJ0bWVudENvbXBsYWludHMoKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDogc29sdmVDb21wbGFpbnQoKTsgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA1OiBub3RpY2VCb2FyZCgpOyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDY6IHB1dHMoIkdvb2RieWUhIik7IHJldHVybiAwOwogICAgICAgICAgICBkZWZhdWx0OiBwdXRzKCJJbnZhbGlkIGNob2ljZSEiKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQo=