IyEvdXNyL2Jpbi9wZXJsIC13Cgp1c2Ugc3RyaWN0OwoKIwojIEV2ZW4gd2l0aCBnaXQsIHdlIGRvbid0IGFsd2F5cyBoYXZlIG5hbWUgdHJhbnNsYXRpb25zLgojIFNvIGhhdmUgYW4gZW1haWwtPnJlYWwgbmFtZSB0YWJsZSB0byB0cmFuc2xhdGUgdGhlCiMgKGhvcGVmdWxseSBmZXcpIG1pc3NpbmcgbmFtZXMKIwpteSAlbWFpbG1hcCA9ICgKCSdSLk1hcmVrQHNoLmN2dXQuY3onID0+ICdSdWRvbGYgTWFyZWsnLAoJJ1JhbGYuV2lsZGVuaHVlc0BnbXguZGUnID0+ICdSYWxmIFdpbGRlbmh1ZXMnLAoJJ2FoZXJybWFuQGRlLmlibS5jb20nID0+ICdBbmRyZWFzIEhlcnJtYW5uJywKCSdha3BtQG9zZGwub3JnJyA9PiAnQW5kcmV3IE1vcnRvbicsCgknYW5kcmV3LnZhc3F1ZXpAcWxvZ2ljLmNvbScgPT4gJ0FuZHJldyBWYXNxdWV6JywKCSdhcXV5bmhAZ21haWwuY29tJyA9PiAnTmd1eWVuIEFuaCBRdXluaCcsCgknYXhib2VAc3VzZS5kZScgPT4gJ0plbnMgQXhib2UnLAoJJ2JsYWlzb3JibGFkZUB5YWhvby5pdCcgPT4gJ1Bhb2xvIFwnQmxhaXNvcmJsYWRlXCcgR2lhcnJ1c3NvJywKCSdidW5rQHN0dXN0YS5kZScgPT4gJ0FkcmlhbiBCdW5rJywKCSdkb21lbkBjb2Rlcm9jay5vcmcnID0+ICdEb21lbiBQdW5jZXInLAoJJ2RvdWdnQHRvcnF1ZS5uZXQnID0+ICdEb3VnbGFzIEdpbGJlcnQnLAoJJ2R3bXcyQHNoaW55Ym9vay5pbmZyYWRlYWQub3JnJyA9PiAnRGF2aWQgV29vZGhvdXNlJywKCSdlY2FzaGluQGNvcmFpZC5jb20nID0+ICdFZCBMIENhc2hpbicsCgknZmVsaXhAZGVya2xlY2tzLmRlJyA9PiAnRmVsaXggTW9lbGxlcicsCgknZnphZ29Ac3lzdGVtZmFicmljd29ya3MuY29tJyA9PiAnRnJhbmsgWmFnbycsCgknZ3JlZ2toQHN1c2UuZGUnID0+ICdHcmVnIEtyb2FoLUhhcnRtYW4nLAoJJ2hjaEBsc3QuZGUnID0+ICdDaHJpc3RvcGggSGVsbHdpZycsCgknaHRlanVuQGdtYWlsLmNvbScgPT4gJ1RlanVuIEhlbycsCgknamVqYkBtdWxncmF2ZS4obm9uZSknID0+ICdKYW1lcyBCb3R0b21sZXknLAoJJ2plamJAdGl0YW5pYy5pbC5zdGVlbGV5ZS5jb20nID0+ICdKYW1lcyBCb3R0b21sZXknLAoJJ2pnYXJ6aWtAcHJldHplbC55eXoudXMnID0+ICdKZWZmIEdhcnppaycsCgknam9obnBvbEAya2EubWlwdC5ydScgPT4gJ0V2Z2VuaXkgUG9seWFrb3YnLAoJJ2theS5zaWV2ZXJzQHZyZnkub3JnJyA9PiAnS2F5IFNpZXZlcnMnLAoJJ21pbnlhcmRAYWNtLm9yZycgPT4gJ0NvcmV5IE1pbnlhcmQnLAoJJ21zaGFoQHRlamEuY29tJyA9PiAnTWl0ZXNoIHNoYWgnLAoJJ3BqQGx1ZGQubHR1LnNlJyA9PiAnUGV0ZXIgQSBKb25zc29uJywKCSdybXBzQGpvZWwuaXN0LnV0bC5wdCcgPT4gJ1J1aSBTYXJhaXZhJywKCSdzYW50dHUuaHlya2tvQGdtYWlsLmNvbScgPT4gJ1NhbnR0dSBIeXJra/YnLAoJJ3NpbW9uQHRoZWtlbGxleXMub3JnLnVrJyA9PiAnU2ltb24gS2VsbGV5JywKCSdzc2FudEBpbi5pYm0uY29tJyA9PiAnU2FjaGluIFAgU2FudCcsCgkndGVycmFAZ25vbWUub3JnJyA9PiAnTW9ydGVuIFdlbGluZGVyJywKCSd0b255Lmx1Y2tAaW50ZWwuY29tJyA9PiAnVG9ueSBMdWNrJywKCSd3ZWxpbmRlckBhbmVtb25lLnJlbnRlYy5jb20nID0+ICdNb3J0ZW4gV2VsaW5kZXInLAoJJ3dlbGluZGVyQGRhcnRlci5yZW50ZWMuY29tJyA9PiAnTW9ydGVuIFdlbGluZGVyJywKCSd3ZWxpbmRlckB0cm9sbC5jb20nID0+ICdNb3J0ZW4gV2VsaW5kZXInLAopOwoKbXkgKCVtYXApOwpteSAkcHN0YXRlID0gMTsKbXkgJG5fcmVjb3JkcyA9IDA7Cm15ICRuX291dHB1dCA9IDA7CgoKc3ViIHNob3J0bG9nX2VudHJ5KCQkKSB7CglteSAoJG5hbWUsICRkZXNjKSA9IEBfOwoJbXkgJGtleSA9ICRuYW1lOwoKCSRkZXNjID1+IHMjL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC8jLy4uLi8jZzsKCSRkZXNjID1+IHMjXFtQQVRDSFxdICMjZzsKCgkjIHN0b3JlIGRlc2NyaXB0aW9uIGluIGFycmF5LCBpbiBlbWFpbC0+e2Rlc2MgbGlzdH0gbWFwCglpZiAoZXhpc3RzICRtYXB7JGtleX0pIHsKCQkjIGdyYWIgcmVmCgkJbXkgJG9iaiA9ICRtYXB7JGtleX07CgoJCSMgYWRkIGRlc2MgdG8gYXJyYXkKCQlwdXNoKEAkb2JqLCAkZGVzYyk7Cgl9IGVsc2UgewoJCSMgY3JlYXRlIG5ldyBhcnJheSwgY29udGFpbmluZyAxIGl0ZW0KCQlteSBAYXJyID0gKCRkZXNjKTsKCgkJIyBzdG9yZSByZWYgdG8gYXJyYXkKCQkkbWFweyRrZXl9ID0gXEBhcnI7Cgl9Cn0KCiMgc29ydCBjb21wYXJpc29uIGZ1bmN0aW9uCnN1YiBieV9uYW1lKCQkKSB7CglteSAoJGEsICRiKSA9IEBfOwoKCXVjKCRhKSBjbXAgdWMoJGIpOwp9CgpzdWIgc2hvcnRsb2dfb3V0cHV0IHsKCW15ICgkb2JqLCAka2V5LCAkZGVzYyk7CgoJZm9yZWFjaCAka2V5IChzb3J0IGJ5X25hbWUga2V5cyAlbWFwKSB7CgkJIyBvdXRwdXQgYXV0aG9yCgkJcHJpbnRmICIlczpcbiIsICRrZXk7CgoJCSMgb3V0cHV0IGF1dGhvcidzIDEtbGluZSBzdW1tYXJpZXMKCQkkb2JqID0gJG1hcHska2V5fTsKCQlmb3JlYWNoICRkZXNjIChyZXZlcnNlIEAkb2JqKSB7CgkJCXByaW50ICIgICRkZXNjXG4iOwoJCQkkbl9vdXRwdXQrKzsKCQl9CgoJCSMgYmxhbmsgbGluZSBzZXBhcmF0aW5nIGF1dGhvciBmcm9tIG5leHQgYXV0aG9yCgkJcHJpbnQgIlxuIjsKCX0KfQoKc3ViIGNoYW5nZWxvZ19pbnB1dCB7CglteSAoJGF1dGhvciwgJGRlc2MpOwoKCXdoaWxlICg8PikgewoJCSMgZ2V0IGF1dGhvciBhbmQgZW1haWwKCQlpZiAoJHBzdGF0ZSA9PSAxKSB7CgkJCW15ICgkZW1haWwpOwoKCQkJbmV4dCB1bmxlc3MgL15BdXRob3I6ICguKik8KC4qKT4uKiQvOwoJCgkJCSRuX3JlY29yZHMrKzsKCQoJCQkkYXV0aG9yID0gJDE7CgkJCSRlbWFpbCA9ICQyOwoJCQkkZGVzYyA9IHVuZGVmOwoKCQkJIyB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2UuCgkJCSMgd2h5IGRvZXNuJ3QgY2hvbXAgd29yaz8KCQkJd2hpbGUgKCRhdXRob3IgJiYgKCRhdXRob3IgPX4gL1xzJC8pKSB7CgkJCQljaG9wICRhdXRob3I7CgkJCX0KCQoJCQkjIGNzZXQgYXV0aG9yIGZpeHVwcwoJCQlpZiAoZXhpc3RzICRtYWlsbWFweyRlbWFpbH0pIHsKCQkJCSRhdXRob3IgPSAkbWFpbG1hcHskZW1haWx9OwoJCQl9IGVsc2lmIChleGlzdHMgJG1haWxtYXB7JGF1dGhvcn0pIHsKCQkJCSRhdXRob3IgPSAkbWFpbG1hcHskYXV0aG9yfTsKCQkJfSBlbHNpZiAoKCEkYXV0aG9yKSB8fCAoJGF1dGhvciBlcSAiIikpIHsKCQkJCSRhdXRob3IgPSAkZW1haWw7CgkJCX0KCQoJCQkkcHN0YXRlKys7CgkJfQoJCgkJIyBza2lwIHRvIGJsYW5rIGxpbmUKCQllbHNpZiAoJHBzdGF0ZSA9PSAyKSB7CgkJCW5leHQgdW5sZXNzIC9eXHMqJC87CgkJCSRwc3RhdGUrKzsKCQl9CgkKCQkjIHNraXAgdG8gbm9uLWJsYW5rIGxpbmUKCQllbHNpZiAoJHBzdGF0ZSA9PSAzKSB7CgkJCW5leHQgdW5sZXNzIC9eXHMqKFxTLiopJC87CgoJCQkjIHNraXAgbGluZXMgdGhhdCBhcmUgb2J2aW91c2x5IG5vdAoJCQkjIGEgMS1saW5lIGNzZXQgZGVzY3JpcHRpb24KCQkJbmV4dCBpZiAvXlxzKkZyb206IC87CgoJCQljaG9tcDsKCQkJJGRlc2MgPSAkMTsKCQoJCQkmc2hvcnRsb2dfZW50cnkoJGF1dGhvciwgJGRlc2MpOwoJCgkJCSRwc3RhdGUgPSAxOwoJCX0KCQoJCWVsc2UgewoJCQlkaWUgImludmFsaWQgcGFyc2Ugc3RhdGUgJHBzdGF0ZSI7CgkJfQoJfQp9CgpzdWIgZmluYWxpemUgewoJI3ByaW50ICJcbiRuX3JlY29yZHMgcmVjb3JkcyBwYXJzZWQuXG4iOwoKCWlmICgkbl9yZWNvcmRzICE9ICRuX291dHB1dCkgewoJCWRpZSAicGFyc2UgZXJyb3I6IGlucHV0IHJlY29yZHMgIT0gb3V0cHV0IHJlY29yZHNcbiI7Cgl9Cn0KCiZjaGFuZ2Vsb2dfaW5wdXQ7CiZzaG9ydGxvZ19vdXRwdXQ7CiZmaW5hbGl6ZTsKZXhpdCgwKTsKCg==