I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInNtY29tbW9uLmgiCiNpbmNsdWRlICJzbWlsLmgiCgppbnQgICAgICAgICBDaGVja19EX0xvZ0NIUyAgICAgICAgICAgICAgKFdPUkQgKixCWVRFICosQllURSAqKTsKdm9pZCAgICAgICAgSW5pdGlhbGl6ZV9EX01lZGlhICAgICAgICAgICh2b2lkKTsKdm9pZCAgICAgICAgUG93ZXJPZmZfRF9NZWRpYSAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVBvd2VyICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUV4aXN0ICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVdQICAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdCAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkciAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CmludCAgICAgICAgIEluY19EX01lZGlhQWRkciAgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgICAgICAgIENoZWNrX0RfRmlyc3RTZWN0ICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIENoZWNrX0RfTGFzdFNlY3QgICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIE1lZGlhX0RfUmVhZE9uZVNlY3QgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKaW50ICAgICAgICAgTWVkaWFfRF9Xcml0ZU9uZVNlY3QgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja0hlYWQgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja1RhaWwgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlT25lQmxvY2sgICAgICAgKHZvaWQpOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQWxsQmxvY2sgICAgICAgKHZvaWQpOwoKaW50ICBDb3B5X0RfQmxvY2tBbGwgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIERXT1JEKTsKaW50ICBDb3B5X0RfQmxvY2tIZWFkICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIENvcHlfRF9CbG9ja1RhaWwgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVhc3NpZ25fRF9CbG9ja0hlYWQgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQXNzaWduX0RfV3JpdGVCbG9jayAgICAgICAgICh2b2lkKTsKaW50ICBSZWxlYXNlX0RfUmVhZEJsb2NrICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIFJlbGVhc2VfRF9Xcml0ZUJsb2NrICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVsZWFzZV9EX0NvcHlTZWN0b3IgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQ29weV9EX1BoeU9uZVNlY3QgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBSZWFkX0RfUGh5T25lU2VjdCAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKik7CmludCAgV3JpdGVfRF9QaHlPbmVTZWN0ICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgIEVyYXNlX0RfUGh5T25lQmxvY2sgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgppbnQgIFNldF9EX1BoeUZtdFZhbHVlICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgU2VhcmNoX0RfQ0lTICAgICAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBNYWtlX0RfTG9nVGFibGUgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwp2b2lkIENoZWNrX0RfQmxvY2tJc0Z1bGwgICAgICAgICAodm9pZCk7CgppbnQgIE1hcmtGYWlsX0RfUGh5T25lQmxvY2sgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgpEV09SRCBFcnJYRENvZGU7CkRXT1JEIEVyckNvZGU7Ci8vQllURSAgU2VjdEJ1ZltTRUNUU0laRV07CkJZVEUgIFdvcmtCdWZbU0VDVFNJWkVdOwpCWVRFICBSZWR1bmRhbnRbUkVEVFNJWkVdOwpCWVRFICBXb3JrUmVkdW5kW1JFRFRTSVpFXTsKLy9XT1JEICBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOwpXT1JEICAqTG9nMlBoeVtNQVhfWk9ORU5VTV07ICAgICAgICAgICAgICAgICAvLyAxMjggeCAxMDAwLCAgIExvZzJQaHlbTUFYX1pPTkVOVU1dW01BWF9MT0dCTE9DS107CkJZVEUgIEFzc2lnbltNQVhfWk9ORU5VTV1bTUFYX0JMT0NLTlVNLzhdOwpXT1JEICBBc3NpZ25TdGFydFtNQVhfWk9ORU5VTV07CldPUkQgIFJlYWRCbG9jazsKV09SRCAgV3JpdGVCbG9jazsKRFdPUkQgTWVkaWFDaGFuZ2U7CkRXT1JEIFNlY3RDb3B5TW9kZTsKCmV4dGVybiBzdHJ1Y3QgU1NGRENUWVBFICBTc2ZkYzsKZXh0ZXJuIHN0cnVjdCBBRERSRVNTICAgIE1lZGlhOwpleHRlcm4gc3RydWN0IENJU19BUkVBICAgQ2lzQXJlYTsKCi8vQklUIENvbnRyb2xsIE1hY3JvCkJZVEUgQml0RGF0YVtdID0geyAweDAxLDB4MDIsMHgwNCwweDA4LDB4MTAsMHgyMCwweDQwLDB4ODAgfSA7CiNkZWZpbmUgU2V0X0RfQml0KGEsYikgICAgKGFbKEJZVEUpKChiKS84KV18PSBCaXREYXRhWyhiKSU4XSkKI2RlZmluZSBDbHJfRF9CaXQoYSxiKSAgICAoYVsoQllURSkoKGIpLzgpXSY9fkJpdERhdGFbKGIpJThdKQojZGVmaW5lIENoa19EX0JpdChhLGIpICAgIChhWyhCWVRFKSgoYikvOCldICYgQml0RGF0YVsoYiklOF0pCgovL2V4dGVybiBQQllURSAgICBTTUhvc3RBZGRyOwpleHRlcm4gQllURSAgICAgSXNTU0ZEQ0NvbXBsaWFuY2U7CmV4dGVybiBCWVRFICAgICBJc1hEQ29tcGxpYW5jZTsKCgovLwovLy8vUG93ZXIgQ29udHJvbGwgJiBNZWRpYSBFeGlzdCBDaGVjayBGdW5jdGlvbgovLy8vLS0tLS0gSW5pdF9EX1NtYXJ0TWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBJbml0X0RfU21hcnRNZWRpYSh2b2lkKQovL3sKLy8gICAgaW50ICAgICBpOwovLwovLyAgICBFTUNSX1ByaW50KCJJbml0X0RfU21hcnRNZWRpYSBzdGFydFxuIik7Ci8vICAgIGZvciAoaT0wOyBpPE1BWF9aT05FTlVNOyBpKyspCi8vICAgIHsKLy8gICAgICAgIGlmIChMb2cyUGh5W2ldIT1OVUxMKQovLyAgICAgICAgewovLyAgICAgICAgICAgIEVNQ1JfUHJpbnQoIkV4RnJlZVBvb2wgWm9uZSA9ICV4LCBBZGRyID0gJXhcbiIsIGksIExvZzJQaHlbaV0pOwovLyAgICAgICAgICAgIEV4RnJlZVBvb2woTG9nMlBoeVtpXSk7Ci8vICAgICAgICAgICAgTG9nMlBoeVtpXSA9IE5VTEw7Ci8vICAgICAgICB9Ci8vICAgIH0KLy8KLy8gICAgSW5pdGlhbGl6ZV9EX01lZGlhKCk7Ci8vICAgIHJldHVybihOT19FUlJPUik7Ci8vfQoKLy8tLS0tLSBTTV9GcmVlTWVtKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU01fRnJlZU1lbSh2b2lkKQp7CglpbnQJaTsKCglwcmludGsoIlNNX0ZyZWVNZW0gc3RhcnRcbiIpOwoJZm9yIChpPTA7IGk8TUFYX1pPTkVOVU07IGkrKykKCXsKCQlpZiAoTG9nMlBoeVtpXSE9TlVMTCkKCQl7CgkJCXByaW50aygiRnJlZSBab25lID0gJXgsIEFkZHIgPSAlcFxuIiwgaSwgTG9nMlBoeVtpXSk7CgkJCWtmcmVlKExvZzJQaHlbaV0pOwoJCQlMb2cyUGh5W2ldID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4oTk9fRVJST1IpOwp9CgovLy8vLS0tLS0gUHdvZmZfRF9TbWFydE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBQd29mZl9EX1NtYXJ0TWVkaWEodm9pZCkKLy97Ci8vICAgIFBvd2VyT2ZmX0RfTWVkaWEoKTsKLy8gICAgcmV0dXJuKE5PX0VSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX1NtYXJ0TWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfU21hcnRNZWRpYSh2b2lkKQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFFeGlzdCgpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfUGFyYW1ldGVyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9QYXJhbWV0ZXIoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCxXT1JEICpwY3lsLEJZVEUgKnBoZWFkLEJZVEUgKnBzZWN0KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9Mb2dDSFMocGN5bCxwaGVhZCxwc2VjdCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIHJldHVybihOT19FUlJPUik7Ci8vfQoKLy9TbWFydE1lZGlhIFJlYWQvV3JpdGUvRXJhc2UgRnVuY3Rpb24KLy8tLS0tLSBNZWRpYV9EX1JlYWRTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBzdGFydCxXT1JEIGNvdW50LEJZVEUgKmJ1ZikKewoJV09SRCBsZW4sIGJuOwoKCS8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKSAgICAgICAgOyCmYiA2MjUwIGRvbid0IGNhcmUKCS8vICAgIHJldHVybihFcnJDb2RlKTsgICAgICAgICAgICAgOwoJLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKSAgICA7CgkvLyAgICByZXR1cm4oRXJyQ29kZSk7ICAgICAgICAgICAgIDsKCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCgkJcmV0dXJuKEVyckNvZGUpOwoKCXdoaWxlKDEpCgl7CgkJbGVuID0gU3NmZGMuTWF4U2VjdG9ycyAtIE1lZGlhLlNlY3RvcjsKCQlpZiAoY291bnQgPiBsZW4pCgkJCWJuID0gbGVuOwoJCWVsc2UKCQkJYm4gPSBjb3VudDsKCQkvL2lmIChNZWRpYV9EX1JlYWRPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCgkJLy9pZiAoTWVkaWFfRF9SZWFkT25lU2VjdChmZG9FeHQsIGNvdW50LCBidWYpKQoJCWlmIChNZWRpYV9EX1JlYWRPbmVTZWN0KHVzLCBibiwgYnVmKSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfRWNjUmVhZEVycjsKCQkJcmV0dXJuKEVyckNvZGUpOwoJCX0KCgkJTWVkaWEuU2VjdG9yICs9IGJuOwoJCWNvdW50IC09IGJuOwoKCQlpZiAoY291bnQ8PTApCgkJCWJyZWFrOwoKCQlidWYgKz0gYm4gKiBTRUNUU0laRTsKCgkJaWYgKEluY19EX01lZGlhQWRkcih1cykpCgkJCXJldHVybihFcnJDb2RlKTsKCX0KCglyZXR1cm4oTk9fRVJST1IpOwp9Ci8vIGhlcmUKLy8tLS0tLSBNZWRpYV9EX0NvcHlTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIHN0YXJ0LFdPUkQgY291bnQsQllURSAqYnVmKQp7CgkvL0RXT1JEIG1vZGU7CgkvL2ludCBpOwoJV09SRCBsZW4sIGJuOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJLy9wcmludGsoIk1lZGlhX0RfQ29weVNlY3RvciAhISFcbiIpOwoJaWYgKENvbnZfRF9NZWRpYUFkZHIodXMsIHN0YXJ0KSkKCQlyZXR1cm4oRXJyQ29kZSk7CgoJd2hpbGUoMSkKCXsKCQlpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQoJCQlyZXR1cm4oRVJST1IpOwoKCQlsZW4gPSBTc2ZkYy5NYXhTZWN0b3JzIC0gTWVkaWEuU2VjdG9yOwoJCWlmIChjb3VudCA+IGxlbikKCQkJYm4gPSBsZW47CgkJZWxzZQoJCWJuID0gY291bnQ7CgoJCS8vaWYgKFNzZmRjX0RfQ29weUJsb2NrKGZkb0V4dCxjb3VudCxidWYsUmVkdW5kYW50KSkKCQlpZiAoU3NmZGNfRF9Db3B5QmxvY2sodXMsYm4sYnVmLFJlZHVuZGFudCkpCgkJewoJCQlFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CgkJCXJldHVybihFcnJDb2RlKTsKCQl9CgoJCU1lZGlhLlNlY3RvciA9IDB4MUY7CgkJLy9pZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQoJCWlmIChSZWxlYXNlX0RfQ29weVNlY3Rvcih1cykpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJCXsKCQkJCUVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKCQkJCXJldHVybihFcnJDb2RlKTsKCQkJfQoJCX0KCQljb3VudCAtPSBibjsKCgkJaWYgKGNvdW50PD0wKQoJCQlicmVhazsKCgkJYnVmICs9IGJuICogU0VDVFNJWkU7CgoJCWlmIChJbmNfRF9NZWRpYUFkZHIodXMpKQoJCQlyZXR1cm4oRXJyQ29kZSk7CgoJfQoJcmV0dXJuKE5PX0VSUk9SKTsKfQoKLy8tLS0tLSBSZWxlYXNlX0RfQ29weVNlY3RvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVsZWFzZV9EX0NvcHlTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1Xcml0ZUJsb2NrOwoJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoKCWlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQoJewoJCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCUNscl9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8tLS0tLSBNZWRpYV9EX1dyaXRlU2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1dyaXRlU2VjdG9yKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIERXT1JEIHN0YXJ0LFdPUkQgY291bnQsQllURSAqYnVmKQp7CiAgICBpbnQgaTsKICAgIFdPUkQgbGVuLCBibjsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgLy9pZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCiAgICAvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAvLwogICAgLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQogICAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwogICAgLy8KICAgIC8vaWYgKENoZWNrX0RfTWVkaWFXUCgpKQogICAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIGlmIChDb252X0RfTWVkaWFBZGRyKGZkb0V4dCwgc3RhcnQpKQogICAgICAgIHJldHVybihFcnJDb2RlKTsKCiAgICAvL0VORV9QcmludCgiTWVkaWFfRF9Xcml0ZVNlY3RvciAtLS0gU2VjdG9yID0gJXhcbiIsIE1lZGlhLlNlY3Rvcik7CiAgICBpZiAoQ2hlY2tfRF9GaXJzdFNlY3QoKSkKICAgIHsKICAgICAgICBpZiAoTWVkaWFfRF9Db3B5QmxvY2tIZWFkKGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUoMSkKICAgIHsKICAgICAgICBpZiAoIUNoZWNrX0RfRmlyc3RTZWN0KCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQogICAgICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgICAgIH0KCiAgICAgICAgbGVuID0gU3NmZGMuTWF4U2VjdG9ycyAtIE1lZGlhLlNlY3RvcjsKICAgICAgICBpZiAoY291bnQgPiBsZW4pCiAgICAgICAgICAgYm4gPSBsZW47CiAgICAgICAgZWxzZQogICAgICAgICAgIGJuID0gY291bnQ7CiAgICAgICAgLy9mb3IoaT0wO2k8U0VDVFNJWkU7aSsrKQogICAgICAgIC8vICAgIFNlY3RCdWZbaV09KmJ1ZisrOwoKICAgICAgICAvL2lmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIFNlY3RCdWYpKQogICAgICAgIGlmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIGJuLCBidWYpKQogICAgICAgIHsKICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAgICAgfQoKICAgICAgICBNZWRpYS5TZWN0b3IgKz0gYm4gLSAxOwoKICAgICAgICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChSZWxlYXNlX0RfUmVhZEJsb2NrKGZkb0V4dCkpCgogICAgICAgICAgICB7ICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb3VudCAtPSBibjsKCiAgICAgICAgaWYgKGNvdW50PD0wKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgYnVmICs9IGJuICogU0VDVFNJWkU7CgogICAgICAgIC8vaWYgKC0tY291bnQ8PTApCiAgICAgICAgLy8gICAgYnJlYWs7CgogICAgICAgIGlmIChJbmNfRF9NZWRpYUFkZHIoZmRvRXh0KSkKICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgfQoKICAgIGlmICghQ2hlY2tfRF9MYXN0U2VjdCgpKQogICAgICAgIHJldHVybihOT19FUlJPUik7CgogICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQogICAgICAgIHJldHVybihFcnJDb2RlKTsKCiAgICBpZiAoTWVkaWFfRF9Db3B5QmxvY2tUYWlsKGZkb0V4dCkpCiAgICB7CiAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwogICAgICAgIHJldHVybihFcnJDb2RlKTsKICAgIH0KCiAgICByZXR1cm4oTk9fRVJST1IpOwp9Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VCbG9jayhQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBEV09SRCBzdGFydCxXT1JEIGNvdW50KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDb252X0RfTWVkaWFBZGRyKHN0YXJ0KSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgd2hpbGUoQ2hlY2tfRF9GaXJzdFNlY3QoKSkgewovLyAgICAgICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQovLyAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgICAgIGlmICgtLWNvdW50PD0wKQovLyAgICAgICAgICAgIHJldHVybihOT19FUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUoMSkgewovLyAgICAgICAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCi8vICAgICAgICAgICAgaWYgKE1lZGlhX0RfRXJhc2VPbmVCbG9jaygpKQovLyAgICAgICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQovLyAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgICAgIGlmICgtLWNvdW50PD0wKQovLyAgICAgICAgICAgIHJldHVybihOT19FUlJPUik7Ci8vICAgIH0KLy99Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQWxsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VBbGwoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKLy97Ci8vICAgIGlmIChDaGVja19EX01lZGlhUG93ZXIoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFGbXRGb3JFcmFzZUFsbChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChNZWRpYV9EX0VyYXNlQWxsQmxvY2soKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgcmV0dXJuKE5PX0VSUk9SKTsKLy99CgovL1NtYXJ0TWVkaWEgV3JpdGUgRnVuY3Rpb24gZm9yIE9uZSBTZWN0b3IgV3JpdGUgTW9kZQovLy0tLS0tIE1lZGlhX0RfT25lU2VjdFdyaXRlU3RhcnQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfT25lU2VjdFdyaXRlU3RhcnQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCxEV09SRCBzdGFydCxCWVRFICpidWYpCnsKLy8gIGludCBpOwovLyAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gIC8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwovLyAgLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgLy8gICAgcmV0dXJuKEVyckNvZGUpOwovLyAgLy9pZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAvLyAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICBpZiAoQ29udl9EX01lZGlhQWRkcihmZG9FeHQsIHN0YXJ0KSkKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICBpZiAoQ2hlY2tfRF9GaXJzdFNlY3QoKSkKLy8gICAgICBpZiAoTWVkaWFfRF9Db3B5QmxvY2tIZWFkKGZkb0V4dCkpCi8vICAgICAgewovLyAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICB9Ci8vCi8vICBpZiAoIUNoZWNrX0RfRmlyc3RTZWN0KCkpCi8vICAgICAgaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKLy8gICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgLy9mb3IoaT0wO2k8U0VDVFNJWkU7aSsrKQovLyAgLy8gICAgU2VjdEJ1ZltpXT0qYnVmKys7Ci8vCi8vICAvL2lmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIFNlY3RCdWYpKQovLyAgaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgYnVmKSkKLy8gIHsKLy8gICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgfQovLwovLyAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCi8vICB7Ci8vICAgICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKLy8gICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQovLyAgICAgICAgICB7Ci8vICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAgICAgICAgIH0KLy8gIH0KCiAgICByZXR1cm4oTk9fRVJST1IpOwp9CgovLy0tLS0tIE1lZGlhX0RfT25lU2VjdFdyaXRlTmV4dCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfT25lU2VjdFdyaXRlTmV4dChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYpCnsKLy8gIGludCBpOwovLyAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gIGlmIChJbmNfRF9NZWRpYUFkZHIoZmRvRXh0KSkKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICBpZiAoIUNoZWNrX0RfRmlyc3RTZWN0KCkpCi8vICAgIGlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCi8vICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgLy9mb3IoaT0wO2k8U0VDVFNJWkU7aSsrKQovLyAgLy8gICAgU2VjdEJ1ZltpXT0qYnVmKys7Ci8vCi8vICAvL2lmIChNZWRpYV9EX1dyaXRlT25lU2VjdChmZG9FeHQsIFNlY3RCdWYpKQovLyAgaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgYnVmKSkKLy8gIHsKLy8gICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgfQovLwovLyAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCi8vICB7Ci8vICAgICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKLy8gICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQovLyAgICAgICAgICB7Ci8vICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7Ci8vICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAgICAgICAgIH0KLy8gIH0KCiAgICByZXR1cm4oTk9fRVJST1IpOwp9CgovLy0tLS0tIE1lZGlhX0RfT25lU2VjdFdyaXRlRmx1c2goKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfT25lU2VjdFdyaXRlRmx1c2goUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCiAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKCiAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja1RhaWwoZmRvRXh0KSkKICAgIHsKICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KLy8KLy8vL0xFRCBUZXJuIE9uL09mZiBTdWJyb3V0aW5lCi8vLy8tLS0tLSBTTV9FbmFibGVMRUQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU01fRW5hYmxlTEVEKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJPT0xFQU4gZW5hYmxlKQovL3sKLy8gICAgaWYgKGZkb0V4dC0+RHJpdmVfSXNTV0xFRCkKLy8gICAgewovLyAgICAgICAgaWYgKGVuYWJsZSkKLy8gICAgICAgICAgIExlZF9EX1Rlcm5PbigpOwovLyAgICAgICAgZWxzZQovLyAgICAgICAgICAgTGVkX0RfVGVybk9mZigpOwovLyAgICB9Ci8vfQovLwovLy8vLS0tLS0gTGVkX0RfVGVybk9uKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgTGVkX0RfVGVybk9uKHZvaWQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZT1FUlJPUjsKLy8KLy8gICAgQ250X0RfTGVkT24oKTsKLy99Ci8vCi8vLy8tLS0tLSBMZWRfRF9UZXJuT2ZmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBMZWRfRF9UZXJuT2ZmKHZvaWQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZT1FUlJPUjsKLy8KLy8gICAgQ250X0RfTGVkT2ZmKCk7Ci8vfQovLwovLy8vU21hcnRNZWRpYSBMb2dpY2FsIEZvcm1hdCBTdWJyb3V0aW5lCi8vLy8tLS0tLSBDaGVja19EX0xvZ0NIUygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTG9nQ0hTKFdPUkQgKmMsQllURSAqaCxCWVRFICpzKQovL3sKLy8gICAgc3dpdGNoKFNzZmRjLk1vZGVsKSB7Ci8vICAgICAgICBjYXNlIFNTRkRDMU1COiAgICpjPTEyNTsgKmg9IDQ7ICpzPSA0OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREMyTUI6ICAgKmM9MTI1OyAqaD0gNDsgKnM9IDg7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzRNQjogICAqYz0yNTA7ICpoPSA0OyAqcz0gODsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDOE1COiAgICpjPTI1MDsgKmg9IDQ7ICpzPTE2OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREMxNk1COiAgKmM9NTAwOyAqaD0gNDsgKnM9MTY7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzMyTUI6ICAqYz01MDA7ICpoPSA4OyAqcz0xNjsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDNjRNQjogICpjPTUwMDsgKmg9IDg7ICpzPTMyOyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREMxMjhNQjogKmM9NTAwOyAqaD0xNjsgKnM9MzI7IGJyZWFrOwovLyAgICAgICAgZGVmYXVsdDogICAgICAgICAqYz0gMDsgICpoPSAwOyAqcz0gMDsgRXJyQ29kZSA9IEVSUl9Ob1NtYXJ0TWVkaWE7ICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vL1Bvd2VyIENvbnRyb2xsICYgTWVkaWEgRXhpc3QgQ2hlY2sgU3Vicm91dGluZQovLy8vLS0tLS0gSW5pdGlhbGl6ZV9EX01lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgSW5pdGlhbGl6ZV9EX01lZGlhKHZvaWQpCi8vewovLyAgICBFcnJDb2RlICAgICAgPSBOT19FUlJPUjsKLy8gICAgTWVkaWFDaGFuZ2UgID0gRVJST1I7Ci8vICAgIFNlY3RDb3B5TW9kZSA9IENPTVBMRVRFRDsKLy8gICAgQ250X0RfUmVzZXQoKTsKLy99Ci8vCi8vLy8tLS0tLSBQb3dlck9mZl9EX01lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBQb3dlck9mZl9EX01lZGlhKHZvaWQpCi8vewovLyAgICBDbnRfRF9Qb3dlck9mZigpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfTWVkaWFQb3dlcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9NZWRpYVBvd2VyKHZvaWQpCi8vewovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKENoZWNrX0RfQ2FyZFN0c0NoZygpKQovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIGlmICgoIUNoZWNrX0RfQ250UG93ZXIoKSkmJighTWVkaWFDaGFuZ2UpKSAgLy8gprMgcG93ZXIgJiBNZWRpYSCoU7NRIGNoYW5nZSwgq2ggcmV0dXJuIHN1Y2Nlc3MKLy8gICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vCi8vICAgIGlmIChDaGVja19EX0NhcmRFeGlzdCgpKSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2FyZCBpcyBub3QgZXhpc3QsIHJldHVybiBlcnIKLy8gICAgewovLyAgICAgICAgRXJyQ29kZSAgICAgICAgPSBFUlJfTm9TbWFydE1lZGlhOwovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIGlmIChDbnRfRF9Qb3dlck9uKCkpCi8vICAgIHsKLy8gICAgICAgIEVyckNvZGUgICAgICAgID0gRVJSX05vU21hcnRNZWRpYTsKLy8gICAgICAgIE1lZGlhQ2hhbmdlID0gRVJST1I7Ci8vICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICB9Ci8vICAgIC8vdXNsZWVwKDU2KjEwMjQpOwovLyAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vICAgIC8vdXNsZWVwKDU2KjEwMjQpOwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vLS0tLS1DaGVja19EX01lZGlhRXhpc3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhRXhpc3Qodm9pZCkKLy97Ci8vICAgIGlmIChDaGVja19EX0NhcmRTdHNDaGcoKSkKLy8gICAgICAgIE1lZGlhQ2hhbmdlID0gRVJST1I7Ci8vCi8vICAgIGlmICghQ2hlY2tfRF9DYXJkRXhpc3QoKSkKLy8gICAgewovLyAgICAgICAgaWYgKCFNZWRpYUNoYW5nZSkKLy8gICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vCi8vICAgICAgICBFcnJDb2RlID0gRVJSX0NoYW5nZWRNZWRpYTsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgRXJyQ29kZSA9IEVSUl9Ob1NtYXJ0TWVkaWE7Ci8vCi8vICAgIHJldHVybihFUlJPUik7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9NZWRpYVdQKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhV1Aodm9pZCkKLy97Ci8vICAgIGlmIChTc2ZkYy5BdHRyaWJ1dGUgJk1XUCkKLy8gICAgewovLyAgICAgICAgRXJyQ29kZSA9IEVSUl9XcnRQcm90ZWN0OwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQoqLwovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgRm9ybWF0IFRlc3QgU3Vicm91dGluZQovLy0tLS0tIENoZWNrX0RfTWVkaWFGbXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfTWVkaWFGbXQoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglwcmludGsoIkNoZWNrX0RfTWVkaWFGbXRcbiIpOwoJLy9VTE9ORyBpLGosIHJlc3VsdD1GQUxTRSwgem9uZSxibG9jazsKCgkvL3VzbGVlcCg1NioxMDI0KTsKCWlmICghTWVkaWFDaGFuZ2UpCgkJcmV0dXJuKFNVQ0NFU1MpOwoKCU1lZGlhQ2hhbmdlICA9IEVSUk9SOwoJU2VjdENvcHlNb2RlID0gQ09NUExFVEVEOwoKCS8vdXNsZWVwKDU2KjEwMjQpOwoJaWYgKFNldF9EX1BoeUZtdFZhbHVlKHVzKSkKCXsKCQlFcnJDb2RlID0gRVJSX1Vua25vd25NZWRpYTsKCQlyZXR1cm4oRVJST1IpOwoJfQoJCgkvL3VzbGVlcCg1NioxMDI0KTsKCWlmIChTZWFyY2hfRF9DSVModXMpKQoJewoJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCiAgICBNZWRpYUNoYW5nZSA9IFNVQ0NFU1M7CiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8vLy0tLS0tIENoZWNrX0RfQmxvY2tJc0Z1bGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDaGVja19EX0Jsb2NrSXNGdWxsKCkKLy97Ci8vICAgIFVMT05HIGksIGJsb2NrOwovLwovLyAgICBpZiAoSXNYRENvbXBsaWFuY2UgfHwgSXNTU0ZEQ0NvbXBsaWFuY2UpCi8vICAgIHsKLy8gICAgICAgLy8gSWYgdGhlIGJsb2NrcyBhcmUgZnVsbCB0aGVuIHJldHVybiB3cml0ZS1wcm90ZWN0LgovLyAgICAgICBibG9jayA9IFNzZmRjLk1heEJsb2Nrcy84OwovLyAgICAgICBmb3IgKE1lZGlhLlpvbmU9MDsgTWVkaWEuWm9uZTxTc2ZkYy5NYXhab25lczsgTWVkaWEuWm9uZSsrKQovLyAgICAgICB7Ci8vICAgICAgICAgICBpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKLy8gICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICBpZiAoTWFrZV9EX0xvZ1RhYmxlKCkpCi8vICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7Ci8vICAgICAgICAgICAgICAgICAgIHJldHVybjsKLy8gICAgICAgICAgICAgICB9Ci8vICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICBmb3IgKGk9MDsgaTxibG9jazsgaSsrKQovLyAgICAgICAgICAgewovLyAgICAgICAgICAgICAgIGlmIChBc3NpZ25bTWVkaWEuWm9uZV1baV0gIT0gMHhGRikKLy8gICAgICAgICAgICAgICAgICByZXR1cm47Ci8vICAgICAgICAgICB9Ci8vICAgICAgIH0KLy8gICAgICAgU3NmZGMuQXR0cmlidXRlIHw9IFdQOwovLyAgICB9Ci8vfQovLwovLwovLy8vLS0tLS0gQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhRm10Rm9yRXJhc2VBbGwoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKLy97Ci8vICAgIE1lZGlhQ2hhbmdlICA9IEVSUk9SOwovLyAgICBTZWN0Q29weU1vZGUgPSBDT01QTEVURUQ7Ci8vCi8vICAgIGlmIChTZXRfRF9QaHlGbXRWYWx1ZShmZG9FeHQpKQovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlID0gRVJSX1Vua25vd25NZWRpYTsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgaWYgKFNlYXJjaF9EX0NJUyhmZG9FeHQpKQovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7Ci8vICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICB9Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CiovCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBBZGRyZXNzIENvbnRyb2xsIFN1YnJvdXRpbmUKLy8tLS0tLSBDb252X0RfTWVkaWFBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb252X0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgYWRkcikKewoJRFdPUkQgdGVtcDsKCS8vVUxPTkcgIHp6OwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJdGVtcCAgICAgICAgICAgPSBhZGRyL1NzZmRjLk1heFNlY3RvcnM7CglNZWRpYS5ab25lICAgICA9IChCWVRFKSAodGVtcC9Tc2ZkYy5NYXhMb2dCbG9ja3MpOwoKCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJewoJCWlmIChNYWtlX0RfTG9nVGFibGUodXMpKQoJCXsKCQkJRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwoJCQlyZXR1cm4oRVJST1IpOwoJCX0KCX0KCglNZWRpYS5TZWN0b3IgICA9IChCWVRFKSAoYWRkciVTc2ZkYy5NYXhTZWN0b3JzKTsKCU1lZGlhLkxvZ0Jsb2NrID0gKFdPUkQpICh0ZW1wJVNzZmRjLk1heExvZ0Jsb2Nrcyk7CgoJaWYgKE1lZGlhLlpvbmU8U3NmZGMuTWF4Wm9uZXMpCgl7CgkJQ2xyX0RfUmVkdW5kYW50RGF0YShSZWR1bmRhbnQpOwoJCVNldF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpOwoJCU1lZGlhLlBoeUJsb2NrID0gTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja107CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCUVyckNvZGUgPSBFUlJfT3V0T2ZMQkE7CglyZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIEluY19EX01lZGlhQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IEluY19EX01lZGlhQWRkcihzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCVdPUkQgICAgICAgIExvZ0Jsb2NrID0gTWVkaWEuTG9nQmxvY2s7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglpZiAoKytNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9ycykKCQlyZXR1cm4oU1VDQ0VTUyk7CgoJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCgl7CgkJaWYgKE1ha2VfRF9Mb2dUYWJsZSh1cykpCgkJewoJCQlFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7CgkJCXJldHVybihFUlJPUik7CgkJfQoJfQoKCU1lZGlhLlNlY3Rvcj0wOwoJTWVkaWEuTG9nQmxvY2sgPSBMb2dCbG9jazsKCglpZiAoKytNZWRpYS5Mb2dCbG9jazxTc2ZkYy5NYXhMb2dCbG9ja3MpCgl7CgkJQ2xyX0RfUmVkdW5kYW50RGF0YShSZWR1bmRhbnQpOwoJCVNldF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpOwoJCU1lZGlhLlBoeUJsb2NrPUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdOwoJCXJldHVybihTVUNDRVNTKTsKCX0KCglNZWRpYS5Mb2dCbG9jaz0wOwoKCWlmICgrK01lZGlhLlpvbmU8U3NmZGMuTWF4Wm9uZXMpCgl7CgkJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCgkJewoJCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkKCQkJewoJCQkJRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwoJCQkJcmV0dXJuKEVSUk9SKTsKCQkJfQoJCX0KCgkJTWVkaWEuTG9nQmxvY2sgPSAwOwoKCQlDbHJfRF9SZWR1bmRhbnREYXRhKFJlZHVuZGFudCk7CgkJU2V0X0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCk7CgkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja107CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCU1lZGlhLlpvbmU9MDsKCUVyckNvZGUgPSBFUlJfT3V0T2ZMQkE7CgoJcmV0dXJuKEVSUk9SKTsKfQovKgovLy0tLS0tIENoZWNrX0RfRmlyc3RTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfRmlyc3RTZWN0KHZvaWQpCnsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgaWYgKCFNZWRpYS5TZWN0b3IpCiAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwoKICAgIHJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9MYXN0U2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9MYXN0U2VjdCh2b2lkKQp7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIGlmIChNZWRpYS5TZWN0b3I8KFNzZmRjLk1heFNlY3RvcnMtMSkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KKi8KLy9TbWFydE1lZGlhIFJlYWQvV3JpdGUgU3Vicm91dGluZSB3aXRoIFJldHJ5Ci8vLS0tLS0gTWVkaWFfRF9SZWFkT25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9SZWFkT25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKewoJRFdPUkQgZXJyLCByZXRyeTsKCglpZiAoIVJlYWRfRF9QaHlPbmVTZWN0KHVzLCBjb3VudCwgYnVmKSkKCQlyZXR1cm4oU1VDQ0VTUyk7CglpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJcmV0dXJuKEVSUk9SKTsKCWlmIChFcnJDb2RlPT1FUlJfRGF0YVN0YXR1cykKCQlyZXR1cm4oRVJST1IpOwoKI2lmZGVmIFJERVJSX1JFQVNTSUdOCglpZiAoU3NmZGMuQXR0cmlidXRlICZNV1ApCgl7CgkJaWYgKEVyckNvZGU9PUVSUl9Db3JSZWFkRXJyKQoJCQlyZXR1cm4oU1VDQ0VTUyk7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCgllcnI9RXJyQ29kZTsKCWZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQoJewoJCWlmIChDb3B5X0RfQmxvY2tBbGwodXMsIChlcnI9PUVSUl9FY2NSZWFkRXJyKT9SRVFfRkFJTDpSRVFfRVJBU0UpKQoJCXsKCQkJaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQoJCQkJcmV0dXJuKEVSUk9SKTsKCQkJY29udGludWU7CgkJfQoKCQlFcnJDb2RlID0gZXJyOwoJCWlmIChFcnJDb2RlPT1FUlJfQ29yUmVhZEVycikKCQkJcmV0dXJuKFNVQ0NFU1MpOwoJCXJldHVybihFUlJPUik7Cgl9CgoJTWVkaWFDaGFuZ2UgPSBFUlJPUjsKI2Vsc2UKCWlmIChFcnJDb2RlPT1FUlJfQ29yUmVhZEVycikgcmV0dXJuKFNVQ0NFU1MpOwojZW5kaWYKCglyZXR1cm4oRVJST1IpOwp9Ci8qCi8vLS0tLS0gTWVkaWFfRF9Xcml0ZU9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Xcml0ZU9uZVNlY3QoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgV09SRCBjb3VudCwgQllURSAqYnVmKQp7CiAgICBEV09SRCByZXRyeTsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgaWYgKCFXcml0ZV9EX1BoeU9uZVNlY3QoZmRvRXh0LCBjb3VudCwgYnVmKSkKICAgICAgICByZXR1cm4oU1VDQ0VTUyk7CiAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBmb3IocmV0cnk9MTsgcmV0cnk8MjsgcmV0cnkrKykKICAgIHsKICAgICAgICBpZiAoUmVhc3NpZ25fRF9CbG9ja0hlYWQoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFXcml0ZV9EX1BoeU9uZVNlY3QoZmRvRXh0LCBjb3VudCwgYnVmKSkKICAgICAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgIH0KCiAgICBpZiAoUmVsZWFzZV9EX1dyaXRlQmxvY2soZmRvRXh0KSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIEVyckNvZGUgICAgICAgID0gRVJSX1dyaXRlRmF1bHQ7CiAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwogICAgcmV0dXJuKEVSUk9SKTsKfQoKLy9TbWFydE1lZGlhIERhdGEgQ29weSBTdWJyb3V0aW5lIHdpdGggUmV0cnkKLy8tLS0tLSBNZWRpYV9EX0NvcHlCbG9ja0hlYWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX0NvcHlCbG9ja0hlYWQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgRFdPUkQgcmV0cnk7CgogICAgZm9yKHJldHJ5PTA7IHJldHJ5PDI7IHJldHJ5KyspCiAgICB7CiAgICAgICAgaWYgKCFDb3B5X0RfQmxvY2tIZWFkKGZkb0V4dCkpCiAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICB9CgogICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKICAgIHJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gTWVkaWFfRF9Db3B5QmxvY2tUYWlsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Db3B5QmxvY2tUYWlsKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIERXT1JEIHJldHJ5OwoKICAgIGlmICghQ29weV9EX0Jsb2NrVGFpbChmZG9FeHQpKQogICAgICAgIHJldHVybihTVUNDRVNTKTsKICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIGZvcihyZXRyeT0xOyByZXRyeTwyOyByZXRyeSsrKQogICAgewogICAgICAgIGlmIChSZWFzc2lnbl9EX0Jsb2NrSGVhZChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUNvcHlfRF9CbG9ja1RhaWwoZmRvRXh0KSkKICAgICAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgIH0KCiAgICBpZiAoUmVsZWFzZV9EX1dyaXRlQmxvY2soZmRvRXh0KSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIEVyckNvZGUgICAgICAgID0gRVJSX1dyaXRlRmF1bHQ7CiAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwogICAgcmV0dXJuKEVSUk9SKTsKfQovLwovLy8vLS0tLS0gTWVkaWFfRF9FcmFzZU9uZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBNZWRpYV9EX0VyYXNlT25lQmxvY2sodm9pZCkKLy97Ci8vICAgIFdPUkQgICAgICAgIExvZ0Jsb2NrID0gTWVkaWEuTG9nQmxvY2s7Ci8vICAgIFdPUkQgICAgICAgIFBoeUJsb2NrID0gTWVkaWEuUGh5QmxvY2s7Ci8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwovLyAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gICAgaWYgKE1lZGlhLlBoeUJsb2NrPT1OT19BU1NJR04pCi8vICAgICAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vCi8vICAgIGlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQovLyAgICB7Ci8vICAgICAgICBpZiAoTWFrZV9EX0xvZ1RhYmxlKCkpCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICB9Ci8vICAgIH0KLy8gICAgTWVkaWEuTG9nQmxvY2sgPSBMb2dCbG9jazsKLy8gICAgTWVkaWEuUGh5QmxvY2sgPSBQaHlCbG9jazsKLy8KLy8gICAgTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109Tk9fQVNTSUdOOwovLwovLyAgICBpZiAoRXJhc2VfRF9QaHlPbmVCbG9jayhmZG9FeHQpKQovLyAgICB7Ci8vICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIGlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8KLy8gICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgQ2xyX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7Ci8vICAgIE1lZGlhLlBoeUJsb2NrPU5PX0FTU0lHTjsKLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vL1NtYXJ0TWVkaWEgRXJhc2UgU3Vicm91dGluZQovLy8vLS0tLS0gTWVkaWFfRF9FcmFzZUFsbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBNZWRpYV9EX0VyYXNlQWxsQmxvY2sodm9pZCkKLy97Ci8vICAgIFdPUkQgY2lzPTA7Ci8vCi8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwovLyAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgTWVkaWEuU2VjdG9yICAgPSAwOwovLwovLyAgICBmb3IoTWVkaWEuWm9uZT0wOyBNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzOyBNZWRpYS5ab25lKyspCi8vICAgICAgICBmb3IoTWVkaWEuUGh5QmxvY2s9MDsgTWVkaWEuUGh5QmxvY2s8U3NmZGMuTWF4QmxvY2tzOyBNZWRpYS5QaHlCbG9jaysrKSB7Ci8vICAgICAgICAgICAgaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKFJlZHVuZGFudCkpCi8vICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICAgICAgfQovLwovLyAgICAgICAgICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgICAgICAgICBpZiAoIUNoZWNrX0RfRmFpbEJsb2NrKFJlZHVuZGFudCkpCi8vICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICBpZiAoY2lzKQovLyAgICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgICBpZiAoU3NmZGNfRF9FcmFzZUJsb2NrKGZkb0V4dCkpCi8vICAgICAgICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOwovLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgICAgICAgICBpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQovLyAgICAgICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkpCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLy8gICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgICAgICAgICBpZiAoTWVkaWEuUGh5QmxvY2shPUNpc0FyZWEuUGh5QmxvY2spCi8vICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKLy8gICAgICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICAgICAgY2lzKys7Ci8vICAgICAgICAgICAgfQovLwovLyAgICAgICAgfQovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQoqLwovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgU2VjdG9yIERhdGEgQ29weSBTdWJyb3V0aW5lCi8vLS0tLS0gQ29weV9EX0Jsb2NrQWxsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ29weV9EX0Jsb2NrQWxsKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgbW9kZSkKewoJQllURSBzZWN0OwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJc2VjdD1NZWRpYS5TZWN0b3I7CgoJaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKCQlyZXR1cm4oRVJST1IpOwoJaWYgKG1vZGU9PVJFUV9GQUlMKQoJCVNlY3RDb3B5TW9kZT1SRVFfRkFJTDsKCglmb3IoTWVkaWEuU2VjdG9yPTA7IE1lZGlhLlNlY3RvcjxTc2ZkYy5NYXhTZWN0b3JzOyBNZWRpYS5TZWN0b3IrKykKCXsKCQlpZiAoQ29weV9EX1BoeU9uZVNlY3QodXMpKQoJCXsKCQkJaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQoJCQkJcmV0dXJuKEVSUk9SKTsKCQkJaWYgKFJlbGVhc2VfRF9Xcml0ZUJsb2NrKHVzKSkKCQkJCXJldHVybihFUlJPUik7CgoJCQlFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CgkJCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCQkJTWVkaWEuU2VjdG9yPXNlY3Q7CgoJCQlyZXR1cm4oRVJST1IpOwoJCX0KCX0KCglpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayh1cykpCgkJcmV0dXJuKEVSUk9SKTsKCglNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJTWVkaWEuU2VjdG9yPXNlY3Q7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8tLS0tLSBDb3B5X0RfQmxvY2tIZWFkKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb3B5X0RfQmxvY2tIZWFkKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIEJZVEUgc2VjdDsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgc2VjdD1NZWRpYS5TZWN0b3I7CiAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8c2VjdDsgTWVkaWEuU2VjdG9yKyspCiAgICB7CiAgICAgICAgaWYgKENvcHlfRF9QaHlPbmVTZWN0KGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgICAgICBpZiAoUmVsZWFzZV9EX1dyaXRlQmxvY2soZmRvRXh0KSkKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CgogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIE1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKICAgICAgICAgICAgTWVkaWEuU2VjdG9yPXNlY3Q7CgogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgIH0KICAgIH0KCiAgICBNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwogICAgTWVkaWEuU2VjdG9yPXNlY3Q7CiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ29weV9EX0Jsb2NrVGFpbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ29weV9EX0Jsb2NrVGFpbChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBCWVRFIHNlY3Q7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIGZvcihzZWN0PU1lZGlhLlNlY3RvcjsgTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnM7IE1lZGlhLlNlY3RvcisrKQogICAgewogICAgICAgIGlmIChDb3B5X0RfUGh5T25lU2VjdChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICAgICAgICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CiAgICAgICAgICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwoKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CiAgICBNZWRpYS5TZWN0b3I9c2VjdDsKICAgIHJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBSZWFzc2lnbl9EX0Jsb2NrSGVhZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBSZWFzc2lnbl9EX0Jsb2NrSGVhZChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBEV09SRCAgbW9kZTsKICAgIFdPUkQgICBibG9jazsKICAgIEJZVEUgICBzZWN0OwogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICBtb2RlPVNlY3RDb3B5TW9kZTsKICAgIGJsb2NrPVJlYWRCbG9jazsKICAgIHNlY3Q9TWVkaWEuU2VjdG9yOwoKICAgIGlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBTZWN0Q29weU1vZGU9UkVRX0ZBSUw7CgogICAgZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8c2VjdDsgTWVkaWEuU2VjdG9yKyspCiAgICB7CiAgICAgICAgaWYgKENvcHlfRF9QaHlPbmVTZWN0KGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgICAgICBpZiAoUmVsZWFzZV9EX1dyaXRlQmxvY2soZmRvRXh0KSkKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CgogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIFNlY3RDb3B5TW9kZT1tb2RlOwogICAgICAgICAgICBXcml0ZUJsb2NrPVJlYWRCbG9jazsKICAgICAgICAgICAgUmVhZEJsb2NrPWJsb2NrOwogICAgICAgICAgICBNZWRpYS5TZWN0b3I9c2VjdDsKICAgICAgICAgICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChSZWxlYXNlX0RfUmVhZEJsb2NrKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBTZWN0Q29weU1vZGU9bW9kZTsKICAgIFJlYWRCbG9jaz1ibG9jazsKICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwogICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKICAgIHJldHVybihTVUNDRVNTKTsKfQoqLwovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgQmxvY2sgQXNzaWduL1JlbGVhc2UgU3Vicm91dGluZQovLy0tLS0tIEFzc2lnbl9EX1dyaXRlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IEFzc2lnbl9EX1dyaXRlQmxvY2sodm9pZCkKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CglSZWFkQmxvY2s9TWVkaWEuUGh5QmxvY2s7CgoJZm9yKFdyaXRlQmxvY2s9QXNzaWduU3RhcnRbTWVkaWEuWm9uZV07IFdyaXRlQmxvY2s8U3NmZGMuTWF4QmxvY2tzOyBXcml0ZUJsb2NrKyspCgl7CgkJaWYgKCFDaGtfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLFdyaXRlQmxvY2spKQoJCXsKCQkJU2V0X0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxXcml0ZUJsb2NrKTsKCQkJQXNzaWduU3RhcnRbTWVkaWEuWm9uZV09V3JpdGVCbG9jaysxOwoJCQlNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoJCQlTZWN0Q29weU1vZGU9UkVRX0VSQVNFOwoJCQkvL0VyclhEQ29kZSA9IE5PX0VSUk9SOwoJCQlyZXR1cm4oU1VDQ0VTUyk7CgkJfQoJfQoKCWZvcihXcml0ZUJsb2NrPTA7IFdyaXRlQmxvY2s8QXNzaWduU3RhcnRbTWVkaWEuWm9uZV07IFdyaXRlQmxvY2srKykKCXsKCQlpZiAoIUNoa19EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sV3JpdGVCbG9jaykpCgkJewoJCQlTZXRfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLFdyaXRlQmxvY2spOwoJCQlBc3NpZ25TdGFydFtNZWRpYS5ab25lXT1Xcml0ZUJsb2NrKzE7CgkJCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgkJCVNlY3RDb3B5TW9kZT1SRVFfRVJBU0U7CgkJCS8vRXJyWERDb2RlID0gTk9fRVJST1I7CgkJCXJldHVybihTVUNDRVNTKTsKCQl9Cgl9CgoJV3JpdGVCbG9jaz1OT19BU1NJR047CglFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CgkvLyBGb3IgeEQgdGVzdAoJLy9Tc2ZkYy5BdHRyaWJ1dGUgfD0gV1A7CgkvL0VyclhEQ29kZSA9IEVSUl9XcnRQcm90ZWN0OwoJcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBSZWxlYXNlX0RfUmVhZEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBSZWxlYXNlX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKewoJRFdPUkQgbW9kZTsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCW1vZGU9U2VjdENvcHlNb2RlOwoJU2VjdENvcHlNb2RlPUNPTVBMRVRFRDsKCglpZiAobW9kZT09Q09NUExFVEVEKQoJCXJldHVybihTVUNDRVNTKTsKCglMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1Xcml0ZUJsb2NrOwoJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoKCWlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQoJewoJCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCWlmIChtb2RlPT1SRVFfRVJBU0UpCgl7CgkJaWYgKEVyYXNlX0RfUGh5T25lQmxvY2sodXMpKQoJCXsKCQkJaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKSByZXR1cm4oRVJST1IpOwoJCQlpZiAoTWFya0ZhaWxfRF9QaHlPbmVCbG9jayh1cykpIHJldHVybihFUlJPUik7CgkJfQoJCWVsc2UKCQkJQ2xyX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7Cgl9CgllbHNlIGlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHVzKSkKCQlyZXR1cm4oRVJST1IpOwoKCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gUmVsZWFzZV9EX1dyaXRlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVsZWFzZV9EX1dyaXRlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCVNlY3RDb3B5TW9kZT1DT01QTEVURUQ7CglNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoKCWlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHVzKSkKCQlyZXR1cm4oRVJST1IpOwoKCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCXJldHVybihTVUNDRVNTKTsKfQoKLy9TbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBEYXRhIENvcHkgU3Vicm91dGluZQovLy0tLS0tIENvcHlfRF9QaHlPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvcHlfRF9QaHlPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cykKewoJaW50ICAgICAgICAgICBpOwoJRFdPUkQgIGVyciwgcmV0cnk7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgkvL3ByaW50aygiQ29weV9EX1BoeU9uZVNlY3QgLS0tIFNlY290ciA9ICV4XG4iLCBNZWRpYS5TZWN0b3IpOwoJaWYgKFJlYWRCbG9jayE9Tk9fQVNTSUdOKQoJewoJCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCQlmb3IocmV0cnk9MDsgcmV0cnk8MjsgcmV0cnkrKykKCQl7CgkJCWlmIChyZXRyeSE9MCkKCQkJewoJCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCQlpZiAoU3NmZGNfRF9SZWFkQ2lzU2VjdCh1cyxXb3JrQnVmLFdvcmtSZWR1bmQpKQoJCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgoJCQkJaWYgKENoZWNrX0RfQ0lTZGF0YShXb3JrQnVmLFdvcmtSZWR1bmQpKQoJCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJCX0KCgkJCWlmIChTc2ZkY19EX1JlYWRTZWN0KHVzLFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJCQlpZiAoQ2hlY2tfRF9EYXRhU3RhdHVzKFdvcmtSZWR1bmQpKQoJCQl7IGVycj1FUlJPUjsgYnJlYWs7IH0KCQkJaWYgKCFDaGVja19EX1JlYWRFcnJvcihXb3JrUmVkdW5kKSkKCQkJeyBlcnI9U1VDQ0VTUzsgYnJlYWs7IH0KCQkJaWYgKCFDaGVja19EX0NvcnJlY3QoV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBlcnI9U1VDQ0VTUzsgYnJlYWs7IH0KCgkJCWVycj1FUlJPUjsKCQkJU2VjdENvcHlNb2RlPVJFUV9GQUlMOwoJCX0KCX0KCWVsc2UKCXsKCQllcnI9U1VDQ0VTUzsKCQlmb3IoaT0wOyBpPFNFQ1RTSVpFOyBpKyspCgkJCVdvcmtCdWZbaV09RFVNTVlfREFUQTsKCQlDbHJfRF9SZWR1bmRhbnREYXRhKFdvcmtSZWR1bmQpOwoJfQoKCVNldF9EX0xvZ0Jsb2NrQWRkcihXb3JrUmVkdW5kKTsKCWlmIChlcnI9PUVSUk9SKQoJewoJCVNldF9EX1JpZ2h0RUNDKFdvcmtSZWR1bmQpOwoJCVNldF9EX0RhdGFTdGF1cyhXb3JrUmVkdW5kKTsKCX0KCglNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoKCWlmIChTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkodXMsIFdvcmtCdWYsIFdvcmtSZWR1bmQpKQoJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CglpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQoJeyBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7IHJldHVybihFUlJPUik7IH0KCglNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBTZWN0b3IgUmVhZC9Xcml0ZS9FcmFzZSBTdWJyb3V0aW5lCi8vLS0tLS0gUmVhZF9EX1BoeU9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgUmVhZF9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYpCnsKCWludCAgICAgICAgICAgaTsKCURXT1JEICByZXRyeTsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWlmIChNZWRpYS5QaHlCbG9jaz09Tk9fQVNTSUdOKQoJewoJCWZvcihpPTA7IGk8U0VDVFNJWkU7IGkrKykKCQkJKmJ1ZisrPURVTU1ZX0RBVEE7CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCWZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQoJewoJCWlmIChyZXRyeSE9MCkKCQl7CgkJCVNzZmRjX0RfUmVzZXQodXMpOwoKCQkJaWYgKFNzZmRjX0RfUmVhZENpc1NlY3QodXMsV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJCWlmIChDaGVja19EX0NJU2RhdGEoV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJfQoKCQkvL2lmIChTc2ZkY19EX1JlYWRTZWN0KGZkb0V4dCxidWYsUmVkdW5kYW50KSkKCQlpZiAoU3NmZGNfRF9SZWFkQmxvY2sodXMsY291bnQsYnVmLFJlZHVuZGFudCkpCgkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJaWYgKENoZWNrX0RfRGF0YVN0YXR1cyhSZWR1bmRhbnQpKQoJCXsgRXJyQ29kZSA9IEVSUl9EYXRhU3RhdHVzOyByZXR1cm4oRVJST1IpOyB9CgoJCWlmICghQ2hlY2tfRF9SZWFkRXJyb3IoUmVkdW5kYW50KSkKCQkJcmV0dXJuKFNVQ0NFU1MpOwoKCQlpZiAoIUNoZWNrX0RfQ29ycmVjdChidWYsUmVkdW5kYW50KSkKCQl7IEVyckNvZGUgPSBFUlJfQ29yUmVhZEVycjsgcmV0dXJuKEVSUk9SKTsgfQoJfQoKCUVyckNvZGUgPSBFUlJfRWNjUmVhZEVycjsKCXJldHVybihFUlJPUik7Cn0KLyoKLy8tLS0tLSBXcml0ZV9EX1BoeU9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBXcml0ZV9EX1BoeU9uZVNlY3QoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgV09SRCBjb3VudCwgQllURSAqYnVmKQp7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIC8vaWYgKFNzZmRjX0RfV3JpdGVTZWN0KGZkb0V4dCxidWYsUmVkdW5kYW50KSkKICAgIGlmIChTc2ZkY19EX1dyaXRlQmxvY2soZmRvRXh0LGNvdW50LGJ1ZixSZWR1bmRhbnQpKQogICAgeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CiAgICBpZiAoU3NmZGNfRF9DaGVja1N0YXR1cygpKQogICAgeyBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7IHJldHVybihFUlJPUik7IH0KCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KKi8KLy8tLS0tLSBFcmFzZV9EX1BoeU9uZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBFcmFzZV9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJaWYgKFNzZmRjX0RfRXJhc2VCbG9jayh1cykpCgl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCWlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCgl7IEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsgcmV0dXJuKEVSUk9SKTsgfQoKCXJldHVybihTVUNDRVNTKTsKfQoKLy9TbWFydE1lZGlhIFBoeXNpY2FsIEZvcm1hdCBDaGVjayBMb2NhbCBTdWJyb3V0aW5lCi8vLS0tLS0gU2V0X0RfUGh5Rm10VmFsdWUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU2V0X0RfUGh5Rm10VmFsdWUoc3RydWN0IHVzX2RhdGEgKnVzKQp7Ci8vICAgIFBQRE9fREVWSUNFX0VYVEVOU0lPTiAgIHBkb0V4dDsKLy8gICAgQllURSAgICAgIGlkY29kZVs0XTsKLy8gICAgRFdPUkQgICAgIFVzZXJEZWZEYXRhXzEsIFVzZXJEZWZEYXRhXzIsIERhdGEsIG1hc2s7Ci8vCi8vICAgIC8vaWYgKCFmZG9FeHQtPkNoaWxkRGV2aWNlT2JqZWN0KSAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAvL3Bkb0V4dCA9IGZkb0V4dC0+Q2hpbGREZXZpY2VPYmplY3QtPkRldmljZUV4dGVuc2lvbjsKLy8KLy8gICAgU3NmZGNfRF9SZWFkSUQoaWRjb2RlLCBSRUFEX0lEXzEpOwovLwogICAgLy9pZiAoU2V0X0RfU3NmZGNNb2RlbChpZGNvZGVbMV0pKQogICAgaWYgKFNldF9EX1NzZmRjTW9kZWwodXMtPlNNX0RldmljZUlEKSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKLy8gICAgLy9Vc2UgTXVsdGktZnVuY3Rpb24gcGluIHRvIGRpZmZlcmVudGlhdGUgU00gYW5kIHhELgovLyAgICBVc2VyRGVmRGF0YV8xID0gUmVhZFBDSVJlZyhmZG9FeHQtPkJ1c0lELCBmZG9FeHQtPkRldklELCBmZG9FeHQtPkZ1bmNJRCwgUENJX1JFR19VU0VSX0RFRikgJiAweDgwOwovLyAgICBpZiAoVXNlckRlZkRhdGFfMSkKLy8gICAgewovLyAgICAgICBpZiAoIFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4ODAgKSAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICAgaWYgKCBSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDQwICkgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vCi8vICAgICAgIGlmICggSXNYRENvbXBsaWFuY2UgJiYgKGZkb0V4dC0+RGlza1R5cGUgPT0gRElTS1RZUEVfWEQpICkKLy8gICAgICAgewovLyAgICAgICAgICBTc2ZkY19EX1JlYWRJRChpZGNvZGUsIFJFQURfSURfMyk7Ci8vICAgICAgICAgIGlmIChpZGNvZGVbMl0gIT0gMHhCNSkKLy8gICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgfQovLyAgICB9Ci8vCi8vICAgIC8vVXNlIEdQSU8gdG8gZGlmZmVyZW50aWF0ZSBTTSBhbmQgeEQuCi8vICAgIFVzZXJEZWZEYXRhXzIgPSBSZWFkUENJUmVnKGZkb0V4dC0+QnVzSUQsIGZkb0V4dC0+RGV2SUQsIGZkb0V4dC0+RnVuY0lELCBQQ0lfUkVHX1VTRVJfREVGKSA+PiA4OwovLyAgICBpZiAoIFVzZXJEZWZEYXRhXzIgKQovLyAgICB7Ci8vICAgICAgIERhdGEgPSBSZWFkUENJUmVnKGZkb0V4dC0+QnVzSUQsIGZkb0V4dC0+RGV2SUQsIDAsIDB4QUMpOwovLwovLyAgICAgICBtYXNrID0gMSA8PCAoVXNlckRlZkRhdGFfMi0xKTsKLy8gICAgICAgLy8gMSA6IHhEICwgMCA6IFNNCi8vICAgICAgIGlmICggRGF0YSAmIG1hc2spCi8vICAgICAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICAgZWxzZQovLyAgICAgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vCi8vICAgICAgIGlmICggSXNYRENvbXBsaWFuY2UgJiYgKGZkb0V4dC0+RGlza1R5cGUgPT0gRElTS1RZUEVfWEQpICkKLy8gICAgICAgewovLyAgICAgICAgICBTc2ZkY19EX1JlYWRJRChpZGNvZGUsIFJFQURfSURfMyk7Ci8vICAgICAgICAgIGlmIChpZGNvZGVbMl0gIT0gMHhCNSkKLy8gICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgfQovLyAgICB9Ci8vCi8vICAgIGlmICggIShVc2VyRGVmRGF0YV8xIHwgVXNlckRlZkRhdGFfMikgKQovLyAgICB7Ci8vICAgICAgLy8gVXNlIFVzZXJEZWZpbmUgUmVnaXN0ZXIgdG8gZGlmZmVyZW50aWF0ZSBTTSBhbmQgeEQuCi8vICAgICAgU3NmZGNfRF9SZWFkSUQoaWRjb2RlLCBSRUFEX0lEXzMpOwovLwovLyAgICAgIGlmIChpZGNvZGVbMl0gPT0gMHhCNSkKLy8gICAgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfWEQ7Ci8vICAgICAgZWxzZQovLyAgICAgIHsKLy8gICAgICAgICAgaWYgKCFJc1hEQ29tcGxpYW5jZSkKLy8gICAgICAgICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1NNOwovLyAgICAgICAgICBlbHNlCi8vICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgfQovLwovLyAgICAgIGlmIChmZG9FeHQtPlVzZXJEZWZfRGlza1R5cGUgPT0gMHgwNCkgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICBpZiAoZmRvRXh0LT5Vc2VyRGVmX0Rpc2tUeXBlID09IDB4MDgpICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vICAgIH0KLy8KLy8gICAgaWYgKCFmZG9FeHQtPlVzZXJEZWZfRGlzYWJsZVdQKQovLyAgICB7Ci8vICAgICAgIGlmIChmZG9FeHQtPkRpc2tUeXBlID09IERJU0tUWVBFX1NNKQovLyAgICAgICB7Ci8vICAgICAgICAgICBpZiAoQ2hlY2tfRF9Tc2ZkY1dQKCkpCi8vICAgICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGV8PVdQOwovLyAgICAgICB9Ci8vICAgIH0KCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gU2VhcmNoX0RfQ0lTKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU2VhcmNoX0RfQ0lTKHN0cnVjdCB1c19kYXRhICp1cykKewoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJTWVkaWEuWm9uZT0wOyBNZWRpYS5TZWN0b3I9MDsKCglmb3IgKE1lZGlhLlBoeUJsb2NrPTA7IE1lZGlhLlBoeUJsb2NrPChTc2ZkYy5NYXhCbG9ja3MtU3NmZGMuTWF4TG9nQmxvY2tzLTEpOyBNZWRpYS5QaHlCbG9jaysrKQoJewoJCWlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YSh1cywgUmVkdW5kYW50KSkKCQl7CgkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQlyZXR1cm4oRVJST1IpOwoJCX0KCgkJaWYgKCFDaGVja19EX0ZhaWxCbG9jayhSZWR1bmRhbnQpKQoJCQlicmVhazsKCX0KCglpZiAoTWVkaWEuUGh5QmxvY2s9PShTc2ZkYy5NYXhCbG9ja3MtU3NmZGMuTWF4TG9nQmxvY2tzLTEpKQoJewoJCVNzZmRjX0RfUmVzZXQodXMpOwoJCXJldHVybihFUlJPUik7Cgl9CgoJd2hpbGUgKE1lZGlhLlNlY3RvcjxDSVNfU0VBUkNIX1NFQ1QpCgl7CgkJaWYgKE1lZGlhLlNlY3RvcikKCQl7CgkJCWlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YSh1cywgUmVkdW5kYW50KSkKCQkJewoJCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCQlyZXR1cm4oRVJST1IpOwoJCQl9CgkJfQoJCWlmICghQ2hlY2tfRF9EYXRhU3RhdHVzKFJlZHVuZGFudCkpCgkJewoJCQlpZiAoU3NmZGNfRF9SZWFkU2VjdCh1cyxXb3JrQnVmLFJlZHVuZGFudCkpCgkJCXsKCQkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQkJcmV0dXJuKEVSUk9SKTsKCQkJfQoKCQkJaWYgKENoZWNrX0RfQ0lTZGF0YShXb3JrQnVmLFJlZHVuZGFudCkpCgkJCXsKCQkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQkJcmV0dXJuKEVSUk9SKTsKCQkJfQoKCQkJQ2lzQXJlYS5QaHlCbG9jaz1NZWRpYS5QaHlCbG9jazsKCQkJQ2lzQXJlYS5TZWN0b3I9TWVkaWEuU2VjdG9yOwoJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJcmV0dXJuKFNVQ0NFU1MpOwoJCX0KCgkJTWVkaWEuU2VjdG9yKys7Cgl9CgoJU3NmZGNfRF9SZXNldCh1cyk7CglyZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIE1ha2VfRF9Mb2dUYWJsZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1ha2VfRF9Mb2dUYWJsZShzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCVdPUkQgIHBoeWJsb2NrLGxvZ2Jsb2NrOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCgl7CgkJTG9nMlBoeVtNZWRpYS5ab25lXSA9IGttYWxsb2MoTUFYX0xPR0JMT0NLKnNpemVvZihXT1JEKSwgR0ZQX0tFUk5FTCk7CgkJLy9wcmludGsoIkV4QWxsb2NhdGVQb29sIFpvbmUgPSAleCwgQWRkciA9ICV4XG4iLCBNZWRpYS5ab25lLCBMb2cyUGh5W01lZGlhLlpvbmVdKTsKCQlpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCQkJcmV0dXJuKEVSUk9SKTsKCX0KCglNZWRpYS5TZWN0b3I9MDsKCgkvL2ZvcihNZWRpYS5ab25lPTA7IE1lZGlhLlpvbmU8TUFYX1pPTkVOVU07IE1lZGlhLlpvbmUrKykKCS8vZm9yKE1lZGlhLlpvbmU9MDsgTWVkaWEuWm9uZTxTc2ZkYy5NYXhab25lczsgTWVkaWEuWm9uZSsrKQoJewoJCS8vcHJpbnRrKCJNYWtlX0RfTG9nVGFibGUgLS0tIE1lZGlhWm9uZSA9IDB4JXhcbiIsIE1lZGlhLlpvbmUpOwoJCWZvcihNZWRpYS5Mb2dCbG9jaz0wOyBNZWRpYS5Mb2dCbG9jazxTc2ZkYy5NYXhMb2dCbG9ja3M7IE1lZGlhLkxvZ0Jsb2NrKyspCgkJCUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdPU5PX0FTU0lHTjsKCgkJZm9yKE1lZGlhLlBoeUJsb2NrPTA7IE1lZGlhLlBoeUJsb2NrPChNQVhfQkxPQ0tOVU0vOCk7IE1lZGlhLlBoeUJsb2NrKyspCgkJCUFzc2lnbltNZWRpYS5ab25lXVtNZWRpYS5QaHlCbG9ja109MHgwMDsKCgkJZm9yKE1lZGlhLlBoeUJsb2NrPTA7IE1lZGlhLlBoeUJsb2NrPFNzZmRjLk1heEJsb2NrczsgTWVkaWEuUGh5QmxvY2srKykKCQl7CgkJCWlmICgoIU1lZGlhLlpvbmUpICYmIChNZWRpYS5QaHlCbG9jazw9Q2lzQXJlYS5QaHlCbG9jaykpCgkJCXsKCQkJCVNldF9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YSh1cywgUmVkdW5kYW50KSkKCQkJeyBTc2ZkY19EX1Jlc2V0KHVzKTsgcmV0dXJuKEVSUk9SKTsgfQoKCQkJaWYgKCFDaGVja19EX0RhdGFCbGFuayhSZWR1bmRhbnQpKQoJCQkJY29udGludWU7CgoJCQlTZXRfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKCgkJCWlmIChDaGVja19EX0ZhaWxCbG9jayhSZWR1bmRhbnQpKQoJCQkJY29udGludWU7CgoJCQkvL2lmIChDaGVja19EX0RhdGFTdGF0dXMoUmVkdW5kYW50KSkKCQkJLy8gICAgY29udGludWU7CgoJCQlpZiAoTG9hZF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpKQoJCQkJY29udGludWU7CgoJCQlpZiAoTWVkaWEuTG9nQmxvY2s+PVNzZmRjLk1heExvZ0Jsb2NrcykKCQkJCWNvbnRpbnVlOwoKCQkJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdPT1OT19BU1NJR04pCgkJCXsKCQkJCUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdPU1lZGlhLlBoeUJsb2NrOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXBoeWJsb2NrICAgICA9IE1lZGlhLlBoeUJsb2NrOwoJCQlsb2dibG9jayAgICAgPSBNZWRpYS5Mb2dCbG9jazsKCQkJTWVkaWEuU2VjdG9yID0gKEJZVEUpKFNzZmRjLk1heFNlY3RvcnMtMSk7CgoJCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpCgkJCXsgU3NmZGNfRF9SZXNldCh1cyk7IHJldHVybihFUlJPUik7IH0KCgkJCWlmICghTG9hZF9EX0xvZ0Jsb2NrQWRkcihSZWR1bmRhbnQpKQoJCQl7CgkJCQlpZiAoTWVkaWEuTG9nQmxvY2s9PWxvZ2Jsb2NrKQoJCQkJewoJCQkJCU1lZGlhLlBoeUJsb2NrPUxvZzJQaHlbTWVkaWEuWm9uZV1bbG9nYmxvY2tdOwoKCQkJCQlpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEodXMsIFJlZHVuZGFudCkpCgkJCQkJeyBTc2ZkY19EX1Jlc2V0KHVzKTsgcmV0dXJuKEVSUk9SKTsgfQoKCQkJCQlNZWRpYS5QaHlCbG9jaz1waHlibG9jazsKCgkJCQkJaWYgKCFMb2FkX0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCkpCgkJCQkJewoJCQkJCQlpZiAoTWVkaWEuTG9nQmxvY2shPWxvZ2Jsb2NrKQoJCQkJCQl7CgkJCQkJCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXTsKCQkJCQkJCUxvZzJQaHlbTWVkaWEuWm9uZV1bbG9nYmxvY2tdPXBoeWJsb2NrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCU1lZGlhLlBoeUJsb2NrPUxvZzJQaHlbTWVkaWEuWm9uZV1bbG9nYmxvY2tdOwoJCQkJCQlMb2cyUGh5W01lZGlhLlpvbmVdW2xvZ2Jsb2NrXT1waHlibG9jazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCU1lZGlhLlNlY3Rvcj0wOwoKLy8gaGVyZSBOb3QgeWV0Ci8vI2lmZGVmIEwyUF9FUlJfRVJBU0UKLy8JCQlpZiAoIShTc2ZkYy5BdHRyaWJ1dGUgJk1XUCkpCi8vCQkJewovLwkJCQlTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vCQkJCWlmIChTc2ZkY19EX0VyYXNlQmxvY2soZmRvRXh0KSkKLy8JCQkJCXJldHVybihFUlJPUik7Ci8vCi8vCQkJCWlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCi8vCQkJCXsKLy8JCQkJCWlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkpCi8vCQkJCQkJcmV0dXJuKEVSUk9SKTsKLy8JCQkJfQovLwkJCQllbHNlCi8vCQkJCQlDbHJfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKLy8JCQl9Ci8vI2Vsc2UKLy8JCQlTc2ZkYy5BdHRyaWJ1dGV8PU1XUDsKLy8jZW5kaWYKCQkJTWVkaWEuUGh5QmxvY2s9cGh5YmxvY2s7CgoJCX0gLy8gRW5kIGZvciAoTWVkaWEuUGh5QmxvY2s8U3NmZGMuTWF4QmxvY2tzKQoKCQlBc3NpZ25TdGFydFtNZWRpYS5ab25lXT0wOwoKCX0gLy8gRW5kIGZvciAoTWVkaWEuWm9uZTxNQVhfWk9ORU5VTSkKCglTc2ZkY19EX1Jlc2V0KHVzKTsKCXJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKewoJQllURSBzZWN0OwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJc2VjdD1NZWRpYS5TZWN0b3I7CglTZXRfRF9GYWlsQmxvY2soV29ya1JlZHVuZCk7CgkvL1NzZmRjX0RfV3JpdGVSZWR0TW9kZSgpOwoKCWZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnM7IE1lZGlhLlNlY3RvcisrKQoJewoJCWlmIChTc2ZkY19EX1dyaXRlUmVkdERhdGEodXMsIFdvcmtSZWR1bmQpKQoJCXsKCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCU1lZGlhLlNlY3RvciAgID0gc2VjdDsKCQkJRXJyQ29kZSAgICAgICAgPSBFUlJfSHdFcnJvcjsKCQkJTWVkaWFDaGFuZ2UgPSBFUlJPUjsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9IC8vIE5PIFN0YXR1cyBDaGVjawoJfQoKCVNzZmRjX0RfUmVzZXQodXMpOwoJTWVkaWEuU2VjdG9yPXNlY3Q7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8KLy8vLy0tLS0tIFNNX0luaXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBTTV9Jbml0KHZvaWQpCi8vewovLyAgICBfSHdfRF9DbHJJbnRDYXJkQ2hnKCk7Ci8vICAgIF9Id19EX1NldEludE1hc2soKTsKLy8gICAgLy8gRm9yIERNQSBJbnRlcnJ1cHQKLy8gICAgX0h3X0RfQ2xyRE1BSW50Q2FyZENoZygpOwovLyAgICBfSHdfRF9TZXRETUFJbnRNYXNrKCk7Ci8vfQovLwovLy8vLS0tLS0gTWVkaWFfRF9FcmFzZUFsbFJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZUFsbFJlZHREYXRhKERXT1JEIEluZGV4LCBCT09MRUFOIENoZWNrQmxvY2spCi8vewovLyAgICBCWVRFICAgIGk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhUG93ZXIoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFXUCgpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBmb3IgKGk9MDsgaTxSRURUU0laRTsgaSsrKQovLyAgICAgICAgV29ya1JlZHVuZFtpXSA9IDB4RkY7Ci8vCi8vICAgIE1lZGlhLlpvbmUgPSAoQllURSlJbmRleDsKLy8gICAgZm9yIChNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazxTc2ZkYy5NYXhCbG9ja3M7IE1lZGlhLlBoeUJsb2NrKyspCi8vICAgIHsKLy8gICAgICAgIGlmICgoIU1lZGlhLlpvbmUpICYmIChNZWRpYS5QaHlCbG9jazw9Q2lzQXJlYS5QaHlCbG9jaykpCi8vICAgICAgICAgICAgY29udGludWU7Ci8vCi8vICAgICAgICBpZiAoU3NmZGNfRF9FcmFzZUJsb2NrKGZkb0V4dCkpCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOwovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICB9Ci8vCi8vICAgICAgICBmb3IoTWVkaWEuU2VjdG9yPTA7IE1lZGlhLlNlY3RvcjxTc2ZkYy5NYXhTZWN0b3JzOyBNZWRpYS5TZWN0b3IrKykKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBTc2ZkY19EX1dyaXRlUmVkdE1vZGUoKTsKLy8KLy8gICAgICAgICAgICBpZiAoU3NmZGNfRF9Xcml0ZVJlZHREYXRhKFdvcmtSZWR1bmQpKQovLyAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLyAgICAgICAgICAgICAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Id0Vycm9yOwovLyAgICAgICAgICAgICAgICBNZWRpYUNoYW5nZSAgICA9IEVSUk9SOwovLyAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgICAgIH0gLy8gTk8gU3RhdHVzIENoZWNrCi8vICAgICAgICB9Ci8vCi8vICAgICAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vICAgIH0KLy8KLy8gICAgU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vLS0tLS0gTWVkaWFfRF9HZXRNZWRpYUluZm8oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9EV09SRCBNZWRpYV9EX0dldE1lZGlhSW5mbyhQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBQSU9DVExfTUVESUFfSU5GT19JTiBwUGFyYW1JbiwgUElPQ1RMX01FRElBX0lORk9fT1VUIHBQYXJhbU91dCkKLy97Ci8vICAgIHBQYXJhbU91dC0+RXJyQ29kZSA9IFNUQVRVU19DTURfRkFJTDsKLy8KLy8gICAgSW5pdF9EX1NtYXJ0TWVkaWEoKTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuIChFcnJDb2RlPT1FUlJfTm9TbWFydE1lZGlhKSA/IFNUQVRVU19DTURfTk9fTUVESUEgOiBTVEFUVVNfQ01EX0ZBSUw7Ci8vCi8vICAgIGlmIChTZXRfRF9QaHlGbXRWYWx1ZShmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuIFNUQVRVU19DTURfRkFJTDsKLy8KLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIGlmIChTZWFyY2hfRF9DSVMoZmRvRXh0KSkKLy8gICAgICAgIHJldHVybiBTVEFUVVNfQ01EX0ZBSUw7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhV1AoKSkKLy8gICAgICAgIHJldHVybiBTVEFUVVNfQ01EX01FRElBX1dQOwovLwovLyAgICBwUGFyYW1PdXQtPlBhZ2VTaXplICA9IFNzZmRjLk1heFNlY3RvcnM7Ci8vICAgIHBQYXJhbU91dC0+QmxvY2tTaXplID0gU3NmZGMuTWF4QmxvY2tzOwovLyAgICBwUGFyYW1PdXQtPlpvbmVTaXplICA9IFNzZmRjLk1heFpvbmVzOwovLwovLyAgICByZXR1cm4gU1RBVFVTX0NNRF9TVUNDRVNTOwovL30qLwo=