I2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RkaW50Lmg+DQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlICJ2b2ljZV9pcGMuaCINCiNpbmNsdWRlICJ2b2ljZV9saWIuaCINCiNpbmNsdWRlICJsaW51eC9ycG1zZ196eDI5LmgiDQojaW5jbHVkZSAic29mdGFwX2FwaS5oIg0KI2luY2x1ZGUgInB0aHJlYWQuaCINCiNpbmNsdWRlIDxsaW51eC92b2x0ZV9kcnYuaD4NCg0KZXh0ZXJuIGludCBzY19hdWRpb19zZXRfdm9pY2VfZGV2aWNlX21vZGUoaW50IGRldl9tb2RlKTsNCmV4dGVybiBpbnQgc2NfYXVkaW9fZ2V0X3ZvaWNlX2RldmljZV9tb2RlKGludCAqcF9kZXZfbW9kZSk7DQpleHRlcm4gaW50IHNjX2F1ZGlvX3NldF9yeF92b2ljZV92b2woaW50IHZvbCk7DQpleHRlcm4gaW50IHNjX2F1ZGlvX2dldF9yeF92b2ljZV92b2woaW50ICAgICAqIHBfdm9sKTsNCmV4dGVybiBpbnQgc2NfYXVkaW9fc2V0X3R4X3ZvaWNlX3ZvbChpbnQgdm9sKTsNCmV4dGVybiBpbnQgc2NfYXVkaW9fZ2V0X3R4X3ZvaWNlX3ZvbChpbnQgICpwX3ZvbCk7DQpleHRlcm4gaW50IHNjX2F1ZGlvX3NldF90eF92b2ljZV9tdXRlX3N0YXRlKGludCBtdXRlICAgICAgICAgKTsNCmV4dGVybiBpbnQgc2NfYXVkaW9fZ2V0X3R4X3ZvaWNlX211dGVfc3RhdGUoaW50ICpwX211dGUpOw0KZXh0ZXJuIGludCBzY19hdWRpb19zZXRfcnhfdm9pY2VfbXV0ZV9zdGF0ZShpbnQgbXV0ZSk7DQpleHRlcm4gaW50IHNjX2F1ZGlvX2dldF9yeF92b2ljZV9tdXRlX3N0YXRlKGludCAqcF9tdXRlKTsNCmV4dGVybiBpbnQgc2NfYXVkaW9fc2V0X3J4X3ZvaWNlX3ZvbF9nYWluKGludCBnYWluKTsNCmV4dGVybiBpbnQgc2NfYXVkaW9fZ2V0X3J4X3ZvaWNlX3ZvbF9nYWluKGludCAgICAgKiBwX2dhaW4pOw0KZXh0ZXJuIGludCBzY19hdWRpb19zZXRfdHhfdm9pY2Vfdm9sX2dhaW4oaW50IGdhaW4pOw0KZXh0ZXJuIGludCBzY19hdWRpb19nZXRfdHhfdm9pY2Vfdm9sX2dhaW4oaW50ICAgICAqIHBfZ2Fpbik7DQovL2V4dGVybiBpbnQgc2NfYXVkaW9fc2V0X2xvb3BiYWNrX2VuYWJsZV9zdGF0ZShpbnQgZW5hYmxlKTsNCi8vZXh0ZXJuIGludCBzY19hdWRpb19nZXRfbG9vcGJhY2tfZW5hYmxlX3N0YXRlKGludCAqcF9lbmFibGUpOw0KaW50IGFwX2F1ZGlvX3NldF9sb29wYmFja19lbmFibGUoaW50IGRldl9tb2RlLGludCBlbmFibGUpOw0KaW50IGFwX2F1ZGlvX2dldF9sb29wYmFja19lbmFibGUoaW50ICpwX2VuYWJsZSk7DQoNCnN0YXRpYyB1bnNpZ25lZCBjaGFyICpyZWN2X3ZvaWNlX252cndfYnVmID0gTlVMTDsNCnN0YXRpYyBpbnQgdm9pY2VfaXBjX2ZkID0gLTE7DQpzdGF0aWMgdm9pY2VfaXBjX2NvbnRyb2xfbXNnIHZvaWNlX2N0cmxfcmVjdm1zZ1tJUENfVk9JQ0VfRlVOQ19NQVhdID0gezB9Ow0KDQppbnQgY2FwX2Fsc2Ffdm9pY2Vfb3BlbihpbnQgdm1vZGUpDQp7DQogICAgaW50IHJldCA9IDA7DQogICAgaW50IG1zZ19oYW5kbGUgPSAwOw0KCU1TR19CVUYgbXNnOw0KCUxPTkcgbXNnX3NpemUgPSAgc2l6ZW9mKE1TR19CVUYpLXNpemVvZihMT05HKTsNCiAgICBpbnQgbW9kdWxlX2lkID0gTU9EVUxFX0lEX1ZPSUNFX0NMSUVOVDsNCiAgICBpbnQgZHN0X2lkID0gTU9EVUxFX0lEX1ZPSUNFX1NFUlZFUjsNCiAgICBpbnQgbXNnX2NtZCA9IE1TR19DTURfQ0FQX1ZBTFNBX09QRU47DQogICAgDQogICAgLy+0tL2oz/vPorbTwdANCgltc2dfaGFuZGxlID0gbXNnZ2V0KG1vZHVsZV9pZCwgSVBDX0NSRUFUfDA2MDApOw0KICAgIA0KICAgIC8vt6LLzc/7z6INCiAgICByZXQgPSBpcGNfc2VuZF9tZXNzYWdlKG1vZHVsZV9pZCwgZHN0X2lkLCBtc2dfY21kLCBzaXplb2YoaW50KSwgKHVuc2lnbmVkIGNoYXIgKikoJnZtb2RlKSwgMCk7DQogICAgaWYoMCAhPSByZXQpew0KICAgICAgICBwcmludGYoIiVzOiBzZW5kIG1zZyBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCiAgICAgICAgbXNnY3RsKG1zZ19oYW5kbGUsSVBDX1JNSUQsMCk7DQogICAgICAgIHJldHVybiByZXQ7DQogICAgfQ0KICAgIHByaW50ZigiJXM6IHNlbmQgbXNnIHN1Y2Nlc3MoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQogICAgDQogICAgLy+908rVz/vPog0KICAgIHdoaWxlKDEpDQoJew0KCQltZW1zZXQoJm1zZywgMHgwMCwgc2l6ZW9mKE1TR19CVUYpKTsNCg0KCQkvL7vxyKHP+8+ittPB0M/7z6KyorSmwO0NCgkJcmV0ID0gbXNncmN2KG1zZ19oYW5kbGUsICZtc2csIG1zZ19zaXplLCAwLCAwKTsNCiAgICAgICAgaWYoMCA+IHJldCl7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vxqXF5LW9ysdNU0dfQ01EX0NBUF9WQUxTQV9PUEVOyrGyxbSmwO0NCiAgICAgICAgaWYobXNnX2NtZCA9PSBtc2cudXNNc2dDbWQpew0KICAgICAgICAgICAgcmV0ID0gKigoaW50ICopbXNnLmF1Y0RhdGFCdWYpOw0KICAgICAgICAgICAgbXNnY3RsKG1zZ19oYW5kbGUsSVBDX1JNSUQsMCk7DQogICAgICAgICAgICBwcmludGYoIiVzOiByZWNlaXZlIG1zZyBzdWNjZXNzKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCgl9DQoNCiAgICByZXR1cm4gcmV0Ow0KfQ0KDQppbnQgY2FwX2Fsc2Ffdm9pY2VfY2xvc2UoaW50IHZtb2RlKQ0Kew0KICAgIGludCByZXQgPSAwOw0KICAgIGludCBtc2dfaGFuZGxlID0gMDsNCglNU0dfQlVGIG1zZzsNCglMT05HIG1zZ19zaXplID0gIHNpemVvZihNU0dfQlVGKS1zaXplb2YoTE9ORyk7DQogICAgaW50IG1vZHVsZV9pZCA9IE1PRFVMRV9JRF9WT0lDRV9DTElFTlQ7DQogICAgaW50IGRzdF9pZCA9IE1PRFVMRV9JRF9WT0lDRV9TRVJWRVI7DQogICAgaW50IG1zZ19jbWQgPSBNU0dfQ01EX0NBUF9WQUxTQV9DTE9TRTsNCg0KICAgIC8vtLS9qM/7z6K208HQDQoJbXNnX2hhbmRsZSA9IG1zZ2dldChtb2R1bGVfaWQsIElQQ19DUkVBVHwwNjAwKTsNCiAgICANCiAgICAvL7eiy83P+8+iDQogICAgcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShtb2R1bGVfaWQsIGRzdF9pZCwgbXNnX2NtZCwgc2l6ZW9mKGludCksICh1bnNpZ25lZCBjaGFyICopKCZ2bW9kZSksIDApOw0KICAgIGlmKDAgIT0gcmV0KXsNCiAgICAgICAgcHJpbnRmKCIlczogc2VuZCBtc2cgZXJyb3IoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQogICAgICAgIG1zZ2N0bChtc2dfaGFuZGxlLElQQ19STUlELDApOw0KICAgICAgICByZXR1cm4gcmV0Ow0KICAgIH0NCiAgICBwcmludGYoIiVzOiBzZW5kIG1zZyBzdWNjZXNzKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KDQogICAgLy+908rVz/vPog0KICAgIHdoaWxlKDEpDQoJew0KCQltZW1zZXQoJm1zZywgMHgwMCwgc2l6ZW9mKE1TR19CVUYpKTsNCg0KCQkvL7vxyKHP+8+ittPB0M/7z6KyorSmwO0NCgkJcmV0ID0gbXNncmN2KG1zZ19oYW5kbGUsICZtc2csIG1zZ19zaXplLCAwLCAwKTsNCiAgICAgICAgaWYoMCA+IHJldCl7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vxqXF5LW9ysdNU0dfQ01EX0NBUF9WQUxTQV9DTE9TRcqxssW0psDtDQogICAgICAgIGlmKG1zZ19jbWQgPT0gbXNnLnVzTXNnQ21kKXsNCiAgICAgICAgICAgIHJldCA9ICooKGludCAqKW1zZy5hdWNEYXRhQnVmKTsNCiAgICAgICAgICAgIG1zZ2N0bChtc2dfaGFuZGxlLElQQ19STUlELDApOw0KICAgICAgICAgICAgcHJpbnRmKCIlczogcmVjZWl2ZSBtc2cgc3VjY2VzcyglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoJfQ0KDQogICAgcmV0dXJuIHJldDsNCn0NCg0KaW50IGlwY19jYXBfYWxzYV92b2ljZV9vcGVuKGludCB2bW9kZSkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCiAgICBpbnQgZnVuY19pZCA9IElQQ19DQVBfQUxTQV9WT0lDRV9PUEVOOw0KICAgIHZvaWNlX2N0cmxfcmVjdm1zZ1tmdW5jX2lkXS5mdW5jX2lkID0gVk9JQ0VfV0FJVF9NU0dfRlJPTV9DQVA7DQoNCiAgICByZXQgPSBWb2ljZV9DdHJsX1JwbXNnX1NlbmQoZnVuY19pZCwgJnZtb2RlKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiBWb2ljZV9DdHJsX1JwbXNnX1NlbmQgZXJyb3IsIHJldHVybiAlZCFcbiIsIF9fZnVuY19fLCByZXQpOw0KCQlyZXR1cm4gVk9JQ0VJUENfRVJST1I7DQoJfQ0KICAgIHByaW50ZigiJXM6IFZvaWNlX0N0cmxfUnBtc2dfU2VuZCBzdWNjZXNzLCB3cml0ZV9sZW49JWQhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCiAgICANCiAgICB3aGlsZShmdW5jX2lkICE9IHZvaWNlX2N0cmxfcmVjdm1zZ1tmdW5jX2lkXS5mdW5jX2lkKXsNCiAgICAgICAgdXNsZWVwKDEpOw0KICAgIH0NCiAgICANCiAgICBtZW1jcHkoJnJldCwgdm9pY2VfY3RybF9yZWN2bXNnW2Z1bmNfaWRdLnBhcmFtLCB2b2ljZV9jdHJsX3JlY3Ztc2dbZnVuY19pZF0ucGFyYW1fbGVuKTsNCiAgICBwcmludGYoIiVzOiBpcGMgcmVjZWl2ZSBzdWNjZXNzLCByZXQ9JWQhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCg0KICAgIHJldHVybiByZXQ7DQp9DQoNCmludCBpcGNfY2FwX2Fsc2Ffdm9pY2VfY2xvc2UoaW50IHZtb2RlKQ0Kew0KICAgIGludCByZXQgPSAwOw0KICAgIGludCBmdW5jX2lkID0gSVBDX0NBUF9BTFNBX1ZPSUNFX0NMT1NFOw0KICAgIHZvaWNlX2N0cmxfcmVjdm1zZ1tmdW5jX2lkXS5mdW5jX2lkID0gVk9JQ0VfV0FJVF9NU0dfRlJPTV9DQVA7DQogICAgDQogICAgcmV0ID0gVm9pY2VfQ3RybF9ScG1zZ19TZW5kKGZ1bmNfaWQsICZ2bW9kZSk7DQogICAgDQogICAgaWYgKDAgPj0gcmV0KXsNCgkJcHJpbnRmKCIlczogVm9pY2VfQ3RybF9ScG1zZ19TZW5kIGVycm9yLCByZXR1cm4gJWQhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgkJcmV0dXJuIFZPSUNFSVBDX0VSUk9SOw0KCX0NCiAgICBwcmludGYoIiVzOiBWb2ljZV9DdHJsX1JwbXNnX1NlbmQgc3VjY2Vzcywgd3JpdGVfbGVuPSVkIVxuIiwgX19mdW5jX18sIHJldCk7DQoNCiAgICB3aGlsZShmdW5jX2lkICE9IHZvaWNlX2N0cmxfcmVjdm1zZ1tmdW5jX2lkXS5mdW5jX2lkKXsNCiAgICAgICAgdXNsZWVwKDEpOw0KICAgIH0NCg0KICAgIG1lbWNweSgmcmV0LCB2b2ljZV9jdHJsX3JlY3Ztc2dbZnVuY19pZF0ucGFyYW0sIHZvaWNlX2N0cmxfcmVjdm1zZ1tmdW5jX2lkXS5wYXJhbV9sZW4pOw0KICAgIHByaW50ZigiJXM6IGlwYyByZWNlaXZlIHN1Y2Nlc3MsIHJldD0lZCFcbiIsIF9fZnVuY19fLCByZXQpOw0KDQogICAgcmV0dXJuIHJldDsNCn0NCg0Kdm9pZCBpcGNfc2V0X3ZvaWNlX2RldmljZV9tb2RlX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IGRldl9tb2RlID0gMDsNCg0KICAgIC8vbWVtY3B5KCZkZXZfbW9kZSwgbXNnLnBhcmFtLCBtc2cucGFyYW1fbGVuKTsNCiAgICBkZXZfbW9kZSA9ICooKGludCAqKW1zZy5wYXJhbSk7DQogICAgcmV0ID0gc2NfYXVkaW9fc2V0X3ZvaWNlX2RldmljZV9tb2RlKGRldl9tb2RlKTsNCg0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgbWVtY3B5KG1zZy5wYXJhbSwgJnJldCwgbXNnLnBhcmFtX2xlbik7DQogICAgbXNnX2xlbiA9IFZPSUNFX0hFQURfTEVOICsgbXNnLnBhcmFtX2xlbjsNCg0KICAgIHJldCA9IHdyaXRlKHZvaWNlX2lwY19mZCwgJm1zZywgbXNnX2xlbik7DQogICAgDQogICAgaWYgKDAgPj0gcmV0KXsNCgkJcHJpbnRmKCIlczogd3JpdGUgZXJyb3IoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQoJfQ0KfQ0KDQp2b2lkIGlwY19nZXRfdm9pY2VfZGV2aWNlX21vZGVfcmN2KHZvaWNlX2lwY19jb250cm9sX21zZyBtc2cpDQp7DQogICAgaW50IHJldCA9IFZPSUNFSVBDX09LOw0KICAgIGludCBtc2dfbGVuID0gMDsNCiAgICBpbnQgKnBfZGV2X21vZGUgPSBOVUxMOw0KDQogICAgcF9kZXZfbW9kZSA9IChpbnQgKiltc2cucGFyYW07DQogICAgcmV0ID0gc2NfYXVkaW9fZ2V0X3ZvaWNlX2RldmljZV9tb2RlKHBfZGV2X21vZGUpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfZGV2X21vZGUsIG1zZy5wYXJhbV9sZW4pOw0KICAgIGVsc2UNCiAgICAgICAgbWVtY3B5KG1zZy5wYXJhbSwgJnJldCwgbXNnLnBhcmFtX2xlbik7DQogICAgbXNnX2xlbiA9IFZPSUNFX0hFQURfTEVOICsgbXNnLnBhcmFtX2xlbjsNCg0KICAgIHJldCA9IHdyaXRlKHZvaWNlX2lwY19mZCwgJm1zZywgbXNnX2xlbik7DQogICAgDQogICAgaWYgKDAgPj0gcmV0KXsNCgkJcHJpbnRmKCIlczogd3JpdGUgZXJyb3IoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQoJfQ0KfQ0KDQp2b2lkIGlwY19zZXRfcnhfdm9pY2Vfdm9sX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IHZvbCA9IDA7DQoNCiAgICAvL21lbWNweSgmZGV2X21vZGUsIG1zZy5wYXJhbSwgbXNnLnBhcmFtX2xlbik7DQogICAgdm9sID0gKigoaW50ICopbXNnLnBhcmFtKTsNCiAgICByZXQgPSBzY19hdWRpb19zZXRfcnhfdm9pY2Vfdm9sKHZvbCk7DQoNCiAgICAvL21zZy5mdW5jX2lk5LiN5Y+YDQogICAgbXNnLnBhcmFtX2xlbiA9IHNpemVvZihpbnQpOw0KICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCg0Kdm9pZCBpcGNfZ2V0X3J4X3ZvaWNlX3ZvbF9yY3Yodm9pY2VfaXBjX2NvbnRyb2xfbXNnIG1zZykNCnsNCiAgICBpbnQgcmV0ID0gVk9JQ0VJUENfT0s7DQogICAgaW50IG1zZ19sZW4gPSAwOw0KICAgIGludCAqcF92b2wgPSBOVUxMOw0KDQogICAgcF92b2wgPSAoaW50ICopbXNnLnBhcmFtOw0KICAgIHJldCA9IHNjX2F1ZGlvX2dldF9yeF92b2ljZV92b2wocF92b2wpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfdm9sLCBtc2cucGFyYW1fbGVuKTsNCiAgICBlbHNlDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCg0Kdm9pZCBpcGNfc2V0X3J4X3ZvaWNlX3ZvbF9nYWluX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IGdhaW4gPSAwOw0KDQogICAgLy9tZW1jcHkoJmRldl9tb2RlLCBtc2cucGFyYW0sIG1zZy5wYXJhbV9sZW4pOw0KICAgIGdhaW4gPSAqKChpbnQgKiltc2cucGFyYW0pOw0KICAgIHJldCA9IHNjX2F1ZGlvX3NldF9yeF92b2ljZV92b2xfZ2FpbihnYWluKTsNCg0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgbWVtY3B5KG1zZy5wYXJhbSwgJnJldCwgbXNnLnBhcmFtX2xlbik7DQogICAgbXNnX2xlbiA9IFZPSUNFX0hFQURfTEVOICsgbXNnLnBhcmFtX2xlbjsNCg0KICAgIHJldCA9IHdyaXRlKHZvaWNlX2lwY19mZCwgJm1zZywgbXNnX2xlbik7DQogICAgDQogICAgaWYgKDAgPj0gcmV0KXsNCgkJcHJpbnRmKCIlczogd3JpdGUgZXJyb3IoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQoJfQ0KfQ0KDQp2b2lkIGlwY19nZXRfcnhfdm9pY2Vfdm9sX2dhaW5fcmN2KHZvaWNlX2lwY19jb250cm9sX21zZyBtc2cpDQp7DQogICAgaW50IHJldCA9IFZPSUNFSVBDX09LOw0KICAgIGludCBtc2dfbGVuID0gMDsNCiAgICBpbnQgKnBfdm9sID0gTlVMTDsNCg0KICAgIHBfdm9sID0gKGludCAqKW1zZy5wYXJhbTsNCiAgICByZXQgPSBzY19hdWRpb19nZXRfcnhfdm9pY2Vfdm9sX2dhaW4ocF92b2wpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfdm9sLCBtc2cucGFyYW1fbGVuKTsNCiAgICBlbHNlDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCg0Kdm9pZCBpcGNfc2V0X3R4X3ZvaWNlX3ZvbF9nYWluX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IGdhaW4gPSAwOw0KDQogICAgLy9tZW1jcHkoJmRldl9tb2RlLCBtc2cucGFyYW0sIG1zZy5wYXJhbV9sZW4pOw0KICAgIGdhaW4gPSAqKChpbnQgKiltc2cucGFyYW0pOw0KICAgIHJldCA9IHNjX2F1ZGlvX3NldF90eF92b2ljZV92b2xfZ2FpbihnYWluKTsNCg0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgbWVtY3B5KG1zZy5wYXJhbSwgJnJldCwgbXNnLnBhcmFtX2xlbik7DQogICAgbXNnX2xlbiA9IFZPSUNFX0hFQURfTEVOICsgbXNnLnBhcmFtX2xlbjsNCg0KICAgIHJldCA9IHdyaXRlKHZvaWNlX2lwY19mZCwgJm1zZywgbXNnX2xlbik7DQogICAgDQogICAgaWYgKDAgPj0gcmV0KXsNCgkJcHJpbnRmKCIlczogd3JpdGUgZXJyb3IoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQoJfQ0KfQ0KDQp2b2lkIGlwY19nZXRfdHhfdm9pY2Vfdm9sX2dhaW5fcmN2KHZvaWNlX2lwY19jb250cm9sX21zZyBtc2cpDQp7DQogICAgaW50IHJldCA9IFZPSUNFSVBDX09LOw0KICAgIGludCBtc2dfbGVuID0gMDsNCiAgICBpbnQgKnBfdm9sID0gTlVMTDsNCg0KICAgIHBfdm9sID0gKGludCAqKW1zZy5wYXJhbTsNCiAgICByZXQgPSBzY19hdWRpb19nZXRfdHhfdm9pY2Vfdm9sX2dhaW4ocF92b2wpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfdm9sLCBtc2cucGFyYW1fbGVuKTsNCiAgICBlbHNlDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCg0Kdm9pZCBpcGNfc2V0X3R4X3ZvaWNlX3ZvbF9yY3Yodm9pY2VfaXBjX2NvbnRyb2xfbXNnIG1zZykNCnsNCiAgICBpbnQgcmV0ID0gVk9JQ0VJUENfT0s7DQogICAgaW50IG1zZ19sZW4gPSAwOw0KICAgIGludCB2b2wgPSAwOw0KDQogICAgLy9tZW1jcHkoJmRldl9tb2RlLCBtc2cucGFyYW0sIG1zZy5wYXJhbV9sZW4pOw0KICAgIHZvbCA9ICooKGludCAqKW1zZy5wYXJhbSk7DQogICAgcmV0ID0gc2NfYXVkaW9fc2V0X3R4X3ZvaWNlX3ZvbCh2b2wpOw0KDQogICAgLy9tc2cuZnVuY19pZOS4jeWPmA0KICAgIG1zZy5wYXJhbV9sZW4gPSBzaXplb2YoaW50KTsNCiAgICBtZW1jcHkobXNnLnBhcmFtLCAmcmV0LCBtc2cucGFyYW1fbGVuKTsNCiAgICBtc2dfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyBtc2cucGFyYW1fbGVuOw0KDQogICAgcmV0ID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmbXNnLCBtc2dfbGVuKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiB3cml0ZSBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgl9DQp9DQoNCnZvaWQgaXBjX2dldF90eF92b2ljZV92b2xfcmN2KHZvaWNlX2lwY19jb250cm9sX21zZyBtc2cpDQp7DQogICAgaW50IHJldCA9IFZPSUNFSVBDX09LOw0KICAgIGludCBtc2dfbGVuID0gMDsNCiAgICBpbnQgKnBfdm9sID0gTlVMTDsNCg0KICAgIHBfdm9sID0gKGludCAqKW1zZy5wYXJhbTsNCiAgICByZXQgPSBzY19hdWRpb19nZXRfdHhfdm9pY2Vfdm9sKHBfdm9sKTsNCgkNCiAgICAvL21zZy5mdW5jX2lk5LiN5Y+YDQogICAgbXNnLnBhcmFtX2xlbiA9IHNpemVvZihpbnQpOw0KICAgIGlmKDAgPT0gcmV0KQ0KICAgICAgICBtZW1jcHkobXNnLnBhcmFtLCBwX3ZvbCwgbXNnLnBhcmFtX2xlbik7DQogICAgZWxzZQ0KICAgICAgICBtZW1jcHkobXNnLnBhcmFtLCAmcmV0LCBtc2cucGFyYW1fbGVuKTsNCiAgICBtc2dfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyBtc2cucGFyYW1fbGVuOw0KDQogICAgcmV0ID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmbXNnLCBtc2dfbGVuKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiB3cml0ZSBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgl9DQp9DQoNCnZvaWQgaXBjX3NldF90eF92b2ljZV9tdXRlX3N0YXRlX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IG11dGUgPSAwOw0KDQogICAgLy9tZW1jcHkoJmRldl9tb2RlLCBtc2cucGFyYW0sIG1zZy5wYXJhbV9sZW4pOw0KICAgIG11dGUgPSAqKChpbnQgKiltc2cucGFyYW0pOw0KICAgIHJldCA9IHNjX2F1ZGlvX3NldF90eF92b2ljZV9tdXRlX3N0YXRlKG11dGUpOw0KDQogICAgLy9tc2cuZnVuY19pZOS4jeWPmA0KICAgIG1zZy5wYXJhbV9sZW4gPSBzaXplb2YoaW50KTsNCiAgICBtZW1jcHkobXNnLnBhcmFtLCAmcmV0LCBtc2cucGFyYW1fbGVuKTsNCiAgICBtc2dfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyBtc2cucGFyYW1fbGVuOw0KDQogICAgcmV0ID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmbXNnLCBtc2dfbGVuKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiB3cml0ZSBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgl9DQp9DQoNCnZvaWQgaXBjX2dldF90eF92b2ljZV9tdXRlX3N0YXRlX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50ICpwX211dGUgPSBOVUxMOw0KDQogICAgcF9tdXRlID0gKGludCAqKW1zZy5wYXJhbTsNCiAgICByZXQgPSBzY19hdWRpb19nZXRfdHhfdm9pY2VfbXV0ZV9zdGF0ZShwX211dGUpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfbXV0ZSwgbXNnLnBhcmFtX2xlbik7DQogICAgZWxzZQ0KICAgICAgICBtZW1jcHkobXNnLnBhcmFtLCAmcmV0LCBtc2cucGFyYW1fbGVuKTsNCiAgICBtc2dfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyBtc2cucGFyYW1fbGVuOw0KDQogICAgcmV0ID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmbXNnLCBtc2dfbGVuKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiB3cml0ZSBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgl9DQp9DQoNCnZvaWQgaXBjX3NldF9yeF92b2ljZV9tdXRlX3N0YXRlX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IG11dGUgPSAwOw0KDQogICAgLy9tZW1jcHkoJmRldl9tb2RlLCBtc2cucGFyYW0sIG1zZy5wYXJhbV9sZW4pOw0KICAgIG11dGUgPSAqKChpbnQgKiltc2cucGFyYW0pOw0KICAgIHJldCA9IHNjX2F1ZGlvX3NldF9yeF92b2ljZV9tdXRlX3N0YXRlKG11dGUpOw0KDQogICAgLy9tc2cuZnVuY19pZOS4jeWPmA0KICAgIG1zZy5wYXJhbV9sZW4gPSBzaXplb2YoaW50KTsNCiAgICBtZW1jcHkobXNnLnBhcmFtLCAmcmV0LCBtc2cucGFyYW1fbGVuKTsNCiAgICBtc2dfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyBtc2cucGFyYW1fbGVuOw0KDQogICAgcmV0ID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmbXNnLCBtc2dfbGVuKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiB3cml0ZSBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgl9DQp9DQoNCnZvaWQgaXBjX2dldF9yeF92b2ljZV9tdXRlX3N0YXRlX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50ICpwX211dGUgPSBOVUxMOw0KDQogICAgcF9tdXRlID0gKGludCAqKW1zZy5wYXJhbTsNCiAgICByZXQgPSBzY19hdWRpb19nZXRfcnhfdm9pY2VfbXV0ZV9zdGF0ZShwX211dGUpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfbXV0ZSwgbXNnLnBhcmFtX2xlbik7DQogICAgZWxzZQ0KICAgICAgICBtZW1jcHkobXNnLnBhcmFtLCAmcmV0LCBtc2cucGFyYW1fbGVuKTsNCiAgICBtc2dfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyBtc2cucGFyYW1fbGVuOw0KDQogICAgcmV0ID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmbXNnLCBtc2dfbGVuKTsNCiAgICANCiAgICBpZiAoMCA+PSByZXQpew0KCQlwcmludGYoIiVzOiB3cml0ZSBlcnJvciglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgl9DQp9DQoNCnZvaWQgaXBjX3NldF9sb29wYmFja19lbmFibGVfc3RhdGVfcmN2KHZvaWNlX2lwY19jb250cm9sX21zZyBtc2cpDQp7DQogICAgaW50IHJldCA9IFZPSUNFSVBDX09LOw0KICAgIGludCBtc2dfbGVuID0gMDsNCglpbnQgZGV2X21vZGUgPSAwLGVuYWJsZSA9IDA7DQoNCiAgICAvL21lbWNweSgmZGV2X21vZGUsIG1zZy5wYXJhbSwgbXNnLnBhcmFtX2xlbik7DQogICAgLy9lbmFibGUgPSAqKChpbnQgKiltc2cucGFyYW0pOw0KCW1lbWNweSgmZGV2X21vZGUsIG1zZy5wYXJhbSwgc2l6ZW9mKGludCkpOw0KCW1lbWNweSgmZW5hYmxlLCBtc2cucGFyYW0rc2l6ZW9mKGludCksIHNpemVvZihpbnQpKTsNCgkNCiAgICAvL3JldCA9IHNjX2F1ZGlvX3NldF9sb29wYmFja19lbmFibGVfc3RhdGUoZW5hYmxlKTsNCglyZXQgPSBhcF9hdWRpb19zZXRfbG9vcGJhY2tfZW5hYmxlKGRldl9tb2RlLGVuYWJsZSk7DQoNCiAgICAvL21zZy5mdW5jX2lk5LiN5Y+YDQogICAgbXNnLnBhcmFtX2xlbiA9IHNpemVvZihpbnQpOw0KICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCg0Kdm9pZCBpcGNfZ2V0X2xvb3BiYWNrX2VuYWJsZV9zdGF0ZV9yY3Yodm9pY2VfaXBjX2NvbnRyb2xfbXNnIG1zZykNCnsNCiAgICBpbnQgcmV0ID0gVk9JQ0VJUENfT0s7DQogICAgaW50IG1zZ19sZW4gPSAwOw0KICAgIGludCAqcF9lbmFibGUgPSBOVUxMOw0KDQogICAgcF9lbmFibGUgPSAoaW50ICopbXNnLnBhcmFtOw0KICAgIC8vcmV0ID0gc2NfYXVkaW9fZ2V0X2xvb3BiYWNrX2VuYWJsZV9zdGF0ZShwX2VuYWJsZSk7DQogICAgcmV0ID0gYXBfYXVkaW9fZ2V0X2xvb3BiYWNrX2VuYWJsZShwX2VuYWJsZSk7CQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgaWYoMCA9PSByZXQpDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sIHBfZW5hYmxlLCBtc2cucGFyYW1fbGVuKTsNCiAgICBlbHNlDQogICAgICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCg0KI2lmZGVmIF9VU0VfVk9JQ0VfQUxTQQ0Kdm9pZCBpcGNfYXBfYWxzYV92b2ljZV9vcGVuX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IHZtb2RlID0gMDsNCg0KICAgIHZtb2RlID0gKigoaW50ICopbXNnLnBhcmFtKTsNCiAgICByZXQgPSBhbHNhX3ZvaWNlX29wZW4odm1vZGUpOw0KCQ0KICAgIC8vbXNnLmZ1bmNfaWTkuI3lj5gNCiAgICBtc2cucGFyYW1fbGVuID0gc2l6ZW9mKGludCk7DQogICAgbWVtY3B5KG1zZy5wYXJhbSwgJnJldCwgbXNnLnBhcmFtX2xlbik7DQogICAgbXNnX2xlbiA9IFZPSUNFX0hFQURfTEVOICsgbXNnLnBhcmFtX2xlbjsNCg0KICAgIHJldCA9IHdyaXRlKHZvaWNlX2lwY19mZCwgJm1zZywgbXNnX2xlbik7DQogICAgDQogICAgaWYgKDAgPj0gcmV0KXsNCgkJcHJpbnRmKCIlczogd3JpdGUgZXJyb3IoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7DQoJfQ0KfQ0KDQp2b2lkIGlwY19hcF9hbHNhX3ZvaWNlX2Nsb3NlX3Jjdih2b2ljZV9pcGNfY29udHJvbF9tc2cgbXNnKQ0Kew0KICAgIGludCByZXQgPSBWT0lDRUlQQ19PSzsNCiAgICBpbnQgbXNnX2xlbiA9IDA7DQogICAgaW50IHZtb2RlID0gMDsNCg0KICAgIHZtb2RlID0gKigoaW50ICopbXNnLnBhcmFtKTsNCiAgICByZXQgPSBhbHNhX3ZvaWNlX2Nsb3NlKHZtb2RlKTsNCgkNCiAgICAvL21zZy5mdW5jX2lk5LiN5Y+YDQogICAgbXNnLnBhcmFtX2xlbiA9IHNpemVvZihpbnQpOw0KICAgIG1lbWNweShtc2cucGFyYW0sICZyZXQsIG1zZy5wYXJhbV9sZW4pOw0KICAgIG1zZ19sZW4gPSBWT0lDRV9IRUFEX0xFTiArIG1zZy5wYXJhbV9sZW47DQoNCiAgICByZXQgPSB3cml0ZSh2b2ljZV9pcGNfZmQsICZtc2csIG1zZ19sZW4pOw0KICAgIA0KICAgIGlmICgwID49IHJldCl7DQoJCXByaW50ZigiJXM6IHdyaXRlIGVycm9yKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOw0KCX0NCn0NCiNlbmRpZg0KDQp2b2lkIHZvaWNlX2lwY19yZWN2X3Byb2Modm9pY2VfaXBjX2NvbnRyb2xfbXNnIG1zZykNCnsNCglzd2l0Y2gobXNnLmZ1bmNfaWQpew0KCQljYXNlIElQQ19TRVRfVk9JQ0VfREVWSUNFX01PREU6DQoJCQlpcGNfc2V0X3ZvaWNlX2RldmljZV9tb2RlX3Jjdih2b2ljZV9jdHJsX3JlY3Ztc2dbbXNnLmZ1bmNfaWRdKTsNCgkJCWJyZWFrOw0KCQljYXNlIElQQ19HRVRfVk9JQ0VfREVWSUNFX01PREU6DQoJCQlpcGNfZ2V0X3ZvaWNlX2RldmljZV9tb2RlX3Jjdih2b2ljZV9jdHJsX3JlY3Ztc2dbbXNnLmZ1bmNfaWRdKTsNCgkJCWJyZWFrOw0KICAgICAgICBjYXNlIElQQ19TRVRfUlhfVk9JQ0VfVk9MOg0KCQkJaXBjX3NldF9yeF92b2ljZV92b2xfcmN2KHZvaWNlX2N0cmxfcmVjdm1zZ1ttc2cuZnVuY19pZF0pOw0KCQkJYnJlYWs7DQogICAgICAgIGNhc2UgSVBDX0dFVF9SWF9WT0lDRV9WT0w6DQoJCQlpcGNfZ2V0X3J4X3ZvaWNlX3ZvbF9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiAgICAgICAgY2FzZSBJUENfU0VUX1JYX1ZPSUNFX1ZPTF9HQUlOOg0KCQkJaXBjX3NldF9yeF92b2ljZV92b2xfZ2Fpbl9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiAgICAgICAgY2FzZSBJUENfR0VUX1JYX1ZPSUNFX1ZPTF9HQUlOOg0KCQkJaXBjX2dldF9yeF92b2ljZV92b2xfZ2Fpbl9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiAgICAgICAgY2FzZSBJUENfU0VUX1RYX1ZPSUNFX1ZPTF9HQUlOOg0KCQkJaXBjX3NldF90eF92b2ljZV92b2xfZ2Fpbl9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiAgICAgICAgY2FzZSBJUENfR0VUX1RYX1ZPSUNFX1ZPTF9HQUlOOg0KCQkJaXBjX2dldF90eF92b2ljZV92b2xfZ2Fpbl9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiAgICAgICAgY2FzZSBJUENfU0VUX1RYX1ZPSUNFX1ZPTDoNCgkJCWlwY19zZXRfdHhfdm9pY2Vfdm9sX3Jjdih2b2ljZV9jdHJsX3JlY3Ztc2dbbXNnLmZ1bmNfaWRdKTsNCgkJCWJyZWFrOw0KICAgICAgICBjYXNlIElQQ19HRVRfVFhfVk9JQ0VfVk9MOg0KCQkJaXBjX2dldF90eF92b2ljZV92b2xfcmN2KHZvaWNlX2N0cmxfcmVjdm1zZ1ttc2cuZnVuY19pZF0pOw0KCQkJYnJlYWs7DQogICAgICAgIGNhc2UgSVBDX1NFVF9UWF9WT0lDRV9NVVRFX1NUQVRFOg0KCQkJaXBjX3NldF90eF92b2ljZV9tdXRlX3N0YXRlX3Jjdih2b2ljZV9jdHJsX3JlY3Ztc2dbbXNnLmZ1bmNfaWRdKTsNCgkJCWJyZWFrOw0KICAgICAgICBjYXNlIElQQ19HRVRfVFhfVk9JQ0VfTVVURV9TVEFURToNCgkJCWlwY19nZXRfdHhfdm9pY2VfbXV0ZV9zdGF0ZV9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiAgICAgICAgY2FzZSBJUENfU0VUX1JYX1ZPSUNFX01VVEVfU1RBVEU6DQoJCQlpcGNfc2V0X3J4X3ZvaWNlX211dGVfc3RhdGVfcmN2KHZvaWNlX2N0cmxfcmVjdm1zZ1ttc2cuZnVuY19pZF0pOw0KCQkJYnJlYWs7DQogICAgICAgIGNhc2UgSVBDX0dFVF9SWF9WT0lDRV9NVVRFX1NUQVRFOg0KCQkJaXBjX2dldF9yeF92b2ljZV9tdXRlX3N0YXRlX3Jjdih2b2ljZV9jdHJsX3JlY3Ztc2dbbXNnLmZ1bmNfaWRdKTsNCgkJCWJyZWFrOw0KICAgICAgICBjYXNlIElQQ19TRVRfTE9PUEJBQ0tfRU5BQkxFX1NUQVRFOg0KCQkJaXBjX3NldF9sb29wYmFja19lbmFibGVfc3RhdGVfcmN2KHZvaWNlX2N0cmxfcmVjdm1zZ1ttc2cuZnVuY19pZF0pOw0KCQkJYnJlYWs7DQogICAgICAgIGNhc2UgSVBDX0dFVF9MT09QQkFDS19FTkFCTEVfU1RBVEU6DQoJCQlpcGNfZ2V0X2xvb3BiYWNrX2VuYWJsZV9zdGF0ZV9yY3Yodm9pY2VfY3RybF9yZWN2bXNnW21zZy5mdW5jX2lkXSk7DQoJCQlicmVhazsNCiNpZmRlZiBfVVNFX1ZPSUNFX0FMU0EgICAgICAgIA0KICAgICAgICBjYXNlIElQQ19BUF9BTFNBX1ZPSUNFX09QRU46DQoJCQlpcGNfYXBfYWxzYV92b2ljZV9vcGVuX3Jjdih2b2ljZV9jdHJsX3JlY3Ztc2dbbXNnLmZ1bmNfaWRdKTsNCgkJCWJyZWFrOw0KICAgICAgICBjYXNlIElQQ19BUF9BTFNBX1ZPSUNFX0NMT1NFOg0KCQkJaXBjX2FwX2Fsc2Ffdm9pY2VfY2xvc2VfcmN2KHZvaWNlX2N0cmxfcmVjdm1zZ1ttc2cuZnVuY19pZF0pOw0KCQkJYnJlYWs7DQojZW5kaWYgICAgICAgIA0KCQlkZWZhdWx0Og0KCQkgICAgYnJlYWs7DQoJfQ0KfQ0KDQp2b2lkIFZvaWNlX0N0cmxfUnBtc2dfUmVjdih2b2lkKQ0Kew0KICAgIGludCByZWFkX2xlbiA9IDA7DQogICAgdm9pY2VfaXBjX2NvbnRyb2xfbXNnIHRtcGJ1ZiA9IHswfTsNCiAgICANCiAgICB3aGlsZSgxKXsNCiAgICAgICAgcmVhZF9sZW4gPSByZWFkKHZvaWNlX2lwY19mZCwgJnRtcGJ1ZiwgKFZPSUNFX0hFQURfTEVOICsgVk9JQ0VfQ09OVFJPTF9NQVhfTEVOKSk7DQogICAgICAgIA0KICAgICAgICBpZiAoMCA+PSByZWFkX2xlbil7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWNvbnRpbnVlOw0KCQl9DQogICAgICAgIHByaW50ZigiJXM6IHZvaWNlX2lwY19mZD0lZCwgcmVhZF9sZW49JWRcbiIsIF9fZnVuY19fLCB2b2ljZV9pcGNfZmQsIHJlYWRfbGVuKTsNCiAgICAgICAgDQogICAgICAgIC8vyv2+3bbByKHN6rrz1Nm4xLHkZnVjX2lkDQogICAgICAgIGlmKDAgIT0gdG1wYnVmLnBhcmFtX2xlbil7DQogICAgICAgICAgICBtZW1jcHkodm9pY2VfY3RybF9yZWN2bXNnW3RtcGJ1Zi5mdW5jX2lkXS5wYXJhbSwgdG1wYnVmLnBhcmFtLCB0bXBidWYucGFyYW1fbGVuKTsNCiAgICAgICAgfQ0KICAgICAgICB2b2ljZV9jdHJsX3JlY3Ztc2dbdG1wYnVmLmZ1bmNfaWRdLnBhcmFtX2xlbiA9IHRtcGJ1Zi5wYXJhbV9sZW47DQogICAgICAgIHZvaWNlX2N0cmxfcmVjdm1zZ1t0bXBidWYuZnVuY19pZF0uZnVuY19pZCA9IHRtcGJ1Zi5mdW5jX2lkOw0KICAgICAgICBwcmludGYoIiVzOiB0bXBidWYucGFyYW1fbGVuPSVkLCB0bXBidWYuZnVuY19pZD0lZFxuIiwgX19mdW5jX18sIHRtcGJ1Zi5wYXJhbV9sZW4sIHRtcGJ1Zi5mdW5jX2lkKTsNCiAgICAgICAgDQogICAgICAgIHZvaWNlX2lwY19yZWN2X3Byb2Modm9pY2VfY3RybF9yZWN2bXNnW3RtcGJ1Zi5mdW5jX2lkXSk7DQogICAgfQ0KfQ0KDQppbnQgVm9pY2VfQ3RybF9ScG1zZ19TZW5kKGludCBmdW5jX2lkLCBpbnQgKm1zZykNCnsNCiAgICB2b2ljZV9pcGNfY29udHJvbF9tc2cgdG1wYnVmID0gezB9Ow0KICAgIGludCB0bXBidWZfbGVuID0gMDsNCiAgICBpbnQgd3JpdGVfbGVuID0gMDsNCiAgICANCiAgICB0bXBidWYuZnVuY19pZCA9IGZ1bmNfaWQ7DQogICAgDQogICAgaWYoTlVMTCA9PSBtc2cpew0KICAgICAgICB0bXBidWYucGFyYW1fbGVuID0gMDsNCiAgICB9ZWxzZXsNCiAgICAgICAgdG1wYnVmLnBhcmFtX2xlbiA9IHNpemVvZihpbnQpOw0KICAgICAgICBtZW1jcHkodG1wYnVmLnBhcmFtLCBtc2csIHRtcGJ1Zi5wYXJhbV9sZW4pOw0KICAgIH0NCiAgICANCiAgICB0bXBidWZfbGVuID0gVk9JQ0VfSEVBRF9MRU4gKyB0bXBidWYucGFyYW1fbGVuOw0KDQogICAgLy9wcmludGYoIlZvaWNlX0N0cmxfUnBtc2dfU2VuZCwgdm9pY2VfaXBjX2ZkID0gJWRcbiIsIHZvaWNlX2lwY19mZCk7DQogICAgd3JpdGVfbGVuID0gd3JpdGUodm9pY2VfaXBjX2ZkLCAmdG1wYnVmLCB0bXBidWZfbGVuKTsNCg0KICAgIHJldHVybiB3cml0ZV9sZW47DQp9DQoNCmludCB2b2ljZV9pcGNfaW5pdCh2b2lkKSAvL+mAmumBk+WIneWni+WMPw0Kew0KICAgIHZvaWNlX2lwY19mZCA9IG9wZW4oVk9JQ0VfSVBDX0NPTlRST0xfQ0hBTk5FTCwgT19SRFdSKTsNCg0KICAgIGlmKDAgPiB2b2ljZV9pcGNfZmQpew0KICAgICAgICBwcmludGYoIiVzOiBvcGVuIHRoZSBjaGFubmVsKCVzKSBlcnJvciFcbiIsIF9fZnVuY19fLCBWT0lDRV9JUENfQ09OVFJPTF9DSEFOTkVMKTsNCiAgICAgICAgcmV0dXJuIFZPSUNFSVBDX0VSUk9SOw0KICAgIH0NCg0KICAgIGlmKDAgPiBpb2N0bCh2b2ljZV9pcGNfZmQsIFJQTVNHX0NSRUFURV9DSEFOTkVMLCBWT0lDRV9JUENfQ09OVFJPTF9DSEFOTkVMX1NJWkUpKXsNCiAgICAgICAgcHJpbnRmKCIlczogaW9jdGwgUlBNU0dfQ1JFQVRFX0NIQU5ORUwgZmFpbCFcbiIsIF9fZnVuY19fKTsNCiAgICAgICAgY2xvc2Uodm9pY2VfaXBjX2ZkKTsNCiAgICAgICAgdm9pY2VfaXBjX2ZkID0gLTE7DQogICAgICAgIHJldHVybiBWT0lDRUlQQ19FUlJPUjsNCiAgICB9DQogICAgDQogICAgaWYoMCA+IGlvY3RsKHZvaWNlX2lwY19mZCwgUlBNU0dfU0VUX0lOVF9GTEFHLCBOVUxMKSl7IC8v5YaZ5Lit5pY/DQogICAgICAgIHByaW50ZigiJXM6IGlvY3RsIFJQTVNHX1NFVF9JTlRfRkxBRyBmYWlsIVxuIiwgX19mdW5jX18pOw0KICAgICAgICBjbG9zZSh2b2ljZV9pcGNfZmQpOw0KICAgICAgICB2b2ljZV9pcGNfZmQgPSAtMTsNCiAgICAgICAgcmV0dXJuIFZPSUNFSVBDX0VSUk9SOw0KICAgIH0NCiAgICANCiAgICBpZigwID4gaW9jdGwodm9pY2VfaXBjX2ZkLCBSUE1TR19DTEVBUl9QT0xMX0ZMQUcsIE5VTEwpKXsgLy/pmLvloZ7mlrnlvI/or7vmlbDmjT8NCiAgICAgICAgcHJpbnRmKCIlczogaW9jdGwgUlBNU0dfQ0xFQVJfUE9MTF9GTEFHIGZhaWwhXG4iLCBfX2Z1bmNfXyk7DQogICAgICAgIGNsb3NlKHZvaWNlX2lwY19mZCk7DQogICAgICAgIHZvaWNlX2lwY19mZCA9IC0xOw0KICAgICAgICByZXR1cm4gVk9JQ0VJUENfRVJST1I7DQogICAgfQ0KDQogICAgcHJpbnRmKCJ2b2ljZV9pcGNfaW5pdCAlcyBjcmVhdGUgc3VjY2VzcyEgdm9pY2VfaXBjX2ZkID0gJWRcbiIsIFZPSUNFX0lQQ19DT05UUk9MX0NIQU5ORUwsIHZvaWNlX2lwY19mZCk7DQogICAgDQogICAgcmV0dXJuIFZPSUNFSVBDX09LOw0KfQ0KDQppbnQgcmVjdl9tc2dfcHJvYyhNU0dfQlVGIG1zZykNCnsNCiAgICBpbnQgcmV0ID0gMDsNCiAgICBpbnQgdm1vZGUgPSAwOw0KICAgIGludCBtb2R1bGVfaWQgPSBNT0RVTEVfSURfVk9JQ0VfU0VSVkVSOw0KICAgIGludCBkc3RfaWQgPSBNT0RVTEVfSURfVk9JQ0VfQ0xJRU5UOw0KICAgIA0KICAgIHN3aXRjaChtc2cudXNNc2dDbWQpew0KCQljYXNlIE1TR19DTURfQ0FQX1ZBTFNBX09QRU46DQogICAgICAgICAgICB2bW9kZSA9ICooKGludCAqKW1zZy5hdWNEYXRhQnVmKTsNCgkJCXJldCA9IGlwY19jYXBfYWxzYV92b2ljZV9vcGVuKHZtb2RlKTsNCiAgICAgICAgICAgIC8vZHN0X2lkID0gTU9EVUxFX0lEX0NBUF9WQUxTQV9PUEVOOw0KICAgICAgICAgICAgcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShtb2R1bGVfaWQsIGRzdF9pZCwgbXNnLnVzTXNnQ21kLCBzaXplb2YoaW50KSwgKHVuc2lnbmVkIGNoYXIgKikoJnJldCksIDApOw0KICAgICAgICAgICAgaWYoMCAhPSByZXQpew0KICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IGlwY19zZW5kX21lc3NhZ2UgZXJyb3IsIHJldHVybiAlZCFcbiIsIF9fZnVuY19fLCByZXQpOw0KICAgICAgICAgICAgfQ0KCQkJYnJlYWs7DQogICAgICAgIGNhc2UgTVNHX0NNRF9DQVBfVkFMU0FfQ0xPU0U6DQogICAgICAgICAgICB2bW9kZSA9ICooKGludCAqKW1zZy5hdWNEYXRhQnVmKTsNCgkJCXJldCA9IGlwY19jYXBfYWxzYV92b2ljZV9jbG9zZSh2bW9kZSk7DQoJCQkvL2RzdF9pZCA9IE1PRFVMRV9JRF9DQVBfVkFMU0FfQ0xPU0U7DQogICAgICAgICAgICByZXQgPSBpcGNfc2VuZF9tZXNzYWdlKG1vZHVsZV9pZCwgZHN0X2lkLCBtc2cudXNNc2dDbWQsIHNpemVvZihpbnQpLCAodW5zaWduZWQgY2hhciAqKSgmcmV0KSwgMCk7DQogICAgICAgICAgICBpZigwICE9IHJldCl7DQogICAgICAgICAgICAgICAgcHJpbnRmKCIlczogaXBjX3NlbmRfbWVzc2FnZSBlcnJvciwgcmV0dXJuICVkIVxuIiwgX19mdW5jX18sIHJldCk7DQogICAgICAgICAgICB9DQoJCQlicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHByaW50ZigiJXM6IG1zZy51c01zZ0NtZD0lZCwgbm90IHN1cHBvcnQhXG4iLCBfX2Z1bmNfXywgbXNnLnVzTXNnQ21kKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICANCiAgICByZXR1cm4gcmV0Ow0KfQ0KDQp2b2lkIHJlY3ZfY2FwX3ZvaWNlX2Fsc2Eodm9pZCkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCiAgICBpbnQgbXNnX2hhbmRsZSA9IDA7DQoJTVNHX0JVRiBtc2c7DQoJTE9ORyBtc2dfc2l6ZSA9ICBzaXplb2YoTVNHX0JVRiktc2l6ZW9mKExPTkcpOw0KICAgIGludCBtb2R1bGVfaWQgPSBNT0RVTEVfSURfVk9JQ0VfU0VSVkVSOw0KDQogICAgLy+0tL2oz/vPorbTwdANCgltc2dfaGFuZGxlID0gbXNnZ2V0KG1vZHVsZV9pZCwgSVBDX0NSRUFUfDA2MDApOw0KDQogICAgLy+908rVz/vPog0KICAgIHdoaWxlKDEpDQoJew0KCQltZW1zZXQoJm1zZywgMHgwMCwgc2l6ZW9mKE1TR19CVUYpKTsNCg0KCQkvL7vxyKHP+8+ittPB0M/7z6KyorSmwO0NCgkJcmV0ID0gbXNncmN2KG1zZ19oYW5kbGUsICZtc2csIG1zZ19zaXplLCAwLCAwKTsNCiAgICAgICAgDQogICAgICAgIGlmKDAgPiByZXQpew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCg0KICAgICAgICByZWN2X21zZ19wcm9jKG1zZyk7DQogICAgfQ0KfQ0KDQp2b2lkIHJlY3ZfdXBkYXRlX3ZvaWNlX252cndfaXBjKHZvaWQpDQp7DQogICAgaW50IHJlYWRfbGVuID0gMDsNCiAgICBpbnQgcmV0ID0gLTE7DQogICAgaW50IGZkID0gLTE7DQoNCiAgICByZWN2X3ZvaWNlX252cndfYnVmID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhWT0lDRV9IRUFEX0xFTiArIFZPSUNFX05WUldfTUFYX0xFTik7DQogICAgaWYoIXJlY3Zfdm9pY2VfbnZyd19idWYpew0KICAgICAgICBwcmludGYoIiVzOiByZWN2X3ZvaWNlX252cndfYnVmIG1hbGxvYyBmYWlsIVxuIiwgX19mdW5jX18pOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KICAgIA0KICAgIHdoaWxlKDEpew0KICAgICAgICByZWFkX2xlbiA9IHJlYWQodm9pY2VfaXBjX2ZkLCByZWN2X3ZvaWNlX252cndfYnVmLCBWT0lDRV9IRUFEX0xFTiArIFZPSUNFX05WUldfTUFYX0xFTik7DQogICAgICAgIGlmICgwID49IHJlYWRfbGVuKXsNCiAgICAgICAgICAgIHNsZWVwKDEpOw0KCQkJY29udGludWU7DQoJCX0NCg0KICAgICAgICBwcmludGYoIiVzOiByZWFkX2xlbiA9ICVkLCBmdW5jX2lkID0gJWQsIHBhcmFtX2xlbiA9ICVkIVxuIiwgX19mdW5jX18sIHJlYWRfbGVuLCBcDQogICAgICAgICooKGludCopcmVjdl92b2ljZV9udnJ3X2J1ZiksICooKGludCopcmVjdl92b2ljZV9udnJ3X2J1ZiArIDEpKTsNCiAgICAgICAgDQojaWYgMA0KICAgICAgICBwcmludGYoIiVzOiBwYXJhbVswXT0lMDJ4LHBhcmFtWzFdPSUwMngscGFyYW1bMl09JTAyeCxwYXJhbVszXT0lMDJ4LHBhcmFtWzRdPSUwMngscGFyYW1bNV09JTAyeCxwYXJhbVs2XT0lMDJ4IVxuIiwgXA0KICAgICAgICAgICAgX19mdW5jX18sIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bMF0sIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bMV0sIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bMl0sIFwNCiAgICAgICAgICAgIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bM10sIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bNF0sIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bNV0sIHJlY3Zfdm9pY2VfbnZyd19idWYucGFyYW1bNl0pOw0KICAgICAgICANCiAgICAgICAgaW50IHdyaXRlc2l6ZSA9IDA7DQogICAgICAgIEZJTEUgKnB0ZXN0ID0gZm9wZW4oIi9tbnQvdXNlcmRhdGEvdm9pY2VfbnZfdGVzdF9hcC5iaW4iLCAid2IiKTsNCiAgICAgICAgaWYoIXB0ZXN0KXsNCiAgICAgICAgICAgIHByaW50ZigiJXM6IFVuYWJsZSB0byBjcmVhdGUgZmlsZSAnL21udC91c2VyZGF0YS92b2ljZV9udl90ZXN0X2FwLmJpbichXG4iLCBfX2Z1bmNfXyk7DQogICAgICAgIH0NCg0KICAgICAgICB3cml0ZXNpemUgPSBmd3JpdGUocmVjdl92b2ljZV9udnJ3X2J1Zi5wYXJhbSwgMSwgcmVjdl92b2ljZV9udnJ3X2J1Zi5wYXJhbV9sZW4sIHB0ZXN0KTsNCiAgICAgICAgcHJpbnRmKCIlczogd3JpdGVzaXplID0gJWQhXG4iLCBfX2Z1bmNfXywgd3JpdGVzaXplKTsNCiAgICAgICAgDQogICAgICAgIGlmKE5VTEwgIT0gcHRlc3Qpew0KICAgICAgICAgICAgZmNsb3NlKHB0ZXN0KTsNCiAgICAgICAgfQ0KI2VuZGlmDQogICAgICAgIA0KICAgIAlmZCA9IG9wZW4oVk9JQ0VfREVWX05BTUUsIE9fUkRXUik7DQoNCiAgICAgICAgaWYoMCA+IGZkKXsNCiAgICAgICAgICAgIHByaW50ZigiJXM6IG9wZW4gdm9pY2UgZGV2aWNlIGVycm9yIVxuIiwgX19mdW5jX18pOw0KICAgICAgICB9DQogICAgICAgIGVsc2V7DQogICAgICAgICAgICByZXQgPSBpb2N0bChmZCwgVk9JQ0VfSU9DVExfU0VUX1ZPSUNFX05WUlcsIHJlY3Zfdm9pY2VfbnZyd19idWYpOw0KICAgICAgICAgICAgcHJpbnRmKCIlczogaW9jdGwgL2Rldi92b2ljZV9kZXZpY2UgZW5kLCByZXQ9JWQhXG4iLCBfX2Z1bmNfXywgcmV0KTsNCiAgICAgICAgICAgIGNsb3NlKGZkKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgaWYocmVjdl92b2ljZV9udnJ3X2J1Zil7DQogICAgICAgIGZyZWUocmVjdl92b2ljZV9udnJ3X2J1Zik7DQogICAgICAgIHJlY3Zfdm9pY2VfbnZyd19idWYgPSBOVUxMOw0KICAgIH0NCiAgICANCiAgICByZXR1cm47DQp9DQoNCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCnsNCiAgICBpbnQgcmV0ID0gMDsNCiAgICANCiAgICAvL2lwY82otcCz9cq8u68NCiAgICByZXQgPSB2b2ljZV9pcGNfaW5pdCgpOw0KICAgIGlmKDAgPiByZXQpew0KICAgICAgICBwcmludGYoInZvaWNlX2lwY19pbml0ICVzIGVycm9yIVxuIiwgVk9JQ0VfSVBDX0NPTlRST0xfQ0hBTk5FTCk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQogICAgDQogICAgLy9pcGOz9cq8u6+686OstLS9qG1zZ8/7z6K908rVz9+zzA0KCXB0aHJlYWRfdCByZWN2X3RocmVhZF90aWQ7DQoJaWYoMCAhPSBwdGhyZWFkX2NyZWF0ZSgmcmVjdl90aHJlYWRfdGlkLCBOVUxMLCAodm9pZCAqKXJlY3ZfY2FwX3ZvaWNlX2Fsc2EsIE5VTEwpKXsNCgkJcHJpbnRmKCJyZWN2X2NhcF92b2ljZV9hbHNhIGNyZWF0ZSBlcnJvciFcbiIpOw0KCX0NCg0KICAgIHNsZWVwKDQpOyAvL7XItP1jYXCy4NL0xrW6y7zkzai1wL2owaLN6rPJDQoNCiAgICAvL2lwY7P1yry7r7rzo6zWsb3Tu/HIoWNhcLLgdm9pY2UgbnYNCiAgICByZWN2X3VwZGF0ZV92b2ljZV9udnJ3X2lwYygpOw0KICAgIA0KICAgIFZvaWNlX0N0cmxfUnBtc2dfUmVjdigpOw0KICAgIA0KICAgIHJldHVybiAwOw0KfQ0KDQojZW5kaWYNCg==