Ly8gMjAwMS0wOC0xNSBCZW5qYW1pbiBLb3NuaWsgIDxia296QHJlZGhhdC5jb20+CgovLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQovLyBhbnkgbGF0ZXIgdmVyc2lvbi4KCi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAovLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgovLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwovLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi8vIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAovLyBVU0EuCgovLyAyMi4yLjQuMiBUZW1wbGF0ZSBjbGFzcyBjb2xsYXRlX2J5bmFtZQoKI2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgoKdm9pZCB0ZXN0MDEoKQp7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICB0eXBlZGVmIHN0ZDo6Y29sbGF0ZTxjaGFyPjo6c3RyaW5nX3R5cGUgc3RyaW5nX3R5cGU7CgogIGJvb2wgdGVzdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHRydWU7CiAgc3RyaW5nIHN0cjsKICBsb2NhbGUgbG9jX2MgPSBsb2NhbGU6OmNsYXNzaWMoKTsKCiAgbG9jYWxlIGxvY19kZSA9IF9fZ251X3Rlc3Q6OnRyeV9uYW1lZF9sb2NhbGUoImRlX0RFIik7CiAgc3RyID0gbG9jX2RlLm5hbWUoKTsKCiAgbG9jYWxlIGxvY19ieW5hbWUobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2xsYXRlX2J5bmFtZTxjaGFyPigiZGVfREUiKSk7CiAgc3RyID0gbG9jX2J5bmFtZS5uYW1lKCk7CgogIFZFUklGWSggbG9jX2RlICE9IGxvY19ieW5hbWUgKTsKCiAgLy8gY2FjaGUgdGhlIGNvbGxhdGUgZmFjZXRzCiAgY29uc3QgY29sbGF0ZTxjaGFyPiYgY29sbF9kZSA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jX2RlKTsgCgogIC8vIENoZWNrIEdlcm1hbiAiZGVfREUiIGxvY2FsZS4KICBpbnQgaTE7CiAgaW50IGkyOwogIGxvbmcgbDE7CiAgbG9uZyBsMjsKICBjb25zdCBjaGFyKiBzdHJsaXQzID0gIsR1Z2xlaW4gQXVnbWVudCI7IC8vICJDIiA9PSAiQXVnbWVudCDEdWdsZWluIgogIGNvbnN0IGNoYXIqIHN0cmxpdDQgPSAiQmFzZSBiYd8gQmHfIEJhc3QiOyAvLyAiQyIgPT0gIkJhc2UgYmHfIEJh3yBCYXN0IgoKICBpbnQgc2l6ZTMgPSBzdHJsZW4oc3RybGl0MykgLSAxOwogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMywgc3RybGl0Mywgc3RybGl0MyArIDcpOwogIFZFUklGWSAoIGkxID09IDEgKTsKICBpMSA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNywgc3RybGl0Mywgc3RybGl0MyArIHNpemUzKTsKICBWRVJJRlkgKCBpMSA9PSAtMSApOwogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA3LCBzdHJsaXQzLCBzdHJsaXQzICsgNyk7CiAgVkVSSUZZICggaTEgPT0gMCApOwoKICBpMSA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNiwgc3RybGl0MyArIDgsIHN0cmxpdDMgKyAxNCk7CiAgVkVSSUZZICggaTEgPT0gLTEgKTsKCiAgaW50IHNpemU0ID0gc3RybGVuKHN0cmxpdDQpIC0gMTsKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyAxMyk7CiAgVkVSSUZZICggaTIgPT0gMSApOwogIGkyID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyAxMywgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpMiA9PSAtMSApOwogIGkyID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCwgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpMiA9PSAwICk7CgogIGwxID0gY29sbF9kZS5oYXNoKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyk7CiAgbDIgPSBjb2xsX2RlLmhhc2goc3RybGl0Mywgc3RybGl0MyArIHNpemUzIC0gMSk7CiAgVkVSSUZZICggbDEgIT0gbDIgKTsKICBsMSA9IGNvbGxfZGUuaGFzaChzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMpOwogIGwyID0gY29sbF9kZS5oYXNoKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggbDEgIT0gbDIgKTsKCiAgc3RyaW5nIHN0cjMgPSBjb2xsX2RlLnRyYW5zZm9ybShzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMpOwogIHN0cmluZyBzdHI0ID0gY29sbF9kZS50cmFuc2Zvcm0oc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBpMSA9IHN0cjMuY29tcGFyZShzdHI0KTsKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTIgPT0gLTEgKTsKICBWRVJJRlkgKCBpMSAqIGkyID4gMCApOwoKCiAgLy8gQ2hlY2sgYnluYW1lIGxvY2FsZQogIGludCBpMzsKICBpbnQgaTQ7CiAgbG9uZyBsMzsKICBsb25nIGw0OwogIHNpemU0ID0gc3RybGVuKHN0cmxpdDMpIC0gMTsKICBpMyA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTQsIHN0cmxpdDMsIHN0cmxpdDMgKyA3KTsKICBWRVJJRlkgKCBpMyA9PSAxICk7CiAgaTMgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDcsIHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplNCk7CiAgVkVSSUZZICggaTMgPT0gLTEgKTsKICBpMyA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNywgc3RybGl0Mywgc3RybGl0MyArIDcpOwogIFZFUklGWSAoIGkzID09IDAgKTsKCiAgaTMgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDYsIHN0cmxpdDMgKyA4LCBzdHJsaXQzICsgMTQpOwogIFZFUklGWSAoIGkzID09IC0xICk7CgogIHNpemU0ID0gc3RybGVuKHN0cmxpdDQpIC0gMTsKICBpNCA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyAxMyk7CiAgVkVSSUZZICggaTQgPT0gMSApOwogIGk0ID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyAxMywgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpNCA9PSAtMSApOwogIGk0ID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCwgc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBWRVJJRlkgKCBpNCA9PSAwICk7CgogIGwzID0gY29sbF9kZS5oYXNoKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplNCk7CiAgbDQgPSBjb2xsX2RlLmhhc2goc3RybGl0Mywgc3RybGl0MyArIHNpemU0IC0gMSk7CiAgVkVSSUZZICggbDMgIT0gbDQgKTsKICBsMyA9IGNvbGxfZGUuaGFzaChzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTQpOwogIGw0ID0gY29sbF9kZS5oYXNoKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggbDMgIT0gbDQgKTsKCiAgc3RyaW5nIHN0cjUgPSBjb2xsX2RlLnRyYW5zZm9ybShzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMpOwogIHN0cmluZyBzdHI2ID0gY29sbF9kZS50cmFuc2Zvcm0oc3RybGl0NCwgc3RybGl0NCArIHNpemU0KTsKICBpMyA9IHN0cjUuY29tcGFyZShzdHI2KTsKICBpNCA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTQgPT0gLTEgKTsKICBWRVJJRlkgKCBpMyAqIGk0ID4gMCApOwoKICAvLyBWZXJpZnkgYnluYW1lID09IGRlCiAgVkVSSUZZICggc3RyNSA9PSBzdHIzICk7CiAgVkVSSUZZICggc3RyNiA9PSBzdHI0ICk7Cn0KCmludCBtYWluKCkKewogIHRlc3QwMSgpOwogIHJldHVybiAwOwp9Cg==