ZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL1JFQURNRSBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM0MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK3NpbXVsX2VmdW4gCistLS0tLS0tLS0tIAorRGFzIHNpbXVsX2VmdW4gT2JqZWt0IC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIGJlbnV0enQgZGllIERhdGVpZW4KK2luIC9zZWN1cmUvc2ltdWxfZWZ1bi4KK0ltIFZlcnplaWNobmlzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZSBpc3QgZWluZSBTaWNoZXJoZWl0c2tvcGllIHZvbiBhbGxlbiAKK0RhdGVpZW4gaW4gL3NlY3VyZS9zaW11bF9lZnVuLgorCitGYWxscyAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIG5pY2h0IGxhZGJhciBpc3QsIHdpcmQgCisvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGFscyBFcnNhdHogdmVyc3VjaHQuIFdlbm4gYXVjaCBkYXMKK25pY2h0IGxhZGJhciBpc3QsIGVyZm9sZ3QgZWluIFNodXRkb3duIGRlcyBNdWRzLgorCitCZWkgQWVuZGVydW5nZW4gc29sbHRlIF96dWVyc3RfIGRpZSBub3JtYWxlIHNpbXVsIGVmdW4gZWRpdGllcnQgdW5kCithbnNjaGxpZXNzZW5kIHplcnN0b2VydC9lbnRsYWRlbiB3ZXJkZW4sIHdvcmF1ZmhpbiBzaWUgaW1wbGl6aXQgZHVyY2ggZGVuCitEcml2ZXIgdW5kIE1hc3RlciBuZXVnZWxhZGVuIHdpcmQuIElzdCBkaWVzIGVyZm9sZ3JlaWNoIHVuZCBkaWUgbmV1ZQorc2ltdWxfZWZ1biBsYWV1ZnQgKGVyc3QgZGFubiEpIGtvcGllcnQgbWFuIGRpZSBEYXRlaWVuIGF1cyAKKy9zZWN1cmUvc2ltdWxfZWZ1biBuYWNoIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS4KKworRGllIERhdGVpZW4gaGllciBzaW5kIG1pdCBBdXNuYWhtZSBkZXIgc2ltdWxfZWZ1bi5jIHNlbGJzdCBfbmljaHRfIGRhenUgCitnZWRhY2h0LCBnZWxhZGVuIHp1IHdlcmRlbi4KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvY29tbS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWI4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9jb21tLmMKQEAgLTAsMCArMSwxMjQgQEAKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorCisvLyBTZW5kZXQgYW4gYWxsZSBPYmpla3RlIGluIHJvb20gdW5kIHJvb20gc2VsYmVyIGR1cmNoIEF1ZnJ1ZiB2b24KKy8vIFJlY2VpdmVNc2coKS4KK3ZhcmFyZ3Mgdm9pZCBzZW5kX3Jvb20ob2JqZWN0fHN0cmluZyByb29tLCBzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfYWN0aW9uLCBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0ICpleGNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgb3JpZ2luKQoreworICBpZiAoc3RyaW5ncChyb29tKSkKKyAgICByb29tPWxvYWRfb2JqZWN0KHJvb20pOworCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOworCisgIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKK30KKworc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQoreworICAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOworfQorCit2YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApeworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgKnBmYWRlOworCisgICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCisgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhd2hlcmUgKQorICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPQorICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKKyAgICBlbHNlCisgICAgICAgcGZhZGUgPSB3aGVyZTsKKworICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOworICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCisjZGVmaW5lIENBVF9NQVhfTElORVMgNTAKK3ZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaW50IG1vcmU7CisKKyAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICBzdGFydCA9IDE7CisKKyAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7CisgICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7CisgICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOworICAgIH0KKworICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7CisgICAgaWYgKCF0eHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIGlmIChtb3JlKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKKworICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Cit9CisjdW5kZWYgQ0FUX01BWF9MSU5FUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KKyNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAordmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOworICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5CisgICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgorICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQorICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOworICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgorICAgIGlmICghc3RyaW5ncCh0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCisgICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQorICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4dCA9ICIiOworICAgIH0KKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICByZXR1cm4gMTsKK30KKyN1bmRlZiBUQUlMX01BWF9CWVRFUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsNDM0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKK21peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCit7CisgICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisgICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7CisKKyAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIGlmKGd0aWNrcykKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIGlmIChuZXh0X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIGlmIChwcmV2X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOworICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgorICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdoaWNoOworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKKyAgICAgICAgICAgICAgICB3aGljaCA9ICIiOworICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2god2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RBVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICogcmVzdWx0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgorICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBlbmFibGVfY29tbWFuZHMoKQorICogYW5kIGRpc2FibGVfY29tbWFuZHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZW5hYmxlX2NvbW1hbmRzKQorCit2b2lkIGVuYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAxKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIob2IpOworfQorCisjZW5kaWYKKworI2lmICEgX19FRlVOX0RFRklORURfXyhkaXNhYmxlX2NvbW1hbmRzKQorCit2b2lkIGRpc2FibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2hhc2guYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvaGFzaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorCitkZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KKworZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2xpdmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvbGl2aW5ncy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKKworI2RlZmluZSBjbGVhbl9sb2cocykKKy8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7CisKK3ByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7CisgIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKKyAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKKyAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0CisgIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKKyAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZworICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCisgICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbworICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCisgICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCit7CisgICAgbWl4ZWQgKnJldDsKKworICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKKworICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKK30KKwordm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQoreworICBzdHJpbmcgb2xkOworICBtaXhlZCBhOworICBpbnQgaTsKKworICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAorICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQorICB7CisgICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOworICAgIH0KKyAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7CisgICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKKyAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7CisgICAgICB9CisgICAgfQorICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7CisgICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7CisgICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLworICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7CisgICAgICAgYVtpXSA9IG9iajsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7CisgIH0KK30KKwordm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCit7CisgIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3ZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKK3sKKyAgc3RyaW5nIGxpdm5hbWU7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQorICB7CisgICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7CisgICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIF9zZXRfbmV0ZGVhZCgpCit7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOworfQorCit2b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCit7CisgIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKK29iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCit7CisgIGludCBpOworICBzdHJpbmcgdWlkOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworIAorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXRkZWFkW3VpZF07Cit9CisKK3N0cmluZyAqZHVtcF9uZXRkZWFkKCkKK3sKKyAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKK30KKworb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7CisgIG1peGVkICphLCByOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7CisgICAgaWYgKG1lbWJlcihyLDApPj0wKQorICAgICAgci09KHswfSk7CisgICAgaWYgKCFzaXplb2YocikpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKKyAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgeworICAgICAgICAgciA9IGFbPGldOworICAgICAgICAgYVs8aV0gPSBhWzBdOworICAgICAgICAgcmV0dXJuIGFbMF0gPSByOworICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIGxpdmluZyhyKSAmJiByOworfQorCitvYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKK3sKKyAgbWl4ZWQgcjsKKworICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICByLT0oezB9KTsKKyAgZWxzZQorICAgIGlmIChvYmplY3RwKHIpKQorICAgICAgcj0oe3J9KTsKKyAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHI7Cit9CisKK29iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgeworICBvYmplY3QgKm9ianM7CisgIG1peGVkIHJlczsKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCFzdHJpbmdwKHV1aWQpKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworCisgIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7CisgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCisgICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKKyAgICAgIHJlcy09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7CisgICAgfQorICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KKyAgICBpZiAoIXNpemVvZihyZXMpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9ianMgPSByZXM7CisgICAgcmVzID0gb2Jqc1swXTsKKyAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCisgICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgeworICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgeworICAgICAgICAgcmVzID0gb2Jqc1s8aV07CisgICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07CisgICAgICAgICBvYmpzWzBdID0gcmVzOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKKyAgICB9CisgICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgorICB9CisgIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAorICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7CisKKyAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCisgIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCisgIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIC8vIGVuZGxpY2ggZ2VmdW5kZW4KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQoreworICAgIG1peGVkIG1hdGNoOworCisgICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQorICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7CisKKyAgICBtYXRjaCAtPSAoezB9KTsKKworICAgIGlmICggc2l6ZW9mKG1hdGNoKSApeworICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKKyAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQorICAgICAgICAgICAgICA+IDA7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7CisgICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKK3ZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKK3sKKyAgICBpbnQgaSwgczsKKyAgICBtaXhlZCBtYXRjaCwgKnVzZXI7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKKyAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKKworICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCisgICAgICAgcmV0dXJuIHN0cjsKKworICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7CisgICAgcyA9IHNpemVvZihzdHIpOworICAgIG1hdGNoID0gMDsKKworICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQorICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQorICAgICAgICAgICBpZiAoIG1hdGNoICkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCisgICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07CisKKyAgICBpZiAoICFtYXRjaCApCisgICAgICAgcmV0dXJuIC0yOworCisgICAgcmV0dXJuIG1hdGNoOworfQorCittaXhlZCAqZHVtcF9saXZpbmdzKCkKK3sKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Cit9CisKKy8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgorcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKK3sKKyAgaW50IGksIGo7CisgIG1peGVkIGE7CisKKyAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCisgIHsKKyAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQorICAgIHsKKyAgICAgIGEtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7CisgICAgfQorICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCisgICAgeworICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKKyAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7CisgIH0KKyAgaWYgKGxlZnQpCisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7CisgIGVsc2UKKyAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqczsKKyAgb2JqZWN0IG9iOworCisgIHM9bV9pbmRpY2VzKG5ldGRlYWQpOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCisgICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKKyAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Cit9CisKK3ByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7CisgICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCisgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICA4MAorICAgICAgICAgICAgICAgICApOworICB9CisgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKK30KKworI3VuZGVmIGNsZWFuX2xvZworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvb2JqZWN0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvb2JqZWN0X2luZm8uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIG9iamVjdF9pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgX19FRlVOX0RFRklORURfXyhkcml2ZXJfaW5mbykgLyogTmV3ZXIgdmVyc2lvbiBpcyB0aGVyZSAqLworCisjaW5jbHVkZSA8b2JqZWN0aW5mby5oPgorI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK21peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQsIHZhcmFyZ3MgaW50KiBpbmRleCkKK3sKKyAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgIGlmIChzaXplb2YoaW5kZXgpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBvYmplY3RfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBvYmplY3RfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgT0lORk9fQkFTSUM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JQl9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lCX0hFQVJUX0JFQVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSVNfV0laQVJEXSAgICAgICAgID0gMDsgICAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX0VOQUJMRV9DT01NQU5EU10gICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfQ0xPTkVdICAgICAgICAgICAgID0gZWZ1bjo6Y2xvbmVwKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfREVTVFJVQ1RFRF0gICAgICAgID0gMDsgICAvKiBOb3QgcG9zc2libGUgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUFBFRF0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9PTkNFX0lOVEVSQUNUSVZFXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFU0VUX1NUQVRFXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1dJTExfQ0xFQU5fVVBdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTEFNQkRBX1JFRkVSRU5DRURdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBTUJEQV9SRUZFUkVOQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU0hBRE9XXSAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKSAmJiAxOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVBMQUNFRF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX1JFU0VUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElNRV9PRl9SRUZdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRUZdICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JQl9HSUdBVElDS1NdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElDS1NdICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUF9OVU1dICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJPR19TV0FQUEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1ZBUl9TV0FQUEVEXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9WQVJfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05BTUVdICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTE9BRF9OQU1FXSAgICAgICAgID0gZWZ1bjo6bG9hZF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJFVl9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9DTEVBTlVQXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfQ0xFQU5VUF9USU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19QT1NJVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lQX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfTkVYVF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QUkVWXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BPU10gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QT1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lNX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUkVGXSAgICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OQU1FXSAgICAgICAgICAgICAgID0gZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUFJPR19TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fRlVOQ1RJT05TXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0ZVTkNUSU9OU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1ZBUklBQkxFU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9WQVJJQUJMRVNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9TVFJJTkdTXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19EQVRBXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfVE9UQUxdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOSEVSSVRFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9JTkhFUklURURdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX1NJWkVdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fREFUQV9TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9EQVRBX1NJWkVdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0lOSEVSSVRdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fSU5IRVJJVCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0NMT05FXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fQ0xPTkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19TSEFET1ddICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX1NIQURPVyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkNMVURFU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOQ0xVREVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0hBUkVfVkFSSUFCTEVTXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFSRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpbmRleFswXTsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3Igb2JqZWN0X2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfZWRpdGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTMyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pZGxlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaW5wdXRfcGVuZGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pbnB1dF9wZW5kaW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitvYmplY3QgcXVlcnlfaW5wdXRfcGVuZGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSU5QVVRfUEVORElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaXBfbmFtZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaXBfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTZlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCisgKiBxdWVyeV9pcF9udW1iZXIoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Cit9CisKKy8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKK3N0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQoreworICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKKyAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKKyAgeworICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKKyAgfQorICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Cit9CisKK3N0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQoreworICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCisgICAgICBvYj1xdWVyeV9pcF9udW1iZXIob2IpOworICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9saW1pdHMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbGltaXRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xpbWl0cykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3ZhcmFyZ3MgaW50KiBxdWVyeV9saW1pdHMoaW50IGRlZikKK3sKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oZGVmID8gRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyA6IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisgICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitpbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKK3sKKyAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQorICAgIHsKKyAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7CisgICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCisgICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOworICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOworICAgIH0KKworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitpbnQgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9zbm9vcC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfc25vb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2OWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfc25vb3AuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7CisjZWxzZQorICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7CisjZW5kaWYKK30KKworbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7CisgIG9iamVjdCBzbm9vcGVyOworCisgIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7CisgIGlmICghc25vb3BlcikgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOworICByZXR1cm4gc25vb3BlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKworICAgIGlmICghZmxhZyA9PSAhaGIpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2lzX3dpemFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIgdGhhdCBhcmUgYWN0aXZhdGVkIHdpdGgKKyAqIHNldF9pc193aXphcmQoKS4gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBsYXllciBvYmplY3QuCisgKiBBbHNvIHNldF9pc193aXphcmQoKSBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXIgb2JqZWN0LAorICogbm90IGFzIGFuIChzaW11bC0pZWZ1bi4KKyAqLworCisjaW5jbHVkZSA8Y29tbWFuZHMuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisvKiBpc193aXphcmQ6CisgKiAgMTogaGFzIGFjdGlvbnMsCisgKiAgMDogbmV2ZXIgaGFkIGFjdGlvbnMsCisgKiAtMTogaGFkIGFjdGlvbnMgb25jZS4KKyAqLworcHJpdmF0ZSBub3NhdmUgaW50IGlzX3dpemFyZDsKKworcHJpdmF0ZSBpbnQgZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX2R1bXBhbGxvYmooc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3cml0ZSgiRHVtcGluZyB0byAvT0JKX0RVTVAgLi4uICIpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFMpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgd3JpdGUoImRvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfb3BjZHVtcChzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09QQ09ERVMpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfc3RhdHVzKHN0cmluZyBzdHIpCit7CisgICAgaW50IG9wdDsKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKG9wdCkpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2V0X2lzX3dpemFyZCh2YXJhcmdzIDxvYmplY3R8aW50PiogYXJncykKK3sKKyAgICBpbnQgb2xkdmFsID0gaXNfd2l6YXJkOworCisgICAgaWYoIXNpemVvZihhcmdzKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDEgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihhcmdzWzBdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJPbmx5IHNldF9pc193aXphcmQgZm9yIHRoZSBjdXJyZW50IG9iamVjdCBzdXBwb3J0ZWRcbiIpOworICAgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRoZSBjdXJyZW50IG9iamVjdCBtdXN0IGJlIHRoaXNfcGxheWVyKCkgZm9yIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDIgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFhcmdzWzFdKQorICAgIHsKKyAgICAgICAgaWYoaXNfd2l6YXJkID4gMCkKKyAgICAgICAgICAgIGlzX3dpemFyZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmKHNpemVvZihhcmdzKSA9PSAyICYmIGFyZ3NbMV08MCkKKyAgICB7CisgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZighaXNfd2l6YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX21hbGxvYywgIm1hbGxvYyIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9kdW1wYWxsb2JqLCAiZHVtcGFsbG9iaiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9vcGNkdW1wLCAib3BjZHVtcCIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9zdGF0dXMsICJzdGF0dXMiLCBBQV9OT1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpc193aXphcmQgPSAxOworICAgIH0KKworICAgIHJldHVybiBvbGR2YWwgPiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X3Byb21wdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfcHJvbXB0LmMKQEAgLTAsMCArMSwyMSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKwordmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKK3sKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7CisKKyAgICBpZighaW50cChwcm9tcHQpKQorICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKKworICAgIHJldHVybiBvbGRwcm9tcHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2hhZG93LmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCisgKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOworfQorCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgICAgaWYoZmxhZykKKyAgICB7CisgICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKKyAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKKworICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKK30KKyNlbHNlCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKK30KKyNlbmRpZgorCisKK3B1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7CisgIGlmIChmbGFnKQorICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIGVmdW46OnVuc2hhZG93KCk7Cit9CisKK3B1YmxpYyB2b2lkIHVuc2hhZG93KCkgeworICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKKyAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMGI3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYwpAQCAtMCwwICsxLDIwMTYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCisvLworLy8gJElkOiBzaW11bF9lZnVuLmMgNzQwOCAyMDEwLTAyLTA2IDAwOjI3OjI1WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEFic29sdXRlIFBmYWRlIGVyZm9yZGVybGljaCAtIHp1bSBaZWl0cHVua3QsIHdvIGRlciBNYXN0ZXIgZ2VsYWRlbgorLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCisKKyNkZWZpbmUgU05PT1BMT0dGSUxFICJTTk9PUCIKKyNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc3lzL3Nub29waW5nLmgiCisjaW5jbHVkZSAiL3N5cy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZXJxLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICIvc3lzL2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RpbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgorI2luY2x1ZGUgIi9zeXMvdGltZS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKyNpbmNsdWRlICIvc3lzL2lucHV0X3RvLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0cmluZyBkdGltZShpbnQgd2Fubik7Cit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspOworaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSk7Cit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKTsKK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYik7Citub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpOworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCk7Citub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKTsKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOworCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK3ZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK3ZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQoraW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZyk7CisjZW5kaWYKKworLy8gSW5jbHVkZSB0aGUgZGlmZmVyZW50IHN1YiAnbW9kdWxlcycgb2YgdGhlIHNpbXVsX2VmdW4KKyNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJlbmFibGVfY29tbWFuZHMuYyIKKyNpbmNsdWRlIF9fRElSX18iaGFzaC5jIgorI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9lZGl0aW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lkbGUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pcF9uYW1lLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xpbWl0cy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbXVkX3BvcnQuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgorI2luY2x1ZGUgX19ESVJfXyJzZXRfaGVhcnRfYmVhdC5jIgorI2lmIF9fQk9PVF9USU1FX18gPCAxNDU2MjYxODU5CisjaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKKyNlbmRpZgorI2luY2x1ZGUgX19ESVJfXyJzaGFkb3cuYyIKKyNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgorI2luY2x1ZGUgX19ESVJfXyJjb21tLmMiCisKKyNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCisjZGVmaW5lIExFVkVMKHgpIHF1ZXJ5X3dpel9sZXZlbCh4KQorI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK21peGVkIGR0aW1lX2NhY2hlID0gKHstMSwiIn0pOworCisjaWZkZWYgSU9TVEFUUworc3RydWN0IGlvc3RhdF9zIHsKKyAgc3RyaW5nIG9uYW1lOworICBpbnQgdGltZTsKKyAgaW50IHNpemU7Cit9OworbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKK21peGVkIHJlc3RvcmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwwKSB9KTsKKy8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgbG9nX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworCittaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CisgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7CisvKiAgICBjYXNlIDM6CisgICAgICByZXR1cm4gd3JpdGVmaWxlX3N0YXQ7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGxvZ19zdGF0OworICAgICAgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXZpb3VzX29iamVjdCgpCisgICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCisgICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKKyAgICAgICAgICAgICAmJiAob2IgIT0gdGhpc19wbGF5ZXIoKSB8fCBvYiAhPSB0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCisgICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCisgICAgICAgICAgICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBvYikpICkgKQorCisgICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGF1c2dlbG9nZ3Qgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKK30KKworCit2b2lkIF9fX3VwZG1hc3RlcigpCit7CisgICAgb2JqZWN0IG9iOworCisgICAgLy9zb2xsdGUgbmljaHQgamVkZXIgZHVlcmZlbi4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CisKKyAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CisgICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCisgICAgICAgIGdldF9kaXIoIi9zZWN1cmUvbWFzdGVyLyouYyIsR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRHxHRVRESVJfUEFUSCkpIHsKKyAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQorICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKKyAgICB9CisgICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOworICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CisgICAgbG9hZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIik7CisKKyAgICB3cml0ZSgiZG9uZS5cbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CisgIG1peGVkIHJldDsKKworICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuICI/Pz8iOworfQorCisKKy8vICogU25vb3BlbiB1bmQgd2FzIGRhenVnZWhvZXJ0CitzdGF0aWMgb2JqZWN0IGZpbmRfc25vb3BlZChvYmplY3Qgd2hvKQoreworICBvYmplY3QgKnU7CisgIGludCBpOworCisgIGZvciAoaT1zaXplb2YodT11c2VycygpKS0xO2k+PTA7aS0tKQorICAgIGlmICh3aG89PWVmdW46OmludGVyYWN0aXZlX2luZm8odVtpXSwgSUlfU05PT1BfTkVYVCkpCisgICAgICByZXR1cm4gdVtpXTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RyaW5nIExjdXQoc3RyaW5nIHN0cikgeworICByZXR1cm4gc3RyWzUuLjExXStzdHJbMTguLl07Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcCggb2JqZWN0IG1lLCBvYmplY3QgeW91ICkKK3sKKyAgICBpbnQgcmV0OworICAgIG9iamVjdCBzbm9vcGVyMCwgc25vb3Blciwgc25vb3BlcjIsIHNub29wZXIzOworCisgICAgaWYoICFvYmplY3RwKG1lKSB8fCBtZSA9PSB5b3UgfHwgIVBPICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHNub29wZXIwID0gZmluZF9zbm9vcGVkKG1lKTsKKworICAgICBpZih5b3UpeworICAgICAgICBpZiAoIFBPICE9IG1lICYmIHF1ZXJ5X3dpel9ncnAobWUpID49IHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgISh5b3UtPlF1ZXJ5QWxsb3dTbm9vcChtZSkpICkKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgfHwgSVNfQVJDSCh5b3UpICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggKHNub29wZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkpICYmCisgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChzbm9vcGVyKSA+PSBxdWVyeV93aXpfZ3JwKG1lKSApeworICAgICAgICAgICAgaWYgKCAoaW50KXNub29wZXItPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIiVzIHNub29wZWQgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUtPm5hbWUoV0VSKSwgeW91LT5uYW1lKFdFUikgKSApOworCisgICAgICAgICAgICBzbm9vcGVyMiA9IG1lOworCisgICAgICAgICAgICB3aGlsZSAoIHNub29wZXIzID0gaW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgKXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzIHdpcmQgc2VpbmVyc2VpdHMgdm9uICVzIGdlc25vb3BlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNub29wZXIyLT5uYW1lKFdFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIzLT5uYW1lKFdFTSkgKSApOworICAgICAgICAgICAgICAgc25vb3BlcjIgPSBzbm9vcGVyMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWZ1bjo6c25vb3AoIHNub29wZXIsIHNub29wZXIyICk7CisKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgIT0gc25vb3BlciApCisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IGthbm5zdCAlcyBuaWNodCBzbm9vcGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUgc25vb3BzdCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShzbm9vcGVyKSApeworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAtPiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwMDAwMCApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChzbm9vcGVyKQorICAgICAgICAgICAgICAgaWYgKCAhbWUtPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICl7CisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJXMgd2lyZCBiZXJlaXRzIHZvbiAlcyBnZXNub29wZWQuIEJlbnV0emUgZGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZlwiLUZsYWcsIHdlbm4gZHUgZGVubm9jaCBzbm9vcGVuIHdpbGxzdC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdS0+bmFtZShXRVIpLCBzbm9vcGVyLT5uYW1lKFdFTSkgKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICByZXQgPSBlZnVuOjpzbm9vcCggbWUsIHlvdSApOworCisgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lKXsKKyAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwgc3ByaW50ZiggIiVzIC0+ICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh5b3UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHlvdSkgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJldCAmJiBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhSVNfREVQVVRZKG1lKSApCisgICAgICAgICAgICB0ZWxsX29iamVjdCggeW91LCAiKioqICIgKyBOQU1FKG1lKSArICIgc25vb3B0IERpY2ghXG4iICk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCAobWUgPT0gUE8gfHwKKyAgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPiBxdWVyeV93aXpfZ3JwKG1lKSB8fAorICAgICAgICAgICAgICAocXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPT0gcXVlcnlfd2l6X2dycChtZSkgJiYKKyAgICAgICAgICAgICAgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhQTywgSUlfU05PT1BfTkVYVCkgPT0gbWUpKSAmJiBzbm9vcGVyMCApeworICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6c25vb3AobWUpOworICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIDA7Cit9CisKKworCisvLyAqIEVtdWxhdGlvbiBkZXMgJ2FsdGVuJyBleHBsb2RlIGR1cmNoIGRhcyBuZXVlCitzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpIHsKKyAgaW50IHMsIHQ7CisgIHN0cmluZyAqc3RyczsKKworICBpZiAoIXN0cmluZ3Aoc3RyKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAxIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixzdHIpKTsKKyAgfQorICBpZiAoIXN0cmluZ3AoZGVsKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAyIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixkZWwpKTsKKyAgfQorICBpZihkZWwgPT0gIiIpCisgICAgcmV0dXJuICh7c3RyfSk7CisgIHN0cnM9ZWZ1bjo6ZXhwbG9kZShzdHIsIGRlbCk7CisgIHQ9c2l6ZW9mKHN0cnMpLTE7CisgIHdoaWxlKHM8PXQgJiYgc3Ryc1tzKytdID09ICIiKTtzLS07CisgIHdoaWxlKHQ+PTAgJiYgc3Ryc1t0LS1dID09ICIiKTt0Kys7CisgIGlmKHM8PXQpCisgICAgcmV0dXJuIHN0cnNbcy4udF07CisgIHJldHVybiAoe30pOworfQorCitpbnQgZmlsZV90aW1lKHN0cmluZyBwYXRoKSB7CisgIG1peGVkICp2OworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmIChzaXplb2Yodj1nZXRfZGlyKHBhdGgsR0VURElSX0RBVEVTKSkpIHJldHVybiB2WzBdOworICByZXR1cm4oMCk7IC8vc29uc3QKK30KKworLy8gKiBCZWkgNTBrIEdyb2Vzc2UgTG9nLUZpbGUgcm90aWVyZW4KK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhaykgeworICBtaXhlZCAqc3Q7CisKKyAgZmlsZT0iL2xvZy8iK2ZpbGU7CisgIGZpbGU9aW1wbG9kZSgoZWZ1bjo6ZXhwbG9kZShmaWxlLCIvIiktKHsiLi4ifSkpLCIvIik7CisvLyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLHNwcmludGYoIkxPRyBGSUxFOiAlTyAtPiAlT1xuIixwcmV2aW91c19vYmplY3QoKSxmaWxlKSk7CisgIGlmICghZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNhbGxfb3RoZXIsUE8pLCJzZWN1cmUvbWFzdGVyIiwvLycpCisgICAgICAgICAgICAgICJ2YWxpZF93cml0ZSIsZmlsZSxnZXRldWlkKFBPKSwibG9nX2ZpbGUiLFBPKSkKKyAgICAgIHJldHVybiAwOworICBpZiAoIHNpemVfdG9fYnJlYWsgPj0gMCAmICgKKyAgICAgIHNpemVvZihzdCA9IGdldF9kaXIoZmlsZSwyKSApICYmIHN0WzBdID49IChzaXplX3RvX2JyZWFrfE1BWF9MT0dfU0laRSkpKQorICAgICAgY2F0Y2gocmVuYW1lKGZpbGUsIGZpbGUgKyAiLm9sZCIpO3B1Ymxpc2gpOyAvKiBObyBwYW5pYyBpZiBmYWlsdXJlICovCisgIHJldHVybih3cml0ZV9maWxlKGZpbGUsdHh0KSk7Cit9CisKKy8vICogTWFnaWVyLUxldmVsIGFiZnJhZ2VuCitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcikgeworICByZXR1cm4gKGludCkiL3NlY3VyZS9tYXN0ZXIiLT5xdWVyeV93aXpfbGV2ZWwocGxheWVyKTsKK30KKworI2lmZGVmIF9fQUxJU1RTX18KKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IGtleSkKK21peGVkICpyZW1vdmVfYWxpc3QobWl4ZWQga2V5LG1peGVkICphbGlzdCkKK3sKKyAgaW50IGksajsKKworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICB7CisgICAgaWYgKChpPWFzc29jKGtleSxhbGlzdCkpPDApCisgICAgICByZXR1cm4gYWxpc3Q7CisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICB9CisgIGkgPSBhc3NvYyhrZXksYWxpc3RbMF0pOworICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0WzBdKSk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGFsaXN0PWFsaXN0WzAuLl07CisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsKK30KKworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkgcG9zKQorbWl4ZWQgKmV4Y2x1ZGVfYWxpc3QoaW50IGksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgajsKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkgfHwgaTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICBhbGlzdD1hbGlzdFswLi5dOyAvKiBDcmVhdGUgUEhZU0lDQUwgY29weSBvZiBhbGlzdCAqLworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7IC8qIG9yZGVyX2FsaXN0IGlzIE5PVCBuZWNlc3NhcnkgLSBzZWUgL2RvYy9MUEMvYWxpc3QgKi8KK30KKyNlbmRpZiAvLyBfX0FMSVNUU19fCisKKy8vICogR2VybWFuIHZlcnNpb24gb2YgY3RpbWUoKQorI2RlZmluZSBUQUdFICh7IlNvbiIsIk1vbiIsIkRpZSIsIk1pdCIsIkRvbiIsIkZyZSIsIlNhbSJ9KQorI2RlZmluZSBNT05BVEUgKHsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFpIiwiSnVuIiwiSnVsIiwiQXVnIixcCisgICAgICAgICAgICAgICAgICJTZXAiLCJPa3QiLCJOb3YiLCJEZXoifSkKK3N0cmluZyBkdGltZShpbnQgd2FubikgeworICAKKyAgaWYgKHdhbm4gPT0gZHRpbWVfY2FjaGVbMF0pCisgICAgcmV0dXJuKGR0aW1lX2NhY2hlWzFdKTsKKworICBpbnQgKmx0ID0gbG9jYWx0aW1lKHdhbm4pOworICByZXR1cm4gc3ByaW50ZigiJXMsICUyZC4gJXMgJWQsICUwMmQ6JTAyZDolMDJkIiwKKyAgICAgIFRBR0VbbHRbVE1fV0RBWV1dLCBsdFtUTV9NREFZXSwgTU9OQVRFW2x0W1RNX01PTl1dLCAKKyAgICAgIGx0W1RNX1lFQVJdLGx0W1RNX0hPVVJdLCBsdFtUTV9NSU5dLCBsdFtUTV9TRUNdKTsKK30KKworLy8gd2VubiBzdHJmdGltZSBpbSBEcml2ZXIgbmljaHQgZXhpc3RpZXJ0LCBpc3QgZGllcyBoaWVyIGVpbiBBbGlhcyBhdWYgZHRpbWUoKSwKKy8vIHp3YXIgc3RpbW10IGRhcyBGb3JtYXQgZGFubiBuaWNodCwgYWJlciBkaWUgTXVkbGliIGJ1Z2d0IG5pY2h0IHVuZCBzY2hyZWlidAorLy8gZWluIG9yZGVudGxpY2hlcyBEYXR1bS9VaHJ6ZWl0LgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQordmFyYXJncyBzdHJpbmcgc3RyZnRpbWUobWl4ZWQgZm10LCBpbnQgY2xvY2ssIGludCBsb2NhbGl6ZWQpIHsKKyAgaWYgKGludHAoY2xvY2spICYmIGNsb2NrID49IDApCisgICAgcmV0dXJuIGR0aW1lKGNsb2NrKTsKKyAgZWxzZSBpZiAoaW50cChmbXQpICYmIGZtdCA+PSAwKQorICAgIHJldHVybiBkdGltZShmbXQpOworICAKKyAgcmV0dXJuIGR0aW1lKHRpbWUoKSk7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKKworLy8gKiBTaHV0ZG93biBtaXQgenVzYWV0emxpY2hlbSBsb2dnaW5nCitub21hc2sgaW50IHNodXRkb3duKHN0cmluZyByZWFzb24pCit7CisgIHN0cmluZyBuYW1lOworICBzdHJpbmcgb2JuYW1lOworICBzdHJpbmcgb3V0cHV0OworCisgIGlmICghcmVhc29uKQorICAgIHJldHVybiAwOworICBpZiAoICFBUkNIX1NFQ1VSSVRZICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkhPVJPT1RJRCAmJgorICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSE9Ii9vYmovc2h1dCIgKQorICB7CisgICAgd3JpdGUoIllvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gc2h1dCBkb3duIHRoZSBnYW1lZHJpdmVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCh0aGlzX2ludGVyYWN0aXZlKCkpJiYobmFtZT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpCisgIHsKKyAgICBuYW1lPWNhcGl0YWxpemUobmFtZSk7CisgICAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwvLycKKyAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSkrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyIVxuIik7CisgIH0KKyAgZWxzZQorICAgIG5hbWU9IkFOT05ZTU9VUyI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSkgb2JuYW1lPWNhcGl0YWxpemUoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7CisgIG91dHB1dD1uYW1lOworICBpZiAob2JuYW1lICYmIG5hbWUhPW9ibmFtZSkgb3V0cHV0PW91dHB1dCsiICgiK29ibmFtZSsiKSI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSYmb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpPT0iL29iai9zaHV0Iil7CisgICAgb3V0cHV0Kz0iIGZhZWhydCBkYXMgU3BpZWwgdmlhIEFybWFnZWRkb24gaGVydW50ZXIuXG4iOworICAgIG91dHB1dD1kdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0OworICAgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICAgIGVmdW46OnNodXRkb3duKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb3V0cHV0PWN0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyLlxuIjsKKyAgb3V0cHV0Kz0iICAgIEdydW5kOiAiK3JlYXNvbjsKKyAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgIGVmdW46OnNodXRkb3duKCk7CisgIHJldHVybiAxOworfQorCisvLyAqIGxvd2VyY2hhcgorCitpbnQgbG93ZXJjaGFyKGludCBjaGFyKSB7CisgIGlmIChjaGFyPCdBJyB8fCBjaGFyPidaJykgcmV0dXJuIGNoYXI7CisgIHJldHVybiBjaGFyKzMyOworfQorCisvLyAqIHVwcGVyc3RyaW5nCisKK3N0cmluZyB1cHBlcnN0cmluZyhzdHJpbmcgcykKK3sKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHVwcGVyX2Nhc2UpCisgIHJldHVybih1cHBlcl9jYXNlKHMpKTsKKyNlbHNlCisgIGludCBpOworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pIHNbaV09KChzW2ldPCdhJ3x8c1tpXT4neicpP3NbaV06c1tpXS0zMik7CisgIHJldHVybiBzOworI2VuZGlmCit9CisKKy8vICogbG93ZXJzdHJpbmcKKworc3RyaW5nIGxvd2Vyc3RyaW5nKHN0cmluZyBzKQoreworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICByZXR1cm4gbG93ZXJfY2FzZShzKTsKK30KKworCisvLyAqIEdEIHZlcnNpb24KK3N0cmluZyB2ZXJzaW9uKCkKK3sKKyAgcmV0dXJuIF9fVkVSU0lPTl9fOworfQorCisvLyAqIGJyZWFrX3N0cmluZworLy8gc3RyZXRjaCgpIC0tIHN0cmV0Y2ggYSBsaW5lIHRvIGZpbGwgYSBnaXZlbiB3aWR0aCAKK3ByaXZhdGUgc3RyaW5nIHN0cmV0Y2goc3RyaW5nIHMsIGludCB3aWR0aCkgeworICBpbnQgbGVuPXNpemVvZihzKTsKKyAgaWYgKGxlbj09d2lkdGgpIHJldHVybiBzOworCisgIC8vIHJlaW5lIExlZXJ6ZWlsZW4sIGRpcmVrdCB6dXJ1ZWNrZ2ViZW4KKyAgc3RyaW5nIHRyaW1tZWQ9dHJpbShzLFRSSU1fTEVGVCwiICIpOworICBpZiAodHJpbW1lZD09IiIpIHJldHVybiBzOyAKKyAgaW50IHN0YXJ0X3NwYWNlcyA9IGxlbiAtIHNpemVvZih0cmltbWVkKTsKKworICBzdHJpbmcqIHdvcmRzID0gZXhwbG9kZSh0cmltbWVkLCAiICIpOworICAvLyBkZXIgbGV0enRlIGtyaWVndCBrZWluZSBTcGFjZXMKKyAgaW50IHdvcmRfY291bnQ9c2l6ZW9mKHdvcmRzKSAtIDE7CisgIC8vIHdlbm4gWmVpbGUgbnVyIGF1cyBlaW5lbSBXb3J0LCB3aXJkIGRhcyBXb3J0IHp1cnVlY2tnZWdlYmVuCisgIGlmICghd29yZF9jb3VudCkKKyAgICByZXR1cm4gIiAiKnN0YXJ0X3NwYWNlcyArIHdvcmRzWzBdOworCisgIGludCBzcGFjZV9jb3VudCA9IHdpZHRoIC0gbGVuOworCisgIGludCBzcGFjZV9wZXJfd29yZD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgLyB3b3JkX2NvdW50OworICAvLyBBbnouV29lcnRlciBtaXQgWnVzYXR6LVNwYWNlCisgIGludCByZXN0PSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAlIHdvcmRfY291bnQ7IAorICAvLyBSZXN0LVNwYWNlcyBWZXJ0ZWlsZW4KKyAgZm9yZWFjaCAoaW50IHBvcyA6IHJlc3QpIHdvcmRzW3Bvc10rPSIgIjsKKyAgcmV0dXJuICgiICIqc3RhcnRfc3BhY2VzKSArIGltcGxvZGUoIHdvcmRzLCAiICIqc3BhY2VfcGVyX3dvcmQgKTsKK30KKworLy8gYXVzIEdlc2Nod2luZGlna2VpdHNncnVlbmRlbiBoYXQgZGVyIEJsb2Nrc2F0eiBmdWVyIGJyZWFrX3N0cmluZyBlaW5lCisvLyBlaWdlbmUgRnVua3Rpb24gYmVrb21tZW46Citwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIGJsb2NrX3N0cmluZyhzdHJpbmcgcywgaW50IHdpZHRoLCBpbnQgZmxhZ3MpIHsKKyAgLy8gd2VubiBCU19MRUFWRV9NWV9MRlMsIGFiZXIga2VpbiBCU19OT19QQVJJTkRFTlQsIGRhbm4gd2VyZGVuIFplaWxlbiBtaXQKKyAgLy8gZWluZW0gTGVlcnplaWNoZW4gYmVnb25uZW4uCisgIC8vIEJUVzogV2VubiAhQlNfTEVBVkVfTVlfTEZTLCBoYXQgZGVyIEF1ZnJ1ZmVyIGJlcmVpdHMgYWxsZSBcbiBkdXJjaCAiICIKKyAgLy8gZXJzZXR6dC4KKyAgaWYgKCAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpCisgICAgICAmJiAhKGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSkKKyAgeworICAgICAgcyA9ICIgIityZWdyZXBsYWNlKHMsIlxuIiwiXG4gIiwxKTsKKyAgfQorCisgIC8vIHNwcmludGYgZnVlbGx0IGRpZSBsZXR6dGUgWmVpbGUgYXVmIGRpZSBGZWxkYnJlaXRlIChoaWVyIGFsc28KKyAgLy8gWmVpbGVuYnJlaXRlKSBtaXQgRnVlbGx6ZWljaGVuIGF1Ziwgd2VubiBzaWUgTklDSFQgbWl0IFxuIHVtZ2Vicm9jaGVuCisgIC8vIGlzdC4gRXMgd2lyZCBhbiBkaWUgbGV0enRlIFplaWxlIGFiZXIga2VpbiBaZWlsZW51bWJydWNoIGFuZ2VoYWVuZ3QuCisgIC8vIEVpZ2VudGxpY2ggaXN0IGRhcyBBdWZmdWVsbGVuIGRvb2YsIGFiZXIgdmVybXV0bGljaCBpc3QgZXMgdW5ub2V0aWcsIGVzCisgIC8vIHdpZWRlciBydWVja2dhZW5naWcgenUgbWFjaGVuLgorICBzID0gc3ByaW50ZiggIiUtKj1zIiwgd2lkdGgsIHMpOworCisgIHN0cmluZyAqdG1wPWV4cGxvZGUocywgIlxuIik7CisgIC8vIE51ciB3ZW5uIHMgbWVocnplaWxpZyBpc3QsIEJsb2Nrc2F0eiBkcmF1cyBtYWNoZW4uIERpZSBsZXR6dGUgWmVpbGUgd2lyZAorICAvLyBuYXR1ZXJsaWNoIG5pY2h0IGdlZGVobnQuIFNpZSBpc3QgZGFmdWVyIHNjaG9uIHZvbiBzcHJpbnRmKCkgYXVmZ2VmdWVsbHQKKyAgLy8gd29yZGVuLiBCVFc6IERpZSBsZXR6dGUgWmVpbGUgZW5kZXQgdS5VLiBub2NoIG5pY2h0IG1pdCBlaW5lbSBcbiAoYnp3LgorICAvLyBudXIgZGFubiwgd2VubiBCU19MRUFWRV9NWV9MRlMgdW5kIGRlciB1ZWJlcmdlYmVuZSBUZXh0IHNjaG9uIG5lbiBcbiBhbQorICAvLyBFbmRlIGRlciBsZXR6dGVuIFplaWxlIGhhdCksIGRhcyBtYWNodCBkZXIgQXVmcnVmZXIuLi4KKyAgaWYgKHNpemVvZih0bXApID4gMSkKKyAgICByZXR1cm4gaW1wbG9kZSggbWFwKCB0bXBbMC4uPDJdLCAjJ3N0cmV0Y2gvKicqLywgd2lkdGggKSwgIlxuIiApIAorICAgICAgKyAiXG4iICsgdG1wWzwxXTsKKworICByZXR1cm4gczsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgcywgaW50IHcsIG1peGVkIGluZGVudCwgaW50IGZsYWdzKQoreworICAgIGlmICggIXMgfHwgcyA9PSAiIiApIHJldHVybiAiIjsKKworICAgIGlmICggIXcgKSB3PTc4OworCisgICAgaWYoIGludHAoaW5kZW50KSApCisgICAgICAgaW5kZW50ID0gaW5kZW50ID8gIiAiKmluZGVudCA6ICIiOworCisgICAgaW50IGluZGVudGxlbj1zdHJpbmdwKGluZGVudCkgPyBzaXplb2YoaW5kZW50KSA6IDA7CisKKyAgICBpZiAoaW5kZW50bGVuPncpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJicmVha19zdHJpbmc6IGluZGVudCBsb25nZXIgJWQgdGhhbiB3aWR0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGluZGVudGxlbix3KSk7CisgICAgICAvLyB3PSgoaW5kZW50bGVuL3cpKzEpKnc7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpKSAKKyAgICAgIHM9cmVncmVwbGFjZSggcywgIlxuIiwgIiAiLCAxICk7CisKKyAgICBpZiAoIGZsYWdzICYgQlNfU0lOR0xFX1NQQUNFICkKKyAgICAgICBzID0gcmVncmVwbGFjZSggcywgIihefFxufCApICAqIiwgIlxcMSIsIDEgKTsKKyAKKyAgICBzdHJpbmcgcHJlZml4PSIiOworICAgIGlmIChpbmRlbnRsZW4gJiYgZmxhZ3MgJiBCU19QUkVQRU5EX0lOREVOVCkgeworICAgICAgaWYgKGluZGVudGxlbitzaXplb2YocykgPiB3IHx8IAorICAgICAgICAgKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSAmJiBzdHJzdHIocywiXG4iKT4tMSkgeworICAgICAgIHByZWZpeD1pbmRlbnQrIlxuIjsKKyAgICAgICBpbmRlbnQ9KGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSA/ICIiIDogIiAiOworICAgICAgIGluZGVudGxlbj1zaXplb2YoaW5kZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZsYWdzICYgQlNfQkxPQ0sgKSB7CisgICAgICAvKgorICAgICAgICAgICBzID0gaW1wbG9kZSggbWFwKCBleHBsb2RlKCBzLCAiXG4iICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydibG9ja19zdHJpbmcsIHcsIGluZGVudGxlbiwgZmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICIiICk7CisgICAgICAqLworICAgICAgcyA9IGJsb2NrX3N0cmluZyggcyAsIHcgLSBpbmRlbnRsZW4sIGZsYWdzICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcyA9IHNwcmludGYoIiUtMS4qPXMiLHctaW5kZW50bGVuLHMpOworICAgIH0KKyAgICBpZiAoIHNbPDFdICE9ICdcbicgKSBzICs9ICJcbiI7CisKKyAgICBpZiAoICFpbmRlbnRsZW4gKSByZXR1cm4gcHJlZml4ICsgczsKKyAgICAKKyAgICBzdHJpbmcgaW5kZW50MiA9ICggZmxhZ3MgJiBCU19JTkRFTlRfT05DRSApID8gKCIgIippbmRlbnRsZW4pIDppbmRlbnQ7CisgICAgICAKKyAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgCisgICAgICByZWdyZXBsYWNlKCBzWzAuLjwyXSwgIlxuIiwgIlxuIitpbmRlbnQyLCAxICkgKyAiXG4iOworICAgICAgLyoKKyAgICAgICBzdHJpbmcgKmJ1ZjsKKworICAgICAgIGJ1ZiA9IGV4cGxvZGUoIHMsICJcbiIgKTsKKyAgICAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgaW1wbG9kZSggYnVmWzAuLjwyXSwgIlxuIitpbmRlbnQyICkgKyBidWZbPDFdICsgIlxuIjsKKyAgICAgICovCit9CisKKy8vICogRWxlbWVudGUgYXVzIG1hcHBpbmcgbG9lc2NoZW4gLSBtYXBwaW5nIHZvcmhlciBrb3BpZXJlbgorCittYXBwaW5nIG1fY29weV9kZWxldGUobWFwcGluZyBtLCBtaXhlZCBrZXkpIHsKKyAgcmV0dXJuIG1fZGVsZXRlKGNvcHkobSksIGtleSk7Cit9CisKKy8vICogdGltZXMKK2ludCBsYXN0X3JlYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIF9fQk9PVF9USU1FX187Cit9CisKK2ludCBmaXJzdF9ib290X3RpbWUoKQoreworICByZXR1cm4gNzAxNTE3NjAwOworfQorCitpbnQgZXhpc3RfZGF5cygpCit7CisgIHJldHVybiAoKCh0aW1lKCktZmlyc3RfYm9vdF90aW1lKCkpLzg2NDApKzUpLzEwOworfQorCisvLyAqIHVwdGltZSA6KQorc3RyaW5nIHVwdGltZSgpCit7CisgIGludCB0OworICBpbnQgdG1wOworICBzdHJpbmcgczsKKworICB0PXRpbWUoKS1fX0JPT1RfVElNRV9fOworICBzPSIiOworICBpZiAodD49ODY0MDApCisgICAgcys9c3ByaW50ZigiJWQgVGFnJXMsICIsdG1wPXQvODY0MDAsKHRtcD09MT8iIjoiZSIpKTsKKyAgaWYgKHQ+PTM2MDApCisgICAgcys9c3ByaW50ZigiJWQgU3R1bmRlJXMsICIsdG1wPSh0PXQlODY0MDApLzM2MDAsKHRtcD09MT8iIjoibiIpKTsKKyAgaWYgKHQ+NjApCisgICAgcys9c3ByaW50ZigiJWQgTWludXRlJXMgdW5kICIsdG1wPSh0PXQlMzYwMCkvNjAsKHRtcD09MT8iIjoibiIpKTsKKyAgcmV0dXJuIHMrc3ByaW50ZigiJWQgU2VrdW5kZSVzIix0PXQlNjAsKHQ9PTE/IiI6Im4iKSk7Cit9CisKKy8vICogV2FzIHR1biBiZWkgJ2RhbmdsaW5nJyBsZnVuLWNsb3N1cmVzID8KK3ZvaWQgZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlKCkgeworICByYWlzZV9lcnJvcigiZGFuZ2xpbmcgbGZ1biBjbG9zdXJlXG4iKTsKK30KKworLy8gKiBTcGVycmVuIGF1c3NlciBmdWVyIG1hc3Rlci9zaW11bF9lZnVuCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHNldF9lbnZpcm9ubWVudCkKK25vbWFzayB2b2lkIHNldF9lbnZpcm9ubWVudChvYmplY3QgbzEsIG9iamVjdCBvMikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKK25vbWFzayB2b2lkIHNldF90aGlzX3BsYXllcihvYmplY3QgcGwpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZXhwb3J0X3VpZCkKK25vbWFzayB2b2lkIGV4cG9ydF91aWQob2JqZWN0IG9iKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworLy8gKiBKZXR6dCBhdWNoIGNsb3N1cmVzCitpbnQgcHJvY2Vzc19mbGFnOworCitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKQoreworICBpZiAocHJvY2Vzc19mbGFnPjApCisgICAgcmV0dXJuIHByb2Nlc3NfZmxhZzsKKyAgZWxzZSByZXR1cm4oMCk7Cit9CisKK3ByaXZhdGUgbm9tYXNrIHN0cmluZyBfcHJvY2Vzc19zdHJpbmcoc3RyaW5nIHN0cixvYmplY3QgcG8pIHsKKyAgICAgICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgICAgICAgICAgcmV0dXJuKGVmdW46OnByb2Nlc3Nfc3RyaW5nKHN0cikpOworfQorCitub21hc2sgc3RyaW5nIHByb2Nlc3Nfc3RyaW5nKCBtaXhlZCBzdHIgKQoreworICBzdHJpbmcgdG1wLCBlcnI7CisgIGludCBmbGFnOyAKKworICBpZiAoIGNsb3N1cmVwKHN0cikgKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgICByZXR1cm4gZnVuY2FsbChzdHIpOworICB9CisgIGVsc2UgaWYgKHN0cj09MCkKKyAgICAgIHJldHVybigoc3RyaW5nKXN0cik7CisgIGVsc2UgaWYgKCAhc3RyaW5ncChzdHIpICkgeworICAgICAgcmV0dXJuIHRvX3N0cmluZyhzdHIpOworICB9CisKKyAgaWYgKCAhKGZsYWcgPSBwcm9jZXNzX2ZsYWcgPiB0aW1lKCkgLSA2MCkpICAgICAgICAgICAgICAgICAgICAgCisgICAgICBwcm9jZXNzX2ZsYWc9dGltZSgpOworCisgIGVyciA9IGNhdGNoKHRtcCA9IGZ1bmNhbGwoIydfcHJvY2Vzc19zdHJpbmcsc3RyLHByZXZpb3VzX29iamVjdCgpKTsgcHVibGlzaCk7CisKKyAgaWYgKCAhZmxhZyApCisgICAgcHJvY2Vzc19mbGFnPTA7CisKKyAgaWYgKGVycikgeworICAgIC8vIFZlcmFyYmVpdHVuZyBhYmJyZWNoZW4KKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKGVycik7CisgIH0KKyAgcmV0dXJuIHRtcDsKK30KKworLy8gJ21rZGlyIC1wJyAtIGVyemV1Z3QgZWluZSBrb21wbGV0dGUgSGllcmFyY2hpZSB2b24gVmVyemVpY2huaXNzZW4uCisvLyB3ZW5uIGRhcyBWZXJ6ZWljaG5pcyBhbmdlbGVndCB3dXJkZSBvZGVyIHNjaG9uIGV4aXN0aWVydCwgd2lyZCAxCisvLyB6dXJ1ZWNrZ2VsaWVmZXJ0LCBzb25zdCAwLgorLy8gV2lyZnQgZWluZW4gRmVobGVyLCB3ZW5uIGRhcyBhbmdlYmVuZSBWZXJ6ZWljaG5pcyBuaWNodCBhYnNvbHV0IGlzdCEKK3B1YmxpYyBpbnQgbWtkaXJwKHN0cmluZyBkaXIpIHsKKyAgLy8gd2VubiBlcyBudXIga2VpbmVuIGZ1ZWhyZW5kZW4gLyBnaWJ0LCBpc3QgZGFzIGVpbiBGZWhsZXIuCisgIGlmIChzdHJzdHIoZGlyLCAiLyIpICE9IDApCisgICAgcmFpc2VfZXJyb3IoIm1rZGlycCgpOiBQZmFkIGlzdCBuaWNodCBhYnNvbHV0ZS5cbiIpOworICAvLyBjdXQgb2ZmIHRyYWlsaW5nIC8uLi4KKyAgaWYgKGRpcls8MV09PScvJykKKyAgICAgIGRpciA9IGRpclswLi48Ml07CisKKyAgaW50IGZzdGF0ID0gZmlsZV9zaXplKGRpcik7CisgIC8vIHdlbm4gZXMgc2Nob24gZXhpc3RpZXJ0LCB0dW4gd2lyIGVpbmZhY2ggc28sIGFscyBoYWV0dGVuIHdpciBlcyBhbmdlbGVndC4KKyAgaWYgKGZzdGF0ID09IEZTSVpFX0RJUikKKyAgICByZXR1cm4gMTsKKyAgLy8gd2VubiBzY2hvbiBuZSBEYXRlaSBleGlzdGllcnQsIGdlaHQgZXMgbmljaHQuCisgIGlmIChmc3RhdCAhPSBGU0laRV9OT0ZJTEUpCisgICAgcmV0dXJuIDA7CisgIC8vIHdlbm4gZXMgbnVyIGVpbmVuIC8gZ2lidCAoZGVuIGZ1ZWhyZW5kZW4pLCBkYW5uIGlzdCBlcyBlaW4KKyAgLy8gdG9wbGV2ZWwtdmVyemVpY2huaXMsIHdhcyBkaXJla3QgYW5nZWxlZ3Qgd2lyZC4KKyAgaWYgKHN0cnJzdHIoZGlyLCIvIik9PTApIHsKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7CisgIH0KKworICAvLyBta2RpcigpIG5pY2h0IGRpcmVrdCBydWZlbiwgc29uZGVybiB2b3JoZXIgYWxzIGNsb3N1cmUgYW5zIGF1ZnJ1ZmVuZGUKKyAgLy8gT2JqZWt0IGJpbmRlbi4gU29uc3QgbGFldWZ0IGRpZSBSZWNodGVwcnVlZnVuZyBpbiB2YWxpZF93cml0ZSgpIGltIE1hc3RlcgorICAvLyB1bnRlciBkZXIgQW5uYWhtZSwgZGFzcyBkaWUgc2ltdWxfZWZ1bi5jIG1pdCBpaHJlciByb290IGlkIHdhcyB3aWxsLgorCisgIC8vIGpldHp0IHJla3Vyc2l2IGRpZSBWZXJ6ZWljaG5pc2hpZXJhcmNoaWUgYW5sZWdlbi4gV2VubiBkYXMgZXJmb2xncmVpY2gKKyAgLy8gaXN0LCBkYW5uIGtvZW5uZW4gd2lyIGpldHp0IG1pdCBta2RpciBkYXMgdGllZnN0ZSBWZXJ6ZWljaG5pcyBhbmxlZ2VuCisgIGlmIChta2RpcnAoZGlyWzAuLnN0cnJzdHIoZGlyLCIvIiktMV0pID09IDEpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworfQorCisKKy8vICogUHJvcGVydGllcyBnZ2ZzLiBtaXRzcGVpY2hlcm4KK21peGVkIHNhdmVfb2JqZWN0KG1peGVkIG5hbWUpCit7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgbWFwcGluZyBzYXZlOworICBtaXhlZCBpbmRleCwgcmVzOworICBpbnQgaTsKKworICAvLyBudXIgU3RyaW5ncyB1bmQgMCB6dWxhc3NlbgorICBpZiAoKCFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpICYmIAorICAgICAgKCFpbnRwKG5hbWUpIHx8IG5hbWUhPTApKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IG5vbi1lbXB0eSBzdHJpbmdzIGFuZCAwIG1heSBiZSB1c2VkIGFzIGZpbGVuYW1lIGluICIKKyAgICAgICAgICJzZWZ1bjo6c2F2ZV9vYmplY3QoKSEgQXJndW1lbnQgd2FzICVPXG4iLG5hbWUpKTsKKyAgfQorCisgIHNhdmUgPSBtX2FsbG9jYXRlKDAsIDIpOworICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisgIGlmKG1hcHBpbmdwKHByb3BlcnRpZXMpKQorICB7CisgICAgLy8gZGVsZXRlIGFsbCBlbnRyaWVzIGluIG1hcHBpbmcgcHJvcGVydGllcyB3aXRob3V0IFNBVkUgZmxhZyEKKyAgICBpbmRleCA9IG1faW5kaWNlcyhwcm9wZXJ0aWVzKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDtpLS0pCisgICAgeworICAgICAgaWYocHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmIFNBVkUpCisgICAgICB7CisgICAgICAgc2F2ZVtpbmRleFtpXV0gPSBwcm9wZXJ0aWVzW2luZGV4W2ldXTsKKyAgICAgICBzYXZlW2luZGV4W2ldLCBGX01PREVdID0KKyAgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYKKyAgICAgICAgICAgICAgICAgICAgKH4oU0VUTU5PVEZPVU5EfFFVRVJZTU5PVEZPVU5EfFFVRVJZQ0FDSEVEfFNFVENBQ0hFRCkpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHNhdmUgPSAoW10pOworCisgIC8vIHNhdmUgb2JqZWN0IQorICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoc2F2ZSk7CisgIC8vIGZvcm1hdDogd2llIGRlZmluaWVydCBpbiBjb25maWcuaAorICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgZWxzZQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICAgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICBlbHNlCisgICAgICBzdGF0LT5zaXplb2YocmVzKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbzogIitzYXZlb19zdGF0WzBdKyJcbiIpOworICBzYXZlb19zdGF0WzFdW3NhdmVvX3N0YXRbMF1dID0gc3RhdDsKKyAgc2F2ZW9fc3RhdFswXSA9IChzYXZlb19zdGF0WzBdICsgMSkgJSBzaXplb2Yoc2F2ZW9fc3RhdFsxXSk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW8gMjogIitzYXZlb19zdGF0WzBdKyJcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gKiBBdWNoIFByb3BlcnRpZXMgbGFkZW4KK2ludCByZXN0b3JlX29iamVjdChzdHJpbmcgbmFtZSkKK3sKKyAgaW50IHJlc3VsdDsKKyAgbWl4ZWQgaW5kZXg7CisgIG1peGVkIHNhdmU7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgaW50IGk7CisgIGNsb3N1cmUgY2w7CisKKyAgLy8gZ2V0IGFjdHVhbCBwcm9wZXJ0eSBzZXR0aW5ncyAoYnkgY3JlYXRlKCkpCisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKy8vICBERUJVRyhzcHJpbnRmKCJSRVNUT1JFICVPXG4iLG5hbWUpKTsKKyAgLy8gcmVzdG9yZSBvYmplY3QKKyAgcmVzdWx0PWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpyZXN0b3JlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lKTsKKyAgLy8nKSkKKyAgLy9fZ2V0X3NhdmVfZGF0YSBsaWVmZXJ0IHRhdHNhZWNobGljaCBtaXhlZCB6dXJ1ZWNrLCB3ZW5uIGRhcyBhdWNoIGltbWVyIGVpbiAKKyAgLy9tYXBwaW5nIHNlaW4gc29sbHRlLgorICBzYXZlID0gKG1peGVkKXByZXZpb3VzX29iamVjdCgpLT5fZ2V0X3NhdmVfZGF0YSgpOworICBpZihtYXBwaW5ncChzYXZlKSkKKyAgeworICAgIGluZGV4ID0gbV9pbmRpY2VzKHNhdmUpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgcHJvcGVydGllc1tpbmRleFtpXV0gPSBzYXZlW2luZGV4W2ldXTsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gPSBzYXZlW2luZGV4W2ldLCBGX01PREVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJn4oU0VUQ0FDSEVEfFFVRVJZQ0FDSEVEKTsKKyAgICB9CisgIH0KKyAgZWxzZSBwcm9wZXJ0aWVzID0gKFtdKTsKKworICAvLyByZXN0b3JlIHByb3BlcnRpZXMKKyAgZnVuY2FsbCgKKyAgICAgICAgICBiaW5kX2xhbWJkYSgKKyAgICAgICAgICAgICAgICAgICAgIHVuYm91bmRfbGFtYmRhKCh7J2FyZ30pLCAvLyd9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCh7Iyd0aGlzX29iamVjdH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRQcm9wZXJ0aWVzIiwnYXJnfSkpLC8vJykKKyAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSxwcm9wZXJ0aWVzKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICAvL2RlYnVnX21lc3NhZ2UoInJlc3RvcmVvOiAiK3Jlc3RvcmVvX3N0YXRbMF0rIlxuIik7CisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgcmVzdG9yZW9fc3RhdFsxXVtyZXN0b3Jlb19zdGF0WzBdXSA9IHN0YXQ7CisKKyAgcmVzdG9yZW9fc3RhdFswXSA9IChyZXN0b3Jlb19zdGF0WzBdICsgMSkgJSBzaXplb2YocmVzdG9yZW9fc3RhdFsxXSk7CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAqIEhCIGVpbmVzIE9iamVrdGVzIGVpbi9hdXNzY2hhbHRlbgoraW50IHNldF9vYmplY3RfaGVhcnRfYmVhdChvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBpZiAob2JqZWN0cChvYikpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjb25maWd1cmVfb2JqZWN0LG9iKSwgb2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworfQorCisvLyAqIE1hZ2llcmxldmVsZ3J1cHBlbiBlcm1pdHRlbG4KK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeikKK3sKKyAgaW50IGxldjsKKworICBsZXY9cXVlcnlfd2l6X2xldmVsKHdpeik7CisgIGlmIChsZXY8U0VFUl9MVkwpIHJldHVybiAwOworICBpZiAobGV2Pj1HT0RfTFZMKSByZXR1cm4gbGV2OworICBpZiAobGV2Pj1BUkNIX0xWTCkgcmV0dXJuIEFSQ0hfR1JQOworICBpZiAobGV2Pj1FTERFUl9MVkwpIHJldHVybiBFTERFUl9HUlA7CisgIGlmIChsZXY+PUxPUkRfTFZMKSByZXR1cm4gTE9SRF9HUlA7CisgIGlmIChsZXY+PVNQRUNJQUxfTFZMKSByZXR1cm4gU1BFQ0lBTF9HUlA7CisgIGlmIChsZXY+PURPTUFJTk1FTUJFUl9MVkwpIHJldHVybiBET01BSU5NRU1CRVJfR1JQOworICBpZiAobGV2Pj1XSVpBUkRfTFZMKSByZXR1cm4gV0laQVJEX0dSUDsKKyAgaWYgKGxldj49TEVBUk5FUl9MVkwpIHJldHVybiBMRUFSTkVSX0dSUDsKKyAgcmV0dXJuIFNFRVJfR1JQOworfQorCittaXhlZCAqd2l6bGlzdF9pbmZvKCkKK3sKKyAgaWYgKEFSQ0hfU0VDVVJJVFkgfHwgIWV4dGVybl9jYWxsKCkpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIHJldHVybiAwOworfQorCisvLyAqIHdpemxpc3QgYXVzZ2ViZW4KK3ZhcmFyZ3Mgdm9pZCB3aXpsaXN0KHN0cmluZyBuYW1lLCBpbnQgc29ydGtleSApIHsKKworICBpZiAoIW5hbWUpCisgIHsKKyAgICBpZiAodGhpc19wbGF5ZXIoKSkKKyAgICAgIG5hbWUgPSBnZXR1aWQodGhpc19wbGF5ZXIoKSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gU2NobHVlc3NlbCBkYXJmIG51ciBpbiBlaW5lbSBndWVsdGlnZW4gQmVyZWljaCBzZWluCisgIGlmIChzb3J0a2V5PFdMX05BTUUgfHwgc29ydGtleT49V0xfU0laRSkgc29ydGtleT1XTF9DT1NUOworCisgIG1peGVkKiogd2wgPSBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgLy8gbmFjaCA8c29ydGtleT4gc29ydGllcmVuCisgIHdsID0gc29ydF9hcnJheSh3bCwgZnVuY3Rpb24gaW50IChtaXhlZCBhLCBtaXhlZCBiKQorICAgICAge3JldHVybiBhW3NvcnRrZXldIDwgYltzb3J0a2V5XTsgfSApOworCisgIC8vIFN1bW1lIHVlYmVyIGFsbGUgS29tbWFuZG9zIGVybWl0dGVsbi4KKyAgaW50IHRvdGFsX2NtZCwgaTsKKyAgaW50IHBvcz0tMTsKKyAgZm9yZWFjaChtaXhlZCBlbnRyeSA6IHdsKQorICB7CisgICAgdG90YWxfY21kICs9IGVudHJ5W1dMX0NPTU1BTkRTXTsKKyAgICBpZiAoZW50cnlbV0xfTkFNRV0gPT0gbmFtZSkKKyAgICAgIHBvcyA9IGk7CisgICAgKytpOworICB9CisKKyAgaWYgKHBvcyA8IDAgJiYgbmFtZSAhPSAiQUxMIiAmJiBuYW1lICE9ICJUT1AxMDAiKQorICAgIHJldHVybjsKKworICBpZiAobmFtZSA9PSAiVE9QMTAwIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpID4gMTAwKQorICAgICAgd2wgPSB3bFswLi4xMDBdOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKyAgLy8gdW0gbmFtZSBoZXJ1bSBzY2huZWlkZW4KKyAgZWxzZSBpZiAobmFtZSAhPSAiQUxMIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpIDw9IDIxKQorICAgICAgd2wgPSB3bDsKKyAgICBlbHNlIGlmIChwb3MgKyAxMCA8IHNpemVvZih3bCkgJiYgcG9zIC0gMTAgPiAwKQorICAgICAgd2wgPSB3bFtwb3MtMTAuLnBvcysxMF07CisgICAgZWxzZSBpZiAocG9zIDw9MjEpCisgICAgICB3bCA9IHdsWzAuLjIwXTsKKyAgICBlbHNlIGlmIChwb3MgPj0gc2l6ZW9mKHdsKSAtIDIxKQorICAgICAgd2wgPSB3bFs8MjEuLl07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorCisgIHdyaXRlKCJcbldpemFyZCB0b3Agc2NvcmUgbGlzdFxuXG4iKTsKKyAgaWYgKHRvdGFsX2NtZCA9PSAwKQorICAgIHRvdGFsX2NtZCA9IDE7CisgIHByaW50ZigiJS0yMHMgJS02cyAlLTNzICUtMTdzICUtNnMgJS02cyAlLTZzXG4iLAorICAgICAgICAgIkVVSUQiLCAiY21kcyIsICIlIiwgIkNvc3RzIiwgIkhCIiwgIkFycmF5cyIsIk1hcHAuIik7CisgIGZvcmVhY2gobWl4ZWQgZTogd2wpCisgIHsKKyAgICBwcmludGYoIiUtOjIwcyAlOjZkICU6MmQlJSBbJTo2ZGssJTo2ZEddICU6NmQgJTo2ZCAlOjZkXG4iLAorICAgICAgICAgIGVbV0xfTkFNRV0sIGVbV0xfQ09NTUFORFNdLCBlW1dMX0NPTU1BTkRTXSAqIDEwMCAvIHRvdGFsX2NtZCwKKyAgICAgICAgICBlW1dMX0NPU1RdIC8gMTAwMCwgZVtXTF9UT1RBTF9HSUdBQ09TVF0sCisgICAgICAgICAgZVtXTF9IRUFSVF9CRUFUU10sIGVbV0xfQVJSQVlfVE9UQUxdLCBlW1dMX01BUFBJTkdfVE9UQUxdCisgICAgICAgICAgKTsKKyAgfQorICBwcmludGYoIlxuVG90YWwgICAgICAgICAlN2QgICAgICAgICAoJWQpXG5cbiIsIHRvdGFsX2NtZCwgc2l6ZW9mKHdsKSk7Cit9CisKKworLy8gQWIgaGllciBmb2xnZW4gSGlsZnNmdW5rdGlvbmVuIGZ1ZXIgY2FsbF9vdXQoKSBiencuIGZ1ZXIgZGVyZW4gQmVncmVuenVuZworCisvLyBlcm1pdHRlbHQgZGFzIE9iamVrdCBkZXMgQ2FsbG91dHMuCitwcml2YXRlIG9iamVjdCBfY2FsbF9vdXRfb2JqKCBtaXhlZCBjYWxsX291dCApIHsKKyAgICByZXR1cm4gcG9pbnRlcnAoY2FsbF9vdXQpID8gY2FsbF9vdXRbMF0gOiAwOworfQorCitwcml2YXRlIHZvaWQgX3NhbWVfb2JqZWN0KCBvYmplY3Qgb2IsIG1hcHBpbmcgbSApIHsKKyAgLy8gaXN0IG5pY2h0IHNvIGJsb2VkLCB3aWUgZXMgYXVzc2llaHQsIHMuIG5hY2hmb2xnZWRlIFZlcndlbmR1bmcgdm9uIG0KKyAgaWYgKCBtW29iXSApCisgICAgbVtvYl0gKz0gKHsgb2IgfSk7CisgIGVsc2UKKyAgICBtW29iXSA9ICh7IG9iIH0pOyAKK30KKworLy8gYWxsZSBPYmpla3RlIGltIE1hcHBpbmcgbSB6dXNhbW1lbmZhc3NlbiwgZGllIGRlbiBnbGVpY2hlbiBMb2FkbmFtZSAoTmFtZSBkZXIKKy8vIEJsdWVwcmludCkgaGFiZW4sIGFsc28gYWxsZSBDbG9uZXMgZGVyIEJQLCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLgorLy8gT2JqZWt0ZSB3ZXJkZW4gYXVjaCBtZWhyZmFjaCBlcmZhc3N0LCBqZSBuYWNoIEFuemFobCBpaHJlciBDYWxsb3V0cy4KK3ByaXZhdGUgdm9pZCBfc2FtZV9wYXRoKCBvYmplY3Qga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtICkgeworICBzdHJpbmcgcGF0aDsKKyAgaWYgKCFvYmplY3RwKGtleSkgfHwgIXBvaW50ZXJwKG9icykpIHJldHVybjsKKworICBwYXRoID0gbG9hZF9uYW1lKGtleSk7CisKKyAgaWYgKCBtW3BhdGhdICkKKyAgICBtW3BhdGhdICs9IG9iczsKKyAgZWxzZQorICAgIG1bcGF0aF0gPSBvYnM7Cit9CisKKy8vIGtleSBrYW5uIG9iamVjdCBvZGVyIHN0cmluZyBzZWluLgorcHJpdmF0ZSBpbnQgX3Rvb19tYW55KCBtaXhlZCBrZXksIG1hcHBpbmcgbSwgaW50IGkgKSB7CisgICAgcmV0dXJuIHNpemVvZihtW2tleV0pID49IGk7Cit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbiBvYnMgemVyc3RvZXJlbiB1bmQgRmVobGVybWVsZHVuZyBhdXNnZWJlbi4gQUNIVFVORzogRGllCisvLyBPYmpla3RlIHdlcmRlbiBpZFIgenUgZWluZXIgQlAgZ2Vob2VyZW4sIG11ZXNzZW4gYWJlciBuaWNodCEgSW4gZGVtIEZhbGwKKy8vIHdpcmQgYXVmIGRlciBFYmVuZSBhYmVyIG51ciBlaW4gT2JqZWt0IGluIGRlciBGZWhsZXJtZWxkdW5nIGVyd2FlaG50LgorcHJpdmF0ZSB2b2lkIF9kZXN0cm95KCBtaXhlZCBrZXksIG9iamVjdCAqb2JzLCBzdHJpbmcgdGV4dCwgaW50IHVpZCApIHsKKyAgICBpZiAoIXBvaW50ZXJwKG9icykpIHJldHVybjsKKyAgICAvLyBBcnJheSBtaXQgdW5pcXVlIEVpbnRyYWVnZSBlcnpldWdlbi4KKyAgICBvYnMgPSBtX2luZGljZXMoIG1rbWFwcGluZyhvYnMpICk7CisgICAgLy8gRmVobGVybWVsZHVuZyBhdWYgZGVyIEViZW5lIGF1c2dlYmVuLCBpbSBjYXRjaCgpIG1pdCBwdWJsaXNoLCBkYW1pdCBlcworICAgIC8vIGF1ZiBkZXIgRWJlbmUgZGlyZWt0IHNjcm9sbHQsIGRlciBiYWNrdHJhY2UgdmVyZnVlZ2JhciBpc3QgKGltCisgICAgLy8gZ2VnZW5zYXR6IHp1ciBMb2VzdW5nIG1pdHRlbHMgQ2FsbG91dCksIGRpZSBBdXNmdWVocnVuZyBhYmVyIHdlaXRlcgorICAgIC8vIGxhZXVmdC4KKyAgICBjYXRjaCggZWZ1bjo6cmFpc2VfZXJyb3IoICAgICAgICAgICAKKyAgICAgICAgIHNwcmludGYoIHRleHQsICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICB1aWQgPyAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoa2V5KSA6IGtleSwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHNpemVvZihvYnMpLCBvYmplY3RfbmFtZShvYnNbPDFdKSApICk7cHVibGlzaCk7CisgICAgLy8gVW5kIHdlZyBtaXQgZGVtIEtyYW0uLi4KKyAgICBmaWx0ZXIoIG9icywgIydlZnVuOjpkZXN0cnVjdC8qJyovICk7Cit9CisKKy8vIEFsbGUgT2JqZWt0IGVpbmVyIFVJRCBpbSBNYXBwaW5nIG0gbWl0IFVJRCBhbHMgS0V5cyB6dXNhbW1lbmZhc3Nlbi4gT2JqZWt0CisvLyBzaW5kIGRhYmVpIG5pY2h0IHVuaXF1ZS4KK3ByaXZhdGUgdm9pZCBfc2FtZV91aWQoIHN0cmluZyBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0sIGNsb3N1cmUgY2YgKSB7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCAhcG9pbnRlcnAob2JzKSB8fCAhc2l6ZW9mKG9icykgKQorICAgIHJldHVybjsKKworICB1aWQgPSBmdW5jYWxsKCBjZiwga2V5ICk7CisKKyAgaWYgKCBtW3VpZF0gKQorICAgIG1bdWlkXSArPSBvYnM7IC8vIG9icyBpc3QgbmVuIEFycmF5CisgIGVsc2UKKyAgICBtW3VpZF0gPSBvYnM7Cit9CisKK3ByaXZhdGUgaW50IF9sb2dfY2FsbF9vdXQobWl4ZWQgY28pCit7CisgIGxvZ19maWxlKCJUT09fTUFOWV9DQUxMT1VUUyIsCisgICAgICBzcHJpbnRmKCIlczo6JU8gKCVkKVxuIixvYmplY3RfbmFtZShjb1swXSksY29bMV0sY29bMl0pLAorICAgICAgMjAwMDAwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGxhc3RfY2FsbG91dF9sb2c9MDsKKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBjYWxsX291dCggdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgdG1wLCAqY2FsbF9vdXRzOworCisgICAgLy8gQmVpID42MDAgQ2FsbG91dHMgYWxsZSBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDMwIENhbGxvdXRzIGxhdWZlbgorICAgIC8vIGhhYmVuLgorICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDYwMAorICAgICAgICAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQorICAgIHsKKyAgICAgICAvLyBMb2cgZXJ6ZXVnZW4uLi4KKyAgICAgICBpZiAobGFzdF9jYWxsb3V0X2xvZyA8CisgICAgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKSAtIDEwCisgICAgICAgICAgICYmIGdldF9ldmFsX2Nvc3QoKSA+IDIwMDAwMCkKKyAgICAgICB7CisgICAgICAgICBsYXN0X2NhbGxvdXRfbG9nID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgbG9nX2ZpbGUoIlRPT19NQU5ZX0NBTExPVVRTIiwKKyAgICAgICAgICAgICBzcHJpbnRmKCJcbiVzOiAjIyMjIyMjIyMjIyMgVG9vIG1hbnkgY2FsbG91dHM6ICVkICMjIyMjIyMjIyMjIyMjXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwKKyAgICAgICAgICAgICAgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykpKTsKKyAgICAgICAgIGZpbHRlcihlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2xvZ19jYWxsX291dCk7CisgICAgICAgfQorICAgICAgIC8vIE9iamVrdGUgYWxsZXIgQ2FsbG91dHMgZXJtaXR0ZWxuCisgICAgICAgY2FsbF9vdXRzID0gbWFwKCBlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2NhbGxfb3V0X29iaiApOworICAgICAgIG1hcHBpbmcgb2JqZWN0bWFwID0gKFtdKTsKKyAgICAgICBmaWx0ZXIoIGNhbGxfb3V0cywgIydfc2FtZV9vYmplY3QsICZvYmplY3RtYXAgKTsKKyAgICAgICAvLyBNYXN0ZXIgbmljaHQgZ3JpbGxlbi4uLgorICAgICAgIGVmdW46Om1fZGVsZXRlKCBvYmplY3RtYXAsIG1hc3RlcigxKSApOworICAgICAgIC8vIGFsbGUgT2JqZWt0ZSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgIG1hcHBpbmcgcmVzID0gZmlsdGVyX2luZGljZXMoIG9iamVjdG1hcCwgIydfdG9vX21hbnksIG9iamVjdG1hcCwgMjkgKTsKKyAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBLZXkgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIHVlYmVyZ2ViZW4gKGluIGRpZXNlbSBGYWxsIHNpbmQgS2V5cyB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gamV3ZWlscyBkYXMgZ2xlaWNoZSBPYmpla3QpLgorICAgICAgIGlmICggc2l6ZW9mKHJlcykgKSAgICAgICAKKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5IHNpbmdsZSAiICAgICAgICAgICAgIAorICAgICAgICAgICAgICAib2JqZWN0IFslT10uIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgLy8gQmVpIChhdWNoIG5hY2ggZGVtIGVyc3RlbiBBdWZyYWV1bWVuIG5vY2gpID44MDAgQ2FsbG91dHMgYWxsZQorICAgICAgIC8vIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgNTAgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuIC0gdW5kCisgICAgICAgLy8gZGllc21hbCB6YWVobGVuIENsb25lcyBuaWNodCBlaWdlbnN0YWVuZGlnISBELmguIGVzIHdlcmRlbiBhbGxlCisgICAgICAgLy8gQ2xvbmVzIGVpbmVyIEJQIGdla2lsbHQsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4sIGZhbGxzIGFsbGUKKyAgICAgICAvLyBkaWVzZSBPYmpla3RlIF96dXNhbW1lbl8gbWVociBhbHMgNTAgQ2FsbG91dHMgaGFiZW4hCisgICAgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gODAwICkgeworICAgICAgICAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgdm9uIGRlciBsZXR6dGVuIEFrdGlvbiBzaW5kIGluIG9iamVjdG1hcCBuaWNodAorICAgICAgICAgICAvLyBtZWhyIGRyaW4sIGRhIHNpZSBkb3J0IGFscyBLZXlzIHZlcndlbmRldCB3dXJkZW4uCisgICAgICAgICAgIG1hcHBpbmcgcGF0aG1hcD0oW10pOworICAgICAgICAgICAvLyBhbGxlIE9iamVrdCBlaW5lciBCUCBpbiByZXMgc29ydGllcmVuLCBCUC1OYW1lIGFscyBLZXksIEFycmF5cworICAgICAgICAgICAvLyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICB3YWxrX21hcHBpbmcoIG9iamVjdG1hcCwgIydfc2FtZV9wYXRoLCAmcGF0aG1hcCk7CisgICAgICAgICAgIC8vIGFsbGUgQlBzICh1bmQgaWhyZSBPYmpla3RlKSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggcGF0aG1hcCwgIydfdG9vX21hbnkvKicqLywgcGF0aG1hcCwgNTAgKTsKKyAgICAgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gZGllIENsb25lcworICAgICAgICAgICAvLyB1ZWJlcmdlYmVuLCBkaWUgQ2FsbG91dHMgaGFiZW4uCisgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveS8qJyovLCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAgICAgLy8gV2VubiBiZWlkZSBBdWZyYWV1bWFyYmVpdGVuIG5pY2h0cyBnZWJyYWNodCBoYWJlbiB1bmQgaW1tZXIKKyAgICAgICAgICAgLy8gbm9jaCA+MTAwMCBDYWxsb3V0cyBsYXVmZW4sIHdlcmRlbiBkaWVzbWFsIGFsbGUgQ2FsbG91dHMKKyAgICAgICAgICAgLy8gZWluZXIgVUlEIHp1c2FtbWVuZ2V6YWVobHQuCisgICAgICAgICAgIC8vIEFsbGUgT2JqZWt0ZSBlaW5lciBVSUQsIGRpZSBlcyBpbiBTdW1tZSBhbGxlciBpaHJlciBPYmpla3QgbWl0CisgICAgICAgICAgIC8vIENhbGxvdXRzIGF1ZiBtZWhyIGFscyAxMDAgQ2FsbG91dHMgYnJpbmd0LCB3ZXJkZW4gZ2Vyb2VzdGV0LgorICAgICAgICAgICBpZiAoZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDEwMDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gZGFzIG5hY2ggQlAtTmFtZW4gdm9yZ2VmaWx0ZXJ0ZSBNYXBwaW5nIGpldHp0IG5hY2ggVUlEcworICAgICAgICAgICAgICAvLyB6dXNhbW1lbnNvcnRpZXJlbi4gWmVyc3RvZXJ0ZSBDbG9uZXMgZmlsdGVyIF9zYW1lX3VpZCgpCisgICAgICAgICAgICAgIC8vIHJhdXMuCisgICAgICAgICAgICAgIG1hcHBpbmcgdWlkbWFwPShbXSk7CisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcGF0aG1hcCwgIydfc2FtZV91aWQsICZ1aWRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oICJjcmVhdG9yX2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZWN1cmUvbWFzdGVyIiApICk7CisgICAgICAgICAgICAgIC8vIEluIHJlcyBudW4gVUlEcyBhbHMgS2V5cyB1bmQgQXJyYXlzIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgICAgIC8vIERpZSByYXVzZmlsdGVybiwgZGllIG1laHIgYWxzIDEwMCBPYmpla3RlIChub24tdW5pcXVlLCBkLmguCisgICAgICAgICAgICAgIC8vIDEwMCBDYWxsb3V0cyEpIGhhYmVuLgorICAgICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggdWlkbWFwLCAjJ190b29fbWFueSwgdWlkbWFwLCAxMDAgKTsKKyAgICAgICAgICAgICAgLy8gdW5kIGVybmV1dCB1ZWJlciBkaWUgS2V5cyBsYXVmZW4gdW5kIGpld2VpbHMgZGllIEFycmF5cyBtaXQKKyAgICAgICAgICAgICAgLy8gZGVuIE9iamVrdGVuIHp1ciBaZXJzdG9lcnVuZyBhbiBfZGVzdHJveSgpLi4uCisgICAgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUlEICclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGYWxscyBkYXMgYXVmcnVmZW5kZSBPYmpla3QgemVyc3RvZXJ0IHd1cmRlIGJlaW0gQXVmcmFldW1lbgorICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgYXBwbHkoICMnZWZ1bjo6Y2FsbF9vdXQsIGFyZ3MgKTsKKyAgICByZXR1cm47Cit9CisKK21peGVkIGNhbGxfb3V0X2luZm8oKSB7CisgIAorICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKKyAgbWl4ZWQgY29pID0gZWZ1bjo6Y2FsbF9vdXRfaW5mbygpOworCisgIC8vIHVuZ2VmaWx0ZXJ0ZW4gT3V0cHV0IG51ciBmdWVyIGJlc3RpbW10ZSBPYmpla3RlLCBPYmpla3RlIGluIC9zdGQgb2RlcgorICAvLyAvb2JqIGhhYmVuIGRpZSBCYWNrYm9uZUlELgorICBpZiAocXVlcnlfd2l6X2xldmVsKGdldHVpZChwbykpID49IEFSQ0hfTFZMCisgICAgICAgfHwgKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGxvYWRfbmFtZShwbykpID09IEJBQ0tCT05FSUQgKSB7CisgICAgICByZXR1cm4gY29pOworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIGZpbHRlcihjb2ksIGZ1bmN0aW9uIG1peGVkIChtaXhlZCBhcnIpIHsKKyAgICAgICAgICAgICAgaWYgKHBvaW50ZXJwKGFycikgJiYgYXJyWzBdPT1wbykKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7IH0pOworICB9Cit9CisKKy8vICogWnUgZWluZXIgY2xvc3VyZSBkYXMgT2JqZWt0LCBhbiBkYXMgc2llIGdlYnVuZGVuIGlzdCwgc3VjaGVuCisvLyBOSUNIVCBkYXMgT2JqZWt0LCB3YXMgZ2dmLiBkaWUgbGZ1biBkZWZpbmllcnQhCittaXhlZCBxdWVyeV9jbG9zdXJlX29iamVjdChjbG9zdXJlIGMpIHsKKyAgcmV0dXJuCisgICAgQ0xPU1VSRV9JU19VTkJPVU5EX0xBTUJEQShnZXRfdHlwZV9pbmZvKGMsIDEpKSA/CisgICAgICAwIDoKKyAgKHRvX29iamVjdChjKSB8fCAtMSk7Cit9CisKKy8vICogV2lyIHdvbGxlbiBudXIgRUlOIEFyZ3VtZW50IC4uLiBhdXNzZXJkZW0gY2hlY2tzIGZ1ZXIgZGVuIE5ldHp0b3RlbnJhdW0KK3ZhcmFyZ3Mgdm9pZCBtb3ZlX29iamVjdChtaXhlZCB3aGF0LCBtaXhlZCB3aGVyZSkKK3sKKyAgb2JqZWN0IHBvLHRtcDsKKworICBwbz1wcmV2aW91c19vYmplY3QoKTsKKyAgaWYgKCF3aGVyZSkKKyAgeworICAgIHdoZXJlPXdoYXQ7CisgICAgd2hhdD1wbzsKKyAgfQorICBpZiAoKChzdHJpbmdwKHdoZXJlKSAmJiB3aGVyZT09TkVUREVBRF9ST09NICkgfHwKKyAgICAgICAob2JqZWN0cCh3aGVyZSkgJiYgd2hlcmU9PWZpbmRfb2JqZWN0KE5FVERFQURfUk9PTSkpKSAmJgorICAgICAgIG9iamVjdHAod2hhdCkgJiYgb2JqZWN0X25hbWUod2hhdCkhPSIvb2JqL3NwZXJyZXIiKQorICB7CisgICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIHdoYXQtPnJlbW92ZSgpOworICAgICAgaWYgKHdoYXQpIGRlc3RydWN0KHdoYXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGl2aW5nKHdoYXQpIHx8IGludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIGxvZ19maWxlKCJOREVBRDIiLHNwcmludGYoIlRSWUVEIFRPIE1PVkUgVE8gTkVUREVBRDogJU9cbiIsd2hhdCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQod2hhdCwwKTsKKyAgfQorICB0bXA9d2hhdDsKKyAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgorICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKKyAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKKyAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KKyAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQorICAgICAgLy8KKyAgICAgIC8vIFRpYW1haworICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjptb3ZlX29iamVjdCxwbyksd2hhdCx3aGVyZSk7CisgIGlmICh0bXA9d2hhdCkKKyAgICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworfQorCisKK3ZvaWQgc3RhcnRfc2ltdWxfZWZ1bigpIHsKKyAgbWl4ZWQgKmluZm87CisKKyAgLy8gRmFsbHMgbm9jaCBuaWNodCBnZXRhbiwgZXh0cmFfd2l6aW5mbyBpbml0aWFsaXNpZXJlbgorICBpZiAoICFwb2ludGVycChpbmZvID0gZ2V0X2V4dHJhX3dpemluZm8oMCkpICkKKyAgICBzZXRfZXh0cmFfd2l6aW5mbygwLCBpbmZvID0gYWxsb2NhdGUoQkFDS0JPTkVfV0laSU5GT19TSVpFKSk7CisKKyAgSW5pdExpdmluZ0RhdGEoaW5mbyk7CisKKyAgc2V0X25leHRfcmVzZXQoMTApOyAvLyBkaXJla3QgbWFsIGF1ZnJhZXVtZW4KK30KKworcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgIHNldF9uZXh0X3Jlc2V0KDcyMDApOworICBDbGVhbkxpdmluZ0RhdGEoKTsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGFic29sdXRlX2hiX2NvdW50KQoraW50IGFic29sdXRlX2hiX2NvdW50KCkgeworICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworfQorI2VuZGlmCisKK3ZvaWQgX19zZXRfZW52aXJvbm1lbnQob2JqZWN0IG9iLCBtaXhlZCB0YXJnZXQpCit7CisgIHN0cmluZyBwYXRoOworICBvYmplY3Qgb2JqOworCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuOworICBpZiAoIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIHx8ICFBUkNIX1NFQ1VSSVRZICkKKyAgICByZXR1cm47CisgIGlmIChvYmplY3RwKHRhcmdldCkpCisgIHsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2IsdGFyZ2V0KTsKKyAgICByZXR1cm47CisgIH0KKyAgcGF0aD0oc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKHRhcmdldCx0aGlzX2ludGVyYWN0aXZlKCkpOworICBpZiAoc3RyaW5ncChwYXRoKSAmJiBmaWxlX3NpemUocGF0aCsiLmMiKT49MCAmJgorICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpICkKKyAgeworICAgIG9iaj1maW5kX29iamVjdChwYXRoKTsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2Isb2JqKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCBfZHVtcF93aXpsaXN0KHN0cmluZyBmaWxlLCBpbnQgc29ydGJ5KSB7CisgIGludCBpOworICBtaXhlZCAqYTsKKworICBpZiAoIUxPUkRfU0VDVVJJVFkpCisgICAgcmV0dXJuOworICBpZiAoIW1hc3RlcigpLT52YWxpZF93cml0ZShmaWxlLGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIikpCisgIHsKKyAgICB3cml0ZSgiTk8gV1JJVEUgUEVSTUlTU0lPTlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGEgPSB3aXpsaXN0X2luZm8oKTsKKyAgYSA9IHNvcnRfYXJyYXkoYSwgbGFtYmRhKCAoeydhLCdifSksCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnPCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Esc29ydGJ5fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdiLHNvcnRieX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgcm0oZmlsZSk7CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICB3cml0ZV9maWxlKGZpbGUsc3ByaW50ZigiJS0xMXM6IGV2YWw9JS04ZCBjbWRzPSUtNmQgSEJzPSUtNWQgYXJyYXk9JS01ZCBtYXBwaW5nPSUtN2RcbiIsCisgICAgICBhW2ldW1dMX05BTUVdLGFbaV1bV0xfVE9UQUxfQ09TVF0sYVtpXVtXTF9DT01NQU5EU10sYVtpXVtXTF9IRUFSVF9CRUFUU10sCisgICAgICBhW2ldW1dMX0FSUkFZX1RPVEFMXSxhW2ldW1dMX0NBTExfT1VUXSkpOworfQorCitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYikgeworCisgIGlmKCFvYmplY3RwKG9iKSkKKyAgICBvYj1wcmV2aW91c19vYmplY3QoKTsKKyAgLy8gV2VubiBlaW4gT2JqZWt0IGdlc3VjaHQgd2lyZDogQWxsZSBFbnZzIGRpZXNlcyBPYmpla3RzIGVybWl0dGVsbiB1bmQKKyAgLy8gc2NoYXVlbiwgb2IgaW4gZGllc2VuIG9iIHZvcmtvbW10LiBEYW5uIGlzdCB3aGF0IGluIG9iIGVudGhhbHRlbi4KKyAgaWYob2JqZWN0cCh3aGF0KSkgeworICAgIG9iamVjdCAqZW52cz1hbGxfZW52aXJvbm1lbnQod2hhdCk7CisgICAgLy8gd2VubiBvYiBrZWluIEVudmlyb25tZW50IGhhdCwgaXN0IGVzIG9mZmVuc2ljaHRsaWNoIG5pY2h0IGluIHdoYXQKKyAgICAvLyBlbnRoYWx0ZW4uCisgICAgaWYgKCFwb2ludGVycChlbnZzKSkgcmV0dXJuIDA7CisgICAgaWYgKG1lbWJlcihlbnZzLCBvYikgIT0gLTEpIHJldHVybiB3aGF0OworICB9CisgIC8vIHNvbnN0IHdpcmRzIHRldXJlciwgdWViZXIgYWxsZSBPYmpla3RlIGltIChkZWVwKSBJbnYgbGF1ZmVuIHVuZCBwZXIgaWQoKQorICAvLyB0ZXN0ZW4uIERhYmVpIG11c3MgYWJlciBkaWUgZ2V3dWVuc2NodGUgTnIuICgiZmxhc2NoZSAzIikgYWJnZXNjaG5pdHRlbgorICAvLyB3ZXJkZW4gdW5kIHNlbGJlciBnZXphZWhsdCB3ZXJkZW4sIHdlbGNoZSBkYXMgZW50c3ByZWNoZW5kZSBPYmpla3QgaXN0LgorICBlbHNlIGlmIChzdHJpbmdwKHdoYXQpKSB7CisgICAgICBpbnQgY250OworICAgICAgc3RyaW5nIG5ld3doYXQ7CisgICAgICBpZihzc2NhbmYod2hhdCwiJXMgJWQiLG5ld3doYXQsY250KSE9MikKKyAgICAgICBjbnQ9MTsKKyAgICAgIGVsc2UKKyAgICAgICB3aGF0PW5ld3doYXQ7CisgICAgICBmb3JlYWNoKG9iamVjdCBpbnZvYjogZGVlcF9pbnZlbnRvcnkob2IpKSB7CisgICAgICAgaWYgKGludm9iLT5pZCh3aGF0KSAmJiAhLS1jbnQpCisgICAgICAgICAgIHJldHVybiBpbnZvYjsKKyAgICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gZGVlcF9wcmVzZW50KCkuICIKKyAgICAgICAgICJFeHBlY3RlZCBcIm9iamVjdFwiIG9yIFwic3RyaW5nXCIsIGdvdCAlLjUwTy5cbiIsCisgICAgICAgICB3aGF0KSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK21hcHBpbmcgZHVtcF9pcF9tYXBwaW5nKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK25vbWFzayB2b2lkIHN3YXAob2JqZWN0IG9iaikKK3sKKyAgd3JpdGUoIllvdXIgYXJlIG5vdCBhbGxvd2VkIHRvIHN3YXAgb2JqZWN0cyBieSBoYW5kIVxuIik7CisgIHJldHVybjsKK30KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBnYXJiYWdlX2NvbGxlY3Rpb24oc3RyaW5nIHN0cikKK3sKKyAgaWYocHJldmlvdXNfb2JqZWN0KCk9PTAgfHwgIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIAorICAgICAgfHwgIUFSQ0hfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSgiQ2FsbCBHQyBub3cgYW5kIHRoZSBtdWQgd2lsbCBjcmFzaCBpbiA1LTYgaG91cnMuIERPTlQgRE8gSVQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChzdHIpKQorICB7CisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbihzdHIpOworICB9CisgIGVsc2UgCisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbigpOworfQorCit2YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwobWl4ZWQgbmYsIGludCBwcmlvKSB7CisgIG9iamVjdCBwbyxvbGRvOworICBpbnQgb2xkcHJpbzsKKyAgCisgIGlmICghUEwgfHwgIW9iamVjdHAocG89cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmICghc3RyaW5ncChuZikgJiYgIWNsb3N1cmVwKG5mKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBzdHJpbmdzIGFuZCBjbG9zdXJlcyBhbGxvd2VkIGZvciBub3RpZnlfZmFpbCEgIgorICAgICAgICAgIkFyZ3VtZW50IHdhczogJS41ME8uLi5cbiIsbmYpKTsKKyAgfQorCisgIC8vIGZhbGxzIGVpbiBPYmpla3QgYmVyZWl0cyBuZW4gbm90aWZ5X2ZhaWwoKSBzZXR6dGUsIFByaW9yaXRhZXRlbiBhYnNjaGFldHplbgorICAvLyB1bmQgdmVyZ2xlaWNoZW4uCisgIGlmIChvYmplY3RwKG9sZG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIHBvIT1vbGRvKSB7CisgICAgaWYgKCFwcmlvKSB7ICAgICAgIAorICAgICAgLy9Qcmlvcml0YWV0IGRpZXNlcyBub3RpZnlfZmFpbCgpICdhYnNjaGFldHplbicKKyAgICAgIGlmIChwbz09UEwpIC8vIFNwaWVsZXItaW50ZXJuZSAoc291bC1jbWRzKQorICAgICAgICBwcmlvPU5GX05MX09XTjsKKyAgICAgIGVsc2UgaWYgKGxpdmluZyhwbykpCisgICAgICAgIHByaW89TkZfTkxfTElWSU5HOworICAgICAgZWxzZSBpZiAoKGludClwby0+SXNSb29tKCkpCisgICAgICAgIHByaW89TkZfTkxfUk9PTTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbz1ORl9OTF9USElORzsKKyAgICB9CisgICAgLy9Qcmlvcml0YWV0IGRlcyBhbHRlbiBTZXR6ZXJzIGFic2NoYWV0emVuCisgICAgaWYgKG9sZG89PVBMKQorICAgICAgb2xkcHJpbz1ORl9OTF9PV047CisgICAgZWxzZSBpZiAobGl2aW5nKG9sZG8pKQorICAgICAgb2xkcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgZWxzZSBpZiAoKGludClvbGRvLT5Jc1Jvb20oKSkKKyAgICAgIG9sZHByaW89TkZfTkxfUk9PTTsKKyAgICBlbHNlCisgICAgICBvbGRwcmlvPU5GX05MX1RISU5HOworICB9CisgIGVsc2UgLy8gd2VubiBlcyBub2NoIGtlaW4gTm90aWZ5X2ZhaWwgZ2lidDoKKyAgICBvbGRwcmlvPU5GX05MX05PTkU7CisKKyAgLy92ZXJnbGVpY2hlbiB1bmQgZ2dmLiBzZXR6ZW4KKyAgaWYgKHByaW8gPj0gb2xkcHJpbykgeyAKKyAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgIGVmdW46Om5vdGlmeV9mYWlsKG5mKTsKKyAgfQorCisgIHJldHVybjsKK30KKwordm9pZCBfbm90aWZ5X2ZhaWwoc3RyaW5nIHN0cikKK3sKKyAgLy9xdWVyeV9ub3RpZnlfZmFpbCgpIGJlbnV0emVuLCB1bSBkYXMgT2JqZWt0CisgIC8vZGVzIGxldHp0ZW4gbm90aWZ5X2ZhaWwoKSB6dSBlcm1pdHRlbG4KKyAgb2JqZWN0IG87CisgIGlmICgobz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgbyE9cHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICAvL25vY2gga2VpbiBub3RpZnlfZmFpbCgpIGZ1ZXIgZGllc2VzIEtvbW1hbmRvIGdlc2V0enQsIGF1ZiBnZWh0cy4KKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgZWZ1bjo6bm90aWZ5X2ZhaWwoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdHJpbmcgdGltZTJzdHJpbmcoIHN0cmluZyBmb3JtYXQsIGludCB6ZWl0ICkKK3sKKyAgaW50IGksY2gsbWF4dW5pdCxkdW1teTsKKyAgc3RyaW5nICpwYXJ0cywgZm10OworCisgIGludCBzZWNzID0gemVpdDsKKyAgaW50IG1pbnMgPSAoemVpdC82MCk7CisgIGludCBob3VycyA9ICh6ZWl0LzM2MDApOworICBpbnQgZGF5cyA9ICh6ZWl0Lzg2NDAwKTsKKyAgaW50IHdlZWtzID0gICh6ZWl0LzYwNDgwMCk7CisgIGludCBtb250aHMgPSAoemVpdC8yNDE5MjAwKTsKKyAgaW50IGFiYnIgPSAwOworCisgIHBhcnRzID0gcmVnZXhwbG9kZSggZm9ybWF0LCAiXCglXCgtfFwpWzAtOV0qW253ZGhtc3hOV0RITVNYXVwpfFwoJSVcKSIgKTsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIHN3aXRjaCggcGFydHNbaV1bPDFdICkKKyAgICB7CisgICAgY2FzZSAneCc6IGNhc2UgJ1gnOgorICAgICAgIGFiYnIgPSBzc2NhbmYoIHBhcnRzW2ldLCAiJSUlZCIsIGR1bW15ICkgJiYgZHVtbXk9PTA7CisgICAgICAgLy8gTk8gYnJlYWsgIQorICAgIGNhc2UgJ24nOiBjYXNlICdOJzoKKyAgICAgICBtYXh1bml0IHw9IDMxOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOiBjYXNlICdXJzoKKyAgICAgICBtYXh1bml0IHw9IDE1OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICBtYXh1bml0IHw9IDc7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgorICAgICAgIG1heHVuaXQgfD0gMzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6CisgICAgICAgbWF4dW5pdCB8PSAxOworICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiggbWF4dW5pdCAmIDE2ICkgd2Vla3MgJT0gNDsKKyAgaWYoIG1heHVuaXQgJiA4ICkgZGF5cyAlPSA3OworICBpZiggbWF4dW5pdCAmIDQgKSBob3VycyAlPSAyNDsKKyAgaWYoIG1heHVuaXQgJiAyICkgbWlucyAlPSA2MDsKKyAgaWYoIG1heHVuaXQgKSBzZWNzICU9IDYwOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgZm10ID0gcGFydHNbaV1bMC4uPDJdOworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIGlmKCBjaD09J3gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J24nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSd3JzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdkJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0naCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnbSc7CisgICAgICBlbHNlIGNoID0gJ3MnOworICAgIH0KKyAgICBlbHNlIGlmKCBjaD09J1gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J04nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSdXJzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdEJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0nSCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnTSc7CisgICAgICBlbHNlIGNoID0gJ1MnOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2goIGNoICkKKyAgICB7CisgICAgICBjYXNlICduJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtb250aHMgKTsgYnJlYWs7CisgICAgICBjYXNlICd3JzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCB3ZWVrcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2QnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGRheXMgKTsgYnJlYWs7CisgICAgICBjYXNlICdoJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBob3VycyApOyBicmVhazsKKyAgICAgIGNhc2UgJ20nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1pbnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdzJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBzZWNzICk7IGJyZWFrOworICAgICAgY2FzZSAnTic6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiTSI7CisgICAgICAgZWxzZSBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtb250aHM9PTEpID8gIk1vbmF0IiA6ICJNb25hdGUiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdXJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJ3IjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHdlZWtzPT0xKSA/ICJXb2NoZSIgOiAiV29jaGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiZCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChkYXlzPT0xKSA/ICJUYWciIDogIlRhZ2UiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdIJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJoIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGhvdXJzPT0xKSA/ICJTdHVuZGUiIDogIlN0dW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdNJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJtIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1pbnM9PTEpID8gIk1pbnV0ZSIgOiAiTWludXRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInMiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoc2Vjcz09MSkgPyAiU2VrdW5kZSIgOiAiU2VrdW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICclJzoKKyAgICAgICBwYXJ0c1tpXSA9ICIlIjsKKyAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUoIHBhcnRzLCAiIiApOworfQorCitub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKQoreworICBzdHJpbmcgZXJyOworICBvYmplY3Qgb2I7CisgIG1peGVkIG07CisgIC8vaGF0IG5lbiBTY2hlcnprZWtzIGRpZSBCbHVlcHJpbnQgYmV3ZWd0PworICBpZiAoKG9iPWZpbmRfb2JqZWN0KCIvc2VjdXJlL2xvZ2luIikpICYmIGVudmlyb25tZW50KG9iKSkKKyAgICAgIGNhdGNoKGRlc3RydWN0KG9iKTtwdWJsaXNoKTsKKyAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoInNlY3VyZS9sb2dpbiIpO3B1Ymxpc2gpOworICBpZiAoZXJyKQorICB7CisgICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChvYmplY3RwKG09KG1peGVkKW9iLT5uZXdfbG9nb24obmFtZSkpKSBuZXRkZWFkW25hbWVdPW07CisgIHJldHVybiBtOworfQorCitub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpCit7CisgIGludCAqbGV2ZWw7CisgIC8va2V0dGUgZGVyIENhbGxlciBkdXJjaGxhdWZlbiwgZGVuIG5pZWRyaWdzdGVuIExldmVsIGluIGRlciBLZXR0ZQorICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKKyAgLy92b24gMC4KKyAgLy9jYWxsZXJfc3RhY2soMSkgZnVlZ3QgZGVtIFJ1ZWNrZ2FiZWFycmF5IHRoaXNfaW50ZXJhY3RpdmUoKSBoaW56dSBiencuIDAsCisgIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgorICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgorICAvL0lOdGVyYWN0aXZlIGdlYmVuIG11c3MuCisgIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQorICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCisgICAgICAgcmV0dXJuKHF1ZXJ5X3dpel9sZXZlbChnZXRldWlkKGNhbGxlcikpKTsKKyAgICAgICByZXR1cm4oMCk7IC8vIGtlaW4gT2JqZWt0IGRhLCAwLgorICAgICAgfSApOworICByZXR1cm4obWluKGxldmVsKSk7IC8vZGVuIGtsZWluc3RlbiBXZXJ0IGltIEFycmF5IHp1cnVlY2tnZWJlbiAoZ2dmLiAwKQorfQorCitub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCkKK3sKKyAgc3RyaW5nIGV1aWQ7CisKKyAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpIC8vIEVzIG11c3MgZWluZW4gaW50ZXJhY3RpdmUgZ2ViZW4KKyAgICAgcmV0dXJuIDA7CisgIGV1aWQ9Z2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAvLyB1ZWJlciBhbGxlIENhbGxlciBpdGVyaWVyZW4uIFdlbm4gZWluZXMgZGF2b24gZWluZSBhbmRlcmUgZXVpZCBoYXQgYWxzCisgIC8vIGRlciBJbnRlcmFjdGl2ZSB1bmQgZGllc2UgbmljaHQgZGllIFJPT1RJRCBpc3QsIHdpcmQgMCB6dXJ1ZWNrZ2ViZW4uCisgIC8vIEViZW5zbywgZmFsbHMgZWluIFNlbGJzdHplcnN0b2VyZXIgaXJnZW5kd28gaW4gZGVyIEtldHRlIGlzdC4KKyAgZm9yZWFjaChvYmplY3QgY2FsbGVyOiBjYWxsZXJfc3RhY2soKSkgeworICAgICAgaWYgKCFvYmplY3RwKGNhbGxlcikgfHwKKyAgICAgICAoZ2V0ZXVpZChjYWxsZXIpIT1ldWlkICYmIGdldGV1aWQoY2FsbGVyKSE9Uk9PVElEKSkKKyAgICAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBldWlkOyAvLyAnc2ljaGVyZScgZXVpZCB6dXJ1ZWNrZ2ViZW4KK30KKworLy8gSU5QVVRfUFJPTVBUIHVuZCBuZW4gTGVlcnByb21wdCBoaW56dWZ1ZWdlbiwgd2VubiBrZWlucyB1ZWJlcmdlYmVuIHdpcmQuCisvLyBEYXMgc29sbCBkYXp1IGRpZW5lbiwgZGFzcyBhbGxlIGdnZi4gZWluIEVPUiBhbSBQcm9tcHRlbmRlIGtyaWVnZW4uLi4KKy8vI2lmIF9fQk9PVF9USU1FX18gPCAxMzYwMDE3MjEzCit2YXJhcmdzIHZvaWQgaW5wdXRfdG8oIG1peGVkIGZ1biwgaW50IGZsYWdzLCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCAqYXJyOworICAgIGludCBpOworCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIC8vIFRPRE86IGlucHV0X3RvKC4uLixJTlBVVF9QUk9NUFQsICIiLCAuLi4pLCB3ZW5uIGtlaW4gSU5QVVRfUFJPTVBUCisgICAgLy8gdm9ya29tbXQuLi4KKyAgICBpZiAoIGZsYWdzJklOUFVUX1BST01QVCApIHsgICAgCisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MgfSkgKyBhcmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gZ2dmLiBlaW4gSU5QVVRfUFJPTVBUIGhpbnp1ZnVlZ2VuIHVuZCBuZW4gTGVlcnN0cmluZyBhbHMgUHJvbXB0LgorICAgICAgICBmbGFncyB8PSBJTlBVVF9QUk9NUFQ7CisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MsICIiIH0pICsgYXJnczsKKyAgICB9CisKKyAgICAvLyBBcnJheXMgZ2VnZW4gZmxhdHRlbiBxdW90ZW4uCisgICAgZm9yICggaSA9IHNpemVvZihhcnIpIC0gMTsgaSA+IDE7IGktLSApCisgICAgICAgaWYgKCBwb2ludGVycChhcnJbaV0pICkKKyAgICAgICAgICAgYXJyW2ldID0gcXVvdGUoYXJyW2ldKTsKKworICAgIGFwcGx5KCBiaW5kX2xhbWJkYSggdW5ib3VuZF9sYW1iZGEoICh7fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgIydlZnVuOjppbnB1dF90by8qJyovIH0pICsgYXJyICksCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpICkgKTsKK30KKy8vI2VuZGlmCisKK25vbWFzayBpbnQgc2V0X2xpZ2h0KGludCBpKQorLy8gZXJob2VodCBkYXMgTGljaHRsZXZlbCBlaW5lcyBPYmpla3RzIHVtIGkKKy8vIHJlc3VsdDogZGFzIExpY2h0bGV2ZWwgaW5uZXJoYWxiIGRlcyBPYmpla3RzCit7CisgICAgb2JqZWN0IG9iLCAqaW52OworICAgIGludCBsYWxsLCBsaWdodCwgZGFyaywgdG1wOworCisgICAgaWYgKCEob2I9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsgLy8gb2huZSBkYXMgZ2VodHMgbmljaHQuCisKKyAgICAvLyBhdXMga29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGthbm4gbWFuIGF1Y2ggZGVuIExpY2h0bGV2ZWwgbm9jaCBzZXR6ZW4KKyAgICBpZiAoaSE9MCkgb2ItPlNldFByb3AoUF9MSUdIVCwgb2ItPlF1ZXJ5UHJvcChQX0xJR0hUKStpKTsKKworICAgIC8vIExpY2h0YmVyZWNobnVuZyBmaW5kZXQgZWlnZW50bGljaCBpbiBkZXIgTXVkbGliIHN0YXR0LgorICAgIHJldHVybiAoaW50KW9iLT5RdWVyeVByb3AoUF9JTlRfTElHSFQpOworfQorCisKK3B1YmxpYyBzdHJpbmcgaXNvMmFzY2lpKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKKyAgICAgICByZXR1cm4gIiI7CisKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLkIiwgImFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvYiLCAib2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi/CIsICJ1ZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLEIiwgIkFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItYiLCAiT2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3CIsICJVZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLfIiwgInNzIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIlteIC1+XSIsICI/IiwgMSApOworCisgICAgcmV0dXJuIHN0cjsKK30KKworCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgQ291bnRVcCggc3RyaW5nICpzLCBzdHJpbmcgc2VwLCBzdHJpbmcgbGFzdHNlcCApCit7CisgICAgc3RyaW5nIHJldDsKKworICAgIGlmICggIXBvaW50ZXJwKHMpICkKKyAgICAgICByZXR1cm4gIiI7CisgICAgCisgICAgaWYgKCFzZXApIHNlcCA9ICIsICI7CisgICAgaWYgKCFsYXN0c2VwKSBsYXN0c2VwID0gIiB1bmQgIjsKKworICAgIHN3aXRjaCAoc2l6ZW9mKHMpKSAgeworICAgICAgIGNhc2UgMDogcmV0PSIiOyBicmVhazsKKyAgICAgICBjYXNlIDE6IHJldD1zWzBdOyBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXQgPSBpbXBsb2RlKHNbMC4uPDJdLCBzZXApOworICAgICAgICAgICAgICByZXQgKz0gbGFzdHNlcCArIHNbPDFdOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitub21hc2sgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpIHsKKworICAgIC8vIFR5cHBydWVmdW5nOiBldHdhcyBhbmRlcmVzIGFscyBPYmpla3RlIG9kZXIgMCBzb2xsZW4gRmVobGVyIHNlaW4uCisgICAgaWYgKG9iICYmICFvYmplY3RwKG9iKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9uZXh0X3Jlc2V0KCk6IGdvdCAlLjIwTywgIgorICAgICAgICAgICAiZXhwZWN0ZWQgb2JqZWN0LlxuIixvYikpOworCisgICAgLy8gRGVmYXVsdG9iamVrdCBQTywgd2VubiAwIHVlYmVyZ2ViZW4uCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKK30KKworCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorI2RlZmluZSBNQVhMRU4gNTAwMDAKK25vbWFzayBpbnQgY29weV9maWxlKHN0cmluZyBzb3VyY2UsIHN0cmluZyBkZXN0KQoreworCisgIGludCBwdHI7CisgIHN0cmluZyBieXRlczsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoIXNpemVvZihzb3VyY2UpfHwhc2l6ZW9mKGRlc3QpfHxzb3VyY2U9PWRlc3R8fChmaWxlX3NpemUoc291cmNlKT09LTEpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksInJlYWRfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIixwcmV2aW91c19vYmplY3QoKSkpKQorICAgIHJldHVybiAxOworICBzd2l0Y2ggKGZpbGVfc2l6ZShkZXN0KSkKKyAgeworICBjYXNlIC0xOgorICAgIGJyZWFrOworICBjYXNlIC0yOgorICAgIGlmIChkZXN0WzwxXSE9Jy8nKSBkZXN0Kz0iLyI7CisgICAgZGVzdCs9ZWZ1bjo6ZXhwbG9kZShzb3VyY2UsIi8iKVs8MV07CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpIHJldHVybiAxOworICAgIGlmIChmaWxlX3NpemUoZGVzdCkhPS0xKSBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBkbworICB7CisgICAgYnl0ZXMgPSByZWFkX2J5dGVzKHNvdXJjZSwgcHRyLCBNQVhMRU4pOyBwdHIgKz0gTUFYTEVOOworICAgIGlmICghYnl0ZXMpIGJ5dGVzPSIiOworICAgIHdyaXRlX2ZpbGUoZGVzdCwgYnl0ZXMpOworICB9CisgIHdoaWxlKHNpemVvZihieXRlcykgPT0gTUFYTEVOKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisKKworLy8gIyMjIEVyc2F0emF1ZmxvZXN1bmcgaW4gU3RyaW5ncyAjIyMKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqcGFydHM7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKHN0ciwgIkBXRVtBLVNVXSpbMC05XSIpOworICBpID0gc2l6ZW9mKHBhcnRzKTsKKworICBpZiAoaT4xKSB7CisgICAgaW50IGosIHQ7CisgICAgY2xvc3VyZSAqbmFtZV9jbHM7CisKKyAgICB0ID0gaiA9IHNpemVvZihvYnMpOworCisgICAgbmFtZV9jbHMgID0gIGFsbG9jYXRlKGopOworICAgIHdoaWxlIChqLS0pCisgICAgICBpZiAob2JqZWN0cChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG9ic1tqXSk7CisgICAgICBlbHNlIGlmIChzdHJpbmdwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gb2JzW2pdOworCisgICAgd2hpbGUgKChpLT0gMik+MCkgeworICAgICAgaW50IG9iX25yOworICAgICAgLy8genUgZXJzZXR6ZW5kZXMgVG9rZW4gaW4gRmFsbCB1bmQgT2JqZWt0aW5kZXggYXVmc3BhbHRlbgorICAgICAgb2JfbnIgPSBwYXJ0c1tpXVs8MV0tJzEnOworICAgICAgaWYgKG9iX25yPDAgfHwgb2JfbnI+PXQpIHsKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigicmVwbGFjZV9wZXJzb25hbDogdXNpbmcgd3Jvbmcgb2JqZWN0IGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBvYl9ucikpOworICAgICAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICAgICAgfQorCisgICAgICAvLyBjYXN1cyBrYW5uIG1hbiBzY2hvbiBoaWVyIGVudHNjaGVpZGVuCisgICAgICBpbnQgY2FzdXM7CisgICAgICBzdHJpbmcgcGFydCA9IHBhcnRzW2ldOworICAgICAgc3dpdGNoIChwYXJ0WzNdKSB7CisgICAgICAgIGNhc2UgJ1InOiBjYXN1cyA9IFdFUjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1MnOiBjYXN1cyA9IFdFU1NFTjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOiBjYXN1cyA9IFdFTTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ04nOiBjYXN1cyA9IFdFTjsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBjb250aW51ZTsgLy8gcGFzc3Qgc2Nob24gamV0enQgbmljaHQgaW4gZGFzIEhhdXB0bXVzdGVyCisgICAgICB9CisKKyAgICAgIC8vIHVuZCBqZXR6dCBkaWUgZWluemVsbmVuIEtleXdvcmRzIG9obmUgZnVlaHJlbmRlcyAiQFdFIiwgYmVlbmRlbmRlIElkCisgICAgICBtaXhlZCB0bXA7CisgICAgICBzd2l0Y2ggKHBhcnRbMy4uPDJdKSB7CisgICAgICAgIGNhc2UgIlIiOiBjYXNlICJTU0VOIjogY2FzZSAiTSI6IGNhc2UgIk4iOiAgICAgICAgICAgICAgIC8vIE5hbWUKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cywgMSk7ICBicmVhazsKKyAgICAgICAgY2FzZSAiUlUiOiBjYXNlICJTU0VOVSI6IGNhc2UgIk1VIjogY2FzZSAiTlUiOiAgICAgICAgICAgLy8gdW5iZXN0aW1tdAorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzKTsgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVAiOiBjYXNlICJTU0VOUVAiOiBjYXNlICJNUVAiOiBjYXNlICJOUVAiOiAgICAgICAvLyBQcm9ub3VuCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVByb25vdW4oY2FzdXMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUUEiOiBjYXNlICJTU0VOUUEiOiBjYXNlICJNUUEiOiBjYXNlICJOUUEiOiAgICAgICAvLyBBcnRpY2xlCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICB0bXAgPSAoc3RyaW5nKXRtcC0+UXVlcnlBcnRpY2xlKGNhc3VzLCAxLCAxKTsKKyAgICAgICAgICBpZiAoc3RyaW5ncCh0bXApICYmICEodG1wWzwxXV4nICcpKSAKKyAgICAgICAgICAgIHRtcCA9IHRtcFswLi48Ml07ICAgICAgICAgICAgICAgIC8vIEV4dHJhLVNwYWNlIHdpZWRlciBsb2VzY2hlbgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVMiOiBjYXNlICJTU0VOUVBQTVMiOiBjYXNlICJNUVBQTVMiOiBjYXNlICJOUVBQTVMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlMiOiBjYXNlICJTU0VOUVBQRlMiOiBjYXNlICJNUVBQRlMiOiBjYXNlICJOUVBQRlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUyI6IGNhc2UgIlNTRU5RUFBOUyI6IGNhc2UgIk1RUFBOUyI6IGNhc2UgIk5RUFBOUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1QIjogY2FzZSAiU1NFTlFQUE1QIjogY2FzZSAiTVFQUE1QIjogY2FzZSAiTlFQUE1QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUCI6IGNhc2UgIlNTRU5RUFBGUCI6IGNhc2UgIk1RUFBGUCI6IGNhc2UgIk5RUFBGUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUCI6IGNhc2UgIlNTRU5RUFBOUCI6IGNhc2UgIk1RUFBOUCI6IGNhc2UgIk5RUFBOUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHdlbm4gdG1wIGVpbiBTdHJpbmcgd2FyLCB3ZWlzZW4gd2lyIGVzIGhpZXIgcGF1c2NoYWwgenUKKyAgICAgIGlmIChzdHJpbmdwKHRtcCkpCisgICAgICAgIHBhcnRzW2ldID0gdG1wOworCisgICAgICAvLyBhdWYgV3Vuc2NoIHdpcmQgbmFjaCBTYXR6ZW5kZW4gZ3Jvc3MgZ2VzY2hyaWViZW4KKyAgICAgIGlmIChjYXBzKQorICAgICAgICBzd2l0Y2ggKHBhcnRzW2ktMV1bPDIuLl0pIHsKKyAgICAgICAgICBjYXNlICIuICI6ICBjYXNlICIhICI6ICBjYXNlICI/ICI6CisgICAgICAgICAgY2FzZSAiLiI6ICAgY2FzZSAiISI6ICAgY2FzZSAiPyI6CisgICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKKyAgICAgICAgICBjYXNlICJcIiAiOiBjYXNlICJcIlxuIjoKKyAgICAgICAgICAgIHBhcnRzW2ldID0gY2FwaXRhbGl6ZShwYXJ0c1tpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICB9CisgIHJldHVybiBzdHI7Cit9CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorZGVwcmVjYXRlZCB2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighc3RyaW5ncChzdHIpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBleHRyYWN0KCk6ICVPIixzdHIpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oc3RyKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK2RlcHJlY2F0ZWQgdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFwb2ludGVycChhcnJheSkpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIHNsaWNlX2FycmF5KCk6ICVPIixhcnJheSkpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihhcnJheSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2RlcHJlY2F0ZWQgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZykgeworCisgIGlmIChwb2ludGVycChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLGl0ZW0pKTsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsdG9faW50KGl0ZW0pKSk7CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBtZW1iZXJfYXJyYXkoKTogJU8iLGFycmF5c3RyaW5nKSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCisKKy8vIFRoZSBkaWdpdCBhdCB0aGUgaSd0aCBwb3NpdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluICdpJy4KK3N0cmluZyBjb3VudF90YWJsZSA9CisgICAgIjAxMTIxMjIzMTIyMzIzMzQxMjIzMjMzNDIzMzQzNDQ1MTIyMzIzMzQyMzM0MzQ0NTIzMzQzNDQ1MzQ0NTQ1NTYiOworaW50IGJyb2tlbl9jb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICBpbnQgaSwgcmVzOworICAgIGlmKCAhc3RyaW5ncChzKSB8fCAhKGk9c2l6ZW9mKHMpKSApIHJldHVybiAwOworICAgIGZvciggOyBpLS0+MDsgKSB7CisgICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCisgICAgICAgIHJlcyArPSBjb3VudF90YWJsZVsoc1tpXS0nICcpJjYzXS0nMCc7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQoraW50IGNvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Cit9CisjZW5kaWYKKworCisvLyAqIFRlaWxlIGF1cyBlaW5lbSBBcnJheSBlbnRmZXJuZW4gKioqIE9CU09MRVRFCitkZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQoreworICBpZiAodG88ZnJvbSkKKyAgICB0byA9IGZyb207CisgIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvUkVBRE1FIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9SRUFETUUKQEAgLTAsMCArMSwyMCBAQAorc2ltdWxfZWZ1biAKKy0tLS0tLS0tLS0gCitEYXMgc2ltdWxfZWZ1biBPYmpla3QgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4gYmVudXR6dCBkaWUgRGF0ZWllbgoraW4gL3NlY3VyZS9zaW11bF9lZnVuLgorSW0gVmVyemVpY2huaXMgL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlIGlzdCBlaW5lIFNpY2hlcmhlaXRza29waWUgdm9uIGFsbGVuIAorRGF0ZWllbiBpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCisKK0ZhbGxzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMgbmljaHQgbGFkYmFyIGlzdCwgd2lyZCAKKy9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYWxzIEVyc2F0eiB2ZXJzdWNodC4gV2VubiBhdWNoIGRhcworbmljaHQgbGFkYmFyIGlzdCwgZXJmb2xndCBlaW4gU2h1dGRvd24gZGVzIE11ZHMuCisKK0JlaSBBZW5kZXJ1bmdlbiBzb2xsdGUgX3p1ZXJzdF8gZGllIG5vcm1hbGUgc2ltdWwgZWZ1biBlZGl0aWVydCB1bmQKK2Fuc2NobGllc3NlbmQgemVyc3RvZXJ0L2VudGxhZGVuIHdlcmRlbiwgd29yYXVmaGluIHNpZSBpbXBsaXppdCBkdXJjaCBkZW4KK0RyaXZlciB1bmQgTWFzdGVyIG5ldWdlbGFkZW4gd2lyZC4gSXN0IGRpZXMgZXJmb2xncmVpY2ggdW5kIGRpZSBuZXVlCitzaW11bF9lZnVuIGxhZXVmdCAoZXJzdCBkYW5uISkga29waWVydCBtYW4gZGllIERhdGVpZW4gYXVzIAorL3NlY3VyZS9zaW11bF9lZnVuIG5hY2ggL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlLgorCitEaWUgRGF0ZWllbiBoaWVyIHNpbmQgbWl0IEF1c25haG1lIGRlciBzaW11bF9lZnVuLmMgc2VsYnN0IF9uaWNodF8gZGF6dSAKK2dlZGFjaHQsIGdlbGFkZW4genUgd2VyZGVuLgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9jb21tLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNTk4YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2NvbW0uYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKy8vIFNlbmRldCBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSB1bmQgcm9vbSBzZWxiZXIgZHVyY2ggQXVmcnVmIHZvbgorLy8gUmVjZWl2ZU1zZygpLgordmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3QgKmV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBvcmlnaW4pCit7CisgIGlmIChzdHJpbmdwKHJvb20pKQorICAgIHJvb209bG9hZF9vYmplY3Qocm9vbSk7CisgIAorICBvcmlnaW4gfHw9IHByZXZpb3VzX29iamVjdCgpOworICBvYmplY3QgKmRlc3QgPSBleGNsdWRlID8gYWxsX2ludmVudG9yeShyb29tKSAtIGV4Y2x1ZGUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ludmVudG9yeShyb29tKTsKKworICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7CisgIHJvb20tPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKK30KKworc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQoreworICAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOworfQorCit2YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApeworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgKnBmYWRlOworCisgICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCisgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhd2hlcmUgKQorICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPQorICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKKyAgICBlbHNlCisgICAgICAgcGZhZGUgPSB3aGVyZTsKKworICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOworICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCisjZGVmaW5lIENBVF9NQVhfTElORVMgNTAKK3ZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaW50IG1vcmU7CisKKyAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICBzdGFydCA9IDE7CisKKyAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7CisgICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7CisgICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOworICAgIH0KKworICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7CisgICAgaWYgKCF0eHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIGlmIChtb3JlKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKKworICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Cit9CisjdW5kZWYgQ0FUX01BWF9MSU5FUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KKyNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAordmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOworICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5CisgICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgorICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQorICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOworICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgorICAgIGlmICghc3RyaW5ncCh0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCisgICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQorICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4dCA9ICIiOworICAgIH0KKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICByZXR1cm4gMTsKK30KKyN1bmRlZiBUQUlMX01BWF9CWVRFUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsNDM0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKK21peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCit7CisgICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisgICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7CisKKyAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIGlmKGd0aWNrcykKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIGlmIChuZXh0X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIGlmIChwcmV2X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOworICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgorICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdoaWNoOworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKKyAgICAgICAgICAgICAgICB3aGljaCA9ICIiOworICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2god2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RBVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICogcmVzdWx0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgorICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBlbmFibGVfY29tbWFuZHMoKQorICogYW5kIGRpc2FibGVfY29tbWFuZHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZW5hYmxlX2NvbW1hbmRzKQorCit2b2lkIGVuYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAxKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIob2IpOworfQorCisjZW5kaWYKKworI2lmICEgX19FRlVOX0RFRklORURfXyhkaXNhYmxlX2NvbW1hbmRzKQorCit2b2lkIGRpc2FibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2hhc2guYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvaGFzaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorCitkZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KKworZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvbGl2aW5ncy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKKworI2RlZmluZSBjbGVhbl9sb2cocykKKy8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7CisKK3ByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7CisgIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKKyAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKKyAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0CisgIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKKyAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZworICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCisgICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbworICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCisgICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCit7CisgICAgbWl4ZWQgKnJldDsKKworICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKKworICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKK30KKwordm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQoreworICBzdHJpbmcgb2xkOworICBtaXhlZCBhOworICBpbnQgaTsKKworICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAorICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQorICB7CisgICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOworICAgIH0KKyAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7CisgICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKKyAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7CisgICAgICB9CisgICAgfQorICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7CisgICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7CisgICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLworICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7CisgICAgICAgYVtpXSA9IG9iajsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7CisgIH0KK30KKwordm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCit7CisgIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3ZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKK3sKKyAgc3RyaW5nIGxpdm5hbWU7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQorICB7CisgICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7CisgICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIF9zZXRfbmV0ZGVhZCgpCit7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOworfQorCit2b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCit7CisgIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKK29iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCit7CisgIGludCBpOworICBzdHJpbmcgdWlkOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworIAorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXRkZWFkW3VpZF07Cit9CisKK3N0cmluZyAqZHVtcF9uZXRkZWFkKCkKK3sKKyAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKK30KKworb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7CisgIG1peGVkICphLCByOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7CisgICAgaWYgKG1lbWJlcihyLDApPj0wKQorICAgICAgci09KHswfSk7CisgICAgaWYgKCFzaXplb2YocikpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKKyAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgeworICAgICAgICAgciA9IGFbPGldOworICAgICAgICAgYVs8aV0gPSBhWzBdOworICAgICAgICAgcmV0dXJuIGFbMF0gPSByOworICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIGxpdmluZyhyKSAmJiByOworfQorCitvYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKK3sKKyAgbWl4ZWQgcjsKKworICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICByLT0oezB9KTsKKyAgZWxzZQorICAgIGlmIChvYmplY3RwKHIpKQorICAgICAgcj0oe3J9KTsKKyAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHI7Cit9CisKK29iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgeworICBvYmplY3QgKm9ianM7CisgIG1peGVkIHJlczsKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCFzdHJpbmdwKHV1aWQpKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworCisgIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7CisgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCisgICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKKyAgICAgIHJlcy09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7CisgICAgfQorICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KKyAgICBpZiAoIXNpemVvZihyZXMpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9ianMgPSByZXM7CisgICAgcmVzID0gb2Jqc1swXTsKKyAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCisgICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgeworICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgeworICAgICAgICAgcmVzID0gb2Jqc1s8aV07CisgICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07CisgICAgICAgICBvYmpzWzBdID0gcmVzOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKKyAgICB9CisgICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgorICB9CisgIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAorICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7CisKKyAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCisgIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCisgIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIC8vIGVuZGxpY2ggZ2VmdW5kZW4KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQoreworICAgIG1peGVkIG1hdGNoOworCisgICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQorICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7CisKKyAgICBtYXRjaCAtPSAoezB9KTsKKworICAgIGlmICggc2l6ZW9mKG1hdGNoKSApeworICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKKyAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQorICAgICAgICAgICAgICA+IDA7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7CisgICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKK3ZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKK3sKKyAgICBpbnQgaSwgczsKKyAgICBtaXhlZCBtYXRjaCwgKnVzZXI7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKKyAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKKworICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCisgICAgICAgcmV0dXJuIHN0cjsKKworICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7CisgICAgcyA9IHNpemVvZihzdHIpOworICAgIG1hdGNoID0gMDsKKworICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQorICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQorICAgICAgICAgICBpZiAoIG1hdGNoICkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCisgICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07CisKKyAgICBpZiAoICFtYXRjaCApCisgICAgICAgcmV0dXJuIC0yOworCisgICAgcmV0dXJuIG1hdGNoOworfQorCittaXhlZCAqZHVtcF9saXZpbmdzKCkKK3sKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Cit9CisKKy8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgorcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKK3sKKyAgaW50IGksIGo7CisgIG1peGVkIGE7CisKKyAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCisgIHsKKyAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQorICAgIHsKKyAgICAgIGEtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7CisgICAgfQorICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCisgICAgeworICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKKyAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7CisgIH0KKyAgaWYgKGxlZnQpCisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7CisgIGVsc2UKKyAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqczsKKyAgb2JqZWN0IG9iOworCisgIHM9bV9pbmRpY2VzKG5ldGRlYWQpOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCisgICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKKyAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Cit9CisKK3ByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7CisgICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCisgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICA4MAorICAgICAgICAgICAgICAgICApOworICB9CisgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKK30KKworI3VuZGVmIGNsZWFuX2xvZworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIG9iamVjdF9pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgX19FRlVOX0RFRklORURfXyhkcml2ZXJfaW5mbykgLyogTmV3ZXIgdmVyc2lvbiBpcyB0aGVyZSAqLworCisjaW5jbHVkZSA8b2JqZWN0aW5mby5oPgorI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK21peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQsIHZhcmFyZ3MgaW50KiBpbmRleCkKK3sKKyAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgIGlmIChzaXplb2YoaW5kZXgpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBvYmplY3RfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBvYmplY3RfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgT0lORk9fQkFTSUM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JQl9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lCX0hFQVJUX0JFQVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSVNfV0laQVJEXSAgICAgICAgID0gMDsgICAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX0VOQUJMRV9DT01NQU5EU10gICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfQ0xPTkVdICAgICAgICAgICAgID0gZWZ1bjo6Y2xvbmVwKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfREVTVFJVQ1RFRF0gICAgICAgID0gMDsgICAvKiBOb3QgcG9zc2libGUgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUFBFRF0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9PTkNFX0lOVEVSQUNUSVZFXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFU0VUX1NUQVRFXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1dJTExfQ0xFQU5fVVBdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTEFNQkRBX1JFRkVSRU5DRURdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBTUJEQV9SRUZFUkVOQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU0hBRE9XXSAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKSAmJiAxOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVBMQUNFRF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX1JFU0VUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElNRV9PRl9SRUZdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRUZdICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JQl9HSUdBVElDS1NdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElDS1NdICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUF9OVU1dICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJPR19TV0FQUEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1ZBUl9TV0FQUEVEXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9WQVJfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05BTUVdICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTE9BRF9OQU1FXSAgICAgICAgID0gZWZ1bjo6bG9hZF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJFVl9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9DTEVBTlVQXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfQ0xFQU5VUF9USU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19QT1NJVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lQX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfTkVYVF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QUkVWXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BPU10gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QT1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lNX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUkVGXSAgICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OQU1FXSAgICAgICAgICAgICAgID0gZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUFJPR19TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fRlVOQ1RJT05TXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0ZVTkNUSU9OU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1ZBUklBQkxFU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9WQVJJQUJMRVNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9TVFJJTkdTXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19EQVRBXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfVE9UQUxdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOSEVSSVRFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9JTkhFUklURURdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX1NJWkVdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fREFUQV9TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9EQVRBX1NJWkVdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0lOSEVSSVRdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fSU5IRVJJVCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0NMT05FXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fQ0xPTkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19TSEFET1ddICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX1NIQURPVyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkNMVURFU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOQ0xVREVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0hBUkVfVkFSSUFCTEVTXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFSRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpbmRleFswXTsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3Igb2JqZWN0X2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTMyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaW5wdXRfcGVuZGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pbnB1dF9wZW5kaW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitvYmplY3QgcXVlcnlfaW5wdXRfcGVuZGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSU5QVVRfUEVORElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzRlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCisgKiBxdWVyeV9pcF9udW1iZXIoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Cit9CisKKy8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKK3N0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQoreworICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKKyAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKKyAgeworICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKKyAgfQorICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Cit9CisKK3N0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQoreworICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCisgICAgICBvYj1fcXVlcnlfaXBfbnVtYmVyKG9iKTsKKyAgcmV0dXJuIChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmhvc3Qob2IpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JmMzkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xpbWl0cygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9saW1pdHMpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCit2YXJhcmdzIGludCogcXVlcnlfbGltaXRzKGludCBkZWYpCit7CisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKGRlZiA/IERDX0RFRkFVTFRfUlVOVElNRV9MSU1JVFMgOiBESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpAQCAtMCwwICsxLDE2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbG9hZF9hdmVyYWdlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xvYWRfYXZlcmFnZSkKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3N0cmluZyBxdWVyeV9sb2FkX2F2ZXJhZ2UoKQoreworICAgIHJldHVybiBlZnVuOjpzcHJpbnRmKCIlLjJmIGNtZHMvcywgJS4yZiBjb21wIGxpbmVzL3MiLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfQ09NTUFORFMpLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfTElORVMpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpAQCAtMCwwICsxLDM1IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbXVkX3BvcnQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbXVkX3BvcnQpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworaW50IHF1ZXJ5X211ZF9wb3J0KHZhcmFyZ3MgaW50KnxvYmplY3QqIGFyZ3MpCit7CisgICAgaWYoIXNpemVvZihhcmdzKSAmJiBlZnVuOjp0aGlzX3BsYXllcigpICYmIGVmdW46OmludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh0aGlzX3BsYXllcigpLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHF1ZXJ5X211ZF9wb3J0XG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBlZnVuOjpvYmplY3RwKGFyZ3NbMF0pICYmIGVmdW46OmludGVyYWN0aXZlKGFyZ3NbMF0pKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhhcmdzWzBdLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgaW50cChhcmdzWzBdKSkKKyAgICB7CisgICAgICAgIGludCogcG9ydHMgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpOworICAgICAgICBpZihhcmdzWzBdIDwgLTEgfHwgYXJnc1swXSA+PSBzaXplb2YocG9ydHMpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3IoZWZ1bjo6c3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X211ZF9wb3J0KCk6IHZhbHVlICVkIG91dCBvZiByYW5nZS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgZWxzZSBpZihhcmdzWzBdID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihwb3J0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwb3J0c1thcmdzWzBdXTsKKyAgICB9CisKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKVswXTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ODI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworaW50IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNjljMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3Nub29wKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgb2JqZWN0IF9xdWVyeV9zbm9vcChvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBvYmplY3QgcHJldiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGVmdW46OnNldF90aGlzX29iamVjdChwcmV2KTsKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc25vb3ApCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX1NOT09QX05FWFQpOworI2Vsc2UKKyAgICByZXR1cm4gZWZ1bjo6cXVlcnlfc25vb3Aob2IpOworI2VuZGlmCit9CisKK25vbWFzayBvYmplY3QgcXVlcnlfc25vb3Aob2JqZWN0IHdobykgeworICBvYmplY3Qgc25vb3BlcjsKKworICBzbm9vcGVyPV9xdWVyeV9zbm9vcCh3aG8pOworICBpZiAoIXNub29wZXIpIHJldHVybiAwOworICBpZiAocXVlcnlfd2l6X2dycChzbm9vcGVyKT5xdWVyeV93aXpfZ3JwKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpICYmCisgICAgICBJU19BUkNIKHNub29wZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHNub29wZXI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk5NWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X2hlYXJ0X2JlYXQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK2ludCBzZXRfaGVhcnRfYmVhdChpbnQgZmxhZykKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBpbnQgaGIgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisKKyAgICBpZiAoIWZsYWcgPT0gIWhiKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjY2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBUaGVzZSBhcmUgdGhlIHNwZWNpYWwgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgYXJlIGFjdGl2YXRlZCB3aXRoCisgKiBzZXRfaXNfd2l6YXJkKCkuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgb2JqZWN0LgorICogQWxzbyBzZXRfaXNfd2l6YXJkKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxheWVyIG9iamVjdCwKKyAqIG5vdCBhcyBhbiAoc2ltdWwtKWVmdW4uCisgKi8KKworI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworLyogaXNfd2l6YXJkOgorICogIDE6IGhhcyBhY3Rpb25zLAorICogIDA6IG5ldmVyIGhhZCBhY3Rpb25zLAorICogLTE6IGhhZCBhY3Rpb25zIG9uY2UuCisgKi8KK3ByaXZhdGUgbm9zYXZlIGludCBpc193aXphcmQ7CisKK3ByaXZhdGUgaW50IGRyaXZlcl9tYWxsb2Moc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighc2l6ZW9mKHN0cikpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0MpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc3RyID09ICJleHRzdGF0cyIpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgIHdyaXRlKCJkb25lXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQoreworICAgIGludCBvcHQ7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKHN0ciB8fCAiIikKKyAgICB7CisgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICBjYXNlICIgdGFibGVzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICBjYXNlICIgc3dhcCI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNldF9pc193aXphcmQodmFyYXJncyA8b2JqZWN0fGludD4qIGFyZ3MpCit7CisgICAgaW50IG9sZHZhbCA9IGlzX3dpemFyZDsKKworICAgIGlmKCFzaXplb2YoYXJncykpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gZmV3IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAxIHRvIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoYXJnc1swXSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiT25seSBzZXRfaXNfd2l6YXJkIGZvciB0aGUgY3VycmVudCBvYmplY3Qgc3VwcG9ydGVkXG4iKTsKKyAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUaGUgY3VycmVudCBvYmplY3QgbXVzdCBiZSB0aGlzX3BsYXllcigpIGZvciBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAyIHRvIHNldF9pc193aXphcmQoKVxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhYXJnc1sxXSkKKyAgICB7CisgICAgICAgIGlmKGlzX3dpemFyZCA+IDApCisgICAgICAgICAgICBpc193aXphcmQgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZihzaXplb2YoYXJncykgPT0gMiAmJiBhcmdzWzFdPDApCisgICAgeworICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIWlzX3dpemFyZCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9tYWxsb2MsICJtYWxsb2MiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfZHVtcGFsbG9iaiwgImR1bXBhbGxvYmoiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfb3BjZHVtcCwgIm9wY2R1bXAiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfc3RhdHVzLCAic3RhdHVzIiwgQUFfTk9TUEFDRSk7CisgICAgICAgIH0KKyAgICAgICAgaXNfd2l6YXJkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkdmFsID4gMDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfcHJvbXB0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9wcm9tcHQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK3ZhcmFyZ3Mgc3RyaW5nfGNsb3N1cmUgc2V0X3Byb21wdChzdHJpbmd8Y2xvc3VyZXxpbnQgcHJvbXB0LCBvYmplY3Qgb2IpCit7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBtaXhlZCBvbGRwcm9tcHQgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJQ19QUk9NUFQpOworCisgICAgaWYoIWludHAocHJvbXB0KSkKKyAgICAgICAgZWZ1bjo6Y29uZmlndXJlX2ludGVyYWN0aXZlKG9iLCBJQ19QUk9NUFQsIHByb21wdCk7CisKKyAgICByZXR1cm4gb2xkcHJvbXB0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NoYWRvdy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwOGM3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NoYWRvdy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zaGFkb3dpbmcoKQorICogYW5kIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIHNoYWRvdygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zaGFkb3dpbmcpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitvYmplY3QgcXVlcnlfc2hhZG93aW5nKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKTsKK30KKworcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICAgIGlmKGZsYWcpCisgICAgeworICAgICAgICBvYmplY3Qgc2hhZG93ZXIgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoMSk7CisgICAgICAgIGVmdW46OnNldF90aGlzX29iamVjdChzaGFkb3dlcik7CisKKyAgICAgICAgaWYgKGVmdW46OnNoYWRvdyhvYikpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8oc2hhZG93ZXIsIE9JX1NIQURPV19QUkVWKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfTkVYVCk7Cit9CisjZWxzZQorcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgcmV0dXJuIGVmdW46OnNoYWRvdyhvYiwgZmxhZyk7Cit9CisjZW5kaWYKKworCitwdWJsaWMgb2JqZWN0IHNoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBvYmplY3QgcmVzID0gZnVuY2FsbCgjJ19zaGFkb3csb2IsIGZsYWcpOworICBpZiAoZmxhZykKKyAgICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5SZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgdm9pZCBfdW5zaGFkb3coKSB7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICBlZnVuOjp1bnNoYWRvdygpOworfQorCitwdWJsaWMgdm9pZCB1bnNoYWRvdygpIHsKKyAgZnVuY2FsbCgjJ191bnNoYWRvdyk7CisgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlVucmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjg3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKQEAgLTAsMCArMSwxOTk1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2ltdWxfZWZ1bi5jIC0tIHNpbXVsIGVmdW4ncworLy8KKy8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93LG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCisvLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KKy8vIHdpcmQsIHNpbmQgbm9jaCBrZWluZSBJbmNsdWRlLVBmYWRlIGRhIC4uLgorCisjZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCisjZGVmaW5lIEFTTk9PUExPR0ZJTEUgIkFSQ0gvU05PT1AiCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3N5cy9zbm9vcGluZy5oIgorI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICIvc3lzL3dpemxpc3QuaCIKKyNpbmNsdWRlICIvc3lzL2VycS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy9jb250YWluZXIuaCIKKyNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKKyNpbmNsdWRlICIvc3lzL3RlbG5ldC5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0aW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKKyNpbmNsdWRlICIvc3lzL3N0cmluZ3MuaCIKKyNpbmNsdWRlICIvc3lzL3RpbWUuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9ub3RpZnlfZmFpbC5oIgorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisjaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pOwordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcChvYmplY3QgbWUsIG9iamVjdCB5b3UpOwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopOworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpOworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKTsKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpOworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7Cit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKTsKKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCit2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCit2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2ludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOworI2VuZGlmCisKKy8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCisjaW5jbHVkZSBfX0RJUl9fImRlYnVnX2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18iZW5hYmxlX2NvbW1hbmRzLmMiCisjaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKKyNpbmNsdWRlIF9fRElSX18ib2JqZWN0X2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfZWRpdGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lucHV0X3BlbmRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaXBfbmFtZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbG9hZF9hdmVyYWdlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X211ZF9wb3J0LmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfc25vb3AuYyIKKyNpbmNsdWRlIF9fRElSX18ic2V0X2hlYXJ0X2JlYXQuYyIKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQorI2luY2x1ZGUgX19ESVJfXyJzZXRfcHJvbXB0LmMiCisjZW5kaWYKKyNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCisjaW5jbHVkZSBfX0RJUl9fImxpdmluZ3MuYyIKKyNpbmNsdWRlIF9fRElSX18iY29tbS5jIgorCisjZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCisjZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgUE8gICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgwKQorI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKKyNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKKyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQorCittaXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKKworI2lmZGVmIElPU1RBVFMKK3N0cnVjdCBpb3N0YXRfcyB7CisgIHN0cmluZyBvbmFtZTsKKyAgaW50IHRpbWU7CisgIGludCBzaXplOworfTsKK21peGVkIHNhdmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwgMCkgfSk7CittaXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7CisvL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgcmVhZGZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKworbWl4ZWQgX19faW9zdGF0cyhpbnQgdHlwZSkgeworICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBzYXZlb19zdGF0OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OworLyogICAgY2FzZSAzOgorICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiByZWFkZmlsZV9zdGF0OworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBsb2dfc3RhdDsKKyAgICAgICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGllIHNpbXVsX2VmdW4gZW50c29yZ2VuIGtvZW5uZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICAgIHJldHVybiAiRHUgZGFyZnN0IGRhcyBzaW11bF9lZnVuIE9iamVrdCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCit7CisgICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQorICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgorICAgICAgICAmJiAoKHByZXZpb3VzX29iamVjdCgpICE9IG9iCisgICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgorICAgICAgICAgICAgICAgJiYgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKSAhPSBvYgorICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKKworICAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKKworICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Cit9CisKKwordm9pZCBfX191cGRtYXN0ZXIoKQoreworICAgIG9iamVjdCBvYjsKKworICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQorICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgdXNlIG9mIF9fX3VwZG1hc3RlcigpISIpOworCisgICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOworICAgIGZvcmVhY2goc3RyaW5nIGZpbGU6IAorICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7CisgICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKKyAgICAgICBlZnVuOjpkZXN0cnVjdChvYik7CisgICAgfQorICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKKyAgICB3cml0ZSgiZG9uZS5cbkxvYWRpbmcgYWdhaW4gLi4uICIpOworICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOworCisgICAgd3JpdGUoImRvbmUuXG4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSkgeworICBtaXhlZCByZXQ7CisKKyAgaWYocmV0ID0gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+Y291bnRyeShudW0gfHwgaXApKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHJldHVybiAiPz8/IjsKK30KKworCisvLyAqIFNub29wZW4gdW5kIHdhcyBkYXp1Z2Vob2VydAorc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKK3sKKyAgb2JqZWN0ICp1OworICBpbnQgaTsKKworICBmb3IgKGk9c2l6ZW9mKHU9dXNlcnMoKSktMTtpPj0wO2ktLSkKKyAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQorICAgICAgcmV0dXJuIHVbaV07CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cmluZyBMY3V0KHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOworfQorCitub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCit7CisgICAgaW50IHJldDsKKyAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKKworICAgIGlmKCAhb2JqZWN0cChtZSkgfHwgbWUgPT0geW91IHx8ICFQTyApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbm9vcGVyMCA9IGZpbmRfc25vb3BlZChtZSk7CisKKyAgICAgaWYoeW91KXsKKyAgICAgICAgaWYgKCBQTyAhPSBtZSAmJiBxdWVyeV93aXpfZ3JwKG1lKSA+PSBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgorICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoc25vb3BlcikgPj0gcXVlcnlfd2l6X2dycChtZSkgKXsKKyAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKKworICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKKworICAgICAgICAgICAgd2hpbGUgKCBzbm9vcGVyMyA9IGludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICl7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzbm9vcGVyMi0+bmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKKyAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOworCisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQorICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDAwMDAgKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoc25vb3BlcikKKyAgICAgICAgICAgICAgIGlmICggIW1lLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApeworICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UtPm5hbWUoV0VSKSwgc25vb3Blci0+bmFtZShXRU0pICk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKKworICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICYmIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSl7CisgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoeW91KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCByZXQgJiYgcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQorICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIGlmICggKG1lID09IFBPIHx8CisgICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKKyAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID09IHF1ZXJ5X3dpel9ncnAobWUpICYmCisgICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiAwOworfQorCisKKworLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQorc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7CisgIGludCBzLCB0OworICBzdHJpbmcgKnN0cnM7CisKKyAgaWYgKCFzdHJpbmdwKHN0cikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMSB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsc3RyKSk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKGRlbCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMiB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsZGVsKSk7CisgIH0KKyAgaWYoZGVsID09ICIiKQorICAgIHJldHVybiAoe3N0cn0pOworICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOworICB0PXNpemVvZihzdHJzKS0xOworICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOworICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOworICBpZihzPD10KQorICAgIHJldHVybiBzdHJzW3MuLnRdOworICByZXR1cm4gKHt9KTsKK30KKworaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgeworICBtaXhlZCAqdjsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoc2l6ZW9mKHY9Z2V0X2RpcihwYXRoLEdFVERJUl9EQVRFUykpKSByZXR1cm4gdlswXTsKKyAgcmV0dXJuKDApOyAvL3NvbnN0Cit9CisKKy8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKKyAgbWl4ZWQgKnN0OworCisgIGZpbGU9Ii9sb2cvIitmaWxlOworICBmaWxlPWltcGxvZGUoKGVmdW46OmV4cGxvZGUoZmlsZSwiLyIpLSh7Ii4uIn0pKSwiLyIpOworLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOworICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQorICAgICAgICAgICAgICAidmFsaWRfd3JpdGUiLGZpbGUsZ2V0ZXVpZChQTyksImxvZ19maWxlIixQTykpCisgICAgICByZXR1cm4gMDsKKyAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCisgICAgICBzaXplb2Yoc3QgPSBnZXRfZGlyKGZpbGUsMikgKSAmJiBzdFswXSA+PSAoc2l6ZV90b19icmVha3xNQVhfTE9HX1NJWkUpKSkKKyAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLworICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOworfQorCisvLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgoraW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpIHsKKyAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Cit9CisKKyNpZmRlZiBfX0FMSVNUU19fCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCittaXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBpLGo7CisKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgeworICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQorICAgICAgcmV0dXJuIGFsaXN0OworICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgfQorICBpID0gYXNzb2Moa2V5LGFsaXN0WzBdKTsKKyAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBhbGlzdD1hbGlzdFswLi5dOworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7Cit9CisKKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IHBvcykKK21peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKK3sKKyAgaW50IGo7CisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCit9CisjZW5kaWYgLy8gX19BTElTVFNfXworCisvLyAqIEdlcm1hbiB2ZXJzaW9uIG9mIGN0aW1lKCkKKyNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKKyNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAorICAgICAgICAgICAgICAgICAiU2VwIiwiT2t0IiwiTm92IiwiRGV6In0pCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKKyAgCisgIGlmICh3YW5uID09IGR0aW1lX2NhY2hlWzBdKQorICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7CisKKyAgaW50ICpsdCA9IGxvY2FsdGltZSh3YW5uKTsKKyAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCisgICAgICBsdFtUTV9ZRUFSXSxsdFtUTV9IT1VSXSwgbHRbVE1fTUlOXSwgbHRbVE1fU0VDXSk7Cit9CisKKy8vIHdlbm4gc3RyZnRpbWUgaW0gRHJpdmVyIG5pY2h0IGV4aXN0aWVydCwgaXN0IGRpZXMgaGllciBlaW4gQWxpYXMgYXVmIGR0aW1lKCksCisvLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKKy8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KKyNpZiAhX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKK3ZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7CisgIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQorICAgIHJldHVybiBkdGltZShjbG9jayk7CisgIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoZm10KTsKKyAgCisgIHJldHVybiBkdGltZSh0aW1lKCkpOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCisKKy8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZworbm9tYXNrIGludCBzaHV0ZG93bihzdHJpbmcgcmVhc29uKQoreworICBzdHJpbmcgbmFtZTsKKyAgc3RyaW5nIG9ibmFtZTsKKyAgc3RyaW5nIG91dHB1dDsKKworICBpZiAoIXJlYXNvbikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKKyAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvb2JqL3NodXQiICkKKyAgeworICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQorICB7CisgICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOworICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCisgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpKyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlciFcbiIpOworICB9CisgIGVsc2UKKyAgICBuYW1lPSJBTk9OWU1PVVMiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworICBvdXRwdXQ9bmFtZTsKKyAgaWYgKG9ibmFtZSAmJiBuYW1lIT1vYm5hbWUpIG91dHB1dD1vdXRwdXQrIiAoIitvYm5hbWUrIikiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpeworICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKKyAgICBvdXRwdXQ9ZHRpbWUodGltZSgpKSsiOiAiK291dHB1dDsKKyAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgICBlZnVuOjpzaHV0ZG93bigpOworICAgIHJldHVybiAxOworICB9CisgIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7CisgIG91dHB1dCs9IiAgICBHcnVuZDogIityZWFzb247CisgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICBlZnVuOjpzaHV0ZG93bigpOworICByZXR1cm4gMTsKK30KKworLy8gKiBsb3dlcmNoYXIKKworaW50IGxvd2VyY2hhcihpbnQgY2hhcikgeworICBpZiAoY2hhcjwnQScgfHwgY2hhcj4nWicpIHJldHVybiBjaGFyOworICByZXR1cm4gY2hhciszMjsKK30KKworLy8gKiB1cHBlcnN0cmluZworCitzdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHMpCit7CisjaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQorICByZXR1cm4odXBwZXJfY2FzZShzKSk7CisjZWxzZQorICBpbnQgaTsKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOworICByZXR1cm4gczsKKyNlbmRpZgorfQorCisvLyAqIGxvd2Vyc3RyaW5nCisKK3N0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKK3sKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Cit9CisKKworLy8gKiBHRCB2ZXJzaW9uCitzdHJpbmcgdmVyc2lvbigpCit7CisgIHJldHVybiBfX1ZFUlNJT05fXzsKK30KKworLy8gKiBicmVha19zdHJpbmcKKy8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCitwcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKKyAgaW50IGxlbj1zaXplb2Yocyk7CisgIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKKworICAvLyByZWluZSBMZWVyemVpbGVuLCBkaXJla3QgenVydWVja2dlYmVuCisgIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKKyAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCisgIGludCBzdGFydF9zcGFjZXMgPSBsZW4gLSBzaXplb2YodHJpbW1lZCk7CisKKyAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKKyAgLy8gZGVyIGxldHp0ZSBrcmllZ3Qga2VpbmUgU3BhY2VzCisgIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOworICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgorICBpZiAoIXdvcmRfY291bnQpCisgICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKKworICBpbnQgc3BhY2VfY291bnQgPSB3aWR0aCAtIGxlbjsKKworICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKKyAgLy8gQW56LldvZXJ0ZXIgbWl0IFp1c2F0ei1TcGFjZQorICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKKyAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCisgIGZvcmVhY2ggKGludCBwb3MgOiByZXN0KSB3b3Jkc1twb3NdKz0iICI7CisgIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Cit9CisKKy8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQorLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgorcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBibG9ja19zdHJpbmcoc3RyaW5nIHMsIGludCB3aWR0aCwgaW50IGZsYWdzKSB7CisgIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0CisgIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgorICAvLyBCVFc6IFdlbm4gIUJTX0xFQVZFX01ZX0xGUywgaGF0IGRlciBBdWZydWZlciBiZXJlaXRzIGFsbGUgXG4gZHVyY2ggIiAiCisgIC8vIGVyc2V0enQuCisgIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQorICAgICAgJiYgIShmbGFncyAmIEJTX05PX1BBUklOREVOVCkpCisgIHsKKyAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7CisgIH0KKworICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCisgIC8vIFplaWxlbmJyZWl0ZSkgbWl0IEZ1ZWxsemVpY2hlbiBhdWYsIHdlbm4gc2llIE5JQ0hUIG1pdCBcbiB1bWdlYnJvY2hlbgorICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgorICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcworICAvLyB3aWVkZXIgcnVlY2tnYWVuZ2lnIHp1IG1hY2hlbi4KKyAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKKworICBzdHJpbmcgKnRtcD1leHBsb2RlKHMsICJcbiIpOworICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKKyAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0CisgIC8vIHdvcmRlbi4gQlRXOiBEaWUgbGV0enRlIFplaWxlIGVuZGV0IHUuVS4gbm9jaCBuaWNodCBtaXQgZWluZW0gXG4gKGJ6dy4KKyAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KKyAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCisgIGlmIChzaXplb2YodG1wKSA+IDEpCisgICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKKyAgICAgICsgIlxuIiArIHRtcFs8MV07CisKKyAgcmV0dXJuIHM7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKK3sKKyAgICBpZiAoICFzIHx8IHMgPT0gIiIgKSByZXR1cm4gIiI7CisKKyAgICBpZiAoICF3ICkgdz03ODsKKworICAgIGlmKCBpbnRwKGluZGVudCkgKQorICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKKworICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOworCisgICAgaWYgKGluZGVudGxlbj53KSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICBpbmRlbnRsZW4sdykpOworICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCisgICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOworCisgICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCisgICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7CisgCisgICAgc3RyaW5nIHByZWZpeD0iIjsKKyAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKKyAgICAgIGlmIChpbmRlbnRsZW4rc2l6ZW9mKHMpID4gdyB8fCAKKyAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKKyAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7CisgICAgICAgaW5kZW50PShmbGFncyAmIEJTX05PX1BBUklOREVOVCkgPyAiIiA6ICIgIjsKKyAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgeworICAgICAgLyoKKyAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIiApOworICAgICAgKi8KKyAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKKyAgICB9CisgICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOworCisgICAgaWYgKCAhaW5kZW50bGVuICkgcmV0dXJuIHByZWZpeCArIHM7CisgICAgCisgICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OworICAgICAgCisgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAorICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKKyAgICAgIC8qCisgICAgICAgc3RyaW5nICpidWY7CisKKyAgICAgICBidWYgPSBleHBsb2RlKCBzLCAiXG4iICk7CisgICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7CisgICAgICAqLworfQorCisvLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KKworbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7CisgIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOworfQorCisvLyAqIHRpbWVzCitpbnQgbGFzdF9yZWJvb3RfdGltZSgpCit7CisgIHJldHVybiBfX0JPT1RfVElNRV9fOworfQorCitpbnQgZmlyc3RfYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIDcwMTUxNzYwMDsKK30KKworaW50IGV4aXN0X2RheXMoKQoreworICByZXR1cm4gKCgodGltZSgpLWZpcnN0X2Jvb3RfdGltZSgpKS84NjQwKSs1KS8xMDsKK30KKworLy8gKiB1cHRpbWUgOikKK3N0cmluZyB1cHRpbWUoKQoreworICBpbnQgdDsKKyAgaW50IHRtcDsKKyAgc3RyaW5nIHM7CisKKyAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKKyAgcz0iIjsKKyAgaWYgKHQ+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CisgIGlmICh0Pj0zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7CisgIGlmICh0PjYwKQorICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CisgIHJldHVybiBzK3NwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOworfQorCisvLyAqIFdhcyB0dW4gYmVpICdkYW5nbGluZycgbGZ1bi1jbG9zdXJlcyA/Cit2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKKyAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Cit9CisKKy8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgorCisjaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCitub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCitub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCitub21hc2sgdm9pZCBleHBvcnRfdWlkKG9iamVjdCBvYikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKKy8vICogSmV0enQgYXVjaCBjbG9zdXJlcworaW50IHByb2Nlc3NfZmxhZzsKKworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKK3sKKyAgaWYgKHByb2Nlc3NfZmxhZz4wKQorICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7CisgIGVsc2UgcmV0dXJuKDApOworfQorCitwcml2YXRlIG5vbWFzayBzdHJpbmcgX3Byb2Nlc3Nfc3RyaW5nKHN0cmluZyBzdHIsb2JqZWN0IHBvKSB7CisgICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKK30KKworbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKK3sKKyAgc3RyaW5nIHRtcCwgZXJyOworICBpbnQgZmxhZzsgCisKKyAgaWYgKCBjbG9zdXJlcChzdHIpICkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgICAgcmV0dXJuIGZ1bmNhbGwoc3RyKTsKKyAgfQorICBlbHNlIGlmIChzdHI9PTApCisgICAgICByZXR1cm4oKHN0cmluZylzdHIpOworICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKKyAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKKyAgfQorCisgIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcHJvY2Vzc19mbGFnPXRpbWUoKTsKKworICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOworCisgIGlmICggIWZsYWcgKQorICAgIHByb2Nlc3NfZmxhZz0wOworCisgIGlmIChlcnIpIHsKKyAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihlcnIpOworICB9CisgIHJldHVybiB0bXA7Cit9CisKKy8vICdta2RpciAtcCcgLSBlcnpldWd0IGVpbmUga29tcGxldHRlIEhpZXJhcmNoaWUgdm9uIFZlcnplaWNobmlzc2VuLgorLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQorLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KKy8vIFdpcmZ0IGVpbmVuIEZlaGxlciwgd2VubiBkYXMgYW5nZWJlbmUgVmVyemVpY2huaXMgbmljaHQgYWJzb2x1dCBpc3QhCitwdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7CisgIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgorICBpZiAoc3Ryc3RyKGRpciwgIi8iKSAhPSAwKQorICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKKyAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCisgIGlmIChkaXJbPDFdPT0nLycpCisgICAgICBkaXIgPSBkaXJbMC4uPDJdOworCisgIGludCBmc3RhdCA9IGZpbGVfc2l6ZShkaXIpOworICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCisgIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCisgICAgcmV0dXJuIDE7CisgIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgorICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQorICAgIHJldHVybiAwOworICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCisgIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCisgIGlmIChzdHJyc3RyKGRpciwiLyIpPT0wKSB7CisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworICB9CisKKyAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCisgIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKKyAgLy8gdW50ZXIgZGVyIEFubmFobWUsIGRhc3MgZGllIHNpbXVsX2VmdW4uYyBtaXQgaWhyZXIgcm9vdCBpZCB3YXMgd2lsbC4KKworICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCisgIC8vIGlzdCwgZGFubiBrb2VubmVuIHdpciBqZXR6dCBtaXQgbWtkaXIgZGFzIHRpZWZzdGUgVmVyemVpY2huaXMgYW5sZWdlbgorICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKK30KKworCisvLyAqIFByb3BlcnRpZXMgZ2dmcy4gbWl0c3BlaWNoZXJuCittaXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQoreworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIG1hcHBpbmcgc2F2ZTsKKyAgbWl4ZWQgaW5kZXgsIHJlczsKKyAgaW50IGk7CisKKyAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KKyAgaWYgKCghc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKSAmJiAKKyAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCisgICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7CisgIH0KKworICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKKyAgeworICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXBwaW5nIHByb3BlcnRpZXMgd2l0aG91dCBTQVZFIGZsYWchCisgICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7aS0tKQorICAgIHsKKyAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQorICAgICAgeworICAgICAgIHNhdmVbaW5kZXhbaV1dID0gcHJvcGVydGllc1tpbmRleFtpXV07CisgICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CisgICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmCisgICAgICAgICAgICAgICAgICAgICh+KFNFVE1OT1RGT1VORHxRVUVSWU1OT1RGT1VORHxRVUVSWUNBQ0hFRHxTRVRDQUNIRUQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBzYXZlID0gKFtdKTsKKworICAvLyBzYXZlIG9iamVjdCEKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOworICAvLyBmb3JtYXQ6IHdpZSBkZWZpbmllcnQgaW4gY29uZmlnLmgKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIGVsc2UKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgZWxzZQorICAgICAgc3RhdC0+c2l6ZW9mKHJlcyk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyAgc2F2ZW9fc3RhdFsxXVtzYXZlb19zdGF0WzBdXSA9IHN0YXQ7CisgIHNhdmVvX3N0YXRbMF0gPSAoc2F2ZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHNhdmVvX3N0YXRbMV0pOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiByZXM7Cit9CisKKy8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCitpbnQgcmVzdG9yZV9vYmplY3Qoc3RyaW5nIG5hbWUpCit7CisgIGludCByZXN1bHQ7CisgIG1peGVkIGluZGV4OworICBtaXhlZCBzYXZlOworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIGludCBpOworICBjbG9zdXJlIGNsOworCisgIC8vIGdldCBhY3R1YWwgcHJvcGVydHkgc2V0dGluZ3MgKGJ5IGNyZWF0ZSgpKQorICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisvLyAgREVCVUcoc3ByaW50ZigiUkVTVE9SRSAlT1xuIixuYW1lKSk7CisgIC8vIHJlc3RvcmUgb2JqZWN0CisgIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7CisgIC8vJykpCisgIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCisgIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KKyAgc2F2ZSA9IChtaXhlZClwcmV2aW91c19vYmplY3QoKS0+X2dldF9zYXZlX2RhdGEoKTsKKyAgaWYobWFwcGluZ3Aoc2F2ZSkpCisgIHsKKyAgICBpbmRleCA9IG1faW5kaWNlcyhzYXZlKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV1dID0gc2F2ZVtpbmRleFtpXV07CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7CisgICAgfQorICB9CisgIGVsc2UgcHJvcGVydGllcyA9IChbXSk7CisKKyAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCisgIGZ1bmNhbGwoCisgICAgICAgICAgYmluZF9sYW1iZGEoCisgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcGVydGllcyIsJ2FyZ30pKSwvLycpCisgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgLy9kZWJ1Z19tZXNzYWdlKCJyZXN0b3JlbzogIityZXN0b3Jlb19zdGF0WzBdKyJcbiIpOworICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OworCisgIHJlc3RvcmVvX3N0YXRbMF0gPSAocmVzdG9yZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHJlc3RvcmVvX3N0YXRbMV0pOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gKiBIQiBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KK2ludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKK30KKworLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCit7CisgIGludCBsZXY7CisKKyAgbGV2PXF1ZXJ5X3dpel9sZXZlbCh3aXopOworICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKKyAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKKyAgaWYgKGxldj49QVJDSF9MVkwpIHJldHVybiBBUkNIX0dSUDsKKyAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOworICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOworICBpZiAobGV2Pj1TUEVDSUFMX0xWTCkgcmV0dXJuIFNQRUNJQUxfR1JQOworICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKKyAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7CisgIGlmIChsZXY+PUxFQVJORVJfTFZMKSByZXR1cm4gTEVBUk5FUl9HUlA7CisgIHJldHVybiBTRUVSX0dSUDsKK30KKworbWl4ZWQgKndpemxpc3RfaW5mbygpCit7CisgIGlmIChBUkNIX1NFQ1VSSVRZIHx8ICFleHRlcm5fY2FsbCgpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOworICByZXR1cm4gMDsKK30KKworLy8gKiB3aXpsaXN0IGF1c2dlYmVuCit2YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSB7CisKKyAgaWYgKCFuYW1lKQorICB7CisgICAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgorICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKKworICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgorICB3bCA9IHNvcnRfYXJyYXkod2wsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikKKyAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKKworICAvLyBTdW1tZSB1ZWJlciBhbGxlIEtvbW1hbmRvcyBlcm1pdHRlbG4uCisgIGludCB0b3RhbF9jbWQsIGk7CisgIGludCBwb3M9LTE7CisgIGZvcmVhY2gobWl4ZWQgZW50cnkgOiB3bCkKKyAgeworICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107CisgICAgaWYgKGVudHJ5W1dMX05BTUVdID09IG5hbWUpCisgICAgICBwb3MgPSBpOworICAgICsraTsKKyAgfQorCisgIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKKyAgICByZXR1cm47CisKKyAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKKyAgICAgIHdsID0gd2xbMC4uMTAwXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisgIC8vIHVtIG5hbWUgaGVydW0gc2NobmVpZGVuCisgIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA8PSAyMSkKKyAgICAgIHdsID0gd2w7CisgICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKKyAgICAgIHdsID0gd2xbcG9zLTEwLi5wb3MrMTBdOworICAgIGVsc2UgaWYgKHBvcyA8PTIxKQorICAgICAgd2wgPSB3bFswLi4yMF07CisgICAgZWxzZSBpZiAocG9zID49IHNpemVvZih3bCkgLSAyMSkKKyAgICAgIHdsID0gd2xbPDIxLi5dOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKworICB3cml0ZSgiXG5XaXphcmQgdG9wIHNjb3JlIGxpc3RcblxuIik7CisgIGlmICh0b3RhbF9jbWQgPT0gMCkKKyAgICB0b3RhbF9jbWQgPSAxOworICBwcmludGYoIiUtMjBzICUtNnMgJS0zcyAlLTE3cyAlLTZzICUtNnMgJS02c1xuIiwKKyAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOworICBmb3JlYWNoKG1peGVkIGU6IHdsKQorICB7CisgICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKKyAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCisgICAgICAgICAgZVtXTF9DT1NUXSAvIDEwMDAsIGVbV0xfVE9UQUxfR0lHQUNPU1RdLAorICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQorICAgICAgICAgICk7CisgIH0KKyAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOworfQorCisKKy8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKKworLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgorcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7CisgICAgcmV0dXJuIHBvaW50ZXJwKGNhbGxfb3V0KSA/IGNhbGxfb3V0WzBdIDogMDsKK30KKworcHJpdmF0ZSB2b2lkIF9zYW1lX29iamVjdCggb2JqZWN0IG9iLCBtYXBwaW5nIG0gKSB7CisgIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCisgIGlmICggbVtvYl0gKQorICAgIG1bb2JdICs9ICh7IG9iIH0pOworICBlbHNlCisgICAgbVtvYl0gPSAoeyBvYiB9KTsgCit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCisvLyBCbHVlcHJpbnQpIGhhYmVuLCBhbHNvIGFsbGUgQ2xvbmVzIGRlciBCUCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbi4KKy8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCitwcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKKyAgc3RyaW5nIHBhdGg7CisgIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47CisKKyAgcGF0aCA9IGxvYWRfbmFtZShrZXkpOworCisgIGlmICggbVtwYXRoXSApCisgICAgbVtwYXRoXSArPSBvYnM7CisgIGVsc2UKKyAgICBtW3BhdGhdID0gb2JzOworfQorCisvLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KK3ByaXZhdGUgaW50IF90b29fbWFueSggbWl4ZWQga2V5LCBtYXBwaW5nIG0sIGludCBpICkgeworICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOworfQorCisvLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQorLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCisvLyB3aXJkIGF1ZiBkZXIgRWJlbmUgYWJlciBudXIgZWluIE9iamVrdCBpbiBkZXIgRmVobGVybWVsZHVuZyBlcndhZWhudC4KK3ByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7CisgICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47CisgICAgLy8gQXJyYXkgbWl0IHVuaXF1ZSBFaW50cmFlZ2UgZXJ6ZXVnZW4uCisgICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOworICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKKyAgICAvLyBhdWYgZGVyIEViZW5lIGRpcmVrdCBzY3JvbGx0LCBkZXIgYmFja3RyYWNlIHZlcmZ1ZWdiYXIgaXN0IChpbQorICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKKyAgICAvLyBsYWV1ZnQuCisgICAgY2F0Y2goIGVmdW46OnJhaXNlX2Vycm9yKCAgICAgICAgICAgCisgICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICBzaXplb2Yob2JzKSwgb2JqZWN0X25hbWUob2JzWzwxXSkgKSApO3B1Ymxpc2gpOworICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCisgICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOworfQorCisvLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAorLy8gc2luZCBkYWJlaSBuaWNodCB1bmlxdWUuCitwcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgeworICBzdHJpbmcgdWlkOworCisgIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKKyAgICByZXR1cm47CisKKyAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOworCisgIGlmICggbVt1aWRdICkKKyAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQorICBlbHNlCisgICAgbVt1aWRdID0gb2JzOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7CisKKyAgICAvLyBCZWkgPjYwMCBDYWxsb3V0cyBhbGxlIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgMzAgQ2FsbG91dHMgbGF1ZmVuCisgICAgLy8gaGFiZW4uCisgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCisgICAgICAgICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCisgICAgeworICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgorICAgICAgCisgICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KKyAgICAgICBjYWxsX291dHMgPSBtYXAoIGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfY2FsbF9vdXRfb2JqICk7CisgICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOworICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOworICAgICAgIC8vIE1hc3RlciBuaWNodCBncmlsbGVuLi4uCisgICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7CisgICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgbWFwcGluZyByZXMgPSBmaWx0ZXJfaW5kaWNlcyggb2JqZWN0bWFwLCAjJ190b29fbWFueSwgb2JqZWN0bWFwLCAyOSApOworICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiBqZXdlaWxzIGRhcyBnbGVpY2hlIE9iamVrdCkuCisgICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAorICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCisgICAgICAgICAgICAgICJvYmplY3QgWyVPXS4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCisgICAgICAgLy8gT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyA1MCBDYWxsb3V0cyBsYXVmZW4gaGFiZW4gLSB1bmQKKyAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKKyAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQorICAgICAgIC8vIGRpZXNlIE9iamVrdGUgX3p1c2FtbWVuXyBtZWhyIGFscyA1MCBDYWxsb3V0cyBoYWJlbiEKKyAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7CisgICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0CisgICAgICAgICAgIC8vIG1laHIgZHJpbiwgZGEgc2llIGRvcnQgYWxzIEtleXMgdmVyd2VuZGV0IHd1cmRlbi4KKyAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7CisgICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCisgICAgICAgICAgIC8vIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKKyAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBwYXRobWFwLCAjJ190b29fbWFueS8qJyovLCBwYXRobWFwLCA1MCApOworICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCisgICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KKyAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgorICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cworICAgICAgICAgICAvLyBlaW5lciBVSUQgenVzYW1tZW5nZXphZWhsdC4KKyAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKKyAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCisgICAgICAgICAgIGlmIChlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gMTAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCisgICAgICAgICAgICAgIC8vIHp1c2FtbWVuc29ydGllcmVuLiBaZXJzdG9lcnRlIENsb25lcyBmaWx0ZXIgX3NhbWVfdWlkKCkKKyAgICAgICAgICAgICAgLy8gcmF1cy4KKyAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBwYXRobWFwLCAjJ19zYW1lX3VpZCwgJnVpZG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKKyAgICAgICAgICAgICAgLy8gSW4gcmVzIG51biBVSURzIGFscyBLZXlzIHVuZCBBcnJheXMgdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KKyAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCisgICAgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCB1aWRtYXAsICMnX3Rvb19tYW55LCB1aWRtYXAsIDEwMCApOworICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAorICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KKyAgICAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOworICAgIHJldHVybjsKK30KKworbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKKyAgCisgIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOworICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7CisKKyAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCisgIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCisgIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHBvKSkgPj0gQVJDSF9MVkwKKyAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKKyAgICAgIHJldHVybiBjb2k7CisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgeworICAgICAgICAgICAgICBpZiAocG9pbnRlcnAoYXJyKSAmJiBhcnJbMF09PXBvKQorICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7CisgIH0KK30KKworLy8gKiBadSBlaW5lciBjbG9zdXJlIGRhcyBPYmpla3QsIGFuIGRhcyBzaWUgZ2VidW5kZW4gaXN0LCBzdWNoZW4KK21peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgeworICByZXR1cm4KKyAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KKyAgICAgIDAgOgorICAodG9fb2JqZWN0KGMpIHx8IC0xKTsKK30KKworLy8gKiBXaXIgd29sbGVuIG51ciBFSU4gQXJndW1lbnQgLi4uIGF1c3NlcmRlbSBjaGVja3MgZnVlciBkZW4gTmV0enRvdGVucmF1bQordmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQoreworICBvYmplY3QgcG8sdG1wOworCisgIHBvPXByZXZpb3VzX29iamVjdCgpOworICBpZiAoIXdoZXJlKQorICB7CisgICAgd2hlcmU9d2hhdDsKKyAgICB3aGF0PXBvOworICB9CisgIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAorICAgICAgIChvYmplY3RwKHdoZXJlKSAmJiB3aGVyZT09ZmluZF9vYmplY3QoTkVUREVBRF9ST09NKSkpICYmCisgICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCisgIHsKKyAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgd2hhdC0+cmVtb3ZlKCk7CisgICAgICBpZiAod2hhdCkgZGVzdHJ1Y3Qod2hhdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsaXZpbmcod2hhdCkgfHwgaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOworICB9CisgIHRtcD13aGF0OworICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgorICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgorICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCisgICAgICAvLworICAgICAgLy8gVGlhbWFrCisgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKKyAgaWYgKHRtcD13aGF0KQorICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Cit9CisKKwordm9pZCBzdGFydF9zaW11bF9lZnVuKCkgeworICBtaXhlZCAqaW5mbzsKKworICAvLyBGYWxscyBub2NoIG5pY2h0IGdldGFuLCBleHRyYV93aXppbmZvIGluaXRpYWxpc2llcmVuCisgIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQorICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKKworICBJbml0TGl2aW5nRGF0YShpbmZvKTsKKworICBzZXRfbmV4dF9yZXNldCgxMCk7IC8vIGRpcmVrdCBtYWwgYXVmcmFldW1lbgorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisgIENsZWFuTGl2aW5nRGF0YSgpOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCitpbnQgYWJzb2x1dGVfaGJfY291bnQoKSB7CisgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Cit9CisjZW5kaWYKKwordm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKK3sKKyAgc3RyaW5nIHBhdGg7CisgIG9iamVjdCBvYmo7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGlmICghSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybjsKKyAgaWYgKG9iamVjdHAodGFyZ2V0KSkKKyAgeworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOworICAgIHJldHVybjsKKyAgfQorICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCisgICAgICAhY2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkgKQorICB7CisgICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYixvYmopOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKKyAgaW50IGk7CisgIG1peGVkICphOworCisgIGlmICghTE9SRF9TRUNVUklUWSkKKyAgICByZXR1cm47CisgIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKKyAgeworICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgYSA9IHdpemxpc3RfaW5mbygpOworICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc8LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOworICBybShmaWxlKTsKKyAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzcHJpbnRmKCIlLTExczogZXZhbD0lLThkIGNtZHM9JS02ZCBIQnM9JS01ZCBhcnJheT0lLTVkIG1hcHBpbmc9JS03ZFxuIiwKKyAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKKyAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7CisKKyAgaWYoIW9iamVjdHAob2IpKQorICAgIG9iPXByZXZpb3VzX29iamVjdCgpOworICAvLyBXZW5uIGVpbiBPYmpla3QgZ2VzdWNodCB3aXJkOiBBbGxlIEVudnMgZGllc2VzIE9iamVrdHMgZXJtaXR0ZWxuIHVuZAorICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgorICBpZihvYmplY3RwKHdoYXQpKSB7CisgICAgb2JqZWN0ICplbnZzPWFsbF9lbnZpcm9ubWVudCh3aGF0KTsKKyAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAorICAgIC8vIGVudGhhbHRlbi4KKyAgICBpZiAoIXBvaW50ZXJwKGVudnMpKSByZXR1cm4gMDsKKyAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7CisgIH0KKyAgLy8gc29uc3Qgd2lyZHMgdGV1cmVyLCB1ZWJlciBhbGxlIE9iamVrdGUgaW0gKGRlZXApIEludiBsYXVmZW4gdW5kIHBlciBpZCgpCisgIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCisgIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCisgIGVsc2UgaWYgKHN0cmluZ3Aod2hhdCkpIHsKKyAgICAgIGludCBjbnQ7CisgICAgICBzdHJpbmcgbmV3d2hhdDsKKyAgICAgIGlmKHNzY2FuZih3aGF0LCIlcyAlZCIsbmV3d2hhdCxjbnQpIT0yKQorICAgICAgIGNudD0xOworICAgICAgZWxzZQorICAgICAgIHdoYXQ9bmV3d2hhdDsKKyAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKKyAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKKyAgICAgICAgICAgcmV0dXJuIGludm9iOworICAgICAgfQorICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgorICAgICAgICAgIkV4cGVjdGVkIFwib2JqZWN0XCIgb3IgXCJzdHJpbmdcIiwgZ290ICUuNTBPLlxuIiwKKyAgICAgICAgIHdoYXQpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworbWFwcGluZyBkdW1wX2lwX21hcHBpbmcoKQoreworICByZXR1cm4gMDsKK30KKworbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQoreworICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKKyAgcmV0dXJuOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQoreworICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCisgICAgICB8fCAhQVJDSF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCisgIHsKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKHN0cik7CisgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKCk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChtaXhlZCBuZiwgaW50IHByaW8pIHsKKyAgb2JqZWN0IHBvLG9sZG87CisgIGludCBvbGRwcmlvOworICAKKyAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCisgICAgICAgICAiQXJndW1lbnQgd2FzOiAlLjUwTy4uLlxuIixuZikpOworICB9CisKKyAgLy8gZmFsbHMgZWluIE9iamVrdCBiZXJlaXRzIG5lbiBub3RpZnlfZmFpbCgpIHNldHp0ZSwgUHJpb3JpdGFldGVuIGFic2NoYWV0emVuCisgIC8vIHVuZCB2ZXJnbGVpY2hlbi4KKyAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKKyAgICBpZiAoIXByaW8pIHsgICAgICAgCisgICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJworICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCisgICAgICAgIHByaW89TkZfTkxfT1dOOworICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKKyAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgICBlbHNlIGlmICgoaW50KXBvLT5Jc1Jvb20oKSkKKyAgICAgICAgcHJpbz1ORl9OTF9ST09NOworICAgICAgZWxzZQorICAgICAgICBwcmlvPU5GX05MX1RISU5HOworICAgIH0KKyAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KKyAgICBpZiAob2xkbz09UEwpCisgICAgICBvbGRwcmlvPU5GX05MX09XTjsKKyAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCisgICAgICBvbGRwcmlvPU5GX05MX0xJVklORzsKKyAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQorICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOworICAgIGVsc2UKKyAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7CisgIH0KKyAgZWxzZSAvLyB3ZW5uIGVzIG5vY2gga2VpbiBOb3RpZnlfZmFpbCBnaWJ0OgorICAgIG9sZHByaW89TkZfTkxfTk9ORTsKKworICAvL3ZlcmdsZWljaGVuIHVuZCBnZ2YuIHNldHplbgorICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAorICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgZWZ1bjo6bm90aWZ5X2ZhaWwobmYpOworICB9CisKKyAgcmV0dXJuOworfQorCit2b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQoreworICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKKyAgLy9kZXMgbGV0enRlbiBub3RpZnlfZmFpbCgpIHp1IGVybWl0dGVsbgorICBvYmplY3QgbzsKKyAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgorICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBlZnVuOjpub3RpZnlfZmFpbChzdHIpOworICByZXR1cm47Cit9CisKK3N0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQoreworICBpbnQgaSxjaCxtYXh1bml0LGR1bW15OworICBzdHJpbmcgKnBhcnRzLCBmbXQ7CisKKyAgaW50IHNlY3MgPSB6ZWl0OworICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKKyAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7CisgIGludCBkYXlzID0gKHplaXQvODY0MDApOworICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKKyAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOworICBpbnQgYWJiciA9IDA7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQorICAgIHsKKyAgICBjYXNlICd4JzogY2FzZSAnWCc6CisgICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKKyAgICAgICAvLyBOTyBicmVhayAhCisgICAgY2FzZSAnbic6IGNhc2UgJ04nOgorICAgICAgIG1heHVuaXQgfD0gMzE7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6IGNhc2UgJ1cnOgorICAgICAgIG1heHVuaXQgfD0gMTU7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgIG1heHVuaXQgfD0gNzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgbWF4dW5pdCB8PSAzOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICBtYXh1bml0IHw9IDE7CisgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OworICBpZiggbWF4dW5pdCAmIDggKSBkYXlzICU9IDc7CisgIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OworICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOworICBpZiggbWF4dW5pdCApIHNlY3MgJT0gNjA7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgaWYoIGNoPT0neCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J3cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdtJzsKKyAgICAgIGVsc2UgY2ggPSAncyc7CisgICAgfQorICAgIGVsc2UgaWYoIGNoPT0nWCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J1cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdNJzsKKyAgICAgIGVsc2UgY2ggPSAnUyc7CisgICAgfQorICAgIAorICAgIHN3aXRjaCggY2ggKQorICAgIHsKKyAgICAgIGNhc2UgJ24nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1vbnRocyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOworICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2gnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGhvdXJzICk7IGJyZWFrOworICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdOJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKKyAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1cnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAod2Vla3M9PTEpID8gIldvY2hlIiA6ICJXb2NoZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJkIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ00nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobWlucz09MSkgPyAiTWludXRlIiA6ICJNaW51dGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAicyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgIHBhcnRzW2ldID0gIiUiOworICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Cit9CisKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCit7CisgIHN0cmluZyBlcnI7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgbTsKKyAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/CisgIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQorICAgICAgY2F0Y2goZGVzdHJ1Y3Qob2IpO3B1Ymxpc2gpOworICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7CisgIGlmIChlcnIpCisgIHsKKyAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKKyAgcmV0dXJuIG07Cit9CisKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKK3sKKyAgaW50ICpsZXZlbDsKKyAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCisgIC8venVydWVja2dlYmVuLiBaZXJzdG9lcnRlIE9iamVrdGUgKFNlbGJzdHplcnN0b2VyZXIpIGZ1ZWhyZW4genVyIFJ1ZWNrZ2FiZQorICAvL3ZvbiAwLgorICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKKyAgLy93ZW5uIGVzIGtlaW5lbiBJbnRlcmFjdGl2ZSBnaWJ0LiBEaWUgMCBmdWVocnQgZGFubiB3aWUgYmVpIHplcnN0b2VydGVuCisgIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCisgIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KKyAgbGV2ZWw9bWFwKGNhbGxlcl9zdGFjaygxKSxmdW5jdGlvbiBpbnQgKG9iamVjdCBjYWxsZXIpCisgICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKKyAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOworICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCisgICAgICB9ICk7CisgIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCit9CisKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQoreworICBzdHJpbmcgZXVpZDsKKworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSkgLy8gRXMgbXVzcyBlaW5lbiBpbnRlcmFjdGl2ZSBnZWJlbgorICAgICByZXR1cm4gMDsKKyAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIC8vIHVlYmVyIGFsbGUgQ2FsbGVyIGl0ZXJpZXJlbi4gV2VubiBlaW5lcyBkYXZvbiBlaW5lIGFuZGVyZSBldWlkIGhhdCBhbHMKKyAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KKyAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgorICBmb3JlYWNoKG9iamVjdCBjYWxsZXI6IGNhbGxlcl9zdGFjaygpKSB7CisgICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAorICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQorICAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgorfQorCisvLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KKy8vIERhcyBzb2xsIGRhenUgZGllbmVuLCBkYXNzIGFsbGUgZ2dmLiBlaW4gRU9SIGFtIFByb21wdGVuZGUga3JpZWdlbi4uLgorLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKK3ZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkICphcnI7CisgICAgaW50IGk7CisKKyAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKKyAgICAvLyB2b3Jrb21tdC4uLgorICAgIGlmICggZmxhZ3MmSU5QVVRfUFJPTVBUICkgeyAgICAKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCisgICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncywgIiIgfSkgKyBhcmdzOworICAgIH0KKworICAgIC8vIEFycmF5cyBnZWdlbiBmbGF0dGVuIHF1b3Rlbi4KKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKKyAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQorICAgICAgICAgICBhcnJbaV0gPSBxdW90ZShhcnJbaV0pOworCisgICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2VmdW46OmlucHV0X3RvLyonKi8gfSkgKyBhcnIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOworfQorLy8jZW5kaWYKKworbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCisvLyBlcmhvZWh0IGRhcyBMaWNodGxldmVsIGVpbmVzIE9iamVrdHMgdW0gaQorLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKK3sKKyAgICBvYmplY3Qgb2IsICppbnY7CisgICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7CisKKyAgICBpZiAoIShvYj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOyAvLyBvaG5lIGRhcyBnZWh0cyBuaWNodC4KKworICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgorICAgIGlmIChpIT0wKSBvYi0+U2V0UHJvcChQX0xJR0hULCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpK2kpOworCisgICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCisgICAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCk7Cit9CisKKworcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgICAgIHJldHVybiAiIjsKKworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIuQiLCAiYWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIsQiLCAiQWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIt8iLCAic3MiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7CisKKyAgICByZXR1cm4gc3RyOworfQorCisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKK3sKKyAgICBzdHJpbmcgcmV0OworCisgICAgaWYgKCAhcG9pbnRlcnAocykgKQorICAgICAgIHJldHVybiAiIjsKKyAgICAKKyAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKKyAgICBpZiAoIWxhc3RzZXApIGxhc3RzZXAgPSAiIHVuZCAiOworCisgICAgc3dpdGNoIChzaXplb2YocykpICB7CisgICAgICAgY2FzZSAwOiByZXQ9IiI7IGJyZWFrOworICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGltcGxvZGUoc1swLi48Ml0sIHNlcCk7CisgICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBxdWVyeV9uZXh0X3Jlc2V0KG9iamVjdCBvYikgeworCisgICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KKyAgICBpZiAob2IgJiYgIW9iamVjdHAob2IpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCisgICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7CisKKyAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworfQorCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisjZGVmaW5lIE1BWExFTiA1MDAwMAorbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCit7CisKKyAgaW50IHB0cjsKKyAgc3RyaW5nIGJ5dGVzOworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmICghc2l6ZW9mKHNvdXJjZSl8fCFzaXplb2YoZGVzdCl8fHNvdXJjZT09ZGVzdHx8KGZpbGVfc2l6ZShzb3VyY2UpPT0tMSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwicmVhZF9maWxlIixwcmV2aW91c19vYmplY3QoKSkpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQorICB7CisgIGNhc2UgLTE6CisgICAgYnJlYWs7CisgIGNhc2UgLTI6CisgICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKKyAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpPT0tMikgcmV0dXJuIDE7CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOworICBkZWZhdWx0OgorICAgIGlmICghcm0oZGVzdCkpIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGRvCisgIHsKKyAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47CisgICAgaWYgKCFieXRlcykgYnl0ZXM9IiI7CisgICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7CisgIH0KKyAgd2hpbGUoc2l6ZW9mKGJ5dGVzKSA9PSBNQVhMRU4pOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKworCisvLyAjIyMgRXJzYXR6YXVmbG9lc3VuZyBpbiBTdHJpbmdzICMjIwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgeworICBpbnQgaTsKKyAgc3RyaW5nICpwYXJ0czsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7CisgIGkgPSBzaXplb2YocGFydHMpOworCisgIGlmIChpPjEpIHsKKyAgICBpbnQgaiwgdDsKKyAgICBjbG9zdXJlICpuYW1lX2NsczsKKworICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7CisKKyAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7CisgICAgd2hpbGUgKGotLSkKKyAgICAgIGlmIChvYmplY3RwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKKyAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBvYnNbal07CisKKyAgICB3aGlsZSAoKGktPSAyKT4wKSB7CisgICAgICBpbnQgb2JfbnI7CisgICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCisgICAgICBvYl9uciA9IHBhcnRzW2ldWzwxXS0nMSc7CisgICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgeworICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJyZXBsYWNlX3BlcnNvbmFsOiB1c2luZyB3cm9uZyBvYmplY3QgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iX25yKSk7CisgICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgICAgICB9CisKKyAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KKyAgICAgIGludCBjYXN1czsKKyAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07CisgICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKKyAgICAgICAgY2FzZSAnUic6IGNhc3VzID0gV0VSOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6IGNhc3VzID0gV0VOOyAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKKyAgICAgIH0KKworICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKKyAgICAgIG1peGVkIHRtcDsKKyAgICAgIHN3aXRjaCAocGFydFszLi48Ml0pIHsKKyAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOworICAgICAgICBjYXNlICJSVSI6IGNhc2UgIlNTRU5VIjogY2FzZSAiTVUiOiBjYXNlICJOVSI6ICAgICAgICAgICAvLyB1bmJlc3RpbW10CisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRQSI6IGNhc2UgIlNTRU5RQSI6IGNhc2UgIk1RQSI6IGNhc2UgIk5RQSI6ICAgICAgIC8vIEFydGljbGUKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOworICAgICAgICAgIGlmIChzdHJpbmdwKHRtcCkgJiYgISh0bXBbPDFdXicgJykpIAorICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUyI6IGNhc2UgIlNTRU5RUFBNUyI6IGNhc2UgIk1RUFBNUyI6IGNhc2UgIk5RUFBNUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVAiOiBjYXNlICJTU0VOUVBQTVAiOiBjYXNlICJNUVBQTVAiOiBjYXNlICJOUVBQTVAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQorICAgICAgaWYgKHN0cmluZ3AodG1wKSkKKyAgICAgICAgcGFydHNbaV0gPSB0bXA7CisKKyAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgorICAgICAgaWYgKGNhcHMpCisgICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkgeworICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKKyAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKKyAgICAgICAgICBjYXNlICIuXG4iOiBjYXNlICIhXG4iOiBjYXNlICI/XG4iOgorICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgorICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCitkZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFzdHJpbmdwKHN0cikpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIGV4dHJhY3QoKTogJU8iLHN0cikpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihzdHIpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXBvaW50ZXJwKGFycmF5KSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKGFycmF5KTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorZGVwcmVjYXRlZCBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKSB7CisKKyAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsaXRlbSkpOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyx0b19pbnQoaXRlbSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKKworLy8gVGhlIGRpZ2l0IGF0IHRoZSBpJ3RoIHBvc2l0aW9uIGlzIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gJ2knLgorc3RyaW5nIGNvdW50X3RhYmxlID0KKyAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7CitpbnQgYnJva2VuX2NvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIGludCBpLCByZXM7CisgICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7CisgICAgZm9yKCA7IGktLT4wOyApIHsKKyAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KKyAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCitpbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgcmV0dXJuKGJyb2tlbl9jb3VudF9iaXRzKHMpKTsKK30KKyNlbmRpZgorCisKKy8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKK2RlcHJlY2F0ZWQgbWl4ZWQgKmV4Y2x1ZGVfYXJyYXkobWl4ZWQgKmFycixpbnQgZnJvbSxpbnQgdG8pCit7CisgIGlmICh0bzxmcm9tKQorICAgIHRvID0gZnJvbTsKKyAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9SRUFETUUgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL1JFQURNRQpAQCAtMCwwICsxLDIwIEBACitzaW11bF9lZnVuIAorLS0tLS0tLS0tLSAKK0RhcyBzaW11bF9lZnVuIE9iamVrdCAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biBiZW51dHp0IGRpZSBEYXRlaWVuCitpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCitJbSBWZXJ6ZWljaG5pcyAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUgaXN0IGVpbmUgU2ljaGVyaGVpdHNrb3BpZSB2b24gYWxsZW4gCitEYXRlaWVuIGluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KKworRmFsbHMgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBuaWNodCBsYWRiYXIgaXN0LCB3aXJkIAorL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBhbHMgRXJzYXR6IHZlcnN1Y2h0LiBXZW5uIGF1Y2ggZGFzCituaWNodCBsYWRiYXIgaXN0LCBlcmZvbGd0IGVpbiBTaHV0ZG93biBkZXMgTXVkcy4KKworQmVpIEFlbmRlcnVuZ2VuIHNvbGx0ZSBfenVlcnN0XyBkaWUgbm9ybWFsZSBzaW11bCBlZnVuIGVkaXRpZXJ0IHVuZAorYW5zY2hsaWVzc2VuZCB6ZXJzdG9lcnQvZW50bGFkZW4gd2VyZGVuLCB3b3JhdWZoaW4gc2llIGltcGxpeml0IGR1cmNoIGRlbgorRHJpdmVyIHVuZCBNYXN0ZXIgbmV1Z2VsYWRlbiB3aXJkLiBJc3QgZGllcyBlcmZvbGdyZWljaCB1bmQgZGllIG5ldWUKK3NpbXVsX2VmdW4gbGFldWZ0IChlcnN0IGRhbm4hKSBrb3BpZXJ0IG1hbiBkaWUgRGF0ZWllbiBhdXMgCisvc2VjdXJlL3NpbXVsX2VmdW4gbmFjaCAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUuCisKK0RpZSBEYXRlaWVuIGhpZXIgc2luZCBtaXQgQXVzbmFobWUgZGVyIHNpbXVsX2VmdW4uYyBzZWxic3QgX25pY2h0XyBkYXp1IAorZ2VkYWNodCwgZ2VsYWRlbiB6dSB3ZXJkZW4uCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI1OThjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvY29tbS5jCkBAIC0wLDAgKzEsMTI1IEBACisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKworLy8gU2VuZGV0IGFuIGFsbGUgT2JqZWt0ZSBpbiByb29tIHVuZCByb29tIHNlbGJlciBkdXJjaCBBdWZydWYgdm9uCisvLyBSZWNlaXZlTXNnKCkuCit2YXJhcmdzIHZvaWQgc2VuZF9yb29tKG9iamVjdHxzdHJpbmcgcm9vbSwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX2FjdGlvbiwgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCAqZXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yaWdpbikKK3sKKyAgaWYgKHN0cmluZ3Aocm9vbSkpCisgICAgcm9vbT1sb2FkX29iamVjdChyb29tKTsKKyAgCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOworCisgIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKKyAgcm9vbS0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworfQorCitzdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCit7CisgICAgc3RyaW5nICppZ25vcmU7CisKKyAgICBpZiAoICFlbnZpcm9ubWVudChvYikgKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNpemVvZiggcmVnZXhwKCAoeyBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQob2IpICkgfSksIHBhdCApICk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBzaG91dCggc3RyaW5nIHMsIG1peGVkIHdoZXJlICl7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyAqcGZhZGU7CisKKyAgICBpZiAoICFzaXplb2YoIHUgPSB1c2VycygpIC0gKHsgdGhpc19wbGF5ZXIoKSB9KSApICkKKyAgICAgICByZXR1cm47CisKKyAgICBpZiAoICF3aGVyZSApCisgICAgICAgcGZhZGUgPSAoeyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIGludHAod2hlcmUpICkKKyAgICAgICBwZmFkZSA9CisgICAgICAgICAgICh7IGltcGxvZGUoIGVmdW46OmV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi4yXSwgIi8iICkgKyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIHN0cmluZ3Aod2hlcmUpICkKKyAgICAgICBwZmFkZSA9ICh7IHdoZXJlIH0pOworICAgIGVsc2UKKyAgICAgICBwZmFkZSA9IHdoZXJlOworCisgICAgdSA9IGZpbHRlciggdSwgIl9zaG91dF9maWx0ZXIiLCBNRSwgaW1wbG9kZSggcGZhZGUsICJ8IiApICk7CisgICAgdS0+UmVjZWl2ZU1zZyhzLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9XUkFQfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgTUFfU0hPVVRfU0VGVU4sIDAsIHByZXZpb3VzX29iamVjdCgpKTsKK30KKworCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biBjYXQoKS4KKyNkZWZpbmUgQ0FUX01BWF9MSU5FUyA1MAordmFyYXJncyBpbnQgY2F0KHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIGludCBudW0pCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpbnQgbW9yZTsKKworICAgIGlmIChudW0gPCAwIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghc3RhcnQpCisgICAgICAgIHN0YXJ0ID0gMTsKKworICAgIGlmICghbnVtIHx8IG51bSA+IENBVF9NQVhfTElORVMpIHsKKyAgICAgICAgbnVtID0gQ0FUX01BWF9MSU5FUzsKKyAgICAgICAgbW9yZSA9IHNpemVvZihyZWFkX2ZpbGUoZmlsZSwgc3RhcnQrbnVtLCAxKSk7CisgICAgfQorCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfZmlsZShmaWxlLCBzdGFydCwgbnVtKTsKKyAgICBpZiAoIXR4dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgaWYgKG1vcmUpCisgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICIqKioqKlRSVU5DQVRFRCoqKipcbiIpOworCisgICAgcmV0dXJuIHNpemVvZih0eHQgJiAiXG4iKTsKK30KKyN1bmRlZiBDQVRfTUFYX0xJTkVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gdGFpbCgpLgorI2RlZmluZSBUQUlMX01BWF9CWVRFUyAxMDAwCit2YXJhcmdzIGludCB0YWlsKHN0cmluZyBmaWxlKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyB0eHQgPSByZWFkX2J5dGVzKGZpbGUsIC0oVEFJTF9NQVhfQllURVMgKyA4MCksIChUQUlMX01BWF9CWVRFUyArIDgwKSk7CisgICAgLy8gcmVhZF9ieXRlcygpIHJldHVybnMgMCBpZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZ2l2ZW4gYnkKKyAgICAvLyBwYXJhbWV0ZXIgIzIgbGllcyBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHRyeSBhbmQgcmVhZCB0aGUgZW50aXJlIGZpbGUuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkgJiYgZmlsZV9zaXplKGZpbGUpIDwgVEFJTF9NQVhfQllURVMrODApCisgICAgICB0eHQgPSByZWFkX2ZpbGUoZmlsZSk7CisgICAgLy8gRXhpdCBpZiBzdGlsbCBub3RoaW5nIGNvdWxkIGJlIHJlYWQuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIGN1dCBvZmYgZmlyc3QgKGluY29tcGxldGUpIGxpbmUKKyAgICBpbnQgaW5kZXggPSBzdHJzdHIodHh0LCAiXG4iKTsKKyAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICBpZiAoaW5kZXggKyAxIDwgc2l6ZW9mKHR4dCkpCisgICAgICAgICAgICB0eHQgPSB0eHRbaW5kZXgrMS4uXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHh0ID0gIiI7CisgICAgfQorCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIHJldHVybiAxOworfQorI3VuZGVmIFRBSUxfTUFYX0JZVEVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDdjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBkZWJ1Z19pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRlYnVnX2luZm8pCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworbWl4ZWQgZGVidWdfaW5mbyhpbnQgd2hhdCwgdmFyYXJncyBtaXhlZCogYXJncykKK3sKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIGRlYnVnX2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIERJTkZPX09CSkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKyAgICAgICAgICAgIHByaW50ZigiT19IRUFSVF9CRUFUICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fRU5BQkxFX0NPTU1BTkRTIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0NMT05FICAgICAgICAgICA6ICVzXG4iLCBlZnVuOjpjbG9uZXAob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19ERVNUUlVDVEVEICAgICAgOiBGQUxTRVxuIik7CisgICAgICAgICAgICBwcmludGYoIk9fU1dBUFBFRCAgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKSAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX09OQ0VfSU5URVJBQ1RJVkU6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVNFVF9TVEFURSAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKSAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fV0lMTF9DTEVBTl9VUCAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKSAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFUExBQ0VEICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9yZXNldCAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX29mX3JlZiA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJyZWYgICAgICAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpKTsKKworICAgICAgICAgICAgaW50IGd0aWNrcyA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgaWYoZ3RpY2tzKQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZCUwOWRcbiIsIGd0aWNrcywgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworCisgICAgICAgICAgICBwcmludGYoInN3YXBfbnVtICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSkpOworICAgICAgICAgICAgcHJpbnRmKCJuYW1lICAgICAgICA6ICclcydcbiIsICAgICBlZnVuOjpvYmplY3RfbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJsb2FkX25hbWUgICA6ICclcydcbiIsICAgICBlZnVuOjpsb2FkX25hbWUob2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IG5leHRfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgaWYgKG5leHRfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJuZXh0X2FsbCAgICA6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKG5leHRfb2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IHByZXZfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgaWYgKHByZXZfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJQcmV2aW91cyBvYmplY3QgaW4gb2JqZWN0IGxpc3Q6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKHByZXZfb2IpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlRoaXMgb2JqZWN0IGlzIHRoZSBoZWFkIG9mIHRoZSBvYmplY3QgbGlzdC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHJlZidzICUzZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKSk7CisgICAgICAgICAgICBwcmludGYoIk5hbWU6ICclcydcbiIsICAgICAgICAgIGVmdW46OnByb2dyYW1fbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHNpemUgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSBmdW5jJ3M6ICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSB2YXJzOiAgICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIHN0cmluZ3M6ICUzZCAoJTRkKSA6IG92ZXJoZWFkICVkICsgZGF0YSAlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSArIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gaW5oZXJpdHMgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCkpOworCisgICAgICAgICAgICBwcmludGYoInRvdGFsIHNpemUgICAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkYXRhIHNpemUgICAgICAgJTZkICglNmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fT0JKTElTVDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAwKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCAqIG9icyA9IGVmdW46Om9iamVjdHMoYXJnc1swXSwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9ic1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NQUxMT0M6CisgICAgICAgICAgICB3cml0ZShkZWJ1Z19pbmZvKERJTkZPX1NUQVRVUywgIm1hbGxvYyIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRElORk9fU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd2hpY2g7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpIHx8ICFhcmdzWzBdKQorICAgICAgICAgICAgICAgIHdoaWNoID0gIiI7CisgICAgICAgICAgICBlbHNlIGlmKHN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaCh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhvcHQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJkZXN0cnVjdGVkIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFNfREVTVFJVQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJvcGNvZGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09QQ09ERVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWVtb3J5IjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgJyVzJyB0byBkZWJ1Z19pbmZvKERJTkZPX0RVTVApLlxuIiwgYXJnc1swXSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmR1bXBfZHJpdmVyX2luZm8ob3B0LCBhcmdzWzEuLjFdLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAzIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TVEFUVVM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TVEFUVVNfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TSEFET1dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TSEFET1dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQUEVEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUF9TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19MSVNUXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX0xJU1QpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTkVXTFlfREVTVF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ORVdMWV9ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0RFU1RSVUNURURdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19QUk9DRVNTRURdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0FWR19QUk9DXSAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NMT1RTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVF9UQUJMRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9PQkpTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX0FDVElWRV9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTX1RPVEFMXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0xPVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9QUk9DRVNTRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0FWR19QUk9DXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX0hFQVJUQkVBVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVFNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVF9TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQ0FMTE9VVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BUlJBWVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FSUkFZUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU19TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSFlCUklEX01BUFBJTkdTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IWUJSSUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hBU0hfTUFQUElOR1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSEFTSCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUX1RZUEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RfVFlQRVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUFBFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQX1NJWkVdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VTRVJfUkVTRVJWRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9VU0VSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVNURVJfUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfTUFTVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TWVNURU1fUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfU1lTVEVNKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FERF9NRVNTQUdFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVTU0FHRVNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU19JTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX0lOKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV9JTl0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX0lOKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFlfSElUU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfSElUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1ZJUlRVQUxfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1RBQkxFX1NJWkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfT1ZFUkhFQURdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5dICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTX0JZVkFMVUVdICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl9CWVZBTFVFXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ0hBSU5TXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TTE9UU19VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQURERURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX0FEREVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfREVMRVRFRF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX1JFTU9WRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DT0xMSVNJT05TXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0NPTExJU0lPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF9CWVZBTFVFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfVkFMVUUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfQ0FDSEVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUVVFU1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0ZPVU5EXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0NPTExdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfQ09MTElTSU9OUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9GSUxFXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfRklMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfU1dBUF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX1NXQVApOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQk9PVF9USU1FXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0JPT1RfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfU1dBUDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NXQVBfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VTlNXQVBQRURdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSU10gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUl9TSVpFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV0gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GSUxFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVVU0VEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfUkVVU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hFU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSF9MRU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSEVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hfTEVOXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfQ09NUEFDVF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERDX1NXQVBfQ09NUEFDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRUNZQ0xFX0ZSRUVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1dBUF9SRUNZQ0xFX1BIQVNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9NRU1PUlk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9NRU1PUllfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9OQU1FXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfQUxMT0NBVE9SX05BTUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TVUNDRVNTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExfU1VDQ0VTU0VTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9JTkNSRU1FTlRfU0laRV9DQUxMX0RJRkZTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9PVkVSSEVBRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQUxMT0NBVEVEXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1VTRURdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9UT1RBTF9VTlVTRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VTlVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19GVUxMKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTX1JFUV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfUkVRX1NVQ0NFU1NdICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMX1RBUkdFVF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19JTlNQRUNURURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX0lOU1BFQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfTUVSR0VEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19NRVJHRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX1JFU1VMVF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfUkVTVUxUSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQVZMX05PREVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZSRUVfQkxPQ0tTX0FWTF9OT0RFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0VYVF9TVEFUSVNUSUNTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9FWFRFTkRFRF9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIGRlYnVnX2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fVFJBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IERJVF9DVVJSRU5UOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlQpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1VOQ0FVR0hUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9VTkNBVUdIVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9TVFJfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfQVNfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlRfREVQVEg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0RFUFRIKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRVZBTF9OVU1CRVI6CisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfRVZBTF9OVU1CRVIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWM5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIGVuYWJsZV9jb21tYW5kcygpCisgKiBhbmQgZGlzYWJsZV9jb21tYW5kcygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworI2lmICEgX19FRlVOX0RFRklORURfXyhlbmFibGVfY29tbWFuZHMpCisKK3ZvaWQgZW5hYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDEpOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcihvYik7Cit9CisKKyNlbmRpZgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRpc2FibGVfY29tbWFuZHMpCisKK3ZvaWQgZGlzYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvaGFzaC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9oYXNoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisKK2RlcHJlY2F0ZWQgc3RyaW5nIG1kNShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfTUQ1LCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQorCitkZXByZWNhdGVkIHN0cmluZyBzaGExKG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9TSEExLCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9saXZpbmdzLmMKQEAgLTAsMCArMSwzNDggQEAKKy8vICogbGl2aW5nX25hbWUtQmVoYW5kbHVuZworCisjZGVmaW5lIGNsZWFuX2xvZyhzKQorLy8jZGVmaW5lIGNsZWFuX2xvZyhzKSBsb2dfZmlsZSgiQ0xFQU5fU0lNIixjdGltZSh0aW1lKCkpWzQuLjE4XSsiOiAiKyhzKSk7CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGl2aW5nX25hbWVfbSwgbmFtZV9saXZpbmdfbSwgbmV0ZGVhZDsKKworcHJpdmF0ZSB2b2lkIEluaXRMaXZpbmdEYXRhKG1peGVkIHdpemluZm8pIHsKKyAgLy8gbGl2aW5nX25hbWUgaXN0IGVpbiBQb2ludGVyIGRlciBhdWNoIGluIGRlciBleHRyYV93aXppbmZvIGdlaGFsdGVuIAorICAvLyB3aXJkLCBzbyBrYW5uIGRpZSBzaW11bF9lZnVuIG5ldSBnZWxhZGVuIHdlcmRlbiwgb2huZSBkYXNzIGRpZXNlcworICAvLyBNYXBwaW5nIHZlcmxvcmVuIGdlaHQKKyAgaWYgKCFtYXBwaW5ncChsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0pKQorICAgIGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gR2xlaWNoZXMgZ2lsdCBmdWVyIGRhcyBNYXBwaW5nIE5hbWUtTGl2aW5nCisgIGlmICghbWFwcGluZ3AobmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddKSkKKyAgICBuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIE5ldHp0b3RlIHNpbmQgZWJlbmZhbGxzIGluIGRlciBleHRyYV93aXppbmZvCisgIGlmICghbWFwcGluZ3AobmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdKSkKKyAgICBuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0gPSAoW10pOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgZ2V0dXVpZCggb2JqZWN0IG9iICkKK3sKKyAgICBtaXhlZCAqcmV0OworCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICByZXQgPSAobWl4ZWQpbWFzdGVyKCktPmdldF91c2VyaW5mbyggZ2V0dWlkKG9iKSApOworCisgICAgaWYgKCAhcG9pbnRlcnAocmV0KSB8fCBzaXplb2YocmV0KSA8IDUgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgLy8gVXNlcm5hbWUgKyAiXyIgKyBDcmVhdGlvbkRhdGUKKyAgICByZXR1cm4gcmV0WzBdICsgIl8iICsgcmV0WzVdOworfQorCit2b2lkIHNldF9vYmplY3RfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUsIG9iamVjdCBvYmopCit7CisgIHN0cmluZyBvbGQ7CisgIG1peGVkIGE7CisgIGludCBpOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKT09b2JqIHx8IHByZXZpb3VzX29iamVjdCgpPT10aGlzX29iamVjdCgpIHx8CisgICAgICBwcmV2aW91c19vYmplY3QoKT09bWFzdGVyKCkpCisgIHsKKyAgICBpZighbGl2bmFtZSB8fCAhc3RyaW5ncChsaXZuYW1lKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIiVPOiBpbGxlZ2FsIGxpdmluZyBuYW1lOiAlT1xuIiwgb2JqLCBsaXZuYW1lKSk7CisgICAgfQorICAgIGlmIChvbGQgPSBsaXZpbmdfbmFtZV9tW29ial0pIHsKKyAgICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtvbGRdKSkgeworICAgICAgIGFbbWVtYmVyKGEsIG9iaildID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwgb2xkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGl2aW5nX25hbWVfbVtvYmpdID0gbGl2bmFtZTsKKyAgICBpZiAoYSA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pIHsKKyAgICAgIGlmICghcG9pbnRlcnAoYSkpIHsKKyAgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gKHthLCBvYmp9KTsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gcmVhbGxvY2F0ZSBlbnRyeSBmcm9tIGRlc3RydWN0ZWQgb2JqZWN0ICovCisgICAgICBpZiAoKGkgPSBtZW1iZXIoYSwgMCkpID49IDApIHsKKyAgICAgICBhW2ldID0gb2JqOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBhICsgKHtvYmp9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IG9iajsKKyAgfQorfQorCit2b2lkIHNldF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSkKK3sKKyAgc2V0X29iamVjdF9saXZpbmdfbmFtZShsaXZuYW1lLHByZXZpb3VzX29iamVjdCgpKTsKK30KKwordm9pZCByZW1vdmVfbGl2aW5nX25hbWUoKQoreworICBzdHJpbmcgbGl2bmFtZTsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgaWYgKGxpdm5hbWU9bGl2aW5nX25hbWVfbVtwcmV2aW91c19vYmplY3QoKV0pCisgIHsKKyAgICBtX2RlbGV0ZShsaXZpbmdfbmFtZV9tLHByZXZpb3VzX29iamVjdCgpKTsKKyAgICBpZiAob2JqZWN0cChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBpZiAobmFtZV9saXZpbmdfbVtsaXZuYW1lXT09cHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0tPSh7cHJldmlvdXNfb2JqZWN0KCl9KTsKKyAgICAgIGlmICghc2l6ZW9mKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX3NldF9uZXRkZWFkKCkKK3sKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIG5ldGRlYWRbZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV09cHJldmlvdXNfb2JqZWN0KCk7Cit9CisKK3ZvaWQgX3JlbW92ZV9uZXRkZWFkKCkKK3sKKyAgbV9kZWxldGUobmV0ZGVhZCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKK30KKworb2JqZWN0IGZpbmRfbmV0ZGVhZChzdHJpbmcgdXVpZCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisgCisgIGlmIChpc191dWlkICYmIGdldHV1aWQobmV0ZGVhZFt1aWRdKSAhPSB1dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIG5ldGRlYWRbdWlkXTsKK30KKworc3RyaW5nICpkdW1wX25ldGRlYWQoKQoreworICByZXR1cm4gbV9pbmRpY2VzKG5ldGRlYWQpOworfQorCitvYmplY3QgZmluZF9saXZpbmcoc3RyaW5nIGxpdm5hbWUpIHsKKyAgbWl4ZWQgKmEsIHI7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChyID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpIHsKKyAgICBpZiAobWVtYmVyKHIsMCk+PTApCisgICAgICByLT0oezB9KTsKKyAgICBpZiAoIXNpemVvZihyKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfbGl2aW5nIGxvZXNjaHQgJXNcbiIsbGl2bmFtZSkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWxpdmluZyhyID0gKGEgPSByKVswXSkpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihhKTsgLS1pOykgeworICAgICAgIGlmIChsaXZpbmcoYVs8aV0pKSB7CisgICAgICAgICByID0gYVs8aV07CisgICAgICAgICBhWzxpXSA9IGFbMF07CisgICAgICAgICByZXR1cm4gYVswXSA9IHI7CisgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gbGl2aW5nKHIpICYmIHI7Cit9CisKK29iamVjdCAqZmluZF9saXZpbmdzKHN0cmluZyBsaXZuYW1lKQoreworICBtaXhlZCByOworCisgIGlmIChwb2ludGVycChyPW5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHItPSh7MH0pOworICBlbHNlCisgICAgaWYgKG9iamVjdHAocikpCisgICAgICByPSh7cn0pOworICBpZiAoIXBvaW50ZXJwKHIpfHwhc2l6ZW9mKHIpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcjsKK30KKworb2JqZWN0IGZpbmRfcGxheWVyKHN0cmluZyB1dWlkKSB7CisgIG9iamVjdCAqb2JqczsKKyAgbWl4ZWQgcmVzOworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoIXN0cmluZ3AodXVpZCkpCisgICAgcmV0dXJuIDA7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisKKyAgaWYgKHBvaW50ZXJwKHJlcyA9IG5hbWVfbGl2aW5nX21bdWlkXSkpIHsKKyAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgZ2dmLiBlbnRmZXJuZW4KKyAgICBpZiAobWVtYmVyKHJlcywwKT49MCkgeworICAgICAgcmVzLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21bdWlkXSA9IHJlczsKKyAgICB9CisgICAgLy8gZ2dmLiBOYW1lbiBvaG5lIE9iamVrdGUgZW50ZmVybmVuLgorICAgIGlmICghc2l6ZW9mKHJlcykpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSx1aWQpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfcGxheWVyIGxvZXNjaHQgJXNcbiIsdWlkKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2JqcyA9IHJlczsKKyAgICByZXMgPSBvYmpzWzBdOworICAgIC8vIFdlbm4gZGFzIDAuIEVsZW1lbnQgZGVyIFNwaWVsZXIgaXN0LCBzaW5kIHdpciBmZXJ0aWcuIEFuc29uc3RlbiBzdWNoZW4KKyAgICAvLyB3aXIgZGVuIFNwaWVsZXIgdW5kIHNjaGllYmVuIGlobiBhbiBkaWUgMC4gU3RlbGxlIGltIEFycmF5LgorICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKG9ianMpOyAtLWk7KSB7CisgICAgICAgaWYgKG9ianNbPGldICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2Jqc1s8aV0pKSB7CisgICAgICAgICByZXMgPSBvYmpzWzxpXTsKKyAgICAgICAgIG9ianNbPGldID0gb2Jqc1swXTsKKyAgICAgICAgIG9ianNbMF0gPSByZXM7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSAob2JqZWN0cChyZXMpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgPyByZXMgOiAwOworICAgIH0KKyAgICAvLyBlbHNlOiBpbiByZXMgc3RlaHQgZGVyIFNwaWVsZXIgc2Nob24uCisgIH0KKyAgZWxzZSBpZiAob2JqZWN0cChyZXMpKSAvLyByIGlzdCBuZW4gRWluemVsb2JqZWt0CisgICAgcmVzID0gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpID8gcmVzIDogMDsKKworICAvLyByZXMgaXN0IGpldHp0IGdnZi4gZGVyIFNwaWVsZXIuIEFiZXIgd2VubiBkZXIgbmUgYW5kZXJlIGFscyBkaWUgZ2VzdWNodGUKKyAgLy8gVVVJRCBoYXQsIGlzdCBkYXMgRXJnZWJuaXMgdHJvdHpkZW0gMC4KKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChyZXMpIT11dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgLy8gZW5kbGljaCBnZWZ1bmRlbgorICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIGludCBjaGVja19tYXRjaCggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSApCit7CisgICAgbWl4ZWQgbWF0Y2g7CisKKyAgICBpZiAoICEobWF0Y2ggPSBuYW1lX2xpdmluZ19tW3N0cl0pICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKG1hdGNoKSApCisgICAgICAgbWF0Y2ggPSAoeyBtYXRjaCB9KTsKKworICAgIG1hdGNoIC09ICh7MH0pOworCisgICAgaWYgKCBzaXplb2YobWF0Y2gpICl7CisgICAgICAgaWYgKCBwbGF5ZXJzX29ubHkgKQorICAgICAgICAgICByZXR1cm4gc2l6ZW9mKGZpbHRlciggbWF0Y2gsICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZS8qJyovICkpCisgICAgICAgICAgICAgID4gMDsKKyAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1fZGVsZXRlKCBuYW1lX2xpdmluZ19tLCBzdHIgKTsKKyAgICBjbGVhbl9sb2coIHNwcmludGYoImNoZWNrX21hdGNoIGxvZXNjaHQgJXNcbiIsIHN0cikgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy9UT0RPOjogc3RyaW5nfHN0cmluZyogZXhjbHVkZQordmFyYXJncyBtaXhlZCBtYXRjaF9saXZpbmcoIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHksIG1peGVkIGV4Y2x1ZGUgKQoreworICAgIGludCBpLCBzOworICAgIG1peGVkIG1hdGNoLCAqdXNlcjsKKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAoZXhjbHVkZSkgKQorICAgICAgIGV4Y2x1ZGUgPSAoeyBleGNsdWRlIH0pOworCisgICAgaWYgKCBtZW1iZXIoZXhjbHVkZSwgc3RyKSA8IDAgJiYgY2hlY2tfbWF0Y2goc3RyLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICByZXR1cm4gc3RyOworCisgICAgdXNlciA9IG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKTsKKyAgICBzID0gc2l6ZW9mKHN0cik7CisgICAgbWF0Y2ggPSAwOworCisgICAgZm9yICggaSA9IHNpemVvZih1c2VyKTsgaS0tOyApCisgICAgICAgaWYgKCBzdHIgPT0gdXNlcltpXVswLi5zLTFdICYmIG1lbWJlciggZXhjbHVkZSwgdXNlcltpXSApIDwgMCApCisgICAgICAgICAgIGlmICggbWF0Y2ggKQorICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKCBjaGVja19tYXRjaCh1c2VyW2ldLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICAgICAgICAgICAgIG1hdGNoID0gdXNlcltpXTsKKworICAgIGlmICggIW1hdGNoICkKKyAgICAgICByZXR1cm4gLTI7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKK21peGVkICpkdW1wX2xpdmluZ3MoKQoreworICByZXR1cm4gc29ydF9hcnJheShtX2luZGljZXMobmFtZV9saXZpbmdfbSksIyc+KTsKK30KKworLy8gKiByZWdlbG1hZXNzaWcgTGlzdGVuIHZvbiBCYWxsYXN0IGJlZnJlaWVuCitwcml2YXRlIHZvaWQgY2xlYW5fbmFtZV9saXZpbmdfbShzdHJpbmcgKmtleXMsIGludCBsZWZ0LCBpbnQgbnVtKQoreworICBpbnQgaSwgajsKKyAgbWl4ZWQgYTsKKworICB3aGlsZSAobGVmdCAmJiBudW0tLSkKKyAgeworICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtrZXlzWy0tbGVmdF1dKSAmJiBtZW1iZXIoYSwgMCk+PTApCisgICAgeworICAgICAgYS09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW2tleXNbbGVmdF1dID0gYTsKKyAgICB9CisgICAgaWYgKCFhIHx8IChwb2ludGVycChhKSAmJiAhc2l6ZW9mKGEpKSkKKyAgICB7CisgICAgICBjbGVhbl9sb2coIlRvYXN0aW5nICIra2V5c1tsZWZ0XSsiXG4iKTsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIGtleXNbbGVmdF0pOworICAgIH0gZWxzZSBjbGVhbl9sb2coc3ByaW50ZigiS0VFUElORyAlcyAoJU8pXG4iLGtleXNbbGVmdF0scG9pbnRlcnAoYSk/c2l6ZW9mKGEpOmEpKTsKKyAgfQorICBpZiAobGVmdCkKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sIDEsIGtleXMsIGxlZnQsIDgwKTsKKyAgZWxzZQorICAgIGNsZWFuX2xvZygiQ2xlYW4gcHJvY2VzcyBmaW5pc2hlZFxuIik7Cit9CisKK3ByaXZhdGUgdm9pZCBjbGVhbl9uZXRkZWFkKCkgeworICBpbnQgaTsKKyAgc3RyaW5nICpzOworICBvYmplY3Qgb2I7CisKKyAgcz1tX2luZGljZXMobmV0ZGVhZCk7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkKKyAgICBpZiAoIW9iamVjdHAob2I9bmV0ZGVhZFtzW2ldXSkgfHwgaW50ZXJhY3RpdmUob2IpKQorICAgICAgbV9kZWxldGUobmV0ZGVhZCxzW2ldKTsKK30KKworcHJpdmF0ZSB2b2lkIENsZWFuTGl2aW5nRGF0YSgpIHsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tKSA8IDApIHsKKyAgICBjbGVhbl9sb2coIlN0YXJ0aW5nIGNsZWFuIHByb2Nlc3NcbiIpOworICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwKKyAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIDgwCisgICAgICAgICAgICAgICAgICk7CisgIH0KKyAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uZXRkZWFkLDIpOworfQorCisjdW5kZWYgY2xlYW5fbG9nCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2MwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gb2JqZWN0X2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGRyaXZlcl9pbmZvKSAvKiBOZXdlciB2ZXJzaW9uIGlzIHRoZXJlICovCisKKyNpbmNsdWRlIDxvYmplY3RpbmZvLmg+CisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworbWl4ZWQgb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgdmFyYXJncyBpbnQqIGluZGV4KQoreworICAgIG1peGVkICogcmVzdWx0OworCisgICAgaWYgKHNpemVvZihpbmRleCkgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIG9iamVjdF9pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIG9iamVjdF9pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBPSU5GT19CQVNJQzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lCX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSEVBUlRfQkVBVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9JU19XSVpBUkRdICAgICAgICAgPSAwOyAgIC8qIE5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfRU5BQkxFX0NPTU1BTkRTXSAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9DTE9ORV0gICAgICAgICAgICAgPSBlZnVuOjpjbG9uZXAob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ERVNUUlVDVEVEXSAgICAgICAgPSAwOyAgIC8qIE5vdCBwb3NzaWJsZSBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQUEVEXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX09OQ0VfSU5URVJBQ1RJVkVdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVTRVRfU1RBVEVdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfV0lMTF9DTEVBTl9VUF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApOworICAgICAgICAgICAgcmVzdWx0W09JQl9MQU1CREFfUkVGRVJFTkNFRF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFNQkRBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TSEFET1ddICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpICYmIDE7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFUExBQ0VEXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfUkVTRVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USU1FX09GX1JFRl0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFRl0gICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0dJR0FUSUNLU10gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USUNLU10gICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQX05VTV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUk9HX1NXQVBQRURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVkFSX1NXQVBQRURdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1ZBUl9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkFNRV0gICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9MT0FEX05BTUVdICAgICAgICAgPSBlZnVuOjpsb2FkX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUkVWX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0NMRUFOVVBdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9DTEVBTlVQX1RJTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX1BPU0lUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSVBfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JUF9ORVhUXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BSRVZdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUE9TXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BPUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSU1fTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JTV9SRUZdICAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05BTUVdICAgICAgICAgICAgICAgPSBlZnVuOjpwcm9ncmFtX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JTV9QUk9HX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9GVU5DVElPTlNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfRlVOQ1RJT05TXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fVkFSSUFCTEVTXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1ZBUklBQkxFU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1NUUklOR1NdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX0RBVEFdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5IRVJJVEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0lOSEVSSVRFRF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfU0laRV0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9EQVRBX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX0RBVEFfU0laRV0gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fSU5IRVJJVF0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19JTkhFUklUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fQ0xPTkVdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19DTE9ORSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX1NIQURPV10gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fU0hBRE9XKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOQ0xVREVTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5DTFVERUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSEFSRV9WQVJJQUJMRVNdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQVJFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplb2YoaW5kZXgpKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGluZGV4WzBdOworICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBvYmplY3RfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2VkaXRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfZWRpdGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50fG9iamVjdCBxdWVyeV9lZGl0aW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9FRElUSU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaWRsZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pZGxlKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnQgcXVlcnlfaWRsZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lETEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjMzExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pbnB1dF9wZW5kaW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lucHV0X3BlbmRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JTlBVVF9QRU5ESU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NGVhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIHF1ZXJ5X2lwX25hbWUoKSBhbmQKKyAqIHF1ZXJ5X2lwX251bWJlcigpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pcF9uYW1lKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9uYW1lKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05BTUUpOworfQorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9udW1iZXIob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTlVNQkVSKTsKK30KKworLy8gKiBIZXJrdW5mdHMtRXJtaXR0bHVuZworc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpCit7CisgIG9iPSBvYiB8fCB0aGlzX3BsYXllcigpOworICBpZiAoIW9iamVjdHAob2IpIHx8ICFpbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOworICBpZihvYi0+cXVlcnlfcmVhbGlwKCkgJiYgKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCkhPSIiKQorICB7CisgICAgcmV0dXJuIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpOworICB9CisgIHJldHVybiBfcXVlcnlfaXBfbnVtYmVyKG9iKTsKK30KKworc3RyaW5nIHF1ZXJ5X2lwX25hbWUobWl4ZWQgb2IpCit7CisgIGlmICggIW9iIHx8IG9iamVjdHAob2IpICkKKyAgICAgIG9iPV9xdWVyeV9pcF9udW1iZXIob2IpOworICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbGltaXRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xpbWl0cykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3ZhcmFyZ3MgaW50KiBxdWVyeV9saW1pdHMoaW50IGRlZikKK3sKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oZGVmID8gRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyA6IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisgICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitpbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKK3sKKyAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQorICAgIHsKKyAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7CisgICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCisgICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOworICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOworICAgIH0KKworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitpbnQgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2OWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7CisjZWxzZQorICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7CisjZW5kaWYKK30KKworbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7CisgIG9iamVjdCBzbm9vcGVyOworCisgIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7CisgIGlmICghc25vb3BlcikgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOworICByZXR1cm4gc25vb3BlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKworICAgIGlmICghZmxhZyA9PSAhaGIpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIgdGhhdCBhcmUgYWN0aXZhdGVkIHdpdGgKKyAqIHNldF9pc193aXphcmQoKS4gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBsYXllciBvYmplY3QuCisgKiBBbHNvIHNldF9pc193aXphcmQoKSBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXIgb2JqZWN0LAorICogbm90IGFzIGFuIChzaW11bC0pZWZ1bi4KKyAqLworCisjaW5jbHVkZSA8Y29tbWFuZHMuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisvKiBpc193aXphcmQ6CisgKiAgMTogaGFzIGFjdGlvbnMsCisgKiAgMDogbmV2ZXIgaGFkIGFjdGlvbnMsCisgKiAtMTogaGFkIGFjdGlvbnMgb25jZS4KKyAqLworcHJpdmF0ZSBub3NhdmUgaW50IGlzX3dpemFyZDsKKworcHJpdmF0ZSBpbnQgZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX2R1bXBhbGxvYmooc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3cml0ZSgiRHVtcGluZyB0byAvT0JKX0RVTVAgLi4uICIpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFMpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgd3JpdGUoImRvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfb3BjZHVtcChzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09QQ09ERVMpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfc3RhdHVzKHN0cmluZyBzdHIpCit7CisgICAgaW50IG9wdDsKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKG9wdCkpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2V0X2lzX3dpemFyZCh2YXJhcmdzIDxvYmplY3R8aW50PiogYXJncykKK3sKKyAgICBpbnQgb2xkdmFsID0gaXNfd2l6YXJkOworCisgICAgaWYoIXNpemVvZihhcmdzKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDEgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihhcmdzWzBdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJPbmx5IHNldF9pc193aXphcmQgZm9yIHRoZSBjdXJyZW50IG9iamVjdCBzdXBwb3J0ZWRcbiIpOworICAgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRoZSBjdXJyZW50IG9iamVjdCBtdXN0IGJlIHRoaXNfcGxheWVyKCkgZm9yIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDIgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFhcmdzWzFdKQorICAgIHsKKyAgICAgICAgaWYoaXNfd2l6YXJkID4gMCkKKyAgICAgICAgICAgIGlzX3dpemFyZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmKHNpemVvZihhcmdzKSA9PSAyICYmIGFyZ3NbMV08MCkKKyAgICB7CisgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZighaXNfd2l6YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX21hbGxvYywgIm1hbGxvYyIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9kdW1wYWxsb2JqLCAiZHVtcGFsbG9iaiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9vcGNkdW1wLCAib3BjZHVtcCIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9zdGF0dXMsICJzdGF0dXMiLCBBQV9OT1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpc193aXphcmQgPSAxOworICAgIH0KKworICAgIHJldHVybiBvbGR2YWwgPiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKQEAgLTAsMCArMSwyMSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKwordmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKK3sKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7CisKKyAgICBpZighaW50cChwcm9tcHQpKQorICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKKworICAgIHJldHVybiBvbGRwcm9tcHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2hhZG93LmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCisgKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOworfQorCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgICAgaWYoZmxhZykKKyAgICB7CisgICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKKyAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKKworICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKK30KKyNlbHNlCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKK30KKyNlbmRpZgorCisKK3B1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7CisgIGlmIChmbGFnKQorICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIGVmdW46OnVuc2hhZG93KCk7Cit9CisKK3B1YmxpYyB2b2lkIHVuc2hhZG93KCkgeworICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKKyAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2ODc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYwpAQCAtMCwwICsxLDE5OTUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCisvLworLy8gJElkOiBzaW11bF9lZnVuLmMgNzQwOCAyMDEwLTAyLTA2IDAwOjI3OjI1WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEFic29sdXRlIFBmYWRlIGVyZm9yZGVybGljaCAtIHp1bSBaZWl0cHVua3QsIHdvIGRlciBNYXN0ZXIgZ2VsYWRlbgorLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCisKKyNkZWZpbmUgU05PT1BMT0dGSUxFICJTTk9PUCIKKyNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc3lzL3Nub29waW5nLmgiCisjaW5jbHVkZSAiL3N5cy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZXJxLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICIvc3lzL2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RpbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgorI2luY2x1ZGUgIi9zeXMvdGltZS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKyNpbmNsdWRlICIvc3lzL2lucHV0X3RvLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0cmluZyBkdGltZShpbnQgd2Fubik7Cit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspOworaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSk7Cit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKTsKK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYik7Citub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpOworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCk7Citub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKTsKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOworCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK3ZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK3ZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQoraW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZyk7CisjZW5kaWYKKworLy8gSW5jbHVkZSB0aGUgZGlmZmVyZW50IHN1YiAnbW9kdWxlcycgb2YgdGhlIHNpbXVsX2VmdW4KKyNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJlbmFibGVfY29tbWFuZHMuYyIKKyNpbmNsdWRlIF9fRElSX18iaGFzaC5jIgorI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9lZGl0aW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lkbGUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pcF9uYW1lLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xpbWl0cy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbXVkX3BvcnQuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgorI2luY2x1ZGUgX19ESVJfXyJzZXRfaGVhcnRfYmVhdC5jIgorI2lmIF9fQk9PVF9USU1FX18gPCAxNDU2MjYxODU5CisjaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKKyNlbmRpZgorI2luY2x1ZGUgX19ESVJfXyJzaGFkb3cuYyIKKyNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgorI2luY2x1ZGUgX19ESVJfXyJjb21tLmMiCisKKyNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCisjZGVmaW5lIExFVkVMKHgpIHF1ZXJ5X3dpel9sZXZlbCh4KQorI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK21peGVkIGR0aW1lX2NhY2hlID0gKHstMSwiIn0pOworCisjaWZkZWYgSU9TVEFUUworc3RydWN0IGlvc3RhdF9zIHsKKyAgc3RyaW5nIG9uYW1lOworICBpbnQgdGltZTsKKyAgaW50IHNpemU7Cit9OworbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKK21peGVkIHJlc3RvcmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwwKSB9KTsKKy8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgbG9nX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworCittaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CisgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7CisvKiAgICBjYXNlIDM6CisgICAgICByZXR1cm4gd3JpdGVmaWxlX3N0YXQ7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGxvZ19zdGF0OworICAgICAgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXZpb3VzX29iamVjdCgpCisgICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCisgICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKKyAgICAgICAgICAgICAmJiAob2IgIT0gdGhpc19wbGF5ZXIoKSB8fCBvYiAhPSB0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCisgICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCisgICAgICAgICAgICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBvYikpICkgKQorCisgICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGF1c2dlbG9nZ3Qgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKK30KKworCit2b2lkIF9fX3VwZG1hc3RlcigpCit7CisgICAgb2JqZWN0IG9iOworCisgICAgLy9zb2xsdGUgbmljaHQgamVkZXIgZHVlcmZlbi4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CisKKyAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CisgICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCisgICAgICAgIGdldF9kaXIoIi9zZWN1cmUvbWFzdGVyLyouYyIsR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRHxHRVRESVJfUEFUSCkpIHsKKyAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQorICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKKyAgICB9CisgICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOworICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CisgICAgbG9hZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIik7CisKKyAgICB3cml0ZSgiZG9uZS5cbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CisgIG1peGVkIHJldDsKKworICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuICI/Pz8iOworfQorCisKKy8vICogU25vb3BlbiB1bmQgd2FzIGRhenVnZWhvZXJ0CitzdGF0aWMgb2JqZWN0IGZpbmRfc25vb3BlZChvYmplY3Qgd2hvKQoreworICBvYmplY3QgKnU7CisgIGludCBpOworCisgIGZvciAoaT1zaXplb2YodT11c2VycygpKS0xO2k+PTA7aS0tKQorICAgIGlmICh3aG89PWVmdW46OmludGVyYWN0aXZlX2luZm8odVtpXSwgSUlfU05PT1BfTkVYVCkpCisgICAgICByZXR1cm4gdVtpXTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RyaW5nIExjdXQoc3RyaW5nIHN0cikgeworICByZXR1cm4gc3RyWzUuLjExXStzdHJbMTguLl07Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcCggb2JqZWN0IG1lLCBvYmplY3QgeW91ICkKK3sKKyAgICBpbnQgcmV0OworICAgIG9iamVjdCBzbm9vcGVyMCwgc25vb3Blciwgc25vb3BlcjIsIHNub29wZXIzOworCisgICAgaWYoICFvYmplY3RwKG1lKSB8fCBtZSA9PSB5b3UgfHwgIVBPICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHNub29wZXIwID0gZmluZF9zbm9vcGVkKG1lKTsKKworICAgICBpZih5b3UpeworICAgICAgICBpZiAoIFBPICE9IG1lICYmIHF1ZXJ5X3dpel9ncnAobWUpID49IHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgISh5b3UtPlF1ZXJ5QWxsb3dTbm9vcChtZSkpICkKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgfHwgSVNfQVJDSCh5b3UpICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggKHNub29wZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkpICYmCisgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChzbm9vcGVyKSA+PSBxdWVyeV93aXpfZ3JwKG1lKSApeworICAgICAgICAgICAgaWYgKCAoaW50KXNub29wZXItPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIiVzIHNub29wZWQgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUtPm5hbWUoV0VSKSwgeW91LT5uYW1lKFdFUikgKSApOworCisgICAgICAgICAgICBzbm9vcGVyMiA9IG1lOworCisgICAgICAgICAgICB3aGlsZSAoIHNub29wZXIzID0gaW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgKXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzIHdpcmQgc2VpbmVyc2VpdHMgdm9uICVzIGdlc25vb3BlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNub29wZXIyLT5uYW1lKFdFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIzLT5uYW1lKFdFTSkgKSApOworICAgICAgICAgICAgICAgc25vb3BlcjIgPSBzbm9vcGVyMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWZ1bjo6c25vb3AoIHNub29wZXIsIHNub29wZXIyICk7CisKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgIT0gc25vb3BlciApCisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IGthbm5zdCAlcyBuaWNodCBzbm9vcGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUgc25vb3BzdCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShzbm9vcGVyKSApeworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAtPiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwMDAwMCApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChzbm9vcGVyKQorICAgICAgICAgICAgICAgaWYgKCAhbWUtPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICl7CisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJXMgd2lyZCBiZXJlaXRzIHZvbiAlcyBnZXNub29wZWQuIEJlbnV0emUgZGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZlwiLUZsYWcsIHdlbm4gZHUgZGVubm9jaCBzbm9vcGVuIHdpbGxzdC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdS0+bmFtZShXRVIpLCBzbm9vcGVyLT5uYW1lKFdFTSkgKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICByZXQgPSBlZnVuOjpzbm9vcCggbWUsIHlvdSApOworCisgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lKXsKKyAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwgc3ByaW50ZiggIiVzIC0+ICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh5b3UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHlvdSkgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJldCAmJiBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhSVNfREVQVVRZKG1lKSApCisgICAgICAgICAgICB0ZWxsX29iamVjdCggeW91LCAiKioqICIgKyBOQU1FKG1lKSArICIgc25vb3B0IERpY2ghXG4iICk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCAobWUgPT0gUE8gfHwKKyAgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPiBxdWVyeV93aXpfZ3JwKG1lKSB8fAorICAgICAgICAgICAgICAocXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPT0gcXVlcnlfd2l6X2dycChtZSkgJiYKKyAgICAgICAgICAgICAgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhQTywgSUlfU05PT1BfTkVYVCkgPT0gbWUpKSAmJiBzbm9vcGVyMCApeworICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6c25vb3AobWUpOworICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIDA7Cit9CisKKworCisvLyAqIEVtdWxhdGlvbiBkZXMgJ2FsdGVuJyBleHBsb2RlIGR1cmNoIGRhcyBuZXVlCitzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpIHsKKyAgaW50IHMsIHQ7CisgIHN0cmluZyAqc3RyczsKKworICBpZiAoIXN0cmluZ3Aoc3RyKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAxIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixzdHIpKTsKKyAgfQorICBpZiAoIXN0cmluZ3AoZGVsKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAyIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixkZWwpKTsKKyAgfQorICBpZihkZWwgPT0gIiIpCisgICAgcmV0dXJuICh7c3RyfSk7CisgIHN0cnM9ZWZ1bjo6ZXhwbG9kZShzdHIsIGRlbCk7CisgIHQ9c2l6ZW9mKHN0cnMpLTE7CisgIHdoaWxlKHM8PXQgJiYgc3Ryc1tzKytdID09ICIiKTtzLS07CisgIHdoaWxlKHQ+PTAgJiYgc3Ryc1t0LS1dID09ICIiKTt0Kys7CisgIGlmKHM8PXQpCisgICAgcmV0dXJuIHN0cnNbcy4udF07CisgIHJldHVybiAoe30pOworfQorCitpbnQgZmlsZV90aW1lKHN0cmluZyBwYXRoKSB7CisgIG1peGVkICp2OworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmIChzaXplb2Yodj1nZXRfZGlyKHBhdGgsR0VURElSX0RBVEVTKSkpIHJldHVybiB2WzBdOworICByZXR1cm4oMCk7IC8vc29uc3QKK30KKworLy8gKiBCZWkgNTBrIEdyb2Vzc2UgTG9nLUZpbGUgcm90aWVyZW4KK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhaykgeworICBtaXhlZCAqc3Q7CisKKyAgZmlsZT0iL2xvZy8iK2ZpbGU7CisgIGZpbGU9aW1wbG9kZSgoZWZ1bjo6ZXhwbG9kZShmaWxlLCIvIiktKHsiLi4ifSkpLCIvIik7CisvLyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLHNwcmludGYoIkxPRyBGSUxFOiAlTyAtPiAlT1xuIixwcmV2aW91c19vYmplY3QoKSxmaWxlKSk7CisgIGlmICghZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNhbGxfb3RoZXIsUE8pLCJzZWN1cmUvbWFzdGVyIiwvLycpCisgICAgICAgICAgICAgICJ2YWxpZF93cml0ZSIsZmlsZSxnZXRldWlkKFBPKSwibG9nX2ZpbGUiLFBPKSkKKyAgICAgIHJldHVybiAwOworICBpZiAoIHNpemVfdG9fYnJlYWsgPj0gMCAmICgKKyAgICAgIHNpemVvZihzdCA9IGdldF9kaXIoZmlsZSwyKSApICYmIHN0WzBdID49IChzaXplX3RvX2JyZWFrfE1BWF9MT0dfU0laRSkpKQorICAgICAgY2F0Y2gocmVuYW1lKGZpbGUsIGZpbGUgKyAiLm9sZCIpO3B1Ymxpc2gpOyAvKiBObyBwYW5pYyBpZiBmYWlsdXJlICovCisgIHJldHVybih3cml0ZV9maWxlKGZpbGUsdHh0KSk7Cit9CisKKy8vICogTWFnaWVyLUxldmVsIGFiZnJhZ2VuCitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcikgeworICByZXR1cm4gKGludCkiL3NlY3VyZS9tYXN0ZXIiLT5xdWVyeV93aXpfbGV2ZWwocGxheWVyKTsKK30KKworI2lmZGVmIF9fQUxJU1RTX18KKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IGtleSkKK21peGVkICpyZW1vdmVfYWxpc3QobWl4ZWQga2V5LG1peGVkICphbGlzdCkKK3sKKyAgaW50IGksajsKKworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICB7CisgICAgaWYgKChpPWFzc29jKGtleSxhbGlzdCkpPDApCisgICAgICByZXR1cm4gYWxpc3Q7CisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICB9CisgIGkgPSBhc3NvYyhrZXksYWxpc3RbMF0pOworICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0WzBdKSk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGFsaXN0PWFsaXN0WzAuLl07CisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsKK30KKworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkgcG9zKQorbWl4ZWQgKmV4Y2x1ZGVfYWxpc3QoaW50IGksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgajsKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkgfHwgaTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICBhbGlzdD1hbGlzdFswLi5dOyAvKiBDcmVhdGUgUEhZU0lDQUwgY29weSBvZiBhbGlzdCAqLworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7IC8qIG9yZGVyX2FsaXN0IGlzIE5PVCBuZWNlc3NhcnkgLSBzZWUgL2RvYy9MUEMvYWxpc3QgKi8KK30KKyNlbmRpZiAvLyBfX0FMSVNUU19fCisKKy8vICogR2VybWFuIHZlcnNpb24gb2YgY3RpbWUoKQorI2RlZmluZSBUQUdFICh7IlNvbiIsIk1vbiIsIkRpZSIsIk1pdCIsIkRvbiIsIkZyZSIsIlNhbSJ9KQorI2RlZmluZSBNT05BVEUgKHsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFpIiwiSnVuIiwiSnVsIiwiQXVnIixcCisgICAgICAgICAgICAgICAgICJTZXAiLCJPa3QiLCJOb3YiLCJEZXoifSkKK3N0cmluZyBkdGltZShpbnQgd2FubikgeworICAKKyAgaWYgKHdhbm4gPT0gZHRpbWVfY2FjaGVbMF0pCisgICAgcmV0dXJuKGR0aW1lX2NhY2hlWzFdKTsKKworICBpbnQgKmx0ID0gbG9jYWx0aW1lKHdhbm4pOworICByZXR1cm4gc3ByaW50ZigiJXMsICUyZC4gJXMgJWQsICUwMmQ6JTAyZDolMDJkIiwKKyAgICAgIFRBR0VbbHRbVE1fV0RBWV1dLCBsdFtUTV9NREFZXSwgTU9OQVRFW2x0W1RNX01PTl1dLCAKKyAgICAgIGx0W1RNX1lFQVJdLGx0W1RNX0hPVVJdLCBsdFtUTV9NSU5dLCBsdFtUTV9TRUNdKTsKK30KKworLy8gd2VubiBzdHJmdGltZSBpbSBEcml2ZXIgbmljaHQgZXhpc3RpZXJ0LCBpc3QgZGllcyBoaWVyIGVpbiBBbGlhcyBhdWYgZHRpbWUoKSwKKy8vIHp3YXIgc3RpbW10IGRhcyBGb3JtYXQgZGFubiBuaWNodCwgYWJlciBkaWUgTXVkbGliIGJ1Z2d0IG5pY2h0IHVuZCBzY2hyZWlidAorLy8gZWluIG9yZGVudGxpY2hlcyBEYXR1bS9VaHJ6ZWl0LgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQordmFyYXJncyBzdHJpbmcgc3RyZnRpbWUobWl4ZWQgZm10LCBpbnQgY2xvY2ssIGludCBsb2NhbGl6ZWQpIHsKKyAgaWYgKGludHAoY2xvY2spICYmIGNsb2NrID49IDApCisgICAgcmV0dXJuIGR0aW1lKGNsb2NrKTsKKyAgZWxzZSBpZiAoaW50cChmbXQpICYmIGZtdCA+PSAwKQorICAgIHJldHVybiBkdGltZShmbXQpOworICAKKyAgcmV0dXJuIGR0aW1lKHRpbWUoKSk7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKKworLy8gKiBTaHV0ZG93biBtaXQgenVzYWV0emxpY2hlbSBsb2dnaW5nCitub21hc2sgaW50IHNodXRkb3duKHN0cmluZyByZWFzb24pCit7CisgIHN0cmluZyBuYW1lOworICBzdHJpbmcgb2JuYW1lOworICBzdHJpbmcgb3V0cHV0OworCisgIGlmICghcmVhc29uKQorICAgIHJldHVybiAwOworICBpZiAoICFBUkNIX1NFQ1VSSVRZICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkhPVJPT1RJRCAmJgorICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSE9Ii9vYmovc2h1dCIgKQorICB7CisgICAgd3JpdGUoIllvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gc2h1dCBkb3duIHRoZSBnYW1lZHJpdmVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCh0aGlzX2ludGVyYWN0aXZlKCkpJiYobmFtZT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpCisgIHsKKyAgICBuYW1lPWNhcGl0YWxpemUobmFtZSk7CisgICAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwvLycKKyAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSkrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyIVxuIik7CisgIH0KKyAgZWxzZQorICAgIG5hbWU9IkFOT05ZTU9VUyI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSkgb2JuYW1lPWNhcGl0YWxpemUoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7CisgIG91dHB1dD1uYW1lOworICBpZiAob2JuYW1lICYmIG5hbWUhPW9ibmFtZSkgb3V0cHV0PW91dHB1dCsiICgiK29ibmFtZSsiKSI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSYmb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpPT0iL29iai9zaHV0Iil7CisgICAgb3V0cHV0Kz0iIGZhZWhydCBkYXMgU3BpZWwgdmlhIEFybWFnZWRkb24gaGVydW50ZXIuXG4iOworICAgIG91dHB1dD1kdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0OworICAgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICAgIGVmdW46OnNodXRkb3duKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb3V0cHV0PWN0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyLlxuIjsKKyAgb3V0cHV0Kz0iICAgIEdydW5kOiAiK3JlYXNvbjsKKyAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgIGVmdW46OnNodXRkb3duKCk7CisgIHJldHVybiAxOworfQorCisvLyAqIGxvd2VyY2hhcgorCitpbnQgbG93ZXJjaGFyKGludCBjaGFyKSB7CisgIGlmIChjaGFyPCdBJyB8fCBjaGFyPidaJykgcmV0dXJuIGNoYXI7CisgIHJldHVybiBjaGFyKzMyOworfQorCisvLyAqIHVwcGVyc3RyaW5nCisKK3N0cmluZyB1cHBlcnN0cmluZyhzdHJpbmcgcykKK3sKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHVwcGVyX2Nhc2UpCisgIHJldHVybih1cHBlcl9jYXNlKHMpKTsKKyNlbHNlCisgIGludCBpOworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pIHNbaV09KChzW2ldPCdhJ3x8c1tpXT4neicpP3NbaV06c1tpXS0zMik7CisgIHJldHVybiBzOworI2VuZGlmCit9CisKKy8vICogbG93ZXJzdHJpbmcKKworc3RyaW5nIGxvd2Vyc3RyaW5nKHN0cmluZyBzKQoreworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICByZXR1cm4gbG93ZXJfY2FzZShzKTsKK30KKworCisvLyAqIEdEIHZlcnNpb24KK3N0cmluZyB2ZXJzaW9uKCkKK3sKKyAgcmV0dXJuIF9fVkVSU0lPTl9fOworfQorCisvLyAqIGJyZWFrX3N0cmluZworLy8gc3RyZXRjaCgpIC0tIHN0cmV0Y2ggYSBsaW5lIHRvIGZpbGwgYSBnaXZlbiB3aWR0aCAKK3ByaXZhdGUgc3RyaW5nIHN0cmV0Y2goc3RyaW5nIHMsIGludCB3aWR0aCkgeworICBpbnQgbGVuPXNpemVvZihzKTsKKyAgaWYgKGxlbj09d2lkdGgpIHJldHVybiBzOworCisgIC8vIHJlaW5lIExlZXJ6ZWlsZW4sIGRpcmVrdCB6dXJ1ZWNrZ2ViZW4KKyAgc3RyaW5nIHRyaW1tZWQ9dHJpbShzLFRSSU1fTEVGVCwiICIpOworICBpZiAodHJpbW1lZD09IiIpIHJldHVybiBzOyAKKyAgaW50IHN0YXJ0X3NwYWNlcyA9IGxlbiAtIHNpemVvZih0cmltbWVkKTsKKworICBzdHJpbmcqIHdvcmRzID0gZXhwbG9kZSh0cmltbWVkLCAiICIpOworICAvLyBkZXIgbGV0enRlIGtyaWVndCBrZWluZSBTcGFjZXMKKyAgaW50IHdvcmRfY291bnQ9c2l6ZW9mKHdvcmRzKSAtIDE7CisgIC8vIHdlbm4gWmVpbGUgbnVyIGF1cyBlaW5lbSBXb3J0LCB3aXJkIGRhcyBXb3J0IHp1cnVlY2tnZWdlYmVuCisgIGlmICghd29yZF9jb3VudCkKKyAgICByZXR1cm4gIiAiKnN0YXJ0X3NwYWNlcyArIHdvcmRzWzBdOworCisgIGludCBzcGFjZV9jb3VudCA9IHdpZHRoIC0gbGVuOworCisgIGludCBzcGFjZV9wZXJfd29yZD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgLyB3b3JkX2NvdW50OworICAvLyBBbnouV29lcnRlciBtaXQgWnVzYXR6LVNwYWNlCisgIGludCByZXN0PSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAlIHdvcmRfY291bnQ7IAorICAvLyBSZXN0LVNwYWNlcyBWZXJ0ZWlsZW4KKyAgZm9yZWFjaCAoaW50IHBvcyA6IHJlc3QpIHdvcmRzW3Bvc10rPSIgIjsKKyAgcmV0dXJuICgiICIqc3RhcnRfc3BhY2VzKSArIGltcGxvZGUoIHdvcmRzLCAiICIqc3BhY2VfcGVyX3dvcmQgKTsKK30KKworLy8gYXVzIEdlc2Nod2luZGlna2VpdHNncnVlbmRlbiBoYXQgZGVyIEJsb2Nrc2F0eiBmdWVyIGJyZWFrX3N0cmluZyBlaW5lCisvLyBlaWdlbmUgRnVua3Rpb24gYmVrb21tZW46Citwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIGJsb2NrX3N0cmluZyhzdHJpbmcgcywgaW50IHdpZHRoLCBpbnQgZmxhZ3MpIHsKKyAgLy8gd2VubiBCU19MRUFWRV9NWV9MRlMsIGFiZXIga2VpbiBCU19OT19QQVJJTkRFTlQsIGRhbm4gd2VyZGVuIFplaWxlbiBtaXQKKyAgLy8gZWluZW0gTGVlcnplaWNoZW4gYmVnb25uZW4uCisgIC8vIEJUVzogV2VubiAhQlNfTEVBVkVfTVlfTEZTLCBoYXQgZGVyIEF1ZnJ1ZmVyIGJlcmVpdHMgYWxsZSBcbiBkdXJjaCAiICIKKyAgLy8gZXJzZXR6dC4KKyAgaWYgKCAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpCisgICAgICAmJiAhKGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSkKKyAgeworICAgICAgcyA9ICIgIityZWdyZXBsYWNlKHMsIlxuIiwiXG4gIiwxKTsKKyAgfQorCisgIC8vIHNwcmludGYgZnVlbGx0IGRpZSBsZXR6dGUgWmVpbGUgYXVmIGRpZSBGZWxkYnJlaXRlIChoaWVyIGFsc28KKyAgLy8gWmVpbGVuYnJlaXRlKSBtaXQgRnVlbGx6ZWljaGVuIGF1Ziwgd2VubiBzaWUgTklDSFQgbWl0IFxuIHVtZ2Vicm9jaGVuCisgIC8vIGlzdC4gRXMgd2lyZCBhbiBkaWUgbGV0enRlIFplaWxlIGFiZXIga2VpbiBaZWlsZW51bWJydWNoIGFuZ2VoYWVuZ3QuCisgIC8vIEVpZ2VudGxpY2ggaXN0IGRhcyBBdWZmdWVsbGVuIGRvb2YsIGFiZXIgdmVybXV0bGljaCBpc3QgZXMgdW5ub2V0aWcsIGVzCisgIC8vIHdpZWRlciBydWVja2dhZW5naWcgenUgbWFjaGVuLgorICBzID0gc3ByaW50ZiggIiUtKj1zIiwgd2lkdGgsIHMpOworCisgIHN0cmluZyAqdG1wPWV4cGxvZGUocywgIlxuIik7CisgIC8vIE51ciB3ZW5uIHMgbWVocnplaWxpZyBpc3QsIEJsb2Nrc2F0eiBkcmF1cyBtYWNoZW4uIERpZSBsZXR6dGUgWmVpbGUgd2lyZAorICAvLyBuYXR1ZXJsaWNoIG5pY2h0IGdlZGVobnQuIFNpZSBpc3QgZGFmdWVyIHNjaG9uIHZvbiBzcHJpbnRmKCkgYXVmZ2VmdWVsbHQKKyAgLy8gd29yZGVuLiBCVFc6IERpZSBsZXR6dGUgWmVpbGUgZW5kZXQgdS5VLiBub2NoIG5pY2h0IG1pdCBlaW5lbSBcbiAoYnp3LgorICAvLyBudXIgZGFubiwgd2VubiBCU19MRUFWRV9NWV9MRlMgdW5kIGRlciB1ZWJlcmdlYmVuZSBUZXh0IHNjaG9uIG5lbiBcbiBhbQorICAvLyBFbmRlIGRlciBsZXR6dGVuIFplaWxlIGhhdCksIGRhcyBtYWNodCBkZXIgQXVmcnVmZXIuLi4KKyAgaWYgKHNpemVvZih0bXApID4gMSkKKyAgICByZXR1cm4gaW1wbG9kZSggbWFwKCB0bXBbMC4uPDJdLCAjJ3N0cmV0Y2gvKicqLywgd2lkdGggKSwgIlxuIiApIAorICAgICAgKyAiXG4iICsgdG1wWzwxXTsKKworICByZXR1cm4gczsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgcywgaW50IHcsIG1peGVkIGluZGVudCwgaW50IGZsYWdzKQoreworICAgIGlmICggIXMgfHwgcyA9PSAiIiApIHJldHVybiAiIjsKKworICAgIGlmICggIXcgKSB3PTc4OworCisgICAgaWYoIGludHAoaW5kZW50KSApCisgICAgICAgaW5kZW50ID0gaW5kZW50ID8gIiAiKmluZGVudCA6ICIiOworCisgICAgaW50IGluZGVudGxlbj1zdHJpbmdwKGluZGVudCkgPyBzaXplb2YoaW5kZW50KSA6IDA7CisKKyAgICBpZiAoaW5kZW50bGVuPncpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJicmVha19zdHJpbmc6IGluZGVudCBsb25nZXIgJWQgdGhhbiB3aWR0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGluZGVudGxlbix3KSk7CisgICAgICAvLyB3PSgoaW5kZW50bGVuL3cpKzEpKnc7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpKSAKKyAgICAgIHM9cmVncmVwbGFjZSggcywgIlxuIiwgIiAiLCAxICk7CisKKyAgICBpZiAoIGZsYWdzICYgQlNfU0lOR0xFX1NQQUNFICkKKyAgICAgICBzID0gcmVncmVwbGFjZSggcywgIihefFxufCApICAqIiwgIlxcMSIsIDEgKTsKKyAKKyAgICBzdHJpbmcgcHJlZml4PSIiOworICAgIGlmIChpbmRlbnRsZW4gJiYgZmxhZ3MgJiBCU19QUkVQRU5EX0lOREVOVCkgeworICAgICAgaWYgKGluZGVudGxlbitzaXplb2YocykgPiB3IHx8IAorICAgICAgICAgKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSAmJiBzdHJzdHIocywiXG4iKT4tMSkgeworICAgICAgIHByZWZpeD1pbmRlbnQrIlxuIjsKKyAgICAgICBpbmRlbnQ9KGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSA/ICIiIDogIiAiOworICAgICAgIGluZGVudGxlbj1zaXplb2YoaW5kZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZsYWdzICYgQlNfQkxPQ0sgKSB7CisgICAgICAvKgorICAgICAgICAgICBzID0gaW1wbG9kZSggbWFwKCBleHBsb2RlKCBzLCAiXG4iICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydibG9ja19zdHJpbmcsIHcsIGluZGVudGxlbiwgZmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICIiICk7CisgICAgICAqLworICAgICAgcyA9IGJsb2NrX3N0cmluZyggcyAsIHcgLSBpbmRlbnRsZW4sIGZsYWdzICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcyA9IHNwcmludGYoIiUtMS4qPXMiLHctaW5kZW50bGVuLHMpOworICAgIH0KKyAgICBpZiAoIHNbPDFdICE9ICdcbicgKSBzICs9ICJcbiI7CisKKyAgICBpZiAoICFpbmRlbnRsZW4gKSByZXR1cm4gcHJlZml4ICsgczsKKyAgICAKKyAgICBzdHJpbmcgaW5kZW50MiA9ICggZmxhZ3MgJiBCU19JTkRFTlRfT05DRSApID8gKCIgIippbmRlbnRsZW4pIDppbmRlbnQ7CisgICAgICAKKyAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgCisgICAgICByZWdyZXBsYWNlKCBzWzAuLjwyXSwgIlxuIiwgIlxuIitpbmRlbnQyLCAxICkgKyAiXG4iOworICAgICAgLyoKKyAgICAgICBzdHJpbmcgKmJ1ZjsKKworICAgICAgIGJ1ZiA9IGV4cGxvZGUoIHMsICJcbiIgKTsKKyAgICAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgaW1wbG9kZSggYnVmWzAuLjwyXSwgIlxuIitpbmRlbnQyICkgKyBidWZbPDFdICsgIlxuIjsKKyAgICAgICovCit9CisKKy8vICogRWxlbWVudGUgYXVzIG1hcHBpbmcgbG9lc2NoZW4gLSBtYXBwaW5nIHZvcmhlciBrb3BpZXJlbgorCittYXBwaW5nIG1fY29weV9kZWxldGUobWFwcGluZyBtLCBtaXhlZCBrZXkpIHsKKyAgcmV0dXJuIG1fZGVsZXRlKGNvcHkobSksIGtleSk7Cit9CisKKy8vICogdGltZXMKK2ludCBsYXN0X3JlYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIF9fQk9PVF9USU1FX187Cit9CisKK2ludCBmaXJzdF9ib290X3RpbWUoKQoreworICByZXR1cm4gNzAxNTE3NjAwOworfQorCitpbnQgZXhpc3RfZGF5cygpCit7CisgIHJldHVybiAoKCh0aW1lKCktZmlyc3RfYm9vdF90aW1lKCkpLzg2NDApKzUpLzEwOworfQorCisvLyAqIHVwdGltZSA6KQorc3RyaW5nIHVwdGltZSgpCit7CisgIGludCB0OworICBpbnQgdG1wOworICBzdHJpbmcgczsKKworICB0PXRpbWUoKS1fX0JPT1RfVElNRV9fOworICBzPSIiOworICBpZiAodD49ODY0MDApCisgICAgcys9c3ByaW50ZigiJWQgVGFnJXMsICIsdG1wPXQvODY0MDAsKHRtcD09MT8iIjoiZSIpKTsKKyAgaWYgKHQ+PTM2MDApCisgICAgcys9c3ByaW50ZigiJWQgU3R1bmRlJXMsICIsdG1wPSh0PXQlODY0MDApLzM2MDAsKHRtcD09MT8iIjoibiIpKTsKKyAgaWYgKHQ+NjApCisgICAgcys9c3ByaW50ZigiJWQgTWludXRlJXMgdW5kICIsdG1wPSh0PXQlMzYwMCkvNjAsKHRtcD09MT8iIjoibiIpKTsKKyAgcmV0dXJuIHMrc3ByaW50ZigiJWQgU2VrdW5kZSVzIix0PXQlNjAsKHQ9PTE/IiI6Im4iKSk7Cit9CisKKy8vICogV2FzIHR1biBiZWkgJ2RhbmdsaW5nJyBsZnVuLWNsb3N1cmVzID8KK3ZvaWQgZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlKCkgeworICByYWlzZV9lcnJvcigiZGFuZ2xpbmcgbGZ1biBjbG9zdXJlXG4iKTsKK30KKworLy8gKiBTcGVycmVuIGF1c3NlciBmdWVyIG1hc3Rlci9zaW11bF9lZnVuCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHNldF9lbnZpcm9ubWVudCkKK25vbWFzayB2b2lkIHNldF9lbnZpcm9ubWVudChvYmplY3QgbzEsIG9iamVjdCBvMikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKK25vbWFzayB2b2lkIHNldF90aGlzX3BsYXllcihvYmplY3QgcGwpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZXhwb3J0X3VpZCkKK25vbWFzayB2b2lkIGV4cG9ydF91aWQob2JqZWN0IG9iKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworLy8gKiBKZXR6dCBhdWNoIGNsb3N1cmVzCitpbnQgcHJvY2Vzc19mbGFnOworCitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKQoreworICBpZiAocHJvY2Vzc19mbGFnPjApCisgICAgcmV0dXJuIHByb2Nlc3NfZmxhZzsKKyAgZWxzZSByZXR1cm4oMCk7Cit9CisKK3ByaXZhdGUgbm9tYXNrIHN0cmluZyBfcHJvY2Vzc19zdHJpbmcoc3RyaW5nIHN0cixvYmplY3QgcG8pIHsKKyAgICAgICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgICAgICAgICAgcmV0dXJuKGVmdW46OnByb2Nlc3Nfc3RyaW5nKHN0cikpOworfQorCitub21hc2sgc3RyaW5nIHByb2Nlc3Nfc3RyaW5nKCBtaXhlZCBzdHIgKQoreworICBzdHJpbmcgdG1wLCBlcnI7CisgIGludCBmbGFnOyAKKworICBpZiAoIGNsb3N1cmVwKHN0cikgKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgICByZXR1cm4gZnVuY2FsbChzdHIpOworICB9CisgIGVsc2UgaWYgKHN0cj09MCkKKyAgICAgIHJldHVybigoc3RyaW5nKXN0cik7CisgIGVsc2UgaWYgKCAhc3RyaW5ncChzdHIpICkgeworICAgICAgcmV0dXJuIHRvX3N0cmluZyhzdHIpOworICB9CisKKyAgaWYgKCAhKGZsYWcgPSBwcm9jZXNzX2ZsYWcgPiB0aW1lKCkgLSA2MCkpICAgICAgICAgICAgICAgICAgICAgCisgICAgICBwcm9jZXNzX2ZsYWc9dGltZSgpOworCisgIGVyciA9IGNhdGNoKHRtcCA9IGZ1bmNhbGwoIydfcHJvY2Vzc19zdHJpbmcsc3RyLHByZXZpb3VzX29iamVjdCgpKTsgcHVibGlzaCk7CisKKyAgaWYgKCAhZmxhZyApCisgICAgcHJvY2Vzc19mbGFnPTA7CisKKyAgaWYgKGVycikgeworICAgIC8vIFZlcmFyYmVpdHVuZyBhYmJyZWNoZW4KKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKGVycik7CisgIH0KKyAgcmV0dXJuIHRtcDsKK30KKworLy8gJ21rZGlyIC1wJyAtIGVyemV1Z3QgZWluZSBrb21wbGV0dGUgSGllcmFyY2hpZSB2b24gVmVyemVpY2huaXNzZW4uCisvLyB3ZW5uIGRhcyBWZXJ6ZWljaG5pcyBhbmdlbGVndCB3dXJkZSBvZGVyIHNjaG9uIGV4aXN0aWVydCwgd2lyZCAxCisvLyB6dXJ1ZWNrZ2VsaWVmZXJ0LCBzb25zdCAwLgorLy8gV2lyZnQgZWluZW4gRmVobGVyLCB3ZW5uIGRhcyBhbmdlYmVuZSBWZXJ6ZWljaG5pcyBuaWNodCBhYnNvbHV0IGlzdCEKK3B1YmxpYyBpbnQgbWtkaXJwKHN0cmluZyBkaXIpIHsKKyAgLy8gd2VubiBlcyBudXIga2VpbmVuIGZ1ZWhyZW5kZW4gLyBnaWJ0LCBpc3QgZGFzIGVpbiBGZWhsZXIuCisgIGlmIChzdHJzdHIoZGlyLCAiLyIpICE9IDApCisgICAgcmFpc2VfZXJyb3IoIm1rZGlycCgpOiBQZmFkIGlzdCBuaWNodCBhYnNvbHV0ZS5cbiIpOworICAvLyBjdXQgb2ZmIHRyYWlsaW5nIC8uLi4KKyAgaWYgKGRpcls8MV09PScvJykKKyAgICAgIGRpciA9IGRpclswLi48Ml07CisKKyAgaW50IGZzdGF0ID0gZmlsZV9zaXplKGRpcik7CisgIC8vIHdlbm4gZXMgc2Nob24gZXhpc3RpZXJ0LCB0dW4gd2lyIGVpbmZhY2ggc28sIGFscyBoYWV0dGVuIHdpciBlcyBhbmdlbGVndC4KKyAgaWYgKGZzdGF0ID09IEZTSVpFX0RJUikKKyAgICByZXR1cm4gMTsKKyAgLy8gd2VubiBzY2hvbiBuZSBEYXRlaSBleGlzdGllcnQsIGdlaHQgZXMgbmljaHQuCisgIGlmIChmc3RhdCAhPSBGU0laRV9OT0ZJTEUpCisgICAgcmV0dXJuIDA7CisgIC8vIHdlbm4gZXMgbnVyIGVpbmVuIC8gZ2lidCAoZGVuIGZ1ZWhyZW5kZW4pLCBkYW5uIGlzdCBlcyBlaW4KKyAgLy8gdG9wbGV2ZWwtdmVyemVpY2huaXMsIHdhcyBkaXJla3QgYW5nZWxlZ3Qgd2lyZC4KKyAgaWYgKHN0cnJzdHIoZGlyLCIvIik9PTApIHsKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7CisgIH0KKworICAvLyBta2RpcigpIG5pY2h0IGRpcmVrdCBydWZlbiwgc29uZGVybiB2b3JoZXIgYWxzIGNsb3N1cmUgYW5zIGF1ZnJ1ZmVuZGUKKyAgLy8gT2JqZWt0IGJpbmRlbi4gU29uc3QgbGFldWZ0IGRpZSBSZWNodGVwcnVlZnVuZyBpbiB2YWxpZF93cml0ZSgpIGltIE1hc3RlcgorICAvLyB1bnRlciBkZXIgQW5uYWhtZSwgZGFzcyBkaWUgc2ltdWxfZWZ1bi5jIG1pdCBpaHJlciByb290IGlkIHdhcyB3aWxsLgorCisgIC8vIGpldHp0IHJla3Vyc2l2IGRpZSBWZXJ6ZWljaG5pc2hpZXJhcmNoaWUgYW5sZWdlbi4gV2VubiBkYXMgZXJmb2xncmVpY2gKKyAgLy8gaXN0LCBkYW5uIGtvZW5uZW4gd2lyIGpldHp0IG1pdCBta2RpciBkYXMgdGllZnN0ZSBWZXJ6ZWljaG5pcyBhbmxlZ2VuCisgIGlmIChta2RpcnAoZGlyWzAuLnN0cnJzdHIoZGlyLCIvIiktMV0pID09IDEpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworfQorCisKKy8vICogUHJvcGVydGllcyBnZ2ZzLiBtaXRzcGVpY2hlcm4KK21peGVkIHNhdmVfb2JqZWN0KG1peGVkIG5hbWUpCit7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgbWFwcGluZyBzYXZlOworICBtaXhlZCBpbmRleCwgcmVzOworICBpbnQgaTsKKworICAvLyBudXIgU3RyaW5ncyB1bmQgMCB6dWxhc3NlbgorICBpZiAoKCFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpICYmIAorICAgICAgKCFpbnRwKG5hbWUpIHx8IG5hbWUhPTApKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IG5vbi1lbXB0eSBzdHJpbmdzIGFuZCAwIG1heSBiZSB1c2VkIGFzIGZpbGVuYW1lIGluICIKKyAgICAgICAgICJzZWZ1bjo6c2F2ZV9vYmplY3QoKSEgQXJndW1lbnQgd2FzICVPXG4iLG5hbWUpKTsKKyAgfQorCisgIHNhdmUgPSBtX2FsbG9jYXRlKDAsIDIpOworICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisgIGlmKG1hcHBpbmdwKHByb3BlcnRpZXMpKQorICB7CisgICAgLy8gZGVsZXRlIGFsbCBlbnRyaWVzIGluIG1hcHBpbmcgcHJvcGVydGllcyB3aXRob3V0IFNBVkUgZmxhZyEKKyAgICBpbmRleCA9IG1faW5kaWNlcyhwcm9wZXJ0aWVzKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDtpLS0pCisgICAgeworICAgICAgaWYocHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmIFNBVkUpCisgICAgICB7CisgICAgICAgc2F2ZVtpbmRleFtpXV0gPSBwcm9wZXJ0aWVzW2luZGV4W2ldXTsKKyAgICAgICBzYXZlW2luZGV4W2ldLCBGX01PREVdID0KKyAgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYKKyAgICAgICAgICAgICAgICAgICAgKH4oU0VUTU5PVEZPVU5EfFFVRVJZTU5PVEZPVU5EfFFVRVJZQ0FDSEVEfFNFVENBQ0hFRCkpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHNhdmUgPSAoW10pOworCisgIC8vIHNhdmUgb2JqZWN0IQorICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoc2F2ZSk7CisgIC8vIGZvcm1hdDogd2llIGRlZmluaWVydCBpbiBjb25maWcuaAorICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgZWxzZQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICAgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICBlbHNlCisgICAgICBzdGF0LT5zaXplb2YocmVzKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbzogIitzYXZlb19zdGF0WzBdKyJcbiIpOworICBzYXZlb19zdGF0WzFdW3NhdmVvX3N0YXRbMF1dID0gc3RhdDsKKyAgc2F2ZW9fc3RhdFswXSA9IChzYXZlb19zdGF0WzBdICsgMSkgJSBzaXplb2Yoc2F2ZW9fc3RhdFsxXSk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW8gMjogIitzYXZlb19zdGF0WzBdKyJcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gKiBBdWNoIFByb3BlcnRpZXMgbGFkZW4KK2ludCByZXN0b3JlX29iamVjdChzdHJpbmcgbmFtZSkKK3sKKyAgaW50IHJlc3VsdDsKKyAgbWl4ZWQgaW5kZXg7CisgIG1peGVkIHNhdmU7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgaW50IGk7CisgIGNsb3N1cmUgY2w7CisKKyAgLy8gZ2V0IGFjdHVhbCBwcm9wZXJ0eSBzZXR0aW5ncyAoYnkgY3JlYXRlKCkpCisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKy8vICBERUJVRyhzcHJpbnRmKCJSRVNUT1JFICVPXG4iLG5hbWUpKTsKKyAgLy8gcmVzdG9yZSBvYmplY3QKKyAgcmVzdWx0PWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpyZXN0b3JlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lKTsKKyAgLy8nKSkKKyAgLy9fZ2V0X3NhdmVfZGF0YSBsaWVmZXJ0IHRhdHNhZWNobGljaCBtaXhlZCB6dXJ1ZWNrLCB3ZW5uIGRhcyBhdWNoIGltbWVyIGVpbiAKKyAgLy9tYXBwaW5nIHNlaW4gc29sbHRlLgorICBzYXZlID0gKG1peGVkKXByZXZpb3VzX29iamVjdCgpLT5fZ2V0X3NhdmVfZGF0YSgpOworICBpZihtYXBwaW5ncChzYXZlKSkKKyAgeworICAgIGluZGV4ID0gbV9pbmRpY2VzKHNhdmUpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgcHJvcGVydGllc1tpbmRleFtpXV0gPSBzYXZlW2luZGV4W2ldXTsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gPSBzYXZlW2luZGV4W2ldLCBGX01PREVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJn4oU0VUQ0FDSEVEfFFVRVJZQ0FDSEVEKTsKKyAgICB9CisgIH0KKyAgZWxzZSBwcm9wZXJ0aWVzID0gKFtdKTsKKworICAvLyByZXN0b3JlIHByb3BlcnRpZXMKKyAgZnVuY2FsbCgKKyAgICAgICAgICBiaW5kX2xhbWJkYSgKKyAgICAgICAgICAgICAgICAgICAgIHVuYm91bmRfbGFtYmRhKCh7J2FyZ30pLCAvLyd9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCh7Iyd0aGlzX29iamVjdH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRQcm9wZXJ0aWVzIiwnYXJnfSkpLC8vJykKKyAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSxwcm9wZXJ0aWVzKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICAvL2RlYnVnX21lc3NhZ2UoInJlc3RvcmVvOiAiK3Jlc3RvcmVvX3N0YXRbMF0rIlxuIik7CisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgcmVzdG9yZW9fc3RhdFsxXVtyZXN0b3Jlb19zdGF0WzBdXSA9IHN0YXQ7CisKKyAgcmVzdG9yZW9fc3RhdFswXSA9IChyZXN0b3Jlb19zdGF0WzBdICsgMSkgJSBzaXplb2YocmVzdG9yZW9fc3RhdFsxXSk7CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAqIEhCIGVpbmVzIE9iamVrdGVzIGVpbi9hdXNzY2hhbHRlbgoraW50IHNldF9vYmplY3RfaGVhcnRfYmVhdChvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBpZiAob2JqZWN0cChvYikpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjb25maWd1cmVfb2JqZWN0LG9iKSwgb2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworfQorCisvLyAqIE1hZ2llcmxldmVsZ3J1cHBlbiBlcm1pdHRlbG4KK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeikKK3sKKyAgaW50IGxldjsKKworICBsZXY9cXVlcnlfd2l6X2xldmVsKHdpeik7CisgIGlmIChsZXY8U0VFUl9MVkwpIHJldHVybiAwOworICBpZiAobGV2Pj1HT0RfTFZMKSByZXR1cm4gbGV2OworICBpZiAobGV2Pj1BUkNIX0xWTCkgcmV0dXJuIEFSQ0hfR1JQOworICBpZiAobGV2Pj1FTERFUl9MVkwpIHJldHVybiBFTERFUl9HUlA7CisgIGlmIChsZXY+PUxPUkRfTFZMKSByZXR1cm4gTE9SRF9HUlA7CisgIGlmIChsZXY+PVNQRUNJQUxfTFZMKSByZXR1cm4gU1BFQ0lBTF9HUlA7CisgIGlmIChsZXY+PURPTUFJTk1FTUJFUl9MVkwpIHJldHVybiBET01BSU5NRU1CRVJfR1JQOworICBpZiAobGV2Pj1XSVpBUkRfTFZMKSByZXR1cm4gV0laQVJEX0dSUDsKKyAgaWYgKGxldj49TEVBUk5FUl9MVkwpIHJldHVybiBMRUFSTkVSX0dSUDsKKyAgcmV0dXJuIFNFRVJfR1JQOworfQorCittaXhlZCAqd2l6bGlzdF9pbmZvKCkKK3sKKyAgaWYgKEFSQ0hfU0VDVVJJVFkgfHwgIWV4dGVybl9jYWxsKCkpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIHJldHVybiAwOworfQorCisvLyAqIHdpemxpc3QgYXVzZ2ViZW4KK3ZhcmFyZ3Mgdm9pZCB3aXpsaXN0KHN0cmluZyBuYW1lLCBpbnQgc29ydGtleSApIHsKKworICBpZiAoIW5hbWUpCisgIHsKKyAgICBpZiAodGhpc19wbGF5ZXIoKSkKKyAgICAgIG5hbWUgPSBnZXR1aWQodGhpc19wbGF5ZXIoKSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gU2NobHVlc3NlbCBkYXJmIG51ciBpbiBlaW5lbSBndWVsdGlnZW4gQmVyZWljaCBzZWluCisgIGlmIChzb3J0a2V5PFdMX05BTUUgfHwgc29ydGtleT49V0xfU0laRSkgc29ydGtleT1XTF9DT1NUOworCisgIG1peGVkKiogd2wgPSBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgLy8gbmFjaCA8c29ydGtleT4gc29ydGllcmVuCisgIHdsID0gc29ydF9hcnJheSh3bCwgZnVuY3Rpb24gaW50IChtaXhlZCBhLCBtaXhlZCBiKQorICAgICAge3JldHVybiBhW3NvcnRrZXldIDwgYltzb3J0a2V5XTsgfSApOworCisgIC8vIFN1bW1lIHVlYmVyIGFsbGUgS29tbWFuZG9zIGVybWl0dGVsbi4KKyAgaW50IHRvdGFsX2NtZCwgaTsKKyAgaW50IHBvcz0tMTsKKyAgZm9yZWFjaChtaXhlZCBlbnRyeSA6IHdsKQorICB7CisgICAgdG90YWxfY21kICs9IGVudHJ5W1dMX0NPTU1BTkRTXTsKKyAgICBpZiAoZW50cnlbV0xfTkFNRV0gPT0gbmFtZSkKKyAgICAgIHBvcyA9IGk7CisgICAgKytpOworICB9CisKKyAgaWYgKHBvcyA8IDAgJiYgbmFtZSAhPSAiQUxMIiAmJiBuYW1lICE9ICJUT1AxMDAiKQorICAgIHJldHVybjsKKworICBpZiAobmFtZSA9PSAiVE9QMTAwIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpID4gMTAwKQorICAgICAgd2wgPSB3bFswLi4xMDBdOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKyAgLy8gdW0gbmFtZSBoZXJ1bSBzY2huZWlkZW4KKyAgZWxzZSBpZiAobmFtZSAhPSAiQUxMIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpIDw9IDIxKQorICAgICAgd2wgPSB3bDsKKyAgICBlbHNlIGlmIChwb3MgKyAxMCA8IHNpemVvZih3bCkgJiYgcG9zIC0gMTAgPiAwKQorICAgICAgd2wgPSB3bFtwb3MtMTAuLnBvcysxMF07CisgICAgZWxzZSBpZiAocG9zIDw9MjEpCisgICAgICB3bCA9IHdsWzAuLjIwXTsKKyAgICBlbHNlIGlmIChwb3MgPj0gc2l6ZW9mKHdsKSAtIDIxKQorICAgICAgd2wgPSB3bFs8MjEuLl07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorCisgIHdyaXRlKCJcbldpemFyZCB0b3Agc2NvcmUgbGlzdFxuXG4iKTsKKyAgaWYgKHRvdGFsX2NtZCA9PSAwKQorICAgIHRvdGFsX2NtZCA9IDE7CisgIHByaW50ZigiJS0yMHMgJS02cyAlLTNzICUtMTdzICUtNnMgJS02cyAlLTZzXG4iLAorICAgICAgICAgIkVVSUQiLCAiY21kcyIsICIlIiwgIkNvc3RzIiwgIkhCIiwgIkFycmF5cyIsIk1hcHAuIik7CisgIGZvcmVhY2gobWl4ZWQgZTogd2wpCisgIHsKKyAgICBwcmludGYoIiUtOjIwcyAlOjZkICU6MmQlJSBbJTo2ZGssJTo2ZEddICU6NmQgJTo2ZCAlOjZkXG4iLAorICAgICAgICAgIGVbV0xfTkFNRV0sIGVbV0xfQ09NTUFORFNdLCBlW1dMX0NPTU1BTkRTXSAqIDEwMCAvIHRvdGFsX2NtZCwKKyAgICAgICAgICBlW1dMX0NPU1RdIC8gMTAwMCwgZVtXTF9UT1RBTF9HSUdBQ09TVF0sCisgICAgICAgICAgZVtXTF9IRUFSVF9CRUFUU10sIGVbV0xfQVJSQVlfVE9UQUxdLCBlW1dMX01BUFBJTkdfVE9UQUxdCisgICAgICAgICAgKTsKKyAgfQorICBwcmludGYoIlxuVG90YWwgICAgICAgICAlN2QgICAgICAgICAoJWQpXG5cbiIsIHRvdGFsX2NtZCwgc2l6ZW9mKHdsKSk7Cit9CisKKworLy8gQWIgaGllciBmb2xnZW4gSGlsZnNmdW5rdGlvbmVuIGZ1ZXIgY2FsbF9vdXQoKSBiencuIGZ1ZXIgZGVyZW4gQmVncmVuenVuZworCisvLyBlcm1pdHRlbHQgZGFzIE9iamVrdCBkZXMgQ2FsbG91dHMuCitwcml2YXRlIG9iamVjdCBfY2FsbF9vdXRfb2JqKCBtaXhlZCBjYWxsX291dCApIHsKKyAgICByZXR1cm4gcG9pbnRlcnAoY2FsbF9vdXQpID8gY2FsbF9vdXRbMF0gOiAwOworfQorCitwcml2YXRlIHZvaWQgX3NhbWVfb2JqZWN0KCBvYmplY3Qgb2IsIG1hcHBpbmcgbSApIHsKKyAgLy8gaXN0IG5pY2h0IHNvIGJsb2VkLCB3aWUgZXMgYXVzc2llaHQsIHMuIG5hY2hmb2xnZWRlIFZlcndlbmR1bmcgdm9uIG0KKyAgaWYgKCBtW29iXSApCisgICAgbVtvYl0gKz0gKHsgb2IgfSk7CisgIGVsc2UKKyAgICBtW29iXSA9ICh7IG9iIH0pOyAKK30KKworLy8gYWxsZSBPYmpla3RlIGltIE1hcHBpbmcgbSB6dXNhbW1lbmZhc3NlbiwgZGllIGRlbiBnbGVpY2hlbiBMb2FkbmFtZSAoTmFtZSBkZXIKKy8vIEJsdWVwcmludCkgaGFiZW4sIGFsc28gYWxsZSBDbG9uZXMgZGVyIEJQLCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLgorLy8gT2JqZWt0ZSB3ZXJkZW4gYXVjaCBtZWhyZmFjaCBlcmZhc3N0LCBqZSBuYWNoIEFuemFobCBpaHJlciBDYWxsb3V0cy4KK3ByaXZhdGUgdm9pZCBfc2FtZV9wYXRoKCBvYmplY3Qga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtICkgeworICBzdHJpbmcgcGF0aDsKKyAgaWYgKCFvYmplY3RwKGtleSkgfHwgIXBvaW50ZXJwKG9icykpIHJldHVybjsKKworICBwYXRoID0gbG9hZF9uYW1lKGtleSk7CisKKyAgaWYgKCBtW3BhdGhdICkKKyAgICBtW3BhdGhdICs9IG9iczsKKyAgZWxzZQorICAgIG1bcGF0aF0gPSBvYnM7Cit9CisKKy8vIGtleSBrYW5uIG9iamVjdCBvZGVyIHN0cmluZyBzZWluLgorcHJpdmF0ZSBpbnQgX3Rvb19tYW55KCBtaXhlZCBrZXksIG1hcHBpbmcgbSwgaW50IGkgKSB7CisgICAgcmV0dXJuIHNpemVvZihtW2tleV0pID49IGk7Cit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbiBvYnMgemVyc3RvZXJlbiB1bmQgRmVobGVybWVsZHVuZyBhdXNnZWJlbi4gQUNIVFVORzogRGllCisvLyBPYmpla3RlIHdlcmRlbiBpZFIgenUgZWluZXIgQlAgZ2Vob2VyZW4sIG11ZXNzZW4gYWJlciBuaWNodCEgSW4gZGVtIEZhbGwKKy8vIHdpcmQgYXVmIGRlciBFYmVuZSBhYmVyIG51ciBlaW4gT2JqZWt0IGluIGRlciBGZWhsZXJtZWxkdW5nIGVyd2FlaG50LgorcHJpdmF0ZSB2b2lkIF9kZXN0cm95KCBtaXhlZCBrZXksIG9iamVjdCAqb2JzLCBzdHJpbmcgdGV4dCwgaW50IHVpZCApIHsKKyAgICBpZiAoIXBvaW50ZXJwKG9icykpIHJldHVybjsKKyAgICAvLyBBcnJheSBtaXQgdW5pcXVlIEVpbnRyYWVnZSBlcnpldWdlbi4KKyAgICBvYnMgPSBtX2luZGljZXMoIG1rbWFwcGluZyhvYnMpICk7CisgICAgLy8gRmVobGVybWVsZHVuZyBhdWYgZGVyIEViZW5lIGF1c2dlYmVuLCBpbSBjYXRjaCgpIG1pdCBwdWJsaXNoLCBkYW1pdCBlcworICAgIC8vIGF1ZiBkZXIgRWJlbmUgZGlyZWt0IHNjcm9sbHQsIGRlciBiYWNrdHJhY2UgdmVyZnVlZ2JhciBpc3QgKGltCisgICAgLy8gZ2VnZW5zYXR6IHp1ciBMb2VzdW5nIG1pdHRlbHMgQ2FsbG91dCksIGRpZSBBdXNmdWVocnVuZyBhYmVyIHdlaXRlcgorICAgIC8vIGxhZXVmdC4KKyAgICBjYXRjaCggZWZ1bjo6cmFpc2VfZXJyb3IoICAgICAgICAgICAKKyAgICAgICAgIHNwcmludGYoIHRleHQsICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICB1aWQgPyAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoa2V5KSA6IGtleSwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHNpemVvZihvYnMpLCBvYmplY3RfbmFtZShvYnNbPDFdKSApICk7cHVibGlzaCk7CisgICAgLy8gVW5kIHdlZyBtaXQgZGVtIEtyYW0uLi4KKyAgICBmaWx0ZXIoIG9icywgIydlZnVuOjpkZXN0cnVjdC8qJyovICk7Cit9CisKKy8vIEFsbGUgT2JqZWt0IGVpbmVyIFVJRCBpbSBNYXBwaW5nIG0gbWl0IFVJRCBhbHMgS0V5cyB6dXNhbW1lbmZhc3Nlbi4gT2JqZWt0CisvLyBzaW5kIGRhYmVpIG5pY2h0IHVuaXF1ZS4KK3ByaXZhdGUgdm9pZCBfc2FtZV91aWQoIHN0cmluZyBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0sIGNsb3N1cmUgY2YgKSB7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCAhcG9pbnRlcnAob2JzKSB8fCAhc2l6ZW9mKG9icykgKQorICAgIHJldHVybjsKKworICB1aWQgPSBmdW5jYWxsKCBjZiwga2V5ICk7CisKKyAgaWYgKCBtW3VpZF0gKQorICAgIG1bdWlkXSArPSBvYnM7IC8vIG9icyBpc3QgbmVuIEFycmF5CisgIGVsc2UKKyAgICBtW3VpZF0gPSBvYnM7Cit9CisKK25vbWFzayB2YXJhcmdzIHZvaWQgY2FsbF9vdXQoIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkIHRtcCwgKmNhbGxfb3V0czsKKworICAgIC8vIEJlaSA+NjAwIENhbGxvdXRzIGFsbGUgT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyAzMCBDYWxsb3V0cyBsYXVmZW4KKyAgICAvLyBoYWJlbi4KKyAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA2MDAKKyAgICAgICAgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElEICkKKyAgICB7CisgICAgICAgLy8gTG9nIGVyemV1Z2VuLi4uCisgICAgICAKKyAgICAgICAvLyBPYmpla3RlIGFsbGVyIENhbGxvdXRzIGVybWl0dGVsbgorICAgICAgIGNhbGxfb3V0cyA9IG1hcCggZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19jYWxsX291dF9vYmogKTsKKyAgICAgICBtYXBwaW5nIG9iamVjdG1hcCA9IChbXSk7CisgICAgICAgZmlsdGVyKCBjYWxsX291dHMsICMnX3NhbWVfb2JqZWN0LCAmb2JqZWN0bWFwICk7CisgICAgICAgLy8gTWFzdGVyIG5pY2h0IGdyaWxsZW4uLi4KKyAgICAgICBlZnVuOjptX2RlbGV0ZSggb2JqZWN0bWFwLCBtYXN0ZXIoMSkgKTsKKyAgICAgICAvLyBhbGxlIE9iamVrdGUgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICBtYXBwaW5nIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBvYmplY3RtYXAsICMnX3Rvb19tYW55LCBvYmplY3RtYXAsIDI5ICk7CisgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gS2V5IHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiB1ZWJlcmdlYmVuIChpbiBkaWVzZW0gRmFsbCBzaW5kIEtleXMgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIGpld2VpbHMgZGFzIGdsZWljaGUgT2JqZWt0KS4KKyAgICAgICBpZiAoIHNpemVvZihyZXMpICkgICAgICAgCisgICAgICAgICAgIHdhbGtfbWFwcGluZyhyZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSBzaW5nbGUgIiAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIm9iamVjdCBbJU9dLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgIC8vIEJlaSAoYXVjaCBuYWNoIGRlbSBlcnN0ZW4gQXVmcmFldW1lbiBub2NoKSA+ODAwIENhbGxvdXRzIGFsbGUKKyAgICAgICAvLyBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDUwIENhbGxvdXRzIGxhdWZlbiBoYWJlbiAtIHVuZAorICAgICAgIC8vIGRpZXNtYWwgemFlaGxlbiBDbG9uZXMgbmljaHQgZWlnZW5zdGFlbmRpZyEgRC5oLiBlcyB3ZXJkZW4gYWxsZQorICAgICAgIC8vIENsb25lcyBlaW5lciBCUCBnZWtpbGx0LCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLCBmYWxscyBhbGxlCisgICAgICAgLy8gZGllc2UgT2JqZWt0ZSBfenVzYW1tZW5fIG1laHIgYWxzIDUwIENhbGxvdXRzIGhhYmVuIQorICAgICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDgwMCApIHsKKyAgICAgICAgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIHZvbiBkZXIgbGV0enRlbiBBa3Rpb24gc2luZCBpbiBvYmplY3RtYXAgbmljaHQKKyAgICAgICAgICAgLy8gbWVociBkcmluLCBkYSBzaWUgZG9ydCBhbHMgS2V5cyB2ZXJ3ZW5kZXQgd3VyZGVuLgorICAgICAgICAgICBtYXBwaW5nIHBhdGhtYXA9KFtdKTsKKyAgICAgICAgICAgLy8gYWxsZSBPYmpla3QgZWluZXIgQlAgaW4gcmVzIHNvcnRpZXJlbiwgQlAtTmFtZSBhbHMgS2V5LCBBcnJheXMKKyAgICAgICAgICAgLy8gdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBvYmplY3RtYXAsICMnX3NhbWVfcGF0aCwgJnBhdGhtYXApOworICAgICAgICAgICAvLyBhbGxlIEJQcyAodW5kIGlocmUgT2JqZWt0ZSkgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHBhdGhtYXAsICMnX3Rvb19tYW55LyonKi8sIHBhdGhtYXAsIDUwICk7CisgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIGRpZSBDbG9uZXMKKyAgICAgICAgICAgLy8gdWViZXJnZWJlbiwgZGllIENhbGxvdXRzIGhhYmVuLgorICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3kvKicqLywgIkNBTExfT1VUIG92ZXJmbG93IGJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgICAgIC8vIFdlbm4gYmVpZGUgQXVmcmFldW1hcmJlaXRlbiBuaWNodHMgZ2VicmFjaHQgaGFiZW4gdW5kIGltbWVyCisgICAgICAgICAgIC8vIG5vY2ggPjEwMDAgQ2FsbG91dHMgbGF1ZmVuLCB3ZXJkZW4gZGllc21hbCBhbGxlIENhbGxvdXRzCisgICAgICAgICAgIC8vIGVpbmVyIFVJRCB6dXNhbW1lbmdlemFlaGx0LgorICAgICAgICAgICAvLyBBbGxlIE9iamVrdGUgZWluZXIgVUlELCBkaWUgZXMgaW4gU3VtbWUgYWxsZXIgaWhyZXIgT2JqZWt0IG1pdAorICAgICAgICAgICAvLyBDYWxsb3V0cyBhdWYgbWVociBhbHMgMTAwIENhbGxvdXRzIGJyaW5ndCwgd2VyZGVuIGdlcm9lc3RldC4KKyAgICAgICAgICAgaWYgKGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiAxMDAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGRhcyBuYWNoIEJQLU5hbWVuIHZvcmdlZmlsdGVydGUgTWFwcGluZyBqZXR6dCBuYWNoIFVJRHMKKyAgICAgICAgICAgICAgLy8genVzYW1tZW5zb3J0aWVyZW4uIFplcnN0b2VydGUgQ2xvbmVzIGZpbHRlciBfc2FtZV91aWQoKQorICAgICAgICAgICAgICAvLyByYXVzLgorICAgICAgICAgICAgICBtYXBwaW5nIHVpZG1hcD0oW10pOworICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHBhdGhtYXAsICMnX3NhbWVfdWlkLCAmdWlkbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCAiY3JlYXRvcl9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2VjdXJlL21hc3RlciIgKSApOworICAgICAgICAgICAgICAvLyBJbiByZXMgbnVuIFVJRHMgYWxzIEtleXMgdW5kIEFycmF5cyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICAgICAvLyBEaWUgcmF1c2ZpbHRlcm4sIGRpZSBtZWhyIGFscyAxMDAgT2JqZWt0ZSAobm9uLXVuaXF1ZSwgZC5oLgorICAgICAgICAgICAgICAvLyAxMDAgQ2FsbG91dHMhKSBoYWJlbi4KKyAgICAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHVpZG1hcCwgIydfdG9vX21hbnksIHVpZG1hcCwgMTAwICk7CisgICAgICAgICAgICAgIC8vIHVuZCBlcm5ldXQgdWViZXIgZGllIEtleXMgbGF1ZmVuIHVuZCBqZXdlaWxzIGRpZSBBcnJheXMgbWl0CisgICAgICAgICAgICAgIC8vIGRlbiBPYmpla3RlbiB6dXIgWmVyc3RvZXJ1bmcgYW4gX2Rlc3Ryb3koKS4uLgorICAgICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVJRCAnJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFsbHMgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IHplcnN0b2VydCB3dXJkZSBiZWltIEF1ZnJhZXVtZW4KKyAgICBpZiAoICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgIGFwcGx5KCAjJ2VmdW46OmNhbGxfb3V0LCBhcmdzICk7CisgICAgcmV0dXJuOworfQorCittaXhlZCBjYWxsX291dF9pbmZvKCkgeworICAKKyAgb2JqZWN0IHBvID0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG1peGVkIGNvaSA9IGVmdW46OmNhbGxfb3V0X2luZm8oKTsKKworICAvLyB1bmdlZmlsdGVydGVuIE91dHB1dCBudXIgZnVlciBiZXN0aW1tdGUgT2JqZWt0ZSwgT2JqZWt0ZSBpbiAvc3RkIG9kZXIKKyAgLy8gL29iaiBoYWJlbiBkaWUgQmFja2JvbmVJRC4KKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQocG8pKSA+PSBBUkNIX0xWTAorICAgICAgIHx8IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShsb2FkX25hbWUocG8pKSA9PSBCQUNLQk9ORUlEICkgeworICAgICAgcmV0dXJuIGNvaTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHJldHVybiBmaWx0ZXIoY29pLCBmdW5jdGlvbiBtaXhlZCAobWl4ZWQgYXJyKSB7CisgICAgICAgICAgICAgIGlmIChwb2ludGVycChhcnIpICYmIGFyclswXT09cG8pCisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICBlbHNlIHJldHVybiAwOyB9KTsKKyAgfQorfQorCisvLyAqIFp1IGVpbmVyIGNsb3N1cmUgZGFzIE9iamVrdCwgYW4gZGFzIHNpZSBnZWJ1bmRlbiBpc3QsIHN1Y2hlbgorbWl4ZWQgcXVlcnlfY2xvc3VyZV9vYmplY3QoY2xvc3VyZSBjKSB7CisgIHJldHVybgorICAgIENMT1NVUkVfSVNfVU5CT1VORF9MQU1CREEoZ2V0X3R5cGVfaW5mbyhjLCAxKSkgPworICAgICAgMCA6CisgICh0b19vYmplY3QoYykgfHwgLTEpOworfQorCisvLyAqIFdpciB3b2xsZW4gbnVyIEVJTiBBcmd1bWVudCAuLi4gYXVzc2VyZGVtIGNoZWNrcyBmdWVyIGRlbiBOZXR6dG90ZW5yYXVtCit2YXJhcmdzIHZvaWQgbW92ZV9vYmplY3QobWl4ZWQgd2hhdCwgbWl4ZWQgd2hlcmUpCit7CisgIG9iamVjdCBwbyx0bXA7CisKKyAgcG89cHJldmlvdXNfb2JqZWN0KCk7CisgIGlmICghd2hlcmUpCisgIHsKKyAgICB3aGVyZT13aGF0OworICAgIHdoYXQ9cG87CisgIH0KKyAgaWYgKCgoc3RyaW5ncCh3aGVyZSkgJiYgd2hlcmU9PU5FVERFQURfUk9PTSApIHx8CisgICAgICAgKG9iamVjdHAod2hlcmUpICYmIHdoZXJlPT1maW5kX29iamVjdChORVRERUFEX1JPT00pKSkgJiYKKyAgICAgICBvYmplY3RwKHdoYXQpICYmIG9iamVjdF9uYW1lKHdoYXQpIT0iL29iai9zcGVycmVyIikKKyAgeworICAgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICB3aGF0LT5yZW1vdmUoKTsKKyAgICAgIGlmICh3aGF0KSBkZXN0cnVjdCh3aGF0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxpdmluZyh3aGF0KSB8fCBpbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICBsb2dfZmlsZSgiTkRFQUQyIixzcHJpbnRmKCJUUllFRCBUTyBNT1ZFIFRPIE5FVERFQUQ6ICVPXG4iLHdoYXQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0X29iamVjdF9oZWFydF9iZWF0KHdoYXQsMCk7CisgIH0KKyAgdG1wPXdoYXQ7CisgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIC8vIEphLiBNYW4gcnVmdCBkaWUgX3NldF94eHgoKS1GdW5rdGlvbmVuIGVpZ2VudGxpY2ggbmljaHQgZGlyZWt0IGF1Zi4KKyAgICAgIC8vIEFiZXIgZGFzIExpY2h0c3lzdGVtIGlzdCBzY2hvbiAqc28qIHJlY2hlbmludGVuc2l2IHVuZCBnZXJhZGUgZGVyCisgICAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0UtQ2FjaGUgd2lyZCAqc28qIG9mdCBiZW5vZXRpZ3QsIGRhc3MgZXMgbWlyCisgICAgICAvLyBkYSB1bSBqZWRlcyBiaXNzY2hlbiBSZWNoZW56ZWl0IGdlaHQuCisgICAgICAvLyBEZXIgWndlY2sgaGVpbGlndCBqYSBiZWthbm50bGljaCBkaWUgTWl0dGVsLiA7LSkKKyAgICAgIC8vCisgICAgICAvLyBUaWFtYWsKKyAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworICBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bW92ZV9vYmplY3QscG8pLHdoYXQsd2hlcmUpOworICBpZiAodG1wPXdoYXQpCisgICAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKK30KKworCit2b2lkIHN0YXJ0X3NpbXVsX2VmdW4oKSB7CisgIG1peGVkICppbmZvOworCisgIC8vIEZhbGxzIG5vY2ggbmljaHQgZ2V0YW4sIGV4dHJhX3dpemluZm8gaW5pdGlhbGlzaWVyZW4KKyAgaWYgKCAhcG9pbnRlcnAoaW5mbyA9IGdldF9leHRyYV93aXppbmZvKDApKSApCisgICAgc2V0X2V4dHJhX3dpemluZm8oMCwgaW5mbyA9IGFsbG9jYXRlKEJBQ0tCT05FX1dJWklORk9fU0laRSkpOworCisgIEluaXRMaXZpbmdEYXRhKGluZm8pOworCisgIHNldF9uZXh0X3Jlc2V0KDEwKTsgLy8gZGlyZWt0IG1hbCBhdWZyYWV1bWVuCit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICBzZXRfbmV4dF9yZXNldCg3MjAwKTsKKyAgQ2xlYW5MaXZpbmdEYXRhKCk7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhhYnNvbHV0ZV9oYl9jb3VudCkKK2ludCBhYnNvbHV0ZV9oYl9jb3VudCgpIHsKKyAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKK30KKyNlbmRpZgorCit2b2lkIF9fc2V0X2Vudmlyb25tZW50KG9iamVjdCBvYiwgbWl4ZWQgdGFyZ2V0KQoreworICBzdHJpbmcgcGF0aDsKKyAgb2JqZWN0IG9iajsKKworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgaWYgKCFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSB8fCAhQVJDSF9TRUNVUklUWSApCisgICAgcmV0dXJuOworICBpZiAob2JqZWN0cCh0YXJnZXQpKQorICB7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLHRhcmdldCk7CisgICAgcmV0dXJuOworICB9CisgIHBhdGg9KHN0cmluZylNQVNURVItPl9nZXRfcGF0aCh0YXJnZXQsdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgaWYgKHN0cmluZ3AocGF0aCkgJiYgZmlsZV9zaXplKHBhdGgrIi5jIik+PTAgJiYKKyAgICAgICFjYXRjaChsb2FkX29iamVjdChwYXRoKTtwdWJsaXNoKSApCisgIHsKKyAgICBvYmo9ZmluZF9vYmplY3QocGF0aCk7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLG9iaik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgX2R1bXBfd2l6bGlzdChzdHJpbmcgZmlsZSwgaW50IHNvcnRieSkgeworICBpbnQgaTsKKyAgbWl4ZWQgKmE7CisKKyAgaWYgKCFMT1JEX1NFQ1VSSVRZKQorICAgIHJldHVybjsKKyAgaWYgKCFtYXN0ZXIoKS0+dmFsaWRfd3JpdGUoZmlsZSxnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIpKQorICB7CisgICAgd3JpdGUoIk5PIFdSSVRFIFBFUk1JU1NJT05cbiIpOworICAgIHJldHVybjsKKyAgfQorICBhID0gd2l6bGlzdF9pbmZvKCk7CisgIGEgPSBzb3J0X2FycmF5KGEsIGxhbWJkYSggKHsnYSwnYn0pLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJzwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdhLHNvcnRieX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYixzb3J0Ynl9KQorICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgIHJtKGZpbGUpOworICBmb3IgKGk9c2l6ZW9mKGEpLTE7aT49MDtpLS0pCisgICAgd3JpdGVfZmlsZShmaWxlLHNwcmludGYoIiUtMTFzOiBldmFsPSUtOGQgY21kcz0lLTZkIEhCcz0lLTVkIGFycmF5PSUtNWQgbWFwcGluZz0lLTdkXG4iLAorICAgICAgYVtpXVtXTF9OQU1FXSxhW2ldW1dMX1RPVEFMX0NPU1RdLGFbaV1bV0xfQ09NTUFORFNdLGFbaV1bV0xfSEVBUlRfQkVBVFNdLAorICAgICAgYVtpXVtXTF9BUlJBWV9UT1RBTF0sYVtpXVtXTF9DQUxMX09VVF0pKTsKK30KKworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpIHsKKworICBpZighb2JqZWN0cChvYikpCisgICAgb2I9cHJldmlvdXNfb2JqZWN0KCk7CisgIC8vIFdlbm4gZWluIE9iamVrdCBnZXN1Y2h0IHdpcmQ6IEFsbGUgRW52cyBkaWVzZXMgT2JqZWt0cyBlcm1pdHRlbG4gdW5kCisgIC8vIHNjaGF1ZW4sIG9iIGluIGRpZXNlbiBvYiB2b3Jrb21tdC4gRGFubiBpc3Qgd2hhdCBpbiBvYiBlbnRoYWx0ZW4uCisgIGlmKG9iamVjdHAod2hhdCkpIHsKKyAgICBvYmplY3QgKmVudnM9YWxsX2Vudmlyb25tZW50KHdoYXQpOworICAgIC8vIHdlbm4gb2Iga2VpbiBFbnZpcm9ubWVudCBoYXQsIGlzdCBlcyBvZmZlbnNpY2h0bGljaCBuaWNodCBpbiB3aGF0CisgICAgLy8gZW50aGFsdGVuLgorICAgIGlmICghcG9pbnRlcnAoZW52cykpIHJldHVybiAwOworICAgIGlmIChtZW1iZXIoZW52cywgb2IpICE9IC0xKSByZXR1cm4gd2hhdDsKKyAgfQorICAvLyBzb25zdCB3aXJkcyB0ZXVyZXIsIHVlYmVyIGFsbGUgT2JqZWt0ZSBpbSAoZGVlcCkgSW52IGxhdWZlbiB1bmQgcGVyIGlkKCkKKyAgLy8gdGVzdGVuLiBEYWJlaSBtdXNzIGFiZXIgZGllIGdld3VlbnNjaHRlIE5yLiAoImZsYXNjaGUgMyIpIGFiZ2VzY2huaXR0ZW4KKyAgLy8gd2VyZGVuIHVuZCBzZWxiZXIgZ2V6YWVobHQgd2VyZGVuLCB3ZWxjaGUgZGFzIGVudHNwcmVjaGVuZGUgT2JqZWt0IGlzdC4KKyAgZWxzZSBpZiAoc3RyaW5ncCh3aGF0KSkgeworICAgICAgaW50IGNudDsKKyAgICAgIHN0cmluZyBuZXd3aGF0OworICAgICAgaWYoc3NjYW5mKHdoYXQsIiVzICVkIixuZXd3aGF0LGNudCkhPTIpCisgICAgICAgY250PTE7CisgICAgICBlbHNlCisgICAgICAgd2hhdD1uZXd3aGF0OworICAgICAgZm9yZWFjaChvYmplY3QgaW52b2I6IGRlZXBfaW52ZW50b3J5KG9iKSkgeworICAgICAgIGlmIChpbnZvYi0+aWQod2hhdCkgJiYgIS0tY250KQorICAgICAgICAgICByZXR1cm4gaW52b2I7CisgICAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAxIHRvIGRlZXBfcHJlc2VudCgpLiAiCisgICAgICAgICAiRXhwZWN0ZWQgXCJvYmplY3RcIiBvciBcInN0cmluZ1wiLCBnb3QgJS41ME8uXG4iLAorICAgICAgICAgd2hhdCkpOworICB9CisgIHJldHVybiAwOworfQorCittYXBwaW5nIGR1bXBfaXBfbWFwcGluZygpCit7CisgIHJldHVybiAwOworfQorCitub21hc2sgdm9pZCBzd2FwKG9iamVjdCBvYmopCit7CisgIHdyaXRlKCJZb3VyIGFyZSBub3QgYWxsb3dlZCB0byBzd2FwIG9iamVjdHMgYnkgaGFuZCFcbiIpOworICByZXR1cm47Cit9CisKK25vbWFzayB2YXJhcmdzIHZvaWQgZ2FyYmFnZV9jb2xsZWN0aW9uKHN0cmluZyBzdHIpCit7CisgIGlmKHByZXZpb3VzX29iamVjdCgpPT0wIHx8ICFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAKKyAgICAgIHx8ICFBUkNIX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUoIkNhbGwgR0Mgbm93IGFuZCB0aGUgbXVkIHdpbGwgY3Jhc2ggaW4gNS02IGhvdXJzLiBET05UIERPIElUIVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3Aoc3RyKSkKKyAgeworICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oc3RyKTsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oKTsKK30KKwordmFyYXJncyB2b2lkIG5vdGlmeV9mYWlsKG1peGVkIG5mLCBpbnQgcHJpbykgeworICBvYmplY3QgcG8sb2xkbzsKKyAgaW50IG9sZHByaW87CisgIAorICBpZiAoIVBMIHx8ICFvYmplY3RwKHBvPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworICBpZiAoIXN0cmluZ3AobmYpICYmICFjbG9zdXJlcChuZikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgc3RyaW5ncyBhbmQgY2xvc3VyZXMgYWxsb3dlZCBmb3Igbm90aWZ5X2ZhaWwhICIKKyAgICAgICAgICJBcmd1bWVudCB3YXM6ICUuNTBPLi4uXG4iLG5mKSk7CisgIH0KKworICAvLyBmYWxscyBlaW4gT2JqZWt0IGJlcmVpdHMgbmVuIG5vdGlmeV9mYWlsKCkgc2V0enRlLCBQcmlvcml0YWV0ZW4gYWJzY2hhZXR6ZW4KKyAgLy8gdW5kIHZlcmdsZWljaGVuLgorICBpZiAob2JqZWN0cChvbGRvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBwbyE9b2xkbykgeworICAgIGlmICghcHJpbykgeyAgICAgICAKKyAgICAgIC8vUHJpb3JpdGFldCBkaWVzZXMgbm90aWZ5X2ZhaWwoKSAnYWJzY2hhZXR6ZW4nCisgICAgICBpZiAocG89PVBMKSAvLyBTcGllbGVyLWludGVybmUgKHNvdWwtY21kcykKKyAgICAgICAgcHJpbz1ORl9OTF9PV047CisgICAgICBlbHNlIGlmIChsaXZpbmcocG8pKQorICAgICAgICBwcmlvPU5GX05MX0xJVklORzsKKyAgICAgIGVsc2UgaWYgKChpbnQpcG8tPklzUm9vbSgpKQorICAgICAgICBwcmlvPU5GX05MX1JPT007CisgICAgICBlbHNlCisgICAgICAgIHByaW89TkZfTkxfVEhJTkc7CisgICAgfQorICAgIC8vUHJpb3JpdGFldCBkZXMgYWx0ZW4gU2V0emVycyBhYnNjaGFldHplbgorICAgIGlmIChvbGRvPT1QTCkKKyAgICAgIG9sZHByaW89TkZfTkxfT1dOOworICAgIGVsc2UgaWYgKGxpdmluZyhvbGRvKSkKKyAgICAgIG9sZHByaW89TkZfTkxfTElWSU5HOworICAgIGVsc2UgaWYgKChpbnQpb2xkby0+SXNSb29tKCkpCisgICAgICBvbGRwcmlvPU5GX05MX1JPT007CisgICAgZWxzZQorICAgICAgb2xkcHJpbz1ORl9OTF9USElORzsKKyAgfQorICBlbHNlIC8vIHdlbm4gZXMgbm9jaCBrZWluIE5vdGlmeV9mYWlsIGdpYnQ6CisgICAgb2xkcHJpbz1ORl9OTF9OT05FOworCisgIC8vdmVyZ2xlaWNoZW4gdW5kIGdnZi4gc2V0emVuCisgIGlmIChwcmlvID49IG9sZHByaW8pIHsgCisgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICBlZnVuOjpub3RpZnlfZmFpbChuZik7CisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgX25vdGlmeV9mYWlsKHN0cmluZyBzdHIpCit7CisgIC8vcXVlcnlfbm90aWZ5X2ZhaWwoKSBiZW51dHplbiwgdW0gZGFzIE9iamVrdAorICAvL2RlcyBsZXR6dGVuIG5vdGlmeV9mYWlsKCkgenUgZXJtaXR0ZWxuCisgIG9iamVjdCBvOworICBpZiAoKG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIG8hPXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgLy9ub2NoIGtlaW4gbm90aWZ5X2ZhaWwoKSBmdWVyIGRpZXNlcyBLb21tYW5kbyBnZXNldHp0LCBhdWYgZ2VodHMuCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGVmdW46Om5vdGlmeV9mYWlsKHN0cik7CisgIHJldHVybjsKK30KKworc3RyaW5nIHRpbWUyc3RyaW5nKCBzdHJpbmcgZm9ybWF0LCBpbnQgemVpdCApCit7CisgIGludCBpLGNoLG1heHVuaXQsZHVtbXk7CisgIHN0cmluZyAqcGFydHMsIGZtdDsKKworICBpbnQgc2VjcyA9IHplaXQ7CisgIGludCBtaW5zID0gKHplaXQvNjApOworICBpbnQgaG91cnMgPSAoemVpdC8zNjAwKTsKKyAgaW50IGRheXMgPSAoemVpdC84NjQwMCk7CisgIGludCB3ZWVrcyA9ICAoemVpdC82MDQ4MDApOworICBpbnQgbW9udGhzID0gKHplaXQvMjQxOTIwMCk7CisgIGludCBhYmJyID0gMDsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoIGZvcm1hdCwgIlwoJVwoLXxcKVswLTldKltud2RobXN4TldESE1TWF1cKXxcKCUlXCkiICk7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBzd2l0Y2goIHBhcnRzW2ldWzwxXSApCisgICAgeworICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKKyAgICAgICBhYmJyID0gc3NjYW5mKCBwYXJ0c1tpXSwgIiUlJWQiLCBkdW1teSApICYmIGR1bW15PT0wOworICAgICAgIC8vIE5PIGJyZWFrICEKKyAgICBjYXNlICduJzogY2FzZSAnTic6CisgICAgICAgbWF4dW5pdCB8PSAzMTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICd3JzogY2FzZSAnVyc6CisgICAgICAgbWF4dW5pdCB8PSAxNTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgbWF4dW5pdCB8PSA3OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICBtYXh1bml0IHw9IDM7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgIG1heHVuaXQgfD0gMTsKKyAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoIG1heHVuaXQgJiAxNiApIHdlZWtzICU9IDQ7CisgIGlmKCBtYXh1bml0ICYgOCApIGRheXMgJT0gNzsKKyAgaWYoIG1heHVuaXQgJiA0ICkgaG91cnMgJT0gMjQ7CisgIGlmKCBtYXh1bml0ICYgMiApIG1pbnMgJT0gNjA7CisgIGlmKCBtYXh1bml0ICkgc2VjcyAlPSA2MDsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGZtdCA9IHBhcnRzW2ldWzAuLjwyXTsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBpZiggY2g9PSd4JyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSduJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0ndyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nZCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J2gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ20nOworICAgICAgZWxzZSBjaCA9ICdzJzsKKyAgICB9CisgICAgZWxzZSBpZiggY2g9PSdYJyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSdOJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0nVyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nRCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J0gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ00nOworICAgICAgZWxzZSBjaCA9ICdTJzsKKyAgICB9CisgICAgCisgICAgc3dpdGNoKCBjaCApCisgICAgeworICAgICAgY2FzZSAnbic6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbW9udGhzICk7IGJyZWFrOworICAgICAgY2FzZSAndyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgd2Vla3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdkJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBkYXlzICk7IGJyZWFrOworICAgICAgY2FzZSAnaCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgaG91cnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdtJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtaW5zICk7IGJyZWFrOworICAgICAgY2FzZSAncyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgc2VjcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ04nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIk0iOworICAgICAgIGVsc2UgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobW9udGhzPT0xKSA/ICJNb25hdCIgOiAiTW9uYXRlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnVyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAidyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsICh3ZWVrcz09MSkgPyAiV29jaGUiIDogIldvY2hlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImQiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoZGF5cz09MSkgPyAiVGFnIiA6ICJUYWdlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnSCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiaCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChob3Vycz09MSkgPyAiU3R1bmRlIiA6ICJTdHVuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTSc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAibSI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtaW5zPT0xKSA/ICJNaW51dGUiIDogIk1pbnV0ZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdTJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJzIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHNlY3M9PTEpID8gIlNla3VuZGUiIDogIlNla3VuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJSc6CisgICAgICAgcGFydHNbaV0gPSAiJSI7CisgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKCBwYXJ0cywgIiIgKTsKK30KKworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSkKK3sKKyAgc3RyaW5nIGVycjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCBtOworICAvL2hhdCBuZW4gU2NoZXJ6a2VrcyBkaWUgQmx1ZXByaW50IGJld2VndD8KKyAgaWYgKChvYj1maW5kX29iamVjdCgiL3NlY3VyZS9sb2dpbiIpKSAmJiBlbnZpcm9ubWVudChvYikpCisgICAgICBjYXRjaChkZXN0cnVjdChvYik7cHVibGlzaCk7CisgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KCJzZWN1cmUvbG9naW4iKTtwdWJsaXNoKTsKKyAgaWYgKGVycikKKyAgeworICAgIHdyaXRlKCJGZWhsZXIgYmVpbSBMYWRlbiB2b24gL3NlY3VyZS9sb2dpbi5jXG4iK2VycisiXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob2JqZWN0cChtPShtaXhlZClvYi0+bmV3X2xvZ29uKG5hbWUpKSkgbmV0ZGVhZFtuYW1lXT1tOworICByZXR1cm4gbTsKK30KKworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKQoreworICBpbnQgKmxldmVsOworICAvL2tldHRlIGRlciBDYWxsZXIgZHVyY2hsYXVmZW4sIGRlbiBuaWVkcmlnc3RlbiBMZXZlbCBpbiBkZXIgS2V0dGUKKyAgLy96dXJ1ZWNrZ2ViZW4uIFplcnN0b2VydGUgT2JqZWt0ZSAoU2VsYnN0emVyc3RvZXJlcikgZnVlaHJlbiB6dXIgUnVlY2tnYWJlCisgIC8vdm9uIDAuCisgIC8vY2FsbGVyX3N0YWNrKDEpIGZ1ZWd0IGRlbSBSdWVja2dhYmVhcnJheSB0aGlzX2ludGVyYWN0aXZlKCkgaGluenUgYnp3LiAwLAorICAvL3dlbm4gZXMga2VpbmVuIEludGVyYWN0aXZlIGdpYnQuIERpZSAwIGZ1ZWhydCBkYW5uIHdpZSBiZWkgemVyc3RvZXJ0ZW4KKyAgLy9PYmpla3RlbiB6dXIgUnVlY2tnYWJlIHZvbiAwLCB3YXMgZ2V3dWVuc2NodCBpc3QsIGRhIGVzIGhpZXIgZWluZW4KKyAgLy9JTnRlcmFjdGl2ZSBnZWJlbiBtdXNzLgorICBsZXZlbD1tYXAoY2FsbGVyX3N0YWNrKDEpLGZ1bmN0aW9uIGludCAob2JqZWN0IGNhbGxlcikKKyAgICAgIHtpZiAob2JqZWN0cChjYWxsZXIpKQorICAgICAgIHJldHVybihxdWVyeV93aXpfbGV2ZWwoZ2V0ZXVpZChjYWxsZXIpKSk7CisgICAgICAgcmV0dXJuKDApOyAvLyBrZWluIE9iamVrdCBkYSwgMC4KKyAgICAgIH0gKTsKKyAgcmV0dXJuKG1pbihsZXZlbCkpOyAvL2RlbiBrbGVpbnN0ZW4gV2VydCBpbSBBcnJheSB6dXJ1ZWNrZ2ViZW4gKGdnZi4gMCkKK30KKworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpCit7CisgIHN0cmluZyBldWlkOworCisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpKSAvLyBFcyBtdXNzIGVpbmVuIGludGVyYWN0aXZlIGdlYmVuCisgICAgIHJldHVybiAwOworICBldWlkPWdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgLy8gdWViZXIgYWxsZSBDYWxsZXIgaXRlcmllcmVuLiBXZW5uIGVpbmVzIGRhdm9uIGVpbmUgYW5kZXJlIGV1aWQgaGF0IGFscworICAvLyBkZXIgSW50ZXJhY3RpdmUgdW5kIGRpZXNlIG5pY2h0IGRpZSBST09USUQgaXN0LCB3aXJkIDAgenVydWVja2dlYmVuLgorICAvLyBFYmVuc28sIGZhbGxzIGVpbiBTZWxic3R6ZXJzdG9lcmVyIGlyZ2VuZHdvIGluIGRlciBLZXR0ZSBpc3QuCisgIGZvcmVhY2gob2JqZWN0IGNhbGxlcjogY2FsbGVyX3N0YWNrKCkpIHsKKyAgICAgIGlmICghb2JqZWN0cChjYWxsZXIpIHx8CisgICAgICAgKGdldGV1aWQoY2FsbGVyKSE9ZXVpZCAmJiBnZXRldWlkKGNhbGxlcikhPVJPT1RJRCkpCisgICAgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZXVpZDsgLy8gJ3NpY2hlcmUnIGV1aWQgenVydWVja2dlYmVuCit9CisKKy8vIElOUFVUX1BST01QVCB1bmQgbmVuIExlZXJwcm9tcHQgaGluenVmdWVnZW4sIHdlbm4ga2VpbnMgdWViZXJnZWJlbiB3aXJkLgorLy8gRGFzIHNvbGwgZGF6dSBkaWVuZW4sIGRhc3MgYWxsZSBnZ2YuIGVpbiBFT1IgYW0gUHJvbXB0ZW5kZSBrcmllZ2VuLi4uCisvLyNpZiBfX0JPT1RfVElNRV9fIDwgMTM2MDAxNzIxMwordmFyYXJncyB2b2lkIGlucHV0X3RvKCBtaXhlZCBmdW4sIGludCBmbGFncywgdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgKmFycjsKKyAgICBpbnQgaTsKKworICAgIGlmICggIXRoaXNfcGxheWVyKCkgfHwgIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICAvLyBUT0RPOiBpbnB1dF90byguLi4sSU5QVVRfUFJPTVBULCAiIiwgLi4uKSwgd2VubiBrZWluIElOUFVUX1BST01QVAorICAgIC8vIHZvcmtvbW10Li4uCisgICAgaWYgKCBmbGFncyZJTlBVVF9QUk9NUFQgKSB7ICAgIAorICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzIH0pICsgYXJnczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIGdnZi4gZWluIElOUFVUX1BST01QVCBoaW56dWZ1ZWdlbiB1bmQgbmVuIExlZXJzdHJpbmcgYWxzIFByb21wdC4KKyAgICAgICAgZmxhZ3MgfD0gSU5QVVRfUFJPTVBUOworICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzLCAiIiB9KSArIGFyZ3M7CisgICAgfQorCisgICAgLy8gQXJyYXlzIGdlZ2VuIGZsYXR0ZW4gcXVvdGVuLgorICAgIGZvciAoIGkgPSBzaXplb2YoYXJyKSAtIDE7IGkgPiAxOyBpLS0gKQorICAgICAgIGlmICggcG9pbnRlcnAoYXJyW2ldKSApCisgICAgICAgICAgIGFycltpXSA9IHF1b3RlKGFycltpXSk7CisKKyAgICBhcHBseSggYmluZF9sYW1iZGEoIHVuYm91bmRfbGFtYmRhKCAoe30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnZWZ1bjo6aW5wdXRfdG8vKicqLyB9KSArIGFyciApLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSApICk7Cit9CisvLyNlbmRpZgorCitub21hc2sgaW50IHNldF9saWdodChpbnQgaSkKKy8vIGVyaG9laHQgZGFzIExpY2h0bGV2ZWwgZWluZXMgT2JqZWt0cyB1bSBpCisvLyByZXN1bHQ6IGRhcyBMaWNodGxldmVsIGlubmVyaGFsYiBkZXMgT2JqZWt0cworeworICAgIG9iamVjdCBvYiwgKmludjsKKyAgICBpbnQgbGFsbCwgbGlnaHQsIGRhcmssIHRtcDsKKworICAgIGlmICghKG9iPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7IC8vIG9obmUgZGFzIGdlaHRzIG5pY2h0LgorCisgICAgLy8gYXVzIGtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBrYW5uIG1hbiBhdWNoIGRlbiBMaWNodGxldmVsIG5vY2ggc2V0emVuCisgICAgaWYgKGkhPTApIG9iLT5TZXRQcm9wKFBfTElHSFQsIG9iLT5RdWVyeVByb3AoUF9MSUdIVCkraSk7CisKKyAgICAvLyBMaWNodGJlcmVjaG51bmcgZmluZGV0IGVpZ2VudGxpY2ggaW4gZGVyIE11ZGxpYiBzdGF0dC4KKyAgICByZXR1cm4gKGludClvYi0+UXVlcnlQcm9wKFBfSU5UX0xJR0hUKTsKK30KKworCitwdWJsaWMgc3RyaW5nIGlzbzJhc2NpaSggc3RyaW5nIHN0ciApCit7CisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgICAgcmV0dXJuICIiOworCisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi5CIsICJhZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL2IiwgIm9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvwiLCAidWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAixCIsICJBZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLWIiwgIk9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItwiLCAiVWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3yIsICJzcyIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICJbXiAtfl0iLCAiPyIsIDEgKTsKKworICAgIHJldHVybiBzdHI7Cit9CisKKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIENvdW50VXAoIHN0cmluZyAqcywgc3RyaW5nIHNlcCwgc3RyaW5nIGxhc3RzZXAgKQoreworICAgIHN0cmluZyByZXQ7CisKKyAgICBpZiAoICFwb2ludGVycChzKSApCisgICAgICAgcmV0dXJuICIiOworICAgIAorICAgIGlmICghc2VwKSBzZXAgPSAiLCAiOworICAgIGlmICghbGFzdHNlcCkgbGFzdHNlcCA9ICIgdW5kICI7CisKKyAgICBzd2l0Y2ggKHNpemVvZihzKSkgIHsKKyAgICAgICBjYXNlIDA6IHJldD0iIjsgYnJlYWs7CisgICAgICAgY2FzZSAxOiByZXQ9c1swXTsgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0ID0gaW1wbG9kZShzWzAuLjwyXSwgc2VwKTsKKyAgICAgICAgICAgICAgcmV0ICs9IGxhc3RzZXAgKyBzWzwxXTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHF1ZXJ5X25leHRfcmVzZXQob2JqZWN0IG9iKSB7CisKKyAgICAvLyBUeXBwcnVlZnVuZzogZXR3YXMgYW5kZXJlcyBhbHMgT2JqZWt0ZSBvZGVyIDAgc29sbGVuIEZlaGxlciBzZWluLgorICAgIGlmIChvYiAmJiAhb2JqZWN0cChvYikpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbmV4dF9yZXNldCgpOiBnb3QgJS4yME8sICIKKyAgICAgICAgICAgImV4cGVjdGVkIG9iamVjdC5cbiIsb2IpKTsKKworICAgIC8vIERlZmF1bHRvYmpla3QgUE8sIHdlbm4gMCB1ZWJlcmdlYmVuLgorICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7Cit9CisKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKyNkZWZpbmUgTUFYTEVOIDUwMDAwCitub21hc2sgaW50IGNvcHlfZmlsZShzdHJpbmcgc291cmNlLCBzdHJpbmcgZGVzdCkKK3sKKworICBpbnQgcHRyOworICBzdHJpbmcgYnl0ZXM7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKCFzaXplb2Yoc291cmNlKXx8IXNpemVvZihkZXN0KXx8c291cmNlPT1kZXN0fHwoZmlsZV9zaXplKHNvdXJjZSk9PS0xKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJyZWFkX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICByZXR1cm4gMTsKKyAgc3dpdGNoIChmaWxlX3NpemUoZGVzdCkpCisgIHsKKyAgY2FzZSAtMToKKyAgICBicmVhazsKKyAgY2FzZSAtMjoKKyAgICBpZiAoZGVzdFs8MV0hPScvJykgZGVzdCs9Ii8iOworICAgIGRlc3QrPWVmdW46OmV4cGxvZGUoc291cmNlLCIvIilbPDFdOworICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKSByZXR1cm4gMTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpIT0tMSkgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaWYgKCFybShkZXN0KSkgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgZG8KKyAgeworICAgIGJ5dGVzID0gcmVhZF9ieXRlcyhzb3VyY2UsIHB0ciwgTUFYTEVOKTsgcHRyICs9IE1BWExFTjsKKyAgICBpZiAoIWJ5dGVzKSBieXRlcz0iIjsKKyAgICB3cml0ZV9maWxlKGRlc3QsIGJ5dGVzKTsKKyAgfQorICB3aGlsZShzaXplb2YoYnl0ZXMpID09IE1BWExFTik7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorCisKKy8vICMjIyBFcnNhdHphdWZsb2VzdW5nIGluIFN0cmluZ3MgIyMjCit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKSB7CisgIGludCBpOworICBzdHJpbmcgKnBhcnRzOworCisgIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICJAV0VbQS1TVV0qWzAtOV0iKTsKKyAgaSA9IHNpemVvZihwYXJ0cyk7CisKKyAgaWYgKGk+MSkgeworICAgIGludCBqLCB0OworICAgIGNsb3N1cmUgKm5hbWVfY2xzOworCisgICAgdCA9IGogPSBzaXplb2Yob2JzKTsKKworICAgIG5hbWVfY2xzICA9ICBhbGxvY2F0ZShqKTsKKyAgICB3aGlsZSAoai0tKQorICAgICAgaWYgKG9iamVjdHAob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBzeW1ib2xfZnVuY3Rpb24oIm5hbWUiLCBvYnNbal0pOworICAgICAgZWxzZSBpZiAoc3RyaW5ncChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IG9ic1tqXTsKKworICAgIHdoaWxlICgoaS09IDIpPjApIHsKKyAgICAgIGludCBvYl9ucjsKKyAgICAgIC8vIHp1IGVyc2V0emVuZGVzIFRva2VuIGluIEZhbGwgdW5kIE9iamVrdGluZGV4IGF1ZnNwYWx0ZW4KKyAgICAgIG9iX25yID0gcGFydHNbaV1bPDFdLScxJzsKKyAgICAgIGlmIChvYl9ucjwwIHx8IG9iX25yPj10KSB7CisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoInJlcGxhY2VfcGVyc29uYWw6IHVzaW5nIHdyb25nIG9iamVjdCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb2JfbnIpKTsKKyAgICAgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgICAgIH0KKworICAgICAgLy8gY2FzdXMga2FubiBtYW4gc2Nob24gaGllciBlbnRzY2hlaWRlbgorICAgICAgaW50IGNhc3VzOworICAgICAgc3RyaW5nIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIHN3aXRjaCAocGFydFszXSkgeworICAgICAgICBjYXNlICdSJzogY2FzdXMgPSBXRVI7ICAgIGJyZWFrOworICAgICAgICBjYXNlICdTJzogY2FzdXMgPSBXRVNTRU47IGJyZWFrOworICAgICAgICBjYXNlICdNJzogY2FzdXMgPSBXRU07ICAgIGJyZWFrOworICAgICAgICBjYXNlICdOJzogY2FzdXMgPSBXRU47ICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgY29udGludWU7IC8vIHBhc3N0IHNjaG9uIGpldHp0IG5pY2h0IGluIGRhcyBIYXVwdG11c3RlcgorICAgICAgfQorCisgICAgICAvLyB1bmQgamV0enQgZGllIGVpbnplbG5lbiBLZXl3b3JkcyBvaG5lIGZ1ZWhyZW5kZXMgIkBXRSIsIGJlZW5kZW5kZSBJZAorICAgICAgbWl4ZWQgdG1wOworICAgICAgc3dpdGNoIChwYXJ0WzMuLjwyXSkgeworICAgICAgICBjYXNlICJSIjogY2FzZSAiU1NFTiI6IGNhc2UgIk0iOiBjYXNlICJOIjogICAgICAgICAgICAgICAvLyBOYW1lCisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMsIDEpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJVIjogY2FzZSAiU1NFTlUiOiBjYXNlICJNVSI6IGNhc2UgIk5VIjogICAgICAgICAgIC8vIHVuYmVzdGltbXQKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cyk7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQIjogY2FzZSAiU1NFTlFQIjogY2FzZSAiTVFQIjogY2FzZSAiTlFQIjogICAgICAgLy8gUHJvbm91bgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQcm9ub3VuKGNhc3VzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFBIjogY2FzZSAiU1NFTlFBIjogY2FzZSAiTVFBIjogY2FzZSAiTlFBIjogICAgICAgLy8gQXJ0aWNsZQorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgdG1wID0gKHN0cmluZyl0bXAtPlF1ZXJ5QXJ0aWNsZShjYXN1cywgMSwgMSk7CisgICAgICAgICAgaWYgKHN0cmluZ3AodG1wKSAmJiAhKHRtcFs8MV1eJyAnKSkgCisgICAgICAgICAgICB0bXAgPSB0bXBbMC4uPDJdOyAgICAgICAgICAgICAgICAvLyBFeHRyYS1TcGFjZSB3aWVkZXIgbG9lc2NoZW4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1TIjogY2FzZSAiU1NFTlFQUE1TIjogY2FzZSAiTVFQUE1TIjogY2FzZSAiTlFQUE1TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZTIjogY2FzZSAiU1NFTlFQUEZTIjogY2FzZSAiTVFQUEZTIjogY2FzZSAiTlFQUEZTIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlMiOiBjYXNlICJTU0VOUVBQTlMiOiBjYXNlICJNUVBQTlMiOiBjYXNlICJOUVBQTlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUCI6IGNhc2UgIlNTRU5RUFBNUCI6IGNhc2UgIk1RUFBNUCI6IGNhc2UgIk5RUFBNUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlAiOiBjYXNlICJTU0VOUVBQRlAiOiBjYXNlICJNUVBQRlAiOiBjYXNlICJOUVBQRlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlAiOiBjYXNlICJTU0VOUVBQTlAiOiBjYXNlICJNUVBQTlAiOiBjYXNlICJOUVBQTlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyB3ZW5uIHRtcCBlaW4gU3RyaW5nIHdhciwgd2Vpc2VuIHdpciBlcyBoaWVyIHBhdXNjaGFsIHp1CisgICAgICBpZiAoc3RyaW5ncCh0bXApKQorICAgICAgICBwYXJ0c1tpXSA9IHRtcDsKKworICAgICAgLy8gYXVmIFd1bnNjaCB3aXJkIG5hY2ggU2F0emVuZGVuIGdyb3NzIGdlc2NocmllYmVuCisgICAgICBpZiAoY2FwcykKKyAgICAgICAgc3dpdGNoIChwYXJ0c1tpLTFdWzwyLi5dKSB7CisgICAgICAgICAgY2FzZSAiLiAiOiAgY2FzZSAiISAiOiAgY2FzZSAiPyAiOgorICAgICAgICAgIGNhc2UgIi4iOiAgIGNhc2UgIiEiOiAgIGNhc2UgIj8iOgorICAgICAgICAgIGNhc2UgIi5cbiI6IGNhc2UgIiFcbiI6IGNhc2UgIj9cbiI6CisgICAgICAgICAgY2FzZSAiXCIgIjogY2FzZSAiXCJcbiI6CisgICAgICAgICAgICBwYXJ0c1tpXSA9IGNhcGl0YWxpemUocGFydHNbaV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgfQorICByZXR1cm4gc3RyOworfQorCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK2RlcHJlY2F0ZWQgdmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXN0cmluZ3Aoc3RyKSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gZXh0cmFjdCgpOiAlTyIsc3RyKSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKHN0cik7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCitkZXByZWNhdGVkIHZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighcG9pbnRlcnAoYXJyYXkpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBzbGljZV9hcnJheSgpOiAlTyIsYXJyYXkpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oYXJyYXkpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitkZXByZWNhdGVkIGludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpIHsKKworICBpZiAocG9pbnRlcnAoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyxpdGVtKSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLHRvX2ludChpdGVtKSkpOworICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gbWVtYmVyX2FycmF5KCk6ICVPIixhcnJheXN0cmluZykpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorCisvLyBUaGUgZGlnaXQgYXQgdGhlIGkndGggcG9zaXRpb24gaXMgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiAnaScuCitzdHJpbmcgY291bnRfdGFibGUgPQorICAgICIwMTEyMTIyMzEyMjMyMzM0MTIyMzIzMzQyMzM0MzQ0NTEyMjMyMzM0MjMzNDM0NDUyMzM0MzQ0NTM0NDU0NTU2IjsKK2ludCBicm9rZW5fY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgaW50IGksIHJlczsKKyAgICBpZiggIXN0cmluZ3AocykgfHwgIShpPXNpemVvZihzKSkgKSByZXR1cm4gMDsKKyAgICBmb3IoIDsgaS0tPjA7ICkgeworICAgICAgICAvLyBXZSBhcmUgY291bnRpbmcgNiBiaXRzIGF0IGEgdGltZSB1c2luZyBhIHByZWNvbXBpbGVkIHRhYmxlLgorICAgICAgICByZXMgKz0gY291bnRfdGFibGVbKHNbaV0tJyAnKSY2M10tJzAnOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY291bnRfYml0cykKK2ludCBjb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICByZXR1cm4oYnJva2VuX2NvdW50X2JpdHMocykpOworfQorI2VuZGlmCisKKworLy8gKiBUZWlsZSBhdXMgZWluZW0gQXJyYXkgZW50ZmVybmVuICoqKiBPQlNPTEVURQorZGVwcmVjYXRlZCBtaXhlZCAqZXhjbHVkZV9hcnJheShtaXhlZCAqYXJyLGludCBmcm9tLGludCB0bykKK3sKKyAgaWYgKHRvPGZyb20pCisgICAgdG8gPSBmcm9tOworICByZXR1cm4gYXJyWzAuLmZyb20tMV0rYXJyW3RvKzEuLl07Cit9CisK