#include <stdio.h>
#include <stdlib.h>
struct node{
int row;
int col;
int val;
struct node* next;
};
struct node* add_element(struct node* tail,int row,int col,int val)
{
struct node
* new
=(struct node
*)malloc(sizeof(struct node
)); new->row=row;
new->col=col;
new->val=val;
new->next=NULL;
tail=new;
return tail;
}
void sorted_matrix(struct node* head,int row,int col,int val)
{
struct node
* new
=(struct node
*)malloc(sizeof(struct node
)); new->row=row;
new->col=col;
new->val=val;
new->next=NULL;
struct node* pre = head;
struct node* current = head->next;
while (pre->next!= NULL && current->row < row)
{
pre = current;
current = current->next;
}
while (current != NULL && current->row == row && current->col < col)
{
pre = current;
current = current->next;
}
if (pre == NULL)
{
new->next = head->next;
head->next = new;
}
else
{
pre->next = new;
new->next = current;
}
}
void sorted_by_col(struct node* M,int row,int col,int val)
{
struct node* current=M->next;
struct node* pre=M;
struct node
* new
=(struct node
*)malloc(sizeof(struct node
));
new->row=row;
new->col=col;
new->val=val;
new->next=NULL;
if(pre->next==NULL)
{
pre->next=new;
}
else if(pre->next!=NULL)
{
while(current->next!=NULL)
{
if(col<current->col)
{
pre->next=new;
new->next=current;
break;
}
current=current->next;
pre=pre->next;
}
if(col<current->col)
{
pre->next=new;
new->next=current;
}
else
current->next=new;
}
}
void sum_matrix(struct node* add,struct node* M1,struct node* M2)
{
struct node* cur1=M1->next;
struct node* cur2=M2->next;
struct node* add_tail=add->next;
struct node* add_pre=add;
while (cur1!=NULL && cur2!=NULL)
{
if(cur1->col==cur2->col && cur1->row==cur2->row)
{
if(cur1->val+cur2->val!=0)
{
add_tail=add_element(add,cur1->row,cur1->col,cur1->val+cur2->val);
add_pre->next=add_tail;
add_tail=add_tail->next;
add_pre=add_pre->next;
}
cur1=cur1->next;
cur2=cur2->next;
}
else if(cur1->row<cur2->row || (cur1->row==cur2->row && cur1->col<cur2->col))
{
add_tail=add_element(add,cur1->row,cur1->col,cur1->val);
add_pre->next=add_tail;
add_tail=add_tail->next;
add_pre=add_pre->next;
cur1=cur1->next;
}
else
{
add_tail=add_element(add,cur2->row,cur2->col,cur2->val);
add_pre->next=add_tail;
add_tail=add_tail->next;
add_pre=add_pre->next;
cur2=cur2->next;
}
}
while(cur1!=NULL)
{
add_tail=add_element(add,cur1->row,cur1->col,cur1->val);
add_pre->next=add_tail;
add_tail=add_tail->next;
add_pre=add_pre->next;
cur1=cur1->next;
}
while(cur2!=NULL)
{
add_tail=add_element(add,cur2->row,cur2->col,cur2->val);
add_pre->next=add_tail;
add_tail=add_tail->next;
add_pre=add_pre->next;
cur2=cur2->next;
}
}
struct node* multi(struct node* M1, struct node* M2) {
struct node
* result
= (struct node
*)malloc(sizeof(struct node
)); result->row = M1->next->row;
result->col = M2->next->col;
result->next = NULL;
struct node* temp_res;
int sum;
for(struct node* temp_1 =M1->next;temp_1!=NULL;temp_1=temp_1->next)
{
for(struct node* temp_2=M2->next;temp_2!= NULL;temp_2=temp_2->next)
{
if(temp_1->col == temp_2->row) {
sum = 0;
temp_res = result->next;
while(temp_res != NULL) {
if(temp_res->row == temp_1->row && temp_res->col == temp_2->col)
{
sum = temp_res->val;
break;
}
temp_res = temp_res->next;
}
sum += temp_1->val * temp_2->val;
if(temp_res != NULL)
{
temp_res->val = sum;
}
else
{
sorted_matrix(result,temp_1->row,temp_2->col,sum);
}
}
}
}
return result;
}
int main()
{
int m,n,k;
if(oper[0]=='T' && oper[1]=='R' && oper[2]=='A')
{
struct node
* M
=(struct node
*)malloc(sizeof(struct node
)); scanf("%d %d %d",&m
,&n
,&k
); for(int i=0;i<k;i++)
{
int row,col,val;
scanf("%d %d %d",&row
,&col
,&val
); sorted_by_col(M,row,col,val);
}
M=M->next;
if(k!=0)
{while(M->next!=NULL)
{
printf("%d %d %d\n",M
->col
,M
->row
,M
->val
); M=M->next;
}
printf("%d %d %d\n",M
->col
,M
->row
,M
->val
); }
}
else if(oper[0]=='A' && oper[1]=='D' && oper[2]=='D')
{
int m,n,k1,k2;
scanf("%d %d %d %d",&m
,&n
,&k1
,&k2
); struct node
* M1
=(struct node
*)malloc(sizeof(struct node
)); struct node
* M2
=(struct node
*)malloc(sizeof(struct node
)); struct node* tail_1=M1->next;
struct node* tail_2=M1->next;
struct node* pre_1=M1;
struct node* pre_2=M2;
int row,col,val;
for(int i=0;i<k1;i++)
{
scanf("%d %d %d",&row
,&col
,&val
); tail_1=add_element(tail_1,row,col,val);
pre_1->next=tail_1;
tail_1=tail_1->next;
pre_1=pre_1->next;
}
for(int i=0;i<k2;i++)
{
scanf("%d %d %d",&row
,&col
,&val
); tail_2=add_element(M2,row,col,val);
pre_2->next=tail_2;
tail_2=tail_2->next;
pre_2=pre_2->next;
}
struct node
* sum
=(struct node
*)malloc(sizeof(struct node
)); sum_matrix(sum,M1,M2);
struct node* dummy=sum->next;
int count=0;
while(dummy!=NULL)
{
count++;
dummy=dummy->next;
}
sum=sum->next;
while(sum->next!=NULL)
{
printf("%d %d %d\n",sum
->row
,sum
->col
,sum
->val
); sum=sum->next;
}
printf("%d %d %d\n",sum
->row
,sum
->col
,sum
->val
); }
else if(oper[0]=='M' && oper[1]=='U' && oper[2]=='L')
{
int m,n,l,k1,k2;
struct node
* M1
=(struct node
*)malloc(sizeof(struct node
)); struct node
* M2
=(struct node
*)malloc(sizeof(struct node
)); struct node* tail_1=M1->next;
struct node* tail_2=M1->next;
struct node* pre_1=M1;
struct node* pre_2=M2;
scanf("%d %d %d %d %d",&m
,&n
,&l
,&k1
,&k2
); int row,col,val;
for(int i=0;i<k1;i++)
{
scanf("%d %d %d",&row
,&col
,&val
); tail_1=add_element(tail_1,row,col,val);
pre_1->next=tail_1;
tail_1=tail_1->next;
pre_1=pre_1->next;
}
for(int i=0;i<k2;i++)
{
scanf("%d %d %d",&row
,&col
,&val
); tail_2=add_element(M2,row,col,val);
pre_2->next=tail_2;
tail_2=tail_2->next;
pre_2=pre_2->next;
}
struct node
* mult
=(struct node
*)malloc(sizeof(struct node
)); struct node* mult_next=mult->next;
struct node* pre_mult=mult;
mult_next=multi(M1,M2);
pre_mult=mult_next;
mult=mult_next;
pre_mult=pre_mult->next;
struct node* dummy=mult->next;
int count=0;
while(dummy!=NULL)
{
if(dummy->val!=0)
{count++;}
dummy=dummy->next;
}
mult=mult->next;
while(mult->next!=NULL)
{
if(mult->val!=0)
{printf("%d %d %d\n",mult
->row
,mult
->col
,mult
->val
);} mult=mult->next;
}
if(mult->val!=0)
{printf("%d %d %d\n",mult
->row
,mult
->col
,mult
->val
);} }
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnN0cnVjdCBub2RlewogICAgaW50IHJvdzsKICAgIGludCBjb2w7CiAgICBpbnQgdmFsOwogICAgc3RydWN0IG5vZGUqIG5leHQ7Cn07CgpzdHJ1Y3Qgbm9kZSogYWRkX2VsZW1lbnQoc3RydWN0IG5vZGUqIHRhaWwsaW50IHJvdyxpbnQgY29sLGludCB2YWwpCnsKICAgIHN0cnVjdCBub2RlKiBuZXc9KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICBuZXctPnJvdz1yb3c7CiAgICBuZXctPmNvbD1jb2w7CiAgICBuZXctPnZhbD12YWw7CiAgICBuZXctPm5leHQ9TlVMTDsKICAgIHRhaWw9bmV3OwogICAgcmV0dXJuIHRhaWw7Cn0KIAp2b2lkIHNvcnRlZF9tYXRyaXgoc3RydWN0IG5vZGUqIGhlYWQsaW50IHJvdyxpbnQgY29sLGludCB2YWwpCnsKICAgIHN0cnVjdCBub2RlKiBuZXc9KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICBuZXctPnJvdz1yb3c7CiAgICBuZXctPmNvbD1jb2w7CiAgICBuZXctPnZhbD12YWw7CiAgICBuZXctPm5leHQ9TlVMTDsKICAgIHN0cnVjdCBub2RlKiBwcmUgPSBoZWFkOwogICAgc3RydWN0IG5vZGUqIGN1cnJlbnQgPSBoZWFkLT5uZXh0OwoKICAgIHdoaWxlIChwcmUtPm5leHQhPSBOVUxMICYmIGN1cnJlbnQtPnJvdyA8IHJvdykKICAgIHsKICAgICAgICBwcmUgPSBjdXJyZW50OwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgfQoKICAgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwgJiYgY3VycmVudC0+cm93ID09IHJvdyAmJiBjdXJyZW50LT5jb2wgPCBjb2wpIAogICAgewogICAgICAgIHByZSA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CiAgICB9CgogICAgaWYgKHByZSA9PSBOVUxMKSAKICAgIHsKICAgICAgICBuZXctPm5leHQgPSBoZWFkLT5uZXh0OwogICAgICAgIGhlYWQtPm5leHQgPSBuZXc7CiAgICB9IAogICAgZWxzZQogICAgewogICAgICAgIHByZS0+bmV4dCA9IG5ldzsKICAgICAgICBuZXctPm5leHQgPSBjdXJyZW50OwogICAgfQp9Cgp2b2lkIHNvcnRlZF9ieV9jb2woc3RydWN0IG5vZGUqIE0saW50IHJvdyxpbnQgY29sLGludCB2YWwpCnsKICAgIHN0cnVjdCBub2RlKiBjdXJyZW50PU0tPm5leHQ7CiAgICBzdHJ1Y3Qgbm9kZSogcHJlPU07CiAgICBzdHJ1Y3Qgbm9kZSogbmV3PShzdHJ1Y3Qgbm9kZSopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogICAgCiAgICBuZXctPnJvdz1yb3c7CiAgICBuZXctPmNvbD1jb2w7CiAgICBuZXctPnZhbD12YWw7CiAgICBuZXctPm5leHQ9TlVMTDsKICAgIGlmKHByZS0+bmV4dD09TlVMTCkKICAgIHsKICAgICAgICBwcmUtPm5leHQ9bmV3OwogICAgfQogICAgZWxzZSBpZihwcmUtPm5leHQhPU5VTEwpCiAgICB7CiAgICAgICAgd2hpbGUoY3VycmVudC0+bmV4dCE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKGNvbDxjdXJyZW50LT5jb2wpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByZS0+bmV4dD1uZXc7CiAgICAgICAgICAgICAgICBuZXctPm5leHQ9Y3VycmVudDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQ9Y3VycmVudC0+bmV4dDsKICAgICAgICAgICAgcHJlPXByZS0+bmV4dDsKICAgICAgICB9CiAgICAgICAgaWYoY29sPGN1cnJlbnQtPmNvbCkKICAgICAgICB7CiAgICAgICAgICAgIHByZS0+bmV4dD1uZXc7CiAgICAgICAgICAgIG5ldy0+bmV4dD1jdXJyZW50OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgY3VycmVudC0+bmV4dD1uZXc7CiAgICB9Cn0KCnZvaWQgc3VtX21hdHJpeChzdHJ1Y3Qgbm9kZSogYWRkLHN0cnVjdCBub2RlKiBNMSxzdHJ1Y3Qgbm9kZSogTTIpCnsKICAgIHN0cnVjdCBub2RlKiBjdXIxPU0xLT5uZXh0OwogICAgc3RydWN0IG5vZGUqIGN1cjI9TTItPm5leHQ7CiAgICBzdHJ1Y3Qgbm9kZSogYWRkX3RhaWw9YWRkLT5uZXh0OwogICAgc3RydWN0IG5vZGUqIGFkZF9wcmU9YWRkOwogICAgd2hpbGUgKGN1cjEhPU5VTEwgJiYgY3VyMiE9TlVMTCkKICAgIHsKICAgICAgICBpZihjdXIxLT5jb2w9PWN1cjItPmNvbCAmJiBjdXIxLT5yb3c9PWN1cjItPnJvdykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGN1cjEtPnZhbCtjdXIyLT52YWwhPTApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgYWRkX3RhaWw9YWRkX2VsZW1lbnQoYWRkLGN1cjEtPnJvdyxjdXIxLT5jb2wsY3VyMS0+dmFsK2N1cjItPnZhbCk7CiAgICAgICAgICAgIGFkZF9wcmUtPm5leHQ9YWRkX3RhaWw7CiAgICAgICAgICAgIGFkZF90YWlsPWFkZF90YWlsLT5uZXh0OwogICAgICAgICAgICBhZGRfcHJlPWFkZF9wcmUtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VyMT1jdXIxLT5uZXh0OwogICAgICAgICAgICBjdXIyPWN1cjItPm5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoY3VyMS0+cm93PGN1cjItPnJvdyB8fCAoY3VyMS0+cm93PT1jdXIyLT5yb3cgJiYgY3VyMS0+Y29sPGN1cjItPmNvbCkpCiAgICAgICAgewogICAgICAgICAgICBhZGRfdGFpbD1hZGRfZWxlbWVudChhZGQsY3VyMS0+cm93LGN1cjEtPmNvbCxjdXIxLT52YWwpOwogICAgICAgICAgICBhZGRfcHJlLT5uZXh0PWFkZF90YWlsOwogICAgICAgICAgICBhZGRfdGFpbD1hZGRfdGFpbC0+bmV4dDsKICAgICAgICAgICAgYWRkX3ByZT1hZGRfcHJlLT5uZXh0OwogICAgICAgICAgICBjdXIxPWN1cjEtPm5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgYWRkX3RhaWw9YWRkX2VsZW1lbnQoYWRkLGN1cjItPnJvdyxjdXIyLT5jb2wsY3VyMi0+dmFsKTsKICAgICAgICBhZGRfcHJlLT5uZXh0PWFkZF90YWlsOwogICAgICAgIGFkZF90YWlsPWFkZF90YWlsLT5uZXh0OwogICAgICAgIGFkZF9wcmU9YWRkX3ByZS0+bmV4dDsKICAgICAgICBjdXIyPWN1cjItPm5leHQ7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUoY3VyMSE9TlVMTCkKICAgIHsKICAgICAgICBhZGRfdGFpbD1hZGRfZWxlbWVudChhZGQsY3VyMS0+cm93LGN1cjEtPmNvbCxjdXIxLT52YWwpOwogICAgICAgIGFkZF9wcmUtPm5leHQ9YWRkX3RhaWw7CiAgICAgICAgYWRkX3RhaWw9YWRkX3RhaWwtPm5leHQ7CiAgICAgICAgYWRkX3ByZT1hZGRfcHJlLT5uZXh0OwogICAgICAgIGN1cjE9Y3VyMS0+bmV4dDsKICAgIH0KICAgIHdoaWxlKGN1cjIhPU5VTEwpCiAgICB7CiAgICAgICAgYWRkX3RhaWw9YWRkX2VsZW1lbnQoYWRkLGN1cjItPnJvdyxjdXIyLT5jb2wsY3VyMi0+dmFsKTsKICAgICAgICBhZGRfcHJlLT5uZXh0PWFkZF90YWlsOwogICAgICAgIGFkZF90YWlsPWFkZF90YWlsLT5uZXh0OwogICAgICAgIGFkZF9wcmU9YWRkX3ByZS0+bmV4dDsKICAgICAgICAgY3VyMj1jdXIyLT5uZXh0OwogICAgfQp9CgpzdHJ1Y3Qgbm9kZSogbXVsdGkoc3RydWN0IG5vZGUqIE0xLCBzdHJ1Y3Qgbm9kZSogTTIpIHsKICAgIHN0cnVjdCBub2RlKiByZXN1bHQgPSAoc3RydWN0IG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKICAgIHJlc3VsdC0+cm93ID0gTTEtPm5leHQtPnJvdzsKICAgIHJlc3VsdC0+Y29sID0gTTItPm5leHQtPmNvbDsKICAgIHJlc3VsdC0+bmV4dCA9IE5VTEw7CiAgICBzdHJ1Y3Qgbm9kZSogdGVtcF9yZXM7CiAgICBpbnQgc3VtOwogICAgZm9yKHN0cnVjdCBub2RlKiB0ZW1wXzEgPU0xLT5uZXh0O3RlbXBfMSE9TlVMTDt0ZW1wXzE9dGVtcF8xLT5uZXh0KSAKICAgIHsKICAgICAgICBmb3Ioc3RydWN0IG5vZGUqIHRlbXBfMj1NMi0+bmV4dDt0ZW1wXzIhPSBOVUxMO3RlbXBfMj10ZW1wXzItPm5leHQpCiAgICAgICAgIHsKICAgICAgICAgICAgaWYodGVtcF8xLT5jb2wgPT0gdGVtcF8yLT5yb3cpIHsKICAgICAgICAgICAgICAgIHN1bSA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wX3JlcyA9IHJlc3VsdC0+bmV4dDsKICAgICAgICAgICAgICAgIHdoaWxlKHRlbXBfcmVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBpZih0ZW1wX3Jlcy0+cm93ID09IHRlbXBfMS0+cm93ICYmIHRlbXBfcmVzLT5jb2wgPT0gdGVtcF8yLT5jb2wpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSB0ZW1wX3Jlcy0+dmFsOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGVtcF9yZXMgPSB0ZW1wX3Jlcy0+bmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1bSArPSB0ZW1wXzEtPnZhbCAqIHRlbXBfMi0+dmFsOwogICAgICAgICAgICAgICAgaWYodGVtcF9yZXMgIT0gTlVMTCkgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9yZXMtPnZhbCA9IHN1bTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNvcnRlZF9tYXRyaXgocmVzdWx0LHRlbXBfMS0+cm93LHRlbXBfMi0+Y29sLHN1bSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpCnsKICAgCiAgICBjaGFyKiBvcGVyPShjaGFyICopbWFsbG9jKDYpOwogICAgaW50IG0sbixrOwogICAgc2NhbmYoIiVzIixvcGVyKTsKICAgIGlmKG9wZXJbMF09PSdUJyAmJiBvcGVyWzFdPT0nUicgJiYgb3BlclsyXT09J0EnKQogICAgewogICAgc3RydWN0IG5vZGUqIE09KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICBzY2FuZigiJWQgJWQgJWQiLCZtLCZuLCZrKTsKICAgIGZvcihpbnQgaT0wO2k8aztpKyspCiAgICB7CiAgICAgICAgaW50IHJvdyxjb2wsdmFsOwogICAgICAgIHNjYW5mKCIlZCAlZCAlZCIsJnJvdywmY29sLCZ2YWwpOwogICAgICAgIHNvcnRlZF9ieV9jb2woTSxyb3csY29sLHZhbCk7CiAgICB9CiAgICBNPU0tPm5leHQ7CiAgICBwcmludGYoIiVkXG4iLGspOwogICAgaWYoayE9MCkKICAgIHt3aGlsZShNLT5uZXh0IT1OVUxMKQogICAgewogICAgICAgIHByaW50ZigiJWQgJWQgJWRcbiIsTS0+Y29sLE0tPnJvdyxNLT52YWwpOwogICAgICAgIE09TS0+bmV4dDsKICAgIH0KICAgIHByaW50ZigiJWQgJWQgJWRcbiIsTS0+Y29sLE0tPnJvdyxNLT52YWwpOwogICAgfQogICAgZnJlZShNKTsKICAgIH0KICAgIGVsc2UgaWYob3BlclswXT09J0EnICYmIG9wZXJbMV09PSdEJyAmJiBvcGVyWzJdPT0nRCcpCiAgICB7CiAgICAgICAgaW50IG0sbixrMSxrMjsKICAgICAgICBzY2FuZigiJWQgJWQgJWQgJWQiLCZtLCZuLCZrMSwmazIpOwogICAgICAgIHN0cnVjdCBub2RlKiBNMT0oc3RydWN0IG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKICAgICAgICBzdHJ1Y3Qgbm9kZSogTTI9KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICAgICAgc3RydWN0IG5vZGUqIHRhaWxfMT1NMS0+bmV4dDsKICAgICAgICBzdHJ1Y3Qgbm9kZSogdGFpbF8yPU0xLT5uZXh0OwogICAgICAgIHN0cnVjdCBub2RlKiBwcmVfMT1NMTsKICAgICAgICBzdHJ1Y3Qgbm9kZSogcHJlXzI9TTI7CiAgICAgICAgCiAgICAgICAgaW50IHJvdyxjb2wsdmFsOwogICAgICAgIGZvcihpbnQgaT0wO2k8azE7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgc2NhbmYoIiVkICVkICVkIiwmcm93LCZjb2wsJnZhbCk7CiAgICAgICAgICAgIHRhaWxfMT1hZGRfZWxlbWVudCh0YWlsXzEscm93LGNvbCx2YWwpOwogICAgICAgICAgICBwcmVfMS0+bmV4dD10YWlsXzE7CiAgICAgICAgICAgIHRhaWxfMT10YWlsXzEtPm5leHQ7CiAgICAgICAgICAgIHByZV8xPXByZV8xLT5uZXh0OwogICAgICAgIH0KICAgICAgICAgICAgZm9yKGludCBpPTA7aTxrMjtpKyspCiAgICAgICAgewogICAgICAgICAgICBzY2FuZigiJWQgJWQgJWQiLCZyb3csJmNvbCwmdmFsKTsKICAgICAgICAgICB0YWlsXzI9YWRkX2VsZW1lbnQoTTIscm93LGNvbCx2YWwpOwogICAgICAgICAgICAgcHJlXzItPm5leHQ9dGFpbF8yOwogICAgICAgICAgICB0YWlsXzI9dGFpbF8yLT5uZXh0OwogICAgICAgICAgICBwcmVfMj1wcmVfMi0+bmV4dDsKCiAgICAgICAgfQogICAgICAgIHN0cnVjdCBub2RlKiBzdW09KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICAgICAgc3VtX21hdHJpeChzdW0sTTEsTTIpOwogICAgICAgIHN0cnVjdCBub2RlKiBkdW1teT1zdW0tPm5leHQ7CiAgICAgICAgaW50IGNvdW50PTA7CiAgICAgICAgd2hpbGUoZHVtbXkhPU5VTEwpCiAgICAgICAgewogICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICBkdW1teT1kdW1teS0+bmV4dDsKICAgICAgICB9CiAgICAgICAgc3VtPXN1bS0+bmV4dDsKICAgICAgICBwcmludGYoIiVkXG4iLGNvdW50KTsKICAgICAgICB3aGlsZShzdW0tPm5leHQhPU5VTEwpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVkICVkICVkXG4iLHN1bS0+cm93LHN1bS0+Y29sLHN1bS0+dmFsKTsKICAgICAgICAgICAgc3VtPXN1bS0+bmV4dDsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIlZCAlZCAlZFxuIixzdW0tPnJvdyxzdW0tPmNvbCxzdW0tPnZhbCk7CiAgICAgICAgZnJlZShzdW0pOwogICAgICAgIGZyZWUocHJlXzEpOwogICAgICAgIGZyZWUocHJlXzIpOwogICAgICAgIGZyZWUodGFpbF8xKTsKICAgICAgICBmcmVlKHRhaWxfMik7CiAgICAgICAgZnJlZShNMSk7CiAgICAgICAgZnJlZShNMik7CiAgICB9CiAgICBlbHNlIGlmKG9wZXJbMF09PSdNJyAmJiBvcGVyWzFdPT0nVScgJiYgb3BlclsyXT09J0wnKQogICAgewogICAgICAgIGludCBtLG4sbCxrMSxrMjsKICAgICAgICBzdHJ1Y3Qgbm9kZSogTTE9KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICAgICAgc3RydWN0IG5vZGUqIE0yPShzdHJ1Y3Qgbm9kZSopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogICAgICAgIHN0cnVjdCBub2RlKiB0YWlsXzE9TTEtPm5leHQ7CiAgICAgICAgc3RydWN0IG5vZGUqIHRhaWxfMj1NMS0+bmV4dDsKICAgICAgICBzdHJ1Y3Qgbm9kZSogcHJlXzE9TTE7CiAgICAgICAgc3RydWN0IG5vZGUqIHByZV8yPU0yOwogICAgICAgIHNjYW5mKCIlZCAlZCAlZCAlZCAlZCIsJm0sJm4sJmwsJmsxLCZrMik7CiAgICAgICAgaW50IHJvdyxjb2wsdmFsOwogICAgICAgIGZvcihpbnQgaT0wO2k8azE7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgc2NhbmYoIiVkICVkICVkIiwmcm93LCZjb2wsJnZhbCk7CiAgICAgICAgICAgIHRhaWxfMT1hZGRfZWxlbWVudCh0YWlsXzEscm93LGNvbCx2YWwpOwogICAgICAgICAgICBwcmVfMS0+bmV4dD10YWlsXzE7CiAgICAgICAgICAgIHRhaWxfMT10YWlsXzEtPm5leHQ7CiAgICAgICAgICAgIHByZV8xPXByZV8xLT5uZXh0OwogICAgICAgIH0KICAgICAgICAgICAgZm9yKGludCBpPTA7aTxrMjtpKyspCiAgICAgICAgewogICAgICAgICAgICBzY2FuZigiJWQgJWQgJWQiLCZyb3csJmNvbCwmdmFsKTsKICAgICAgICAgICAgdGFpbF8yPWFkZF9lbGVtZW50KE0yLHJvdyxjb2wsdmFsKTsKICAgICAgICAgICAgcHJlXzItPm5leHQ9dGFpbF8yOwogICAgICAgICAgICB0YWlsXzI9dGFpbF8yLT5uZXh0OwogICAgICAgICAgICBwcmVfMj1wcmVfMi0+bmV4dDsKICAgICAgICB9CiAgICAgICAgc3RydWN0IG5vZGUqIG11bHQ9KHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICAgICAgc3RydWN0IG5vZGUqICBtdWx0X25leHQ9bXVsdC0+bmV4dDsKICAgICAgICBzdHJ1Y3Qgbm9kZSogcHJlX211bHQ9bXVsdDsKICAgICAgICBtdWx0X25leHQ9bXVsdGkoTTEsTTIpOwogICAgICAgIHByZV9tdWx0PW11bHRfbmV4dDsKICAgICAgICBtdWx0PW11bHRfbmV4dDsKICAgICAgICBwcmVfbXVsdD1wcmVfbXVsdC0+bmV4dDsKICAgICAgICBzdHJ1Y3Qgbm9kZSogZHVtbXk9bXVsdC0+bmV4dDsKICAgICAgICBpbnQgY291bnQ9MDsKICAgICAgICB3aGlsZShkdW1teSE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKGR1bW15LT52YWwhPTApCiAgICAgICAgICAgIHtjb3VudCsrO30KICAgICAgICAgICAgZHVtbXk9ZHVtbXktPm5leHQ7CiAgICAgICAgfQogICAgICAgIG11bHQ9bXVsdC0+bmV4dDsKICAgICAgICBwcmludGYoIiVkXG4iLGNvdW50KTsKICAgICAgICB3aGlsZShtdWx0LT5uZXh0IT1OVUxMKQogICAgICAgIHsKICAgICAgICAgICAgaWYobXVsdC0+dmFsIT0wKQogICAgICAgICAgICB7cHJpbnRmKCIlZCAlZCAlZFxuIixtdWx0LT5yb3csbXVsdC0+Y29sLG11bHQtPnZhbCk7fQogICAgICAgICAgICBtdWx0PW11bHQtPm5leHQ7CiAgICAgICAgfQogICAgICAgIGlmKG11bHQtPnZhbCE9MCkKICAgICAgICB7cHJpbnRmKCIlZCAlZCAlZFxuIixtdWx0LT5yb3csbXVsdC0+Y29sLG11bHQtPnZhbCk7fQogICAgICAgIGZyZWUoTTEpOwogICAgICAgIGZyZWUoTTIpOwogICAgICAgIGZyZWUobXVsdCk7CiAgICB9Cn0=