Ly8geyBkZy1yZXF1aXJlLW5hbWVkbG9jYWxlICIiIH0KCi8vIDIwMDEtMDgtMTUgQmVuamFtaW4gS29zbmlrICA8YmtvekByZWRoYXQuY29tPgoKLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQovLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQovLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLy8gYW55IGxhdGVyIHZlcnNpb24uCgovLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQovLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQovLyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi8vIFVTQS4KCi8vIDIyLjIuNC4yIFRlbXBsYXRlIGNsYXNzIGNvbGxhdGVfYnluYW1lCgojaW5jbHVkZSA8bG9jYWxlPgojaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tzLmg+Cgp2b2lkIHRlc3QwMSgpCnsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIHR5cGVkZWYgc3RkOjpjb2xsYXRlPGNoYXI+OjpzdHJpbmdfdHlwZSBzdHJpbmdfdHlwZTsKCiAgYm9vbCB0ZXN0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gdHJ1ZTsKICBzdHJpbmcgc3RyOwogIGxvY2FsZSBsb2NfYyA9IGxvY2FsZTo6Y2xhc3NpYygpOwoKICBsb2NhbGUgbG9jX2RlID0gbG9jYWxlKCJkZV9ERSIpOwogIHN0ciA9IGxvY19kZS5uYW1lKCk7CgogIGxvY2FsZSBsb2NfYnluYW1lKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29sbGF0ZV9ieW5hbWU8Y2hhcj4oImRlX0RFIikpOwogIHN0ciA9IGxvY19ieW5hbWUubmFtZSgpOwoKICBWRVJJRlkoIGxvY19kZSAhPSBsb2NfYnluYW1lICk7CgogIC8vIGNhY2hlIHRoZSBjb2xsYXRlIGZhY2V0cwogIGNvbnN0IGNvbGxhdGU8Y2hhcj4mIGNvbGxfZGUgPSB1c2VfZmFjZXQ8Y29sbGF0ZTxjaGFyPiA+KGxvY19kZSk7IAoKICAvLyBDaGVjayBHZXJtYW4gImRlX0RFIiBsb2NhbGUuCiAgaW50IGkxOwogIGludCBpMjsKICBsb25nIGwxOwogIGxvbmcgbDI7CiAgY29uc3QgY2hhciogc3RybGl0MyA9ICLEdWdsZWluIEF1Z21lbnQiOyAvLyAiQyIgPT0gIkF1Z21lbnQgxHVnbGVpbiIKICBjb25zdCBjaGFyKiBzdHJsaXQ0ID0gIkJhc2UgYmHfIEJh3yBCYXN0IjsgLy8gIkMiID09ICJCYXNlIGJh3yBCYd8gQmFzdCIKCiAgaW50IHNpemUzID0gc3RybGVuKHN0cmxpdDMpIC0gMTsKICBpMSA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMsIHN0cmxpdDMsIHN0cmxpdDMgKyA3KTsKICBWRVJJRlkgKCBpMSA9PSAxICk7CiAgaTEgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDcsIHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyk7CiAgVkVSSUZZICggaTEgPT0gLTEgKTsKICBpMSA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNywgc3RybGl0Mywgc3RybGl0MyArIDcpOwogIFZFUklGWSAoIGkxID09IDAgKTsKCiAgaTEgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDYsIHN0cmxpdDMgKyA4LCBzdHJsaXQzICsgMTQpOwogIFZFUklGWSAoIGkxID09IC0xICk7CgogIGludCBzaXplNCA9IHN0cmxlbihzdHJsaXQ0KSAtIDE7CiAgaTIgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIHNpemU0LCBzdHJsaXQ0LCBzdHJsaXQ0ICsgMTMpOwogIFZFUklGWSAoIGkyID09IDEgKTsKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgMTMsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTIgPT0gLTEgKTsKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTIgPT0gMCApOwoKICBsMSA9IGNvbGxfZGUuaGFzaChzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTMpOwogIGwyID0gY29sbF9kZS5oYXNoKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMyAtIDEpOwogIFZFUklGWSAoIGwxICE9IGwyICk7CiAgbDEgPSBjb2xsX2RlLmhhc2goc3RybGl0Mywgc3RybGl0MyArIHNpemUzKTsKICBsMiA9IGNvbGxfZGUuaGFzaChzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGwxICE9IGwyICk7CgogIHN0cmluZyBzdHIzID0gY29sbF9kZS50cmFuc2Zvcm0oc3RybGl0Mywgc3RybGl0MyArIHNpemUzKTsKICBzdHJpbmcgc3RyNCA9IGNvbGxfZGUudHJhbnNmb3JtKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgaTEgPSBzdHIzLmNvbXBhcmUoc3RyNCk7CiAgaTIgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIHNpemUzLCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGkyID09IC0xICk7CiAgVkVSSUZZICggaTEgKiBpMiA+IDAgKTsKCgogIC8vIENoZWNrIGJ5bmFtZSBsb2NhbGUKICBpbnQgaTM7CiAgaW50IGk0OwogIGxvbmcgbDM7CiAgbG9uZyBsNDsKICBzaXplNCA9IHN0cmxlbihzdHJsaXQzKSAtIDE7CiAgaTMgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIHNpemU0LCBzdHJsaXQzLCBzdHJsaXQzICsgNyk7CiAgVkVSSUZZICggaTMgPT0gMSApOwogIGkzID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA3LCBzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTQpOwogIFZFUklGWSAoIGkzID09IC0xICk7CiAgaTMgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIDcsIHN0cmxpdDMsIHN0cmxpdDMgKyA3KTsKICBWRVJJRlkgKCBpMyA9PSAwICk7CgogIGkzID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA2LCBzdHJsaXQzICsgOCwgc3RybGl0MyArIDE0KTsKICBWRVJJRlkgKCBpMyA9PSAtMSApOwoKICBzaXplNCA9IHN0cmxlbihzdHJsaXQ0KSAtIDE7CiAgaTQgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIHNpemU0LCBzdHJsaXQ0LCBzdHJsaXQ0ICsgMTMpOwogIFZFUklGWSAoIGk0ID09IDEgKTsKICBpNCA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgMTMsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTQgPT0gLTEgKTsKICBpNCA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTQgPT0gMCApOwoKICBsMyA9IGNvbGxfZGUuaGFzaChzdHJsaXQzLCBzdHJsaXQzICsgc2l6ZTQpOwogIGw0ID0gY29sbF9kZS5oYXNoKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplNCAtIDEpOwogIFZFUklGWSAoIGwzICE9IGw0ICk7CiAgbDMgPSBjb2xsX2RlLmhhc2goc3RybGl0Mywgc3RybGl0MyArIHNpemU0KTsKICBsNCA9IGNvbGxfZGUuaGFzaChzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGwzICE9IGw0ICk7CgogIHN0cmluZyBzdHI1ID0gY29sbF9kZS50cmFuc2Zvcm0oc3RybGl0Mywgc3RybGl0MyArIHNpemUzKTsKICBzdHJpbmcgc3RyNiA9IGNvbGxfZGUudHJhbnNmb3JtKHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgaTMgPSBzdHI1LmNvbXBhcmUoc3RyNik7CiAgaTQgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0Mywgc3RybGl0MyArIHNpemU0LCBzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQpOwogIFZFUklGWSAoIGk0ID09IC0xICk7CiAgVkVSSUZZICggaTMgKiBpNCA+IDAgKTsKCiAgLy8gVmVyaWZ5IGJ5bmFtZSA9PSBkZQogIFZFUklGWSAoIHN0cjUgPT0gc3RyMyApOwogIFZFUklGWSAoIHN0cjYgPT0gc3RyNCApOwp9CgppbnQgbWFpbigpCnsKICB0ZXN0MDEoKTsKICByZXR1cm4gMDsKfQo=