ZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL1JFQURNRSBiL3NlY3VyZS9zaW11bF9lZnVuL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM0MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK3NpbXVsX2VmdW4gCistLS0tLS0tLS0tIAorRGFzIHNpbXVsX2VmdW4gT2JqZWt0IC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIGJlbnV0enQgZGllIERhdGVpZW4KK2luIC9zZWN1cmUvc2ltdWxfZWZ1bi4KK0ltIFZlcnplaWNobmlzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZSBpc3QgZWluZSBTaWNoZXJoZWl0c2tvcGllIHZvbiBhbGxlbiAKK0RhdGVpZW4gaW4gL3NlY3VyZS9zaW11bF9lZnVuLgorCitGYWxscyAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIG5pY2h0IGxhZGJhciBpc3QsIHdpcmQgCisvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGFscyBFcnNhdHogdmVyc3VjaHQuIFdlbm4gYXVjaCBkYXMKK25pY2h0IGxhZGJhciBpc3QsIGVyZm9sZ3QgZWluIFNodXRkb3duIGRlcyBNdWRzLgorCitCZWkgQWVuZGVydW5nZW4gc29sbHRlIF96dWVyc3RfIGRpZSBub3JtYWxlIHNpbXVsIGVmdW4gZWRpdGllcnQgdW5kCithbnNjaGxpZXNzZW5kIHplcnN0b2VydC9lbnRsYWRlbiB3ZXJkZW4sIHdvcmF1ZmhpbiBzaWUgaW1wbGl6aXQgZHVyY2ggZGVuCitEcml2ZXIgdW5kIE1hc3RlciBuZXVnZWxhZGVuIHdpcmQuIElzdCBkaWVzIGVyZm9sZ3JlaWNoIHVuZCBkaWUgbmV1ZQorc2ltdWxfZWZ1biBsYWV1ZnQgKGVyc3QgZGFubiEpIGtvcGllcnQgbWFuIGRpZSBEYXRlaWVuIGF1cyAKKy9zZWN1cmUvc2ltdWxfZWZ1biBuYWNoIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS4KKworRGllIERhdGVpZW4gaGllciBzaW5kIG1pdCBBdXNuYWhtZSBkZXIgc2ltdWxfZWZ1bi5jIHNlbGJzdCBfbmljaHRfIGRhenUgCitnZWRhY2h0LCBnZWxhZGVuIHp1IHdlcmRlbi4KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vY29tbS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWI4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9jb21tLmMKQEAgLTAsMCArMSwxMjQgQEAKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorCisvLyBTZW5kZXQgYW4gYWxsZSBPYmpla3RlIGluIHJvb20gdW5kIHJvb20gc2VsYmVyIGR1cmNoIEF1ZnJ1ZiB2b24KKy8vIFJlY2VpdmVNc2coKS4KK3ZhcmFyZ3Mgdm9pZCBzZW5kX3Jvb20ob2JqZWN0fHN0cmluZyByb29tLCBzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfYWN0aW9uLCBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0ICpleGNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgb3JpZ2luKQoreworICBpZiAoc3RyaW5ncChyb29tKSkKKyAgICByb29tPWxvYWRfb2JqZWN0KHJvb20pOworCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOworCisgIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKK30KKworc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQoreworICAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOworfQorCit2YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApeworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgKnBmYWRlOworCisgICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCisgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhd2hlcmUgKQorICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPQorICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKKyAgICBlbHNlCisgICAgICAgcGZhZGUgPSB3aGVyZTsKKworICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOworICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCisjZGVmaW5lIENBVF9NQVhfTElORVMgNTAKK3ZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaW50IG1vcmU7CisKKyAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICBzdGFydCA9IDE7CisKKyAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7CisgICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7CisgICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOworICAgIH0KKworICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7CisgICAgaWYgKCF0eHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIGlmIChtb3JlKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKKworICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Cit9CisjdW5kZWYgQ0FUX01BWF9MSU5FUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KKyNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAordmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOworICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5CisgICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgorICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQorICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOworICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgorICAgIGlmICghc3RyaW5ncCh0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCisgICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQorICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4dCA9ICIiOworICAgIH0KKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICByZXR1cm4gMTsKK30KKyN1bmRlZiBUQUlMX01BWF9CWVRFUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsNDM0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKK21peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCit7CisgICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisgICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7CisKKyAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIGlmKGd0aWNrcykKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIGlmIChuZXh0X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIGlmIChwcmV2X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOworICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgorICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdoaWNoOworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKKyAgICAgICAgICAgICAgICB3aGljaCA9ICIiOworICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2god2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RBVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICogcmVzdWx0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgorICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9lbmFibGVfY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vZW5hYmxlX2NvbW1hbmRzLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBlbmFibGVfY29tbWFuZHMoKQorICogYW5kIGRpc2FibGVfY29tbWFuZHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZW5hYmxlX2NvbW1hbmRzKQorCit2b2lkIGVuYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAxKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIob2IpOworfQorCisjZW5kaWYKKworI2lmICEgX19FRlVOX0RFRklORURfXyhkaXNhYmxlX2NvbW1hbmRzKQorCit2b2lkIGRpc2FibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL2hhc2guYyBiL3NlY3VyZS9zaW11bF9lZnVuL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vaGFzaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorCitkZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KKworZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL2xpdmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vbGl2aW5ncy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKKworI2RlZmluZSBjbGVhbl9sb2cocykKKy8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7CisKK3ByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7CisgIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKKyAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKKyAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0CisgIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKKyAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZworICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCisgICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbworICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCisgICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCit7CisgICAgbWl4ZWQgKnJldDsKKworICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKKworICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKK30KKwordm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQoreworICBzdHJpbmcgb2xkOworICBtaXhlZCBhOworICBpbnQgaTsKKworICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAorICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQorICB7CisgICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOworICAgIH0KKyAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7CisgICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKKyAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7CisgICAgICB9CisgICAgfQorICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7CisgICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7CisgICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLworICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7CisgICAgICAgYVtpXSA9IG9iajsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7CisgIH0KK30KKwordm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCit7CisgIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3ZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKK3sKKyAgc3RyaW5nIGxpdm5hbWU7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQorICB7CisgICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7CisgICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIF9zZXRfbmV0ZGVhZCgpCit7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOworfQorCit2b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCit7CisgIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKK29iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCit7CisgIGludCBpOworICBzdHJpbmcgdWlkOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworIAorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXRkZWFkW3VpZF07Cit9CisKK3N0cmluZyAqZHVtcF9uZXRkZWFkKCkKK3sKKyAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKK30KKworb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7CisgIG1peGVkICphLCByOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7CisgICAgaWYgKG1lbWJlcihyLDApPj0wKQorICAgICAgci09KHswfSk7CisgICAgaWYgKCFzaXplb2YocikpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKKyAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgeworICAgICAgICAgciA9IGFbPGldOworICAgICAgICAgYVs8aV0gPSBhWzBdOworICAgICAgICAgcmV0dXJuIGFbMF0gPSByOworICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIGxpdmluZyhyKSAmJiByOworfQorCitvYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKK3sKKyAgbWl4ZWQgcjsKKworICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICByLT0oezB9KTsKKyAgZWxzZQorICAgIGlmIChvYmplY3RwKHIpKQorICAgICAgcj0oe3J9KTsKKyAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHI7Cit9CisKK29iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgeworICBvYmplY3QgKm9ianM7CisgIG1peGVkIHJlczsKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCFzdHJpbmdwKHV1aWQpKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworCisgIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7CisgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCisgICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKKyAgICAgIHJlcy09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7CisgICAgfQorICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KKyAgICBpZiAoIXNpemVvZihyZXMpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9ianMgPSByZXM7CisgICAgcmVzID0gb2Jqc1swXTsKKyAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCisgICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgeworICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgeworICAgICAgICAgcmVzID0gb2Jqc1s8aV07CisgICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07CisgICAgICAgICBvYmpzWzBdID0gcmVzOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKKyAgICB9CisgICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgorICB9CisgIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAorICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7CisKKyAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCisgIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCisgIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIC8vIGVuZGxpY2ggZ2VmdW5kZW4KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQoreworICAgIG1peGVkIG1hdGNoOworCisgICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQorICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7CisKKyAgICBtYXRjaCAtPSAoezB9KTsKKworICAgIGlmICggc2l6ZW9mKG1hdGNoKSApeworICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKKyAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQorICAgICAgICAgICAgICA+IDA7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7CisgICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKK3ZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKK3sKKyAgICBpbnQgaSwgczsKKyAgICBtaXhlZCBtYXRjaCwgKnVzZXI7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKKyAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKKworICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCisgICAgICAgcmV0dXJuIHN0cjsKKworICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7CisgICAgcyA9IHNpemVvZihzdHIpOworICAgIG1hdGNoID0gMDsKKworICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQorICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQorICAgICAgICAgICBpZiAoIG1hdGNoICkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCisgICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07CisKKyAgICBpZiAoICFtYXRjaCApCisgICAgICAgcmV0dXJuIC0yOworCisgICAgcmV0dXJuIG1hdGNoOworfQorCittaXhlZCAqZHVtcF9saXZpbmdzKCkKK3sKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Cit9CisKKy8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgorcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKK3sKKyAgaW50IGksIGo7CisgIG1peGVkIGE7CisKKyAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCisgIHsKKyAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQorICAgIHsKKyAgICAgIGEtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7CisgICAgfQorICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCisgICAgeworICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKKyAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7CisgIH0KKyAgaWYgKGxlZnQpCisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7CisgIGVsc2UKKyAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqczsKKyAgb2JqZWN0IG9iOworCisgIHM9bV9pbmRpY2VzKG5ldGRlYWQpOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCisgICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKKyAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Cit9CisKK3ByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7CisgICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCisgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICA4MAorICAgICAgICAgICAgICAgICApOworICB9CisgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKK30KKworI3VuZGVmIGNsZWFuX2xvZworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vb2JqZWN0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vb2JqZWN0X2luZm8uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIG9iamVjdF9pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgX19FRlVOX0RFRklORURfXyhkcml2ZXJfaW5mbykgLyogTmV3ZXIgdmVyc2lvbiBpcyB0aGVyZSAqLworCisjaW5jbHVkZSA8b2JqZWN0aW5mby5oPgorI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK21peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQsIHZhcmFyZ3MgaW50KiBpbmRleCkKK3sKKyAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgIGlmIChzaXplb2YoaW5kZXgpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBvYmplY3RfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBvYmplY3RfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgT0lORk9fQkFTSUM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JQl9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lCX0hFQVJUX0JFQVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSVNfV0laQVJEXSAgICAgICAgID0gMDsgICAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX0VOQUJMRV9DT01NQU5EU10gICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfQ0xPTkVdICAgICAgICAgICAgID0gZWZ1bjo6Y2xvbmVwKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfREVTVFJVQ1RFRF0gICAgICAgID0gMDsgICAvKiBOb3QgcG9zc2libGUgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUFBFRF0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9PTkNFX0lOVEVSQUNUSVZFXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFU0VUX1NUQVRFXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1dJTExfQ0xFQU5fVVBdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTEFNQkRBX1JFRkVSRU5DRURdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBTUJEQV9SRUZFUkVOQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU0hBRE9XXSAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKSAmJiAxOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVBMQUNFRF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX1JFU0VUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElNRV9PRl9SRUZdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRUZdICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JQl9HSUdBVElDS1NdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElDS1NdICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUF9OVU1dICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJPR19TV0FQUEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1ZBUl9TV0FQUEVEXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9WQVJfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05BTUVdICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTE9BRF9OQU1FXSAgICAgICAgID0gZWZ1bjo6bG9hZF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJFVl9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9DTEVBTlVQXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfQ0xFQU5VUF9USU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19QT1NJVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lQX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfTkVYVF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QUkVWXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BPU10gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QT1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lNX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUkVGXSAgICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OQU1FXSAgICAgICAgICAgICAgID0gZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUFJPR19TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fRlVOQ1RJT05TXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0ZVTkNUSU9OU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1ZBUklBQkxFU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9WQVJJQUJMRVNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9TVFJJTkdTXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19EQVRBXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfVE9UQUxdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOSEVSSVRFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9JTkhFUklURURdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX1NJWkVdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fREFUQV9TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9EQVRBX1NJWkVdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0lOSEVSSVRdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fSU5IRVJJVCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0NMT05FXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fQ0xPTkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19TSEFET1ddICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX1NIQURPVyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkNMVURFU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOQ0xVREVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0hBUkVfVkFSSUFCTEVTXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFSRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpbmRleFswXTsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3Igb2JqZWN0X2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2VkaXRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2VkaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfZWRpdGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTMyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pZGxlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaW5wdXRfcGVuZGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pbnB1dF9wZW5kaW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitvYmplY3QgcXVlcnlfaW5wdXRfcGVuZGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSU5QVVRfUEVORElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaXBfbmFtZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaXBfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTZlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pcF9uYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCisgKiBxdWVyeV9pcF9udW1iZXIoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Cit9CisKKy8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKK3N0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQoreworICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKKyAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKKyAgeworICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKKyAgfQorICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Cit9CisKK3N0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQoreworICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCisgICAgICBvYj1xdWVyeV9pcF9udW1iZXIob2IpOworICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9saW1pdHMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbGltaXRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xpbWl0cykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3ZhcmFyZ3MgaW50KiBxdWVyeV9saW1pdHMoaW50IGRlZikKK3sKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oZGVmID8gRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyA6IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbG9hZF9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisgICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9tdWRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9tdWRfcG9ydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitpbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKK3sKKyAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQorICAgIHsKKyAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7CisgICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCisgICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOworICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOworICAgIH0KKworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitpbnQgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9zbm9vcC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfc25vb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2OWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfc25vb3AuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7CisjZWxzZQorICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7CisjZW5kaWYKK30KKworbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7CisgIG9iamVjdCBzbm9vcGVyOworCisgIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7CisgIGlmICghc25vb3BlcikgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOworICByZXR1cm4gc25vb3BlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfaGVhcnRfYmVhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfaGVhcnRfYmVhdC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKworICAgIGlmICghZmxhZyA9PSAhaGIpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X2lzX3dpemFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfaXNfd2l6YXJkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIgdGhhdCBhcmUgYWN0aXZhdGVkIHdpdGgKKyAqIHNldF9pc193aXphcmQoKS4gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBsYXllciBvYmplY3QuCisgKiBBbHNvIHNldF9pc193aXphcmQoKSBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXIgb2JqZWN0LAorICogbm90IGFzIGFuIChzaW11bC0pZWZ1bi4KKyAqLworCisjaW5jbHVkZSA8Y29tbWFuZHMuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisvKiBpc193aXphcmQ6CisgKiAgMTogaGFzIGFjdGlvbnMsCisgKiAgMDogbmV2ZXIgaGFkIGFjdGlvbnMsCisgKiAtMTogaGFkIGFjdGlvbnMgb25jZS4KKyAqLworcHJpdmF0ZSBub3NhdmUgaW50IGlzX3dpemFyZDsKKworcHJpdmF0ZSBpbnQgZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX2R1bXBhbGxvYmooc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3cml0ZSgiRHVtcGluZyB0byAvT0JKX0RVTVAgLi4uICIpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFMpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgd3JpdGUoImRvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfb3BjZHVtcChzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09QQ09ERVMpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfc3RhdHVzKHN0cmluZyBzdHIpCit7CisgICAgaW50IG9wdDsKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKG9wdCkpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2V0X2lzX3dpemFyZCh2YXJhcmdzIDxvYmplY3R8aW50PiogYXJncykKK3sKKyAgICBpbnQgb2xkdmFsID0gaXNfd2l6YXJkOworCisgICAgaWYoIXNpemVvZihhcmdzKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDEgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihhcmdzWzBdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJPbmx5IHNldF9pc193aXphcmQgZm9yIHRoZSBjdXJyZW50IG9iamVjdCBzdXBwb3J0ZWRcbiIpOworICAgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRoZSBjdXJyZW50IG9iamVjdCBtdXN0IGJlIHRoaXNfcGxheWVyKCkgZm9yIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDIgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFhcmdzWzFdKQorICAgIHsKKyAgICAgICAgaWYoaXNfd2l6YXJkID4gMCkKKyAgICAgICAgICAgIGlzX3dpemFyZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmKHNpemVvZihhcmdzKSA9PSAyICYmIGFyZ3NbMV08MCkKKyAgICB7CisgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZighaXNfd2l6YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX21hbGxvYywgIm1hbGxvYyIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9kdW1wYWxsb2JqLCAiZHVtcGFsbG9iaiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9vcGNkdW1wLCAib3BjZHVtcCIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9zdGF0dXMsICJzdGF0dXMiLCBBQV9OT1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpc193aXphcmQgPSAxOworICAgIH0KKworICAgIHJldHVybiBvbGR2YWwgPiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X3Byb21wdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfcHJvbXB0LmMKQEAgLTAsMCArMSwyMSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKwordmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKK3sKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7CisKKyAgICBpZighaW50cChwcm9tcHQpKQorICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKKworICAgIHJldHVybiBvbGRwcm9tcHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2hhZG93LmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCisgKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOworfQorCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgICAgaWYoZmxhZykKKyAgICB7CisgICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKKyAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKKworICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKK30KKyNlbHNlCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKK30KKyNlbmRpZgorCisKK3B1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7CisgIGlmIChmbGFnKQorICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIGVmdW46OnVuc2hhZG93KCk7Cit9CisKK3B1YmxpYyB2b2lkIHVuc2hhZG93KCkgeworICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKKyAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMGI3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYwpAQCAtMCwwICsxLDIwMTYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCisvLworLy8gJElkOiBzaW11bF9lZnVuLmMgNzQwOCAyMDEwLTAyLTA2IDAwOjI3OjI1WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEFic29sdXRlIFBmYWRlIGVyZm9yZGVybGljaCAtIHp1bSBaZWl0cHVua3QsIHdvIGRlciBNYXN0ZXIgZ2VsYWRlbgorLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCisKKyNkZWZpbmUgU05PT1BMT0dGSUxFICJTTk9PUCIKKyNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc3lzL3Nub29waW5nLmgiCisjaW5jbHVkZSAiL3N5cy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZXJxLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICIvc3lzL2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RpbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgorI2luY2x1ZGUgIi9zeXMvdGltZS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKyNpbmNsdWRlICIvc3lzL2lucHV0X3RvLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0cmluZyBkdGltZShpbnQgd2Fubik7Cit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspOworaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSk7Cit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKTsKK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYik7Citub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpOworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCk7Citub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKTsKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOworCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK3ZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK3ZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQoraW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZyk7CisjZW5kaWYKKworLy8gSW5jbHVkZSB0aGUgZGlmZmVyZW50IHN1YiAnbW9kdWxlcycgb2YgdGhlIHNpbXVsX2VmdW4KKyNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJlbmFibGVfY29tbWFuZHMuYyIKKyNpbmNsdWRlIF9fRElSX18iaGFzaC5jIgorI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9lZGl0aW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lkbGUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pcF9uYW1lLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xpbWl0cy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbXVkX3BvcnQuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgorI2luY2x1ZGUgX19ESVJfXyJzZXRfaGVhcnRfYmVhdC5jIgorI2lmIF9fQk9PVF9USU1FX18gPCAxNDU2MjYxODU5CisjaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKKyNlbmRpZgorI2luY2x1ZGUgX19ESVJfXyJzaGFkb3cuYyIKKyNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgorI2luY2x1ZGUgX19ESVJfXyJjb21tLmMiCisKKyNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCisjZGVmaW5lIExFVkVMKHgpIHF1ZXJ5X3dpel9sZXZlbCh4KQorI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK21peGVkIGR0aW1lX2NhY2hlID0gKHstMSwiIn0pOworCisjaWZkZWYgSU9TVEFUUworc3RydWN0IGlvc3RhdF9zIHsKKyAgc3RyaW5nIG9uYW1lOworICBpbnQgdGltZTsKKyAgaW50IHNpemU7Cit9OworbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKK21peGVkIHJlc3RvcmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwwKSB9KTsKKy8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgbG9nX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworCittaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CisgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7CisvKiAgICBjYXNlIDM6CisgICAgICByZXR1cm4gd3JpdGVmaWxlX3N0YXQ7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGxvZ19zdGF0OworICAgICAgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXZpb3VzX29iamVjdCgpCisgICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCisgICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKKyAgICAgICAgICAgICAmJiAob2IgIT0gdGhpc19wbGF5ZXIoKSB8fCBvYiAhPSB0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCisgICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCisgICAgICAgICAgICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBvYikpICkgKQorCisgICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGF1c2dlbG9nZ3Qgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKK30KKworCit2b2lkIF9fX3VwZG1hc3RlcigpCit7CisgICAgb2JqZWN0IG9iOworCisgICAgLy9zb2xsdGUgbmljaHQgamVkZXIgZHVlcmZlbi4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CisKKyAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CisgICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCisgICAgICAgIGdldF9kaXIoIi9zZWN1cmUvbWFzdGVyLyouYyIsR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRHxHRVRESVJfUEFUSCkpIHsKKyAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQorICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKKyAgICB9CisgICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOworICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CisgICAgbG9hZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIik7CisKKyAgICB3cml0ZSgiZG9uZS5cbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CisgIG1peGVkIHJldDsKKworICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuICI/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+MDsgKSB7CisgICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCisgICAgICAgIHJlcyArPSBjb3VudF90YWJsZVsoc1tpXS0nICcpJjYzXS0nMCc7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQoraW50IGNvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Cit9CisjZW5kaWYKKworCisvLyAqIFRlaWxlIGF1cyBlaW5lbSBBcnJheSBlbnRmZXJuZW4gKioqIE9CU09MRVRFCitkZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQoreworICBpZiAodG88ZnJvbSkKKyAgICB0byA9IGZyb207CisgIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvUkVBRE1FIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9SRUFETUUKQEAgLTAsMCArMSwyMCBAQAorc2ltdWxfZWZ1biAKKy0tLS0tLS0tLS0gCitEYXMgc2ltdWxfZWZ1biBPYmpla3QgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4gYmVudXR6dCBkaWUgRGF0ZWllbgoraW4gL3NlY3VyZS9zaW11bF9lZnVuLgorSW0gVmVyemVpY2huaXMgL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlIGlzdCBlaW5lIFNpY2hlcmhlaXRza29waWUgdm9uIGFsbGVuIAorRGF0ZWllbiBpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCisKK0ZhbGxzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMgbmljaHQgbGFkYmFyIGlzdCwgd2lyZCAKKy9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYWxzIEVyc2F0eiB2ZXJzdWNodC4gV2VubiBhdWNoIGRhcworbmljaHQgbGFkYmFyIGlzdCwgZXJmb2xndCBlaW4gU2h1dGRvd24gZGVzIE11ZHMuCisKK0JlaSBBZW5kZXJ1bmdlbiBzb2xsdGUgX3p1ZXJzdF8gZGllIG5vcm1hbGUgc2ltdWwgZWZ1biBlZGl0aWVydCB1bmQKK2Fuc2NobGllc3NlbmQgemVyc3RvZXJ0L2VudGxhZGVuIHdlcmRlbiwgd29yYXVmaGluIHNpZSBpbXBsaXppdCBkdXJjaCBkZW4KK0RyaXZlciB1bmQgTWFzdGVyIG5ldWdlbGFkZW4gd2lyZC4gSXN0IGRpZXMgZXJmb2xncmVpY2ggdW5kIGRpZSBuZXVlCitzaW11bF9lZnVuIGxhZXVmdCAoZXJzdCBkYW5uISkga29waWVydCBtYW4gZGllIERhdGVpZW4gYXVzIAorL3NlY3VyZS9zaW11bF9lZnVuIG5hY2ggL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlLgorCitEaWUgRGF0ZWllbiBoaWVyIHNpbmQgbWl0IEF1c25haG1lIGRlciBzaW11bF9lZnVuLmMgc2VsYnN0IF9uaWNodF8gZGF6dSAKK2dlZGFjaHQsIGdlbGFkZW4genUgd2VyZGVuLgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9jb21tLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1Yjg1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2NvbW0uYwpAQCAtMCwwICsxLDEyNCBAQAorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKy8vIFNlbmRldCBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSB1bmQgcm9vbSBzZWxiZXIgZHVyY2ggQXVmcnVmIHZvbgorLy8gUmVjZWl2ZU1zZygpLgordmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3QgKmV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBvcmlnaW4pCit7CisgIGlmIChzdHJpbmdwKHJvb20pKQorICAgIHJvb209bG9hZF9vYmplY3Qocm9vbSk7CisKKyAgb3JpZ2luIHx8PSBwcmV2aW91c19vYmplY3QoKTsKKyAgb2JqZWN0ICpkZXN0ID0gZXhjbHVkZSA/IGFsbF9pbnZlbnRvcnkocm9vbSkgLSBleGNsdWRlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9pbnZlbnRvcnkocm9vbSk7CisKKyAgZGVzdC0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworfQorCitzdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCit7CisgICAgc3RyaW5nICppZ25vcmU7CisKKyAgICBpZiAoICFlbnZpcm9ubWVudChvYikgKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNpemVvZiggcmVnZXhwKCAoeyBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQob2IpICkgfSksIHBhdCApICk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBzaG91dCggc3RyaW5nIHMsIG1peGVkIHdoZXJlICl7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyAqcGZhZGU7CisKKyAgICBpZiAoICFzaXplb2YoIHUgPSB1c2VycygpIC0gKHsgdGhpc19wbGF5ZXIoKSB9KSApICkKKyAgICAgICByZXR1cm47CisKKyAgICBpZiAoICF3aGVyZSApCisgICAgICAgcGZhZGUgPSAoeyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIGludHAod2hlcmUpICkKKyAgICAgICBwZmFkZSA9CisgICAgICAgICAgICh7IGltcGxvZGUoIGVmdW46OmV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi4yXSwgIi8iICkgKyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIHN0cmluZ3Aod2hlcmUpICkKKyAgICAgICBwZmFkZSA9ICh7IHdoZXJlIH0pOworICAgIGVsc2UKKyAgICAgICBwZmFkZSA9IHdoZXJlOworCisgICAgdSA9IGZpbHRlciggdSwgIl9zaG91dF9maWx0ZXIiLCBNRSwgaW1wbG9kZSggcGZhZGUsICJ8IiApICk7CisgICAgdS0+UmVjZWl2ZU1zZyhzLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9XUkFQfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgTUFfU0hPVVRfU0VGVU4sIDAsIHByZXZpb3VzX29iamVjdCgpKTsKK30KKworCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biBjYXQoKS4KKyNkZWZpbmUgQ0FUX01BWF9MSU5FUyA1MAordmFyYXJncyBpbnQgY2F0KHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIGludCBudW0pCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpbnQgbW9yZTsKKworICAgIGlmIChudW0gPCAwIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghc3RhcnQpCisgICAgICAgIHN0YXJ0ID0gMTsKKworICAgIGlmICghbnVtIHx8IG51bSA+IENBVF9NQVhfTElORVMpIHsKKyAgICAgICAgbnVtID0gQ0FUX01BWF9MSU5FUzsKKyAgICAgICAgbW9yZSA9IHNpemVvZihyZWFkX2ZpbGUoZmlsZSwgc3RhcnQrbnVtLCAxKSk7CisgICAgfQorCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfZmlsZShmaWxlLCBzdGFydCwgbnVtKTsKKyAgICBpZiAoIXR4dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgaWYgKG1vcmUpCisgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICIqKioqKlRSVU5DQVRFRCoqKipcbiIpOworCisgICAgcmV0dXJuIHNpemVvZih0eHQgJiAiXG4iKTsKK30KKyN1bmRlZiBDQVRfTUFYX0xJTkVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gdGFpbCgpLgorI2RlZmluZSBUQUlMX01BWF9CWVRFUyAxMDAwCit2YXJhcmdzIGludCB0YWlsKHN0cmluZyBmaWxlKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyB0eHQgPSByZWFkX2J5dGVzKGZpbGUsIC0oVEFJTF9NQVhfQllURVMgKyA4MCksIChUQUlMX01BWF9CWVRFUyArIDgwKSk7CisgICAgLy8gcmVhZF9ieXRlcygpIHJldHVybnMgMCBpZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZ2l2ZW4gYnkKKyAgICAvLyBwYXJhbWV0ZXIgIzIgbGllcyBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHRyeSBhbmQgcmVhZCB0aGUgZW50aXJlIGZpbGUuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkgJiYgZmlsZV9zaXplKGZpbGUpIDwgVEFJTF9NQVhfQllURVMrODApCisgICAgICB0eHQgPSByZWFkX2ZpbGUoZmlsZSk7CisgICAgLy8gRXhpdCBpZiBzdGlsbCBub3RoaW5nIGNvdWxkIGJlIHJlYWQuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIGN1dCBvZmYgZmlyc3QgKGluY29tcGxldGUpIGxpbmUKKyAgICBpbnQgaW5kZXggPSBzdHJzdHIodHh0LCAiXG4iKTsKKyAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICBpZiAoaW5kZXggKyAxIDwgc2l6ZW9mKHR4dCkpCisgICAgICAgICAgICB0eHQgPSB0eHRbaW5kZXgrMS4uXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHh0ID0gIiI7CisgICAgfQorCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIHJldHVybiAxOworfQorI3VuZGVmIFRBSUxfTUFYX0JZVEVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZGVidWdfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZGVidWdfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDdjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9kZWJ1Z19pbmZvLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBkZWJ1Z19pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRlYnVnX2luZm8pCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworbWl4ZWQgZGVidWdfaW5mbyhpbnQgd2hhdCwgdmFyYXJncyBtaXhlZCogYXJncykKK3sKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIGRlYnVnX2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIERJTkZPX09CSkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKyAgICAgICAgICAgIHByaW50ZigiT19IRUFSVF9CRUFUICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fRU5BQkxFX0NPTU1BTkRTIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0NMT05FICAgICAgICAgICA6ICVzXG4iLCBlZnVuOjpjbG9uZXAob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19ERVNUUlVDVEVEICAgICAgOiBGQUxTRVxuIik7CisgICAgICAgICAgICBwcmludGYoIk9fU1dBUFBFRCAgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKSAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX09OQ0VfSU5URVJBQ1RJVkU6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVNFVF9TVEFURSAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKSAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fV0lMTF9DTEVBTl9VUCAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKSAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFUExBQ0VEICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9yZXNldCAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX29mX3JlZiA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJyZWYgICAgICAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpKTsKKworICAgICAgICAgICAgaW50IGd0aWNrcyA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgaWYoZ3RpY2tzKQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZCUwOWRcbiIsIGd0aWNrcywgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworCisgICAgICAgICAgICBwcmludGYoInN3YXBfbnVtICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSkpOworICAgICAgICAgICAgcHJpbnRmKCJuYW1lICAgICAgICA6ICclcydcbiIsICAgICBlZnVuOjpvYmplY3RfbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJsb2FkX25hbWUgICA6ICclcydcbiIsICAgICBlZnVuOjpsb2FkX25hbWUob2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IG5leHRfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgaWYgKG5leHRfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJuZXh0X2FsbCAgICA6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKG5leHRfb2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IHByZXZfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgaWYgKHByZXZfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJQcmV2aW91cyBvYmplY3QgaW4gb2JqZWN0IGxpc3Q6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKHByZXZfb2IpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlRoaXMgb2JqZWN0IGlzIHRoZSBoZWFkIG9mIHRoZSBvYmplY3QgbGlzdC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHJlZidzICUzZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKSk7CisgICAgICAgICAgICBwcmludGYoIk5hbWU6ICclcydcbiIsICAgICAgICAgIGVmdW46OnByb2dyYW1fbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHNpemUgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSBmdW5jJ3M6ICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSB2YXJzOiAgICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIHN0cmluZ3M6ICUzZCAoJTRkKSA6IG92ZXJoZWFkICVkICsgZGF0YSAlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSArIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gaW5oZXJpdHMgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCkpOworCisgICAgICAgICAgICBwcmludGYoInRvdGFsIHNpemUgICAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkYXRhIHNpemUgICAgICAgJTZkICglNmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fT0JKTElTVDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAwKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCAqIG9icyA9IGVmdW46Om9iamVjdHMoYXJnc1swXSwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9ic1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NQUxMT0M6CisgICAgICAgICAgICB3cml0ZShkZWJ1Z19pbmZvKERJTkZPX1NUQVRVUywgIm1hbGxvYyIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRElORk9fU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd2hpY2g7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpIHx8ICFhcmdzWzBdKQorICAgICAgICAgICAgICAgIHdoaWNoID0gIiI7CisgICAgICAgICAgICBlbHNlIGlmKHN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaCh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhvcHQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJkZXN0cnVjdGVkIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFNfREVTVFJVQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJvcGNvZGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09QQ09ERVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWVtb3J5IjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgJyVzJyB0byBkZWJ1Z19pbmZvKERJTkZPX0RVTVApLlxuIiwgYXJnc1swXSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmR1bXBfZHJpdmVyX2luZm8ob3B0LCBhcmdzWzEuLjFdLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAzIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TVEFUVVM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TVEFUVVNfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TSEFET1dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TSEFET1dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQUEVEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUF9TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19MSVNUXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX0xJU1QpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTkVXTFlfREVTVF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ORVdMWV9ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0RFU1RSVUNURURdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19QUk9DRVNTRURdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0FWR19QUk9DXSAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NMT1RTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVF9UQUJMRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9PQkpTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX0FDVElWRV9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTX1RPVEFMXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0xPVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9QUk9DRVNTRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0FWR19QUk9DXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX0hFQVJUQkVBVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVFNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVF9TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQ0FMTE9VVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BUlJBWVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FSUkFZUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU19TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSFlCUklEX01BUFBJTkdTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IWUJSSUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hBU0hfTUFQUElOR1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSEFTSCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUX1RZUEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RfVFlQRVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUFBFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQX1NJWkVdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VTRVJfUkVTRVJWRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9VU0VSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVNURVJfUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfTUFTVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TWVNURU1fUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfU1lTVEVNKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FERF9NRVNTQUdFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVTU0FHRVNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU19JTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX0lOKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV9JTl0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX0lOKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFlfSElUU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfSElUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1ZJUlRVQUxfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1RBQkxFX1NJWkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfT1ZFUkhFQURdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5dICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTX0JZVkFMVUVdICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl9CWVZBTFVFXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ0hBSU5TXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TTE9UU19VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQURERURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX0FEREVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfREVMRVRFRF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX1JFTU9WRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DT0xMSVNJT05TXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0NPTExJU0lPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF9CWVZBTFVFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfVkFMVUUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfQ0FDSEVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUVVFU1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0ZPVU5EXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0NPTExdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfQ09MTElTSU9OUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9GSUxFXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfRklMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfU1dBUF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX1NXQVApOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQk9PVF9USU1FXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0JPT1RfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfU1dBUDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NXQVBfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VTlNXQVBQRURdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSU10gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUl9TSVpFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV0gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GSUxFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVVU0VEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfUkVVU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hFU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSF9MRU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSEVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hfTEVOXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfQ09NUEFDVF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERDX1NXQVBfQ09NUEFDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRUNZQ0xFX0ZSRUVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1dBUF9SRUNZQ0xFX1BIQVNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9NRU1PUlk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9NRU1PUllfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9OQU1FXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfQUxMT0NBVE9SX05BTUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TVUNDRVNTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExfU1VDQ0VTU0VTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9JTkNSRU1FTlRfU0laRV9DQUxMX0RJRkZTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9PVkVSSEVBRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQUxMT0NBVEVEXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1VTRURdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9UT1RBTF9VTlVTRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VTlVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19GVUxMKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTX1JFUV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfUkVRX1NVQ0NFU1NdICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMX1RBUkdFVF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19JTlNQRUNURURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX0lOU1BFQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfTUVSR0VEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19NRVJHRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX1JFU1VMVF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfUkVTVUxUSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQVZMX05PREVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZSRUVfQkxPQ0tTX0FWTF9OT0RFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0VYVF9TVEFUSVNUSUNTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9FWFRFTkRFRF9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIGRlYnVnX2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fVFJBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IERJVF9DVVJSRU5UOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlQpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1VOQ0FVR0hUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9VTkNBVUdIVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9TVFJfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfQVNfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlRfREVQVEg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0RFUFRIKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRVZBTF9OVU1CRVI6CisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfRVZBTF9OVU1CRVIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9lbmFibGVfY29tbWFuZHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWM5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIGVuYWJsZV9jb21tYW5kcygpCisgKiBhbmQgZGlzYWJsZV9jb21tYW5kcygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworI2lmICEgX19FRlVOX0RFRklORURfXyhlbmFibGVfY29tbWFuZHMpCisKK3ZvaWQgZW5hYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDEpOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcihvYik7Cit9CisKKyNlbmRpZgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRpc2FibGVfY29tbWFuZHMpCisKK3ZvaWQgZGlzYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvaGFzaC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9oYXNoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisKK2RlcHJlY2F0ZWQgc3RyaW5nIG1kNShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfTUQ1LCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQorCitkZXByZWNhdGVkIHN0cmluZyBzaGExKG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9TSEExLCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvbGl2aW5ncy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvbGl2aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9saXZpbmdzLmMKQEAgLTAsMCArMSwzNDggQEAKKy8vICogbGl2aW5nX25hbWUtQmVoYW5kbHVuZworCisjZGVmaW5lIGNsZWFuX2xvZyhzKQorLy8jZGVmaW5lIGNsZWFuX2xvZyhzKSBsb2dfZmlsZSgiQ0xFQU5fU0lNIixjdGltZSh0aW1lKCkpWzQuLjE4XSsiOiAiKyhzKSk7CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGl2aW5nX25hbWVfbSwgbmFtZV9saXZpbmdfbSwgbmV0ZGVhZDsKKworcHJpdmF0ZSB2b2lkIEluaXRMaXZpbmdEYXRhKG1peGVkIHdpemluZm8pIHsKKyAgLy8gbGl2aW5nX25hbWUgaXN0IGVpbiBQb2ludGVyIGRlciBhdWNoIGluIGRlciBleHRyYV93aXppbmZvIGdlaGFsdGVuIAorICAvLyB3aXJkLCBzbyBrYW5uIGRpZSBzaW11bF9lZnVuIG5ldSBnZWxhZGVuIHdlcmRlbiwgb2huZSBkYXNzIGRpZXNlcworICAvLyBNYXBwaW5nIHZlcmxvcmVuIGdlaHQKKyAgaWYgKCFtYXBwaW5ncChsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0pKQorICAgIGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gR2xlaWNoZXMgZ2lsdCBmdWVyIGRhcyBNYXBwaW5nIE5hbWUtTGl2aW5nCisgIGlmICghbWFwcGluZ3AobmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddKSkKKyAgICBuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIE5ldHp0b3RlIHNpbmQgZWJlbmZhbGxzIGluIGRlciBleHRyYV93aXppbmZvCisgIGlmICghbWFwcGluZ3AobmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdKSkKKyAgICBuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0gPSAoW10pOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgZ2V0dXVpZCggb2JqZWN0IG9iICkKK3sKKyAgICBtaXhlZCAqcmV0OworCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICByZXQgPSAobWl4ZWQpbWFzdGVyKCktPmdldF91c2VyaW5mbyggZ2V0dWlkKG9iKSApOworCisgICAgaWYgKCAhcG9pbnRlcnAocmV0KSB8fCBzaXplb2YocmV0KSA8IDUgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgLy8gVXNlcm5hbWUgKyAiXyIgKyBDcmVhdGlvbkRhdGUKKyAgICByZXR1cm4gcmV0WzBdICsgIl8iICsgcmV0WzVdOworfQorCit2b2lkIHNldF9vYmplY3RfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUsIG9iamVjdCBvYmopCit7CisgIHN0cmluZyBvbGQ7CisgIG1peGVkIGE7CisgIGludCBpOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKT09b2JqIHx8IHByZXZpb3VzX29iamVjdCgpPT10aGlzX29iamVjdCgpIHx8CisgICAgICBwcmV2aW91c19vYmplY3QoKT09bWFzdGVyKCkpCisgIHsKKyAgICBpZighbGl2bmFtZSB8fCAhc3RyaW5ncChsaXZuYW1lKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIiVPOiBpbGxlZ2FsIGxpdmluZyBuYW1lOiAlT1xuIiwgb2JqLCBsaXZuYW1lKSk7CisgICAgfQorICAgIGlmIChvbGQgPSBsaXZpbmdfbmFtZV9tW29ial0pIHsKKyAgICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtvbGRdKSkgeworICAgICAgIGFbbWVtYmVyKGEsIG9iaildID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwgb2xkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGl2aW5nX25hbWVfbVtvYmpdID0gbGl2bmFtZTsKKyAgICBpZiAoYSA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pIHsKKyAgICAgIGlmICghcG9pbnRlcnAoYSkpIHsKKyAgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gKHthLCBvYmp9KTsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gcmVhbGxvY2F0ZSBlbnRyeSBmcm9tIGRlc3RydWN0ZWQgb2JqZWN0ICovCisgICAgICBpZiAoKGkgPSBtZW1iZXIoYSwgMCkpID49IDApIHsKKyAgICAgICBhW2ldID0gb2JqOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBhICsgKHtvYmp9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IG9iajsKKyAgfQorfQorCit2b2lkIHNldF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSkKK3sKKyAgc2V0X29iamVjdF9saXZpbmdfbmFtZShsaXZuYW1lLHByZXZpb3VzX29iamVjdCgpKTsKK30KKwordm9pZCByZW1vdmVfbGl2aW5nX25hbWUoKQoreworICBzdHJpbmcgbGl2bmFtZTsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgaWYgKGxpdm5hbWU9bGl2aW5nX25hbWVfbVtwcmV2aW91c19vYmplY3QoKV0pCisgIHsKKyAgICBtX2RlbGV0ZShsaXZpbmdfbmFtZV9tLHByZXZpb3VzX29iamVjdCgpKTsKKyAgICBpZiAob2JqZWN0cChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBpZiAobmFtZV9saXZpbmdfbVtsaXZuYW1lXT09cHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0tPSh7cHJldmlvdXNfb2JqZWN0KCl9KTsKKyAgICAgIGlmICghc2l6ZW9mKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX3NldF9uZXRkZWFkKCkKK3sKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIG5ldGRlYWRbZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV09cHJldmlvdXNfb2JqZWN0KCk7Cit9CisKK3ZvaWQgX3JlbW92ZV9uZXRkZWFkKCkKK3sKKyAgbV9kZWxldGUobmV0ZGVhZCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKK30KKworb2JqZWN0IGZpbmRfbmV0ZGVhZChzdHJpbmcgdXVpZCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisgCisgIGlmIChpc191dWlkICYmIGdldHV1aWQobmV0ZGVhZFt1aWRdKSAhPSB1dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIG5ldGRlYWRbdWlkXTsKK30KKworc3RyaW5nICpkdW1wX25ldGRlYWQoKQoreworICByZXR1cm4gbV9pbmRpY2VzKG5ldGRlYWQpOworfQorCitvYmplY3QgZmluZF9saXZpbmcoc3RyaW5nIGxpdm5hbWUpIHsKKyAgbWl4ZWQgKmEsIHI7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChyID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpIHsKKyAgICBpZiAobWVtYmVyKHIsMCk+PTApCisgICAgICByLT0oezB9KTsKKyAgICBpZiAoIXNpemVvZihyKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfbGl2aW5nIGxvZXNjaHQgJXNcbiIsbGl2bmFtZSkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWxpdmluZyhyID0gKGEgPSByKVswXSkpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihhKTsgLS1pOykgeworICAgICAgIGlmIChsaXZpbmcoYVs8aV0pKSB7CisgICAgICAgICByID0gYVs8aV07CisgICAgICAgICBhWzxpXSA9IGFbMF07CisgICAgICAgICByZXR1cm4gYVswXSA9IHI7CisgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gbGl2aW5nKHIpICYmIHI7Cit9CisKK29iamVjdCAqZmluZF9saXZpbmdzKHN0cmluZyBsaXZuYW1lKQoreworICBtaXhlZCByOworCisgIGlmIChwb2ludGVycChyPW5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHItPSh7MH0pOworICBlbHNlCisgICAgaWYgKG9iamVjdHAocikpCisgICAgICByPSh7cn0pOworICBpZiAoIXBvaW50ZXJwKHIpfHwhc2l6ZW9mKHIpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcjsKK30KKworb2JqZWN0IGZpbmRfcGxheWVyKHN0cmluZyB1dWlkKSB7CisgIG9iamVjdCAqb2JqczsKKyAgbWl4ZWQgcmVzOworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoIXN0cmluZ3AodXVpZCkpCisgICAgcmV0dXJuIDA7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisKKyAgaWYgKHBvaW50ZXJwKHJlcyA9IG5hbWVfbGl2aW5nX21bdWlkXSkpIHsKKyAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgZ2dmLiBlbnRmZXJuZW4KKyAgICBpZiAobWVtYmVyKHJlcywwKT49MCkgeworICAgICAgcmVzLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21bdWlkXSA9IHJlczsKKyAgICB9CisgICAgLy8gZ2dmLiBOYW1lbiBvaG5lIE9iamVrdGUgZW50ZmVybmVuLgorICAgIGlmICghc2l6ZW9mKHJlcykpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSx1aWQpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfcGxheWVyIGxvZXNjaHQgJXNcbiIsdWlkKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2JqcyA9IHJlczsKKyAgICByZXMgPSBvYmpzWzBdOworICAgIC8vIFdlbm4gZGFzIDAuIEVsZW1lbnQgZGVyIFNwaWVsZXIgaXN0LCBzaW5kIHdpciBmZXJ0aWcuIEFuc29uc3RlbiBzdWNoZW4KKyAgICAvLyB3aXIgZGVuIFNwaWVsZXIgdW5kIHNjaGllYmVuIGlobiBhbiBkaWUgMC4gU3RlbGxlIGltIEFycmF5LgorICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKG9ianMpOyAtLWk7KSB7CisgICAgICAgaWYgKG9ianNbPGldICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2Jqc1s8aV0pKSB7CisgICAgICAgICByZXMgPSBvYmpzWzxpXTsKKyAgICAgICAgIG9ianNbPGldID0gb2Jqc1swXTsKKyAgICAgICAgIG9ianNbMF0gPSByZXM7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSAob2JqZWN0cChyZXMpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgPyByZXMgOiAwOworICAgIH0KKyAgICAvLyBlbHNlOiBpbiByZXMgc3RlaHQgZGVyIFNwaWVsZXIgc2Nob24uCisgIH0KKyAgZWxzZSBpZiAob2JqZWN0cChyZXMpKSAvLyByIGlzdCBuZW4gRWluemVsb2JqZWt0CisgICAgcmVzID0gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpID8gcmVzIDogMDsKKworICAvLyByZXMgaXN0IGpldHp0IGdnZi4gZGVyIFNwaWVsZXIuIEFiZXIgd2VubiBkZXIgbmUgYW5kZXJlIGFscyBkaWUgZ2VzdWNodGUKKyAgLy8gVVVJRCBoYXQsIGlzdCBkYXMgRXJnZWJuaXMgdHJvdHpkZW0gMC4KKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChyZXMpIT11dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgLy8gZW5kbGljaCBnZWZ1bmRlbgorICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIGludCBjaGVja19tYXRjaCggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSApCit7CisgICAgbWl4ZWQgbWF0Y2g7CisKKyAgICBpZiAoICEobWF0Y2ggPSBuYW1lX2xpdmluZ19tW3N0cl0pICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKG1hdGNoKSApCisgICAgICAgbWF0Y2ggPSAoeyBtYXRjaCB9KTsKKworICAgIG1hdGNoIC09ICh7MH0pOworCisgICAgaWYgKCBzaXplb2YobWF0Y2gpICl7CisgICAgICAgaWYgKCBwbGF5ZXJzX29ubHkgKQorICAgICAgICAgICByZXR1cm4gc2l6ZW9mKGZpbHRlciggbWF0Y2gsICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZS8qJyovICkpCisgICAgICAgICAgICAgID4gMDsKKyAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1fZGVsZXRlKCBuYW1lX2xpdmluZ19tLCBzdHIgKTsKKyAgICBjbGVhbl9sb2coIHNwcmludGYoImNoZWNrX21hdGNoIGxvZXNjaHQgJXNcbiIsIHN0cikgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy9UT0RPOjogc3RyaW5nfHN0cmluZyogZXhjbHVkZQordmFyYXJncyBtaXhlZCBtYXRjaF9saXZpbmcoIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHksIG1peGVkIGV4Y2x1ZGUgKQoreworICAgIGludCBpLCBzOworICAgIG1peGVkIG1hdGNoLCAqdXNlcjsKKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAoZXhjbHVkZSkgKQorICAgICAgIGV4Y2x1ZGUgPSAoeyBleGNsdWRlIH0pOworCisgICAgaWYgKCBtZW1iZXIoZXhjbHVkZSwgc3RyKSA8IDAgJiYgY2hlY2tfbWF0Y2goc3RyLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICByZXR1cm4gc3RyOworCisgICAgdXNlciA9IG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKTsKKyAgICBzID0gc2l6ZW9mKHN0cik7CisgICAgbWF0Y2ggPSAwOworCisgICAgZm9yICggaSA9IHNpemVvZih1c2VyKTsgaS0tOyApCisgICAgICAgaWYgKCBzdHIgPT0gdXNlcltpXVswLi5zLTFdICYmIG1lbWJlciggZXhjbHVkZSwgdXNlcltpXSApIDwgMCApCisgICAgICAgICAgIGlmICggbWF0Y2ggKQorICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKCBjaGVja19tYXRjaCh1c2VyW2ldLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICAgICAgICAgICAgIG1hdGNoID0gdXNlcltpXTsKKworICAgIGlmICggIW1hdGNoICkKKyAgICAgICByZXR1cm4gLTI7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKK21peGVkICpkdW1wX2xpdmluZ3MoKQoreworICByZXR1cm4gc29ydF9hcnJheShtX2luZGljZXMobmFtZV9saXZpbmdfbSksIyc+KTsKK30KKworLy8gKiByZWdlbG1hZXNzaWcgTGlzdGVuIHZvbiBCYWxsYXN0IGJlZnJlaWVuCitwcml2YXRlIHZvaWQgY2xlYW5fbmFtZV9saXZpbmdfbShzdHJpbmcgKmtleXMsIGludCBsZWZ0LCBpbnQgbnVtKQoreworICBpbnQgaSwgajsKKyAgbWl4ZWQgYTsKKworICB3aGlsZSAobGVmdCAmJiBudW0tLSkKKyAgeworICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtrZXlzWy0tbGVmdF1dKSAmJiBtZW1iZXIoYSwgMCk+PTApCisgICAgeworICAgICAgYS09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW2tleXNbbGVmdF1dID0gYTsKKyAgICB9CisgICAgaWYgKCFhIHx8IChwb2ludGVycChhKSAmJiAhc2l6ZW9mKGEpKSkKKyAgICB7CisgICAgICBjbGVhbl9sb2coIlRvYXN0aW5nICIra2V5c1tsZWZ0XSsiXG4iKTsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIGtleXNbbGVmdF0pOworICAgIH0gZWxzZSBjbGVhbl9sb2coc3ByaW50ZigiS0VFUElORyAlcyAoJU8pXG4iLGtleXNbbGVmdF0scG9pbnRlcnAoYSk/c2l6ZW9mKGEpOmEpKTsKKyAgfQorICBpZiAobGVmdCkKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sIDEsIGtleXMsIGxlZnQsIDgwKTsKKyAgZWxzZQorICAgIGNsZWFuX2xvZygiQ2xlYW4gcHJvY2VzcyBmaW5pc2hlZFxuIik7Cit9CisKK3ByaXZhdGUgdm9pZCBjbGVhbl9uZXRkZWFkKCkgeworICBpbnQgaTsKKyAgc3RyaW5nICpzOworICBvYmplY3Qgb2I7CisKKyAgcz1tX2luZGljZXMobmV0ZGVhZCk7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkKKyAgICBpZiAoIW9iamVjdHAob2I9bmV0ZGVhZFtzW2ldXSkgfHwgaW50ZXJhY3RpdmUob2IpKQorICAgICAgbV9kZWxldGUobmV0ZGVhZCxzW2ldKTsKK30KKworcHJpdmF0ZSB2b2lkIENsZWFuTGl2aW5nRGF0YSgpIHsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tKSA8IDApIHsKKyAgICBjbGVhbl9sb2coIlN0YXJ0aW5nIGNsZWFuIHByb2Nlc3NcbiIpOworICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwKKyAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIDgwCisgICAgICAgICAgICAgICAgICk7CisgIH0KKyAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uZXRkZWFkLDIpOworfQorCisjdW5kZWYgY2xlYW5fbG9nCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL29iamVjdF9pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9vYmplY3RfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2MwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9vYmplY3RfaW5mby5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gb2JqZWN0X2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGRyaXZlcl9pbmZvKSAvKiBOZXdlciB2ZXJzaW9uIGlzIHRoZXJlICovCisKKyNpbmNsdWRlIDxvYmplY3RpbmZvLmg+CisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworbWl4ZWQgb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgdmFyYXJncyBpbnQqIGluZGV4KQoreworICAgIG1peGVkICogcmVzdWx0OworCisgICAgaWYgKHNpemVvZihpbmRleCkgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIG9iamVjdF9pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIG9iamVjdF9pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBPSU5GT19CQVNJQzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lCX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSEVBUlRfQkVBVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9JU19XSVpBUkRdICAgICAgICAgPSAwOyAgIC8qIE5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfRU5BQkxFX0NPTU1BTkRTXSAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9DTE9ORV0gICAgICAgICAgICAgPSBlZnVuOjpjbG9uZXAob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ERVNUUlVDVEVEXSAgICAgICAgPSAwOyAgIC8qIE5vdCBwb3NzaWJsZSBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQUEVEXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX09OQ0VfSU5URVJBQ1RJVkVdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVTRVRfU1RBVEVdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfV0lMTF9DTEVBTl9VUF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApOworICAgICAgICAgICAgcmVzdWx0W09JQl9MQU1CREFfUkVGRVJFTkNFRF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFNQkRBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TSEFET1ddICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpICYmIDE7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFUExBQ0VEXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfUkVTRVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USU1FX09GX1JFRl0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFRl0gICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0dJR0FUSUNLU10gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USUNLU10gICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQX05VTV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUk9HX1NXQVBQRURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVkFSX1NXQVBQRURdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1ZBUl9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkFNRV0gICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9MT0FEX05BTUVdICAgICAgICAgPSBlZnVuOjpsb2FkX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUkVWX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0NMRUFOVVBdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9DTEVBTlVQX1RJTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX1BPU0lUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSVBfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JUF9ORVhUXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BSRVZdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUE9TXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BPUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSU1fTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JTV9SRUZdICAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05BTUVdICAgICAgICAgICAgICAgPSBlZnVuOjpwcm9ncmFtX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JTV9QUk9HX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9GVU5DVElPTlNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfRlVOQ1RJT05TXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fVkFSSUFCTEVTXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1ZBUklBQkxFU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1NUUklOR1NdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX0RBVEFdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5IRVJJVEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0lOSEVSSVRFRF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfU0laRV0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9EQVRBX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX0RBVEFfU0laRV0gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fSU5IRVJJVF0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19JTkhFUklUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fQ0xPTkVdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19DTE9ORSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX1NIQURPV10gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fU0hBRE9XKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOQ0xVREVTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5DTFVERUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSEFSRV9WQVJJQUJMRVNdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQVJFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplb2YoaW5kZXgpKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGluZGV4WzBdOworICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBvYmplY3RfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfZWRpdGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfZWRpdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2VkaXRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfZWRpdGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50fG9iamVjdCBxdWVyeV9lZGl0aW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9FRElUSU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pZGxlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lkbGUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaWRsZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pZGxlKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnQgcXVlcnlfaWRsZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lETEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjMzExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pbnB1dF9wZW5kaW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lucHV0X3BlbmRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JTlBVVF9QRU5ESU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pcF9uYW1lLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNmUwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIHF1ZXJ5X2lwX25hbWUoKSBhbmQKKyAqIHF1ZXJ5X2lwX251bWJlcigpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pcF9uYW1lKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9uYW1lKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05BTUUpOworfQorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9udW1iZXIob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTlVNQkVSKTsKK30KKworLy8gKiBIZXJrdW5mdHMtRXJtaXR0bHVuZworc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpCit7CisgIG9iPSBvYiB8fCB0aGlzX3BsYXllcigpOworICBpZiAoIW9iamVjdHAob2IpIHx8ICFpbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOworICBpZihvYi0+cXVlcnlfcmVhbGlwKCkgJiYgKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCkhPSIiKQorICB7CisgICAgcmV0dXJuIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpOworICB9CisgIHJldHVybiBfcXVlcnlfaXBfbnVtYmVyKG9iKTsKK30KKworc3RyaW5nIHF1ZXJ5X2lwX25hbWUobWl4ZWQgb2IpCit7CisgIGlmICggIW9iIHx8IG9iamVjdHAob2IpICkKKyAgICAgIG9iPXF1ZXJ5X2lwX251bWJlcihvYik7CisgIHJldHVybiAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5ob3N0KG9iKTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZjM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9saW1pdHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbGltaXRzKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKwordmFyYXJncyBpbnQqIHF1ZXJ5X2xpbWl0cyhpbnQgZGVmKQoreworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhkZWYgPyBEQ19ERUZBVUxUX1JVTlRJTUVfTElNSVRTIDogRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM2ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKQEAgLTAsMCArMSwxNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9sb2FkX2F2ZXJhZ2UpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitzdHJpbmcgcXVlcnlfbG9hZF9hdmVyYWdlKCkKK3sKKyAgICByZXR1cm4gZWZ1bjo6c3ByaW50ZigiJS4yZiBjbWRzL3MsICUuMmYgY29tcCBsaW5lcy9zIiwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0NPTU1BTkRTKSwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0xJTkVTKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbXVkX3BvcnQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X211ZF9wb3J0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X211ZF9wb3J0KQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK2ludCBxdWVyeV9tdWRfcG9ydCh2YXJhcmdzIGludCp8b2JqZWN0KiBhcmdzKQoreworICAgIGlmKCFzaXplb2YoYXJncykgJiYgZWZ1bjo6dGhpc19wbGF5ZXIoKSAmJiBlZnVuOjppbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8odGhpc19wbGF5ZXIoKSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBxdWVyeV9tdWRfcG9ydFxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgZWZ1bjo6b2JqZWN0cChhcmdzWzBdKSAmJiBlZnVuOjppbnRlcmFjdGl2ZShhcmdzWzBdKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8oYXJnc1swXSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGludHAoYXJnc1swXSkpCisgICAgeworICAgICAgICBpbnQqIHBvcnRzID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKTsKKyAgICAgICAgaWYoYXJnc1swXSA8IC0xIHx8IGFyZ3NbMF0gPj0gc2l6ZW9mKHBvcnRzKSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKGVmdW46OnNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9tdWRfcG9ydCgpOiB2YWx1ZSAlZCBvdXQgb2YgcmFuZ2UuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgIGVsc2UgaWYoYXJnc1swXSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YocG9ydHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcG9ydHNbYXJnc1swXV07CisgICAgfQorCisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUylbMF07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzgyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK2ludCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X3Nub29wLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9zbm9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTY5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9zbm9vcC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zbm9vcCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIG9iamVjdCBfcXVlcnlfc25vb3Aob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgb2JqZWN0IHByZXYgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBlZnVuOjpzZXRfdGhpc19vYmplY3QocHJldik7CisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3Nub29wKQorICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9TTk9PUF9ORVhUKTsKKyNlbHNlCisgICAgcmV0dXJuIGVmdW46OnF1ZXJ5X3Nub29wKG9iKTsKKyNlbmRpZgorfQorCitub21hc2sgb2JqZWN0IHF1ZXJ5X3Nub29wKG9iamVjdCB3aG8pIHsKKyAgb2JqZWN0IHNub29wZXI7CisKKyAgc25vb3Blcj1fcXVlcnlfc25vb3Aod2hvKTsKKyAgaWYgKCFzbm9vcGVyKSByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X3dpel9ncnAoc25vb3Blcik+cXVlcnlfd2l6X2dycChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAmJgorICAgICAgSVNfQVJDSChzbm9vcGVyKSkgcmV0dXJuIDA7CisgIHJldHVybiBzbm9vcGVyOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OTVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKQEAgLTAsMCArMSwyNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9oZWFydF9iZWF0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9oZWFydF9iZWF0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCitpbnQgc2V0X2hlYXJ0X2JlYXQoaW50IGZsYWcpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgaW50IGhiID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworCisgICAgaWYgKCFmbGFnID09ICFoYikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaXNfd2l6YXJkLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxY2NkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9pc193aXphcmQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogVGhlc2UgYXJlIHRoZSBzcGVjaWFsIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlciB0aGF0IGFyZSBhY3RpdmF0ZWQgd2l0aAorICogc2V0X2lzX3dpemFyZCgpLiBUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgcGxheWVyIG9iamVjdC4KKyAqIEFsc28gc2V0X2lzX3dpemFyZCgpIG11c3QgYmUgY2FsbGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHBsYXllciBvYmplY3QsCisgKiBub3QgYXMgYW4gKHNpbXVsLSllZnVuLgorICovCisKKyNpbmNsdWRlIDxjb21tYW5kcy5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKKy8qIGlzX3dpemFyZDoKKyAqICAxOiBoYXMgYWN0aW9ucywKKyAqICAwOiBuZXZlciBoYWQgYWN0aW9ucywKKyAqIC0xOiBoYWQgYWN0aW9ucyBvbmNlLgorICovCitwcml2YXRlIG5vc2F2ZSBpbnQgaXNfd2l6YXJkOworCitwcml2YXRlIGludCBkcml2ZXJfbWFsbG9jKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoIXNpemVvZihzdHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKHN0ciA9PSAiZXh0c3RhdHMiKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBkcml2ZXJfZHVtcGFsbG9iaihzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdyaXRlKCJEdW1waW5nIHRvIC9PQkpfRFVNUCAuLi4gIik7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUUyk7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICB3cml0ZSgiZG9uZVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9vcGNkdW1wKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT1BDT0RFUyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9zdGF0dXMoc3RyaW5nIHN0cikKK3sKKyAgICBpbnQgb3B0OworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaChzdHIgfHwgIiIpCisgICAgeworICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgY2FzZSAiIHRhYmxlcyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgY2FzZSAiIHN3YXAiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRfaXNfd2l6YXJkKHZhcmFyZ3MgPG9iamVjdHxpbnQ+KiBhcmdzKQoreworICAgIGludCBvbGR2YWwgPSBpc193aXphcmQ7CisKKyAgICBpZighc2l6ZW9mKGFyZ3MpKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIGZldyBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZighb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMSB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKGFyZ3NbMF0gIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIk9ubHkgc2V0X2lzX3dpemFyZCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IHN1cHBvcnRlZFxuIik7CisgICAgaWYodGhpc19wbGF5ZXIoKSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiVGhlIGN1cnJlbnQgb2JqZWN0IG11c3QgYmUgdGhpc19wbGF5ZXIoKSBmb3Igc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMiB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWFyZ3NbMV0pCisgICAgeworICAgICAgICBpZihpc193aXphcmQgPiAwKQorICAgICAgICAgICAgaXNfd2l6YXJkID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgYXJnc1sxXTwwKQorICAgIHsKKyAgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCFpc193aXphcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfbWFsbG9jLCAibWFsbG9jIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX2R1bXBhbGxvYmosICJkdW1wYWxsb2JqIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX29wY2R1bXAsICJvcGNkdW1wIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX3N0YXR1cywgInN0YXR1cyIsIEFBX05PU1BBQ0UpOworICAgICAgICB9CisgICAgICAgIGlzX3dpemFyZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIG9sZHZhbCA+IDA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfcHJvbXB0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfcHJvbXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OTY5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9wcm9tcHQuYwpAQCAtMCwwICsxLDIxIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X3Byb21wdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfcHJvbXB0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCit2YXJhcmdzIHN0cmluZ3xjbG9zdXJlIHNldF9wcm9tcHQoc3RyaW5nfGNsb3N1cmV8aW50IHByb21wdCwgb2JqZWN0IG9iKQoreworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgbWl4ZWQgb2xkcHJvbXB0ID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUNfUFJPTVBUKTsKKworICAgIGlmKCFpbnRwKHByb21wdCkpCisgICAgICAgIGVmdW46OmNvbmZpZ3VyZV9pbnRlcmFjdGl2ZShvYiwgSUNfUFJPTVBULCBwcm9tcHQpOworCisgICAgcmV0dXJuIG9sZHByb21wdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaGFkb3cuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDhjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaGFkb3cuYwpAQCAtMCwwICsxLDU1IEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc2hhZG93aW5nKCkKKyAqIGFuZCB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBzaGFkb3coKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc2hhZG93aW5nKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X3NoYWRvd2luZyhvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVik7Cit9CisKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgICBpZihmbGFnKQorICAgIHsKKyAgICAgICAgb2JqZWN0IHNoYWRvd2VyID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDEpOworICAgICAgICBlZnVuOjpzZXRfdGhpc19vYmplY3Qoc2hhZG93ZXIpOworCisgICAgICAgIGlmIChlZnVuOjpzaGFkb3cob2IpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKHNoYWRvd2VyLCBPSV9TSEFET1dfUFJFVik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX05FWFQpOworfQorI2Vsc2UKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIHJldHVybiBlZnVuOjpzaGFkb3cob2IsIGZsYWcpOworfQorI2VuZGlmCisKKworcHVibGljIG9iamVjdCBzaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgb2JqZWN0IHJlcyA9IGZ1bmNhbGwoIydfc2hhZG93LG9iLCBmbGFnKTsKKyAgaWYgKGZsYWcpCisgICAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+UmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIHZvaWQgX3Vuc2hhZG93KCkgeworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgZWZ1bjo6dW5zaGFkb3coKTsKK30KKworcHVibGljIHZvaWQgdW5zaGFkb3coKSB7CisgIGZ1bmNhbGwoIydfdW5zaGFkb3cpOworICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5VbnJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUwYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jCkBAIC0wLDAgKzEsMjAxNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNpbXVsX2VmdW4uYyAtLSBzaW11bCBlZnVuJ3MKKy8vCisvLyAkSWQ6IHNpbXVsX2VmdW4uYyA3NDA4IDIwMTAtMDItMDYgMDA6Mjc6MjVaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CisjcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrLHdhcm5fZGVwcmVjYXRlZAorI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLHdhcm5fbWlzc2luZ19yZXR1cm4sd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gQWJzb2x1dGUgUGZhZGUgZXJmb3JkZXJsaWNoIC0genVtIFplaXRwdW5rdCwgd28gZGVyIE1hc3RlciBnZWxhZGVuCisvLyB3aXJkLCBzaW5kIG5vY2gga2VpbmUgSW5jbHVkZS1QZmFkZSBkYSAuLi4KKworI2RlZmluZSBTTk9PUExPR0ZJTEUgIlNOT09QIgorI2RlZmluZSBBU05PT1BMT0dGSUxFICJBUkNIL1NOT09QIgorCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKKyNpbmNsdWRlICIvc3lzL2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCisjaW5jbHVkZSAiL3N5cy9lcnEuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKKyNpbmNsdWRlICIvc3lzL3BsYXllci9iYXNlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCisjaW5jbHVkZSAiL3N5cy9kZWZpbmVzLmgiCisjaW5jbHVkZSAiL3N5cy90ZWxuZXQuaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3N5cy9zdHJpbmdzLmgiCisjaW5jbHVkZSAiL3N5cy90aW1lLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvbm90aWZ5X2ZhaWwuaCIKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorI2luY2x1ZGUgIi9zeXMvaW5wdXRfdG8uaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhayk7CitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcik7Citub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pOworaW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KTsKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCk7Citub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCk7CitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpOwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2Fwcyk7CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQordmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQordmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKTsKKyNlbmRpZgorCisvLyBJbmNsdWRlIHRoZSBkaWZmZXJlbnQgc3ViICdtb2R1bGVzJyBvZiB0aGUgc2ltdWxfZWZ1bgorI2luY2x1ZGUgX19ESVJfXyJkZWJ1Z19pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgorI2luY2x1ZGUgX19ESVJfXyJoYXNoLmMiCisjaW5jbHVkZSBfX0RJUl9fIm9iamVjdF9pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaWRsZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pbnB1dF9wZW5kaW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbGltaXRzLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xvYWRfYXZlcmFnZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X3Nub29wLmMiCisjaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCisjaWYgX19CT09UX1RJTUVfXyA8IDE0NTYyNjE4NTkKKyNpbmNsdWRlIF9fRElSX18ic2V0X3Byb21wdC5jIgorI2VuZGlmCisjaW5jbHVkZSBfX0RJUl9fInNoYWRvdy5jIgorI2luY2x1ZGUgX19ESVJfXyJsaXZpbmdzLmMiCisjaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKKworI2RlZmluZSBUTyAgICAgICAgZWZ1bjo6dGhpc19vYmplY3QoKQorI2RlZmluZSBUSSAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCisjZGVmaW5lIFRQICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCisjZGVmaW5lIFBPICAgICAgICBlZnVuOjpwcmV2aW91c19vYmplY3QoMCkKKyNkZWZpbmUgTEVWRUwoeCkgcXVlcnlfd2l6X2xldmVsKHgpCisjZGVmaW5lIE5BTUUoeCkgIGNhcGl0YWxpemUoZ2V0dWlkKHgpKQorCisjZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCisgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKKworbWl4ZWQgZHRpbWVfY2FjaGUgPSAoey0xLCIifSk7CisKKyNpZmRlZiBJT1NUQVRTCitzdHJ1Y3QgaW9zdGF0X3MgeworICBzdHJpbmcgb25hbWU7CisgIGludCB0aW1lOworICBpbnQgc2l6ZTsKK307CittaXhlZCBzYXZlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsIDApIH0pOworbWl4ZWQgcmVzdG9yZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLDApIH0pOworLy9taXhlZCB3cml0ZWZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIHJlYWRmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCBsb2dfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisKK21peGVkIF9fX2lvc3RhdHMoaW50IHR5cGUpIHsKKyAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gc2F2ZW9fc3RhdDsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcmVzdG9yZW9fc3RhdDsKKy8qICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiB3cml0ZWZpbGVfc3RhdDsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gcmVhZGZpbGVfc3RhdDsKKyAgICBjYXNlIDU6CisgICAgICByZXR1cm4gbG9nX3N0YXQ7CisgICAgICAqLworICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRpZSBzaW11bF9lZnVuIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgc2ltdWxfZWZ1biBPYmpla3QgbmljaHQgemVyc3RvZXJlbiFcbiI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitwdWJsaWMgbm9tYXNrIHZvaWQgcmVtb3ZlX2ludGVyYWN0aXZlKCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2JqZWN0cChvYikgJiYgcHJldmlvdXNfb2JqZWN0KCkKKyAgICAgICAgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIKKyAgICAgICAgJiYgKChwcmV2aW91c19vYmplY3QoKSAhPSBvYgorICAgICAgICAgICAgICYmIChvYiAhPSB0aGlzX3BsYXllcigpIHx8IG9iICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgICAgICB8fCAocHJldmlvdXNfb2JqZWN0KCkgPT0gb2IKKyAgICAgICAgICAgICAgICYmICh0aGlzX3BsYXllcigpICYmIHRoaXNfcGxheWVyKCkgIT0gb2IKKyAgICAgICAgICAgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICE9IG9iKSkgKSApCisKKyAgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAorICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJU8gYXVzZ2Vsb2dndCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIG9iLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CisKKyAgICBlZnVuOjpyZW1vdmVfaW50ZXJhY3RpdmUob2IpOworfQorCisKK3ZvaWQgX19fdXBkbWFzdGVyKCkKK3sKKyAgICBvYmplY3Qgb2I7CisKKyAgICAvL3NvbGx0ZSBuaWNodCBqZWRlciBkdWVyZmVuLgorICAgIGlmIChwcm9jZXNzX2NhbGwoKSB8fCAhQVJDSF9TRUNVUklUWSkKKyAgICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHVzZSBvZiBfX191cGRtYXN0ZXIoKSEiKTsKKworICAgIHdyaXRlKCJSZW1vdmluZyBvbGQgbWFzdGVyIC4uLiAiKTsKKyAgICBmb3JlYWNoKHN0cmluZyBmaWxlOiAKKyAgICAgICAgZ2V0X2RpcigiL3NlY3VyZS9tYXN0ZXIvKi5jIixHRVRESVJfTkFNRVN8R0VURElSX1VOU09SVEVEfEdFVERJUl9QQVRIKSkgeworICAgICAgaWYgKG9iID0gZmluZF9vYmplY3QoZmlsZSkpCisgICAgICAgZWZ1bjo6ZGVzdHJ1Y3Qob2IpOworICAgIH0KKyAgICBlZnVuOjpkZXN0cnVjdChlZnVuOjpmaW5kX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKSk7CisgICAgd3JpdGUoImRvbmUuXG5Mb2FkaW5nIGFnYWluIC4uLiAiKTsKKyAgICBsb2FkX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKTsKKworICAgIHdyaXRlKCJkb25lLlxuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pIHsKKyAgbWl4ZWQgcmV0OworCisgIGlmKHJldCA9IChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmNvdW50cnkobnVtIHx8IGlwKSkgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSByZXR1cm4gIj8/PyI7Cit9CisKKworLy8gKiBTbm9vcGVuIHVuZCB3YXMgZGF6dWdlaG9lcnQKK3N0YXRpYyBvYmplY3QgZmluZF9zbm9vcGVkKG9iamVjdCB3aG8pCit7CisgIG9iamVjdCAqdTsKKyAgaW50IGk7CisKKyAgZm9yIChpPXNpemVvZih1PXVzZXJzKCkpLTE7aT49MDtpLS0pCisgICAgaWYgKHdobz09ZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh1W2ldLCBJSV9TTk9PUF9ORVhUKSkKKyAgICAgIHJldHVybiB1W2ldOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBzdHJpbmcgTGN1dChzdHJpbmcgc3RyKSB7CisgIHJldHVybiBzdHJbNS4uMTFdK3N0clsxOC4uXTsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKCBvYmplY3QgbWUsIG9iamVjdCB5b3UgKQoreworICAgIGludCByZXQ7CisgICAgb2JqZWN0IHNub29wZXIwLCBzbm9vcGVyLCBzbm9vcGVyMiwgc25vb3BlcjM7CisKKyAgICBpZiggIW9iamVjdHAobWUpIHx8IG1lID09IHlvdSB8fCAhUE8gKQorICAgICAgIHJldHVybiAwOworCisgICAgc25vb3BlcjAgPSBmaW5kX3Nub29wZWQobWUpOworCisgICAgIGlmKHlvdSl7CisgICAgICAgIGlmICggUE8gIT0gbWUgJiYgcXVlcnlfd2l6X2dycChtZSkgPj0gcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhKHlvdS0+UXVlcnlBbGxvd1Nub29wKG1lKSkgKQorICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSB8fCBJU19BUkNIKHlvdSkgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCAoc25vb3BlciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSkgJiYKKyAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKHNub29wZXIpID49IHF1ZXJ5X3dpel9ncnAobWUpICl7CisgICAgICAgICAgICBpZiAoIChpbnQpc25vb3Blci0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiJXMgc25vb3BlZCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZS0+bmFtZShXRVIpLCB5b3UtPm5hbWUoV0VSKSApICk7CisKKyAgICAgICAgICAgIHNub29wZXIyID0gbWU7CisKKyAgICAgICAgICAgIHdoaWxlICggc25vb3BlcjMgPSBpbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSApeworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgd2lyZCBzZWluZXJzZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc25vb3BlcjItPm5hbWUoV0VSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjMtPm5hbWUoV0VNKSApICk7CisgICAgICAgICAgICAgICBzbm9vcGVyMiA9IHNub29wZXIzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlZnVuOjpzbm9vcCggc25vb3Blciwgc25vb3BlcjIgKTsKKworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSAhPSBzbm9vcGVyICkKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUga2FubnN0ICVzIG5pY2h0IHNub29wZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBzbm9vcHN0IGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKHNub29wZXIpICl7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZigiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIC0+ICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTAwMDAwICk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHNub29wZXIpCisgICAgICAgICAgICAgICBpZiAoICFtZS0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKXsKKyAgICAgICAgICAgICAgICAgICBwcmludGYoICIlcyB3aXJkIGJlcmVpdHMgdm9uICVzIGdlc25vb3BlZC4gQmVudXR6ZSBkYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJmXCItRmxhZywgd2VubiBkdSBkZW5ub2NoIHNub29wZW4gd2lsbHN0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LT5uYW1lKFdFUiksIHNub29wZXItPm5hbWUoV0VNKSApOworICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgfQorCisgICAgICAgIHJldCA9IGVmdW46OnNub29wKCBtZSwgeW91ICk7CisKKyAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSAmJiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUpeworICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLCBzcHJpbnRmKCAiJXMgLT4gJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHlvdSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoeW91KSApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmV0ICYmIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICFJU19ERVBVVFkobWUpICkKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB5b3UsICIqKiogIiArIE5BTUUobWUpICsgIiBzbm9vcHQgRGljaCFcbiIgKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgICB9CisgICAgIGVsc2UgeworICAgICAgICBpZiAoIChtZSA9PSBQTyB8fAorICAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA+IHF1ZXJ5X3dpel9ncnAobWUpIHx8CisgICAgICAgICAgICAgIChxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA9PSBxdWVyeV93aXpfZ3JwKG1lKSAmJgorICAgICAgICAgICAgICBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKFBPLCBJSV9TTk9PUF9ORVhUKSA9PSBtZSkpICYmIHNub29wZXIwICl7CisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpzbm9vcChtZSk7CisgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gMDsKK30KKworCisKKy8vICogRW11bGF0aW9uIGRlcyAnYWx0ZW4nIGV4cGxvZGUgZHVyY2ggZGFzIG5ldWUKK3N0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkgeworICBpbnQgcywgdDsKKyAgc3RyaW5nICpzdHJzOworCisgIGlmICghc3RyaW5ncChzdHIpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDEgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLHN0cikpOworICB9CisgIGlmICghc3RyaW5ncChkZWwpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDIgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLGRlbCkpOworICB9CisgIGlmKGRlbCA9PSAiIikKKyAgICByZXR1cm4gKHtzdHJ9KTsKKyAgc3Rycz1lZnVuOjpleHBsb2RlKHN0ciwgZGVsKTsKKyAgdD1zaXplb2Yoc3RycyktMTsKKyAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpO3MtLTsKKyAgd2hpbGUodD49MCAmJiBzdHJzW3QtLV0gPT0gIiIpO3QrKzsKKyAgaWYoczw9dCkKKyAgICByZXR1cm4gc3Ryc1tzLi50XTsKKyAgcmV0dXJuICh7fSk7Cit9CisKK2ludCBmaWxlX3RpbWUoc3RyaW5nIHBhdGgpIHsKKyAgbWl4ZWQgKnY7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKHNpemVvZih2PWdldF9kaXIocGF0aCxHRVRESVJfREFURVMpKSkgcmV0dXJuIHZbMF07CisgIHJldHVybigwKTsgLy9zb25zdAorfQorCisvLyAqIEJlaSA1MGsgR3JvZXNzZSBMb2ctRmlsZSByb3RpZXJlbgordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKSB7CisgIG1peGVkICpzdDsKKworICBmaWxlPSIvbG9nLyIrZmlsZTsKKyAgZmlsZT1pbXBsb2RlKChlZnVuOjpleHBsb2RlKGZpbGUsIi8iKS0oeyIuLiJ9KSksIi8iKTsKKy8vICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiam9mIiksc3ByaW50ZigiTE9HIEZJTEU6ICVPIC0+ICVPXG4iLHByZXZpb3VzX29iamVjdCgpLGZpbGUpKTsKKyAgaWYgKCFmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y2FsbF9vdGhlcixQTyksInNlY3VyZS9tYXN0ZXIiLC8vJykKKyAgICAgICAgICAgICAgInZhbGlkX3dyaXRlIixmaWxlLGdldGV1aWQoUE8pLCJsb2dfZmlsZSIsUE8pKQorICAgICAgcmV0dXJuIDA7CisgIGlmICggc2l6ZV90b19icmVhayA+PSAwICYgKAorICAgICAgc2l6ZW9mKHN0ID0gZ2V0X2RpcihmaWxlLDIpICkgJiYgc3RbMF0gPj0gKHNpemVfdG9fYnJlYWt8TUFYX0xPR19TSVpFKSkpCisgICAgICBjYXRjaChyZW5hbWUoZmlsZSwgZmlsZSArICIub2xkIik7cHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KKyAgcmV0dXJuKHdyaXRlX2ZpbGUoZmlsZSx0eHQpKTsKK30KKworLy8gKiBNYWdpZXItTGV2ZWwgYWJmcmFnZW4KK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSB7CisgIHJldHVybiAoaW50KSIvc2VjdXJlL21hc3RlciItPnF1ZXJ5X3dpel9sZXZlbChwbGF5ZXIpOworfQorCisjaWZkZWYgX19BTElTVFNfXworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkga2V5KQorbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgaSxqOworCisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgIHsKKyAgICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0KSk8MCkKKyAgICAgIHJldHVybiBhbGlzdDsKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIH0KKyAgaSA9IGFzc29jKGtleSxhbGlzdFswXSk7CisgIGlmICgoaT1hc3NvYyhrZXksYWxpc3RbMF0pKTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsKKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OworfQorCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBwb3MpCittaXhlZCAqZXhjbHVkZV9hbGlzdChpbnQgaSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBqOworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSB8fCBpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIGFsaXN0PWFsaXN0WzAuLl07IC8qIENyZWF0ZSBQSFlTSUNBTCBjb3B5IG9mIGFsaXN0ICovCisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsgLyogb3JkZXJfYWxpc3QgaXMgTk9UIG5lY2Vzc2FyeSAtIHNlZSAvZG9jL0xQQy9hbGlzdCAqLworfQorI2VuZGlmIC8vIF9fQUxJU1RTX18KKworLy8gKiBHZXJtYW4gdmVyc2lvbiBvZiBjdGltZSgpCisjZGVmaW5lIFRBR0UgKHsiU29uIiwiTW9uIiwiRGllIiwiTWl0IiwiRG9uIiwiRnJlIiwiU2FtIn0pCisjZGVmaW5lIE1PTkFURSAoeyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLFwKKyAgICAgICAgICAgICAgICAgIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJ9KQorc3RyaW5nIGR0aW1lKGludCB3YW5uKSB7CisgIAorICBpZiAod2FubiA9PSBkdGltZV9jYWNoZVswXSkKKyAgICByZXR1cm4oZHRpbWVfY2FjaGVbMV0pOworCisgIGludCAqbHQgPSBsb2NhbHRpbWUod2Fubik7CisgIHJldHVybiBzcHJpbnRmKCIlcywgJTJkLiAlcyAlZCwgJTAyZDolMDJkOiUwMmQiLAorICAgICAgVEFHRVtsdFtUTV9XREFZXV0sIGx0W1RNX01EQVldLCBNT05BVEVbbHRbVE1fTU9OXV0sIAorICAgICAgbHRbVE1fWUVBUl0sbHRbVE1fSE9VUl0sIGx0W1RNX01JTl0sIGx0W1RNX1NFQ10pOworfQorCisvLyB3ZW5uIHN0cmZ0aW1lIGltIERyaXZlciBuaWNodCBleGlzdGllcnQsIGlzdCBkaWVzIGhpZXIgZWluIEFsaWFzIGF1ZiBkdGltZSgpLAorLy8gendhciBzdGltbXQgZGFzIEZvcm1hdCBkYW5uIG5pY2h0LCBhYmVyIGRpZSBNdWRsaWIgYnVnZ3QgbmljaHQgdW5kIHNjaHJlaWJ0CisvLyBlaW4gb3JkZW50bGljaGVzIERhdHVtL1VocnplaXQuCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCit2YXJhcmdzIHN0cmluZyBzdHJmdGltZShtaXhlZCBmbXQsIGludCBjbG9jaywgaW50IGxvY2FsaXplZCkgeworICBpZiAoaW50cChjbG9jaykgJiYgY2xvY2sgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoY2xvY2spOworICBlbHNlIGlmIChpbnRwKGZtdCkgJiYgZm10ID49IDApCisgICAgcmV0dXJuIGR0aW1lKGZtdCk7CisgIAorICByZXR1cm4gZHRpbWUodGltZSgpKTsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQorCisvLyAqIFNodXRkb3duIG1pdCB6dXNhZXR6bGljaGVtIGxvZ2dpbmcKK25vbWFzayBpbnQgc2h1dGRvd24oc3RyaW5nIHJlYXNvbikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIHN0cmluZyBvYm5hbWU7CisgIHN0cmluZyBvdXRwdXQ7CisKKyAgaWYgKCFyZWFzb24pCisgICAgcmV0dXJuIDA7CisgIGlmICggIUFSQ0hfU0VDVVJJVFkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSE9Uk9PVElEICYmCisgICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL29iai9zaHV0IiApCisgIHsKKyAgICB3cml0ZSgiWW91IGhhdmUgbm8gcGVybWlzc2lvbiB0byBzaHV0IGRvd24gdGhlIGdhbWVkcml2ZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKHRoaXNfaW50ZXJhY3RpdmUoKSkmJihuYW1lPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSkKKyAgeworICAgIG5hbWU9Y2FwaXRhbGl6ZShuYW1lKTsKKyAgICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LC8vJworICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIhXG4iKTsKKyAgfQorICBlbHNlCisgICAgbmFtZT0iQU5PTllNT1VTIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpKSBvYm5hbWU9Y2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgb3V0cHV0PW5hbWU7CisgIGlmIChvYm5hbWUgJiYgbmFtZSE9b2JuYW1lKSBvdXRwdXQ9b3V0cHV0KyIgKCIrb2JuYW1lKyIpIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpJiZvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PSIvb2JqL3NodXQiKXsKKyAgICBvdXRwdXQrPSIgZmFlaHJ0IGRhcyBTcGllbCB2aWEgQXJtYWdlZGRvbiBoZXJ1bnRlci5cbiI7CisgICAgb3V0cHV0PWR0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQ7CisgICAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgICAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBvdXRwdXQ9Y3RpbWUodGltZSgpKSsiOiAiK291dHB1dCsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIuXG4iOworICBvdXRwdXQrPSIgICAgR3J1bmQ6ICIrcmVhc29uOworICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICogbG93ZXJjaGFyCisKK2ludCBsb3dlcmNoYXIoaW50IGNoYXIpIHsKKyAgaWYgKGNoYXI8J0EnIHx8IGNoYXI+J1onKSByZXR1cm4gY2hhcjsKKyAgcmV0dXJuIGNoYXIrMzI7Cit9CisKKy8vICogdXBwZXJzdHJpbmcKKworc3RyaW5nIHVwcGVyc3RyaW5nKHN0cmluZyBzKQoreworI2lmIF9fRUZVTl9ERUZJTkVEX18odXBwZXJfY2FzZSkKKyAgcmV0dXJuKHVwcGVyX2Nhc2UocykpOworI2Vsc2UKKyAgaW50IGk7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgc1tpXT0oKHNbaV08J2EnfHxzW2ldPid6Jyk/c1tpXTpzW2ldLTMyKTsKKyAgcmV0dXJuIHM7CisjZW5kaWYKK30KKworLy8gKiBsb3dlcnN0cmluZworCitzdHJpbmcgbG93ZXJzdHJpbmcoc3RyaW5nIHMpCit7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIHJldHVybiBsb3dlcl9jYXNlKHMpOworfQorCisKKy8vICogR0QgdmVyc2lvbgorc3RyaW5nIHZlcnNpb24oKQoreworICByZXR1cm4gX19WRVJTSU9OX187Cit9CisKKy8vICogYnJlYWtfc3RyaW5nCisvLyBzdHJldGNoKCkgLS0gc3RyZXRjaCBhIGxpbmUgdG8gZmlsbCBhIGdpdmVuIHdpZHRoIAorcHJpdmF0ZSBzdHJpbmcgc3RyZXRjaChzdHJpbmcgcywgaW50IHdpZHRoKSB7CisgIGludCBsZW49c2l6ZW9mKHMpOworICBpZiAobGVuPT13aWR0aCkgcmV0dXJuIHM7CisKKyAgLy8gcmVpbmUgTGVlcnplaWxlbiwgZGlyZWt0IHp1cnVlY2tnZWJlbgorICBzdHJpbmcgdHJpbW1lZD10cmltKHMsVFJJTV9MRUZULCIgIik7CisgIGlmICh0cmltbWVkPT0iIikgcmV0dXJuIHM7IAorICBpbnQgc3RhcnRfc3BhY2VzID0gbGVuIC0gc2l6ZW9mKHRyaW1tZWQpOworCisgIHN0cmluZyogd29yZHMgPSBleHBsb2RlKHRyaW1tZWQsICIgIik7CisgIC8vIGRlciBsZXR6dGUga3JpZWd0IGtlaW5lIFNwYWNlcworICBpbnQgd29yZF9jb3VudD1zaXplb2Yod29yZHMpIC0gMTsKKyAgLy8gd2VubiBaZWlsZSBudXIgYXVzIGVpbmVtIFdvcnQsIHdpcmQgZGFzIFdvcnQgenVydWVja2dlZ2ViZW4KKyAgaWYgKCF3b3JkX2NvdW50KQorICAgIHJldHVybiAiICIqc3RhcnRfc3BhY2VzICsgd29yZHNbMF07CisKKyAgaW50IHNwYWNlX2NvdW50ID0gd2lkdGggLSBsZW47CisKKyAgaW50IHNwYWNlX3Blcl93b3JkPSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAvIHdvcmRfY291bnQ7CisgIC8vIEFuei5Xb2VydGVyIG1pdCBadXNhdHotU3BhY2UKKyAgaW50IHJlc3Q9KHdvcmRfY291bnQrc3BhY2VfY291bnQpICUgd29yZF9jb3VudDsgCisgIC8vIFJlc3QtU3BhY2VzIFZlcnRlaWxlbgorICBmb3JlYWNoIChpbnQgcG9zIDogcmVzdCkgd29yZHNbcG9zXSs9IiAiOworICByZXR1cm4gKCIgIipzdGFydF9zcGFjZXMpICsgaW1wbG9kZSggd29yZHMsICIgIipzcGFjZV9wZXJfd29yZCApOworfQorCisvLyBhdXMgR2VzY2h3aW5kaWdrZWl0c2dydWVuZGVuIGhhdCBkZXIgQmxvY2tzYXR6IGZ1ZXIgYnJlYWtfc3RyaW5nIGVpbmUKKy8vIGVpZ2VuZSBGdW5rdGlvbiBiZWtvbW1lbjoKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgYmxvY2tfc3RyaW5nKHN0cmluZyBzLCBpbnQgd2lkdGgsIGludCBmbGFncykgeworICAvLyB3ZW5uIEJTX0xFQVZFX01ZX0xGUywgYWJlciBrZWluIEJTX05PX1BBUklOREVOVCwgZGFubiB3ZXJkZW4gWmVpbGVuIG1pdAorICAvLyBlaW5lbSBMZWVyemVpY2hlbiBiZWdvbm5lbi4KKyAgLy8gQlRXOiBXZW5uICFCU19MRUFWRV9NWV9MRlMsIGhhdCBkZXIgQXVmcnVmZXIgYmVyZWl0cyBhbGxlIFxuIGR1cmNoICIgIgorICAvLyBlcnNldHp0LgorICBpZiAoIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykKKyAgICAgICYmICEoZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpKQorICB7CisgICAgICBzID0gIiAiK3JlZ3JlcGxhY2UocywiXG4iLCJcbiAiLDEpOworICB9CisKKyAgLy8gc3ByaW50ZiBmdWVsbHQgZGllIGxldHp0ZSBaZWlsZSBhdWYgZGllIEZlbGRicmVpdGUgKGhpZXIgYWxzbworICAvLyBaZWlsZW5icmVpdGUpIG1pdCBGdWVsbHplaWNoZW4gYXVmLCB3ZW5uIHNpZSBOSUNIVCBtaXQgXG4gdW1nZWJyb2NoZW4KKyAgLy8gaXN0LiBFcyB3aXJkIGFuIGRpZSBsZXR6dGUgWmVpbGUgYWJlciBrZWluIFplaWxlbnVtYnJ1Y2ggYW5nZWhhZW5ndC4KKyAgLy8gRWlnZW50bGljaCBpc3QgZGFzIEF1ZmZ1ZWxsZW4gZG9vZiwgYWJlciB2ZXJtdXRsaWNoIGlzdCBlcyB1bm5vZXRpZywgZXMKKyAgLy8gd2llZGVyIHJ1ZWNrZ2FlbmdpZyB6dSBtYWNoZW4uCisgIHMgPSBzcHJpbnRmKCAiJS0qPXMiLCB3aWR0aCwgcyk7CisKKyAgc3RyaW5nICp0bXA9ZXhwbG9kZShzLCAiXG4iKTsKKyAgLy8gTnVyIHdlbm4gcyBtZWhyemVpbGlnIGlzdCwgQmxvY2tzYXR6IGRyYXVzIG1hY2hlbi4gRGllIGxldHp0ZSBaZWlsZSB3aXJkCisgIC8vIG5hdHVlcmxpY2ggbmljaHQgZ2VkZWhudC4gU2llIGlzdCBkYWZ1ZXIgc2Nob24gdm9uIHNwcmludGYoKSBhdWZnZWZ1ZWxsdAorICAvLyB3b3JkZW4uIEJUVzogRGllIGxldHp0ZSBaZWlsZSBlbmRldCB1LlUuIG5vY2ggbmljaHQgbWl0IGVpbmVtIFxuIChiencuCisgIC8vIG51ciBkYW5uLCB3ZW5uIEJTX0xFQVZFX01ZX0xGUyB1bmQgZGVyIHVlYmVyZ2ViZW5lIFRleHQgc2Nob24gbmVuIFxuIGFtCisgIC8vIEVuZGUgZGVyIGxldHp0ZW4gWmVpbGUgaGF0KSwgZGFzIG1hY2h0IGRlciBBdWZydWZlci4uLgorICBpZiAoc2l6ZW9mKHRtcCkgPiAxKQorICAgIHJldHVybiBpbXBsb2RlKCBtYXAoIHRtcFswLi48Ml0sICMnc3RyZXRjaC8qJyovLCB3aWR0aCApLCAiXG4iICkgCisgICAgICArICJcbiIgKyB0bXBbPDFdOworCisgIHJldHVybiBzOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzLCBpbnQgdywgbWl4ZWQgaW5kZW50LCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKCAhcyB8fCBzID09ICIiICkgcmV0dXJuICIiOworCisgICAgaWYgKCAhdyApIHc9Nzg7CisKKyAgICBpZiggaW50cChpbmRlbnQpICkKKyAgICAgICBpbmRlbnQgPSBpbmRlbnQgPyAiICIqaW5kZW50IDogIiI7CisKKyAgICBpbnQgaW5kZW50bGVuPXN0cmluZ3AoaW5kZW50KSA/IHNpemVvZihpbmRlbnQpIDogMDsKKworICAgIGlmIChpbmRlbnRsZW4+dykgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoImJyZWFrX3N0cmluZzogaW5kZW50IGxvbmdlciAlZCB0aGFuIHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgICAgaW5kZW50bGVuLHcpKTsKKyAgICAgIC8vIHc9KChpbmRlbnRsZW4vdykrMSkqdzsKKyAgICB9CisKKyAgICBpZiAoIShmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykpIAorICAgICAgcz1yZWdyZXBsYWNlKCBzLCAiXG4iLCAiICIsIDEgKTsKKworICAgIGlmICggZmxhZ3MgJiBCU19TSU5HTEVfU1BBQ0UgKQorICAgICAgIHMgPSByZWdyZXBsYWNlKCBzLCAiKF58XG58ICkgICoiLCAiXFwxIiwgMSApOworIAorICAgIHN0cmluZyBwcmVmaXg9IiI7CisgICAgaWYgKGluZGVudGxlbiAmJiBmbGFncyAmIEJTX1BSRVBFTkRfSU5ERU5UKSB7CisgICAgICBpZiAoaW5kZW50bGVuK3NpemVvZihzKSA+IHcgfHwgCisgICAgICAgICAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpICYmIHN0cnN0cihzLCJcbiIpPi0xKSB7CisgICAgICAgcHJlZml4PWluZGVudCsiXG4iOworICAgICAgIGluZGVudD0oZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpID8gIiIgOiAiICI7CisgICAgICAgaW5kZW50bGVuPXNpemVvZihpbmRlbnQpOworICAgICAgfQorICAgIH0KKworICAgIGlmICggZmxhZ3MgJiBCU19CTE9DSyApIHsKKyAgICAgIC8qCisgICAgICAgICAgIHMgPSBpbXBsb2RlKCBtYXAoIGV4cGxvZGUoIHMsICJcbiIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2Jsb2NrX3N0cmluZywgdywgaW5kZW50bGVuLCBmbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgIiIgKTsKKyAgICAgICovCisgICAgICBzID0gYmxvY2tfc3RyaW5nKCBzICwgdyAtIGluZGVudGxlbiwgZmxhZ3MgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzID0gc3ByaW50ZigiJS0xLio9cyIsdy1pbmRlbnRsZW4scyk7CisgICAgfQorICAgIGlmICggc1s8MV0gIT0gJ1xuJyApIHMgKz0gIlxuIjsKKworICAgIGlmICggIWluZGVudGxlbiApIHJldHVybiBwcmVmaXggKyBzOworICAgIAorICAgIHN0cmluZyBpbmRlbnQyID0gKCBmbGFncyAmIEJTX0lOREVOVF9PTkNFICkgPyAoIiAiKmluZGVudGxlbikgOmluZGVudDsKKyAgICAgIAorICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyAKKyAgICAgIHJlZ3JlcGxhY2UoIHNbMC4uPDJdLCAiXG4iLCAiXG4iK2luZGVudDIsIDEgKSArICJcbiI7CisgICAgICAvKgorICAgICAgIHN0cmluZyAqYnVmOworCisgICAgICAgYnVmID0gZXhwbG9kZSggcywgIlxuIiApOworICAgICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyBpbXBsb2RlKCBidWZbMC4uPDJdLCAiXG4iK2luZGVudDIgKSArIGJ1Zls8MV0gKyAiXG4iOworICAgICAgKi8KK30KKworLy8gKiBFbGVtZW50ZSBhdXMgbWFwcGluZyBsb2VzY2hlbiAtIG1hcHBpbmcgdm9yaGVyIGtvcGllcmVuCisKK21hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG0sIG1peGVkIGtleSkgeworICByZXR1cm4gbV9kZWxldGUoY29weShtKSwga2V5KTsKK30KKworLy8gKiB0aW1lcworaW50IGxhc3RfcmVib290X3RpbWUoKQoreworICByZXR1cm4gX19CT09UX1RJTUVfXzsKK30KKworaW50IGZpcnN0X2Jvb3RfdGltZSgpCit7CisgIHJldHVybiA3MDE1MTc2MDA7Cit9CisKK2ludCBleGlzdF9kYXlzKCkKK3sKKyAgcmV0dXJuICgoKHRpbWUoKS1maXJzdF9ib290X3RpbWUoKSkvODY0MCkrNSkvMTA7Cit9CisKKy8vICogdXB0aW1lIDopCitzdHJpbmcgdXB0aW1lKCkKK3sKKyAgaW50IHQ7CisgIGludCB0bXA7CisgIHN0cmluZyBzOworCisgIHQ9dGltZSgpLV9fQk9PVF9USU1FX187CisgIHM9IiI7CisgIGlmICh0Pj04NjQwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBUYWclcywgIix0bXA9dC84NjQwMCwodG1wPT0xPyIiOiJlIikpOworICBpZiAodD49MzYwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBTdHVuZGUlcywgIix0bXA9KHQ9dCU4NjQwMCkvMzYwMCwodG1wPT0xPyIiOiJuIikpOworICBpZiAodD42MCkKKyAgICBzKz1zcHJpbnRmKCIlZCBNaW51dGUlcyB1bmQgIix0bXA9KHQ9dCUzNjAwKS82MCwodG1wPT0xPyIiOiJuIikpOworICByZXR1cm4gcytzcHJpbnRmKCIlZCBTZWt1bmRlJXMiLHQ9dCU2MCwodD09MT8iIjoibiIpKTsKK30KKworLy8gKiBXYXMgdHVuIGJlaSAnZGFuZ2xpbmcnIGxmdW4tY2xvc3VyZXMgPwordm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKSB7CisgIHJhaXNlX2Vycm9yKCJkYW5nbGluZyBsZnVuIGNsb3N1cmVcbiIpOworfQorCisvLyAqIFNwZXJyZW4gYXVzc2VyIGZ1ZXIgbWFzdGVyL3NpbXVsX2VmdW4KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2Vudmlyb25tZW50KQorbm9tYXNrIHZvaWQgc2V0X2Vudmlyb25tZW50KG9iamVjdCBvMSwgb2JqZWN0IG8yKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworbm9tYXNrIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBwbCkgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorCisjaWYgX19FRlVOX0RFRklORURfXyhleHBvcnRfdWlkKQorbm9tYXNrIHZvaWQgZXhwb3J0X3VpZChvYmplY3Qgb2IpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCisvLyAqIEpldHp0IGF1Y2ggY2xvc3VyZXMKK2ludCBwcm9jZXNzX2ZsYWc7CisKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpCit7CisgIGlmIChwcm9jZXNzX2ZsYWc+MCkKKyAgICByZXR1cm4gcHJvY2Vzc19mbGFnOworICBlbHNlIHJldHVybigwKTsKK30KKworcHJpdmF0ZSBub21hc2sgc3RyaW5nIF9wcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyLG9iamVjdCBwbykgeworICAgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgICAgICAgICByZXR1cm4oZWZ1bjo6cHJvY2Vzc19zdHJpbmcoc3RyKSk7Cit9CisKK25vbWFzayBzdHJpbmcgcHJvY2Vzc19zdHJpbmcoIG1peGVkIHN0ciApCit7CisgIHN0cmluZyB0bXAsIGVycjsKKyAgaW50IGZsYWc7IAorCisgIGlmICggY2xvc3VyZXAoc3RyKSApIHsKKyAgICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICAgIHJldHVybiBmdW5jYWxsKHN0cik7CisgIH0KKyAgZWxzZSBpZiAoc3RyPT0wKQorICAgICAgcmV0dXJuKChzdHJpbmcpc3RyKTsKKyAgZWxzZSBpZiAoICFzdHJpbmdwKHN0cikgKSB7CisgICAgICByZXR1cm4gdG9fc3RyaW5nKHN0cik7CisgIH0KKworICBpZiAoICEoZmxhZyA9IHByb2Nlc3NfZmxhZyA+IHRpbWUoKSAtIDYwKSkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHByb2Nlc3NfZmxhZz10aW1lKCk7CisKKyAgZXJyID0gY2F0Y2godG1wID0gZnVuY2FsbCgjJ19wcm9jZXNzX3N0cmluZyxzdHIscHJldmlvdXNfb2JqZWN0KCkpOyBwdWJsaXNoKTsKKworICBpZiAoICFmbGFnICkKKyAgICBwcm9jZXNzX2ZsYWc9MDsKKworICBpZiAoZXJyKSB7CisgICAgLy8gVmVyYXJiZWl0dW5nIGFiYnJlY2hlbgorICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3IoZXJyKTsKKyAgfQorICByZXR1cm4gdG1wOworfQorCisvLyAnbWtkaXIgLXAnIC0gZXJ6ZXVndCBlaW5lIGtvbXBsZXR0ZSBIaWVyYXJjaGllIHZvbiBWZXJ6ZWljaG5pc3Nlbi4KKy8vIHdlbm4gZGFzIFZlcnplaWNobmlzIGFuZ2VsZWd0IHd1cmRlIG9kZXIgc2Nob24gZXhpc3RpZXJ0LCB3aXJkIDEKKy8vIHp1cnVlY2tnZWxpZWZlcnQsIHNvbnN0IDAuCisvLyBXaXJmdCBlaW5lbiBGZWhsZXIsIHdlbm4gZGFzIGFuZ2ViZW5lIFZlcnplaWNobmlzIG5pY2h0IGFic29sdXQgaXN0IQorcHVibGljIGludCBta2RpcnAoc3RyaW5nIGRpcikgeworICAvLyB3ZW5uIGVzIG51ciBrZWluZW4gZnVlaHJlbmRlbiAvIGdpYnQsIGlzdCBkYXMgZWluIEZlaGxlci4KKyAgaWYgKHN0cnN0cihkaXIsICIvIikgIT0gMCkKKyAgICByYWlzZV9lcnJvcigibWtkaXJwKCk6IFBmYWQgaXN0IG5pY2h0IGFic29sdXRlLlxuIik7CisgIC8vIGN1dCBvZmYgdHJhaWxpbmcgLy4uLgorICBpZiAoZGlyWzwxXT09Jy8nKQorICAgICAgZGlyID0gZGlyWzAuLjwyXTsKKworICBpbnQgZnN0YXQgPSBmaWxlX3NpemUoZGlyKTsKKyAgLy8gd2VubiBlcyBzY2hvbiBleGlzdGllcnQsIHR1biB3aXIgZWluZmFjaCBzbywgYWxzIGhhZXR0ZW4gd2lyIGVzIGFuZ2VsZWd0LgorICBpZiAoZnN0YXQgPT0gRlNJWkVfRElSKQorICAgIHJldHVybiAxOworICAvLyB3ZW5uIHNjaG9uIG5lIERhdGVpIGV4aXN0aWVydCwgZ2VodCBlcyBuaWNodC4KKyAgaWYgKGZzdGF0ICE9IEZTSVpFX05PRklMRSkKKyAgICByZXR1cm4gMDsKKyAgLy8gd2VubiBlcyBudXIgZWluZW4gLyBnaWJ0IChkZW4gZnVlaHJlbmRlbiksIGRhbm4gaXN0IGVzIGVpbgorICAvLyB0b3BsZXZlbC12ZXJ6ZWljaG5pcywgd2FzIGRpcmVrdCBhbmdlbGVndCB3aXJkLgorICBpZiAoc3RycnN0cihkaXIsIi8iKT09MCkgeworICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKKyAgfQorCisgIC8vIG1rZGlyKCkgbmljaHQgZGlyZWt0IHJ1ZmVuLCBzb25kZXJuIHZvcmhlciBhbHMgY2xvc3VyZSBhbnMgYXVmcnVmZW5kZQorICAvLyBPYmpla3QgYmluZGVuLiBTb25zdCBsYWV1ZnQgZGllIFJlY2h0ZXBydWVmdW5nIGluIHZhbGlkX3dyaXRlKCkgaW0gTWFzdGVyCisgIC8vIHVudGVyIGRlciBBbm5haG1lLCBkYXNzIGRpZSBzaW11bF9lZnVuLmMgbWl0IGlocmVyIHJvb3QgaWQgd2FzIHdpbGwuCisKKyAgLy8gamV0enQgcmVrdXJzaXYgZGllIFZlcnplaWNobmlzaGllcmFyY2hpZSBhbmxlZ2VuLiBXZW5uIGRhcyBlcmZvbGdyZWljaAorICAvLyBpc3QsIGRhbm4ga29lbm5lbiB3aXIgamV0enQgbWl0IG1rZGlyIGRhcyB0aWVmc3RlIFZlcnplaWNobmlzIGFubGVnZW4KKyAgaWYgKG1rZGlycChkaXJbMC4uc3RycnN0cihkaXIsIi8iKS0xXSkgPT0gMSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7Cit9CisKKworLy8gKiBQcm9wZXJ0aWVzIGdnZnMuIG1pdHNwZWljaGVybgorbWl4ZWQgc2F2ZV9vYmplY3QobWl4ZWQgbmFtZSkKK3sKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBtYXBwaW5nIHNhdmU7CisgIG1peGVkIGluZGV4LCByZXM7CisgIGludCBpOworCisgIC8vIG51ciBTdHJpbmdzIHVuZCAwIHp1bGFzc2VuCisgIGlmICgoIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSkgJiYgCisgICAgICAoIWludHAobmFtZSkgfHwgbmFtZSE9MCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgbm9uLWVtcHR5IHN0cmluZ3MgYW5kIDAgbWF5IGJlIHVzZWQgYXMgZmlsZW5hbWUgaW4gIgorICAgICAgICAgInNlZnVuOjpzYXZlX29iamVjdCgpISBBcmd1bWVudCB3YXMgJU9cbiIsbmFtZSkpOworICB9CisKKyAgc2F2ZSA9IG1fYWxsb2NhdGUoMCwgMik7CisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKyAgaWYobWFwcGluZ3AocHJvcGVydGllcykpCisgIHsKKyAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQorICAgIGluZGV4ID0gbV9pbmRpY2VzKHByb3BlcnRpZXMpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wO2ktLSkKKyAgICB7CisgICAgICBpZihwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYgU0FWRSkKKyAgICAgIHsKKyAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOworICAgICAgIHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0gPQorICAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJgorICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2Ugc2F2ZSA9IChbXSk7CisKKyAgLy8gc2F2ZSBvYmplY3QhCisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YShzYXZlKTsKKyAgLy8gZm9ybWF0OiB3aWUgZGVmaW5pZXJ0IGluIGNvbmZpZy5oCisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBlbHNlCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgICAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIGVsc2UKKyAgICAgIHN0YXQtPnNpemVvZihyZXMpOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisgIHNhdmVvX3N0YXRbMV1bc2F2ZW9fc3RhdFswXV0gPSBzdGF0OworICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbyAyOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisjZW5kaWYKKworICByZXR1cm4gcmVzOworfQorCisvLyAqIEF1Y2ggUHJvcGVydGllcyBsYWRlbgoraW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBuYW1lKQoreworICBpbnQgcmVzdWx0OworICBtaXhlZCBpbmRleDsKKyAgbWl4ZWQgc2F2ZTsKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBpbnQgaTsKKyAgY2xvc3VyZSBjbDsKKworICAvLyBnZXQgYWN0dWFsIHByb3BlcnR5IHNldHRpbmdzIChieSBjcmVhdGUoKSkKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworLy8gIERFQlVHKHNwcmludGYoIlJFU1RPUkUgJU9cbiIsbmFtZSkpOworICAvLyByZXN0b3JlIG9iamVjdAorICByZXN1bHQ9ZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnJlc3RvcmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUpOworICAvLycpKQorICAvL19nZXRfc2F2ZV9kYXRhIGxpZWZlcnQgdGF0c2FlY2hsaWNoIG1peGVkIHp1cnVlY2ssIHdlbm4gZGFzIGF1Y2ggaW1tZXIgZWluIAorICAvL21hcHBpbmcgc2VpbiBzb2xsdGUuCisgIHNhdmUgPSAobWl4ZWQpcHJldmlvdXNfb2JqZWN0KCktPl9nZXRfc2F2ZV9kYXRhKCk7CisgIGlmKG1hcHBpbmdwKHNhdmUpKQorICB7CisgICAgaW5kZXggPSBtX2luZGljZXMoc2F2ZSk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7IGktLSkKKyAgICB7CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldXSA9IHNhdmVbaW5kZXhbaV1dOworICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSA9IHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmfihTRVRDQUNIRUR8UVVFUllDQUNIRUQpOworICAgIH0KKyAgfQorICBlbHNlIHByb3BlcnRpZXMgPSAoW10pOworCisgIC8vIHJlc3RvcmUgcHJvcGVydGllcworICBmdW5jYWxsKAorICAgICAgICAgIGJpbmRfbGFtYmRhKAorICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoKHsnYXJnfSksIC8vJ30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsKHsjJ3RoaXNfb2JqZWN0fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3BlcnRpZXMiLCdhcmd9KSksLy8nKQorICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLHByb3BlcnRpZXMpOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIC8vZGVidWdfbWVzc2FnZSgicmVzdG9yZW86ICIrcmVzdG9yZW9fc3RhdFswXSsiXG4iKTsKKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICByZXN0b3Jlb19zdGF0WzFdW3Jlc3RvcmVvX3N0YXRbMF1dID0gc3RhdDsKKworICByZXN0b3Jlb19zdGF0WzBdID0gKHJlc3RvcmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihyZXN0b3Jlb19zdGF0WzFdKTsKKyNlbmRpZgorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vICogSEIgZWluZXMgT2JqZWt0ZXMgZWluL2F1c3NjaGFsdGVuCitpbnQgc2V0X29iamVjdF9oZWFydF9iZWF0KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIGlmIChvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNvbmZpZ3VyZV9vYmplY3Qsb2IpLCBvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Cit9CisKKy8vICogTWFnaWVybGV2ZWxncnVwcGVuIGVybWl0dGVsbgoraW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KQoreworICBpbnQgbGV2OworCisgIGxldj1xdWVyeV93aXpfbGV2ZWwod2l6KTsKKyAgaWYgKGxldjxTRUVSX0xWTCkgcmV0dXJuIDA7CisgIGlmIChsZXY+PUdPRF9MVkwpIHJldHVybiBsZXY7CisgIGlmIChsZXY+PUFSQ0hfTFZMKSByZXR1cm4gQVJDSF9HUlA7CisgIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIEVMREVSX0dSUDsKKyAgaWYgKGxldj49TE9SRF9MVkwpIHJldHVybiBMT1JEX0dSUDsKKyAgaWYgKGxldj49U1BFQ0lBTF9MVkwpIHJldHVybiBTUEVDSUFMX0dSUDsKKyAgaWYgKGxldj49RE9NQUlOTUVNQkVSX0xWTCkgcmV0dXJuIERPTUFJTk1FTUJFUl9HUlA7CisgIGlmIChsZXY+PVdJWkFSRF9MVkwpIHJldHVybiBXSVpBUkRfR1JQOworICBpZiAobGV2Pj1MRUFSTkVSX0xWTCkgcmV0dXJuIExFQVJORVJfR1JQOworICByZXR1cm4gU0VFUl9HUlA7Cit9CisKK21peGVkICp3aXpsaXN0X2luZm8oKQoreworICBpZiAoQVJDSF9TRUNVUklUWSB8fCAhZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vICogd2l6bGlzdCBhdXNnZWJlbgordmFyYXJncyB2b2lkIHdpemxpc3Qoc3RyaW5nIG5hbWUsIGludCBzb3J0a2V5ICkgeworCisgIGlmICghbmFtZSkKKyAgeworICAgIGlmICh0aGlzX3BsYXllcigpKQorICAgICAgbmFtZSA9IGdldHVpZCh0aGlzX3BsYXllcigpKTsKKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm47CisgIH0KKworICAvLyBTY2hsdWVzc2VsIGRhcmYgbnVyIGluIGVpbmVtIGd1ZWx0aWdlbiBCZXJlaWNoIHNlaW4KKyAgaWYgKHNvcnRrZXk8V0xfTkFNRSB8fCBzb3J0a2V5Pj1XTF9TSVpFKSBzb3J0a2V5PVdMX0NPU1Q7CisKKyAgbWl4ZWQqKiB3bCA9IGVmdW46Ondpemxpc3RfaW5mbygpOworICAvLyBuYWNoIDxzb3J0a2V5PiBzb3J0aWVyZW4KKyAgd2wgPSBzb3J0X2FycmF5KHdsLCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpCisgICAgICB7cmV0dXJuIGFbc29ydGtleV0gPCBiW3NvcnRrZXldOyB9ICk7CisKKyAgLy8gU3VtbWUgdWViZXIgYWxsZSBLb21tYW5kb3MgZXJtaXR0ZWxuLgorICBpbnQgdG90YWxfY21kLCBpOworICBpbnQgcG9zPS0xOworICBmb3JlYWNoKG1peGVkIGVudHJ5IDogd2wpCisgIHsKKyAgICB0b3RhbF9jbWQgKz0gZW50cnlbV0xfQ09NTUFORFNdOworICAgIGlmIChlbnRyeVtXTF9OQU1FXSA9PSBuYW1lKQorICAgICAgcG9zID0gaTsKKyAgICArK2k7CisgIH0KKworICBpZiAocG9zIDwgMCAmJiBuYW1lICE9ICJBTEwiICYmIG5hbWUgIT0gIlRPUDEwMCIpCisgICAgcmV0dXJuOworCisgIGlmIChuYW1lID09ICJUT1AxMDAiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPiAxMDApCisgICAgICB3bCA9IHdsWzAuLjEwMF07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorICAvLyB1bSBuYW1lIGhlcnVtIHNjaG5laWRlbgorICBlbHNlIGlmIChuYW1lICE9ICJBTEwiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPD0gMjEpCisgICAgICB3bCA9IHdsOworICAgIGVsc2UgaWYgKHBvcyArIDEwIDwgc2l6ZW9mKHdsKSAmJiBwb3MgLSAxMCA+IDApCisgICAgICB3bCA9IHdsW3Bvcy0xMC4ucG9zKzEwXTsKKyAgICBlbHNlIGlmIChwb3MgPD0yMSkKKyAgICAgIHdsID0gd2xbMC4uMjBdOworICAgIGVsc2UgaWYgKHBvcyA+PSBzaXplb2Yod2wpIC0gMjEpCisgICAgICB3bCA9IHdsWzwyMS4uXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisKKyAgd3JpdGUoIlxuV2l6YXJkIHRvcCBzY29yZSBsaXN0XG5cbiIpOworICBpZiAodG90YWxfY21kID09IDApCisgICAgdG90YWxfY21kID0gMTsKKyAgcHJpbnRmKCIlLTIwcyAlLTZzICUtM3MgJS0xN3MgJS02cyAlLTZzICUtNnNcbiIsCisgICAgICAgICAiRVVJRCIsICJjbWRzIiwgIiUiLCAiQ29zdHMiLCAiSEIiLCAiQXJyYXlzIiwiTWFwcC4iKTsKKyAgZm9yZWFjaChtaXhlZCBlOiB3bCkKKyAgeworICAgIHByaW50ZigiJS06MjBzICU6NmQgJToyZCUlIFslOjZkaywlOjZkR10gJTo2ZCAlOjZkICU6NmRcbiIsCisgICAgICAgICAgZVtXTF9OQU1FXSwgZVtXTF9DT01NQU5EU10sIGVbV0xfQ09NTUFORFNdICogMTAwIC8gdG90YWxfY21kLAorICAgICAgICAgIGVbV0xfQ09TVF0gLyAxMDAwLCBlW1dMX1RPVEFMX0dJR0FDT1NUXSwKKyAgICAgICAgICBlW1dMX0hFQVJUX0JFQVRTXSwgZVtXTF9BUlJBWV9UT1RBTF0sIGVbV0xfTUFQUElOR19UT1RBTF0KKyAgICAgICAgICApOworICB9CisgIHByaW50ZigiXG5Ub3RhbCAgICAgICAgICU3ZCAgICAgICAgICglZClcblxuIiwgdG90YWxfY21kLCBzaXplb2Yod2wpKTsKK30KKworCisvLyBBYiBoaWVyIGZvbGdlbiBIaWxmc2Z1bmt0aW9uZW4gZnVlciBjYWxsX291dCgpIGJ6dy4gZnVlciBkZXJlbiBCZWdyZW56dW5nCisKKy8vIGVybWl0dGVsdCBkYXMgT2JqZWt0IGRlcyBDYWxsb3V0cy4KK3ByaXZhdGUgb2JqZWN0IF9jYWxsX291dF9vYmooIG1peGVkIGNhbGxfb3V0ICkgeworICAgIHJldHVybiBwb2ludGVycChjYWxsX291dCkgPyBjYWxsX291dFswXSA6IDA7Cit9CisKK3ByaXZhdGUgdm9pZCBfc2FtZV9vYmplY3QoIG9iamVjdCBvYiwgbWFwcGluZyBtICkgeworICAvLyBpc3QgbmljaHQgc28gYmxvZWQsIHdpZSBlcyBhdXNzaWVodCwgcy4gbmFjaGZvbGdlZGUgVmVyd2VuZHVuZyB2b24gbQorICBpZiAoIG1bb2JdICkKKyAgICBtW29iXSArPSAoeyBvYiB9KTsKKyAgZWxzZQorICAgIG1bb2JdID0gKHsgb2IgfSk7IAorfQorCisvLyBhbGxlIE9iamVrdGUgaW0gTWFwcGluZyBtIHp1c2FtbWVuZmFzc2VuLCBkaWUgZGVuIGdsZWljaGVuIExvYWRuYW1lIChOYW1lIGRlcgorLy8gQmx1ZXByaW50KSBoYWJlbiwgYWxzbyBhbGxlIENsb25lcyBkZXIgQlAsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4uCisvLyBPYmpla3RlIHdlcmRlbiBhdWNoIG1laHJmYWNoIGVyZmFzc3QsIGplIG5hY2ggQW56YWhsIGlocmVyIENhbGxvdXRzLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3BhdGgoIG9iamVjdCBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0gKSB7CisgIHN0cmluZyBwYXRoOworICBpZiAoIW9iamVjdHAoa2V5KSB8fCAhcG9pbnRlcnAob2JzKSkgcmV0dXJuOworCisgIHBhdGggPSBsb2FkX25hbWUoa2V5KTsKKworICBpZiAoIG1bcGF0aF0gKQorICAgIG1bcGF0aF0gKz0gb2JzOworICBlbHNlCisgICAgbVtwYXRoXSA9IG9iczsKK30KKworLy8ga2V5IGthbm4gb2JqZWN0IG9kZXIgc3RyaW5nIHNlaW4uCitwcml2YXRlIGludCBfdG9vX21hbnkoIG1peGVkIGtleSwgbWFwcGluZyBtLCBpbnQgaSApIHsKKyAgICByZXR1cm4gc2l6ZW9mKG1ba2V5XSkgPj0gaTsKK30KKworLy8gYWxsZSBPYmpla3RlIGluIG9icyB6ZXJzdG9lcmVuIHVuZCBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuLiBBQ0hUVU5HOiBEaWUKKy8vIE9iamVrdGUgd2VyZGVuIGlkUiB6dSBlaW5lciBCUCBnZWhvZXJlbiwgbXVlc3NlbiBhYmVyIG5pY2h0ISBJbiBkZW0gRmFsbAorLy8gd2lyZCBhdWYgZGVyIEViZW5lIGFiZXIgbnVyIGVpbiBPYmpla3QgaW4gZGVyIEZlaGxlcm1lbGR1bmcgZXJ3YWVobnQuCitwcml2YXRlIHZvaWQgX2Rlc3Ryb3koIG1peGVkIGtleSwgb2JqZWN0ICpvYnMsIHN0cmluZyB0ZXh0LCBpbnQgdWlkICkgeworICAgIGlmICghcG9pbnRlcnAob2JzKSkgcmV0dXJuOworICAgIC8vIEFycmF5IG1pdCB1bmlxdWUgRWludHJhZWdlIGVyemV1Z2VuLgorICAgIG9icyA9IG1faW5kaWNlcyggbWttYXBwaW5nKG9icykgKTsKKyAgICAvLyBGZWhsZXJtZWxkdW5nIGF1ZiBkZXIgRWJlbmUgYXVzZ2ViZW4sIGltIGNhdGNoKCkgbWl0IHB1Ymxpc2gsIGRhbWl0IGVzCisgICAgLy8gYXVmIGRlciBFYmVuZSBkaXJla3Qgc2Nyb2xsdCwgZGVyIGJhY2t0cmFjZSB2ZXJmdWVnYmFyIGlzdCAoaW0KKyAgICAvLyBnZWdlbnNhdHogenVyIExvZXN1bmcgbWl0dGVscyBDYWxsb3V0KSwgZGllIEF1c2Z1ZWhydW5nIGFiZXIgd2VpdGVyCisgICAgLy8gbGFldWZ0LgorICAgIGNhdGNoKCBlZnVuOjpyYWlzZV9lcnJvciggICAgICAgICAgIAorICAgICAgICAgc3ByaW50ZiggdGV4dCwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHVpZCA/IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShrZXkpIDoga2V5LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgc2l6ZW9mKG9icyksIG9iamVjdF9uYW1lKG9ic1s8MV0pICkgKTtwdWJsaXNoKTsKKyAgICAvLyBVbmQgd2VnIG1pdCBkZW0gS3JhbS4uLgorICAgIGZpbHRlciggb2JzLCAjJ2VmdW46OmRlc3RydWN0LyonKi8gKTsKK30KKworLy8gQWxsZSBPYmpla3QgZWluZXIgVUlEIGltIE1hcHBpbmcgbSBtaXQgVUlEIGFscyBLRXlzIHp1c2FtbWVuZmFzc2VuLiBPYmpla3QKKy8vIHNpbmQgZGFiZWkgbmljaHQgdW5pcXVlLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3VpZCggc3RyaW5nIGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSwgY2xvc3VyZSBjZiApIHsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoICFwb2ludGVycChvYnMpIHx8ICFzaXplb2Yob2JzKSApCisgICAgcmV0dXJuOworCisgIHVpZCA9IGZ1bmNhbGwoIGNmLCBrZXkgKTsKKworICBpZiAoIG1bdWlkXSApCisgICAgbVt1aWRdICs9IG9iczsgLy8gb2JzIGlzdCBuZW4gQXJyYXkKKyAgZWxzZQorICAgIG1bdWlkXSA9IG9iczsKK30KKworcHJpdmF0ZSBpbnQgX2xvZ19jYWxsX291dChtaXhlZCBjbykKK3sKKyAgbG9nX2ZpbGUoIlRPT19NQU5ZX0NBTExPVVRTIiwKKyAgICAgIHNwcmludGYoIiVzOjolTyAoJWQpXG4iLG9iamVjdF9uYW1lKGNvWzBdKSxjb1sxXSxjb1syXSksCisgICAgICAyMDAwMDApOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgbGFzdF9jYWxsb3V0X2xvZz0wOworCitub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7CisKKyAgICAvLyBCZWkgPjYwMCBDYWxsb3V0cyBhbGxlIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgMzAgQ2FsbG91dHMgbGF1ZmVuCisgICAgLy8gaGFiZW4uCisgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCisgICAgICAgICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCisgICAgeworICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgorICAgICAgIGlmIChsYXN0X2NhbGxvdXRfbG9nIDwKKyAgICAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpIC0gMTAKKyAgICAgICAgICAgJiYgZ2V0X2V2YWxfY29zdCgpID4gMjAwMDAwKQorICAgICAgIHsKKyAgICAgICAgIGxhc3RfY2FsbG91dF9sb2cgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICBsb2dfZmlsZSgiVE9PX01BTllfQ0FMTE9VVFMiLAorICAgICAgICAgICAgIHNwcmludGYoIlxuJXM6ICMjIyMjIyMjIyMjIyBUb28gbWFueSBjYWxsb3V0czogJWQgIyMjIyMjIyMjIyMjIyNcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLAorICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSkpOworICAgICAgICAgZmlsdGVyKGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfbG9nX2NhbGxfb3V0KTsKKyAgICAgICB9CisgICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KKyAgICAgICBjYWxsX291dHMgPSBtYXAoIGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfY2FsbF9vdXRfb2JqICk7CisgICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOworICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOworICAgICAgIC8vIE1hc3RlciBuaWNodCBncmlsbGVuLi4uCisgICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7CisgICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgbWFwcGluZyByZXMgPSBmaWx0ZXJfaW5kaWNlcyggb2JqZWN0bWFwLCAjJ190b29fbWFueSwgb2JqZWN0bWFwLCAyOSApOworICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiBqZXdlaWxzIGRhcyBnbGVpY2hlIE9iamVrdCkuCisgICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAorICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCisgICAgICAgICAgICAgICJvYmplY3QgWyVPXS4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCisgICAgICAgLy8gT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyA1MCBDYWxsb3V0cyBsYXVmZW4gaGFiZW4gLSB1bmQKKyAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKKyAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQorICAgICAgIC8vIGRpZXNlIE9iamVrdGUgX3p1c2FtbWVuXyBtZWhyIGFscyA1MCBDYWxsb3V0cyBoYWJlbiEKKyAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7CisgICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0CisgICAgICAgICAgIC8vIG1laHIgZHJpbiwgZGEgc2llIGRvcnQgYWxzIEtleXMgdmVyd2VuZGV0IHd1cmRlbi4KKyAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7CisgICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCisgICAgICAgICAgIC8vIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKKyAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBwYXRobWFwLCAjJ190b29fbWFueS8qJyovLCBwYXRobWFwLCA1MCApOworICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCisgICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KKyAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgorICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cworICAgICAgICAgICAvLyBlaW5lciBVSUQgenVzYW1tZW5nZXphZWhsdC4KKyAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKKyAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCisgICAgICAgICAgIGlmIChlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gMTAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCisgICAgICAgICAgICAgIC8vIHp1c2FtbWVuc29ydGllcmVuLiBaZXJzdG9lcnRlIENsb25lcyBmaWx0ZXIgX3NhbWVfdWlkKCkKKyAgICAgICAgICAgICAgLy8gcmF1cy4KKyAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBwYXRobWFwLCAjJ19zYW1lX3VpZCwgJnVpZG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKKyAgICAgICAgICAgICAgLy8gSW4gcmVzIG51biBVSURzIGFscyBLZXlzIHVuZCBBcnJheXMgdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KKyAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCisgICAgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCB1aWRtYXAsICMnX3Rvb19tYW55LCB1aWRtYXAsIDEwMCApOworICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAorICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KKyAgICAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOworICAgIHJldHVybjsKK30KKworbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKKyAgCisgIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOworICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7CisKKyAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCisgIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCisgIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHBvKSkgPj0gQVJDSF9MVkwKKyAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKKyAgICAgIHJldHVybiBjb2k7CisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgeworICAgICAgICAgICAgICBpZiAocG9pbnRlcnAoYXJyKSAmJiBhcnJbMF09PXBvKQorICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7CisgIH0KK30KKworLy8gKiBadSBlaW5lciBjbG9zdXJlIGRhcyBPYmpla3QsIGFuIGRhcyBzaWUgZ2VidW5kZW4gaXN0LCBzdWNoZW4KKy8vIE5JQ0hUIGRhcyBPYmpla3QsIHdhcyBnZ2YuIGRpZSBsZnVuIGRlZmluaWVydCEKK21peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgeworICByZXR1cm4KKyAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KKyAgICAgIDAgOgorICAodG9fb2JqZWN0KGMpIHx8IC0xKTsKK30KKworLy8gKiBXaXIgd29sbGVuIG51ciBFSU4gQXJndW1lbnQgLi4uIGF1c3NlcmRlbSBjaGVja3MgZnVlciBkZW4gTmV0enRvdGVucmF1bQordmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQoreworICBvYmplY3QgcG8sdG1wOworCisgIHBvPXByZXZpb3VzX29iamVjdCgpOworICBpZiAoIXdoZXJlKQorICB7CisgICAgd2hlcmU9d2hhdDsKKyAgICB3aGF0PXBvOworICB9CisgIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAorICAgICAgIChvYmplY3RwKHdoZXJlKSAmJiB3aGVyZT09ZmluZF9vYmplY3QoTkVUREVBRF9ST09NKSkpICYmCisgICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCisgIHsKKyAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgd2hhdC0+cmVtb3ZlKCk7CisgICAgICBpZiAod2hhdCkgZGVzdHJ1Y3Qod2hhdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsaXZpbmcod2hhdCkgfHwgaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOworICB9CisgIHRtcD13aGF0OworICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgorICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgorICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCisgICAgICAvLworICAgICAgLy8gVGlhbWFrCisgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKKyAgaWYgKHRtcD13aGF0KQorICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Cit9CisKKwordm9pZCBzdGFydF9zaW11bF9lZnVuKCkgeworICBtaXhlZCAqaW5mbzsKKworICAvLyBGYWxscyBub2NoIG5pY2h0IGdldGFuLCBleHRyYV93aXppbmZvIGluaXRpYWxpc2llcmVuCisgIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQorICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKKworICBJbml0TGl2aW5nRGF0YShpbmZvKTsKKworICBzZXRfbmV4dF9yZXNldCgxMCk7IC8vIGRpcmVrdCBtYWwgYXVmcmFldW1lbgorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisgIENsZWFuTGl2aW5nRGF0YSgpOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCitpbnQgYWJzb2x1dGVfaGJfY291bnQoKSB7CisgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Cit9CisjZW5kaWYKKwordm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKK3sKKyAgc3RyaW5nIHBhdGg7CisgIG9iamVjdCBvYmo7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGlmICghSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybjsKKyAgaWYgKG9iamVjdHAodGFyZ2V0KSkKKyAgeworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOworICAgIHJldHVybjsKKyAgfQorICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCisgICAgICAhY2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkgKQorICB7CisgICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYixvYmopOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKKyAgaW50IGk7CisgIG1peGVkICphOworCisgIGlmICghTE9SRF9TRUNVUklUWSkKKyAgICByZXR1cm47CisgIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKKyAgeworICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgYSA9IHdpemxpc3RfaW5mbygpOworICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc8LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOworICBybShmaWxlKTsKKyAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzcHJpbnRmKCIlLTExczogZXZhbD0lLThkIGNtZHM9JS02ZCBIQnM9JS01ZCBhcnJheT0lLTVkIG1hcHBpbmc9JS03ZFxuIiwKKyAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKKyAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7CisKKyAgaWYoIW9iamVjdHAob2IpKQorICAgIG9iPXByZXZpb3VzX29iamVjdCgpOworICAvLyBXZW5uIGVpbiBPYmpla3QgZ2VzdWNodCB3aXJkOiBBbGxlIEVudnMgZGllc2VzIE9iamVrdHMgZXJtaXR0ZWxuIHVuZAorICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgorICBpZihvYmplY3RwKHdoYXQpKSB7CisgICAgb2JqZWN0ICplbnZzPWFsbF9lbnZpcm9ubWVudCh3aGF0KTsKKyAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAorICAgIC8vIGVudGhhbHRlbi4KKyAgICBpZiAoIXBvaW50ZXJwKGVudnMpKSByZXR1cm4gMDsKKyAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7CisgIH0KKyAgLy8gc29uc3Qgd2lyZHMgdGV1cmVyLCB1ZWJlciBhbGxlIE9iamVrdGUgaW0gKGRlZXApIEludiBsYXVmZW4gdW5kIHBlciBpZCgpCisgIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCisgIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCisgIGVsc2UgaWYgKHN0cmluZ3Aod2hhdCkpIHsKKyAgICAgIGludCBjbnQ7CisgICAgICBzdHJpbmcgbmV3d2hhdDsKKyAgICAgIGlmKHNzY2FuZih3aGF0LCIlcyAlZCIsbmV3d2hhdCxjbnQpIT0yKQorICAgICAgIGNudD0xOworICAgICAgZWxzZQorICAgICAgIHdoYXQ9bmV3d2hhdDsKKyAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKKyAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKKyAgICAgICAgICAgcmV0dXJuIGludm9iOworICAgICAgfQorICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgorICAgICAgICAgIkV4cGVjdGVkIFwib2JqZWN0XCIgb3IgXCJzdHJpbmdcIiwgZ290ICUuNTBPLlxuIiwKKyAgICAgICAgIHdoYXQpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworbWFwcGluZyBkdW1wX2lwX21hcHBpbmcoKQoreworICByZXR1cm4gMDsKK30KKworbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQoreworICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKKyAgcmV0dXJuOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQoreworICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCisgICAgICB8fCAhQVJDSF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCisgIHsKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKHN0cik7CisgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKCk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChtaXhlZCBuZiwgaW50IHByaW8pIHsKKyAgb2JqZWN0IHBvLG9sZG87CisgIGludCBvbGRwcmlvOworICAKKyAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCisgICAgICAgICAiQXJndW1lbnQgd2FzOiAlLjUwTy4uLlxuIixuZikpOworICB9CisKKyAgLy8gZmFsbHMgZWluIE9iamVrdCBiZXJlaXRzIG5lbiBub3RpZnlfZmFpbCgpIHNldHp0ZSwgUHJpb3JpdGFldGVuIGFic2NoYWV0emVuCisgIC8vIHVuZCB2ZXJnbGVpY2hlbi4KKyAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKKyAgICBpZiAoIXByaW8pIHsgICAgICAgCisgICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJworICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCisgICAgICAgIHByaW89TkZfTkxfT1dOOworICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKKyAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgICBlbHNlIGlmICgoaW50KXBvLT5Jc1Jvb20oKSkKKyAgICAgICAgcHJpbz1ORl9OTF9ST09NOworICAgICAgZWxzZQorICAgICAgICBwcmlvPU5GX05MX1RISU5HOworICAgIH0KKyAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KKyAgICBpZiAob2xkbz09UEwpCisgICAgICBvbGRwcmlvPU5GX05MX09XTjsKKyAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCisgICAgICBvbGRwcmlvPU5GX05MX0xJVklORzsKKyAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQorICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOworICAgIGVsc2UKKyAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7CisgIH0KKyAgZWxzZSAvLyB3ZW5uIGVzIG5vY2gga2VpbiBOb3RpZnlfZmFpbCBnaWJ0OgorICAgIG9sZHByaW89TkZfTkxfTk9ORTsKKworICAvL3ZlcmdsZWljaGVuIHVuZCBnZ2YuIHNldHplbgorICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAorICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgZWZ1bjo6bm90aWZ5X2ZhaWwobmYpOworICB9CisKKyAgcmV0dXJuOworfQorCit2b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQoreworICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKKyAgLy9kZXMgbGV0enRlbiBub3RpZnlfZmFpbCgpIHp1IGVybWl0dGVsbgorICBvYmplY3QgbzsKKyAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgorICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBlZnVuOjpub3RpZnlfZmFpbChzdHIpOworICByZXR1cm47Cit9CisKK3N0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQoreworICBpbnQgaSxjaCxtYXh1bml0LGR1bW15OworICBzdHJpbmcgKnBhcnRzLCBmbXQ7CisKKyAgaW50IHNlY3MgPSB6ZWl0OworICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKKyAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7CisgIGludCBkYXlzID0gKHplaXQvODY0MDApOworICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKKyAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOworICBpbnQgYWJiciA9IDA7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQorICAgIHsKKyAgICBjYXNlICd4JzogY2FzZSAnWCc6CisgICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKKyAgICAgICAvLyBOTyBicmVhayAhCisgICAgY2FzZSAnbic6IGNhc2UgJ04nOgorICAgICAgIG1heHVuaXQgfD0gMzE7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6IGNhc2UgJ1cnOgorICAgICAgIG1heHVuaXQgfD0gMTU7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgIG1heHVuaXQgfD0gNzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgbWF4dW5pdCB8PSAzOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICBtYXh1bml0IHw9IDE7CisgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OworICBpZiggbWF4dW5pdCAmIDggKSBkYXlzICU9IDc7CisgIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OworICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOworICBpZiggbWF4dW5pdCApIHNlY3MgJT0gNjA7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgaWYoIGNoPT0neCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J3cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdtJzsKKyAgICAgIGVsc2UgY2ggPSAncyc7CisgICAgfQorICAgIGVsc2UgaWYoIGNoPT0nWCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J1cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdNJzsKKyAgICAgIGVsc2UgY2ggPSAnUyc7CisgICAgfQorICAgIAorICAgIHN3aXRjaCggY2ggKQorICAgIHsKKyAgICAgIGNhc2UgJ24nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1vbnRocyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOworICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2gnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGhvdXJzICk7IGJyZWFrOworICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdOJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKKyAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1cnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAod2Vla3M9PTEpID8gIldvY2hlIiA6ICJXb2NoZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJkIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ00nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobWlucz09MSkgPyAiTWludXRlIiA6ICJNaW51dGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAicyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgIHBhcnRzW2ldID0gIiUiOworICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Cit9CisKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCit7CisgIHN0cmluZyBlcnI7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgbTsKKyAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/CisgIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQorICAgICAgY2F0Y2goZGVzdHJ1Y3Qob2IpO3B1Ymxpc2gpOworICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7CisgIGlmIChlcnIpCisgIHsKKyAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKKyAgcmV0dXJuIG07Cit9CisKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKK3sKKyAgaW50ICpsZXZlbDsKKyAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCisgIC8venVydWVja2dlYmVuLiBaZXJzdG9lcnRlIE9iamVrdGUgKFNlbGJzdHplcnN0b2VyZXIpIGZ1ZWhyZW4genVyIFJ1ZWNrZ2FiZQorICAvL3ZvbiAwLgorICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKKyAgLy93ZW5uIGVzIGtlaW5lbiBJbnRlcmFjdGl2ZSBnaWJ0LiBEaWUgMCBmdWVocnQgZGFubiB3aWUgYmVpIHplcnN0b2VydGVuCisgIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCisgIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KKyAgbGV2ZWw9bWFwKGNhbGxlcl9zdGFjaygxKSxmdW5jdGlvbiBpbnQgKG9iamVjdCBjYWxsZXIpCisgICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKKyAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOworICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCisgICAgICB9ICk7CisgIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCit9CisKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQoreworICBzdHJpbmcgZXVpZDsKKworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSkgLy8gRXMgbXVzcyBlaW5lbiBpbnRlcmFjdGl2ZSBnZWJlbgorICAgICByZXR1cm4gMDsKKyAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIC8vIHVlYmVyIGFsbGUgQ2FsbGVyIGl0ZXJpZXJlbi4gV2VubiBlaW5lcyBkYXZvbiBlaW5lIGFuZGVyZSBldWlkIGhhdCBhbHMKKyAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KKyAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgorICBmb3JlYWNoKG9iamVjdCBjYWxsZXI6IGNhbGxlcl9zdGFjaygpKSB7CisgICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAorICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQorICAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgorfQorCisvLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KKy8vIERhcyBzb2xsIGRhenUgZGllbmVuLCBkYXNzIGFsbGUgZ2dmLiBlaW4gRU9SIGFtIFByb21wdGVuZGUga3JpZWdlbi4uLgorLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKK3ZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkICphcnI7CisgICAgaW50IGk7CisKKyAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKKyAgICAvLyB2b3Jrb21tdC4uLgorICAgIGlmICggZmxhZ3MmSU5QVVRfUFJPTVBUICkgeyAgICAKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCisgICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncywgIiIgfSkgKyBhcmdzOworICAgIH0KKworICAgIC8vIEFycmF5cyBnZWdlbiBmbGF0dGVuIHF1b3Rlbi4KKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKKyAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQorICAgICAgICAgICBhcnJbaV0gPSBxdW90ZShhcnJbaV0pOworCisgICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2VmdW46OmlucHV0X3RvLyonKi8gfSkgKyBhcnIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOworfQorLy8jZW5kaWYKKworbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCisvLyBlcmhvZWh0IGRhcyBMaWNodGxldmVsIGVpbmVzIE9iamVrdHMgdW0gaQorLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKK3sKKyAgICBvYmplY3Qgb2IsICppbnY7CisgICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7CisKKyAgICBpZiAoIShvYj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOyAvLyBvaG5lIGRhcyBnZWh0cyBuaWNodC4KKworICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgorICAgIGlmIChpIT0wKSBvYi0+U2V0UHJvcChQX0xJR0hULCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpK2kpOworCisgICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCisgICAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCk7Cit9CisKKworcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgICAgIHJldHVybiAiIjsKKworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIuQiLCAiYWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIsQiLCAiQWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIt8iLCAic3MiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7CisKKyAgICByZXR1cm4gc3RyOworfQorCisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKK3sKKyAgICBzdHJpbmcgcmV0OworCisgICAgaWYgKCAhcG9pbnRlcnAocykgKQorICAgICAgIHJldHVybiAiIjsKKyAgICAKKyAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKKyAgICBpZiAoIWxhc3RzZXApIGxhc3RzZXAgPSAiIHVuZCAiOworCisgICAgc3dpdGNoIChzaXplb2YocykpICB7CisgICAgICAgY2FzZSAwOiByZXQ9IiI7IGJyZWFrOworICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGltcGxvZGUoc1swLi48Ml0sIHNlcCk7CisgICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBxdWVyeV9uZXh0X3Jlc2V0KG9iamVjdCBvYikgeworCisgICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KKyAgICBpZiAob2IgJiYgIW9iamVjdHAob2IpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCisgICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7CisKKyAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworfQorCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisjZGVmaW5lIE1BWExFTiA1MDAwMAorbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCit7CisKKyAgaW50IHB0cjsKKyAgc3RyaW5nIGJ5dGVzOworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmICghc2l6ZW9mKHNvdXJjZSl8fCFzaXplb2YoZGVzdCl8fHNvdXJjZT09ZGVzdHx8KGZpbGVfc2l6ZShzb3VyY2UpPT0tMSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwicmVhZF9maWxlIixwcmV2aW91c19vYmplY3QoKSkpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQorICB7CisgIGNhc2UgLTE6CisgICAgYnJlYWs7CisgIGNhc2UgLTI6CisgICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKKyAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpPT0tMikgcmV0dXJuIDE7CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOworICBkZWZhdWx0OgorICAgIGlmICghcm0oZGVzdCkpIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGRvCisgIHsKKyAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47CisgICAgaWYgKCFieXRlcykgYnl0ZXM9IiI7CisgICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7CisgIH0KKyAgd2hpbGUoc2l6ZW9mKGJ5dGVzKSA9PSBNQVhMRU4pOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKworCisvLyAjIyMgRXJzYXR6YXVmbG9lc3VuZyBpbiBTdHJpbmdzICMjIwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgeworICBpbnQgaTsKKyAgc3RyaW5nICpwYXJ0czsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7CisgIGkgPSBzaXplb2YocGFydHMpOworCisgIGlmIChpPjEpIHsKKyAgICBpbnQgaiwgdDsKKyAgICBjbG9zdXJlICpuYW1lX2NsczsKKworICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7CisKKyAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7CisgICAgd2hpbGUgKGotLSkKKyAgICAgIGlmIChvYmplY3RwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKKyAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBvYnNbal07CisKKyAgICB3aGlsZSAoKGktPSAyKT4wKSB7CisgICAgICBpbnQgb2JfbnI7CisgICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCisgICAgICBvYl9uciA9IHBhcnRzW2ldWzwxXS0nMSc7CisgICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgeworICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJyZXBsYWNlX3BlcnNvbmFsOiB1c2luZyB3cm9uZyBvYmplY3QgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iX25yKSk7CisgICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgICAgICB9CisKKyAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KKyAgICAgIGludCBjYXN1czsKKyAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07CisgICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKKyAgICAgICAgY2FzZSAnUic6IGNhc3VzID0gV0VSOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6IGNhc3VzID0gV0VOOyAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKKyAgICAgIH0KKworICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKKyAgICAgIG1peGVkIHRtcDsKKyAgICAgIHN3aXRjaCAocGFydFszLi48Ml0pIHsKKyAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOworICAgICAgICBjYXNlICJSVSI6IGNhc2UgIlNTRU5VIjogY2FzZSAiTVUiOiBjYXNlICJOVSI6ICAgICAgICAgICAvLyB1bmJlc3RpbW10CisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRQSI6IGNhc2UgIlNTRU5RQSI6IGNhc2UgIk1RQSI6IGNhc2UgIk5RQSI6ICAgICAgIC8vIEFydGljbGUKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOworICAgICAgICAgIGlmIChzdHJpbmdwKHRtcCkgJiYgISh0bXBbPDFdXicgJykpIAorICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUyI6IGNhc2UgIlNTRU5RUFBNUyI6IGNhc2UgIk1RUFBNUyI6IGNhc2UgIk5RUFBNUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVAiOiBjYXNlICJTU0VOUVBQTVAiOiBjYXNlICJNUVBQTVAiOiBjYXNlICJOUVBQTVAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQorICAgICAgaWYgKHN0cmluZ3AodG1wKSkKKyAgICAgICAgcGFydHNbaV0gPSB0bXA7CisKKyAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgorICAgICAgaWYgKGNhcHMpCisgICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkgeworICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKKyAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKKyAgICAgICAgICBjYXNlICIuXG4iOiBjYXNlICIhXG4iOiBjYXNlICI/XG4iOgorICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgorICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCitkZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFzdHJpbmdwKHN0cikpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIGV4dHJhY3QoKTogJU8iLHN0cikpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihzdHIpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXBvaW50ZXJwKGFycmF5KSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKGFycmF5KTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorZGVwcmVjYXRlZCBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKSB7CisKKyAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsaXRlbSkpOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyx0b19pbnQoaXRlbSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKKworLy8gVGhlIGRpZ2l0IGF0IHRoZSBpJ3RoIHBvc2l0aW9uIGlzIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gJ2knLgorc3RyaW5nIGNvdW50X3RhYmxlID0KKyAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7CitpbnQgYnJva2VuX2NvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIGludCBpLCByZXM7CisgICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7CisgICAgZm9yKCA7IGktLT4wOyApIHsKKyAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KKyAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCitpbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgcmV0dXJuKGJyb2tlbl9jb3VudF9iaXRzKHMpKTsKK30KKyNlbmRpZgorCisKKy8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKK2RlcHJlY2F0ZWQgbWl4ZWQgKmV4Y2x1ZGVfYXJyYXkobWl4ZWQgKmFycixpbnQgZnJvbSxpbnQgdG8pCit7CisgIGlmICh0bzxmcm9tKQorICAgIHRvID0gZnJvbTsKKyAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9SRUFETUUgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL1JFQURNRQpAQCAtMCwwICsxLDIwIEBACitzaW11bF9lZnVuIAorLS0tLS0tLS0tLSAKK0RhcyBzaW11bF9lZnVuIE9iamVrdCAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biBiZW51dHp0IGRpZSBEYXRlaWVuCitpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCitJbSBWZXJ6ZWljaG5pcyAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUgaXN0IGVpbmUgU2ljaGVyaGVpdHNrb3BpZSB2b24gYWxsZW4gCitEYXRlaWVuIGluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KKworRmFsbHMgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBuaWNodCBsYWRiYXIgaXN0LCB3aXJkIAorL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBhbHMgRXJzYXR6IHZlcnN1Y2h0LiBXZW5uIGF1Y2ggZGFzCituaWNodCBsYWRiYXIgaXN0LCBlcmZvbGd0IGVpbiBTaHV0ZG93biBkZXMgTXVkcy4KKworQmVpIEFlbmRlcnVuZ2VuIHNvbGx0ZSBfenVlcnN0XyBkaWUgbm9ybWFsZSBzaW11bCBlZnVuIGVkaXRpZXJ0IHVuZAorYW5zY2hsaWVzc2VuZCB6ZXJzdG9lcnQvZW50bGFkZW4gd2VyZGVuLCB3b3JhdWZoaW4gc2llIGltcGxpeml0IGR1cmNoIGRlbgorRHJpdmVyIHVuZCBNYXN0ZXIgbmV1Z2VsYWRlbiB3aXJkLiBJc3QgZGllcyBlcmZvbGdyZWljaCB1bmQgZGllIG5ldWUKK3NpbXVsX2VmdW4gbGFldWZ0IChlcnN0IGRhbm4hKSBrb3BpZXJ0IG1hbiBkaWUgRGF0ZWllbiBhdXMgCisvc2VjdXJlL3NpbXVsX2VmdW4gbmFjaCAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUuCisKK0RpZSBEYXRlaWVuIGhpZXIgc2luZCBtaXQgQXVzbmFobWUgZGVyIHNpbXVsX2VmdW4uYyBzZWxic3QgX25pY2h0XyBkYXp1IAorZ2VkYWNodCwgZ2VsYWRlbiB6dSB3ZXJkZW4uCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI1OThjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvY29tbS5jCkBAIC0wLDAgKzEsMTI1IEBACisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKworLy8gU2VuZGV0IGFuIGFsbGUgT2JqZWt0ZSBpbiByb29tIHVuZCByb29tIHNlbGJlciBkdXJjaCBBdWZydWYgdm9uCisvLyBSZWNlaXZlTXNnKCkuCit2YXJhcmdzIHZvaWQgc2VuZF9yb29tKG9iamVjdHxzdHJpbmcgcm9vbSwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX2FjdGlvbiwgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCAqZXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yaWdpbikKK3sKKyAgaWYgKHN0cmluZ3Aocm9vbSkpCisgICAgcm9vbT1sb2FkX29iamVjdChyb29tKTsKKyAgCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOworCisgIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKKyAgcm9vbS0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworfQorCitzdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCit7CisgICAgc3RyaW5nICppZ25vcmU7CisKKyAgICBpZiAoICFlbnZpcm9ubWVudChvYikgKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNpemVvZiggcmVnZXhwKCAoeyBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQob2IpICkgfSksIHBhdCApICk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBzaG91dCggc3RyaW5nIHMsIG1peGVkIHdoZXJlICl7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyAqcGZhZGU7CisKKyAgICBpZiAoICFzaXplb2YoIHUgPSB1c2VycygpIC0gKHsgdGhpc19wbGF5ZXIoKSB9KSApICkKKyAgICAgICByZXR1cm47CisKKyAgICBpZiAoICF3aGVyZSApCisgICAgICAgcGZhZGUgPSAoeyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIGludHAod2hlcmUpICkKKyAgICAgICBwZmFkZSA9CisgICAgICAgICAgICh7IGltcGxvZGUoIGVmdW46OmV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi4yXSwgIi8iICkgKyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIHN0cmluZ3Aod2hlcmUpICkKKyAgICAgICBwZmFkZSA9ICh7IHdoZXJlIH0pOworICAgIGVsc2UKKyAgICAgICBwZmFkZSA9IHdoZXJlOworCisgICAgdSA9IGZpbHRlciggdSwgIl9zaG91dF9maWx0ZXIiLCBNRSwgaW1wbG9kZSggcGZhZGUsICJ8IiApICk7CisgICAgdS0+UmVjZWl2ZU1zZyhzLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9XUkFQfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgTUFfU0hPVVRfU0VGVU4sIDAsIHByZXZpb3VzX29iamVjdCgpKTsKK30KKworCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biBjYXQoKS4KKyNkZWZpbmUgQ0FUX01BWF9MSU5FUyA1MAordmFyYXJncyBpbnQgY2F0KHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIGludCBudW0pCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpbnQgbW9yZTsKKworICAgIGlmIChudW0gPCAwIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghc3RhcnQpCisgICAgICAgIHN0YXJ0ID0gMTsKKworICAgIGlmICghbnVtIHx8IG51bSA+IENBVF9NQVhfTElORVMpIHsKKyAgICAgICAgbnVtID0gQ0FUX01BWF9MSU5FUzsKKyAgICAgICAgbW9yZSA9IHNpemVvZihyZWFkX2ZpbGUoZmlsZSwgc3RhcnQrbnVtLCAxKSk7CisgICAgfQorCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfZmlsZShmaWxlLCBzdGFydCwgbnVtKTsKKyAgICBpZiAoIXR4dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgaWYgKG1vcmUpCisgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICIqKioqKlRSVU5DQVRFRCoqKipcbiIpOworCisgICAgcmV0dXJuIHNpemVvZih0eHQgJiAiXG4iKTsKK30KKyN1bmRlZiBDQVRfTUFYX0xJTkVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gdGFpbCgpLgorI2RlZmluZSBUQUlMX01BWF9CWVRFUyAxMDAwCit2YXJhcmdzIGludCB0YWlsKHN0cmluZyBmaWxlKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyB0eHQgPSByZWFkX2J5dGVzKGZpbGUsIC0oVEFJTF9NQVhfQllURVMgKyA4MCksIChUQUlMX01BWF9CWVRFUyArIDgwKSk7CisgICAgLy8gcmVhZF9ieXRlcygpIHJldHVybnMgMCBpZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZ2l2ZW4gYnkKKyAgICAvLyBwYXJhbWV0ZXIgIzIgbGllcyBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHRyeSBhbmQgcmVhZCB0aGUgZW50aXJlIGZpbGUuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkgJiYgZmlsZV9zaXplKGZpbGUpIDwgVEFJTF9NQVhfQllURVMrODApCisgICAgICB0eHQgPSByZWFkX2ZpbGUoZmlsZSk7CisgICAgLy8gRXhpdCBpZiBzdGlsbCBub3RoaW5nIGNvdWxkIGJlIHJlYWQuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIGN1dCBvZmYgZmlyc3QgKGluY29tcGxldGUpIGxpbmUKKyAgICBpbnQgaW5kZXggPSBzdHJzdHIodHh0LCAiXG4iKTsKKyAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICBpZiAoaW5kZXggKyAxIDwgc2l6ZW9mKHR4dCkpCisgICAgICAgICAgICB0eHQgPSB0eHRbaW5kZXgrMS4uXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHh0ID0gIiI7CisgICAgfQorCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIHJldHVybiAxOworfQorI3VuZGVmIFRBSUxfTUFYX0JZVEVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDdjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBkZWJ1Z19pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRlYnVnX2luZm8pCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworbWl4ZWQgZGVidWdfaW5mbyhpbnQgd2hhdCwgdmFyYXJncyBtaXhlZCogYXJncykKK3sKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIGRlYnVnX2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIERJTkZPX09CSkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKyAgICAgICAgICAgIHByaW50ZigiT19IRUFSVF9CRUFUICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fRU5BQkxFX0NPTU1BTkRTIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0NMT05FICAgICAgICAgICA6ICVzXG4iLCBlZnVuOjpjbG9uZXAob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19ERVNUUlVDVEVEICAgICAgOiBGQUxTRVxuIik7CisgICAgICAgICAgICBwcmludGYoIk9fU1dBUFBFRCAgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKSAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX09OQ0VfSU5URVJBQ1RJVkU6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVNFVF9TVEFURSAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKSAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fV0lMTF9DTEVBTl9VUCAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKSAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFUExBQ0VEICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9yZXNldCAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX29mX3JlZiA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJyZWYgICAgICAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpKTsKKworICAgICAgICAgICAgaW50IGd0aWNrcyA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgaWYoZ3RpY2tzKQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZCUwOWRcbiIsIGd0aWNrcywgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworCisgICAgICAgICAgICBwcmludGYoInN3YXBfbnVtICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSkpOworICAgICAgICAgICAgcHJpbnRmKCJuYW1lICAgICAgICA6ICclcydcbiIsICAgICBlZnVuOjpvYmplY3RfbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJsb2FkX25hbWUgICA6ICclcydcbiIsICAgICBlZnVuOjpsb2FkX25hbWUob2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IG5leHRfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgaWYgKG5leHRfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJuZXh0X2FsbCAgICA6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKG5leHRfb2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IHByZXZfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgaWYgKHByZXZfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJQcmV2aW91cyBvYmplY3QgaW4gb2JqZWN0IGxpc3Q6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKHByZXZfb2IpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlRoaXMgb2JqZWN0IGlzIHRoZSBoZWFkIG9mIHRoZSBvYmplY3QgbGlzdC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHJlZidzICUzZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKSk7CisgICAgICAgICAgICBwcmludGYoIk5hbWU6ICclcydcbiIsICAgICAgICAgIGVmdW46OnByb2dyYW1fbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHNpemUgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSBmdW5jJ3M6ICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSB2YXJzOiAgICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIHN0cmluZ3M6ICUzZCAoJTRkKSA6IG92ZXJoZWFkICVkICsgZGF0YSAlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSArIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gaW5oZXJpdHMgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCkpOworCisgICAgICAgICAgICBwcmludGYoInRvdGFsIHNpemUgICAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkYXRhIHNpemUgICAgICAgJTZkICglNmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fT0JKTElTVDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAwKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCAqIG9icyA9IGVmdW46Om9iamVjdHMoYXJnc1swXSwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9ic1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NQUxMT0M6CisgICAgICAgICAgICB3cml0ZShkZWJ1Z19pbmZvKERJTkZPX1NUQVRVUywgIm1hbGxvYyIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRElORk9fU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd2hpY2g7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpIHx8ICFhcmdzWzBdKQorICAgICAgICAgICAgICAgIHdoaWNoID0gIiI7CisgICAgICAgICAgICBlbHNlIGlmKHN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaCh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhvcHQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJkZXN0cnVjdGVkIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFNfREVTVFJVQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJvcGNvZGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09QQ09ERVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWVtb3J5IjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgJyVzJyB0byBkZWJ1Z19pbmZvKERJTkZPX0RVTVApLlxuIiwgYXJnc1swXSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmR1bXBfZHJpdmVyX2luZm8ob3B0LCBhcmdzWzEuLjFdLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAzIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TVEFUVVM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TVEFUVVNfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TSEFET1dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TSEFET1dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQUEVEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUF9TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19MSVNUXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX0xJU1QpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTkVXTFlfREVTVF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ORVdMWV9ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0RFU1RSVUNURURdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19QUk9DRVNTRURdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0FWR19QUk9DXSAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NMT1RTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVF9UQUJMRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9PQkpTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX0FDVElWRV9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTX1RPVEFMXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0xPVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9QUk9DRVNTRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0FWR19QUk9DXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX0hFQVJUQkVBVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVFNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVF9TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQ0FMTE9VVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BUlJBWVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FSUkFZUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU19TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSFlCUklEX01BUFBJTkdTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IWUJSSUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hBU0hfTUFQUElOR1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSEFTSCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUX1RZUEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RfVFlQRVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUFBFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQX1NJWkVdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VTRVJfUkVTRVJWRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9VU0VSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVNURVJfUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfTUFTVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TWVNURU1fUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfU1lTVEVNKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FERF9NRVNTQUdFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVTU0FHRVNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU19JTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX0lOKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV9JTl0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX0lOKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFlfSElUU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfSElUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1ZJUlRVQUxfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1RBQkxFX1NJWkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfT1ZFUkhFQURdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5dICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTX0JZVkFMVUVdICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl9CWVZBTFVFXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ0hBSU5TXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TTE9UU19VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQURERURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX0FEREVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfREVMRVRFRF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX1JFTU9WRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DT0xMSVNJT05TXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0NPTExJU0lPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF9CWVZBTFVFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfVkFMVUUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfQ0FDSEVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUVVFU1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0ZPVU5EXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0NPTExdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfQ09MTElTSU9OUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9GSUxFXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfRklMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfU1dBUF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX1NXQVApOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQk9PVF9USU1FXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0JPT1RfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfU1dBUDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NXQVBfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VTlNXQVBQRURdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSU10gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUl9TSVpFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV0gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GSUxFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVVU0VEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfUkVVU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hFU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSF9MRU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSEVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hfTEVOXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfQ09NUEFDVF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERDX1NXQVBfQ09NUEFDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRUNZQ0xFX0ZSRUVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1dBUF9SRUNZQ0xFX1BIQVNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9NRU1PUlk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9NRU1PUllfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9OQU1FXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfQUxMT0NBVE9SX05BTUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TVUNDRVNTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExfU1VDQ0VTU0VTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9JTkNSRU1FTlRfU0laRV9DQUxMX0RJRkZTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9PVkVSSEVBRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQUxMT0NBVEVEXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1VTRURdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9UT1RBTF9VTlVTRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VTlVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19GVUxMKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTX1JFUV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfUkVRX1NVQ0NFU1NdICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMX1RBUkdFVF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19JTlNQRUNURURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX0lOU1BFQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfTUVSR0VEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19NRVJHRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX1JFU1VMVF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfUkVTVUxUSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQVZMX05PREVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZSRUVfQkxPQ0tTX0FWTF9OT0RFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0VYVF9TVEFUSVNUSUNTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9FWFRFTkRFRF9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIGRlYnVnX2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fVFJBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IERJVF9DVVJSRU5UOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlQpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1VOQ0FVR0hUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9VTkNBVUdIVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9TVFJfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfQVNfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlRfREVQVEg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0RFUFRIKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRVZBTF9OVU1CRVI6CisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfRVZBTF9OVU1CRVIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWM5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIGVuYWJsZV9jb21tYW5kcygpCisgKiBhbmQgZGlzYWJsZV9jb21tYW5kcygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworI2lmICEgX19FRlVOX0RFRklORURfXyhlbmFibGVfY29tbWFuZHMpCisKK3ZvaWQgZW5hYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDEpOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcihvYik7Cit9CisKKyNlbmRpZgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRpc2FibGVfY29tbWFuZHMpCisKK3ZvaWQgZGlzYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvaGFzaC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9oYXNoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisKK2RlcHJlY2F0ZWQgc3RyaW5nIG1kNShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfTUQ1LCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQorCitkZXByZWNhdGVkIHN0cmluZyBzaGExKG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9TSEExLCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvbGl2aW5ncy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvbGl2aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9saXZpbmdzLmMKQEAgLTAsMCArMSwzNDggQEAKKy8vICogbGl2aW5nX25hbWUtQmVoYW5kbHVuZworCisjZGVmaW5lIGNsZWFuX2xvZyhzKQorLy8jZGVmaW5lIGNsZWFuX2xvZyhzKSBsb2dfZmlsZSgiQ0xFQU5fU0lNIixjdGltZSh0aW1lKCkpWzQuLjE4XSsiOiAiKyhzKSk7CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGl2aW5nX25hbWVfbSwgbmFtZV9saXZpbmdfbSwgbmV0ZGVhZDsKKworcHJpdmF0ZSB2b2lkIEluaXRMaXZpbmdEYXRhKG1peGVkIHdpemluZm8pIHsKKyAgLy8gbGl2aW5nX25hbWUgaXN0IGVpbiBQb2ludGVyIGRlciBhdWNoIGluIGRlciBleHRyYV93aXppbmZvIGdlaGFsdGVuIAorICAvLyB3aXJkLCBzbyBrYW5uIGRpZSBzaW11bF9lZnVuIG5ldSBnZWxhZGVuIHdlcmRlbiwgb2huZSBkYXNzIGRpZXNlcworICAvLyBNYXBwaW5nIHZlcmxvcmVuIGdlaHQKKyAgaWYgKCFtYXBwaW5ncChsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0pKQorICAgIGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gR2xlaWNoZXMgZ2lsdCBmdWVyIGRhcyBNYXBwaW5nIE5hbWUtTGl2aW5nCisgIGlmICghbWFwcGluZ3AobmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddKSkKKyAgICBuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIE5ldHp0b3RlIHNpbmQgZWJlbmZhbGxzIGluIGRlciBleHRyYV93aXppbmZvCisgIGlmICghbWFwcGluZ3AobmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdKSkKKyAgICBuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0gPSAoW10pOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgZ2V0dXVpZCggb2JqZWN0IG9iICkKK3sKKyAgICBtaXhlZCAqcmV0OworCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICByZXQgPSAobWl4ZWQpbWFzdGVyKCktPmdldF91c2VyaW5mbyggZ2V0dWlkKG9iKSApOworCisgICAgaWYgKCAhcG9pbnRlcnAocmV0KSB8fCBzaXplb2YocmV0KSA8IDUgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgLy8gVXNlcm5hbWUgKyAiXyIgKyBDcmVhdGlvbkRhdGUKKyAgICByZXR1cm4gcmV0WzBdICsgIl8iICsgcmV0WzVdOworfQorCit2b2lkIHNldF9vYmplY3RfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUsIG9iamVjdCBvYmopCit7CisgIHN0cmluZyBvbGQ7CisgIG1peGVkIGE7CisgIGludCBpOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKT09b2JqIHx8IHByZXZpb3VzX29iamVjdCgpPT10aGlzX29iamVjdCgpIHx8CisgICAgICBwcmV2aW91c19vYmplY3QoKT09bWFzdGVyKCkpCisgIHsKKyAgICBpZighbGl2bmFtZSB8fCAhc3RyaW5ncChsaXZuYW1lKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIiVPOiBpbGxlZ2FsIGxpdmluZyBuYW1lOiAlT1xuIiwgb2JqLCBsaXZuYW1lKSk7CisgICAgfQorICAgIGlmIChvbGQgPSBsaXZpbmdfbmFtZV9tW29ial0pIHsKKyAgICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtvbGRdKSkgeworICAgICAgIGFbbWVtYmVyKGEsIG9iaildID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwgb2xkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGl2aW5nX25hbWVfbVtvYmpdID0gbGl2bmFtZTsKKyAgICBpZiAoYSA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pIHsKKyAgICAgIGlmICghcG9pbnRlcnAoYSkpIHsKKyAgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gKHthLCBvYmp9KTsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gcmVhbGxvY2F0ZSBlbnRyeSBmcm9tIGRlc3RydWN0ZWQgb2JqZWN0ICovCisgICAgICBpZiAoKGkgPSBtZW1iZXIoYSwgMCkpID49IDApIHsKKyAgICAgICBhW2ldID0gb2JqOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBhICsgKHtvYmp9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IG9iajsKKyAgfQorfQorCit2b2lkIHNldF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSkKK3sKKyAgc2V0X29iamVjdF9saXZpbmdfbmFtZShsaXZuYW1lLHByZXZpb3VzX29iamVjdCgpKTsKK30KKwordm9pZCByZW1vdmVfbGl2aW5nX25hbWUoKQoreworICBzdHJpbmcgbGl2bmFtZTsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgaWYgKGxpdm5hbWU9bGl2aW5nX25hbWVfbVtwcmV2aW91c19vYmplY3QoKV0pCisgIHsKKyAgICBtX2RlbGV0ZShsaXZpbmdfbmFtZV9tLHByZXZpb3VzX29iamVjdCgpKTsKKyAgICBpZiAob2JqZWN0cChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBpZiAobmFtZV9saXZpbmdfbVtsaXZuYW1lXT09cHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0tPSh7cHJldmlvdXNfb2JqZWN0KCl9KTsKKyAgICAgIGlmICghc2l6ZW9mKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX3NldF9uZXRkZWFkKCkKK3sKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIG5ldGRlYWRbZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV09cHJldmlvdXNfb2JqZWN0KCk7Cit9CisKK3ZvaWQgX3JlbW92ZV9uZXRkZWFkKCkKK3sKKyAgbV9kZWxldGUobmV0ZGVhZCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKK30KKworb2JqZWN0IGZpbmRfbmV0ZGVhZChzdHJpbmcgdXVpZCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisgCisgIGlmIChpc191dWlkICYmIGdldHV1aWQobmV0ZGVhZFt1aWRdKSAhPSB1dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIG5ldGRlYWRbdWlkXTsKK30KKworc3RyaW5nICpkdW1wX25ldGRlYWQoKQoreworICByZXR1cm4gbV9pbmRpY2VzKG5ldGRlYWQpOworfQorCitvYmplY3QgZmluZF9saXZpbmcoc3RyaW5nIGxpdm5hbWUpIHsKKyAgbWl4ZWQgKmEsIHI7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChyID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpIHsKKyAgICBpZiAobWVtYmVyKHIsMCk+PTApCisgICAgICByLT0oezB9KTsKKyAgICBpZiAoIXNpemVvZihyKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfbGl2aW5nIGxvZXNjaHQgJXNcbiIsbGl2bmFtZSkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWxpdmluZyhyID0gKGEgPSByKVswXSkpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihhKTsgLS1pOykgeworICAgICAgIGlmIChsaXZpbmcoYVs8aV0pKSB7CisgICAgICAgICByID0gYVs8aV07CisgICAgICAgICBhWzxpXSA9IGFbMF07CisgICAgICAgICByZXR1cm4gYVswXSA9IHI7CisgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gbGl2aW5nKHIpICYmIHI7Cit9CisKK29iamVjdCAqZmluZF9saXZpbmdzKHN0cmluZyBsaXZuYW1lKQoreworICBtaXhlZCByOworCisgIGlmIChwb2ludGVycChyPW5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHItPSh7MH0pOworICBlbHNlCisgICAgaWYgKG9iamVjdHAocikpCisgICAgICByPSh7cn0pOworICBpZiAoIXBvaW50ZXJwKHIpfHwhc2l6ZW9mKHIpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcjsKK30KKworb2JqZWN0IGZpbmRfcGxheWVyKHN0cmluZyB1dWlkKSB7CisgIG9iamVjdCAqb2JqczsKKyAgbWl4ZWQgcmVzOworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoIXN0cmluZ3AodXVpZCkpCisgICAgcmV0dXJuIDA7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisKKyAgaWYgKHBvaW50ZXJwKHJlcyA9IG5hbWVfbGl2aW5nX21bdWlkXSkpIHsKKyAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgZ2dmLiBlbnRmZXJuZW4KKyAgICBpZiAobWVtYmVyKHJlcywwKT49MCkgeworICAgICAgcmVzLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21bdWlkXSA9IHJlczsKKyAgICB9CisgICAgLy8gZ2dmLiBOYW1lbiBvaG5lIE9iamVrdGUgZW50ZmVybmVuLgorICAgIGlmICghc2l6ZW9mKHJlcykpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSx1aWQpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfcGxheWVyIGxvZXNjaHQgJXNcbiIsdWlkKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2JqcyA9IHJlczsKKyAgICByZXMgPSBvYmpzWzBdOworICAgIC8vIFdlbm4gZGFzIDAuIEVsZW1lbnQgZGVyIFNwaWVsZXIgaXN0LCBzaW5kIHdpciBmZXJ0aWcuIEFuc29uc3RlbiBzdWNoZW4KKyAgICAvLyB3aXIgZGVuIFNwaWVsZXIgdW5kIHNjaGllYmVuIGlobiBhbiBkaWUgMC4gU3RlbGxlIGltIEFycmF5LgorICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKG9ianMpOyAtLWk7KSB7CisgICAgICAgaWYgKG9ianNbPGldICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2Jqc1s8aV0pKSB7CisgICAgICAgICByZXMgPSBvYmpzWzxpXTsKKyAgICAgICAgIG9ianNbPGldID0gb2Jqc1swXTsKKyAgICAgICAgIG9ianNbMF0gPSByZXM7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSAob2JqZWN0cChyZXMpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgPyByZXMgOiAwOworICAgIH0KKyAgICAvLyBlbHNlOiBpbiByZXMgc3RlaHQgZGVyIFNwaWVsZXIgc2Nob24uCisgIH0KKyAgZWxzZSBpZiAob2JqZWN0cChyZXMpKSAvLyByIGlzdCBuZW4gRWluemVsb2JqZWt0CisgICAgcmVzID0gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpID8gcmVzIDogMDsKKworICAvLyByZXMgaXN0IGpldHp0IGdnZi4gZGVyIFNwaWVsZXIuIEFiZXIgd2VubiBkZXIgbmUgYW5kZXJlIGFscyBkaWUgZ2VzdWNodGUKKyAgLy8gVVVJRCBoYXQsIGlzdCBkYXMgRXJnZWJuaXMgdHJvdHpkZW0gMC4KKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChyZXMpIT11dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgLy8gZW5kbGljaCBnZWZ1bmRlbgorICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIGludCBjaGVja19tYXRjaCggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSApCit7CisgICAgbWl4ZWQgbWF0Y2g7CisKKyAgICBpZiAoICEobWF0Y2ggPSBuYW1lX2xpdmluZ19tW3N0cl0pICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKG1hdGNoKSApCisgICAgICAgbWF0Y2ggPSAoeyBtYXRjaCB9KTsKKworICAgIG1hdGNoIC09ICh7MH0pOworCisgICAgaWYgKCBzaXplb2YobWF0Y2gpICl7CisgICAgICAgaWYgKCBwbGF5ZXJzX29ubHkgKQorICAgICAgICAgICByZXR1cm4gc2l6ZW9mKGZpbHRlciggbWF0Y2gsICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZS8qJyovICkpCisgICAgICAgICAgICAgID4gMDsKKyAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1fZGVsZXRlKCBuYW1lX2xpdmluZ19tLCBzdHIgKTsKKyAgICBjbGVhbl9sb2coIHNwcmludGYoImNoZWNrX21hdGNoIGxvZXNjaHQgJXNcbiIsIHN0cikgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy9UT0RPOjogc3RyaW5nfHN0cmluZyogZXhjbHVkZQordmFyYXJncyBtaXhlZCBtYXRjaF9saXZpbmcoIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHksIG1peGVkIGV4Y2x1ZGUgKQoreworICAgIGludCBpLCBzOworICAgIG1peGVkIG1hdGNoLCAqdXNlcjsKKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAoZXhjbHVkZSkgKQorICAgICAgIGV4Y2x1ZGUgPSAoeyBleGNsdWRlIH0pOworCisgICAgaWYgKCBtZW1iZXIoZXhjbHVkZSwgc3RyKSA8IDAgJiYgY2hlY2tfbWF0Y2goc3RyLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICByZXR1cm4gc3RyOworCisgICAgdXNlciA9IG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKTsKKyAgICBzID0gc2l6ZW9mKHN0cik7CisgICAgbWF0Y2ggPSAwOworCisgICAgZm9yICggaSA9IHNpemVvZih1c2VyKTsgaS0tOyApCisgICAgICAgaWYgKCBzdHIgPT0gdXNlcltpXVswLi5zLTFdICYmIG1lbWJlciggZXhjbHVkZSwgdXNlcltpXSApIDwgMCApCisgICAgICAgICAgIGlmICggbWF0Y2ggKQorICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKCBjaGVja19tYXRjaCh1c2VyW2ldLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICAgICAgICAgICAgIG1hdGNoID0gdXNlcltpXTsKKworICAgIGlmICggIW1hdGNoICkKKyAgICAgICByZXR1cm4gLTI7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKK21peGVkICpkdW1wX2xpdmluZ3MoKQoreworICByZXR1cm4gc29ydF9hcnJheShtX2luZGljZXMobmFtZV9saXZpbmdfbSksIyc+KTsKK30KKworLy8gKiByZWdlbG1hZXNzaWcgTGlzdGVuIHZvbiBCYWxsYXN0IGJlZnJlaWVuCitwcml2YXRlIHZvaWQgY2xlYW5fbmFtZV9saXZpbmdfbShzdHJpbmcgKmtleXMsIGludCBsZWZ0LCBpbnQgbnVtKQoreworICBpbnQgaSwgajsKKyAgbWl4ZWQgYTsKKworICB3aGlsZSAobGVmdCAmJiBudW0tLSkKKyAgeworICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtrZXlzWy0tbGVmdF1dKSAmJiBtZW1iZXIoYSwgMCk+PTApCisgICAgeworICAgICAgYS09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW2tleXNbbGVmdF1dID0gYTsKKyAgICB9CisgICAgaWYgKCFhIHx8IChwb2ludGVycChhKSAmJiAhc2l6ZW9mKGEpKSkKKyAgICB7CisgICAgICBjbGVhbl9sb2coIlRvYXN0aW5nICIra2V5c1tsZWZ0XSsiXG4iKTsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIGtleXNbbGVmdF0pOworICAgIH0gZWxzZSBjbGVhbl9sb2coc3ByaW50ZigiS0VFUElORyAlcyAoJU8pXG4iLGtleXNbbGVmdF0scG9pbnRlcnAoYSk/c2l6ZW9mKGEpOmEpKTsKKyAgfQorICBpZiAobGVmdCkKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sIDEsIGtleXMsIGxlZnQsIDgwKTsKKyAgZWxzZQorICAgIGNsZWFuX2xvZygiQ2xlYW4gcHJvY2VzcyBmaW5pc2hlZFxuIik7Cit9CisKK3ByaXZhdGUgdm9pZCBjbGVhbl9uZXRkZWFkKCkgeworICBpbnQgaTsKKyAgc3RyaW5nICpzOworICBvYmplY3Qgb2I7CisKKyAgcz1tX2luZGljZXMobmV0ZGVhZCk7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkKKyAgICBpZiAoIW9iamVjdHAob2I9bmV0ZGVhZFtzW2ldXSkgfHwgaW50ZXJhY3RpdmUob2IpKQorICAgICAgbV9kZWxldGUobmV0ZGVhZCxzW2ldKTsKK30KKworcHJpdmF0ZSB2b2lkIENsZWFuTGl2aW5nRGF0YSgpIHsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tKSA8IDApIHsKKyAgICBjbGVhbl9sb2coIlN0YXJ0aW5nIGNsZWFuIHByb2Nlc3NcbiIpOworICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwKKyAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIDgwCisgICAgICAgICAgICAgICAgICk7CisgIH0KKyAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uZXRkZWFkLDIpOworfQorCisjdW5kZWYgY2xlYW5fbG9nCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2MwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gb2JqZWN0X2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGRyaXZlcl9pbmZvKSAvKiBOZXdlciB2ZXJzaW9uIGlzIHRoZXJlICovCisKKyNpbmNsdWRlIDxvYmplY3RpbmZvLmg+CisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworbWl4ZWQgb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgdmFyYXJncyBpbnQqIGluZGV4KQoreworICAgIG1peGVkICogcmVzdWx0OworCisgICAgaWYgKHNpemVvZihpbmRleCkgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIG9iamVjdF9pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIG9iamVjdF9pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBPSU5GT19CQVNJQzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lCX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSEVBUlRfQkVBVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9JU19XSVpBUkRdICAgICAgICAgPSAwOyAgIC8qIE5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfRU5BQkxFX0NPTU1BTkRTXSAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9DTE9ORV0gICAgICAgICAgICAgPSBlZnVuOjpjbG9uZXAob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ERVNUUlVDVEVEXSAgICAgICAgPSAwOyAgIC8qIE5vdCBwb3NzaWJsZSBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQUEVEXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX09OQ0VfSU5URVJBQ1RJVkVdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVTRVRfU1RBVEVdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfV0lMTF9DTEVBTl9VUF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApOworICAgICAgICAgICAgcmVzdWx0W09JQl9MQU1CREFfUkVGRVJFTkNFRF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFNQkRBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TSEFET1ddICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpICYmIDE7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFUExBQ0VEXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfUkVTRVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USU1FX09GX1JFRl0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFRl0gICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0dJR0FUSUNLU10gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USUNLU10gICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQX05VTV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUk9HX1NXQVBQRURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVkFSX1NXQVBQRURdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1ZBUl9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkFNRV0gICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9MT0FEX05BTUVdICAgICAgICAgPSBlZnVuOjpsb2FkX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUkVWX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0NMRUFOVVBdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9DTEVBTlVQX1RJTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX1BPU0lUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSVBfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JUF9ORVhUXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BSRVZdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUE9TXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BPUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSU1fTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JTV9SRUZdICAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05BTUVdICAgICAgICAgICAgICAgPSBlZnVuOjpwcm9ncmFtX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JTV9QUk9HX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9GVU5DVElPTlNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfRlVOQ1RJT05TXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fVkFSSUFCTEVTXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1ZBUklBQkxFU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1NUUklOR1NdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX0RBVEFdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5IRVJJVEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0lOSEVSSVRFRF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfU0laRV0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9EQVRBX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX0RBVEFfU0laRV0gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fSU5IRVJJVF0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19JTkhFUklUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fQ0xPTkVdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19DTE9ORSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX1NIQURPV10gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fU0hBRE9XKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOQ0xVREVTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5DTFVERUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSEFSRV9WQVJJQUJMRVNdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQVJFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplb2YoaW5kZXgpKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGluZGV4WzBdOworICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBvYmplY3RfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2VkaXRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfZWRpdGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50fG9iamVjdCBxdWVyeV9lZGl0aW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9FRElUSU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaWRsZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pZGxlKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnQgcXVlcnlfaWRsZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lETEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjMzExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pbnB1dF9wZW5kaW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lucHV0X3BlbmRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JTlBVVF9QRU5ESU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NGVhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIHF1ZXJ5X2lwX25hbWUoKSBhbmQKKyAqIHF1ZXJ5X2lwX251bWJlcigpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pcF9uYW1lKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9uYW1lKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05BTUUpOworfQorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9udW1iZXIob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTlVNQkVSKTsKK30KKworLy8gKiBIZXJrdW5mdHMtRXJtaXR0bHVuZworc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpCit7CisgIG9iPSBvYiB8fCB0aGlzX3BsYXllcigpOworICBpZiAoIW9iamVjdHAob2IpIHx8ICFpbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOworICBpZihvYi0+cXVlcnlfcmVhbGlwKCkgJiYgKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCkhPSIiKQorICB7CisgICAgcmV0dXJuIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpOworICB9CisgIHJldHVybiBfcXVlcnlfaXBfbnVtYmVyKG9iKTsKK30KKworc3RyaW5nIHF1ZXJ5X2lwX25hbWUobWl4ZWQgb2IpCit7CisgIGlmICggIW9iIHx8IG9iamVjdHAob2IpICkKKyAgICAgIG9iPV9xdWVyeV9pcF9udW1iZXIob2IpOworICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbGltaXRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xpbWl0cykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3ZhcmFyZ3MgaW50KiBxdWVyeV9saW1pdHMoaW50IGRlZikKK3sKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oZGVmID8gRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyA6IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisgICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitpbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKK3sKKyAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQorICAgIHsKKyAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7CisgICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCisgICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOworICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOworICAgIH0KKworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitpbnQgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2OWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7CisjZWxzZQorICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7CisjZW5kaWYKK30KKworbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7CisgIG9iamVjdCBzbm9vcGVyOworCisgIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7CisgIGlmICghc25vb3BlcikgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOworICByZXR1cm4gc25vb3BlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKworICAgIGlmICghZmxhZyA9PSAhaGIpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIgdGhhdCBhcmUgYWN0aXZhdGVkIHdpdGgKKyAqIHNldF9pc193aXphcmQoKS4gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBsYXllciBvYmplY3QuCisgKiBBbHNvIHNldF9pc193aXphcmQoKSBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXIgb2JqZWN0LAorICogbm90IGFzIGFuIChzaW11bC0pZWZ1bi4KKyAqLworCisjaW5jbHVkZSA8Y29tbWFuZHMuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisvKiBpc193aXphcmQ6CisgKiAgMTogaGFzIGFjdGlvbnMsCisgKiAgMDogbmV2ZXIgaGFkIGFjdGlvbnMsCisgKiAtMTogaGFkIGFjdGlvbnMgb25jZS4KKyAqLworcHJpdmF0ZSBub3NhdmUgaW50IGlzX3dpemFyZDsKKworcHJpdmF0ZSBpbnQgZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX2R1bXBhbGxvYmooc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3cml0ZSgiRHVtcGluZyB0byAvT0JKX0RVTVAgLi4uICIpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFMpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgd3JpdGUoImRvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfb3BjZHVtcChzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09QQ09ERVMpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfc3RhdHVzKHN0cmluZyBzdHIpCit7CisgICAgaW50IG9wdDsKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKG9wdCkpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2V0X2lzX3dpemFyZCh2YXJhcmdzIDxvYmplY3R8aW50PiogYXJncykKK3sKKyAgICBpbnQgb2xkdmFsID0gaXNfd2l6YXJkOworCisgICAgaWYoIXNpemVvZihhcmdzKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDEgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihhcmdzWzBdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJPbmx5IHNldF9pc193aXphcmQgZm9yIHRoZSBjdXJyZW50IG9iamVjdCBzdXBwb3J0ZWRcbiIpOworICAgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRoZSBjdXJyZW50IG9iamVjdCBtdXN0IGJlIHRoaXNfcGxheWVyKCkgZm9yIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDIgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFhcmdzWzFdKQorICAgIHsKKyAgICAgICAgaWYoaXNfd2l6YXJkID4gMCkKKyAgICAgICAgICAgIGlzX3dpemFyZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmKHNpemVvZihhcmdzKSA9PSAyICYmIGFyZ3NbMV08MCkKKyAgICB7CisgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZighaXNfd2l6YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX21hbGxvYywgIm1hbGxvYyIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9kdW1wYWxsb2JqLCAiZHVtcGFsbG9iaiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9vcGNkdW1wLCAib3BjZHVtcCIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9zdGF0dXMsICJzdGF0dXMiLCBBQV9OT1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpc193aXphcmQgPSAxOworICAgIH0KKworICAgIHJldHVybiBvbGR2YWwgPiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKQEAgLTAsMCArMSwyMSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKwordmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKK3sKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7CisKKyAgICBpZighaW50cChwcm9tcHQpKQorICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKKworICAgIHJldHVybiBvbGRwcm9tcHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2hhZG93LmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCisgKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOworfQorCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgICAgaWYoZmxhZykKKyAgICB7CisgICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKKyAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKKworICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKK30KKyNlbHNlCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKK30KKyNlbmRpZgorCisKK3B1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7CisgIGlmIChmbGFnKQorICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIGVmdW46OnVuc2hhZG93KCk7Cit9CisKK3B1YmxpYyB2b2lkIHVuc2hhZG93KCkgeworICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKKyAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2ODc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYwpAQCAtMCwwICsxLDE5OTUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCisvLworLy8gJElkOiBzaW11bF9lZnVuLmMgNzQwOCAyMDEwLTAyLTA2IDAwOjI3OjI1WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEFic29sdXRlIFBmYWRlIGVyZm9yZGVybGljaCAtIHp1bSBaZWl0cHVua3QsIHdvIGRlciBNYXN0ZXIgZ2VsYWRlbgorLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCisKKyNkZWZpbmUgU05PT1BMT0dGSUxFICJTTk9PUCIKKyNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc3lzL3Nub29waW5nLmgiCisjaW5jbHVkZSAiL3N5cy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZXJxLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICIvc3lzL2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RpbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgorI2luY2x1ZGUgIi9zeXMvdGltZS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKyNpbmNsdWRlICIvc3lzL2lucHV0X3RvLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0cmluZyBkdGltZShpbnQgd2Fubik7Cit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspOworaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSk7Cit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKTsKK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYik7Citub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpOworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCk7Citub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKTsKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOworCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK3ZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK3ZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQoraW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZyk7CisjZW5kaWYKKworLy8gSW5jbHVkZSB0aGUgZGlmZmVyZW50IHN1YiAnbW9kdWxlcycgb2YgdGhlIHNpbXVsX2VmdW4KKyNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJlbmFibGVfY29tbWFuZHMuYyIKKyNpbmNsdWRlIF9fRElSX18iaGFzaC5jIgorI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9lZGl0aW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lkbGUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pcF9uYW1lLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xpbWl0cy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbXVkX3BvcnQuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgorI2luY2x1ZGUgX19ESVJfXyJzZXRfaGVhcnRfYmVhdC5jIgorI2lmIF9fQk9PVF9USU1FX18gPCAxNDU2MjYxODU5CisjaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKKyNlbmRpZgorI2luY2x1ZGUgX19ESVJfXyJzaGFkb3cuYyIKKyNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgorI2luY2x1ZGUgX19ESVJfXyJjb21tLmMiCisKKyNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCisjZGVmaW5lIExFVkVMKHgpIHF1ZXJ5X3dpel9sZXZlbCh4KQorI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK21peGVkIGR0aW1lX2NhY2hlID0gKHstMSwiIn0pOworCisjaWZkZWYgSU9TVEFUUworc3RydWN0IGlvc3RhdF9zIHsKKyAgc3RyaW5nIG9uYW1lOworICBpbnQgdGltZTsKKyAgaW50IHNpemU7Cit9OworbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKK21peGVkIHJlc3RvcmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwwKSB9KTsKKy8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgbG9nX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworCittaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CisgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7CisvKiAgICBjYXNlIDM6CisgICAgICByZXR1cm4gd3JpdGVmaWxlX3N0YXQ7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGxvZ19zdGF0OworICAgICAgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXZpb3VzX29iamVjdCgpCisgICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCisgICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKKyAgICAgICAgICAgICAmJiAob2IgIT0gdGhpc19wbGF5ZXIoKSB8fCBvYiAhPSB0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCisgICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCisgICAgICAgICAgICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBvYikpICkgKQorCisgICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGF1c2dlbG9nZ3Qgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKK30KKworCit2b2lkIF9fX3VwZG1hc3RlcigpCit7CisgICAgb2JqZWN0IG9iOworCisgICAgLy9zb2xsdGUgbmljaHQgamVkZXIgZHVlcmZlbi4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CisKKyAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CisgICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCisgICAgICAgIGdldF9kaXIoIi9zZWN1cmUvbWFzdGVyLyouYyIsR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRHxHRVRESVJfUEFUSCkpIHsKKyAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQorICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKKyAgICB9CisgICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOworICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CisgICAgbG9hZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIik7CisKKyAgICB3cml0ZSgiZG9uZS5cbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CisgIG1peGVkIHJldDsKKworICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuICI/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+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oYXJyYXkpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitkZXByZWNhdGVkIGludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpIHsKKworICBpZiAocG9pbnRlcnAoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyxpdGVtKSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLHRvX2ludChpdGVtKSkpOworICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gbWVtYmVyX2FycmF5KCk6ICVPIixhcnJheXN0cmluZykpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorCisvLyBUaGUgZGlnaXQgYXQgdGhlIGkndGggcG9zaXRpb24gaXMgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiAnaScuCitzdHJpbmcgY291bnRfdGFibGUgPQorICAgICIwMTEyMTIyMzEyMjMyMzM0MTIyMzIzMzQyMzM0MzQ0NTEyMjMyMzM0MjMzNDM0NDUyMzM0MzQ0NTM0NDU0NTU2IjsKK2ludCBicm9rZW5fY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgaW50IGksIHJlczsKKyAgICBpZiggIXN0cmluZ3AocykgfHwgIShpPXNpemVvZihzKSkgKSByZXR1cm4gMDsKKyAgICBmb3IoIDsgaS0tPjA7ICkgeworICAgICAgICAvLyBXZSBhcmUgY291bnRpbmcgNiBiaXRzIGF0IGEgdGltZSB1c2luZyBhIHByZWNvbXBpbGVkIHRhYmxlLgorICAgICAgICByZXMgKz0gY291bnRfdGFibGVbKHNbaV0tJyAnKSY2M10tJzAnOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY291bnRfYml0cykKK2ludCBjb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICByZXR1cm4oYnJva2VuX2NvdW50X2JpdHMocykpOworfQorI2VuZGlmCisKKworLy8gKiBUZWlsZSBhdXMgZWluZW0gQXJyYXkgZW50ZmVybmVuICoqKiBPQlNPTEVURQorZGVwcmVjYXRlZCBtaXhlZCAqZXhjbHVkZV9hcnJheShtaXhlZCAqYXJyLGludCBmcm9tLGludCB0bykKK3sKKyAgaWYgKHRvPGZyb20pCisgICAgdG8gPSBmcm9tOworICByZXR1cm4gYXJyWzAuLmZyb20tMV0rYXJyW3RvKzEuLl07Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL1JFQURNRSBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM0MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK3NpbXVsX2VmdW4gCistLS0tLS0tLS0tIAorRGFzIHNpbXVsX2VmdW4gT2JqZWt0IC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIGJlbnV0enQgZGllIERhdGVpZW4KK2luIC9zZWN1cmUvc2ltdWxfZWZ1bi4KK0ltIFZlcnplaWNobmlzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZSBpc3QgZWluZSBTaWNoZXJoZWl0c2tvcGllIHZvbiBhbGxlbiAKK0RhdGVpZW4gaW4gL3NlY3VyZS9zaW11bF9lZnVuLgorCitGYWxscyAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIG5pY2h0IGxhZGJhciBpc3QsIHdpcmQgCisvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGFscyBFcnNhdHogdmVyc3VjaHQuIFdlbm4gYXVjaCBkYXMKK25pY2h0IGxhZGJhciBpc3QsIGVyZm9sZ3QgZWluIFNodXRkb3duIGRlcyBNdWRzLgorCitCZWkgQWVuZGVydW5nZW4gc29sbHRlIF96dWVyc3RfIGRpZSBub3JtYWxlIHNpbXVsIGVmdW4gZWRpdGllcnQgdW5kCithbnNjaGxpZXNzZW5kIHplcnN0b2VydC9lbnRsYWRlbiB3ZXJkZW4sIHdvcmF1ZmhpbiBzaWUgaW1wbGl6aXQgZHVyY2ggZGVuCitEcml2ZXIgdW5kIE1hc3RlciBuZXVnZWxhZGVuIHdpcmQuIElzdCBkaWVzIGVyZm9sZ3JlaWNoIHVuZCBkaWUgbmV1ZQorc2ltdWxfZWZ1biBsYWV1ZnQgKGVyc3QgZGFubiEpIGtvcGllcnQgbWFuIGRpZSBEYXRlaWVuIGF1cyAKKy9zZWN1cmUvc2ltdWxfZWZ1biBuYWNoIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS4KKworRGllIERhdGVpZW4gaGllciBzaW5kIG1pdCBBdXNuYWhtZSBkZXIgc2ltdWxfZWZ1bi5jIHNlbGJzdCBfbmljaHRfIGRhenUgCitnZWRhY2h0LCBnZWxhZGVuIHp1IHdlcmRlbi4KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvY29tbS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjU5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9jb21tLmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorCisvLyBTZW5kZXQgYW4gYWxsZSBPYmpla3RlIGluIHJvb20gdW5kIHJvb20gc2VsYmVyIGR1cmNoIEF1ZnJ1ZiB2b24KKy8vIFJlY2VpdmVNc2coKS4KK3ZhcmFyZ3Mgdm9pZCBzZW5kX3Jvb20ob2JqZWN0fHN0cmluZyByb29tLCBzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfYWN0aW9uLCBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0ICpleGNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgb3JpZ2luKQoreworICBpZiAoc3RyaW5ncChyb29tKSkKKyAgICByb29tPWxvYWRfb2JqZWN0KHJvb20pOworICAKKyAgb3JpZ2luIHx8PSBwcmV2aW91c19vYmplY3QoKTsKKyAgb2JqZWN0ICpkZXN0ID0gZXhjbHVkZSA/IGFsbF9pbnZlbnRvcnkocm9vbSkgLSBleGNsdWRlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9pbnZlbnRvcnkocm9vbSk7CisKKyAgZGVzdC0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworICByb29tLT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3V0X2ZpbHRlciggb2JqZWN0IG9iLCBzdHJpbmcgcGF0ICkKK3sKKyAgICBzdHJpbmcgKmlnbm9yZTsKKworICAgIGlmICggIWVudmlyb25tZW50KG9iKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc2l6ZW9mKCByZWdleHAoICh7IG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudChvYikgKSB9KSwgcGF0ICkgKTsKK30KKwordmFyYXJncyB2b2lkIHNob3V0KCBzdHJpbmcgcywgbWl4ZWQgd2hlcmUgKXsKKyAgICBvYmplY3QgKnU7CisgICAgc3RyaW5nICpwZmFkZTsKKworICAgIGlmICggIXNpemVvZiggdSA9IHVzZXJzKCkgLSAoeyB0aGlzX3BsYXllcigpIH0pICkgKQorICAgICAgIHJldHVybjsKKworICAgIGlmICggIXdoZXJlICkKKyAgICAgICBwZmFkZSA9ICh7ICIvIiB9KTsKKyAgICBlbHNlIGlmICggaW50cCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0KKyAgICAgICAgICAgKHsgaW1wbG9kZSggZWZ1bjo6ZXhwbG9kZSggb2JqZWN0X25hbWUoIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiApWzAuLjJdLCAiLyIgKSArICIvIiB9KTsKKyAgICBlbHNlIGlmICggc3RyaW5ncCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0gKHsgd2hlcmUgfSk7CisgICAgZWxzZQorICAgICAgIHBmYWRlID0gd2hlcmU7CisKKyAgICB1ID0gZmlsdGVyKCB1LCAiX3Nob3V0X2ZpbHRlciIsIE1FLCBpbXBsb2RlKCBwZmFkZSwgInwiICkgKTsKKyAgICB1LT5SZWNlaXZlTXNnKHMsIE1UX0NPTU18TVRfRkFSfE1TR19ET05UX1dSQVB8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICAgICBNQV9TSE9VVF9TRUZVTiwgMCwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIGNhdCgpLgorI2RlZmluZSBDQVRfTUFYX0xJTkVTIDUwCit2YXJhcmdzIGludCBjYXQoc3RyaW5nIGZpbGUsIGludCBzdGFydCwgaW50IG51bSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGludCBtb3JlOworCisgICAgaWYgKG51bSA8IDAgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFzdGFydCkKKyAgICAgICAgc3RhcnQgPSAxOworCisgICAgaWYgKCFudW0gfHwgbnVtID4gQ0FUX01BWF9MSU5FUykgeworICAgICAgICBudW0gPSBDQVRfTUFYX0xJTkVTOworICAgICAgICBtb3JlID0gc2l6ZW9mKHJlYWRfZmlsZShmaWxlLCBzdGFydCtudW0sIDEpKTsKKyAgICB9CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9maWxlKGZpbGUsIHN0YXJ0LCBudW0pOworICAgIGlmICghdHh0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICBpZiAobW9yZSkKKyAgICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIioqKioqVFJVTkNBVEVEKioqKlxuIik7CisKKyAgICByZXR1cm4gc2l6ZW9mKHR4dCAmICJcbiIpOworfQorI3VuZGVmIENBVF9NQVhfTElORVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biB0YWlsKCkuCisjZGVmaW5lIFRBSUxfTUFYX0JZVEVTIDEwMDAKK3ZhcmFyZ3MgaW50IHRhaWwoc3RyaW5nIGZpbGUpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpZiAoIXN0cmluZ3AoZmlsZSkgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfYnl0ZXMoZmlsZSwgLShUQUlMX01BWF9CWVRFUyArIDgwKSwgKFRBSUxfTUFYX0JZVEVTICsgODApKTsKKyAgICAvLyByZWFkX2J5dGVzKCkgcmV0dXJucyAwIGlmIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBnaXZlbiBieQorICAgIC8vIHBhcmFtZXRlciAjMiBsaWVzIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaW1wbHkgdHJ5IGFuZCByZWFkIHRoZSBlbnRpcmUgZmlsZS4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSAmJiBmaWxlX3NpemUoZmlsZSkgPCBUQUlMX01BWF9CWVRFUys4MCkKKyAgICAgIHR4dCA9IHJlYWRfZmlsZShmaWxlKTsKKyAgICAvLyBFeGl0IGlmIHN0aWxsIG5vdGhpbmcgY291bGQgYmUgcmVhZC4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gY3V0IG9mZiBmaXJzdCAoaW5jb21wbGV0ZSkgbGluZQorICAgIGludCBpbmRleCA9IHN0cnN0cih0eHQsICJcbiIpOworICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgIGlmIChpbmRleCArIDEgPCBzaXplb2YodHh0KSkKKyAgICAgICAgICAgIHR4dCA9IHR4dFtpbmRleCsxLi5dOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eHQgPSAiIjsKKyAgICB9CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgcmV0dXJuIDE7Cit9CisjdW5kZWYgVEFJTF9NQVhfQllURVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwN2MyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYwpAQCAtMCwwICsxLDQzNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIGRlYnVnX2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGVidWdfaW5mbykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorCittaXhlZCBkZWJ1Z19pbmZvKGludCB3aGF0LCB2YXJhcmdzIG1peGVkKiBhcmdzKQoreworICAgIGlmIChzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3IgZGVidWdfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgRElORk9fT0JKRUNUOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworICAgICAgICAgICAgcHJpbnRmKCJPX0hFQVJUX0JFQVQgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCkgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19FTkFCTEVfQ09NTUFORFMgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fQ0xPTkUgICAgICAgICAgIDogJXNcbiIsIGVmdW46OmNsb25lcChvYikgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0RFU1RSVUNURUQgICAgICA6IEZBTFNFXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiT19TV0FQUEVEICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fT05DRV9JTlRFUkFDVElWRTogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFU0VUX1NUQVRFICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19XSUxMX0NMRUFOX1VQICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVQTEFDRUQgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCkgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX3Jlc2V0ICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInRpbWVfb2ZfcmVmIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInJlZiAgICAgICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUykpOworCisgICAgICAgICAgICBpbnQgZ3RpY2tzID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICBpZihndGlja3MpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkJTA5ZFxuIiwgZ3RpY2tzLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWRcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisKKyAgICAgICAgICAgIHByaW50Zigic3dhcF9udW0gICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKSk7CisgICAgICAgICAgICBwcmludGYoIm5hbWUgICAgICAgIDogJyVzJ1xuIiwgICAgIGVmdW46Om9iamVjdF9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoImxvYWRfbmFtZSAgIDogJyVzJ1xuIiwgICAgIGVmdW46OmxvYWRfbmFtZShvYikpOworCisgICAgICAgICAgICBvYmplY3QgbmV4dF9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICBpZiAobmV4dF9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIm5leHRfYWxsICAgIDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUobmV4dF9vYikpOworCisgICAgICAgICAgICBvYmplY3QgcHJldl9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICBpZiAocHJldl9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIlByZXZpb3VzIG9iamVjdCBpbiBvYmplY3QgbGlzdDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUocHJldl9vYikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiVGhpcyBvYmplY3QgaXMgdGhlIGhlYWQgb2YgdGhlIG9iamVjdCBsaXN0LlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworCisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gcmVmJ3MgJTNkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpKTsKKyAgICAgICAgICAgIHByaW50ZigiTmFtZTogJyVzJ1xuIiwgICAgICAgICAgZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gc2l6ZSAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIGZ1bmMnczogICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIHZhcnM6ICAgICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gc3RyaW5nczogJTNkICglNGQpIDogb3ZlcmhlYWQgJWQgKyBkYXRhICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpICsgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBpbmhlcml0cyAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKSk7CisKKyAgICAgICAgICAgIHByaW50ZigidG90YWwgc2l6ZSAgICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoImRhdGEgc2l6ZSAgICAgICAlNmQgKCU2ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpMSVNUOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0ICogb2JzID0gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JzWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01BTExPQzoKKyAgICAgICAgICAgIHdyaXRlKGRlYnVnX2luZm8oRElORk9fU1RBVFVTLCAibWFsbG9jIikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBESU5GT19TVEFUVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB3aGljaDsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykgfHwgIWFyZ3NbMF0pCisgICAgICAgICAgICAgICAgd2hpY2ggPSAiIjsKKyAgICAgICAgICAgIGVsc2UgaWYoc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKG9wdCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RVTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYoIXN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgImRlc3RydWN0ZWQiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUU19ERVNUUlVDVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm9wY29kZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT1BDT0RFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtZW1vcnkiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAnJXMnIHRvIGRlYnVnX2luZm8oRElORk9fRFVNUCkuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhvcHQsIGFyZ3NbMS4uMV0uLi4pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EQVRBOgorICAgICAgICB7CisgICAgICAgICAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDMgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NUQVRVU19NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NIQURPV1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NIQURPV1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBQRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0xJU1RdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fTElTVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ORVdMWV9ERVNUXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1BST0NFU1NFRF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfQVZHX1BST0NdICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX09CSkVDVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0xPVFNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUX1RBQkxFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX09CSlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfQUNUSVZFX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUxdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TTE9UU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1BST0NFU1NFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQVZHX1BST0NdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfSEVBUlRCRUFUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9DQUxMT1VUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FSUkFZUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQVJSQVlTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IWUJSSURfTUFQUElOR1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hZQlJJRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEFTSF9NQVBQSU5HU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IQVNIKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RfVFlQRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU19TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVF9UWVBFUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQUEVEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBfU0laRV0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVVNFUl9SRVNFUlZFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1VTRVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BU1RFUl9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9NQVNURVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NZU1RFTV9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9TWVNURU0pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUREX01FU1NBR0VdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRVNTQUdFU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTX0lOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfSU4pOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFX0lOXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfSU4pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFldICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV9ISVRTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTF9ISVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVklSVFVBTF9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfVEFCTEVfU0laRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9PVkVSSEVBRF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNfQllWQUxVRV0gID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOX0JZVkFMVUVdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DSEFJTlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NMT1RTX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9BRERFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfQURERUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9ERUxFVEVEXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfUkVNT1ZFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NPTExJU0lPTlNdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfQ09MTElTSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EX0JZVkFMVUVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9DQUNIRURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRVUVTVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfRk9VTkRdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfQ09MTF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9DT0xMSVNJT05TKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX0ZJTEVdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9GSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9TV0FQXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfU1dBUCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9CT09UX1RJTUVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfQk9PVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TV0FQOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1dBUF9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VOU1dBUFBFRF0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJTXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSX1NJWkVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZJTEVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRVVTRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19SRVVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSEVTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIX0xFTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIRVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSF9MRU5dICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19DT01QQUNUXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRENfU1dBUF9DT01QQUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFQ1lDTEVfRlJFRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TV0FQX1JFQ1lDTEVfUEhBU0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX01FTU9SWToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX01FTU9SWV9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX05BTUVdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9BTExPQ0FUT1JfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NVQ0NFU1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTF9TVUNDRVNTRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0lOQ1JFTUVOVF9TSVpFX0NBTExfRElGRlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1fU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX09WRVJIRUFEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BTExPQ0FURURdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVVNFRF0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1RPVEFMX1VOVVNFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VOVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX0ZVTEwpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNfUkVRXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19SRVFfU1VDQ0VTU10gICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExfVEFSR0VUX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX0lOU1BFQ1RFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfSU5TUEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19NRVJHRURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX01FUkdFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfUkVTVUxUXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19SRVNVTFRJTkcpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BVkxfTk9ERVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlJFRV9CTE9DS1NfQVZMX05PREVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fRVhUX1NUQVRJU1RJQ1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0VYVEVOREVEX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBhcmdzWzBdOworICAgICAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3IgZGVidWdfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19UUkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdoaWNoID0gRElUX0NVUlJFTlQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfVU5DQVVHSFRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1NUUl9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9BU19TVFJJTkcpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVF9ERVBUSDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfREVQVEgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19FVkFMX05VTUJFUjoKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxYzk2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgZW5hYmxlX2NvbW1hbmRzKCkKKyAqIGFuZCBkaXNhYmxlX2NvbW1hbmRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGVuYWJsZV9jb21tYW5kcykKKwordm9pZCBlbmFibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMSk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKG9iKTsKK30KKworI2VuZGlmCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGlzYWJsZV9jb21tYW5kcykKKwordm9pZCBkaXNhYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDApOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcigwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9oYXNoLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYmY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2hhc2guYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKworZGVwcmVjYXRlZCBzdHJpbmcgbWQ1KG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9NRDUsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CisKK2RlcHJlY2F0ZWQgc3RyaW5nIHNoYTEobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX1NIQTEsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9saXZpbmdzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9saXZpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZmNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2xpdmluZ3MuYwpAQCAtMCwwICsxLDM0OCBAQAorLy8gKiBsaXZpbmdfbmFtZS1CZWhhbmRsdW5nCisKKyNkZWZpbmUgY2xlYW5fbG9nKHMpCisvLyNkZWZpbmUgY2xlYW5fbG9nKHMpIGxvZ19maWxlKCJDTEVBTl9TSU0iLGN0aW1lKHRpbWUoKSlbNC4uMThdKyI6ICIrKHMpKTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaXZpbmdfbmFtZV9tLCBuYW1lX2xpdmluZ19tLCBuZXRkZWFkOworCitwcml2YXRlIHZvaWQgSW5pdExpdmluZ0RhdGEobWl4ZWQgd2l6aW5mbykgeworICAvLyBsaXZpbmdfbmFtZSBpc3QgZWluIFBvaW50ZXIgZGVyIGF1Y2ggaW4gZGVyIGV4dHJhX3dpemluZm8gZ2VoYWx0ZW4gCisgIC8vIHdpcmQsIHNvIGthbm4gZGllIHNpbXVsX2VmdW4gbmV1IGdlbGFkZW4gd2VyZGVuLCBvaG5lIGRhc3MgZGllc2VzCisgIC8vIE1hcHBpbmcgdmVybG9yZW4gZ2VodAorICBpZiAoIW1hcHBpbmdwKGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSkpCisgICAgbGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBHbGVpY2hlcyBnaWx0IGZ1ZXIgZGFzIE1hcHBpbmcgTmFtZS1MaXZpbmcKKyAgaWYgKCFtYXBwaW5ncChuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10pKQorICAgIG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gTmV0enRvdGUgc2luZCBlYmVuZmFsbHMgaW4gZGVyIGV4dHJhX3dpemluZm8KKyAgaWYgKCFtYXBwaW5ncChuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0pKQorICAgIG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSA9IChbXSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBnZXR1dWlkKCBvYmplY3Qgb2IgKQoreworICAgIG1peGVkICpyZXQ7CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIHJldCA9IChtaXhlZCltYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKCBnZXR1aWQob2IpICk7CisKKyAgICBpZiAoICFwb2ludGVycChyZXQpIHx8IHNpemVvZihyZXQpIDwgNSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICAvLyBVc2VybmFtZSArICJfIiArIENyZWF0aW9uRGF0ZQorICAgIHJldHVybiByZXRbMF0gKyAiXyIgKyByZXRbNV07Cit9CisKK3ZvaWQgc2V0X29iamVjdF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSwgb2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIG9sZDsKKyAgbWl4ZWQgYTsKKyAgaW50IGk7CisKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpPT1vYmogfHwgcHJldmlvdXNfb2JqZWN0KCk9PXRoaXNfb2JqZWN0KCkgfHwKKyAgICAgIHByZXZpb3VzX29iamVjdCgpPT1tYXN0ZXIoKSkKKyAgeworICAgIGlmKCFsaXZuYW1lIHx8ICFzdHJpbmdwKGxpdm5hbWUpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiJU86IGlsbGVnYWwgbGl2aW5nIG5hbWU6ICVPXG4iLCBvYmosIGxpdm5hbWUpKTsKKyAgICB9CisgICAgaWYgKG9sZCA9IGxpdmluZ19uYW1lX21bb2JqXSkgeworICAgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW29sZF0pKSB7CisgICAgICAgYVttZW1iZXIoYSwgb2JqKV0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBvbGQpOworICAgICAgfQorICAgIH0KKyAgICBsaXZpbmdfbmFtZV9tW29ial0gPSBsaXZuYW1lOworICAgIGlmIChhID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkgeworICAgICAgaWYgKCFwb2ludGVycChhKSkgeworICAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSAoe2EsIG9ian0pOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byByZWFsbG9jYXRlIGVudHJ5IGZyb20gZGVzdHJ1Y3RlZCBvYmplY3QgKi8KKyAgICAgIGlmICgoaSA9IG1lbWJlcihhLCAwKSkgPj0gMCkgeworICAgICAgIGFbaV0gPSBvYmo7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IGEgKyAoe29ian0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gb2JqOworICB9Cit9CisKK3ZvaWQgc2V0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lKQoreworICBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKGxpdm5hbWUscHJldmlvdXNfb2JqZWN0KCkpOworfQorCit2b2lkIHJlbW92ZV9saXZpbmdfbmFtZSgpCit7CisgIHN0cmluZyBsaXZuYW1lOworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICBpZiAobGl2bmFtZT1saXZpbmdfbmFtZV9tW3ByZXZpb3VzX29iamVjdCgpXSkKKyAgeworICAgIG1fZGVsZXRlKGxpdmluZ19uYW1lX20scHJldmlvdXNfb2JqZWN0KCkpOworICAgIGlmIChvYmplY3RwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIGlmIChuYW1lX2xpdmluZ19tW2xpdm5hbWVdPT1wcmV2aW91c19vYmplY3QoKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocG9pbnRlcnAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXS09KHtwcmV2aW91c19vYmplY3QoKX0pOworICAgICAgaWYgKCFzaXplb2YobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBfc2V0X25ldGRlYWQoKQoreworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgbmV0ZGVhZFtnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpXT1wcmV2aW91c19vYmplY3QoKTsKK30KKwordm9pZCBfcmVtb3ZlX25ldGRlYWQoKQoreworICBtX2RlbGV0ZShuZXRkZWFkLGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworfQorCitvYmplY3QgZmluZF9uZXRkZWFkKHN0cmluZyB1dWlkKQoreworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKyAKKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChuZXRkZWFkW3VpZF0pICE9IHV1aWQpCisgICAgICByZXR1cm4gMDsKKworICByZXR1cm4gbmV0ZGVhZFt1aWRdOworfQorCitzdHJpbmcgKmR1bXBfbmV0ZGVhZCgpCit7CisgIHJldHVybiBtX2luZGljZXMobmV0ZGVhZCk7Cit9CisKK29iamVjdCBmaW5kX2xpdmluZyhzdHJpbmcgbGl2bmFtZSkgeworICBtaXhlZCAqYSwgcjsKKyAgaW50IGk7CisKKyAgaWYgKHBvaW50ZXJwKHIgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkgeworICAgIGlmIChtZW1iZXIociwwKT49MCkKKyAgICAgIHItPSh7MH0pOworICAgIGlmICghc2l6ZW9mKHIpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9saXZpbmcgbG9lc2NodCAlc1xuIixsaXZuYW1lKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAhbGl2aW5nKHIgPSAoYSA9IHIpWzBdKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKGEpOyAtLWk7KSB7CisgICAgICAgaWYgKGxpdmluZyhhWzxpXSkpIHsKKyAgICAgICAgIHIgPSBhWzxpXTsKKyAgICAgICAgIGFbPGldID0gYVswXTsKKyAgICAgICAgIHJldHVybiBhWzBdID0gcjsKKyAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworICB9CisgIHJldHVybiBsaXZpbmcocikgJiYgcjsKK30KKworb2JqZWN0ICpmaW5kX2xpdmluZ3Moc3RyaW5nIGxpdm5hbWUpCit7CisgIG1peGVkIHI7CisKKyAgaWYgKHBvaW50ZXJwKHI9bmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgci09KHswfSk7CisgIGVsc2UKKyAgICBpZiAob2JqZWN0cChyKSkKKyAgICAgIHI9KHtyfSk7CisgIGlmICghcG9pbnRlcnAocil8fCFzaXplb2YocikpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiByOworfQorCitvYmplY3QgZmluZF9wbGF5ZXIoc3RyaW5nIHV1aWQpIHsKKyAgb2JqZWN0ICpvYmpzOworICBtaXhlZCByZXM7CisgIGludCBpOworICBzdHJpbmcgdWlkOworCisgIGlmICghc3RyaW5ncCh1dWlkKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKworICBpZiAocG9pbnRlcnAocmVzID0gbmFtZV9saXZpbmdfbVt1aWRdKSkgeworICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSBnZ2YuIGVudGZlcm5lbgorICAgIGlmIChtZW1iZXIocmVzLDApPj0wKSB7CisgICAgICByZXMtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVt1aWRdID0gcmVzOworICAgIH0KKyAgICAvLyBnZ2YuIE5hbWVuIG9obmUgT2JqZWt0ZSBlbnRmZXJuZW4uCisgICAgaWYgKCFzaXplb2YocmVzKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLHVpZCk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9wbGF5ZXIgbG9lc2NodCAlc1xuIix1aWQpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvYmpzID0gcmVzOworICAgIHJlcyA9IG9ianNbMF07CisgICAgLy8gV2VubiBkYXMgMC4gRWxlbWVudCBkZXIgU3BpZWxlciBpc3QsIHNpbmQgd2lyIGZlcnRpZy4gQW5zb25zdGVuIHN1Y2hlbgorICAgIC8vIHdpciBkZW4gU3BpZWxlciB1bmQgc2NoaWViZW4gaWhuIGFuIGRpZSAwLiBTdGVsbGUgaW0gQXJyYXkuCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2Yob2Jqcyk7IC0taTspIHsKKyAgICAgICBpZiAob2Jqc1s8aV0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmpzWzxpXSkpIHsKKyAgICAgICAgIHJlcyA9IG9ianNbPGldOworICAgICAgICAgb2Jqc1s8aV0gPSBvYmpzWzBdOworICAgICAgICAgb2Jqc1swXSA9IHJlczsKKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlcyA9IChvYmplY3RwKHJlcykgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSA/IHJlcyA6IDA7CisgICAgfQorICAgIC8vIGVsc2U6IGluIHJlcyBzdGVodCBkZXIgU3BpZWxlciBzY2hvbi4KKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHJlcykpIC8vIHIgaXN0IG5lbiBFaW56ZWxvYmpla3QKKyAgICByZXMgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykgPyByZXMgOiAwOworCisgIC8vIHJlcyBpc3QgamV0enQgZ2dmLiBkZXIgU3BpZWxlci4gQWJlciB3ZW5uIGRlciBuZSBhbmRlcmUgYWxzIGRpZSBnZXN1Y2h0ZQorICAvLyBVVUlEIGhhdCwgaXN0IGRhcyBFcmdlYm5pcyB0cm90emRlbSAwLgorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKHJlcykhPXV1aWQpCisgICAgICByZXR1cm4gMDsKKworICAvLyBlbmRsaWNoIGdlZnVuZGVuCisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgaW50IGNoZWNrX21hdGNoKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5ICkKK3sKKyAgICBtaXhlZCBtYXRjaDsKKworICAgIGlmICggIShtYXRjaCA9IG5hbWVfbGl2aW5nX21bc3RyXSkgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAobWF0Y2gpICkKKyAgICAgICBtYXRjaCA9ICh7IG1hdGNoIH0pOworCisgICAgbWF0Y2ggLT0gKHswfSk7CisKKyAgICBpZiAoIHNpemVvZihtYXRjaCkgKXsKKyAgICAgICBpZiAoIHBsYXllcnNfb25seSApCisgICAgICAgICAgIHJldHVybiBzaXplb2YoZmlsdGVyKCBtYXRjaCwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlLyonKi8gKSkKKyAgICAgICAgICAgICAgPiAwOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbV9kZWxldGUoIG5hbWVfbGl2aW5nX20sIHN0ciApOworICAgIGNsZWFuX2xvZyggc3ByaW50ZigiY2hlY2tfbWF0Y2ggbG9lc2NodCAlc1xuIiwgc3RyKSApOworICAgIHJldHVybiAwOworfQorCisvL1RPRE86OiBzdHJpbmd8c3RyaW5nKiBleGNsdWRlCit2YXJhcmdzIG1peGVkIG1hdGNoX2xpdmluZyggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSwgbWl4ZWQgZXhjbHVkZSApCit7CisgICAgaW50IGksIHM7CisgICAgbWl4ZWQgbWF0Y2gsICp1c2VyOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChleGNsdWRlKSApCisgICAgICAgZXhjbHVkZSA9ICh7IGV4Y2x1ZGUgfSk7CisKKyAgICBpZiAoIG1lbWJlcihleGNsdWRlLCBzdHIpIDwgMCAmJiBjaGVja19tYXRjaChzdHIsIHBsYXllcnNfb25seSkgKQorICAgICAgIHJldHVybiBzdHI7CisKKyAgICB1c2VyID0gbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pOworICAgIHMgPSBzaXplb2Yoc3RyKTsKKyAgICBtYXRjaCA9IDA7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHVzZXIpOyBpLS07ICkKKyAgICAgICBpZiAoIHN0ciA9PSB1c2VyW2ldWzAuLnMtMV0gJiYgbWVtYmVyKCBleGNsdWRlLCB1c2VyW2ldICkgPCAwICkKKyAgICAgICAgICAgaWYgKCBtYXRjaCApCisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoIGNoZWNrX21hdGNoKHVzZXJbaV0sIHBsYXllcnNfb25seSkgKQorICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB1c2VyW2ldOworCisgICAgaWYgKCAhbWF0Y2ggKQorICAgICAgIHJldHVybiAtMjsKKworICAgIHJldHVybiBtYXRjaDsKK30KKworbWl4ZWQgKmR1bXBfbGl2aW5ncygpCit7CisgIHJldHVybiBzb3J0X2FycmF5KG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwjJz4pOworfQorCisvLyAqIHJlZ2VsbWFlc3NpZyBMaXN0ZW4gdm9uIEJhbGxhc3QgYmVmcmVpZW4KK3ByaXZhdGUgdm9pZCBjbGVhbl9uYW1lX2xpdmluZ19tKHN0cmluZyAqa2V5cywgaW50IGxlZnQsIGludCBudW0pCit7CisgIGludCBpLCBqOworICBtaXhlZCBhOworCisgIHdoaWxlIChsZWZ0ICYmIG51bS0tKQorICB7CisgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW2tleXNbLS1sZWZ0XV0pICYmIG1lbWJlcihhLCAwKT49MCkKKyAgICB7CisgICAgICBhLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21ba2V5c1tsZWZ0XV0gPSBhOworICAgIH0KKyAgICBpZiAoIWEgfHwgKHBvaW50ZXJwKGEpICYmICFzaXplb2YoYSkpKQorICAgIHsKKyAgICAgIGNsZWFuX2xvZygiVG9hc3RpbmcgIitrZXlzW2xlZnRdKyJcbiIpOworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwga2V5c1tsZWZ0XSk7CisgICAgfSBlbHNlIGNsZWFuX2xvZyhzcHJpbnRmKCJLRUVQSU5HICVzICglTylcbiIsa2V5c1tsZWZ0XSxwb2ludGVycChhKT9zaXplb2YoYSk6YSkpOworICB9CisgIGlmIChsZWZ0KQorICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwgMSwga2V5cywgbGVmdCwgODApOworICBlbHNlCisgICAgY2xlYW5fbG9nKCJDbGVhbiBwcm9jZXNzIGZpbmlzaGVkXG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIGNsZWFuX25ldGRlYWQoKSB7CisgIGludCBpOworICBzdHJpbmcgKnM7CisgIG9iamVjdCBvYjsKKworICBzPW1faW5kaWNlcyhuZXRkZWFkKTsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKQorICAgIGlmICghb2JqZWN0cChvYj1uZXRkZWFkW3NbaV1dKSB8fCBpbnRlcmFjdGl2ZShvYikpCisgICAgICBtX2RlbGV0ZShuZXRkZWFkLHNbaV0pOworfQorCitwcml2YXRlIHZvaWQgQ2xlYW5MaXZpbmdEYXRhKCkgeworICBpZiAoZmluZF9jYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20pIDwgMCkgeworICAgIGNsZWFuX2xvZygiU3RhcnRpbmcgY2xlYW4gcHJvY2Vzc1xuIik7CisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLAorICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICBtX2luZGljZXMobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIHNpemVvZihuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgODAKKyAgICAgICAgICAgICAgICAgKTsKKyAgfQorICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25ldGRlYWQsMik7Cit9CisKKyN1bmRlZiBjbGVhbl9sb2cKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3YzAwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBvYmplY3RfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZHJpdmVyX2luZm8pIC8qIE5ld2VyIHZlcnNpb24gaXMgdGhlcmUgKi8KKworI2luY2x1ZGUgPG9iamVjdGluZm8uaD4KKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCittaXhlZCBvYmplY3RfaW5mbyhvYmplY3Qgb2IsIGludCB3aGF0LCB2YXJhcmdzIGludCogaW5kZXgpCit7CisgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gb2JqZWN0X2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3Igb2JqZWN0X2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIE9JTkZPX0JBU0lDOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSUJfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JQl9IRUFSVF9CRUFUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0lTX1dJWkFSRF0gICAgICAgICA9IDA7ICAgLyogTm90IHN1cHBvcnRlZCBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9FTkFCTEVfQ09NTUFORFNdICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0NMT05FXSAgICAgICAgICAgICA9IGVmdW46OmNsb25lcChvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0RFU1RSVUNURURdICAgICAgICA9IDA7ICAgLyogTm90IHBvc3NpYmxlIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBQRURdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfT05DRV9JTlRFUkFDVElWRV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVNFVF9TVEFURV0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9XSUxMX0NMRUFOX1VQXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xBTUJEQV9SRUZFUkVOQ0VEXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQU1CREFfUkVGRVJFTkNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NIQURPV10gICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVikgJiYgMTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVQTEFDRURdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9SRVNFVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJTUVfT0ZfUkVGXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVGXSAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfR0lHQVRJQ0tTXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJQ0tTXSAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBfTlVNXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BST0dfU1dBUFBFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9WQVJfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVkFSX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9OQU1FXSAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xPQURfTkFNRV0gICAgICAgICA9IGVmdW46OmxvYWRfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BSRVZfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQ0xFQU5VUF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX0NMRUFOVVBfVElNRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fUE9TSVRJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JUF9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lQX05FWFRdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUFJFVl0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QT1NdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUE9TKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JTV9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lNX1JFRl0gICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTkFNRV0gICAgICAgICAgICAgICA9IGVmdW46OnByb2dyYW1fbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lNX1BST0dfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0ZVTkNUSU9OU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9GVU5DVElPTlNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9WQVJJQUJMRVNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfVkFSSUFCTEVTXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fU1RSSU5HU10gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfREFUQV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX1RPVEFMXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkhFUklURURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfSU5IRVJJVEVEXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9TSVpFXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX0RBVEFfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfREFUQV9TSVpFXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19JTkhFUklUXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0lOSEVSSVQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19DTE9ORV0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0NMT05FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fU0hBRE9XXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19TSEFET1cpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5DTFVERVNdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkNMVURFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NIQVJFX1ZBUklBQkxFU10gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBUkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemVvZihpbmRleCkpCisgICAgeworICAgICAgICBpbnQgaWR4ID0gaW5kZXhbMF07CisgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIG9iamVjdF9pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0NmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfZWRpdGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9lZGl0aW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnR8b2JqZWN0IHF1ZXJ5X2VkaXRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0VESVRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EzMmFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pZGxlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lkbGUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludCBxdWVyeV9pZGxlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSURMRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGMzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lucHV0X3BlbmRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaW5wdXRfcGVuZGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X2lucHV0X3BlbmRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lOUFVUX1BFTkRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc0ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgcXVlcnlfaXBfbmFtZSgpIGFuZAorICogcXVlcnlfaXBfbnVtYmVyKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lwX25hbWUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX25hbWUob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTkFNRSk7Cit9CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX251bWJlcihvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OVU1CRVIpOworfQorCisvLyAqIEhlcmt1bmZ0cy1Fcm1pdHRsdW5nCitzdHJpbmcgcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBvYikKK3sKKyAgb2I9IG9iIHx8IHRoaXNfcGxheWVyKCk7CisgIGlmICghb2JqZWN0cChvYikgfHwgIWludGVyYWN0aXZlKG9iKSkgcmV0dXJuIDA7CisgIGlmKG9iLT5xdWVyeV9yZWFsaXAoKSAmJiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKSE9IiIpCisgIHsKKyAgICByZXR1cm4gKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCk7CisgIH0KKyAgcmV0dXJuIF9xdWVyeV9pcF9udW1iZXIob2IpOworfQorCitzdHJpbmcgcXVlcnlfaXBfbmFtZShtaXhlZCBvYikKK3sKKyAgaWYgKCAhb2IgfHwgb2JqZWN0cChvYikgKQorICAgICAgb2I9X3F1ZXJ5X2lwX251bWJlcihvYik7CisgIHJldHVybiAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5ob3N0KG9iKTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZjM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9saW1pdHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbGltaXRzKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKwordmFyYXJncyBpbnQqIHF1ZXJ5X2xpbWl0cyhpbnQgZGVmKQoreworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhkZWYgPyBEQ19ERUZBVUxUX1JVTlRJTUVfTElNSVRTIDogRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM2ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKQEAgLTAsMCArMSwxNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9sb2FkX2F2ZXJhZ2UpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitzdHJpbmcgcXVlcnlfbG9hZF9hdmVyYWdlKCkKK3sKKyAgICByZXR1cm4gZWZ1bjo6c3ByaW50ZigiJS4yZiBjbWRzL3MsICUuMmYgY29tcCBsaW5lcy9zIiwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0NPTU1BTkRTKSwKKyAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0xJTkVTKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X211ZF9wb3J0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X211ZF9wb3J0KQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK2ludCBxdWVyeV9tdWRfcG9ydCh2YXJhcmdzIGludCp8b2JqZWN0KiBhcmdzKQoreworICAgIGlmKCFzaXplb2YoYXJncykgJiYgZWZ1bjo6dGhpc19wbGF5ZXIoKSAmJiBlZnVuOjppbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8odGhpc19wbGF5ZXIoKSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBxdWVyeV9tdWRfcG9ydFxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgZWZ1bjo6b2JqZWN0cChhcmdzWzBdKSAmJiBlZnVuOjppbnRlcmFjdGl2ZShhcmdzWzBdKSkKKyAgICAgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8oYXJnc1swXSwgSUlfTVVEX1BPUlQpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGludHAoYXJnc1swXSkpCisgICAgeworICAgICAgICBpbnQqIHBvcnRzID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKTsKKyAgICAgICAgaWYoYXJnc1swXSA8IC0xIHx8IGFyZ3NbMF0gPj0gc2l6ZW9mKHBvcnRzKSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKGVmdW46OnNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9tdWRfcG9ydCgpOiB2YWx1ZSAlZCBvdXQgb2YgcmFuZ2UuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgIGVsc2UgaWYoYXJnc1swXSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YocG9ydHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcG9ydHNbYXJnc1swXV07CisgICAgfQorCisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUylbMF07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzgyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK2ludCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTY5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zbm9vcCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIG9iamVjdCBfcXVlcnlfc25vb3Aob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgb2JqZWN0IHByZXYgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBlZnVuOjpzZXRfdGhpc19vYmplY3QocHJldik7CisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3Nub29wKQorICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9TTk9PUF9ORVhUKTsKKyNlbHNlCisgICAgcmV0dXJuIGVmdW46OnF1ZXJ5X3Nub29wKG9iKTsKKyNlbmRpZgorfQorCitub21hc2sgb2JqZWN0IHF1ZXJ5X3Nub29wKG9iamVjdCB3aG8pIHsKKyAgb2JqZWN0IHNub29wZXI7CisKKyAgc25vb3Blcj1fcXVlcnlfc25vb3Aod2hvKTsKKyAgaWYgKCFzbm9vcGVyKSByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X3dpel9ncnAoc25vb3Blcik+cXVlcnlfd2l6X2dycChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAmJgorICAgICAgSVNfQVJDSChzbm9vcGVyKSkgcmV0dXJuIDA7CisgIHJldHVybiBzbm9vcGVyOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OTVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKQEAgLTAsMCArMSwyNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9oZWFydF9iZWF0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9oZWFydF9iZWF0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCitpbnQgc2V0X2hlYXJ0X2JlYXQoaW50IGZsYWcpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgaW50IGhiID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworCisgICAgaWYgKCFmbGFnID09ICFoYikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKKworICAgIHJldHVybiAxOworfQorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxY2NkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogVGhlc2UgYXJlIHRoZSBzcGVjaWFsIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlciB0aGF0IGFyZSBhY3RpdmF0ZWQgd2l0aAorICogc2V0X2lzX3dpemFyZCgpLiBUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgcGxheWVyIG9iamVjdC4KKyAqIEFsc28gc2V0X2lzX3dpemFyZCgpIG11c3QgYmUgY2FsbGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHBsYXllciBvYmplY3QsCisgKiBub3QgYXMgYW4gKHNpbXVsLSllZnVuLgorICovCisKKyNpbmNsdWRlIDxjb21tYW5kcy5oPgorI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKKy8qIGlzX3dpemFyZDoKKyAqICAxOiBoYXMgYWN0aW9ucywKKyAqICAwOiBuZXZlciBoYWQgYWN0aW9ucywKKyAqIC0xOiBoYWQgYWN0aW9ucyBvbmNlLgorICovCitwcml2YXRlIG5vc2F2ZSBpbnQgaXNfd2l6YXJkOworCitwcml2YXRlIGludCBkcml2ZXJfbWFsbG9jKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoIXNpemVvZihzdHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKHN0ciA9PSAiZXh0c3RhdHMiKQorICAgIHsKKyAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBkcml2ZXJfZHVtcGFsbG9iaihzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdyaXRlKCJEdW1waW5nIHRvIC9PQkpfRFVNUCAuLi4gIik7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUUyk7CisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICB3cml0ZSgiZG9uZVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9vcGNkdW1wKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT1BDT0RFUyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9zdGF0dXMoc3RyaW5nIHN0cikKK3sKKyAgICBpbnQgb3B0OworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaChzdHIgfHwgIiIpCisgICAgeworICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgY2FzZSAiIHRhYmxlcyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgY2FzZSAiIHN3YXAiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRfaXNfd2l6YXJkKHZhcmFyZ3MgPG9iamVjdHxpbnQ+KiBhcmdzKQoreworICAgIGludCBvbGR2YWwgPSBpc193aXphcmQ7CisKKyAgICBpZighc2l6ZW9mKGFyZ3MpKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIGZldyBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZighb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMSB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKGFyZ3NbMF0gIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIk9ubHkgc2V0X2lzX3dpemFyZCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IHN1cHBvcnRlZFxuIik7CisgICAgaWYodGhpc19wbGF5ZXIoKSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiVGhlIGN1cnJlbnQgb2JqZWN0IG11c3QgYmUgdGhpc19wbGF5ZXIoKSBmb3Igc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMiB0byBzZXRfaXNfd2l6YXJkKClcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWFyZ3NbMV0pCisgICAgeworICAgICAgICBpZihpc193aXphcmQgPiAwKQorICAgICAgICAgICAgaXNfd2l6YXJkID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgYXJnc1sxXTwwKQorICAgIHsKKyAgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCFpc193aXphcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfbWFsbG9jLCAibWFsbG9jIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX2R1bXBhbGxvYmosICJkdW1wYWxsb2JqIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX29wY2R1bXAsICJvcGNkdW1wIik7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX3N0YXR1cywgInN0YXR1cyIsIEFBX05PU1BBQ0UpOworICAgICAgICB9CisgICAgICAgIGlzX3dpemFyZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIG9sZHZhbCA+IDA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OTY5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYwpAQCAtMCwwICsxLDIxIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X3Byb21wdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfcHJvbXB0KQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCit2YXJhcmdzIHN0cmluZ3xjbG9zdXJlIHNldF9wcm9tcHQoc3RyaW5nfGNsb3N1cmV8aW50IHByb21wdCwgb2JqZWN0IG9iKQoreworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgbWl4ZWQgb2xkcHJvbXB0ID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUNfUFJPTVBUKTsKKworICAgIGlmKCFpbnRwKHByb21wdCkpCisgICAgICAgIGVmdW46OmNvbmZpZ3VyZV9pbnRlcmFjdGl2ZShvYiwgSUNfUFJPTVBULCBwcm9tcHQpOworCisgICAgcmV0dXJuIG9sZHByb21wdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaGFkb3cuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDhjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaGFkb3cuYwpAQCAtMCwwICsxLDU1IEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc2hhZG93aW5nKCkKKyAqIGFuZCB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBzaGFkb3coKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc2hhZG93aW5nKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X3NoYWRvd2luZyhvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVik7Cit9CisKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgICBpZihmbGFnKQorICAgIHsKKyAgICAgICAgb2JqZWN0IHNoYWRvd2VyID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDEpOworICAgICAgICBlZnVuOjpzZXRfdGhpc19vYmplY3Qoc2hhZG93ZXIpOworCisgICAgICAgIGlmIChlZnVuOjpzaGFkb3cob2IpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKHNoYWRvd2VyLCBPSV9TSEFET1dfUFJFVik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX05FWFQpOworfQorI2Vsc2UKK3ByaXZhdGUgb2JqZWN0IF9zaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIHJldHVybiBlZnVuOjpzaGFkb3cob2IsIGZsYWcpOworfQorI2VuZGlmCisKKworcHVibGljIG9iamVjdCBzaGFkb3cob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgb2JqZWN0IHJlcyA9IGZ1bmNhbGwoIydfc2hhZG93LG9iLCBmbGFnKTsKKyAgaWYgKGZsYWcpCisgICAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+UmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIHZvaWQgX3Vuc2hhZG93KCkgeworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgZWZ1bjo6dW5zaGFkb3coKTsKK30KKworcHVibGljIHZvaWQgdW5zaGFkb3coKSB7CisgIGZ1bmNhbGwoIydfdW5zaGFkb3cpOworICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5VbnJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY4Nzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCkBAIC0wLDAgKzEsMTk5NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNpbXVsX2VmdW4uYyAtLSBzaW11bCBlZnVuJ3MKKy8vCisvLyAkSWQ6IHNpbXVsX2VmdW4uYyA3NDA4IDIwMTAtMDItMDYgMDA6Mjc6MjVaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CisjcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrLHdhcm5fZGVwcmVjYXRlZAorI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLHdhcm5fbWlzc2luZ19yZXR1cm4sd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gQWJzb2x1dGUgUGZhZGUgZXJmb3JkZXJsaWNoIC0genVtIFplaXRwdW5rdCwgd28gZGVyIE1hc3RlciBnZWxhZGVuCisvLyB3aXJkLCBzaW5kIG5vY2gga2VpbmUgSW5jbHVkZS1QZmFkZSBkYSAuLi4KKworI2RlZmluZSBTTk9PUExPR0ZJTEUgIlNOT09QIgorI2RlZmluZSBBU05PT1BMT0dGSUxFICJBUkNIL1NOT09QIgorCisjaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKKyNpbmNsdWRlICIvc3lzL2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCisjaW5jbHVkZSAiL3N5cy9lcnEuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKKyNpbmNsdWRlICIvc3lzL3BsYXllci9iYXNlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCisjaW5jbHVkZSAiL3N5cy9kZWZpbmVzLmgiCisjaW5jbHVkZSAiL3N5cy90ZWxuZXQuaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3N5cy9zdHJpbmdzLmgiCisjaW5jbHVkZSAiL3N5cy90aW1lLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvbm90aWZ5X2ZhaWwuaCIKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorI2luY2x1ZGUgIi9zeXMvaW5wdXRfdG8uaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhayk7CitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcik7Citub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pOworaW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KTsKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCk7Citub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCk7CitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpOwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2Fwcyk7CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQordmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQordmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKTsKKyNlbmRpZgorCisvLyBJbmNsdWRlIHRoZSBkaWZmZXJlbnQgc3ViICdtb2R1bGVzJyBvZiB0aGUgc2ltdWxfZWZ1bgorI2luY2x1ZGUgX19ESVJfXyJkZWJ1Z19pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgorI2luY2x1ZGUgX19ESVJfXyJoYXNoLmMiCisjaW5jbHVkZSBfX0RJUl9fIm9iamVjdF9pbmZvLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaWRsZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pbnB1dF9wZW5kaW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbGltaXRzLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xvYWRfYXZlcmFnZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X3Nub29wLmMiCisjaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCisjaWYgX19CT09UX1RJTUVfXyA8IDE0NTYyNjE4NTkKKyNpbmNsdWRlIF9fRElSX18ic2V0X3Byb21wdC5jIgorI2VuZGlmCisjaW5jbHVkZSBfX0RJUl9fInNoYWRvdy5jIgorI2luY2x1ZGUgX19ESVJfXyJsaXZpbmdzLmMiCisjaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKKworI2RlZmluZSBUTyAgICAgICAgZWZ1bjo6dGhpc19vYmplY3QoKQorI2RlZmluZSBUSSAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCisjZGVmaW5lIFRQICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCisjZGVmaW5lIFBPICAgICAgICBlZnVuOjpwcmV2aW91c19vYmplY3QoMCkKKyNkZWZpbmUgTEVWRUwoeCkgcXVlcnlfd2l6X2xldmVsKHgpCisjZGVmaW5lIE5BTUUoeCkgIGNhcGl0YWxpemUoZ2V0dWlkKHgpKQorCisjZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCisgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKKworbWl4ZWQgZHRpbWVfY2FjaGUgPSAoey0xLCIifSk7CisKKyNpZmRlZiBJT1NUQVRTCitzdHJ1Y3QgaW9zdGF0X3MgeworICBzdHJpbmcgb25hbWU7CisgIGludCB0aW1lOworICBpbnQgc2l6ZTsKK307CittaXhlZCBzYXZlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsIDApIH0pOworbWl4ZWQgcmVzdG9yZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLDApIH0pOworLy9taXhlZCB3cml0ZWZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIHJlYWRmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCBsb2dfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisKK21peGVkIF9fX2lvc3RhdHMoaW50IHR5cGUpIHsKKyAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gc2F2ZW9fc3RhdDsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcmVzdG9yZW9fc3RhdDsKKy8qICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiB3cml0ZWZpbGVfc3RhdDsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gcmVhZGZpbGVfc3RhdDsKKyAgICBjYXNlIDU6CisgICAgICByZXR1cm4gbG9nX3N0YXQ7CisgICAgICAqLworICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRpZSBzaW11bF9lZnVuIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgc2ltdWxfZWZ1biBPYmpla3QgbmljaHQgemVyc3RvZXJlbiFcbiI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitwdWJsaWMgbm9tYXNrIHZvaWQgcmVtb3ZlX2ludGVyYWN0aXZlKCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2JqZWN0cChvYikgJiYgcHJldmlvdXNfb2JqZWN0KCkKKyAgICAgICAgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIKKyAgICAgICAgJiYgKChwcmV2aW91c19vYmplY3QoKSAhPSBvYgorICAgICAgICAgICAgICYmIChvYiAhPSB0aGlzX3BsYXllcigpIHx8IG9iICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgICAgICB8fCAocHJldmlvdXNfb2JqZWN0KCkgPT0gb2IKKyAgICAgICAgICAgICAgICYmICh0aGlzX3BsYXllcigpICYmIHRoaXNfcGxheWVyKCkgIT0gb2IKKyAgICAgICAgICAgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICE9IG9iKSkgKSApCisKKyAgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAorICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJU8gYXVzZ2Vsb2dndCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIG9iLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CisKKyAgICBlZnVuOjpyZW1vdmVfaW50ZXJhY3RpdmUob2IpOworfQorCisKK3ZvaWQgX19fdXBkbWFzdGVyKCkKK3sKKyAgICBvYmplY3Qgb2I7CisKKyAgICAvL3NvbGx0ZSBuaWNodCBqZWRlciBkdWVyZmVuLgorICAgIGlmIChwcm9jZXNzX2NhbGwoKSB8fCAhQVJDSF9TRUNVUklUWSkKKyAgICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHVzZSBvZiBfX191cGRtYXN0ZXIoKSEiKTsKKworICAgIHdyaXRlKCJSZW1vdmluZyBvbGQgbWFzdGVyIC4uLiAiKTsKKyAgICBmb3JlYWNoKHN0cmluZyBmaWxlOiAKKyAgICAgICAgZ2V0X2RpcigiL3NlY3VyZS9tYXN0ZXIvKi5jIixHRVRESVJfTkFNRVN8R0VURElSX1VOU09SVEVEfEdFVERJUl9QQVRIKSkgeworICAgICAgaWYgKG9iID0gZmluZF9vYmplY3QoZmlsZSkpCisgICAgICAgZWZ1bjo6ZGVzdHJ1Y3Qob2IpOworICAgIH0KKyAgICBlZnVuOjpkZXN0cnVjdChlZnVuOjpmaW5kX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKSk7CisgICAgd3JpdGUoImRvbmUuXG5Mb2FkaW5nIGFnYWluIC4uLiAiKTsKKyAgICBsb2FkX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKTsKKworICAgIHdyaXRlKCJkb25lLlxuIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pIHsKKyAgbWl4ZWQgcmV0OworCisgIGlmKHJldCA9IChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmNvdW50cnkobnVtIHx8IGlwKSkgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZSByZXR1cm4gIj8/PyI7Cit9CisKKworLy8gKiBTbm9vcGVuIHVuZCB3YXMgZGF6dWdlaG9lcnQKK3N0YXRpYyBvYmplY3QgZmluZF9zbm9vcGVkKG9iamVjdCB3aG8pCit7CisgIG9iamVjdCAqdTsKKyAgaW50IGk7CisKKyAgZm9yIChpPXNpemVvZih1PXVzZXJzKCkpLTE7aT49MDtpLS0pCisgICAgaWYgKHdobz09ZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh1W2ldLCBJSV9TTk9PUF9ORVhUKSkKKyAgICAgIHJldHVybiB1W2ldOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBzdHJpbmcgTGN1dChzdHJpbmcgc3RyKSB7CisgIHJldHVybiBzdHJbNS4uMTFdK3N0clsxOC4uXTsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKCBvYmplY3QgbWUsIG9iamVjdCB5b3UgKQoreworICAgIGludCByZXQ7CisgICAgb2JqZWN0IHNub29wZXIwLCBzbm9vcGVyLCBzbm9vcGVyMiwgc25vb3BlcjM7CisKKyAgICBpZiggIW9iamVjdHAobWUpIHx8IG1lID09IHlvdSB8fCAhUE8gKQorICAgICAgIHJldHVybiAwOworCisgICAgc25vb3BlcjAgPSBmaW5kX3Nub29wZWQobWUpOworCisgICAgIGlmKHlvdSl7CisgICAgICAgIGlmICggUE8gIT0gbWUgJiYgcXVlcnlfd2l6X2dycChtZSkgPj0gcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhKHlvdS0+UXVlcnlBbGxvd1Nub29wKG1lKSkgKQorICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSB8fCBJU19BUkNIKHlvdSkgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKCAoc25vb3BlciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSkgJiYKKyAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKHNub29wZXIpID49IHF1ZXJ5X3dpel9ncnAobWUpICl7CisgICAgICAgICAgICBpZiAoIChpbnQpc25vb3Blci0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKQorICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiJXMgc25vb3BlZCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZS0+bmFtZShXRVIpLCB5b3UtPm5hbWUoV0VSKSApICk7CisKKyAgICAgICAgICAgIHNub29wZXIyID0gbWU7CisKKyAgICAgICAgICAgIHdoaWxlICggc25vb3BlcjMgPSBpbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSApeworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgd2lyZCBzZWluZXJzZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc25vb3BlcjItPm5hbWUoV0VSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjMtPm5hbWUoV0VNKSApICk7CisgICAgICAgICAgICAgICBzbm9vcGVyMiA9IHNub29wZXIzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlZnVuOjpzbm9vcCggc25vb3Blciwgc25vb3BlcjIgKTsKKworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSAhPSBzbm9vcGVyICkKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUga2FubnN0ICVzIG5pY2h0IHNub29wZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBzbm9vcHN0IGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKHNub29wZXIpICl7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZigiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIC0+ICVzICglTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTAwMDAwICk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHNub29wZXIpCisgICAgICAgICAgICAgICBpZiAoICFtZS0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKXsKKyAgICAgICAgICAgICAgICAgICBwcmludGYoICIlcyB3aXJkIGJlcmVpdHMgdm9uICVzIGdlc25vb3BlZC4gQmVudXR6ZSBkYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJmXCItRmxhZywgd2VubiBkdSBkZW5ub2NoIHNub29wZW4gd2lsbHN0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LT5uYW1lKFdFUiksIHNub29wZXItPm5hbWUoV0VNKSApOworICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgfQorCisgICAgICAgIHJldCA9IGVmdW46OnNub29wKCBtZSwgeW91ICk7CisKKyAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSAmJiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUpeworICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLCBzcHJpbnRmKCAiJXMgLT4gJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHlvdSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoeW91KSApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmV0ICYmIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICFJU19ERVBVVFkobWUpICkKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB5b3UsICIqKiogIiArIE5BTUUobWUpICsgIiBzbm9vcHQgRGljaCFcbiIgKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgICB9CisgICAgIGVsc2UgeworICAgICAgICBpZiAoIChtZSA9PSBQTyB8fAorICAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA+IHF1ZXJ5X3dpel9ncnAobWUpIHx8CisgICAgICAgICAgICAgIChxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA9PSBxdWVyeV93aXpfZ3JwKG1lKSAmJgorICAgICAgICAgICAgICBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKFBPLCBJSV9TTk9PUF9ORVhUKSA9PSBtZSkpICYmIHNub29wZXIwICl7CisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICl7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpzbm9vcChtZSk7CisgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gMDsKK30KKworCisKKy8vICogRW11bGF0aW9uIGRlcyAnYWx0ZW4nIGV4cGxvZGUgZHVyY2ggZGFzIG5ldWUKK3N0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkgeworICBpbnQgcywgdDsKKyAgc3RyaW5nICpzdHJzOworCisgIGlmICghc3RyaW5ncChzdHIpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDEgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLHN0cikpOworICB9CisgIGlmICghc3RyaW5ncChkZWwpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDIgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgorICAgICAgICAgIiUuMzBPXG4iLGRlbCkpOworICB9CisgIGlmKGRlbCA9PSAiIikKKyAgICByZXR1cm4gKHtzdHJ9KTsKKyAgc3Rycz1lZnVuOjpleHBsb2RlKHN0ciwgZGVsKTsKKyAgdD1zaXplb2Yoc3RycyktMTsKKyAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpO3MtLTsKKyAgd2hpbGUodD49MCAmJiBzdHJzW3QtLV0gPT0gIiIpO3QrKzsKKyAgaWYoczw9dCkKKyAgICByZXR1cm4gc3Ryc1tzLi50XTsKKyAgcmV0dXJuICh7fSk7Cit9CisKK2ludCBmaWxlX3RpbWUoc3RyaW5nIHBhdGgpIHsKKyAgbWl4ZWQgKnY7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKHNpemVvZih2PWdldF9kaXIocGF0aCxHRVRESVJfREFURVMpKSkgcmV0dXJuIHZbMF07CisgIHJldHVybigwKTsgLy9zb25zdAorfQorCisvLyAqIEJlaSA1MGsgR3JvZXNzZSBMb2ctRmlsZSByb3RpZXJlbgordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKSB7CisgIG1peGVkICpzdDsKKworICBmaWxlPSIvbG9nLyIrZmlsZTsKKyAgZmlsZT1pbXBsb2RlKChlZnVuOjpleHBsb2RlKGZpbGUsIi8iKS0oeyIuLiJ9KSksIi8iKTsKKy8vICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiam9mIiksc3ByaW50ZigiTE9HIEZJTEU6ICVPIC0+ICVPXG4iLHByZXZpb3VzX29iamVjdCgpLGZpbGUpKTsKKyAgaWYgKCFmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y2FsbF9vdGhlcixQTyksInNlY3VyZS9tYXN0ZXIiLC8vJykKKyAgICAgICAgICAgICAgInZhbGlkX3dyaXRlIixmaWxlLGdldGV1aWQoUE8pLCJsb2dfZmlsZSIsUE8pKQorICAgICAgcmV0dXJuIDA7CisgIGlmICggc2l6ZV90b19icmVhayA+PSAwICYgKAorICAgICAgc2l6ZW9mKHN0ID0gZ2V0X2RpcihmaWxlLDIpICkgJiYgc3RbMF0gPj0gKHNpemVfdG9fYnJlYWt8TUFYX0xPR19TSVpFKSkpCisgICAgICBjYXRjaChyZW5hbWUoZmlsZSwgZmlsZSArICIub2xkIik7cHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KKyAgcmV0dXJuKHdyaXRlX2ZpbGUoZmlsZSx0eHQpKTsKK30KKworLy8gKiBNYWdpZXItTGV2ZWwgYWJmcmFnZW4KK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSB7CisgIHJldHVybiAoaW50KSIvc2VjdXJlL21hc3RlciItPnF1ZXJ5X3dpel9sZXZlbChwbGF5ZXIpOworfQorCisjaWZkZWYgX19BTElTVFNfXworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkga2V5KQorbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgaSxqOworCisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgIHsKKyAgICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0KSk8MCkKKyAgICAgIHJldHVybiBhbGlzdDsKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIH0KKyAgaSA9IGFzc29jKGtleSxhbGlzdFswXSk7CisgIGlmICgoaT1hc3NvYyhrZXksYWxpc3RbMF0pKTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsKKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OworfQorCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBwb3MpCittaXhlZCAqZXhjbHVkZV9hbGlzdChpbnQgaSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBqOworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSB8fCBpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CisgIGFsaXN0PWFsaXN0WzAuLl07IC8qIENyZWF0ZSBQSFlTSUNBTCBjb3B5IG9mIGFsaXN0ICovCisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsgLyogb3JkZXJfYWxpc3QgaXMgTk9UIG5lY2Vzc2FyeSAtIHNlZSAvZG9jL0xQQy9hbGlzdCAqLworfQorI2VuZGlmIC8vIF9fQUxJU1RTX18KKworLy8gKiBHZXJtYW4gdmVyc2lvbiBvZiBjdGltZSgpCisjZGVmaW5lIFRBR0UgKHsiU29uIiwiTW9uIiwiRGllIiwiTWl0IiwiRG9uIiwiRnJlIiwiU2FtIn0pCisjZGVmaW5lIE1PTkFURSAoeyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLFwKKyAgICAgICAgICAgICAgICAgIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJ9KQorc3RyaW5nIGR0aW1lKGludCB3YW5uKSB7CisgIAorICBpZiAod2FubiA9PSBkdGltZV9jYWNoZVswXSkKKyAgICByZXR1cm4oZHRpbWVfY2FjaGVbMV0pOworCisgIGludCAqbHQgPSBsb2NhbHRpbWUod2Fubik7CisgIHJldHVybiBzcHJpbnRmKCIlcywgJTJkLiAlcyAlZCwgJTAyZDolMDJkOiUwMmQiLAorICAgICAgVEFHRVtsdFtUTV9XREFZXV0sIGx0W1RNX01EQVldLCBNT05BVEVbbHRbVE1fTU9OXV0sIAorICAgICAgbHRbVE1fWUVBUl0sbHRbVE1fSE9VUl0sIGx0W1RNX01JTl0sIGx0W1RNX1NFQ10pOworfQorCisvLyB3ZW5uIHN0cmZ0aW1lIGltIERyaXZlciBuaWNodCBleGlzdGllcnQsIGlzdCBkaWVzIGhpZXIgZWluIEFsaWFzIGF1ZiBkdGltZSgpLAorLy8gendhciBzdGltbXQgZGFzIEZvcm1hdCBkYW5uIG5pY2h0LCBhYmVyIGRpZSBNdWRsaWIgYnVnZ3QgbmljaHQgdW5kIHNjaHJlaWJ0CisvLyBlaW4gb3JkZW50bGljaGVzIERhdHVtL1VocnplaXQuCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCit2YXJhcmdzIHN0cmluZyBzdHJmdGltZShtaXhlZCBmbXQsIGludCBjbG9jaywgaW50IGxvY2FsaXplZCkgeworICBpZiAoaW50cChjbG9jaykgJiYgY2xvY2sgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoY2xvY2spOworICBlbHNlIGlmIChpbnRwKGZtdCkgJiYgZm10ID49IDApCisgICAgcmV0dXJuIGR0aW1lKGZtdCk7CisgIAorICByZXR1cm4gZHRpbWUodGltZSgpKTsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQorCisvLyAqIFNodXRkb3duIG1pdCB6dXNhZXR6bGljaGVtIGxvZ2dpbmcKK25vbWFzayBpbnQgc2h1dGRvd24oc3RyaW5nIHJlYXNvbikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIHN0cmluZyBvYm5hbWU7CisgIHN0cmluZyBvdXRwdXQ7CisKKyAgaWYgKCFyZWFzb24pCisgICAgcmV0dXJuIDA7CisgIGlmICggIUFSQ0hfU0VDVVJJVFkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSE9Uk9PVElEICYmCisgICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL29iai9zaHV0IiApCisgIHsKKyAgICB3cml0ZSgiWW91IGhhdmUgbm8gcGVybWlzc2lvbiB0byBzaHV0IGRvd24gdGhlIGdhbWVkcml2ZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKHRoaXNfaW50ZXJhY3RpdmUoKSkmJihuYW1lPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSkKKyAgeworICAgIG5hbWU9Y2FwaXRhbGl6ZShuYW1lKTsKKyAgICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LC8vJworICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIhXG4iKTsKKyAgfQorICBlbHNlCisgICAgbmFtZT0iQU5PTllNT1VTIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpKSBvYm5hbWU9Y2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKKyAgb3V0cHV0PW5hbWU7CisgIGlmIChvYm5hbWUgJiYgbmFtZSE9b2JuYW1lKSBvdXRwdXQ9b3V0cHV0KyIgKCIrb2JuYW1lKyIpIjsKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpJiZvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PSIvb2JqL3NodXQiKXsKKyAgICBvdXRwdXQrPSIgZmFlaHJ0IGRhcyBTcGllbCB2aWEgQXJtYWdlZGRvbiBoZXJ1bnRlci5cbiI7CisgICAgb3V0cHV0PWR0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQ7CisgICAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgICAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBvdXRwdXQ9Y3RpbWUodGltZSgpKSsiOiAiK291dHB1dCsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIuXG4iOworICBvdXRwdXQrPSIgICAgR3J1bmQ6ICIrcmVhc29uOworICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgZWZ1bjo6c2h1dGRvd24oKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vICogbG93ZXJjaGFyCisKK2ludCBsb3dlcmNoYXIoaW50IGNoYXIpIHsKKyAgaWYgKGNoYXI8J0EnIHx8IGNoYXI+J1onKSByZXR1cm4gY2hhcjsKKyAgcmV0dXJuIGNoYXIrMzI7Cit9CisKKy8vICogdXBwZXJzdHJpbmcKKworc3RyaW5nIHVwcGVyc3RyaW5nKHN0cmluZyBzKQoreworI2lmIF9fRUZVTl9ERUZJTkVEX18odXBwZXJfY2FzZSkKKyAgcmV0dXJuKHVwcGVyX2Nhc2UocykpOworI2Vsc2UKKyAgaW50IGk7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgc1tpXT0oKHNbaV08J2EnfHxzW2ldPid6Jyk/c1tpXTpzW2ldLTMyKTsKKyAgcmV0dXJuIHM7CisjZW5kaWYKK30KKworLy8gKiBsb3dlcnN0cmluZworCitzdHJpbmcgbG93ZXJzdHJpbmcoc3RyaW5nIHMpCit7CisgIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CisgIHJldHVybiBsb3dlcl9jYXNlKHMpOworfQorCisKKy8vICogR0QgdmVyc2lvbgorc3RyaW5nIHZlcnNpb24oKQoreworICByZXR1cm4gX19WRVJTSU9OX187Cit9CisKKy8vICogYnJlYWtfc3RyaW5nCisvLyBzdHJldGNoKCkgLS0gc3RyZXRjaCBhIGxpbmUgdG8gZmlsbCBhIGdpdmVuIHdpZHRoIAorcHJpdmF0ZSBzdHJpbmcgc3RyZXRjaChzdHJpbmcgcywgaW50IHdpZHRoKSB7CisgIGludCBsZW49c2l6ZW9mKHMpOworICBpZiAobGVuPT13aWR0aCkgcmV0dXJuIHM7CisKKyAgLy8gcmVpbmUgTGVlcnplaWxlbiwgZGlyZWt0IHp1cnVlY2tnZWJlbgorICBzdHJpbmcgdHJpbW1lZD10cmltKHMsVFJJTV9MRUZULCIgIik7CisgIGlmICh0cmltbWVkPT0iIikgcmV0dXJuIHM7IAorICBpbnQgc3RhcnRfc3BhY2VzID0gbGVuIC0gc2l6ZW9mKHRyaW1tZWQpOworCisgIHN0cmluZyogd29yZHMgPSBleHBsb2RlKHRyaW1tZWQsICIgIik7CisgIC8vIGRlciBsZXR6dGUga3JpZWd0IGtlaW5lIFNwYWNlcworICBpbnQgd29yZF9jb3VudD1zaXplb2Yod29yZHMpIC0gMTsKKyAgLy8gd2VubiBaZWlsZSBudXIgYXVzIGVpbmVtIFdvcnQsIHdpcmQgZGFzIFdvcnQgenVydWVja2dlZ2ViZW4KKyAgaWYgKCF3b3JkX2NvdW50KQorICAgIHJldHVybiAiICIqc3RhcnRfc3BhY2VzICsgd29yZHNbMF07CisKKyAgaW50IHNwYWNlX2NvdW50ID0gd2lkdGggLSBsZW47CisKKyAgaW50IHNwYWNlX3Blcl93b3JkPSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAvIHdvcmRfY291bnQ7CisgIC8vIEFuei5Xb2VydGVyIG1pdCBadXNhdHotU3BhY2UKKyAgaW50IHJlc3Q9KHdvcmRfY291bnQrc3BhY2VfY291bnQpICUgd29yZF9jb3VudDsgCisgIC8vIFJlc3QtU3BhY2VzIFZlcnRlaWxlbgorICBmb3JlYWNoIChpbnQgcG9zIDogcmVzdCkgd29yZHNbcG9zXSs9IiAiOworICByZXR1cm4gKCIgIipzdGFydF9zcGFjZXMpICsgaW1wbG9kZSggd29yZHMsICIgIipzcGFjZV9wZXJfd29yZCApOworfQorCisvLyBhdXMgR2VzY2h3aW5kaWdrZWl0c2dydWVuZGVuIGhhdCBkZXIgQmxvY2tzYXR6IGZ1ZXIgYnJlYWtfc3RyaW5nIGVpbmUKKy8vIGVpZ2VuZSBGdW5rdGlvbiBiZWtvbW1lbjoKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgYmxvY2tfc3RyaW5nKHN0cmluZyBzLCBpbnQgd2lkdGgsIGludCBmbGFncykgeworICAvLyB3ZW5uIEJTX0xFQVZFX01ZX0xGUywgYWJlciBrZWluIEJTX05PX1BBUklOREVOVCwgZGFubiB3ZXJkZW4gWmVpbGVuIG1pdAorICAvLyBlaW5lbSBMZWVyemVpY2hlbiBiZWdvbm5lbi4KKyAgLy8gQlRXOiBXZW5uICFCU19MRUFWRV9NWV9MRlMsIGhhdCBkZXIgQXVmcnVmZXIgYmVyZWl0cyBhbGxlIFxuIGR1cmNoICIgIgorICAvLyBlcnNldHp0LgorICBpZiAoIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykKKyAgICAgICYmICEoZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpKQorICB7CisgICAgICBzID0gIiAiK3JlZ3JlcGxhY2UocywiXG4iLCJcbiAiLDEpOworICB9CisKKyAgLy8gc3ByaW50ZiBmdWVsbHQgZGllIGxldHp0ZSBaZWlsZSBhdWYgZGllIEZlbGRicmVpdGUgKGhpZXIgYWxzbworICAvLyBaZWlsZW5icmVpdGUpIG1pdCBGdWVsbHplaWNoZW4gYXVmLCB3ZW5uIHNpZSBOSUNIVCBtaXQgXG4gdW1nZWJyb2NoZW4KKyAgLy8gaXN0LiBFcyB3aXJkIGFuIGRpZSBsZXR6dGUgWmVpbGUgYWJlciBrZWluIFplaWxlbnVtYnJ1Y2ggYW5nZWhhZW5ndC4KKyAgLy8gRWlnZW50bGljaCBpc3QgZGFzIEF1ZmZ1ZWxsZW4gZG9vZiwgYWJlciB2ZXJtdXRsaWNoIGlzdCBlcyB1bm5vZXRpZywgZXMKKyAgLy8gd2llZGVyIHJ1ZWNrZ2FlbmdpZyB6dSBtYWNoZW4uCisgIHMgPSBzcHJpbnRmKCAiJS0qPXMiLCB3aWR0aCwgcyk7CisKKyAgc3RyaW5nICp0bXA9ZXhwbG9kZShzLCAiXG4iKTsKKyAgLy8gTnVyIHdlbm4gcyBtZWhyemVpbGlnIGlzdCwgQmxvY2tzYXR6IGRyYXVzIG1hY2hlbi4gRGllIGxldHp0ZSBaZWlsZSB3aXJkCisgIC8vIG5hdHVlcmxpY2ggbmljaHQgZ2VkZWhudC4gU2llIGlzdCBkYWZ1ZXIgc2Nob24gdm9uIHNwcmludGYoKSBhdWZnZWZ1ZWxsdAorICAvLyB3b3JkZW4uIEJUVzogRGllIGxldHp0ZSBaZWlsZSBlbmRldCB1LlUuIG5vY2ggbmljaHQgbWl0IGVpbmVtIFxuIChiencuCisgIC8vIG51ciBkYW5uLCB3ZW5uIEJTX0xFQVZFX01ZX0xGUyB1bmQgZGVyIHVlYmVyZ2ViZW5lIFRleHQgc2Nob24gbmVuIFxuIGFtCisgIC8vIEVuZGUgZGVyIGxldHp0ZW4gWmVpbGUgaGF0KSwgZGFzIG1hY2h0IGRlciBBdWZydWZlci4uLgorICBpZiAoc2l6ZW9mKHRtcCkgPiAxKQorICAgIHJldHVybiBpbXBsb2RlKCBtYXAoIHRtcFswLi48Ml0sICMnc3RyZXRjaC8qJyovLCB3aWR0aCApLCAiXG4iICkgCisgICAgICArICJcbiIgKyB0bXBbPDFdOworCisgIHJldHVybiBzOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzLCBpbnQgdywgbWl4ZWQgaW5kZW50LCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKCAhcyB8fCBzID09ICIiICkgcmV0dXJuICIiOworCisgICAgaWYgKCAhdyApIHc9Nzg7CisKKyAgICBpZiggaW50cChpbmRlbnQpICkKKyAgICAgICBpbmRlbnQgPSBpbmRlbnQgPyAiICIqaW5kZW50IDogIiI7CisKKyAgICBpbnQgaW5kZW50bGVuPXN0cmluZ3AoaW5kZW50KSA/IHNpemVvZihpbmRlbnQpIDogMDsKKworICAgIGlmIChpbmRlbnRsZW4+dykgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoImJyZWFrX3N0cmluZzogaW5kZW50IGxvbmdlciAlZCB0aGFuIHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgICAgaW5kZW50bGVuLHcpKTsKKyAgICAgIC8vIHc9KChpbmRlbnRsZW4vdykrMSkqdzsKKyAgICB9CisKKyAgICBpZiAoIShmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykpIAorICAgICAgcz1yZWdyZXBsYWNlKCBzLCAiXG4iLCAiICIsIDEgKTsKKworICAgIGlmICggZmxhZ3MgJiBCU19TSU5HTEVfU1BBQ0UgKQorICAgICAgIHMgPSByZWdyZXBsYWNlKCBzLCAiKF58XG58ICkgICoiLCAiXFwxIiwgMSApOworIAorICAgIHN0cmluZyBwcmVmaXg9IiI7CisgICAgaWYgKGluZGVudGxlbiAmJiBmbGFncyAmIEJTX1BSRVBFTkRfSU5ERU5UKSB7CisgICAgICBpZiAoaW5kZW50bGVuK3NpemVvZihzKSA+IHcgfHwgCisgICAgICAgICAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpICYmIHN0cnN0cihzLCJcbiIpPi0xKSB7CisgICAgICAgcHJlZml4PWluZGVudCsiXG4iOworICAgICAgIGluZGVudD0oZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpID8gIiIgOiAiICI7CisgICAgICAgaW5kZW50bGVuPXNpemVvZihpbmRlbnQpOworICAgICAgfQorICAgIH0KKworICAgIGlmICggZmxhZ3MgJiBCU19CTE9DSyApIHsKKyAgICAgIC8qCisgICAgICAgICAgIHMgPSBpbXBsb2RlKCBtYXAoIGV4cGxvZGUoIHMsICJcbiIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2Jsb2NrX3N0cmluZywgdywgaW5kZW50bGVuLCBmbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgIiIgKTsKKyAgICAgICovCisgICAgICBzID0gYmxvY2tfc3RyaW5nKCBzICwgdyAtIGluZGVudGxlbiwgZmxhZ3MgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzID0gc3ByaW50ZigiJS0xLio9cyIsdy1pbmRlbnRsZW4scyk7CisgICAgfQorICAgIGlmICggc1s8MV0gIT0gJ1xuJyApIHMgKz0gIlxuIjsKKworICAgIGlmICggIWluZGVudGxlbiApIHJldHVybiBwcmVmaXggKyBzOworICAgIAorICAgIHN0cmluZyBpbmRlbnQyID0gKCBmbGFncyAmIEJTX0lOREVOVF9PTkNFICkgPyAoIiAiKmluZGVudGxlbikgOmluZGVudDsKKyAgICAgIAorICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyAKKyAgICAgIHJlZ3JlcGxhY2UoIHNbMC4uPDJdLCAiXG4iLCAiXG4iK2luZGVudDIsIDEgKSArICJcbiI7CisgICAgICAvKgorICAgICAgIHN0cmluZyAqYnVmOworCisgICAgICAgYnVmID0gZXhwbG9kZSggcywgIlxuIiApOworICAgICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyBpbXBsb2RlKCBidWZbMC4uPDJdLCAiXG4iK2luZGVudDIgKSArIGJ1Zls8MV0gKyAiXG4iOworICAgICAgKi8KK30KKworLy8gKiBFbGVtZW50ZSBhdXMgbWFwcGluZyBsb2VzY2hlbiAtIG1hcHBpbmcgdm9yaGVyIGtvcGllcmVuCisKK21hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG0sIG1peGVkIGtleSkgeworICByZXR1cm4gbV9kZWxldGUoY29weShtKSwga2V5KTsKK30KKworLy8gKiB0aW1lcworaW50IGxhc3RfcmVib290X3RpbWUoKQoreworICByZXR1cm4gX19CT09UX1RJTUVfXzsKK30KKworaW50IGZpcnN0X2Jvb3RfdGltZSgpCit7CisgIHJldHVybiA3MDE1MTc2MDA7Cit9CisKK2ludCBleGlzdF9kYXlzKCkKK3sKKyAgcmV0dXJuICgoKHRpbWUoKS1maXJzdF9ib290X3RpbWUoKSkvODY0MCkrNSkvMTA7Cit9CisKKy8vICogdXB0aW1lIDopCitzdHJpbmcgdXB0aW1lKCkKK3sKKyAgaW50IHQ7CisgIGludCB0bXA7CisgIHN0cmluZyBzOworCisgIHQ9dGltZSgpLV9fQk9PVF9USU1FX187CisgIHM9IiI7CisgIGlmICh0Pj04NjQwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBUYWclcywgIix0bXA9dC84NjQwMCwodG1wPT0xPyIiOiJlIikpOworICBpZiAodD49MzYwMCkKKyAgICBzKz1zcHJpbnRmKCIlZCBTdHVuZGUlcywgIix0bXA9KHQ9dCU4NjQwMCkvMzYwMCwodG1wPT0xPyIiOiJuIikpOworICBpZiAodD42MCkKKyAgICBzKz1zcHJpbnRmKCIlZCBNaW51dGUlcyB1bmQgIix0bXA9KHQ9dCUzNjAwKS82MCwodG1wPT0xPyIiOiJuIikpOworICByZXR1cm4gcytzcHJpbnRmKCIlZCBTZWt1bmRlJXMiLHQ9dCU2MCwodD09MT8iIjoibiIpKTsKK30KKworLy8gKiBXYXMgdHVuIGJlaSAnZGFuZ2xpbmcnIGxmdW4tY2xvc3VyZXMgPwordm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKSB7CisgIHJhaXNlX2Vycm9yKCJkYW5nbGluZyBsZnVuIGNsb3N1cmVcbiIpOworfQorCisvLyAqIFNwZXJyZW4gYXVzc2VyIGZ1ZXIgbWFzdGVyL3NpbXVsX2VmdW4KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2Vudmlyb25tZW50KQorbm9tYXNrIHZvaWQgc2V0X2Vudmlyb25tZW50KG9iamVjdCBvMSwgb2JqZWN0IG8yKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworbm9tYXNrIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBwbCkgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorCisjaWYgX19FRlVOX0RFRklORURfXyhleHBvcnRfdWlkKQorbm9tYXNrIHZvaWQgZXhwb3J0X3VpZChvYmplY3Qgb2IpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCisvLyAqIEpldHp0IGF1Y2ggY2xvc3VyZXMKK2ludCBwcm9jZXNzX2ZsYWc7CisKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpCit7CisgIGlmIChwcm9jZXNzX2ZsYWc+MCkKKyAgICByZXR1cm4gcHJvY2Vzc19mbGFnOworICBlbHNlIHJldHVybigwKTsKK30KKworcHJpdmF0ZSBub21hc2sgc3RyaW5nIF9wcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyLG9iamVjdCBwbykgeworICAgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgICAgICAgICByZXR1cm4oZWZ1bjo6cHJvY2Vzc19zdHJpbmcoc3RyKSk7Cit9CisKK25vbWFzayBzdHJpbmcgcHJvY2Vzc19zdHJpbmcoIG1peGVkIHN0ciApCit7CisgIHN0cmluZyB0bXAsIGVycjsKKyAgaW50IGZsYWc7IAorCisgIGlmICggY2xvc3VyZXAoc3RyKSApIHsKKyAgICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICAgIHJldHVybiBmdW5jYWxsKHN0cik7CisgIH0KKyAgZWxzZSBpZiAoc3RyPT0wKQorICAgICAgcmV0dXJuKChzdHJpbmcpc3RyKTsKKyAgZWxzZSBpZiAoICFzdHJpbmdwKHN0cikgKSB7CisgICAgICByZXR1cm4gdG9fc3RyaW5nKHN0cik7CisgIH0KKworICBpZiAoICEoZmxhZyA9IHByb2Nlc3NfZmxhZyA+IHRpbWUoKSAtIDYwKSkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHByb2Nlc3NfZmxhZz10aW1lKCk7CisKKyAgZXJyID0gY2F0Y2godG1wID0gZnVuY2FsbCgjJ19wcm9jZXNzX3N0cmluZyxzdHIscHJldmlvdXNfb2JqZWN0KCkpOyBwdWJsaXNoKTsKKworICBpZiAoICFmbGFnICkKKyAgICBwcm9jZXNzX2ZsYWc9MDsKKworICBpZiAoZXJyKSB7CisgICAgLy8gVmVyYXJiZWl0dW5nIGFiYnJlY2hlbgorICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3IoZXJyKTsKKyAgfQorICByZXR1cm4gdG1wOworfQorCisvLyAnbWtkaXIgLXAnIC0gZXJ6ZXVndCBlaW5lIGtvbXBsZXR0ZSBIaWVyYXJjaGllIHZvbiBWZXJ6ZWljaG5pc3Nlbi4KKy8vIHdlbm4gZGFzIFZlcnplaWNobmlzIGFuZ2VsZWd0IHd1cmRlIG9kZXIgc2Nob24gZXhpc3RpZXJ0LCB3aXJkIDEKKy8vIHp1cnVlY2tnZWxpZWZlcnQsIHNvbnN0IDAuCisvLyBXaXJmdCBlaW5lbiBGZWhsZXIsIHdlbm4gZGFzIGFuZ2ViZW5lIFZlcnplaWNobmlzIG5pY2h0IGFic29sdXQgaXN0IQorcHVibGljIGludCBta2RpcnAoc3RyaW5nIGRpcikgeworICAvLyB3ZW5uIGVzIG51ciBrZWluZW4gZnVlaHJlbmRlbiAvIGdpYnQsIGlzdCBkYXMgZWluIEZlaGxlci4KKyAgaWYgKHN0cnN0cihkaXIsICIvIikgIT0gMCkKKyAgICByYWlzZV9lcnJvcigibWtkaXJwKCk6IFBmYWQgaXN0IG5pY2h0IGFic29sdXRlLlxuIik7CisgIC8vIGN1dCBvZmYgdHJhaWxpbmcgLy4uLgorICBpZiAoZGlyWzwxXT09Jy8nKQorICAgICAgZGlyID0gZGlyWzAuLjwyXTsKKworICBpbnQgZnN0YXQgPSBmaWxlX3NpemUoZGlyKTsKKyAgLy8gd2VubiBlcyBzY2hvbiBleGlzdGllcnQsIHR1biB3aXIgZWluZmFjaCBzbywgYWxzIGhhZXR0ZW4gd2lyIGVzIGFuZ2VsZWd0LgorICBpZiAoZnN0YXQgPT0gRlNJWkVfRElSKQorICAgIHJldHVybiAxOworICAvLyB3ZW5uIHNjaG9uIG5lIERhdGVpIGV4aXN0aWVydCwgZ2VodCBlcyBuaWNodC4KKyAgaWYgKGZzdGF0ICE9IEZTSVpFX05PRklMRSkKKyAgICByZXR1cm4gMDsKKyAgLy8gd2VubiBlcyBudXIgZWluZW4gLyBnaWJ0IChkZW4gZnVlaHJlbmRlbiksIGRhbm4gaXN0IGVzIGVpbgorICAvLyB0b3BsZXZlbC12ZXJ6ZWljaG5pcywgd2FzIGRpcmVrdCBhbmdlbGVndCB3aXJkLgorICBpZiAoc3RycnN0cihkaXIsIi8iKT09MCkgeworICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKKyAgfQorCisgIC8vIG1rZGlyKCkgbmljaHQgZGlyZWt0IHJ1ZmVuLCBzb25kZXJuIHZvcmhlciBhbHMgY2xvc3VyZSBhbnMgYXVmcnVmZW5kZQorICAvLyBPYmpla3QgYmluZGVuLiBTb25zdCBsYWV1ZnQgZGllIFJlY2h0ZXBydWVmdW5nIGluIHZhbGlkX3dyaXRlKCkgaW0gTWFzdGVyCisgIC8vIHVudGVyIGRlciBBbm5haG1lLCBkYXNzIGRpZSBzaW11bF9lZnVuLmMgbWl0IGlocmVyIHJvb3QgaWQgd2FzIHdpbGwuCisKKyAgLy8gamV0enQgcmVrdXJzaXYgZGllIFZlcnplaWNobmlzaGllcmFyY2hpZSBhbmxlZ2VuLiBXZW5uIGRhcyBlcmZvbGdyZWljaAorICAvLyBpc3QsIGRhbm4ga29lbm5lbiB3aXIgamV0enQgbWl0IG1rZGlyIGRhcyB0aWVmc3RlIFZlcnplaWNobmlzIGFubGVnZW4KKyAgaWYgKG1rZGlycChkaXJbMC4uc3RycnN0cihkaXIsIi8iKS0xXSkgPT0gMSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7Cit9CisKKworLy8gKiBQcm9wZXJ0aWVzIGdnZnMuIG1pdHNwZWljaGVybgorbWl4ZWQgc2F2ZV9vYmplY3QobWl4ZWQgbmFtZSkKK3sKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBtYXBwaW5nIHNhdmU7CisgIG1peGVkIGluZGV4LCByZXM7CisgIGludCBpOworCisgIC8vIG51ciBTdHJpbmdzIHVuZCAwIHp1bGFzc2VuCisgIGlmICgoIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSkgJiYgCisgICAgICAoIWludHAobmFtZSkgfHwgbmFtZSE9MCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgbm9uLWVtcHR5IHN0cmluZ3MgYW5kIDAgbWF5IGJlIHVzZWQgYXMgZmlsZW5hbWUgaW4gIgorICAgICAgICAgInNlZnVuOjpzYXZlX29iamVjdCgpISBBcmd1bWVudCB3YXMgJU9cbiIsbmFtZSkpOworICB9CisKKyAgc2F2ZSA9IG1fYWxsb2NhdGUoMCwgMik7CisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKyAgaWYobWFwcGluZ3AocHJvcGVydGllcykpCisgIHsKKyAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQorICAgIGluZGV4ID0gbV9pbmRpY2VzKHByb3BlcnRpZXMpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wO2ktLSkKKyAgICB7CisgICAgICBpZihwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYgU0FWRSkKKyAgICAgIHsKKyAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOworICAgICAgIHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0gPQorICAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJgorICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2Ugc2F2ZSA9IChbXSk7CisKKyAgLy8gc2F2ZSBvYmplY3QhCisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YShzYXZlKTsKKyAgLy8gZm9ybWF0OiB3aWUgZGVmaW5pZXJ0IGluIGNvbmZpZy5oCisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBlbHNlCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIGlmIChzdHJpbmdwKG5hbWUpKQorICAgICAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIGVsc2UKKyAgICAgIHN0YXQtPnNpemVvZihyZXMpOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisgIHNhdmVvX3N0YXRbMV1bc2F2ZW9fc3RhdFswXV0gPSBzdGF0OworICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbyAyOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7CisjZW5kaWYKKworICByZXR1cm4gcmVzOworfQorCisvLyAqIEF1Y2ggUHJvcGVydGllcyBsYWRlbgoraW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBuYW1lKQoreworICBpbnQgcmVzdWx0OworICBtaXhlZCBpbmRleDsKKyAgbWl4ZWQgc2F2ZTsKKyAgbWFwcGluZyBwcm9wZXJ0aWVzOworICBpbnQgaTsKKyAgY2xvc3VyZSBjbDsKKworICAvLyBnZXQgYWN0dWFsIHByb3BlcnR5IHNldHRpbmdzIChieSBjcmVhdGUoKSkKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworLy8gIERFQlVHKHNwcmludGYoIlJFU1RPUkUgJU9cbiIsbmFtZSkpOworICAvLyByZXN0b3JlIG9iamVjdAorICByZXN1bHQ9ZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnJlc3RvcmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUpOworICAvLycpKQorICAvL19nZXRfc2F2ZV9kYXRhIGxpZWZlcnQgdGF0c2FlY2hsaWNoIG1peGVkIHp1cnVlY2ssIHdlbm4gZGFzIGF1Y2ggaW1tZXIgZWluIAorICAvL21hcHBpbmcgc2VpbiBzb2xsdGUuCisgIHNhdmUgPSAobWl4ZWQpcHJldmlvdXNfb2JqZWN0KCktPl9nZXRfc2F2ZV9kYXRhKCk7CisgIGlmKG1hcHBpbmdwKHNhdmUpKQorICB7CisgICAgaW5kZXggPSBtX2luZGljZXMoc2F2ZSk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7IGktLSkKKyAgICB7CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldXSA9IHNhdmVbaW5kZXhbaV1dOworICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSA9IHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmfihTRVRDQUNIRUR8UVVFUllDQUNIRUQpOworICAgIH0KKyAgfQorICBlbHNlIHByb3BlcnRpZXMgPSAoW10pOworCisgIC8vIHJlc3RvcmUgcHJvcGVydGllcworICBmdW5jYWxsKAorICAgICAgICAgIGJpbmRfbGFtYmRhKAorICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoKHsnYXJnfSksIC8vJ30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsKHsjJ3RoaXNfb2JqZWN0fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3BlcnRpZXMiLCdhcmd9KSksLy8nKQorICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLHByb3BlcnRpZXMpOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIC8vZGVidWdfbWVzc2FnZSgicmVzdG9yZW86ICIrcmVzdG9yZW9fc3RhdFswXSsiXG4iKTsKKyAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CisgIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICBzdGF0LT50aW1lID0gdGltZSgpOworICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKKyAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7CisgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICByZXN0b3Jlb19zdGF0WzFdW3Jlc3RvcmVvX3N0YXRbMF1dID0gc3RhdDsKKworICByZXN0b3Jlb19zdGF0WzBdID0gKHJlc3RvcmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihyZXN0b3Jlb19zdGF0WzFdKTsKKyNlbmRpZgorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vICogSEIgZWluZXMgT2JqZWt0ZXMgZWluL2F1c3NjaGFsdGVuCitpbnQgc2V0X29iamVjdF9oZWFydF9iZWF0KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIGlmIChvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNvbmZpZ3VyZV9vYmplY3Qsb2IpLCBvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Cit9CisKKy8vICogTWFnaWVybGV2ZWxncnVwcGVuIGVybWl0dGVsbgoraW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KQoreworICBpbnQgbGV2OworCisgIGxldj1xdWVyeV93aXpfbGV2ZWwod2l6KTsKKyAgaWYgKGxldjxTRUVSX0xWTCkgcmV0dXJuIDA7CisgIGlmIChsZXY+PUdPRF9MVkwpIHJldHVybiBsZXY7CisgIGlmIChsZXY+PUFSQ0hfTFZMKSByZXR1cm4gQVJDSF9HUlA7CisgIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIEVMREVSX0dSUDsKKyAgaWYgKGxldj49TE9SRF9MVkwpIHJldHVybiBMT1JEX0dSUDsKKyAgaWYgKGxldj49U1BFQ0lBTF9MVkwpIHJldHVybiBTUEVDSUFMX0dSUDsKKyAgaWYgKGxldj49RE9NQUlOTUVNQkVSX0xWTCkgcmV0dXJuIERPTUFJTk1FTUJFUl9HUlA7CisgIGlmIChsZXY+PVdJWkFSRF9MVkwpIHJldHVybiBXSVpBUkRfR1JQOworICBpZiAobGV2Pj1MRUFSTkVSX0xWTCkgcmV0dXJuIExFQVJORVJfR1JQOworICByZXR1cm4gU0VFUl9HUlA7Cit9CisKK21peGVkICp3aXpsaXN0X2luZm8oKQoreworICBpZiAoQVJDSF9TRUNVUklUWSB8fCAhZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vICogd2l6bGlzdCBhdXNnZWJlbgordmFyYXJncyB2b2lkIHdpemxpc3Qoc3RyaW5nIG5hbWUsIGludCBzb3J0a2V5ICkgeworCisgIGlmICghbmFtZSkKKyAgeworICAgIGlmICh0aGlzX3BsYXllcigpKQorICAgICAgbmFtZSA9IGdldHVpZCh0aGlzX3BsYXllcigpKTsKKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm47CisgIH0KKworICAvLyBTY2hsdWVzc2VsIGRhcmYgbnVyIGluIGVpbmVtIGd1ZWx0aWdlbiBCZXJlaWNoIHNlaW4KKyAgaWYgKHNvcnRrZXk8V0xfTkFNRSB8fCBzb3J0a2V5Pj1XTF9TSVpFKSBzb3J0a2V5PVdMX0NPU1Q7CisKKyAgbWl4ZWQqKiB3bCA9IGVmdW46Ondpemxpc3RfaW5mbygpOworICAvLyBuYWNoIDxzb3J0a2V5PiBzb3J0aWVyZW4KKyAgd2wgPSBzb3J0X2FycmF5KHdsLCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpCisgICAgICB7cmV0dXJuIGFbc29ydGtleV0gPCBiW3NvcnRrZXldOyB9ICk7CisKKyAgLy8gU3VtbWUgdWViZXIgYWxsZSBLb21tYW5kb3MgZXJtaXR0ZWxuLgorICBpbnQgdG90YWxfY21kLCBpOworICBpbnQgcG9zPS0xOworICBmb3JlYWNoKG1peGVkIGVudHJ5IDogd2wpCisgIHsKKyAgICB0b3RhbF9jbWQgKz0gZW50cnlbV0xfQ09NTUFORFNdOworICAgIGlmIChlbnRyeVtXTF9OQU1FXSA9PSBuYW1lKQorICAgICAgcG9zID0gaTsKKyAgICArK2k7CisgIH0KKworICBpZiAocG9zIDwgMCAmJiBuYW1lICE9ICJBTEwiICYmIG5hbWUgIT0gIlRPUDEwMCIpCisgICAgcmV0dXJuOworCisgIGlmIChuYW1lID09ICJUT1AxMDAiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPiAxMDApCisgICAgICB3bCA9IHdsWzAuLjEwMF07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorICAvLyB1bSBuYW1lIGhlcnVtIHNjaG5laWRlbgorICBlbHNlIGlmIChuYW1lICE9ICJBTEwiKQorICB7CisgICAgaWYgKHNpemVvZih3bCkgPD0gMjEpCisgICAgICB3bCA9IHdsOworICAgIGVsc2UgaWYgKHBvcyArIDEwIDwgc2l6ZW9mKHdsKSAmJiBwb3MgLSAxMCA+IDApCisgICAgICB3bCA9IHdsW3Bvcy0xMC4ucG9zKzEwXTsKKyAgICBlbHNlIGlmIChwb3MgPD0yMSkKKyAgICAgIHdsID0gd2xbMC4uMjBdOworICAgIGVsc2UgaWYgKHBvcyA+PSBzaXplb2Yod2wpIC0gMjEpCisgICAgICB3bCA9IHdsWzwyMS4uXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisKKyAgd3JpdGUoIlxuV2l6YXJkIHRvcCBzY29yZSBsaXN0XG5cbiIpOworICBpZiAodG90YWxfY21kID09IDApCisgICAgdG90YWxfY21kID0gMTsKKyAgcHJpbnRmKCIlLTIwcyAlLTZzICUtM3MgJS0xN3MgJS02cyAlLTZzICUtNnNcbiIsCisgICAgICAgICAiRVVJRCIsICJjbWRzIiwgIiUiLCAiQ29zdHMiLCAiSEIiLCAiQXJyYXlzIiwiTWFwcC4iKTsKKyAgZm9yZWFjaChtaXhlZCBlOiB3bCkKKyAgeworICAgIHByaW50ZigiJS06MjBzICU6NmQgJToyZCUlIFslOjZkaywlOjZkR10gJTo2ZCAlOjZkICU6NmRcbiIsCisgICAgICAgICAgZVtXTF9OQU1FXSwgZVtXTF9DT01NQU5EU10sIGVbV0xfQ09NTUFORFNdICogMTAwIC8gdG90YWxfY21kLAorICAgICAgICAgIGVbV0xfQ09TVF0gLyAxMDAwLCBlW1dMX1RPVEFMX0dJR0FDT1NUXSwKKyAgICAgICAgICBlW1dMX0hFQVJUX0JFQVRTXSwgZVtXTF9BUlJBWV9UT1RBTF0sIGVbV0xfTUFQUElOR19UT1RBTF0KKyAgICAgICAgICApOworICB9CisgIHByaW50ZigiXG5Ub3RhbCAgICAgICAgICU3ZCAgICAgICAgICglZClcblxuIiwgdG90YWxfY21kLCBzaXplb2Yod2wpKTsKK30KKworCisvLyBBYiBoaWVyIGZvbGdlbiBIaWxmc2Z1bmt0aW9uZW4gZnVlciBjYWxsX291dCgpIGJ6dy4gZnVlciBkZXJlbiBCZWdyZW56dW5nCisKKy8vIGVybWl0dGVsdCBkYXMgT2JqZWt0IGRlcyBDYWxsb3V0cy4KK3ByaXZhdGUgb2JqZWN0IF9jYWxsX291dF9vYmooIG1peGVkIGNhbGxfb3V0ICkgeworICAgIHJldHVybiBwb2ludGVycChjYWxsX291dCkgPyBjYWxsX291dFswXSA6IDA7Cit9CisKK3ByaXZhdGUgdm9pZCBfc2FtZV9vYmplY3QoIG9iamVjdCBvYiwgbWFwcGluZyBtICkgeworICAvLyBpc3QgbmljaHQgc28gYmxvZWQsIHdpZSBlcyBhdXNzaWVodCwgcy4gbmFjaGZvbGdlZGUgVmVyd2VuZHVuZyB2b24gbQorICBpZiAoIG1bb2JdICkKKyAgICBtW29iXSArPSAoeyBvYiB9KTsKKyAgZWxzZQorICAgIG1bb2JdID0gKHsgb2IgfSk7IAorfQorCisvLyBhbGxlIE9iamVrdGUgaW0gTWFwcGluZyBtIHp1c2FtbWVuZmFzc2VuLCBkaWUgZGVuIGdsZWljaGVuIExvYWRuYW1lIChOYW1lIGRlcgorLy8gQmx1ZXByaW50KSBoYWJlbiwgYWxzbyBhbGxlIENsb25lcyBkZXIgQlAsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4uCisvLyBPYmpla3RlIHdlcmRlbiBhdWNoIG1laHJmYWNoIGVyZmFzc3QsIGplIG5hY2ggQW56YWhsIGlocmVyIENhbGxvdXRzLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3BhdGgoIG9iamVjdCBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0gKSB7CisgIHN0cmluZyBwYXRoOworICBpZiAoIW9iamVjdHAoa2V5KSB8fCAhcG9pbnRlcnAob2JzKSkgcmV0dXJuOworCisgIHBhdGggPSBsb2FkX25hbWUoa2V5KTsKKworICBpZiAoIG1bcGF0aF0gKQorICAgIG1bcGF0aF0gKz0gb2JzOworICBlbHNlCisgICAgbVtwYXRoXSA9IG9iczsKK30KKworLy8ga2V5IGthbm4gb2JqZWN0IG9kZXIgc3RyaW5nIHNlaW4uCitwcml2YXRlIGludCBfdG9vX21hbnkoIG1peGVkIGtleSwgbWFwcGluZyBtLCBpbnQgaSApIHsKKyAgICByZXR1cm4gc2l6ZW9mKG1ba2V5XSkgPj0gaTsKK30KKworLy8gYWxsZSBPYmpla3RlIGluIG9icyB6ZXJzdG9lcmVuIHVuZCBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuLiBBQ0hUVU5HOiBEaWUKKy8vIE9iamVrdGUgd2VyZGVuIGlkUiB6dSBlaW5lciBCUCBnZWhvZXJlbiwgbXVlc3NlbiBhYmVyIG5pY2h0ISBJbiBkZW0gRmFsbAorLy8gd2lyZCBhdWYgZGVyIEViZW5lIGFiZXIgbnVyIGVpbiBPYmpla3QgaW4gZGVyIEZlaGxlcm1lbGR1bmcgZXJ3YWVobnQuCitwcml2YXRlIHZvaWQgX2Rlc3Ryb3koIG1peGVkIGtleSwgb2JqZWN0ICpvYnMsIHN0cmluZyB0ZXh0LCBpbnQgdWlkICkgeworICAgIGlmICghcG9pbnRlcnAob2JzKSkgcmV0dXJuOworICAgIC8vIEFycmF5IG1pdCB1bmlxdWUgRWludHJhZWdlIGVyemV1Z2VuLgorICAgIG9icyA9IG1faW5kaWNlcyggbWttYXBwaW5nKG9icykgKTsKKyAgICAvLyBGZWhsZXJtZWxkdW5nIGF1ZiBkZXIgRWJlbmUgYXVzZ2ViZW4sIGltIGNhdGNoKCkgbWl0IHB1Ymxpc2gsIGRhbWl0IGVzCisgICAgLy8gYXVmIGRlciBFYmVuZSBkaXJla3Qgc2Nyb2xsdCwgZGVyIGJhY2t0cmFjZSB2ZXJmdWVnYmFyIGlzdCAoaW0KKyAgICAvLyBnZWdlbnNhdHogenVyIExvZXN1bmcgbWl0dGVscyBDYWxsb3V0KSwgZGllIEF1c2Z1ZWhydW5nIGFiZXIgd2VpdGVyCisgICAgLy8gbGFldWZ0LgorICAgIGNhdGNoKCBlZnVuOjpyYWlzZV9lcnJvciggICAgICAgICAgIAorICAgICAgICAgc3ByaW50ZiggdGV4dCwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHVpZCA/IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShrZXkpIDoga2V5LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgc2l6ZW9mKG9icyksIG9iamVjdF9uYW1lKG9ic1s8MV0pICkgKTtwdWJsaXNoKTsKKyAgICAvLyBVbmQgd2VnIG1pdCBkZW0gS3JhbS4uLgorICAgIGZpbHRlciggb2JzLCAjJ2VmdW46OmRlc3RydWN0LyonKi8gKTsKK30KKworLy8gQWxsZSBPYmpla3QgZWluZXIgVUlEIGltIE1hcHBpbmcgbSBtaXQgVUlEIGFscyBLRXlzIHp1c2FtbWVuZmFzc2VuLiBPYmpla3QKKy8vIHNpbmQgZGFiZWkgbmljaHQgdW5pcXVlLgorcHJpdmF0ZSB2b2lkIF9zYW1lX3VpZCggc3RyaW5nIGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSwgY2xvc3VyZSBjZiApIHsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoICFwb2ludGVycChvYnMpIHx8ICFzaXplb2Yob2JzKSApCisgICAgcmV0dXJuOworCisgIHVpZCA9IGZ1bmNhbGwoIGNmLCBrZXkgKTsKKworICBpZiAoIG1bdWlkXSApCisgICAgbVt1aWRdICs9IG9iczsgLy8gb2JzIGlzdCBuZW4gQXJyYXkKKyAgZWxzZQorICAgIG1bdWlkXSA9IG9iczsKK30KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBjYWxsX291dCggdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgdG1wLCAqY2FsbF9vdXRzOworCisgICAgLy8gQmVpID42MDAgQ2FsbG91dHMgYWxsZSBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDMwIENhbGxvdXRzIGxhdWZlbgorICAgIC8vIGhhYmVuLgorICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDYwMAorICAgICAgICAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQorICAgIHsKKyAgICAgICAvLyBMb2cgZXJ6ZXVnZW4uLi4KKyAgICAgIAorICAgICAgIC8vIE9iamVrdGUgYWxsZXIgQ2FsbG91dHMgZXJtaXR0ZWxuCisgICAgICAgY2FsbF9vdXRzID0gbWFwKCBlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2NhbGxfb3V0X29iaiApOworICAgICAgIG1hcHBpbmcgb2JqZWN0bWFwID0gKFtdKTsKKyAgICAgICBmaWx0ZXIoIGNhbGxfb3V0cywgIydfc2FtZV9vYmplY3QsICZvYmplY3RtYXAgKTsKKyAgICAgICAvLyBNYXN0ZXIgbmljaHQgZ3JpbGxlbi4uLgorICAgICAgIGVmdW46Om1fZGVsZXRlKCBvYmplY3RtYXAsIG1hc3RlcigxKSApOworICAgICAgIC8vIGFsbGUgT2JqZWt0ZSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgIG1hcHBpbmcgcmVzID0gZmlsdGVyX2luZGljZXMoIG9iamVjdG1hcCwgIydfdG9vX21hbnksIG9iamVjdG1hcCwgMjkgKTsKKyAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBLZXkgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIHVlYmVyZ2ViZW4gKGluIGRpZXNlbSBGYWxsIHNpbmQgS2V5cyB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gamV3ZWlscyBkYXMgZ2xlaWNoZSBPYmpla3QpLgorICAgICAgIGlmICggc2l6ZW9mKHJlcykgKSAgICAgICAKKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5IHNpbmdsZSAiICAgICAgICAgICAgIAorICAgICAgICAgICAgICAib2JqZWN0IFslT10uIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgLy8gQmVpIChhdWNoIG5hY2ggZGVtIGVyc3RlbiBBdWZyYWV1bWVuIG5vY2gpID44MDAgQ2FsbG91dHMgYWxsZQorICAgICAgIC8vIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgNTAgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuIC0gdW5kCisgICAgICAgLy8gZGllc21hbCB6YWVobGVuIENsb25lcyBuaWNodCBlaWdlbnN0YWVuZGlnISBELmguIGVzIHdlcmRlbiBhbGxlCisgICAgICAgLy8gQ2xvbmVzIGVpbmVyIEJQIGdla2lsbHQsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4sIGZhbGxzIGFsbGUKKyAgICAgICAvLyBkaWVzZSBPYmpla3RlIF96dXNhbW1lbl8gbWVociBhbHMgNTAgQ2FsbG91dHMgaGFiZW4hCisgICAgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gODAwICkgeworICAgICAgICAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgdm9uIGRlciBsZXR6dGVuIEFrdGlvbiBzaW5kIGluIG9iamVjdG1hcCBuaWNodAorICAgICAgICAgICAvLyBtZWhyIGRyaW4sIGRhIHNpZSBkb3J0IGFscyBLZXlzIHZlcndlbmRldCB3dXJkZW4uCisgICAgICAgICAgIG1hcHBpbmcgcGF0aG1hcD0oW10pOworICAgICAgICAgICAvLyBhbGxlIE9iamVrdCBlaW5lciBCUCBpbiByZXMgc29ydGllcmVuLCBCUC1OYW1lIGFscyBLZXksIEFycmF5cworICAgICAgICAgICAvLyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICB3YWxrX21hcHBpbmcoIG9iamVjdG1hcCwgIydfc2FtZV9wYXRoLCAmcGF0aG1hcCk7CisgICAgICAgICAgIC8vIGFsbGUgQlBzICh1bmQgaWhyZSBPYmpla3RlKSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggcGF0aG1hcCwgIydfdG9vX21hbnkvKicqLywgcGF0aG1hcCwgNTAgKTsKKyAgICAgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gZGllIENsb25lcworICAgICAgICAgICAvLyB1ZWJlcmdlYmVuLCBkaWUgQ2FsbG91dHMgaGFiZW4uCisgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveS8qJyovLCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAgICAgLy8gV2VubiBiZWlkZSBBdWZyYWV1bWFyYmVpdGVuIG5pY2h0cyBnZWJyYWNodCBoYWJlbiB1bmQgaW1tZXIKKyAgICAgICAgICAgLy8gbm9jaCA+MTAwMCBDYWxsb3V0cyBsYXVmZW4sIHdlcmRlbiBkaWVzbWFsIGFsbGUgQ2FsbG91dHMKKyAgICAgICAgICAgLy8gZWluZXIgVUlEIHp1c2FtbWVuZ2V6YWVobHQuCisgICAgICAgICAgIC8vIEFsbGUgT2JqZWt0ZSBlaW5lciBVSUQsIGRpZSBlcyBpbiBTdW1tZSBhbGxlciBpaHJlciBPYmpla3QgbWl0CisgICAgICAgICAgIC8vIENhbGxvdXRzIGF1ZiBtZWhyIGFscyAxMDAgQ2FsbG91dHMgYnJpbmd0LCB3ZXJkZW4gZ2Vyb2VzdGV0LgorICAgICAgICAgICBpZiAoZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDEwMDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gZGFzIG5hY2ggQlAtTmFtZW4gdm9yZ2VmaWx0ZXJ0ZSBNYXBwaW5nIGpldHp0IG5hY2ggVUlEcworICAgICAgICAgICAgICAvLyB6dXNhbW1lbnNvcnRpZXJlbi4gWmVyc3RvZXJ0ZSBDbG9uZXMgZmlsdGVyIF9zYW1lX3VpZCgpCisgICAgICAgICAgICAgIC8vIHJhdXMuCisgICAgICAgICAgICAgIG1hcHBpbmcgdWlkbWFwPShbXSk7CisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcGF0aG1hcCwgIydfc2FtZV91aWQsICZ1aWRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oICJjcmVhdG9yX2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZWN1cmUvbWFzdGVyIiApICk7CisgICAgICAgICAgICAgIC8vIEluIHJlcyBudW4gVUlEcyBhbHMgS2V5cyB1bmQgQXJyYXlzIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgICAgIC8vIERpZSByYXVzZmlsdGVybiwgZGllIG1laHIgYWxzIDEwMCBPYmpla3RlIChub24tdW5pcXVlLCBkLmguCisgICAgICAgICAgICAgIC8vIDEwMCBDYWxsb3V0cyEpIGhhYmVuLgorICAgICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggdWlkbWFwLCAjJ190b29fbWFueSwgdWlkbWFwLCAxMDAgKTsKKyAgICAgICAgICAgICAgLy8gdW5kIGVybmV1dCB1ZWJlciBkaWUgS2V5cyBsYXVmZW4gdW5kIGpld2VpbHMgZGllIEFycmF5cyBtaXQKKyAgICAgICAgICAgICAgLy8gZGVuIE9iamVrdGVuIHp1ciBaZXJzdG9lcnVuZyBhbiBfZGVzdHJveSgpLi4uCisgICAgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUlEICclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGYWxscyBkYXMgYXVmcnVmZW5kZSBPYmpla3QgemVyc3RvZXJ0IHd1cmRlIGJlaW0gQXVmcmFldW1lbgorICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgYXBwbHkoICMnZWZ1bjo6Y2FsbF9vdXQsIGFyZ3MgKTsKKyAgICByZXR1cm47Cit9CisKK21peGVkIGNhbGxfb3V0X2luZm8oKSB7CisgIAorICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKKyAgbWl4ZWQgY29pID0gZWZ1bjo6Y2FsbF9vdXRfaW5mbygpOworCisgIC8vIHVuZ2VmaWx0ZXJ0ZW4gT3V0cHV0IG51ciBmdWVyIGJlc3RpbW10ZSBPYmpla3RlLCBPYmpla3RlIGluIC9zdGQgb2RlcgorICAvLyAvb2JqIGhhYmVuIGRpZSBCYWNrYm9uZUlELgorICBpZiAocXVlcnlfd2l6X2xldmVsKGdldHVpZChwbykpID49IEFSQ0hfTFZMCisgICAgICAgfHwgKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGxvYWRfbmFtZShwbykpID09IEJBQ0tCT05FSUQgKSB7CisgICAgICByZXR1cm4gY29pOworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIGZpbHRlcihjb2ksIGZ1bmN0aW9uIG1peGVkIChtaXhlZCBhcnIpIHsKKyAgICAgICAgICAgICAgaWYgKHBvaW50ZXJwKGFycikgJiYgYXJyWzBdPT1wbykKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7IH0pOworICB9Cit9CisKKy8vICogWnUgZWluZXIgY2xvc3VyZSBkYXMgT2JqZWt0LCBhbiBkYXMgc2llIGdlYnVuZGVuIGlzdCwgc3VjaGVuCittaXhlZCBxdWVyeV9jbG9zdXJlX29iamVjdChjbG9zdXJlIGMpIHsKKyAgcmV0dXJuCisgICAgQ0xPU1VSRV9JU19VTkJPVU5EX0xBTUJEQShnZXRfdHlwZV9pbmZvKGMsIDEpKSA/CisgICAgICAwIDoKKyAgKHRvX29iamVjdChjKSB8fCAtMSk7Cit9CisKKy8vICogV2lyIHdvbGxlbiBudXIgRUlOIEFyZ3VtZW50IC4uLiBhdXNzZXJkZW0gY2hlY2tzIGZ1ZXIgZGVuIE5ldHp0b3RlbnJhdW0KK3ZhcmFyZ3Mgdm9pZCBtb3ZlX29iamVjdChtaXhlZCB3aGF0LCBtaXhlZCB3aGVyZSkKK3sKKyAgb2JqZWN0IHBvLHRtcDsKKworICBwbz1wcmV2aW91c19vYmplY3QoKTsKKyAgaWYgKCF3aGVyZSkKKyAgeworICAgIHdoZXJlPXdoYXQ7CisgICAgd2hhdD1wbzsKKyAgfQorICBpZiAoKChzdHJpbmdwKHdoZXJlKSAmJiB3aGVyZT09TkVUREVBRF9ST09NICkgfHwKKyAgICAgICAob2JqZWN0cCh3aGVyZSkgJiYgd2hlcmU9PWZpbmRfb2JqZWN0KE5FVERFQURfUk9PTSkpKSAmJgorICAgICAgIG9iamVjdHAod2hhdCkgJiYgb2JqZWN0X25hbWUod2hhdCkhPSIvb2JqL3NwZXJyZXIiKQorICB7CisgICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIHdoYXQtPnJlbW92ZSgpOworICAgICAgaWYgKHdoYXQpIGRlc3RydWN0KHdoYXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGl2aW5nKHdoYXQpIHx8IGludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIGxvZ19maWxlKCJOREVBRDIiLHNwcmludGYoIlRSWUVEIFRPIE1PVkUgVE8gTkVUREVBRDogJU9cbiIsd2hhdCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQod2hhdCwwKTsKKyAgfQorICB0bXA9d2hhdDsKKyAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgorICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKKyAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKKyAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KKyAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQorICAgICAgLy8KKyAgICAgIC8vIFRpYW1haworICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjptb3ZlX29iamVjdCxwbyksd2hhdCx3aGVyZSk7CisgIGlmICh0bXA9d2hhdCkKKyAgICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworfQorCisKK3ZvaWQgc3RhcnRfc2ltdWxfZWZ1bigpIHsKKyAgbWl4ZWQgKmluZm87CisKKyAgLy8gRmFsbHMgbm9jaCBuaWNodCBnZXRhbiwgZXh0cmFfd2l6aW5mbyBpbml0aWFsaXNpZXJlbgorICBpZiAoICFwb2ludGVycChpbmZvID0gZ2V0X2V4dHJhX3dpemluZm8oMCkpICkKKyAgICBzZXRfZXh0cmFfd2l6aW5mbygwLCBpbmZvID0gYWxsb2NhdGUoQkFDS0JPTkVfV0laSU5GT19TSVpFKSk7CisKKyAgSW5pdExpdmluZ0RhdGEoaW5mbyk7CisKKyAgc2V0X25leHRfcmVzZXQoMTApOyAvLyBkaXJla3QgbWFsIGF1ZnJhZXVtZW4KK30KKworcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgIHNldF9uZXh0X3Jlc2V0KDcyMDApOworICBDbGVhbkxpdmluZ0RhdGEoKTsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGFic29sdXRlX2hiX2NvdW50KQoraW50IGFic29sdXRlX2hiX2NvdW50KCkgeworICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworfQorI2VuZGlmCisKK3ZvaWQgX19zZXRfZW52aXJvbm1lbnQob2JqZWN0IG9iLCBtaXhlZCB0YXJnZXQpCit7CisgIHN0cmluZyBwYXRoOworICBvYmplY3Qgb2JqOworCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuOworICBpZiAoIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIHx8ICFBUkNIX1NFQ1VSSVRZICkKKyAgICByZXR1cm47CisgIGlmIChvYmplY3RwKHRhcmdldCkpCisgIHsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2IsdGFyZ2V0KTsKKyAgICByZXR1cm47CisgIH0KKyAgcGF0aD0oc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKHRhcmdldCx0aGlzX2ludGVyYWN0aXZlKCkpOworICBpZiAoc3RyaW5ncChwYXRoKSAmJiBmaWxlX3NpemUocGF0aCsiLmMiKT49MCAmJgorICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpICkKKyAgeworICAgIG9iaj1maW5kX29iamVjdChwYXRoKTsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2Isb2JqKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCBfZHVtcF93aXpsaXN0KHN0cmluZyBmaWxlLCBpbnQgc29ydGJ5KSB7CisgIGludCBpOworICBtaXhlZCAqYTsKKworICBpZiAoIUxPUkRfU0VDVVJJVFkpCisgICAgcmV0dXJuOworICBpZiAoIW1hc3RlcigpLT52YWxpZF93cml0ZShmaWxlLGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIikpCisgIHsKKyAgICB3cml0ZSgiTk8gV1JJVEUgUEVSTUlTU0lPTlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGEgPSB3aXpsaXN0X2luZm8oKTsKKyAgYSA9IHNvcnRfYXJyYXkoYSwgbGFtYmRhKCAoeydhLCdifSksCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnPCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Esc29ydGJ5fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdiLHNvcnRieX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgcm0oZmlsZSk7CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICB3cml0ZV9maWxlKGZpbGUsc3ByaW50ZigiJS0xMXM6IGV2YWw9JS04ZCBjbWRzPSUtNmQgSEJzPSUtNWQgYXJyYXk9JS01ZCBtYXBwaW5nPSUtN2RcbiIsCisgICAgICBhW2ldW1dMX05BTUVdLGFbaV1bV0xfVE9UQUxfQ09TVF0sYVtpXVtXTF9DT01NQU5EU10sYVtpXVtXTF9IRUFSVF9CRUFUU10sCisgICAgICBhW2ldW1dMX0FSUkFZX1RPVEFMXSxhW2ldW1dMX0NBTExfT1VUXSkpOworfQorCitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYikgeworCisgIGlmKCFvYmplY3RwKG9iKSkKKyAgICBvYj1wcmV2aW91c19vYmplY3QoKTsKKyAgLy8gV2VubiBlaW4gT2JqZWt0IGdlc3VjaHQgd2lyZDogQWxsZSBFbnZzIGRpZXNlcyBPYmpla3RzIGVybWl0dGVsbiB1bmQKKyAgLy8gc2NoYXVlbiwgb2IgaW4gZGllc2VuIG9iIHZvcmtvbW10LiBEYW5uIGlzdCB3aGF0IGluIG9iIGVudGhhbHRlbi4KKyAgaWYob2JqZWN0cCh3aGF0KSkgeworICAgIG9iamVjdCAqZW52cz1hbGxfZW52aXJvbm1lbnQod2hhdCk7CisgICAgLy8gd2VubiBvYiBrZWluIEVudmlyb25tZW50IGhhdCwgaXN0IGVzIG9mZmVuc2ljaHRsaWNoIG5pY2h0IGluIHdoYXQKKyAgICAvLyBlbnRoYWx0ZW4uCisgICAgaWYgKCFwb2ludGVycChlbnZzKSkgcmV0dXJuIDA7CisgICAgaWYgKG1lbWJlcihlbnZzLCBvYikgIT0gLTEpIHJldHVybiB3aGF0OworICB9CisgIC8vIHNvbnN0IHdpcmRzIHRldXJlciwgdWViZXIgYWxsZSBPYmpla3RlIGltIChkZWVwKSBJbnYgbGF1ZmVuIHVuZCBwZXIgaWQoKQorICAvLyB0ZXN0ZW4uIERhYmVpIG11c3MgYWJlciBkaWUgZ2V3dWVuc2NodGUgTnIuICgiZmxhc2NoZSAzIikgYWJnZXNjaG5pdHRlbgorICAvLyB3ZXJkZW4gdW5kIHNlbGJlciBnZXphZWhsdCB3ZXJkZW4sIHdlbGNoZSBkYXMgZW50c3ByZWNoZW5kZSBPYmpla3QgaXN0LgorICBlbHNlIGlmIChzdHJpbmdwKHdoYXQpKSB7CisgICAgICBpbnQgY250OworICAgICAgc3RyaW5nIG5ld3doYXQ7CisgICAgICBpZihzc2NhbmYod2hhdCwiJXMgJWQiLG5ld3doYXQsY250KSE9MikKKyAgICAgICBjbnQ9MTsKKyAgICAgIGVsc2UKKyAgICAgICB3aGF0PW5ld3doYXQ7CisgICAgICBmb3JlYWNoKG9iamVjdCBpbnZvYjogZGVlcF9pbnZlbnRvcnkob2IpKSB7CisgICAgICAgaWYgKGludm9iLT5pZCh3aGF0KSAmJiAhLS1jbnQpCisgICAgICAgICAgIHJldHVybiBpbnZvYjsKKyAgICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gZGVlcF9wcmVzZW50KCkuICIKKyAgICAgICAgICJFeHBlY3RlZCBcIm9iamVjdFwiIG9yIFwic3RyaW5nXCIsIGdvdCAlLjUwTy5cbiIsCisgICAgICAgICB3aGF0KSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK21hcHBpbmcgZHVtcF9pcF9tYXBwaW5nKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK25vbWFzayB2b2lkIHN3YXAob2JqZWN0IG9iaikKK3sKKyAgd3JpdGUoIllvdXIgYXJlIG5vdCBhbGxvd2VkIHRvIHN3YXAgb2JqZWN0cyBieSBoYW5kIVxuIik7CisgIHJldHVybjsKK30KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBnYXJiYWdlX2NvbGxlY3Rpb24oc3RyaW5nIHN0cikKK3sKKyAgaWYocHJldmlvdXNfb2JqZWN0KCk9PTAgfHwgIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIAorICAgICAgfHwgIUFSQ0hfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSgiQ2FsbCBHQyBub3cgYW5kIHRoZSBtdWQgd2lsbCBjcmFzaCBpbiA1LTYgaG91cnMuIERPTlQgRE8gSVQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChzdHIpKQorICB7CisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbihzdHIpOworICB9CisgIGVsc2UgCisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbigpOworfQorCit2YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwobWl4ZWQgbmYsIGludCBwcmlvKSB7CisgIG9iamVjdCBwbyxvbGRvOworICBpbnQgb2xkcHJpbzsKKyAgCisgIGlmICghUEwgfHwgIW9iamVjdHAocG89cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmICghc3RyaW5ncChuZikgJiYgIWNsb3N1cmVwKG5mKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBzdHJpbmdzIGFuZCBjbG9zdXJlcyBhbGxvd2VkIGZvciBub3RpZnlfZmFpbCEgIgorICAgICAgICAgIkFyZ3VtZW50IHdhczogJS41ME8uLi5cbiIsbmYpKTsKKyAgfQorCisgIC8vIGZhbGxzIGVpbiBPYmpla3QgYmVyZWl0cyBuZW4gbm90aWZ5X2ZhaWwoKSBzZXR6dGUsIFByaW9yaXRhZXRlbiBhYnNjaGFldHplbgorICAvLyB1bmQgdmVyZ2xlaWNoZW4uCisgIGlmIChvYmplY3RwKG9sZG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIHBvIT1vbGRvKSB7CisgICAgaWYgKCFwcmlvKSB7ICAgICAgIAorICAgICAgLy9Qcmlvcml0YWV0IGRpZXNlcyBub3RpZnlfZmFpbCgpICdhYnNjaGFldHplbicKKyAgICAgIGlmIChwbz09UEwpIC8vIFNwaWVsZXItaW50ZXJuZSAoc291bC1jbWRzKQorICAgICAgICBwcmlvPU5GX05MX09XTjsKKyAgICAgIGVsc2UgaWYgKGxpdmluZyhwbykpCisgICAgICAgIHByaW89TkZfTkxfTElWSU5HOworICAgICAgZWxzZSBpZiAoKGludClwby0+SXNSb29tKCkpCisgICAgICAgIHByaW89TkZfTkxfUk9PTTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbz1ORl9OTF9USElORzsKKyAgICB9CisgICAgLy9Qcmlvcml0YWV0IGRlcyBhbHRlbiBTZXR6ZXJzIGFic2NoYWV0emVuCisgICAgaWYgKG9sZG89PVBMKQorICAgICAgb2xkcHJpbz1ORl9OTF9PV047CisgICAgZWxzZSBpZiAobGl2aW5nKG9sZG8pKQorICAgICAgb2xkcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgZWxzZSBpZiAoKGludClvbGRvLT5Jc1Jvb20oKSkKKyAgICAgIG9sZHByaW89TkZfTkxfUk9PTTsKKyAgICBlbHNlCisgICAgICBvbGRwcmlvPU5GX05MX1RISU5HOworICB9CisgIGVsc2UgLy8gd2VubiBlcyBub2NoIGtlaW4gTm90aWZ5X2ZhaWwgZ2lidDoKKyAgICBvbGRwcmlvPU5GX05MX05PTkU7CisKKyAgLy92ZXJnbGVpY2hlbiB1bmQgZ2dmLiBzZXR6ZW4KKyAgaWYgKHByaW8gPj0gb2xkcHJpbykgeyAKKyAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgIGVmdW46Om5vdGlmeV9mYWlsKG5mKTsKKyAgfQorCisgIHJldHVybjsKK30KKwordm9pZCBfbm90aWZ5X2ZhaWwoc3RyaW5nIHN0cikKK3sKKyAgLy9xdWVyeV9ub3RpZnlfZmFpbCgpIGJlbnV0emVuLCB1bSBkYXMgT2JqZWt0CisgIC8vZGVzIGxldHp0ZW4gbm90aWZ5X2ZhaWwoKSB6dSBlcm1pdHRlbG4KKyAgb2JqZWN0IG87CisgIGlmICgobz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgbyE9cHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICAvL25vY2gga2VpbiBub3RpZnlfZmFpbCgpIGZ1ZXIgZGllc2VzIEtvbW1hbmRvIGdlc2V0enQsIGF1ZiBnZWh0cy4KKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgZWZ1bjo6bm90aWZ5X2ZhaWwoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdHJpbmcgdGltZTJzdHJpbmcoIHN0cmluZyBmb3JtYXQsIGludCB6ZWl0ICkKK3sKKyAgaW50IGksY2gsbWF4dW5pdCxkdW1teTsKKyAgc3RyaW5nICpwYXJ0cywgZm10OworCisgIGludCBzZWNzID0gemVpdDsKKyAgaW50IG1pbnMgPSAoemVpdC82MCk7CisgIGludCBob3VycyA9ICh6ZWl0LzM2MDApOworICBpbnQgZGF5cyA9ICh6ZWl0Lzg2NDAwKTsKKyAgaW50IHdlZWtzID0gICh6ZWl0LzYwNDgwMCk7CisgIGludCBtb250aHMgPSAoemVpdC8yNDE5MjAwKTsKKyAgaW50IGFiYnIgPSAwOworCisgIHBhcnRzID0gcmVnZXhwbG9kZSggZm9ybWF0LCAiXCglXCgtfFwpWzAtOV0qW253ZGhtc3hOV0RITVNYXVwpfFwoJSVcKSIgKTsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIHN3aXRjaCggcGFydHNbaV1bPDFdICkKKyAgICB7CisgICAgY2FzZSAneCc6IGNhc2UgJ1gnOgorICAgICAgIGFiYnIgPSBzc2NhbmYoIHBhcnRzW2ldLCAiJSUlZCIsIGR1bW15ICkgJiYgZHVtbXk9PTA7CisgICAgICAgLy8gTk8gYnJlYWsgIQorICAgIGNhc2UgJ24nOiBjYXNlICdOJzoKKyAgICAgICBtYXh1bml0IHw9IDMxOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOiBjYXNlICdXJzoKKyAgICAgICBtYXh1bml0IHw9IDE1OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICBtYXh1bml0IHw9IDc7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgorICAgICAgIG1heHVuaXQgfD0gMzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6CisgICAgICAgbWF4dW5pdCB8PSAxOworICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiggbWF4dW5pdCAmIDE2ICkgd2Vla3MgJT0gNDsKKyAgaWYoIG1heHVuaXQgJiA4ICkgZGF5cyAlPSA3OworICBpZiggbWF4dW5pdCAmIDQgKSBob3VycyAlPSAyNDsKKyAgaWYoIG1heHVuaXQgJiAyICkgbWlucyAlPSA2MDsKKyAgaWYoIG1heHVuaXQgKSBzZWNzICU9IDYwOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgZm10ID0gcGFydHNbaV1bMC4uPDJdOworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIGlmKCBjaD09J3gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J24nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSd3JzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdkJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0naCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnbSc7CisgICAgICBlbHNlIGNoID0gJ3MnOworICAgIH0KKyAgICBlbHNlIGlmKCBjaD09J1gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J04nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSdXJzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdEJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0nSCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnTSc7CisgICAgICBlbHNlIGNoID0gJ1MnOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2goIGNoICkKKyAgICB7CisgICAgICBjYXNlICduJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtb250aHMgKTsgYnJlYWs7CisgICAgICBjYXNlICd3JzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCB3ZWVrcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2QnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGRheXMgKTsgYnJlYWs7CisgICAgICBjYXNlICdoJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBob3VycyApOyBicmVhazsKKyAgICAgIGNhc2UgJ20nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1pbnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdzJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBzZWNzICk7IGJyZWFrOworICAgICAgY2FzZSAnTic6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiTSI7CisgICAgICAgZWxzZSBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtb250aHM9PTEpID8gIk1vbmF0IiA6ICJNb25hdGUiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdXJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJ3IjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHdlZWtzPT0xKSA/ICJXb2NoZSIgOiAiV29jaGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiZCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChkYXlzPT0xKSA/ICJUYWciIDogIlRhZ2UiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdIJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJoIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGhvdXJzPT0xKSA/ICJTdHVuZGUiIDogIlN0dW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdNJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJtIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1pbnM9PTEpID8gIk1pbnV0ZSIgOiAiTWludXRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInMiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoc2Vjcz09MSkgPyAiU2VrdW5kZSIgOiAiU2VrdW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICclJzoKKyAgICAgICBwYXJ0c1tpXSA9ICIlIjsKKyAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUoIHBhcnRzLCAiIiApOworfQorCitub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKQoreworICBzdHJpbmcgZXJyOworICBvYmplY3Qgb2I7CisgIG1peGVkIG07CisgIC8vaGF0IG5lbiBTY2hlcnprZWtzIGRpZSBCbHVlcHJpbnQgYmV3ZWd0PworICBpZiAoKG9iPWZpbmRfb2JqZWN0KCIvc2VjdXJlL2xvZ2luIikpICYmIGVudmlyb25tZW50KG9iKSkKKyAgICAgIGNhdGNoKGRlc3RydWN0KG9iKTtwdWJsaXNoKTsKKyAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoInNlY3VyZS9sb2dpbiIpO3B1Ymxpc2gpOworICBpZiAoZXJyKQorICB7CisgICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChvYmplY3RwKG09KG1peGVkKW9iLT5uZXdfbG9nb24obmFtZSkpKSBuZXRkZWFkW25hbWVdPW07CisgIHJldHVybiBtOworfQorCitub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpCit7CisgIGludCAqbGV2ZWw7CisgIC8va2V0dGUgZGVyIENhbGxlciBkdXJjaGxhdWZlbiwgZGVuIG5pZWRyaWdzdGVuIExldmVsIGluIGRlciBLZXR0ZQorICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKKyAgLy92b24gMC4KKyAgLy9jYWxsZXJfc3RhY2soMSkgZnVlZ3QgZGVtIFJ1ZWNrZ2FiZWFycmF5IHRoaXNfaW50ZXJhY3RpdmUoKSBoaW56dSBiencuIDAsCisgIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgorICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgorICAvL0lOdGVyYWN0aXZlIGdlYmVuIG11c3MuCisgIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQorICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCisgICAgICAgcmV0dXJuKHF1ZXJ5X3dpel9sZXZlbChnZXRldWlkKGNhbGxlcikpKTsKKyAgICAgICByZXR1cm4oMCk7IC8vIGtlaW4gT2JqZWt0IGRhLCAwLgorICAgICAgfSApOworICByZXR1cm4obWluKGxldmVsKSk7IC8vZGVuIGtsZWluc3RlbiBXZXJ0IGltIEFycmF5IHp1cnVlY2tnZWJlbiAoZ2dmLiAwKQorfQorCitub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCkKK3sKKyAgc3RyaW5nIGV1aWQ7CisKKyAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpIC8vIEVzIG11c3MgZWluZW4gaW50ZXJhY3RpdmUgZ2ViZW4KKyAgICAgcmV0dXJuIDA7CisgIGV1aWQ9Z2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAvLyB1ZWJlciBhbGxlIENhbGxlciBpdGVyaWVyZW4uIFdlbm4gZWluZXMgZGF2b24gZWluZSBhbmRlcmUgZXVpZCBoYXQgYWxzCisgIC8vIGRlciBJbnRlcmFjdGl2ZSB1bmQgZGllc2UgbmljaHQgZGllIFJPT1RJRCBpc3QsIHdpcmQgMCB6dXJ1ZWNrZ2ViZW4uCisgIC8vIEViZW5zbywgZmFsbHMgZWluIFNlbGJzdHplcnN0b2VyZXIgaXJnZW5kd28gaW4gZGVyIEtldHRlIGlzdC4KKyAgZm9yZWFjaChvYmplY3QgY2FsbGVyOiBjYWxsZXJfc3RhY2soKSkgeworICAgICAgaWYgKCFvYmplY3RwKGNhbGxlcikgfHwKKyAgICAgICAoZ2V0ZXVpZChjYWxsZXIpIT1ldWlkICYmIGdldGV1aWQoY2FsbGVyKSE9Uk9PVElEKSkKKyAgICAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBldWlkOyAvLyAnc2ljaGVyZScgZXVpZCB6dXJ1ZWNrZ2ViZW4KK30KKworLy8gSU5QVVRfUFJPTVBUIHVuZCBuZW4gTGVlcnByb21wdCBoaW56dWZ1ZWdlbiwgd2VubiBrZWlucyB1ZWJlcmdlYmVuIHdpcmQuCisvLyBEYXMgc29sbCBkYXp1IGRpZW5lbiwgZGFzcyBhbGxlIGdnZi4gZWluIEVPUiBhbSBQcm9tcHRlbmRlIGtyaWVnZW4uLi4KKy8vI2lmIF9fQk9PVF9USU1FX18gPCAxMzYwMDE3MjEzCit2YXJhcmdzIHZvaWQgaW5wdXRfdG8oIG1peGVkIGZ1biwgaW50IGZsYWdzLCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCAqYXJyOworICAgIGludCBpOworCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIC8vIFRPRE86IGlucHV0X3RvKC4uLixJTlBVVF9QUk9NUFQsICIiLCAuLi4pLCB3ZW5uIGtlaW4gSU5QVVRfUFJPTVBUCisgICAgLy8gdm9ya29tbXQuLi4KKyAgICBpZiAoIGZsYWdzJklOUFVUX1BST01QVCApIHsgICAgCisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MgfSkgKyBhcmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gZ2dmLiBlaW4gSU5QVVRfUFJPTVBUIGhpbnp1ZnVlZ2VuIHVuZCBuZW4gTGVlcnN0cmluZyBhbHMgUHJvbXB0LgorICAgICAgICBmbGFncyB8PSBJTlBVVF9QUk9NUFQ7CisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MsICIiIH0pICsgYXJnczsKKyAgICB9CisKKyAgICAvLyBBcnJheXMgZ2VnZW4gZmxhdHRlbiBxdW90ZW4uCisgICAgZm9yICggaSA9IHNpemVvZihhcnIpIC0gMTsgaSA+IDE7IGktLSApCisgICAgICAgaWYgKCBwb2ludGVycChhcnJbaV0pICkKKyAgICAgICAgICAgYXJyW2ldID0gcXVvdGUoYXJyW2ldKTsKKworICAgIGFwcGx5KCBiaW5kX2xhbWJkYSggdW5ib3VuZF9sYW1iZGEoICh7fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgIydlZnVuOjppbnB1dF90by8qJyovIH0pICsgYXJyICksCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpICkgKTsKK30KKy8vI2VuZGlmCisKK25vbWFzayBpbnQgc2V0X2xpZ2h0KGludCBpKQorLy8gZXJob2VodCBkYXMgTGljaHRsZXZlbCBlaW5lcyBPYmpla3RzIHVtIGkKKy8vIHJlc3VsdDogZGFzIExpY2h0bGV2ZWwgaW5uZXJoYWxiIGRlcyBPYmpla3RzCit7CisgICAgb2JqZWN0IG9iLCAqaW52OworICAgIGludCBsYWxsLCBsaWdodCwgZGFyaywgdG1wOworCisgICAgaWYgKCEob2I9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsgLy8gb2huZSBkYXMgZ2VodHMgbmljaHQuCisKKyAgICAvLyBhdXMga29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGthbm4gbWFuIGF1Y2ggZGVuIExpY2h0bGV2ZWwgbm9jaCBzZXR6ZW4KKyAgICBpZiAoaSE9MCkgb2ItPlNldFByb3AoUF9MSUdIVCwgb2ItPlF1ZXJ5UHJvcChQX0xJR0hUKStpKTsKKworICAgIC8vIExpY2h0YmVyZWNobnVuZyBmaW5kZXQgZWlnZW50bGljaCBpbiBkZXIgTXVkbGliIHN0YXR0LgorICAgIHJldHVybiAoaW50KW9iLT5RdWVyeVByb3AoUF9JTlRfTElHSFQpOworfQorCisKK3B1YmxpYyBzdHJpbmcgaXNvMmFzY2lpKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKKyAgICAgICByZXR1cm4gIiI7CisKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLkIiwgImFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvYiLCAib2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi/CIsICJ1ZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLEIiwgIkFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItYiLCAiT2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3CIsICJVZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLfIiwgInNzIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIlteIC1+XSIsICI/IiwgMSApOworCisgICAgcmV0dXJuIHN0cjsKK30KKworCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgQ291bnRVcCggc3RyaW5nICpzLCBzdHJpbmcgc2VwLCBzdHJpbmcgbGFzdHNlcCApCit7CisgICAgc3RyaW5nIHJldDsKKworICAgIGlmICggIXBvaW50ZXJwKHMpICkKKyAgICAgICByZXR1cm4gIiI7CisgICAgCisgICAgaWYgKCFzZXApIHNlcCA9ICIsICI7CisgICAgaWYgKCFsYXN0c2VwKSBsYXN0c2VwID0gIiB1bmQgIjsKKworICAgIHN3aXRjaCAoc2l6ZW9mKHMpKSAgeworICAgICAgIGNhc2UgMDogcmV0PSIiOyBicmVhazsKKyAgICAgICBjYXNlIDE6IHJldD1zWzBdOyBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXQgPSBpbXBsb2RlKHNbMC4uPDJdLCBzZXApOworICAgICAgICAgICAgICByZXQgKz0gbGFzdHNlcCArIHNbPDFdOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitub21hc2sgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpIHsKKworICAgIC8vIFR5cHBydWVmdW5nOiBldHdhcyBhbmRlcmVzIGFscyBPYmpla3RlIG9kZXIgMCBzb2xsZW4gRmVobGVyIHNlaW4uCisgICAgaWYgKG9iICYmICFvYmplY3RwKG9iKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9uZXh0X3Jlc2V0KCk6IGdvdCAlLjIwTywgIgorICAgICAgICAgICAiZXhwZWN0ZWQgb2JqZWN0LlxuIixvYikpOworCisgICAgLy8gRGVmYXVsdG9iamVrdCBQTywgd2VubiAwIHVlYmVyZ2ViZW4uCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKK30KKworCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorI2RlZmluZSBNQVhMRU4gNTAwMDAKK25vbWFzayBpbnQgY29weV9maWxlKHN0cmluZyBzb3VyY2UsIHN0cmluZyBkZXN0KQoreworCisgIGludCBwdHI7CisgIHN0cmluZyBieXRlczsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoIXNpemVvZihzb3VyY2UpfHwhc2l6ZW9mKGRlc3QpfHxzb3VyY2U9PWRlc3R8fChmaWxlX3NpemUoc291cmNlKT09LTEpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksInJlYWRfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIixwcmV2aW91c19vYmplY3QoKSkpKQorICAgIHJldHVybiAxOworICBzd2l0Y2ggKGZpbGVfc2l6ZShkZXN0KSkKKyAgeworICBjYXNlIC0xOgorICAgIGJyZWFrOworICBjYXNlIC0yOgorICAgIGlmIChkZXN0WzwxXSE9Jy8nKSBkZXN0Kz0iLyI7CisgICAgZGVzdCs9ZWZ1bjo6ZXhwbG9kZShzb3VyY2UsIi8iKVs8MV07CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpIHJldHVybiAxOworICAgIGlmIChmaWxlX3NpemUoZGVzdCkhPS0xKSBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBkbworICB7CisgICAgYnl0ZXMgPSByZWFkX2J5dGVzKHNvdXJjZSwgcHRyLCBNQVhMRU4pOyBwdHIgKz0gTUFYTEVOOworICAgIGlmICghYnl0ZXMpIGJ5dGVzPSIiOworICAgIHdyaXRlX2ZpbGUoZGVzdCwgYnl0ZXMpOworICB9CisgIHdoaWxlKHNpemVvZihieXRlcykgPT0gTUFYTEVOKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisKKworLy8gIyMjIEVyc2F0emF1ZmxvZXN1bmcgaW4gU3RyaW5ncyAjIyMKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqcGFydHM7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKHN0ciwgIkBXRVtBLVNVXSpbMC05XSIpOworICBpID0gc2l6ZW9mKHBhcnRzKTsKKworICBpZiAoaT4xKSB7CisgICAgaW50IGosIHQ7CisgICAgY2xvc3VyZSAqbmFtZV9jbHM7CisKKyAgICB0ID0gaiA9IHNpemVvZihvYnMpOworCisgICAgbmFtZV9jbHMgID0gIGFsbG9jYXRlKGopOworICAgIHdoaWxlIChqLS0pCisgICAgICBpZiAob2JqZWN0cChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG9ic1tqXSk7CisgICAgICBlbHNlIGlmIChzdHJpbmdwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gb2JzW2pdOworCisgICAgd2hpbGUgKChpLT0gMik+MCkgeworICAgICAgaW50IG9iX25yOworICAgICAgLy8genUgZXJzZXR6ZW5kZXMgVG9rZW4gaW4gRmFsbCB1bmQgT2JqZWt0aW5kZXggYXVmc3BhbHRlbgorICAgICAgb2JfbnIgPSBwYXJ0c1tpXVs8MV0tJzEnOworICAgICAgaWYgKG9iX25yPDAgfHwgb2JfbnI+PXQpIHsKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigicmVwbGFjZV9wZXJzb25hbDogdXNpbmcgd3Jvbmcgb2JqZWN0IGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBvYl9ucikpOworICAgICAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICAgICAgfQorCisgICAgICAvLyBjYXN1cyBrYW5uIG1hbiBzY2hvbiBoaWVyIGVudHNjaGVpZGVuCisgICAgICBpbnQgY2FzdXM7CisgICAgICBzdHJpbmcgcGFydCA9IHBhcnRzW2ldOworICAgICAgc3dpdGNoIChwYXJ0WzNdKSB7CisgICAgICAgIGNhc2UgJ1InOiBjYXN1cyA9IFdFUjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1MnOiBjYXN1cyA9IFdFU1NFTjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOiBjYXN1cyA9IFdFTTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ04nOiBjYXN1cyA9IFdFTjsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBjb250aW51ZTsgLy8gcGFzc3Qgc2Nob24gamV0enQgbmljaHQgaW4gZGFzIEhhdXB0bXVzdGVyCisgICAgICB9CisKKyAgICAgIC8vIHVuZCBqZXR6dCBkaWUgZWluemVsbmVuIEtleXdvcmRzIG9obmUgZnVlaHJlbmRlcyAiQFdFIiwgYmVlbmRlbmRlIElkCisgICAgICBtaXhlZCB0bXA7CisgICAgICBzd2l0Y2ggKHBhcnRbMy4uPDJdKSB7CisgICAgICAgIGNhc2UgIlIiOiBjYXNlICJTU0VOIjogY2FzZSAiTSI6IGNhc2UgIk4iOiAgICAgICAgICAgICAgIC8vIE5hbWUKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cywgMSk7ICBicmVhazsKKyAgICAgICAgY2FzZSAiUlUiOiBjYXNlICJTU0VOVSI6IGNhc2UgIk1VIjogY2FzZSAiTlUiOiAgICAgICAgICAgLy8gdW5iZXN0aW1tdAorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzKTsgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVAiOiBjYXNlICJTU0VOUVAiOiBjYXNlICJNUVAiOiBjYXNlICJOUVAiOiAgICAgICAvLyBQcm9ub3VuCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVByb25vdW4oY2FzdXMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUUEiOiBjYXNlICJTU0VOUUEiOiBjYXNlICJNUUEiOiBjYXNlICJOUUEiOiAgICAgICAvLyBBcnRpY2xlCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICB0bXAgPSAoc3RyaW5nKXRtcC0+UXVlcnlBcnRpY2xlKGNhc3VzLCAxLCAxKTsKKyAgICAgICAgICBpZiAoc3RyaW5ncCh0bXApICYmICEodG1wWzwxXV4nICcpKSAKKyAgICAgICAgICAgIHRtcCA9IHRtcFswLi48Ml07ICAgICAgICAgICAgICAgIC8vIEV4dHJhLVNwYWNlIHdpZWRlciBsb2VzY2hlbgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVMiOiBjYXNlICJTU0VOUVBQTVMiOiBjYXNlICJNUVBQTVMiOiBjYXNlICJOUVBQTVMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlMiOiBjYXNlICJTU0VOUVBQRlMiOiBjYXNlICJNUVBQRlMiOiBjYXNlICJOUVBQRlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUyI6IGNhc2UgIlNTRU5RUFBOUyI6IGNhc2UgIk1RUFBOUyI6IGNhc2UgIk5RUFBOUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1QIjogY2FzZSAiU1NFTlFQUE1QIjogY2FzZSAiTVFQUE1QIjogY2FzZSAiTlFQUE1QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUCI6IGNhc2UgIlNTRU5RUFBGUCI6IGNhc2UgIk1RUFBGUCI6IGNhc2UgIk5RUFBGUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUCI6IGNhc2UgIlNTRU5RUFBOUCI6IGNhc2UgIk1RUFBOUCI6IGNhc2UgIk5RUFBOUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHdlbm4gdG1wIGVpbiBTdHJpbmcgd2FyLCB3ZWlzZW4gd2lyIGVzIGhpZXIgcGF1c2NoYWwgenUKKyAgICAgIGlmIChzdHJpbmdwKHRtcCkpCisgICAgICAgIHBhcnRzW2ldID0gdG1wOworCisgICAgICAvLyBhdWYgV3Vuc2NoIHdpcmQgbmFjaCBTYXR6ZW5kZW4gZ3Jvc3MgZ2VzY2hyaWViZW4KKyAgICAgIGlmIChjYXBzKQorICAgICAgICBzd2l0Y2ggKHBhcnRzW2ktMV1bPDIuLl0pIHsKKyAgICAgICAgICBjYXNlICIuICI6ICBjYXNlICIhICI6ICBjYXNlICI/ICI6CisgICAgICAgICAgY2FzZSAiLiI6ICAgY2FzZSAiISI6ICAgY2FzZSAiPyI6CisgICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKKyAgICAgICAgICBjYXNlICJcIiAiOiBjYXNlICJcIlxuIjoKKyAgICAgICAgICAgIHBhcnRzW2ldID0gY2FwaXRhbGl6ZShwYXJ0c1tpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICB9CisgIHJldHVybiBzdHI7Cit9CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorZGVwcmVjYXRlZCB2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighc3RyaW5ncChzdHIpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBleHRyYWN0KCk6ICVPIixzdHIpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oc3RyKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK2RlcHJlY2F0ZWQgdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFwb2ludGVycChhcnJheSkpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIHNsaWNlX2FycmF5KCk6ICVPIixhcnJheSkpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihhcnJheSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2RlcHJlY2F0ZWQgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZykgeworCisgIGlmIChwb2ludGVycChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLGl0ZW0pKTsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsdG9faW50KGl0ZW0pKSk7CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBtZW1iZXJfYXJyYXkoKTogJU8iLGFycmF5c3RyaW5nKSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCisKKy8vIFRoZSBkaWdpdCBhdCB0aGUgaSd0aCBwb3NpdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluICdpJy4KK3N0cmluZyBjb3VudF90YWJsZSA9CisgICAgIjAxMTIxMjIzMTIyMzIzMzQxMjIzMjMzNDIzMzQzNDQ1MTIyMzIzMzQyMzM0MzQ0NTIzMzQzNDQ1MzQ0NTQ1NTYiOworaW50IGJyb2tlbl9jb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICBpbnQgaSwgcmVzOworICAgIGlmKCAhc3RyaW5ncChzKSB8fCAhKGk9c2l6ZW9mKHMpKSApIHJldHVybiAwOworICAgIGZvciggOyBpLS0+MDsgKSB7CisgICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCisgICAgICAgIHJlcyArPSBjb3VudF90YWJsZVsoc1tpXS0nICcpJjYzXS0nMCc7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQoraW50IGNvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Cit9CisjZW5kaWYKKworCisvLyAqIFRlaWxlIGF1cyBlaW5lbSBBcnJheSBlbnRmZXJuZW4gKioqIE9CU09MRVRFCitkZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQoreworICBpZiAodG88ZnJvbSkKKyAgICB0byA9IGZyb207CisgIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKK30KKwo=