ZGlmZiAtLWdpdCBhL0FMUEhBLXBsMTMuZGlmZiBiL0FMUEhBLXBsMTMuZGlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2NzVhNS4uMDAwMDAwMAotLS0gYS9BTFBIQS1wbDEzLmRpZmYKKysrIC9kZXYvbnVsbApAQCAtMSw3ODY0ICswLDAgQEAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L1JFQURNRSBsaW51eC9SRUFETUUKLS0tLSBwbDEyL2xpbnV4L1JFQURNRQlTdW4gQXVnIDE1IDE0OjI2OjI0IDE5OTMKLSsrKyBsaW51eC9SRUFETUUJTW9uIEF1ZyAxNiAyMjoxODoyNCAxOTkzCi1AQCAtMSw3ICsxLDEzIEBACi0gCi0tCUxpbnV4IGtlcm5lbCByZWxlYXNlIDAuOTkgcGF0Y2hsZXZlbCAxMgotKwlMaW51eCBrZXJuZWwgcmVsZWFzZSAwLjk5IHBhdGNobGV2ZWwgMTMKLSAKLS1UaGVzZSBhcmUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGxpbnV4IHZlcnNpb24gMC45OS4xMi4gIFJlYWQgdGhlbQotK1sgSnVzdCB0byBzaG93IGV2ZXJ5Ym9keSB0aGF0IEkgaGF2ZSBubyBwZXJzb25hbCBpbnRlZ3JpdHkgYXQgYWxsLCB0aGlzCi0rcmVsZWFzZSBpcyBkZWRpY2F0ZWQgdG8gTWFydGluIE11ZWxsZXIgYW5kIFNlYmFzdGlhbiBIZXR6ZSBqdXN0IGJlY2F1c2UKLSt0aGV5IHdyb3RlIHRoZSBHZXJtYW4gTGludXggQW53ZW5kZXJoYW5kYnVjaC4gIFRoZSBmYWN0IHRoYXQgdGhleSBzZW50Ci0rbWUgc29tZSBvZiB0aGUgbW9uZXkgdGhleSBtYWRlIG9uIHNlbGxpbmcgaXQgaGFzIG5vdGhpbmcgYXQgYWxsIHRvIGRvCi0rd2l0aCB0aGUgZGVkaWNhdGlvbi4gIE9oLCBuby4gIFRoYXQgd291bGQgYmUgY3Jhc3MuICBdCi0rCi0rVGhlc2UgYXJlIHRoZSByZWxlYXNlIG5vdGVzIGZvciBsaW51eCB2ZXJzaW9uIDAuOTkuMTMuICBSZWFkIHRoZW0KLSBjYXJlZnVsbHksIGFzIHRoZXkgdGVsbCB5b3Ugd2hhdCdzIG5ldywgZXhwbGFpbiBob3cgdG8gaW5zdGFsbCB0aGUKLSBrZXJuZWwsIGFuZCB3aGF0IHRvIGRvIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiAKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2NvbmZpZy5pbiBsaW51eC9jb25maWcuaW4KLS0tLSBwbDEyL2xpbnV4L2NvbmZpZy5pbglTdW4gQXVnIDE1IDExOjI0OjU2IDE5OTMKLSsrKyBsaW51eC9jb25maWcuaW4JU2F0IFNlcCAgNCAxNToxNzo0MiAxOTkzCi1AQCAtMTMsNiArMTMsMTAgQEAKLSBib29sICdTeXN0ZW0gViBJUEMnIENPTkZJR19TWVNWSVBDIHkKLSBib29sICdVc2UgLW00ODYgZmxhZyBmb3IgNDg2LXNwZWNpZmljIG9wdGltaXphdGlvbnMnIENPTkZJR19NNDg2IHkKLSAqCi0rKiBQcm9ncmFtIGJpbmFyeSBmb3JtYXRzCi0rKgotK2Jvb2wgJ0VsZiBleGVjdXRhYmxlcycgQ09ORklHX0JJTkZNVF9FTEYgeQotKyoKLSAqIFNDU0kgc3VwcG9ydAotICoKLSBib29sICdTQ1NJIHN1cHBvcnQ/JyBDT05GSUdfU0NTSSBuCi1AQCAtNDksMTQgKzUzLDE0IEBACi0gYm9vbCAnU0xJUCAoc2VyaWFsIGxpbmUpIHN1cHBvcnQnIENPTkZJR19TTElQIG4KLSBib29sICdQTElQIChwYXJhbGxlbCBwb3J0KSBzdXBwb3J0JyBDT05GSUdfUExJUCBuCi0gYm9vbCAnTkUyMDAwL05FMTAwMCBzdXBwb3J0JyBDT05GSUdfTkUyMDAwIHkKLS1ib29sICdXRDgwKjMgc3VwcG9ydCcgQ09ORklHX1dEODB4MyB5Ci0rYm9vbCAnV0Q4MCozIHN1cHBvcnQnIENPTkZJR19XRDgweDMgbgotICNib29sICczYzUwMSBzdXBwb3J0JyBDT05GSUdfRUwxIG4KLSBib29sICczYzUwMyBzdXBwb3J0JyBDT05GSUdfRUwyIHkKLSAjYm9vbCAnM2M1MDkgc3VwcG9ydCcgQ09ORklHX0VMMyBuCi0tYm9vbCAnSFAgUENMQU4gc3VwcG9ydCcgQ09ORklHX0hQTEFOIHkKLS1ib29sICdBVDE1MDAgYW5kIE5FMjEwMCBzdXBwb3J0JyBDT05GSUdfQVQxNTAwIHkKLStib29sICdIUCBQQ0xBTiBzdXBwb3J0JyBDT05GSUdfSFBMQU4gbgotK2Jvb2wgJ0FUMTUwMCBhbmQgTkUyMTAwIHN1cHBvcnQnIENPTkZJR19BVDE1MDAgbgotICNib29sICdERVBDQSBzdXBwb3J0JyBDT05GSUdfREVQQ0EgbgotLWJvb2wgJ0QtTGluayBERTYwMCBwb2NrZXQgYWRhcHRvciBzdXBwb3J0JyBDT05GSUdfREU2MDAgeQotK2Jvb2wgJ0QtTGluayBERTYwMCBwb2NrZXQgYWRhcHRvciBzdXBwb3J0JyBDT05GSUdfREU2MDAgbgotICNib29sICdBVC1MQU4tVEVDIHBvY2tldCBhZGFwdG9yIHN1cHBvcnQnIENPTkZJR19BVFAgbgotICNib29sICdFdGhlckV4cHJlc3Mgc3VwcG9ydCcgQ09ORklHX0VFWFBSRVNTIG4KLSBmaQotQEAgLTc5LDcgKzgzLDcgQEAKLSAqCi0gYm9vbCAnS2V5Ym9hcmQgbWV0YS1rZXkgc2VuZHMgRVNDLXByZWZpeCcgQ09ORklHX0tCRF9NRVRBIHkKLSBib29sICdLZXlib2FyZCBOdW0gTG9jayBvbiBieSBkZWZhdWx0JyBDT05GSUdfS0JEX05VTUwgeQotLWJvb2wgJ0xvZ2l0ZWNoIGJ1c21vdXNlIHN1cHBvcnQnIENPTkZJR19CVVNNT1VTRSBuCi0rYm9vbCAnTG9naXRlY2ggYnVzbW91c2Ugc3VwcG9ydCcgQ09ORklHX0JVU01PVVNFIHkKLSBib29sICdQUy8yIG1vdXNlIChha2EgImF1eGlsaWFyeSBkZXZpY2UiKSBzdXBwb3J0JyBDT05GSUdfUFNNT1VTRSBuCi0gYm9vbCAnTWljcm9zb2Z0IGJ1c21vdXNlIHN1cHBvcnQnIENPTkZJR19NU19CVVNNT1VTRSBuCi0gYm9vbCAnQVRJWEwgYnVzbW91c2Ugc3VwcG9ydCcgQ09ORklHX0FUSVhMX0JVU01PVVNFIG4KLUBAIC05NSw1ICs5OSw1IEBACi0gYm9vbCAnRGVidWcga21hbGxvYy9rZnJlZScgQ09ORklHX0RFQlVHX01BTExPQyBuCi0gYm9vbCAnS2VybmVsIHByb2ZpbGluZyBzdXBwb3J0JyBDT05GSUdfUFJPRklMRSBuCi0gaWYgWyAiJENPTkZJR19TQ1NJIiA9ICJ5IiBdCi0tYm9vbCAnVmVyYm9zZSBzY3NpIGVycm9yIHJlcG9ydGluZyAoa2VybmVsIHNpemUgKz0xMkspJyBDT05GSUdfU0NTSV9DT05TVEFOVFMgbgotK2Jvb2wgJ1ZlcmJvc2Ugc2NzaSBlcnJvciByZXBvcnRpbmcgKGtlcm5lbCBzaXplICs9MTJLKScgQ09ORklHX1NDU0lfQ09OU1RBTlRTIHkKLSBmaQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvZnMvTWFrZWZpbGUgbGludXgvZnMvTWFrZWZpbGUKLS0tLSBwbDEyL2xpbnV4L2ZzL01ha2VmaWxlCVN1biBNYXIgIDcgMTY6MjE6MTAgMTk5MwotKysrIGxpbnV4L2ZzL01ha2VmaWxlCUZyaSBBdWcgMjAgMDg6NTk6MzAgMTk5MwotQEAgLTM0LDYgKzM0LDkgQEAKLSBGU19TVUJESVJTIDo9ICQoRlNfU1VCRElSUykgeGlhZnMKLSBlbmRpZgotIAotK2lmZGVmIENPTkZJR19CSU5GTVRfRUxGCi0rQklORk1UUyA6PSAkKEJJTkZNVFMpIGJpbmZtdF9lbGYubwotK2VuZGlmCi0gCi0gLmMuczoKLSAJJChDQykgJChDRkxBR1MpIC1TICQ8Ci1AQCAtNDQsNyArNDcsNyBAQAotIAotIE9CSlM9CW9wZW4ubyByZWFkX3dyaXRlLm8gaW5vZGUubyBkZXZpY2VzLm8gZmlsZV90YWJsZS5vIGJ1ZmZlci5vIHN1cGVyLm8gXAotIAlibG9ja19kZXYubyBzdGF0Lm8gZXhlYy5vIHBpcGUubyBuYW1laS5vIGZjbnRsLm8gaW9jdGwubyBcCi0tCXNlbGVjdC5vIGZpZm8ubyBsb2Nrcy5vIGZpbGVzeXN0ZW1zLm8KLSsJc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZmlsZXN5c3RlbXMubyAkKEJJTkZNVFMpCi0gCi0gYWxsOiBmcy5vIGZpbGVzeXN0ZW1zLmEKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL2JpbmZtdF9lbGYuYyBsaW51eC9mcy9iaW5mbXRfZWxmLmMKLS0tLSBwbDEyL2xpbnV4L2ZzL2JpbmZtdF9lbGYuYwotKysrIGxpbnV4L2ZzL2JpbmZtdF9lbGYuYwlTYXQgU2VwICA0IDAzOjM2OjMwIDE5OTMKLUBAIC0wLDAgKzEsMzY4IEBACi0rI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KLSsjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KLSsjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSsjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KLSsjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSsjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotKwotK2FzbWxpbmthZ2UgaW50IHN5c19leGl0KGludCBleGl0X2NvZGUpOwotK2FzbWxpbmthZ2UgaW50IHN5c19jbG9zZSh1bnNpZ25lZCBmZCk7Ci0rYXNtbGlua2FnZSBpbnQgc3lzX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIGludCk7Ci0rCi0rLyoKLSsgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgRUxGIHN0eWxlIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQKLSsgKiBsaWJyYXJpZXMuICBUaGVyZSBpcyBubyBiaW5hcnkgZGVwZW5kZW50IGNvZGUgYW55d2hlcmUgZWxzZS4KLSsgKi8KLSsKLSsjaW5jbHVkZSA8bGludXgvZWxmLmg+Ci0rCi0raW50IGxvYWRfZWxmX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotK3sKLSsJc3RydWN0IGVsZmhkciBlbGZfZXg7Ci0rCXN0cnVjdCBmaWxlICogZmlsZTsKLSsgIAlzdHJ1Y3QgZXhlYyBleDsKLSsJc3RydWN0IGlub2RlICppbnRlcnByZXRlcl9pbm9kZTsKLSsJaW50IGk7Ci0rCWludCBvbGRfZnM7Ci0rCWludCBlcnJvcjsKLSsJc3RydWN0IGVsZl9waGRyICogZWxmX3BwbnQsICplbGZfcGhkYXRhOwotKwlpbnQgZWxmX2V4ZWNfZmlsZW5vOwotKwl1bnNpZ25lZCBpbnQgZWxmX2JzcywgaywgZWxmX2JyazsKLSsJaW50IHJldHZhbDsKLSsJY2hhciAqIGVsZl9pbnRlcnByZXRlcjsKLSsJdW5zaWduZWQgaW50IGVsZl9lbnRyeTsKLSsJaW50IHN0YXR1czsKLSsJdW5zaWduZWQgaW50IHN0YXJ0X2NvZGUsIGVuZF9jb2RlLCBlbmRfZGF0YTsKLSsJdW5zaWduZWQgaW50IGVsZl9zdGFjazsKLSsJY2hhciBwYXNzZWRfZmlsZW5vWzZdOwotKwkKLSsJc3RhdHVzID0gMDsKLSsJZWxmX2V4ID0gKigoc3RydWN0IGVsZmhkciAqKSBicHJtLT5idWYpOwkgIC8qIGV4ZWMtaGVhZGVyICovCi0rCQotKwlpZiAoZWxmX2V4LmVfaWRlbnRbMF0gIT0gMHg3ZiB8fAotKwkgICAgc3RybmNtcCgmZWxmX2V4LmVfaWRlbnRbMV0sICJFTEYiLDMpICE9IDApCi0rCQlyZXR1cm4gIC1FTk9FWEVDOwotKwkKLSsJCi0rCS8qIEZpcnN0IG9mIGFsbCwgc29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzICovCi0rCWlmKGVsZl9leC5lX3R5cGUgIT0gRVRfRVhFQyB8fCAKLSsJICAgKGVsZl9leC5lX21hY2hpbmUgIT0gRU1fMzg2ICYmIGVsZl9leC5lX21hY2hpbmUgIT0gRU1fNDg2KSB8fAotKwkgICAoIWJwcm0tPmlub2RlLT5pX29wIHx8ICFicHJtLT5pbm9kZS0+aV9vcC0+ZGVmYXVsdF9maWxlX29wcyB8fAotKwkgICAgIWJwcm0tPmlub2RlLT5pX29wLT5kZWZhdWx0X2ZpbGVfb3BzLT5tbWFwKSl7Ci0rCQlyZXR1cm4gLUVOT0VYRUM7Ci0rCX07Ci0rCQotKwkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotKwkKLSsJZWxmX3BoZGF0YSA9IChzdHJ1Y3QgZWxmX3BoZHIgKikga21hbGxvYyhlbGZfZXguZV9waGVudHNpemUgKiAKLSsJCQkJCQkgZWxmX2V4LmVfcGhudW0sIEdGUF9LRVJORUwpOwotKwkKLSsJb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0rCXNldF9mcyhnZXRfZHMoKSk7Ci0rCXJldHZhbCA9IHJlYWRfZXhlYyhicHJtLT5pbm9kZSwgZWxmX2V4LmVfcGhvZmYsIChjaGFyICopIGVsZl9waGRhdGEsCi0rCQkJICAgZWxmX2V4LmVfcGhlbnRzaXplICogZWxmX2V4LmVfcGhudW0pOwotKwlzZXRfZnMob2xkX2ZzKTsKLSsJaWYgKHJldHZhbCA8IDApIHsKLSsJICAgICAgICBrZnJlZSAoZWxmX3BoZGF0YSk7Ci0rCQlyZXR1cm4gcmV0dmFsOwotKwl9Ci0rCQotKwllbGZfcHBudCA9IGVsZl9waGRhdGE7Ci0rCQotKwllbGZfYnNzID0gMDsKLSsJZWxmX2JyayA9IDA7Ci0rCQotKwllbGZfZXhlY19maWxlbm8gPSBvcGVuX2lub2RlKGJwcm0tPmlub2RlLCBPX1JET05MWSk7Ci0rCi0rCWlmIChlbGZfZXhlY19maWxlbm8gPCAwKSB7Ci0rCSAgICAgICAga2ZyZWUgKGVsZl9waGRhdGEpOwotKwkJcmV0dXJuIGVsZl9leGVjX2ZpbGVubzsKLSsJfQotKwkKLSsJZmlsZSA9IGN1cnJlbnQtPmZpbHBbZWxmX2V4ZWNfZmlsZW5vXTsKLSsJCi0rCWVsZl9zdGFjayA9IDB4ZmZmZmZmZmY7Ci0rCWVsZl9pbnRlcnByZXRlciA9IE5VTEw7Ci0rCXN0YXJ0X2NvZGUgPSAwOwotKwllbmRfY29kZSA9IDA7Ci0rCWVuZF9kYXRhID0gMDsKLSsJCi0rCW9sZF9mcyA9IGdldF9mcygpOwotKwlzZXRfZnMoZ2V0X2RzKCkpOwotKwkKLSsJZm9yKGk9MDtpIDwgZWxmX2V4LmVfcGhudW07IGkrKyl7Ci0rCQlpZihlbGZfcHBudC0+cF90eXBlID09IFBUX0lOVEVSUCkgewotKwkJCS8qIFRoaXMgaXMgdGhlIHByb2dyYW0gaW50ZXJwcmV0ZXIgdXNlZCBmb3Igc2hhcmVkIGxpYnJhcmllcyAtIAotKwkJCSAgIGZvciBub3cgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBhLm91dCBmb3JtYXQgYmluYXJ5ICovCi0rCQkJCi0rCQkJZWxmX2ludGVycHJldGVyID0gKGNoYXIgKikga21hbGxvYyhlbGZfcHBudC0+cF9maWxlc3osIAotKwkJCQkJCQkgICBHRlBfS0VSTkVMKTsKLSsJCQkKLSsJCQlyZXR2YWwgPSByZWFkX2V4ZWMoYnBybS0+aW5vZGUsZWxmX3BwbnQtPnBfb2Zmc2V0LGVsZl9pbnRlcnByZXRlciwKLSsJCQkJCSAgIGVsZl9wcG50LT5wX2ZpbGVzeik7Ci0rCQkJcHJpbnRrKCJVc2luZyBFTEYgaW50ZXJwcmV0ZXIgJXNcbiIsIGVsZl9pbnRlcnByZXRlcik7Ci0rCQkJaWYocmV0dmFsID49IDApCi0rCQkJCXJldHZhbCA9IG5hbWVpKGVsZl9pbnRlcnByZXRlciwgJmludGVycHJldGVyX2lub2RlKTsKLSsJCQlpZihyZXR2YWwgPj0gMCkKLSsJCQkJcmV0dmFsID0gcmVhZF9leGVjKGludGVycHJldGVyX2lub2RlLDAsYnBybS0+YnVmLDEyOCk7Ci0rCQkJCi0rCQkJaWYocmV0dmFsID49IDApewotKwkJCQlleCA9ICooKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1Zik7CQkvKiBleGVjLWhlYWRlciAqLwotKwkJCQkKLSsjaWYgMAotKwkJCQlwcmludGsoIkludGVycHJldGVyOiAleCAleCAleFxuIixOX01BR0lDKGV4KSwgZXguYV90ZXh0LGV4LmFfZGF0YSk7Ci0rI2VuZGlmCi0rCQkJfTsKLSsJCX07Ci0rCQllbGZfcHBudCsrOwotKwl9OwotKwkKLSsJc2V0X2ZzKG9sZF9mcyk7Ci0rCQotKwkvKiBTb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgZm9yIHRoZSBpbnRlcnByZXRlciAqLwotKwlpZihlbGZfaW50ZXJwcmV0ZXIpewotKwkJaWYocmV0dmFsIDwgMCkgewotKwkJCWtmcmVlKGVsZl9pbnRlcnByZXRlcik7Ci0rCQkJa2ZyZWUoZWxmX3BoZGF0YSk7Ci0rCQkJcmV0dXJuIC1FTElCQUNDOwotKwkJfTsKLSsJCWlmKChOX01BR0lDKGV4KSAhPSBPTUFHSUMpICYmIChOX01BR0lDKGV4KSAhPSBaTUFHSUMpKSB7Ci0rCQkJa2ZyZWUoZWxmX2ludGVycHJldGVyKTsKLSsJCQlrZnJlZShlbGZfcGhkYXRhKTsKLSsJCQlyZXR1cm4gLUVMSUJCQUQ7Ci0rCQl9OwotKwl9Ci0rCQotKwkvKiBPSywgd2UgYXJlIGRvbmUgd2l0aCB0aGF0LCBub3cgc2V0IHVwIHRoZSBhcmcgc3R1ZmYsCi0rCSAgIGFuZCB0aGVuIHN0YXJ0IHRoaXMgc3Vja2VyIHVwICovCi0rCQotKwlpZiAoIWJwcm0tPnNoX2JhbmcpIHsKLSsJCWNoYXIgKiBwYXNzZWRfcDsKLSsJCQotKwkJc3ByaW50ZihwYXNzZWRfZmlsZW5vLCAiJWQiLCBlbGZfZXhlY19maWxlbm8pOwotKwkJcGFzc2VkX3AgPSBwYXNzZWRfZmlsZW5vOwotKwkJCi0rCQlpZihlbGZfaW50ZXJwcmV0ZXIpIHsKLSsJCQlicHJtLT5wID0gY29weV9zdHJpbmdzKDEsJnBhc3NlZF9wLGJwcm0tPnBhZ2UsYnBybS0+cCwyKTsKLSsJCQlicHJtLT5hcmdjKys7Ci0rCQl9OwotKwkJaWYgKCFicHJtLT5wKSB7Ci0rCQkgICAgICAgIGlmKGVsZl9pbnRlcnByZXRlcikgewotKwkJCSAgICAgIGtmcmVlKGVsZl9pbnRlcnByZXRlcik7Ci0rCQkJfQotKwkJICAgICAgICBrZnJlZSAoZWxmX3BoZGF0YSk7Ci0rCQkJcmV0dXJuIC1FMkJJRzsKLSsJCX0KLSsJfQotKwkKLSsJLyogT0ssIFRoaXMgaXMgdGhlIHBvaW50IG9mIG5vIHJldHVybiAqLwotKwlmbHVzaF9vbGRfZXhlYyhicHJtKTsKLSsKLSsJY3VycmVudC0+ZW5kX2RhdGEgPSAwOwotKwljdXJyZW50LT5lbmRfY29kZSA9IDA7Ci0rCWN1cnJlbnQtPnN0YXJ0X21tYXAgPSBFTEZfU1RBUlRfTU1BUDsKLSsJY3VycmVudC0+bW1hcCA9IE5VTEw7Ci0rCWVsZl9lbnRyeSA9ICh1bnNpZ25lZCBpbnQpIGVsZl9leC5lX2VudHJ5OwotKwkKLSsJLyogRG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBsb2FkIHRoZSBpbnRlcnByZXRlciwgaWYgbmVlZCBiZS4gIFdlIHdpbGwKLSsJICAgY2hhbmdlIHNvbWUgb2YgdGhlc2UgbGF0ZXIgKi8KLSsJY3VycmVudC0+cnNzID0gMDsKLSsJYnBybS0+cCArPSBjaGFuZ2VfbGR0KDAsIGJwcm0tPnBhZ2UpOwotKwljdXJyZW50LT5zdGFydF9zdGFjayA9IGJwcm0tPnA7Ci0rCQotKwkvKiBOb3cgd2UgZG8gYSBsaXR0bGUgZ3J1bmd5IHdvcmsgYnkgbW1hcGluZyB0aGUgRUxGIGltYWdlIGludG8KLSsJICAgdGhlIGNvcnJlY3QgbG9jYXRpb24gaW4gbWVtb3J5LiAgQXQgdGhpcyBwb2ludCwgd2UgYXNzdW1lIHRoYXQKLSsJICAgdGhlIGltYWdlIHNob3VsZCBiZSBsb2FkZWQgYXQgZml4ZWQgYWRkcmVzcywgbm90IGF0IGEgdmFyaWFibGUKLSsJICAgYWRkcmVzcy4gKi8KLSsJCi0rCW9sZF9mcyA9IGdldF9mcygpOwotKwlzZXRfZnMoZ2V0X2RzKCkpOwotKwkKLSsJZWxmX3BwbnQgPSBlbGZfcGhkYXRhOwotKwlmb3IoaT0wO2kgPCBlbGZfZXguZV9waG51bTsgaSsrKXsKLSsJCQotKwkJaWYoZWxmX3BwbnQtPnBfdHlwZSA9PSBQVF9JTlRFUlApIHsKLSsJCQkvKiBTZXQgdGhlc2UgdXAgc28gdGhhdCB3ZSBhcmUgYWJsZSB0byBsb2FkIHRoZSBpbnRlcnByZXRlciAqLwotKwkJCWN1cnJlbnQtPmJyayA9IGV4LmFfYnNzICsKLSsJCQkJKGN1cnJlbnQtPmVuZF9kYXRhID0gZXguYV9kYXRhICsKLSsJCQkJIChjdXJyZW50LT5lbmRfY29kZSA9IGV4LmFfdGV4dCkpOwotKwkJCWVsZl9lbnRyeSA9IGV4LmFfZW50cnk7Ci0rCQkJCi0rCQkJLyogTm93IGxvYWQgdGhlIGludGVycHJldGVyIGludG8gdXNlciBhZGRyZXNzIHNwYWNlICovCi0rCQkJc2V0X2ZzKG9sZF9mcyk7Ci0rCQkJCi0rCQkJaWYgKE5fTUFHSUMoZXgpID09IE9NQUdJQykgewotKwkJCQlyZXR2YWwgPSByZWFkX2V4ZWMoaW50ZXJwcmV0ZXJfaW5vZGUsIDMyLCAoY2hhciAqKSAwLCAKLSsJCQkJCQkgICBleC5hX3RleHQrZXguYV9kYXRhKTsKLSsJCQkJaXB1dChpbnRlcnByZXRlcl9pbm9kZSk7Ci0rCQkJfSBlbHNlIGlmIChOX01BR0lDKGV4KSA9PSBaTUFHSUMpIHsKLSsJCQkJcmV0dmFsID0gcmVhZF9leGVjKGludGVycHJldGVyX2lub2RlLCAxMDI0LCAoY2hhciAqKSAwLCAKLSsJCQkJCQkgICBleC5hX3RleHQrZXguYV9kYXRhKTsKLSsJCQkJaXB1dChpbnRlcnByZXRlcl9pbm9kZSk7Ci0rCQkJfSBlbHNlCi0rCQkJCXJldHZhbCA9IC0xOwotKwkJCQotKwkJCW9sZF9mcyA9IGdldF9mcygpOwotKwkJCXNldF9mcyhnZXRfZHMoKSk7Ci0rCQkJCi0rCQkJaWYocmV0dmFsID49IDApCi0rCQkJCXplcm9tYXBfcGFnZV9yYW5nZSgoZXguYV90ZXh0ICsgZXguYV9kYXRhICsgMHhmZmYpICYgCi0rCQkJCQkJICAgMHhmZmZmZjAwMCwgZXguYV9ic3MsIFBBR0VfQ09QWSk7Ci0rCQkJa2ZyZWUoZWxmX2ludGVycHJldGVyKTsKLSsJCQkKLSsJCQlpZihyZXR2YWwgPCAwKSB7IAotKwkJCQlrZnJlZShlbGZfcGhkYXRhKTsKLSsJCQkJc2VuZF9zaWcoU0lHU0VHViwgY3VycmVudCwgMCk7Ci0rCQkJCXJldHVybiAwOwotKwkJCX07Ci0rCQl9OwotKwkJCi0rCQkKLSsJCWlmKGVsZl9wcG50LT5wX3R5cGUgPT0gUFRfTE9BRCkgewotKwkJCWVycm9yID0gZG9fbW1hcChmaWxlLAotKwkJCQkJZWxmX3BwbnQtPnBfdmFkZHIgJiAweGZmZmZmMDAwLAotKwkJCQkJZWxmX3BwbnQtPnBfZmlsZXN6ICsgKGVsZl9wcG50LT5wX3ZhZGRyICYgMHhmZmYpLAotKwkJCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKLSsJCQkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLAotKwkJCQkJZWxmX3BwbnQtPnBfb2Zmc2V0ICYgMHhmZmZmZjAwMCk7Ci0rCQkJCi0rI2lmZGVmIExPV19FTEZfU1RBQ0sKLSsJCQlpZihlbGZfcHBudC0+cF92YWRkciAmIDB4ZmZmZmYwMDAgPCBlbGZfc3RhY2spIAotKwkJCQllbGZfc3RhY2sgPSBlbGZfcHBudC0+cF92YWRkciAmIDB4ZmZmZmYwMDA7Ci0rI2VuZGlmCi0rCQkJCi0rCQkJayA9IGVsZl9wcG50LT5wX3ZhZGRyOwotKwkJCWlmKGsgPiBzdGFydF9jb2RlKSBzdGFydF9jb2RlID0gazsKLSsJCQlrID0gZWxmX3BwbnQtPnBfdmFkZHIgKyBlbGZfcHBudC0+cF9maWxlc3o7Ci0rCQkJaWYoayA+IGVsZl9ic3MpIGVsZl9ic3MgPSBrOwotKwkJCWlmKChlbGZfcHBudC0+cF9mbGFncyB8IFBST1RfV1JJVEUpICYmIGVuZF9jb2RlIDwgIGspCi0rCQkJCWVuZF9jb2RlID0gazsgCi0rCQkJaWYoZW5kX2RhdGEgPCBrKSBlbmRfZGF0YSA9IGs7IAotKwkJCWsgPSBlbGZfcHBudC0+cF92YWRkciArIGVsZl9wcG50LT5wX21lbXN6OwotKwkJCWlmKGsgPiBlbGZfYnJrKSBlbGZfYnJrID0gazsJCSAgICAgCi0rCQkJCi0rCQkJaWYoc3RhdHVzID09IDB4ZmZmZmZmZmYpIHsKLSsJCQkJc2V0X2ZzKG9sZF9mcyk7Ci0rCQkJCWtmcmVlKGVsZl9waGRhdGEpOwotKwkJCQlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAwKTsKLSsJCQkJcmV0dXJuIDA7Ci0rCQkJfTsKLSsJCX07Ci0rCQllbGZfcHBudCsrOwotKwl9OwotKwlzZXRfZnMob2xkX2ZzKTsKLSsJCi0rCWtmcmVlKGVsZl9waGRhdGEpOwotKwkKLSsJaWYoIWVsZl9pbnRlcnByZXRlcikgc3lzX2Nsb3NlKGVsZl9leGVjX2ZpbGVubyk7Ci0rCWN1cnJlbnQtPmVsZl9leGVjdXRhYmxlID0gMTsKLSsJY3VycmVudC0+ZXhlY3V0YWJsZSA9IGJwcm0tPmlub2RlOwotKwlicHJtLT5pbm9kZS0+aV9jb3VudCsrOwotKyNpZmRlZiBMT1dfRUxGX1NUQUNLCi0rCWN1cnJlbnQtPnN0YXJ0X3N0YWNrID0gcCA9IGVsZl9zdGFjayAtIDQ7Ci0rI2VuZGlmCi0rCWJwcm0tPnAgLT0gTUFYX0FSR19QQUdFUypQQUdFX1NJWkU7Ci0rCWJwcm0tPnAgPSAodW5zaWduZWQgbG9uZykgY3JlYXRlX3RhYmxlcygoY2hhciAqKWJwcm0tPnAsYnBybS0+YXJnYyxicHJtLT5lbnZjKTsKLSsJaWYoZWxmX2ludGVycHJldGVyKSBjdXJyZW50LT5hcmdfc3RhcnQgKz0gc3RybGVuKHBhc3NlZF9maWxlbm8pICsgMTsKLSsJY3VycmVudC0+c3RhcnRfYnJrID0gY3VycmVudC0+YnJrID0gZWxmX2JyazsKLSsJY3VycmVudC0+ZW5kX2NvZGUgPSBlbmRfY29kZTsKLSsJY3VycmVudC0+c3RhcnRfY29kZSA9IHN0YXJ0X2NvZGU7Ci0rCWN1cnJlbnQtPnN0YXJ0X3N0YWNrID0gYnBybS0+cDsKLSsJY3VycmVudC0+c3VpZCA9IGN1cnJlbnQtPmV1aWQgPSBicHJtLT5lX3VpZDsKLSsJY3VycmVudC0+c2dpZCA9IGN1cnJlbnQtPmVnaWQgPSBicHJtLT5lX2dpZDsKLSsJemVyb21hcF9wYWdlX3JhbmdlKChlbGZfYnNzICsgMHhmZmYpICYgMHhmZmZmZjAwMCwgZWxmX2JyayAtIGVsZl9ic3MsCi0rCQkJICAgUEFHRV9DT1BZKTsKLSsJcmVncy0+ZWlwID0gZWxmX2VudHJ5OwkJLyogZWlwLCBtYWdpYyBoYXBwZW5zIDotKSAqLwotKwlyZWdzLT5lc3AgPSBicHJtLT5wOwkJCS8qIHN0YWNrIHBvaW50ZXIgKi8KLSsJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUFRSQUNFRCkKLSsJCXNlbmRfc2lnKFNJR1RSQVAsIGN1cnJlbnQsIDApOwotKwkKLSsJcmV0dXJuIDA7Ci0rfQotKwotKwotK2ludCBsb2FkX2VsZl9saWJyYXJ5KGludCBmZCl7Ci0rICAgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGU7Ci0rCXN0cnVjdCBlbGZoZHIgZWxmX2V4OwotKwlzdHJ1Y3QgZWxmX3BoZHIgKmVsZl9waGRhdGEgID0gIE5VTEw7Ci0rCXN0cnVjdCAgaW5vZGUgKiBpbm9kZTsKLSsJdW5zaWduZWQgaW50IGxlbjsKLSsJaW50IG9sZF9mcywgcmV0dmFsOwotKwl1bnNpZ25lZCBpbnQgYnNzOwotKwlpbnQgZXJyb3I7Ci0rCWludCBpLGo7Ci0rCQotKwlsZW4gPSAwOwotKwlmaWxlID0gY3VycmVudC0+ZmlscFtmZF07Ci0rCWlub2RlID0gZmlsZS0+Zl9pbm9kZTsKLSsJCi0rCXNldF9mcyhLRVJORUxfRFMpOwotKwlpZiAoZmlsZS0+Zl9vcC0+cmVhZChpbm9kZSwgZmlsZSwgKGNoYXIgKikgJmVsZl9leCwgc2l6ZW9mKGVsZl9leCkpICE9IHNpemVvZihlbGZfZXgpKSB7Ci0rCQlzeXNfY2xvc2UoZmQpOwotKwkJcmV0dXJuIC1FQUNDRVM7Ci0rCX0KLSsJc2V0X2ZzKFVTRVJfRFMpOwotKwkKLSsJaWYgKGVsZl9leC5lX2lkZW50WzBdICE9IDB4N2YgfHwKLSsJICAgIHN0cm5jbXAoJmVsZl9leC5lX2lkZW50WzFdLCAiRUxGIiwzKSAhPSAwKQotKwkJcmV0dXJuIC1FTk9FWEVDOwotKwkKLSsJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KLSsJaWYoZWxmX2V4LmVfdHlwZSAhPSBFVF9FWEVDIHx8IGVsZl9leC5lX3BobnVtID4gMiB8fAotKwkgICAoZWxmX2V4LmVfbWFjaGluZSAhPSBFTV8zODYgJiYgZWxmX2V4LmVfbWFjaGluZSAhPSBFTV80ODYpIHx8Ci0rCSAgICghaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT5ibWFwIHx8IAotKwkgICAgIWlub2RlLT5pX29wLT5kZWZhdWx0X2ZpbGVfb3BzLT5tbWFwKSl7Ci0rCQlyZXR1cm4gLUVOT0VYRUM7Ci0rCX07Ci0rCQotKwkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotKwkKLSsJaWYoc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcikgKiBlbGZfZXguZV9waG51bSA+IFBBR0VfU0laRSkgCi0rCQlyZXR1cm4gLUVOT0VYRUM7Ci0rCQotKwllbGZfcGhkYXRhID0gIChzdHJ1Y3QgZWxmX3BoZHIgKikgCi0rCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpICogZWxmX2V4LmVfcGhudW0sIEdGUF9LRVJORUwpOwotKwkKLSsJb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0rCXNldF9mcyhnZXRfZHMoKSk7Ci0rCXJldHZhbCA9IHJlYWRfZXhlYyhpbm9kZSwgZWxmX2V4LmVfcGhvZmYsIChjaGFyICopIGVsZl9waGRhdGEsCi0rCQkJICAgc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcikgKiBlbGZfZXguZV9waG51bSk7Ci0rCXNldF9mcyhvbGRfZnMpOwotKwkKLSsJaiA9IDA7Ci0rCWZvcihpPTA7IGk8ZWxmX2V4LmVfcGhudW07IGkrKykKLSsJCWlmKChlbGZfcGhkYXRhICsgaSktPnBfdHlwZSA9PSBQVF9MT0FEKSBqKys7Ci0rCQotKwlpZihqICE9IDEpICB7Ci0rCQlrZnJlZShlbGZfcGhkYXRhKTsKLSsJCXJldHVybiAtRU5PRVhFQzsKLSsJfTsKLSsJCi0rCXdoaWxlKGVsZl9waGRhdGEtPnBfdHlwZSAhPSBQVF9MT0FEKSBlbGZfcGhkYXRhKys7Ci0rCQotKwkvKiBOb3cgdXNlIG1tYXAgdG8gbWFwIHRoZSBsaWJyYXJ5IGludG8gbWVtb3J5LiAqLwotKwllcnJvciA9IGRvX21tYXAoZmlsZSwKLSsJCQllbGZfcGhkYXRhLT5wX3ZhZGRyICYgMHhmZmZmZjAwMCwKLSsJCQllbGZfcGhkYXRhLT5wX2ZpbGVzeiArIChlbGZfcGhkYXRhLT5wX3ZhZGRyICYgMHhmZmYpLAotKwkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0rCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsCi0rCQkJZWxmX3BoZGF0YS0+cF9vZmZzZXQgJiAweGZmZmZmMDAwKTsKLSsJCi0rCXN5c19jbG9zZShmZCk7Ci0rCWlmIChlcnJvciAhPSBlbGZfcGhkYXRhLT5wX3ZhZGRyICYgMHhmZmZmZjAwMCkgewotKwkgICAgICAgIGtmcmVlKGVsZl9waGRhdGEpOwotKwkJcmV0dXJuIGVycm9yOwotKwl9Ci0rCWxlbiA9IChlbGZfcGhkYXRhLT5wX2ZpbGVzeiArIGVsZl9waGRhdGEtPnBfdmFkZHIrIDB4ZmZmKSAmIDB4ZmZmZmYwMDA7Ci0rCWJzcyA9IGVsZl9waGRhdGEtPnBfbWVtc3ogKyBlbGZfcGhkYXRhLT5wX3ZhZGRyOwotKwlpZiAoYnNzID4gbGVuKQotKwkJemVyb21hcF9wYWdlX3JhbmdlKGxlbiwgYnNzLWxlbiwgUEFHRV9DT1BZKTsKLSsJa2ZyZWUoZWxmX3BoZGF0YSk7Ci0rCXJldHVybiAwOwotK30KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL2J1ZmZlci5jIGxpbnV4L2ZzL2J1ZmZlci5jCi0tLS0gcGwxMi9saW51eC9mcy9idWZmZXIuYwlTYXQgQXVnIDE0IDIzOjQ3OjIxIDE5OTMKLSsrKyBsaW51eC9mcy9idWZmZXIuYwlTYXQgU2VwICA0IDAzOjM2OjMwIDE5OTMKLUBAIC0xNjAsNyArMTYwLDcgQEAKLSAJcmV0dXJuIHN5bmNfYnVmZmVycyhkZXYsIDEpOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfc3luYyh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19zeW5jKHZvaWQpCi0gewotIAlzeW5jX2RldigwKTsKLSAJcmV0dXJuIDA7Ci1AQCAtMTcxLDcgKzE3MSw3IEBACi0gCXJldHVybiBmc3luY19kZXYoaW5vZGUtPmlfZGV2KTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2ZzeW5jKHVuc2lnbmVkIGludCBmZCkKLSthc21saW5rYWdlIGludCBzeXNfZnN5bmModW5zaWduZWQgaW50IGZkKQotIHsKLSAJc3RydWN0IGZpbGUgKiBmaWxlOwotIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL2V4ZWMuYyBsaW51eC9mcy9leGVjLmMKLS0tLSBwbDEyL2xpbnV4L2ZzL2V4ZWMuYwlTdW4gQXVnIDE1IDExOjMzOjA3IDE5OTMKLSsrKyBsaW51eC9mcy9leGVjLmMJU2F0IFNlcCAgNCAwMzozNjozMCAxOTkzCi1AQCAtNDQsMTMgKzQ0LDEzIEBACi0gI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZXhpdChpbnQgZXhpdF9jb2RlKTsKLS1leHRlcm4gIkMiIGludCBzeXNfY2xvc2UodW5zaWduZWQgZmQpOwotLWV4dGVybiAiQyIgaW50IHN5c19vcGVuKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwotK2FzbWxpbmthZ2UgaW50IHN5c19leGl0KGludCBleGl0X2NvZGUpOwotK2FzbWxpbmthZ2UgaW50IHN5c19jbG9zZSh1bnNpZ25lZCBmZCk7Ci0rYXNtbGlua2FnZSBpbnQgc3lzX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIGludCk7Ci0gCi0gZXh0ZXJuIHZvaWQgc2htX2V4aXQgKHZvaWQpOwotIAotLXN0YXRpYyBpbnQgb3Blbl9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IG1vZGUpCi0raW50IG9wZW5faW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCBtb2RlKQotIHsKLSAJaW50IGVycm9yLCBmZDsKLSAJc3RydWN0IGZpbGUgKmYsICoqZnBwOwotQEAgLTIyNSw3ICsyMjUsNyBAQAotICAqCi0gICogQWxzbyBub3RlIHRoYXQgd2UgdGFrZSB0aGUgYWRkcmVzcyB0byBsb2FkIGZyb20gZnJvbSB0aGUgZmlsZSBpdHNlbGYuCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3VzZWxpYihjb25zdCBjaGFyICogbGlicmFyeSkKLSthc21saW5rYWdlIGludCBzeXNfdXNlbGliKGNvbnN0IGNoYXIgKiBsaWJyYXJ5KQotIHsKLSAJaW50IGZkLCByZXR2YWw7Ci0gCXN0cnVjdCBmaWxlICogZmlsZTsKLUBAIC0zMTYsNyArMzE2LDcgQEAKLSAgKiBpdCBpcyBleHBlbnNpdmUgdG8gbG9hZCBhIHNlZ21lbnQgcmVnaXN0ZXIsIHdlIHRyeSB0byBhdm9pZCBjYWxsaW5nCi0gICogc2V0X2ZzKCkgdW5sZXNzIHdlIGFic29sdXRlbHkgaGF2ZSB0by4KLSAgKi8KLS1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb3B5X3N0cmluZ3MoaW50IGFyZ2MsY2hhciAqKiBhcmd2LHVuc2lnbmVkIGxvbmcgKnBhZ2UsCi0rdW5zaWduZWQgbG9uZyBjb3B5X3N0cmluZ3MoaW50IGFyZ2MsY2hhciAqKiBhcmd2LHVuc2lnbmVkIGxvbmcgKnBhZ2UsCi0gCQl1bnNpZ25lZCBsb25nIHAsIGludCBmcm9tX2ttZW0pCi0gewotIAljaGFyICp0bXAsICpwYWcgPSBOVUxMOwotQEAgLTQ1OSw3ICs0NTksNyBAQAotIAljdXJyZW50LT5tbWFwID0gTlVMTDsKLSAJd2hpbGUgKG1wbnQpIHsKLSAJCW1wbnQxID0gbXBudC0+dm1fbmV4dDsKLS0JCWlmIChtcG50LT52bV9vcHMtPmNsb3NlKQotKwkJaWYgKG1wbnQtPnZtX29wcyAmJiBtcG50LT52bV9vcHMtPmNsb3NlKQotIAkJCW1wbnQtPnZtX29wcy0+Y2xvc2UobXBudCk7Ci0gCQlrZnJlZShtcG50KTsKLSAJCW1wbnQgPSBtcG50MTsKLUBAIC02NDksNiArNjQ5LDcgQEAKLSAJCX0KLSAJfQotIAotKwlicHJtLnNoX2JhbmcgPSBzaF9iYW5nOwotIAlmbXQgPSBmb3JtYXRzOwotIAlkbyB7Ci0gCQlpbnQgKCpmbikoc3RydWN0IGxpbnV4X2JpbnBybSAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IGZtdC0+bG9hZF9iaW5hcnk7Ci1AQCAtNjcyLDcgKzY3Myw3IEBACi0gLyoKLSAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfZXhlY3ZlKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyByZWdzKQotIHsKLSAJaW50IGVycm9yOwotIAljaGFyICogZmlsZW5hbWU7Ci1AQCAtNjk0LDkgKzY5NSwxNiBAQAotIAkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwotIGV4dGVybiBpbnQgbG9hZF9hb3V0X2xpYnJhcnkoaW50IGZkKTsKLSAKLStleHRlcm4gaW50IGxvYWRfZWxmX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosCi0rCQkJICAgIHN0cnVjdCBwdF9yZWdzICogcmVncyk7Ci0rZXh0ZXJuIGludCBsb2FkX2VsZl9saWJyYXJ5KGludCBmZCk7Ci0rCi0gLyogSGVyZSBhcmUgdGhlIGFjdHVhbCBiaW5hcmllcyB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQgICovCi0gc3RydWN0IGxpbnV4X2JpbmZtdCBmb3JtYXRzW10gPSB7Ci0gCXtsb2FkX2FvdXRfYmluYXJ5LCBsb2FkX2FvdXRfbGlicmFyeX0sCi0rI2lmZGVmIENPTkZJR19CSU5GTVRfRUxGCi0rCXtsb2FkX2VsZl9iaW5hcnksIGxvYWRfZWxmX2xpYnJhcnl9LAotKyNlbmRpZgotIAl7TlVMTCwgTlVMTH0KLSB9OwotIAotQEAgLTcxMywxNyArNzIxLDIwIEBACi0gCXVuc2lnbmVkIGxvbmcgcCA9IGJwcm0tPnA7Ci0gCi0gCWV4ID0gKigoc3RydWN0IGV4ZWMgKikgYnBybS0+YnVmKTsJCS8qIGV4ZWMtaGVhZGVyICovCi0tCWlmICgoTl9NQUdJQyhleCkgIT0gWk1BR0lDICYmIE5fTUFHSUMoZXgpICE9IE9NQUdJQykgfHwKLSsJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gT01BR0lDICYmIAotKwkgICAgIE5fTUFHSUMoZXgpICE9IFFNQUdJQykgfHwKLSAJICAgIGV4LmFfdHJzaXplIHx8IGV4LmFfZHJzaXplIHx8Ci0gCSAgICBicHJtLT5pbm9kZS0+aV9zaXplIDwgZXguYV90ZXh0K2V4LmFfZGF0YStleC5hX3N5bXMrTl9UWFRPRkYoZXgpKSB7Ci0gCQlyZXR1cm4gLUVOT0VYRUM7Ci0gCX0KLS0JaWYgKE5fTUFHSUMoZXgpID09IFpNQUdJQyAmJiBOX1RYVE9GRihleCkgJiYKLSsKLSsJaWYgKE5fTUFHSUMoZXgpID09IFpNQUdJQyAmJgotIAkgICAgKE5fVFhUT0ZGKGV4KSA8IGJwcm0tPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKLSAJCXByaW50aygiTl9UWFRPRkYgPCBCTE9DS19TSVpFLiBQbGVhc2UgY29udmVydCBiaW5hcnkuIik7Ci0gCQlyZXR1cm4gLUVOT0VYRUM7Ci0gCX0KLS0JaWYgKE5fVFhUT0ZGKGV4KSAhPSBCTE9DS19TSVpFICYmIE5fTUFHSUMoZXgpICE9IE9NQUdJQykgewotKwotKwlpZiAoTl9UWFRPRkYoZXgpICE9IEJMT0NLX1NJWkUgJiYgTl9NQUdJQyhleCkgPT0gWk1BR0lDKSB7Ci0gCQlwcmludGsoIk5fVFhUT0ZGICE9IEJMT0NLX1NJWkUuIFNlZSBhLm91dC5oLiIpOwotIAkJcmV0dXJuIC1FTk9FWEVDOwotIAl9Ci1AQCAtNzMyLDcgKzc0MywxMCBAQAotIAlmbHVzaF9vbGRfZXhlYyhicHJtKTsKLSAJY3VycmVudC0+c3RhcnRfYnJrID0gY3VycmVudC0+YnJrID0gZXguYV9ic3MgKwotIAkJKGN1cnJlbnQtPmVuZF9kYXRhID0gZXguYV9kYXRhICsKLS0JCSAoY3VycmVudC0+ZW5kX2NvZGUgPSBleC5hX3RleHQpKTsKLSsJCSAoY3VycmVudC0+ZW5kX2NvZGUgPSBOX1RYVEFERFIoZXgpICsgZXguYV90ZXh0KSk7Ci0rCi0rCWN1cnJlbnQtPnN0YXJ0X2NvZGUgKz0gTl9UWFRBRERSKGV4KTsKLSsKLSAJY3VycmVudC0+cnNzID0gMDsKLSAJY3VycmVudC0+c3VpZCA9IGN1cnJlbnQtPmV1aWQgPSBicHJtLT5lX3VpZDsKLSAJY3VycmVudC0+bW1hcCA9IE5VTEw7Ci1AQCAtNzUxLDIzICs3NjUsMjUgQEAKLSAJCWZpbGUgPSBjdXJyZW50LT5maWxwW2ZkXTsKLSAJCWlmICghZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+bW1hcCkgewotIAkJCXN5c19jbG9zZShmZCk7Ci0tCQkJcmVhZF9leGVjKGJwcm0tPmlub2RlLCAxMDI0LCAoY2hhciAqKSAwLCBleC5hX3RleHQrZXguYV9kYXRhKTsKLSsJCQlyZWFkX2V4ZWMoYnBybS0+aW5vZGUsIE5fVFhUT0ZGKGV4KSwgCi0rCQkJCSAgKGNoYXIgKikgTl9UWFRBRERSKGV4KSwgZXguYV90ZXh0K2V4LmFfZGF0YSk7Ci0gCQkJZ290byBiZXlvbmRfaWY7Ci0gCQl9Ci0tCQllcnJvciA9IGRvX21tYXAoZmlsZSwgMCwgZXguYV90ZXh0LAotKwkJZXJyb3IgPSBkb19tbWFwKGZpbGUsIE5fVFhUQUREUihleCksIGV4LmFfdGV4dCwKLSAJCQkJUFJPVF9SRUFEIHwgUFJPVF9FWEVDLAotIAkJCQlNQVBfRklYRUQgfCBNQVBfU0hBUkVELCBOX1RYVE9GRihleCkpOwotLQkJaWYgKGVycm9yICE9IDApIHsKLSsKLSsJCWlmIChlcnJvciAhPSBOX1RYVEFERFIoZXgpKSB7Ci0gCQkJc3lzX2Nsb3NlKGZkKTsKLSAJCQlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAwKTsKLSAJCQlyZXR1cm4gMDsKLSAJCX07Ci0gCQkKLS0JCWVycm9yID0gZG9fbW1hcChmaWxlLCBleC5hX3RleHQsIGV4LmFfZGF0YSwKLSsgCQllcnJvciA9IGRvX21tYXAoZmlsZSwgTl9UWFRBRERSKGV4KSArIGV4LmFfdGV4dCwgZXguYV9kYXRhLAotIAkJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAotIAkJCQlNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgTl9UWFRPRkYoZXgpICsgZXguYV90ZXh0KTsKLSAJCXN5c19jbG9zZShmZCk7Ci0tCQlpZiAoZXJyb3IgIT0gZXguYV90ZXh0KSB7Ci0rCQlpZiAoZXJyb3IgIT0gTl9UWFRBRERSKGV4KSArIGV4LmFfdGV4dCkgewotIAkJCXNlbmRfc2lnKFNJR1NFR1YsIGN1cnJlbnQsIDApOwotIAkJCXJldHVybiAwOwotIAkJfTsKLUBAIC03NzUsNyArNzkxLDcgQEAKLSAJCWJwcm0tPmlub2RlLT5pX2NvdW50Kys7Ci0gCX0KLSBiZXlvbmRfaWY6Ci0tCXplcm9tYXBfcGFnZV9yYW5nZSgoZXguYV90ZXh0ICsgZXguYV9kYXRhICsgMHhmZmYpICYgMHhmZmZmZjAwMCxleC5hX2JzcywgUEFHRV9DT1BZKTsKLSsJemVyb21hcF9wYWdlX3JhbmdlKChOX1RYVEFERFIoZXgpICsgZXguYV90ZXh0ICsgZXguYV9kYXRhICsgMHhmZmYpICYgMHhmZmZmZjAwMCxleC5hX2JzcywgUEFHRV9DT1BZKTsKLSAJcCArPSBjaGFuZ2VfbGR0KGV4LmFfdGV4dCxicHJtLT5wYWdlKTsKLSAJcCAtPSBNQVhfQVJHX1BBR0VTKlBBR0VfU0laRTsKLSAJcCA9ICh1bnNpZ25lZCBsb25nKSBjcmVhdGVfdGFibGVzKChjaGFyICopcCxicHJtLT5hcmdjLGJwcm0tPmVudmMpOwotQEAgLTc5NSw2ICs4MTEsNyBAQAotIAlzdHJ1Y3QgIGlub2RlICogaW5vZGU7Ci0gCXVuc2lnbmVkIGludCBsZW47Ci0gCXVuc2lnbmVkIGludCBic3M7Ci0rCXVuc2lnbmVkIGludCBzdGFydF9hZGRyOwotIAlpbnQgZXJyb3I7Ci0gCQotIAlmaWxlID0gY3VycmVudC0+ZmlscFtmZF07Ci1AQCAtODA3LDggKzgyNCw4IEBACi0gCXNldF9mcyhVU0VSX0RTKTsKLSAJCi0gCS8qIFdlIGNvbWUgaW4gaGVyZSBmb3IgdGhlIHJlZ3VsYXIgYS5vdXQgc3R5bGUgb2Ygc2hhcmVkIGxpYnJhcmllcyAqLwotLQlpZiAoTl9NQUdJQyhleCkgIT0gWk1BR0lDIHx8IGV4LmFfdHJzaXplIHx8Ci0tCSAgICBleC5hX2Ryc2l6ZSB8fCBleC5hX2VudHJ5ICYgMHhmZmYgfHwKLSsJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gUU1BR0lDKSB8fCBleC5hX3Ryc2l6ZSB8fAotKwkgICAgZXguYV9kcnNpemUgfHwgKChleC5hX2VudHJ5ICYgMHhmZmYpICYmIE5fTUFHSUMoZXgpID09IFpNQUdJQykgfHwKLSAJICAgIGlub2RlLT5pX3NpemUgPCBleC5hX3RleHQrZXguYV9kYXRhK2V4LmFfc3ltcytOX1RYVE9GRihleCkpIHsKLSAJCXJldHVybiAtRU5PRVhFQzsKLSAJfQotQEAgLTgxOCwxNSArODM1LDIyIEBACi0gCQlyZXR1cm4gLUVOT0VYRUM7Ci0gCX0KLSAJCi0rCWlmIChOX0ZMQUdTKGV4KSkgcmV0dXJuIC1FTk9FWEVDOwotKwotKwkvKiBGb3IgIFFNQUdJQywgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaXMgMHgyMCBpbnRvIHRoZSBwYWdlLiAgV2UgbWFzawotKwkgICB0aGlzIG9mZiB0byBnZXQgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIHRoZSBwYWdlICovCi0rCi0rCXN0YXJ0X2FkZHIgPSAgZXguYV9lbnRyeSAmIDB4ZmZmZmYwMDA7Ci0rCi0gCS8qIE5vdyB1c2UgbW1hcCB0byBtYXAgdGhlIGxpYnJhcnkgaW50byBtZW1vcnkuICovCi0tCWVycm9yID0gZG9fbW1hcChmaWxlLCBleC5hX2VudHJ5LCBleC5hX3RleHQgKyBleC5hX2RhdGEsCi0rCWVycm9yID0gZG9fbW1hcChmaWxlLCBzdGFydF9hZGRyLCBleC5hX3RleHQgKyBleC5hX2RhdGEsCi0gCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsCi0gCQkJTl9UWFRPRkYoZXgpKTsKLS0JaWYgKGVycm9yICE9IGV4LmFfZW50cnkpCi0rCWlmIChlcnJvciAhPSBzdGFydF9hZGRyKQotIAkJcmV0dXJuIGVycm9yOwotIAlsZW4gPSAoZXguYV90ZXh0ICsgZXguYV9kYXRhICsgMHhmZmYpICYgMHhmZmZmZjAwMDsKLSAJYnNzID0gZXguYV90ZXh0ICsgZXguYV9kYXRhICsgZXguYV9ic3M7Ci0gCWlmIChic3MgPiBsZW4pCi0tCQl6ZXJvbWFwX3BhZ2VfcmFuZ2UoZXguYV9lbnRyeSArIGxlbiwgYnNzLWxlbiwgUEFHRV9DT1BZKTsKLSsJCXplcm9tYXBfcGFnZV9yYW5nZShzdGFydF9hZGRyICsgbGVuLCBic3MtbGVuLCBQQUdFX0NPUFkpOwotIAlyZXR1cm4gMDsKLSB9Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9mcy9leHQyL25hbWVpLmMgbGludXgvZnMvZXh0Mi9uYW1laS5jCi0tLS0gcGwxMi9saW51eC9mcy9leHQyL25hbWVpLmMJVGh1IEF1ZyAxMiAyMDo1NDowMCAxOTkzCi0rKysgbGludXgvZnMvZXh0Mi9uYW1laS5jCVNhdCBBdWcgMjEgMTk6MjE6NTYgMTk5MwotQEAgLTkzNyw2ICs5MzcsOCBAQAotIAkJbmV3X2lub2RlLT5pX25saW5rLS07Ci0gCQluZXdfaW5vZGUtPmlfZGlydCA9IDE7Ci0gCX0KLSsJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0rCW9sZF9kaXItPmlfZGlydCA9IDE7Ci0gCW9sZF9iaC0+Yl9kaXJ0ID0gMTsKLSAJbmV3X2JoLT5iX2RpcnQgPSAxOwotIAlpZiAoZGlyX2JoKSB7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9mcy9mY250bC5jIGxpbnV4L2ZzL2ZjbnRsLmMKLS0tLSBwbDEyL2xpbnV4L2ZzL2ZjbnRsLmMJV2VkIEp1bCAgNyAxMDozOToyMSAxOTkzCi0rKysgbGludXgvZnMvZmNudGwuYwlTYXQgU2VwICA0IDAzOjM2OjMwIDE5OTMKLUBAIC0zNSw3ICszNSw3IEBACi0gCXJldHVybiBhcmc7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19kdXAyKHVuc2lnbmVkIGludCBvbGRmZCwgdW5zaWduZWQgaW50IG5ld2ZkKQotK2FzbWxpbmthZ2UgaW50IHN5c19kdXAyKHVuc2lnbmVkIGludCBvbGRmZCwgdW5zaWduZWQgaW50IG5ld2ZkKQotIHsKLSAJaWYgKG9sZGZkID49IE5SX09QRU4gfHwgIWN1cnJlbnQtPmZpbHBbb2xkZmRdKQotIAkJcmV0dXJuIC1FQkFERjsKLUBAIC01OCwxMiArNTgsMTIgQEAKLSAJcmV0dXJuIGR1cGZkKG9sZGZkLG5ld2ZkKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2R1cCh1bnNpZ25lZCBpbnQgZmlsZGVzKQotK2FzbWxpbmthZ2UgaW50IHN5c19kdXAodW5zaWduZWQgaW50IGZpbGRlcykKLSB7Ci0gCXJldHVybiBkdXBmZChmaWxkZXMsMCk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19mY250bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotK2FzbWxpbmthZ2UgaW50IHN5c19mY250bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotIHsJCi0gCXN0cnVjdCBmaWxlICogZmlscDsKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL2ZpbGVfdGFibGUuYyBsaW51eC9mcy9maWxlX3RhYmxlLmMKLS0tLSBwbDEyL2xpbnV4L2ZzL2ZpbGVfdGFibGUuYwlNb24gQXVnICA5IDE3OjQxOjIyIDE5OTMKLSsrKyBsaW51eC9mcy9maWxlX3RhYmxlLmMJVHVlIEF1ZyAxNyAxODozMjoxMyAxOTkzCi1AQCAtNDUsNyArNDUsNyBAQAotIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7Ci0gCWludCBpOwotIAotLQlmaWxlID0gKHN0cnVjdCBmaWxlKikgX19nZXRfZnJlZV9wYWdlKEdGUF9CVUZGRVIpOwotKwlmaWxlID0gKHN0cnVjdCBmaWxlICopIGdldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0gCi0gCWlmICghZmlsZSkKLSAJCXJldHVybjsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL2lub2RlLmMgbGludXgvZnMvaW5vZGUuYwotLS0tIHBsMTIvbGludXgvZnMvaW5vZGUuYwlNb24gQXVnICA5IDE3OjQxOjIyIDE5OTMKLSsrKyBsaW51eC9mcy9pbm9kZS5jCVR1ZSBBdWcgMTcgMTg6NDE6MDUgMTk5MwotQEAgLTg3LDcgKzg3LDcgQEAKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCWludCBpOwotIAotLQlpZighKGlub2RlID0gKHN0cnVjdCBpbm9kZSopIGdldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQotKwlpZiAoIShpbm9kZSA9IChzdHJ1Y3QgaW5vZGUqKSBnZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkKLSAJCXJldHVybjsKLSAKLSAJaT1QQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGlub2RlKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL2lvY3RsLmMgbGludXgvZnMvaW9jdGwuYwotLS0tIHBsMTIvbGludXgvZnMvaW9jdGwuYwlTYXQgSnVsICAzIDAxOjA3OjMxIDE5OTMKLSsrKyBsaW51eC9mcy9pb2N0bC5jCVNhdCBTZXAgIDQgMDM6MzY6MzAgMTk5MwotQEAgLTU0LDcgKzU0LDcgQEAKLSB9Ci0gCi0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi0gewkKLSAJc3RydWN0IGZpbGUgKiBmaWxwOwotIAlpbnQgb247Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9mcy9uYW1laS5jIGxpbnV4L2ZzL25hbWVpLmMKLS0tLSBwbDEyL2xpbnV4L2ZzL25hbWVpLmMJTW9uIEF1ZyAgOSAxODowMjoyOSAxOTkzCi0rKysgbGludXgvZnMvbmFtZWkuYwlTYXQgU2VwICA0IDAzOjM2OjMwIDE5OTMKLUBAIC0yNjYsNyArMjY2LDcgQEAKLSAgKgotICAqIG5hbWVpIGZvciBvcGVuIC0gdGhpcyBpcyBpbiBmYWN0IGFsbW9zdCB0aGUgd2hvbGUgb3Blbi1yb3V0aW5lLgotICAqCi0tICogTm90ZSB0aGF0IHRoZSBsb3cgYml0cyBvZiAiZmxhZyIgYXJlbid0IHRoZSBzYW1lIGFzaW4gdGhlIG9wZW4KLSsgKiBOb3RlIHRoYXQgdGhlIGxvdyBiaXRzIG9mICJmbGFnIiBhcmVuJ3QgdGhlIHNhbWUgYXMgaW4gdGhlIG9wZW4KLSAgKiBzeXN0ZW0gY2FsbCAtIHRoZXkgYXJlIDAwIC0gbm8gcGVybWlzc2lvbnMgbmVlZGVkCi0gICoJCQkgIDAxIC0gcmVhZCBwZXJtaXNzaW9uIG5lZWRlZAotICAqCQkJICAxMCAtIHdyaXRlIHBlcm1pc3Npb24gbmVlZGVkCi1AQCAtMzY5LDYgKzM2OSw4IEBACi0gIAkJCQlyZXR1cm4gLUVUWFRCU1k7Ci0gIAkJCX0KLSAJCQlmb3IobXBudCA9ICgqcCktPm1tYXA7IG1wbnQ7IG1wbnQgPSBtcG50LT52bV9uZXh0KSB7Ci0rCQkJCWlmIChtcG50LT52bV9wYWdlX3Byb3QgJiBQQUdFX1JXKQotKwkJCQkJY29udGludWU7Ci0gCQkJCWlmIChpbm9kZSA9PSBtcG50LT52bV9pbm9kZSkgewotIAkJCQkJaXB1dChpbm9kZSk7Ci0gCQkJCQlyZXR1cm4gLUVUWFRCU1k7Ci1AQCAtMzc2LDYgKzM3OCwxNiBAQAotIAkJCX0KLSAgCQl9Ci0gIAl9Ci0rCWlmIChmbGFnICYgT19UUlVOQykgewotKwkgICAgICBpbm9kZS0+aV9zaXplID0gMDsKLSsJICAgICAgaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT50cnVuY2F0ZSkKLSsJICAgICAgICAgICBpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwotKwkgICAgICBpZiAoKGVycm9yID0gbm90aWZ5X2NoYW5nZShOT1RJRllfU0laRSwgaW5vZGUpKSkgewotKwkJICAgaXB1dChpbm9kZSk7Ci0rCQkgICByZXR1cm4gZXJyb3I7Ci0rCSAgICAgIH0KLSsJICAgICAgaW5vZGUtPmlfZGlydCA9IDE7Ci0rCX0KLSAJKnJlc19pbm9kZSA9IGlub2RlOwotIAlyZXR1cm4gMDsKLSB9Ci1AQCAtNDA5LDcgKzQyMSw3IEBACi0gCXJldHVybiBkaXItPmlfb3AtPm1rbm9kKGRpcixiYXNlbmFtZSxuYW1lbGVuLG1vZGUsZGV2KTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX21rbm9kKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSwgaW50IG1vZGUsIGRldl90IGRldikKLSthc21saW5rYWdlIGludCBzeXNfbWtub2QoY29uc3QgY2hhciAqIGZpbGVuYW1lLCBpbnQgbW9kZSwgZGV2X3QgZGV2KQotIHsKLSAJaW50IGVycm9yOwotIAljaGFyICogdG1wOwotQEAgLTQ1Miw3ICs0NjQsNyBAQAotIAlyZXR1cm4gZGlyLT5pX29wLT5ta2RpcihkaXIsYmFzZW5hbWUsbmFtZWxlbixtb2RlKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX21rZGlyKGNvbnN0IGNoYXIgKiBwYXRobmFtZSwgaW50IG1vZGUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX21rZGlyKGNvbnN0IGNoYXIgKiBwYXRobmFtZSwgaW50IG1vZGUpCi0gewotIAlpbnQgZXJyb3I7Ci0gCWNoYXIgKiB0bXA7Ci1AQCAtNDkzLDcgKzUwNSw3IEBACi0gCXJldHVybiBkaXItPmlfb3AtPnJtZGlyKGRpcixiYXNlbmFtZSxuYW1lbGVuKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3JtZGlyKGNvbnN0IGNoYXIgKiBwYXRobmFtZSkKLSthc21saW5rYWdlIGludCBzeXNfcm1kaXIoY29uc3QgY2hhciAqIHBhdGhuYW1lKQotIHsKLSAJaW50IGVycm9yOwotIAljaGFyICogdG1wOwotQEAgLTUzNCw3ICs1NDYsNyBAQAotIAlyZXR1cm4gZGlyLT5pX29wLT51bmxpbmsoZGlyLGJhc2VuYW1lLG5hbWVsZW4pOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfdW5saW5rKGNvbnN0IGNoYXIgKiBwYXRobmFtZSkKLSthc21saW5rYWdlIGludCBzeXNfdW5saW5rKGNvbnN0IGNoYXIgKiBwYXRobmFtZSkKLSB7Ci0gCWludCBlcnJvcjsKLSAJY2hhciAqIHRtcDsKLUBAIC01NzUsNyArNTg3LDcgQEAKLSAJcmV0dXJuIGRpci0+aV9vcC0+c3ltbGluayhkaXIsYmFzZW5hbWUsbmFtZWxlbixvbGRuYW1lKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3N5bWxpbmsoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQotK2FzbWxpbmthZ2UgaW50IHN5c19zeW1saW5rKGNvbnN0IGNoYXIgKiBvbGRuYW1lLCBjb25zdCBjaGFyICogbmV3bmFtZSkKLSB7Ci0gCWludCBlcnJvcjsKLSAJY2hhciAqIGZyb20sICogdG87Ci1AQCAtNjMxLDcgKzY0Myw3IEBACi0gCXJldHVybiBkaXItPmlfb3AtPmxpbmsob2xkaW5vZGUsIGRpciwgYmFzZW5hbWUsIG5hbWVsZW4pOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfbGluayhjb25zdCBjaGFyICogb2xkbmFtZSwgY29uc3QgY2hhciAqIG5ld25hbWUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2xpbmsoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQotIHsKLSAJaW50IGVycm9yOwotIAljaGFyICogdG87Ci1AQCAtNzAzLDcgKzcxNSw3IEBACi0gCQluZXdfZGlyLCBuZXdfYmFzZSwgbmV3X2xlbik7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19yZW5hbWUoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQotK2FzbWxpbmthZ2UgaW50IHN5c19yZW5hbWUoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQotIHsKLSAJaW50IGVycm9yOwotIAljaGFyICogZnJvbSwgKiB0bzsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL25mcy9tbWFwLmMgbGludXgvZnMvbmZzL21tYXAuYwotLS0tIHBsMTIvbGludXgvZnMvbmZzL21tYXAuYwlTdW4gQXVnIDE1IDExOjQ2OjAzIDE5OTMKLSsrKyBsaW51eC9mcy9uZnMvbW1hcC5jCVNhdCBBdWcgMjEgMTA6MzE6MzEgMTk5MwotQEAgLTUwLDExICs1MCw5IEBACi0gewotIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBtcG50OwotIAotLQlpZiAob2ZmICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQotKwlpZiAocHJvdCAmIFBBR0VfUlcpCS8qIG9ubHkgUEFHRV9DT1cgb3IgcmVhZC1vbmx5IHN1cHBvcnRlZCBub3cgKi8KLSAJCXJldHVybiAtRUlOVkFMOwotLQlpZiAobGVuID4gaGlnaF9tZW1vcnkgfHwgb2ZmID4gaGlnaF9tZW1vcnkgLSBsZW4pIC8qIGF2b2lkIG92ZXJmbG93ICovCi0tCQlyZXR1cm4gLUVOWElPOwotLQlpZiAoZ2V0X2xpbWl0KFVTRVJfRFMpICE9IFRBU0tfU0laRSkKLSsJaWYgKG9mZiAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkKLSAJCXJldHVybiAtRUlOVkFMOwotIAlpZiAoIWlub2RlLT5pX3NiIHx8ICFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotIAkJcmV0dXJuIC1FQUNDRVM7Ci1AQCAtNzksMTAgKzc3LDYgQEAKLSAJbXBudC0+dm1fb3BzID0gJm5mc19maWxlX21tYXA7Ci0gCW1wbnQtPnZtX25leHQgPSBjdXJyZW50LT5tbWFwOwotIAljdXJyZW50LT5tbWFwID0gbXBudDsKLS0jaWYgMAotLQlwcmludGsoIlZGUzogTG9hZGVkIG1tYXAgYXQgJTA4eCAtICUwOHhcbiIsCi0tCQltcG50LT52bV9zdGFydCwJbXBudC0+dm1fZW5kKTsKLS0jZW5kaWYKLSAJcmV0dXJuIDA7Ci0gfQotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvZnMvb3Blbi5jIGxpbnV4L2ZzL29wZW4uYwotLS0tIHBsMTIvbGludXgvZnMvb3Blbi5jCU1vbiBBdWcgIDkgMTg6MDI6MjkgMTk5MwotKysrIGxpbnV4L2ZzL29wZW4uYwlTYXQgU2VwICA0IDAzOjM1OjE3IDE5OTMKLUBAIC0yMSwxMiArMjEsMTIgQEAKLSAKLSBleHRlcm4gdm9pZCBmY250bF9yZW1vdmVfbG9ja3Moc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOwotIAotLWV4dGVybiAiQyIgaW50IHN5c191c3RhdChpbnQgZGV2LCBzdHJ1Y3QgdXN0YXQgKiB1YnVmKQotK2FzbWxpbmthZ2UgaW50IHN5c191c3RhdChpbnQgZGV2LCBzdHJ1Y3QgdXN0YXQgKiB1YnVmKQotIHsKLSAJcmV0dXJuIC1FTk9TWVM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19zdGF0ZnMoY29uc3QgY2hhciAqIHBhdGgsIHN0cnVjdCBzdGF0ZnMgKiBidWYpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3N0YXRmcyhjb25zdCBjaGFyICogcGF0aCwgc3RydWN0IHN0YXRmcyAqIGJ1ZikKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlpbnQgZXJyb3I7Ci1AQCAtNDYsNyArNDYsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2ZzdGF0ZnModW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgc3RhdGZzICogYnVmKQotK2FzbWxpbmthZ2UgaW50IHN5c19mc3RhdGZzKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IHN0YXRmcyAqIGJ1ZikKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7Ci1AQCAtNjUsNyArNjUsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3RydW5jYXRlKGNvbnN0IGNoYXIgKiBwYXRoLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotK2FzbWxpbmthZ2UgaW50IHN5c190cnVuY2F0ZShjb25zdCBjaGFyICogcGF0aCwgdW5zaWduZWQgaW50IGxlbmd0aCkKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlpbnQgZXJyb3I7Ci1AQCAtOTEsNyArOTEsNyBAQAotIAlyZXR1cm4gZXJyb3I7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19mdHJ1bmNhdGUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotK2FzbWxpbmthZ2UgaW50IHN5c19mdHJ1bmNhdGUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCXN0cnVjdCBmaWxlICogZmlsZTsKLUBAIC0xMTQsNyArMTE0LDcgQEAKLSAgKiBtdXN0IGJlIG93bmVyIG9yIGhhdmUgd3JpdGUgcGVybWlzc2lvbi4KLSAgKiBFbHNlLCB1cGRhdGUgZnJvbSAqdGltZXMsIG11c3QgYmUgb3duZXIgb3Igc3VwZXIgdXNlci4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfdXRpbWUoY2hhciAqIGZpbGVuYW1lLCBzdHJ1Y3QgdXRpbWJ1ZiAqIHRpbWVzKQotK2FzbWxpbmthZ2UgaW50IHN5c191dGltZShjaGFyICogZmlsZW5hbWUsIHN0cnVjdCB1dGltYnVmICogdGltZXMpCi0gewotIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAJbG9uZyBhY3RpbWUsbW9kdGltZTsKLUBAIC0xNTUsNyArMTU1LDcgQEAKLSAgKiBYWFggd2Ugc2hvdWxkIHVzZSB0aGUgcmVhbCBpZHMgZm9yIGNoZWNraW5nIF9hbGxfIGNvbXBvbmVudHMgb2YgdGhlCi0gICogcGF0aC4gIE5vdyB3ZSBvbmx5IHVzZSB0aGVtIGZvciB0aGUgZmluYWwgY29tcG9uZW50IG9mIHRoZSBwYXRoLgotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19hY2Nlc3MoY29uc3QgY2hhciAqIGZpbGVuYW1lLGludCBtb2RlKQotK2FzbWxpbmthZ2UgaW50IHN5c19hY2Nlc3MoY29uc3QgY2hhciAqIGZpbGVuYW1lLGludCBtb2RlKQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCWludCByZXMsIGlfbW9kZTsKLUBAIC0xODksNyArMTg5LDcgQEAKLSAJcmV0dXJuIC1FQUNDRVM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19jaGRpcihjb25zdCBjaGFyICogZmlsZW5hbWUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2NoZGlyKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSkKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlpbnQgZXJyb3I7Ci1AQCAtMjEwLDcgKzIxMCw3IEBACi0gCXJldHVybiAoMCk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19jaHJvb3QoY29uc3QgY2hhciAqIGZpbGVuYW1lKQotK2FzbWxpbmthZ2UgaW50IHN5c19jaHJvb3QoY29uc3QgY2hhciAqIGZpbGVuYW1lKQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCWludCBlcnJvcjsKLUBAIC0yMzEsNyArMjMxLDcgQEAKLSAJcmV0dXJuICgwKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2ZjaG1vZCh1bnNpZ25lZCBpbnQgZmQsIG1vZGVfdCBtb2RlKQotK2FzbWxpbmthZ2UgaW50IHN5c19mY2htb2QodW5zaWduZWQgaW50IGZkLCBtb2RlX3QgbW9kZSkKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7Ci1AQCAtMjUyLDcgKzI1Miw3IEBACi0gCXJldHVybiBub3RpZnlfY2hhbmdlKE5PVElGWV9NT0RFLCBpbm9kZSk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19jaG1vZChjb25zdCBjaGFyICogZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQotK2FzbWxpbmthZ2UgaW50IHN5c19jaG1vZChjb25zdCBjaGFyICogZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCWludCBlcnJvcjsKLUBAIC0yNzgsNyArMjc4LDcgQEAKLSAJcmV0dXJuIGVycm9yOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZmNob3duKHVuc2lnbmVkIGludCBmZCwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCi0rYXNtbGlua2FnZSBpbnQgc3lzX2ZjaG93bih1bnNpZ25lZCBpbnQgZmQsIHVpZF90IHVzZXIsIGdpZF90IGdyb3VwKQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCXN0cnVjdCBmaWxlICogZmlsZTsKLUBAIC0zMDUsNyArMzA1LDcgQEAKLSAJcmV0dXJuIC1FUEVSTTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2Nob3duKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCi0rYXNtbGlua2FnZSBpbnQgc3lzX2Nob3duKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCi0gewotIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAJaW50IGVycm9yOwotQEAgLTM3OCwxOCArMzc4LDcgQEAKLSAJCWYtPmZfY291bnQtLTsKLSAJCXJldHVybiBlcnJvcjsKLSAJfQotLQlpZiAoZmxhZyAmIE9fVFJVTkMpIHsKLS0JCWlub2RlLT5pX3NpemUgPSAwOwotLQkJaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT50cnVuY2F0ZSkKLS0JCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwotLQkJaWYgKChlcnJvciA9IG5vdGlmeV9jaGFuZ2UoTk9USUZZX1NJWkUsIGlub2RlKSkpIHsKLS0JCQlpcHV0KGlub2RlKTsKLS0JCQljdXJyZW50LT5maWxwW2ZkXSA9IE5VTEw7Ci0tCQkJZi0+Zl9jb3VudC0tOwotLQkJCXJldHVybiBlcnJvcjsKLS0JCX0KLS0JCWlub2RlLT5pX2RpcnQgPSAxOwotLQl9Ci0rCi0gCWYtPmZfaW5vZGUgPSBpbm9kZTsKLSAJZi0+Zl9wb3MgPSAwOwotIAlmLT5mX3JlYWRhID0gMDsKLUBAIC00MDksNyArMzk4LDcgQEAKLSAJcmV0dXJuIChmZCk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19vcGVuKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSxpbnQgZmxhZ3MsaW50IG1vZGUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX29wZW4oY29uc3QgY2hhciAqIGZpbGVuYW1lLGludCBmbGFncyxpbnQgbW9kZSkKLSB7Ci0gCWNoYXIgKiB0bXA7Ci0gCWludCBlcnJvcjsKLUBAIC00MjIsNyArNDExLDcgQEAKLSAJcmV0dXJuIGVycm9yOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfY3JlYXQoY29uc3QgY2hhciAqIHBhdGhuYW1lLCBpbnQgbW9kZSkKLSthc21saW5rYWdlIGludCBzeXNfY3JlYXQoY29uc3QgY2hhciAqIHBhdGhuYW1lLCBpbnQgbW9kZSkKLSB7Ci0gCXJldHVybiBzeXNfb3BlbihwYXRobmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgbW9kZSk7Ci0gfQotQEAgLTQ1MCw3ICs0MzksNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2Nsb3NlKHVuc2lnbmVkIGludCBmZCkKLSthc21saW5rYWdlIGludCBzeXNfY2xvc2UodW5zaWduZWQgaW50IGZkKQotIHsJCi0gCXN0cnVjdCBmaWxlICogZmlscDsKLSAKLUBAIC00NjcsNyArNDU2LDcgQEAKLSAgKiBUaGlzIHJvdXRpbmUgc2ltdWxhdGVzIGEgaGFuZ3VwIG9uIHRoZSB0dHksIHRvIGFycmFuZ2UgdGhhdCB1c2VycwotICAqIGFyZSBnaXZlbiBjbGVhbiB0ZXJtaW5hbHMgYXQgbG9naW4gdGltZS4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfdmhhbmd1cCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c192aGFuZ3VwKHZvaWQpCi0gewotIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvZnMvcGlwZS5jIGxpbnV4L2ZzL3BpcGUuYwotLS0tIHBsMTIvbGludXgvZnMvcGlwZS5jCVN1biBKdWwgMTggMTg6MTk6NDIgMTk5MwotKysrIGxpbnV4L2ZzL3BpcGUuYwlTYXQgU2VwICA0IDAzOjM2OjMwIDE5OTMKLUBAIC0yODgsNyArMjg4LDcgQEAKLSAJTlVMTAkJCS8qIHBlcm1pc3Npb24gKi8KLSB9OwotIAotLWV4dGVybiAiQyIgaW50IHN5c19waXBlKHVuc2lnbmVkIGxvbmcgKiBmaWxkZXMpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyAqIGZpbGRlcykKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlzdHJ1Y3QgZmlsZSAqIGZbMl07Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9mcy9wcm9jL2FycmF5LmMgbGludXgvZnMvcHJvYy9hcnJheS5jCi0tLS0gcGwxMi9saW51eC9mcy9wcm9jL2FycmF5LmMJTW9uIEF1ZyAgOSAxODowMjoyOSAxOTkzCi0rKysgbGludXgvZnMvcHJvYy9hcnJheS5jCUZyaSBBdWcgMjAgMDk6NDA6NTcgMTk5MwotQEAgLTE5NCw3ICsxOTQsNyBAQAotIAlpZiAodnNpemUpIHsKLSAJCWVpcCA9IEtTVEtfRUlQKHZzaXplKTsKLSAJCWVzcCA9IEtTVEtfRVNQKHZzaXplKTsKLS0JCXZzaXplID0gKCpwKS0+YnJrICsgUEFHRV9TSVpFLTE7Ci0rCQl2c2l6ZSA9ICgqcCktPmJyayAtICgqcCktPnN0YXJ0X2NvZGUgKyBQQUdFX1NJWkUtMTsKLSAJCWlmIChlc3ApCi0gCQkJdnNpemUgKz0gVEFTS19TSVpFIC0gZXNwOwotIAl9Ci1AQCAtMjY0LDcgKzI2NCw3IEBACi0gCQlyZXR1cm4gMDsKLSAJdHBhZyA9ICgqcCktPmVuZF9jb2RlIC8gUEFHRV9TSVpFOwotIAlpZiAoKCpwKS0+c3RhdGUgIT0gVEFTS19aT01CSUUpIHsKLS0JICBwYWdlZGlyID0gUEFHRV9ESVJfT0ZGU0VUKCgqcCktPnRzcy5jcjMsKCpwKS0+c3RhcnRfY29kZSk7Ci0rCSAgcGFnZWRpciA9ICh1bnNpZ25lZCBsb25nICopICgqcCktPnRzcy5jcjM7Ci0gCSAgZm9yIChpID0gMDsgaSA8IDB4MzAwOyArK2kpIHsKLSAJICAgIGlmICgocHRibCA9IHBhZ2VkaXJbaV0pID09IDApIHsKLSAJICAgICAgdHBhZyAtPSBQVFJTX1BFUl9QQUdFOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvZnMvcHJvYy9rbXNnLmMgbGludXgvZnMvcHJvYy9rbXNnLmMKLS0tLSBwbDEyL2xpbnV4L2ZzL3Byb2Mva21zZy5jCVNhdCBKdWwgIDMgMDE6MzE6NTYgMTk5MwotKysrIGxpbnV4L2ZzL3Byb2Mva21zZy5jCVNhdCBTZXAgIDQgMDM6Mzk6MjIgMTk5MwotQEAgLTE3LDcgKzE3LDcgQEAKLSBleHRlcm4gdW5zaWduZWQgbG9uZyBsb2dfc2l6ZTsKLSBleHRlcm4gc3RydWN0IHdhaXRfcXVldWUgKiBsb2dfd2FpdDsKLSAKLS1leHRlcm4gIkMiIGludCBzeXNfc3lzbG9nKGludCB0eXBlLCBjaGFyICogYnVnLCBpbnQgY291bnQpOwotK2FzbWxpbmthZ2UgaW50IHN5c19zeXNsb2coaW50IHR5cGUsIGNoYXIgKiBidWcsIGludCBjb3VudCk7Ci0gCi0gc3RhdGljIGludCBrbXNnX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKLSB7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9mcy9yZWFkX3dyaXRlLmMgbGludXgvZnMvcmVhZF93cml0ZS5jCi0tLS0gcGwxMi9saW51eC9mcy9yZWFkX3dyaXRlLmMJU2F0IEp1bCAgMyAwMTowNTozOSAxOTkzCi0rKysgbGludXgvZnMvcmVhZF93cml0ZS5jCVNhdCBTZXAgIDQgMDM6MzY6MzAgMTk5MwotQEAgLTE2LDcgKzE2LDcgQEAKLSAgKiBDb3VudCBpcyBub3QgeWV0IHVzZWQ6IGJ1dCB3ZSdsbCBwcm9iYWJseSBzdXBwb3J0IHJlYWRpbmcgc2V2ZXJhbCBlbnRyaWVzCi0gICogYXQgb25jZSBpbiB0aGUgZnV0dXJlLiBVc2UgY291bnQ9MSBpbiB0aGUgbGlicmFyeSBmb3IgZnV0dXJlIGV4cGFuc2lvbnMuCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3JlYWRkaXIodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZGlyZW50ICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3JlYWRkaXIodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZGlyZW50ICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCi0gewotIAlpbnQgZXJyb3I7Ci0gCXN0cnVjdCBmaWxlICogZmlsZTsKLUBAIC0zNCw3ICszNCw3IEBACi0gCXJldHVybiBlcnJvcjsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2xzZWVrKHVuc2lnbmVkIGludCBmZCwgb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgb3JpZ2luKQotK2FzbWxpbmthZ2UgaW50IHN5c19sc2Vlayh1bnNpZ25lZCBpbnQgZmQsIG9mZl90IG9mZnNldCwgdW5zaWduZWQgaW50IG9yaWdpbikKLSB7Ci0gCXN0cnVjdCBmaWxlICogZmlsZTsKLSAJaW50IHRtcCA9IC0xOwotQEAgLTY3LDcgKzY3LDcgQEAKLSAJcmV0dXJuIGZpbGUtPmZfcG9zOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfcmVhZCh1bnNpZ25lZCBpbnQgZmQsY2hhciAqIGJ1Zix1bnNpZ25lZCBpbnQgY291bnQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3JlYWQodW5zaWduZWQgaW50IGZkLGNoYXIgKiBidWYsdW5zaWduZWQgaW50IGNvdW50KQotIHsKLSAJaW50IGVycm9yOwotIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7Ci1AQCAtODcsNyArODcsNyBAQAotIAlyZXR1cm4gZmlsZS0+Zl9vcC0+cmVhZChpbm9kZSxmaWxlLGJ1Zixjb3VudCk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c193cml0ZSh1bnNpZ25lZCBpbnQgZmQsY2hhciAqIGJ1Zix1bnNpZ25lZCBpbnQgY291bnQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3dyaXRlKHVuc2lnbmVkIGludCBmZCxjaGFyICogYnVmLHVuc2lnbmVkIGludCBjb3VudCkKLSB7Ci0gCWludCBlcnJvcjsKLSAJc3RydWN0IGZpbGUgKiBmaWxlOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvZnMvc2VsZWN0LmMgbGludXgvZnMvc2VsZWN0LmMKLS0tLSBwbDEyL2xpbnV4L2ZzL3NlbGVjdC5jCU1vbiBBdWcgIDkgMTg6MDI6MzAgMTk5MwotKysrIGxpbnV4L2ZzL3NlbGVjdC5jCVNhdCBTZXAgIDQgMDM6MzY6MzAgMTk5MwotQEAgLTE5Miw3ICsxOTIsNyBAQAotICAqIFVwZGF0ZTogRVJFU1RBUlRTWVMgYnJlYWtzIGF0IGxlYXN0IHRoZSB4dmlldyBjbG9jayBiaW5hcnksIHNvCi0gICogSSdtIHRyeWluZyBFUkVTVEFSVE5PSEFORCB3aGljaCByZXN0YXJ0IG9ubHkgd2hlbiB5b3Ugd2FudCB0by4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfc2VsZWN0KCB1bnNpZ25lZCBsb25nICpidWZmZXIgKQotK2FzbWxpbmthZ2UgaW50IHN5c19zZWxlY3QoIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlciApCi0gewotIC8qIFBlcmZvcm0gdGhlIHNlbGVjdChuZCwgaW4sIG91dCwgZXgsIHR2KSBzeXN0ZW0gY2FsbC4gKi8KLSAJaW50IGk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9mcy9zdGF0LmMgbGludXgvZnMvc3RhdC5jCi0tLS0gcGwxMi9saW51eC9mcy9zdGF0LmMJU2F0IEp1bCAgMyAwMTowNDoyNiAxOTkzCi0rKysgbGludXgvZnMvc3RhdC5jCVNhdCBTZXAgIDQgMDM6MzY6MzAgMTk5MwotQEAgLTg2LDcgKzg2LDcgQEAKLSAJbWVtY3B5X3RvZnMoc3RhdGJ1ZiwmdG1wLHNpemVvZih0bXApKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3N0YXQoY2hhciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgb2xkX3N0YXQgKiBzdGF0YnVmKQotK2FzbWxpbmthZ2UgaW50IHN5c19zdGF0KGNoYXIgKiBmaWxlbmFtZSwgc3RydWN0IG9sZF9zdGF0ICogc3RhdGJ1ZikKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlpbnQgZXJyb3I7Ci1AQCAtMTAyLDcgKzEwMiw3IEBACi0gCXJldHVybiAwOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfbmV3c3RhdChjaGFyICogZmlsZW5hbWUsIHN0cnVjdCBuZXdfc3RhdCAqIHN0YXRidWYpCi0rYXNtbGlua2FnZSBpbnQgc3lzX25ld3N0YXQoY2hhciAqIGZpbGVuYW1lLCBzdHJ1Y3QgbmV3X3N0YXQgKiBzdGF0YnVmKQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCWludCBlcnJvcjsKLUBAIC0xMTgsNyArMTE4LDcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19sc3RhdChjaGFyICogZmlsZW5hbWUsIHN0cnVjdCBvbGRfc3RhdCAqIHN0YXRidWYpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2xzdGF0KGNoYXIgKiBmaWxlbmFtZSwgc3RydWN0IG9sZF9zdGF0ICogc3RhdGJ1ZikKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlpbnQgZXJyb3I7Ci1AQCAtMTM0LDcgKzEzNCw3IEBACi0gCXJldHVybiAwOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfbmV3bHN0YXQoY2hhciAqIGZpbGVuYW1lLCBzdHJ1Y3QgbmV3X3N0YXQgKiBzdGF0YnVmKQotK2FzbWxpbmthZ2UgaW50IHN5c19uZXdsc3RhdChjaGFyICogZmlsZW5hbWUsIHN0cnVjdCBuZXdfc3RhdCAqIHN0YXRidWYpCi0gewotIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAJaW50IGVycm9yOwotQEAgLTE1MCw3ICsxNTAsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2ZzdGF0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IG9sZF9zdGF0ICogc3RhdGJ1ZikKLSthc21saW5rYWdlIGludCBzeXNfZnN0YXQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgb2xkX3N0YXQgKiBzdGF0YnVmKQotIHsKLSAJc3RydWN0IGZpbGUgKiBmOwotIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLUBAIC0xNjUsNyArMTY1LDcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19uZXdmc3RhdCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBuZXdfc3RhdCAqIHN0YXRidWYpCi0rYXNtbGlua2FnZSBpbnQgc3lzX25ld2ZzdGF0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IG5ld19zdGF0ICogc3RhdGJ1ZikKLSB7Ci0gCXN0cnVjdCBmaWxlICogZjsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci1AQCAtMTgwLDcgKzE4MCw3IEBACi0gCXJldHVybiAwOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfcmVhZGxpbmsoY29uc3QgY2hhciAqIHBhdGgsIGNoYXIgKiBidWYsIGludCBidWZzaXopCi0rYXNtbGlua2FnZSBpbnQgc3lzX3JlYWRsaW5rKGNvbnN0IGNoYXIgKiBwYXRoLCBjaGFyICogYnVmLCBpbnQgYnVmc2l6KQotIHsKLSAJc3RydWN0IGlub2RlICogaW5vZGU7Ci0gCWludCBlcnJvcjsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2ZzL3N1cGVyLmMgbGludXgvZnMvc3VwZXIuYwotLS0tIHBsMTIvbGludXgvZnMvc3VwZXIuYwlXZWQgQXVnIDExIDIwOjU2OjA1IDE5OTMKLSsrKyBsaW51eC9mcy9zdXBlci5jCVNhdCBTZXAgIDQgMDM6MzY6MzAgMTk5MwotQEAgLTI0Myw3ICsyNDMsNyBAQAotICAqIGZ1bmN0aW9ucywgdGhleSBzaG91bGQgYmUgZmFrZWQgaGVyZS4gIC0tIGpycwotICAqLwotIAotLWV4dGVybiAiQyIgaW50IHN5c191bW91bnQoY2hhciAqIG5hbWUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3Vtb3VudChjaGFyICogbmFtZSkKLSB7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotIAlkZXZfdCBkZXY7Ci1AQCAtMzkwLDcgKzM5MCw3IEBACi0gICogaXNuJ3QgcHJlc2VudCwgdGhlIGZsYWdzIGFuZCBkYXRhIGluZm8gaXNuJ3QgdXNlZCwgYXMgdGhlIHN5c2NhbGwgYXNzdW1lcyB3ZQotICAqIGFyZSB0YWxraW5nIHRvIGFuIG9sZGVyIHZlcnNpb24gdGhhdCBkaWRuJ3QgdW5kZXJzdGFuZCB0aGVtLgotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19tb3VudChjaGFyICogZGV2X25hbWUsIGNoYXIgKiBkaXJfbmFtZSwgY2hhciAqIHR5cGUsCi0rYXNtbGlua2FnZSBpbnQgc3lzX21vdW50KGNoYXIgKiBkZXZfbmFtZSwgY2hhciAqIGRpcl9uYW1lLCBjaGFyICogdHlwZSwKLSAJdW5zaWduZWQgbG9uZyBuZXdfZmxhZ3MsIHZvaWQgKiBkYXRhKQotIHsKLSAJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiBmc3R5cGU7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9pYmNzL2VtdWxhdGUuYyBsaW51eC9pYmNzL2VtdWxhdGUuYwotLS0tIHBsMTIvbGludXgvaWJjcy9lbXVsYXRlLmMJU2F0IEp1bCAgMyAwMDozNjozMSAxOTkzCi0rKysgbGludXgvaWJjcy9lbXVsYXRlLmMJU2F0IFNlcCAgNCAxNDoyOTozNCAxOTkzCi1AQCAtMjAsNyArMjAsNyBAQAotICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIGlBQklfZW11bGF0ZShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCi0rYXNtbGlua2FnZSB2b2lkIGlBQklfZW11bGF0ZShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCi0gewotIAlwcmludGsoImxjYWxsIDcseHh4OiBlYXggPSAlMDh4XG4iLHJlZ3MtPmVheCk7Ci0gfQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaW5jbHVkZS9hc20vaXJxLmggbGludXgvaW5jbHVkZS9hc20vaXJxLmgKLS0tLSBwbDEyL2xpbnV4L2luY2x1ZGUvYXNtL2lycS5oCVN1biBKdWwgMTggMTc6MTk6MjQgMTk5MwotKysrIGxpbnV4L2luY2x1ZGUvYXNtL2lycS5oCVNhdCBTZXAgIDQgMDM6MDA6MjQgMTk5MwotQEAgLTgsNiArOCw4IEBACi0gICovCi0gCi0gI2luY2x1ZGUgPGxpbnV4L3NlZ21lbnQuaD4KLSsjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotKwotICNkZWZpbmUgX19TVFIoeCkgI3gKLSAjZGVmaW5lIFNUUih4KSBfX1NUUih4KQotICAKLUBAIC0xMTcsOSArMTE5LDkgQEAKLSAjZGVmaW5lIEJBRF9JUlFfTkFNRShucikgSVJRX05BTUUyKGJhZF9JUlEjI25yKQotIAkKLSAjZGVmaW5lIEJVSUxEX0lSUShjaGlwLG5yLG1hc2spIFwKLS1leHRlcm4gIkMiIHZvaWQgSVJRX05BTUUobnIpOyBcCi0tZXh0ZXJuICJDIiB2b2lkIEZBU1RfSVJRX05BTUUobnIpOyBcCi0tZXh0ZXJuICJDIiB2b2lkIEJBRF9JUlFfTkFNRShucik7IFwKLSthc21saW5rYWdlIHZvaWQgSVJRX05BTUUobnIpOyBcCi0rYXNtbGlua2FnZSB2b2lkIEZBU1RfSVJRX05BTUUobnIpOyBcCi0rYXNtbGlua2FnZSB2b2lkIEJBRF9JUlFfTkFNRShucik7IFwKLSBfX2FzbV9fKCBcCi0gIlxuLmFsaWduIDRcbiIgXAotICJfSVJRIiAjbnIgIl9pbnRlcnJ1cHQ6XG5cdCIgXAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaW5jbHVkZS9hc20vc2VnbWVudC5oIGxpbnV4L2luY2x1ZGUvYXNtL3NlZ21lbnQuaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9hc20vc2VnbWVudC5oCU1vbiBBdWcgIDIgMTQ6MzE6MjggMTk5MwotKysrIGxpbnV4L2luY2x1ZGUvYXNtL3NlZ21lbnQuaAlTYXQgU2VwICA0IDAzOjAyOjU2IDE5OTMKLUBAIC0xLDcgKzEsNyBAQAotICNpZm5kZWYgX0FTTV9TRUdNRU5UX0gKLSAjZGVmaW5lIF9BU01fU0VHTUVOVF9ICi0gCi0tc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGdldF9mc19ieXRlKGNvbnN0IGNoYXIgKiBhZGRyKQotK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBnZXRfdXNlcl9ieXRlKGNvbnN0IGNoYXIgKiBhZGRyKQotIHsKLSAJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBfdjsKLSAKLUBAIC05LDIzICs5LDkgQEAKLSAJcmV0dXJuIF92OwotIH0KLSAKLS1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X2ZzX2J5dGUoY29uc3QgdW5zaWduZWQgY2hhciAqIGFkZHIpCi0tewotLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIF92OwotLQotLQlfX2FzbV9fICgibW92YiAlJWZzOiUxLCUwIjoiPXEiIChfdik6Im0iICgqYWRkcikpOwotLQlyZXR1cm4gX3Y7Ci0tfQotLQotLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2ZzX3dvcmQoY29uc3Qgc2hvcnQgKmFkZHIpCi0tewotLQl1bnNpZ25lZCBzaG9ydCBfdjsKLS0KLS0JX19hc21fXyAoIm1vdncgJSVmczolMSwlMCI6Ij1yIiAoX3YpOiJtIiAoKmFkZHIpKTsKLS0JcmV0dXJuIF92OwotLX0KLSsjZGVmaW5lIGdldF9mc19ieXRlKGFkZHIpIGdldF91c2VyX2J5dGUoKGNoYXIgKikoYWRkcikpCi0gCi0tc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfZnNfd29yZChjb25zdCB1bnNpZ25lZCBzaG9ydCAqYWRkcikKLStzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF91c2VyX3dvcmQoY29uc3Qgc2hvcnQgKmFkZHIpCi0gewotIAl1bnNpZ25lZCBzaG9ydCBfdjsKLSAKLUBAIC0zMywzMSArMTksOSBAQAotIAlyZXR1cm4gX3Y7Ci0gfQotIAotLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZnNfbG9uZyhjb25zdCBpbnQgKmFkZHIpCi0tewotLQl1bnNpZ25lZCBsb25nIF92OwotLQotLQlfX2FzbV9fICgibW92bCAlJWZzOiUxLCUwIjoiPXIiIChfdik6Im0iICgqYWRkcikpOyBcCi0tCXJldHVybiBfdjsKLS19Ci0tCi0tc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9mc19sb25nKGNvbnN0IHVuc2lnbmVkIGludCAqYWRkcikKLS17Ci0tCXVuc2lnbmVkIGxvbmcgX3Y7Ci0tCi0tCV9fYXNtX18gKCJtb3ZsICUlZnM6JTEsJTAiOiI9ciIgKF92KToibSIgKCphZGRyKSk7IFwKLS0JcmV0dXJuIF92OwotLX0KLS0KLS1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2ZzX2xvbmcoY29uc3QgbG9uZyAqYWRkcikKLS17Ci0tCXVuc2lnbmVkIGxvbmcgX3Y7Ci0tCi0tCV9fYXNtX18gKCJtb3ZsICUlZnM6JTEsJTAiOiI9ciIgKF92KToibSIgKCphZGRyKSk7IFwKLS0JcmV0dXJuIF92OwotLX0KLSsjZGVmaW5lIGdldF9mc193b3JkKGFkZHIpIGdldF91c2VyX3dvcmQoKHNob3J0ICopKGFkZHIpKQotIAotLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZnNfbG9uZyhjb25zdCB1bnNpZ25lZCBsb25nICphZGRyKQotK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdXNlcl9sb25nKGNvbnN0IGludCAqYWRkcikKLSB7Ci0gCXVuc2lnbmVkIGxvbmcgX3Y7Ci0gCi1AQCAtNjUsNDUgKzI5LDI4IEBACi0gCXJldHVybiBfdjsKLSB9Ci0gCi0tc3RhdGljIGlubGluZSB2b2lkIHB1dF9mc19ieXRlKGNoYXIgdmFsLGNoYXIgKmFkZHIpCi0tewotLV9fYXNtX18gKCJtb3ZiICUwLCUlZnM6JTEiOiAvKiBubyBvdXRwdXRzICovIDoiaXEiICh2YWwpLCJtIiAoKmFkZHIpKTsKLS19Ci0rI2RlZmluZSBnZXRfZnNfbG9uZyhhZGRyKSBnZXRfdXNlcl9sb25nKChpbnQgKikoYWRkcikpCi0gCi0tc3RhdGljIGlubGluZSB2b2lkIHB1dF9mc19ieXRlKGNoYXIgdmFsLHVuc2lnbmVkIGNoYXIgKmFkZHIpCi0rc3RhdGljIGlubGluZSB2b2lkIHB1dF91c2VyX2J5dGUoY2hhciB2YWwsY2hhciAqYWRkcikKLSB7Ci0gX19hc21fXyAoIm1vdmIgJTAsJSVmczolMSI6IC8qIG5vIG91dHB1dHMgKi8gOiJpcSIgKHZhbCksIm0iICgqYWRkcikpOwotIH0KLSAKLS1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZzX3dvcmQoc2hvcnQgdmFsLHNob3J0ICogYWRkcikKLS17Ci0tX19hc21fXyAoIm1vdncgJTAsJSVmczolMSI6IC8qIG5vIG91dHB1dHMgKi8gOiJpciIgKHZhbCksIm0iICgqYWRkcikpOwotLX0KLSsjZGVmaW5lIHB1dF9mc19ieXRlKHgsYWRkcikgcHV0X3VzZXJfYnl0ZSgoeCksKGNoYXIgKikoYWRkcikpCi0gCi0tc3RhdGljIGlubGluZSB2b2lkIHB1dF9mc193b3JkKHNob3J0IHZhbCx1bnNpZ25lZCBzaG9ydCAqIGFkZHIpCi0rc3RhdGljIGlubGluZSB2b2lkIHB1dF91c2VyX3dvcmQoc2hvcnQgdmFsLHNob3J0ICogYWRkcikKLSB7Ci0gX19hc21fXyAoIm1vdncgJTAsJSVmczolMSI6IC8qIG5vIG91dHB1dHMgKi8gOiJpciIgKHZhbCksIm0iICgqYWRkcikpOwotIH0KLSAKLS1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZzX2xvbmcodW5zaWduZWQgbG9uZyB2YWwsaW50ICogYWRkcikKLS17Ci0tX19hc21fXyAoIm1vdmwgJTAsJSVmczolMSI6IC8qIG5vIG91dHB1dHMgKi8gOiJpciIgKHZhbCksIm0iICgqYWRkcikpOwotLX0KLS0KLS1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZzX2xvbmcodW5zaWduZWQgbG9uZyB2YWwsdW5zaWduZWQgaW50ICogYWRkcikKLS17Ci0tX19hc21fXyAoIm1vdmwgJTAsJSVmczolMSI6IC8qIG5vIG91dHB1dHMgKi8gOiJpciIgKHZhbCksIm0iICgqYWRkcikpOwotLX0KLSsjZGVmaW5lIHB1dF9mc193b3JkKHgsYWRkcikgcHV0X3VzZXJfd29yZCgoeCksKHNob3J0ICopKGFkZHIpKQotIAotLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZnNfbG9uZyh1bnNpZ25lZCBsb25nIHZhbCxsb25nICogYWRkcikKLStzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3VzZXJfbG9uZyh1bnNpZ25lZCBsb25nIHZhbCxpbnQgKiBhZGRyKQotIHsKLSBfX2FzbV9fICgibW92bCAlMCwlJWZzOiUxIjogLyogbm8gb3V0cHV0cyAqLyA6ImlyIiAodmFsKSwibSIgKCphZGRyKSk7Ci0gfQotIAotLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZnNfbG9uZyh1bnNpZ25lZCBsb25nIHZhbCx1bnNpZ25lZCBsb25nICogYWRkcikKLS17Ci0tX19hc21fXyAoIm1vdmwgJTAsJSVmczolMSI6IC8qIG5vIG91dHB1dHMgKi8gOiJpciIgKHZhbCksIm0iICgqYWRkcikpOwotLX0KLSsjZGVmaW5lIHB1dF9mc19sb25nKHgsYWRkcikgcHV0X3VzZXJfbG9uZygoeCksKGludCAqKShhZGRyKSkKLSAKLSBzdGF0aWMgaW5saW5lIHZvaWQgbWVtY3B5X3RvZnModm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgdW5zaWduZWQgbG9uZyBuKQotIHsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvYS5vdXQuaCBsaW51eC9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKLS0tLSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvYS5vdXQuaAlNb24gQXVnICA5IDE3OjQxOjIzIDE5OTMKLSsrKyBsaW51eC9pbmNsdWRlL2xpbnV4L2Eub3V0LmgJRnJpIEF1ZyAyMCAwODo1OTozMSAxOTkzCi1AQCAtNzEsMjQgKzcxLDI2IEBACi0gI2RlZmluZSBOTUFHSUMgMDQxMAotIC8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0gI2RlZmluZSBaTUFHSUMgMDQxMwotKy8qIFRoaXMgaW5kaWNhdGVzIGEgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUgd2l0aCB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAKLSsgICBUaGUgZmlyc3QgcGFnZSBpcyB1bm1hcHBlZCB0byBoZWxwIHRyYXAgTlVMTCBwb2ludGVyIHJlZmVyZW5jZXMgKi8KLSsjZGVmaW5lIFFNQUdJQyAwMzE0Ci0gCi0gLyogQ29kZSBpbmRpY2F0aW5nIGNvcmUgZmlsZS4gICovCi0gI2RlZmluZSBDTUFHSUMgMDQyMQotKwotICNpZiAhZGVmaW5lZCAoTl9CQURNQUcpCi0tI2RlZmluZSBOX0JBRE1BRyh4KQkJCQkJXAotLSAoTl9NQUdJQyh4KSAhPSBPTUFHSUMgJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLS0gICYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQotKyNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLSsJCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotKyAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgXAotKwkJICAgICAgICAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKLSAjZW5kaWYKLSAKLS0jZGVmaW5lIF9OX0JBRE1BRyh4KQkJCQkJXAotLSAoTl9NQUdJQyh4KSAhPSBPTUFHSUMgJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLS0gICYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDKQotLQotICNkZWZpbmUgX05fSERST0ZGKHgpICgxMDI0IC0gc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCi0gCi0gI2lmICFkZWZpbmVkIChOX1RYVE9GRikKLSAjZGVmaW5lIE5fVFhUT0ZGKHgpIFwKLS0gKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gX05fSERST0ZGKCh4KSkgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6IHNpemVvZiAoc3RydWN0IGV4ZWMpKQotKyAoTl9NQUdJQyh4KSA9PSBaTUFHSUMgPyBfTl9IRFJPRkYoKHgpKSArIHNpemVvZiAoc3RydWN0IGV4ZWMpIDogXAotKyAgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gMCA6IHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLSAjZW5kaWYKLSAKLSAjaWYgIWRlZmluZWQgKE5fREFUT0ZGKQotQEAgLTExMyw3ICsxMTUsNyBAQAotIAotIC8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotICNpZiAhZGVmaW5lZCAoTl9UWFRBRERSKQotLSNkZWZpbmUgTl9UWFRBRERSKHgpIDAKLSsjZGVmaW5lIE5fVFhUQUREUih4KSAoTl9NQUdJQyh4KSA9PSBRTUFHSUMgPyBQQUdFX1NJWkUgOiAwKQotICNlbmRpZgotIAotIC8qIEFkZHJlc3Mgb2YgZGF0YSBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBsaW51eC9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgJRnJpIEF1ZyAgNiAxMzozMjowMCAxOTkzCi0rKysgbGludXgvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgJU2F0IFNlcCAgNCAwMzozOTo1MSAxOTkzCi1AQCAtMSw2ICsxLDggQEAKLSAjaWZuZGVmIF9MSU5VWF9CSU5GTVRTX0gKLSAjZGVmaW5lIF9MSU5VWF9CSU5GTVRTX0gKLSAKLSsjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0rCi0gLyoKLSAgKiBNQVhfQVJHX1BBR0VTIGRlZmluZXMgdGhlIG51bWJlciBvZiBwYWdlcyBhbGxvY2F0ZWQgZm9yIGFyZ3VtZW50cwotICAqIGFuZCBlbnZlbG9wZSBmb3IgdGhlIG5ldyBwcm9ncmFtLiAzMiBzaG91bGQgc3VmZmljZSwgdGhpcyBnaXZlcwotQEAgLTE1LDYgKzE3LDcgQEAKLSAgIGNoYXIgYnVmWzEyOF07Ci0gICB1bnNpZ25lZCBsb25nIHBhZ2VbTUFYX0FSR19QQUdFU107Ci0gICB1bnNpZ25lZCBsb25nIHA7Ci0rICBpbnQgc2hfYmFuZzsKLSAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgaW50IGVfdWlkLCBlX2dpZDsKLSAgIGludCBhcmdjLCBlbnZjOwotQEAgLTMxLDYgKzM0LDE1IEBACi0gCi0gZXh0ZXJuIHN0cnVjdCBsaW51eF9iaW5mbXQgZm9ybWF0c1tdOwotIAotK2V4dGVybiBpbnQgcmVhZF9leGVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotKwljaGFyICogYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0rCi0rZXh0ZXJuIGludCBvcGVuX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgbW9kZSk7Ci0gCi0rZXh0ZXJuIHZvaWQgZmx1c2hfb2xkX2V4ZWMoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0pOwotK2V4dGVybiB1bnNpZ25lZCBsb25nIGNoYW5nZV9sZHQodW5zaWduZWQgbG9uZyB0ZXh0X3NpemUsdW5zaWduZWQgbG9uZyAqIHBhZ2UpOwotK2V4dGVybiB1bnNpZ25lZCBsb25nICogY3JlYXRlX3RhYmxlcyhjaGFyICogcCxpbnQgYXJnYyxpbnQgZW52Yyk7Ci0rZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV9zdHJpbmdzKGludCBhcmdjLGNoYXIgKiogYXJndix1bnNpZ25lZCBsb25nICpwYWdlLAotKwkJdW5zaWduZWQgbG9uZyBwLCBpbnQgZnJvbV9rbWVtKTsKLSAKLSAjZW5kaWYKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvZWxmLmggbGludXgvaW5jbHVkZS9saW51eC9lbGYuaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9lbGYuaAotKysrIGxpbnV4L2luY2x1ZGUvbGludXgvZWxmLmgJU2F0IFNlcCAgNCAwMTo0ODoyMCAxOTkzCi1AQCAtMCwwICsxLDE1MyBAQAotKyNpZm5kZWYgX0VMRl9ICi0rI2RlZmluZSBfRUxGX0gKLSsKLSsvKiBUSGVzZSBjb25zdGFudHMgYXJlIGZvciB0aGUgc2VnbWVudCB0eXBlcyBzdG9yZWQgaW4gdGhlIGltYWdlIGhlYWRlcnMgKi8KLSsjZGVmaW5lIFBUX05VTEwgICAgMAotKyNkZWZpbmUgUFRfTE9BRCAgICAxCi0rI2RlZmluZSBQVF9EWU5BTUlDIDIKLSsjZGVmaW5lIFBUX0lOVEVSUCAgMwotKyNkZWZpbmUgUFRfTk9URSAgICA0Ci0rI2RlZmluZSBQVF9TSExJQiAgIDUKLSsjZGVmaW5lIFBUX1BIRFIgICAgNgotKyNkZWZpbmUgUFRfTE9QUk9DICAweDcwMDAwMDAwCi0rI2RlZmluZSBQVF9ISVBST0MgIDB4N2ZmZmZmZmYKLSsKLSsvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBkaWZmZXJlbnQgZWxmIGZpbGUgdHlwZXMgKi8KLSsjZGVmaW5lIEVUX05PTkUgICAwCi0rI2RlZmluZSBFVF9SRUwgICAgMQotKyNkZWZpbmUgRVRfRVhFQyAgIDIKLSsjZGVmaW5lIEVUX0RZTiAgICAzCi0rI2RlZmluZSBFVF9DT1JFICAgNAotKyNkZWZpbmUgRVRfTE9QUk9DIDUKLSsjZGVmaW5lIEVUX0hJUFJPQyA2Ci0rCi0rLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgdmFyaW91cyBFTEYgdGFyZ2V0IG1hY2hpbmVzICovCi0rI2RlZmluZSBFTV9OT05FICAwCi0rI2RlZmluZSBFTV9NMzIgICAxCi0rI2RlZmluZSBFTV9TUEFSQyAyCi0rI2RlZmluZSBFTV8zODYgICAzCi0rI2RlZmluZSBFTV82OEsgICA0Ci0rI2RlZmluZSBFTV84OEsgICA1Ci0rI2RlZmluZSBFTV80ODYgICA2ICAgLyogUGVyaGFwcyBkaXN1c2VkICovCi0rI2RlZmluZSBFTV84NjAgICA3Ci0rCi0rLyogVGhpcyBpcyB0aGUgaW5mbyB0aGF0IGlzIG5lZWRlZCB0byBwYXJzZSB0aGUgZHluYW1pYyBzZWN0aW9uIG9mIHRoZSBmaWxlICovCi0rI2RlZmluZSBEVF9OVUxMCQkwCi0rI2RlZmluZSBEVF9ORUVERUQJMQotKyNkZWZpbmUgRFRfUExUUkVMU1oJMgotKyNkZWZpbmUgRFRfUExUR09UCTMKLSsjZGVmaW5lIERUX0hBU0gJCTQKLSsjZGVmaW5lIERUX1NUUlRBQgk1Ci0rI2RlZmluZSBEVF9TWU1UQUIJNgotKyNkZWZpbmUgRFRfUkVMQQkJNwotKyNkZWZpbmUgRFRfUkVMQVNaCTgKLSsjZGVmaW5lIERUX1JFTEFFTlQJOQotKyNkZWZpbmUgRFRfU1RSU1oJMTAKLSsjZGVmaW5lIERUX1NZTUVOVAkxMQotKyNkZWZpbmUgRFRfSU5JVAkJMTIKLSsjZGVmaW5lIERUX0ZJTkkJCTEzCi0rI2RlZmluZSBEVF9TT05BTUUJMTQKLSsjZGVmaW5lIERUX1JQQVRIIAkxNQotKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKLSsjZGVmaW5lIERUX1JFTAkgICAgICAgIDE3Ci0rI2RlZmluZSBEVF9SRUxTWgkxOAotKyNkZWZpbmUgRFRfUkVMRU5UCTE5Ci0rI2RlZmluZSBEVF9QTFRSRUwJMjAKLSsjZGVmaW5lIERUX0RFQlVHCTIxCi0rI2RlZmluZSBEVF9URVhUUkVMCTIyCi0rI2RlZmluZSBEVF9KTVBSRUwJMjMKLSsjZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCi0rI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgotKwotKy8qIFRoaXMgaW5mbyBpcyBuZWVkZWQgd2hlbiBwYXJzaW5nIHRoZSBzeW1ib2wgdGFibGUgKi8KLSsjZGVmaW5lIFNUQl9MT0NBTCAgMAotKyNkZWZpbmUgU1RCX0dMT0JBTCAxCi0rI2RlZmluZSBTVEJfV0VBSyAgIDIKLSsKLSsjZGVmaW5lIFNUVF9OT1RZUEUgIDAKLSsjZGVmaW5lIFNUVF9PQkpFQ1QgIDEKLSsjZGVmaW5lIFNUVF9GVU5DICAgIDIKLSsjZGVmaW5lIFNUVF9TRUNUSU9OIDMKLSsjZGVmaW5lIFNUVF9GSUxFICAgIDQKLSsKLSsjZGVmaW5lIEVMRjMyX1NUX0JJTkQoeCkgKCh4KSA+PiA0KQotKyNkZWZpbmUgRUxGMzJfU1RfVFlQRSh4KSAoKCh1bnNpZ25lZCBpbnQpIHgpICYgMHhmKQotKwotKwotKwotK3N0cnVjdCBkeW5hbWljewotKyAgaW50IGRfdGFnOwotKyAgdW5pb257Ci0rICAgIGludCBkX3ZhbDsKLSsgICAgY2hhciAqIGRfcHRyOwotKyAgfSBkX3VuOwotK307Ci0rCi0rLyogVEhlIGZvbGxvd2luZyBhcmUgdXNlZCB3aXRoIHJlbG9jYXRpb25zICovCi0rI2RlZmluZSBFTEYzMl9SX1NZTSh4KSAoKHgpID4+IDgpCi0rI2RlZmluZSBFTEYzMl9SX1RZUEUoeCkgKCh4KSAmIDB4ZmYpCi0rCi0rI2RlZmluZSBSXzM4Nl9OT05FCTAKLSsjZGVmaW5lIFJfMzg2XzMyCTEKLSsjZGVmaW5lIFJfMzg2X1BDMzIJMgotKyNkZWZpbmUgUl8zODZfR09UMzIJMwotKyNkZWZpbmUgUl8zODZfUExUMzIJNAotKyNkZWZpbmUgUl8zODZfQ09QWQk1Ci0rI2RlZmluZSBSXzM4Nl9HTE9CX0RBVAk2Ci0rI2RlZmluZSBSXzM4Nl9KTVBfU0xPVAk3Ci0rI2RlZmluZSBSXzM4Nl9SRUxBVElWRQk4Ci0rI2RlZmluZSBSXzM4Nl9HT1RPRkYJOQotKyNkZWZpbmUgUl8zODZfR09UUEMJMTAKLSsjZGVmaW5lIFJfMzg2X05VTQkxMQotKwotK3N0cnVjdCBFbGYzMl9SZWx7Ci0rICB1bnNpZ25lZCBpbnQgKiBvZmZzZXQ7Ci0rICBpbnQgaW5mbzsKLSt9OwotKwotK3N0cnVjdCBFbGYzMl9SZWxhewotKyAgdW5zaWduZWQgaW50ICogb2Zmc2V0OwotKyAgaW50IGluZm87Ci0rICBpbnQgYWRkZW5kOwotK307Ci0rCi0rc3RydWN0IEVsZjMyX1N5bXsKLSsgIGludCBzdF9uYW1lOwotKyAgdW5zaWduZWQgaW50IHN0X3ZhbHVlOwotKyAgaW50IHN0X3NpemU7Ci0rICB1bnNpZ25lZCBjaGFyIHN0X2luZm87Ci0rICB1bnNpZ25lZCBjaGFyIHN0X290aGVyOwotKyAgc2hvcnQgaW50IHN0X3NobmR4OwotK307Ci0rCi0rc3RydWN0IGVsZmhkcnsKLSsgIGNoYXIJZV9pZGVudFsxNl07Ci0rICBzaG9ydCBpbnQgZV90eXBlOwotKyAgc2hvcnQgaW50IGVfbWFjaGluZTsKLSsgIGludCAgIGVfdmVyc2lvbjsKLSsgIGNoYXIgKmVfZW50cnk7ICAvKiBFbnRyeSBwb2ludCAqLwotKyAgaW50ICAgZV9waG9mZjsKLSsgIGludCAgIGVfc2hvZmY7Ci0rICBpbnQgICBlX2ZsYWdzOwotKyAgc2hvcnQgaW50IGVfZWhzaXplOwotKyAgc2hvcnQgaW50IGVfcGhlbnRzaXplOwotKyAgc2hvcnQgaW50IGVfcGhudW07Ci0rICBzaG9ydCBpbnQgZV9zaGVudHNpemU7Ci0rICBzaG9ydCBpbnQgZV9zaG51bTsKLSsgIHNob3J0IGludCBlX3Noc3RybmR4OwotK307Ci0rCi0rc3RydWN0IGVsZl9waGRyewotKyAgaW50IHBfdHlwZTsKLSsgIGludCBwX29mZnNldDsKLSsgIGludCBwX3ZhZGRyOwotKyAgaW50IHBfcGFkZHI7Ci0rICBpbnQgcF9maWxlc3o7Ci0rICBpbnQgcF9tZW1zejsKLSsgIGludCBwX2ZsYWdzOwotKyAgaW50IHBfYWxpZ247Ci0rfTsKLSsKLSsjZGVmaW5lIEVMRl9TVEFSVF9NTUFQIDB4ODAwMDAwMDAKLSsKLSsjZW5kaWYKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvZnMuaCBsaW51eC9pbmNsdWRlL2xpbnV4L2ZzLmgKLS0tLSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvZnMuaAlXZWQgQXVnIDExIDIyOjUyOjQ1IDE5OTMKLSsrKyBsaW51eC9pbmNsdWRlL2xpbnV4L2ZzLmgJU2F0IFNlcCAgNCAwMjo1NToxOCAxOTkzCi1AQCAtNiw2ICs2LDcgQEAKLSAgKiBzdHJ1Y3R1cmVzIGV0Yy4KLSAgKi8KLSAKLSsjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KLSAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotQEAgLTMxOSw4ICszMjAsOCBAQAotIAotICNpZmRlZiBfX0tFUk5FTF9fCi0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIGludCk7Ci0tZXh0ZXJuICJDIiBpbnQgc3lzX2Nsb3NlKHVuc2lnbmVkIGludCk7CQkvKiB5ZXMsIGl0J3MgcmVhbGx5IHVuc2lnbmVkICovCi0rYXNtbGlua2FnZSBpbnQgc3lzX29wZW4oY29uc3QgY2hhciAqLCBpbnQsIGludCk7Ci0rYXNtbGlua2FnZSBpbnQgc3lzX2Nsb3NlKHVuc2lnbmVkIGludCk7CQkvKiB5ZXMsIGl0J3MgcmVhbGx5IHVuc2lnbmVkICovCi0gCi0gZXh0ZXJuIGludCBnZXRuYW1lKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSwgY2hhciAqKnJlc3VsdCk7Ci0gZXh0ZXJuIHZvaWQgcHV0bmFtZShjaGFyICogbmFtZSk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGxpbnV4L2luY2x1ZGUvbGludXgvaW9wb3J0LmgKLS0tLSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvaW9wb3J0LmgKLSsrKyBsaW51eC9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCVdlZCBTZXAgIDEgMTc6Mzk6MzYgMTk5MwotQEAgLTAsMCArMSwyOCBAQAotKy8qCi0rICogcG9ydGlvLmgJRGVmaW5pdGlvbnMgb2Ygcm91dGluZXMgZm9yIGRldGVjdGluZywgcmVzZXJ2aW5nIGFuZAotKyAqCQlhbGxvY2F0aW5nIHN5c3RlbSByZXNvdXJjZXMuCi0rICoKLSsgKiBWZXJzaW9uOgkwLjAxCTgvMzAvOTMKLSsgKgotKyAqIEF1dGhvcjoJRG9uYWxkIEJlY2tlciAoYmVja2VyQHN1cGVyLm9yZykKLSsgKi8KLSsKLSsjaWZuZGVmIF9MSU5VWF9QT1JUSU9fSAotKyNkZWZpbmUgX0xJTlVYX1BPUlRJT19ICi0rCi0rI2RlZmluZSBIQVZFX1BPUlRSRVNFUlZFCi0rLyoKLSsgKiBDYWxsIGNoZWNrX3JlZ2lvbigpIGJlZm9yZSBwcm9iaW5nIGZvciB5b3VyIGhhcmR3YXJlLgotKyAqIE9uY2UgeW91IGhhdmUgZm91bmQgeW91IGhhcmR3YXJlLCByZWdpc3RlciBpdCB3aXRoIHNuYXJmX3JlZ2lvbigpLgotKyAqLwotK2V4dGVybiB2b2lkIHJlc2VydmVfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpOwotK2V4dGVybiBpbnQgY2hlY2tfcmVnaW9uKHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgZXh0ZW50KTsKLStleHRlcm4gdm9pZCBzbmFyZl9yZWdpb24odW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCBleHRlbnQpOwotKwotKwotKyNkZWZpbmUgSEFWRV9BVVRPSVJRCi0rZXh0ZXJuIHZvaWQgKmlycTJkZXZfbWFwWzE2XTsJCS8qIFVzZSBvbmx5IGlmIHlvdSBvd24gdGhlIElSUS4gKi8KLStleHRlcm4gdm9pZCBhdXRvaXJxX3NldHVwKGludCB3YWl0dGltZSk7Ci0rZXh0ZXJuIGludCBhdXRvaXJxX3JlcG9ydChpbnQgd2FpdHRpbWUpOwotKwotKyNlbmRpZgkvKiBfTElOVVhfUE9SVElPX0ggKi8KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgva2VybmVsLmggbGludXgvaW5jbHVkZS9saW51eC9rZXJuZWwuaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9rZXJuZWwuaAlNb24gQXVnICA5IDE4OjAyOjMwIDE5OTMKLSsrKyBsaW51eC9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCVNhdCBTZXAgIDQgMDI6NTY6NDYgMTk5MwotQEAgLTgsNiArOCw3IEBACi0gI2lmZGVmIF9fS0VSTkVMX18KLSAKLSAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSAKLSAjZGVmaW5lIElOVF9NQVgJCSgoaW50KSh+MFU+PjEpKQotICNkZWZpbmUgVUlOVF9NQVgJKH4wVSkKLUBAIC0yNSw3ICsyNiw3IEBACi0gdW5zaWduZWQgbG9uZyBzaW1wbGVfc3RydG91bChjb25zdCBjaGFyICosY2hhciAqKix1bnNpZ25lZCBpbnQpOwotIGludCBzcHJpbnRmKGNoYXIgKiBidWYsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLik7Ci0gCi0tZXh0ZXJuICJDIiBpbnQgcHJpbnRrKGNvbnN0IGNoYXIgKiBmbXQsIC4uLik7Ci0rYXNtbGlua2FnZSBpbnQgcHJpbnRrKGNvbnN0IGNoYXIgKiBmbXQsIC4uLik7Ci0gCi0gI2lmZGVmIENPTkZJR19ERUJVR19NQUxMT0MKLSAjZGVmaW5lIGttYWxsb2MoYSxiKSBkZWJfa21hbGxvYyhfX0ZJTEVfXyxfX0xJTkVfXywgYSxiKQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9saW5rYWdlLmggbGludXgvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKLS0tLSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvbGlua2FnZS5oCi0rKysgbGludXgvaW5jbHVkZS9saW51eC9saW5rYWdlLmgJU2F0IFNlcCAgNCAwMjo1NjoxMCAxOTkzCi1AQCAtMCwwICsxLDEwIEBACi0rI2lmbmRlZiBfTElOVVhfTElOS0FHRV9ICi0rI2RlZmluZSBfTElOVVhfTElOS0FHRV9ICi0rCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0rI2RlZmluZSBhc21saW5rYWdlIGV4dGVybiAiQyIKLSsjZWxzZQotKyNkZWZpbmUgYXNtbGlua2FnZQotKyNlbmRpZgotKwotKyNlbmRpZgotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9wYWdlLmggbGludXgvaW5jbHVkZS9saW51eC9wYWdlLmgKLS0tLSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvcGFnZS5oCU1vbiBBdWcgIDkgMTg6MDI6MzAgMTk5MwotKysrIGxpbnV4L2luY2x1ZGUvbGludXgvcGFnZS5oCVNhdCBTZXAgIDQgMDM6MDk6MDAgMTk5MwotQEAgLTI1LDcgKzI1LDcgQEAKLSAgICgodW5zaWduZWQgbG9uZykoYWRkcmVzcyk+PihQQUdFX1NISUZULVNJWkVPRl9QVFJfTE9HMikqMiZQVFJfTUFTSyZ+UEFHRV9NQVNLKSkpCi0gCQkJLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIHBhZ2UtdGFibGUgKi8KLSAjZGVmaW5lIFBBR0VfUFRSKGFkZHJlc3MpCQlcCi0tICAoKHVuc2lnbmVkIGxvbmcpKGFkZHJlc3MpPj5QQUdFX1NISUZULVNJWkVPRl9QVFJfTE9HMiZQVFJfTUFTSyZ+UEFHRV9NQVNLKQotKyAgKCh1bnNpZ25lZCBsb25nKShhZGRyZXNzKT4+KFBBR0VfU0hJRlQtU0laRU9GX1BUUl9MT0cyKSZQVFJfTUFTSyZ+UEFHRV9NQVNLKQotIAkJCS8qIHRoZSBuby4gb2YgcG9pbnRlcnMgdGhhdCBmaXQgb24gYSBwYWdlICovCi0gI2RlZmluZSBQVFJTX1BFUl9QQUdFCQkJKFBBR0VfU0laRS9zaXplb2Yodm9pZCopKQotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9zY2hlZC5oIGxpbnV4L2luY2x1ZGUvbGludXgvc2NoZWQuaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9zY2hlZC5oCVNhdCBBdWcgMTQgMTY6MDE6MjYgMTk5MwotKysrIGxpbnV4L2luY2x1ZGUvbGludXgvc2NoZWQuaAlTYXQgU2VwICA0IDAyOjQyOjM5IDE5OTMKLUBAIC04NSw3ICs4NSw3IEBACi0gZXh0ZXJuIHZvaWQgdHJhcF9pbml0KHZvaWQpOwotIGV4dGVybiB2b2lkIHBhbmljKGNvbnN0IGNoYXIgKiBzdHIpOwotIAotLWV4dGVybiAiQyIgdm9pZCBzY2hlZHVsZSh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgc2NoZWR1bGUodm9pZCk7Ci0gCi0gI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvc2htLmggbGludXgvaW5jbHVkZS9saW51eC9zaG0uaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9zaG0uaAlNb24gQXVnICA5IDE4OjAyOjMwIDE5OTMKLSsrKyBsaW51eC9pbmNsdWRlL2xpbnV4L3NobS5oCVN1biBBdWcgMjkgMjM6MjY6NTcgMTk5MwotQEAgLTYzLDExICs2MywxMSBAQAotICNkZWZpbmUgU0hNX0lEWF9NQVNLCSgoMTw8X1NITV9JRFhfQklUUyktMSkKLSAjZGVmaW5lIFNITV9SRUFEX09OTFkJKDE8PEJJVFNfUEVSX1BUUi0xKQotIAotLSNkZWZpbmUgU0hNTUFYICgxPDxQQUdFX1NISUZUK19TSE1fSURYX0JJVFMpCS8qIG1heCBzaGFyZWQgc2VnIHNpemUgKGJ5dGVzKSAqLwotLSNkZWZpbmUgU0hNTUlOIDEJIC8qIHJlYWxseSBQQUdFX1NJWkUgKi8JLyogbWluIHNoYXJlZCBzZWcgc2l6ZSAoYnl0ZXMpKi8KLSsjZGVmaW5lIFNITU1BWCAweDQwMDAwMAkJCQkvKiBtYXggc2hhcmVkIHNlZyBzaXplIChieXRlcykgKi8KLSsjZGVmaW5lIFNITU1JTiAxCSAvKiByZWFsbHkgUEFHRV9TSVpFICovCS8qIG1pbiBzaGFyZWQgc2VnIHNpemUgKGJ5dGVzKSAqLwotICNkZWZpbmUgU0hNTU5JICgxPDxfU0hNX0lEX0JJVFMpCQkvKiBtYXggbnVtIG9mIHNlZ3Mgc3lzdGVtIHdpZGUgKi8KLSAjZGVmaW5lIFNITUFMTCAoMTw8X1NITV9JRFhfQklUUytfU0hNX0lEX0JJVFMpCS8qIG1heCBzaG0gc3lzdGVtIHdpZGUgKHBhZ2VzKSAqLwotLSNkZWZpbmUJU0hNTEJBIFBBR0VfU0laRQkJCS8qIGF0dGFjaCBhZGRyIGEgbXVsdGlwbGUgb2YgdGhpcyAqLwotKyNkZWZpbmUJU0hNTEJBIDB4MTAwMAkJCQkvKiBhdHRhY2ggYWRkciBhIG11bHRpcGxlIG9mIHRoaXMgKi8KLSAjZGVmaW5lIFNITVNFRyBTSE1NTkkJCQkJLyogbWF4IHNoYXJlZCBzZWdzIHBlciBwcm9jZXNzICovCi0gCi0gI2lmZGVmIF9fS0VSTkVMX18KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2luY2x1ZGUvbGludXgvc2lnbmFsLmggbGludXgvaW5jbHVkZS9saW51eC9zaWduYWwuaAotLS0tIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9zaWduYWwuaAlUaHUgTWF5IDIwIDEwOjM0OjMwIDE5OTMKLSsrKyBsaW51eC9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCU1vbiBBdWcgMTYgMTg6NTU6MTIgMTk5MwotQEAgLTUzLDYgKzUzLDkgQEAKLSAqLwotICNkZWZpbmUgU0lHUFdSCQkzMAotIAotKy8qIEFyZ2doLiBCYWQgdXNlciBzb3VyY2UgY29kZSB3YW50cyB0aGlzLi4gKi8KLSsjZGVmaW5lIFNJR0JVUwkJU0lHVU5VU0VECi0rCi0gLyoKLSAgKiBzYV9mbGFncyB2YWx1ZXM6IFNBX1NUQUNLIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCBidXQgd2lsbCBhbGxvdyB0aGUKLSAgKiB1c2FnZSBvZiBzaWduYWwgc3RhY2tzIGJ5IHVzaW5nIHRoZSAobm93IG9ic29sZXRlKSBzYV9yZXN0b3JlciBmaWVsZCBpbgotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaW5jbHVkZS9saW51eC9zeXMuaCBsaW51eC9pbmNsdWRlL2xpbnV4L3N5cy5oCi0tLS0gcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L3N5cy5oCVR1ZSBKdWwgMjAgMDE6MzU6MzEgMTk5MwotKysrIGxpbnV4L2luY2x1ZGUvbGludXgvc3lzLmgJU2F0IFNlcCAgNCAwMjo0Mzo1MyAxOTkzCi1AQCAtNCw3ICs0LDkgQEAKLSAKLSAjZGVmaW5lIHN5c19jbG9uZSBzeXNfZm9yawotIAotKyNpZmRlZiBfX2NwbHVzcGx1cwotIGV4dGVybiAiQyIgewotKyNlbmRpZgotIAotIGV4dGVybiBpbnQgc3lzX3NldHVwKCk7Ci0gZXh0ZXJuIGludCBzeXNfZXhpdCgpOwotQEAgLTE3MCw3ICsxNzIsOSBAQAotIHN5c193YWl0NCwgc3lzX3N3YXBvZmYsIHN5c19zeXNpbmZvLCBzeXNfaXBjLCBzeXNfZnN5bmMsIHN5c19zaWdyZXR1cm4sCi0gc3lzX2Nsb25lLCBzeXNfc2V0ZG9tYWlubmFtZSwgc3lzX25ld3VuYW1lLCBzeXNfbW9kaWZ5X2xkdH07Ci0gCi0rI2lmZGVmIF9fY3BsdXNwbHVzCi0gfQotKyNlbmRpZgotIAotIC8qIFNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IG1vcmUgbWFudWFsIHVwZGF0aW5nLi4uLiAqLwotIGludCBOUl9zeXNjYWxscyA9IHNpemVvZihzeXNfY2FsbF90YWJsZSkvc2l6ZW9mKGZuX3B0cik7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L3Rhc2tzLmggbGludXgvaW5jbHVkZS9saW51eC90YXNrcy5oCi0tLS0gcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L3Rhc2tzLmgJTW9uIEphbiAxOCAyMjowNjozNCAxOTkzCi0rKysgbGludXgvaW5jbHVkZS9saW51eC90YXNrcy5oCVdlZCBBdWcgMTggMjM6MDU6MjEgMTk5MwotQEAgLTQsNiArNCw2IEBACi0gLyoKLSAgKiBUaGlzIGlzIHRoZSBtYXhpbXVtIG5yIG9mIHRhc2tzIC0gY2hhbmdlIGl0IGlmIHlvdSBuZWVkIHRvCi0gICovCi0tI2RlZmluZSBOUl9UQVNLUwk2NAotKyNkZWZpbmUgTlJfVEFTS1MJMTI4Ci0gCi0gI2VuZGlmCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L3RpbWVyLmggbGludXgvaW5jbHVkZS9saW51eC90aW1lci5oCi0tLS0gcGwxMi9saW51eC9pbmNsdWRlL2xpbnV4L3RpbWVyLmgJU2F0IEF1ZyAxNCAyMzo0NzoyMiAxOTkzCi0rKysgbGludXgvaW5jbHVkZS9saW51eC90aW1lci5oCVR1ZSBBdWcgMTcgMTg6Mzk6MzQgMTk5MwotQEAgLTE3LDYgKzE3LDggQEAKLSAgKiAKLSAgKiBIRF9USU1FUgkJaGFyZGRpc2sgdGltZXIKLSAgKgotKyAqIEhEX1RJTUVSMgkJKGF0ZGlzazIgcGF0Y2hlcykKLSsgKgotICAqIEZMT1BQWV9USU1FUgkJZmxvcHB5IGRpc2sgdGltZXIgKG5vdCB1c2VkIHJpZ2h0IG5vdykKLSAgKiAKLSAgKiBTQ1NJX1RJTUVSCQlzY3NpLmMgdGltZW91dCB0aW1lcgotQEAgLTQzLDYgKzQ1LDggQEAKLSAKLSAjZGVmaW5lIFRBUEVfUUlDMDJfVElNRVIJMjIJLyogaGhiICovCi0gI2RlZmluZSBNQ0RfVElNRVIJMjMKLSsKLSsjZGVmaW5lIEhEX1RJTUVSMgkyNAotIAotIHN0cnVjdCB0aW1lcl9zdHJ1Y3QgewotIAl1bnNpZ25lZCBsb25nIGV4cGlyZXM7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9pbml0L21haW4uYyBsaW51eC9pbml0L21haW4uYwotLS0tIHBsMTIvbGludXgvaW5pdC9tYWluLmMJTW9uIEF1ZyAgOSAxODowMjozMSAxOTkzCi0rKysgbGludXgvaW5pdC9tYWluLmMJU2F0IFNlcCAgNCAwMjo1ODozNiAxOTkzCi1AQCAtMjMsMTIgKzIzLDEzIEBACi0gI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0gI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KLSsjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0gCi0gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKiBwcm9mX2J1ZmZlcjsKLSBleHRlcm4gdW5zaWduZWQgbG9uZyBwcm9mX2xlbjsKLSBleHRlcm4gY2hhciBlZGF0YSwgZW5kOwotIGV4dGVybiBjaGFyICpsaW51eF9iYW5uZXI7Ci0tZXh0ZXJuICJDIiB2b2lkIGxjYWxsNyh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgbGNhbGw3KHZvaWQpOwotIHN0cnVjdCBkZXNjX3N0cnVjdCBkZWZhdWx0X2xkdDsKLSAKLSAvKgotQEAgLTQzLDYgKzQ0LDcgQEAKLSAgKiB3b24ndCBiZSBhbnkgbWVzc2luZyB3aXRoIHRoZSBzdGFjayBmcm9tIG1haW4oKSwgYnV0IHdlIGRlZmluZQotICAqIHNvbWUgb3RoZXJzIHRvby4KLSAgKi8KLSsjZGVmaW5lIF9fTlJfX2V4aXQgX19OUl9leGl0Ci0gc3RhdGljIGlubGluZSBfc3lzY2FsbDAoaW50LGlkbGUpCi0gc3RhdGljIGlubGluZSBfc3lzY2FsbDAoaW50LGZvcmspCi0gc3RhdGljIGlubGluZSBfc3lzY2FsbDAoaW50LHBhdXNlKQotQEAgLTU0LDcgKzU2LDcgQEAKLSBzdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhpbnQsZXhlY3ZlLGNvbnN0IGNoYXIgKixmaWxlLGNoYXIgKiosYXJndixjaGFyICoqLGVudnApCi0gc3RhdGljIGlubGluZSBfc3lzY2FsbDMoaW50LG9wZW4sY29uc3QgY2hhciAqLGZpbGUsaW50LGZsYWcsaW50LG1vZGUpCi0gc3RhdGljIGlubGluZSBfc3lzY2FsbDEoaW50LGNsb3NlLGludCxmZCkKLS1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMShpbnQsZXhpdCxpbnQsZXhpdGNvZGUpCi0rc3RhdGljIGlubGluZSBfc3lzY2FsbDEoaW50LF9leGl0LGludCxleGl0Y29kZSkKLSBzdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhwaWRfdCx3YWl0cGlkLHBpZF90LHBpZCxpbnQgKix3YWl0X3N0YXQsaW50LG9wdGlvbnMpCi0gCi0gc3RhdGljIGlubGluZSBwaWRfdCB3YWl0KGludCAqIHdhaXRfc3RhdCkKLUBAIC0xODksNiArMTkxLDcgQEAKLSAJY2hhciAqc3RyOwotIAl2b2lkICgqc2V0dXBfZnVuYykoY2hhciAqLCBpbnQgKik7Ci0gfSBib290c2V0dXBzW10gPSB7Ci0rCXsgInJlc2VydmU9IiwgcmVzZXJ2ZV9zZXR1cCB9LAotICNpZmRlZiBDT05GSUdfSU5FVAotIAl7ICJldGhlcj0iLCBldGhfc2V0dXAgfSwKLSAjZW5kaWYKLUBAIC0zMjksNyArMzMyLDcgQEAKLSAJb3V0Yl9wKDAsMHhmMCk7Ci0gfQotIAotLWV4dGVybiAiQyIgdm9pZCBzdGFydF9rZXJuZWwodm9pZCkKLSthc21saW5rYWdlIHZvaWQgc3RhcnRfa2VybmVsKHZvaWQpCi0gewotIC8qCi0gICogSW50ZXJydXB0cyBhcmUgc3RpbGwgZGlzYWJsZWQuIERvIG5lY2Vzc2FyeSBzZXR1cHMsIHRoZW4KLUBAIC00NjYsOSArNDY5LDkgQEAKLSAJaWYgKCEocGlkPWZvcmsoKSkpIHsKLSAJCWNsb3NlKDApOwotIAkJaWYgKG9wZW4oIi9ldGMvcmMiLE9fUkRPTkxZLDApKQotLQkJCWV4aXQoMSk7Ci0rCQkJX2V4aXQoMSk7Ci0gCQlleGVjdmUoIi9iaW4vc2giLGFyZ3ZfcmMsZW52cF9yYyk7Ci0tCQlleGl0KDIpOwotKwkJX2V4aXQoMik7Ci0gCX0KLSAJaWYgKHBpZD4wKQotIAkJd2hpbGUgKHBpZCAhPSB3YWl0KCZpKSkKLUBAIC00ODQsNyArNDg3LDcgQEAKLSAJCQkodm9pZCkgb3BlbigiL2Rldi90dHkxIixPX1JEV1IsMCk7Ci0gCQkJKHZvaWQpIGR1cCgwKTsKLSAJCQkodm9pZCkgZHVwKDApOwotLQkJCWV4aXQoZXhlY3ZlKCIvYmluL3NoIixhcmd2LGVudnApKTsKLSsJCQlfZXhpdChleGVjdmUoIi9iaW4vc2giLGFyZ3YsZW52cCkpOwotIAkJfQotIAkJd2hpbGUgKDEpCi0gCQkJaWYgKHBpZCA9PSB3YWl0KCZpKSkKLUBAIC00OTIsNSArNDk1LDUgQEAKLSAJCXByaW50ZigiXG5ccmNoaWxkICVkIGRpZWQgd2l0aCBjb2RlICUwNHhcblxyIixwaWQsaSk7Ci0gCQlzeW5jKCk7Ci0gCX0KLS0JZXhpdCgwKTsKLSsJX2V4aXQoMCk7Ci0gfQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvaXBjL3V0aWwuYyBsaW51eC9pcGMvdXRpbC5jCi0tLS0gcGwxMi9saW51eC9pcGMvdXRpbC5jCU1vbiBBdWcgIDkgMTg6MDI6MzEgMTk5MwotKysrIGxpbnV4L2lwYy91dGlsLmMJU2F0IFNlcCAgNCAxNDoyOToyMCAxOTkzCi1AQCAtMTMsNyArMTMsNyBAQAotICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0gCi0gdm9pZCBpcGNfaW5pdCAodm9pZCk7Ci0tZXh0ZXJuICJDIiBpbnQgc3lzX2lwYyAodWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwgdm9pZCAqcHRyKTsgCi0rYXNtbGlua2FnZSBpbnQgc3lzX2lwYyAodWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwgdm9pZCAqcHRyKTsgCi0gCi0gI2lmZGVmIENPTkZJR19TWVNWSVBDCi0gCi1AQCAtNjcsNyArNjcsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2lwYyAodWludCBjYWxsLCBpbnQgZmlyc3QsIGludCBzZWNvbmQsIGludCB0aGlyZCwgdm9pZCAqcHRyKSAKLSthc21saW5rYWdlIGludCBzeXNfaXBjICh1aW50IGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwgaW50IHRoaXJkLCB2b2lkICpwdHIpIAotIHsKLSAJCi0gCWlmIChjYWxsIDw9IFNFTUNUTCkKLUBAIC0xMjMsNyArMTIzLDcgQEAKLSAKLSAjZWxzZSAvKiBub3QgQ09ORklHX1NZU1ZJUEMgKi8KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfaXBjICh1aW50IGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwgaW50IHRoaXJkLCB2b2lkICpwdHIpIAotK2FzbWxpbmthZ2UgaW50IHN5c19pcGMgKHVpbnQgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHZvaWQgKnB0cikgCi0gewotICAgICByZXR1cm4gLUVOT1NZUzsKLSB9Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9lcnJvcnMuYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9lcnJvcnMuYwotLS0tIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvZXJyb3JzLmMJVGh1IEp1bCAyMiAwMToxMTo0OSAxOTkzCi0rKysgbGludXgva2VybmVsL0ZQVS1lbXUvZXJyb3JzLmMJU2F0IFNlcCAgNCAwMzoyNToyNyAxOTkzCi1AQCAtMzEyLDcgKzMxMiw3IEBACi0gCi0gLyogUmVhbCBvcGVyYXRpb24gYXR0ZW1wdGVkIG9uIHR3byBvcGVyYW5kcywgb25lIGEgTmFOLiAqLwotIC8qIFJldHVybnMgbnogaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZCAqLwotLWV4dGVybiAiQyIgaW50IHJlYWxfMm9wX05hTihGUFVfUkVHICphLCBGUFVfUkVHICpiLCBGUFVfUkVHICpkZXN0KQotK2FzbWxpbmthZ2UgaW50IHJlYWxfMm9wX05hTihGUFVfUkVHICphLCBGUFVfUkVHICpiLCBGUFVfUkVHICpkZXN0KQotIHsKLSAgIEZQVV9SRUcgKng7Ci0gICBpbnQgc2lnbmFsbGluZzsKLUBAIC0zMjYsNyArMzI2LDcgQEAKLSAJewotIAkgIHNpZ25hbGxpbmcgPSAhKGEtPnNpZ2ggJiBiLT5zaWdoICYgMHg0MDAwMDAwMCk7Ci0gCSAgLyogZmluZCB0aGUgImxhcmdlciIgKi8KLS0JICBpZiAoICoobG9uZyBsb25nICopJihhLT5zaWdsKSA8ICoobG9uZyBsb25nICopJihiLT5zaWdsKSApCi0rCSAgaWYgKCBzaWduaWZpY2FuZChhKSA8IHNpZ25pZmljYW5kKGIpICkKLSAJICAgIHggPSBiOwotIAl9Ci0gICAgICAgZWxzZQotQEAgLTM3OCw3ICszNzgsNyBAQAotIAotIC8qIEludmFsaWQgYXJpdGggb3BlcmF0aW9uIG9uIFZhbGlkIHJlZ2lzdGVycyAqLwotIC8qIFJldHVybnMgbnogaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZCAqLwotLWV4dGVybiAiQyIgaW50IGFyaXRoX2ludmFsaWQoRlBVX1JFRyAqZGVzdCkKLSthc21saW5rYWdlIGludCBhcml0aF9pbnZhbGlkKEZQVV9SRUcgKmRlc3QpCi0gewotIAotICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOwotQEAgLTM5NSw3ICszOTUsNyBAQAotIAotIAotIC8qIERpdmlkZSBhIGZpbml0ZSBudW1iZXIgYnkgemVybyAqLwotLWV4dGVybiAiQyIgaW50IGRpdmlkZV9ieV96ZXJvKGludCBzaWduLCBGUFVfUkVHICpkZXN0KQotK2FzbWxpbmthZ2UgaW50IGRpdmlkZV9ieV96ZXJvKGludCBzaWduLCBGUFVfUkVHICpkZXN0KQotIHsKLSAKLSAgIGlmICggY29udHJvbF93b3JkICYgQ1dfWmVyb0RpdiApCi1AQCAtNDMwLDcgKzQzMCw3IEBACi0gCi0gCi0gLyogVGhpcyBtYXkgYmUgY2FsbGVkIG9mdGVuLCBzbyBrZWVwIGl0IGxlYW4gKi8KLS1leHRlcm4gIkMiIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKHZvaWQpCi0rYXNtbGlua2FnZSB2b2lkIHNldF9wcmVjaXNpb25fZmxhZ191cCh2b2lkKQotIHsKLSAgIGlmICggY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uICkKLSAgICAgcGFydGlhbF9zdGF0dXMgfD0gKFNXX1ByZWNpc2lvbiB8IFNXX0MxKTsgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCi1AQCAtNDQxLDcgKzQ0MSw3IEBACi0gCi0gCi0gLyogVGhpcyBtYXkgYmUgY2FsbGVkIG9mdGVuLCBzbyBrZWVwIGl0IGxlYW4gKi8KLS1leHRlcm4gIkMiIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24odm9pZCkKLSthc21saW5rYWdlIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24odm9pZCkKLSB7Ci0gICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX1ByZWNpc2lvbiApCi0gICAgIHsgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCi1AQCAtNDUzLDcgKzQ1Myw3IEBACi0gfQotIAotIAotLWV4dGVybiAiQyIgaW50IGRlbm9ybWFsX29wZXJhbmQodm9pZCkKLSthc21saW5rYWdlIGludCBkZW5vcm1hbF9vcGVyYW5kKHZvaWQpCi0gewotICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19EZW5vcm1hbCApCi0gICAgIHsgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCi1AQCAtNDY4LDcgKzQ2OCw3IEBACi0gfQotIAotIAotLWV4dGVybiAiQyIgaW50IGFyaXRoX292ZXJmbG93KEZQVV9SRUcgKmRlc3QpCi0rYXNtbGlua2FnZSBpbnQgYXJpdGhfb3ZlcmZsb3coRlBVX1JFRyAqZGVzdCkKLSB7Ci0gCi0gICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX092ZXJmbG93ICkKLUBAIC01MDIsNyArNTAyLDcgQEAKLSB9Ci0gCi0gCi0tZXh0ZXJuICJDIiBpbnQgYXJpdGhfdW5kZXJmbG93KEZQVV9SRUcgKmRlc3QpCi0rYXNtbGlua2FnZSBpbnQgYXJpdGhfdW5kZXJmbG93KEZQVV9SRUcgKmRlc3QpCi0gewotIAotICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19VbmRlcmZsb3cgKQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X2FyaXRoLmMgbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X2FyaXRoLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9hcml0aC5jCVRodSBKdWwgMjIgMDE6MTE6NTAgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9hcml0aC5jCVdlZCBTZXAgIDEgMTg6MzA6MDQgMTk5MwotQEAgLTE5LDEwICsxOSw3IEBACi0gdm9pZCBmYWRkX18oKQotIHsKLSAgIC8qIGZhZGQgc3Qsc3QoaSkgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICByZWdfYWRkKEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgRlBVX3N0MF9wdHIsIGNvbnRyb2xfd29yZCk7Ci0gfQotIAotQEAgLTMwLDEwICsyNyw3IEBACi0gdm9pZCBmbXVsX18oKQotIHsKLSAgIC8qIGZtdWwgc3Qsc3QoaSkgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICByZWdfbXVsKEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgRlBVX3N0MF9wdHIsIGNvbnRyb2xfd29yZCk7Ci0gfQotIAotQEAgLTQyLDEwICszNiw3IEBACi0gdm9pZCBmc3ViX18oKQotIHsKLSAgIC8qIGZzdWIgc3Qsc3QoaSkgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICByZWdfc3ViKEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgRlBVX3N0MF9wdHIsIGNvbnRyb2xfd29yZCk7Ci0gfQotIAotQEAgLTUzLDEwICs0NCw3IEBACi0gdm9pZCBmc3Vicl8oKQotIHsKLSAgIC8qIGZzdWJyIHN0LHN0KGkpICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgcmVnX3N1Yigmc3QoRlBVX3JtKSwgRlBVX3N0MF9wdHIsIEZQVV9zdDBfcHRyLCBjb250cm9sX3dvcmQpOwotIH0KLSAKLUBAIC02NCwxMCArNTIsNyBAQAotIHZvaWQgZmRpdl9fKCkKLSB7Ci0gICAvKiBmZGl2IHN0LHN0KGkpICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgcmVnX2RpdihGUFVfc3QwX3B0ciwgJnN0KEZQVV9ybSksIEZQVV9zdDBfcHRyLCBjb250cm9sX3dvcmQpOwotIH0KLSAKLUBAIC03NSwxMCArNjAsNyBAQAotIHZvaWQgZmRpdnJfKCkKLSB7Ci0gICAvKiBmZGl2ciBzdCxzdChpKSAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIHJlZ19kaXYoJnN0KEZQVV9ybSksIEZQVV9zdDBfcHRyLCBGUFVfc3QwX3B0ciwgY29udHJvbF93b3JkKTsKLSB9Ci0gCi1AQCAtODcsMTAgKzY5LDcgQEAKLSB2b2lkIGZhZGRfaSgpCi0gewotICAgLyogZmFkZCBzdChpKSxzdCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIHJlZ19hZGQoRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKTsKLSB9Ci0gCi1AQCAtOTgsMTAgKzc3LDcgQEAKLSB2b2lkIGZtdWxfaSgpCi0gewotICAgLyogZm11bCBzdChpKSxzdCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIHJlZ19tdWwoRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKTsKLSB9Ci0gCi1AQCAtMTExLDEwICs4Nyw3IEBACi0gICAvKiBmc3ViciBzdChpKSxzdCAqLwotICAgLyogVGhpcyBpcyB0aGUgc2Vuc2Ugb2YgdGhlIDgwNDg2IG1hbnVhbAotICAgICAgcmVnX3N1Yigmc3QoRlBVX3JtKSwgRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCBjb250cm9sX3dvcmQpOyAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIHJlZ19zdWIoRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKTsKLSB9Ci0gCi1AQCAtMTI0LDEwICs5Nyw3IEBACi0gICAvKiBmc3ViIHN0KGkpLHN0ICovCi0gICAvKiBUaGlzIGlzIHRoZSBzZW5zZSBvZiB0aGUgODA0ODYgbWFudWFsCi0gICAgICByZWdfc3ViKEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgJnN0KEZQVV9ybSksIGNvbnRyb2xfd29yZCk7ICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgcmVnX3N1Yigmc3QoRlBVX3JtKSwgRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCBjb250cm9sX3dvcmQpOwotIH0KLSAKLUBAIC0xMzUsMTAgKzEwNSw3IEBACi0gdm9pZCBmZGl2cmkoKQotIHsKLSAgIC8qIGZkaXZyIHN0KGkpLHN0ICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgcmVnX2RpdihGUFVfc3QwX3B0ciwgJnN0KEZQVV9ybSksICZzdChGUFVfcm0pLCBjb250cm9sX3dvcmQpOwotIH0KLSAKLUBAIC0xNDYsMTAgKzExMyw3IEBACi0gdm9pZCBmZGl2X2koKQotIHsKLSAgIC8qIGZkaXYgc3QoaSksc3QgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICByZWdfZGl2KCZzdChGUFVfcm0pLCBGUFVfc3QwX3B0ciwgJnN0KEZQVV9ybSksIGNvbnRyb2xfd29yZCk7Ci0gfQotIAotQEAgLTE1OCwxMCArMTIyLDcgQEAKLSB2b2lkIGZhZGRwXygpCi0gewotICAgLyogZmFkZHAgc3QoaSksc3QgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICBpZiAoICFyZWdfYWRkKEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgJnN0KEZQVV9ybSksIGNvbnRyb2xfd29yZCkgKQotICAgICBwb3AoKTsKLSB9Ci1AQCAtMTcwLDEwICsxMzEsNyBAQAotIHZvaWQgZm11bHBfKCkKLSB7Ci0gICAvKiBmbXVscCBzdChpKSxzdCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIGlmICggIXJlZ19tdWwoRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKSApCi0gICAgIHBvcCgpOwotIH0KLUBAIC0xODUsMTAgKzE0Myw3IEBACi0gICAvKiBmc3VicnAgc3QoaSksc3QgKi8KLSAgIC8qIFRoaXMgaXMgdGhlIHNlbnNlIG9mIHRoZSA4MDQ4NiBtYW51YWwKLSAgICAgIHJlZ19zdWIoJnN0KEZQVV9ybSksIEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKTsgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICBpZiAoICFyZWdfc3ViKEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgJnN0KEZQVV9ybSksIGNvbnRyb2xfd29yZCkgKQotICAgICBwb3AoKTsKLSB9Ci1AQCAtMTk5LDEwICsxNTQsNyBAQAotICAgLyogZnN1YnAgc3QoaSksc3QgKi8KLSAgIC8qIFRoaXMgaXMgdGhlIHNlbnNlIG9mIHRoZSA4MDQ4NiBtYW51YWwKLSAgICAgIHJlZ19zdWIoRlBVX3N0MF9wdHIsICZzdChGUFVfcm0pLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKTsgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICBpZiAoICFyZWdfc3ViKCZzdChGUFVfcm0pLCBGUFVfc3QwX3B0ciwgJnN0KEZQVV9ybSksIGNvbnRyb2xfd29yZCkgKQotICAgICBwb3AoKTsKLSB9Ci1AQCAtMjExLDEwICsxNjMsNyBAQAotIHZvaWQgZmRpdnJwKCkKLSB7Ci0gICAvKiBmZGl2cnAgc3QoaSksc3QgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICBpZiAoICFyZWdfZGl2KEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgJnN0KEZQVV9ybSksIGNvbnRyb2xfd29yZCkgKQotICAgICBwb3AoKTsKLSB9Ci1AQCAtMjIzLDEwICsxNzIsNyBAQAotIHZvaWQgZmRpdnBfKCkKLSB7Ci0gICAvKiBmZGl2cCBzdChpKSxzdCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIGlmICggIXJlZ19kaXYoJnN0KEZQVV9ybSksIEZQVV9zdDBfcHRyLCAmc3QoRlBVX3JtKSwgY29udHJvbF93b3JkKSApCi0gICAgIHBvcCgpOwotIH0KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9hdXguYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfYXV4LmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9hdXguYwlUaHUgSnVsIDIyIDAxOjExOjUwIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfYXV4LmMJV2VkIFNlcCAgMSAxODozMDowNCAxOTkzCi1AQCAtMTM5LDEwICsxMzksNyBAQAotICAgICAgIHN0YWNrX3VuZGVyZmxvdygpOwotICAgICAgIHJldHVybjsKLSAgICAgfQotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIHJlZ19tb3ZlKEZQVV9zdDBfcHRyLCAmdCk7Ci0gICByZWdfbW92ZShzdGlfcHRyLCBGUFVfc3QwX3B0cik7Ci0gICByZWdfbW92ZSgmdCwgc3RpX3B0cik7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfZW11LmggbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X2VtdS5oCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfZW11LmgJVGh1IEp1bCAyMiAwMToxMTo1MCAxOTkzCi0rKysgbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X2VtdS5oCVNhdCBTZXAgIDQgMDM6Mjg6MDIgMTk5MwotQEAgLTU4LDYgKzU4LDcgQEAKLSAjaWZuZGVmIF9fQVNTRU1CTEVSX18KLSAKLSAjaW5jbHVkZSA8bGludXgvbWF0aF9lbXUuaD4KLSsjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotIAotICNpZmRlZiBQQVJBTk9JRAotIGV4dGVybiBjaGFyIGVtdWxhdGluZzsKLUBAIC0xMTAsMzMgKzExMSwzNiBAQAotIAkJICoobG9uZyAqKSYoKHkpLT5leHApID0gKihsb25nICopJigoeCktPmV4cCk7IFwKLSAJCSAqKGxvbmcgbG9uZyAqKSYoKHkpLT5zaWdsKSA9ICoobG9uZyBsb25nICopJigoeCktPnNpZ2wpOyB9Ci0gCi0rI2RlZmluZSBzaWduaWZpY2FuZCh4KSAoICgodW5zaWduZWQgbG9uZyBsb25nICopJigoeCktPnNpZ2wpKVswXSApCi0gCi0rCi0gLyotLS0tLSBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgd3JpdHRlbiBpbiBhc3NlbWJsZXIgLS0tLS0qLwotIC8qIGV4dGVybiB2b2lkIHJlZ19tb3ZlKEZQVV9SRUcgKmEsIEZQVV9SRUcgKmIpOyAqLwotIAotLWV4dGVybiAiQyIgdm9pZCBtdWw2NChsb25nIGxvbmcgKmEsIGxvbmcgbG9uZyAqYiwgbG9uZyBsb25nICpyZXN1bHQpOwotLWV4dGVybiAiQyIgdm9pZCBwb2x5X2RpdjIobG9uZyBsb25nICp4KTsKLS1leHRlcm4gIkMiIHZvaWQgcG9seV9kaXY0KGxvbmcgbG9uZyAqeCk7Ci0tZXh0ZXJuICJDIiB2b2lkIHBvbHlfZGl2MTYobG9uZyBsb25nICp4KTsKLS1leHRlcm4gIkMiIHZvaWQgcG9seW5vbWlhbCh1bnNpZ25lZCBhY2N1bVtdLCB1bnNpZ25lZCB4W10sCi0rYXNtbGlua2FnZSB2b2lkIG11bDY0KHVuc2lnbmVkIGxvbmcgbG9uZyAqYSwgdW5zaWduZWQgbG9uZyBsb25nICpiLAotKwkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpyZXN1bHQpOwotK2FzbWxpbmthZ2Ugdm9pZCBwb2x5X2RpdjIodW5zaWduZWQgbG9uZyBsb25nICp4KTsKLSthc21saW5rYWdlIHZvaWQgcG9seV9kaXY0KHVuc2lnbmVkIGxvbmcgbG9uZyAqeCk7Ci0rYXNtbGlua2FnZSB2b2lkIHBvbHlfZGl2MTYodW5zaWduZWQgbG9uZyBsb25nICp4KTsKLSthc21saW5rYWdlIHZvaWQgcG9seW5vbWlhbCh1bnNpZ25lZCBhY2N1bVtdLCB1bnNpZ25lZCB4W10sCi0gCQkgICAgICAgdW5zaWduZWQgc2hvcnQgdGVybXNbXVs0XSwgaW50IG4pOwotLWV4dGVybiAiQyIgdm9pZCBub3JtYWxpemUoRlBVX1JFRyAqeCk7Ci0tZXh0ZXJuICJDIiB2b2lkIG5vcm1hbGl6ZV9udW8oRlBVX1JFRyAqeCk7Ci0tZXh0ZXJuICJDIiBpbnQgcmVnX2RpdihGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LAotK2FzbWxpbmthZ2Ugdm9pZCBub3JtYWxpemUoRlBVX1JFRyAqeCk7Ci0rYXNtbGlua2FnZSB2b2lkIG5vcm1hbGl6ZV9udW8oRlBVX1JFRyAqeCk7Ci0rYXNtbGlua2FnZSBpbnQgcmVnX2RpdihGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LAotIAkJICAgIHVuc2lnbmVkIGludCBjb250cm9sX3cpOwotLWV4dGVybiAiQyIgaW50IHJlZ191X3N1YihGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LAotK2FzbWxpbmthZ2UgaW50IHJlZ191X3N1YihGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LAotIAkJICAgICAgdW5zaWduZWQgaW50IGNvbnRyb2xfdyk7Ci0tZXh0ZXJuICJDIiBpbnQgcmVnX3VfbXVsKEZQVV9SRUcgKmFyZzEsIEZQVV9SRUcgKmFyZzIsIEZQVV9SRUcgKmFuc3csCi0rYXNtbGlua2FnZSBpbnQgcmVnX3VfbXVsKEZQVV9SRUcgKmFyZzEsIEZQVV9SRUcgKmFyZzIsIEZQVV9SRUcgKmFuc3csCi0gCQkgICAgICB1bnNpZ25lZCBpbnQgY29udHJvbF93KTsKLS1leHRlcm4gIkMiIGludCByZWdfdV9kaXYoRlBVX1JFRyAqYXJnMSwgRlBVX1JFRyAqYXJnMiwgRlBVX1JFRyAqYW5zdywKLSthc21saW5rYWdlIGludCByZWdfdV9kaXYoRlBVX1JFRyAqYXJnMSwgRlBVX1JFRyAqYXJnMiwgRlBVX1JFRyAqYW5zdywKLSAJCSAgICAgIHVuc2lnbmVkIGludCBjb250cm9sX3cpOwotLWV4dGVybiAiQyIgaW50IHJlZ191X2FkZChGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LAotK2FzbWxpbmthZ2UgaW50IHJlZ191X2FkZChGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LAotIAkJICAgICAgdW5zaWduZWQgaW50IGNvbnRyb2xfdyk7Ci0tZXh0ZXJuICJDIiBpbnQgd21fc3FydChGUFVfUkVHICpuLCB1bnNpZ25lZCBpbnQgY29udHJvbF93KTsKLS1leHRlcm4gIkMiIHVuc2lnbmVkCXNocngodm9pZCAqbCwgdW5zaWduZWQgeCk7Ci0tZXh0ZXJuICJDIiB1bnNpZ25lZAlzaHJ4cyh2b2lkICp2LCB1bnNpZ25lZCB4KTsKLS1leHRlcm4gIkMiIHVuc2lnbmVkIGxvbmcgZGl2X3NtYWxsKHVuc2lnbmVkIGxvbmcgbG9uZyAqeCwgdW5zaWduZWQgbG9uZyB5KTsKLS1leHRlcm4gIkMiIHZvaWQgcm91bmRfcmVnKEZQVV9SRUcgKmFyZywgdW5zaWduZWQgaW50IGV4dGVudCwKLSthc21saW5rYWdlIGludCB3bV9zcXJ0KEZQVV9SRUcgKm4sIHVuc2lnbmVkIGludCBjb250cm9sX3cpOwotK2FzbWxpbmthZ2UgdW5zaWduZWQJc2hyeCh2b2lkICpsLCB1bnNpZ25lZCB4KTsKLSthc21saW5rYWdlIHVuc2lnbmVkCXNocnhzKHZvaWQgKnYsIHVuc2lnbmVkIHgpOwotK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBkaXZfc21hbGwodW5zaWduZWQgbG9uZyBsb25nICp4LCB1bnNpZ25lZCBsb25nIHkpOwotK2FzbWxpbmthZ2Ugdm9pZCByb3VuZF9yZWcoRlBVX1JFRyAqYXJnLCB1bnNpZ25lZCBpbnQgZXh0ZW50LAotIAkJICAgICAgdW5zaWduZWQgaW50IGNvbnRyb2xfdyk7Ci0gCi0gI2lmbmRlZiBNQUtJTkdfUFJPVE8KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9lbnRyeS5jIGxpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9lbnRyeS5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfZW50cnkuYwlUaHUgSnVsIDIyIDAxOjExOjUwIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfZW50cnkuYwlTYXQgU2VwICA0IDAzOjI1OjI3IDE5OTMKLUBAIC0xNTUsNyArMTU1LDcgQEAKLSBzdGF0aWMgaW50IHZhbGlkX3ByZWZpeCh1bnNpZ25lZCBjaGFyIGJ5dGUpOwotIAotIAotLWV4dGVybiAiQyIgdm9pZCBtYXRoX2VtdWxhdGUobG9uZyBhcmcpCi0rYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKLSB7Ci0gICB1bnNpZ25lZCBjaGFyICBGUFVfbW9kcm07Ci0gICB1bnNpZ25lZCBzaG9ydCBjb2RlOwotQEAgLTE4Myw3ICsxODMsNyBAQAotICAgICAgIGN1cnJlbnQtPnVzZWRfbWF0aCA9IDE7Ci0gICAgIH0KLSAKLS0gIEZQVV9pbmZvID0gKHN0cnVjdCBpbmZvICopICZhcmc7Ci0rICBTRVRVUF9EQVRBX0FSRUEoYXJnKTsKLSAKLSAgIC8qIFdlIGNhbm5vdCBoYW5kbGUgZW11bGF0aW9uIGluIHY4Ni1tb2RlICovCi0gICBpZiAoRlBVX0VGTEFHUyAmIDB4MDAwMjAwMDApCi1AQCAtNDAxLDIwICs0MDEsMTIgQEAKLSAJICAgICAgc3dpdGNoICggKEZQVV9tb2RybSA+PiAzKSAmIDcgKQotIAkJewotIAkJY2FzZSAwOiAgICAgICAgIC8qIGZhZGQgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tCQkgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwKLS0JCSAgICAgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gCQkgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotIAkJICByZWdfYWRkKEZQVV9zdDBfcHRyLCAmRlBVX2xvYWRlZF9kYXRhLCBGUFVfc3QwX3B0ciwKLSAJCQkgIGNvbnRyb2xfd29yZCk7Ci0gCQkgIGJyZWFrOwotIAkJY2FzZSAxOiAgICAgICAgIC8qIGZtdWwgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tCQkgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwKLS0JCSAgICAgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gCQkgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotIAkJICByZWdfbXVsKEZQVV9zdDBfcHRyLCAmRlBVX2xvYWRlZF9kYXRhLCBGUFVfc3QwX3B0ciwKLSAJCQkgIGNvbnRyb2xfd29yZCk7Ci0gCQkgIGJyZWFrOwotQEAgLTQyNiwzOCArNDE4LDIyIEBACi0gCQkgICAgcG9wKCk7Ci0gCQkgIGJyZWFrOwotIAkJY2FzZSA0OiAgICAgICAgIC8qIGZzdWIgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tCQkgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwKLS0JCSAgICAgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gCQkgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotIAkJICByZWdfc3ViKEZQVV9zdDBfcHRyLCAmRlBVX2xvYWRlZF9kYXRhLCBGUFVfc3QwX3B0ciwKLSAJCQkgIGNvbnRyb2xfd29yZCk7Ci0gCQkgIGJyZWFrOwotIAkJY2FzZSA1OiAgICAgICAgIC8qIGZzdWJyICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLQkJICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sCi0tCQkgICAgIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotIAkJICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAJCSAgcmVnX3N1YigmRlBVX2xvYWRlZF9kYXRhLCBGUFVfc3QwX3B0ciwgRlBVX3N0MF9wdHIsCi0gCQkJICBjb250cm9sX3dvcmQpOwotIAkJICBicmVhazsKLSAJCWNhc2UgNjogICAgICAgICAvKiBmZGl2ICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLQkJICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sCi0tCQkgICAgIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotIAkJICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAJCSAgcmVnX2RpdihGUFVfc3QwX3B0ciwgJkZQVV9sb2FkZWRfZGF0YSwgRlBVX3N0MF9wdHIsCi0gCQkJICBjb250cm9sX3dvcmQpOwotIAkJICBicmVhazsKLSAJCWNhc2UgNzogICAgICAgICAvKiBmZGl2ciAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0JCSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLAotLQkJICAgICBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAJCSAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gCQkgIGlmICggRlBVX3N0MF90YWcgPT0gVFdfWmVybyApCi0gCQkgICAgcGFydGlhbF9zdGF0dXMgPSBzdGF0dXMxOyAgLyogVW5kbyBhbnkgZGVub3JtIHRhZywKLSAJCQkJCSAgICAgICB6ZXJvLWRpdmlkZSBoYXMgcHJpb3JpdHkuICovCi1AQCAtNjM3LDcgKzYxMyw3IEBACi0gI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotIAotLWV4dGVybiAiQyIgdm9pZCBtYXRoX2VtdWxhdGUobG9uZyBhcmcpCi0rYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKLSB7Ci0gICBwcmludGsoIm1hdGgtZW11bGF0aW9uIG5vdCBlbmFibGVkIGFuZCBubyBjb3Byb2Nlc3NvciBmb3VuZC5cbiIpOwotICAgcHJpbnRrKCJraWxsaW5nICVzLlxuIixjdXJyZW50LT5jb21tKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9ldGMuYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfZXRjLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9ldGMuYwlUaHUgSnVsIDIyIDAxOjExOjUwIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfZXRjLmMJV2VkIFNlcCAgMSAxODozMDowNCAxOTkzCi1AQCAtMjIsMTAgKzIyLDcgQEAKLSAgIGlmICggTk9UX0VNUFRZXzAgKQotICAgICB7Ci0gICAgICAgRlBVX3N0MF9wdHItPnNpZ24gXj0gU0lHTl9QT1NeU0lHTl9ORUc7Ci0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgICAgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgc3RhY2tfdW5kZXJmbG93KCk7Ci1AQCAtMzYsMTAgKzMzLDcgQEAKLSAgIGlmICggRlBVX3N0MF90YWcgXiBUV19FbXB0eSApCi0gICAgIHsKLSAgICAgICBGUFVfc3QwX3B0ci0+c2lnbiA9IFNJR05fUE9TOwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgICAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgICB9Ci0gICBlbHNlCi0gICAgIHN0YWNrX3VuZGVyZmxvdygpOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X3Byb3RvLmggbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X3Byb3RvLmgKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9wcm90by5oCVRodSBKdWwgMjIgMDE6MTE6NTAgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9wcm90by5oCVNhdCBTZXAgIDQgMDM6MjU6MjcgMTk5MwotQEAgLTYsMTUgKzYsMTUgQEAKLSBleHRlcm4gdm9pZCBzdGFja191bmRlcmZsb3dfaShpbnQgaSk7Ci0gZXh0ZXJuIHZvaWQgc3RhY2tfdW5kZXJmbG93X3BvcChpbnQgaSk7Ci0gZXh0ZXJuIGludCBzZXRfcHJlY2lzaW9uX2ZsYWcoaW50IGZsYWdzKTsKLS1leHRlcm4gIkMiIHZvaWQgZXhjZXB0aW9uKGludCBuKTsKLS1leHRlcm4gIkMiIGludCByZWFsXzJvcF9OYU4oRlBVX1JFRyAqYSwgRlBVX1JFRyAqYiwgRlBVX1JFRyAqZGVzdCk7Ci0tZXh0ZXJuICJDIiBpbnQgYXJpdGhfaW52YWxpZChGUFVfUkVHICpkZXN0KTsKLS1leHRlcm4gIkMiIGludCBkaXZpZGVfYnlfemVybyhpbnQgc2lnbiwgRlBVX1JFRyAqZGVzdCk7Ci0tZXh0ZXJuICJDIiB2b2lkIHNldF9wcmVjaXNpb25fZmxhZ191cCh2b2lkKTsKLS1leHRlcm4gIkMiIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24odm9pZCk7Ci0tZXh0ZXJuICJDIiBpbnQgZGVub3JtYWxfb3BlcmFuZCh2b2lkKTsKLS1leHRlcm4gIkMiIGludCBhcml0aF9vdmVyZmxvdyhGUFVfUkVHICpkZXN0KTsKLS1leHRlcm4gIkMiIGludCBhcml0aF91bmRlcmZsb3coRlBVX1JFRyAqZGVzdCk7Ci0rYXNtbGlua2FnZSB2b2lkIGV4Y2VwdGlvbihpbnQgbik7Ci0rYXNtbGlua2FnZSBpbnQgcmVhbF8yb3BfTmFOKEZQVV9SRUcgKmEsIEZQVV9SRUcgKmIsIEZQVV9SRUcgKmRlc3QpOwotK2FzbWxpbmthZ2UgaW50IGFyaXRoX2ludmFsaWQoRlBVX1JFRyAqZGVzdCk7Ci0rYXNtbGlua2FnZSBpbnQgZGl2aWRlX2J5X3plcm8oaW50IHNpZ24sIEZQVV9SRUcgKmRlc3QpOwotK2FzbWxpbmthZ2Ugdm9pZCBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAodm9pZCk7Ci0rYXNtbGlua2FnZSB2b2lkIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKHZvaWQpOwotK2FzbWxpbmthZ2UgaW50IGRlbm9ybWFsX29wZXJhbmQodm9pZCk7Ci0rYXNtbGlua2FnZSBpbnQgYXJpdGhfb3ZlcmZsb3coRlBVX1JFRyAqZGVzdCk7Ci0rYXNtbGlua2FnZSBpbnQgYXJpdGhfdW5kZXJmbG93KEZQVV9SRUcgKmRlc3QpOwotIAotIC8qIGZwdV9hcml0aC5jICovCi0gZXh0ZXJuIHZvaWQgZmFkZF9fKHZvaWQpOwotQEAgLTUwLDcgKzUwLDcgQEAKLSBleHRlcm4gdm9pZCBmc3RwX2kodm9pZCk7Ci0gCi0gLyogZnB1X2VudHJ5LmMgKi8KLS1leHRlcm4gIkMiIHZvaWQgbWF0aF9lbXVsYXRlKGxvbmcgYXJnKTsKLSthc21saW5rYWdlIHZvaWQgbWF0aF9lbXVsYXRlKGxvbmcgYXJnKTsKLSBleHRlcm4gdm9pZCBfX21hdGhfYWJvcnQoc3RydWN0IGluZm8gKmluZm8sIHVuc2lnbmVkIGludCBzaWduYWwpOwotIAotIC8qIGZwdV9ldGMuYyAqLwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X3N5c3RlbS5oIGxpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9zeXN0ZW0uaAotLS0tIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X3N5c3RlbS5oCVRodSBKdWwgMjIgMDE6MTE6NTAgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV9zeXN0ZW0uaAlXZWQgU2VwICAxIDE4OjMwOjA0IDE5OTMKLUBAIC0xNCw2ICsxNCwxMCBAQAotICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSAKLSsvKiBUaGlzIHNldHMgdGhlIHBvaW50ZXIgRlBVX2luZm8gdG8gcG9pbnQgdG8gdGhlIGFyZ3VtZW50IHBhcnQKLSsgICBvZiB0aGUgc3RhY2sgZnJhbWUgb2YgbWF0aF9lbXVsYXRlKCkgKi8KLSsjZGVmaW5lIFNFVFVQX0RBVEFfQVJFQShhcmcpICAgIEZQVV9pbmZvID0gKHN0cnVjdCBpbmZvICopICZhcmcKLSsKLSAjZGVmaW5lIEkzODcJCQkoY3VycmVudC0+dHNzLmkzODcpCi0gI2RlZmluZSBGUFVfaW5mbwkJKEkzODcuc29mdC5pbmZvKQotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvZnB1X3RyaWcuYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfdHJpZy5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9mcHVfdHJpZy5jCVRodSBKdWwgMjIgMDE6MTE6NTEgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L2ZwdV90cmlnLmMJV2VkIFNlcCAgMSAxODozMDowNSAxOTkzCi1AQCAtMjAsNyArMjAsNyBAQAotIAotIHN0YXRpYyB2b2lkIHJlbV9rZXJuZWwodW5zaWduZWQgbG9uZyBsb25nIHN0MCwgdW5zaWduZWQgbG9uZyBsb25nICp5LAotIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdDEsCi0tCQkgICAgICAgbG9uZyBsb25nIHEsIGludCBuKTsKLSsJCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcSwgaW50IG4pOwotIAotICNkZWZpbmUgQkVUVEVSX1RIQU5fNDg2Ci0gCi1AQCAtMjcsNiArMjcsNyBAQAotICNkZWZpbmUgRkNPUyAgNAotICNkZWZpbmUgRlBUQU4gMQotIAotKwotIC8qIFVzZWQgb25seSBieSBmcHRhbiwgZnNpbiwgZmNvcywgYW5kIGZzaW5jb3MuICovCi0gLyogVGhpcyByb3V0aW5lIHByb2R1Y2VzIHZlcnkgYWNjdXJhdGUgcmVzdWx0cywgc2ltaWxhciB0bwotICAgIHVzaW5nIGEgdmFsdWUgb2YgcGkgd2l0aCBtb3JlIHRoYW4gMTI4IGJpdHMgcHJlY2lzaW9uLiAqLwotQEAgLTM2LDcgKzM3LDcgQEAKLSBzdGF0aWMgaW50IHRyaWdfYXJnKEZQVV9SRUcgKlgsIGludCBldmVuKQotIHsKLSAgIEZQVV9SRUcgdG1wOwotLSAgbG9uZyBsb25nIHE7Ci0rICB1bnNpZ25lZCBsb25nIGxvbmcgcTsKLSAgIGludCBvbGRfY3cgPSBjb250cm9sX3dvcmQsIHNhdmVkX3N0YXR1cyA9IHBhcnRpYWxfc3RhdHVzOwotIAotICAgaWYgKCBYLT5leHAgPj0gRVhQX0JJQVMgKyA2MyApCi1AQCAtNTEsMTIgKzUyLDEyIEBACi0gICByZWdfZGl2KFgsICZDT05TVF9QSTIsICZ0bXAsIFBSXzY0X0JJVFMgfCBSQ19DSE9QIHwgMHgzZik7Ci0gICByb3VuZF90b19pbnQoJnRtcCk7ICAvKiBGb3J0dW5hdGVseSwgdGhpcyBjYW4ndCBvdmVyZmxvdwotIAkJCSAgdG8gMl42NCAqLwotLSAgcSA9ICgobG9uZyBsb25nICopJih0bXAuc2lnbCkpWzBdOwotKyAgcSA9IHNpZ25pZmljYW5kKCZ0bXApOwotICAgaWYgKCBxICkKLSAgICAgewotLSAgICAgIHJlbV9rZXJuZWwoKCh1bnNpZ25lZCBsb25nIGxvbmcgKikmKFgtPnNpZ2wpKVswXSwKLS0JCSAodW5zaWduZWQgbG9uZyBsb25nICopJih0bXAuc2lnbCksCi0tCQkgKCh1bnNpZ25lZCBsb25nIGxvbmcgKikmKENPTlNUX1BJMi5zaWdsKSlbMF0sCi0rICAgICAgcmVtX2tlcm5lbChzaWduaWZpY2FuZChYKSwKLSsJCSAmc2lnbmlmaWNhbmQoJnRtcCksCi0rCQkgc2lnbmlmaWNhbmQoJkNPTlNUX1BJMiksCi0gCQkgcSwgWC0+ZXhwIC0gQ09OU1RfUEkyLmV4cCk7Ci0gICAgICAgdG1wLmV4cCA9IENPTlNUX1BJMi5leHA7Ci0gICAgICAgbm9ybWFsaXplKCZ0bXApOwotQEAgLTg1LDcgKzg2LDcgQEAKLSAJewotIAkgIC8qIFRoaXMgY29kZSBnaXZlcyB0aGUgZWZmZWN0IG9mIGhhdmluZyBwLzIgdG8gYmV0dGVyIHRoYW4KLSAJICAgICAxMjggYml0cyBwcmVjaXNpb24uICovCi0tCSAgKChsb25nIGxvbmcgKikmKHRtcC5zaWdsKSlbMF0gPSBxICsgMTsKLSsJICBzaWduaWZpY2FuZCgmdG1wKSA9IHEgKyAxOwotIAkgIHRtcC5leHAgPSBFWFBfQklBUyArIDYzOwotIAkgIG5vcm1hbGl6ZSgmdG1wKTsKLSAJICByZWdfbXVsKCZDT05TVF9QSTJleHRyYSwgJnRtcCwgJnRtcCwgRlVMTF9QUkVDSVNJT04pOwotQEAgLTEwNCw3ICsxMDUsNyBAQAotIAl7Ci0gCSAgLyogVGhpcyBjb2RlIGdpdmVzIHRoZSBlZmZlY3Qgb2YgaGF2aW5nIHAvMiB0byBiZXR0ZXIgdGhhbgotIAkgICAgIDEyOCBiaXRzIHByZWNpc2lvbi4gKi8KLS0JICAoKGxvbmcgbG9uZyAqKSYodG1wLnNpZ2wpKVswXSA9IHE7Ci0rCSAgc2lnbmlmaWNhbmQoJnRtcCkgPSBxOwotIAkgIHRtcC5leHAgPSBFWFBfQklBUyArIDYzOwotIAkgIG5vcm1hbGl6ZSgmdG1wKTsKLSAJICByZWdfbXVsKCZDT05TVF9QSTJleHRyYSwgJnRtcCwgJnRtcCwgRlVMTF9QUkVDSVNJT04pOwotQEAgLTIwNCwxMCArMjA1LDcgQEAKLSAKLSBzdGF0aWMgdm9pZCBmMnhtMSh2b2lkKQotIHsKLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICBzd2l0Y2ggKCBGUFVfc3QwX3RhZyApCi0gICAgIHsKLSAgICAgY2FzZSBUV19WYWxpZDoKLUBAIC0zNjMsMTEgKzM2MSw3IEBACi0gCi0gICBpZiAoIFNUQUNLX09WRVJGTE9XICkKLSAgICAgeyAgc3RhY2tfb3ZlcmZsb3coKTsgcmV0dXJuOyB9Ci0tCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgaWYgKCAhKEZQVV9zdDBfdGFnIF4gVFdfVmFsaWQpICkKLSAgICAgewotICAgICAgIGxvbmcgZTsKLUBAIC00MzIsMTkgKzQyNiwxMyBAQAotIAotIHN0YXRpYyB2b2lkIGZkZWNzdHAodm9pZCkKLSB7Ci0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgdG9wLS07ICAvKiBGUFVfc3QwX3B0ciB3aWxsIGJlIGZpeGVkIGluIG1hdGhfZW11bGF0ZSgpIGJlZm9yZSB0aGUgbmV4dCBpbnN0ciAqLwotIH0KLSAKLSBzdGF0aWMgdm9pZCBmaW5jc3RwKHZvaWQpCi0gewotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIHRvcCsrOyAgLyogRlBVX3N0MF9wdHIgd2lsbCBiZSBmaXhlZCBpbiBtYXRoX2VtdWxhdGUoKSBiZWZvcmUgdGhlIG5leHQgaW5zdHIgKi8KLSB9Ci0gCi1AQCAtNDUxLDEwICs0MzksNyBAQAotIAotIHN0YXRpYyB2b2lkIGZzcXJ0Xyh2b2lkKQotIHsKLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICBpZiAoICEoRlBVX3N0MF90YWcgXiBUV19WYWxpZCkgKQotICAgICB7Ci0gICAgICAgaW50IGV4cG9uOwotQEAgLTcyOSw3ICs3MTQsNyBAQAotICAqLwotIHN0YXRpYyB2b2lkIHJlbV9rZXJuZWwodW5zaWduZWQgbG9uZyBsb25nIHN0MCwgdW5zaWduZWQgbG9uZyBsb25nICp5LAotIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdDEsCi0tCQkgICAgICAgbG9uZyBsb25nIHEsIGludCBuKQotKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxLCBpbnQgbikKLSB7Ci0gICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKLSAKLUBAIC03OTAsMTEgKzc3NSwxMSBAQAotIAkJewotIAkJICByb3VuZF90b19pbnQoJnRtcCk7ICAvKiBGb3J0dW5hdGVseSwgdGhpcyBjYW4ndCBvdmVyZmxvdwotIAkJCQkJICB0byAyXjY0ICovCi0tCQkgIHEgPSAoKGxvbmcgbG9uZyAqKSYodG1wLnNpZ2wpKVswXTsKLSsJCSAgcSA9IHNpZ25pZmljYW5kKCZ0bXApOwotIAotLQkJICByZW1fa2VybmVsKCgodW5zaWduZWQgbG9uZyBsb25nICopJihGUFVfc3QwX3B0ci0+c2lnbCkpWzBdLAotLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYodG1wLnNpZ2wpLAotLQkJCSAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcgKikmKHN0MV9wdHItPnNpZ2wpKVswXSwKLSsJCSAgcmVtX2tlcm5lbChzaWduaWZpY2FuZChGUFVfc3QwX3B0ciksCi0rCQkJICAgICAmc2lnbmlmaWNhbmQoJnRtcCksCi0rCQkJICAgICBzaWduaWZpY2FuZChzdDFfcHRyKSwKLSAJCQkgICAgIHEsIGV4cGRpZik7Ci0gCi0gCQkgIHRtcC5leHAgPSBzdDFfcHRyLT5leHA7Ci1AQCAtODA4LDE0ICs3OTMsMjQgQEAKLSAKLSAJICAgICAgaWYgKCAocm91bmQgPT0gUkNfUk5EKSAmJiAodG1wLnNpZ2ggJiAweGMwMDAwMDAwKSApCi0gCQl7Ci0tCQkgIC8qIFdlIG1heSBuZWVkIHRvIHN1YnRyYWN0IHN0KDEpIG9uY2UgbW9yZS4gKi8KLSsJCSAgLyogV2UgbWF5IG5lZWQgdG8gc3VidHJhY3Qgc3QoMSkgb25jZSBtb3JlLAotKwkJICAgICB0byBnZXQgYSByZXN1bHQgPD0gMS8yIG9mIHN0KDEpLiAqLwotIAkJICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKLS0JCSAgeCA9ICgodW5zaWduZWQgbG9uZyBsb25nICopJihzdDFfcHRyLT5zaWdsKSlbMF0gLQotLQkJICAgICgodW5zaWduZWQgbG9uZyBsb25nICopJih0bXAuc2lnbCkpWzBdOwotLQkJICBpZiAoIHggPCAoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYodG1wLnNpZ2wpKVswXSApCi0rCQkgIGV4cGRpZiA9IHN0MV9wdHItPmV4cCAtIHRtcC5leHA7Ci0rCQkgIGlmICggZXhwZGlmIDw9IDEgKQotIAkJICAgIHsKLS0JCSAgICAgIHRtcC5zaWduIF49IChTSUdOX1BPU15TSUdOX05FRyk7Ci0tCQkgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYodG1wLnNpZ2wpKVswXSA9IHg7Ci0rCQkgICAgICBpZiAoIGV4cGRpZiA9PSAwICkKLSsJCQl4ID0gc2lnbmlmaWNhbmQoc3QxX3B0cikgLSBzaWduaWZpY2FuZCgmdG1wKTsKLSsJCSAgICAgIGVsc2UgLyogZXhwZGlmIGlzIDEgKi8KLSsJCQl4ID0gKHNpZ25pZmljYW5kKHN0MV9wdHIpIDw8IDEpIC0gc2lnbmlmaWNhbmQoJnRtcCk7Ci0rCQkgICAgICBpZiAoICh4IDwgc2lnbmlmaWNhbmQoJnRtcCkpIHx8Ci0rCQkJICAvKiBvciBlcXVpLWRpc3RhbnQgKGZyb20gMCAmIHN0KDEpKSBhbmQgcSBpcyBvZGQgKi8KLSsJCQkgICgoeCA9PSBzaWduaWZpY2FuZCgmdG1wKSkgJiYgKHEgJiAxKSApICkKLSsJCQl7Ci0rCQkJICB0bXAuc2lnbiBePSAoU0lHTl9QT1NeU0lHTl9ORUcpOwotKwkJCSAgc2lnbmlmaWNhbmQoJnRtcCkgPSB4OwotKwkJCSAgcSsrOwotKwkJCX0KLSAJCSAgICB9Ci0gCQl9Ci0gCi1AQCAtODQ5LDEwICs4NDQsMTAgQEAKLSAKLSAJICByb3VuZF90b19pbnQoJnRtcCk7ICAvKiBGb3J0dW5hdGVseSwgdGhpcyBjYW4ndCBvdmVyZmxvdyB0byAyXjY0ICovCi0gCi0tCSAgcmVtX2tlcm5lbCgoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYoRlBVX3N0MF9wdHItPnNpZ2wpKVswXSwKLS0JCSAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcgKikmKHRtcC5zaWdsKSksCi0tCQkgICAgICgodW5zaWduZWQgbG9uZyBsb25nICopJihzdDFfcHRyLT5zaWdsKSlbMF0sCi0tCQkgICAgICgobG9uZyBsb25nICopJih0bXAuc2lnbCkpWzBdLAotKwkgIHJlbV9rZXJuZWwoc2lnbmlmaWNhbmQoRlBVX3N0MF9wdHIpLAotKwkJICAgICAmc2lnbmlmaWNhbmQoJnRtcCksCi0rCQkgICAgIHNpZ25pZmljYW5kKHN0MV9wdHIpLAotKwkJICAgICBzaWduaWZpY2FuZCgmdG1wKSwKLSAJCSAgICAgdG1wLmV4cCAtIEVYUF9CSUFTCi0gCQkgICAgICk7IAotIAkgIHRtcC5leHAgPSBleHBfMSArIGV4cGRpZjsKLUBAIC04ODIsMTMgKzg3NywxNSBAQAotIAotICAgICAgIGNvbnRyb2xfd29yZCA9IG9sZF9jdzsKLSAgICAgICBwYXJ0aWFsX3N0YXR1cyA9IHNhdmVkX3N0YXR1czsKLS0gICAgICBub3JtYWxpemUoJnRtcCk7Ci0rICAgICAgbm9ybWFsaXplX251bygmdG1wKTsKLSAgICAgICByZWdfbW92ZSgmdG1wLCBGUFVfc3QwX3B0cik7Ci0gICAgICAgc2V0Y2MoY2MpOwotIAotLSAgICAgIGlmICggRlBVX3N0MF9wdHItPnRhZyAhPSBUV19aZXJvICkKLS0JLyogVXNlIHJvdW5kX3JlZygpIHRvIHByb3Blcmx5IGRldGVjdCB1bmRlci9vdmVyZmxvdyBldGMgKi8KLS0Jcm91bmRfcmVnKEZQVV9zdDBfcHRyLCAwLCBjb250cm9sX3dvcmQpOwotKyAgICAgIC8qIFRoZSBvbmx5IGNvbmRpdGlvbiB0byBiZSBsb29rZWQgZm9yIGlzIHVuZGVyZmxvdywKLSsJIGFuZCBpdCBjYW4gb2NjdXIgaGVyZSBvbmx5IGlmIHVuZGVyZmxvdyBpcyB1bm1hc2tlZC4gKi8KLSsgICAgICBpZiAoIChGUFVfc3QwX3B0ci0+ZXhwIDw9IEVYUF9VTkRFUikgJiYgKEZQVV9zdDBfcHRyLT50YWcgIT0gVFdfWmVybykKLSsJICAmJiAhKGNvbnRyb2xfd29yZCAmIENXX1VuZGVyZmxvdykgKQotKwlhcml0aF91bmRlcmZsb3coRlBVX3N0MF9wdHIpOwotIAotICAgICAgIHJldHVybjsKLSAgICAgfQotQEAgLTk2MSwxMCArOTU4LDcgQEAKLSAgIEZQVV9SRUcgKnN0MV9wdHIgPSAmc3QoMSk7Ci0gICBjaGFyIHN0MV90YWcgPSBzdDFfcHRyLT50YWc7Ci0gCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgaWYgKCAhKChGUFVfc3QwX3RhZyBeIFRXX1ZhbGlkKSB8IChzdDFfdGFnIF4gVFdfVmFsaWQpKSApCi0gICAgIHsKLSAgICAgICBpZiAoIEZQVV9zdDBfcHRyLT5zaWduID09IFNJR05fUE9TICkKLUBAIC0xMTU1LDEwICsxMTQ5LDcgQEAKLSAgIGNoYXIgc3QxX3RhZyA9IHN0MV9wdHItPnRhZzsKLSAgIGNoYXIgc3QxX3NpZ24gPSBzdDFfcHRyLT5zaWduLCBzdDBfc2lnbiA9IEZQVV9zdDBfcHRyLT5zaWduOwotIAotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIGlmICggISgoRlBVX3N0MF90YWcgXiBUV19WYWxpZCkgfCAoc3QxX3RhZyBeIFRXX1ZhbGlkKSkgKQotICAgICB7Ci0gICAgICAgaW50IHNhdmVkX2NvbnRyb2wsIHNhdmVkX3N0YXR1czsKLUBAIC0xMzM2LDEwICsxMzI3LDcgQEAKLSAgIEZQVV9SRUcgKnN0MV9wdHIgPSAmc3QoMSk7Ci0gICBjaGFyIHN0MV90YWcgPSBzdDFfcHRyLT50YWc7Ci0gCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgaWYgKCAhKChGUFVfc3QwX3RhZyBeIFRXX1ZhbGlkKSB8IChzdDFfdGFnIF4gVFdfVmFsaWQpKSApCi0gICAgIHsKLSAgICAgICBpbnQgc2F2ZWRfY29udHJvbCwgc2F2ZWRfc3RhdHVzOwotQEAgLTE1NjAsMTAgKzE1NDgsNyBAQAotICAgaW50IG9sZF9jdyA9IGNvbnRyb2xfd29yZDsKLSAgIGNoYXIgc2lnbiA9IEZQVV9zdDBfcHRyLT5zaWduOwotIAotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgIGlmICggISgoRlBVX3N0MF90YWcgXiBUV19WYWxpZCkgfCAoc3QxX3RhZyBeIFRXX1ZhbGlkKSkgKQotICAgICB7Ci0gICAgICAgbG9uZyBzY2FsZTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2xvYWRfc3RvcmUuYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9sb2FkX3N0b3JlLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L2xvYWRfc3RvcmUuYwlUaHUgSnVsIDIyIDAxOjExOjUxIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS9sb2FkX3N0b3JlLmMJV2VkIFNlcCAgMSAxODozMDowNSAxOTkzCi1AQCAtODQsMTAgKzg0LDcgQEAKLSBzd2l0Y2ggKCB0eXBlICkKLSAgIHsKLSAgIGNhc2UgMDAwOiAgICAgICAvKiBmbGQgbTMycmVhbCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIHJlZ19sb2FkX3NpbmdsZSgpOwotICAgICBpZiAoIChGUFVfbG9hZGVkX2RhdGEudGFnID09IFRXX05hTikgJiYKLSAJcmVhbF8yb3BfTmFOKCZGUFVfbG9hZGVkX2RhdGEsICZGUFVfbG9hZGVkX2RhdGEsICZGUFVfbG9hZGVkX2RhdGEpICkKLUBAIC05OCwxOCArOTUsMTIgQEAKLSAgICAgcmVnX21vdmUoJkZQVV9sb2FkZWRfZGF0YSwgcG9wX3B0cik7Ci0gICAgIGJyZWFrOwotICAgY2FzZSAwMDE6ICAgICAgLyogZmlsZCBtMzJpbnQgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgICByZWdfbG9hZF9pbnQzMigpOwotICAgICByZWdfbW92ZSgmRlBVX2xvYWRlZF9kYXRhLCBwb3BfcHRyKTsKLSAgICAgYnJlYWs7Ci0gICBjYXNlIDAwMjogICAgICAvKiBmbGQgbTY0cmVhbCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIHJlZ19sb2FkX2RvdWJsZSgpOwotICAgICBpZiAoIChGUFVfbG9hZGVkX2RhdGEudGFnID09IFRXX05hTikgJiYKLSAJcmVhbF8yb3BfTmFOKCZGUFVfbG9hZGVkX2RhdGEsICZGUFVfbG9hZGVkX2RhdGEsICZGUFVfbG9hZGVkX2RhdGEpICkKLUBAIC0xMjAsNzMgKzExMSw0NiBAQAotICAgICByZWdfbW92ZSgmRlBVX2xvYWRlZF9kYXRhLCBwb3BfcHRyKTsKLSAgICAgYnJlYWs7Ci0gICBjYXNlIDAwMzogICAgICAvKiBmaWxkIG0xNmludCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIHJlZ19sb2FkX2ludDE2KCk7Ci0gICAgIHJlZ19tb3ZlKCZGUFVfbG9hZGVkX2RhdGEsIHBvcF9wdHIpOwotICAgICBicmVhazsKLSAgIGNhc2UgMDEwOiAgICAgIC8qIGZzdCBtMzJyZWFsICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgICAgcmVnX3N0b3JlX3NpbmdsZSgpOwotICAgICBicmVhazsKLSAgIGNhc2UgMDExOiAgICAgIC8qIGZpc3QgbTMyaW50ICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgICAgcmVnX3N0b3JlX2ludDMyKCk7Ci0gICAgIGJyZWFrOwotICAgY2FzZSAwMTI6ICAgICAvKiBmc3QgbTY0cmVhbCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIHJlZ19zdG9yZV9kb3VibGUoKTsKLSAgICAgYnJlYWs7Ci0gICBjYXNlIDAxMzogICAgIC8qIGZpc3QgbTE2aW50ICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgICAgcmVnX3N0b3JlX2ludDE2KCk7Ci0gICAgIGJyZWFrOwotICAgY2FzZSAwMTQ6ICAgICAvKiBmc3RwIG0zMnJlYWwgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgICBpZiAoIHJlZ19zdG9yZV9zaW5nbGUoKSApCi0gICAgICAgcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAotIAkJIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCi0gICAgIGJyZWFrOwotICAgY2FzZSAwMTU6ICAgICAvKiBmaXN0cCBtMzJpbnQgKi8KLS0jaWZkZWYgUEVDVUxJQVJfNDg2Ci0tICAgIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICAgIGNsZWFyX0MxKCk7Ci0tI2VuZGlmIFBFQ1VMSUFSXzQ4NgotICAgICBpZiAoIHJlZ19zdG9yZV9pbnQzMigpICkKLSAgICAgICBwb3BfMCgpOyAgLyogcG9wIG9ubHkgaWYgdGhlIG51bWJlciB3YXMgYWN0dWFsbHkgc3RvcmVkCi0gCQkgKHNlZSB0aGUgODA0ODYgbWFudWFsIHAxNi0yOCkgKi8KLSAgICAgYnJlYWs7Ci0gICBjYXNlIDAxNjogICAgIC8qIGZzdHAgbTY0cmVhbCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIGlmICggcmVnX3N0b3JlX2RvdWJsZSgpICkKLSAgICAgICBwb3BfMCgpOyAgLyogcG9wIG9ubHkgaWYgdGhlIG51bWJlciB3YXMgYWN0dWFsbHkgc3RvcmVkCi0gCQkgKHNlZSB0aGUgODA0ODYgbWFudWFsIHAxNi0yOCkgKi8KLSAgICAgYnJlYWs7Ci0gICBjYXNlIDAxNzogICAgIC8qIGZpc3RwIG0xNmludCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIGlmICggcmVnX3N0b3JlX2ludDE2KCkgKQotICAgICAgIHBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKLSAJCSAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLwotQEAgLTE5OCwxMCArMTYyLDcgQEAKLSAgICAgZnJzdG9yKCk7Ci0gICAgIGJyZWFrOwotICAgY2FzZSAwMjM6ICAgICAvKiBmYmxkIG04MGRlYyAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIHJlZ19sb2FkX2JjZCgpOwotICAgICByZWdfbW92ZSgmRlBVX2xvYWRlZF9kYXRhLCBwb3BfcHRyKTsKLSAgICAgYnJlYWs7Ci1AQCAtMjIwLDE4ICsxODEsMTIgQEAKLSAgICAgTk9fTkVUX0lOU1RSX0VGRkVDVDsKLSAgICAgYnJlYWs7Ci0gICBjYXNlIDAyNTogICAgICAvKiBmbGQgbTgwcmVhbCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIHJlZ19sb2FkX2V4dGVuZGVkKCk7Ci0gICAgIHJlZ19tb3ZlKCZGUFVfbG9hZGVkX2RhdGEsIHBvcF9wdHIpOwotICAgICBicmVhazsKLSAgIGNhc2UgMDI3OiAgICAgIC8qIGZpbGQgbTY0aW50ICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgICAgcmVnX2xvYWRfaW50NjQoKTsKLSAgICAgcmVnX21vdmUoJkZQVV9sb2FkZWRfZGF0YSwgcG9wX3B0cik7Ci0gICAgIGJyZWFrOwotQEAgLTI0NCwxMCArMTk5LDcgQEAKLSAgICAgTk9fTkVUX0RBVEFfRUZGRUNUOwotICAgICBicmVhazsKLSAgIGNhc2UgMDMzOiAgICAgIC8qIGZic3RwIG04MGRlYyAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIGlmICggcmVnX3N0b3JlX2JjZCgpICkKLSAgICAgICBwb3BfMCgpOyAgLyogcG9wIG9ubHkgaWYgdGhlIG51bWJlciB3YXMgYWN0dWFsbHkgc3RvcmVkCi0gCQkgKHNlZSB0aGUgODA0ODYgbWFudWFsIHAxNi0yOCkgKi8KLUBAIC0yNjEsMTAgKzIxMyw3IEBACi0gICAgIE5PX05FVF9JTlNUUl9FRkZFQ1Q7Ci0gICAgIGJyZWFrOwotICAgY2FzZSAwMzU6ICAgICAgLyogZnN0cCBtODByZWFsICovCi0tI2lmZGVmIFBFQ1VMSUFSXzQ4NgotLSAgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotICAgICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSAgICAgaWYgKCByZWdfc3RvcmVfZXh0ZW5kZWQoKSApCi0gICAgICAgcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAotIAkJIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCi1AQCAtMjc4LDEwICsyMjcsNyBAQAotICAgICBOT19ORVRfSU5TVFJfRUZGRUNUOwotICAgICBicmVhazsKLSAgIGNhc2UgMDM3OiAgICAgIC8qIGZpc3RwIG02NGludCAqLwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KLSAgICAgY2xlYXJfQzEoKTsKLS0jZW5kaWYgUEVDVUxJQVJfNDg2Ci0gICAgIGlmICggcmVnX3N0b3JlX2ludDY0KCkgKQotICAgICAgIHBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKLSAJCSAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9hdGFuLmMgbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9hdGFuLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfYXRhbi5jCVRodSBKdWwgMjIgMDE6MTE6NTEgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfYXRhbi5jCVdlZCBTZXAgIDEgMTg6MzA6MDUgMTk5MwotQEAgLTM4LDEyICszOCw5IEBACi0gICB7IDB4ZjFkZDJkYmYsIDB4MDAwYTUzMGEgfQotIH07Ci0gCi0rc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBkZW5vbXRlcm0gPSAweGVhMmU2NjEyZmM0YmQyMDhMTDsKLSAKLS1zdGF0aWMgdW5zaWduZWQgZGVub210ZXJtWzJdID0KLS17IDB4ZmM0YmQyMDgsIDB4ZWEyZTY2MTIgfTsKLSAKLS0KLS0KLSAvKi0tLSBwb2x5X2F0YW4oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1AQCAtNTMsNyArNTAsNyBAQAotICAgc2hvcnQJCWV4cG9uZW50OwotICAgRlBVX1JFRyAgICAgICBvZGRfcG9seSwgZXZlbl9wb2x5LCBwb3NfcG9seSwgbmVnX3BvbHksIHJhdGlvOwotICAgRlBVX1JFRyAgICAgICBhcmdTcTsKLS0gIGxvbmcgbG9uZyAgICAgYXJnX3NpZ25pZiwgYXJnU3FTcTsKLSsgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgYXJnX3NpZ25pZiwgYXJnU3FTcTsKLSAgIAotIAotICNpZmRlZiBQQVJBTk9JRAotQEAgLTk3LDIwICs5NCwyMCBAQAotIAotIAkgIHJlY3Vyc2lvbnMrKzsKLSAKLS0JICBhcmdfc2lnbmlmID0gKihsb25nIGxvbmcgKikmKGFyZy0+c2lnbCk7Ci0rCSAgYXJnX3NpZ25pZiA9IHNpZ25pZmljYW5kKGFyZyk7Ci0gCSAgaWYgKCBleHBvbmVudCA8IC0xICkKLSAJICAgIHsKLSAJICAgICAgaWYgKCBzaHJ4KCZhcmdfc2lnbmlmLCAtMS1leHBvbmVudCkgPj0gMHg4MDAwMDAwMFUgKQotIAkJYXJnX3NpZ25pZisrOwkvKiByb3VuZCB1cCAqLwotIAkgICAgfQotLQkgICoobG9uZyBsb25nICopJihudW1lcmF0b3Iuc2lnbCkgPSAtYXJnX3NpZ25pZjsKLSsJICBzaWduaWZpY2FuZCgmbnVtZXJhdG9yKSA9IC1hcmdfc2lnbmlmOwotIAkgIG51bWVyYXRvci5leHAgPSBFWFBfQklBUyAtIDE7Ci0gCSAgbm9ybWFsaXplKCZudW1lcmF0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgLyogMSAtIGFyZyAqLwotIAotLQkgIGFyZ19zaWduaWYgPSAqKGxvbmcgbG9uZyAqKSYoYXJnLT5zaWdsKTsKLSsJICBhcmdfc2lnbmlmID0gc2lnbmlmaWNhbmQoYXJnKTsKLSAJICBpZiAoIHNocngoJmFyZ19zaWduaWYsIC1leHBvbmVudCkgPj0gMHg4MDAwMDAwMFUgKQotIAkgICAgYXJnX3NpZ25pZisrOwkvKiByb3VuZCB1cCAqLwotLQkgICoobG9uZyBsb25nICopJihkZW5vbS5zaWdsKSA9IGFyZ19zaWduaWY7Ci0rCSAgc2lnbmlmaWNhbmQoJmRlbm9tKSA9IGFyZ19zaWduaWY7Ci0gCSAgZGVub20uc2lnaCB8PSAweDgwMDAwMDAwOyAgICAgICAgICAgICAgICAgICAgLyogMSArIGFyZyAqLwotIAotIAkgIGFyZy0+ZXhwID0gbnVtZXJhdG9yLmV4cDsKLUBAIC0xMjAsNyArMTE3LDcgQEAKLSAJfQotICAgICB9Ci0gCi0tICAqKGxvbmcgbG9uZyAqKSZhcmdfc2lnbmlmID0gKihsb25nIGxvbmcgKikmKGFyZy0+c2lnbCk7Ci0rICBhcmdfc2lnbmlmID0gc2lnbmlmaWNhbmQoYXJnKTsKLSAKLSAjaWZkZWYgUEFSQU5PSUQKLSAgIC8qIFRoaXMgbXVzdCBhbHdheXMgYmUgdHJ1ZSAqLwotQEAgLTEzNiw4ICsxMzMsOCBAQAotICAgCi0gICAvKiBOb3cgaGF2ZSBhcmdfc2lnbmlmIHdpdGggYmluYXJ5IHBvaW50IGF0IHRoZSBsZWZ0Ci0gICAgICAuMXh4eHh4eHh4ICovCi0tICBtdWw2NCgmYXJnX3NpZ25pZiwgJmFyZ19zaWduaWYsIChsb25nIGxvbmcgKikoJmFyZ1NxLnNpZ2wpKTsKLS0gIG11bDY0KChsb25nIGxvbmcgKikoJmFyZ1NxLnNpZ2wpLCAobG9uZyBsb25nICopKCZhcmdTcS5zaWdsKSwgJmFyZ1NxU3EpOwotKyAgbXVsNjQoJmFyZ19zaWduaWYsICZhcmdfc2lnbmlmLCAmc2lnbmlmaWNhbmQoJmFyZ1NxKSk7Ci0rICBtdWw2NCgmc2lnbmlmaWNhbmQoJmFyZ1NxKSwgJnNpZ25pZmljYW5kKCZhcmdTcSksICZhcmdTcVNxKTsKLSAKLSAgIC8qIHdpbGwgYmUgYSB2YWxpZCBwb3NpdGl2ZSBuciB3aXRoIGV4cG9uID0gMCAqLwotICAgKihzaG9ydCAqKSYocG9zX3BvbHkuc2lnbikgPSAwOwotQEAgLTE0Niw4ICsxNDMsOCBAQAotICAgLyogRG8gdGhlIGJhc2ljIGZpeGVkIHBvaW50IHBvbHlub21pYWwgZXZhbHVhdGlvbiAqLwotICAgcG9seW5vbWlhbCgmcG9zX3BvbHkuc2lnbCwgKHVuc2lnbmVkICopJmFyZ1NxU3EsCi0gCSAgICAgKHVuc2lnbmVkIHNob3J0ICgqKVs0XSlvZGRwbHRlcm1zLCBISVBPV0VSb3AtMSk7Ci0tICBtdWw2NCgobG9uZyBsb25nICopKCZhcmdTcS5zaWdsKSwgKGxvbmcgbG9uZyAqKSgmcG9zX3BvbHkuc2lnbCksCi0tCShsb25nIGxvbmcgKikoJnBvc19wb2x5LnNpZ2wpKTsKLSsgIG11bDY0KCZzaWduaWZpY2FuZCgmYXJnU3EpLCAmc2lnbmlmaWNhbmQoJnBvc19wb2x5KSwKLSsJJnNpZ25pZmljYW5kKCZwb3NfcG9seSkpOwotIAotICAgLyogd2lsbCBiZSBhIHZhbGlkIHBvc2l0aXZlIG5yIHdpdGggZXhwb24gPSAwICovCi0gICAqKHNob3J0ICopJihuZWdfcG9seS5zaWduKSA9IDA7Ci1AQCAtMTU4LDcgKzE1NSw3IEBACi0gCSAgICAgKHVuc2lnbmVkIHNob3J0ICgqKVs0XSlvZGRuZWd0ZXJtcywgSElQT1dFUm9uLTEpOwotIAotICAgLyogU3VidHJhY3QgdGhlIG1hbnRpc3NhcyAqLwotLSAgKigobG9uZyBsb25nICopKCZwb3NfcG9seS5zaWdsKSkgLT0gKigobG9uZyBsb25nICopKCZuZWdfcG9seS5zaWdsKSk7Ci0rICBzaWduaWZpY2FuZCgmcG9zX3BvbHkpIC09IHNpZ25pZmljYW5kKCZuZWdfcG9seSk7Ci0gCi0gICByZWdfbW92ZSgmcG9zX3BvbHksICZvZGRfcG9seSk7Ci0gICBwb2x5X2FkZF8xKCZvZGRfcG9seSk7Ci1AQCAtMTY2LDggKzE2Myw3IEBACi0gICAvKiB3aWxsIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnIgd2l0aCBleHBvbiA9IDAgKi8KLSAgICooc2hvcnQgKikmKGV2ZW5fcG9seS5zaWduKSA9IDA7Ci0gCi0tICBtdWw2NCgobG9uZyBsb25nICopKCZhcmdTcS5zaWdsKSwKLS0JKGxvbmcgbG9uZyAqKSgmZGVub210ZXJtKSwgKGxvbmcgbG9uZyAqKSgmZXZlbl9wb2x5LnNpZ2wpKTsKLSsgIG11bDY0KCZzaWduaWZpY2FuZCgmYXJnU3EpLCAmZGVub210ZXJtLCAmc2lnbmlmaWNhbmQoJmV2ZW5fcG9seSkpOwotIAotICAgcG9seV9hZGRfMSgmZXZlbl9wb2x5KTsKLSAKLUBAIC0xOTgsNyArMTk0LDcgQEAKLSBzaHJ4KCZzcmMtPnNpZ2wsIDEpOwotIAotICNpZmRlZiBPQlNPTEVURQotLWlmICggcm91bmQgKSAoKihsb25nIGxvbmcgKikmc3JjLT5zaWdsKSsrOyAgIC8qIFJvdW5kIHRvIGV2ZW4gKi8KLStpZiAoIHJvdW5kICkgc2lnbmlmaWNhbmQoc3JjKSsrOyAgIC8qIFJvdW5kIHRvIGV2ZW4gKi8KLSAjZW5kaWYgT0JTT0xFVEUKLSAKLSBzcmMtPnNpZ2ggfD0gMHg4MDAwMDAwMDsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfZGl2LlMgbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9kaXYuUwotLS0tIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9kaXYuUwlUdWUgTm92IDEwIDEyOjU0OjU0IDE5OTIKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS9wb2x5X2Rpdi5TCVdlZCBTZXAgIDEgMTg6MzA6MDUgMTk5MwotQEAgLTgsOSArOCw5IEBACi0gIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBhcG0yMzNtQHZheGMuY2MubW9uYXNoLmVkdS5hdSAgICB8Ci0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tIHwgICB2b2lkIHBvbHlfZGl2Mihsb25nIGxvbmcgKngpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tIHwgICB2b2lkIHBvbHlfZGl2NChsb25nIGxvbmcgKngpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tIHwgICB2b2lkIHBvbHlfZGl2MTYobG9uZyBsb25nICp4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rIHwgICB2b2lkIHBvbHlfZGl2Mih1bnNpZ25lZCBsb25nIGxvbmcgKngpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rIHwgICB2b2lkIHBvbHlfZGl2NCh1bnNpZ25lZCBsb25nIGxvbmcgKngpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0rIHwgICB2b2lkIHBvbHlfZGl2MTYodW5zaWduZWQgbG9uZyBsb25nICp4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9sMi5jIGxpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfbDIuYwotLS0tIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9sMi5jCVN1biBNYXkgMjMgMTQ6NDg6MzUgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfbDIuYwlXZWQgU2VwICAxIDE4OjMwOjA1IDE5OTMKLUBAIC00NSw3ICs0NSw3IEBACi0gICBzaG9ydAkJICBleHBvbmVudDsKLSAgIGNoYXIJCSAgemVybzsJCS8qIGZsYWcgZm9yIGFuIFh4ID09IDAgKi8KLSAgIHVuc2lnbmVkIHNob3J0ICBiaXRzLCBzaGlmdDsKLS0gIGxvbmcgbG9uZyAgICAgICBYc3E7Ci0rICB1bnNpZ25lZCBsb25nIGxvbmcgICAgICAgWHNxOwotICAgRlBVX1JFRwkgIGFjY3VtLCBkZW5vbSwgbnVtLCBYeDsKLSAKLSAKLUBAIC03OSw3ICs3OSw3IEBACi0gCi0gICBkZW5vbS5zaWdsID0gbnVtLnNpZ2w7Ci0gICBkZW5vbS5zaWdoID0gbnVtLnNpZ2g7Ci0tICBwb2x5X2RpdjQoKGxvbmcgbG9uZyAqKSYoZGVub20uc2lnbCkpOwotKyAgcG9seV9kaXY0KCZzaWduaWZpY2FuZCgmZGVub20pKTsKLSAgIGRlbm9tLnNpZ2ggKz0gMHg4MDAwMDAwMDsJCQkvKiBzZXQgdGhlIG1zYiAqLwotICAgWHguZXhwID0gRVhQX0JJQVM7ICAvKiBuZWVkZWQgdG8gcHJldmVudCBlcnJvcnMgaW4gZGl2IHJvdXRpbmUgKi8KLSAgIHJlZ191X2RpdigmbnVtLCAmZGVub20sICZYeCwgRlVMTF9QUkVDSVNJT04pOwotQEAgLTg2LDcgKzg2LDcgQEAKLSAKLSAgIHplcm8gPSAhKFh4LnNpZ2ggfCBYeC5zaWdsKTsKLSAgIAotLSAgbXVsNjQoKGxvbmcgbG9uZyAqKSZYeC5zaWdsLCAobG9uZyBsb25nICopJlh4LnNpZ2wsICZYc3EpOwotKyAgbXVsNjQoJnNpZ25pZmljYW5kKCZYeCksICZzaWduaWZpY2FuZCgmWHgpLCAmWHNxKTsKLSAgIHBvbHlfZGl2MTYoJlhzcSk7Ci0gCi0gICBhY2N1bS5leHAgPSAtMTsJCS8qIGV4cG9uZW50IG9mIGFjY3VtICovCi1AQCAtMTIzLDcgKzEyMyw3IEBACi0gCSAgICB7Ci0gCSAgICAgIC8qIFRoZSBhcmd1bWVudCBpcyBvZiB0aGUgZm9ybSAxLXggKi8KLSAJICAgICAgLyogVXNlICAxLTEvKDEteCkgPSB4LygxLXgpICovCi0tCSAgICAgICooKGxvbmcgbG9uZyAqKSZudW0uc2lnbCkgPSAtICooKGxvbmcgbG9uZyAqKSYoYXJnLT5zaWdsKSk7Ci0rCSAgICAgIHNpZ25pZmljYW5kKCZudW0pID0gLSBzaWduaWZpY2FuZChhcmcpOwotIAkgICAgICBub3JtYWxpemUoJm51bSk7Ci0gCSAgICAgIHJlZ19kaXYoJm51bSwgYXJnLCAmbnVtLCBGVUxMX1BSRUNJU0lPTik7Ci0gCSAgICB9Ci1AQCAtMTQ5LDE2ICsxNDksMTYgQEAKLSAgICAgICByZXR1cm47Ci0gICAgIH0KLSAKLS0gIG11bDY0KChsb25nIGxvbmcgKikmYWNjdW0uc2lnbCwKLS0JKGxvbmcgbG9uZyAqKSZYeC5zaWdsLCAobG9uZyBsb25nICopJmFjY3VtLnNpZ2wpOwotKyAgbXVsNjQoJnNpZ25pZmljYW5kKCZhY2N1bSksCi0rCSZzaWduaWZpY2FuZCgmWHgpLCAmc2lnbmlmaWNhbmQoJmFjY3VtKSk7Ci0gCi0tICAqKChsb25nIGxvbmcgKikoJmFjY3VtLnNpZ2wpKSArPSAqKChsb25nIGxvbmcgKikoJlh4LnNpZ2wpKTsKLSsgIHNpZ25pZmljYW5kKCZhY2N1bSkgKz0gc2lnbmlmaWNhbmQoJlh4KTsKLSAKLSAgIGlmICggWHguc2lnaCA+IGFjY3VtLnNpZ2ggKQotICAgICB7Ci0gICAgICAgLyogVGhlcmUgd2FzIGFuIG92ZXJmbG93ICovCi0gCi0tICAgICAgcG9seV9kaXYyKChsb25nIGxvbmcgKikmYWNjdW0uc2lnbCk7Ci0rICAgICAgcG9seV9kaXYyKCZzaWduaWZpY2FuZCgmYWNjdW0pKTsKLSAgICAgICBhY2N1bS5zaWdoIHw9IDB4ODAwMDAwMDA7Ci0gICAgICAgYWNjdW0uZXhwKys7Ci0gICAgIH0KLUBAIC0xNzksMTEgKzE3OSwxMSBAQAotIAkgIC8qIFNoaWZ0IHRvIGdldCBleHBvbmVudCA9PSAwICovCi0gCSAgaWYgKCBhY2N1bS5leHAgPCAwICkKLSAJICAgIHsKLS0JICAgICAgcG9seV9kaXYyKChsb25nIGxvbmcgKikmYWNjdW0uc2lnbCk7Ci0rCSAgICAgIHBvbHlfZGl2Migmc2lnbmlmaWNhbmQoJmFjY3VtKSk7Ci0gCSAgICAgIGFjY3VtLmV4cCsrOwotIAkgICAgfQotIAkgIC8qIEp1c3QgbmVnYXRlLCBidXQgdGhyb3cgYXdheSB0aGUgc2lnbiAqLwotLQkgICooKGxvbmcgbG9uZyAqKSYoYWNjdW0uc2lnbCkpID0gLSAqKChsb25nIGxvbmcgKikmKGFjY3VtLnNpZ2wpKTsKLSsJICBzaWduaWZpY2FuZCgmYWNjdW0pID0gLSBzaWduaWZpY2FuZCgmYWNjdW0pOwotIAkgIGlmICggZXhwb25lbnQgPCAwICkKLSAJICAgIGV4cG9uZW50Kys7Ci0gCSAgZWxzZQotQEAgLTE5OCwxMSArMTk4LDExIEBACi0gICAgICAgaWYgKCBhY2N1bS5leHAgKQotIAl7Ci0gCSAgYWNjdW0uZXhwKys7Ci0tCSAgcG9seV9kaXYyKChsb25nIGxvbmcgKikmYWNjdW0uc2lnbCk7Ci0rCSAgcG9seV9kaXYyKCZzaWduaWZpY2FuZCgmYWNjdW0pKTsKLSAJfQotICAgICAgIHdoaWxlICggc2hpZnQgKQotIAl7Ci0tCSAgcG9seV9kaXYyKChsb25nIGxvbmcgKikmYWNjdW0uc2lnbCk7Ci0rCSAgcG9seV9kaXYyKCZzaWduaWZpY2FuZCgmYWNjdW0pKTsKLSAJICBpZiAoIHNoaWZ0ICYgMSkKLSAJICAgIGFjY3VtLnNpZ2ggfD0gMHg4MDAwMDAwMDsKLSAJICBzaGlmdCA+Pj0gMTsKLUBAIC0yMjcsNyArMjI3LDcgQEAKLSBpbnQJcG9seV9sMnAxKEZQVV9SRUcgKmFyZywgRlBVX1JFRyAqcmVzdWx0KQotIHsKLSAgIGNoYXIJCXNpZ24gPSAwOwotLSAgbG9uZyBsb25nICAgICBYc3E7Ci0rICB1bnNpZ25lZCBsb25nIGxvbmcgICAgIFhzcTsKLSAgIEZQVV9SRUcgICAgICAJYXJnX3BsMSwgZGVub20sIGFjY3VtLCBsb2NhbF9hcmcsIHBvbHlfYXJnOwotIAotIAotQEAgLTI2Myw3ICsyNjMsNyBAQAotICAgLyogR2V0IHBvbHlfYXJnIGJpdHMgYWxpZ25lZCBhcyByZXF1aXJlZCAqLwotICAgc2hyeCgodW5zaWduZWQgKikmKHBvbHlfYXJnLnNpZ2wpLCAtKHBvbHlfYXJnLmV4cCAtIEVYUF9CSUFTICsgMykpOwotIAotLSAgbXVsNjQoKGxvbmcgbG9uZyAqKSYocG9seV9hcmcuc2lnbCksIChsb25nIGxvbmcgKikmKHBvbHlfYXJnLnNpZ2wpLCAmWHNxKTsKLSsgIG11bDY0KCZzaWduaWZpY2FuZCgmcG9seV9hcmcpLCAmc2lnbmlmaWNhbmQoJnBvbHlfYXJnKSwgJlhzcSk7Ci0gICBwb2x5X2RpdjE2KCZYc3EpOwotIAotICAgLyogRG8gdGhlIGJhc2ljIGZpeGVkIHBvaW50IHBvbHlub21pYWwgZXZhbHVhdGlvbiAqLwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV9zaW4uYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9wb2x5X3Npbi5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9wb2x5X3Npbi5jCVRodSBKdWwgMjIgMDE6MTE6NTEgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfc2luLmMJV2VkIFNlcCAgMSAxODozMDowNSAxOTkzCi1AQCAtODIsMTMgKzgyLDEzIEBACi0gICAgIHsKLSAgICAgICAvKiBzaGlmdCB0aGUgYXJndW1lbnQgcmlnaHQgYnkgdGhlIHJlcXVpcmVkIHBsYWNlcyAqLwotICAgICAgIGlmICggc2hyeCgmKGZpeGVkX2FyZy5zaWdsKSwgLTEtZXhwb25lbnQpID49IDB4ODAwMDAwMDBVICkKLS0JKCooKGxvbmcgbG9uZyAqKSgmKGZpeGVkX2FyZy5zaWdsKSkpKSsrOwkvKiByb3VuZCB1cCAqLwotKwlzaWduaWZpY2FuZCgmZml4ZWRfYXJnKSsrOwkvKiByb3VuZCB1cCAqLwotICAgICB9Ci0gICAKLS0gIG11bDY0KChsb25nIGxvbmcgKikmKGZpeGVkX2FyZy5zaWdsKSwgKGxvbmcgbG9uZyAqKSYoZml4ZWRfYXJnLnNpZ2wpLAotLQkobG9uZyBsb25nICopJihhcmdfc3FyZC5zaWdsKSk7Ci0tICBtdWw2NCgobG9uZyBsb25nICopJihhcmdfc3FyZC5zaWdsKSwgKGxvbmcgbG9uZyAqKSYoYXJnX3NxcmQuc2lnbCksCi0tCShsb25nIGxvbmcgKikmKGFyZ190b180LnNpZ2wpKTsKLSsgIG11bDY0KCZzaWduaWZpY2FuZCgmZml4ZWRfYXJnKSwgJnNpZ25pZmljYW5kKCZmaXhlZF9hcmcpLAotKwkmc2lnbmlmaWNhbmQoJmFyZ19zcXJkKSk7Ci0rICBtdWw2NCgmc2lnbmlmaWNhbmQoJmFyZ19zcXJkKSwgJnNpZ25pZmljYW5kKCZhcmdfc3FyZCksCi0rCSZzaWduaWZpY2FuZCgmYXJnX3RvXzQpKTsKLSAgIAotICAgLyogd2lsbCBiZSBhIHZhbGlkIHBvc2l0aXZlIG5yIHdpdGggZXhwb24gPSAwICovCi0gICAqKHNob3J0ICopJihhY2N1bS5zaWduKSA9IDA7Ci1AQCAtMTAzLDExICsxMDMsMTEgQEAKLSAgIAotICAgLyogRG8gdGhlIGJhc2ljIGZpeGVkIHBvaW50IHBvbHlub21pYWwgZXZhbHVhdGlvbiAqLwotICAgcG9seW5vbWlhbCgmKG5lZ2FjY3VtLnNpZ2wpLCAmKGFyZ190b180LnNpZ2wpLCBuZWd0ZXJtcywgSElQT1dFUi0xKTsKLS0gIG11bDY0KChsb25nIGxvbmcgKikmKGFyZ19zcXJkLnNpZ2wpLCAobG9uZyBsb25nICopJihuZWdhY2N1bS5zaWdsKSwKLS0JKGxvbmcgbG9uZyAqKSYobmVnYWNjdW0uc2lnbCkpOwotKyAgbXVsNjQoJnNpZ25pZmljYW5kKCZhcmdfc3FyZCksICZzaWduaWZpY2FuZCgmbmVnYWNjdW0pLAotKwkmc2lnbmlmaWNhbmQoJm5lZ2FjY3VtKSk7Ci0gCi0gICAvKiBTdWJ0cmFjdCB0aGUgbWFudGlzc2FzICovCi0tICAqKChsb25nIGxvbmcgKikoJihhY2N1bS5zaWdsKSkpIC09ICooKGxvbmcgbG9uZyAqKSgmKG5lZ2FjY3VtLnNpZ2wpKSk7Ci0rICBzaWduaWZpY2FuZCgmYWNjdW0pIC09IHNpZ25pZmljYW5kKCZuZWdhY2N1bSk7Ci0gICAKLSAgIC8qIENvbnZlcnQgdG8gNjQgYml0IHNpZ25lZC1jb21wYXRpYmxlICovCi0gICBhY2N1bS5leHAgPSBFWFBfQklBUyAtIDEgKyBhY2N1bS5leHA7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9wb2x5X3Rhbi5jIGxpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfdGFuLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L3BvbHlfdGFuLmMJVGh1IEp1bCAyMiAwMToxMTo1MSAxOTkzCi0rKysgbGludXgva2VybmVsL0ZQVS1lbXUvcG9seV90YW4uYwlXZWQgU2VwICAxIDE4OjMwOjA1IDE5OTMKLUBAIC01NCw3ICs1NCw3IEBACi0gICBzaG9ydAkJZXhwb25lbnQ7Ci0gICBGUFVfUkVHICAgICAgIG9kZF9wb2x5LCBldmVuX3BvbHksIHBvc19wb2x5LCBuZWdfcG9seTsKLSAgIEZQVV9SRUcgICAgICAgYXJnU3E7Ci0tICBsb25nIGxvbmcgICAgIGFyZ19zaWduaWYsIGFyZ1NxU3E7Ci0rICB1bnNpZ25lZCBsb25nIGxvbmcgICAgIGFyZ19zaWduaWYsIGFyZ1NxU3E7Ci0gICAKLSAKLSAgIGV4cG9uZW50ID0gYXJnLT5leHAgLSBFWFBfQklBUzsKLUBAIC02NCw3ICs2NCw3IEBACi0gICAgIHsgYXJpdGhfaW52YWxpZCh5X3JlZyk7IHJldHVybjsgfSAgLyogTmVlZCBhIHBvc2l0aXZlIG51bWJlciAqLwotICNlbmRpZiBQQVJBTk9JRAotIAotLSAgKihsb25nIGxvbmcgKikmYXJnX3NpZ25pZiA9ICoobG9uZyBsb25nICopJihhcmctPnNpZ2wpOwotKyAgYXJnX3NpZ25pZiA9IHNpZ25pZmljYW5kKGFyZyk7Ci0gICBpZiAoIGV4cG9uZW50IDwgLTEgKQotICAgICB7Ci0gICAgICAgLyogc2hpZnQgdGhlIGFyZ3VtZW50IHJpZ2h0IGJ5IHRoZSByZXF1aXJlZCBwbGFjZXMgKi8KLUBAIC03Miw4ICs3Miw4IEBACi0gCWFyZ19zaWduaWYrKzsJLyogcm91bmQgdXAgKi8KLSAgICAgfQotIAotLSAgbXVsNjQoJmFyZ19zaWduaWYsICZhcmdfc2lnbmlmLCAobG9uZyBsb25nICopKCZhcmdTcS5zaWdsKSk7Ci0tICBtdWw2NCgobG9uZyBsb25nICopKCZhcmdTcS5zaWdsKSwgKGxvbmcgbG9uZyAqKSgmYXJnU3Euc2lnbCksICZhcmdTcVNxKTsKLSsgIG11bDY0KCZhcmdfc2lnbmlmLCAmYXJnX3NpZ25pZiwgJnNpZ25pZmljYW5kKCZhcmdTcSkpOwotKyAgbXVsNjQoJnNpZ25pZmljYW5kKCZhcmdTcSksICZzaWduaWZpY2FuZCgmYXJnU3EpLCAmYXJnU3FTcSk7Ci0gCi0gICAvKiB3aWxsIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnIgd2l0aCBleHBvbiA9IDAgKi8KLSAgICooc2hvcnQgKikmKHBvc19wb2x5LnNpZ24pID0gMDsKLUBAIC04OCwxMSArODgsMTEgQEAKLSAKLSAgIC8qIERvIHRoZSBiYXNpYyBmaXhlZCBwb2ludCBwb2x5bm9taWFsIGV2YWx1YXRpb24gKi8KLSAgIHBvbHlub21pYWwoJm5lZ19wb2x5LnNpZ2wsICh1bnNpZ25lZCAqKSZhcmdTcVNxLCBvZGRuZWd0ZXJtcywgSElQT1dFUm9uLTEpOwotLSAgbXVsNjQoKGxvbmcgbG9uZyAqKSgmYXJnU3Euc2lnbCksIChsb25nIGxvbmcgKikoJm5lZ19wb2x5LnNpZ2wpLAotLQkobG9uZyBsb25nICopKCZuZWdfcG9seS5zaWdsKSk7Ci0rICBtdWw2NCgmc2lnbmlmaWNhbmQoJmFyZ1NxKSwgJnNpZ25pZmljYW5kKCZuZWdfcG9seSksCi0rCSZzaWduaWZpY2FuZCgmbmVnX3BvbHkpKTsKLSAKLSAgIC8qIFN1YnRyYWN0IHRoZSBtYW50aXNzYXMgKi8KLS0gICooKGxvbmcgbG9uZyAqKSgmcG9zX3BvbHkuc2lnbCkpIC09ICooKGxvbmcgbG9uZyAqKSgmbmVnX3BvbHkuc2lnbCkpOwotKyAgc2lnbmlmaWNhbmQoJnBvc19wb2x5KSAtPSBzaWduaWZpY2FuZCgmbmVnX3BvbHkpOwotIAotICAgLyogQ29udmVydCB0byA2NCBiaXQgc2lnbmVkLWNvbXBhdGlibGUgKi8KLSAgIHBvc19wb2x5LmV4cCAtPSAxOwotQEAgLTExMCw4ICsxMTAsOCBAQAotICAgCi0gICAvKiBEbyB0aGUgYmFzaWMgZml4ZWQgcG9pbnQgcG9seW5vbWlhbCBldmFsdWF0aW9uICovCi0gICBwb2x5bm9taWFsKCZwb3NfcG9seS5zaWdsLCAodW5zaWduZWQgKikmYXJnU3FTcSwgZXZlbnBsdGVybXMsIEhJUE9XRVJlcC0xKTsKLS0gIG11bDY0KChsb25nIGxvbmcgKikoJmFyZ1NxLnNpZ2wpLAotLQkobG9uZyBsb25nICopKCZwb3NfcG9seS5zaWdsKSwgKGxvbmcgbG9uZyAqKSgmcG9zX3BvbHkuc2lnbCkpOwotKyAgbXVsNjQoJnNpZ25pZmljYW5kKCZhcmdTcSksCi0rCSZzaWduaWZpY2FuZCgmcG9zX3BvbHkpLCAmc2lnbmlmaWNhbmQoJnBvc19wb2x5KSk7Ci0gICAKLSAgIC8qIHdpbGwgYmUgYSB2YWxpZCBwb3NpdGl2ZSBuciB3aXRoIGV4cG9uID0gMCAqLwotICAgKihzaG9ydCAqKSYobmVnX3BvbHkuc2lnbikgPSAwOwotQEAgLTEyMSw3ICsxMjEsNyBAQAotICAgcG9seW5vbWlhbCgmbmVnX3BvbHkuc2lnbCwgKHVuc2lnbmVkICopJmFyZ1NxU3EsIGV2ZW5uZWd0ZXJtcywgSElQT1dFUmVuLTEpOwotIAotICAgLyogU3VidHJhY3QgdGhlIG1hbnRpc3NhcyAqLwotLSAgKigobG9uZyBsb25nICopKCZuZWdfcG9seS5zaWdsKSkgLT0gKigobG9uZyBsb25nICopKCZwb3NfcG9seS5zaWdsKSk7Ci0rICBzaWduaWZpY2FuZCgmbmVnX3BvbHkpIC09IHNpZ25pZmljYW5kKCZwb3NfcG9seSk7Ci0gICAvKiBhbmQgbXVsdGlwbHkgYnkgYXJnU3EgKi8KLSAKLSAgIC8qIENvbnZlcnQgYXJnU3EgdG8gYSB2YWxpZCByZWcgbnVtYmVyICovCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9yZWdfY29uc3RhbnQuYyBsaW51eC9rZXJuZWwvRlBVLWVtdS9yZWdfY29uc3RhbnQuYwotLS0tIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvcmVnX2NvbnN0YW50LmMJVGh1IEp1bCAyMiAwMToxMTo1MiAxOTkzCi0rKysgbGludXgva2VybmVsL0ZQVS1lbXUvcmVnX2NvbnN0YW50LmMJV2VkIFNlcCAgMSAxODozMDowNSAxOTkzCi1AQCAtNjcsMTAgKzY3LDcgQEAKLSAgICAgfQotICAgcHVzaCgpOwotICAgcmVnX21vdmUoYywgRlBVX3N0MF9wdHIpOwotLSNpZmRlZiBQRUNVTElBUl80ODYKLS0gIC8qIERlZmF1bHQsIHRoaXMgY29udmV5cyBubyBpbmZvcm1hdGlvbiwgYnV0IGFuIDgwNDg2IGRvZXMgaXQuICovCi0gICBjbGVhcl9DMSgpOwotLSNlbmRpZiBQRUNVTElBUl80ODYKLSB9Ci0gCi0gCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9yZWdfbGRfc3RyLmMgbGludXgva2VybmVsL0ZQVS1lbXUvcmVnX2xkX3N0ci5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvRlBVLWVtdS9yZWdfbGRfc3RyLmMJVGh1IEp1bCAyMiAwMToxMTo1MiAxOTkzCi0rKysgbGludXgva2VybmVsL0ZQVS1lbXUvcmVnX2xkX3N0ci5jCVdlZCBTZXAgIDEgMTg6MzA6MDUgMTk5MwotQEAgLTMxMiw3ICszMTIsNyBAQAotICAgfQotIAotICAgZSA9IEVYUF9CSUFTICsgNjM7Ci0tICAqKChsb25nIGxvbmcgKikmRlBVX2xvYWRlZF9kYXRhLnNpZ2wpID0gczsKLSsgIHNpZ25pZmljYW5kKCZGUFVfbG9hZGVkX2RhdGEpID0gczsKLSAgIEZQVV9sb2FkZWRfZGF0YS5leHAgPSBlOwotICAgRlBVX2xvYWRlZF9kYXRhLnRhZyA9IFRXX1ZhbGlkOwotICAgbm9ybWFsaXplX251bygmRlBVX2xvYWRlZF9kYXRhKTsKLUBAIC00MTcsNyArNDE3LDcgQEAKLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0tICAgICAgKigobG9uZyBsb25nICopJkZQVV9sb2FkZWRfZGF0YS5zaWdsKSA9IGw7Ci0rICAgICAgc2lnbmlmaWNhbmQoJkZQVV9sb2FkZWRfZGF0YSkgPSBsOwotICAgICAgIEZQVV9sb2FkZWRfZGF0YS5leHAgPSBFWFBfQklBUyArIDYzOwotICAgICAgIEZQVV9sb2FkZWRfZGF0YS50YWcgPSBUV19WYWxpZDsKLSAgICAgICBub3JtYWxpemVfbnVvKCZGUFVfbG9hZGVkX2RhdGEpOwotQEAgLTEwMzMsNyArMTAzMyw3IEBACi0gCi0gICByZWdfbW92ZShGUFVfc3QwX3B0ciwgJnQpOwotICAgcHJlY2lzaW9uX2xvc3MgPSByb3VuZF90b19pbnQoJnQpOwotLSAgbGwgPSAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSgmdC5zaWdsKTsKLSsgIGxsID0gc2lnbmlmaWNhbmQoJnQpOwotIAotICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LCBieSBjb21wYXJpbmcgd2l0aCA5OTk5OTk5OTk5OTk5OTk5OTkgZGVjaW1hbC4gKi8KLSAgIGlmICggKHQuc2lnaCA+IDB4MGRlMGI2YjMpIHx8Ci1AQCAtMTA0MiwxNCArMTA0MiwxNiBAQAotICAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKLSAgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mIHRoZSA4MDQ4NiBib29rICovCi0gICAgIGludmFsaWRfb3BlcmFuZDoKLS0gICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIEVYX0ludmFsaWQgKQotKyAgICAgIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCi0gCXsKLSAJICAvKiBQcm9kdWNlIHRoZSBRTmFOICJpbmRlZmluaXRlIiAqLwotIAkgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGCi0gCSAgdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLGQsMTApOwotLQkgIHB1dF9mc19ieXRlKDB4ZmYsKHVuc2lnbmVkIGNoYXIgKikgZCs3KTsgLyogVGhpcyBieXRlIHVuZGVmaW5lZCAqLwotLQkgIHB1dF9mc19ieXRlKDB4ZmYsKHVuc2lnbmVkIGNoYXIgKikgZCs4KTsKLS0JICBwdXRfZnNfYnl0ZSgweGZmLCh1bnNpZ25lZCBjaGFyICopIGQrOSk7Ci0rCSAgZm9yICggaSA9IDA7IGkgPCA3OyBpKyspCi0rCSAgICBwdXRfZnNfYnl0ZSgwLCAodW5zaWduZWQgY2hhciAqKSBkK2kpOyAvKiBUaGVzZSBieXRlcyAidW5kZWZpbmVkIiAqLwotKwkgIHB1dF9mc19ieXRlKDB4YzAsICh1bnNpZ25lZCBjaGFyICopIGQrNyk7IC8qIFRoaXMgYnl0ZSAidW5kZWZpbmVkIiAqLwotKwkgIHB1dF9mc19ieXRlKDB4ZmYsICh1bnNpZ25lZCBjaGFyICopIGQrOCk7Ci0rCSAgcHV0X2ZzX2J5dGUoMHhmZiwgKHVuc2lnbmVkIGNoYXIgKikgZCs5KTsKLSAJICBSRV9FTlRSQU5UX0NIRUNLX09OCi0gCSAgcmV0dXJuIDE7Ci0gCX0KLUBAIC0xMDU4LDggKzEwNjAsOCBAQAotICAgICB9Ci0gICBlbHNlIGlmICggcHJlY2lzaW9uX2xvc3MgKQotICAgICB7Ci0tICAgICAgaWYgKCBzZXRfcHJlY2lzaW9uX2ZsYWcocHJlY2lzaW9uX2xvc3MpICkKLS0JcmV0dXJuIDA7Ci0rICAgICAgLyogUHJlY2lzaW9uIGxvc3MgZG9lc24ndCBzdG9wIHRoZSBkYXRhIHRyYW5zZmVyICovCi0rICAgICAgc2V0X3ByZWNpc2lvbl9mbGFnKHByZWNpc2lvbl9sb3NzKTsKLSAgICAgfQotIAotICAgdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLGQsMTApOwotQEAgLTEwOTYsNyArMTA5OCw3IEBACi0gICBpZiAoci0+dGFnID09IFRXX1plcm8pCi0gICAgIHsKLSAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB6ZXJvIGlzIHJldHVybmVkICovCi0tICAgICAgKihsb25nIGxvbmcgKikmci0+c2lnbCA9IDA7Ci0rICAgICAgc2lnbmlmaWNhbmQocikgPSAwOwotICAgICAgIHJldHVybiAwOyAgICAgICAgLyogby5rLiAqLwotICAgICB9Ci0gICAKLUBAIC0xMTE4LDcgKzExMjAsNyBAQAotIAkgIHx8IChoYWxmX29yX21vcmUgJiYgKHItPnNpZ2wgJiAxKSkgKQkvKiBvZGQgLT4gZXZlbiAqLwotIAl7Ci0gCSAgaWYgKCB2ZXJ5X2JpZyApIHJldHVybiAxOyAgICAgICAgLyogb3ZlcmZsb3cgKi8KLS0JICAoKihsb25nIGxvbmcgKikoJnItPnNpZ2wpKSArKzsKLSsJICBzaWduaWZpY2FuZChyKSArKzsKLSAJICByZXR1cm4gUFJFQ0lTSU9OX0xPU1RfVVA7Ci0gCX0KLSAgICAgICBicmVhazsKLUBAIC0xMTI2LDcgKzExMjgsNyBAQAotICAgICAgIGlmIChmcmFjX3BhcnQgJiYgci0+c2lnbikKLSAJewotIAkgIGlmICggdmVyeV9iaWcgKSByZXR1cm4gMTsgICAgICAgIC8qIG92ZXJmbG93ICovCi0tCSAgKCoobG9uZyBsb25nICopKCZyLT5zaWdsKSkgKys7Ci0rCSAgc2lnbmlmaWNhbmQocikgKys7Ci0gCSAgcmV0dXJuIFBSRUNJU0lPTl9MT1NUX1VQOwotIAl9Ci0gICAgICAgYnJlYWs7Ci1AQCAtMTEzNCw3ICsxMTM2LDcgQEAKLSAgICAgICBpZiAoZnJhY19wYXJ0ICYmICFyLT5zaWduKQotIAl7Ci0gCSAgaWYgKCB2ZXJ5X2JpZyApIHJldHVybiAxOyAgICAgICAgLyogb3ZlcmZsb3cgKi8KLS0JICAoKihsb25nIGxvbmcgKikoJnItPnNpZ2wpKSArKzsKLSsJICBzaWduaWZpY2FuZChyKSArKzsKLSAJICByZXR1cm4gUFJFQ0lTSU9OX0xPU1RfVVA7Ci0gCX0KLSAgICAgICBicmVhazsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L3N0YXR1c193LmggbGludXgva2VybmVsL0ZQVS1lbXUvc3RhdHVzX3cuaAotLS0tIHBsMTIvbGludXgva2VybmVsL0ZQVS1lbXUvc3RhdHVzX3cuaAlUaHUgSnVsIDIyIDAxOjExOjUzIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS9zdGF0dXNfdy5oCVdlZCBTZXAgIDEgMTg6MzA6MDYgMTk5MwotQEAgLTEwLDYgKzEwLDcgQEAKLSAjaWZuZGVmIF9TVEFUVVNfSF8KLSAjZGVmaW5lIF9TVEFUVVNfSF8KLSAKLSsjaW5jbHVkZSAiZnB1X2VtdS5oIiAgICAvKiBmb3IgZGVmaW5pdGlvbiBvZiBQRUNVTElBUl80ODYgKi8KLSAKLSAjaWZkZWYgX19BU1NFTUJMRVJfXwotICNkZWZpbmUJQ29uc3RfXyh4KQkkIyN4Ci1AQCAtNTEsOCArNTIsMTMgQEAKLSAgIHBhcnRpYWxfc3RhdHVzICY9IH4oU1dfQzB8U1dfQzF8U1dfQzJ8U1dfQzMpOyBcCi0gICBwYXJ0aWFsX3N0YXR1cyB8PSAoY2MpICYgKFNXX0MwfFNXX0MxfFNXX0MyfFNXX0MzKTsgfSkKLSAKLS0vKiBDbGVhciB0aGUgU1dfQzEgYml0LCAib3RoZXIgYml0cyB1bmRlZmluZWQiICovCi0tI2RlZmluZSBjbGVhcl9DMSgpICB7IHBhcnRpYWxfc3RhdHVzICY9IH5TV19DMTsgfQotKyNpZmRlZiBQRUNVTElBUl80ODYKLSsgICAvKiBEZWZhdWx0LCB0aGlzIGNvbnZleXMgbm8gaW5mb3JtYXRpb24sIGJ1dCBhbiA4MDQ4NiBkb2VzIGl0LiAqLwotKyAgIC8qIENsZWFyIHRoZSBTV19DMSBiaXQsICJvdGhlciBiaXRzIHVuZGVmaW5lZCIuICovCi0rIyAgZGVmaW5lIGNsZWFyX0MxKCkgIHsgcGFydGlhbF9zdGF0dXMgJj0gflNXX0MxOyB9Ci0rIyBlbHNlCi0rIyAgZGVmaW5lIGNsZWFyX0MxKCkKLSsjZW5kaWYgUEVDVUxJQVJfNDg2Ci0gCi0gI2VuZGlmIF9fQVNTRU1CTEVSX18KLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L3ZlcnNpb24uaCBsaW51eC9rZXJuZWwvRlBVLWVtdS92ZXJzaW9uLmgKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9GUFUtZW11L3ZlcnNpb24uaAlUaHUgSnVsIDIyIDAxOjExOjUzIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvRlBVLWVtdS92ZXJzaW9uLmgJV2VkIFNlcCAgMSAxODozMDowNiAxOTkzCi1AQCAtOSw1ICs5LDUgQEAKLSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gCi0tI2RlZmluZSBGUFVfVkVSU0lPTiAid20tRlBVLWVtdSB2ZXJzaW9uIEJFVEEgMS41IgotKyNkZWZpbmUgRlBVX1ZFUlNJT04gIndtLUZQVS1lbXUgdmVyc2lvbiBCRVRBIDEuNiIKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L2Jsay5oIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L2Jsay5oCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9ibGsuaAlTYXQgQXVnIDE0IDIzOjQ3OjIyIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvYmxrX2Rydi9ibGsuaAlTYXQgU2VwICA0IDAzOjIxOjMyIDE5OTMKLUBAIC0zLDYgKzMsNyBAQAotIAotICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotICNpbmNsdWRlIDxsaW51eC9sb2Nrcy5oPgotKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgotIAotIC8qCi0gICogTlJfUkVRVUVTVCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHJlcXVlc3QtcXVldWUuCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9nZW5oZC5jIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L2dlbmhkLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L2dlbmhkLmMJU2F0IEp1bCAgMyAwMzowMTo0NSAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvZ2VuaGQuYwlTYXQgU2VwICA0IDAzOjIyOjM4IDE5OTMKLUBAIC0xOTQsNyArMTk0LDcgQEAKLSB9Ci0gCQotIC8qIFRoaXMgbWF5IGJlIHVzZWQgb25seSBvbmNlLCBlbmZvcmNlZCBieSAnc3RhdGljIGludCBjYWxsYWJsZScgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfc2V0dXAodm9pZCAqIEJJT1MpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NldHVwKHZvaWQgKiBCSU9TKQotIHsKLSAJc3RhdGljIGludCBjYWxsYWJsZSA9IDE7Ci0gCXN0cnVjdCBnZW5kaXNrICpwOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvaGQuYyBsaW51eC9rZXJuZWwvYmxrX2Rydi9oZC5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9oZC5jCVdlZCBKdWwgMjggMDA6MTk6MzIgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L2hkLmMJV2VkIFNlcCAgMSAxNzowNDo0MyAxOTkzCi1AQCAtNTU5LDcgKzU1OSw3IEBACi0gCQljYXNlIEJMS0ZMU0JVRjoKLSAJCQlpZighc3VzZXIoKSkgIHJldHVybiAtRUFDQ0VTOwotIAkJCWlmKCFpbm9kZS0+aV9yZGV2KSByZXR1cm4gLUVJTlZBTDsKLS0JCQlzeW5jX2Rldihpbm9kZS0+aV9yZGV2KTsKLSsJCQlmc3luY19kZXYoaW5vZGUtPmlfcmRldik7Ci0gCQkJaW52YWxpZGF0ZV9idWZmZXJzKGlub2RlLT5pX3JkZXYpOwotIAkJCXJldHVybiAwOwotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvcmFtZGlzay5jIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3JhbWRpc2suYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvcmFtZGlzay5jCVdlZCBBdWcgIDQgMjI6Mzg6NDAgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3JhbWRpc2suYwlTYXQgU2VwICA0IDAxOjQ4OjIxIDE5OTMKLUBAIC0zNyw3ICszNyw4IEBACi0gcmVwZWF0OgotIAlJTklUX1JFUVVFU1Q7Ci0gCWFkZHIgPSByZF9zdGFydCArIChDVVJSRU5ULT5zZWN0b3IgPDwgOSk7Ci0tCWxlbiA9IENVUlJFTlQtPm5yX3NlY3RvcnMgPDwgOTsKLSsJbGVuID0gQ1VSUkVOVC0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDk7Ci0rCi0gCWlmICgoTUlOT1IoQ1VSUkVOVC0+ZGV2KSAhPSBNSU5PUl9SQU1ESVNLKSB8fAotIAkgICAgKGFkZHIrbGVuID4gcmRfc3RhcnQrcmRfbGVuZ3RoKSkgewotIAkJZW5kX3JlcXVlc3QoMCk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL2FoYTE1NDIuYyBsaW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL2FoYTE1NDIuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9haGExNTQyLmMJV2VkIEp1bCAyOCAwMDoxOTozMiAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9haGExNTQyLmMJU2F0IFNlcCAgNCAwMTo0ODoyMSAxOTkzCi1AQCAtMTUsNiArMTUsNyBAQAotICNpbmNsdWRlIDxsaW51eC9oZWFkLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSAKLSAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSAjaW5jbHVkZSA8YXNtL2RtYS5oPgotQEAgLTY2Myw4ICs2NjQsMTAgQEAKLSAgICAgCi0gICAgIGluZHggPSAwOwotICAgICB3aGlsZShpbmR4IDwgc2l6ZW9mKGJhc2VzKS9zaXplb2YoYmFzZXNbMF0pKXsKLS0gICAgICBpID0gYWhhMTU0Ml90ZXN0X3BvcnQoYmFzZXNbaW5keF0pOwotLSAgICAgIGlmIChpKSBicmVhazsKLSsgICAgICBpZighY2hlY2tfcmVnaW9uKGJhc2VzW2luZHhdLCA0KSl7Ci0rCWkgPSBhaGExNTQyX3Rlc3RfcG9ydChiYXNlc1tpbmR4XSk7Ci0rCWlmIChpKSBicmVhazsKLSsgICAgICB9OwotICAgICAgIGluZHgrKzsKLSAgICAgfQotICAgICBpZiAoaW5keCA9PSBzaXplb2YoYmFzZXMpL3NpemVvZihiYXNlc1swXSkpIHJldHVybiAwOwotQEAgLTc1NSw2ICs3NTgsNyBAQAotIAkgIGFoYTE1NDJfY29tbWFuZCgwLCBjbWQsIGJ1ZmZlciwgNTEyKTsKLSAgICAgICB9Ci0gI2VuZGlmCi0rICAgIHNuYXJmX3JlZ2lvbihiYXNlc1tpbmR4XSwgNCk7ICAvKiBSZWdpc3RlciB0aGUgSU8gcG9ydHMgdGhhdCB3ZSB1c2UgKi8KLSAgICAgYWhhMTU0Ml9ob3N0ID0gaG9zdG51bTsKLSAgICAgcmV0dXJuIDE7Ci0gfQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9haGExNzQwLmMgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9haGExNzQwLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvYWhhMTc0MC5jCVdlZCBKdWwgMjggMDA6MTk6MzIgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvYWhhMTc0MC5jCVNhdCBTZXAgIDQgMDE6NDg6MjEgMTk5MwotQEAgLTIxLDYgKzIxLDcgQEAKLSAjaW5jbHVkZSA8bGludXgvaGVhZC5oPgotICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSsjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0gCi0gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0gI2luY2x1ZGUgPGFzbS9kbWEuaD4KLUBAIC00MzIsNiArNDMzLDEyIEBACi0gICAgIGZvciAoIHNsb3Q9TUlORUlTQTsgc2xvdCA8PSBNQVhFSVNBOyBzbG90KysgKQotICAgICB7Ci0gCWJhc2UgPSBTTE9UQkFTRShzbG90KTsKLSsKLSsJLyogVGhlIGlvcG9ydHMgZm9yIGVpc2EgYm9hcmRzIGFyZSBnZW5lcmFsbHkgYmV5b25kIHRoYXQgdXNlZCBpbiB0aGUKLSsJICAgY2hlY2ssc25hcmZfcmVnaW9uIGNvZGUsIGJ1dCB0aGlzIG1heSBjaGFuZ2UgYXQgc29tZSBwb2ludCwgc28gd2UKLSsJICAgZ28gdGhyb3VnaCB0aGUgbW90aW9ucy4gKi8KLSsKLSsJaWYoY2hlY2tfcmVnaW9uKGJhc2UsIDB4NWMpKSBjb250aW51ZTsgIC8qIFNlZSBpZiBpbiB1c2UgKi8KLSAJaWYgKCBhaGExNzQwX3Rlc3RfcG9ydCgpKSAgYnJlYWs7Ci0gICAgIH0KLSAgICAgaWYgKCBzbG90ID4gTUFYRUlTQSApCi1AQCAtNDU1LDYgKzQ2Miw3IEBACi0gICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgZm9yIGFkYXB0ZWMgY29udHJvbGxlci5cbiIpOwotICAgICAgICAgcmV0dXJuIDA7Ci0gICAgIH0KLSsgICAgc25hcmZfcmVnaW9uKGJhc2UsIDB4NWMpOyAgLyogUmVzZXJ2ZSB0aGUgc3BhY2UgdGhhdCB3ZSBuZWVkIHRvIHVzZSAqLwotICAgICByZXR1cm4gMTsKLSB9Ci0gCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL2Zkb21haW4uYyBsaW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL2Zkb21haW4uYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9mZG9tYWluLmMJU2F0IEF1ZyAxNCAwOTowNToxNiAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9mZG9tYWluLmMJU2F0IFNlcCAgNCAwMTo0ODoyMSAxOTkzCi1AQCAtMTM4LDYgKzEzOCw3IEBACi0gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotIAotICNkZWZpbmUgVkVSU0lPTiAgICAgICAgICAiJFJldmlzaW9uOiAzLjE4ICQiCi0gCi1AQCAtNTI4LDYgKzUyOSw4IEBACi0gCi0gICAgICAgZm9yIChpID0gMDsgIWZsYWcgJiYgaSA8IFBPUlRfQ09VTlQ7IGkrKykgewotIAkgcG9ydF9iYXNlID0gcG9ydHNbaV07Ci0rCSBpZihjaGVja19yZWdpb24ocG9ydF9iYXNlLCAweDEwKSkgY29udGludWU7ICAvKiBza2lwIGlmIEkvTyBwb3J0IGluCi0rCQkJCQkJCSB1c2UgKi8KLSAjaWYgREVCVUdfREVURUNUCi0gCSBwcmludGsoICIgJXgsIiwgcG9ydF9iYXNlICk7Ci0gI2VuZGlmCi1AQCAtNjA3LDYgKzYxMCw4IEBACi0gICAgICAgc2NzaV9ob3N0c1t0aGlzX2hvc3RdLnRoaXNfaWQgPSA3OwotICAgIH0KLSAgICAKLSsgICBzbmFyZl9yZWdpb24ocG9ydF9iYXNlLCAweDEwKTsgIC8qIFJlZ2lzdGVyICovCi0rCi0gI2lmIERPX0RFVEVDVAotIAotICAgIC8qIFRoZXNlIHJvdXRpbmVzIGFyZSBoZXJlIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgU0NTSSBidXMgYmVoYXZlcyBhZnRlcgotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zY3NpLmMgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zY3NpLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvc2NzaS5jCVN1biBBdWcgMTUgMTA6NTU6MjMgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvc2NzaS5jCVNhdCBTZXAgIDQgMDE6NDg6MjIgMTk5MwotQEAgLTY4LDYgKzY4LDcgQEAKLSAjZGVmaW5lIFdBU19USU1FRE9VVCAJMHgwMgotICNkZWZpbmUgV0FTX1NFTlNFCTB4MDQKLSAjZGVmaW5lIElTX1JFU0VUVElORwkweDA4Ci0rI2RlZmluZSBBU0tFRF9GT1JfU0VOU0UgMHgxMAotIAotIGV4dGVybiBpbnQgbGFzdF9yZXNldFtdOwotIAotQEAgLTY2MSw3ICs2NjIsNyBAQAotIHN0YXRpYyB2b2lkIHNjc2lfcmVxdWVzdF9zZW5zZSAoU2NzaV9DbW5kICogU0NwbnQpCi0gCXsKLSAJY2xpKCk7Ci0tCVNDcG50LT5mbGFncyB8PSBXQVNfU0VOU0U7Ci0rCVNDcG50LT5mbGFncyB8PSBXQVNfU0VOU0UgfCBBU0tFRF9GT1JfU0VOU0U7Ci0gCXVwZGF0ZV90aW1lb3V0KFNDcG50LCBTRU5TRV9USU1FT1VUKTsKLSAJc3RpKCk7Ci0gCQotQEAgLTgwNSw5ICs4MDYsMTcgQEAKLSAKLSBzdGF0aWMgaW50IGNoZWNrX3NlbnNlIChTY3NpX0NtbmQgKiBTQ3BudCkKLSAJewotLSAgLyogSWYgdGhlcmUgaXMgbm8gc2Vuc2UgaW5mb3JtYXRpb24sIHJlcXVlc3QgaXQuICAqLwotLSAgaWYgKCgoU0NwbnQtPnNlbnNlX2J1ZmZlclswXSAmIDB4NzApID4+IDQpICE9IDcpCi0tICAgIHJldHVybiBTVUdHRVNUX1NFTlNFOwotKyAgLyogSWYgdGhlcmUgaXMgbm8gc2Vuc2UgaW5mb3JtYXRpb24sIHJlcXVlc3QgaXQuICBJZiB3ZSBoYXZlIGFscmVhZHkKLSsgICAgIHJlcXVlc3RlZCBpdCwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gYXNraW5nIGFnYWluIC0gdGhlIGZpcm13YXJlIG11c3QgYmUKLSsgICAgIGNvbmZ1c2VkLiAqLwotKyAgaWYgKCgoU0NwbnQtPnNlbnNlX2J1ZmZlclswXSAmIDB4NzApID4+IDQpICE9IDcpIHsKLSsgICAgaWYoIVNDcG50LT5mbGFncyAmIEFTS0VEX0ZPUl9TRU5TRSkKLSsgICAgICByZXR1cm4gU1VHR0VTVF9TRU5TRTsKLSsgICAgZWxzZQotKyAgICAgIHJldHVybiBTVUdHRVNUX1JFVFJZOwotKyAgICAgIH0KLSsgIAotKyAgU0NwbnQtPmZsYWdzICY9IH5BU0tFRF9GT1JfU0VOU0U7Ci0gCi0gI2lmZGVmIERFQlVHX0lOSVQKLSAJcHJpbnRrKCJzY3NpJWQgOiAiLCBTQ3BudC0+aG9zdCk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3NkLmMgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zZC5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3NkLmMJV2VkIEF1ZyAxMSAyMjozNjo0OCAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zZC5jCVNhdCBTZXAgIDQgMDE6NDg6MjIgMTk5MwotQEAgLTMyNCw2ICszMjQsNyBAQAotIAotICAgICBJTklUX1NDU0lfUkVRVUVTVDsKLSAKLSsKLSAvKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgaGVyZS4gIGFsbG9jYXRlX2RldmljZSB3aWxsIGdldCBhIGZyZWUgcG9pbnRlciwgYnV0Ci0gICAgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaXQgaXMgcXVldWVhYmxlLiAgSW4gbm9ybWFsIHVzYWdlLCB3ZSB3YW50IHRvCi0gICAgY2FsbCB0aGlzLCBiZWNhdXNlIG90aGVyIHR5cGVzIG9mIGRldmljZXMgbWF5IGhhdmUgdGhlIGhvc3QgYWxsIHRpZWQgdXAsCi1AQCAtNjY4LDYgKzY2OSw3IEBACi0gICBpbnQgaiA9IDA7Ci0gICB1bnNpZ25lZCBjaGFyIGNtZFsxMF07Ci0gICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0rICBjaGFyIHNwaW50aW1lOwotICAgaW50IHRoZV9yZXN1bHQsIHJldHJpZXM7Ci0gICBTY3NpX0NtbmQgKiBTQ3BudDsKLSAKLUBAIC02NzcsNiArNjc5LDU4IEBACi0gCi0gICBTQ3BudCA9IGFsbG9jYXRlX2RldmljZShOVUxMLCByc2NzaV9kaXNrc1tpXS5kZXZpY2UtPmluZGV4LCAxKTsKLSAgIGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIHNjc2lfbWFsbG9jKDUxMik7Ci0rCi0rICBzcGludGltZSA9IDA7Ci0rCi0rICAvKiBTcGluIHVwIGRyaXZlcywgYXMgcmVxdWlyZWQuICBPbmx5IGRvIHRoaXMgYXQgYm9vdCB0aW1lICovCi0rICBpZiAoY3VycmVudCA9PSB0YXNrWzBdKXsKLSsgICAgZG97Ci0rICAgICAgY21kWzBdID0gVEVTVF9VTklUX1JFQURZOwotKyAgICAgIGNtZFsxXSA9IChyc2NzaV9kaXNrc1tpXS5kZXZpY2UtPmx1biA8PCA1KSAmIDB4ZTA7Ci0rICAgICAgbWVtc2V0ICgodm9pZCAqKSAmY21kWzJdLCAwLCA4KTsKLSsgICAgICBTQ3BudC0+cmVxdWVzdC5kZXYgPSAweGZmZmY7ICAvKiBNYXJrIGFzIHJlYWxseSBidXN5IGFnYWluICovCi0rICAgICAgU0NwbnQtPnNlbnNlX2J1ZmZlclswXSA9IDA7Ci0rICAgICAgU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSA9IDA7Ci0rICAgICAgCi0rICAgICAgc2NzaV9kb19jbWQgKFNDcG50LAotKwkJICAgKHZvaWQgKikgY21kLCAodm9pZCAqKSBidWZmZXIsCi0rCQkgICA1MTIsIHNkX2luaXRfZG9uZSwgIFNEX1RJTUVPVVQsCi0rCQkgICBNQVhfUkVUUklFUyk7Ci0rICAgICAgCi0rICAgICAgd2hpbGUoU0NwbnQtPnJlcXVlc3QuZGV2ICE9IDB4ZmZmZSk7Ci0rICAgICAgCi0rICAgICAgdGhlX3Jlc3VsdCA9IFNDcG50LT5yZXN1bHQ7Ci0rICAgICAgCi0rICAgICAgLyogTG9vayBmb3Igbm9uLXJlbW92YWJsZSBkZXZpY2VzIHRoYXQgcmV0dXJuIE5PVF9SRUFEWS4gIElzc3VlIGNvbW1hbmQKLSsJIHRvIHNwaW4gdXAgZHJpdmUgZm9yIHRoZXNlIGNhc2VzLiAqLwotKyAgICAgIGlmKHRoZV9yZXN1bHQgJiYgIXJzY3NpX2Rpc2tzW2ldLmRldmljZS0+cmVtb3ZhYmxlICYmIAotKwkgU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSA9PSBOT1RfUkVBRFkpIHsKLSsJaW50IHRpbWUxOwotKwlpZighc3BpbnRpbWUpewotKwkgIGNtZFswXSA9IFNUQVJUX1NUT1A7Ci0rCSAgY21kWzFdID0gKHJzY3NpX2Rpc2tzW2ldLmRldmljZS0+bHVuIDw8IDUpICYgMHhlMDsKLSsJICBtZW1zZXQgKCh2b2lkICopICZjbWRbMl0sIDAsIDgpOwotKwkgIGNtZFs0XSA9IDE7IC8qIFN0YXJ0IHNwaW4gY3ljbGUgKi8KLSsJICBTQ3BudC0+cmVxdWVzdC5kZXYgPSAweGZmZmY7ICAvKiBNYXJrIGFzIHJlYWxseSBidXN5IGFnYWluICovCi0rCSAgU0NwbnQtPnNlbnNlX2J1ZmZlclswXSA9IDA7Ci0rCSAgU0NwbnQtPnNlbnNlX2J1ZmZlclsyXSA9IDA7Ci0rCSAgCi0rCSAgc2NzaV9kb19jbWQgKFNDcG50LAotKwkJICAgICAgICh2b2lkICopIGNtZCwgKHZvaWQgKikgYnVmZmVyLAotKwkJICAgICAgIDUxMiwgc2RfaW5pdF9kb25lLCAgU0RfVElNRU9VVCwKLSsJCSAgICAgICBNQVhfUkVUUklFUyk7Ci0rCSAgCi0rCSAgd2hpbGUoU0NwbnQtPnJlcXVlc3QuZGV2ICE9IDB4ZmZmZSk7Ci0rCi0rCSAgc3BpbnRpbWUgPSBqaWZmaWVzOwotKwl9OwotKwotKwl0aW1lMSA9IGppZmZpZXM7Ci0rCXdoaWxlKGppZmZpZXMgPCB0aW1lMSArIDEwMCk7IC8qIFdhaXQgMSBzZWNvbmQgZm9yIG5leHQgdHJ5ICovCi0rICAgICAgfTsKLSsgICAgfSB3aGlsZSh0aGVfcmVzdWx0ICYmIHNwaW50aW1lICYmIHNwaW50aW1lIDwgamlmZmllcysxNTAwKTsKLSsgIH07ICAvKiBjdXJyZW50ID09IHRhc2tbMF0gKi8KLSsKLSAKLSAgIHJldHJpZXMgPSAzOwotICAgZG8gewotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zZF9pb2N0bC5jIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvc2RfaW9jdGwuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zZF9pb2N0bC5jCVdlZCBKdWwgMjggMDA6MTk6MzMgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvc2RfaW9jdGwuYwlXZWQgU2VwICAxIDE3OjA0OjQzIDE5OTMKLUBAIC01NSw3ICs1NSw3IEBACi0gCQljYXNlIEJMS0ZMU0JVRjoKLSAJCQlpZighc3VzZXIoKSkgIHJldHVybiAtRUFDQ0VTOwotIAkJCWlmKCFpbm9kZS0+aV9yZGV2KSByZXR1cm4gLUVJTlZBTDsKLS0gCQkJc3luY19kZXYoaW5vZGUtPmlfcmRldik7Ci0rIAkJCWZzeW5jX2Rldihpbm9kZS0+aV9yZGV2KTsKLSAJCQlpbnZhbGlkYXRlX2J1ZmZlcnMoaW5vZGUtPmlfcmRldik7Ci0gCQkJcmV0dXJuIDA7Ci0gCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3NlYWdhdGUuYyBsaW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3NlYWdhdGUuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zZWFnYXRlLmMJU2F0IEF1ZyAgNyAxMToyNzowMCAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zZWFnYXRlLmMJU2F0IFNlcCAgNCAwMTo0ODoyMiAxOTkzCi1AQCAtMTAsNiArMTAsOCBAQAotICAqIAlOb3RlIDogVE1DLTg4MCBib2FyZHMgZG9uJ3Qgd29yayBiZWNhdXNlIHRoZXkgaGF2ZSB0d28gYml0cyBpbiAKLSAgKgkJdGhlIHN0YXR1cyByZWdpc3RlciBmbGlwcGVkLCBJJ2xsIGZpeCB0aGlzICJSU04iCi0gICoKLSsgKiAgICAgIFRoaXMgY2FyZCBkb2VzIGFsbCB0aGUgSS9PIHZpYSBtZW1vcnkgbWFwcGVkIEkvTywgc28gdGhlcmUgaXMgbm8gbmVlZAotKyAqICAgICAgdG8gY2hlY2sgb3Igc25hcmYgYSByZWdpb24gb2YgdGhlIEkvTyBhZGRyZXNzIHNwYWNlLgotICAqLwotIAotIC8qCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3N0LmMgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zdC5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3N0LmMJV2VkIEF1ZyAxMSAyMjozNjo0OSAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS9zdC5jCVN1biBBdWcgMjkgMjM6MDc6NTIgMTk5MwotQEAgLTEyNyw5ICsxMjcsMTEgQEAKLSAvKiBDb252ZXJ0IHRoZSByZXN1bHQgdG8gc3VjY2VzcyBjb2RlICovCi0gc3RhdGljIGludCBzdF9jaGtfcmVzdWx0KFNjc2lfQ21uZCAqIFNDcG50KQotIHsKLSsjaWZkZWYgREVCVUcKLSAgIGludCBkZXYgPSBTQ3BudC0+cmVxdWVzdC5kZXY7Ci0rI2VuZGlmCi0gICBpbnQgcmVzdWx0ID0gU0NwbnQtPnJlc3VsdDsKLS0gIGNoYXIgKiBzZW5zZSA9IFNDcG50LT5zZW5zZV9idWZmZXI7Ci0rICB1bnNpZ25lZCBjaGFyICogc2Vuc2UgPSBTQ3BudC0+c2Vuc2VfYnVmZmVyOwotIAotICAgaWYgKCFyZXN1bHQpCi0gICAgIHJldHVybiAwOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS91bHRyYXN0b3IuYyBsaW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3VsdHJhc3Rvci5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3VsdHJhc3Rvci5jCVdlZCBKdWwgMjggMDA6MTk6MzUgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvdWx0cmFzdG9yLmMJU2F0IFNlcCAgNCAwMTo0ODoyMiAxOTkzCi1AQCAtNDMsNiArNDMsNyBAQAotICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotIAotICNpbmNsdWRlIDxhc20vaW8uaD4KLSAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotQEAgLTE5NCw2ICsxOTUsMTIgQEAKLSAgICAgUE9SVF9BRERSRVNTID0gMDsKLSAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodWx0cmFzdG9yX3BvcnRzXzE0Zik7IGkrKykgewotIAlQT1JUX0FERFJFU1MgPSB1bHRyYXN0b3JfcG9ydHNfMTRmW2ldOwotKwlpZihjaGVja19yZWdpb24oUE9SVF9BRERSRVNTLCA0KSkgY29udGludWU7Ci0rI2Vsc2UKLSsJaWYoY2hlY2tfcmVnaW9uKFBPUlRfQUREUkVTUywgNCkpIHsKLSsJICBwcmludGsoIlVsdHJhc3RvciBJL08gc3BhY2UgYWxyZWFkeSBpbiB1c2VcbiIpOwotKwkgIHJldHVybiBGQUxTRTsKLSsJfTsKLSAjZW5kaWYKLSAKLSAjaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKLUBAIC0yNDgsNiArMjU1LDcgQEAKLSAJICAgUE9SVF9BRERSRVNTKTsKLSAjZW5kaWYKLSAKLSsgICAgc25hcmZfcmVnaW9uKFBPUlRfQUREUkVTUywgNCk7IC8qIFJlZ2lzdGVyIHRoZSBJL08gc3BhY2UgdGhhdCB3ZSB1c2UgKi8KLSAgICAgLyogQWxsIGFib3ZlIHRlc3RzIHBhc3NlZCwgbXVzdCBiZSB0aGUgcmlnaHQgdGhpbmcuICBHZXQgc29tZSB1c2VmdWwKLSAgICAgICAgaW5mby4gKi8KLSAgICAgKihjaGFyICopJmNvbmZpZ18xID0gaW5iKENPTkZJRyhQT1JUX0FERFJFU1MgKyAwKSk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvYmxrX2Rydi9zY3NpL3dkNzAwMC5jIGxpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvd2Q3MDAwLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L3Njc2kvd2Q3MDAwLmMJU2F0IEp1bCAgMyAwMzo0MDozMCAxOTkzCi0rKysgbGludXgva2VybmVsL2Jsa19kcnYvc2NzaS93ZDcwMDAuYwlTYXQgU2VwICA0IDAxOjQ4OjIzIDE5OTMKLUBAIC0yMCw2ICsyMCw4IEBACi0gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSAjaW5jbHVkZSA8YXNtL2RtYS5oPgotICNpbmNsdWRlIDxhc20vaW8uaD4KLSsjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0rCi0gI2luY2x1ZGUgIi4uL2Jsay5oIgotICNpbmNsdWRlICJzY3NpLmgiCi0gI2luY2x1ZGUgImhvc3RzLmgiCi1AQCAtNTI2LDYgKzUyOCw3IEBACi0gICAgIGludCBpLGo7Ci0gICAgIGNoYXIgY29uc3QgKmJhc2VfYWRkcmVzcyA9IE5VTEw7Ci0gCi0rICAgIGlmKGNoZWNrX3JlZ2lvbihJT19CQVNFLCA0KSkgcmV0dXJuIDA7ICAvKiBJTyBwb3J0cyBpbiB1c2UgKi8KLSAgICAgZm9yKGk9MDtpPChzaXplb2Yod2RfYmFzZXMpL3NpemVvZihjaGFyICopKTtpKyspewotIAlmb3Ioaj0wO2o8TlVNX1NJR05BVFVSRVM7aisrKXsKLSAJICAgIGlmKCFtZW1jbXAoKHZvaWQgKikod2RfYmFzZXNbaV0gKyBzaWduYXR1cmVzW2pdLm9mZnNldCksCi1AQCAtNTM3LDYgKzU0MCw3IEBACi0gICAgIH0KLSAgICAgaWYgKGJhc2VfYWRkcmVzcyA9PSBOVUxMKSByZXR1cm4gMDsKLSAKLSsgICAgc25hcmZfcmVnaW9uKElPX0JBU0UsIDQpOyAvKiBSZWdpc3RlciBvdXIgcG9ydHMgKi8KLSAgICAgLyogU3RvcmUgb3VyIGhvc3QgbnVtYmVyICovCi0gICAgIHdkNzAwMF9ob3N0ID0gaG9zdG51bTsKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9ibGtfZHJ2L3hkLmMgbGludXgva2VybmVsL2Jsa19kcnYveGQuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Jsa19kcnYveGQuYwlXZWQgSnVsIDI4IDAwOjE5OjM1IDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvYmxrX2Rydi94ZC5jCVdlZCBTZXAgIDEgMTc6MDQ6NDMgMTk5MwotQEAgLTIyMiw3ICsyMjIsNyBAQAotIAkJCWNhc2UgQkxLRkxTQlVGOgotIAkJCQlpZighc3VzZXIoKSkgIHJldHVybiAtRUFDQ0VTOwotIAkJCQlpZighaW5vZGUtPmlfcmRldikgcmV0dXJuIC1FSU5WQUw7Ci0tCQkJCXN5bmNfZGV2KGlub2RlLT5pX3JkZXYpOwotKwkJCQlmc3luY19kZXYoaW5vZGUtPmlfcmRldik7Ci0gCQkJCWludmFsaWRhdGVfYnVmZmVycyhpbm9kZS0+aV9yZGV2KTsKLSAJCQkJcmV0dXJuIDA7Ci0gCQkJCQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2Nocl9kcnYva2V5Ym9hcmQuYyBsaW51eC9rZXJuZWwvY2hyX2Rydi9rZXlib2FyZC5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvY2hyX2Rydi9rZXlib2FyZC5jCVNhdCBBdWcgMTQgMTg6NTI6MzQgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9jaHJfZHJ2L2tleWJvYXJkLmMJV2VkIFNlcCAgMSAwOTowNDoxNCAxOTkzCi1AQCAtNjUsNyArNjUsMTEgQEAKLSB1bnNpZ25lZCBsb25nIGtiZF9kZWFkX2tleXMgPSAwOwotIHVuc2lnbmVkIGxvbmcga2JkX3ByZXZfZGVhZF9rZXlzID0gMDsKLSAKLSsvKiBzaGlmdCBzdGF0ZSBjb3VudGVycy4uICovCi0gc3RhdGljIHVuc2lnbmVkIGNoYXIga19kb3duW05SX1NISUZUXSA9IHswLCB9OwotKy8qIGtleWJvYXJkIGtleSBiaXRtYXAgKi8KLStzdGF0aWMgdW5zaWduZWQgbG9uZyBrZXlfZG93bls4XSA9IHsgMCwgfTsKLSsKLSBzdGF0aWMgaW50IHdhbnRfY29uc29sZSA9IC0xOwotIHN0YXRpYyBpbnQgbGFzdF9jb25zb2xlID0gMDsJCS8qIGxhc3QgdXNlZCBWQyAqLwotIHN0YXRpYyBjaGFyIHJlcCA9IDA7CQkJLyogZmxhZyB0ZWxsaW5nIGNoYXJhY3RlciByZXBlYXQgKi8KLUBAIC0xNDksNiArMTUzLDcgQEAKLSAJa2JkID0ga2JkX3RhYmxlICsgZmdfY29uc29sZTsKLSAJaWYgKHZjX2tiZF9mbGFnKGtiZCxWQ19SQVcpKSB7Ci0gCQltZW1zZXQoa19kb3duLCAwLCBzaXplb2Yoa19kb3duKSk7Ci0rCQltZW1zZXQoa2V5X2Rvd24sIDAsIHNpemVvZihrZXlfZG93bikpOwotIAkJcHV0X3F1ZXVlKHNjYW5jb2RlKTsKLSAJCWdvdG8gZW5kX2tiZF9pbnRyOwotIAl9IGVsc2UKLUBAIC0xNjAsNyArMTY1LDYgQEAKLSBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNsYXRlKHVuc2lnbmVkIGNoYXIgc2NhbmNvZGUpCi0gewotIAljaGFyIGJyZWFrX2ZsYWc7Ci0tCXN0YXRpYyB1bnNpZ25lZCBsb25nIGtleV9kb3duWzhdID0geyAwLCB9OwotICAgICAgCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGUwX2tleXNbXSA9IHsKLSAJCTB4MWMsCS8qIGtleXBhZCBlbnRlciAqLwotIAkJMHgxZCwJLyogcmlnaHQgY29udHJvbCAqLwotQEAgLTU4NCw2ICs1ODgsOCBAQAotIAkJdmFsdWUgPSBLVkFMKEtfU0hJRlQpOwotIAkJY2xyX3ZjX2tiZF9mbGFnKGtiZCwgVkNfQ0FQU0xPQ0spOwotIAl9Ci0rCWlmICh2YWx1ZSA+IDMpCi0rCQlyZXR1cm47Ci0gCi0gCWlmICh1cF9mbGFnKSB7Ci0gCQlpZiAoa19kb3duW3ZhbHVlXSkKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9jaHJfZHJ2L21lbS5jIGxpbnV4L2tlcm5lbC9jaHJfZHJ2L21lbS5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvY2hyX2Rydi9tZW0uYwlNb24gQXVnICA5IDE4OjAyOjMyIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvY2hyX2Rydi9tZW0uYwlTYXQgQXVnIDIxIDEwOjE5OjMyIDE5OTMKLUBAIC0xMjksMTIgKzEyOSwyOCBAQAotIHN0YXRpYyBpbnQgbW1hcF9tZW0oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwKLSAJdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgbGVuLCBpbnQgcHJvdCwgdW5zaWduZWQgbG9uZyBvZmYpCi0gewotKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBtcG50OwotKwotIAlpZiAob2ZmICYgMHhmZmYgfHwgb2ZmICsgbGVuIDwgb2ZmKQotIAkJcmV0dXJuIC1FTlhJTzsKLS0KLSAJaWYgKHJlbWFwX3BhZ2VfcmFuZ2UoYWRkciwgb2ZmLCBsZW4sIHByb3QpKQotIAkJcmV0dXJuIC1FQUdBSU47Ci0tCQotKy8qIHRyeSB0byBjcmVhdGUgYSBkdW1teSB2bW0tc3RydWN0dXJlIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCBrbm93cyB3ZSBhcmUgaGVyZSAqLwotKwltcG50ID0gKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqICkga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7Ci0rCWlmICghbXBudCkKLSsJCXJldHVybiAwOwotKwotKwltcG50LT52bV90YXNrID0gY3VycmVudDsKLSsJbXBudC0+dm1fc3RhcnQgPSBhZGRyOwotKwltcG50LT52bV9lbmQgPSBhZGRyICsgbGVuOwotKwltcG50LT52bV9wYWdlX3Byb3QgPSBwcm90OwotKwltcG50LT52bV9zaGFyZSA9IE5VTEw7Ci0rCW1wbnQtPnZtX2lub2RlID0gaW5vZGU7Ci0rCWlub2RlLT5pX2NvdW50Kys7Ci0rCW1wbnQtPnZtX29mZnNldCA9IG9mZjsKLSsJbXBudC0+dm1fb3BzID0gTlVMTDsKLSsJbXBudC0+dm1fbmV4dCA9IGN1cnJlbnQtPm1tYXA7Ci0rCWN1cnJlbnQtPm1tYXAgPSBtcG50OwotIAlyZXR1cm4gMDsKLSB9Ci0gCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvY2hyX2Rydi9zZXJpYWwuYyBsaW51eC9rZXJuZWwvY2hyX2Rydi9zZXJpYWwuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Nocl9kcnYvc2VyaWFsLmMJRnJpIEF1ZyAxMyAyMToyMDo1MiAxOTkzCi0rKysgbGludXgva2VybmVsL2Nocl9kcnYvc2VyaWFsLmMJV2VkIEF1ZyAxOCAwMToxMzoyMyAxOTkzCi1AQCAtMTMyMSwxMiArMTMyMSwxMCBAQAotIAkKLSAJc3dpdGNoIChjbWQpIHsKLSAJCWNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KLS0JCQl3YWl0X3VudGlsX3NlbnQodHR5KTsKLSAJCQlpZiAoIWFyZykKLSAJCQkJc2VuZF9icmVhayhpbmZvLCBIWi80KTsJLyogMS80IHNlY29uZCAqLwotIAkJCXJldHVybiAwOwotIAkJY2FzZSBUQ1NCUktQOgkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCi0tCQkJd2FpdF91bnRpbF9zZW50KHR0eSk7Ci0gCQkJc2VuZF9icmVhayhpbmZvLCBhcmcgPyBhcmcqKEhaLzEwKSA6IEhaLzQpOwotIAkJCXJldHVybiAwOwotIAkJY2FzZSBUSU9DR1NPRlRDQVI6Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvY2hyX2Rydi90dHlfaW9jdGwuYyBsaW51eC9rZXJuZWwvY2hyX2Rydi90dHlfaW9jdGwuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Nocl9kcnYvdHR5X2lvY3RsLmMJVGh1IEp1bCAyOSAxMjoxNToyNSAxOTkzCi0rKysgbGludXgva2VybmVsL2Nocl9kcnYvdHR5X2lvY3RsLmMJV2VkIEF1ZyAxOCAwMToxMzowNyAxOTkzCi1AQCAtNjA1LDcgKzYwNSwxMiBAQAotIAkJCSAgICAgdHR5LT5wYWNrZXQgPSAwOwotIAkJCSAgIHJldHVybiAoMCk7Ci0gCQkJfQotLQotKwkJY2FzZSBUQ1NCUks6IGNhc2UgVENTQlJLUDoKLSsJCQl3YWl0X3VudGlsX3NlbnQodHR5KTsKLSsJCQlpZiAoIXR0eS0+aW9jdGwpCi0rCQkJCXJldHVybiAwOwotKwkJCXR0eS0+aW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7Ci0rCQkJcmV0dXJuIDA7Ci0gCQlkZWZhdWx0OgotIAkJCWlmICh0dHktPmlvY3RsKSB7Ci0gCQkJCXJldHZhbCA9ICh0dHktPmlvY3RsKSh0dHksIGZpbGUsIGNtZCwgYXJnKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9jaHJfZHJ2L3Z0LmMgbGludXgva2VybmVsL2Nocl9kcnYvdnQuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2Nocl9kcnYvdnQuYwlTYXQgSnVsIDMxIDIwOjMyOjM2IDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvY2hyX2Rydi92dC5jCVNhdCBTZXAgIDQgMDM6MTc6NTQgMTk5MwotQEAgLTM1LDcgKzM1LDcgQEAKLSAKLSBzdHJ1Y3QgdnRfY29ucyB2dF9jb25zW05SX0NPTlNPTEVTXTsKLSAKLS1leHRlcm4gIkMiIGludCBzeXNfaW9wZXJtKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyBudW0sIGludCBvbik7Ci0rYXNtbGlua2FnZSBpbnQgc3lzX2lvcGVybSh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgb24pOwotIAotIGV4dGVybiB2b2lkIGNoYW5nZV9jb25zb2xlKHVuc2lnbmVkIGludCBuZXdfY29uc29sZSk7Ci0gZXh0ZXJuIHZvaWQgY29tcGxldGVfY2hhbmdlX2NvbnNvbGUodW5zaWduZWQgaW50IG5ld19jb25zb2xlKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9leGl0LmMgbGludXgva2VybmVsL2V4aXQuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2V4aXQuYwlNb24gQXVnICAyIDE4OjE2OjI2IDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvZXhpdC5jCVNhdCBTZXAgIDQgMDM6MDQ6MzQgMTk5MwotQEAgLTI3NCw3ICsyNzQsNyBAQAotICAqIFBPU0lYIHNwZWNpZmllcyB0aGF0IGtpbGwoLTEsc2lnKSBpcyB1bnNwZWNpZmllZCwgYnV0IHdoYXQgd2UgaGF2ZQotICAqIGlzIHByb2JhYmx5IHdyb25nLiAgU2hvdWxkIG1ha2UgaXQgbGlrZSBCU0Qgb3IgU1lTVi4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfa2lsbChpbnQgcGlkLGludCBzaWcpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2tpbGwoaW50IHBpZCxpbnQgc2lnKQotIHsKLSAJaW50IGVyciwgcmV0dmFsID0gMCwgY291bnQgPSAwOwotIAotQEAgLTM3Niw3ICszNzYsNyBAQAotIAkJY3VycmVudC0+bW1hcCA9IE5VTEw7Ci0gCQl3aGlsZSAobXBudCkgewotIAkJCW1wbnQxID0gbXBudC0+dm1fbmV4dDsKLS0JCQlpZiAobXBudC0+dm1fb3BzLT5jbG9zZSkKLSsJCQlpZiAobXBudC0+dm1fb3BzICYmIG1wbnQtPnZtX29wcy0+Y2xvc2UpCi0gCQkJCW1wbnQtPnZtX29wcy0+Y2xvc2UobXBudCk7Ci0gCQkJa2ZyZWUobXBudCk7Ci0gCQkJbXBudCA9IG1wbnQxOwotQEAgLTQ5MSwxMiArNDkxLDEyIEBACi0gCWdvdG8gZmFrZV92b2xhdGlsZTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2V4aXQoaW50IGVycm9yX2NvZGUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2V4aXQoaW50IGVycm9yX2NvZGUpCi0gewotIAlkb19leGl0KChlcnJvcl9jb2RlJjB4ZmYpPDw4KTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3dhaXQ0KHBpZF90IHBpZCx1bnNpZ25lZCBsb25nICogc3RhdF9hZGRyLCBpbnQgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSAqIHJ1KQotK2FzbWxpbmthZ2UgaW50IHN5c193YWl0NChwaWRfdCBwaWQsdW5zaWduZWQgbG9uZyAqIHN0YXRfYWRkciwgaW50IG9wdGlvbnMsIHN0cnVjdCBydXNhZ2UgKiBydSkKLSB7Ci0gCWludCBmbGFnLCByZXR2YWw7Ci0gCXN0cnVjdCB3YWl0X3F1ZXVlIHdhaXQgPSB7IGN1cnJlbnQsIE5VTEwgfTsKLUBAIC01ODcsNyArNTg3LDcgQEAKLSAgKiBzeXNfd2FpdHBpZCgpIHJlbWFpbnMgZm9yIGNvbXBhdGliaWxpdHkuIHdhaXRwaWQoKSBzaG91bGQgYmUKLSAgKiBpbXBsZW1lbnRlZCBieSBjYWxsaW5nIHN5c193YWl0NCgpIGZyb20gbGliYy5hLgotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c193YWl0cGlkKHBpZF90IHBpZCx1bnNpZ25lZCBsb25nICogc3RhdF9hZGRyLCBpbnQgb3B0aW9ucykKLSthc21saW5rYWdlIGludCBzeXNfd2FpdHBpZChwaWRfdCBwaWQsdW5zaWduZWQgbG9uZyAqIHN0YXRfYWRkciwgaW50IG9wdGlvbnMpCi0gewotIAlyZXR1cm4gc3lzX3dhaXQ0KHBpZCwgc3RhdF9hZGRyLCBvcHRpb25zLCBOVUxMKTsKLSB9Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvZm9yay5jIGxpbnV4L2tlcm5lbC9mb3JrLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9mb3JrLmMJTW9uIEF1ZyAgOSAxNzo0MToyNCAxOTkzCi0rKysgbGludXgva2VybmVsL2ZvcmsuYwlTYXQgU2VwICA0IDAzOjAxOjE0IDE5OTMKLUBAIC0yMyw3ICsyMyw3IEBACi0gI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSAKLS1leHRlcm4gIkMiIHZvaWQgcmV0X2Zyb21fc3lzX2NhbGwodm9pZCkgX19hc21fXygicmV0X2Zyb21fc3lzX2NhbGwiKTsKLSthc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fc3lzX2NhbGwodm9pZCkgX19hc21fXygicmV0X2Zyb21fc3lzX2NhbGwiKTsKLSAKLSAjZGVmaW5lIE1BWF9UQVNLU19QRVJfVVNFUiAoTlJfVEFTS1MvMikKLSAKLUBAIC0xMTMsNyArMTEzLDcgQEAKLSAgKiBpbmZvcm1hdGlvbiAodGFza1tucl0pIGFuZCBzZXRzIHVwIHRoZSBuZWNlc3NhcnkgcmVnaXN0ZXJzLiBJdAotICAqIGFsc28gY29waWVzIHRoZSBkYXRhIHNlZ21lbnQgaW4gaXQncyBlbnRpcmV0eS4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyByZWdzKQotK2FzbWxpbmthZ2UgaW50IHN5c19mb3JrKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCi0gewotIAlzdHJ1Y3QgcHRfcmVncyAqIGNoaWxkcmVnczsKLSAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotQEAgLTE3Niw3ICsxNzYsNyBAQAotIAlwLT5leGl0X3NpZ25hbCA9IGNsb25lX2ZsYWdzICYgQ1NJR05BTDsKLSAJcC0+dHNzLmxkdCA9IF9MRFQobnIpOwotIAlpZiAocC0+bGR0KSB7Ci0tCQlpZiAocC0+bGR0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkKLSsJCWlmICgocC0+bGR0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkgIT0gTlVMTCkKLSAJCQltZW1jcHkocC0+bGR0LCBjdXJyZW50LT5sZHQsIFBBR0VfU0laRSk7Ci0gCX0KLSAJcC0+dHNzLmJpdG1hcCA9IG9mZnNldG9mKHN0cnVjdCB0c3Nfc3RydWN0LGlvX2JpdG1hcCk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvaW5mby5jIGxpbnV4L2tlcm5lbC9pbmZvLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9pbmZvLmMJU2F0IEp1bCAgMyAwMTowMjozMyAxOTkzCi0rKysgbGludXgva2VybmVsL2luZm8uYwlTYXQgU2VwICA0IDAzOjExOjA5IDE5OTMKLUBAIC0xNCw3ICsxNCw3IEBACi0gI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3N5c2luZm8oc3RydWN0IHN5c2luZm8gKmluZm8pCi0rYXNtbGlua2FnZSBpbnQgc3lzX3N5c2luZm8oc3RydWN0IHN5c2luZm8gKmluZm8pCi0gewotIAlpbnQgZXJyb3I7Ci0gCXN0cnVjdCBzeXNpbmZvIHZhbDsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9pb3BvcnQuYyBsaW51eC9rZXJuZWwvaW9wb3J0LmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9pb3BvcnQuYwlXZWQgSnVsIDE0IDE5OjA3OjI4IDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvaW9wb3J0LmMJU2F0IFNlcCAgNCAwMzoxMDoyOCAxOTkzCi1AQCAtOSw3ICs5LDEwIEBACi0gI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSAKLStzdGF0aWMgdW5zaWduZWQgbG9uZyBpb3BvcnRfcmVnaXN0cmFyW0lPX0JJVE1BUF9TSVpFXSA9IHswLCAvKiAuLi4gKi99OwotKwotICNkZWZpbmUgX0lPREVCVUcKLSAKLSAjaWZkZWYgSU9ERUJVRwotQEAgLTQwLDE0ICs0Myw3NiBAQAotIH0KLSAjZW5kaWYKLSAKLSsvKiBTZXQgRVhURU5UIGJpdHMgc3RhcnRpbmcgYXQgQkFTRSBpbiBCSVRNQVAgdG8gdmFsdWUgVFVSTl9PTi4gKi8KLSthc21saW5rYWdlIHZvaWQgc2V0X2JpdG1hcCh1bnNpZ25lZCBsb25nICpiaXRtYXAsCi0rCQkJCQkJICAgc2hvcnQgYmFzZSwgc2hvcnQgZXh0ZW50LCBpbnQgbmV3X3ZhbHVlKQotK3sKLSsJaW50IG1hc2s7Ci0rCXVuc2lnbmVkIGxvbmcgKmJpdG1hcF9iYXNlID0gYml0bWFwICsgKGJhc2UgPj4gNSk7Ci0rCXVuc2lnbmVkIHNob3J0IGxvd19pbmRleCA9IGJhc2UgJiAweDFmOwotKwlpbnQgbGVuZ3RoID0gbG93X2luZGV4ICsgZXh0ZW50OwotKwotKwlpZiAobG93X2luZGV4ICE9IDApIHsKLSsJCW1hc2sgPSAofjAgPDwgbG93X2luZGV4KTsKLSsJCWlmIChsZW5ndGggPCAzMikKLSsJCQkJbWFzayAmPSB+KH4wIDw8IGxlbmd0aCk7Ci0rCQlpZiAobmV3X3ZhbHVlKQotKwkJCSpiaXRtYXBfYmFzZSsrIHw9IG1hc2s7Ci0rCQllbHNlCi0rCQkJKmJpdG1hcF9iYXNlKysgJj0gfm1hc2s7Ci0rCQlsZW5ndGggLT0gMzI7Ci0rCX0KLSsKLSsJbWFzayA9IChuZXdfdmFsdWUgPyB+MCA6IDApOwotKwl3aGlsZSAobGVuZ3RoID49IDMyKSB7Ci0rCQkqYml0bWFwX2Jhc2UrKyA9IG1hc2s7Ci0rCQlsZW5ndGggLT0gMzI7Ci0rCX0KLSsKLSsJaWYgKGxlbmd0aCA+IDApIHsKLSsJCW1hc2sgPSB+KH4wIDw8IGxlbmd0aCk7Ci0rCQlpZiAobmV3X3ZhbHVlKQotKwkJCSpiaXRtYXBfYmFzZSsrIHw9IG1hc2s7Ci0rCQllbHNlCi0rCQkJKmJpdG1hcF9iYXNlKysgJj0gfm1hc2s7Ci0rCX0KLSt9Ci0rCi0rLyogQ2hlY2sgZm9yIHNldCBiaXRzIGluIEJJVE1BUCBzdGFydGluZyBhdCBCQVNFLCBnb2luZyB0byBFWFRFTlQuICovCi0rYXNtbGlua2FnZSBpbnQgY2hlY2tfYml0bWFwKHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgc2hvcnQgYmFzZSwgc2hvcnQgZXh0ZW50KQotK3sKLSsJaW50IG1hc2s7Ci0rCXVuc2lnbmVkIGxvbmcgKmJpdG1hcF9iYXNlID0gYml0bWFwICsgKGJhc2UgPj4gNSk7Ci0rCXVuc2lnbmVkIHNob3J0IGxvd19pbmRleCA9IGJhc2UgJiAweDFmOwotKwlpbnQgbGVuZ3RoID0gbG93X2luZGV4ICsgZXh0ZW50OwotKwotKwlpZiAobG93X2luZGV4ICE9IDApIHsKLSsJCW1hc2sgPSAofjAgPDwgbG93X2luZGV4KTsKLSsJCWlmIChsZW5ndGggPCAzMikKLSsJCQkJbWFzayAmPSB+KH4wIDw8IGxlbmd0aCk7Ci0rCQlpZiAoKmJpdG1hcF9iYXNlKysgJiBtYXNrKQotKwkJCXJldHVybiAxOwotKwkJbGVuZ3RoIC09IDMyOwotKwl9Ci0rCXdoaWxlIChsZW5ndGggPj0gMzIpIHsKLSsJCWlmICgqYml0bWFwX2Jhc2UrKyAhPSAwKQotKwkJCXJldHVybiAxOwotKwkJbGVuZ3RoIC09IDMyOwotKwl9Ci0rCi0rCWlmIChsZW5ndGggPiAwKSB7Ci0rCQltYXNrID0gfih+MCA8PCBsZW5ndGgpOwotKwkJaWYgKCpiaXRtYXBfYmFzZSsrICYgbWFzaykKLSsJCQlyZXR1cm4gMTsKLSsJfQotKwlyZXR1cm4gMDsKLSt9Ci0rCi0gLyoKLSAgKiB0aGlzIGNoYW5nZXMgdGhlIGlvIHBlcm1pc3Npb25zIGJpdG1hcCBpbiB0aGUgY3VycmVudCB0YXNrLgotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19pb3Blcm0odW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIG51bSwgaW50IHR1cm5fb24pCi0rYXNtbGlua2FnZSBpbnQgc3lzX2lvcGVybSh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgbnVtLCBpbnQgdHVybl9vbikKLSB7Ci0tCXVuc2lnbmVkIGxvbmcgZnJvbWwsIGxpbmRleCwgdG51bSwgbnVtbCwgcmluZGV4LCBtYXNrOwotLQl1bnNpZ25lZCBsb25nICppb3A7Ci0tCi0gCWlmIChmcm9tICsgbnVtIDw9IGZyb20pCi0gCQlyZXR1cm4gLUVJTlZBTDsKLSAJaWYgKGZyb20gKyBudW0gPiBJT19CSVRNQVBfU0laRSozMikKLUBAIC01NCw0MiArMTE5LDExIEBACi0gCQlyZXR1cm4gLUVJTlZBTDsKLSAJaWYgKCFzdXNlcigpKQotIAkJcmV0dXJuIC1FUEVSTTsKLS0JZnJvbWwgPSBmcm9tID4+IDU7Ci0tCWxpbmRleCA9IGZyb20gJiAweDFmOwotLQl0bnVtID0gbGluZGV4ICsgbnVtOwotLQludW1sID0gKHRudW0gKyAweDFmKSA+PiA1OwotLQlyaW5kZXggPSB0bnVtICYgMHgxZjsKLSAKLSAjaWZkZWYgSU9ERUJVRwotIAlwcmludGsoImlvOiBmcm9tPSVkIG51bT0lZCAlc1xuIiwgZnJvbSwgbnVtLCAodHVybl9vbiA/ICJvbiIgOiAib2ZmIikpOwotICNlbmRpZgotLQotLQlpZiAobnVtbCkgewotLQkJaW9wID0gKHVuc2lnbmVkIGxvbmcgKiljdXJyZW50LT50c3MuaW9fYml0bWFwICsgZnJvbWw7Ci0tCQlpZiAobGluZGV4ICE9IDApIHsKLS0JCQltYXNrID0gKH4wIDw8IGxpbmRleCk7Ci0tCQkJaWYgKC0tbnVtbCA9PSAwICYmIHJpbmRleCkKLS0JCQkJbWFzayAmPSB+KH4wIDw8IHJpbmRleCk7Ci0tCQkJaWYgKHR1cm5fb24pCi0tCQkJCSppb3ArKyAmPSB+bWFzazsKLS0JCQllbHNlCi0tCQkJCSppb3ArKyB8PSBtYXNrOwotLQkJfQotLQkJaWYgKG51bWwpIHsKLS0JCQlpZiAocmluZGV4KQotLQkJCQktLW51bWw7Ci0tCQkJbWFzayA9ICh0dXJuX29uID8gMCA6IH4wKTsKLS0JCQl3aGlsZSAobnVtbC0tKQotLQkJCQkqaW9wKysgPSBtYXNrOwotLQkJCWlmIChudW1sICYmIHJpbmRleCkgewotLQkJCQltYXNrID0gfih+MCA8PCByaW5kZXgpOwotLQkJCQlpZiAodHVybl9vbikKLS0JCQkJCSppb3ArKyAmPSB+bWFzazsKLS0JCQkJZWxzZQotLQkJCQkJKmlvcCsrIHw9IG1hc2s7Ci0tCQkJfQotLQkJfQotLQl9Ci0rCXNldF9iaXRtYXAoKHVuc2lnbmVkIGxvbmcgKiljdXJyZW50LT50c3MuaW9fYml0bWFwLCBmcm9tLCBudW0sICF0dXJuX29uKTsKLSAJcmV0dXJuIDA7Ci0gfQotIAotQEAgLTEwNSw3ICsxMzksNyBAQAotICAqIG9uIHN5c3RlbS1jYWxsIGVudHJ5IC0gc2VlIGFsc28gZm9yaygpIGFuZCB0aGUgc2lnbmFsIGhhbmRsaW5nCi0gICogY29kZS4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfaW9wbChsb25nIGVieCxsb25nIGVjeCxsb25nIGVkeCwKLSthc21saW5rYWdlIGludCBzeXNfaW9wbChsb25nIGVieCxsb25nIGVjeCxsb25nIGVkeCwKLSAJICAgICBsb25nIGVzaSwgbG9uZyBlZGksIGxvbmcgZWJwLCBsb25nIGVheCwgbG9uZyBkcywKLSAJICAgICBsb25nIGVzLCBsb25nIGZzLCBsb25nIGdzLCBsb25nIG9yaWdfZWF4LAotIAkgICAgIGxvbmcgZWlwLGxvbmcgY3MsbG9uZyBlZmxhZ3MsbG9uZyBlc3AsbG9uZyBzcykKLUBAIC0xMTgsNCArMTUyLDMzIEBACi0gCQlyZXR1cm4gLUVQRVJNOwotIAkqKCZlZmxhZ3MpID0gKGVmbGFncyAmIDB4ZmZmZmNmZmYpIHwgKGxldmVsIDw8IDEyKTsKLSAJcmV0dXJuIDA7Ci0rfQotKwotKwotK3ZvaWQgc25hcmZfcmVnaW9uKHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgbnVtKQotK3sKLSsJaWYgKGZyb20gPiBJT19CSVRNQVBfU0laRSozMikKLSsJCXJldHVybjsKLSsJaWYgKGZyb20gKyBudW0gPiBJT19CSVRNQVBfU0laRSozMikKLSsJCW51bSA9IElPX0JJVE1BUF9TSVpFKjMyIC0gZnJvbTsKLSsJc2V0X2JpdG1hcChpb3BvcnRfcmVnaXN0cmFyLCBmcm9tLCBudW0sIDEpOwotKwlyZXR1cm47Ci0rfQotKwotK2ludCBjaGVja19yZWdpb24odW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCBudW0pCi0rewotKwlpZiAoZnJvbSA+IElPX0JJVE1BUF9TSVpFKjMyKQotKwkJcmV0dXJuIDA7Ci0rCWlmIChmcm9tICsgbnVtID4gSU9fQklUTUFQX1NJWkUqMzIpCi0rCQludW0gPSBJT19CSVRNQVBfU0laRSozMiAtIGZyb207Ci0rCXJldHVybiBjaGVja19iaXRtYXAoaW9wb3J0X3JlZ2lzdHJhciwgZnJvbSwgbnVtKTsKLSt9Ci0rCi0rLyogQ2FsbGVkIGZyb20gaW5pdC9tYWluLmMgdG8gcmVzZXJ2ZSBJTyBwb3J0cy4gKi8KLSt2b2lkIHJlc2VydmVfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCi0rewotKwlpbnQgaTsKLSsKLSsJZm9yIChpID0gMTsgaSA8IGludHNbMF07IGkgKz0gMikKLSsJCXNuYXJmX3JlZ2lvbihpbnRzW2ldLCBpbnRzW2krMV0pOwotIH0KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9pcnEuYyBsaW51eC9rZXJuZWwvaXJxLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9pcnEuYwlTdW4gSnVsIDE4IDE2OjAxOjM1IDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvaXJxLmMJU2F0IFNlcCAgNCAwMjo1OTowNiAxOTkzCi1AQCAtNDcsNyArNDcsNyBAQAotICAqIGVuYWJsZWQuICBkb19ib3R0b21faGFsZigpIGlzIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gaXRzZWxmOiBhCi0gICogYm90dG9tX2hhbGYgaGFuZGxlciBuZWVkIG5vdCBiZSByZS1lbnRyYW50LgotICAqLwotLWV4dGVybiAiQyIgdm9pZCBkb19ib3R0b21faGFsZih2b2lkKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19ib3R0b21faGFsZih2b2lkKQotIHsKLSAJdW5zaWduZWQgbG9uZyBhY3RpdmU7Ci0gCXVuc2lnbmVkIGxvbmcgbWFzaywgbGVmdDsKLUBAIC0xNTYsNyArMTU2LDcgQEAKLSAgKiBJUlEncyBzaG91bGQgdXNlIHRoaXMgZm9ybWF0OiBub3RhYmx5IHRoZSBrZXlib2FyZC90aW1lcgotICAqIHJvdXRpbmVzLgotICAqLwotLWV4dGVybiAiQyIgdm9pZCBkb19JUlEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19JUlEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotIHsKLSAJc3RydWN0IHNpZ2FjdGlvbiAqIHNhID0gaXJxICsgaXJxX3NpZ2FjdGlvbjsKLSAKLUBAIC0xNjgsNyArMTY4LDcgQEAKLSAgKiBzdHVmZiAtIHRoZSBoYW5kbGVyIGlzIGFsc28gcnVubmluZyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdW5sZXNzCi0gICogaXQgZXhwbGljaXRseSBlbmFibGVzIHRoZW0gbGF0ZXIuCi0gICovCi0tZXh0ZXJuICJDIiB2b2lkIGRvX2Zhc3RfSVJRKGludCBpcnEpCi0rYXNtbGlua2FnZSB2b2lkIGRvX2Zhc3RfSVJRKGludCBpcnEpCi0gewotIAlzdHJ1Y3Qgc2lnYWN0aW9uICogc2EgPSBpcnEgKyBpcnFfc2lnYWN0aW9uOwotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL2l0aW1lci5jIGxpbnV4L2tlcm5lbC9pdGltZXIuYwotLS0tIHBsMTIvbGludXgva2VybmVsL2l0aW1lci5jCVNhdCBKdWwgIDMgMDE6MDE6MzkgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9pdGltZXIuYwlTYXQgU2VwICA0IDAzOjEwOjUxIDE5OTMKLUBAIC01Myw3ICs1Myw3IEBACi0gCXJldHVybigwKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2dldGl0aW1lcihpbnQgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgKnZhbHVlKQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSkKLSB7Ci0gCWludCBlcnJvcjsKLSAJc3RydWN0IGl0aW1lcnZhbCBnZXRfYnVmZmVyOwotQEAgLTk4LDcgKzk4LDcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19zZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSwgc3RydWN0IGl0aW1lcnZhbCAqb3ZhbHVlKQotK2FzbWxpbmthZ2UgaW50IHN5c19zZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSwgc3RydWN0IGl0aW1lcnZhbCAqb3ZhbHVlKQotIHsKLSAJaW50IGVycm9yOwotIAlzdHJ1Y3QgaXRpbWVydmFsIHNldF9idWZmZXIsIGdldF9idWZmZXI7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvbGR0LmMgbGludXgva2VybmVsL2xkdC5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvbGR0LmMJTW9uIEF1ZyAgOSAxODowMjozMiAxOTkzCi0rKysgbGludXgva2VybmVsL2xkdC5jCVNhdCBTZXAgIDQgMDM6MTE6MzAgMTk5MwotQEAgLTg2LDcgKzg2LDcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19tb2RpZnlfbGR0KGludCBmdW5jLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQotK2FzbWxpbmthZ2UgaW50IHN5c19tb2RpZnlfbGR0KGludCBmdW5jLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQotIHsKLSAJaWYgKGZ1bmMgPT0gMCkKLSAJCXJldHVybiByZWFkX2xkdChwdHIsIGJ5dGVjb3VudCk7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvcGFuaWMuYyBsaW51eC9rZXJuZWwvcGFuaWMuYwotLS0tIHBsMTIvbGludXgva2VybmVsL3BhbmljLmMJU2F0IEp1bCAgMyAwMTowMzoxNSAxOTkzCi0rKysgbGludXgva2VybmVsL3BhbmljLmMJU2F0IFNlcCAgNCAwMzowMTo0MiAxOTkzCi1AQCAtMTEsNyArMTEsNyBAQAotICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSAKLS1leHRlcm4gIkMiIHZvaWQgc3lzX3N5bmModm9pZCk7CS8qIGl0J3MgcmVhbGx5IGludCAqLwotK2FzbWxpbmthZ2Ugdm9pZCBzeXNfc3luYyh2b2lkKTsJLyogaXQncyByZWFsbHkgaW50ICovCi0gCi0gdm9sYXRpbGUgdm9pZCBwYW5pYyhjb25zdCBjaGFyICogcykKLSB7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvcHJpbnRrLmMgbGludXgva2VybmVsL3ByaW50ay5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvcHJpbnRrLmMJTW9uIEF1ZyAgOSAxODowMjozMiAxOTkzCi0rKysgbGludXgva2VybmVsL3ByaW50ay5jCVNhdCBTZXAgIDQgMDM6MDQ6MTggMTk5MwotQEAgLTQ3LDcgKzQ3LDcgQEAKLSAgKiAJNiAtLSBEaXNhYmxlIHByaW50aydzIHRvIGNvbnNvbGUKLSAgKiAJNyAtLSBFbmFibGUgcHJpbnRrJ3MgdG8gY29uc29sZQotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19zeXNsb2coaW50IHR5cGUsIGNoYXIgKiBidWYsIGludCBsZW4pCi0rYXNtbGlua2FnZSBpbnQgc3lzX3N5c2xvZyhpbnQgdHlwZSwgY2hhciAqIGJ1ZiwgaW50IGxlbikKLSB7Ci0gCXVuc2lnbmVkIGxvbmcgaSwgaiwgY291bnQ7Ci0gCWludCBkb19jbGVhciA9IDA7Ci1AQCAtMTA0LDcgKzEwNCw3IEBACi0gCQkJCWNvdW50ID0gbG9nZ2VkX2NoYXJzOwotIAkJCWogPSBsb2dfc3RhcnQgKyBsb2dfc2l6ZSAtIGNvdW50OwotIAkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0tCQkJCWMgPSAqKChjaGFyICopIGxvZ19idWYgKyAoaisrICYgTE9HX0JVRl9MRU4tMSkpOwotKwkJCQljID0gKigoY2hhciAqKSBsb2dfYnVmKyhqKysgJiAoTE9HX0JVRl9MRU4tMSkpKTsKLSAJCQkJcHV0X2ZzX2J5dGUoYywgYnVmKyspOwotIAkJCX0KLSAJCQlpZiAoZG9fY2xlYXIpCi1AQCAtMTI0LDcgKzEyNCw3IEBACi0gfQotIAkJCQotIAotLWV4dGVybiAiQyIgaW50IHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLSthc21saW5rYWdlIGludCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCi0gewotIAl2YV9saXN0IGFyZ3M7Ci0gCWludCBpLGo7Ci1AQCAtMTMzLDcgKzEzMyw3IEBACi0gCWk9dnNwcmludGYoYnVmLGZtdCxhcmdzKTsKLSAJdmFfZW5kKGFyZ3MpOwotIAlmb3IgKGogPSAwOyBqIDwgaSA7IGorKykgewotLQkJbG9nX2J1ZlsobG9nX3N0YXJ0K2xvZ19zaXplKSAmIExPR19CVUZfTEVOLTFdID0gYnVmW2pdOwotKwkJbG9nX2J1ZlsobG9nX3N0YXJ0K2xvZ19zaXplKSAmIChMT0dfQlVGX0xFTi0xKV0gPSBidWZbal07Ci0gCQlpZiAobG9nX3NpemUgPCBMT0dfQlVGX0xFTikKLSAJCQlsb2dfc2l6ZSsrOwotIAkJZWxzZQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL3B0cmFjZS5jIGxpbnV4L2tlcm5lbC9wdHJhY2UuYwotLS0tIHBsMTIvbGludXgva2VybmVsL3B0cmFjZS5jCU1vbiBBdWcgIDkgMTg6MDI6MzIgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9wdHJhY2UuYwlTYXQgU2VwICA0IDAzOjEwOjE1IDE5OTMKLUBAIC0xNTIsNyArMTUyLDcgQEAKLSAJaWYgKChhZGRyICYgflBBR0VfTUFTSykgPiBQQUdFX1NJWkUtc2l6ZW9mKGxvbmcpKSB7Ci0gCQlsb3cgPSBnZXRfbG9uZyh0c2ssYWRkciAmIH4oc2l6ZW9mKGxvbmcpLTEpKTsKLSAJCWhpZ2ggPSBnZXRfbG9uZyh0c2ssKGFkZHIrc2l6ZW9mKGxvbmcpKSAmIH4oc2l6ZW9mKGxvbmcpLTEpKTsKLS0JCXN3aXRjaCAoYWRkciAmIHNpemVvZihsb25nKS0xKSB7Ci0rCQlzd2l0Y2ggKGFkZHIgJiAoc2l6ZW9mKGxvbmcpLTEpKSB7Ci0gCQkJY2FzZSAxOgotIAkJCQlsb3cgPj49IDg7Ci0gCQkJCWxvdyB8PSBoaWdoIDw8IDI0OwotQEAgLTE4Niw3ICsxODYsNyBAQAotIAlpZiAoKGFkZHIgJiB+UEFHRV9NQVNLKSA+IFBBR0VfU0laRS1zaXplb2YobG9uZykpIHsKLSAJCWxvdyA9IGdldF9sb25nKHRzayxhZGRyICYgfihzaXplb2YobG9uZyktMSkpOwotIAkJaGlnaCA9IGdldF9sb25nKHRzaywoYWRkcitzaXplb2YobG9uZykpICYgfihzaXplb2YobG9uZyktMSkpOwotLQkJc3dpdGNoIChhZGRyICYgc2l6ZW9mKGxvbmcpLTEpIHsKLSsJCXN3aXRjaCAoYWRkciAmIChzaXplb2YobG9uZyktMSkpIHsKLSAJCQljYXNlIDA6IC8qIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBzYWZldHkgZmlyc3QgKi8KLSAJCQkJbG93ID0gZGF0YTsKLSAJCQkJYnJlYWs7Ci1AQCAtMjE2LDcgKzIxNiw3IEBACi0gCXJldHVybiAwOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfcHRyYWNlKGxvbmcgcmVxdWVzdCwgbG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQotK2FzbWxpbmthZ2UgaW50IHN5c19wdHJhY2UobG9uZyByZXF1ZXN0LCBsb25nIHBpZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCi0gewotIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOwotIAotQEAgLTI4NSw2ICsyODUsMTAgQEAKLSAJCQlpZiAocmVzKQotIAkJCQlyZXR1cm4gcmVzOwotIAkJCXRtcCA9IGdldF9zdGFja19sb25nKGNoaWxkLCBzaXplb2YobG9uZykqYWRkciAtIE1BR0lDTlVNQkVSKTsKLSsJCQlpZiAoYWRkciA9PSBEUyB8fCBhZGRyID09IEVTIHx8Ci0rCQkJICAgIGFkZHIgPT0gRlMgfHwgYWRkciA9PSBHUyB8fAotKwkJCSAgICBhZGRyID09IENTIHx8IGFkZHIgPT0gU1MpCi0rCQkJCXRtcCAmPSAweGZmZmY7Ci0gCQkJcHV0X2ZzX2xvbmcodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotIAkJCXJldHVybiAwOwotIAkJfQotQEAgLTMwMiw4ICszMDYsMTEgQEAKLSAJCQkJcmV0dXJuIC1FSU87Ci0gCQkJaWYgKGFkZHIgPT0gRFMgfHwgYWRkciA9PSBFUyB8fAotIAkJCSAgICBhZGRyID09IEZTIHx8IGFkZHIgPT0gR1MgfHwKLS0JCQkgICAgYWRkciA9PSBDUyB8fCBhZGRyID09IFNTKQotLQkJCQlyZXR1cm4gLUVJTzsKLSsJCQkgICAgYWRkciA9PSBDUyB8fCBhZGRyID09IFNTKSB7Ci0rCQkJICAgIAlkYXRhICY9IDB4ZmZmZjsKLSsJCQkgICAgCWlmIChkYXRhICYmIChkYXRhICYgMykgIT0gMykKLSsJCQkJCXJldHVybiAtRUlPOwotKwkJCX0KLSAJCQlpZiAoYWRkciA9PSBFRkwpIHsgICAvKiBmbGFncy4gKi8KLSAJCQkJZGF0YSAmPSBGTEFHX01BU0s7Ci0gCQkJCWRhdGEgfD0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIEVGTCpzaXplb2YobG9uZyktTUFHSUNOVU1CRVIpICAmIH5GTEFHX01BU0s7Ci1AQCAtMzgyLDcgKzM4OSw3IEBACi0gCX0KLSB9Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKLSthc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKQotIHsKLSAJaWYgKChjdXJyZW50LT5mbGFncyAmIChQRl9QVFJBQ0VEfFBGX1RSQUNFU1lTKSkKLSAJCQkhPSAoUEZfUFRSQUNFRHxQRl9UUkFDRVNZUykpCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9rZXJuZWwvc2NoZWQuYyBsaW51eC9rZXJuZWwvc2NoZWQuYwotLS0tIHBsMTIvbGludXgva2VybmVsL3NjaGVkLmMJTW9uIEF1ZyAgOSAxODowMjozMiAxOTkzCi0rKysgbGludXgva2VybmVsL3NjaGVkLmMJU2F0IFNlcCAgNCAwMjo0NTowOSAxOTkzCi1AQCAtNTEsNyArNTEsNyBAQAotIGV4dGVybiB2b2lkIG1lbV91c2Uodm9pZCk7Ci0gCi0gZXh0ZXJuIGludCB0aW1lcl9pbnRlcnJ1cHQodm9pZCk7Ci0tZXh0ZXJuICJDIiBpbnQgc3lzdGVtX2NhbGwodm9pZCk7Ci0rYXNtbGlua2FnZSBpbnQgc3lzdGVtX2NhbGwodm9pZCk7Ci0gCi0gc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5pdF9rZXJuZWxfc3RhY2tbMTAyNF07Ci0gc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSzsKLUBAIC04Miw3ICs4Miw3IEBACi0gICogQ2FyZWZ1bC4uIFRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIElCTS1kZXNpZ25lZCBJUlExMyBiZWhhdmlvdXIuCi0gICogRG9uJ3QgdG91Y2ggdW5sZXNzIHlvdSAqcmVhbGx5KiBrbm93IGhvdyBpdCB3b3Jrcy4KLSAgKi8KLS1leHRlcm4gIkMiIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHZvaWQpCi0rYXNtbGlua2FnZSB2b2lkIG1hdGhfc3RhdGVfcmVzdG9yZSh2b2lkKQotIHsKLSAJX19hc21fXyBfX3ZvbGF0aWxlX18oImNsdHMiKTsKLSAJaWYgKGxhc3RfdGFza191c2VkX21hdGggPT0gY3VycmVudCkKLUBAIC0xMTUsNyArMTE1LDcgQEAKLSAgKiBUaGUgImNvbmZ1c2VfZ2NjIiBnb3RvIGlzIHVzZWQgb25seSB0byBnZXQgYmV0dGVyIGFzc2VtYmx5IGNvZGUuLgotICAqIERqaWtzdHJhIHByb2JhYmx5IGhhdGVzIG1lLgotICAqLwotLWV4dGVybiAiQyIgdm9pZCBzY2hlZHVsZSh2b2lkKQotK2FzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZSh2b2lkKQotIHsKLSAJaW50IGM7Ci0gCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHA7Ci1AQCAtMTYwLDcgKzE2MCw3IEBACi0gCXN3aXRjaF90byhuZXh0KTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3BhdXNlKHZvaWQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3BhdXNlKHZvaWQpCi0gewotIAljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLSAJc2NoZWR1bGUoKTsKLUBAIC00MjEsNyArNDIxLDcgQEAKLSAJc3RpKCk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19hbGFybShsb25nIHNlY29uZHMpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2FsYXJtKGxvbmcgc2Vjb25kcykKLSB7Ci0gCXN0cnVjdCBpdGltZXJ2YWwgaXRfbmV3LCBpdF9vbGQ7Ci0gCi1AQCAtNDMyLDM3ICs0MzIsMzcgQEAKLSAJcmV0dXJuKGl0X29sZC5pdF92YWx1ZS50dl9zZWMgKyAoaXRfb2xkLml0X3ZhbHVlLnR2X3VzZWMgLyAxMDAwMDAwKSk7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19nZXRwaWQodm9pZCkKLSthc21saW5rYWdlIGludCBzeXNfZ2V0cGlkKHZvaWQpCi0gewotIAlyZXR1cm4gY3VycmVudC0+cGlkOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZ2V0cHBpZCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXRwcGlkKHZvaWQpCi0gewotIAlyZXR1cm4gY3VycmVudC0+cF9wcHRyLT5waWQ7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19nZXR1aWQodm9pZCkKLSthc21saW5rYWdlIGludCBzeXNfZ2V0dWlkKHZvaWQpCi0gewotIAlyZXR1cm4gY3VycmVudC0+dWlkOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZ2V0ZXVpZCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXRldWlkKHZvaWQpCi0gewotIAlyZXR1cm4gY3VycmVudC0+ZXVpZDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2dldGdpZCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXRnaWQodm9pZCkKLSB7Ci0gCXJldHVybiBjdXJyZW50LT5naWQ7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19nZXRlZ2lkKHZvaWQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2dldGVnaWQodm9pZCkKLSB7Ci0gCXJldHVybiBjdXJyZW50LT5lZ2lkOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfbmljZShsb25nIGluY3JlbWVudCkKLSthc21saW5rYWdlIGludCBzeXNfbmljZShsb25nIGluY3JlbWVudCkKLSB7Ci0gCWludCBuZXdwcmlvOwotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgva2VybmVsL3NpZ25hbC5jIGxpbnV4L2tlcm5lbC9zaWduYWwuYwotLS0tIHBsMTIvbGludXgva2VybmVsL3NpZ25hbC5jCVN1biBBdWcgMTUgMTQ6Mjg6MTQgMTk5MwotKysrIGxpbnV4L2tlcm5lbC9zaWduYWwuYwlTYXQgU2VwICA0IDAyOjQ0OjU3IDE5OTMKLUBAIC0yMCwxNCArMjAsMzkgQEAKLSAKLSBleHRlcm4gaW50IGNvcmVfZHVtcChsb25nIHNpZ25yLHN0cnVjdCBwdF9yZWdzICogcmVncyk7Ci0gCi0tZXh0ZXJuICJDIiBpbnQgZG9fc2lnbmFsKHVuc2lnbmVkIGxvbmcgb2xkbWFzaywgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKLSthc21saW5rYWdlIGludCBkb19zaWduYWwodW5zaWduZWQgbG9uZyBvbGRtYXNrLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwotIAotLWV4dGVybiAiQyIgaW50IHN5c19zZ2V0bWFzayh2b2lkKQotK3N0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCB7Ci0rCXVuc2lnbmVkIHNob3J0IGdzLCBfX2dzaDsKLSsJdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOwotKwl1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7Ci0rCXVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKLSsJdW5zaWduZWQgbG9uZyBlZGk7Ci0rCXVuc2lnbmVkIGxvbmcgZXNpOwotKwl1bnNpZ25lZCBsb25nIGVicDsKLSsJdW5zaWduZWQgbG9uZyBlc3A7Ci0rCXVuc2lnbmVkIGxvbmcgZWJ4OwotKwl1bnNpZ25lZCBsb25nIGVkeDsKLSsJdW5zaWduZWQgbG9uZyBlY3g7Ci0rCXVuc2lnbmVkIGxvbmcgZWF4OwotKwl1bnNpZ25lZCBsb25nIHRyYXBubzsKLSsJdW5zaWduZWQgbG9uZyBlcnI7Ci0rCXVuc2lnbmVkIGxvbmcgZWlwOwotKwl1bnNpZ25lZCBzaG9ydCBjcywgX19jc2g7Ci0rCXVuc2lnbmVkIGxvbmcgZWZsYWdzOwotKwl1bnNpZ25lZCBsb25nIGVzcF9hdF9zaWduYWw7Ci0rCXVuc2lnbmVkIHNob3J0IHNzLCBfX3NzaDsKLSsJdW5zaWduZWQgbG9uZyBpMzg3OwotKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7Ci0rCXVuc2lnbmVkIGxvbmcgY3IyOwotK307Ci0rCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NnZXRtYXNrKHZvaWQpCi0gewotIAlyZXR1cm4gY3VycmVudC0+YmxvY2tlZDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NzZXRtYXNrKGludCBuZXdtYXNrKQotK2FzbWxpbmthZ2UgaW50IHN5c19zc2V0bWFzayhpbnQgbmV3bWFzaykKLSB7Ci0gCWludCBvbGQ9Y3VycmVudC0+YmxvY2tlZDsKLSAKLUBAIC0zNSw3ICs2MCw3IEBACi0gCXJldHVybiBvbGQ7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19zaWdwZW5kaW5nKHNpZ3NldF90ICpzZXQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3BlbmRpbmcoc2lnc2V0X3QgKnNldCkKLSB7Ci0gCWludCBlcnJvcjsKLSAJLyogZmlsbCBpbiAic2V0IiB3aXRoIHNpZ25hbHMgcGVuZGluZyBidXQgYmxvY2tlZC4gKi8KLUBAIC00OCw3ICs3Myw3IEBACi0gLyoKLSAgKiBhdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19zaWdzdXNwZW5kKGludCByZXN0YXJ0LCB1bnNpZ25lZCBsb25nIG9sZG1hc2ssIHVuc2lnbmVkIGxvbmcgc2V0KQotK2FzbWxpbmthZ2UgaW50IHN5c19zaWdzdXNwZW5kKGludCByZXN0YXJ0LCB1bnNpZ25lZCBsb25nIG9sZG1hc2ssIHVuc2lnbmVkIGxvbmcgc2V0KQotIHsKLSAJdW5zaWduZWQgbG9uZyBtYXNrOwotIAlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJnJlc3RhcnQ7Ci1AQCAtOTgsNyArMTIzLDcgQEAKLSAJfQkKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NpZ25hbChpbnQgc2lnbnVtLCB1bnNpZ25lZCBsb25nIGhhbmRsZXIpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NpZ25hbChpbnQgc2lnbnVtLCB1bnNpZ25lZCBsb25nIGhhbmRsZXIpCi0gewotIAlzdHJ1Y3Qgc2lnYWN0aW9uIHRtcDsKLSAKLUBAIC0xMTYsNyArMTQxLDcgQEAKLSAJcmV0dXJuIGhhbmRsZXI7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19zaWdhY3Rpb24oaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdGlvbiwKLSthc21saW5rYWdlIGludCBzeXNfc2lnYWN0aW9uKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiBhY3Rpb24sCi0gCXN0cnVjdCBzaWdhY3Rpb24gKiBvbGRhY3Rpb24pCi0gewotIAlzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19zYSwgKnA7Ci1AQCAtMTQ2LDIwICsxNzEsMzcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c193YWl0cGlkKHBpZF90IHBpZCx1bnNpZ25lZCBsb25nICogc3RhdF9hZGRyLCBpbnQgb3B0aW9ucyk7Ci0rYXNtbGlua2FnZSBpbnQgc3lzX3dhaXRwaWQocGlkX3QgcGlkLHVuc2lnbmVkIGxvbmcgKiBzdGF0X2FkZHIsIGludCBvcHRpb25zKTsKLSAKLSAvKgotICAqIFRoaXMgc2V0cyByZWdzLT5lc3AgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHNpZ3N0YWNrcyB5ZXQuLgotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19zaWdyZXR1cm4odW5zaWduZWQgbG9uZyBvbGRtYXNrLCB1bnNpZ25lZCBsb25nIGVpcCwgdW5zaWduZWQgbG9uZyBlc3ApCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3JldHVybih1bnNpZ25lZCBsb25nIF9fdW51c2VkKQotIHsKLSsjZGVmaW5lIENIRUNLX1NFRyh4KSBpZiAoeCkgeCB8PSAzCi0rI2RlZmluZSBDT1BZKHgpIHJlZ3MtPnggPSBjb250ZXh0LngKLSsJc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHQ7Ci0gCXN0cnVjdCBwdF9yZWdzICogcmVnczsKLSAKLS0JcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAmb2xkbWFzazsKLS0JY3VycmVudC0+YmxvY2tlZCA9IG9sZG1hc2sgJiBfQkxPQ0tBQkxFOwotLQlyZWdzLT5laXAgPSBlaXA7Ci0tCXJlZ3MtPmVzcCA9IGVzcDsKLS0JcmV0dXJuIDA7Ci0rCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJl9fdW51c2VkOwotKwltZW1jcHlfZnJvbWZzKCZjb250ZXh0LCh2b2lkICopIHJlZ3MtPmVzcCwgc2l6ZW9mKGNvbnRleHQpKTsKLSsJY3VycmVudC0+YmxvY2tlZCA9IGNvbnRleHQub2xkbWFzayAmIF9CTE9DS0FCTEU7Ci0rCUNIRUNLX1NFRyhjb250ZXh0LnNzKTsKLSsJQ0hFQ0tfU0VHKGNvbnRleHQuY3MpOwotKwlDSEVDS19TRUcoY29udGV4dC5kcyk7Ci0rCUNIRUNLX1NFRyhjb250ZXh0LmVzKTsKLSsJQ0hFQ0tfU0VHKGNvbnRleHQuZnMpOwotKwlDSEVDS19TRUcoY29udGV4dC5ncyk7Ci0rCUNPUFkoZWlwKTsgQ09QWShlZmxhZ3MpOwotKwlDT1BZKGVjeCk7IENPUFkoZWR4KTsKLSsJQ09QWShlYngpOwotKwlDT1BZKGVzcCk7IENPUFkoZWJwKTsKLSsJQ09QWShlZGkpOyBDT1BZKGVzaSk7Ci0rCUNPUFkoY3MpOyBDT1BZKHNzKTsKLSsJQ09QWShkcyk7IENPUFkoZXMpOwotKwlDT1BZKGZzKTsgQ09QWShncyk7Ci0rCXJlZ3MtPm9yaWdfZWF4ID0gLTE7CQkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCi0rCXJldHVybiBjb250ZXh0LmVheDsKLSB9Ci0gCi0gLyoKLUBAIC0xNjYsMTUgKzIwOCwxNyBAQAotICAqIFNldCB1cCBhIHNpZ25hbCBmcmFtZS4uLiBNYWtlIHRoZSBzdGFjayBsb29rIHRoZSB3YXkgaUJDUzIgZXhwZWN0cwotICAqIGl0IHRvIGxvb2suCi0gICovCi0tc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUodW5zaWduZWQgbG9uZyAqKiBmcCwgdW5zaWduZWQgbG9uZyBlaXAsCi0tCXN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IHNpZ25yLAotLQl1bnNpZ25lZCBsb25nIHNhX2hhbmRsZXIsIHVuc2lnbmVkIGxvbmcgb2xkbWFzaykKLStzdGF0aWMgdm9pZCBzZXR1cF9mcmFtZShzdHJ1Y3Qgc2lnYWN0aW9uICogc2EsIHVuc2lnbmVkIGxvbmcgKiogZnAsIHVuc2lnbmVkIGxvbmcgZWlwLAotKwlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGludCBzaWduciwgdW5zaWduZWQgbG9uZyBvbGRtYXNrKQotIHsKLSAJdW5zaWduZWQgbG9uZyAqIGZyYW1lOwotIAotICNkZWZpbmUgX19DT0RFICgodW5zaWduZWQgbG9uZykoZnJhbWUrMjQpKQotICNkZWZpbmUgQ09ERSh4KSAoKHVuc2lnbmVkIGxvbmcgKikgKCh4KStfX0NPREUpKQotLQlmcmFtZSA9ICpmcCAtIDMyOwotKwlmcmFtZSA9ICpmcDsKLSsJaWYgKHJlZ3MtPnNzICE9IFVTRVJfRFMpCi0rCQlmcmFtZSA9ICh1bnNpZ25lZCBsb25nICopIHNhLT5zYV9yZXN0b3JlcjsKLSsJZnJhbWUgLT0gMzI7Ci0gCXZlcmlmeV9hcmVhKFZFUklGWV9XUklURSxmcmFtZSwzMio0KTsKLSAvKiBzZXQgdXAgdGhlICJub3JtYWwiIHN0YWNrIHNlZW4gYnkgdGhlIHNpZ25hbCBoYW5kbGVyIChpQkNTMikgKi8KLSAJcHV0X2ZzX2xvbmcoX19DT0RFLGZyYW1lKTsKLUBAIC0xODYsMzIgKzIzMCwyNiBAQAotIAlwdXRfZnNfbG9uZyhyZWdzLT5lZGksIGZyYW1lKzYpOwotIAlwdXRfZnNfbG9uZyhyZWdzLT5lc2ksIGZyYW1lKzcpOwotIAlwdXRfZnNfbG9uZyhyZWdzLT5lYnAsIGZyYW1lKzgpOwotLQlwdXRfZnNfbG9uZyhyZWdzLT5lc3AsIGZyYW1lKzkpOwotKwlwdXRfZnNfbG9uZygobG9uZykqZnAsIGZyYW1lKzkpOwotIAlwdXRfZnNfbG9uZyhyZWdzLT5lYngsIGZyYW1lKzEwKTsKLSAJcHV0X2ZzX2xvbmcocmVncy0+ZWR4LCBmcmFtZSsxMSk7Ci0gCXB1dF9mc19sb25nKHJlZ3MtPmVjeCwgZnJhbWUrMTIpOwotIAlwdXRfZnNfbG9uZyhyZWdzLT5lYXgsIGZyYW1lKzEzKTsKLS0JcHV0X2ZzX2xvbmcoMCwgZnJhbWUrMTQpOwkJLyogdHJhcG5vICovCi0tCXB1dF9mc19sb25nKDAsIGZyYW1lKzE1KTsJCS8qIGVyciAqLwotLQlwdXRfZnNfbG9uZyhyZWdzLT5laXAsIGZyYW1lKzE2KTsKLSsJcHV0X2ZzX2xvbmcoMCwgZnJhbWUrMTQpOwkJLyogdHJhcG5vIC0gbm90IGltcGxlbWVudGVkICovCi0rCXB1dF9mc19sb25nKDAsIGZyYW1lKzE1KTsJCS8qIGVyciAtIG5vdCBpbXBsZW1lbnRlZCAqLwotKwlwdXRfZnNfbG9uZyhlaXAsIGZyYW1lKzE2KTsKLSAJcHV0X2ZzX2xvbmcocmVncy0+Y3MsIGZyYW1lKzE3KTsKLSAJcHV0X2ZzX2xvbmcocmVncy0+ZWZsYWdzLCBmcmFtZSsxOCk7Ci0gCXB1dF9mc19sb25nKHJlZ3MtPmVzcCwgZnJhbWUrMTkpOwotIAlwdXRfZnNfbG9uZyhyZWdzLT5zcywgZnJhbWUrMjApOwotLQlwdXRfZnNfbG9uZygwLGZyYW1lKzIxKTsJCS8qIDM4NyBzdGF0ZSBwb2ludGVyICovCi0tLyogbGludXggZXh0ZW5kZWQgc3RhY2sgLSBlYXNpZXIgdG8gaGFuZGxlLi4gKi8KLS0JcHV0X2ZzX2xvbmcocmVncy0+ZWZsYWdzLCBmcmFtZSsyMik7Ci0tCXB1dF9mc19sb25nKGVpcCwgZnJhbWUrMjMpOwotKwlwdXRfZnNfbG9uZygwLGZyYW1lKzIxKTsJCS8qIDM4NyBzdGF0ZSBwb2ludGVyIC0gbm90IGltcGxlbWVudGVkKi8KLSsvKiBub24taUJDUzIgZXh0ZW5zaW9ucy4uICovCi0rCXB1dF9mc19sb25nKG9sZG1hc2ssIGZyYW1lKzIyKTsKLSsJcHV0X2ZzX2xvbmcoMCwgZnJhbWUrMjMpOwkJLyogY3IyIC0gbm90IGltcGxlbWVudGVkICovCi0gLyogc2V0IHVwIHRoZSByZXR1cm4gY29kZS4uLiAqLwotIAlwdXRfZnNfbG9uZygweDAwMDBiODU4LCBDT0RFKDApKTsJLyogcG9wbCAlZWF4IDsgbW92bCAkLCVlYXggKi8KLS0JcHV0X2ZzX2xvbmcoMHgwMGJiMDAwMCwgQ09ERSg0KSk7CS8qIG1vdmwgJCwlZWJ4ICovCi0tCXB1dF9mc19sb25nKDB4Y2QwMDAwMDAsIENPREUoOCkpOwkvKiBpbnQgJDB4ODAgKi8KLS0JcHV0X2ZzX2xvbmcoMHgwZmE5MGY4MCwgQ09ERSgxMikpOwkvKiBwb3AgJWdzIDsgcG9wICVmcyAqLwotLQlwdXRfZnNfbG9uZygweDYxMWYwN2ExLCBDT0RFKDE2KSk7CS8qIHBvcCAlZXMgOyBwb3AgJWRzIDsgcG9wYWQgKi8KLS0JcHV0X2ZzX2xvbmcoMHgyMGM0ODM5MCwgQ09ERSgyMCkpOwkvKiBub3AgOyBhZGRsICQzMiwlZXNwICovCi0tCXB1dF9mc19sb25nKDB4MDAyMGMyOWQsIENPREUoMjQpKTsJLyogcG9wZmwgOyByZXQgJDMyICovCi0tCXB1dF9mc19sb25nKF9fTlJfc3NldG1hc2ssIENPREUoMikpOwotLQlwdXRfZnNfbG9uZyhvbGRtYXNrLCBDT0RFKDcpKTsKLSsJcHV0X2ZzX2xvbmcoMHg4MGNkMDAwMCwgQ09ERSg0KSk7CS8qIGludCAkMHg4MCAqLwotKwlwdXRfZnNfbG9uZyhfX05SX3NpZ3JldHVybiwgQ09ERSgyKSk7Ci0gCSpmcCA9IGZyYW1lOwotICN1bmRlZiBfX0NPREUKLSAjdW5kZWYgQ09ERQotQEAgLTIyNiw3ICsyNjQsNyBAQAotICAqIHRoZSBrZXJuZWwgY2FuIGhhbmRsZSwgYW5kIHRoZW4gd2UgYnVpbGQgYWxsIHRoZSB1c2VyLWxldmVsIHNpZ25hbCBoYW5kbGluZwotICAqIHN0YWNrLWZyYW1lcyBpbiBvbmUgZ28gYWZ0ZXIgdGhhdC4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBkb19zaWduYWwodW5zaWduZWQgbG9uZyBvbGRtYXNrLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCi0rYXNtbGlua2FnZSBpbnQgZG9fc2lnbmFsKHVuc2lnbmVkIGxvbmcgb2xkbWFzaywgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotIHsKLSAJdW5zaWduZWQgbG9uZyBtYXNrID0gfmN1cnJlbnQtPmJsb2NrZWQ7Ci0gCXVuc2lnbmVkIGxvbmcgaGFuZGxlcl9zaWduYWwgPSAwOwotQEAgLTIzMyw3ICsyNzEsNiBAQAotIAl1bnNpZ25lZCBsb25nICpmcmFtZSA9IE5VTEw7Ci0gCXVuc2lnbmVkIGxvbmcgZWlwID0gMDsKLSAJdW5zaWduZWQgbG9uZyBzaWducjsKLS0JdW5zaWduZWQgbG9uZyBzYV9oYW5kbGVyOwotIAlzdHJ1Y3Qgc2lnYWN0aW9uICogc2E7Ci0gCi0gCXdoaWxlICgoc2lnbnIgPSBjdXJyZW50LT5zaWduYWwgJiBtYXNrKSkgewotQEAgLTMxNywyMCArMzU0LDIwIEBACi0gCWZyYW1lID0gKHVuc2lnbmVkIGxvbmcgKikgcmVncy0+ZXNwOwotIAlzaWduciA9IDE7Ci0gCXNhID0gY3VycmVudC0+c2lnYWN0aW9uOwotLQlpZiAocmVncy0+Y3MgIT0gVVNFUl9DUyB8fCByZWdzLT5zcyAhPSBVU0VSX0RTKQotLQkJcHJpbnRrKCJXYXJuaW5nOiBzaWduYWwgaGFuZGxlciB3aXRoIG5vbnN0YW5kYXJkIGNvZGUvc3RhY2sgc2VnbWVudFxuIik7Ci0gCWZvciAobWFzayA9IDEgOyBtYXNrIDsgc2ErKyxzaWducisrLG1hc2sgKz0gbWFzaykgewotIAkJaWYgKG1hc2sgPiBoYW5kbGVyX3NpZ25hbCkKLSAJCQlicmVhazsKLSAJCWlmICghKG1hc2sgJiBoYW5kbGVyX3NpZ25hbCkpCi0gCQkJY29udGludWU7Ci0tCQlzYV9oYW5kbGVyID0gKHVuc2lnbmVkIGxvbmcpIHNhLT5zYV9oYW5kbGVyOwotKwkJc2V0dXBfZnJhbWUoc2EsJmZyYW1lLGVpcCxyZWdzLHNpZ25yLG9sZG1hc2spOwotKwkJZWlwID0gKHVuc2lnbmVkIGxvbmcpIHNhLT5zYV9oYW5kbGVyOwotIAkJaWYgKHNhLT5zYV9mbGFncyAmIFNBX09ORVNIT1QpCi0gCQkJc2EtPnNhX2hhbmRsZXIgPSBOVUxMOwotIC8qIGZvcmNlIGEgc3VwZXJ2aXNvci1tb2RlIHBhZ2UtaW4gb2YgdGhlIHNpZ25hbCBoYW5kbGVyIHRvIHJlZHVjZSByYWNlcyAqLwotLQkJX19hc21fXygidGVzdGIgJDAsJSVmczolMCI6IDoibSIgKCooY2hhciAqKSBzYV9oYW5kbGVyKSk7Ci0tCQlzZXR1cF9mcmFtZSgmZnJhbWUsZWlwLHJlZ3Msc2lnbnIsc2FfaGFuZGxlcixvbGRtYXNrKTsKLS0JCWVpcCA9IHNhX2hhbmRsZXI7Ci0rCQlfX2FzbV9fKCJ0ZXN0YiAkMCwlJWZzOiUwIjogOiJtIiAoKihjaGFyICopIGVpcCkpOwotKwkJcmVncy0+Y3MgPSBVU0VSX0NTOyByZWdzLT5zcyA9IFVTRVJfRFM7Ci0rCQlyZWdzLT5kcyA9IFVTRVJfRFM7IHJlZ3MtPmVzID0gVVNFUl9EUzsKLSsJCXJlZ3MtPmdzID0gVVNFUl9EUzsgcmVncy0+ZnMgPSBVU0VSX0RTOwotIAkJY3VycmVudC0+YmxvY2tlZCB8PSBzYS0+c2FfbWFzazsKLSAJCW9sZG1hc2sgfD0gc2EtPnNhX21hc2s7Ci0gCX0KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC9zeXMuYyBsaW51eC9rZXJuZWwvc3lzLmMKLS0tLSBwbDEyL2xpbnV4L2tlcm5lbC9zeXMuYwlNb24gQXVnICA5IDE4OjAyOjMyIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvc3lzLmMJU2F0IFNlcCAgNCAwMjo0NDo0NSAxOTkzCi1AQCAtNTYsNyArNTYsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldHByaW9yaXR5KGludCB3aGljaCwgaW50IHdobywgaW50IG5pY2V2YWwpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NldHByaW9yaXR5KGludCB3aGljaCwgaW50IHdobywgaW50IG5pY2V2YWwpCi0gewotIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKipwOwotIAlpbnQgZXJyb3IgPSBFU1JDSDsKLUBAIC04Niw3ICs4Niw3IEBACi0gCXJldHVybiAtZXJyb3I7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19nZXRwcmlvcml0eShpbnQgd2hpY2gsIGludCB3aG8pCi0rYXNtbGlua2FnZSBpbnQgc3lzX2dldHByaW9yaXR5KGludCB3aGljaCwgaW50IHdobykKLSB7Ci0gCXN0cnVjdCB0YXNrX3N0cnVjdCAqKnA7Ci0gCWludCBtYXhfcHJpbyA9IDA7Ci1AQCAtMTAzLDM3ICsxMDMsMzcgQEAKLSAJcmV0dXJuKG1heF9wcmlvID8gbWF4X3ByaW8gOiAtRVNSQ0gpOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfcHJvZmlsKHZvaWQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3Byb2ZpbCh2b2lkKQotIHsKLSAJcmV0dXJuIC1FTk9TWVM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19mdGltZSh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19mdGltZSh2b2lkKQotIHsKLSAJcmV0dXJuIC1FTk9TWVM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19icmVhayh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19icmVhayh2b2lkKQotIHsKLSAJcmV0dXJuIC1FTk9TWVM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19zdHR5KHZvaWQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3N0dHkodm9pZCkKLSB7Ci0gCXJldHVybiAtRU5PU1lTOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZ3R0eSh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19ndHR5KHZvaWQpCi0gewotIAlyZXR1cm4gLUVOT1NZUzsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3Byb2Yodm9pZCkKLSthc21saW5rYWdlIGludCBzeXNfcHJvZih2b2lkKQotIHsKLSAJcmV0dXJuIC1FTk9TWVM7Ci0gfQotIAotLWV4dGVybiAiQyIgdW5zaWduZWQgbG9uZyBzYXZlX3Y4Nl9zdGF0ZShzdHJ1Y3Qgdm04Nl9yZWdzICogcmVncykKLSthc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc2F2ZV92ODZfc3RhdGUoc3RydWN0IHZtODZfcmVncyAqIHJlZ3MpCi0gewotIAl1bnNpZ25lZCBsb25nIHN0YWNrOwotIAotQEAgLTE2OSw3ICsxNjksNyBAQAotIAl9Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c192bTg2KHN0cnVjdCB2bTg2X3N0cnVjdCAqIHY4NikKLSthc21saW5rYWdlIGludCBzeXNfdm04NihzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKiB2ODYpCi0gewotIAlzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgaW5mbzsKLSAJc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZ2ODY7Ci1AQCAtMjE2LDcgKzIxNiw3IEBACi0gICoKLSAgKiByZWJvb3QgZG9lc24ndCBzeW5jOiBkbyB0aGF0IHlvdXJzZWxmIGJlZm9yZSBjYWxsaW5nIHRoaXMuCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3JlYm9vdChpbnQgbWFnaWMsIGludCBtYWdpY190b28sIGludCBmbGFnKQotK2FzbWxpbmthZ2UgaW50IHN5c19yZWJvb3QoaW50IG1hZ2ljLCBpbnQgbWFnaWNfdG9vLCBpbnQgZmxhZykKLSB7Ci0gCWlmICghc3VzZXIoKSkKLSAJCXJldHVybiAtRVBFUk07Ci1AQCAtMjU4LDcgKzI1OCw3IEBACi0gICogMTAwJSBjb21wYXRpYmxlIHdpdGggQlNELiAgQSBwcm9ncmFtIHdoaWNoIHVzZXMganVzdCBzZXRnaWQoKSB3aWxsIGJlCi0gICogMTAwJSBjb21wYXRpYmxlIHdpdGggUE9TSVggdy8gU2F2ZWQgSUQncy4gCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldHJlZ2lkKGdpZF90IHJnaWQsIGdpZF90IGVnaWQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NldHJlZ2lkKGdpZF90IHJnaWQsIGdpZF90IGVnaWQpCi0gewotIAlpbnQgb2xkX3JnaWQgPSBjdXJyZW50LT5naWQ7Ci0gCi1AQCAtMjg3LDcgKzI4Nyw3IEBACi0gLyoKLSAgKiBzZXRnaWQoKSBpcyBpbXBsZW1lbmV0ZWQgbGlrZSBTeXNWIHcvIFNBVkVEX0lEUyAKLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfc2V0Z2lkKGdpZF90IGdpZCkKLSthc21saW5rYWdlIGludCBzeXNfc2V0Z2lkKGdpZF90IGdpZCkKLSB7Ci0gCWlmIChzdXNlcigpKQotIAkJY3VycmVudC0+Z2lkID0gY3VycmVudC0+ZWdpZCA9IGN1cnJlbnQtPnNnaWQgPSBnaWQ7Ci1AQCAtMjk4LDM3ICsyOTgsMzcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19hY2N0KHZvaWQpCi0rYXNtbGlua2FnZSBpbnQgc3lzX2FjY3Qodm9pZCkKLSB7Ci0gCXJldHVybiAtRU5PU1lTOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfcGh5cyh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19waHlzKHZvaWQpCi0gewotIAlyZXR1cm4gLUVOT1NZUzsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2xvY2sodm9pZCkKLSthc21saW5rYWdlIGludCBzeXNfbG9jayh2b2lkKQotIHsKLSAJcmV0dXJuIC1FTk9TWVM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19tcHgodm9pZCkKLSthc21saW5rYWdlIGludCBzeXNfbXB4KHZvaWQpCi0gewotIAlyZXR1cm4gLUVOT1NZUzsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3VsaW1pdCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c191bGltaXQodm9pZCkKLSB7Ci0gCXJldHVybiAtRU5PU1lTOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfb2xkX3N5c2NhbGwodm9pZCkKLSthc21saW5rYWdlIGludCBzeXNfb2xkX3N5c2NhbGwodm9pZCkKLSB7Ci0gCXJldHVybiAtRU5PU1lTOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfdGltZShsb25nICogdGxvYykKLSthc21saW5rYWdlIGludCBzeXNfdGltZShsb25nICogdGxvYykKLSB7Ci0gCWludCBpLCBlcnJvcjsKLSAKLUBAIC0zNTUsNyArMzU1LDcgQEAKLSAgKiAxMDAlIGNvbXBhdGlibGUgd2l0aCBCU0QuICBBIHByb2dyYW0gd2hpY2ggdXNlcyBqdXN0IHNldHVpZCgpIHdpbGwgYmUKLSAgKiAxMDAlIGNvbXBhdGlibGUgd2l0aCBQT1NJWCB3LyBTYXZlZCBJRCdzLiAKLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfc2V0cmV1aWQodWlkX3QgcnVpZCwgdWlkX3QgZXVpZCkKLSthc21saW5rYWdlIGludCBzeXNfc2V0cmV1aWQodWlkX3QgcnVpZCwgdWlkX3QgZXVpZCkKLSB7Ci0gCWludCBvbGRfcnVpZCA9IGN1cnJlbnQtPnVpZDsKLSAJCi1AQCAtMzkyLDcgKzM5Miw3IEBACi0gICogd2lsbCBhbGxvdyBhIHJvb3QgcHJvZ3JhbSB0byB0ZW1wb3JhcmlseSBkcm9wIHByaXZpbGVnZXMgYW5kIGJlIGFibGUgdG8KLSAgKiByZWdhaW4gdGhlbSBieSBzd2FwcGluZyB0aGUgcmVhbCBhbmQgZWZmZWN0aXZlIHVpZC4gIAotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19zZXR1aWQodWlkX3QgdWlkKQotK2FzbWxpbmthZ2UgaW50IHN5c19zZXR1aWQodWlkX3QgdWlkKQotIHsKLSAJaWYgKHN1c2VyKCkpCi0gCQljdXJyZW50LT51aWQgPSBjdXJyZW50LT5ldWlkID0gY3VycmVudC0+c3VpZCA9IHVpZDsKLUBAIC00MDMsNyArNDAzLDcgQEAKLSAJcmV0dXJuKDApOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfc3RpbWUobG9uZyAqIHRwdHIpCi0rYXNtbGlua2FnZSBpbnQgc3lzX3N0aW1lKGxvbmcgKiB0cHRyKQotIHsKLSAJaWYgKCFzdXNlcigpKQotIAkJcmV0dXJuIC1FUEVSTTsKLUBAIC00MTIsNyArNDEyLDcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c190aW1lcyhzdHJ1Y3QgdG1zICogdGJ1ZikKLSthc21saW5rYWdlIGludCBzeXNfdGltZXMoc3RydWN0IHRtcyAqIHRidWYpCi0gewotIAlpZiAodGJ1ZikgewotIAkJaW50IGVycm9yID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLHRidWYsc2l6ZW9mICp0YnVmKTsKLUBAIC00MjYsNyArNDI2LDcgQEAKLSAJcmV0dXJuIGppZmZpZXM7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19icmsodW5zaWduZWQgbG9uZyBicmspCi0rYXNtbGlua2FnZSBpbnQgc3lzX2Jyayh1bnNpZ25lZCBsb25nIGJyaykKLSB7Ci0gCWludCBmcmVlcGFnZXM7Ci0gCXVuc2lnbmVkIGxvbmcgcmxpbTsKLUBAIC00ODcsNyArNDg3LDcgQEAKLSAgKiBvbmx5IGltcG9ydGFudCBvbiBhIG11bHRpLXVzZXIgc3lzdGVtIGFueXdheSwgdG8gbWFrZSBzdXJlIG9uZSB1c2VyCi0gICogY2FuJ3Qgc2VuZCBhIHNpZ25hbCB0byBhIHByb2Nlc3Mgb3duZWQgYnkgYW5vdGhlci4gIC1UWVQsIDEyLzEyLzkxCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldHBnaWQocGlkX3QgcGlkLCBwaWRfdCBwZ2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19zZXRwZ2lkKHBpZF90IHBpZCwgcGlkX3QgcGdpZCkKLSB7Ci0gCWludCBpOyAKLSAKLUBAIC01MTMsMTIgKzUxMywxMiBAQAotIAlyZXR1cm4gLUVTUkNIOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZ2V0cGdycCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXRwZ3JwKHZvaWQpCi0gewotIAlyZXR1cm4gY3VycmVudC0+cGdycDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldHNpZCh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19zZXRzaWQodm9pZCkKLSB7Ci0gCWlmIChjdXJyZW50LT5sZWFkZXIgJiYgIXN1c2VyKCkpCi0gCQlyZXR1cm4gLUVQRVJNOwotQEAgLTUzMSw3ICs1MzEsNyBAQAotIC8qCi0gICogU3VwcGxlbWVudGFyeSBncm91cCBJRCdzCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2dldGdyb3VwcyhpbnQgZ2lkc2V0c2l6ZSwgZ2lkX3QgKmdyb3VwbGlzdCkKLSthc21saW5rYWdlIGludCBzeXNfZ2V0Z3JvdXBzKGludCBnaWRzZXRzaXplLCBnaWRfdCAqZ3JvdXBsaXN0KQotIHsKLSAJaW50IGk7Ci0gCi1AQCAtNTUxLDcgKzU1MSw3IEBACi0gCXJldHVybihpKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldGdyb3VwcyhpbnQgZ2lkc2V0c2l6ZSwgZ2lkX3QgKmdyb3VwbGlzdCkKLSthc21saW5rYWdlIGludCBzeXNfc2V0Z3JvdXBzKGludCBnaWRzZXRzaXplLCBnaWRfdCAqZ3JvdXBsaXN0KQotIHsKLSAJaW50CWk7Ci0gCi1AQCAtNTgzLDcgKzU4Myw3IEBACi0gCXJldHVybiAwOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfbmV3dW5hbWUoc3RydWN0IG5ld191dHNuYW1lICogbmFtZSkKLSthc21saW5rYWdlIGludCBzeXNfbmV3dW5hbWUoc3RydWN0IG5ld191dHNuYW1lICogbmFtZSkKLSB7Ci0gCWludCBlcnJvcjsKLSAKLUBAIC01OTUsNyArNTk1LDcgQEAKLSAJcmV0dXJuIGVycm9yOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lICogbmFtZSkKLSthc21saW5rYWdlIGludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lICogbmFtZSkKLSB7Ci0gCWludCBlcnJvcjsKLSAJaWYgKCFuYW1lKQotQEAgLTYxNiw3ICs2MTYsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX29sZHVuYW1lKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSAqIG5hbWUpCi0rYXNtbGlua2FnZSBpbnQgc3lzX29sZHVuYW1lKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSAqIG5hbWUpCi0gewotIAlpbnQgZXJyb3I7Ci0gCWlmICghbmFtZSkKLUBAIC02NDAsNyArNjQwLDcgQEAKLSAvKgotICAqIE9ubHkgc2V0aG9zdG5hbWU7IGdldGhvc3RuYW1lIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBjYWxsaW5nIHVuYW1lKCkKLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfc2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgaW50IGxlbikKLSthc21saW5rYWdlIGludCBzeXNfc2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgaW50IGxlbikKLSB7Ci0gCWludAlpOwotIAkKLUBAIC02NjAsNyArNjYwLDcgQEAKLSAgKiBPbmx5IHNldGRvbWFpbm5hbWU7IGdldGRvbWFpbm5hbWUgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGNhbGxpbmcKLSAgKiB1bmFtZSgpCi0gICovCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldGRvbWFpbm5hbWUoY2hhciAqbmFtZSwgaW50IGxlbikKLSthc21saW5rYWdlIGludCBzeXNfc2V0ZG9tYWlubmFtZShjaGFyICpuYW1lLCBpbnQgbGVuKQotIHsKLSAJaW50CWk7Ci0gCQotQEAgLTY3Niw3ICs2NzYsNyBAQAotIAlyZXR1cm4gMDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX2dldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKnJsaW0pCi0rYXNtbGlua2FnZSBpbnQgc3lzX2dldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKnJsaW0pCi0gewotIAlpbnQgZXJyb3I7Ci0gCi1AQCAtNjkyLDcgKzY5Miw3IEBACi0gCXJldHVybiAwOwkKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3NldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKnJsaW0pCi0rYXNtbGlua2FnZSBpbnQgc3lzX3NldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKnJsaW0pCi0gewotIAlzdHJ1Y3QgcmxpbWl0IG5ld19ybGltLCAqb2xkX3JsaW07Ci0gCi1AQCAtNzYxLDcgKzc2MSw3IEBACi0gCXJldHVybiAwOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfZ2V0cnVzYWdlKGludCB3aG8sIHN0cnVjdCBydXNhZ2UgKnJ1KQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXRydXNhZ2UoaW50IHdobywgc3RydWN0IHJ1c2FnZSAqcnUpCi0gewotIAlpZiAod2hvICE9IFJVU0FHRV9TRUxGICYmIHdobyAhPSBSVVNBR0VfQ0hJTERSRU4pCi0gCQlyZXR1cm4gLUVJTlZBTDsKLUBAIC04MDgsNyArODA4LDcgQEAKLSAjZW5kaWYgLyogbm90IF9faTM4Nl9fICovCi0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQotK2FzbWxpbmthZ2UgaW50IHN5c19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQotIHsKLSAJaW50IGVycm9yOwotIAotQEAgLTg0MCw3ICs4NDAsNyBAQAotICAqIHNvb24gYXMgcG9zc2libGUsIHNvIHRoYXQgdGhlIGNsb2NrIGNhbiBiZSBzZXQgcmlnaHQuICBPdGhlcndpc2UsCi0gICogdmFyaW91cyBwcm9ncmFtcyB3aWxsIGdldCBjb25mdXNlZCB3aGVuIHRoZSBjbG9jayBnZXRzIHdhcnBlZC4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKLSthc21saW5rYWdlIGludCBzeXNfc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKLSB7Ci0gCXN0YXRpYyBpbnQJZmlyc3R0aW1lID0gMTsKLSAKLUBAIC04ODgsNyArODg4LDcgQEAKLSAJc3RhcnR1cF90aW1lICs9IHN5c190ei50el9taW51dGVzd2VzdCo2MDsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX3VtYXNrKGludCBtYXNrKQotK2FzbWxpbmthZ2UgaW50IHN5c191bWFzayhpbnQgbWFzaykKLSB7Ci0gCWludCBvbGQgPSBjdXJyZW50LT51bWFzazsKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L2tlcm5lbC90cmFwcy5jIGxpbnV4L2tlcm5lbC90cmFwcy5jCi0tLS0gcGwxMi9saW51eC9rZXJuZWwvdHJhcHMuYwlXZWQgSnVsIDE0IDE2OjU3OjExIDE5OTMKLSsrKyBsaW51eC9rZXJuZWwvdHJhcHMuYwlTYXQgU2VwICA0IDAyOjQ0OjMxIDE5OTMKLUBAIC00MSwzMSArNDEsMzIgQEAKLSAKLSB2b2lkIHBhZ2VfZXhjZXB0aW9uKHZvaWQpOwotIAotLWV4dGVybiAiQyIgdm9pZCBkaXZpZGVfZXJyb3Iodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIGRlYnVnKHZvaWQpOwotLWV4dGVybiAiQyIgdm9pZCBubWkodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIGludDModm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIG92ZXJmbG93KHZvaWQpOwotLWV4dGVybiAiQyIgdm9pZCBib3VuZHModm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIGludmFsaWRfb3Aodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIGRldmljZV9ub3RfYXZhaWxhYmxlKHZvaWQpOwotLWV4dGVybiAiQyIgdm9pZCBkb3VibGVfZmF1bHQodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bih2b2lkKTsKLS1leHRlcm4gIkMiIHZvaWQgaW52YWxpZF9UU1Modm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIHNlZ21lbnRfbm90X3ByZXNlbnQodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIHN0YWNrX3NlZ21lbnQodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIGdlbmVyYWxfcHJvdGVjdGlvbih2b2lkKTsKLS1leHRlcm4gIkMiIHZvaWQgcGFnZV9mYXVsdCh2b2lkKTsKLS1leHRlcm4gIkMiIHZvaWQgY29wcm9jZXNzb3JfZXJyb3Iodm9pZCk7Ci0tZXh0ZXJuICJDIiB2b2lkIHJlc2VydmVkKHZvaWQpOwotLWV4dGVybiAiQyIgdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7Ci0rYXNtbGlua2FnZSB2b2lkIGRpdmlkZV9lcnJvcih2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgZGVidWcodm9pZCk7Ci0rYXNtbGlua2FnZSB2b2lkIG5taSh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgaW50Myh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgb3ZlcmZsb3codm9pZCk7Ci0rYXNtbGlua2FnZSB2b2lkIGJvdW5kcyh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgaW52YWxpZF9vcCh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgZGV2aWNlX25vdF9hdmFpbGFibGUodm9pZCk7Ci0rYXNtbGlua2FnZSB2b2lkIGRvdWJsZV9mYXVsdCh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKHZvaWQpOwotK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX1RTUyh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgc2VnbWVudF9ub3RfcHJlc2VudCh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgc3RhY2tfc2VnbWVudCh2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgZ2VuZXJhbF9wcm90ZWN0aW9uKHZvaWQpOwotK2FzbWxpbmthZ2Ugdm9pZCBwYWdlX2ZhdWx0KHZvaWQpOwotK2FzbWxpbmthZ2Ugdm9pZCBjb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKLSthc21saW5rYWdlIHZvaWQgcmVzZXJ2ZWQodm9pZCk7Ci0rYXNtbGlua2FnZSB2b2lkIGFsaWdubWVudF9jaGVjayh2b2lkKTsKLSAKLSAvKnN0YXRpYyovIHZvaWQgZGllX2lmX2tlcm5lbChjaGFyICogc3RyLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyKQotIHsKLSAJaW50IGk7Ci0gCi0tCWlmICgocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgfHwgKCgweGZmZmYgJiByZWdzLT5jcykgPT0gVVNFUl9DUykpCi0rCWlmICgocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgfHwgKDMgJiByZWdzLT5jcykgPT0gMykKLSAJCXJldHVybjsKLSsKLSAJcHJpbnRrKCIlczogJTA0eFxuIiwgc3RyLCBlcnIgJiAweGZmZmYpOwotIAlwcmludGsoIkVJUDogICAgJTA0eDolcFxuRUZMQUdTOiAlcFxuIiwgMHhmZmZmICYgcmVncy0+Y3MscmVncy0+ZWlwLHJlZ3MtPmVmbGFncyk7Ci0gCXByaW50aygiZWF4OiAlMDh4ICAgZWJ4OiAlMDh4ICAgZWN4OiAlMDh4ICAgZWR4OiAlMDh4XG4iLAotQEAgLTgyLDMxICs4MywzMSBAQAotIAlkb19leGl0KFNJR1NFR1YpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fZG91YmxlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19kb3VibGVfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAxKTsKLSAJZGllX2lmX2tlcm5lbCgiZG91YmxlIGZhdWx0IixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAxKTsKLSAJZGllX2lmX2tlcm5lbCgiZ2VuZXJhbCBwcm90ZWN0aW9uIixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fYWxpZ25tZW50X2NoZWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19hbGlnbm1lbnRfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAxKTsKLSAJZGllX2lmX2tlcm5lbCgiYWxpZ25tZW50IGNoZWNrIixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fZGl2aWRlX2Vycm9yKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19kaXZpZGVfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlzZW5kX3NpZyhTSUdGUEUsIGN1cnJlbnQsIDEpOwotIAlkaWVfaWZfa2VybmVsKCJkaXZpZGUgZXJyb3IiLHJlZ3MsZXJyb3JfY29kZSk7Ci0gfQotIAotLWV4dGVybiAiQyIgdm9pZCBkb19pbnQzKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19pbnQzKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotIHsKLSAJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUFRSQUNFRCkKLSAJCWN1cnJlbnQtPmJsb2NrZWQgJj0gfigxIDw8IChTSUdUUkFQLTEpKTsKLUBAIC0xMTQsMTIgKzExNSwxMiBAQAotIAlkaWVfaWZfa2VybmVsKCJpbnQzIixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fbm1pKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19ubWkoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlwcmludGsoIlVoaHVoLiBOTUkgcmVjZWl2ZWQuIERhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7Ci0gfQotIAotLWV4dGVybiAiQyIgdm9pZCBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSthc21saW5rYWdlIHZvaWQgZG9fZGVidWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9QVFJBQ0VEKQotIAkJY3VycmVudC0+YmxvY2tlZCAmPSB+KDEgPDwgKFNJR1RSQVAtMSkpOwotQEAgLTEyNyw0OSArMTI4LDQ5IEBACi0gCWRpZV9pZl9rZXJuZWwoImRlYnVnIixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fb3ZlcmZsb3coc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0rYXNtbGlua2FnZSB2b2lkIGRvX292ZXJmbG93KHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotIHsKLSAJc2VuZF9zaWcoU0lHU0VHViwgY3VycmVudCwgMSk7Ci0gCWRpZV9pZl9rZXJuZWwoIm92ZXJmbG93IixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9fYm91bmRzKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19ib3VuZHMoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCi0gewotIAlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAxKTsKLSAJZGllX2lmX2tlcm5lbCgiYm91bmRzIixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9faW52YWxpZF9vcChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSthc21saW5rYWdlIHZvaWQgZG9faW52YWxpZF9vcChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSB7Ci0gCXNlbmRfc2lnKFNJR0lMTCwgY3VycmVudCwgMSk7Ci0gCWRpZV9pZl9rZXJuZWwoImludmFsaWQgb3BlcmFuZCIscmVncyxlcnJvcl9jb2RlKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIGRvX2RldmljZV9ub3RfYXZhaWxhYmxlKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19kZXZpY2Vfbm90X2F2YWlsYWJsZShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSB7Ci0gCXNlbmRfc2lnKFNJR1NFR1YsIGN1cnJlbnQsIDEpOwotIAlkaWVfaWZfa2VybmVsKCJkZXZpY2Ugbm90IGF2YWlsYWJsZSIscmVncyxlcnJvcl9jb2RlKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIGRvX2NvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSthc21saW5rYWdlIHZvaWQgZG9fY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotIHsKLSAJc2VuZF9zaWcoU0lHRlBFLCBsYXN0X3Rhc2tfdXNlZF9tYXRoLCAxKTsKLSAJZGllX2lmX2tlcm5lbCgiY29wcm9jZXNzb3Igc2VnbWVudCBvdmVycnVuIixyZWdzLGVycm9yX2NvZGUpOwotIH0KLSAKLS1leHRlcm4gIkMiIHZvaWQgZG9faW52YWxpZF9UU1Moc3RydWN0IHB0X3JlZ3MgKiByZWdzLGxvbmcgZXJyb3JfY29kZSkKLSthc21saW5rYWdlIHZvaWQgZG9faW52YWxpZF9UU1Moc3RydWN0IHB0X3JlZ3MgKiByZWdzLGxvbmcgZXJyb3JfY29kZSkKLSB7Ci0gCXNlbmRfc2lnKFNJR1NFR1YsIGN1cnJlbnQsIDEpOwotIAlkaWVfaWZfa2VybmVsKCJpbnZhbGlkIFRTUyIscmVncyxlcnJvcl9jb2RlKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIGRvX3NlZ21lbnRfbm90X3ByZXNlbnQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLGxvbmcgZXJyb3JfY29kZSkKLSthc21saW5rYWdlIHZvaWQgZG9fc2VnbWVudF9ub3RfcHJlc2VudChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsbG9uZyBlcnJvcl9jb2RlKQotIHsKLSAJc2VuZF9zaWcoU0lHU0VHViwgY3VycmVudCwgMSk7Ci0gCWRpZV9pZl9rZXJuZWwoInNlZ21lbnQgbm90IHByZXNlbnQiLHJlZ3MsZXJyb3JfY29kZSk7Ci0gfQotIAotLWV4dGVybiAiQyIgdm9pZCBkb19zdGFja19zZWdtZW50KHN0cnVjdCBwdF9yZWdzICogcmVncyxsb25nIGVycm9yX2NvZGUpCi0rYXNtbGlua2FnZSB2b2lkIGRvX3N0YWNrX3NlZ21lbnQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLGxvbmcgZXJyb3JfY29kZSkKLSB7Ci0gCXNlbmRfc2lnKFNJR1NFR1YsIGN1cnJlbnQsIDEpOwotIAlkaWVfaWZfa2VybmVsKCJzdGFjayBzZWdtZW50IixyZWdzLGVycm9yX2NvZGUpOwotQEAgLTIxMCwxMyArMjExLDEzIEBACi0gCWVudi0+dHdkID0gMHhmZmZmZmZmZjsKLSB9Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIGRvX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSB7Ci0gCWlnbm9yZV9pcnExMyA9IDE7Ci0gCW1hdGhfZXJyb3IoKTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiB2b2lkIGRvX3Jlc2VydmVkKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotK2FzbWxpbmthZ2Ugdm9pZCBkb19yZXNlcnZlZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLSB7Ci0gCXNlbmRfc2lnKFNJR1NFR1YsIGN1cnJlbnQsIDEpOwotIAlkaWVfaWZfa2VybmVsKCJyZXNlcnZlZCAoMTUsMTctNDcpIGVycm9yIixyZWdzLGVycm9yX2NvZGUpOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbW0vbWVtb3J5LmMgbGludXgvbW0vbWVtb3J5LmMKLS0tLSBwbDEyL2xpbnV4L21tL21lbW9yeS5jCVN1biBBdWcgMTUgMTE6MDk6MTggMTk5MwotKysrIGxpbnV4L21tL21lbW9yeS5jCVNhdCBTZXAgIDQgMDM6MzQ6MjIgMTk5MwotQEAgLTI3OCw3ICsyNzgsNyBAQAotIAl9Ci0gCXNpemUgPSAoc2l6ZSArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0gCWRpciA9IFBBR0VfRElSX09GRlNFVChjdXJyZW50LT50c3MuY3IzLGZyb20pOwotLQlwb2ZmID0gKGZyb20gPj4gUEFHRV9TSElGVCkgJiBQVFJTX1BFUl9QQUdFLTE7Ci0rCXBvZmYgPSAoZnJvbSA+PiBQQUdFX1NISUZUKSAmIChQVFJTX1BFUl9QQUdFLTEpOwotIAlpZiAoKHBjbnQgPSBQVFJTX1BFUl9QQUdFIC0gcG9mZikgPiBzaXplKQotIAkJcGNudCA9IHNpemU7Ci0gCi1AQCAtMzM3LDcgKzMzNyw3IEBACi0gCX0KLSAJZGlyID0gUEFHRV9ESVJfT0ZGU0VUKGN1cnJlbnQtPnRzcy5jcjMsZnJvbSk7Ci0gCXNpemUgPSAoc2l6ZSArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0tCXBvZmYgPSAoZnJvbSA+PiBQQUdFX1NISUZUKSAmIFBUUlNfUEVSX1BBR0UtMTsKLSsJcG9mZiA9IChmcm9tID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BBR0UtMSk7Ci0gCWlmICgocGNudCA9IFBUUlNfUEVSX1BBR0UgLSBwb2ZmKSA+IHNpemUpCi0gCQlwY250ID0gc2l6ZTsKLSAKLUBAIC0zOTksNyArMzk5LDcgQEAKLSAJfQotIAlkaXIgPSBQQUdFX0RJUl9PRkZTRVQoY3VycmVudC0+dHNzLmNyMyxmcm9tKTsKLSAJc2l6ZSA9IChzaXplICsgflBBR0VfTUFTSykgPj4gUEFHRV9TSElGVDsKLS0JcG9mZiA9IChmcm9tID4+IFBBR0VfU0hJRlQpICYgUFRSU19QRVJfUEFHRS0xOwotKwlwb2ZmID0gKGZyb20gPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUEFHRS0xKTsKLSAJaWYgKChwY250ID0gUFRSU19QRVJfUEFHRSAtIHBvZmYpID4gc2l6ZSkKLSAJCXBjbnQgPSBzaXplOwotIAotQEAgLTQ4NCw3ICs0ODQsNyBAQAotIAkJKnBhZ2VfdGFibGUgPSBCQURfUEFHRVRBQkxFIHwgUEFHRV9UQUJMRTsKLSAJCXJldHVybiAwOwotIAl9Ci0tCXBhZ2VfdGFibGUgKz0gKGFkZHJlc3MgPj4gUEFHRV9TSElGVCkgJiBQVFJTX1BFUl9QQUdFLTE7Ci0rCXBhZ2VfdGFibGUgKz0gKGFkZHJlc3MgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUEFHRS0xKTsKLSAJaWYgKCpwYWdlX3RhYmxlKSB7Ci0gCQlwcmludGsoInB1dF9wYWdlOiBwYWdlIGFscmVhZHkgZXhpc3RzXG4iKTsKLSAJCSpwYWdlX3RhYmxlID0gMDsKLUBAIC01MjMsNyArNTIzLDcgQEAKLSAJCQlwYWdlX3RhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikgdG1wOwotIAkJfQotIAl9Ci0tCXBhZ2VfdGFibGUgKz0gKGFkZHJlc3MgPj4gUEFHRV9TSElGVCkgJiBQVFJTX1BFUl9QQUdFLTE7Ci0rCXBhZ2VfdGFibGUgKz0gKGFkZHJlc3MgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUEFHRS0xKTsKLSAJaWYgKCpwYWdlX3RhYmxlKSB7Ci0gCQlwcmludGsoInB1dF9kaXJ0eV9wYWdlOiBwYWdlIGFscmVhZHkgZXhpc3RzXG4iKTsKLSAJCSpwYWdlX3RhYmxlID0gMDsKLUBAIC03NjAsNyArNzYwLDcgQEAKLSB7Ci0gCXN0cnVjdCB0YXNrX3N0cnVjdCAqKiBwOwotIAotLQlpZiAoIWlub2RlIHx8IGlub2RlLT5pX2NvdW50IDwgMikKLSsJaWYgKCFpbm9kZSB8fCBpbm9kZS0+aV9jb3VudCA8IDIgfHwgIWFyZWEtPnZtX29wcykKLSAJCXJldHVybiAwOwotIAlmb3IgKHAgPSAmTEFTVF9UQVNLIDsgcCA+ICZGSVJTVF9UQVNLIDsgLS1wKSB7Ci0gCQlpZiAoISpwKQotQEAgLTc3Myw4ICs3NzMsOCBAQAotIAkJCSAgIHdlIGNhbiBzaGFyZSBwYWdlcyB3aXRoICovCi0gCQkJaWYoYXJlYSl7Ci0gCQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBtcG50OwotLQkJCSAgZm9yKG1wbnQgPSAoKnApLT5tbWFwOyBtcG50OyBtcG50ID0gbXBudC0+dm1fbmV4dCl7Ci0tCQkJICAgIGlmKG1wbnQtPnZtX29wcyAmJiBtcG50LT52bV9vcHMgPT0gYXJlYS0+dm1fb3BzICYmCi0rCQkJICBmb3IgKG1wbnQgPSAoKnApLT5tbWFwOyBtcG50OyBtcG50ID0gbXBudC0+dm1fbmV4dCkgewotKwkJCSAgICBpZiAobXBudC0+dm1fb3BzID09IGFyZWEtPnZtX29wcyAmJgotIAkJCSAgICAgICBtcG50LT52bV9pbm9kZS0+aV9pbm8gPT0gYXJlYS0+dm1faW5vZGUtPmlfaW5vJiYKLSAJCQkgICAgICAgbXBudC0+dm1faW5vZGUtPmlfZGV2ID09IGFyZWEtPnZtX2lub2RlLT5pX2Rldil7Ci0gCQkJICAgICAgaWYgKG1wbnQtPnZtX29wcy0+c2hhcmUobXBudCwgYXJlYSwgYWRkcmVzcykpCi1AQCAtODUxLDYgKzg1MSw4IEBACi0gCQkJY29udGludWU7Ci0gCQlpZiAoYWRkcmVzcyA+PSAoKG1wbnQtPnZtX2VuZCArIFBBR0VfU0laRSAtIDEpICYgfihQQUdFX1NJWkUgLSAxKSkpCi0gCQkJY29udGludWU7Ci0rCQlpZiAoIW1wbnQtPnZtX29wcyB8fCAhbXBudC0+dm1fb3BzLT5ub3BhZ2UpCi0rCQkJYnJlYWs7Ci0gCQltcG50LT52bV9vcHMtPm5vcGFnZShlcnJvcl9jb2RlLCBtcG50LCBhZGRyZXNzKTsKLSAJCXJldHVybjsKLSAJfQotQEAgLTg1OCw3ICs4NjAsNyBAQAotIAlnZXRfZW1wdHlfcGFnZSh0c2ssYWRkcmVzcyk7Ci0gCWlmICh0c2sgIT0gY3VycmVudCkKLSAJCXJldHVybjsKLS0JaWYgKGFkZHJlc3MgPCB0c2stPmJyaykKLSsJaWYgKGFkZHJlc3MgPj0gdHNrLT5lbmRfZGF0YSAmJiBhZGRyZXNzIDwgdHNrLT5icmspCi0gCQlyZXR1cm47Ci0gCWlmIChhZGRyZXNzKzgxOTIgPj0gKHVzZXJfZXNwICYgMHhmZmZmZjAwMCkgJiYgCi0gCSAgICBhZGRyZXNzIDw9IGN1cnJlbnQtPnN0YXJ0X3N0YWNrKQotQEAgLTg3Miw3ICs4NzQsNyBAQAotICAqIGFuZCB0aGUgcHJvYmxlbSwgYW5kIHRoZW4gcGFzc2VzIGl0IG9mZiB0byBvbmUgb2YgdGhlIGFwcHJvcHJpYXRlCi0gICogcm91dGluZXMuCi0gICovCi0tZXh0ZXJuICJDIiB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKLSthc21saW5rYWdlIHZvaWQgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQotIHsKLSAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotIAl1bnNpZ25lZCBsb25nIHVzZXJfZXNwID0gMDsKLUBAIC05NjYsOSArOTY4LDkgQEAKLSAJaW50IHNoYXJlZCA9IDA7Ci0gCi0gCXByaW50aygiTWVtLWluZm86XG4iKTsKLS0JcHJpbnRrKCJGcmVlIHBhZ2VzOiAgICAgICU2ZGtCXG4iLG5yX2ZyZWVfcGFnZXM8PFBBR0VfU0hJRlQtMTApOwotLQlwcmludGsoIlNlY29uZGFyeSBwYWdlczogJTZka0JcbiIsbnJfc2Vjb25kYXJ5X3BhZ2VzPDxQQUdFX1NISUZULTEwKTsKLS0JcHJpbnRrKCJGcmVlIHN3YXA6ICAgICAgICU2ZGtCXG4iLG5yX3N3YXBfcGFnZXM8PFBBR0VfU0hJRlQtMTApOwotKwlwcmludGsoIkZyZWUgcGFnZXM6ICAgICAgJTZka0JcbiIsbnJfZnJlZV9wYWdlczw8KFBBR0VfU0hJRlQtMTApKTsKLSsJcHJpbnRrKCJTZWNvbmRhcnkgcGFnZXM6ICU2ZGtCXG4iLG5yX3NlY29uZGFyeV9wYWdlczw8KFBBR0VfU0hJRlQtMTApKTsKLSsJcHJpbnRrKCJGcmVlIHN3YXA6ICAgICAgICU2ZGtCXG4iLG5yX3N3YXBfcGFnZXM8PChQQUdFX1NISUZULTEwKSk7Ci0gCXByaW50aygiQnVmZmVyIG1lbW9yeTogICAlNmRrQlxuIixidWZmZXJtZW0+PjEwKTsKLSAJcHJpbnRrKCJCdWZmZXIgaGVhZHM6ICAgICU2ZFxuIixucl9idWZmZXJfaGVhZHMpOwotIAlwcmludGsoIkJ1ZmZlciBibG9ja3M6ICAgJTZkXG4iLG5yX2J1ZmZlcnMpOwotQEAgLTEwODUsOSArMTA4Nyw5IEBACi0gCXByaW50aygiTWVtb3J5OiAlZGsvJWRrIGF2YWlsYWJsZSAoJWRrIGtlcm5lbCBjb2RlLCAlZGsgcmVzZXJ2ZWQsICVkayBkYXRhKVxuIiwKLSAJCXRtcCA+PiAxMCwKLSAJCWVuZF9tZW0gPj4gMTAsCi0tCQljb2RlcGFnZXMgPDwgUEFHRV9TSElGVC0xMCwKLS0JCXJlc2VydmVkcGFnZXMgPDwgUEFHRV9TSElGVC0xMCwKLS0JCWRhdGFwYWdlcyA8PCBQQUdFX1NISUZULTEwKTsKLSsJCWNvZGVwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCi0rCQlyZXNlcnZlZHBhZ2VzIDw8IChQQUdFX1NISUZULTEwKSwKLSsJCWRhdGFwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCkpOwotIAlyZXR1cm47Ci0gfQotIAotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbW0vbW1hcC5jIGxpbnV4L21tL21tYXAuYwotLS0tIHBsMTIvbGludXgvbW0vbW1hcC5jCU1vbiBBdWcgIDkgMTg6MDI6MzMgMTk5MwotKysrIGxpbnV4L21tL21tYXAuYwlTYXQgU2VwICA0IDAyOjQ1OjIyIDE5OTMKLUBAIC01MiwxMSArNTIsMTEgQEAKLSAJc3dpdGNoIChmbGFncyAmIE1BUF9UWVBFKSB7Ci0gCWNhc2UgTUFQX1NIQVJFRDoKLSAJCWlmICgocHJvdCAmIFBST1RfV1JJVEUpICYmICEoZmlsZS0+Zl9tb2RlICYgMikpCi0tCQkJcmV0dXJuIC1FSU5WQUw7Ci0rCQkJcmV0dXJuIC1FQUNDRVM7Ci0gCQkvKiBmYWxsIHRocm91Z2ggKi8KLSAJY2FzZSBNQVBfUFJJVkFURToKLSAJCWlmICghKGZpbGUtPmZfbW9kZSAmIDEpKQotLQkJCXJldHVybiAtRUlOVkFMOwotKwkJCXJldHVybiAtRUFDQ0VTOwotIAkJYnJlYWs7Ci0gCi0gCWRlZmF1bHQ6Ci1AQCAtMTIxLDcgKzEyMSw3IEBACi0gCXJldHVybiAtMTsKLSB9Ci0gCi0tZXh0ZXJuICJDIiBpbnQgc3lzX21tYXAodW5zaWduZWQgbG9uZyAqYnVmZmVyKQotK2FzbWxpbmthZ2UgaW50IHN5c19tbWFwKHVuc2lnbmVkIGxvbmcgKmJ1ZmZlcikKLSB7Ci0gCXVuc2lnbmVkIGxvbmcgZmQ7Ci0gCXN0cnVjdCBmaWxlICogZmlsZTsKLUBAIC0xMzMsNyArMTMzLDcgQEAKLSAJCWdldF9mc19sb25nKGJ1ZmZlcisyKSwgZ2V0X2ZzX2xvbmcoYnVmZmVyKzMpLCBnZXRfZnNfbG9uZyhidWZmZXIrNSkpOwotIH0KLSAKLS1leHRlcm4gIkMiIGludCBzeXNfbXVubWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbikKLSthc21saW5rYWdlIGludCBzeXNfbXVubWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbikKLSB7Ci0gCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbXBudCwgKipwLCAqZnJlZTsKLSAKLUBAIC0xNjksNyArMTY5LDcgQEAKLSAJd2hpbGUgKGZyZWUpIHsKLSAJCW1wbnQgPSBmcmVlOwotIAkJZnJlZSA9IGZyZWUtPnZtX25leHQ7Ci0tCQlpZiAobXBudC0+dm1fb3BzLT5jbG9zZSkKLSsJCWlmIChtcG50LT52bV9vcHMgJiYgbXBudC0+dm1fb3BzLT5jbG9zZSkKLSAJCQltcG50LT52bV9vcHMtPmNsb3NlKG1wbnQpOwotIAkJa2ZyZWUobXBudCk7Ci0gCX0KLUBAIC0xOTcsMTEgKzE5Nyw5IEBACi0gCWV4dGVybiBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZmlsZV9tbWFwOwotIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLSAKLS0JaWYgKG9mZiAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkKLSsJaWYgKHByb3QgJiBQQUdFX1JXKQkvKiBvbmx5IFBBR0VfQ09XIG9yIHJlYWQtb25seSBzdXBwb3J0ZWQgcmlnaHQgbm93ICovCi0gCQlyZXR1cm4gLUVJTlZBTDsKLS0JaWYgKGxlbiA+IGhpZ2hfbWVtb3J5IHx8IG9mZiA+IGhpZ2hfbWVtb3J5IC0gbGVuKSAvKiBhdm9pZCBvdmVyZmxvdyAqLwotLQkJcmV0dXJuIC1FTlhJTzsKLS0JaWYgKGdldF9saW1pdChVU0VSX0RTKSAgIT0gVEFTS19TSVpFKQotKwlpZiAob2ZmICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQotIAkJcmV0dXJuIC1FSU5WQUw7Ci0gCWlmICghaW5vZGUtPmlfc2IgfHwgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0gCQlyZXR1cm4gLUVBQ0NFUzsKLUBAIC0yMzEsMTAgKzIyOSw2IEBACi0gCW1wbnQtPnZtX29wcyA9ICZmaWxlX21tYXA7Ci0gCW1wbnQtPnZtX25leHQgPSBjdXJyZW50LT5tbWFwOwotIAljdXJyZW50LT5tbWFwID0gbXBudDsKLS0jaWYgMAotLQlwcmludGsoIlZGUzogTG9hZGVkIG1tYXAgYXQgJTA4eCAtICAlMDh4XG4iLAotLQkJbXBudC0+dm1fc3RhcnQsCW1wbnQtPnZtX2VuZCk7Ci0tI2VuZGlmCi0gCXJldHVybiAwOwotIH0KLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L21tL3N3YXAuYyBsaW51eC9tbS9zd2FwLmMKLS0tLSBwbDEyL2xpbnV4L21tL3N3YXAuYwlTYXQgQXVnIDE0IDE1OjU5OjM0IDE5OTMKLSsrKyBsaW51eC9tbS9zd2FwLmMJU2F0IFNlcCAgNCAwMjo0NTozNCAxOTkzCi1AQCAtMjY1LDcgKzI2NSw3IEBACi0gICogc3dhcHBpbmcgb3V0IG9yIGZvcmdldHRpbmcgYWJvdXQuIFRoaXMgc3BlZWRzIHVwIHRoZSBzZWFyY2ggd2hlbiB3ZQotICAqIGFjdHVhbGx5IGhhdmUgdG8gc3dhcC4KLSAgKi8KLS1leHRlcm4gIkMiIGludCBzeXNfaWRsZSh2b2lkKQotK2FzbWxpbmthZ2UgaW50IHN5c19pZGxlKHZvaWQpCi0gewotIAluZWVkX3Jlc2NoZWQgPSAxOwotIAlyZXR1cm4gMDsKLUBAIC02NjEsNyArNjYxLDcgQEAKLSAJcmV0dXJuIDA7Ci0gfQotIAotLWV4dGVybiAiQyIgaW50IHN5c19zd2Fwb2ZmKGNvbnN0IGNoYXIgKiBzcGVjaWFsZmlsZSkKLSthc21saW5rYWdlIGludCBzeXNfc3dhcG9mZihjb25zdCBjaGFyICogc3BlY2lhbGZpbGUpCi0gewotIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHA7Ci0gCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotQEAgLTcxMyw3ICs3MTMsNyBAQAotICAqCi0gICogVGhlIHN3YXBvbiBzeXN0ZW0gY2FsbAotICAqLwotLWV4dGVybiAiQyIgaW50IHN5c19zd2Fwb24oY29uc3QgY2hhciAqIHNwZWNpYWxmaWxlKQotK2FzbWxpbmthZ2UgaW50IHN5c19zd2Fwb24oY29uc3QgY2hhciAqIHNwZWNpYWxmaWxlKQotIHsKLSAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKiBwOwotIAlzdHJ1Y3QgaW5vZGUgKiBzd2FwX2lub2RlOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbmV0L2luZXQvM2M1MDkuYyBsaW51eC9uZXQvaW5ldC8zYzUwOS5jCi0tLS0gcGwxMi9saW51eC9uZXQvaW5ldC8zYzUwOS5jCUZyaSBBdWcgMTMgMDY6MzU6NDQgMTk5MwotKysrIGxpbnV4L25ldC9pbmV0LzNjNTA5LmMJRnJpIFNlcCAgMyAyMjowODozMiAxOTkzCi1AQCAtMSw0ICsxLDQgQEAKLS0vKiBlbDMuYzogQW4gM2M1MDkgRXRoZXJMaW5rMyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLwotKy8qIDNjNTA5LmM6IEEgM2M1MDkgRXRoZXJMaW5rMyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLwotIC8qCi0gICAgIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgotIAotQEAgLTcsMTMgKzcsMTMgQEAKLSAgICAgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLAotICAgICBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAgICAgCi0tICAgIFRoaXMgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggdGhlIDNDb20gRXRoZXJMaW5rSUlJIHNlcmllcy4KLSsgICAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSAzQ29tIEV0aGVyTGlua0lJSSBzZXJpZXMuCi0gCi0gICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHN1cGVyLm9yZyBvcgotICAgICBDL08gU3VwZXJjb21wdXRpbmcgUmVzZWFyY2ggQ3RyLiwgMTcxMDAgU2NpZW5jZSBEci4sIEJvd2llIE1EIDIwNzE1Ci0gKi8KLSAKLS1zdGF0aWMgY2hhciAqdmVyc2lvbiA9ICJlbDMuYzogdjAuMDIgOC8xMy85MyBiZWNrZXJAc3VwZXIub3JnXG4iOwotK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gIjNjNTA5LmM6IHYwLjA2IDkvMy85MyBiZWNrZXJAc3VwZXIub3JnXG4iOwotIAotICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci1AQCAtMjMsNiArMjMsMTQgQEAKLSAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0rCi0rI2lmbmRlZiBQUkVfUEwxMwotKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSsjZWxzZQotKyNkZWZpbmUgc25hcmZfcmVnaW9uKGJhc2UsZXh0ZW50KSBkbyB7O313aGlsZSgwKQotKyNkZWZpbmUgY2hlY2tfcmVnaW9uKGJhc2UsZXh0ZW50KSAoMCkKLSsjZW5kaWYKLSsKLSAvKiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ki8KLSAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0gI2lmbmRlZiBwb3J0X3JlYWQKLUBAIC0zNCwxMCArNDIsMTIgQEAKLSAjaW5jbHVkZSAic2tidWZmLmgiCi0gI2luY2x1ZGUgImFycC5oIgotIAotKyNpZm5kZWYgSEFWRV9BVVRPSVJRCi0gLyogRnJvbSBhdXRvX2lycS5jLCBzaG91bGQgYmUgaW4gYSAqLmggZmlsZS4gKi8KLSBleHRlcm4gdm9pZCBhdXRvaXJxX3NldHVwKGludCB3YWl0dGltZSk7Ci0gZXh0ZXJuIGludCBhdXRvaXJxX3JlcG9ydChpbnQgd2FpdHRpbWUpOwotIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICppcnEyZGV2X21hcFsxNl07Ci0rI2VuZGlmCi0gCi0gLyogVGhlc2Ugc2hvdWxkIGJlIGluIDxhc20vaW8uaD4uICovCi0gI2RlZmluZSBwb3J0X3JlYWRfbChwb3J0LGJ1ZixucikgXAotQEAgLTQ5LDkgKzU5LDEyIEBACi0gI2lmZGVmIEVMM19ERUJVRwotIGludCBlbDNfZGVidWcgPSBFTDNfREVCVUc7Ci0gI2Vsc2UKLS1pbnQgZWwzX2RlYnVnID0gMTsKLStpbnQgZWwzX2RlYnVnID0gMjsKLSAjZW5kaWYKLSAKLSsvKiBUbyBtaW5pbWl6ZSB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIHNvdXJjZSBJIG9ubHkgZGVmaW5lIG9wZXJhdGluZwotKyAgIGNvbnN0YW50cyBpZiB0aGV5IGFyZSB1c2VkIHNldmVyYWwgdGltZXMuICBZb3UnbGwgbmVlZCB0aGUgbWFudWFsCi0rICAgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCBkcml2ZXIgZGV0YWlscy4gKi8KLSAvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KLSAjZGVmaW5lIEVMM19EQVRBIDB4MDAKLSAjZGVmaW5lIEVMM19DTUQgMHgwZQotQEAgLTU5LDYgKzcyLDkgQEAKLSAjZGVmaW5lIElEX1BPUlQgMHgxMDAKLSAjZGVmaW5lICBFRVBST01fUkVBRCAweDgwCi0gCi0rI2RlZmluZSBFTDNXSU5ET1cod2luX251bSkgb3V0dygweDA4MDArKHdpbl9udW0pLCBpb2FkZHIgKyBFTDNfQ01EKQotKwotKwotIC8qIFJlZ2lzdGVyIHdpbmRvdyAxIG9mZnNldHMsIHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4gKi8KLSAjZGVmaW5lIFRYX0ZSRUUgMHgwQwotICNkZWZpbmUgVFhfU1RBVFVTIDB4MEIKLUBAIC02NiwxMSArODIsMTIgQEAKLSAjZGVmaW5lIFJYX1NUQVRVUyAweDA4Ci0gI2RlZmluZSBSWF9GSUZPIDB4MDAKLSAKLSsjZGVmaW5lIFdONF9NRURJQQkweDBBCi0rCi0gc3RydWN0IGVsM19wcml2YXRlIHsKLSAgICAgc3RydWN0IGVuZXRfc3RhdGlzdGljcyBzdGF0czsKLSB9OwotIAotLXN0YXRpYyBpbnQgZWwzX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKLSBzdGF0aWMgaW50IHJlYWRfZWVwcm9tKGludCBpbmRleCk7Ci0gc3RhdGljIGludCBlbDNfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpOwotIHN0YXRpYyBpbnQgZWwzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRldmljZSAqZGV2KTsKLUBAIC04NSw3ICsxMDIsOSBAQAotIGludCBlbDNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotIHsKLSAgICAgc2hvcnQgbHJzX3N0YXRlID0gMHhmZiwgaTsKLS0gICAgdW5zaWduZWQgc2hvcnQgaW9iYXNlID0gMDsKLSsgICAgc2hvcnQgaW9hZGRyLCBpcnE7Ci0rICAgIHNob3J0ICpwaHlzX2FkZHIgPSAoc2hvcnQgKilkZXYtPmRldl9hZGRyOwotKyAgICBzdGF0aWMgaW50IGN1cnJlbnRfdGFnID0gMDsKLSAKLSAgICAgLyogU2VuZCB0aGUgSUQgc2VxdWVuY2UgdG8gdGhlIElEX1BPUlQuICovCi0gICAgIG91dGIoMHgwMCwgSURfUE9SVCk7Ci1AQCAtOTYsNzUgKzExNSw1NyBAQAotIAlscnNfc3RhdGUgPSBscnNfc3RhdGUgJiAweDEwMCA/IGxyc19zdGF0ZSBeIDB4Y2YgOiBscnNfc3RhdGU7Ci0gICAgIH0KLSAKLS0gICAgLyogVGhlIGN1cnJlbnQgU3BhY2UuYyBpbml0aWFsaXphdGlvbiBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gaGF2ZSBtb3JlCi0tICAgICAgIHRoYW4gb25lIGFkYXB0b3IgaW5pdGlhbGl6ZWQuICBTZW5kIG1lIGVtYWlsIGlmIHlvdSBoYXZlIGEgbmVlZCBmb3IKLS0gICAgICAgbXVsdGlwbGUgYWRhcHRvcnMuICovCi0tCi0tICAgIC8qIFJlYWQgaW4gRUVQUk9NIGRhdGEuCi0tICAgICAgIE9ubHkgdGhlIGhpZ2hlc3QgYWRkcmVzcyBib2FyZCB3aWxsIHN0YXkgb24tbGluZS4gKi8KLSsgICAgLyogRm9yIHRoZSBmaXJzdCBwcm9iZSwgY2xlYXIgYWxsIGJvYXJkJ3MgdGFnIHJlZ2lzdGVycy4gKi8KLSsgICAgaWYgKGN1cnJlbnRfdGFnID09IDApCi0rCW91dGIoMHhkMCwgSURfUE9SVCk7Ci0rICAgIGVsc2UJCS8qIE90aGVyd2lzZSBraWxsIG9mZiBhbHJlYWR5LWZvdW5kIGJvYXJkcy4gKi8KLSsJb3V0YigweGQ4LCBJRF9QT1JUKTsKLSAKLS0gICAgewotLQlzaG9ydCAqcGh5c19hZGRyID0gKHNob3J0ICopZGV2LT5kZXZfYWRkcjsKLS0JcGh5c19hZGRyWzBdID0gaHRvbnMocmVhZF9lZXByb20oMCkpOwotLQlpZiAocGh5c19hZGRyWzBdICE9IDB4NjAwMCkKLS0JICAgIHJldHVybiAxOwotLQlwaHlzX2FkZHJbMV0gPSBodG9ucyhyZWFkX2VlcHJvbSgxKSk7Ci0tCXBoeXNfYWRkclsyXSA9IGh0b25zKHJlYWRfZWVwcm9tKDIpKTsKLSsgICAgaWYgKHJlYWRfZWVwcm9tKDcpICE9IDB4NmQ1MCkgewotKwlyZXR1cm4gLUVOT0RFVjsKLSAgICAgfQotIAotLSAgICBpb2Jhc2UgPSByZWFkX2VlcHJvbSg4KTsKLS0gICAgZGV2LT5pcnEgPSByZWFkX2VlcHJvbSg5KSA+PiAxMjsKLS0KLS0gICAgLyogQWN0aXZhdGUgdGhlIGFkYXB0b3IgYXQgdGhlIEVFUFJPTSBsb2NhdGlvbiAoaWYgc2V0KSwgZWxzZSAweDMyMC4gKi8KLS0KLS0gICAgaWYgKGlvYmFzZSA9PSAweDAwMDApIHsKLS0JZGV2LT5iYXNlX2FkZHIgPSAweDMyMDsKLS0Jb3V0YigweGYyLCBJRF9QT1JUKTsKLS0gICAgfSBlbHNlIHsKLS0JZGV2LT5iYXNlX2FkZHIgPSAweDIwMCArICgoaW9iYXNlICYgMHgxZikgPDwgNCk7Ci0tCW91dGIoMHhmZiwgSURfUE9SVCk7Ci0rICAgIC8qIFJlYWQgaW4gRUVQUk9NIGRhdGEsIHdoaWNoIGRvZXMgY29udGVudGlvbi1zZWxlY3QuCi0rICAgICAgIE9ubHkgdGhlIGxvd2VzdCBhZGRyZXNzIGJvYXJkIHdpbGwgc3RheSAib24tbGluZSIuCi0rICAgICAgIDNDb20gZ290IHRoZSBieXRlIG9yZGVyIGJhY2t3YXJkcy4gKi8KLSsgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotKwlwaHlzX2FkZHJbaV0gPSBodG9ucyhyZWFkX2VlcHJvbShpKSk7Ci0gICAgIH0KLSAKLS0gICAgb3V0dygweDA4MDAsIGRldi0+YmFzZV9hZGRyICsgRUwzX0NNRCk7CSAvKiBXaW5kb3cgMC4gKi8KLS0gICAgcHJpbnRrKCIlczogM2M1MDkgYXQgJSMzLjN4ICBrZXkgJTQuNHggaW9iYXNlICU0LjR4LlxuIiwKLS0JICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgaW53KGRldi0+YmFzZV9hZGRyKSwgaW9iYXNlKTsKLSsgICAgewotKwl1bnNpZ25lZCBzaG9ydCBpb2Jhc2UgPSByZWFkX2VlcHJvbSg4KTsKLSsJZGV2LT5pZl9wb3J0ID0gaW9iYXNlID4+IDE0OwotKwlpb2FkZHIgPSAweDIwMCArICgoaW9iYXNlICYgMHgxZikgPDwgNCk7Ci0rICAgIH0KLSsgICAgaXJxID0gcmVhZF9lZXByb20oOSkgPj4gMTI7Ci0gCi0tICAgIGlmIChpbncoZGV2LT5iYXNlX2FkZHIpID09IDB4NmQ1MCkgewotLQllbDNfaW5pdChkZXYpOwotLQlyZXR1cm4gMDsKLS0gICAgfSBlbHNlCi0rICAgIC8qIFRoZSBjdXJyZW50IFNwYWNlLmMgc3RydWN0dXJlIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBoYXZlIG1vcmUKLSsgICAgICAgdGhhbiBvbmUgYWRhcHRvciBpbml0aWFsaXplZC4gIFNlbmQgbWUgZW1haWwgaWYgeW91IGhhdmUgYSBuZWVkIGZvcgotKyAgICAgICBtdWx0aXBsZSBhZGFwdG9ycywgYW5kIHdlJ2xsIHdvcmsgb3V0IHNvbWV0aGluZy4gIC1iZWNrZXJAc3VwZXIub3JnICovCi0rICAgIGlmIChkZXYtPmJhc2VfYWRkciAhPSAwCi0rCSYmICBkZXYtPmJhc2VfYWRkciAhPSAodW5zaWduZWQgc2hvcnQpaW9hZGRyKSB7Ci0gCXJldHVybiAtRU5PREVWOwotLX0KLS0KLS1zdGF0aWMgaW50Ci0tcmVhZF9lZXByb20oaW50IGluZGV4KQotLXsKLS0gICAgaW50IHRpbWVyLCBiaXQsIHdvcmQgPSAwOwotLSAgICAKLS0gICAgLyogSXNzdWUgcmVhZCBjb21tYW5kLCBhbmQgcGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIGl0IHRvIGNvbXBsZXRlLgotLSAgICAgICBBc3N1bWUgZXh0cmEtZmFzdCAxNk1oeiBidXMuICovCi0tICAgIG91dGIoRUVQUk9NX1JFQUQgKyBpbmRleCwgSURfUE9SVCk7Ci0rICAgIH0KLSAKLS0gICAgZm9yICh0aW1lciA9IDA7IHRpbWVyIDwgMTYyKjQgKyA0MDA7IHRpbWVyKyspCi0tCVNMT1dfRE9XTl9JTzsKLSsgICAgLyogU2V0IHRoZSBhZGFwdG9yIHRhZyBzbyB0aGF0IHRoZSBuZXh0IGNhcmQgY2FuIGJlIGZvdW5kLiAqLwotKyAgICBvdXRiKDB4ZDAgKyArK2N1cnJlbnRfdGFnLCBJRF9QT1JUKTsKLSAKLS0gICAgZm9yIChiaXQgPSAxNTsgYml0ID49IDA7IGJpdC0tKQotLQl3b3JkID0gKHdvcmQgPDwgMSkgKyAoaW5iKElEX1BPUlQpICYgMHgwMSk7Ci0tCQotLSAgICBpZiAoZWwzX2RlYnVnID4gMykKLS0JcHJpbnRrKCIgIDNjNTA5IEVFUFJPTSB3b3JkICVkICUjNC40eC5cbiIsIGluZGV4LCB3b3JkKTsKLSsgICAgLyogQWN0aXZhdGUgdGhlIGFkYXB0b3IgYXQgdGhlIEVFUFJPTSBsb2NhdGlvbi4gKi8KLSsgICAgb3V0YigweGZmLCBJRF9QT1JUKTsKLSAKLS0gICAgcmV0dXJuIHdvcmQ7Ci0tfQotKyAgICBFTDNXSU5ET1coMCk7Ci0rICAgIGlmIChpbncoaW9hZGRyKSAhPSAweDZkNTApCi0rCXJldHVybiAtRU5PREVWOwotIAotLXN0YXRpYyBpbnQKLS1lbDNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi0tewotLSAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOwotLSAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0tICAgIGludCBpOwotKyAgICBkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKLSsgICAgZGV2LT5pcnEgPSBpcnE7Ci0rICAgIHNuYXJmX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgMTYpOwotIAotLSAgICBwcmludGsoIiVzOiBFTDMgYXQgJSMzeCwgYWRkcmVzcyIsIGRldi0+bmFtZSwgaW9hZGRyKTsKLSsgICAgewotKwljaGFyICppZl9uYW1lc1tdID0geyIxMGJhc2VUIiwgIkFVSSIsICJ1bmRlZmluZWQiLCAiQk5DIn07Ci0rCXByaW50aygiJXM6IDNjNTA5IGF0ICUjMy4zeCAgdGFnICVkLCAlcyBwb3J0LCBhZGRyZXNzICIsCi0rCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBjdXJyZW50X3RhZywgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7Ci0rICAgIH0KLSAKLSAgICAgLyogUmVhZCBpbiB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLwotICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotQEAgLTE3NCw5ICsxNzUsOCBAQAotICAgICAvKiBNYWtlIHVwIGEgRUwzLXNwZWNpZmljLWRhdGEgc3RydWN0dXJlLiAqLwotICAgICBkZXYtPnByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWwzX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKLSAgICAgbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBlbDNfcHJpdmF0ZSkpOwotLSAgICBscCA9IChzdHJ1Y3QgZWwzX3ByaXZhdGUgKilkZXYtPnByaXY7Ci0gCi0tICAgIGlmIChlbDNfZGVidWcgPiAxKQotKyAgICBpZiAoZWwzX2RlYnVnID4gMCkKLSAJcHJpbnRrKHZlcnNpb24pOwotIAotICAgICAvKiBUaGUgRUwzLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi1AQCAtMTk5LDcgKzE5OSw3IEBACi0gICAgIGRldi0+aGFyZF9oZWFkZXJfbGVuID0gRVRIX0hMRU47Ci0gICAgIGRldi0+bXR1CQk9IDE1MDA7IC8qIGV0aF9tdHUgKi8KLSAgICAgZGV2LT5hZGRyX2xlbgk9IEVUSF9BTEVOOwotLSAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT5hZGRyX2xlbjsgaSsrKSB7Ci0rICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7Ci0gCWRldi0+YnJvYWRjYXN0W2ldPTB4ZmY7Ci0gICAgIH0KLSAKLUBAIC0yMTQsNiArMjE0LDMwIEBACi0gICAgIHJldHVybiAwOwotIH0KLSAKLSsKLStzdGF0aWMgaW50Ci0rcmVhZF9lZXByb20oaW50IGluZGV4KQotK3sKLSsgICAgaW50IHRpbWVyLCBiaXQsIHdvcmQgPSAwOwotKyAgICAKLSsgICAgLyogSXNzdWUgcmVhZCBjb21tYW5kLCBhbmQgcGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIGl0IHRvIGNvbXBsZXRlLgotKyAgICAgICBBc3N1bWUgZXh0cmEtZmFzdCAxNk1oeiBidXMuICovCi0rICAgIG91dGIoRUVQUk9NX1JFQUQgKyBpbmRleCwgSURfUE9SVCk7Ci0rCi0rICAgIC8qIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBkb25lIGJ5IGxvb2tpbmcgYXQgb25lIG9mIHRoZSB0aW1lciBjaGFubmVscy4gKi8KLSsgICAgZm9yICh0aW1lciA9IDA7IHRpbWVyIDwgMTYyKjQgKyA0MDA7IHRpbWVyKyspCi0rCVNMT1dfRE9XTl9JTzsKLSsKLSsgICAgZm9yIChiaXQgPSAxNTsgYml0ID49IDA7IGJpdC0tKQotKwl3b3JkID0gKHdvcmQgPDwgMSkgKyAoaW5iKElEX1BPUlQpICYgMHgwMSk7Ci0rCQotKyAgICBpZiAoZWwzX2RlYnVnID4gMykKLSsJcHJpbnRrKCIgIDNjNTA5IEVFUFJPTSB3b3JkICVkICUjNC40eC5cbiIsIGluZGV4LCB3b3JkKTsKLSsKLSsgICAgcmV0dXJuIHdvcmQ7Ci0rfQotKwotKwotIAwKLSBzdGF0aWMgaW50Ci0gZWwzX29wZW4oc3RydWN0IGRldmljZSAqZGV2KQotQEAgLTIyNSwyNiArMjQ5LDM2IEBACi0gCXJldHVybiAtRUFHQUlOOwotICAgICB9Ci0gCi0rICAgIEVMM1dJTkRPVygwKTsKLSAgICAgaWYgKGVsM19kZWJ1ZyA+IDMpCi0tCXByaW50aygiJXM6IE9wZW5pbmcsIElSUSAlZCAgc3RhdHVzQCV4ICU0LjR4IHJlZzQgJTQuNHguXG4iLAotLQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgaW9hZGRyICsgRUwzX1NUQVRVUywKLS0JICAgICAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSwgaW53KGlvYWRkciArIDQpKTsKLS0gICAgb3V0dygweDA4MDAsIGlvYWRkciArIEVMM19DTUQpOyAvKiBNYWtlIGNlcnRhaW4gd2UgYXJlIGluIHdpbmRvdyAwLiAqLwotKwlwcmludGsoIiVzOiBPcGVuaW5nLCBJUlEgJWQgIHN0YXR1c0AleCAlNC40eC5cbiIsIGRldi0+bmFtZSwKLSsJICAgICAgIGRldi0+aXJxLCBpb2FkZHIgKyBFTDNfU1RBVFVTLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOwotIAotLSAgICAvKiBUaGlzIGlzIHByb2JhYmx5IHVubmVjZXNzYXJ5LiAqLwotKyAgICAvKiBBY3RpdmF0ZSBib2FyZDogdGhpcyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeS4gKi8KLSAgICAgb3V0dygweDAwMDEsIGlvYWRkciArIDQpOwotIAotLSAgICBvdXR3KChkZXYtPmlycSA8PCAxMikgfCAweDBmMDAsIGlvYWRkciArIDgpOwotLQotICAgICBpcnEyZGV2X21hcFtkZXYtPmlycV0gPSBkZXY7Ci0gCi0rICAgIC8qIFNldCB0aGUgSVJRIGxpbmUuICovCi0rICAgIG91dHcoKGRldi0+aXJxIDw8IDEyKSB8IDB4MGYwMCwgaW9hZGRyICsgOCk7Ci0rCi0gICAgIC8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGluIHdpbmRvdyAyIGVhY2ggdGltZSBvcGVuZWQuICovCi0tICAgIG91dHcoMHgwODAyLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSsgICAgRUwzV0lORE9XKDIpOwotIAotICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotIAlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOwotIAotLSAgICBvdXR3KDB4MTAwMCwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFN0YXJ0IHRoZSB0aGlubmV0IHRyYW5zY2VpdmVyLiAqLwotKyAgICBpZiAoZGV2LT5pZl9wb3J0ID09IDMpCi0rCS8qIFN0YXJ0IHRoZSB0aGlubmV0IHRyYW5zY2VpdmVyLiBXZSBzaG91bGQgcmVhbGx5IHdhaXQgNTBtcy4uLiovCi0rCW91dHcoMHgxMDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSsgICAgZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKLSsJLyogMTBiYXNlVCBpbnRlcmZhY2UsIGVuYWJsZWQgbGluayBiZWF0IGFuZCBqYWJiZXIgY2hlY2suICovCi0rCUVMM1dJTkRPVyg0KTsKLSsJb3V0dyhpbncoaW9hZGRyICsgV040X01FRElBKSB8IDB4MDBDMCwgaW9hZGRyICsgV040X01FRElBKTsKLSsgICAgfQotKwotKyAgICAvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDEgZm9yIG5vcm1hbCB1c2UuICovCi0rICAgIEVMM1dJTkRPVygxKTsKLSAKLSAgICAgb3V0dygweDgwMDUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBBY2NlcHQgYi1jYXNlIGFuZCBwaHlzIGFkZHIgb25seS4gKi8KLSAgICAgb3V0dygweEE4MDAsIGlvYWRkciArIEVMM19DTUQpOyAvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCi1AQCAtMjUxLDE5ICsyODUsMTUgQEAKLSAgICAgb3V0dygweDIwMDAsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLwotICAgICBvdXR3KDB4NDgwMCwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEVuYWJsZSB0cmFuc21pdHRlci4gKi8KLSAgICAgb3V0dygweDc4ZmYsIGlvYWRkciArIEVMM19DTUQpOyAvKiBBbGxvdyBhbGwgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KLSsgICAgZGV2LT5pbnRlcnJ1cHQgPSAwOwotKyAgICBkZXYtPnRidXN5ID0gMDsKLSsgICAgZGV2LT5zdGFydCA9IDE7Ci0gICAgIG91dHcoMHg3MDk4LCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogU2V0IGludGVycnVwdCBtYXNrLiAqLwotIAotLSAgICAvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDEgZm9yIG5vcm1hbCB1c2UuICovCi0tICAgIG91dHcoMHgwODAxLCBpb2FkZHIgKyBFTDNfQ01EKTsKLS0KLSAgICAgaWYgKGVsM19kZWJ1ZyA+IDMpCi0gCXByaW50aygiJXM6IE9wZW5lZCAzYzUwOSAgSVJRICVkICBzdGF0dXMgJTQuNHguXG4iLAotIAkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKLSAKLS0gICAgZGV2LT50YnVzeSA9IDA7Ci0tICAgIGRldi0+aW50ZXJydXB0ID0gMDsKLS0gICAgZGV2LT5zdGFydCA9IDE7Ci0tCi0gICAgIHJldHVybiAwOwkJCS8qIEFsd2F5cyBzdWNjZWVkICovCi0gfQotIAotQEAgLTI3OCw3ICszMDgsNyBAQAotIAlpbnQgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OwotIAlpZiAodGlja3Nzb2ZhciA8IDEwKQotIAkgICAgcmV0dXJuIDE7Ci0tCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhfc3RhdHVzICU0LjR4IHN0YXR1cyAlNC40eC5cbiIsCi0rCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eC5cbiIsCi0gCSAgICAgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBUWF9TVEFUVVMpLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOwotIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLSAJLyogSXNzdWUgVFhfUkVTRVQgYW5kIFRYX1NUQVJUIGNvbW1hbmRzLiAqLwotQEAgLTMwOCw4ICszMzgsOSBAQAotICAgICB9Ci0gCi0gICAgIGlmIChpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiAweDAwMDEpIHsgLyogSVJRIGxpbmUgYWN0aXZlLCBtaXNzZWQgb25lLiAqLwotLSAgICAgIHByaW50aygiJXM6IE1pc3NlZCBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwKLS0JICAgICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOwotKyAgICAgIHByaW50aygiJXM6IE1pc3NlZCBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eCAgVHggJTIuMnggUnggJTQuNHguXG4iLAotKwkgICAgIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpLCBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKSwKLSsJICAgICBpbncoaW9hZGRyICsgUlhfU1RBVFVTKSk7Ci0gICAgICAgb3V0dygweDc4MDAsIGlvYWRkciArIEVMM19DTUQpOyAvKiBGYWtlIGludGVycnVwdCB0cmlnZ2VyLiAqLwotICAgICAgIG91dHcoMHg2ODk5LCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogQWNrIElSUSAqLwotICAgICAgIG91dHcoMHg3OGZmLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogQWxsb3cgYWxsIHN0YXR1cyBiaXRzIHRvIGJlIHNlZW4uICovCi1AQCAtMzIyLDggKzM1Myw3IEBACi0gICAgIG91dHcoc2tiLT5sZW4sIGlvYWRkciArIFRYX0ZJRk8pOwotICAgICBvdXR3KDB4MDAsIGlvYWRkciArIFRYX0ZJRk8pOwotICAgICAvKiAuLi4gYW5kIHRoZSBwYWNrZXQgcm91bmRlZCB0byBhIGRvdWJsZXdvcmQuICovCi0tICAgIHBvcnRfd3JpdGUoaW9hZGRyICsgVFhfRklGTywgKHZvaWQgKikoc2tiKzEpLAotLQkgICAgICAgKChza2ItPmxlbiArIDMpID4+IDEpICYgfjB4MSk7Ci0rICAgIHBvcnRfd3JpdGVfbChpb2FkZHIgKyBUWF9GSUZPLCAodm9pZCAqKShza2IrMSksIChza2ItPmxlbiArIDMpID4+IDIpOwotICAgICAKLSAgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0gICAgIGlmIChza2ItPmZyZWUpCi1AQCAtMzYwLDggKzM5MCw5IEBACi0gZWwzX2ludGVycnVwdChpbnQgcmVnX3B0cikKLSB7Ci0gICAgIGludCBpcnEgPSAtKCgoc3RydWN0IHB0X3JlZ3MgKilyZWdfcHRyKS0+b3JpZ19lYXgrMik7Ci0tICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IGlycTJkZXZfbWFwW2lycV07Ci0rICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IChzdHJ1Y3QgZGV2aWNlICopKGlycTJkZXZfbWFwW2lycV0pOwotICAgICBpbnQgaW9hZGRyLCBzdGF0dXM7Ci0rICAgIGludCBpID0gMDsKLSAKLSAgICAgaWYgKGRldiA9PSBOVUxMKSB7Ci0gCXByaW50ayAoImVsM19pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7Ci1AQCAtMzgwLDYgKzQxMSw5IEBACi0gICAgIAotICAgICB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJiAweDAxKSB7Ci0gCi0rCWlmIChzdGF0dXMgJiAweDEwKQotKwkgICAgZWwzX3J4KGRldik7Ci0rCi0gCWlmIChzdGF0dXMgJiAweDA4KSB7Ci0gCSAgICBpZiAoZWwzX2RlYnVnID4gNSkKLSAJCXByaW50aygiICAgIFRYIHJvb20gYml0IHdhcyBoYW5kbGVkLlxuIik7Ci1AQCAtMzkxLDEwICs0MjUsMTIgQEAKLSAJaWYgKHN0YXR1cyAmIDB4ODApCQkvKiBTdGF0aXN0aWNzIGZ1bGwuICovCi0gCSAgICB1cGRhdGVfc3RhdHMoaW9hZGRyLCBkZXYpOwotIAkKLS0JaWYgKHN0YXR1cyAmIDB4MTApCi0tCSAgICBlbDNfcngoZGV2KTsKLS0KLS0JLyogQ2xlYXIgdGhlIGludGVycnVwdHMgd2UndmUgaGFuZGxlZC4gKi8KLSsJaWYgKCsraSA+IDEwKSB7Ci0rCSAgICBwcmludGsoIiVzOiBJbmZpbml0ZSBsb29wIGluIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKLSsJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKLSsJICAgIGJyZWFrOwotKwl9Ci0rCS8qIENsZWFyIHRoZSBvdGhlciBpbnRlcnJ1cHRzIHdlIGhhdmUgaGFuZGxlZC4gKi8KLSAJb3V0dygweDY4OTksIGlvYWRkciArIEVMM19DTUQpOyAvKiBBY2sgSVJRICovCi0gICAgIH0KLSAKLUBAIC00MDMsMTYgKzQzOSw2IEBACi0gCSAgICAgICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOwotICAgICB9Ci0gICAgIAotLSAgICBpZiAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgMHgwMSkgewotLQlpbnQgaSA9IDEwMDAwMDsKLS0JcHJpbnRrKCIlczogZXhpdGluZyBpbnRlcnJ1cHQgd2l0aCBzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsCi0tCSAgICAgICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOwotLQl3aGlsZSAoaS0tKQkJLyogRGVsYXkgbG9vcCB0byBzZWUgdGhlIG1lc3NhZ2UuICovCi0tCSAgICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7Ci0tCXdoaWxlICgoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgMHgwMDEwKSAgJiYgaSsrIDwgMjApCi0tCSAgICBvdXR3KDB4MDAsIGlvYWRkciArIFJYX1NUQVRVUyk7Ci0tICAgIH0KLS0KLSAgICAgZGV2LT5pbnRlcnJ1cHQgPSAwOwotICAgICByZXR1cm47Ci0gfQotQEAgLTQzMCw3ICs0NTYsOSBAQAotIH0KLSAKLSAvKiBVcGRhdGUgc3RhdGlzdGljcy4gIFdlIGNoYW5nZSB0byByZWdpc3RlciB3aW5kb3cgNiwgc28gdGhpcwotLSAgIG11c3QgYmUgcnVuIHNpbmdsZS10aHJlYWRlZC4gKi8KLSsgICBzaG91bGQgYmUgcnVuIHNpbmdsZS10aHJlYWRlZCBpZiB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4gVGhpcwotKyAgIGlzIGV4cGVjdGVkIHRvIGJlIGEgcmFyZSBvcGVyYXRpb24sIGFuZCBub3Qgd29ydGggYSBzcGVjaWFsCi0rICAgd2luZG93LXN0YXRlIHZhcmlhYmxlLiAqLwotIHN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotICAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBlbDNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKLUBAIC00NDAsNyArNDY4LDcgQEAKLSAgICAgLyogVHVybiBvZmYgc3RhdGlzdGljcyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCi0gICAgIG91dHcoMHhCMDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSAgICAgLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCi0tICAgIG91dHcoMHgwODA2LCBpb2FkZHIgKyBFTDNfQ01EKTsKLSsgICAgRUwzV0lORE9XKDYpOwotICAgICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMJKz0gaW5iKGlvYWRkciArIDApOwotICAgICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycwkrPSBpbmIoaW9hZGRyICsgMSk7Ci0gICAgIC8qIE11bHRpcGxlIGNvbGxpc2lvbnMuICovCSAgIGluYihpb2FkZHIgKyAyKTsKLUBAIC00NTQsMjUgKzQ4MiwxMSBAQAotICAgICBpbncoaW9hZGRyICsgMTIpOwotIAotICAgICAvKiBCYWNrIHRvIHdpbmRvdyAxLCBhbmQgdHVybiBzdGF0aXN0aWNzIGJhY2sgb24uICovCi0tICAgIG91dHcoMHgwODAxLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSsgICAgRUwzV0lORE9XKDEpOwotICAgICBvdXR3KDB4QTgwMCwgaW9hZGRyICsgRUwzX0NNRCk7Ci0gICAgIHJldHVybjsKLSB9Ci0gCi0tLyogUHJpbnQgc3RhdGlzdGljcyBvbiB0aGUga2VybmVsIGVycm9yIG91dHB1dC4gKi8KLS12b2lkIHByaW50a19zdGF0cyhzdHJ1Y3QgZW5ldF9zdGF0aXN0aWNzICpzdGF0cykKLS17Ci0tCi0tICAgIHByaW50aygiICBFdGhlcm5ldCBzdGF0aXN0aWNzOiAgUnggcGFja2V0cyAlNmQgIFR4IHBhY2tldHMgJTZkLlxuIiwKLS0JICAgc3RhdHMtPnJ4X3BhY2tldHMsIHN0YXRzLT50eF9wYWNrZXRzKTsKLS0gICAgcHJpbnRrKCIgICBDYXJyaWVyIGVycm9yczogICAlNmQuXG4iLCBzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMpOwotLSAgICBwcmludGsoIiAgIEhlYXJ0YmVhdCBlcnJvcnM6ICU2ZC5cbiIsIHN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzKTsKLS0gICAgcHJpbnRrKCIgICBDb2xsaXNpb25zOiAgICAgICAlNmQuXG4iLCBzdGF0cy0+Y29sbGlzaW9ucyk7Ci0tICAgIHByaW50aygiICAgUnggRklGTyBwcm9ibGVtczogJTZkLlxuIiwgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzKTsKLS0KLS0gICAgcmV0dXJuOwotLX0KLS0KLSBzdGF0aWMgaW50Ci0gZWwzX3J4KHN0cnVjdCBkZXZpY2UgKmRldikKLSB7Ci1AQCAtNDk4LDIxICs1MTIsMzIgQEAKLSAJfQotIAlpZiAoICghIChyeF9zdGF0dXMgJiAweDQwMDApKQotIAkgICAgfHwgISAocnhfc3RhdHVzICYgMHgyMDAwKSkgeyAvKiBEcmliYmxlIGJpdHMgYXJlIE9LLiAqLwotLQkgICAgc2hvcnQgbGVuZ3RoID0gcnhfc3RhdHVzICYgMHgzZmY7Ci0tCSAgICBpbnQgc2tzaXplID0gc2l6ZW9mKHN0cnVjdCBza19idWZmKSArIGxlbmd0aCArIDM7Ci0rCSAgICBzaG9ydCBwa3RfbGVuID0gcnhfc3RhdHVzICYgMHgzZmY7Ci0rCSAgICBpbnQgc2tzaXplID0gc2l6ZW9mKHN0cnVjdCBza19idWZmKSArIHBrdF9sZW4gKyAzOwotIAkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKLSAJICAgIHNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBrbWFsbG9jKHNrc2l6ZSwgR0ZQX0FUT01JQyk7Ci0gCi0gCSAgICBpZiAoZWwzX2RlYnVnID4gNCkKLSAJCXByaW50aygiICAgICAgIFJlY2VpdmluZyBwYWNrZXQgc2l6ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAotLQkJICAgICAgIGxlbmd0aCwgcnhfc3RhdHVzKTsKLSsJCSAgICAgICBwa3RfbGVuLCByeF9zdGF0dXMpOwotIAkgICAgaWYgKHNrYiAhPSBOVUxMKSB7Ci0tCQlza2ItPmxvY2sgPSAwOwotIAkJc2tiLT5tZW1fbGVuID0gc2tzaXplOwotIAkJc2tiLT5tZW1fYWRkciA9IHNrYjsKLSsJCXNrYi0+bGVuID0gcGt0X2xlbjsKLSsJCXNrYi0+ZGV2ID0gZGV2OwotKwotIAkJLyogJ3NrYisxJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLwotLQkJcG9ydF9yZWFkKGlvYWRkcitSWF9GSUZPLCAodm9pZCAqKShza2IrMSksICgobGVuZ3RoICsgMykgPj4gMikgPDwgMSk7Ci0tCQlpZiAoZGV2X3JpbnQoKHVuc2lnbmVkIGNoYXIgKilza2IsIGxlbmd0aCwgSU5fU0tCVUZGLGRldik9PSAwKXsKLSsJCXBvcnRfcmVhZF9sKGlvYWRkcitSWF9GSUZPLCAodm9pZCAqKShza2IrMSksCi0rCQkJICAgIChwa3RfbGVuICsgMykgPj4gMik7Ci0rCi0rI2lmZGVmIEhBVkVfTkVUSUZfUlgKLSsJCW5ldGlmX3J4KHNrYik7Ci0rCQlvdXR3KDB4NDAwMCwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFJ4IGRpc2NhcmQgKi8KLSsJCWNvbnRpbnVlOwotKyNlbHNlCi0rCQlza2ItPmxvY2sgPSAwOwotKwkJaWYgKGRldl9yaW50KCh1bnNpZ25lZCBjaGFyICopc2tiLCBwa3RfbGVuLAotKwkJCSAgICAgSU5fU0tCVUZGLGRldik9PSAwKXsKLSAJCSAgICBpZiAoZWwzX2RlYnVnID4gNikKLSAJCQlwcmludGsoIiAgICAgZGV2X3JpbnQoKSBoYXBweSwgc3RhdHVzICU0LjR4LlxuIiwKLSAJCQlpbmIoaW9hZGRyICsgRUwzX1NUQVRVUykpOwotQEAgLTUyNyw3ICs1NTIsOCBAQAotIAkJfSBlbHNlIHsKLSAJCSAgICBwcmludGsoIiVzOiByZWNlaXZlIGJ1ZmZlcnMgZnVsbC5cbiIsIGRldi0+bmFtZSk7Ci0gCQkgICAga2ZyZWVfcyhza2IsIHNrc2l6ZSk7Ci0tCQl9CSAgICAKLSsJCX0KLSsjZW5kaWYKLSAJICAgIH0gZWxzZSBpZiAoZWwzX2RlYnVnKQotIAkJcHJpbnRrKCIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWQuXG4iLAotIAkJICAgICAgIGRldi0+bmFtZSwgc2tzaXplKTsKLUBAIC01NjQsMjIgKzU5MCwyMSBAQAotICAgICBvdXR3KDB4MTgwMCwgaW9hZGRyICsgRUwzX0NNRCk7Ci0gICAgIG91dHcoMHg1MDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSAKLS0gICAgLyogVHVybiBvZmYgdGhpbm5ldCBwb3dlci4gKi8KLS0gICAgb3V0dygweGI4MDAsIGlvYWRkciArIEVMM19DTUQpOwotLQotLSAgICBpZiAoZWwzX2RlYnVnID4gMikgewotLQlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBlbDNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKLS0JcHJpbnRrKCIlczogU3RhdHVzIHdhcyAlNC40eC5cbiIsIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKLS0JcHJpbnRrX3N0YXRzKCZscC0+c3RhdHMpOwotKyAgICBpZiAoZGV2LT5pZl9wb3J0ID09IDMpCi0rCS8qIFR1cm4gb2ZmIHRoaW5uZXQgcG93ZXIuICovCi0rCW91dHcoMHhiODAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSsgICAgZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKLSsJLyogRGlzYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciwgaWZfcG9ydCBtYXkgY2hhbmdlIGVyZSBuZXh0IG9wZW4oKS4gKi8KLSsJRUwzV0lORE9XKDQpOwotKwlvdXR3KGludyhpb2FkZHIgKyBXTjRfTUVESUEpICYgfiAweDAwQzAsIGlvYWRkciArIFdONF9NRURJQSk7Ci0gICAgIH0KLSAKLS0gICAgLyogRnJlZSB0aGUgaW50ZXJydXB0IGxpbmUuICovCi0gICAgIGZyZWVfaXJxKGRldi0+aXJxKTsKLS0gICAgb3V0dygweDEwMDAsIGlvYWRkciArIEVMM19DTUQpOwotKyAgICAvKiBTd2l0Y2hpbmcgYmFjayB0byB3aW5kb3cgMCBkaXNhYmxlcyB0aGUgSVJRLiAqLwotKyAgICBFTDNXSU5ET1coMCk7Ci0rICAgIC8qIEJ1dCB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIElSUSBsaW5lIHNlbGVjdCBhbnl3YXkuICovCi0gICAgIG91dHcoMHgwZjAwLCBpb2FkZHIgKyA4KTsKLSAKLS0gICAgLyogU3dpdGNoIGJhY2sgdG8gcmVnaXN0ZXIgd2luZG93IDAuICovCi0tICAgIG91dHcoMHgwODAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKLSAKLSAgICAgaXJxMmRldl9tYXBbZGV2LT5pcnFdID0gMDsKLSAKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0LzgzOTAuYyBsaW51eC9uZXQvaW5ldC84MzkwLmMKLS0tLSBwbDEyL2xpbnV4L25ldC9pbmV0LzgzOTAuYwlGcmkgQXVnIDEzIDA0OjI0OjMxIDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC84MzkwLmMJRnJpIFNlcCAgMyAyMzoyNzo1NCAxOTkzCi1AQCAtMTQsMTUgKzE0LDggQEAKLSAqLwotIAotIHN0YXRpYyBjaGFyICp2ZXJzaW9uID0KLS0gICAgIjgzOTAuYzp2MC45OS0xMiA4LzkvOTMgZm9yIDAuOTkuMTIrIERvbmFsZCBCZWNrZXIgKGJlY2tlckBzdXBlci5vcmcpXG4iOwotKyAgICAiODM5MC5jOnYwLjk5LTEzIDkvMy85MyBmb3IgMC45OS4xMyBEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKVxuIjsKLSAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0tI2lmICFkZWZpbmVkKEVMMikgJiYgIWRlZmluZWQoTkUyMDAwKSAmJiAhZGVmaW5lZChXRDgweDMpICYmICFkZWZpbmVkKEhQTEFOKQotLS8qIFRoZXkgZG9uJ3Qga25vdyB3aGF0IHRoZXkgd2FudCAtLSBnaXZlIGl0IGFsbCB0byB0aGVtISAqLwotLSNkZWZpbmUgRUwyCi0tI2RlZmluZSBORTIwMDAKLS0jZGVmaW5lIFdEODB4MwotLSNkZWZpbmUgSFBMQU4KLS0jZW5kaWYKLSAKLSAvKgotICAgQnJhaW5kYW1hZ2UgcmVtYWluaW5nOgotQEAgLTk0LDEyICs4Nyw2IEBACi0gc3RhdGljIHZvaWQgTlM4MzkwX3RyaWdnZXJfc2VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCi0gCQkJCWludCBzdGFydF9wYWdlKTsKLSAKLS1leHRlcm4gaW50IGVsMmF1dG9wcm9iZShpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotLWV4dGVybiBpbnQgZWwycHJvYmUoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLS1leHRlcm4gaW50IG5lcHJvYmUoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLS1leHRlcm4gaW50IHdkcHJvYmUoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLS1leHRlcm4gaW50IGhwcHJvYmUoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLS0KLSBzdHJ1Y3Qgc2lnYWN0aW9uIGVpX3NpZ2FjdGlvbiA9IHsgZWlfaW50ZXJydXB0LCAwLCAwLCBOVUxMLCB9OwotIAwKLSAvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyByb3V0aW5lIGdvZXMgYWxsLW91dCwgc2V0dGluZyBldmVyeXRoaW5nCi1AQCAtMjYwLDcgKzI0Nyw3IEBACi0gZWlfaW50ZXJydXB0KGludCByZWdfcHRyKQotIHsKLSAgICAgaW50IGlycSA9IC0oKChzdHJ1Y3QgcHRfcmVncyAqKXJlZ19wdHIpLT5vcmlnX2VheCsyKTsKLS0gICAgc3RydWN0IGRldmljZSAqZGV2ID0gaXJxMmRldl9tYXBbaXJxXTsKLSsgICAgc3RydWN0IGRldmljZSAqZGV2ID0gKHN0cnVjdCBkZXZpY2UgKikoaXJxMmRldl9tYXBbaXJxXSk7Ci0gICAgIGludCBlODM5MF9iYXNlOwotICAgICBpbnQgaW50ZXJydXB0cywgYm9ndXNjb3VudCA9IDA7Ci0gICAgIHN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsOwotQEAgLTU4MCwzNSArNTY3LDE0IEBACi0gICAgIHJldHVybiAmZWlfbG9jYWwtPnN0YXQ7Ci0gfQotIAotLWludAotLWV0aGlmX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotLXsKLS0gICAgaWYgKDEKLS0jaWZkZWYgV0Q4MHgzCi0tCSYmICEgd2Rwcm9iZShkZXYtPmJhc2VfYWRkciwgZGV2KQotLSNlbmRpZgotLSNpZmRlZiBFTDIKLS0JJiYgISBlbDJhdXRvcHJvYmUoZGV2LT5iYXNlX2FkZHIsIGRldikKLS0jZW5kaWYKLS0jaWZkZWYgTkUyMDAwCi0tCSYmICEgbmVwcm9iZShkZXYtPmJhc2VfYWRkciwgZGV2KQotLSNlbmRpZgotLSNpZmRlZiBIUExBTgotLQkmJiAhIGhwcHJvYmUoZGV2LT5iYXNlX2FkZHIsIGRldikKLS0jZW5kaWYKLS0JJiYgMSApIHsKLS0JcmV0dXJuIDE7CS8qIC1FTk9ERVYgb3IgLUVBR0FJTiB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlLiAqLwotLSAgICB9Ci0tICAgIGlmIChlaV9kZWJ1ZyA+IDEpCi0tCXByaW50ayh2ZXJzaW9uKTsKLS0gICAgcmV0dXJuIDA7Ci0tfQotLQotLS8qIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0rLyogSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgODM5MCBkZXZpY2Ugc3RydWN0dXJlLiAqLwotIGludAotIGV0aGRldl9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLSB7Ci0gICAgIGludCBpOwotKwotKyAgICBpZiAoZWlfZGVidWcgPiAxKQotKwlwcmludGsodmVyc2lvbik7Ci0gCi0gICAgIGZvciAoaSA9IDA7IGkgPCBERVZfTlVNQlVGRlM7IGkrKykKLSAJZGV2LT5idWZmc1tpXSA9IE5VTEw7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9uZXQvaW5ldC84MzkwLmggbGludXgvbmV0L2luZXQvODM5MC5oCi0tLS0gcGwxMi9saW51eC9uZXQvaW5ldC84MzkwLmgJRnJpIEF1ZyAxMyAwNDoyNDozMiAxOTkzCi0rKysgbGludXgvbmV0L2luZXQvODM5MC5oCU1vbiBBdWcgMzAgMjI6NDM6MTggMTk5MwotQEAgLTgsNiArOCw3IEBACi0gI2RlZmluZSBfODM5MF9oCi0gCi0gI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotIAotICNkZWZpbmUgVFhfMlhfUEFHRVMgMTIKLSAjZGVmaW5lIFRYXzFYX1BBR0VTIDYKLUBAIC0yNSwxMCArMjYsMTIgQEAKLSBleHRlcm4gaW50IGVpX29wZW4oc3RydWN0IGRldmljZSAqZGV2KTsKLSBleHRlcm4gdm9pZCBlaV9pbnRlcnJ1cHQoaW50IHJlZ19wdHIpOwotIAotKyNpZm5kZWYgSEFWRV9BVVRPSVJRCi0gLyogRnJvbSBhdXRvX2lycS5jICovCi0gZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKmlycTJkZXZfbWFwWzE2XTsKLSBleHRlcm4gdm9pZCBhdXRvaXJxX3NldHVwKGludCB3YWl0dGltZSk7Ci0gZXh0ZXJuIGludCBhdXRvaXJxX3JlcG9ydChpbnQgd2FpdHRpbWUpOwotKyNlbmRpZgotIAotIC8qIE1vc3Qgb2YgdGhlc2UgZW50cmllcyBzaG91bGQgYmUgaW4gJ3N0cnVjdCBkZXZpY2UnIChvciBtb3N0IG9mIHRoZQotICAgIHRoaW5ncyBpbiB0aGVyZSBzaG91bGQgYmUgaGVyZSEpICovCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9uZXQvaW5ldC9DT05GSUcgbGludXgvbmV0L2luZXQvQ09ORklHCi0tLS0gcGwxMi9saW51eC9uZXQvaW5ldC9DT05GSUcJRnJpIEF1ZyAgNiAyMDo0NjoyNyAxOTkzCi0rKysgbGludXgvbmV0L2luZXQvQ09ORklHCUZyaSBTZXAgIDMgMjM6NTQ6MzAgMTk5MwotQEAgLTEsNTMgKzEsNDcgQEAKLSAjCi0tIyBTZXQgdGhlIGFkZHJlc3MgYW5kIElSUSBoZXJlLiBUaGUgbmUuYyBhbmQgM2M1MDMgZHJpdmVyIHdpbGwgYXV0b3Byb2JlCi0rIyBTZXQgYW55IHNwZWNpYWwgb3B0aW9ucyBoZXJlLiAgTW9zdCBkcml2ZXJzIHdpbGwgYXV0b3Byb2JlL2F1dG9JUlEKLSAjIGlmIHlvdSBzZXQgdGhlIGFkZHJlc3Mgb3IgSVJRIHRvIHplcm8sIHNvIHdlIGRvIHRoYXQgYnkgZGVmYXVsdC4KLS0jIENhcmRzIHN1cHBvcnR0ZWQ6Ci0rIyBDYXJkcyBhbmQgb3B0aW9ucyBzdXBwb3J0ZWQ6Ci0gIwotLSMJV0Q4MHgzCQlUaGUgV2VzdGVybiBEaWdpdGFsIChTTUMpIFdEODB4MyBkcml2ZXIKLS0jCSAgV0RfU0hNRU09eHh4CUZvcmNlcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2hhcmVkIG1lbW9yeQotLSMJICBGT1JDRV84QklUCUZvcmNlIGNhcmQgaW50byA4LWJpdCBtb2RlIChXRDgwMDMpCi0tIwlORTIwMDAJCVRoZSBOb3ZlbGwgTkUtMjAwMCBkcml2ZXIKLS0jCUhQTEFOCQlUaGUgSFAtTEFOIGRyaXZlcgotLSMJRUwxCQlUaGUgM2M1MDEgRXRoZXJMaW5rIEkgZHJpdmVyIChzb3VyY2UgbWlzc2luZz8pCi0tIwlFTDIJCVRoZSAzYzUwMyBFdGhlckxpbmsgSUkgZHJpdmVyCi0tIwkgIEVMMl9BVUkJU2VsZWN0cyB0aGUgQVVJIHBvcnQgaW5zdGVhZCBvZiB0aGUgQk5DIHBvcnQKLS0jCVBMSVAJCVRoZSBDcnlud2UgUEwvSVAgZHJpdmVyCi0tIwlTTElQCQlUaGUgTWljcm9XYWx0IFNMSVAgZHJpdmVyCi0rIyAgRUlfREVCVUcJCVNldCB0aGUgZGVidWdnaW5nIGxldmVsIGZvciA4MzkwLWJhc2VkIGJvYXJkcwotKyMgIENPTkZJR19XRDgweDMJVGhlIFdlc3Rlcm4gRGlnaXRhbCAoU01DKSBXRDgweDMgZHJpdmVyCi0rIwlXRF9TSE1FTT14eHgJRm9yY2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBzaGFyZWQgbWVtb3J5Ci0rIwlXRF9ub19tYXBvdXQJRG9uJ3QgbWFwIG91dCB0aGUgc2hhcmVkIG1lbW9yeSAoZmFzdGVyLCBidXQKLSsjCQkJeW91ciBtYWNoaW5lIG1heSBub3Qgd2FybS1ib290KS4KLSsjICBDT05GSUdfTkUyMDAwCVRoZSBORS1bMTJdMDAwIGNsb25lIGRyaXZlci4KLSsjCVBBQ0tFVEJVRl9NRU1TSVpFICBBbGxvd3MgYW4gZXh0cmEtbGFyZ2UgcGFja2V0IGJ1ZmZlciB0byBiZQotKyMJCQl1c2VkLiAgVXN1YWxseSBwb2ludGxlc3MgdW5kZXIgTGludXguCi0rIwlzaG93X2FsbF9TQVBST00gIFNob3cgdGhlIGVudGlyZSBhZGRyZXNzIFBST00sIG5vdCBqdXN0IHRoZQotKyMJCQlldGhlcm5ldCBhZGRyZXNzLCBkdXJpbmcgYm9vdC4KLSsjCXJ3X2J1Z2ZpeAlQYXRjaCBhbiBvYnNjdXJlIGJ1ZyB3aXRoIGEgdmVyc2lvbiBvZiB0aGUgODM5MC4KLSsjICBDT05GSUdfSFBMQU4JCVRoZSBIUC1MQU4gZHJpdmVyIChmb3IgODM5MC1iYXNlZCBib2FyZHMgb25seSkuCi0rIwlyd19idWdmaXgJRml4IHRoZSBzYW1lIG9ic2N1cmUgYnVnLgotKyMgIENPTkZJR19FTDEJCVRoZSAzYzUwMSBkcml2ZXIgKGp1c3Qgam9raW5nLCBuZXZlciByZWxlYXNlZCkKLSsjICBDT05GSUdfRUwyCQlUaGUgM2M1MDMgRXRoZXJMaW5rIElJIGRyaXZlcgotKyMJRUwyX0FVSQkJRGVmYXVsdCB0byB0aGUgQVVJIHBvcnQgaW5zdGVhZCBvZiB0aGUgQk5DIHBvcnQKLSsjCW5vX3Byb2JlX25vbnNoYXJlZF9tZW1vcnkgIERvbid0IHByb2JlIGZvciBwcm9ncmFtbWVkLUkvTyBib2FyZHMuCi0rIwlFTDJNRU1URVNUCVRlc3Qgc2hhcmVkIG1lbW9yeSBhdCBib290LXRpbWUuCi0rIyAgQ09ORklHX0VMMwotKyMJRUwzX0RFQlVHCVNldCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgbGV2ZWwuCi0rIyAgQ09ORklHX0FUMTUwMAotKyMJTEFOQ0VfREVCVUcJU2V0IHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZSBsZXZlbC4KLSsjCURFRkFVTFRfRE1BCUNoYW5nZSB0aGUgZGVmYXVsdCBETUEgdG8gb3RoZXIgdGhhbiA1LgotKyMgIENPTkZJR19QTElQCQlUaGUgQ3J5bndyLXByb3RvY29sIFBML0lQIGRyaXZlcgotKyMgIFNMSVAJCQlUaGUgTWljcm9XYWx0IFNMSVAgZHJpdmVyCi0gIwkgIFNMX0RVTVAJVXNlcyB0aGUgImR1bXAgZnJhbWUiIGRlYnVnIGNvZGUKLSAjCSAgU0xfQ09NUFJFU1NFRCBVc2UgQ1NMSVAKLS0jCURfTElOSwkJVGhlIEQtTGluayBERS02MDAgUG9ydGFibGUgRXRoZXJuZXQgQWRhcHRvci4KLSsjICBEX0xJTksJCVRoZSBELUxpbmsgREUtNjAwIFBvcnRhYmxlIEV0aGVybmV0IEFkYXB0b3IuCi0gIwkgIERfTElOS19JTwlUaGUgRC1MaW5rIEkvTyBhZGRyZXNzICgweDM3OCA9PSBkZWZhdWx0KQotICMJICBEX0xJTktfSVJRCVRoZSBELUxpbmsgSVJRIG51bWJlciB0byB1c2UgKElSUTcgPT0gZGVmYXVsdCkKLSAjCSAgRF9MSU5LX0RFQlVHCUVuYWJsZSBvciBkaXNhYmxlIEQtTGluayBkZWJ1Z2dpbmcKLSAjCi0tIyBOb3RlOiBmb3IgbW9zdCBXRCAoU01DKSBjYXJkcywgdGhlIEF1dG9Qcm9iZSBkb2Vzbid0IHdvcmsuICBZb3UgaGF2ZQotLSMJdG8gZm9yY2UgdGhvc2UgY2FyZHMgaW50byBvcGVyYXRpb24sIGJ5IHNwZWNpZnlpbmcgdGhlIEkvTyBhZGQtCi0tIwlyZXNzIChFSTgzOTA9eHh4KSwgdGhlIElSUSAoRUk4MzkwX0lSUT14eHgpIGFuZCB0aGUgYWRkcmVzcyBvZgotLSMJdGhlIHNoYXJlZCBtZW1vcnkgKFdEX1NITUVNPXh4eHgpLiAgQWxsIG90aGVyIHN1cHBvcnRlZCBjYXJkcwotLSMJYmVoYXZlIGxpa2UgdGhleSBzaG91bGQsIHlvdSBjYW4gbGVhdmUgdGhlIHZhbHVlcyB0byAwLiAtRnZLCi0tIwotLQotLSMgQ29tbWVudCBvdXQgdGhlIGxpbmVzIHlvdSBkb24ndCB3YW50Li4KLS0KLS0jQ0FSRFMJOj0gJChDQVJEUykgLURTTElQCi0tI0NBUkRTCTo9ICQoQ0FSRFMpIC1EUExJUAotLUNBUkRTCTo9ICQoQ0FSRFMpIC1EV0Q4MHgzCi0tQ0FSRFMJOj0gJChDQVJEUykgLURORTIwMDAKLS1DQVJEUwk6PSAkKENBUkRTKSAtREhQTEFOCi0tQ0FSRFMJOj0gJChDQVJEUykgLURFTDIKLS1DQVJEUwk6PSAkKENBUkRTKSAtRERfTElOSwotLUNBUkRTCTo9ICQoQ0FSRFMpIC1EQ09ORklHX0FUMTUwMAotIAotLSMgRm9yIFdEIGFuZCBTTUMgY2FyZHM6Ci0tI09QVFMJCT0gLURFSTgzOTA9MHgyODAgLURFSTgzOTBfSVJRPTE1Ci0tI1dEX09QVFMJCT0gLURXRF9TSE1FTT0weENDMDAwIC1VRk9SQ0VfOEJJVAotLU9QVFMJCT0gLURFSTgzOTA9MCAtREVJODM5MF9JUlE9MAotLVdEX09QVFMJCT0gLURXRF9TSE1FTT0wCi0rIyBUaGlzIGlzIGF0IHRoZSB0b3AgbGV2ZWwgd2l0aCAnbWFrZSBjb25maWcnCi0rQ0FSRFMgPQotIAotLSMgRm9yIGFsbCBvdGhlciBjYXJkczoKLS0jT1BUUwkJPSAtREVJODM5MD0wIC1ERUk4MzkwX0lSUT0wCi0tI1dEX09QVFMJPSAtRFVEX1NITUVNPTB4Q0MwMDAgLVVGT1JDRV84QklUCi0gCi0rT1BUUwkJPSAjLURFSTgzOTA9MCAtREVJODM5MF9JUlE9MAotK1dEX09QVFMJCT0gIy1EV0RfU0hNRU09MAotIEVMMl9PUFRTCT0gIy1VRUwyX0FVSQotIE5FX09QVFMJCT0KLSBIUF9PUFRTCQk9Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9uZXQvaW5ldC9NYWtlZmlsZSBsaW51eC9uZXQvaW5ldC9NYWtlZmlsZQotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvTWFrZWZpbGUJRnJpIEF1ZyAgNiAyMDo0NDoxNCAxOTkzCi0rKysgbGludXgvbmV0L2luZXQvTWFrZWZpbGUJRnJpIFNlcCAgMyAyMzo1NzoyNSAxOTkzCi1AQCAtMjAsNyArMjAsNyBAQAotIE9CSlMJPSBTcGFjZS5vIHNvY2subyB1dGlscy5vIHJvdXRlLm8gcHJvYy5vIHRpbWVyLm8gcHJvdG9jb2wubyBsb29wYmFjay5vIFwKLSAJICBldGgubyBwYWNrZXQubyBhcnAubyBkZXYubyA4MzkwLm8gd2QubyBuZS5vIGVsMi5vIGhwLm8gcGxpcC5vIFwKLSAJICBzbGlwLm8gc2xoYy5vIGRfbGluay5vIGF1dG9faXJxLm8gaXAubyByYXcubyBpY21wLm8gdGNwLm8gdWRwLm9cCi0tCSAgbGFuY2UubwotKwkgIGxhbmNlLm8gM2M1MDkubyAjaXAtZnJhZy5vCi0gCi0gaWZkZWYgQ09ORklHX0lORVQKLSAKLUBAIC0zOCwzNiArMzgsMzkgQEAKLSBpbmNsdWRlCUNPTkZJRwotIAotIAotLVNwYWNlLm86CUNPTkZJRyBTcGFjZS5jIE1ha2VmaWxlCi0rU3BhY2UubzoJU3BhY2UuYyBDT05GSUcgL3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgKLSAJCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKE9QVFMpICQoQ0FSRFMpICQoRExfT1BUUykgXAotLQkJCQkJCQktYyBTcGFjZS5jIC1vICRACi0rCQkJCQkJCS1jICQ8IC1vICRACi0gCi0tODM5MC5vOgkJQ09ORklHIDgzOTAuYyBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoQ0FSRFMpIC1jIDgzOTAuYyAtbyAkQAotKzgzOTAubzoJCTgzOTAuYyBDT05GSUcKLSsJCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKENBUkRTKSAtYyAkPCAtbyAkQAotIAotLXdkLm86CQlDT05GSUcgd2QuYyBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoV0RfT1BUUykgLWMgd2QuYyAtbyAkQAotK3dkLm86CQl3ZC5jIENPTkZJRwotKwkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoV0RfT1BUUykgLWMgJDwgLW8gJEAKLSAKLS1lbDIubzoJCUNPTkZJRyBlbDIuYyBlbDJyZWcuaCBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoRUwyX09QVFMpIC1jIGVsMi5jIC1vICRACi0rZWwyLm86CQllbDIuYyBDT05GSUcgZWwycmVnLmgKLSsJCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEVMMl9PUFRTKSAtYyAkPCAtbyAkQAotIAotLW5lLm86CQlDT05GSUcgbmUuYyBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoTkVfT1BUUykgLWMgbmUuYyAtbyAkQAotK25lLm86CQluZS5jIENPTkZJRwotKwkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoTkVfT1BUUykgLWMgJDwgLW8gJEAKLSAKLS1ocC5vOgkJQ09ORklHIGhwLmMgTWFrZWZpbGUKLS0JCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEhQX09QVFMpIC1jIGhwLmMgLW8gJEAKLStocC5vOgkJaHAuYyBDT05GSUcKLSsJCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEhQX09QVFMpIC1jICQ8IC1vICRACi0gCi0tcGxpcC5vOgkJQ09ORklHIHBsaXAuYyBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoUExJUF9PUFRTKSAtYyBwbGlwLmMgLW8gJEAKLStwbGlwLm86CQlwbGlwLmMgQ09ORklHCi0rCQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChQTElQX09QVFMpIC1jICQ8IC1vICRACi0gCi0tc2xpcC5vOgkJQ09ORklHIHNsaXAuYyBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoU0xJUF9PUFRTKSAtYyBzbGlwLmMgLW8gJEAKLStzbGlwLm86CQlzbGlwLmMgQ09ORklHCi0rCQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChTTElQX09QVFMpIC1jICQ8IC1vICRACi0gCi0tZF9saW5rLm86CUNPTkZJRyBkX2xpbmsuYyBNYWtlZmlsZQotLQkJJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoRExfT1BUUykgLWMgZF9saW5rLmMgLW8gJEAKLStkX2xpbmsubzoJZF9saW5rLmMgQ09ORklHCi0rCQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChETF9PUFRTKSAtYyAkPCAtbyAkQAotIAotLWxhbmNlLm86CUNPTkZJRyBsYW5jZS5jIE1ha2VmaWxlCi0tCQkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChBVF9PUFRTKSAtYyBsYW5jZS5jIC1vICRACi0rbGFuY2UubzoJbGFuY2UuYyBDT05GSUcKLSsJCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEFUX09QVFMpIC1jICQ8IC1vICRACi0rCi0rM2M1MDkubzoJM2M1MDkuYyBDT05GSUcKLSsJCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEVMM19PUFRTKSAtYyAkPCAtbyAkQAotIAotIHN1YmRpcnM6CWR1bW15Ci0gCQlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpKTsgZG9uZQotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbmV0L2luZXQvU3BhY2UuYyBsaW51eC9uZXQvaW5ldC9TcGFjZS5jCi0tLS0gcGwxMi9saW51eC9uZXQvaW5ldC9TcGFjZS5jCUZyaSBBdWcgMTMgMDQ6Mjc6NTggMTk5MwotKysrIGxpbnV4L25ldC9pbmV0L1NwYWNlLmMJU2F0IFNlcCAgNCAxMzo0Mjo1NSAxOTkzCi1AQCAtMzMsNiArMzMsNzMgQEAKLSAjZGVmaW5lCU5FWFRfREVWCU5VTEwKLSAKLSAKLSsvKiBBIHVuaWZlZCBldGhlcm5ldCBkZXZpY2UgcHJvYmUuICBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBoYXZlIGV2ZXJ5Ci0rICAgZXRoZXJuZXQgYWRhcHRvciBoYXZlIHRoZSBuYW1lICJldGhbMDEyMy4uLl0iLgotKyAgICovCi0rCi0rZXh0ZXJuIGludCB3ZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotK2V4dGVybiBpbnQgZWwyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0rZXh0ZXJuIGludCBuZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotK2V4dGVybiBpbnQgaHBfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKLStleHRlcm4gaW50IHpuZXRfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKLStleHRlcm4gaW50IGV4cHJlc3NfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKLStleHRlcm4gaW50IGVsM19wcm9iZShzdHJ1Y3QgZGV2aWNlICopOwotK2V4dGVybiBpbnQgYXRwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7Ci0rZXh0ZXJuIGludCBhdDE1MDBfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKLStleHRlcm4gaW50IGRlcGNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7Ci0rZXh0ZXJuIGludCBlbDFfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKLSsKLStzdGF0aWMgaW50Ci0rZXRoaWZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotK3sKLSsgICAgc2hvcnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0rCi0rICAgIGlmIChiYXNlX2FkZHIgPCAwICB8fCAgYmFzZV9hZGRyID09IDEpCi0rCXJldHVybiAxOwkJLyogRU5YSU8gKi8KLSsKLSsgICAgaWYgKDEKLSsjaWYgZGVmaW5lZChDT05GSUdfV0Q4MHgzKSB8fCBkZWZpbmVkKFdEODB4MykKLSsJJiYgd2RfcHJvYmUoZGV2KQotKyNlbmRpZgotKyNpZiBkZWZpbmVkKENPTkZJR19FTDIpIHx8IGRlZmluZWQoRUwyKQotKwkmJiBlbDJfcHJvYmUoZGV2KQotKyNlbmRpZgotKyNpZiBkZWZpbmVkKENPTkZJR19ORTIwMDApIHx8IGRlZmluZWQoTkUyMDAwKQotKwkmJiBuZV9wcm9iZShkZXYpCi0rI2VuZGlmCi0rI2lmIGRlZmluZWQoQ09ORklHX0hQTEFOKSB8fCBkZWZpbmVkKEhQTEFOKQotKwkmJiBocF9wcm9iZShkZXYpCi0rI2VuZGlmCi0rI2lmZGVmIENPTkZJR19BVDE1MDAKLSsJJiYgYXQxNTAwX3Byb2JlKGRldikKLSsjZW5kaWYKLSsjaWZkZWYgQ09ORklHX0VMMwotKwkmJiBlbDNfcHJvYmUoZGV2KQotKyNlbmRpZgotKyNpZmRlZiBDT05GSUdfWk5FVAotKwkmJiB6bmV0X3Byb2JlKGRldikKLSsjZW5kaWYKLSsjaWZkZWYgQ09ORklHX0VFWFBSRVNTCi0rCSYmIGV4cHJlc3NfcHJvYmUoZGV2KQotKyNlbmRpZgotKyNpZmRlZiBDT05GSUdfQVRQCQkvKiBBVC1MQU4tVEVDIChSZWFsVGVrKSBwb2NrZXQgYWRhcHRvci4gKi8KLSsJJiYgYXRwX3Byb2JlKGRldikKLSsjZW5kaWYKLSsjaWZkZWYgQ09ORklHX0RFUENBCi0rCSYmIGRlcGNhX3Byb2JlKGRldikKLSsjZW5kaWYKLSsjaWZkZWYgQ09ORklHX0VMMQotKwkmJiBlbDFfcHJvYmUoZGV2KQotKyNlbmRpZgotKwkmJiAxICkgewotKwlyZXR1cm4gMTsJLyogLUVOT0RFViBvciAtRUFHQUlOIHdvdWxkIGJlIG1vcmUgYWNjdXJhdGUuICovCi0rICAgIH0KLSsgICAgcmV0dXJuIDA7Ci0rfQotKwotKwotKy8qIFRoaXMgcmVtYWlucyBzZXBlcmF0ZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBhZGRyIGFuZCBJUlEgdG8gYmUKLSsgICBzZXQuICovCi0gI2lmIGRlZmluZWQoRF9MSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ERTYwMCkKLSAgICAgZXh0ZXJuIGludCBkX2xpbmtfaW5pdChzdHJ1Y3QgZGV2aWNlICopOwotICAgICBzdGF0aWMgc3RydWN0IGRldmljZSBkX2xpbmtfZGV2ID0gewotQEAgLTUxLDEwMSArMTE4LDMyIEBACi0gIyAgIGRlZmluZSBORVhUX0RFVgkoJmRfbGlua19kZXYpCi0gI2VuZGlmCi0gCi0tI2lmZGVmIENPTkZJR19FTDEKLS0jZXJyb3IgCi0tIyAgIGlmbmRlZiBFTDFfSVJRCi0tIwlkZWZpbmUgRUwxX0lSUSA5Ci0tIyAgIGVuZGlmCi0tIyAgIGlmbmRlZiBFTDEKLS0jCWRlZmluZSBFTDEgMAotLSMgICBlbmRpZgotLSAgICBleHRlcm4gaW50IGVsMV9pbml0KHN0cnVjdCBkZXZpY2UgKik7Ci0tICAgIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGVsMV9kZXYgPSB7Ci0tICAgICAgICAiZWwwIiwgMCwgMCwgMCwgMCwgRUwxLAlFTDFfSVJRLCAwLCAwLCAwLCBORVhUX0RFViwgZWwxX2luaXQKLS0gICAgfTsKLS0jICAgdW5kZWYgTkVYVF9ERVYKLS0jICAgZGVmaW5lIE5FWFRfREVWCSgmZWwxX2RldikKLS0jZW5kaWYgIC8qIEVMMSAqLwotLQotLSNpZmRlZiBDT05GSUdfREVQQ0EKLS0gICAgZXh0ZXJuIGludCBkZXBjYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOwotLSAgICBzdGF0aWMgc3RydWN0IGRldmljZSBkZXBjYV9kZXYgPSB7Ci0tICAgICAgICAiZGVwY2EwIiwgMCwwLDAsMCwgMCwgMCwgMCwgMCwgMCwgTkVYVF9ERVYsIGRlcGNhX3Byb2JlLAotLSAgICB9OwotLSMgICB1bmRlZiBORVhUX0RFVgotLSMgICBkZWZpbmUgTkVYVF9ERVYJKCZkZXBjYV9kZXYpCi0tI2VuZGlmICAvKiBDT05GSUdfREVQQ0EgKi8KLS0KLS0KLS0jaWZkZWYgQ09ORklHX0FUUAkJLyogQVQtTEFOLVRFQyAoUmVhbFRlaykgcG9ja2V0IGFkYXB0b3IuICovCi0tICAgIGV4dGVybiBpbnQgYXRwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7Ci0tICAgIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGF0cF9kZXYgPSB7Ci0tICAgICAgICAiYXRwMCIsIDAsMCwwLDAsIDAsIDAsIDAsIDAsIDAsIE5FWFRfREVWLCBhdHBfcHJvYmUsCi0tICAgIH07Ci0tIyAgIHVuZGVmIE5FWFRfREVWCi0tIyAgIGRlZmluZSBORVhUX0RFVgkoJmF0cF9kZXYpCi0tI2VuZGlmICAvKiBDT05GSUdfQVRQICovCi0tCi0tI2lmZGVmIENPTkZJR19FTDMKLS0gICAgZXh0ZXJuIGludCBlbDNfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKLS0gICAgc3RhdGljIHN0cnVjdCBkZXZpY2UgZWxpaWkwX2RldiA9IHsKLS0gICAgICAgICJlbGlpaTAiLCAwLDAsMCwwLCAwLCAwLCAwLCAwLCAwLCBORVhUX0RFViwgZWwzX3Byb2JlLAotLSAgICB9OwotLSMgICB1bmRlZiBORVhUX0RFVgotLSMgICBkZWZpbmUgTkVYVF9ERVYJKCZlbGlpaTBfZGV2KQotLSNlbmRpZiAgLyogQ09ORklHXzNDNTA5IGFrYSBFTDMgKi8KLS0KLS0jaWZkZWYgQ09ORklHX1pORVQKLS0gICAgZXh0ZXJuIGludCB6bmV0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7Ci0tICAgIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIHpuZXRfZGV2ID0gewotLQkiem5ldCIsIDAsMCwwLDAsIDAsIDAsIDAsIDAsIDAsIE5FWFRfREVWLCB6bmV0X3Byb2JlLCB9OwotLSMgICB1bmRlZiBORVhUX0RFVgotLSMgICBkZWZpbmUgTkVYVF9ERVYJKCZ6bmV0X2RldikKLS0jZW5kaWYgIC8qIENPTkZJR19aTkVUICovCi0rLyogVGhlIGZpcnN0IGRldmljZSBkZWZhdWx0cyB0byBJL08gYmFzZSAnMCcsIHdoaWNoIG1lYW5zIGF1dG9wcm9iZS4gKi8KLSsjaWZkZWYgRUk4MzkwCi0rIyBkZWZpbmUgRVRIMF9BRERSIEVJODM5MAotKyNlbHNlCi0rIyBkZWZpbmUgRVRIMF9BRERSIDAKLSsjZW5kaWYKLSsjaWZkZWYgRUk4MzkwX0lSUQotKyMgZGVmaW5lIEVUSDBfSVJRIEVJODM5MF9JUlEKLSsjZWxzZQotKyMgZGVmaW5lIEVUSDBfSVJRIDAKLSsjZW5kaWYKLSsvKiAiZXRoMCIgZGVmYXVsdHMgdG8gYXV0b3Byb2JlLCBvdGhlciB1c2UgYSBiYXNlIG9mICItMHgyMCIsICJkb24ndCBwcm9iZSIuCi0rICAgRW5hYmxlIHRoZXNlIHdpdGggYm9vdC10aW1lIHNldHVwLiAwLjk5cGwxMysgY2FuIG9wdGlvbmFsbHkgYXV0b3Byb2JlLiAqLwotIAotLSNpZmRlZiBDT05GSUdfRUVYUFJFU1MKLS0gICAgZXh0ZXJuIGludCBleHByZXNzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7Ci0tICAgIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGV4cHJlc3MwX2RldiA9IHsKLS0JImV4cDAiLCAwLDAsMCwwLCAwLCAwLCAwLCAwLCAwLCBORVhUX0RFViwgZXhwcmVzc19wcm9iZSwgfTsKLS0jICAgdW5kZWYgTkVYVF9ERVYKLS0jICAgZGVmaW5lIE5FWFRfREVWCSgmZXhwcmVzczBfZGV2KQotLSNlbmRpZiAgLyogQ09ORklHX0VFUFJFU1MgKi8KLStzdGF0aWMgc3RydWN0IGRldmljZSBldGgzX2RldiA9IHsKLSsgICAgImV0aDMiLCAwLDAsMCwwLDB4ZmZlMCAvKiBJL08gYmFzZSovLCAwLDAsMCwwLCBORVhUX0RFViwgZXRoaWZfcHJvYmUgfTsKLStzdGF0aWMgc3RydWN0IGRldmljZSBldGgyX2RldiA9IHsKLSsgICAgImV0aDIiLCAwLDAsMCwwLDB4ZmZlMCAvKiBJL08gYmFzZSovLCAwLDAsMCwwLCAmZXRoM19kZXYsIGV0aGlmX3Byb2JlIH07Ci0rc3RhdGljIHN0cnVjdCBkZXZpY2UgZXRoMV9kZXYgPSB7Ci0rICAgICJldGgxIiwgMCwwLDAsMCwweGZmZTAgLyogSS9PIGJhc2UqLywgMCwwLDAsMCwgJmV0aDJfZGV2LCBldGhpZl9wcm9iZSB9OwotIAotLSNpZmRlZiBDT05GSUdfQVQxNTAwCi0tICAgIGV4dGVybiBpbnQgYXQxNTAwX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7Ci0tICAgIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGxhbmNlX2RldiA9IHsKLS0gICAgICAgICJsZTAiLAotLQkwLDAsMCwwLCAwIC8qIEkvTyBCYXNlICovLCAwIC8qIHByZS1zZXQgSVJRICovLAotLSAgICAgICAgMCwgMCwgMCwgTkVYVF9ERVYsIGF0MTUwMF9wcm9iZSwKLS0gICAgfTsKLS0jICAgdW5kZWYgTkVYVF9ERVYKLS0jICAgZGVmaW5lIE5FWFRfREVWCSgmbGFuY2VfZGV2KQotLSNlbmRpZiAgLyogQVQxNTAwQlQgKi8KLStzdGF0aWMgc3RydWN0IGRldmljZSBldGgwX2RldiA9IHsKLSsgICAgImV0aDAiLCAwLCAwLCAwLCAwLCBFVEgwX0FERFIsIEVUSDBfSVJRLCAwLCAwLCAwLCAmZXRoMV9kZXYsIGV0aGlmX3Byb2JlIH07Ci0gCi0tI2lmIGRlZmluZWQoRUk4MzkwKSB8fCBkZWZpbmVkKENPTkZJR19FTDIpIHx8IGRlZmluZWQoQ09ORklHX05FMjAwMCkgXAotLSAgICB8fCBkZWZpbmVkKENPTkZJR19XRDgweDMpIHx8IGRlZmluZWQoQ09ORklHX0hQTEFOKQotLSMgICBpZm5kZWYgRUk4MzkwCi0tIwlkZWZpbmUgRUk4MzkwIDAKLS0jICAgZW5kaWYKLS0jICAgaWZuZGVmIEVJODM5MF9JUlEKLS0jCWRlZmluZSBFSTgzOTBfSVJRIDAKLS0jICAgZW5kaWYKLS0gICAgZXh0ZXJuIGludCBldGhpZl9pbml0KHN0cnVjdCBkZXZpY2UgKik7Ci0tICAgIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGVpODM5MF9kZXYgPSB7Ci0tCSJldGgwIiwKLS0JMCwJCQkJLyogYXV0by1jb25maWcJCQkqLwotLQkwLAotLQkwLAotLQkwLAotLQlFSTgzOTAsCi0tCUVJODM5MF9JUlEsCi0tCTAsIDAsIDAsCi0tCU5FWFRfREVWLAotLQlldGhpZl9pbml0Ci0tICAgIH07Ci0gIyAgIHVuZGVmIE5FWFRfREVWCi0tIyAgIGRlZmluZSBORVhUX0RFVgkoJmVpODM5MF9kZXYpCi0tI2VuZGlmICAvKiBUaGUgRUk4MzkwIGRyaXZlcnMuICovCi0rIyAgIGRlZmluZSBORVhUX0RFVgkoJmV0aDBfZGV2KQotIAotICNpZiBkZWZpbmVkKFBMSVApIHx8IGRlZmluZWQoQ09ORklHX1BMSVApCi0gICAgIGV4dGVybiBpbnQgcGxpcF9pbml0KHN0cnVjdCBkZXZpY2UgKik7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9uZXQvaW5ldC9kZXYuYyBsaW51eC9uZXQvaW5ldC9kZXYuYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvZGV2LmMJU2F0IEF1ZyAxNCAxNDozMjowNSAxOTkzCi0rKysgbGludXgvbmV0L2luZXQvZGV2LmMJVHVlIEF1ZyAzMSAwNTowMDowNCAxOTkzCi1AQCAtMTgsNiArMTgsNyBAQAotICAqLwotICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0rI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KLSAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotQEAgLTI5LDYgKzMwLDcgQEAKLSAjaW5jbHVkZSA8bGludXgvaW4uaD4KLSAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0gI2luY2x1ZGUgImluZXQuaCIKLSAjaW5jbHVkZSAiZGV2LmgiCi0gI2luY2x1ZGUgImV0aC5oIgotQEAgLTM2OCw5ICszNzAsNDAgQEAKLSAgIHN0aSgpOwotIH0KLSAKLSsvKgotKyAqIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSBhIGRldmljZSBkcml2ZXIgYW5kIHF1ZXVlIGl0IGZvciB0aGUgdXBwZXIKLSsgKiAocHJvdG9jb2wpIGxldmVscy4gIEl0IGFsd2F5cyBzdWNjZWVkcy4KLSsgKi8KLSt2b2lkCi0rbmV0aWZfcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKLSt7Ci0rICAvKiBTZXQgYW55IG5lY2Vzc2FyeSBmbGFncy4gKi8KLSsgIHNrYi0+bG9jayA9IDA7Ci0rICBza2ItPnNrID0gTlVMTDsKLSsKLSsgIC8qIGFuZCBhZGQgaXQgdG8gdGhlICJiYWNrbG9nIiBxdWV1ZS4gKi8KLSsgIGNsaSgpOwotKyAgaWYgKGJhY2tsb2cgPT0gTlVMTCkgewotKwlza2ItPnByZXYgPSBza2I7Ci0rCXNrYi0+bmV4dCA9IHNrYjsKLSsJYmFja2xvZyA9IHNrYjsKLSsgIH0gZWxzZSB7Ci0rCXNrYi0+cHJldiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBiYWNrbG9nLT5wcmV2OwotKwlza2ItPm5leHQgPSAoc3RydWN0IHNrX2J1ZmYgKikgYmFja2xvZzsKLSsJc2tiLT5uZXh0LT5wcmV2ID0gc2tiOwotKwlza2ItPnByZXYtPm5leHQgPSBza2I7Ci0rICB9Ci0rICBzdGkoKTsKLSsgICAKLSsgIC8qIElmIGFueSBwYWNrZXQgYXJyaXZlZCwgbWFyayBpdCBmb3IgcHJvY2Vzc2luZy4gKi8KLSsgIGlmIChiYWNrbG9nICE9IE5VTEwpIG1hcmtfYmgoSU5FVF9CSCk7Ci0rCi0rICByZXR1cm47Ci0rfQotKwotIAotIC8qCi0tICogRmV0Y2ggYSBwYWNrZXQgZnJvbSBhIGRldmljZSBkcml2ZXIuCi0rICogVGhlIG9sZCBpbnRlcmZhY2UgdG8gZmV0Y2ggYSBwYWNrZXQgZnJvbSBhIGRldmljZSBkcml2ZXIuCi0gICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgYmFzZSBsZXZlbCBlbnRyeSBwb2ludCBmb3IgYWxsIGRyaXZlcnMgdGhhdAotICAqIHdhbnQgdG8gc2VuZCBhIHBhY2tldCB0byB0aGUgdXBwZXIgKHByb3RvY29sKSBsZXZlbHMuICBJdCB0YWtlcwotICAqIGNhcmUgb2YgZGUtbXVsdGlwbGV4aW5nIHRoZSBwYWNrZXQgdG8gdGhlIHZhcmlvdXMgbW9kdWxlcyBiYXNlZAotQEAgLTM4OSwxOCArNDIyLDIwIEBACi0gICBpbnQgbGVuMjsKLSAKLSAgIGlmIChkZXYgPT0gTlVMTCB8fCBidWZmID09IE5VTEwgfHwgbGVuIDw9IDApIHJldHVybigxKTsKLS0gIGlmIChkcm9wcGluZyAmJiBiYWNrbG9nICE9IE5VTEwpIHsKLS0JcmV0dXJuKDEpOwotLSAgfQotLSAgaWYgKGRyb3BwaW5nKSBwcmludGsoIklORVQ6IGRldl9yaW50OiBubyBsb25nZXIgZHJvcHBpbmcgcGFja2V0cy5cbiIpOwotLSAgZHJvcHBpbmcgPSAwOwotLQotICAgaWYgKGZsYWdzICYgSU5fU0tCVUZGKSB7Ci0gCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBidWZmOwotICAgfSBlbHNlIHsKLSsJaWYgKGRyb3BwaW5nKSB7Ci0rCSAgaWYgKGJhY2tsb2cgIT0gTlVMTCkKLSsJICAgICAgcmV0dXJuKDEpOwotKwkgIHByaW50aygiSU5FVDogZGV2X3JpbnQ6IG5vIGxvbmdlciBkcm9wcGluZyBwYWNrZXRzLlxuIik7Ci0rCSAgZHJvcHBpbmcgPSAwOwotKwl9Ci0rCi0gCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBrbWFsbG9jKHNpemVvZigqc2tiKSArIGxlbiwgR0ZQX0FUT01JQyk7Ci0gCWlmIChza2IgPT0gTlVMTCkgewotLQkJcHJpbnRrKCJkZXZfcmludDogcGFja2V0IGRyb3BwZWQgKG5vIG1lbW9yeSkgIVxuIik7Ci0rCQlwcmludGsoImRldl9yaW50OiBwYWNrZXQgZHJvcHBlZCBvbiAlcyAobm8gbWVtb3J5KSAhXG4iLAotKwkJICAgICAgIGRldi0+bmFtZSk7Ci0gCQlkcm9wcGluZyA9IDE7Ci0gCQlyZXR1cm4oMSk7Ci0gCX0KLUBAIC00MjYsMjUgKzQ2MSw4IEBACi0gICB9Ci0gICBza2ItPmxlbiA9IGxlbjsKLSAgIHNrYi0+ZGV2ID0gZGV2OwotLSAgc2tiLT5zayA9IE5VTEw7Ci0tCi0tICAvKiBOb3cgYWRkIGl0IHRvIHRoZSBiYWNrbG9nLiAqLwotLSAgY2xpKCk7Ci0tICBpZiAoYmFja2xvZyA9PSBOVUxMKSB7Ci0tCXNrYi0+cHJldiA9IHNrYjsKLS0Jc2tiLT5uZXh0ID0gc2tiOwotLQliYWNrbG9nID0gc2tiOwotLSAgfSBlbHNlIHsKLS0Jc2tiLT5wcmV2ID0gKHN0cnVjdCBza19idWZmICopIGJhY2tsb2ctPnByZXY7Ci0tCXNrYi0+bmV4dCA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBiYWNrbG9nOwotLQlza2ItPm5leHQtPnByZXYgPSBza2I7Ci0tCXNrYi0+cHJldi0+bmV4dCA9IHNrYjsKLS0gIH0KLS0gIHN0aSgpOwotLSAgIAotLSAgLyogSWYgYW55IHBhY2tldCBhcnJpdmVkLCBtYXJrIGl0IGZvciBwcm9jZXNzaW5nLiAqLwotLSAgaWYgKGJhY2tsb2cgIT0gTlVMTCkgbWFya19iaChJTkVUX0JIKTsKLSAKLSsgIG5ldGlmX3J4KHNrYik7Ci0gICAvKiBPSywgYWxsIGRvbmUuICovCi0gICByZXR1cm4oMCk7Ci0gfQotQEAgLTQ3NSwxNiArNDkzLDExIEBACi0gICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlOwotICAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLSAgIHVuc2lnbmVkIGNoYXIgZmxhZyA9IDA7Ci0tICBzdGF0aWMgdm9sYXRpbGUgaW50IGluX2JoID0gMDsKLSsgIHN0YXRpYyB2b2xhdGlsZSBjaGFyIGluX2JoID0gMDsKLSAKLS0gIC8qIENoZWNrICYmIG1hcmsgb3VyIEJVU1kgc3RhdGUuICovCi0tICBjbGkoKTsKLS0gIGlmIChpbl9iaCAhPSAwKSB7Ci0tCXN0aSgpOwotLQlyZXR1cm47Ci0tICB9Ci0tICBpbl9iaCA9IDE7Ci0tICBzdGkoKTsKLSsgIC8qIEF0b21pY2FsbHkgY2hlY2sgYW5kIG1hcmsgb3VyIEJVU1kgc3RhdGUuICovCi0rICBpZiAoc2V0X2JpdCgxLCAodm9pZCopJmluX2JoKSkKLSsgICAgICByZXR1cm47Ci0gCi0gICAvKiBDYW4gd2Ugc2VuZCBhbnl0aGluZyBub3c/ICovCi0gICBkZXZfdHJhbnNtaXQoKTsKLUBAIC02NzEsMTQgKzY4NCw0NiBAQAotICAgcmV0dXJuKHBvcyAtIGFyZyk7Ci0gfQotIAotKy8qIFByaW50IGRldmljZSBzdGF0aXN0aWNzLiAqLwotK2NoYXIgKnNwcmludGZfc3RhdHMoY2hhciAqYnVmZmVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi0rewotKyAgY2hhciAqcG9zID0gYnVmZmVyOwotKyAgc3RydWN0IGVuZXRfc3RhdGlzdGljcyAqc3RhdHMgPSAoZGV2LT5nZXRfc3RhdHMgPyBkZXYtPmdldF9zdGF0cyhkZXYpOiBOVUxMKTsKLSsKLSsgIGlmIChzdGF0cykKLSsgICAgcG9zICs9IHNwcmludGYocG9zLCAiJTZzOiU3ZCAlNGQgJTRkICU0ZCAlNGQgJThkICU0ZCAlNGQgJTRkICU1ZCAlNGRcbiIsCi0rCQkgICBkZXYtPm5hbWUsCi0rCQkgICBzdGF0cy0+cnhfcGFja2V0cywgc3RhdHMtPnJ4X2Vycm9ycywKLSsJCSAgIHN0YXRzLT5yeF9kcm9wcGVkICsgc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMsCi0rCQkgICBzdGF0cy0+cnhfZmlmb19lcnJvcnMsCi0rCQkgICBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArIHN0YXRzLT5yeF9vdmVyX2Vycm9ycwotKwkJICAgKyBzdGF0cy0+cnhfY3JjX2Vycm9ycyArIHN0YXRzLT5yeF9mcmFtZV9lcnJvcnMsCi0rCQkgICBzdGF0cy0+dHhfcGFja2V0cywgc3RhdHMtPnR4X2Vycm9ycywgc3RhdHMtPnR4X2Ryb3BwZWQsCi0rCQkgICBzdGF0cy0+dHhfZmlmb19lcnJvcnMsIHN0YXRzLT5jb2xsaXNpb25zLAotKwkJICAgc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICsgc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzCi0rCQkgICArIHN0YXRzLT50eF93aW5kb3dfZXJyb3JzICsgc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnMpOwotKyAgZWxzZQotKyAgICAgIHBvcyArPSBzcHJpbnRmKHBvcywgIiU2czogTm8gc3RhdGlzdGljcyBhdmFpbGFibGUuXG4iLCBkZXYtPm5hbWUpOwotKwotKyAgcmV0dXJuIHBvczsKLSt9Ci0gCi0gLyogQ2FsbGVkIGZyb20gdGhlIFBST0NmcyBtb2R1bGUuICovCi0gaW50Ci0gZGV2X2dldF9pbmZvKGNoYXIgKmJ1ZmZlcikKLSB7Ci0tICByZXR1cm4oZGV2X2lmY29uZihidWZmZXIpKTsKLS19Ci0rICBjaGFyICpwb3MgPSBidWZmZXI7Ci0rICBzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0gCi0rICBwb3MgKz0KLSsgICAgICBzcHJpbnRmKHBvcywKLSsJICAgICAgIkludGVyLXwgICBSZWNlaXZlICAgICAgICAgICAgICAgICAgfCAgVHJhbnNtaXRcbiIKLSsJICAgICAgIiBmYWNlIHxwYWNrZXRzIGVycnMgZHJvcCBmaWZvIGZyYW1lfHBhY2tldHMgZXJycyBkcm9wIGZpZm8gY29sbHMgY2FycmllclxuIik7Ci0rICBmb3IgKGRldiA9IGRldl9iYXNlOyBkZXYgIT0gTlVMTDsgZGV2ID0gZGV2LT5uZXh0KSB7Ci0rICAgICAgcG9zID0gc3ByaW50Zl9zdGF0cyhwb3MsIGRldik7Ci0rICB9Ci0rICByZXR1cm4gcG9zIC0gYnVmZmVyOwotK30KLSAKLSAvKiBQZXJmb3JtIHRoZSBTSU9DeElGeHh4IGNhbGxzLiAqLwotIHN0YXRpYyBpbnQKLUBAIC03MDIsMTggKzc0NywxOCBAQAotIAkJcmV0ID0gMDsKLSAJCWJyZWFrOwotIAljYXNlIFNJT0NTSUZGTEFHUzoKLS0JCXJldCA9IGRldi0+ZmxhZ3M7Ci0tCQlkZXYtPmZsYWdzID0gaWZyLmlmcl9mbGFncyAmICgKLSsJCXsKLSsJCSAgaW50IG9sZF9mbGFncyA9IGRldi0+ZmxhZ3M7Ci0rCQkgIGRldi0+ZmxhZ3MgPSBpZnIuaWZyX2ZsYWdzICYgKAotIAkJCUlGRl9VUCB8IElGRl9CUk9BRENBU1QgfCBJRkZfREVCVUcgfCBJRkZfTE9PUEJBQ0sgfAotIAkJCUlGRl9QT0lOVE9QT0lOVCB8IElGRl9OT1RSQUlMRVJTIHwgSUZGX1JVTk5JTkcgfAotIAkJCUlGRl9OT0FSUCB8IElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKTsKLS0JCWlmICgocmV0ICYgSUZGX1VQKSAmJiAoKGRldi0+ZmxhZ3MgJiBJRkZfVVApID09IDApKSB7Ci0rCQkgIGlmICgob2xkX2ZsYWdzICYgSUZGX1VQKSAmJiAoKGRldi0+ZmxhZ3MgJiBJRkZfVVApID09IDApKSB7Ci0gCQkJcmV0ID0gZGV2X2Nsb3NlKGRldik7Ci0tCQl9IGVsc2UgewotLQkJCWlmICgoKHJldCAmIElGRl9VUCkgPT0gMCkgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7Ci0tCQkJCXJldCA9IGRldl9vcGVuKGRldik7Ci0tCQkJfSBlbHNlIHJldCA9IDA7Ci0tCQl9Ci0rCQkgIH0gZWxzZQotKwkJICAgICAgcmV0ID0gKCEgKG9sZF9mbGFncyAmIElGRl9VUCkgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQotKwkJCT8gZGV2X29wZW4oZGV2KSA6IDA7Ci0rCSAgICAgICAgfQotIAkJYnJlYWs7Ci0gCWNhc2UgU0lPQ0dJRkFERFI6Ci0gCQkoKihzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKLUBAIC04MjAsOSArODY1LDU1IEBACi0gICBpbnQgcmV0OwotIAotICAgc3dpdGNoKGNtZCkgewotLQljYXNlIElQX1NFVF9ERVY6Ci0tCQlwcmludGsoIklORVQ6IFdhcm5pbmc6IG9sZC1zdHlsZSBpb2N0bChJUF9TRVRfREVWKSBjYWxsZWQhXG4iKTsKLS0JCXJldHVybigtRUlOVkFMKTsKLSsgIGNhc2UgSVBfU0VUX0RFVjoKLSsgICAgICB7CSAgLyogTWFpbnRhaW4gYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIHRvIGJlIGRlbGV0ZWQgZm9yIDEuMDAuICovCi0rCSAgc3RydWN0IGRldmljZSAqZGV2OwotKwkgIC8qIFRoZSBvbGQgJ3N0cnVjdCBpcF9jb25maWcnLiAqLwotKwkgIHN0cnVjdCBpcF9jb25maWcgewotKwkgICAgICBjaGFyIG5hbWVbTUFYX0lQX05BTUVdOwotKwkgICAgICB1bnNpZ25lZCBsb25nIHBhZGRyLCByb3V0ZXIsIG5ldCx1cDoxLGRlc3Ryb3k6MTsKLSsJICB9IGlwYzsKLSsJICBpbnQgcmV0dmFsLCBsb29wYmFjazsKLSsKLSsJICBwcmludGsoIklORVQ6IFdhcm5pbmc6IG9sZC1zdHlsZSBpb2N0bChJUF9TRVRfREVWKSBjYWxsZWQhXG4iKTsKLSsJICBpZiAoIXN1c2VyKCkpCi0rCSAgICAgIHJldHVybiAoLUVQRVJNKTsKLSsJICAKLSsJICB2ZXJpZnlfYXJlYSAoVkVSSUZZX1dSSVRFLCBhcmcsIHNpemVvZiAoaXBjKSk7Ci0rCSAgbWVtY3B5X2Zyb21mcygmaXBjLCBhcmcsIHNpemVvZiAoaXBjKSk7Ci0rCSAgaXBjLm5hbWVbTUFYX0lQX05BTUUtMV0gPSAwOwotKwkgIGxvb3BiYWNrID0gKHN0cmNtcChpcGMubmFtZSwgImxvb3BiYWNrIikgPT0gMCk7Ci0rCSAgZGV2ID0gZGV2X2dldCggbG9vcGJhY2sgPyAibG8iIDogaXBjLm5hbWUpOwotKwkgIGlmIChkZXYgPT0gTlVMTCkKLSsJICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0rCSAgaXBjLmRlc3Ryb3kgPSAwOwotKwkgIGRldi0+cGFfYWRkciA9IGlwYy5wYWRkcjsKLSsJICBkZXYtPmZhbWlseSA9IEFGX0lORVQ7Ci0rCSAgZGV2LT5wYV9tYXNrID0gZ2V0X21hc2soZGV2LT5wYV9hZGRyKTsKLSsJICBkZXYtPnBhX2JyZGFkZHIgPSBkZXYtPnBhX2FkZHIgfCB+ZGV2LT5wYV9tYXNrOwotKwkgIGlmIChpcGMubmV0ICE9IDB4ZmZmZmZmZmYpIHsKLSsJICAgICAgZGV2LT5mbGFncyB8PSBJRkZfQlJPQURDQVNUOwotKwkgICAgICBkZXYtPnBhX2JyZGFkZHIgPSBpcGMubmV0OwotKwkgIH0KLSsJICAKLSsJICAvKiBUbyBiZSBwcm9wZXIgd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcm91dGUgaGVyZS4gKi8KLSsJICBpZiAoaXBjLnVwID09IDApCi0rCSAgICAgIHJldHVybiAoZGV2LT5mbGFncyAmIElGRl9VUCAhPSAwKSA/IGRldl9jbG9zZShkZXYpIDogMDsKLSsKLSsJICBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfVVApID09IDAKLSsJICAgICAgJiYgKHJldHZhbCA9IGRldl9vcGVuKGRldikpICE9IDApCi0rCSAgICAgIHJldHVybiByZXR2YWw7Ci0rCSAgcHJpbnRrKCIlczogYWRkaW5nIEhPU1Qgcm91dGUgb2YgJTguOHguXG4iLCBkZXYtPm5hbWUsCi0rCQkgaHRvbmwoaXBjLnBhZGRyKSk7Ci0rCSAgcnRfYWRkKFJURl9IT1NULCBpcGMucGFkZHIsIDAsIGRldik7Ci0rCSAgaWYgKGlwYy5yb3V0ZXIgIT0gMCAmJiBpcGMucm91dGVyICE9IC0xKSB7Ci0rCSAgICAgIHJ0X2FkZChSVEZfR0FURVdBWSwgaXBjLnBhZGRyLCBpcGMucm91dGVyLCBkZXYpOwotKwkgICAgICBwcmludGsoIiVzOiBhZGRpbmcgR0FURVdBWSByb3V0ZSBvZiAlOC44eC5cbiIsCi0rCQkgICAgIGRldi0+bmFtZSwgaHRvbmwoaXBjLnBhZGRyKSk7Ci0rCi0rCSAgfQotKwkgIHJldHVybiAwOwotKyAgICAgIH0KLSAJY2FzZSBTSU9DR0lGQ09ORjoKLSAJCSh2b2lkKSBkZXZfaWZjb25mKChjaGFyICopIGFyZyk7Ci0gCQlyZXQgPSAwOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbmV0L2luZXQvZGV2LmggbGludXgvbmV0L2luZXQvZGV2LmgKLS0tLSBwbDEyL2xpbnV4L25ldC9pbmV0L2Rldi5oCUZyaSBBdWcgMTMgMDQ6MjQ6MzEgMTk5MwotKysrIGxpbnV4L25ldC9pbmV0L2Rldi5oCVNhdCBBdWcgMjggMDA6NDg6NDcgMTk5MwotQEAgLTE2OSw2ICsxNjksOSBAQAotIGV4dGVybiBpbnQJCWRldl9jbG9zZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotIGV4dGVybiB2b2lkCQlkZXZfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gCQkJCSAgICAgICBpbnQgcHJpKTsKLSsjZGVmaW5lIEhBVkVfTkVUSUZfUlggMQotK2V4dGVybiB2b2lkCQluZXRpZl9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLSsvKiBUaGUgb2xkIGludGVyZmFjZSB0byBuZXRpZl9yeCgpLiAqLwotIGV4dGVybiBpbnQJCWRldl9yaW50KHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGxvbmcgbGVuLCBpbnQgZmxhZ3MsCi0gCQkJCSBzdHJ1Y3QgZGV2aWNlICogZGV2KTsKLSBleHRlcm4gdm9pZAkJZGV2X3RyYW5zbWl0KHZvaWQpOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbmV0L2luZXQvZWwyLmMgbGludXgvbmV0L2luZXQvZWwyLmMKLS0tLSBwbDEyL2xpbnV4L25ldC9pbmV0L2VsMi5jCUZyaSBBdWcgMTMgMDQ6MjQ6MjcgMTk5MwotKysrIGxpbnV4L25ldC9pbmV0L2VsMi5jCU1vbiBBdWcgMzAgMjM6NTk6NTcgMTk5MwotQEAgLTE2LDcgKzE2LDcgQEAKLSAqLwotIAotIHN0YXRpYyBjaGFyICp2ZXJzaW9uID0KLS0gICAgImVsMi5jOnYwLjk5LjEyQiA4LzEyLzkzIERvbmFsZCBCZWNrZXIgKGJlY2tlckBzdXBlci5vcmcpXG4iOwotKyAgICAiZWwyLmM6djAuOTkuMTMgOC8zMC85MyBEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKVxuIjsKLSAKLSAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotQEAgLTMwLDkgKzMwLDkgQEAKLSAjaW5jbHVkZSAiODM5MC5oIgotICNpbmNsdWRlICJlbDJyZWcuaCIKLSAKLS1pbnQgZWwyYXV0b3Byb2JlKGludCBpb2FkZHIsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci0raW50IGVsMl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotIGludCBlbDJfcGlvX2F1dG9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotLWludCBlbDJwcm9iZShpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotK2ludCBlbDJwcm9iZTEoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLSAKLSBzdGF0aWMgaW50IGVsMl9vcGVuKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0gc3RhdGljIGludCBlbDJfY2xvc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKLUBAIC01NSwxMyArNTUsMTUgQEAKLSBzdGF0aWMgaW50IHBvcnRzW10gPSB7MHgzMDAsMHgzMTAsMHgzMzAsMHgzNTAsMHgyNTAsMHgyODAsMHgyYTAsMHgyZTAsMH07Ci0gCi0gaW50Ci0tZWwyYXV0b3Byb2JlKGludCBpb2FkZHIsIHN0cnVjdCBkZXZpY2UgKmRldikKLStlbDJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotIHsKLSAgICAgaW50ICphZGRyLCBhZGRyc1tdID0geyAweGRkZmZlLCAweGQ5ZmZlLCAweGNkZmZlLCAweGM5ZmZlLCAwfTsKLSsgICAgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0gCi0tICAgIC8qIE5vbi1hdXRvcHJvYmUgY2FzZSBmaXJzdDogKi8KLSsgICAgaWYgKGlvYWRkciA8IDApCi0rCXJldHVybiBFTlhJTzsJCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KLSAgICAgaWYgKGlvYWRkciA+IDApCi0tCXJldHVybiBlbDJwcm9iZShpb2FkZHIsIGRldik7Ci0rCXJldHVybiAhIGVsMnByb2JlMShpb2FkZHIsIGRldik7Ci0gCi0gICAgIGZvciAoYWRkciA9IGFkZHJzOyAqYWRkcjsgYWRkcisrKSB7Ci0gCWludCBpOwotQEAgLTcwLDEzICs3MiwxOSBAQAotIAlmb3IoaSA9IDc7IGkgPj0gMDsgaS0tLCBiYXNlX2JpdHMgPj49IDEpCi0gCSAgICBpZiAoYmFzZV9iaXRzICYgMHgxKQotIAkJYnJlYWs7Ci0tCWlmIChiYXNlX2JpdHMgPT0gMSAmJiAgZWwycHJvYmUocG9ydHNbaV0sIGRldikpCi0tCSAgICByZXR1cm4gZGV2LT5iYXNlX2FkZHI7Ci0rCWlmIChiYXNlX2JpdHMgIT0gMSkKLSsJICAgIGNvbnRpbnVlOwotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rCWlmIChjaGVja19yZWdpb24ocG9ydHNbaV0sIDE2KSkKLSsJICAgIGNvbnRpbnVlOwotKyNlbmRpZgotKwlpZiAoZWwycHJvYmUxKHBvcnRzW2ldLCBkZXYpKQotKwkgICAgcmV0dXJuIDA7Ci0gICAgIH0KLS0jaWZkZWYgcHJvYmVfbm9uc2hhcmVkX21lbW9yeQotKyNpZm5kZWYgbm9fcHJvYmVfbm9uc2hhcmVkX21lbW9yeQotICAgICByZXR1cm4gZWwyX3Bpb19hdXRvcHJvYmUoZGV2KTsKLSAjZWxzZQotLSAgICByZXR1cm4gMDsKLSsgICAgcmV0dXJuIEVOT0RFVjsKLSAjZW5kaWYKLSB9Ci0gCi1AQCAtODcsMTQgKzk1LDE4IEBACi0gewotICAgICBpbnQgaTsKLSAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rCWlmIChjaGVja19yZWdpb24ocG9ydHNbaV0sIDE2KSkKLSsJICAgIGNvbnRpbnVlOwotKyNlbmRpZgotIAkvKiBSZXNldCBhbmQvb3IgYXZvaWQgYW55IGx1cmtpbmcgTkUyMDAwICovCi0gCWlmIChpbmJfcChwb3J0c1tpXSArIDB4NDA4KSA9PSAweGZmKQotIAkgICAgY29udGludWU7Ci0gCWlmIChpbmIocG9ydHNbaV0gKyAweDQwMykgPT0gKDB4ODAgPj4gaSkgLyogUHJlbGltaW5hcnkgY2hlY2sgKi8KLS0JICAgICYmIGVsMnByb2JlKHBvcnRzW2ldLCBkZXYpKQotLQkgICAgcmV0dXJuIGRldi0+YmFzZV9hZGRyOwotKwkgICAgJiYgZWwycHJvYmUxKHBvcnRzW2ldLCBkZXYpKQotKwkgICAgcmV0dXJuIDA7Ci0gICAgIH0KLS0gICAgcmV0dXJuIDA7Ci0rICAgIHJldHVybiBFTk9ERVY7Ci0gfQotIAotIC8qIFByb2JlIGZvciB0aGUgRXRoZXJsaW5rIElJIGNhcmQgYXQgSS9PIHBvcnQgYmFzZSBJT0FERFIsCi1AQCAtMTAxLDcgKzExMyw3IEBACi0gICAgcmV0dXJuaW5nIG5vbi16ZXJvIG9uIHN1Y2Vzcy4gIElmIGZvdW5kLCBzZXQgdGhlIHN0YXRpb24KLSAgICBhZGRyZXNzIGFuZCBtZW1vcnkgcGFyYW1ldGVycyBpbiBERVZJQ0UuICovCi0gaW50Ci0tZWwycHJvYmUoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KQotK2VsMnByb2JlMShpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotICAgICBpbnQgaSwgaW9iYXNlX3JlZywgbWVtYmFzZV9yZWcsIHNhdmVkXzQwNjsKLSAgICAgdW5zaWduZWQgY2hhciAqc3RhdGlvbl9hZGRyID0gZGV2LT5kZXZfYWRkcjsKLUBAIC0xMzQsNiArMTQ2LDkgQEAKLSAJcmV0dXJuIDA7Ci0gICAgIH0KLSAKLSsjaWZkZWYgSEFWRV9QT1JUUkVTRVJWRQotKyAgICBzbmFyZl9yZWdpb24oaW9hZGRyLCAxNik7Ci0rI2VuZGlmCi0gICAgIGV0aGRldl9pbml0KGRldik7Ci0gCi0gICAgIC8qIE1hcCB0aGUgODM5MCBiYWNrIGludG8gdGhlIHdpbmRvdy4gKi8KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0L2hwLmMgbGludXgvbmV0L2luZXQvaHAuYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvaHAuYwlGcmkgQXVnIDEzIDA0OjI0OjI5IDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC9ocC5jCVR1ZSBBdWcgMzEgMDA6MDI6NDAgMTk5MwotQEAgLTEzLDcgKzEzLDcgQEAKLSAqLwotIAotIHN0YXRpYyBjaGFyICp2ZXJzaW9uID0KLS0gICAgImhwLmM6djAuOTkuMTIrIDgvMTIvOTMgRG9uYWxkIEJlY2tlciAoYmVja2VyQHN1cGVyLm9yZylcbiI7Ci0rICAgICJocC5jOnYwLjk5LjEzIDgvMzAvOTMgRG9uYWxkIEJlY2tlciAoYmVja2VyQHN1cGVyLm9yZylcbiI7Ci0gCi0gI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLUBAIC00MCw3ICs0MCw3IEBACi0gI2RlZmluZSBIUF84QlNUT1BfUEcJMHg4MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLwotICNkZWZpbmUgSFBfMTZCU1RPUF9QRwkweEZGCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCi0gCi0taW50IGhwcHJvYmUoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLStpbnQgaHBfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKLSBpbnQgaHBwcm9iZTEoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KTsKLSAKLSBzdGF0aWMgdm9pZCBocF9yZXNldF84MzkwKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1AQCAtNTksMTcgKzU5LDI3IEBACi0gICAgIEFsc28gaW5pdGlhbGl6ZSB0aGUgY2FyZCBhbmQgZmlsbCBpbiBTVEFUSU9OX0FERFIgd2l0aCB0aGUgc3RhdGlvbgotICAgIGFkZHJlc3MuICovCi0gCi0taW50IGhwcHJvYmUoaW50IGlvYWRkciwgIHN0cnVjdCBkZXZpY2UgKmRldikKLStpbnQgaHBfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotIHsKLSAgICAgaW50ICpwb3J0LCBwb3J0c1tdID0gezB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MjgwLCAweDJDMCwgMHgyMDAsIDB4MjQwLCAwfTsKLSsgICAgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0gCi0rICAgIGlmIChpb2FkZHIgPCAwKQotKwlyZXR1cm4gRU5YSU87CQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCi0gICAgIGlmIChpb2FkZHIgPiAweDEwMCkKLS0JcmV0dXJuIGhwcHJvYmUxKGlvYWRkciwgZGV2KTsKLSsJcmV0dXJuICEgaHBwcm9iZTEoaW9hZGRyLCBkZXYpOwotIAotLSAgICBmb3IgKHBvcnQgPSAmcG9ydHNbMF07ICpwb3J0OyBwb3J0KyspCi0tCWlmIChpbmJfcCgqcG9ydCkgIT0gMHhmZiAmJiBocHByb2JlMSgqcG9ydCwgZGV2KSkKLS0JICAgIHJldHVybiBkZXYtPmJhc2VfYWRkcjsKLS0gICAgcmV0dXJuIDA7Ci0rICAgIGZvciAocG9ydCA9ICZwb3J0c1swXTsgKnBvcnQ7IHBvcnQrKykgewotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rCWlmIChjaGVja19yZWdpb24oKnBvcnQsIDMyKSkKLSsJICAgIGNvbnRpbnVlOwotKyNlbmRpZgotKwlpZiAoaW5iX3AoKnBvcnQpICE9IDB4ZmYgJiYgaHBwcm9iZTEoKnBvcnQsIGRldikpIHsKLSsJICAgIHJldHVybiAwOwotKwl9Ci0rICAgIH0KLSsgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7Ci0rICAgIHJldHVybiBFTk9ERVY7Ci0gfQotIAotIGludCBocHByb2JlMShpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi1AQCAtMTM5LDYgKzE0OSwxMCBAQAotIAkgIHJldHVybiAwOwotICAgICAgIH0KLSAgIH0KLSsKLSsjaWZkZWYgSEFWRV9QT1JUUkVTRVJWRQotKyAgICBzbmFyZl9yZWdpb24oaW9hZGRyLCAzMik7Ci0rI2VuZGlmCi0gCi0gICBpZiAoZWlfZGVidWcgPiAxKQotICAgICAgIHByaW50ayh2ZXJzaW9uKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0L2lwLmMgbGludXgvbmV0L2luZXQvaXAuYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvaXAuYwlGcmkgQXVnICA2IDIwOjQwOjE4IDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC9pcC5jCVNhdCBTZXAgIDQgMDA6MDA6MTQgMTk5MwotQEAgLTUsMTAgKzUsMTEgQEAKLSAgKgotICAqCQlUaGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBtb2R1bGUuCi0gICoKLS0gKiBWZXJzaW9uOglAKCMpaXAuYwkxLjAuMTYJMDYvMDIvOTMKLSsgKiBWZXJzaW9uOglAKCMpaXAuYwkxLjAuMTZiCTkvMS85MwotICAqCi0gICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgotICAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KLSsgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+Ci0gICoKLSAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotQEAgLTM4Miw2ICszODMsMjcgQEAKLSAgIHJldHVybigwKTsKLSB9Ci0gCi0rLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLCB3aGljaAotKyAgIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuICovCi0rc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotK2lwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IHdsZW4pCi0rewotKyAgICB1bnNpZ25lZCBsb25nIHN1bSA9IDA7Ci0rICAgIF9fYXNtX18oIlx0IGNsY1xuIgotKwkgICAgIjE6XG4iCi0rCSAgICAiXHQgbG9kc2xcbiIKLSsJICAgICJcdCBhZGNsICUlZWF4LCAlJWVieFxuIgotKwkgICAgIlx0IGxvb3AgMWJcbiIKLSsJICAgICJcdCBhZGNsICQwLCAlJWVieFxuIgotKwkgICAgIlx0IG1vdmwgJSVlYngsICUlZWF4XG4iCi0rCSAgICAiXHQgc2hybCAkMTYsICUlZWF4XG4iCi0rCSAgICAiXHQgYWRkdyAlJWF4LCAlJWJ4XG4iCi0rCSAgICAiXHQgYWRjdyAkMCwgJSVieFxuIgotKwkgICAgOiAiPWIiIChzdW0pICwgIj1TIiAoYnVmZikKLSsJICAgIDogIjAiIChzdW0pLCAiYyIgKHdsZW4pICwiMSIgKGJ1ZmYpCi0rCSAgICA6ICJheCIsICJjeCIsICJzaSIsICJieCIgKTsKLSsgICAgcmV0dXJuICh+c3VtKSAmIDB4ZmZmZjsKLSt9Ci0gCi0gLyoKLSAgKiBUaGlzIHJvdXRpbmUgZG9lcyBhbGwgdGhlIGNoZWNrc3VtIGNvbXB1dGF0aW9ucyB0aGF0IGRvbid0Ci1AQCAtNDI5LDIzICs0NTEsMjEgQEAKLSAgIHJldHVybihzdW0gJiAweGZmZmYpOwotIH0KLSAKLS0KLS0vKiBDaGVjayB0aGUgaGVhZGVyIG9mIGFuIGluY29taW5nIElQIGRhdGFncmFtLiAqLwotKy8qIENoZWNrIHRoZSBoZWFkZXIgb2YgYW4gaW5jb21pbmcgSVAgZGF0YWdyYW0uICBUaGlzIHZlcnNpb24gaXMgc3RpbGwgdXNlZCBpbiBzbGhjLmMuICovCi0gaW50Ci0gaXBfY3N1bShzdHJ1Y3QgaXBoZHIgKmlwaCkKLSB7Ci0tICBpZiAoaXBoLT5jaGVjayA9PSAwKSByZXR1cm4oMCk7Ci0tICBpZiAoaXBfY29tcHV0ZV9jc3VtKCh1bnNpZ25lZCBjaGFyICopaXBoLCBpcGgtPmlobCo0KSA9PSAwKSByZXR1cm4oMCk7Ci0rICBpZiAoaXBoLT5jaGVjayA9PSAwICB8fCBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKSA9PSAwKQotKyAgICAgIHJldHVybigwKTsKLSAgIHJldHVybigxKTsKLSB9Ci0gCi0tCi0gLyogR2VuZXJhdGUgYSBjaGVja3N5bSBmb3IgYW4gb3V0Z29pbmcgSVAgZGF0YWdyYW0uICovCi0gc3RhdGljIHZvaWQKLSBpcF9zZW5kX2NoZWNrKHN0cnVjdCBpcGhkciAqaXBoKQotIHsKLSAgICBpcGgtPmNoZWNrID0gMDsKLS0gICBpcGgtPmNoZWNrID0gaXBfY29tcHV0ZV9jc3VtKCh1bnNpZ25lZCBjaGFyICopaXBoLCBpcGgtPmlobCo0KTsKLSsgICBpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKCh1bnNpZ25lZCBjaGFyICopaXBoLCBpcGgtPmlobCk7Ci0gfQotIAotIAotQEAgLTU1NCwyMSArNTc0LDIwIEBACi0gaW50Ci0gaXBfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdCkKLSB7Ci0tICBzdHJ1Y3QgaXBoZHIgKmlwaDsKLSsgIHN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5oLmlwaDsKLSAgIHVuc2lnbmVkIGNoYXIgaGFzaDsKLSAgIHVuc2lnbmVkIGNoYXIgZmxhZyA9IDA7Ci0rICB1bnNpZ25lZCBjaGFyIG9wdHNfcCA9IDA7CS8qIFNldCBpZmYgdGhlIHBhY2tldCBoYXMgb3B0aW9ucy4gKi8KLSAgIHN0cnVjdCBpbmV0X3Byb3RvY29sICppcHByb3Q7Ci0gICBzdGF0aWMgc3RydWN0IG9wdGlvbnMgb3B0OyAvKiBzaW5jZSB3ZSBkb24ndCB1c2UgdGhlc2UgeWV0LCBhbmQgdGhleQotIAkJCQl0YWtlIHVwIHN0YWNrIHNwYWNlLiAqLwotICAgaW50IGJyZDsKLSAKLS0gIGlwaCA9IHNrYi0+aC5pcGg7Ci0tICBtZW1zZXQoKGNoYXIgKikgJm9wdCwgMCwgc2l6ZW9mKG9wdCkpOwotICAgRFBSSU5URigoREJHX0lQLCAiPDxcbiIpKTsKLS0gIGlwX3ByaW50KGlwaCk7Ci0gCi0gICAvKiBJcyB0aGUgZGF0YWdyYW0gYWNjZXB0YWJsZT8gKi8KLS0gIGlmIChpcF9jc3VtKGlwaCkgfHwgZG9fb3B0aW9ucyhpcGgsICZvcHQpIHx8IGlwaC0+dmVyc2lvbiAhPSA0KSB7Ci0rICBpZiAoaXBoLT52ZXJzaW9uICE9IDQKLSsgICAgICB8fCAoaXBoLT5jaGVjayAhPSAwICYmIGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWlwaCwgaXBoLT5paGwpICE9MCkpIHsKLSAJRFBSSU5URigoREJHX0lQLCAiXG5JUDogKioqIGRhdGFncmFtIGVycm9yICoqKlxuIikpOwotIAlEUFJJTlRGKChEQkdfSVAsICIgICAgU1JDID0gJXMgICAiLCBpbl9udG9hKGlwaC0+c2FkZHIpKSk7Ci0gCURQUklOVEYoKERCR19JUCwgIiAgICBEU1QgPSAlcyAoaWdub3JlZClcbiIsIGluX250b2EoaXBoLT5kYWRkcikpKTsKLUBAIC01NzcsNyArNTk2LDE1IEBACi0gCXJldHVybigwKTsKLSAgIH0KLSAKLS0gIC8qIERvIGFueSBJUCBmb3J3YXJkaW5nIHJlcXVpcmVkLiAqLwotKyAgaWYgKGlwaC0+aWhsICE9IDUpIHsgIAkvKiBGYXN0IHBhdGggZm9yIHRoZSB0eXBpY2FsIG9wdGlvbmxlc3MgSVAgcGFja2V0LiAqLwotKyAgICAgIGlwX3ByaW50KGlwaCk7CQkvKiBCb2d1cywgb25seSBmb3IgZGVidWdnaW5nLiAqLwotKyAgICAgIG1lbXNldCgoY2hhciAqKSAmb3B0LCAwLCBzaXplb2Yob3B0KSk7Ci0rICAgICAgaWYgKGRvX29wdGlvbnMoaXBoLCAmb3B0KSAhPSAwKQotKwkgIHJldHVybiAwOwotKyAgICAgIG9wdHNfcCA9IDE7Ci0rICB9Ci0rCi0rICAvKiBEbyBhbnkgSVAgZm9yd2FyZGluZyByZXF1aXJlZC4gIGNoa19hZGRyKCkgaXMgZXhwZW5zaXZlIC0tIGF2b2lkIGl0IHNvbWVkYXkuICovCi0gICBpZiAoKGJyZCA9IGNoa19hZGRyKGlwaC0+ZGFkZHIpKSA9PSAwKSB7Ci0gI2lmZGVmIENPTkZJR19JUF9GT1JXQVJECi0gCWlwX2ZvcndhcmQoc2tiLCBkZXYpOwotQEAgLTU4OCwxNyArNjE1LDEyIEBACi0gICB9Ci0gCi0gICAvKgotLSAgICogRGVhbCB3aXRoIGZyYWdtZW50czogbm90IHJlYWxseS4uLgotLSAgICogRnJhZ21lbnRhdGlvbiBpcyBkZWZpbml0ZWx5IGEgcmVxdWlyZWQgcGFydCBvZiBJUCAoeWVhaCwgZ3V5cywKLS0gICAqIEkgcmVhZCBMaW51eC1BY3RpdmlzdHMuTkVUIHRvbyA6LSksIGJ1dCB0aGUgY3VycmVudCAic2tfYnVmZiIKLS0gICAqIGFsbG9jYXRpb24gc3R1ZmYgZG9lc24ndCBtYWtlIHRoaW5ncyBzaW1wbGVyLiAgV2hlbiB3ZSdyZSBhbGwKLS0gICAqIGRvbmUgY2xlYW5pbmcgdXAgdGhlIG1lc3MsIHdlJ2xsIGFkZCBSb3NzIEJpcm8ncyAibWJ1ZiIgc3R1ZmYKLS0gICAqIHRvIHRoZSBjb2RlLCB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIHNrX2J1ZmYgc3R1ZmYgY29tcGxldGVseS4KLS0gICAqIFRoYXQgd2lsbCAoYSkgbWFrZSB0aGUgY29kZSBldmVuIGNsZWFuZXIsIChiKSBhbGxvdyBtZSB0byBkbwotLSAgICogdGhlIERESSAoRGV2aWNlIERyaXZlciBJbnRlcmZhY2UpIHRoZSB3YXkgSSB3YW50IHRvLCBhbmQgKGMpLAotLSAgICogaXQgd2lsbCBhbGxvdyBmb3IgZWFzeSBhZGRpdGlvbiBvZiBmcmFnZ2luZy4gIEFueSB0YWtlcnM/IC1GdksKLS0gICAqLwotLSAgaWYgKChpcGgtPmZyYWdfb2ZmICYgMzIpIHx8IChudG9ocyhpcGgtPmZyYWdfb2ZmKSAmIDB4MWZmZikpIHsKLSsgICAqIFJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzLiAqLwotKwotKyAgaWYgKChpcGgtPmZyYWdfb2ZmICYgMHgwMDIwKSB8fCAobnRvaHMoaXBoLT5mcmFnX29mZikgJiAweDFmZmYpKSB7Ci0rI2lmZGVmIENPTkZJR19JUF9ERUZSQUcKLSsgICAgICBpcF9kZWZyYWcoc2tiKTsKLSsjZWxzZQotIAlwcmludGsoIlxuSVA6ICoqKiBkYXRhZ3JhbSBmcmFnbWVudGF0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKioqXG4iKTsKLSAJcHJpbnRrKCIgICAgU1JDID0gJXMgICAiLCBpbl9udG9hKGlwaC0+c2FkZHIpKTsKLSAJcHJpbnRrKCIgICAgRFNUID0gJXMgKGlnbm9yZWQpXG4iLCBpbl9udG9hKGlwaC0+ZGFkZHIpKTsKLUBAIC02MDYsNiArNjI4LDcgQEAKLSAJc2tiLT5zayA9IE5VTEw7Ci0gCWtmcmVlX3NrYihza2IsIEZSRUVfV1JJVEUpOwotIAlyZXR1cm4oMCk7Ci0rI2VuZGlmCi0gICB9Ci0gCi0gICAvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSwganVzdCBwYXN0IHRoZSBoZWFkZXIuICovCi1AQCAtNjQ2LDcgKzY2OSw3IEBACi0gCSogYmFzZWQgb24gdGhlIGRhdGFncmFtIHByb3RvY29sLiAgV2Ugc2hvdWxkIHJlYWxseQotIAkqIGNoZWNrIHRoZSBwcm90b2NvbCBoYW5kbGVyJ3MgcmV0dXJuIHZhbHVlcyBoZXJlLi4uCi0gCSovCi0tCWlwcHJvdC0+aGFuZGxlcihza2IyLCBkZXYsICZvcHQsIGlwaC0+ZGFkZHIsCi0rCWlwcHJvdC0+aGFuZGxlcihza2IyLCBkZXYsIG9wdHNfcCA/ICZvcHQgOiAwLCBpcGgtPmRhZGRyLAotIAkJCShudG9ocyhpcGgtPnRvdF9sZW4pIC0gKGlwaC0+aWhsICogNCkpLAotIAkJCWlwaC0+c2FkZHIsIDAsIGlwcHJvdCk7Ci0gCi1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9uZXQvaW5ldC9sYW5jZS5jIGxpbnV4L25ldC9pbmV0L2xhbmNlLmMKLS0tLSBwbDEyL2xpbnV4L25ldC9pbmV0L2xhbmNlLmMJRnJpIEF1ZyAxMyAwNDo1Njo1NCAxOTkzCi0rKysgbGludXgvbmV0L2luZXQvbGFuY2UuYwlGcmkgU2VwICAzIDIyOjUwOjEwIDE5OTMKLUBAIC03LDEzICs3LDE0IEBACi0gICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwKLSAgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gCi0tICAgIFRoaXMgZHJpdmVyIHNob3VsZCB3b3JrIHdpdGggdGhlIEFsbGllZCBUZWxlc2lzIDE1MDAsIGFuZCBORTIxMDAgY2xvbmVzLgotKyAgICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEFsbGllZCBUZWxlc2lzIEFUMTUwMCwgYW5kIHNob3VsZCB3b3JrIHdpdGgKLSsgICAgTkUyMTAwIGNsb25lcy4KLSAKLSAgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc3VwZXIub3JnIG9yCi0gICAgIEMvTyBTdXBlcmNvbXB1dGluZyBSZXNlYXJjaCBDdHIuLCAxNzEwMCBTY2llbmNlIERyLiwgQm93aWUgTUQgMjA3MTUKLSAqLwotIAotLXN0YXRpYyBjaGFyICp2ZXJzaW9uID0gImxhbmNlLmM6djAuMDggOC8xMi85MyBiZWNrZXJAc3VwZXIub3JnXG4iOwotK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gImxhbmNlLmM6djAuMTIgOS8zLzkzIGJlY2tlckBzdXBlci5vcmdcbiI7Ci0gCi0gI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLUBAIC0yMiw2ICsyMyw3IEBACi0gLyojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ki8KLSAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotICNpbmNsdWRlIDxhc20vaW8uaD4KLSAjaW5jbHVkZSA8YXNtL2RtYS5oPgotIC8qI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4qLwotQEAgLTMyLDEyICszNCwxMiBAQAotICNpbmNsdWRlICJza2J1ZmYuaCIKLSAjaW5jbHVkZSAiYXJwLmgiCi0gCi0rI2lmbmRlZiBIQVZFX0FVVE9JUlEKLSAvKiBGcm9tIGF1dG9faXJxLmMsIHNob3VsZCBiZSBpbiBhICouaCBmaWxlLiAqLwotIGV4dGVybiB2b2lkIGF1dG9pcnFfc2V0dXAoaW50IHdhaXR0aW1lKTsKLSBleHRlcm4gaW50IGF1dG9pcnFfcmVwb3J0KGludCB3YWl0dGltZSk7Ci0gZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKmlycTJkZXZfbWFwWzE2XTsKLS0KLS1leHRlcm4gdm9pZCBwcmludGtfc3RhdHMoc3RydWN0IGVuZXRfc3RhdGlzdGljcyAqc3RhdHMpOwotKyNlbmRpZgotIAotICNpZmRlZiBMQU5DRV9ERUJVRwotIGludCBsYW5jZV9kZWJ1ZyA9IExBTkNFX0RFQlVHOwotQEAgLTYwLDYgKzYyLDcgQEAKLSAjZGVmaW5lIExBTkNFX0FERFIgMHgxMgotICNkZWZpbmUgTEFOQ0VfUkVTRVQgMHgxNAotICNkZWZpbmUgTEFOQ0VfQlVTX0lGIDB4MTYKLSsjZGVmaW5lIExBTkNFX1RPVEFMX1NJWkUgMHgxOAotIAotIC8qIFRoZSBMQU5DRSBSeCBhbmQgVHggcmluZyBkZXNjcmlwdG9ycy4gKi8KLSBzdHJ1Y3QgbGFuY2VfcnhfaGVhZCB7Ci1AQCAtOTYsMTQgKzk5LDE3IEBACi0gICAgIGludCBwYWQwLCBwYWQxOwkJLyogVXNlZCBmb3IgYWxpZ25tZW50ICovCi0gfTsKLSAKLS0vKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIHRoZSBsYWNrIG9mIGEgZXRoZXJjYXJkIGxvdy1tZW1vcnkKLS0gICBhbGxvY2F0aW9uIHNjaGVtZS4gIFdlIG5lZWQgaXQgZm9yIGJ1cy1tYXN0ZXIgb3IgRE1BIGV0aGVyY2FyZHMgaWYKLS0gICB0aGV5IGFyZSB0byB3b3JrID4xNk0gbWVtb3J5IHN5c3RlbXMuICAqLwotKy8qIFdlIG5lZWQgYSBldGhlcmNhcmQgbG93LW1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZSBmb3IgZm9yIGJ1cy1tYXN0ZXIgb3IKLSsgICBETUEgZXRoZXJjYXJkcyBpZiB0aGV5IGFyZSB0byB3b3JrID4xNk0gbWVtb3J5IHN5c3RlbXMuIFRoaXMgaXMgYQotKyAgIHRlbXBvcmFyeSBzb2x1dGlvbiB0byB0aGUgbGFjayBvZiBvbmUsIGJ1dCBpdCBsaW1pdHMgdXMgdG8gYSBzaW5nbGUKLSsgICBBVDE1MDAgYW5kIDwxNk0uIEJ1bW1lci4gKi8KLSsKLSAjZGVmaW5lIFBLVF9CVUZfU1oJMTU1MAotIHN0YXRpYyBjaGFyIHJ4X2J1ZmZzW1BLVF9CVUZfU1pdW1JJTkdfU0laRV07Ci0gCi0taW50IGF0MTUwMF9pbml0KGludCBpb2FkZHIsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci0raW50IGF0MTUwMF9wcm9iZTEoc3RydWN0IGRldmljZSAqZGV2KTsKLSBzdGF0aWMgaW50IGxhbmNlX29wZW4oc3RydWN0IGRldmljZSAqZGV2KTsKLStzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3Jpbmcoc3RydWN0IGRldmljZSAqZGV2KTsKLSBzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRldmljZSAqZGV2KTsKLSBzdGF0aWMgaW50IGxhbmNlX3J4KHN0cnVjdCBkZXZpY2UgKmRldik7Ci0gc3RhdGljIHZvaWQgbGFuY2VfaW50ZXJydXB0KGludCByZWdfcHRyKTsKLUBAIC0xMTksMzMgKzEyNSw1MiBAQAotIGludCBhdDE1MDBfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotIHsKLSAgICAgaW50ICpwb3J0LCBwb3J0c1tdID0gezB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwfTsKLS0gICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwotLQotLSAgICBpZiAoaW9hZGRyID4gMHgxMDApCi0tCXJldHVybiAhIGF0MTUwMF9pbml0KGlvYWRkciwgZGV2KTsKLSsgICAgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOwotIAotKyAgICBpZiAoYmFzZV9hZGRyIDwgMCkKLSsJcmV0dXJuIEVOWElPOwkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLwotKyAgICBpZiAoYmFzZV9hZGRyID4gMHgxMDApCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KLSsJcmV0dXJuIGF0MTUwMF9wcm9iZTEoZGV2KTsKLSsKLSsgICAgLyogRmlyc3QgcHJvYmUgZm9yIHRoZSBldGhlcmNhcmQgSUQsIDB4NTcsIGFuZCB0aGVuIGxvb2sgZm9yIGEgTEFOQ0UKLSsgICAgICAgY2hpcC4gKi8KLSsgICAgCi0gICAgIGZvciAocG9ydCA9ICZwb3J0c1swXTsgKnBvcnQ7IHBvcnQrKykgewotLQkvKiBQcm9iZSBmb3IgdGhlIEFsbGllZC1UZWxlc3lzIHZlbmRvciBJRC4gIFRoaXMgd2lsbCBub3QgZGV0ZWN0Ci0tCSAgIG90aGVyIE5FMjEwMC1saWtlIGV0aGVyY2FyZHMsIHdoaWNoIG11c3QgdXNlIGEgaGFyZC13aXJlZCBpb2FkZHIuCi0tCSAgIFRoZXJlIG11c3QgYmUgYSBiZXR0ZXIgd2F5IHRvIGRldGVjdCBhIExBTkNFLi4uICovCi0tCWludCBpb2FkZHIgPSAqcG9ydDsKLS0JaWYgKGluYihpb2FkZHIpICE9IDB4MDAKLS0JICAgIHx8IGluYihpb2FkZHIrMSkgIT0gMHgwMAotLQkgICAgfHwgaW5iKGlvYWRkcisyKSAhPSAweEY0KQotKwlpbnQgcHJvYmVfYWRkciA9ICpwb3J0OwotKwlzaG9ydCB0ZW1wOwotKwotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rCWlmIChjaGVja19yZWdpb24ocHJvYmVfYWRkciwgTEFOQ0VfVE9UQUxfU0laRSkpCi0rCSAgICBjb250aW51ZTsKLSsjZW5kaWYKLSsJaWYgKGluYihwcm9iZV9hZGRyICsgMTQpICE9IDB4NTcKLSsJICAgIHx8IGluYihwcm9iZV9hZGRyICsgMTUpICE9IDB4NTcpCi0rCSAgICBjb250aW51ZTsKLSsKLSsJLyogUmVzZXQgdGhlIExBTkNFLiBVbi1SZXNldCBuZWVkZWQgb25seSBmb3IgdGhlIHJlYWwgTkUyMTAwLiAqLwotKwl0ZW1wID0gaW53KHByb2JlX2FkZHIrTEFOQ0VfUkVTRVQpOyAvKiBSZXNldCB0aGUgTEFOQ0UgKi8KLSsJb3V0dyh0ZW1wLCBwcm9iZV9hZGRyK0xBTkNFX1JFU0VUKTsJLyogIlVuLXJlc2V0IiAqLwotKwkKLSsJb3V0dygweDAwMDAsIHByb2JlX2FkZHIrTEFOQ0VfQUREUik7IC8qIFN3aXRjaCB0byB3aW5kb3cgMCAqLwotKwlpZiAoaW53KHByb2JlX2FkZHIrTEFOQ0VfREFUQSkgIT0gMHgwMDA0KQotIAkgICAgY29udGludWU7Ci0tCWlmIChhdDE1MDBfaW5pdChpb2FkZHIsIGRldikpCi0rCWRldi0+YmFzZV9hZGRyID0gcHJvYmVfYWRkcjsKLSsJaWYgKGF0MTUwMF9wcm9iZTEoZGV2KSA9PSAwKQotIAkgICAgcmV0dXJuIDA7Ci0gICAgIH0KLS0gICAgcmV0dXJuIDE7CQkJLyogRU5PREVWIHdvdWxkIGJlIG1vcmUgYWNjdXJhdGUuICovCi0rCi0rICAgIGRldi0+YmFzZV9hZGRyID0gYmFzZV9hZGRyOwotKyAgICByZXR1cm4gRU5PREVWOwkJCS8qIEVOT0RFViB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlLiAqLwotIH0KLSAKLSBpbnQKLS1hdDE1MDBfaW5pdChpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi0rYXQxNTAwX3Byb2JlMShzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7Ci0rICAgIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwotKwotICAgICBpbnQgaTsKLSAKLS0gICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7Ci0gICAgIHByaW50aygiJXM6IExBTkNFIGF0ICUjM3gsIGFkZHJlc3MiLCBkZXYtPm5hbWUsIGlvYWRkcik7Ci0gCi0gICAgIC8qIFRoZXJlIGlzIGEgMTYgYnl0ZSBzdGF0aW9uIGFkZHJlc3MgUFJPTSBhdCB0aGUgYmFzZSBhZGRyZXNzLgotQEAgLTE2MywxMiArMTg4LDE2IEBACi0gCi0gICAgIGlmICgoaW50KWRldi0+cHJpdiAmIDB4ZmYwMDAwMDAgIHx8ICAoaW50KSByeF9idWZmcyAmIDB4ZmYwMDAwMDApIHsKLSAJcHJpbnRrKCIgZGlzYWJsZWQgKGJ1ZmYgJSN4ID4gMTZNKS5cbiIsIChpbnQpcnhfYnVmZnMpOwotLQlyZXR1cm4gMDsKLSsJcmV0dXJuIC1FTk9NRU07Ci0gICAgIH0KLSAKLSAgICAgbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBsYW5jZV9wcml2YXRlKSk7Ci0gICAgIGxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OwotIAotKyAgICBpZiAoKGludCkobHAtPnJ4X3JpbmcpICYgMHgwNykKLSsJcHJpbnRrKCIlczogTEFOQ0UgUnggYW5kIFR4IHJpbmdzIG5vdCBvbiBldmVuIGJvdW5kYXJ5LlxuIiwKLSsJICAgICAgIGRldi0+bmFtZSk7Ci0rCi0gICAgIC8qIFVuLVJlc2V0IHRoZSBMQU5DRSwgbmVlZGVkIG9ubHkgZm9yIHRoZSBORTIxMDAuICovCi0gICAgIG91dHcoMCwgaW9hZGRyK0xBTkNFX1JFU0VUKTsKLSAKLUBAIC0xOTksMTEgKzIyOCwxNCBAQAotIAkgICAgcHJpbnRrKCIsIHVzaW5nIElSUSAlZC5cbiIsIGRldi0+aXJxKTsKLSAJZWxzZSB7Ci0gCSAgICBwcmludGsoIiwgZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIpOwotLQkgICAgcmV0dXJuIDA7Ci0rCSAgICByZXR1cm4gLUVBR0FJTjsKLSAJfQotICAgICB9IGVsc2UKLSAJcHJpbnRrKCIgYXNzaWduZWQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOwotIAotKyAgICAvKiBUaGUgRE1BIGNoYW5uZWwgbWF5IGJlIHBhc3NlZCBpbiBvbiB0aGlzIHBhcmFtZXRlci4gKi8KLSsgICAgZGV2LT5kbWEgPSBkZXYtPm1lbV9zdGFydCAmIDB4MDc7Ci0rCi0gI2lmbmRlZiBORTIxMDAJCQkvKiBUaGUgTkUyMTAwIG1pZ2h0IG5vdCB1bmRlcnN0YW5kICovCi0gICAgIC8qIFR1cm4gb24gYXV0by1zZWxlY3Qgb2YgbWVkaWEgKDEwYmFzZVQgb3IgQk5DKSBzbyB0aGF0IHRoZSB1c2VyCi0gICAgICAgIGNhbiB3YXRjaCB0aGUgTEVEcyBldmVuIGlmIHRoZSBib2FyZCBpc24ndCBvcGVuZWQuICovCi1AQCAtMjExLDkgKzI0Myw5IEBACi0gICAgIG91dHcoMHgwMDAyLCBpb2FkZHIrTEFOQ0VfQlVTX0lGKTsKLSAjZW5kaWYKLSAKLS0gICAgaWYgKChpbnQpKGxwLT5yeF9yaW5nKSAmIDB4MDcpCi0tCXByaW50aygiJXM6IExBTkNFIFJ4IGFuZCBUeCByaW5ncyBub3Qgb24gZXZlbiBib3VuZGFyeS5cbiIsCi0tCSAgICAgICBkZXYtPm5hbWUpOwotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rICAgIHNuYXJmX3JlZ2lvbihpb2FkZHIsIExBTkNFX1RPVEFMX1NJWkUpOwotKyNlbmRpZgotIAotICAgICBpZiAobGFuY2VfZGVidWcgPiAwKQotIAlwcmludGsodmVyc2lvbik7Ci1AQCAtMjI1LDcgKzI1Nyw2IEBACi0gICAgIGRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKLSAKLSAgICAgZGV2LT5tZW1fc3RhcnQgPSAwOwotLSAgICBkZXYtPnJtZW1fZW5kID0gMHgwMGZmZmZmZjsJCS8qIEJvZ3VzLCBuZWVkZWQgZm9yIGRldl9yaW50KCkuICovCi0gCi0gICAgIC8qIEZpbGwgaW4gdGhlIGdlbmVyaWMgZmllbGQgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0gICAgIGZvciAoaSA9IDA7IGkgPCBERVZfTlVNQlVGRlM7IGkrKykKLUBAIC0yNTMsNyArMjg0LDcgQEAKLSAgICAgZGV2LT5wYV9tYXNrCT0gMDsKLSAgICAgZGV2LT5wYV9hbGVuCT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotIAotLSAgICByZXR1cm4gaW9hZGRyOwotKyAgICByZXR1cm4gMDsKLSB9Ci0gCi0gDAotQEAgLTI2OCw4ICsyOTksNyBAQAotIAlyZXR1cm4gLUVBR0FJTjsKLSAgICAgfQotIAotLSAgICBpZiAobHAtPmRtYSA8IDEpCi0tCWxwLT5kbWEgPSBERUZBVUxUX0RNQTsKLSsgICAgbHAtPmRtYSA9IGRldi0+ZG1hID8gZGV2LT5kbWEgOiBERUZBVUxUX0RNQTsKLSAKLSAgICAgaWYgKHJlcXVlc3RfZG1hKGxwLT5kbWEpKSB7Ci0gCWZyZWVfaXJxKGRldi0+aXJxKTsKLUBAIC0yODcsNyArMzE3LDggQEAKLSAgICAgLyogVW4tUmVzZXQgdGhlIExBTkNFLCBuZWVkZWQgb25seSBmb3IgdGhlIE5FMjEwMC4gKi8KLSAgICAgb3V0dygwLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOwotIAotLSNpZm5kZWYgTkUyMTAwCQkJLyogVGhlIE5FMjEwMCBtaWdodCBub3QgdW5kZXJzdGFuZCAqLwotKyNpZm5kZWYgTkUyMTAwCi0rICAgIC8qIFRoaXMgaXMgcmVhbGx5IDc5Qzk2MC1zcGVjaWZpYywgTkUyMTAwIG1pZ2h0IG5vdCB1bmRlcnN0YW5kICovCi0gICAgIC8qIFR1cm4gb24gYXV0by1zZWxlY3Qgb2YgbWVkaWEgKDEwYmFzZVQgb3IgQk5DKS4gKi8KLSAgICAgb3V0dygweDAwMDIsIGlvYWRkcitMQU5DRV9BRERSKTsKLSAgICAgb3V0dygweDAwMDIsIGlvYWRkcitMQU5DRV9CVVNfSUYpOwotQEAgLTI5OCwyMyArMzI5LDcgQEAKLSAJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGxwLT5kbWEsIGxwLT50eF9yaW5nLCBscC0+cnhfcmluZywKLSAJICAgICAgICZscC0+aW5pdF9ibG9jayk7Ci0gCi0tICAgIGxwLT5jdXJfcnggPSBscC0+Y3VyX3R4ID0gMDsKLS0gICAgbHAtPmRpcnR5X3J4ID0gbHAtPmRpcnR5X3R4ID0gMDsKLS0KLS0gICAgZm9yIChpID0gMDsgaSA8IFJJTkdfU0laRTsgaSsrKSB7Ci0tCWxwLT5yeF9yaW5nW2ldLmJhc2UgPSAoaW50KXJ4X2J1ZmZzIHwgMHg4MDAwMDAwMCArIGkqUEtUX0JVRl9TWjsKLS0JbHAtPnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCA9IC1QS1RfQlVGX1NaOwotLQlscC0+dHhfcmluZ1tpXS5iYXNlID0gMDsKLS0gICAgfQotLQotLSAgICBscC0+aW5pdF9ibG9jay5tb2RlID0gMHgwMDAwOwotLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotLQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOwotLSAgICBscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOwotLSAgICBscC0+aW5pdF9ibG9jay5maWx0ZXJbMV0gPSAweDAwMDAwMDAwOwotLSAgICBscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKGludClscC0+cnhfcmluZyB8IFJJTkdfTEVOX0JJVFM7Ci0tICAgIGxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSAoaW50KWxwLT50eF9yaW5nIHwgUklOR19MRU5fQklUUzsKLS0KLSsgICAgbGFuY2VfaW5pdF9yaW5nKGRldik7Ci0gICAgIC8qIFJlLWluaXRpYWxpemUgdGhlIExBTkNFLCBhbmQgc3RhcnQgaXQgd2hlbiBkb25lLiAqLwotICAgICBvdXR3KDB4MDAwMSwgaW9hZGRyK0xBTkNFX0FERFIpOwotICAgICBvdXR3KChzaG9ydCkgJmxwLT5pbml0X2Jsb2NrLCBpb2FkZHIrTEFOQ0VfREFUQSk7Ci1AQCAtMzQzLDYgKzM1OCwzMSBAQAotICAgICByZXR1cm4gMDsJCQkvKiBBbHdheXMgc3VjY2VlZCAqLwotIH0KLSAKLSsvKiBJbml0aWFsaXplIHRoZSBMQU5DRSBSeCBhbmQgVHggcmluZ3MuICovCi0rc3RhdGljIHZvaWQKLStsYW5jZV9pbml0X3Jpbmcoc3RydWN0IGRldmljZSAqZGV2KQotK3sKLSsgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OwotKyAgICBpbnQgaTsKLSsKLSsgICAgbHAtPmN1cl9yeCA9IGxwLT5jdXJfdHggPSAwOwotKyAgICBscC0+ZGlydHlfcnggPSBscC0+ZGlydHlfdHggPSAwOwotKwotKyAgICBmb3IgKGkgPSAwOyBpIDwgUklOR19TSVpFOyBpKyspIHsKLSsJbHAtPnJ4X3JpbmdbaV0uYmFzZSA9IChpbnQpcnhfYnVmZnMgfCAweDgwMDAwMDAwICsgaSpQS1RfQlVGX1NaOwotKwlscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoID0gLVBLVF9CVUZfU1o7Ci0rCWxwLT50eF9yaW5nW2ldLmJhc2UgPSAwOwotKyAgICB9Ci0rCi0rICAgIGxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDAwMDA7Ci0rICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0rCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV07Ci0rICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDB4MDAwMDAwMDA7Ci0rICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7Ci0rICAgIGxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAoaW50KWxwLT5yeF9yaW5nIHwgUklOR19MRU5fQklUUzsKLSsgICAgbHAtPmluaXRfYmxvY2sudHhfcmluZyA9IChpbnQpbHAtPnR4X3JpbmcgfCBSSU5HX0xFTl9CSVRTOwotK30KLSsKLSBzdGF0aWMgaW50Ci0gbGFuY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotQEAgLTM1MiwxOCArMzkyLDE2IEBACi0gICAgIC8qIFRyYW5zbWl0dGVyIHRpbWVvdXQsIHNlcmlvdXMgcHJvYmxlbXMuICovCi0gICAgIGlmIChkZXYtPnRidXN5KSB7Ci0gCWludCB0aWNrc3NvZmFyID0gamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQ7Ci0tCWludCBlbnRyeSA9IGxwLT5jdXJfdHgrKzsKLSAJaWYgKHRpY2tzc29mYXIgPCA1KQotIAkgICAgcmV0dXJuIDE7Ci0gCW91dHcoMCwgaW9hZGRyK0xBTkNFX0FERFIpOwotLQlwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwKLS0JICAgICAgIGludyhpb2FkZHIrTEFOQ0VfREFUQSkpOwotKwlwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgcmVzZXR0aW5nLlxuIiwKLSsJICAgICAgIGRldi0+bmFtZSwgaW53KGlvYWRkcitMQU5DRV9EQVRBKSk7Ci0gCi0tCWlmIChscC0+dHhfcmluZ1soZW50cnkrMSkgJiBSSU5HX01PRF9NQVNLXS5iYXNlID49IDApCi0tCSAgICBkZXYtPnRidXN5PTA7Ci0tCWVsc2UKLS0JICAgIG91dHcoMHgwMCwgaW9hZGRyK0xBTkNFX0RBVEEpLAotLQkgICAgb3V0dygweDQzLCBpb2FkZHIrTEFOQ0VfREFUQSk7OwotKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKLSsJb3V0dygweDQzLCBpb2FkZHIrTEFOQ0VfREFUQSk7Ci0rCi0rCWRldi0+dGJ1c3k9MDsKLSAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0gCi0gCXJldHVybiAwOwotQEAgLTQ0Niw3ICs0ODQsNyBAQAotIGxhbmNlX2ludGVycnVwdChpbnQgcmVnX3B0cikKLSB7Ci0gICAgIGludCBpcnEgPSAtKCgoc3RydWN0IHB0X3JlZ3MgKilyZWdfcHRyKS0+b3JpZ19lYXgrMik7Ci0tICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IGlycTJkZXZfbWFwW2lycV07Ci0rICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9IChzdHJ1Y3QgZGV2aWNlICopKGlycTJkZXZfbWFwW2lycV0pOwotICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7Ci0gICAgIGludCBjc3IwLCBpb2FkZHI7Ci0gCi1AQCAtNTEwLDYgKzU0OCw3IEBACi0gCQlrZnJlZV9za2IgKHNrYi0xLCBGUkVFX1dSSVRFKTsKLSAJICAgIGRpcnR5X3R4ID0gKytscC0+ZGlydHlfdHggJiBSSU5HX01PRF9NQVNLOwotIAl9Ci0rCS8qIG1hcmtfYmgoSU5FVF9CSCk7ICovCi0gICAgIH0KLSAKLSAgICAgLyogQ2xlYXIgdGhlIGludGVycnVwdHMgd2UndmUgaGFuZGxlZC4gKi8KLUBAIC01MzEsMjEgKzU3MCwxMCBAQAotICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilkZXYtPnByaXY7Ci0gICAgIGludCBlbnRyeSA9IGxwLT5jdXJfcnggJiBSSU5HX01PRF9NQVNLOwotIAkKLS0gICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIG93biB0aGlzIGVudHJ5LiAqLwotKyAgICAvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLwotICAgICB3aGlsZSAobHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgPj0gMCkgewotIAlpbnQgc3RhdHVzID0gbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgPj4gMjQ7Ci0tCWlmIChsYW5jZV9kZWJ1ZyA+IDUpIHsKLS0JICAgIHVuc2lnbmVkIGNoYXIgKnBrdCA9Ci0tCQkodW5zaWduZWQgY2hhciAqKShscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSAmIDB4MDBmZmZmZmYpOwotLQkgICAgcHJpbnRrKCIlczogUnggcGFja2V0IGF0IHJpbmcgZW50cnkgJWQsIGxlbiAlZCBzdGF0dXMgJTIuMnguXG4iLAotLQkJICAgZGV2LT5uYW1lLCBlbnRyeSwgbHAtPnJ4X3JpbmdbZW50cnldLm1zZ19sZW5ndGgsCi0tCQkgICBscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSA+PiAyNCk7Ci0tCSAgICBwcmludGsoIiVzOiAgUnggJTIuMnggJTIuMnggJTIuMnggLi4uICUyLjJ4ICAlMi4yeCAlMi4yeCAlMi4yeC4uLiUyLjJ4IGxlbiAlMi4yeCAlMi4yeCAgJTIuMnggJTIuMnguXG4iLAotLQkJICAgZGV2LT5uYW1lLCBwa3RbMF0sIHBrdFsxXSwgcGt0WzJdLCBwa3RbNV0sIHBrdFs2XSwKLS0JCSAgIHBrdFs3XSwgcGt0WzhdLCBwa3RbMTFdLCBwa3RbMTJdLCBwa3RbMTNdLAotLQkJICAgcGt0WzE0XSwgcGt0WzE1XSk7Ci0tCX0KLS0JLyogSWYgc28sIGNvcHkgaXQgdG8gdGhlIHVwcGVyIGxheWVycy4gKi8KLSsKLSAJaWYgKHN0YXR1cyAmIDB4NDApIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLwotIAkgICAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwotIAkgICAgaWYgKHN0YXR1cyAmIDB4MjApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLUBAIC01NTMsMTIgKzU4MSwzMyBAQAotIAkgICAgaWYgKHN0YXR1cyAmIDB4MDgpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7Ci0gCSAgICBpZiAoc3RhdHVzICYgMHgwNCkgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7Ci0gCX0gZWxzZSB7Ci0tCSAgICBpZiAoZGV2X3JpbnQoKHVuc2lnbmVkIGNoYXIgKikobHAtPnJ4X3JpbmdbZW50cnldLmJhc2UKLS0JCQkJCSAgICYgMHgwMGZmZmZmZiksCi0tCQkJIGxwLT5yeF9yaW5nW2VudHJ5XS5tc2dfbGVuZ3RoLCAwLCBkZXYpKSB7Ci0rCSAgICAvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0yZS4gKi8KLSsJICAgIHNob3J0IHBrdF9sZW4gPSBscC0+cnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aDsKLSsJICAgIGludCBza3NpemUgPSBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpICsgcGt0X2xlbjsKLSsJICAgIHN0cnVjdCBza19idWZmICpza2I7Ci0rCSAgICBza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikga21hbGxvYyhza3NpemUsIEdGUF9BVE9NSUMpOwotKwkgICAgaWYgKHNrYiA9PSBOVUxMKSB7Ci0rCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7Ci0rCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwkvKiBSZWFsbHksIGRlZmVycmVkLiAqLwotKwkJYnJlYWs7Ci0rCSAgICB9Ci0rCSAgICBza2ItPm1lbV9sZW4gPSBza3NpemU7Ci0rCSAgICBza2ItPm1lbV9hZGRyID0gc2tiOwotKwkgICAgc2tiLT5sZW4gPSBwa3RfbGVuOwotKwkgICAgc2tiLT5kZXYgPSBkZXY7Ci0rCSAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgKHNrYiArIDEpLAotKwkJICAgKHVuc2lnbmVkIGNoYXIgKikobHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgJiAweDAwZmZmZmZmKSwKLSsJCSAgIHBrdF9sZW4pOwotKyNpZmRlZiBIQVZFX05FVElGX1JYCi0rCSAgICBuZXRpZl9yeChza2IpOwotKyNlbHNlCi0rCSAgICBza2ItPmxvY2sgPSAwOwotKwkgICAgaWYgKGRldl9yaW50KCh1bnNpZ25lZCBjaGFyKilza2IsIHBrdF9sZW4sIElOX1NLQlVGRiwgZGV2KSAhPSAwKSB7Ci0rCQlrZnJlZV9zKHNrYiwgc2tzaXplKTsKLSAJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gCQlicmVhazsKLSAJICAgIH0KLSsjZW5kaWYKLSAJICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gCX0KLSAKLUBAIC01NjUsNiArNjE0LDEwIEBACi0gCWxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlIHw9IDB4ODAwMDAwMDA7Ci0gCWVudHJ5ID0gKGVudHJ5KzEpICYgUklOR19NT0RfTUFTSzsKLSAgICAgfQotKwotKyAgICAvKiBXZSBzaG91bGQgY2hlY2sgdGhhdCBhdCBsZWFzdCB0d28gcmluZyBlbnRyaWVzIGFyZSBmcmVlLiAgSWYgbm90LAotKyAgICAgICB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KLSsKLSAgICAgbHAtPmN1cl9yeCA9IGVudHJ5OwotIAotICAgICByZXR1cm4gMDsKLUBAIC01ODcsMTAgKzY0MCw2IEBACi0gICAgIGlmIChsYW5jZV9kZWJ1ZyA+IDEpCi0gCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKLSAJICAgICAgIGRldi0+bmFtZSwgaW53KGlvYWRkcitMQU5DRV9EQVRBKSk7Ci0tI2lmZGVmIFBSSU5US19TVEFUUwotLSAgICBpZiAobGFuY2VfZGVidWcgPiAyKQotLQlwcmludGtfc3RhdHMoJmxwLT5zdGF0cyk7Ci0tI2VuZGlmCi0gCi0gICAgIC8qIFdlIHN0b3AgdGhlIExBTkNFIGhlcmUgLS0gaXQgb2NjYXNpb25hbGx5IHBvbGxzCi0gICAgICAgIG1lbW9yeSBpZiB3ZSBkb24ndC4gKi8KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0L2xvb3BiYWNrLmMgbGludXgvbmV0L2luZXQvbG9vcGJhY2suYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvbG9vcGJhY2suYwlTYXQgSnVsIDMxIDE1OjQyOjIyIDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC9sb29wYmFjay5jCUZyaSBBdWcgMjAgMTc6NTg6MjIgMTk5MwotQEAgLTUsMTAgKzUsMTEgQEAKLSAgKgotICAqCQlQc2V1ZG8tZHJpdmVyIGZvciB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlLgotICAqCi0tICogVmVyc2lvbjoJQCgjKWxvb3BiYWNrLmMJMS4wLjQJMDUvMjUvOTMKLSsgKiBWZXJzaW9uOglAKCMpbG9vcGJhY2suYwkxLjAuNGIJMDgvMTYvOTMKLSAgKgotICAqIEF1dGhvcnM6CVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KLSAgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+Ci0rICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgotICAqCi0gICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLUBAIC0zMCw2ICszMSw3IEBACi0gI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0rI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIEZvciB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCi0gI2luY2x1ZGUgImluZXQuaCIKLSAjaW5jbHVkZSAiZGV2LmgiCi0gI2luY2x1ZGUgImV0aC5oIgotQEAgLTQ0LDYgKzQ2LDcgQEAKLSBzdGF0aWMgaW50Ci0gbG9vcGJhY2tfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotKyAgc3RydWN0IGVuZXRfc3RhdGlzdGljcyAqc3RhdHMgPSAoc3RydWN0IGVuZXRfc3RhdGlzdGljcyAqKWRldi0+cHJpdjsKLSAgIGludCBkb25lOwotIAotICAgRFBSSU5URigoREJHX0xPT1BCLCAibG9vcGJhY2tfeG1pdChkZXY9JVgsIHNrYj0lWClcbiIsIGRldiwgc2tiKSk7Ci1AQCAtNTIsMTcgKzU1LDI3IEBACi0gICBjbGkoKTsKLSAgIGlmIChkZXYtPnRidXN5ICE9IDApIHsKLSAJc3RpKCk7Ci0rCXN0YXRzLT50eF9lcnJvcnMrKzsKLSAJcmV0dXJuKDEpOwotICAgfQotICAgZGV2LT50YnVzeSA9IDE7Ci0gICBzdGkoKTsKLSAKLS0gIGRvbmUgPSBkZXZfcmludCgodW5zaWduZWQgY2hhciAqKShza2IrMSksIHNrYi0+bGVuLCAwLCBkZXYpOwotLSAgaWYgKHNrYi0+ZnJlZSkga2ZyZWVfc2tiKHNrYiwgRlJFRV9XUklURSk7Ci0rICBza2ItPmxvY2sgPSAwOwotIAotLSAgd2hpbGUgKGRvbmUgIT0gMSkgewotLQlkb25lID0gZGV2X3JpbnQoTlVMTCwgMCwgMCwgZGV2KTsKLS0gIH0KLSsgIHN0YXRzLT50eF9wYWNrZXRzKys7Ci0rCi0rICAvKiBDb3B5IHRoZSBwYWNrZXQgb25seSBpZiBpdCBpc24ndCBtYXJrZWQgYXMgZnJlZS4gKi8KLSsKLSsgIGRvbmUgPSBkZXZfcmludCgodW5zaWduZWQgY2hhciAqKShza2ItPmZyZWUgPyBza2IgOiBza2IgKyAxKSwgc2tiLT5sZW4sCi0rCQkgIHNrYi0+ZnJlZSA/IElOX1NLQlVGRiA6IDAsIGRldik7Ci0rCi0rICBpZiAoZG9uZSAhPSAwKQotKyAgICAgIHN0YXRzLT5yeF9lcnJvcnMrKzsKLSsgIGVsc2UKLSsgICAgICBzdGF0cy0+cnhfcGFja2V0cysrOwotKwotKwotICAgZGV2LT50YnVzeSA9IDA7Ci0gCi0gI2lmIDEKLUBAIC04Myw2ICs5NiwxMSBAQAotICAgcmV0dXJuKDApOwotIH0KLSAKLStzdGF0aWMgc3RydWN0IGVuZXRfc3RhdGlzdGljcyAqCi0rZ2V0X3N0YXRzKHN0cnVjdCBkZXZpY2UgKmRldikKLSt7Ci0rICAgIHJldHVybiAoc3RydWN0IGVuZXRfc3RhdGlzdGljcyAqKWRldi0+cHJpdjsKLSt9Ci0gCi0gLyogSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgTE9PUEJBQ0sgZGV2aWNlLiAqLwotIGludAotQEAgLTExOCw2ICsxMzYsOSBAQAotICAgZGV2LT5wYV9icmRhZGRyCT0gaW5fYXRvbigiMTI3LjI1NS4yNTUuMjU1Iik7Ci0gICBkZXYtPnBhX21hc2sJCT0gaW5fYXRvbigiMjU1LjAuMC4wIik7Ci0gICBkZXYtPnBhX2FsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotLQotKyAgZGV2LT5wcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVuZXRfc3RhdGlzdGljcyksIEdGUF9LRVJORUwpOwotKyAgbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBlbmV0X3N0YXRpc3RpY3MpKTsKLSsgIGRldi0+Z2V0X3N0YXRzID0gZ2V0X3N0YXRzOwotKyAgCi0gICByZXR1cm4oMCk7Ci0gfTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0L25lLmMgbGludXgvbmV0L2luZXQvbmUuYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvbmUuYwlGcmkgQXVnIDEzIDA1OjU3OjI4IDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC9uZS5jCU1vbiBBdWcgMzAgMjM6MzU6MzYgMTk5MwotQEAgLTE3LDExICsxNywxMiBAQAotIC8qIFJvdXRpbmVzIGZvciB0aGUgTmF0U2VtaS1iYXNlZCBkZXNpZ25zIChORVsxMl0wMDApLiAqLwotIAotIHN0YXRpYyBjaGFyICp2ZXJzaW9uID0KLS0gICAgIm5lLmM6djAuOTktMTJCIDgvMTIvOTMgRG9uYWxkIEJlY2tlciAoYmVja2VyQHN1cGVyLm9yZylcbiI7Ci0rICAgICJuZS5jOnYwLjk5LTEzIDgvMzAvOTMgRG9uYWxkIEJlY2tlciAoYmVja2VyQHN1cGVyLm9yZylcbiI7Ci0gCi0gI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSsjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotICNpbmNsdWRlIDxhc20vaW8uaD4KLSAjaWZuZGVmIHBvcnRfcmVhZAotQEAgLTQxLDcgKzQyLDcgQEAKLSAjZGVmaW5lIE5FU01fU1RBUlRfUEcJMHg0MAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLwotICNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KLSAKLS1pbnQgbmVwcm9iZShpbnQgaW9hZGRyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotK2ludCBuZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotIHN0YXRpYyBpbnQgbmVwcm9iZTEoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2LCBpbnQgdmVyYm9zZSk7Ci0gCi0gc3RhdGljIHZvaWQgbmVfcmVzZXRfODM5MChzdHJ1Y3QgZGV2aWNlICpkZXYpOwotQEAgLTcyLDE3ICs3MywyOCBAQAotIAlFMjAxMAkgc3RhcnRzIGF0IDB4MTAwIGFuZCBlbmRzIGF0IDB4NDAwMC4KLSAJRTIwMTAteCBzdGFydHMgYXQgMHgxMDAgYW5kIGVuZHMgYXQgMHhmZmZmLiAgKi8KLSAKLS1pbnQgbmVwcm9iZShpbnQgaW9hZGRyLCAgc3RydWN0IGRldmljZSAqZGV2KQotK2ludCBuZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotICAgICBpbnQgKnBvcnQsIHBvcnRzW10gPSB7MHgzMDAsIDB4MjgwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwfTsKLSsgICAgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0gCi0rICAgIGlmIChpb2FkZHIgPCAwKQotKwlyZXR1cm4gRU5YSU87CQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCi0gICAgIGlmIChpb2FkZHIgPiAweDEwMCkKLS0JcmV0dXJuIG5lcHJvYmUxKGlvYWRkciwgZGV2LCAxKTsKLSsJcmV0dXJuICEgbmVwcm9iZTEoaW9hZGRyLCBkZXYsIDEpOwotIAotLSAgICBmb3IgKHBvcnQgPSAmcG9ydHNbMF07ICpwb3J0OyBwb3J0KyspCi0tCWlmIChpbmJfcCgqcG9ydCkgIT0gMHhmZiAmJiBuZXByb2JlMSgqcG9ydCwgZGV2LCAwKSkKLS0JICAgIHJldHVybiBkZXYtPmJhc2VfYWRkciA9ICpwb3J0OwotLSAgICByZXR1cm4gMDsKLSsgICAgZm9yIChwb3J0ID0gJnBvcnRzWzBdOyAqcG9ydDsgcG9ydCsrKSB7Ci0rI2lmZGVmIEhBVkVfUE9SVFJFU0VSVkUKLSsJaWYgKGNoZWNrX3JlZ2lvbigqcG9ydCwgMzIpKQotKwkgICAgY29udGludWU7Ci0rI2VuZGlmCi0rCWlmIChpbmJfcCgqcG9ydCkgIT0gMHhmZiAmJiBuZXByb2JlMSgqcG9ydCwgZGV2LCAwKSkgewotKwkgICAgZGV2LT5iYXNlX2FkZHIgPSAqcG9ydDsKLSsJICAgIHJldHVybiAwOwotKwl9Ci0rICAgIH0KLSsgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7Ci0rICAgIHJldHVybiBFTk9ERVY7Ci0gfQotIAotIHN0YXRpYyBpbnQgbmVwcm9iZTEoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2LCBpbnQgdmVyYm9zZSkKLUBAIC0yMTYsMTIgKzIyOCwxNSBAQAotIAl9Ci0gICAgIH0KLSAKLS0gICAgcHJpbnRrKCJcbiVzOiAlcyBmb3VuZCBhdCAlI3gsIHVzaW5nIElSUSAlZC5cbiIsCi0tCSAgIGRldi0+bmFtZSwgbmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7Ci0tCi0gICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOwotIAotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rICAgIHNuYXJmX3JlZ2lvbihpb2FkZHIsIDMyKTsKLSsjZW5kaWYKLSsKLSAgICAgZXRoZGV2X2luaXQoZGV2KTsKLSsgICAgcHJpbnRrKCJcbiVzOiAlcyBmb3VuZCBhdCAlI3gsIHVzaW5nIElSUSAlZC5cbiIsCi0rCSAgIGRldi0+bmFtZSwgbmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7Ci0gCi0gICAgIGlmIChlaV9kZWJ1ZyA+IDApCi0gCXByaW50ayh2ZXJzaW9uKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0L3JvdXRlLmMgbGludXgvbmV0L2luZXQvcm91dGUuYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvcm91dGUuYwlTYXQgQXVnICA3IDE4OjM2OjUyIDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC9yb3V0ZS5jCUZyaSBBdWcgMjAgMDE6MTg6MTkgMTk5MwotQEAgLTIxOSw4ICsyMTksMTAgQEAKLSAJZGV2ID0gZGV2X2NoZWNrKCgoc3RydWN0IHNvY2thZGRyX2luICopICZyLT5ydF9kc3QpLT5zaW5fYWRkci5zX2FkZHIpOwotICAgZWxzZQotIAlpZiAoKHJ0ID0gcnRfcm91dGUoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnItPnJ0X2dhdGV3YXkpLT5zaW5fYWRkci4KLS0JICAgIHNfYWRkcixOVUxMKSkpIGRldiA9IHJ0LT5ydF9kZXY7Ci0tCWVsc2UgZGV2ID0gTlVMTDsKLSsJCQkgICBzX2FkZHIsTlVMTCkpKQotKwkgICAgZGV2ID0gcnQtPnJ0X2RldjsKLSsJZWxzZQotKwkgICAgZGV2ID0gTlVMTDsKLSAKLSAgIERQUklOVEYoKERCR19SVCwgIlJUOiBkZXYgZm9yICVzIGd3ICIsCi0gCWluX250b2EoKCooc3RydWN0IHNvY2thZGRyX2luICopJnItPnJ0X2RzdCkuc2luX2FkZHIuc19hZGRyKSkpOwotQEAgLTI1OCwxMiArMjYwLDE0IEBACi0gCi0gICBwb3MgPSBidWZmZXI7Ci0gCi0tICBwb3MgKz0gc3ByaW50Zihwb3MsICJJZmFjZVx0RGVzdGluYXRpb25cdEdhdGV3YXkgXHRGbGFnc1x0UmVmQ250XHRVc2VcbiIpOwotKyAgcG9zICs9IHNwcmludGYocG9zLAotKwkJICJJZmFjZVx0RGVzdGluYXRpb25cdEdhdGV3YXkgXHRGbGFnc1x0UmVmQ250XHRVc2VcdE1ldHJpY1xuIik7Ci0gICAKLSsgIC8qIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQgLS0gci0+cnRfZHN0IGlzIGEgc3RydWN0ISAqLwotICAgZm9yIChyID0gcnRfYmFzZTsgciAhPSBOVUxMOyByID0gci0+cnRfbmV4dCkgewotLSAgICAgICAgcG9zICs9IHNwcmludGYocG9zLCAiJXNcdCUwOFhcdCUwOFhcdCUwMlhcdCVkXHQlZFxuIiwKLSsgICAgICAgIHBvcyArPSBzcHJpbnRmKHBvcywgIiVzXHQlMDhYXHQlMDhYXHQlMDJYXHQlZFx0JWRcdCVkXG4iLAotIAkJci0+cnRfZGV2LT5uYW1lLCByLT5ydF9kc3QsIHItPnJ0X2dhdGV3YXksCi0tCQlyLT5ydF9mbGFncywgci0+cnRfcmVmY250LCByLT5ydF91c2UpOwotKwkJci0+cnRfZmxhZ3MsIHItPnJ0X3JlZmNudCwgci0+cnRfdXNlLCByLT5ydF9tZXRyaWMpOwotICAgfQotICAgcmV0dXJuKHBvcyAtIGJ1ZmZlcik7Ci0gfQotQEAgLTMxNyw3ICszMjEsOSBAQAotIGludAotIHJ0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLSB7Ci0rICBzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0gICBzdHJ1Y3QgcnRlbnRyeSBydDsKLSsgIGNoYXIgbmFtZWJ1ZlszMl07Ci0gICBpbnQgcmV0OwotIAotICAgc3dpdGNoKGNtZCkgewotQEAgLTMyNSwxNiArMzMxLDE3IEBACi0gCQlyZXQgPSBkYmdfaW9jdGwoYXJnLCBEQkdfUlQpOwotIAkJYnJlYWs7Ci0gCWNhc2UgU0lPQ0FERFJUOgotLQkJaWYgKCFzdXNlcigpKSByZXR1cm4oLUVQRVJNKTsKLS0JCXZlcmlmeV9hcmVhKFZFUklGWV9XUklURSwgYXJnLCBzaXplb2Yoc3RydWN0IHJ0ZW50cnkpKTsKLS0JCW1lbWNweV9mcm9tZnMoJnJ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOwotLQkJcmV0ID0gcnRfbmV3KCZydCk7Ci0tCQlicmVhazsKLSAJY2FzZSBTSU9DREVMUlQ6Ci0gCQlpZiAoIXN1c2VyKCkpIHJldHVybigtRVBFUk0pOwotIAkJdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLCBhcmcsIHNpemVvZihzdHJ1Y3QgcnRlbnRyeSkpOwotIAkJbWVtY3B5X2Zyb21mcygmcnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSk7Ci0tCQlyZXQgPSBydF9raWxsKCZydCk7Ci0rCQlpZiAocnQucnRfZGV2KSB7Ci0rCQkgICAgdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLCBydC5ydF9kZXYsIHNpemVvZiBuYW1lYnVmKTsKLSsJCSAgICBtZW1jcHlfZnJvbWZzKCZuYW1lYnVmLCBydC5ydF9kZXYsIHNpemVvZiBuYW1lYnVmKTsKLSsJCSAgICBkZXYgPSBkZXZfZ2V0KG5hbWVidWYpOwotKwkJICAgIHJ0LnJ0X2RldiA9IGRldjsKLSsJCX0KLSsJCXJldCA9IChjbWQgPT0gU0lPQ0RFTFJUKSA/IHJ0X2tpbGwoJnJ0KSA6IHJ0X25ldygmcnQpOwotIAkJYnJlYWs7Ci0gCWRlZmF1bHQ6Ci0gCQlyZXQgPSAtRUlOVkFMOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbmV0L2luZXQvc2xpcC5jIGxpbnV4L25ldC9pbmV0L3NsaXAuYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvc2xpcC5jCVNhdCBKdWwgMzEgMTU6NDI6MjIgMTk5MwotKysrIGxpbnV4L25ldC9pbmV0L3NsaXAuYwlUaHUgQXVnIDE5IDA5OjQ2OjIzIDE5OTMKLUBAIC02ODgsNyArNjg4LDcgQEAKLSAgIGlmIChhbHJlYWR5KysgPT0gMCkgewotIAlwcmludGsoIlNMSVA6IHZlcnNpb24gJXMgKCVkIGNoYW5uZWxzKTogIiwKLSAJCQkJU0xJUF9WRVJTSU9OLCBTTF9OUlVOSVQpOwotLQotKwlwcmludGsoIkNTTElQIGNvZGUgY29weXJpZ2h0IDE5ODkgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhXG4iKTsKLSAJLyogRmlsbCBpbiBvdXIgTERJU0MgcmVxdWVzdCBibG9jay4gKi8KLSAJc2xfbGRpc2MuZmxhZ3MJPSAwOwotIAlzbF9sZGlzYy5vcGVuCT0gc2xpcF9vcGVuOwotZGlmZiAtdSAtLXJlY3Vyc2l2ZSAtLW5ldy1maWxlIHBsMTIvbGludXgvbmV0L2luZXQvc29jay5jIGxpbnV4L25ldC9pbmV0L3NvY2suYwotLS0tIHBsMTIvbGludXgvbmV0L2luZXQvc29jay5jCVNhdCBKdWwgMzEgMTU6NDI6MjIgMTk5MwotKysrIGxpbnV4L25ldC9pbmV0L3NvY2suYwlXZWQgQXVnIDE4IDE5OjE5OjUxIDE5OTMKLUBAIC05NjcsNiArOTY3LDggQEAKLSAJCXN0aSgpOwotIAkJcmV0dXJuKC1FQUREUklOVVNFKTsKLSAJfQotKwlpZiAoc2syLT5udW0gIT0gc251bSkgY29udGludWU7CQkvKiBtb3JlIHRoYW4gb25lICovCi0rCWlmIChzazItPnNhZGRyICE9IHNrLT5zYWRkcikgY29udGludWU7CS8qIHNvY2tldCBwZXIgc2xvdCAhIC1GQiAqLwotIAlpZiAoIXNrMi0+cmV1c2UpIHsKLSAJCXN0aSgpOwotIAkJcmV0dXJuKC1FQUREUklOVVNFKTsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9pbmV0L3RjcC5jIGxpbnV4L25ldC9pbmV0L3RjcC5jCi0tLS0gcGwxMi9saW51eC9uZXQvaW5ldC90Y3AuYwlXZWQgQXVnIDExIDIwOjQxOjE1IDE5OTMKLSsrKyBsaW51eC9uZXQvaW5ldC90Y3AuYwlXZWQgQXVnIDE4IDE5OjIwOjM3IDE5OTMKLUBAIC0xNDM0LDYgKzE0MzQsNyBAQAotICAgdDEtPnNvdXJjZSA9IHRoLT5kZXN0OwotICAgdDEtPnNlcSA9IHRoLT5hY2tfc2VxOyAvKiBhZGQgb25lIHNvIGl0IHdpbGwgYmUgaW4gdGhlIHJpZ2h0IHJhbmdlICovCi0gICB0MS0+cnN0ID0gMTsKLSsgIHQxLT5hY2tfc2VxID0gbnRvaGwobnRvaGwodGgtPnNlcSkrMSk7IC8qIHNlbmQgY29ycmVjdCBhY2sgLUZCICovCi0gICB0MS0+d2luZG93ID0gMDsJCS8qIHNob3VsZCBiZSBzZXQgdG8gMCAtRkIgKi8KLSAgIHQxLT5hY2sgPSAwOwotICAgdDEtPnN5biA9IDA7Ci1kaWZmIC11IC0tcmVjdXJzaXZlIC0tbmV3LWZpbGUgcGwxMi9saW51eC9uZXQvaW5ldC93ZC5jIGxpbnV4L25ldC9pbmV0L3dkLmMKLS0tLSBwbDEyL2xpbnV4L25ldC9pbmV0L3dkLmMJRnJpIEF1ZyAxMyAwNDoyNDoyOCAxOTkzCi0rKysgbGludXgvbmV0L2luZXQvd2QuYwlNb24gQXVnIDMwIDIzOjQwOjMyIDE5OTMKLUBAIC0xNSwxMSArMTUsMTIgQEAKLSAqLwotIAotIHN0YXRpYyBjaGFyICp2ZXJzaW9uID0KLS0gICAgIndkLmM6djAuOTktMTIgOC8xMi85MyBEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKVxuIjsKLSsgICAgIndkLmM6djAuOTktMTMgOC8zMC85MyBEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKVxuIjsKLSAKLSAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0gI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotICNpbmNsdWRlIDxhc20vaW8uaD4KLSAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotICNpbmNsdWRlIDxtZW1vcnkuaD4KLUBAIC01OSwxOSArNjAsMjggQEAKLSAgICAgVGhlIHdkcHJvYmUxKCkgcm91dGluZSBpbml0aWFsaXplcyB0aGUgY2FyZCBhbmQgZmlsbHMgdGhlCi0gICAgIHN0YXRpb24gYWRkcmVzcyBmaWVsZC4gKi8KLSAKLS1pbnQgd2Rwcm9iZShpbnQgaW9hZGRyLCAgc3RydWN0IGRldmljZSAqZGV2KQotK2ludCB3ZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi0gewotICAgICBpbnQgKnBvcnQsIHBvcnRzW10gPSB7MHgzMDAsIDB4MjgwLCAweDM4MCwgMHgyNDAsIDB9OwotKyAgICBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKLSAKLSsgICAgaWYgKGlvYWRkciA8IDApCi0rCXJldHVybiBFTlhJTzsJCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KLSAgICAgaWYgKGlvYWRkciA+IDB4MTAwKQotLQlyZXR1cm4gd2Rwcm9iZTEoaW9hZGRyLCBkZXYpOwotKwlyZXR1cm4gISB3ZHByb2JlMShpb2FkZHIsIGRldik7Ci0gCi0tICAgIGZvciAocG9ydCA9ICZwb3J0c1swXTsgKnBvcnQ7IHBvcnQrKykKLSsgICAgZm9yIChwb3J0ID0gJnBvcnRzWzBdOyAqcG9ydDsgcG9ydCsrKSB7Ci0rI2lmZGVmIEhBVkVfUE9SVFJFU0VSVkUKLSsJaWYgKGNoZWNrX3JlZ2lvbigqcG9ydCwgMzIpKQotKwkgICAgY29udGludWU7Ci0rI2VuZGlmCi0gCWlmIChpbmIoKnBvcnQgKyA4KSAhPSAweGZmCi0gCSAgICAmJiBpbmIoKnBvcnQgKyA5KSAhPSAweGZmIC8qIEV4dHJhIGNoZWNrIHRvIGF2b2lkIHNvdW5kY2FyZC4gKi8KLSAJICAgICYmIHdkcHJvYmUxKCpwb3J0LCBkZXYpKQotLQkgICAgcmV0dXJuICpwb3J0OwotLSAgICByZXR1cm4gMDsKLSsJICAgIHJldHVybiAwOwotKyAgICB9Ci0rICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOwotKyAgICByZXR1cm4gRU5PREVWOwotIH0KLSAKLSBpbnQgd2Rwcm9iZTEoaW50IGlvYWRkciwgc3RydWN0IGRldmljZSAqZGV2KQotQEAgLTkzLDcgKzEwMyw3IEBACi0gICAgICAgcHJpbnRrKCIgJTIuMlgiLCBzdGF0aW9uX2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgOCArIGkpKTsKLSAKLSAgIC8qIFRoZSBmb2xsb3dpbmcgUHVyZURhdGEgcHJvYmUgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkKLS0gICAgIE1pa2UgSmFnZGlzIDxqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrPi4gUHVyZWRhdGEgc2VlbSB0byBkbyBzb2Z0d2FyZQotKyAgICAgTWlrZSBKYWdkaXMgPGphZ2d5QHB1cnBsZXQuZGVtb24uY28udWs+LiBQdXJlZGF0YSBkb2VzIHNvZnR3YXJlCi0gICAgICBjb25maWd1cmF0aW9uIGRpZmZlcmVudGx5IGZyb20gb3RoZXJzIHNvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIHRoZW0uCi0gICAgICBUaGlzIGRldGVjdHMgYW4gOCBiaXQsIDE2IGJpdCBvciBkdW1iIChUb3NoaWJhLCBqdW1wZXJlZCkgY2FyZC4KLSAgICAgICovCi1AQCAtMTkyLDYgKzIwMiw5IEBACi0gICB9Ci0gCi0gICAvKiBPSywgd2VyZSBhcmUgY2VydGFpbiB0aGlzIGlzIGdvaW5nIHRvIHdvcmsuICBTZXR1cCB0aGUgZGV2aWNlLiAqLwotKyNpZmRlZiBIQVZFX1BPUlRSRVNFUlZFCi0rICBzbmFyZl9yZWdpb24oaW9hZGRyLCAzMik7Ci0rI2VuZGlmCi0gICBldGhkZXZfaW5pdChkZXYpOwotIAotICAgZWlfc3RhdHVzLm5hbWUgPSBtb2RlbF9uYW1lOwotQEAgLTIzMSw4ICsyNDQsOSBAQAotICAgZWlfc3RhdHVzLnJlZzUgPSAoKGRldi0+bWVtX3N0YXJ0Pj4xOSkgJiAweDFmKSB8IE5JQzE2OwotIAotICAgaWYgKGVpX3N0YXR1cy53b3JkMTYpCi0tICAgICAgb3V0YihJU0ExNiB8IGVpX3N0YXR1cy5yZWc1LCBpb2FkZHIrV0RfQ01EUkVHNSk7Ci0rICAgICAgb3V0YihlaV9zdGF0dXMucmVnNSwgaW9hZGRyK1dEX0NNRFJFRzUpOwotICAgb3V0YihlaV9zdGF0dXMucmVnMCwgaW9hZGRyKTsgLyogV0RfQ01EUkVHICovCi0rCi0gICByZXR1cm4gZWlfb3BlbihkZXYpOwotIH0KLSAKLUBAIC0yNzMsNyArMjg3LDggQEAKLSB9Ci0gCi0gLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIGFuZCB0cml2aWFsCi0tICAgb24gdGhlIFdlc3Rlcm4gZGlnaXRhbCBjYXJkIHdoZXJlIHRoZXJlIGlzIG5vIGNob2ljZSBvZiBob3cgdG8gZG8gaXQuICovCi0rICAgb24gdGhlIFdlc3Rlcm4gZGlnaXRhbCBjYXJkIHdoZXJlIHRoZXJlIGlzIG5vIGNob2ljZSBvZiBob3cgdG8gZG8gaXQuCi0rICAgVGhlIG9ubHkgY29tcGxpY2F0aW9uIGlzIGlmIHRoZSByaW5nIGJ1ZmZlciB3cmFwcy4gKi8KLSAKLSBzdGF0aWMgaW50Ci0gd2RfYmxvY2tfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY291bnQsIGNoYXIgKmJ1ZiwgaW50IHJpbmdfb2Zmc2V0KQotQEAgLTI4MSw3ICsyOTYsNyBAQAotICAgICB2b2lkICp4ZmVyX3N0YXJ0ID0gKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQgKyByaW5nX29mZnNldAotIAkJCQktIChXRF9TVEFSVF9QRzw8OCkpOwotIAotLSAgICAvKiBUaGlzIG1hcG91dCB3b24ndCBiZSBuZWNlc3Nhcnkgd2hlbiB3ZF9jbG9zZV9jYXJkIGlzIGNhbGxlZC4gKi8KLSsgICAgLyogVGhpcyBtYXBvdXQgaXNuJ3QgbmVjZXNzYXJ5IGlmIHdkX2Nsb3NlX2NhcmQgaXMgY2FsbGVkLiAqLwotICNpZiAhZGVmaW5lZChXRF9ub19tYXBvdXQpCi0gICAgIGludCB3ZF9jbWRyZWcgPSBkZXYtPmJhc2VfYWRkciAtIFdEX05JQ19PRkZTRVQ7IC8qIFdEX0NNRFJFRyAqLwotIAotQEAgLTI5OSwxMiArMzE0LDYgQEAKLSAJcmV0dXJuIGRldi0+cm1lbV9zdGFydCArIGNvdW50OwotICAgICB9Ci0gICAgIG1lbWNweShidWYsIHhmZXJfc3RhcnQsIGNvdW50KTsKLS0gICAgaWYgKGVpX2RlYnVnID4gNCkgewotLQl1bnNpZ25lZCBzaG9ydCAqYm9hcmQgPSAodW5zaWduZWQgc2hvcnQgKikgeGZlcl9zdGFydDsKLS0JcHJpbnRrKCIlczogd2Q4MDEzIGJsb2NrX2lucHV0KGNudD0lZCBvZmZzZXQ9JTN4IGFkZHI9JSN4KSA9ICUyeCAlMnggJTJ4Li4uXG4iLAotLQkgICAgICAgZGV2LT5uYW1lLCBjb3VudCwgcmluZ19vZmZzZXQsIHhmZXJfc3RhcnQsCi0tCSAgICAgICBib2FyZFstMV0sIGJvYXJkWzBdLCBib2FyZFsxXSk7Ci0tICAgIH0KLSAKLSAjaWYgIWRlZmluZWQoV0Rfbm9fbWFwb3V0KQotICAgICAvKiBUdXJuIG9mZiAxNiBiaXQgYWNjZXNzIHNvIHRoYXQgcmVib290IHdvcmtzLiAqLwotQEAgLTMxNCw4ICszMjMsNiBAQAotICAgICByZXR1cm4gcmluZ19vZmZzZXQgKyBjb3VudDsKLSB9Ci0gCi0tLyogVGhpcyBjb3VsZCBvbmx5IGJlIG91dHB1dHRpbmcgdG8gdGhlIHRyYW5zbWl0IGJ1ZmZlci4gIFRoZQotLSAgIHBpbmctcG9uZyB0cmFuc21pdCBzZXR1cCBkb2Vzbid0IHdvcmsgd2l0aCB0aGlzIHlldC4gKi8KLSBzdGF0aWMgdm9pZAotIHdkX2Jsb2NrX291dHB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAotIAkJaW50IHN0YXJ0X3BhZ2UpCi1AQCAtMzMyLDkgKzMzOSw2IEBACi0gI2VuZGlmCi0gCi0gICAgIG1lbWNweShzaG1lbSwgYnVmLCBjb3VudCk7Ci0tICAgIGlmIChlaV9kZWJ1ZyA+IDQpCi0tCXByaW50aygiJXM6IHdkODAqMyBibG9ja19vdXRwdXQoYWRkcj0lI3ggY250PSVkKSAtPiAlMng9JTJ4ICUyeD0lMnggJWQuLi5cbiIsCi0tCSAgICAgICBzaG1lbSwgY291bnQsIHNobWVtWzIzXSwgYnVmWzIzXSwgc2htZW1bMjRdLCBidWZbMjRdLCBtZW1jbXAoc2htZW0sYnVmLGNvdW50KSk7Ci0gCi0gI2lmICFkZWZpbmVkKFdEX25vX21hcG91dCkKLSAgICAgLyogVHVybiBvZmYgMTYgYml0IGFjY2VzcyBzbyB0aGF0IHJlYm9vdCB3b3Jrcy4gKi8KLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC9zb2NrZXQuYyBsaW51eC9uZXQvc29ja2V0LmMKLS0tLSBwbDEyL2xpbnV4L25ldC9zb2NrZXQuYwlXZWQgSnVsICA3IDEwOjM5OjU4IDE5OTMKLSsrKyBsaW51eC9uZXQvc29ja2V0LmMJU2F0IFNlcCAgNCAwMjo0NTo1MiAxOTkzCi1AQCAtODA2LDcgKzgwNiw3IEBACi0gICogd2UgaGF2ZSB0aGlzIGxldmVsIG9mIGluZGlyZWN0aW9uLiBOb3QgYSBsb3Qgb2Ygb3ZlcmhlYWQsIHNpbmNlIG1vcmUgb2YKLSAgKiB0aGUgd29yayBpcyBkb25lIHZpYSByZWFkL3dyaXRlL3NlbGVjdCBkaXJlY3RseS4KLSAgKi8KLS1leHRlcm4gIkMiIGludAotK2FzbWxpbmthZ2UgaW50Ci0gc3lzX3NvY2tldGNhbGwoaW50IGNhbGwsIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCi0gewotICAgc3dpdGNoKGNhbGwpIHsKLWRpZmYgLXUgLS1yZWN1cnNpdmUgLS1uZXctZmlsZSBwbDEyL2xpbnV4L25ldC91bml4L3NvY2suYyBsaW51eC9uZXQvdW5peC9zb2NrLmMKLS0tLSBwbDEyL2xpbnV4L25ldC91bml4L3NvY2suYwlNb24gQXVnICA5IDE4OjAyOjMzIDE5OTMKLSsrKyBsaW51eC9uZXQvdW5peC9zb2NrLmMJU2F0IFNlcCAgNCAxNDowMjo0MiAxOTkzCi1AQCAtNzM3LDcgKzczNyw3IEBACi0gCQlpZiAoVU5fQlVGX0FWQUlMKHVwZCkgfHwgcGVlcnVwZCkKLSAJCQlwdXRfZnNfbG9uZyhVTl9CVUZfQVZBSUwodXBkKSwodW5zaWduZWQgbG9uZyAqKWFyZyk7Ci0gCQkgIGVsc2UKLS0JCQlwdXRfZnNfbG9uZygxLCh1bnNpZ25lZCBsb25nICopYXJnKTsgLyogcmVhZCBFT0YgKi8KLSsJCQlwdXRfZnNfbG9uZygwLCh1bnNpZ25lZCBsb25nICopYXJnKTsKLSAJCWJyZWFrOwotIAljYXNlIFRJT0NPVVRROgotIAkJaWYgKHNvY2stPmZsYWdzICYgU09fQUNDRVBUQ09OKSByZXR1cm4oLUVJTlZBTCk7CmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggMGZmOTZjYi4uMThmZjYzZCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExNiBAQAorVHVlIFNlcCAyOCAxOTo1OToyMSAxOTkzICBEYXZpZCBNZXRjYWxmZQorCisJKiBbd2luZG93cy93aW4uY10KKwlJbXBsZW1lbnRlZCBzdXBwb3J0IGZvciB3aW5kb3dzIHdpdGggbm8gYm9yZGVycy4gIEFkZGVkCisgCUdldFBhcmVudCgpLCBHZXREbGdDdHJsSUQoKSwgR2V0V2luZG93VGV4dCgpIGFuZAorCUdldFdpbmRvd1RleHRMZW5ndGgoKSBmdW5jdGlvbnMuCisKKwkqIFttaXNjL3h0LmNdCisJQWRkZWQgcHJvY2Vzc2luZyBvZiBXTV9HRVRURVhUIGFuZCBXTV9HRVRURVhUTEVOR1RIIG1lc3NhZ2VzCisJdG8gRGVmV2luZG93UHJvYyBhbmQgSW1wbGVtZW50ZWQgTWVzc2FnZUJlZXAoKS4KKworCSogW3dpbmRvd3Mvc3lzY29sb3IuY10KKwlBZGRlZCBwcmVsaW1pbmFyeSBzeXN0ZW0gY29sb3Igc3VwcG9ydC4KKworCSogW2NvbnRyb2xzL2J1dHRvbjEuY10KKwlNb2RzIHRvIG5ldyBidXR0b24gY29udHJvbCBhbmQgaW50ZWdyYXRpb24gd2l0aCBXaW5lLgorCitUdWUgU2VwIDI4IDE5OjU5OjIxIDE5OTMgIEpvaGFubmVzIFJ1c2NoZWluc2tpCisKKwkqIFtjb250cm9scy9idXR0b24xLmNdCisJTmV3IGJ1dHRvbiBjb250cm9sIHVzaW5nIEdESSBmdW5jdGlvbnMuCisJCitUdWUgU2VwIDI4IDE5OjU5OjIxIDE5OTMgIEVyaWMgWW91bmdkYWxlCisKKwkqIFtkZWJ1Z2dlci8qXQorCUFkZGVkIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMgdG8gV2luZQorCitTYXQgU2VwIDI1IDEzOjIyOjUwIDE5OTMgIEFsZXhhbmRyZSBKdWxsaWFyZCAgKGp1bGxpYXJkQGRpLmVwZmwuY2gpCisKKwkqIFtvYmplY3RzL3JlZ2lvbi5jXQorCUJ1ZyBmaXgKKworRnJpIFNlcCAyNCAwNzozNToxMSAxOTkzICBCb2IgQW1zdGFkdCAgKGJvYiBhdCBwb29oKQorCisJKiBbdG9vbHMvYnVpbGQuY10KKwlDaGFuZ2VkIHRoZSBlbnRyeSBwb2ludCBjb2RlIHRvIHJlZHVjZSB0aGUgc3RhbmRhcmQgZW50cnkKKwlwb2ludCBzaXplIGZyb20gMjIgYnl0ZXMgdG8gMTAgYnl0ZXMuICBUaGlzIGxlYXZlcyBhYm91dAorCTQwMDAgZnJlZSBlbnRyeSBwb2ludHMgaW5zdGVhZCBvZiB0aGUgODAwIGluIHZlcnNpb24gMC40LjIuCisKKwkqIFtsb2FkZXIvcmVzb3VyY2UuY10KKwlSZXdyb3RlIGZ1bmN0aW9ucyB0byBhbGxvdyBsb2FkaW5nIG9mIHJlc291cmNlcyBmcm9tIGFueQorCURMTC4KKworCSogW2xvYWRlci93aW5lLmNdIFtpbmNsdWRlL3dpbmUuaF0KKwlBZGRlZCBmdW5jdGlvbnMgR2V0RmlsZW5hbWVGcm9tSW5zdGFuY2UoKSBhbmQgR2V0RmlsZUluZm8oKQorCXRvIHNlYXJjaCBmb3IgYSBsb2FkZWQgZmlsZSBiYXNlZCBvbiBpdHMgaW5zdGFuY2UgaGFuZGxlLgorCUFkZGVkIGEgZmllbGQgaW4gc3RydWN0IHdfZmlsZXMgdG8gbWFrZSBzZWFyY2hpbmcgYnkgYW4gaW5zdGFuY2UKKwloYW5kbGUgZmFzdGVyLgorCitUdWUgU2VwIDIxIDA5OjU3OjAxIDE5OTMgIG1pZ3VlbEByb3hhbm5lLm51Y2xlY3UudW5hbS5teCAoTWlndWVsIGRlIEljYXphKQorCisJKiBbbWlzYy9wcm9maWxlLmNdCisJSW1wbGVtZW50YXRpb24gb2YgLklOSSBmaWxlIGhhbmRsaW5nCisKK01vbiBTZXAgMjAgMTA6NTQ6MzIgMTk5MyAgRGF2aWQgTWV0Y2FsZmUKKworCSogW21pc2MvcHJvZmlsZS5jLm9sZF0KKwlJbXBsZW1lbnRhdGlvbiBvZiAuSU5JIGZpbGUgaGFuZGxpbmcKKworTW9uIFNlcCAyMCAxMDo1NDozMiAxOTkzICBKb2huIEJyZXphaworCisJKiBbY29udHJvbHMvV2luQnV0dG9uLmNdCisJQnVnIGZpeCB3aXRoIGNhbGwgdG8gWHRWYVNldFZhbHVlcy4KKworTW9uIFNlcCAyMCAxMDo1NDozMiAxOTkzICBBbGV4YW5kcmUgSnVsbGlhcmQKKworCSogW3dpbmRvd3Mvd2luLmNdCisJUXVpY2sgcGF0Y2ggdG8gZ2V0IGNvbG9ybWFwcyB0byB3b3JrIHdpdGggYnV0dG9uIHdpZGdldC4KKworTW9uIFNlcCAyMCAwMjo0Mjo1NCAxOTkzICAgICh5bmd2aUBoYWZyby5pcykKKworCSogbWlzYy9rZXlib2FyZC5jOiAKKwlJZmRlZmVkIG91dCBzb21lIGJvZ3VzIEFuc2k8LT5PZW0gY29udmVyc2lvbiBmdW5jdGlvbnMKKworCSogbWlzYy9sc3RyLmM6IAorCU5ldyBmaWxlIHdpdGggc3RyaW5nIGZ1bmN0aW9ucyBsaWtlIGxzdHIqIElzQ2hhciogKkFuc2kqIAorCitXZWQgU2VwIDE1IDIwOjM1OjEwIDE5OTMgIEpvaG4gQnJlemFrCisKKwkqIFtsb2FkZXIvc2lnbmFsLmNdCisJQWRkaXRpb25hbCBjaGFuZ2VzIHRvIHN1cHBvcnQgTmV0QlNELgorCitXZWQgU2VwIDE1IDIyOjE5OjIyIDE5OTMgIE1hcnRpbiBBeW90dGUKKworCSogW3dpbmRvd3MvZ3JhcGhpY3MuY10KKwlBZGRlZCBGcmFtZVJlY3QgZnVuY3Rpb24KKworVHVlIFNlcCAxNCAxMzo1NDo0NSAxOTkzICBBbGV4YW5kcmUgSnVsbGlhcmQKKworCSogW29iamVjdHMvY29sb3IuY10gW29iamVjdHMvcGFsZXR0ZS5jXQorCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHByaXZhdGUgY29sb3IgbWFwLgorCisJKiBbd2luZG93cy9jbGFzcy5jXQorCUltcGxlbWVudGVkIENTX0NMQVNTREMgc3R5bGUuCisKKwkqIFt3aW5kb3dzL2RjZS5jXQorCU1vdmVkIERDRXMgdG8gVVNFUiBoZWFwLgorCUltcGxlbWVudGVkIGNsYXNzIGFuZCB3aW5kb3cgRENzLgorCisJKiBbd2luZG93cy9ldmVudC5jXQorCUltcGxlbWVudGVkIENTX0RCTENMS1Mgc3R5bGUuCisKKwkqIFt3aW5kb3dzL2dyYXBoaWNzLmNdCisJQnVnIGZpeCBpbiBTZXRQaXhlbCgpLgorCisJKiBbd2luZG93cy93aW4uY10JCisJSW1wbGVtZW50ZWQgQ1NfT1dOREMgc3R5bGUuCisJSW1wbGVtZW50ZWQgR2V0L1NldFdpbmRvd0xvbmcoKS4KKworCSogW2NvbnRyb2xzL21lbnUuY10gW3dpbmRvd3MvY2xhc3MuY10gW3dpbmRvd3MvY2xpcHBpbmcuY10gCisJICBbd2luZG93cy9kY2UuY10gW3dpbmRvd3MvbWVzc2FnZS5jXSBbd2luZG93cy93aW4uY10JCisJTW92ZWQgd2luZG93cyBmcm9tIGdsb2JhbCBoZWFwIHRvIFVTRVIgaGVhcC4KKwogTW9uIFNlcCAxMyAwNTowMDoxMSAxOTkzICBFcmljIFlvdW5nZGFsZQogCiAJKiBbTWFrZWZpbGVdIFtpZjE2MzIvcmVsYXkuY10gW2luY2x1ZGUvZGxscy5oXSBbc2VsZWN0b3IuY10KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZWEyY2FmMS4uYjZkMzIzNiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTMsMTQgKzMsMTUgQEAKIERFQlVHT1BUUz0KIENPUFRTPS1PMiAtbTQ4NgogSU5DTFVERV9ESVI9aW5jbHVkZQorTERGTEFHUz0KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yIHRoZSB0b3AgbGV2ZWwKIFRBUkdFVD13aW5lCiBMSUJTPS1MLiAtTC91c3IvWDM4Ni9saWIgLWxYZXh0IC1sWGF3IC1sWHQgLWxYbXUgLWxYMTEgLWxtCiBPQkpTPWlmMTYzMi9pZjE2MzIubyBjb250cm9scy9jb250cm9scy5vIGxvYWRlci9sb2FkZXIubyBcCi0JbWVtb3J5L21lbW9yeS5vIG1pc2MvbWlzYy5vIG9iamVjdHMvb2JqZWN0cy5vIHdpbmRvd3Mvd2luZG93cy5vCi1TVUJESVJTPWlmMTYzMiBjb250cm9scyBsb2FkZXIgbWVtb3J5IG1pc2Mgb2JqZWN0cyB3aW5kb3dzCisJbWVtb3J5L21lbW9yeS5vIG1pc2MvbWlzYy5vIG9iamVjdHMvb2JqZWN0cy5vIHdpbmRvd3Mvd2luZG93cy5vIGRlYnVnZ2VyL2RlYnVnZ2VyLm8KK1NVQkRJUlM9aWYxNjMyIGNvbnRyb2xzIGxvYWRlciBtZW1vcnkgbWlzYyBvYmplY3RzIHdpbmRvd3MgZGVidWdnZXIKIAogYWxsOiAkKFRBUkdFVCkKIApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDdiODY2NmYuLmJkYzI4ZTIgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTcsMTQgKzcsMTMgQEAKIExpbnV4OgogCiAgICAgVW5jb21wcmVzcyBhbmQgdW50YXIgdGhpcyBhcmNoaXZlIGludG8gdGhlIGRpcmVjdG9yeSBvZiB5b3VyCi1jaG9pY2UuICBUaGlzIHJlbGVhc2UgcmVxdWlyZXMgYSBMaW51eCB2ZXJzaW9uIDAuOTkgcGwxMiBrZXJuZWwgd2l0aAotQUxQSEEtcGwxMy1kaWZmcy4KK2Nob2ljZS4gIFRoaXMgcmVsZWFzZSByZXF1aXJlcyBhIExpbnV4IHZlcnNpb24gMC45OSBwbDEzIGtlcm5lbAorb3IgYWJvdmUuCiAKIE5ldEJTRDoKIAogICAgIElmIHlvdSB1c2UgQlNEIG1ha2UgcmF0aGVyIHRoYW4gR05VIG1ha2UsIHlvdSBtdXN0IGFwcGx5IHRoZSBwYXRjaGVzCi1pbiB0aGUgZmlsZSAiYnNkbWFrZS5wYXRjaCIuICBUaGlzIHJlbGVhc2UgcmVxdWlyZXMgTmV0QlNEIDAuOSB3aXRoCi1hZGRpdGlvbmFsIHBhdGNoZXMuCitpbiB0aGUgZmlsZSAiYnNkbWFrZS5wYXRjaCIuICBUaGlzIHJlbGVhc2UgcmVxdWlyZXMgTmV0QlNELWN1cnJlbnQuCiAKIEFsbDoKIApAQCAtMjgsNiArMjcsMjQgQEAKIEhhdmUgYSBuaWNlIGdhbWUgb2Ygc29saXRhaXJlLCBidXQgYmUgY2FyZWZ1bC4gIEVtdWxhdGlvbiBpc24ndCBwZXJmZWN0LgogU28sIG9jY2Fzc2lvbmFsbHkgaXQgd2lsbCBjcmFzaC4KIAorV0hBVCdTIE5FVyB3aXRoIHZlcnNpb24gMC40LjM6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gQnVnIGZpeGVzCisJLSBSZXNvdXJjZSBsb2FkaW5nIG5vdyBhYmxlIHRvIGxvYWQgRExMIHJlc291cmNlcworCS0gQnV0dG9uIGNvbnRyb2wgbm93IGJhc2VkIG9uIEdESSBjYWxscworCS0gUHJlbGltaW5hcnkgc3lzdGVtIGNvbG9yIHN1cHBvcnQKKwktIE1pc2NlbGxhbmVvdXMgd2luZG93IGZ1bmN0aW9ucworCS0gTGltaXRlZCBkZWJ1Z2dpbmcgZmFjaWxpdHkgKHNvbWV0aW1lcyBoYW5ncykKKworV0hBVCdTIE5FVyB3aXRoIHZlcnNpb24gMC40LjI6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gQnVnIGZpeGVzCisJLSAzMi1iaXQgY2FsbGJhY2sgZnVuY3Rpb25zIGFsbG93ZWQKKwktIC5JTkkgZmlsZSBoYW5kbGluZworCS0gbHN0ciogZnVuY3Rpb25zIGFuZCBBTlNJPC0+T0VNIGNvbnZlcnNpb24gZnVuY3Rpb25zLgorCitXSEFUJ1MgTkVXIHdpdGggdmVyc2lvbiAwLjQuMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBCdWcgZml4ZXMKKwktIE1lbW9yeSB1c2FnZSBjaGFuZ2VzLgorCiBXSEFUJ1MgTkVXIHdpdGggdmVyc2lvbiAwLjQuMDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCiAJLSBXaW5lIG5vdyBjb21waWxlcyBhbmQgcnVucyB1bmRlciBOZXRCU0QuICBQYXRjaGVzIGFyZQogCSAgcmVxdWlyZWQgZm9yIE5ldEJTRC4KZGlmZiAtLWdpdCBhL1JFQURNRS5ERUJVR0dFUiBiL1JFQURNRS5ERUJVR0dFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZmZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLkRFQlVHR0VSCkBAIC0wLDAgKzEsNDcgQEAKK0RhdGU6IFN1biwgMjYgU2VwIDkzIDAzOjE4OjE5IEVEVAorRnJvbTogZXJpY0B0YW50YWx1cy5ucmwubmF2eS5taWwgKEVyaWMgWW91bmdkYWxlKQorTWVzc2FnZS1JZDogPDkzMDkyNjA3MTguQUExMzk2NkB0YW50YWx1cy5ucmwubmF2eS5taWw+CitUbzogYm9iQGFtc2NvbnMuYW1zY29ucy5jb20KK0NjOiBsaW51eC1hY3RpdmlzdHNATmlrc3VsYS5odXQuZmkKK0luLVJlcGx5LVRvOiBCb2IgQW1zdGFkdCdzIG1lc3NhZ2Ugb2YgU2F0LCAyNSBTZXAgMTk5MyAyMzozNjozMiArMDMwMAorICAgIDxtMG9nZ010LTAwMENyaENAYW1zY29ucy5hbXNjb25zLmNvbT4KK1gtTW4tS2V5OiBXQUJJCisKKworCis+SSBtYXkganVzdCBiZSBkcmVhbWluZywgYnV0IEknbSBiZWdpbm5pbmcgdG8gbGlrZSB0aGUgaWRlYSBvZiBhIGJ1aWx0Cis+aW4gZGVidWdnZXIuCisKKwlTbyBkbyBJLiAgSSBsaWtlIGl0IHNvIG11Y2ggdGhhdCBJIHdyb3RlIG9uZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZQorZGlzYXNzZW1ibHkgY29kZSBpbiBnZGIgaXMgcHJldHR5IG11Y2ggbG9jYWxpemVkIHRvIG9uZSBzb3VyY2UgZmlsZSwgYW5kIHRoaXMKK3dhcyBlYXN5IHRvIHNwbGljZSBpbnRvIGEgc2ltcGxlIHByb2dyYW0uICBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIDIgdmFyaWFibGVzCit0aGF0IHlvdSBzZXQgaWYgeW91IGFyZSBkaXNhc3NlbWJsaW5nIDE2IGJpdCBjb2RlLCBzbyBpdCBtYWtlcyBpdCBhbGwgdGhlCitiZXR0ZXIuCisKKwlBbnl3YXksIHRoZXJlIGlzIGEgcGFyc2VyIHRoYXQgdW5kZXJzdGFuZHMgYSBsaW1pdGVkIHNldCBvZiBnZGIKK2NvbW1hbmRzICh2ZXJ5IGxpbWl0ZWQsIGJ1dCB0aGUgJ3gnIGNvbW1hbmQgaXMgcHJldHR5IGZ1bmN0aW9uYWwgYXMgbG9uZyBhcyB5b3UKK3N0aWNrIHRvIG51bWVyaWMgcmF0aGVyIHRoYW4gc3ltYm9saWMgYWRkcmVzc2VzKS4gIFRoZSBwYXJzZXIgdW5kZXJzdGFuZHMgJHBjCithbmQgJHNwIGZvciB5b3VyIGNvbnZlbmllbmNlLCBhbmQgeW91IGNhbiBkbyB0aGluZ3MgbGlrZSAieC8xMGkgJHBjIiBhbmQgImluZm8KK3JlZ3MiIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uLiAgSW4gcHJpbmNpcGxlIHlvdSBjYW4gZG8gIngveCIsICJ4L3MiLCAieC9kIiwKKyJ4L3ciLCAieC9iIiwgIngvaSIgYW5kICJ4L2MiLiAgSSBpbXBsZW1lbnRlZCBhbiAiaW5mbyBzdGFjayIgY29tbWFuZCB0aGF0CitzaW1wbHkgZHVtcHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RhY2sgb250byB0aGUgc2NyZWVuLCBidXQgaXQgY3VycmVudGx5CittYWtlcyBubyBhdHRlbXB0IHRvIGFjdHVhbGx5IGludGVycHJldCB0aGUgc3RhY2sgZnJhbWVzLgorCisJVGhpcyB3aWxsIHByb2JhYmx5IG5vdCB3b3JrIG9uIG5vbi1saW51eCBzeXN0ZW1zLCBhbmQgSSBoYXZlIG5vIGlkZWEKK2hvdyBtdWNoIHdvcmsgaXQgd2lsbCBiZSB0byBmaXggaXQuICBUbyBzdGFydCB3aXRoIHdlIG5lZWQgc29tZSBzaW1wbGUgbWFjcm9zCit0byBkZXRlcm1pbmUgKGJhc2VkIHVwb24gYSBzZWdtZW50IHNlbGVjdG9yKSB3aGV0aGVyIHdlIGFyZSBpbiBhIDE2IGJpdCBvciBhIDMyCitiaXQgc2VnbWVudCwgYnV0IHRoaXMgc2hvdWxkIGJlIHByZXR0eSBlYXN5IHRvIGZpeC4gIEkgc2hhbWVsZXNzbHkgcmlwcGVkIG9mZiBhCitidW5jaCBvZiBmaWxlcyBmcm9tIGdkYiwgYW5kIEkgb2J2aW91c2x5IHBpY2tlZCB0aGUgb25lcyBmb3IgbGludXguICBGb3Igb3RoZXIKK3N5c3RlbXMgeW91IG1heSBuZWVkIHRvIG1ha2UgYWRqdXN0bWVudHMgdG8gdGhlc2UgZmlsZXMgc29tZWhvdy4gIEl0IGlzIHRvbworbGF0ZSBpbiB0aGUgZXZlbmluZyB0byB3b3JyeSBhYm91dCB0aGlzIG5vdy4KKworCUl0IHdpbGwgcHJvYmFibHkgYmUgZWFzeSB0byBtb2RpZnkgdGhlIHBhcnNlciB0byBhbGxvdyB5b3UgdG8gY2hhbmdlCittZW1vcnkgbG9jYXRpb25zIGFuZC9vciByZWdpc3RlciB2YWx1ZXMgYW5kIHRoZW4gY29udGludWUgZXhlY3V0aW9uLiAgQWxzbywKK3NvbWUgb2YgdGhlIGhvb2tzIGZvciB1c2luZyByZWFkbGluZSB3aXRoIHRoZSBwYXJzZXIgYXJlIGluIHBsYWNlLCBidXQgaXQgZG9lcworbm90IHdvcmsgcmVsaWFibHkgZm9yIHNvbWUgcmVhc29uLCBzbyBJIGxlZnQgaXQgb3V0IGZvciBub3cuICBBZGRpbmcgZ251CityZWFkbGluZSByZWFsbHkgd291bGQgYmxvYXQgdGhlIHBhY2thZ2UgYSBsb3QuICBJbnN0ZWFkIEkgY291bGQgdXNlIFJpY2ggU2FseidzCitlZGl0bGliICh0aGUgY2Fub25pY2FsIHRlc3QgY2FzZSBmb3IgdGhlIERMTCB0b29scyksIHdoaWNoIGhhcyBhIGNvbW1hbmQgbGluZQoraGlzdG9yeSBmZWF0dXJlIHRoYXQgY291bGQgYmUgYW4gYWNjZXB0YWJsZSBzdWJzdGl0dXRlIC0gdGhpcyBpcyBtdWNoIHNtYWxsZXIKK3RoYW4gZ251IHJlYWRsaW5lLCBidXQgSSBhbSBub3Qgc3VyZSB3aGF0IGZlYXR1cmVzIGFyZSBwcmVzZW50LgorCistRXJpYwpkaWZmIC0tZ2l0IGEvUkVBRE1FLk9FTUFOU0kgYi9SRUFETUUuT0VNQU5TSQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjdiNDlkCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLk9FTUFOU0kKQEAgLTAsMCArMSwyOSBAQAorCitJbiB0aGlzIGRpcmVjdG9yeSB5b3UgbWlnaHQgZmluZCBteSBpbXBsZW1hbnRhdGlvbiBvZiB0aGUgV2luZG93cworU3RyaW5nLiAgVGhlIHBhdGNoIGxzdHIucGF0Y2ggaW5jbHVkZXMgd2hhdHMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nCitmdW5jdGlvbnM6Citsc3RyY2F0LGxzdHJjbXAsbHN0cmNtcGksbHN0cmNweSxsc3RyY3B5bixsc3RybGVuLEFuc2lVcHBlcixBbnNpTG93ZXIsCitJc0NoYXJBbHBoYSxJc0NoYXJBbHBoYW51bWVyaWMsSXNDaGFyVXBwZXIsSXNDaGFyTG93ZXIsQW5zaVVwcGVyQnVmZiwKK0Fuc2lMb3dlckJ1ZmYsQW5zaU5leHQsQW5zaVByZXYuIFNpbXBseSBhcHBseSB0aGUgcGF0Y2ggdG8gV2luZS4wLjQuMQorYW5kIHJlbWFrZS4KKworCitBbHNvIHRoZXJlIHNob3VsZCBiZSB0aGUgZmlsZXMgb2VtMmFuc2kudHJsIGFuZCBhbnNpMm9lbS50cmwgdGhhdAorZGVmaW5lIGhvdyB0byB0cmFuc2xhdGUgYmV0d2VlbiBhbnNpIGFuZCBvZW0gY29kZXBhZ2UgODYxIEkgYmVsaWV2ZQordGhleSBjYWxsIGl0LiBUaGVzZSBmaWxlcyB3aGVyZSBjcmVhdGVkIGJ5IHRoZSBXaW5kb3dzIHByb2dyYW0KK29lbWFuc2kuZXhlIHdoaWNoIGlzIGFsc28gaW5jbHVkZWQuIFRvIGdldCB0aGUgb2VtPC0+YW5zaSB0cmFuc2xhdGlvbnMKK3JpZ2h0IGZvciB5b3VyIHBhcnQgb2YgdGhlIHdvcmxkIGp1c3QgcnVuIG9lbWFuc2kgdW5kZXIgV2luZG93cyBub3QKK1dpbmUgYW5kIG9lbWFuc2kgd2lsbCBjcmVhdGUgb2VtMmFuc2kgYW5kIGFuc2kyb2VtIGZvciB5b3VyIGxvY2FsZQordGhhdCBpcyBpZiB5b3VyIFdpbmRvd3MvRG9zIGlzIHNldCB1cCBjb3JyZWN0bHkuIE1vdmUgdGhlIC50cmwgZmlsZXMKK2ludG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHlvdSBydW4gd2luZS4gSWYgV2luZSBkb2VzIG5vdCBmaW5kIHRoZQorKi50cmwgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IEFuc2lUb09lbSBhbmQgT2VtVG9BbnNpIHdpbGwgYmUKK3Bhc3NpdmUuCisKK1Nob3J0Y29taW5ncy9CdWdzOiAKK1NvbWUgZnVuY3Rpb25zIGRlcGVuZCB1cG9uIGxpYmMgZnVuY3Rpb25zIGxpa2UgdG91cHBlciwgdG9sb3dlciBhbmQKK2lzYWxwaGEgdGhhdCwgYXMgZmFyIGFzIEkga25vdywgYXJlIHRvdGFsbHkgd2l0aG91dCBzdXBwb3J0IGZvciBOTFMKK2FuZCBJU08gODg1OS0xLiAgRGVmYXVsdCBBbnNpPC0+T0VNIHRyYW5zbGF0aW9ucyB3aGVuICoudHJsIGZpbGVzIGFyZQorbm90IGZvdW5kIGFyZSBtaXNzaW5nLgorCisKK05PVEU6IFBsZWFzZSBkb24ndCBydW4gb2VtYW5zaS5leGUgdW5kZXIgd2luZS4KZGlmZiAtLWdpdCBhL2Fuc2kyb2VtLnRybCBiL2Fuc2kyb2VtLnRybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODA1YmIzCi0tLSAvZGV2L251bGwKKysrIGIvYW5zaTJvZW0udHJsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JzZG1ha2UucGF0Y2ggYi9ic2RtYWtlLnBhdGNoCmluZGV4IDQyZjBlYTEuLjdiZTI4OTMgMTAwNjQ0Ci0tLSBhL2JzZG1ha2UucGF0Y2gKKysrIGIvYnNkbWFrZS5wYXRjaApAQCAtMSwxNDcgKzEsMTI0IEBACi0qKiogLi93aW5kb3dzL01ha2VmaWxlLm9yaWcJRnJpIFNlcCAgMyAxNjozNzo1OCAxOTkzCi0tLS0gLi93aW5kb3dzL01ha2VmaWxlCVRodSBTZXAgIDkgMjI6NTY6MjEgMTk5MwotKioqKioqKioqKioqKioqCi0qKiogMTQsMTkgKioqKgotICBkZXBlbmQ6Ci0gIAkkKENDKSAkKENGTEFHUykgLU0gKi5jID4gLmRlcGVuZAotICAKLSEgaWZlcSAoLmRlcGVuZCwkKHdpbGRjYXJkIC5kZXBlbmQpKQotISBpbmNsdWRlIC5kZXBlbmQKLSEgZW5kaWYKLS0tLSAxNCwxOSAtLS0tCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISAuaWYgZXhpc3RzKC5kZXBlbmQpCi0hIC5pbmNsdWRlICIuZGVwZW5kIgotISAuZW5kaWYKLSoqKiAuL3Rvb2xzL01ha2VmaWxlLm9yaWcJVHVlIEp1bCAyMCAxODo0MDoxOCAxOTkzCi0tLS0gLi90b29scy9NYWtlZmlsZQlUaHUgU2VwICA5IDIyOjU2OjIxIDE5OTMKLSoqKioqKioqKioqKioqKgotKioqIDEyLDE3ICoqKioKLSAgIwotICAjIERlcGVuZGVuY3kgbGlzdHMKLSAgIwotISBpZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi0hIGluY2x1ZGUgLmRlcGVuZAotISBlbmRpZgotLS0tIDEyLDIxIC0tLS0KLSAgIwotICAjIERlcGVuZGVuY3kgbGlzdHMKLSAgIwotISAuaWYgZXhpc3RzKC5kZXBlbmQpCi0hIC5pbmNsdWRlICIuZGVwZW5kIgotISAuZW5kaWYKLSEgCi0hICNpZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi0hICNpbmNsdWRlIC5kZXBlbmQKLSEgI2VuZGlmCi0qKiogLi9vYmplY3RzL01ha2VmaWxlLm9yaWcJRnJpIFNlcCAgMyAxNjozOToyMCAxOTkzCi0tLS0gLi9vYmplY3RzL01ha2VmaWxlCVRodSBTZXAgIDkgMjI6NTY6MjMgMTk5MwotKioqKioqKioqKioqKioqCi0qKiogMTQsMTkgKioqKgotICBkZXBlbmQ6Ci0gIAkkKENDKSAkKENGTEFHUykgLU0gKi5jID4gLmRlcGVuZAotICAKLSEgaWZlcSAoLmRlcGVuZCwkKHdpbGRjYXJkIC5kZXBlbmQpKQotISBpbmNsdWRlIC5kZXBlbmQKLSEgZW5kaWYKLS0tLSAxNCwxOSAtLS0tCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISAuaWYgZXhpc3RzKC5kZXBlbmQpCi0hIC5pbmNsdWRlICIuZGVwZW5kIgotISAuZW5kaWYKLSoqKiAuL21pc2MvTWFrZWZpbGUub3JpZwlUaHUgU2VwICA5IDExOjE2OjQ5IDE5OTMKLS0tLSAuL21pc2MvTWFrZWZpbGUJVGh1IFNlcCAgOSAyMjo1NjoyMyAxOTkzCi0qKioqKioqKioqKioqKioKLSoqKiAxMywxOCAqKioqCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISBpZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi0hIGluY2x1ZGUgLmRlcGVuZAotISBlbmRpZgotLS0tIDEzLDE4IC0tLS0KLSAgZGVwZW5kOgotICAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKLSAgCi0hIC5pZiBleGlzdHMoLmRlcGVuZCkKLSEgLmluY2x1ZGUgIi5kZXBlbmQiCi0hIC5lbmRpZgotKioqIC4vbWVtb3J5L01ha2VmaWxlLm9yaWcJVHVlIEp1bCAyMCAxODo0MzowMiAxOTkzCi0tLS0gLi9tZW1vcnkvTWFrZWZpbGUJVGh1IFNlcCAgOSAyMjo1NjozNCAxOTkzCi0qKioqKioqKioqKioqKioKLSoqKiAxMywxOCAqKioqCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISBpZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi0hIGluY2x1ZGUgLmRlcGVuZAotISBlbmRpZgotLS0tIDEzLDE4IC0tLS0KLSAgZGVwZW5kOgotICAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKLSAgCi0hIC5pZiBleGlzdHMoLmRlcGVuZCkKLSEgLmluY2x1ZGUgIi5kZXBlbmQiCi0hIC5lbmRpZgotKioqIC4vbG9hZGVyL01ha2VmaWxlLm9yaWcJTW9uIEF1ZyAzMCAyMDo0NDoxOCAxOTkzCi0tLS0gLi9sb2FkZXIvTWFrZWZpbGUJVGh1IFNlcCAgOSAyMjo1NjozNiAxOTkzCi0qKioqKioqKioqKioqKioKLSoqKiAxMywxOCAqKioqCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISBpZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi0hIGluY2x1ZGUgLmRlcGVuZAotISBlbmRpZgotLS0tIDEzLDE4IC0tLS0KLSAgZGVwZW5kOgotICAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKLSAgCi0hIC5pZiBleGlzdHMoLmRlcGVuZCkKLSEgLmluY2x1ZGUgIi5kZXBlbmQiCi0hIC5lbmRpZgotKioqIC4vaWYxNjMyL01ha2VmaWxlLm9yaWcJVGh1IFNlcCAgOSAxMToxNTo1OCAxOTkzCi0tLS0gLi9pZjE2MzIvTWFrZWZpbGUJVGh1IFNlcCAgOSAyMjo1NjozOCAxOTkzCi0qKioqKioqKioqKioqKioKLSoqKiA0Miw1MCAqKioqCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISBpZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCi0hIGluY2x1ZGUgLmRlcGVuZAotISBlbmRpZgotICAKLSAgCi0gIAotLS0tIDQyLDUwIC0tLS0KLSAgZGVwZW5kOgotICAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKLSAgCi0hIC5pZiBleGlzdHMoLmRlcGVuZCkKLSEgLmluY2x1ZGUgIi5kZXBlbmQiCi0hIC5lbmRpZgotICAKLSAgCi0gIAotKioqIC4vY29udHJvbHMvTWFrZWZpbGUub3JpZwlNb24gQXVnIDMwIDE5OjQwOjM5IDE5OTMKLS0tLSAuL2NvbnRyb2xzL01ha2VmaWxlCVRodSBTZXAgIDkgMjI6NTY6NDMgMTk5MwotKioqKioqKioqKioqKioqCi0qKiogMTQsMTkgKioqKgotICBkZXBlbmQ6Ci0gIAkkKENDKSAkKENGTEFHUykgLU0gKi5jID4gLmRlcGVuZAotICAKLSEgaWZlcSAoLmRlcGVuZCwkKHdpbGRjYXJkIC5kZXBlbmQpKQotISBpbmNsdWRlIC5kZXBlbmQKLSEgZW5kaWYKLS0tLSAxNCwyMCAtLS0tCi0gIGRlcGVuZDoKLSAgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCi0gIAotISAuaWYgZXhpc3RzKC5kZXBlbmQpCi0hIC5pbmNsdWRlICIuZGVwZW5kIgotISAuZW5kaWYKLSEgCitkaWZmIC1ydU4gLi4vQmFja3VwLy9NYWtlZmlsZSAuL01ha2VmaWxlCistLS0gLi4vQmFja3VwLy9NYWtlZmlsZQlUdWUgU2VwIDE0IDA5OjQ3OjAwIDE5OTMKKysrKyAuL01ha2VmaWxlCVRodSBTZXAgMTYgMDk6NTk6NTIgMTk5MworQEAgLTcsNyArNyw3IEBACisgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICMgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZvciB0aGUgdG9wIGxldmVsCisgVEFSR0VUPXdpbmUKKy1MSUJTPS1MLiAtTC91c3IvWDM4Ni9saWIgLWxYZXh0IC1sWGF3IC1sWHQgLWxYbXUgLWxYMTEgLWxtCisrTElCUz0tTC4gLUwvdXNyL1gzODYvbGliIC1sWGV4dCAtbFhhdyAtbFh0IC1sWG11IC1sWDExIC1sbSAtbGkzODYKKyBPQkpTPWlmMTYzMi9pZjE2MzIubyBjb250cm9scy9jb250cm9scy5vIGxvYWRlci9sb2FkZXIubyBcCisgCW1lbW9yeS9tZW1vcnkubyBtaXNjL21pc2MubyBvYmplY3RzL29iamVjdHMubyB3aW5kb3dzL3dpbmRvd3MubworIFNVQkRJUlM9aWYxNjMyIGNvbnRyb2xzIGxvYWRlciBtZW1vcnkgbWlzYyBvYmplY3RzIHdpbmRvd3MKK2RpZmYgLXJ1TiAuLi9CYWNrdXAvL2NvbnRyb2xzL01ha2VmaWxlIC4vY29udHJvbHMvTWFrZWZpbGUKKy0tLSAuLi9CYWNrdXAvL2NvbnRyb2xzL01ha2VmaWxlCVNhdCBTZXAgMTEgMjI6MTM6NDQgMTk5MworKysrIC4vY29udHJvbHMvTWFrZWZpbGUJVGh1IFNlcCAxNiAxMDowMDoyNCAxOTkzCitAQCAtMTQsNiArMTQsNyBAQAorIGRlcGVuZDoKKyAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKKyAKKy1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCistaW5jbHVkZSAuZGVwZW5kCistZW5kaWYKKysuaWYgZXhpc3RzKC5kZXBlbmQpCisrLmluY2x1ZGUgIi5kZXBlbmQiCisrLmVuZGlmCisrCitkaWZmIC1ydU4gLi4vQmFja3VwLy9pZjE2MzIvTWFrZWZpbGUgLi9pZjE2MzIvTWFrZWZpbGUKKy0tLSAuLi9CYWNrdXAvL2lmMTYzMi9NYWtlZmlsZQlUdWUgU2VwIDE0IDA4OjU2OjE3IDE5OTMKKysrKyAuL2lmMTYzMi9NYWtlZmlsZQlUaHUgU2VwIDE2IDEwOjAwOjI0IDE5OTMKK0BAIC00NSw5ICs0NSw5IEBACisgZGVwZW5kOgorIAkkKENDKSAkKENGTEFHUykgLU0gKi5jID4gLmRlcGVuZAorIAorLWlmZXEgKC5kZXBlbmQsJCh3aWxkY2FyZCAuZGVwZW5kKSkKKy1pbmNsdWRlIC5kZXBlbmQKKy1lbmRpZgorKy5pZiBleGlzdHMoLmRlcGVuZCkKKysuaW5jbHVkZSAiLmRlcGVuZCIKKysuZW5kaWYKKyAKKyAKKyAKK2RpZmYgLXJ1TiAuLi9CYWNrdXAvL2xvYWRlci9NYWtlZmlsZSAuL2xvYWRlci9NYWtlZmlsZQorLS0tIC4uL0JhY2t1cC8vbG9hZGVyL01ha2VmaWxlCVNhdCBTZXAgMTEgMjE6NDI6MDUgMTk5MworKysrIC4vbG9hZGVyL01ha2VmaWxlCVRodSBTZXAgMTYgMTA6MDA6MjQgMTk5MworQEAgLTEzLDYgKzEzLDYgQEAKKyBkZXBlbmQ6CisgCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCisgCistaWZlcSAoLmRlcGVuZCwkKHdpbGRjYXJkIC5kZXBlbmQpKQorLWluY2x1ZGUgLmRlcGVuZAorLWVuZGlmCisrLmlmIGV4aXN0cyguZGVwZW5kKQorKy5pbmNsdWRlICIuZGVwZW5kIgorKy5lbmRpZgorZGlmZiAtcnVOIC4uL0JhY2t1cC8vbWVtb3J5L01ha2VmaWxlIC4vbWVtb3J5L01ha2VmaWxlCistLS0gLi4vQmFja3VwLy9tZW1vcnkvTWFrZWZpbGUJU2F0IFNlcCAxMSAyMTo0MjowNSAxOTkzCisrKysgLi9tZW1vcnkvTWFrZWZpbGUJVGh1IFNlcCAxNiAxMDowMDoyNCAxOTkzCitAQCAtMTMsNiArMTMsNiBAQAorIGRlcGVuZDoKKyAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKKyAKKy1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCistaW5jbHVkZSAuZGVwZW5kCistZW5kaWYKKysuaWYgZXhpc3RzKC5kZXBlbmQpCisrLmluY2x1ZGUgIi5kZXBlbmQiCisrLmVuZGlmCitkaWZmIC1ydU4gLi4vQmFja3VwLy9taXNjL01ha2VmaWxlIC4vbWlzYy9NYWtlZmlsZQorLS0tIC4uL0JhY2t1cC8vbWlzYy9NYWtlZmlsZQlUdWUgU2VwIDE0IDA5OjE3OjAwIDE5OTMKKysrKyAuL21pc2MvTWFrZWZpbGUJVGh1IFNlcCAxNiAxMDowMDoyNCAxOTkzCitAQCAtMTQsNiArMTQsNiBAQAorIGRlcGVuZDoKKyAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKKyAKKy1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCistaW5jbHVkZSAuZGVwZW5kCistZW5kaWYKKysuaWYgZXhpc3RzKC5kZXBlbmQpCisrLmluY2x1ZGUgIi5kZXBlbmQiCisrLmVuZGlmCitkaWZmIC1ydU4gLi4vQmFja3VwLy9vYmplY3RzL01ha2VmaWxlIC4vb2JqZWN0cy9NYWtlZmlsZQorLS0tIC4uL0JhY2t1cC8vb2JqZWN0cy9NYWtlZmlsZQlUdWUgU2VwIDE0IDEzOjU5OjA0IDE5OTMKKysrKyAuL29iamVjdHMvTWFrZWZpbGUJVGh1IFNlcCAxNiAxMDowMDoyNCAxOTkzCitAQCAtMTQsNiArMTQsNiBAQAorIGRlcGVuZDoKKyAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKKyAKKy1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCistaW5jbHVkZSAuZGVwZW5kCistZW5kaWYKKysuaWYgZXhpc3RzKC5kZXBlbmQpCisrLmluY2x1ZGUgIi5kZXBlbmQiCisrLmVuZGlmCitkaWZmIC1ydU4gLi4vQmFja3VwLy90b29scy9NYWtlZmlsZSAuL3Rvb2xzL01ha2VmaWxlCistLS0gLi4vQmFja3VwLy90b29scy9NYWtlZmlsZQlUdWUgU2VwIDE0IDA5OjQ2OjQwIDE5OTMKKysrKyAuL3Rvb2xzL01ha2VmaWxlCVRodSBTZXAgMTYgMTA6MDA6MjQgMTk5MworQEAgLTE0LDYgKzE0LDEwIEBACisgIworICMgRGVwZW5kZW5jeSBsaXN0cworICMKKy1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCistaW5jbHVkZSAuZGVwZW5kCistZW5kaWYKKysuaWYgZXhpc3RzKC5kZXBlbmQpCisrLmluY2x1ZGUgIi5kZXBlbmQiCisrLmVuZGlmCisrCisrI2lmZXEgKC5kZXBlbmQsJCh3aWxkY2FyZCAuZGVwZW5kKSkKKysjaW5jbHVkZSAuZGVwZW5kCisrI2VuZGlmCitkaWZmIC1ydU4gLi4vQmFja3VwLy93aW5kb3dzL01ha2VmaWxlIC4vd2luZG93cy9NYWtlZmlsZQorLS0tIC4uL0JhY2t1cC8vd2luZG93cy9NYWtlZmlsZQlUdWUgU2VwIDE0IDA4OjM5OjQ1IDE5OTMKKysrKyAuL3dpbmRvd3MvTWFrZWZpbGUJVGh1IFNlcCAxNiAxMDowMDoyNCAxOTkzCitAQCAtMTQsNiArMTQsNiBAQAorIGRlcGVuZDoKKyAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKKyAKKy1pZmVxICguZGVwZW5kLCQod2lsZGNhcmQgLmRlcGVuZCkpCistaW5jbHVkZSAuZGVwZW5kCistZW5kaWYKKysuaWYgZXhpc3RzKC5kZXBlbmQpCisrLmluY2x1ZGUgIi5kZXBlbmQiCisrLmVuZGlmCmRpZmYgLS1naXQgYS9jb250cm9scy9NYWtlZmlsZSBiL2NvbnRyb2xzL01ha2VmaWxlCmluZGV4IGRjM2MxODcuLjQ2YTkzYmEgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL01ha2VmaWxlCisrKyBiL2NvbnRyb2xzL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogQ0ZMQUdTPSQoQ09QVFMpICQoREVCVUdPUFRTKSAtSSQoSU5DTFVERV9ESVIpCiAKIE9CSlM9bWVudS5vIHdpZGdldHMubyBidXR0b24ubyBTbWVNZW51QnV0dG8ubyBXaW5MYWJlbC5vIFdpbkNvbW1hbmQubyBcCi0gICAgIFdpbk1lbnVCdXR0by5vIFdpbkJ1dHRvbi5vCisgICAgIFdpbk1lbnVCdXR0by5vCiAKIGRlZmF1bHQ6IGNvbnRyb2xzLm8KIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvV2luQnV0dG9uLmMgYi9jb250cm9scy9XaW5CdXR0b24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3NzNjZS4uMDAwMDAwMAotLS0gYS9jb250cm9scy9XaW5CdXR0b24uYworKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUNvcHlyaWdodCAxOTg3LCAxOTg4IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLAotYW5kIHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBDYW1icmlkZ2UsIE1hc3NhY2h1c2V0dHMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKLXByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLWJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIERpZ2l0YWwgb3IgTUlUIG5vdCBiZQotdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCi1zb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKLQotRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCi1BTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKLURJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCi1BTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCi1XSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCi1BUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCi1TT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogTW9kaWZpY2F0aW9ucyBmb3IgV2luZQotICoKLSAqIDgvMjgvOTMgIERhdmlkIE1ldGNhbGZlIChkYXZpZEBwcmlzbS5kZW1vbi5jby51aykKLSAqICAgICAgICAgIENyZWF0ZWQgZnJvbSBDb21tYW5kIHdpZGdldCBhbmQgYWRkZWQgM0QgZWZmZWN0Ci0gKi8KLQotLyoKLSAqIFdpbkJ1dHRvbi5jIC0gV2luQnV0dG9uIGJ1dHRvbiB3aWRnZXQKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxYMTEvSW50cmluc2ljUC5oPgotI2luY2x1ZGUgPFgxMS9TdHJpbmdEZWZzLmg+Ci0jaW5jbHVkZSA8WDExL1htdS9NaXNjLmg+Ci0jaW5jbHVkZSA8WDExL1hhdy9YYXdJbml0Lmg+Ci0jaW5jbHVkZSAiV2luQnV0dG9uUC5oIgotI2luY2x1ZGUgPFgxMS9YbXUvQ29udmVydGVycy5oPgotCi0jZGVmaW5lIERFRkFVTFRfSElHSExJR0hUX1RISUNLTkVTUyAwCi0jZGVmaW5lIERFRkFVTFRfU0hBUEVfSElHSExJR0hUIDMyNzY3Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVsbCBjbGFzcyByZWNvcmQgY29uc3RhbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUHJpdmF0ZSBEYXRhICovCi0KLXN0YXRpYyBjaGFyIGRlZmF1bHRUcmFuc2xhdGlvbnNbXSA9Ci0gICAgIjxFbnRlcldpbmRvdz46CWhpZ2hsaWdodCgpCQlcblwKLSAgICAgPExlYXZlV2luZG93PjoJcmVzZXQoKQkJCVxuXAotICAgICA8QnRuMURvd24+OglzZXQoKQkJCVxuXAotICAgICA8QnRuMVVwPjoJCW5vdGlmeSgpIHVuc2V0KCkJIjsKLQotI2RlZmluZSBvZmZzZXQoZmllbGQpIFh0T2Zmc2V0T2YoV2luQnV0dG9uUmVjLCBmaWVsZCkKLXN0YXRpYyBYdFJlc291cmNlIHJlc291cmNlc1tdID0geyAKLSAgIHtYdE5jYWxsYmFjaywgWHRDQ2FsbGJhY2ssIFh0UkNhbGxiYWNrLCBzaXplb2YoWHRQb2ludGVyKSwgCi0gICAgICBvZmZzZXQod2luYnV0dG9uLmNhbGxiYWNrcyksIFh0UkNhbGxiYWNrLCAoWHRQb2ludGVyKU5VTEx9LAotICAge1h0TmhpZ2hsaWdodFRoaWNrbmVzcywgWHRDVGhpY2tuZXNzLCBYdFJEaW1lbnNpb24sIHNpemVvZihEaW1lbnNpb24pLAotICAgICAgb2Zmc2V0KHdpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzKSwgWHRSSW1tZWRpYXRlLAotICAgICAgKFh0UG9pbnRlcikgREVGQVVMVF9TSEFQRV9ISUdITElHSFR9LAotICAge1h0TnNoYXBlU3R5bGUsIFh0Q1NoYXBlU3R5bGUsIFh0UlNoYXBlU3R5bGUsIHNpemVvZihpbnQpLAotICAgICAgb2Zmc2V0KHdpbmJ1dHRvbi5zaGFwZV9zdHlsZSksIFh0UkltbWVkaWF0ZSwgCi0JICAgIChYdFBvaW50ZXIpWGF3U2hhcGVSZWN0YW5nbGV9LAotICAge1h0TmNvcm5lclJvdW5kUGVyY2VudCwgWHRDQ29ybmVyUm91bmRQZXJjZW50LCAKLQlYdFJEaW1lbnNpb24sIHNpemVvZihEaW1lbnNpb24pLAotCW9mZnNldCh3aW5idXR0b24uY29ybmVyX3JvdW5kKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAyNX0sCi0gICB7WHROc2hhZG93VGhpY2tuZXNzLCBYdENTaGFkb3dUaGlja25lc3MsIFh0UkRpbWVuc2lvbiwgc2l6ZW9mKERpbWVuc2lvbiksCi0Jb2Zmc2V0KHdpbmJ1dHRvbi5zaGFkb3dfdGhpY2tuZXNzKSwgWHRSSW1tZWRpYXRlLCAoWHRQb2ludGVyKSAyfSwKLSAgIHtYdE5zaGFkb3dIaWdobGlnaHQsIFh0Q1NoYWRvd0hpZ2hsaWdodCwgWHRSUGl4ZWwsIHNpemVvZihQaXhlbCksCi0gICAgICAgIG9mZnNldCh3aW5idXR0b24uc2hhZG93X2hpZ2hsaWdodCksIFh0UlN0cmluZywgKFh0UG9pbnRlcikgIndoaXRlIn0sCi0gICB7WHROc2hhZG93U2hhZGUsIFh0Q1NoYWRvd1NoYWRlLCBYdFJQaXhlbCwgc2l6ZW9mKFBpeGVsKSwKLQlvZmZzZXQod2luYnV0dG9uLnNoYWRvd19zaGFkZSksIFh0UlN0cmluZywgKFh0UG9pbnRlcikgImdyZXkyNSJ9LAotfTsKLSN1bmRlZiBvZmZzZXQKLQotc3RhdGljIEJvb2xlYW4gU2V0VmFsdWVzKCk7Ci1zdGF0aWMgdm9pZCBJbml0aWFsaXplKCksIFJlZGlzcGxheSgpLCBTZXQoKSwgUmVzZXQoKSwgTm90aWZ5KCksIFVuc2V0KCk7Ci1zdGF0aWMgdm9pZCBIaWdobGlnaHQoKSwgVW5oaWdobGlnaHQoKSwgRGVzdHJveSgpLCBQYWludFdpbkJ1dHRvbldpZGdldCgpOwotc3RhdGljIHZvaWQgQ2xhc3NJbml0aWFsaXplKCk7Ci1zdGF0aWMgQm9vbGVhbiBTaGFwZUJ1dHRvbigpOwotc3RhdGljIHZvaWQgUmVhbGl6ZSgpLCBSZXNpemUoKTsKLQotc3RhdGljIFh0QWN0aW9uc1JlYyBhY3Rpb25zTGlzdFtdID0gewotICB7InNldCIsCQlTZXR9LAotICB7Im5vdGlmeSIsCQlOb3RpZnl9LAotICB7ImhpZ2hsaWdodCIsCQlIaWdobGlnaHR9LAotICB7InJlc2V0IiwJCVJlc2V0fSwKLSAgeyJ1bnNldCIsCQlVbnNldH0sCi0gIHsidW5oaWdobGlnaHQiLAlVbmhpZ2hsaWdodH0KLX07Ci0KLSNkZWZpbmUgU3VwZXJDbGFzcyAoKFdpbkxhYmVsV2lkZ2V0Q2xhc3MpJndpbkxhYmVsQ2xhc3NSZWMpCi0KLVdpbkJ1dHRvbkNsYXNzUmVjIHdpbkJ1dHRvbkNsYXNzUmVjID0gewotICB7Ci0gICAgKFdpZGdldENsYXNzKSBTdXBlckNsYXNzLAkJLyogc3VwZXJjbGFzcwkJICAqLwkKLSAgICAiV2luQnV0dG9uIiwJCQkvKiBjbGFzc19uYW1lCQkgICovCi0gICAgc2l6ZW9mKFdpbkJ1dHRvblJlYyksCQkvKiBzaXplCQkJICAqLwotICAgIENsYXNzSW5pdGlhbGl6ZSwJCQkvKiBjbGFzc19pbml0aWFsaXplCSAgKi8KLSAgICBOVUxMLAkJCQkvKiBjbGFzc19wYXJ0X2luaXRpYWxpemUgICovCi0gICAgRkFMU0UsCQkJCS8qIGNsYXNzX2luaXRlZAkJICAqLwotICAgIEluaXRpYWxpemUsCQkJCS8qIGluaXRpYWxpemUJCSAgKi8KLSAgICBOVUxMLAkJCQkvKiBpbml0aWFsaXplX2hvb2sJICAqLwotICAgIFJlYWxpemUsCQkJCS8qIHJlYWxpemUJCSAgKi8KLSAgICBhY3Rpb25zTGlzdCwJCQkvKiBhY3Rpb25zCQkgICovCi0gICAgWHROdW1iZXIoYWN0aW9uc0xpc3QpLAkJLyogbnVtX2FjdGlvbnMJCSAgKi8KLSAgICByZXNvdXJjZXMsCQkJCS8qIHJlc291cmNlcwkJICAqLwotICAgIFh0TnVtYmVyKHJlc291cmNlcyksCQkvKiByZXNvdXJjZV9jb3VudAkgICovCi0gICAgTlVMTFFVQVJLLAkJCQkvKiB4cm1fY2xhc3MJCSAgKi8KLSAgICBGQUxTRSwJCQkJLyogY29tcHJlc3NfbW90aW9uCSAgKi8KLSAgICBUUlVFLAkJCQkvKiBjb21wcmVzc19leHBvc3VyZQkgICovCi0gICAgVFJVRSwJCQkJLyogY29tcHJlc3NfZW50ZXJsZWF2ZSAgICAqLwotICAgIEZBTFNFLAkJCQkvKiB2aXNpYmxlX2ludGVyZXN0CSAgKi8KLSAgICBEZXN0cm95LAkJCQkvKiBkZXN0cm95CQkgICovCi0gICAgUmVzaXplLAkJCQkvKiByZXNpemUJCSAgKi8KLSAgICBSZWRpc3BsYXksCQkJCS8qIGV4cG9zZQkJICAqLwotICAgIFNldFZhbHVlcywJCQkJLyogc2V0X3ZhbHVlcwkJICAqLwotICAgIE5VTEwsCQkJCS8qIHNldF92YWx1ZXNfaG9vawkgICovCi0gICAgWHRJbmhlcml0U2V0VmFsdWVzQWxtb3N0LAkJLyogc2V0X3ZhbHVlc19hbG1vc3QJICAqLwotICAgIE5VTEwsCQkJCS8qIGdldF92YWx1ZXNfaG9vawkgICovCi0gICAgTlVMTCwJCQkJLyogYWNjZXB0X2ZvY3VzCQkgICovCi0gICAgWHRWZXJzaW9uLAkJCQkvKiB2ZXJzaW9uCQkgICovCi0gICAgTlVMTCwJCQkJLyogY2FsbGJhY2tfcHJpdmF0ZQkgICovCi0gICAgZGVmYXVsdFRyYW5zbGF0aW9ucywJCS8qIHRtX3RhYmxlCQkgICovCi0gICAgWHRJbmhlcml0UXVlcnlHZW9tZXRyeSwJCS8qIHF1ZXJ5X2dlb21ldHJ5CSAgKi8KLSAgICBYdEluaGVyaXREaXNwbGF5QWNjZWxlcmF0b3IsCS8qIGRpc3BsYXlfYWNjZWxlcmF0b3IJICAqLwotICAgIE5VTEwJCQkJLyogZXh0ZW5zaW9uCQkgICovCi0gIH0sICAvKiBDb3JlQ2xhc3MgZmllbGRzIGluaXRpYWxpemF0aW9uICovCi0gIHsKLSAgICBYdEluaGVyaXRDaGFuZ2VTZW5zaXRpdmUJCS8qIGNoYW5nZV9zZW5zaXRpdmUJKi8KLSAgfSwgIC8qIFNpbXBsZUNsYXNzIGZpZWxkcyBpbml0aWFsaXphdGlvbiAqLwotICB7Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmllbGQgbm90IHVzZWQgICAgKi8KLSAgfSwgIC8qIFdpbkxhYmVsQ2xhc3MgZmllbGRzIGluaXRpYWxpemF0aW9uICovCi0gIHsKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWVsZCBub3QgdXNlZCAgICAqLwotICB9LCAgLyogV2luQnV0dG9uQ2xhc3MgZmllbGRzIGluaXRpYWxpemF0aW9uICovCi19OwotCi0gIC8qIGZvciBwdWJsaWMgY29uc3VtcHRpb24gKi8KLVdpZGdldENsYXNzIHdpbkJ1dHRvbldpZGdldENsYXNzID0gKFdpZGdldENsYXNzKSAmd2luQnV0dG9uQ2xhc3NSZWM7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUHJpdmF0ZSBQcm9jZWR1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBHQyAKLUdldF9HQyhjYncsIGZnLCBiZykKLVdpbkJ1dHRvbldpZGdldCBjYnc7Ci1QaXhlbCBmZywgYmc7Ci17Ci0gIFhHQ1ZhbHVlcwl2YWx1ZXM7Ci0gIAotICB2YWx1ZXMuZm9yZWdyb3VuZCAgID0gZmc7Ci0gIHZhbHVlcy5iYWNrZ3JvdW5kCT0gYmc7Ci0gIHZhbHVlcy5mb250CQk9IGNidy0+d2lubGFiZWwuZm9udC0+ZmlkOwotICB2YWx1ZXMuY2FwX3N0eWxlID0gQ2FwUHJvamVjdGluZzsKLSAgCi0gIGlmIChjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzID4gMSApCi0gICAgdmFsdWVzLmxpbmVfd2lkdGggICA9IGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3M7Ci0gIGVsc2UgCi0gICAgdmFsdWVzLmxpbmVfd2lkdGggICA9IDA7Ci0gIAotICByZXR1cm4gWHRHZXRHQygoV2lkZ2V0KWNidywKLQkJIChHQ0ZvcmVncm91bmR8R0NCYWNrZ3JvdW5kfEdDRm9udHxHQ0xpbmVXaWR0aHxHQ0NhcFN0eWxlKSwKLQkJICZ2YWx1ZXMpOwotfQotCi1zdGF0aWMgdm9pZCAKLUdldF9TaGFkb3dfR0NzKGNidykKLVdpbkJ1dHRvbldpZGdldCBjYnc7Ci17Ci0gIFhHQ1ZhbHVlcwl2YWx1ZXM7Ci0gIAotICB2YWx1ZXMuZm9yZWdyb3VuZCAgICAgPSBjYnctPndpbmJ1dHRvbi5zaGFkb3dfaGlnaGxpZ2h0OwotICB2YWx1ZXMubGluZV93aWR0aAk9IGNidy0+d2luYnV0dG9uLnNoYWRvd190aGlja25lc3M7Ci0gIHZhbHVlcy5jYXBfc3R5bGUgICAgICA9IENhcFByb2plY3Rpbmc7Ci0gIGNidy0+d2luYnV0dG9uLnNoYWRvd19oaWdobGlnaHRfZ2MgPQotCSAgWHRHZXRHQygoV2lkZ2V0KWNidywgKEdDRm9yZWdyb3VuZHxHQ0xpbmVXaWR0aHxHQ0NhcFN0eWxlKSwgJnZhbHVlcyk7Ci0KLSAgdmFsdWVzLmZvcmVncm91bmQgICAgID0gY2J3LT53aW5idXR0b24uc2hhZG93X3NoYWRlOwotICB2YWx1ZXMubGluZV93aWR0aAk9IGNidy0+d2luYnV0dG9uLnNoYWRvd190aGlja25lc3M7Ci0gIHZhbHVlcy5jYXBfc3R5bGUgICAgICA9IENhcFByb2plY3Rpbmc7Ci0gIGNidy0+d2luYnV0dG9uLnNoYWRvd19zaGFkZV9nYyA9Ci0JICBYdEdldEdDKChXaWRnZXQpY2J3LCAoR0NGb3JlZ3JvdW5kfEdDTGluZVdpZHRofEdDQ2FwU3R5bGUpLCAmdmFsdWVzKTsKLX0KLQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQgCi1Jbml0aWFsaXplKHJlcXVlc3QsIG5ldywgYXJncywgbnVtX2FyZ3MpCi1XaWRnZXQgcmVxdWVzdCwgbmV3OwotQXJnTGlzdCBhcmdzOwkJCS8qIHVudXNlZCAqLwotQ2FyZGluYWwgKm51bV9hcmdzOwkJLyogdW51c2VkICovCi17Ci0gIFdpbkJ1dHRvbldpZGdldCBjYncgPSAoV2luQnV0dG9uV2lkZ2V0KSBuZXc7Ci0gIGludCBzaGFwZV9ldmVudF9iYXNlLCBzaGFwZV9lcnJvcl9iYXNlOwotCi0gIGlmIChjYnctPndpbmJ1dHRvbi5zaGFwZV9zdHlsZSAhPSBYYXdTaGFwZVJlY3RhbmdsZQotICAgICAgJiYgIVhTaGFwZVF1ZXJ5RXh0ZW5zaW9uKFh0RGlzcGxheShuZXcpLCAmc2hhcGVfZXZlbnRfYmFzZSwgCi0JCQkgICAgICAgJnNoYXBlX2Vycm9yX2Jhc2UpKQotICAgICAgY2J3LT53aW5idXR0b24uc2hhcGVfc3R5bGUgPSBYYXdTaGFwZVJlY3RhbmdsZTsKLSAgaWYgKGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3MgPT0gREVGQVVMVF9TSEFQRV9ISUdITElHSFQpIHsKLSAgICAgIGlmIChjYnctPndpbmJ1dHRvbi5zaGFwZV9zdHlsZSAhPSBYYXdTaGFwZVJlY3RhbmdsZSkKLQkgIGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3MgPSAwOwotICAgICAgZWxzZQotCSAgY2J3LT53aW5idXR0b24uaGlnaGxpZ2h0X3RoaWNrbmVzcyA9IERFRkFVTFRfSElHSExJR0hUX1RISUNLTkVTUzsKLSAgfQotCi0gIFh0VmFTZXRWYWx1ZXMobmV3LCBYdE5iYWNrZ3JvdW5kLCAiZ3JleTc1Iik7Ci0gIGNidy0+d2luYnV0dG9uLm5vcm1hbF9HQyA9IEdldF9HQyhjYncsIGNidy0+d2lubGFiZWwuZm9yZWdyb3VuZCwgCi0JCQkJICBjYnctPmNvcmUuYmFja2dyb3VuZF9waXhlbCk7Ci0gIGNidy0+d2luYnV0dG9uLmludmVyc2VfR0MgPSBHZXRfR0MoY2J3LCBjYnctPmNvcmUuYmFja2dyb3VuZF9waXhlbCwgCi0JCQkJICAgY2J3LT53aW5sYWJlbC5mb3JlZ3JvdW5kKTsKLSAgWHRSZWxlYXNlR0MobmV3LCBjYnctPndpbmxhYmVsLm5vcm1hbF9HQyk7Ci0gIGNidy0+d2lubGFiZWwubm9ybWFsX0dDID0gY2J3LT53aW5idXR0b24ubm9ybWFsX0dDOwotCi0gIEdldF9TaGFkb3dfR0NzKGNidyk7Ci0KLSAgY2J3LT53aW5idXR0b24uc2V0ID0gRkFMU0U7Ci0gIGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodGVkID0gSGlnaGxpZ2h0Tm9uZTsKLX0KLQotc3RhdGljIFJlZ2lvbiAKLUhpZ2hsaWdodFJlZ2lvbihjYncpCi1XaW5CdXR0b25XaWRnZXQgY2J3OwotewotICBzdGF0aWMgUmVnaW9uIG91dGVyUmVnaW9uID0gTlVMTCwgaW5uZXJSZWdpb24sIGVtcHR5UmVnaW9uOwotICBYUmVjdGFuZ2xlIHJlY3Q7Ci0KLSAgaWYgKGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3MgPT0gMCB8fAotICAgICAgY2J3LT53aW5idXR0b24uaGlnaGxpZ2h0X3RoaWNrbmVzcyA+Ci0gICAgICAoRGltZW5zaW9uKSAoKERpbWVuc2lvbikgTWluKGNidy0+Y29yZS53aWR0aCwgY2J3LT5jb3JlLmhlaWdodCkvMikpCi0gICAgcmV0dXJuKE5VTEwpOwotCi0gIGlmIChvdXRlclJlZ2lvbiA9PSBOVUxMKSB7Ci0gICAgLyogc2F2ZSB0aW1lIGJ5IGFsbG9jYXRpbmcgc2NyYXRjaCByZWdpb25zIG9ubHkgb25jZS4gKi8KLSAgICBvdXRlclJlZ2lvbiA9IFhDcmVhdGVSZWdpb24oKTsKLSAgICBpbm5lclJlZ2lvbiA9IFhDcmVhdGVSZWdpb24oKTsKLSAgICBlbXB0eVJlZ2lvbiA9IFhDcmVhdGVSZWdpb24oKTsKLSAgfQotCi0gIHJlY3QueCA9IHJlY3QueSA9IDA7Ci0gIHJlY3Qud2lkdGggPSBjYnctPmNvcmUud2lkdGg7Ci0gIHJlY3QuaGVpZ2h0ID0gY2J3LT5jb3JlLmhlaWdodDsKLSAgWFVuaW9uUmVjdFdpdGhSZWdpb24oICZyZWN0LCBlbXB0eVJlZ2lvbiwgb3V0ZXJSZWdpb24gKTsKLSAgcmVjdC54ID0gcmVjdC55ID0gY2J3LT53aW5idXR0b24uaGlnaGxpZ2h0X3RoaWNrbmVzczsKLSAgcmVjdC53aWR0aCAtPSBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzICogMjsKLSAgcmVjdC5oZWlnaHQgLT0gY2J3LT53aW5idXR0b24uaGlnaGxpZ2h0X3RoaWNrbmVzcyAqIDI7Ci0gIFhVbmlvblJlY3RXaXRoUmVnaW9uKCAmcmVjdCwgZW1wdHlSZWdpb24sIGlubmVyUmVnaW9uICk7Ci0gIFhTdWJ0cmFjdFJlZ2lvbiggb3V0ZXJSZWdpb24sIGlubmVyUmVnaW9uLCBvdXRlclJlZ2lvbiApOwotICByZXR1cm4gb3V0ZXJSZWdpb247Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogIEFjdGlvbiBQcm9jZWR1cmVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZCAKLVNldCh3LGV2ZW50LHBhcmFtcyxudW1fcGFyYW1zKQotV2lkZ2V0IHc7Ci1YRXZlbnQgKmV2ZW50OwotU3RyaW5nICpwYXJhbXM7CQkvKiB1bnVzZWQgKi8KLUNhcmRpbmFsICpudW1fcGFyYW1zOwkvKiB1bnVzZWQgKi8KLXsKLSAgV2luQnV0dG9uV2lkZ2V0IGNidyA9IChXaW5CdXR0b25XaWRnZXQpdzsKLQotICBpZiAoY2J3LT53aW5idXR0b24uc2V0KQotICAgIHJldHVybjsKLQotICBjYnctPndpbmJ1dHRvbi5zZXQ9IFRSVUU7Ci0gIGlmIChYdElzUmVhbGl6ZWQodykpCi0gICAgUGFpbnRXaW5CdXR0b25XaWRnZXQodywgKFJlZ2lvbikgTlVMTCwgVFJVRSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotVW5zZXQodyxldmVudCxwYXJhbXMsbnVtX3BhcmFtcykKLVdpZGdldCB3OwotWEV2ZW50ICpldmVudDsKLVN0cmluZyAqcGFyYW1zOwkJLyogdW51c2VkICovCi1DYXJkaW5hbCAqbnVtX3BhcmFtczsKLXsKLSAgV2luQnV0dG9uV2lkZ2V0IGNidyA9IChXaW5CdXR0b25XaWRnZXQpdzsKLQotICBpZiAoIWNidy0+d2luYnV0dG9uLnNldCkKLSAgICByZXR1cm47Ci0KLSAgY2J3LT53aW5idXR0b24uc2V0ID0gRkFMU0U7Ci0gIGlmIChYdElzUmVhbGl6ZWQodykpIHsKLSAgICBYQ2xlYXJXaW5kb3coWHREaXNwbGF5KHcpLCBYdFdpbmRvdyh3KSk7Ci0gICAgUGFpbnRXaW5CdXR0b25XaWRnZXQodywgKFJlZ2lvbikgTlVMTCwgVFJVRSk7Ci0gIH0KLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkIAotUmVzZXQodyxldmVudCxwYXJhbXMsbnVtX3BhcmFtcykKLVdpZGdldCB3OwotWEV2ZW50ICpldmVudDsKLVN0cmluZyAqcGFyYW1zOwkJLyogdW51c2VkICovCi1DYXJkaW5hbCAqbnVtX3BhcmFtczsgICAvKiB1bnVzZWQgKi8KLXsKLSAgV2luQnV0dG9uV2lkZ2V0IGNidyA9IChXaW5CdXR0b25XaWRnZXQpdzsKLQotICBpZiAoY2J3LT53aW5idXR0b24uc2V0KSB7Ci0gICAgY2J3LT53aW5idXR0b24uaGlnaGxpZ2h0ZWQgPSBIaWdobGlnaHROb25lOwotICAgIFVuc2V0KHcsIGV2ZW50LCBwYXJhbXMsIG51bV9wYXJhbXMpOwotICB9Ci0gIGVsc2UKLSAgICBVbmhpZ2hsaWdodCh3LCBldmVudCwgcGFyYW1zLCBudW1fcGFyYW1zKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkIAotSGlnaGxpZ2h0KHcsZXZlbnQscGFyYW1zLG51bV9wYXJhbXMpCi1XaWRnZXQgdzsKLVhFdmVudCAqZXZlbnQ7Ci1TdHJpbmcgKnBhcmFtczsJCQotQ2FyZGluYWwgKm51bV9wYXJhbXM7CQotewotICBXaW5CdXR0b25XaWRnZXQgY2J3ID0gKFdpbkJ1dHRvbldpZGdldCl3OwotCi0gIGlmICggKm51bV9wYXJhbXMgPT0gKENhcmRpbmFsKSAwKSAKLSAgICBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRlZCA9IEhpZ2hsaWdodFdoZW5VbnNldDsKLSAgZWxzZSB7Ci0gICAgaWYgKCAqbnVtX3BhcmFtcyAhPSAoQ2FyZGluYWwpIDEpIAotICAgICAgWHRXYXJuaW5nKCJUb28gbWFueSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBoaWdobGlnaHQgYWN0aW9uIHRhYmxlLiIpOwotICAgIHN3aXRjaCAocGFyYW1zWzBdWzBdKSB7Ci0gICAgY2FzZSAnQSc6Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRlZCA9IEhpZ2hsaWdodEFsd2F5czsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRlZCA9IEhpZ2hsaWdodFdoZW5VbnNldDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChYdElzUmVhbGl6ZWQodykpCi0gICAgUGFpbnRXaW5CdXR0b25XaWRnZXQodywgSGlnaGxpZ2h0UmVnaW9uKGNidyksIFRSVUUpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQgCi1VbmhpZ2hsaWdodCh3LGV2ZW50LHBhcmFtcyxudW1fcGFyYW1zKQotV2lkZ2V0IHc7Ci1YRXZlbnQgKmV2ZW50OwotU3RyaW5nICpwYXJhbXM7CQkvKiB1bnVzZWQgKi8KLUNhcmRpbmFsICpudW1fcGFyYW1zOwkvKiB1bnVzZWQgKi8KLXsKLSAgV2luQnV0dG9uV2lkZ2V0IGNidyA9IChXaW5CdXR0b25XaWRnZXQpdzsKLQotICBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRlZCA9IEhpZ2hsaWdodE5vbmU7Ci0gIGlmIChYdElzUmVhbGl6ZWQodykpCi0gICAgUGFpbnRXaW5CdXR0b25XaWRnZXQodywgSGlnaGxpZ2h0UmVnaW9uKGNidyksIFRSVUUpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQgCi1Ob3RpZnkodyxldmVudCxwYXJhbXMsbnVtX3BhcmFtcykKLVdpZGdldCB3OwotWEV2ZW50ICpldmVudDsKLVN0cmluZyAqcGFyYW1zOwkJLyogdW51c2VkICovCi1DYXJkaW5hbCAqbnVtX3BhcmFtczsJLyogdW51c2VkICovCi17Ci0gIFdpbkJ1dHRvbldpZGdldCBjYncgPSAoV2luQnV0dG9uV2lkZ2V0KXc7IAotCi0gIC8qIGNoZWNrIHRvIGJlIHN1cmUgc3RhdGUgaXMgc3RpbGwgU2V0IHNvIHRoYXQgdXNlciBjYW4gY2FuY2VsCi0gICAgIHRoZSBhY3Rpb24gKGUuZy4gYnkgbW92aW5nIG91dHNpZGUgdGhlIHdpbmRvdywgaW4gdGhlIGRlZmF1bHQKLSAgICAgYmluZGluZ3MuCi0gICovCi0gIGlmIChjYnctPndpbmJ1dHRvbi5zZXQpCi0gICAgWHRDYWxsQ2FsbGJhY2tMaXN0KHcsIGNidy0+d2luYnV0dG9uLmNhbGxiYWNrcywgTlVMTCk7Ci19Ci0KLS8qCi0gKiBSZXBhaW50IHRoZSB3aWRnZXQgd2luZG93Ci0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgUkVESVNQTEFZIChEUkFXKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQgCi1SZWRpc3BsYXkodywgZXZlbnQsIHJlZ2lvbikKLVdpZGdldCB3OwotWEV2ZW50ICpldmVudDsKLVJlZ2lvbiByZWdpb247Ci17Ci0gIFBhaW50V2luQnV0dG9uV2lkZ2V0KHcsIHJlZ2lvbiwgRkFMU0UpOwotfQotCi0vKglGdW5jdGlvbiBOYW1lOiBQYWludFdpbkJ1dHRvbldpZGdldAotICoJRGVzY3JpcHRpb246IFBhaW50cyB0aGUgd2luYnV0dG9uIHdpZGdldC4KLSAqCUFyZ3VtZW50czogdyAtIHRoZSB3aW5idXR0b24gd2lkZ2V0LgotICogICAgICAgICAgICAgICAgIHJlZ2lvbiAtIHJlZ2lvbiB0byBwYWludCAocGFzc2VkIHRvIHRoZSBzdXBlcmNsYXNzKS4KLSAqICAgICAgICAgICAgICAgICBjaGFuZ2UgLSBkaWQgaXQgY2hhbmdlIGVpdGhlciBzZXQgb3IgaGlnaGxpZ2h0IHN0YXRlPwotICoJUmV0dXJuczogbm9uZQotICovCi0KLXN0YXRpYyB2b2lkIAotUGFpbnRXaW5CdXR0b25XaWRnZXQodywgcmVnaW9uLCBjaGFuZ2UpCi1XaWRnZXQgdzsKLVJlZ2lvbiByZWdpb247Ci1Cb29sZWFuIGNoYW5nZTsKLXsKLSAgV2luQnV0dG9uV2lkZ2V0IGNidyA9IChXaW5CdXR0b25XaWRnZXQpIHc7Ci0gIEJvb2xlYW4gdmVyeV90aGljazsKLSAgR0Mgbm9ybV9nYywgcmV2X2djOwotICBpbnQgb2Zmc2V0OwotICAgCi0gIHZlcnlfdGhpY2sgPSBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzID4KLSAgICAgICAgICAgICAgIChEaW1lbnNpb24pKChEaW1lbnNpb24pIE1pbihjYnctPmNvcmUud2lkdGgsIAotCQkJCQkgICBjYnctPmNvcmUuaGVpZ2h0KS8yKTsKLQotICBvZmZzZXQgPSBjYnctPndpbmJ1dHRvbi5zaGFkb3dfdGhpY2tuZXNzIC8gMjsKLSAgaWYgKGNidy0+d2luYnV0dG9uLnNldCkgewotICAgICAgWENsZWFyV2luZG93KFh0RGlzcGxheSh3KSwgWHRXaW5kb3codykpOwotICAgICAgcmVnaW9uID0gTlVMTDsJCS8qIEZvcmNlIGxhYmVsIHRvIHJlcGFpbnQgdGV4dC4gKi8KLSAgfQotICBlbHNlIHsKLSAgICAgIFhEcmF3TGluZShYdERpc3BsYXkodyksIFh0V2luZG93KHcpLCBjYnctPndpbmJ1dHRvbi5zaGFkb3dfaGlnaGxpZ2h0X2djLAotCQlvZmZzZXQsIG9mZnNldCwgY2J3LT5jb3JlLndpZHRoIC0gb2Zmc2V0LCBvZmZzZXQpOwotICAgICAgWERyYXdMaW5lKFh0RGlzcGxheSh3KSwgWHRXaW5kb3codyksIGNidy0+d2luYnV0dG9uLnNoYWRvd19oaWdobGlnaHRfZ2MsCi0JCW9mZnNldCwgb2Zmc2V0LCBvZmZzZXQsIGNidy0+Y29yZS5oZWlnaHQgLSBvZmZzZXQpOwotICAgICAgWERyYXdMaW5lKFh0RGlzcGxheSh3KSwgWHRXaW5kb3codyksIGNidy0+d2luYnV0dG9uLnNoYWRvd19zaGFkZV9nYywKLQkJb2Zmc2V0LCBjYnctPmNvcmUuaGVpZ2h0IC0gb2Zmc2V0ICsgMSwgCi0JCWNidy0+Y29yZS53aWR0aCAtIG9mZnNldCwgY2J3LT5jb3JlLmhlaWdodCAtIG9mZnNldCk7Ci0gICAgICBYRHJhd0xpbmUoWHREaXNwbGF5KHcpLCBYdFdpbmRvdyh3KSwgY2J3LT53aW5idXR0b24uc2hhZG93X3NoYWRlX2djLAotCQljYnctPmNvcmUud2lkdGggLSBvZmZzZXQsIG9mZnNldCArIDEsIAotCQljYnctPmNvcmUud2lkdGggLSBvZmZzZXQsIGNidy0+Y29yZS5oZWlnaHQgLSBvZmZzZXQpOwotICB9Ci0KLSAgaWYgKGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3MgPD0gMCkKLSAgewotICAgICgqU3VwZXJDbGFzcy0+Y29yZV9jbGFzcy5leHBvc2UpICh3LCAoWEV2ZW50ICopIE5VTEwsIHJlZ2lvbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLS8qCi0gKiBJZiB3ZSBhcmUgc2V0IHRoZW4gdXNlIHRoZSBzYW1lIGNvbG9ycyBhcyBpZiB3ZSBhcmUgbm90IGhpZ2hsaWdodGVkLiAKLSAqLwotCi0gIGlmIChjYnctPndpbmJ1dHRvbi5zZXQgPT0gKGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodGVkID09IEhpZ2hsaWdodE5vbmUpKSB7Ci0gICAgbm9ybV9nYyA9IGNidy0+d2luYnV0dG9uLmludmVyc2VfR0M7Ci0gICAgcmV2X2djID0gY2J3LT53aW5idXR0b24ubm9ybWFsX0dDOwotICB9Ci0gIGVsc2UgewotICAgIG5vcm1fZ2MgPSBjYnctPndpbmJ1dHRvbi5ub3JtYWxfR0M7Ci0gICAgcmV2X2djID0gY2J3LT53aW5idXR0b24uaW52ZXJzZV9HQzsKLSAgfQotCi0gIGlmICggISggKCFjaGFuZ2UgJiYgKGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodGVkID09IEhpZ2hsaWdodE5vbmUpKSB8fAotCSAgKChjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRlZCA9PSBIaWdobGlnaHRXaGVuVW5zZXQpICYmCi0JICAgKGNidy0+d2luYnV0dG9uLnNldCkpKSApIHsKLSAgICBpZiAodmVyeV90aGljaykgewotICAgICAgY2J3LT53aW5sYWJlbC5ub3JtYWxfR0MgPSBub3JtX2djOyAvKiBHaXZlIHRoZSBsYWJlbCB0aGUgcmlnaHQgR0MuICovCi0gICAgICBYRmlsbFJlY3RhbmdsZShYdERpc3BsYXkodyksWHRXaW5kb3codyksIHJldl9nYywKLQkJICAgICAwLCAwLCBjYnctPmNvcmUud2lkdGgsIGNidy0+Y29yZS5oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIHdpZGUgbGluZXMgYXJlIGNlbnRlcmVkIG9uIHRoZSBwYXRoLCBzbyBpbmRlbnQgaXQgKi8KLSAgICAgIGludCBvZmZzZXQgPSBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzLzI7Ci0gICAgICBYRHJhd1JlY3RhbmdsZShYdERpc3BsYXkodyksWHRXaW5kb3codyksIHJldl9nYywgb2Zmc2V0LCBvZmZzZXQsIAotCQkgICAgIGNidy0+Y29yZS53aWR0aCAtIGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3MsCi0JCSAgICAgY2J3LT5jb3JlLmhlaWdodCAtIGNidy0+d2luYnV0dG9uLmhpZ2hsaWdodF90aGlja25lc3MpOwotICAgIH0KLSAgfQotICAoKlN1cGVyQ2xhc3MtPmNvcmVfY2xhc3MuZXhwb3NlKSAodywgKFhFdmVudCAqKSBOVUxMLCByZWdpb24pOwotfQotCi1zdGF0aWMgdm9pZCAKLURlc3Ryb3kodykKLVdpZGdldCB3OwotewotICBXaW5CdXR0b25XaWRnZXQgY2J3ID0gKFdpbkJ1dHRvbldpZGdldCkgdzsKLQotICAvKiBzbyBXaW5MYWJlbCBjYW4gcmVsZWFzZSBpdCAqLwotICBpZiAoY2J3LT53aW5sYWJlbC5ub3JtYWxfR0MgPT0gY2J3LT53aW5idXR0b24ubm9ybWFsX0dDKQotICAgIFh0UmVsZWFzZUdDKCB3LCBjYnctPndpbmJ1dHRvbi5pbnZlcnNlX0dDICk7Ci0gIGVsc2UKLSAgICBYdFJlbGVhc2VHQyggdywgY2J3LT53aW5idXR0b24ubm9ybWFsX0dDICk7Ci19Ci0KLS8qCi0gKiBTZXQgc3BlY2lmaWVkIGFyZ3VtZW50cyBpbnRvIHdpZGdldAotICovCi0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgQm9vbGVhbiAKLVNldFZhbHVlcyAoY3VycmVudCwgcmVxdWVzdCwgbmV3KQotV2lkZ2V0IGN1cnJlbnQsIHJlcXVlc3QsIG5ldzsKLXsKLSAgV2luQnV0dG9uV2lkZ2V0IG9sZGNidyA9IChXaW5CdXR0b25XaWRnZXQpIGN1cnJlbnQ7Ci0gIFdpbkJ1dHRvbldpZGdldCBjYncgPSAoV2luQnV0dG9uV2lkZ2V0KSBuZXc7Ci0gIEJvb2xlYW4gcmVkaXNwbGF5ID0gRmFsc2U7Ci0KLSAgaWYgKCBvbGRjYnctPmNvcmUuc2Vuc2l0aXZlICE9IGNidy0+Y29yZS5zZW5zaXRpdmUgJiYgIWNidy0+Y29yZS5zZW5zaXRpdmUpIHsKLSAgICAvKiBhYm91dCB0byBiZWNvbWUgaW5zZW5zaXRpdmUgKi8KLSAgICBjYnctPndpbmJ1dHRvbi5zZXQgPSBGQUxTRTsKLSAgICBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRlZCA9IEhpZ2hsaWdodE5vbmU7Ci0gICAgcmVkaXNwbGF5ID0gVFJVRTsKLSAgfQotICAKLSAgaWYgKCAob2xkY2J3LT53aW5sYWJlbC5mb3JlZ3JvdW5kICE9IGNidy0+d2lubGFiZWwuZm9yZWdyb3VuZCkgICAgICAgICAgIHx8Ci0gICAgICAgKG9sZGNidy0+Y29yZS5iYWNrZ3JvdW5kX3BpeGVsICE9IGNidy0+Y29yZS5iYWNrZ3JvdW5kX3BpeGVsKSB8fAotICAgICAgIChvbGRjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzICE9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYnctPndpbmJ1dHRvbi5oaWdobGlnaHRfdGhpY2tuZXNzKSB8fAotICAgICAgIChvbGRjYnctPndpbmxhYmVsLmZvbnQgIT0gY2J3LT53aW5sYWJlbC5mb250KSApIAotICB7Ci0gICAgaWYgKG9sZGNidy0+d2lubGFiZWwubm9ybWFsX0dDID09IG9sZGNidy0+d2luYnV0dG9uLm5vcm1hbF9HQykKLQkvKiBXaW5MYWJlbCBoYXMgcmVsZWFzZSBvbmUgb2YgdGhlc2UgKi8KLSAgICAgIFh0UmVsZWFzZUdDKG5ldywgY2J3LT53aW5idXR0b24uaW52ZXJzZV9HQyk7Ci0gICAgZWxzZQotICAgICAgWHRSZWxlYXNlR0MobmV3LCBjYnctPndpbmJ1dHRvbi5ub3JtYWxfR0MpOwotCi0gICAgY2J3LT53aW5idXR0b24ubm9ybWFsX0dDID0gR2V0X0dDKGNidywgY2J3LT53aW5sYWJlbC5mb3JlZ3JvdW5kLCAKLQkJCQkgICAgY2J3LT5jb3JlLmJhY2tncm91bmRfcGl4ZWwpOwotICAgIGNidy0+d2luYnV0dG9uLmludmVyc2VfR0MgPSBHZXRfR0MoY2J3LCBjYnctPmNvcmUuYmFja2dyb3VuZF9waXhlbCwgCi0JCQkJICAgICBjYnctPndpbmxhYmVsLmZvcmVncm91bmQpOwotICAgIFh0UmVsZWFzZUdDKG5ldywgY2J3LT53aW5sYWJlbC5ub3JtYWxfR0MpOwotICAgIGNidy0+d2lubGFiZWwubm9ybWFsX0dDID0gKGNidy0+d2luYnV0dG9uLnNldAotCQkJICAgID8gY2J3LT53aW5idXR0b24uaW52ZXJzZV9HQwotCQkJICAgIDogY2J3LT53aW5idXR0b24ubm9ybWFsX0dDKTsKLSAgICAKLSAgICByZWRpc3BsYXkgPSBUcnVlOwotICB9Ci0KLSAgaWYgKCBYdElzUmVhbGl6ZWQobmV3KQotICAgICAgICYmIG9sZGNidy0+d2luYnV0dG9uLnNoYXBlX3N0eWxlICE9IGNidy0+d2luYnV0dG9uLnNoYXBlX3N0eWxlCi0gICAgICAgJiYgIVNoYXBlQnV0dG9uKGNidywgVFJVRSkpCi0gIHsKLSAgICAgIGNidy0+d2luYnV0dG9uLnNoYXBlX3N0eWxlID0gb2xkY2J3LT53aW5idXR0b24uc2hhcGVfc3R5bGU7Ci0gIH0KLQotICByZXR1cm4gKHJlZGlzcGxheSk7Ci19Ci0KLXN0YXRpYyB2b2lkIENsYXNzSW5pdGlhbGl6ZSgpCi17Ci0gICAgWGF3SW5pdGlhbGl6ZVdpZGdldFNldCgpOwotICAgIFh0U2V0VHlwZUNvbnZlcnRlciggWHRSU3RyaW5nLCBYdFJTaGFwZVN0eWxlLCBYbXVDdnRTdHJpbmdUb1NoYXBlU3R5bGUsCi0JCSAgICAgICAgTlVMTCwgMCwgWHRDYWNoZU5vbmUsIE5VTEwgKTsKLX0KLQotCi1zdGF0aWMgQm9vbGVhbgotU2hhcGVCdXR0b24oY2J3LCBjaGVja1JlY3Rhbmd1bGFyKQotV2luQnV0dG9uV2lkZ2V0IGNidzsKLUJvb2xlYW4gY2hlY2tSZWN0YW5ndWxhcjsKLXsKLSAgICBEaW1lbnNpb24gY29ybmVyX3NpemU7Ci0KLSAgICBpZiAoIChjYnctPndpbmJ1dHRvbi5zaGFwZV9zdHlsZSA9PSBYYXdTaGFwZVJvdW5kZWRSZWN0YW5nbGUpICkgewotCWNvcm5lcl9zaXplID0gKGNidy0+Y29yZS53aWR0aCA8IGNidy0+Y29yZS5oZWlnaHQpID8gY2J3LT5jb3JlLndpZHRoIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2J3LT5jb3JlLmhlaWdodDsKLQljb3JuZXJfc2l6ZSA9IChpbnQpIChjb3JuZXJfc2l6ZSAqIGNidy0+d2luYnV0dG9uLmNvcm5lcl9yb3VuZCkgLyAxMDA7Ci0gICAgfQotCi0gICAgaWYgKGNoZWNrUmVjdGFuZ3VsYXIgfHwgY2J3LT53aW5idXR0b24uc2hhcGVfc3R5bGUgIT0gWGF3U2hhcGVSZWN0YW5nbGUpIHsKLQlpZiAoIVhtdVJlc2hhcGVXaWRnZXQoKFdpZGdldCkgY2J3LCBjYnctPndpbmJ1dHRvbi5zaGFwZV9zdHlsZSwKLQkJCSAgICAgIGNvcm5lcl9zaXplLCBjb3JuZXJfc2l6ZSkpIHsKLQkgICAgY2J3LT53aW5idXR0b24uc2hhcGVfc3R5bGUgPSBYYXdTaGFwZVJlY3RhbmdsZTsKLQkgICAgcmV0dXJuKEZhbHNlKTsKLQl9Ci0gICAgfQotICAgIHJldHVybihUUlVFKTsKLX0KLQotc3RhdGljIHZvaWQgUmVhbGl6ZSh3LCB2YWx1ZU1hc2ssIGF0dHJpYnV0ZXMpCi0gICAgV2lkZ2V0IHc7Ci0gICAgTWFzayAqdmFsdWVNYXNrOwotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzICphdHRyaWJ1dGVzOwotewotICAgICgqd2luQnV0dG9uV2lkZ2V0Q2xhc3MtPmNvcmVfY2xhc3Muc3VwZXJjbGFzcy0+Y29yZV9jbGFzcy5yZWFsaXplKQotCSh3LCB2YWx1ZU1hc2ssIGF0dHJpYnV0ZXMpOwotCi0gICAgU2hhcGVCdXR0b24oIChXaW5CdXR0b25XaWRnZXQpIHcsIEZBTFNFKTsKLX0KLQotc3RhdGljIHZvaWQgUmVzaXplKHcpCi0gICAgV2lkZ2V0IHc7Ci17Ci0gICAgaWYgKFh0SXNSZWFsaXplZCh3KSkgCi0JU2hhcGVCdXR0b24oIChXaW5CdXR0b25XaWRnZXQpIHcsIEZBTFNFKTsKLQotICAgICgqd2luQnV0dG9uV2lkZ2V0Q2xhc3MtPmNvcmVfY2xhc3Muc3VwZXJjbGFzcy0+Y29yZV9jbGFzcy5yZXNpemUpKHcpOwotfQotCmRpZmYgLS1naXQgYS9jb250cm9scy9XaW5CdXR0b24uaCBiL2NvbnRyb2xzL1dpbkJ1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRlZTZhLi4wMDAwMDAwCi0tLSBhL2NvbnRyb2xzL1dpbkJ1dHRvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCi1hbmQgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIENhbWJyaWRnZSwgTWFzc2FjaHVzZXR0cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBNSVQgbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKLXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAotCi1ESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKLUFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAotRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKLUFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKLVdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKLUFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLVNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBNb2RpZmljYXRpb25zIGZvciBXaW5lCi0gKgotICogOC8yOC85MyAgRGF2aWQgTWV0Y2FsZmUgKGRhdmlkQHByaXNtLmRlbW9uLmNvLnVrKQotICogICAgICAgICAgQ3JlYXRlZCBmcm9tIENvbW1hbmQgd2lkZ2V0IGFuZCBhZGRlZCAzRCBlZmZlY3QKLSAqLwotCi0jaWZuZGVmIF9XaW5CdXR0b25faAotI2RlZmluZSBfV2luQnV0dG9uX2gKLQotI2luY2x1ZGUgIldpbkxhYmVsLmgiCi0KLS8qIFdpbkJ1dHRvbiB3aWRnZXQgcmVzb3VyY2VzOgotCi0gTmFtZQkJICAgICBDbGFzcwkJUmVwVHlwZQkJRGVmYXVsdCBWYWx1ZQotIC0tLS0JCSAgICAgLS0tLS0JCS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0KLSBhY2NlbGVyYXRvcnMJICAgICBBY2NlbGVyYXRvcnMJQWNjZWxlcmF0b3JUYWJsZSBOVUxMCi0gYW5jZXN0b3JTZW5zaXRpdmUgICBBbmNlc3RvclNlbnNpdGl2ZQlCb29sZWFuCQlUcnVlCi0gYmFja2dyb3VuZAkgICAgIEJhY2tncm91bmQJCVBpeGVsCQlYdERlZmF1bHRCYWNrZ3JvdW5kCi0gYmFja2dyb3VuZFBpeG1hcCAgICBQaXhtYXAJCVBpeG1hcAkJWHRVbnNwZWNpZmllZFBpeG1hcAotIGJpdG1hcAkJICAgICBQaXhtYXAJCVBpeG1hcAkJTm9uZQotIGJvcmRlckNvbG9yCSAgICAgQm9yZGVyQ29sb3IJUGl4ZWwJCVh0RGVmYXVsdEZvcmVncm91bmQKLSBib3JkZXJQaXhtYXAJICAgICBQaXhtYXAJCVBpeG1hcAkJWHRVbnNwZWNpZmllZFBpeG1hcAotIGJvcmRlcldpZHRoCSAgICAgQm9yZGVyV2lkdGgJRGltZW5zaW9uCTEKLSBjYWxsYmFjawkgICAgIENhbGxiYWNrCQlYdENhbGxiYWNrTGlzdAlOVUxMCi0gY29sb3JtYXAJICAgICBDb2xvcm1hcAkJQ29sb3JtYXAJcGFyZW50J3MgY29sb3JtYXAKLSBjb3JuZXJSb3VuZFBlcmNlbnQgIENvcm5lclJvdW5kUGVyY2VudAlEaW1lbnNpb24JMjUKLSBjdXJzb3IJCSAgICAgQ3Vyc29yCQlDdXJzb3IJCU5vbmUKLSBjdXJzb3JOYW1lCSAgICAgQ3Vyc29yCQlTdHJpbmcJCU5VTEwKLSBkZXB0aAkJICAgICBEZXB0aAkJaW50CQlwYXJlbnQncyBkZXB0aAotIGRlc3Ryb3lDYWxsYmFjayAgICAgQ2FsbGJhY2sJCVh0Q2FsbGJhY2tMaXN0CU5VTEwKLSBlbmNvZGluZwkgICAgIEVuY29kaW5nCQlVbnNpZ25lZENoYXIJWGF3VGV4dEVuY29kaW5nOGJpdAotIGZvbnQJCSAgICAgRm9udAkJWEZvbnRTdHJ1Y3QqCVh0RGVmYXVsdEZvbnQKLSBmb3JlZ3JvdW5kCSAgICAgRm9yZWdyb3VuZAkJUGl4ZWwJCVh0RGVmYXVsdEZvcmVncm91bmQKLSBoZWlnaHQJCSAgICAgSGVpZ2h0CQlEaW1lbnNpb24JdGV4dCBoZWlnaHQKLSBoaWdobGlnaHRUaGlja25lc3MgIFRoaWNrbmVzcwkJRGltZW5zaW9uCTAgaWYgc2hhcGVkLCBlbHNlIDIKLSBpbnNlbnNpdGl2ZUJvcmRlciAgIEluc2Vuc2l0aXZlCVBpeG1hcAkJR3JheQotIGludGVybmFsSGVpZ2h0CSAgICAgSGVpZ2h0CQlEaW1lbnNpb24JMgotIGludGVybmFsV2lkdGgJICAgICBXaWR0aAkJRGltZW5zaW9uCTQKLSBqdXN0aWZ5CSAgICAgSnVzdGlmeQkJWHRKdXN0aWZ5CVh0SnVzdGlmeUNlbnRlcgotIGxhYmVsCQkgICAgIExhYmVsCQlTdHJpbmcJCU5VTEwKLSBsZWZ0Qml0bWFwCSAgICAgTGVmdEJpdG1hcAkJUGl4bWFwCQlOb25lCi0gbWFwcGVkV2hlbk1hbmFnZWQgICBNYXBwZWRXaGVuTWFuYWdlZAlCb29sZWFuCQlUcnVlCi0gcG9pbnRlckNvbG9yCSAgICAgRm9yZWdyb3VuZAkJUGl4ZWwJCVh0RGVmYXVsdEZvcmVncm91bmQKLSBwb2ludGVyQ29sb3JCYWNrZ3JvdW5kIEJhY2tncm91bmQJUGl4ZWwJCVh0RGVmYXVsdEJhY2tncm91bmQKLSByZXNpemUJCSAgICAgUmVzaXplCQlCb29sZWFuCQlUcnVlCi0gc2NyZWVuCQkgICAgIFNjcmVlbgkJU2NyZWVuCQlwYXJlbnQncyBTY3JlZW4KLSBzZW5zaXRpdmUJICAgICBTZW5zaXRpdmUJCUJvb2xlYW4JCVRydWUKLSBzaGFkb3dIaWdobGlnaHQgICAgIFNoYWRvd0hpZ2hsaWdodCAgICBQaXhlbCAgICAgICAgICAgV2hpdGUKLSBzaGFkb3dTaGFkZSAgICAgICAgIFNoYWRvd1NoYWRlICAgICAgICBQaXhlbCAgICAgICAgICAgR3JleTI1Ci0gc2hhZG93VGhpY2tuZXNzICAgICBTaGFkb3dUaGlja25lc3MgICAgRGltZW5zaW9uICAgICAgIDIgCi0gc2hhcGVTdHlsZQkgICAgIFNoYXBlU3R5bGUJCVNoYXBlU3R5bGUJUmVjdGFuZ2xlCi0gdHJhbnNsYXRpb25zCSAgICAgVHJhbnNsYXRpb25zCVRyYW5zbGF0aW9uVGFibGUgc2VlIGRvYyBvciBzb3VyY2UKLSB3aWR0aAkJICAgICBXaWR0aAkJRGltZW5zaW9uCXRleHQgd2lkdGgKLSB4CQkgICAgIFBvc2l0aW9uCQlQb3NpdGlvbgkwCi0geQkJICAgICBQb3NpdGlvbgkJUG9zaXRpb24JMAotCi0qLwotCi0jZGVmaW5lIFh0TmhpZ2hsaWdodFRoaWNrbmVzcyAiaGlnaGxpZ2h0VGhpY2tuZXNzIgotCi0jZGVmaW5lIFh0TnNoYXBlU3R5bGUgInNoYXBlU3R5bGUiCi0jZGVmaW5lIFh0Q1NoYXBlU3R5bGUgIlNoYXBlU3R5bGUiCi0jZGVmaW5lIFh0UlNoYXBlU3R5bGUgIlNoYXBlU3R5bGUiCi0jZGVmaW5lIFh0TmNvcm5lclJvdW5kUGVyY2VudCAiY29ybmVyUm91bmRQZXJjZW50IgotI2RlZmluZSBYdENDb3JuZXJSb3VuZFBlcmNlbnQgIkNvcm5lclJvdW5kUGVyY2VudCIKLSNkZWZpbmUgWHROc2hhZG93VGhpY2tuZXNzICJzaGFkb3dUaGlja25lc3MiCi0jZGVmaW5lIFh0Q1NoYWRvd1RoaWNrbmVzcyAiU2hhZG93VGhpY2tuZXNzIgotI2RlZmluZSBYdE5zaGFkb3dIaWdobGlnaHQgInNoYWRvd0hpZ2hsaWdodCIKLSNkZWZpbmUgWHRDU2hhZG93SGlnaGxpZ2h0ICJTaGFkb3dIaWdobGlnaHQiCi0jZGVmaW5lIFh0TnNoYWRvd1NoYWRlICJzaGFkb3dTaGFkZSIKLSNkZWZpbmUgWHRDU2hhZG93U2hhZGUgIlNoYWRvd1NoYWRlIgotCi0jZGVmaW5lIFhhd1NoYXBlUmVjdGFuZ2xlIFhtdVNoYXBlUmVjdGFuZ2xlCi0jZGVmaW5lIFhhd1NoYXBlT3ZhbCBYbXVTaGFwZU92YWwKLSNkZWZpbmUgWGF3U2hhcGVFbGxpcHNlIFhtdVNoYXBlRWxsaXBzZQotI2RlZmluZSBYYXdTaGFwZVJvdW5kZWRSZWN0YW5nbGUgWG11U2hhcGVSb3VuZGVkUmVjdGFuZ2xlCi0KLWV4dGVybiBXaWRnZXRDbGFzcyAgICAgd2luQnV0dG9uV2lkZ2V0Q2xhc3M7Ci0KLXR5cGVkZWYgc3RydWN0IF9XaW5CdXR0b25DbGFzc1JlYyAgICpXaW5CdXR0b25XaWRnZXRDbGFzczsKLXR5cGVkZWYgc3RydWN0IF9XaW5CdXR0b25SZWMgICAgICAgICpXaW5CdXR0b25XaWRnZXQ7Ci0KLSNlbmRpZiAvKiBfV2luQnV0dG9uX2ggKi8KLS8qIERPTidUIEFERCBTVFVGRiBBRlRFUiBUSElTICovCmRpZmYgLS1naXQgYS9jb250cm9scy9XaW5CdXR0b25QLmggYi9jb250cm9scy9XaW5CdXR0b25QLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2YxOWEuLjAwMDAwMDAKLS0tIGEvY29udHJvbHMvV2luQnV0dG9uUC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ29weXJpZ2h0IDE5ODcsIDE5ODggYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCi1hbmQgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIENhbWJyaWRnZSwgTWFzc2FjaHVzZXR0cy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBNSVQgbm90IGJlCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKLXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAotCi1ESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKLUFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAotRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKLUFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKLVdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKLUFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLVNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBNb2RpZmljYXRpb25zIGZvciBXaW5lCi0gKgotICogOC8yOC85MyAgRGF2aWQgTWV0Y2FsZmUgKGRhdmlkQHByaXNtLmRlbW9uLmNvLnVrKQotICogICAgICAgICAgQ3JlYXRlZCBmcm9tIENvbW1hbmQgd2lkZ2V0IGFuZCBhZGRlZCAzRCBlZmZlY3QKLSAqLwotCi0vKiAKLSAqIFdpbkJ1dHRvblAuaCAtIFByaXZhdGUgZGVmaW5pdGlvbnMgZm9yIFdpbkJ1dHRvbiB3aWRnZXQKLSAqIAotICovCi0KLSNpZm5kZWYgX1dpbkJ1dHRvblBfaAotI2RlZmluZSBfV2luQnV0dG9uUF9oCi0KLSNpbmNsdWRlICJXaW5CdXR0b24uaCIKLSNpbmNsdWRlICJXaW5MYWJlbFAuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogV2luQnV0dG9uIFdpZGdldCBQcml2YXRlIERhdGEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEhpZ2hsaWdodE5vbmUsCQkvKiBEbyBub3QgaGlnaGxpZ2h0LiAqLwotICBIaWdobGlnaHRXaGVuVW5zZXQsCQkvKiBIaWdobGlnaHQgb25seSB3aGVuIHVuc2V0LCB0aGlzIGlzCi0JCQkJICAgdG8gcHJlc2VydmUgY3VycmVudCBjb21tYW5kIHdpZGdldCAKLQkJCQkgICBmdW5jdGlvbmFsaXR5LiAqLwotICBIaWdobGlnaHRBbHdheXMJCS8qIEFsd2F5cyBoaWdobGlnaHQsIGxldHMgdGhlIHRvZ2dsZSB3aWRnZXQKLQkJCQkgICBhbmQgb3RoZXIgc3ViY2xhc3NlcyBkbyB0aGUgcmlnaHQgdGhpbmcuICovCi19IFh0Q29tbWFuZEhpZ2hsaWdodDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBDbGFzcyBzdHJ1Y3R1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAgLyogTmV3IGZpZWxkcyBmb3IgdGhlIFdpbkJ1dHRvbiB3aWRnZXQgY2xhc3MgcmVjb3JkICovCi10eXBlZGVmIHN0cnVjdCBfV2luQnV0dG9uQ2xhc3MgCi0gIHsKLSAgICBpbnQgbWFrZXNfY29tcGlsZXJfaGFwcHk7ICAvKiBub3QgdXNlZCAqLwotICB9IFdpbkJ1dHRvbkNsYXNzUGFydDsKLQotICAgLyogRnVsbCBjbGFzcyByZWNvcmQgZGVjbGFyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IF9XaW5CdXR0b25DbGFzc1JlYyB7Ci0gICAgQ29yZUNsYXNzUGFydAljb3JlX2NsYXNzOwotICAgIFNpbXBsZUNsYXNzUGFydAlzaW1wbGVfY2xhc3M7Ci0gICAgV2luTGFiZWxDbGFzc1BhcnQJd2lubGFiZWxfY2xhc3M7Ci0gICAgV2luQnV0dG9uQ2xhc3NQYXJ0ICB3aW5idXR0b25fY2xhc3M7Ci19IFdpbkJ1dHRvbkNsYXNzUmVjOwotCi1leHRlcm4gV2luQnV0dG9uQ2xhc3NSZWMgd2luQnV0dG9uQ2xhc3NSZWM7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgSW5zdGFuY2UgKHdpZGdldCkgc3RydWN0dXJlIAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIE5ldyBmaWVsZHMgZm9yIHRoZSBXaW5CdXR0b24gd2lkZ2V0IHJlY29yZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIHJlc291cmNlcyAqLwotICAgIERpbWVuc2lvbiAgIGhpZ2hsaWdodF90aGlja25lc3M7Ci0gICAgRGltZW5zaW9uICAgc2hhZG93X3RoaWNrbmVzczsKLSAgICBQaXhlbCAgICAgICBzaGFkb3dfc2hhZGU7Ci0gICAgUGl4ZWwgICAgICAgc2hhZG93X2hpZ2hsaWdodDsKLSAgICBYdENhbGxiYWNrTGlzdCBjYWxsYmFja3M7Ci0KLSAgICAvKiBwcml2YXRlIHN0YXRlICovCi0gICAgUGl4bWFwICAgICAgCWdyYXlfcGl4bWFwOwotICAgIEdDICAgICAgICAgIAlub3JtYWxfR0M7Ci0gICAgR0MgICAgICAgICAgCWludmVyc2VfR0M7Ci0gICAgR0MgICAgICAgICAgICAgICAgICBzaGFkb3dfaGlnaGxpZ2h0X2djOwotICAgIEdDICAgICAgICAgICAgICAgICAgc2hhZG93X3NoYWRlX2djOwotICAgIEJvb2xlYW4gICAgIAlzZXQ7Ci0gICAgWHRDb21tYW5kSGlnaGxpZ2h0CWhpZ2hsaWdodGVkOwotICAgIC8qIG1vcmUgcmVzb3VyY2VzICovCi0gICAgaW50CQkJc2hhcGVfc3R5bGU7ICAgIAotICAgIERpbWVuc2lvbgkJY29ybmVyX3JvdW5kOwotfSBXaW5CdXR0b25QYXJ0OwotCi0KLS8qICAgIFh0RXZlbnRzUHRyIGV2ZW50VGFibGU7Ki8KLQotCi0gICAvKiBGdWxsIHdpZGdldCBkZWNsYXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX1dpbkJ1dHRvblJlYyB7Ci0gICAgQ29yZVBhcnQgICAgICAgICBjb3JlOwotICAgIFNpbXBsZVBhcnQJICAgICBzaW1wbGU7Ci0gICAgV2luTGFiZWxQYXJ0ICAgICB3aW5sYWJlbDsKLSAgICBXaW5CdXR0b25QYXJ0ICAgIHdpbmJ1dHRvbjsKLX0gV2luQnV0dG9uUmVjOwotCi0jZW5kaWYgLyogX1dpbkJ1dHRvblBfaCAqLwotCi0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2J1dHRvbi5jIGIvY29udHJvbHMvYnV0dG9uLmMKaW5kZXggM2E2NWJjMC4uZjg0M2JlYiAxMDA2NDQKLS0tIGEvY29udHJvbHMvYnV0dG9uLmMKKysrIGIvY29udHJvbHMvYnV0dG9uLmMKQEAgLTEsODYgKzEsMzUxIEBACi0vKgotICogSW50ZXJmYWNlIGNvZGUgdG8gYnV0dG9uIHdpZGdldHMKKy8qIEZpbGU6IGJ1dHRvbi5jIC0tIE1TLVdpbmRvd3ModG0pIGNvbXBhdGlibGUgIkJ1dHRvbiIgcmVwbGFjZW1lbnQgd2lkZ2V0CiAgKgotICogQ29weXJpZ2h0ICBEYXZpZCBXLiBNZXRjYWxmZSwgMTk5MworICogICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1lZCBieSBKb2hhbm5lcyBSdXNjaGVpbnNraSBmb3IgdGhlIExpbnV4IFdBQkkKKyAqICAgICAgICAgICAgICAgICAgIHByb2plY3QuCisgKgkJICAgICAoQykgMTk5MyBieSBKb2hhbm5lcyBSdXNjaGVpbnNraQogICoKKyAqICAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgYnkgRGF2aWQgTWV0Y2FsZmUKICAqLwogCi1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIERhdmlkIFcuIE1ldGNhbGZlLCAxOTkzIjsKLQotI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KLSNpbmNsdWRlIDxYMTEvU3RyaW5nRGVmcy5oPgotI2luY2x1ZGUgIldpbkJ1dHRvbi5oIgotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgIndpbi5oIgogCi1zdGF0aWMgdm9pZCBCVVRUT05fV2luQnV0dG9uQ2FsbGJhY2soV2lkZ2V0IHcsIFh0UG9pbnRlciBjbGllbnRfZGF0YSwKLQkJCQkgICAgICAgICAgICAgICBYdFBvaW50ZXIgY2FsbF9kYXRhKTsKK0xPTkcgQnV0dG9uV25kUHJvYyhIV05EIGhXbmQsIFdPUkQgdU1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKIAotdm9pZCBCVVRUT05fQ3JlYXRlQnV0dG9uKExQU1RSIGNsYXNzTmFtZSwgTFBTVFIgYnV0dG9uTGFiZWwsIEhXTkQgaHduZCkKK3N0YXRpYyBDT0xPUlJFRiBjb2xvcl93aW5kb3dmcmFtZSwgY29sb3JfYnRuZmFjZSwgY29sb3JfYnRuc2hhZG93LAorCQljb2xvcl9idG50ZXh0LCBjb2xvcl9idG5oaWdobGlnaHQ7CisKK3N0YXRpYyBCT09MIHByZXNzZWQ7CisKKyNkZWZpbmUgTk9USUZZX1BBUkVOVChoV25kQ250cmwsIHdOb3RpZnlDb2RlKSBcCisJU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmRDbnRybCksIFdNX0NPTU1BTkQsIFwKKwkJICAgIEdldERsZ0N0cmxJRChoV25kQ250cmwpLCBNQUtFTFBBUkFNKGhXbmRDbnRybCwgd05vdGlmeUNvZGUpKTsKKyNkZWZpbmUgRElNKGFycmF5KQkoKHNpemVvZiBhcnJheSkvKHNpemVvZiBhcnJheVswXSkpCisKK3N0YXRpYyBMT05HIFBCX1BhaW50KEhXTkQgaFduZCk7CitzdGF0aWMgTE9ORyBQQl9MQnV0dG9uRG93bihIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CitzdGF0aWMgTE9ORyBQQl9MQnV0dG9uVXAoSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOworc3RhdGljIExPTkcgUEJfTEJ1dHRvbkRibENsayhIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CitzdGF0aWMgdm9pZCBEcmF3UmFpc2VkUHVzaEJ1dHRvbihIREMgaERDLCBIV05EIGhCdXR0b24sIFJFQ1QgcmMpOworc3RhdGljIHZvaWQgRHJhd1ByZXNzZWRQdXNoQnV0dG9uKEhEQyBoREMsIEhXTkQgaEJ1dHRvbiwgUkVDVCByYyk7CisKK3R5cGVkZWYgc3RydWN0CiB7Ci0gICAgV05EICp3bmRQdHIgICAgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICBXTkQgKnBhcmVudFB0ciA9IFdJTl9GaW5kV25kUHRyKHduZFB0ci0+aHduZFBhcmVudCk7Ci0gICAgRFdPUkQgc3R5bGU7Ci0gICAgY2hhciB3aWRnZXROYW1lWzE1XTsKKyAgICBMT05HICgqcGFpbnRmbikoKTsKKyAgICBMT05HICgqbEJ1dHRvbkRvd25mbikoKTsKKyAgICBMT05HICgqbEJ1dHRvblVwZm4pKCk7CisgICAgTE9ORyAoKmxCdXR0b25EYmxDbGtmbikoKTsKK30gQlRORk47CiAKLSNpZmRlZiBERUJVR19CVVRUT04KLSAgICBwcmludGYoImJ1dHRvbjogbGFiZWwgPSAlcywgeCA9ICVkLCB5ID0gJWRcbiIsIGJ1dHRvbkxhYmVsLAotCSAgIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LCB3bmRQdHItPnJlY3RDbGllbnQudG9wKTsKLSAgICBwcmludGYoIiAgICAgICAgd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsCi0JICAgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCi0JICAgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3ApOworI2RlZmluZSBNQVhfQlROX1RZUEUgIDIKKworc3RhdGljIEJUTkZOIGJ0bmZuW01BWF9CVE5fVFlQRV0gPQoreworICAgIHsgCisJKExPTkcoKikoKSlQQl9QYWludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTX1BVU0hCVVRUT04gKi8KKwkoTE9ORygqKSgpKVBCX0xCdXR0b25Eb3duLAorCShMT05HKCopKCkpUEJfTEJ1dHRvblVwLAorCShMT05HKCopKCkpUEJfTEJ1dHRvbkRibENsaworICAgIH0sCisgICAgeyAKKwkoTE9ORygqKSgpKVBCX1BhaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogQlNfREVGUFVTSEJVVFRPTiAqLworCShMT05HKCopKCkpUEJfTEJ1dHRvbkRvd24sCisJKExPTkcoKikoKSlQQl9MQnV0dG9uVXAsCisJKExPTkcoKikoKSlQQl9MQnV0dG9uRGJsQ2xrCisgICAgfQorfTsKKworCitMT05HIEJ1dHRvblduZFByb2MoSFdORCBoV25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKwlMT05HIGxSZXN1bHQgPSAwOworCUhEQyBoREM7CisJUkVDVCByYzsKKworCVdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisJTE9ORyBzdHlsZSA9IHduZFB0ci0+ZHdTdHlsZSAmIDB4MDAwMDAwMEY7CisKKwlzd2l0Y2ggKHVNc2cpIHsKKy8qCWNhc2UgV01fR0VURExHQ09ERToKKwkJbFJlc3VsdCA9IERMR0NfQlVUVE9OOworCQlicmVhazsKKyovCisJY2FzZSBXTV9FTkFCTEU6CisJCUludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNX0NSRUFURToKKwkJaWYgKHN0eWxlIDwgMEwgfHwgc3R5bGUgPj0gKExPTkcpRElNKGJ0bmZuKSkKKwkJICAgIGxSZXN1bHQgPSAtMUw7CisJCWVsc2UKKwkJeworCQkgICAgLyogaW5pdGlhbGlzZSBjb2xvdXJzIHVzZWQgZm9yIGJ1dHRvbiByZW5kZXJpbmc6ICovCisJCSAgICBjb2xvcl93aW5kb3dmcmFtZSAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dGUkFNRSk7CisJCSAgICBjb2xvcl9idG5mYWNlICAgICAgPSBHZXRTeXNDb2xvcihDT0xPUl9CVE5GQUNFKTsKKwkJICAgIGNvbG9yX2J0bnNoYWRvdyAgICA9IEdldFN5c0NvbG9yKENPTE9SX0JUTlNIQURPVyk7CisJCSAgICBjb2xvcl9idG50ZXh0ICAgICAgPSBHZXRTeXNDb2xvcihDT0xPUl9CVE5URVhUKTsKKwkJICAgIGNvbG9yX2J0bmhpZ2hsaWdodCA9IEdldFN5c0NvbG9yKENPTE9SX0JUTkhJR0hMSUdIVCk7CisKKwkJICAgIHByZXNzZWQgPSBGQUxTRTsKKwkJICAgIGxSZXN1bHQgPSAwTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV01fUEFJTlQ6CisJCShidG5mbltzdHlsZV0ucGFpbnRmbikoaFduZCk7CisJCWJyZWFrOworCisJY2FzZSBXTV9MQlVUVE9ORE9XTjoKKwkJKGJ0bmZuW3N0eWxlXS5sQnV0dG9uRG93bmZuKShoV25kLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBXTV9MQlVUVE9OVVA6CisJCShidG5mbltzdHlsZV0ubEJ1dHRvblVwZm4pKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNX0xCVVRUT05EQkxDTEs6CisJCShidG5mbltzdHlsZV0ubEJ1dHRvbkRibENsa2ZuKShoV25kLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBXTV9TRVRGT0NVUzoKKwkJYnJlYWs7CisKKwljYXNlIFdNX0tJTExGT0NVUzoKKwkJSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworCQlVcGRhdGVXaW5kb3coaFduZCk7CisJCWJyZWFrOworCisJY2FzZSBXTV9TWVNDT0xPUkNIQU5HRToKKwkJY29sb3Jfd2luZG93ZnJhbWUgID0gR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XRlJBTUUpOworCQljb2xvcl9idG5mYWNlICAgICAgPSBHZXRTeXNDb2xvcihDT0xPUl9CVE5GQUNFKTsKKwkJY29sb3JfYnRuc2hhZG93ICAgID0gR2V0U3lzQ29sb3IoQ09MT1JfQlROU0hBRE9XKTsKKwkJY29sb3JfYnRudGV4dCAgICAgID0gR2V0U3lzQ29sb3IoQ09MT1JfQlROVEVYVCk7CisJCWNvbG9yX2J0bmhpZ2hsaWdodCA9IEdldFN5c0NvbG9yKENPTE9SX0JUTkhJR0hMSUdIVCk7CisJCUludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIFRSVUUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jKGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisJfQorCisJR2xvYmFsVW5sb2NrKGhXbmQpOworCXJldHVybiBsUmVzdWx0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBQdXNoIEJ1dHRvbiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgTE9ORyBQQl9QYWludChIV05EIGhXbmQpCit7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgUkVDVCByYzsKKyAgICBIREMgaERDOworCisgICAgaERDID0gQmVnaW5QYWludChoV25kLCAmcHMpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBpZiAocHJlc3NlZCkKKwlEcmF3UHJlc3NlZFB1c2hCdXR0b24oaERDLCBoV25kLCByYyk7CisgICAgZWxzZQorCURyYXdSYWlzZWRQdXNoQnV0dG9uKGhEQywgaFduZCwgcmMpOworICAgIEVuZFBhaW50KGhXbmQsICZwcyk7Cit9CisKK3N0YXRpYyBMT05HIFBCX0xCdXR0b25Eb3duKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworLyogIFNldEZvY3VzKGhXbmQpOyAgICovCisgICAgU2V0Q2FwdHVyZShoV25kKTsKKyAgICBwcmVzc2VkID0gVFJVRTsKKyAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGhXbmQpOworfQorCitzdGF0aWMgTE9ORyBQQl9MQnV0dG9uVXAoSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgUkVDVCByYzsKKworICAgIHByZXNzZWQgPSBGQUxTRTsKKyAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBpZiAoUHRJblJlY3QoJnJjLCBNQUtFUE9JTlQobFBhcmFtKSkpCisJTk9USUZZX1BBUkVOVChoV25kLCBCTl9DTElDS0VEKTsKKyAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGhXbmQpOworfQorCitzdGF0aWMgTE9ORyBQQl9MQnV0dG9uRGJsQ2xrKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIFJFQ1QgcmM7CisKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisgICAgaWYgKFB0SW5SZWN0KCZyYywgTUFLRVBPSU5UKGxQYXJhbSkpKQorCU5PVElGWV9QQVJFTlQoaFduZCwgQk5fRE9VQkxFQ0xJQ0tFRCk7Cit9CisKK3N0YXRpYyB2b2lkIERyYXdSYWlzZWRQdXNoQnV0dG9uKEhEQyBoREMsIEhXTkQgaEJ1dHRvbiwgUkVDVCByYykKK3sKKwlIUEVOIGhPbGRQZW4sIGhGcmFtZVBlbjsKKwlIQlJVU0ggaE9sZEJydXNoLCBoU2hhZG93QnJ1c2gsIGhIaWdobGlnaHRCcnVzaCwgaEJhY2tncm5kQnJ1c2g7CisJSFJHTiByZ24xLCByZ24yLCByZ247CisJaW50IGxlbjsKKwlzdGF0aWMgY2hhciB0ZXh0WzUwKzFdOworCVBPSU5UIHBvaW50c1s2XTsKKwlEV09SRCBkd1RleHRTaXplOworCWludCBkZWx0YTsKKwlURVhUTUVUUklDIHRtOworCWludCBpOworCisJaEZyYW1lUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCBjb2xvcl93aW5kb3dmcmFtZSk7CisJaEJhY2tncm5kQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNvbG9yX2J0bmZhY2UpOworCisJaE9sZFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoREMsIChIQU5ETEUpaEZyYW1lUGVuKTsKKwloT2xkQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChoREMsIChIQU5ETEUpaEJhY2tncm5kQnJ1c2gpOworCVNldEJrTW9kZShoREMsIFRSQU5TUEFSRU5UKTsKKworCXJnbiA9IENyZWF0ZVJlY3RSZ24oMCwgMCwgIDAsICAwKTsKKwlyZ24xID0gQ3JlYXRlUmVjdFJnbihyYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOworCisJU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhCdXR0b24pLCBXTV9DVExDT0xPUiwgKFdPUkQpaERDLAorCQkgICAgTUFLRUxQQVJBTShoQnV0dG9uLCBDVExDT0xPUl9CVE4pKTsKKwlSZWN0YW5nbGUoaERDLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOworCisJLyogZHJhdyBidXR0b24gbGFiZWwsIGlmIGFueTogKi8KKwlsZW4gPSBHZXRXaW5kb3dUZXh0KGhCdXR0b24sIHRleHQsIHNpemVvZiB0ZXh0KTsKKwlpZiAobGVuID49IDEpIHsKKwkJcmMubGVmdC0tOwlyYy5ib3R0b20tLTsKKwkJRHJhd1RleHQoaERDLCB0ZXh0LCBsZW4sICZyYywKKwkJCSBEVF9TSU5HTEVMSU5FIHwgRFRfQ0VOVEVSfCBEVF9WQ0VOVEVSKTsKKwl9CisKKwkvKiBkcmF3IGJ1dHRvbiBoaWdobGlnaHQgKi8KKwlwb2ludHNbMF0ueCA9IHJjLmxlZnQrMjsKKwlwb2ludHNbMF0ueSA9IHJjLmJvdHRvbTsKKwlwb2ludHNbMV0ueCA9IHJjLmxlZnQrNDsKKwlwb2ludHNbMV0ueSA9IHJjLmJvdHRvbS0yOworCXBvaW50c1syXS54ID0gcmMubGVmdCs0OworCXBvaW50c1syXS55ID0gcmMudG9wKzM7CisJcG9pbnRzWzNdLnggPSByYy5yaWdodC0zOworCXBvaW50c1szXS55ID0gcmMudG9wKzM7CisJcG9pbnRzWzRdLnggPSByYy5yaWdodC0xOworCXBvaW50c1s0XS55ID0gcmMudG9wKzE7CisJcG9pbnRzWzVdLnggPSByYy5sZWZ0KzI7CisJcG9pbnRzWzVdLnkgPSByYy50b3ArMTsKKwloSGlnaGxpZ2h0QnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNvbG9yX2J0bmhpZ2hsaWdodCk7CisJcmduMiA9IENyZWF0ZVBvbHlnb25SZ24ocG9pbnRzLCBESU0ocG9pbnRzKSwgQUxURVJOQVRFKTsKKwlDb21iaW5lUmduKHJnbiwgcmduMSwgcmduMiwgUkdOX0FORCk7CisJRmlsbFJnbihoREMsIHJnbjIsIGhIaWdobGlnaHRCcnVzaCk7CisKKwkvKiBkcmF3IGJ1dHRvbiBzaGFkb3c6ICovCisJcG9pbnRzWzBdLnggPSByYy5sZWZ0KzI7CisJcG9pbnRzWzBdLnkgPSByYy5ib3R0b207CisJcG9pbnRzWzFdLnggPSByYy5sZWZ0KzQ7CisJcG9pbnRzWzFdLnkgPSByYy5ib3R0b20tMjsKKwlwb2ludHNbMl0ueCA9IHJjLnJpZ2h0LTM7CisJcG9pbnRzWzJdLnkgPSByYy5ib3R0b20tMjsKKwlwb2ludHNbM10ueCA9IHJjLnJpZ2h0LTM7CisJcG9pbnRzWzNdLnkgPSByYy50b3ArMzsKKwlwb2ludHNbNF0ueCA9IHJjLnJpZ2h0LTE7CisJcG9pbnRzWzRdLnkgPSByYy50b3A7CisJcG9pbnRzWzVdLnggPSByYy5yaWdodC0xOworCXBvaW50c1s1XS55ID0gcmMuYm90dG9tOworCWhTaGFkb3dCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3JfYnRuc2hhZG93KTsKKwlyZ24yID0gQ3JlYXRlUG9seWdvblJnbihwb2ludHMsIERJTShwb2ludHMpLCBBTFRFUk5BVEUpOworCUNvbWJpbmVSZ24ocmduLCByZ24xLCByZ24yLCBSR05fQU5EKTsKKwlGaWxsUmduKGhEQywgcmduMiwgaFNoYWRvd0JydXNoKTsKKworI2lmIDAKKwkvKiBkbyB3ZSBoYXZlIHRoZSBmb2N1cz8gKi8KKwlpZiAobGVuID49IDEgJiYgR2V0Rm9jdXMoKSA9PSBoQnV0dG9uKSB7CisJCWR3VGV4dFNpemUgPSBHZXRUZXh0RXh0ZW50KGhEQywgdGV4dCwgbGVuKTsKKwkJZGVsdGEgPSAoKHJjLnJpZ2h0IC0gcmMubGVmdCkgLSBMT1dPUkQoZHdUZXh0U2l6ZSkgKyAxKSA+PiAxOworCQlyYy5sZWZ0ICs9IGRlbHRhOwlyYy5yaWdodCAtPSBkZWx0YTsKKwkJR2V0VGV4dE1ldHJpY3MoaERDLCAmdG0pOworCQlkZWx0YSA9ICgocmMuYm90dG9tIC0gcmMudG9wKSAtCisJCQkgdG0udG1IZWlnaHQgKyB0bS50bUludGVybmFsTGVhZGluZykgPj4gMTsKKwkJcmMudG9wICs9IGRlbHRhOyAJcmMuYm90dG9tIC09IGRlbHRhOworCQlEcmF3Rm9jdXNSZWN0KGhEQywgJnJjKTsKKwl9CiAjZW5kaWYKIAotICAgIGlmICghd25kUHRyKQotCXJldHVybjsKLQotICAgIHN0eWxlID0gd25kUHRyLT5kd1N0eWxlICYgMHgwMDAwMDAwRjsKLQotICAgIHN3aXRjaCAoc3R5bGUpCi0gICAgewotICAgIGNhc2UgQlNfUFVTSEJVVFRPTjoKLSAgICBjYXNlIEJTX0RFRlBVU0hCVVRUT046Ci0Jc3ByaW50Zih3aWRnZXROYW1lLCAiJXMlZCIsIGNsYXNzTmFtZSwgd25kUHRyLT53SURtZW51KTsKLQl3bmRQdHItPndpbldpZGdldCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KHdpZGdldE5hbWUsCi0JCQkJICAgICAgd2luQnV0dG9uV2lkZ2V0Q2xhc3MsCi0JCQkJICAgICAgcGFyZW50UHRyLT53aW5XaWRnZXQsCi0JCQkJICAgICAgWHRObGFiZWwsIGJ1dHRvbkxhYmVsLAotCQkJCSAgICAgIFh0TngsIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAotCQkJCSAgICAgIFh0TnksIHduZFB0ci0+cmVjdENsaWVudC50b3AsCi0JCQkJICAgICAgWHROd2lkdGgsIHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAtCi0JCQkJCSAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCi0JCQkJICAgICAgWHROaGVpZ2h0LCB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0KLQkJCQkJICAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCwKLQkJCQkgICAgICBYdFZhVHlwZWRBcmcsIFh0TmJhY2tncm91bmQsIFh0UlN0cmluZywKLQkJCQkJICAgICAgImdyZXk3MCIsIHN0cmxlbigiZ3JleTc1IikrMSwKLQkJCQkgICAgICBOVUxMKTsKLQotCVh0QWRkQ2FsbGJhY2sod25kUHRyLT53aW5XaWRnZXQsIFh0TmNhbGxiYWNrLAotCQkgICAgICBCVVRUT05fV2luQnV0dG9uQ2FsbGJhY2ssIChYdFBvaW50ZXIpIGh3bmQpOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlwcmludGYoIkNyZWF0ZUJ1dHRvbjogVW5zdXBwb3J0ZWQgYnV0dG9uIHN0eWxlICVsWFxuIiwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPmR3U3R5bGUpOwotICAgIH0KLQotICAgIEdsb2JhbFVubG9jayhod25kKTsKLSAgICBHbG9iYWxVbmxvY2sod25kUHRyLT5od25kUGFyZW50KTsKKwlTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhPbGRQZW4pOworCVNlbGVjdE9iamVjdChoREMsIChIQU5ETEUpaE9sZEJydXNoKTsKKwlEZWxldGVPYmplY3QoKEhBTkRMRSloRnJhbWVQZW4pOworCURlbGV0ZU9iamVjdCgoSEFORExFKWhTaGFkb3dCcnVzaCk7CisJRGVsZXRlT2JqZWN0KChIQU5ETEUpaEJhY2tncm5kQnJ1c2gpOworCURlbGV0ZU9iamVjdCgoSEFORExFKXJnbjEpOworI2lmIDAKKwlEZWxldGVPYmplY3QoKEhBTkRMRSlyZ24yKTsKKwlEZWxldGVPYmplY3QoKEhBTkRMRSlyZ24pOworI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIEJVVFRPTl9XaW5CdXR0b25DYWxsYmFjayhXaWRnZXQgdywgWHRQb2ludGVyIGNsaWVudF9kYXRhLAotCQkJCSAgICAgICAgICAgICAgIFh0UG9pbnRlciBjYWxsX2RhdGEpCisKK3N0YXRpYyB2b2lkIERyYXdQcmVzc2VkUHVzaEJ1dHRvbihIREMgaERDLCBIV05EIGhCdXR0b24sIFJFQ1QgcmMpCiB7Ci0gICAgSFdORCBod25kID0gKEhXTkQpIGNsaWVudF9kYXRhOwotICAgIFdORCAgKnduZFB0cjsKLSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKwlIUEVOIGhPbGRQZW4sIGhTaGFkb3dQZW4sIGhGcmFtZVBlbjsKKwlIQlJVU0ggaE9sZEJydXNoLCBoQmFja2dybmRCcnVzaDsKKwlIUkdOIHJnbjEsIHJnbjIsIHJnbjsKKwlpbnQgbGVuOworCXN0YXRpYyBjaGFyIHRleHRbNTArMV07CisJRFdPUkQgZHdUZXh0U2l6ZTsKKwlpbnQgZGVsdGE7CisJVEVYVE1FVFJJQyB0bTsKIAotICAgIENhbGxXaW5kb3dQcm9jKHduZFB0ci0+bHBmblduZFByb2MsIHduZFB0ci0+aHduZFBhcmVudCwgV01fQ09NTUFORCwKLQkJICAgd25kUHRyLT53SURtZW51LCBNQUtFTFBBUkFNKGh3bmQsIEJOX0NMSUNLRUQpKTsKKwloRnJhbWVQZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIGNvbG9yX3dpbmRvd2ZyYW1lKTsKKwloQmFja2dybmRCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3JfYnRuZmFjZSk7CiAKLSAgICBHbG9iYWxVbmxvY2soaHduZCk7CisJaE9sZEJydXNoID0gKEhCUlVTSClTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhCYWNrZ3JuZEJydXNoKTsKKwloT2xkUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloRnJhbWVQZW4pOworCVNldEJrTW9kZShoREMsIFRSQU5TUEFSRU5UKTsKKworCS8qIGdpdmUgcGFyZW50IGEgY2hhbmNlIHRvIGFsdGVyIHBhcmFtZXRlcnM6ICovCisJU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhCdXR0b24pLCBXTV9DVExDT0xPUiwgKFdPUkQpaERDLAorCQkgICAgTUFLRUxQQVJBTShoQnV0dG9uLCBDVExDT0xPUl9CVE4pKTsKKwlSZWN0YW5nbGUoaERDLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOworCisJLyogZHJhdyBidXR0b24gc2hhZG93OiAqLworCWhTaGFkb3dQZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIGNvbG9yX2J0bnNoYWRvdyk7CisJU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloU2hhZG93UGVuKTsKKwlNb3ZlVG8oaERDLCByYy5sZWZ0KzEsIHJjLmJvdHRvbS0xKTsKKwlMaW5lVG8oaERDLCByYy5sZWZ0KzEsIHJjLnRvcCsxKTsKKwlMaW5lVG8oaERDLCByYy5yaWdodC0xLCByYy50b3ArMSk7CisKKwkvKiBkcmF3IGJ1dHRvbiBsYWJlbCwgaWYgYW55OiAqLworCWxlbiA9IEdldFdpbmRvd1RleHQoaEJ1dHRvbiwgdGV4dCwgc2l6ZW9mIHRleHQpOworCWlmIChsZW4gPj0gMSkgeworCQlyYy50b3ArKzsJcmMubGVmdCsrOworCQlEcmF3VGV4dChoREMsIHRleHQsIGxlbiwgJnJjLAorCQkJIERUX1NJTkdMRUxJTkUgfCBEVF9DRU5URVJ8IERUX1ZDRU5URVIpOworCX0KKworI2lmIDAKKwkvKiBkbyB3ZSBoYXZlIHRoZSBmb2N1cz8gKi8KKwlpZiAobGVuID49IDEgJiYgR2V0Rm9jdXMoKSA9PSBoQnV0dG9uKSB7CisJCWR3VGV4dFNpemUgPSBHZXRUZXh0RXh0ZW50KGhEQywgdGV4dCwgbGVuKTsKKwkJZGVsdGEgPSAoKHJjLnJpZ2h0IC0gcmMubGVmdCkgLSBMT1dPUkQoZHdUZXh0U2l6ZSkpID4+IDE7CisJCXJjLmxlZnQgKz0gZGVsdGE7CXJjLnJpZ2h0IC09IGRlbHRhOworCQlHZXRUZXh0TWV0cmljcyhoREMsICZ0bSk7CisJCWRlbHRhID0gKChyYy5ib3R0b20gLSByYy50b3ApIC0KKwkJCSB0bS50bUhlaWdodCArIHRtLnRtSW50ZXJuYWxMZWFkaW5nKSA+PiAxOworCQlyYy50b3AgKz0gZGVsdGE7IAlyYy5ib3R0b20gLT0gZGVsdGE7CisJCURyYXdGb2N1c1JlY3QoaERDLCAmcmMpOworCX0KKyNlbmRpZgorCisJU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloT2xkUGVuKTsKKwlTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhPbGRCcnVzaCk7CisJRGVsZXRlT2JqZWN0KChIQU5ETEUpaEJhY2tncm5kQnJ1c2gpOworCURlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhGcmFtZVBlbikpOworCURlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhTaGFkb3dQZW4pKTsKIH0KIAogCiAKKworCisKKworCisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCA5NTFmYzc0Li4yZDIyMTE1IDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICBtZW51ID0gTUVOVV9GaW5kTWVudUJhcih0aGlzX2l0ZW0pOwogICAgIGlmIChtZW51ICE9IE5VTEwpCiAgICAgewotCXduZFB0ciA9IChXTkQgKikgR2xvYmFsTG9jayhtZW51LT5vd25lclduZCk7CisJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobWVudS0+b3duZXJXbmQpOwogCWlmICh3bmRQdHIgPT0gTlVMTCkKIAkgICAgcmV0dXJuOwogCkBAIC0xNTIsOCArMTUyLDYgQEAKIAkKIAlDYWxsV2luZG93UHJvYyh3bmRQdHItPmxwZm5XbmRQcm9jLCBtZW51LT5vd25lclduZCwgV01fQ09NTUFORCwKIAkJICAgICAgIHRoaXNfaXRlbS0+aXRlbV9pZCwgMCk7Ci0JCi0JR2xvYmFsVW5sb2NrKG1lbnUtPm93bmVyV25kKTsKICAgICB9CiB9CiAMCmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggM2M2OGQ5Yy4uOTAyNzJlNSAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtMTAsOCArMTAsNyBAQAogI2luY2x1ZGUgIndpbi5oIgogCiAKLXN0YXRpYyBMT05HIFdJREdFVFNfQnV0dG9uV25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsCi0JCQkJICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitMT05HIEJ1dHRvblduZFByb2MoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKIHN0YXRpYyBMT05HIFdJREdFVFNfU3RhdGljV25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsCiAJCQkJICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CiAKQEAgLTE5LDggKzE4LDggQEAKIAogc3RhdGljIFdORENMQVNTIFdJREdFVFNfQnVpbHRpbkNsYXNzZXNbTkJfQlVJTFRJTl9DTEFTU0VTXSA9CiB7Ci0gICAgeyAwLCBXSURHRVRTX0J1dHRvblduZFByb2MsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsICJCVVRUT04iIH0sCi0gICAgeyAwLCBXSURHRVRTX1N0YXRpY1duZFByb2MsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsICJTVEFUSUMiIH0KKyAgICB7IDAsIChMT05HKCopKCkpQnV0dG9uV25kUHJvYywgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgIkJVVFRPTiIgfSwKKyAgICB7IDAsIChMT05HKCopKCkpV0lER0VUU19TdGF0aWNXbmRQcm9jLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCAiU1RBVElDIiB9CiB9OwogCiBzdGF0aWMgRkFSUFJPQyBXbmRQcm9jMzJbTkJfQlVJTFRJTl9DTEFTU0VTXTsKQEAgLTM4LDggKzM3LDYgQEAKICAgICAgICAgCiAgICAgZm9yIChpID0gMDsgaSA8IE5CX0JVSUxUSU5fQ0xBU1NFUzsgaSsrLCBwQ2xhc3MrKykKICAgICB7Ci0JV25kUHJvYzMyW2ldID0gcENsYXNzLT5scGZuV25kUHJvYzsKLQlwQ2xhc3MtPmxwZm5XbmRQcm9jID0gKEZBUlBST0MpIGkrMTsKIAlpZiAoIVJlZ2lzdGVyQ2xhc3MocENsYXNzKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTYxLDM5ICs1OCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV0lER0VUU19CdXR0b25XbmRQcm9jCi0gKi8KLXN0YXRpYyBMT05HIFdJREdFVFNfQnV0dG9uV25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsCi0JCQkJICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLXsgICAgCi0gICAgc3dpdGNoKG1lc3NhZ2UpCi0gICAgewotICAgIGNhc2UgV01fQ1JFQVRFOgotCXJldHVybiAwOwotCQotICAgIGNhc2UgV01fUEFJTlQ6Ci0gICAgewotCVBBSU5UU1RSVUNUIHBzOwotCUJlZ2luUGFpbnQoIGh3bmQsICZwcyApOwotCUVuZFBhaW50KCBod25kLCAmcHMgKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjYXNlIFdNX0NPTU1BTkQ6Ci0gICAgewotCVdORCAgKnduZFBhcmVudDsKLQl3bmRQYXJlbnQgPSBXSU5fRmluZFduZFB0cihod25kKTsKLQlDYWxsV2luZG93UHJvYyh3bmRQYXJlbnQtPmxwZm5XbmRQcm9jLCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCQotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIERlZldpbmRvd1Byb2MoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdJREdFVFNfU3RhdGljV25kUHJvYwogICovCiBzdGF0aWMgTE9ORyBXSURHRVRTX1N0YXRpY1duZFByb2MoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvTWFrZWZpbGUgYi9kZWJ1Z2dlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMyOTdhCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAorQ0ZMQUdTPS1nIC1JLi4vaW5jbHVkZSAjIC1EVVNFX1JFQURMSU5FCitMSUJTPSByZWFkbGluZS9saWJlZGl0LmEKK09CSlM9ZGJnLnRhYi5vIGhhc2gubyBsZXgueXkubyBpbmZvLm8gaTM4Ni1waW5zbi5vCisKK2RlYnVnZ2VyLm86ICR7T0JKU30gcmVhZGxpbmUvbGliZWRpdC5hCisJKGNkIHJlYWRsaW5lOyBtYWtlKQorCWxkIC1yIC1vIGRlYnVnZ2VyLm8gJHtPQkpTfSAkKExJQlMpCisKKworcmVhZGxpbmUvbGliZWRpdC5hOgorCShjZCByZWFkbGluZTsgbWFrZSkKKworZGJnLnRhYi5vOiBkYmcudGFiLmMKKwlnY2MgICQoQ0ZMQUdTKSAtRFlZREVCVUc9MSAtYyBkYmcudGFiLmMKKworbGV4Lnl5Lm86IGxleC55eS5jCisJZ2NjICQoQ0ZMQUdTKSAtSS4gLWMgbGV4Lnl5LmMKKworCitsZXgueXkuYzogZGVidWcubAorCWZsZXggLUkgZGVidWcubAorCitkYmcudGFiLmMgZGJnLnRhYi5oOiBkYmcueQorCWJpc29uIC12IC1kICBkYmcueQorCitkdGVzdDogZHRlc3QubyBkZWJ1Z2dlci5vCisJZ2NjIC1vIGR0ZXN0IGR0ZXN0Lm8gZGVidWdnZXIubworCitjbGVhbjoKKwlybSAtZiAqLm8gbWFpbiBkYmcudGFiLiogbGV4Lnl5LiogKi5vdXRwdXQgKn4gKiMgZHRlc3QKKwkoY2QgcmVhZGxpbmU7IG1ha2UgY2xlYW4pCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9SRUFETUUgYi9kZWJ1Z2dlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxNTMzOQotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL1JFQURNRQpAQCAtMCwwICsxLDE3IEBACisKKwlUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBXaW5lIGRlYnVnZ2VyLiAgTWFueSBwaWVjZXMgaGF2ZSBiZWVuCitzaGFtZWxlc3NseSBzdG9sZW4gLSB0aGUgcmV2ZXJzZSBhc3NlbWJlciB3YXMgc3RvbGVuIGZyb20gZ2RiIG1vcmUgb3IKK2xlc3MgaW50YWN0LiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlIHR3byB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0CitkaWZmZXJlbnRseSBpZiB5b3UgYXJlIHJldmVyc2UgYXNzZW1ibGluZyAxNiBiaXQgY29kZSwgYW5kIG9uIHRoZQord2hvbGUgaXQgc2VlbXMgdG8gd29yay4gIFRoZXJlIG1heSBiZSBidWdzIGZvciBhbGwgSSBrbm93LgorCisJQXMgZmFyIGFzIG5vbi1saW51eCBzeXN0ZW1zIGFyZSBjb25jZXJuZWQsIEkgc2ltcGx5IHJpcHBlZCBvZmYKK3RoZSBsaW51eCBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gZ2RiLiAgT3RoZXIgc3lzdGVtcyBtYXkgYmUgY2xvc2UKK2Vub3VnaCBmb3IgdGhlc2UgdG8gd29yayBwcm9wZXJseSwgYnV0IHNvbWUgdHdlYWtpbmcgbWF5IGJlIHJlcXVpcmVkLgorCisJSSBhcG9sb2dpemUgZm9yIHRoZSBub24tcG9ydGFiaWxpdHkgb2YgdGhpcywgYnV0IEkgd3JvdGUgdGhlCit3aG9sZSB0aGluZyBpbiBhYm91dCA0IGhvdXJzLCBtb3N0IG9mIHRoZSB0aW1lIHNwZW50IGRlYnVnZ2luZyBhCitzdHVwaWQgbWlzdGFrZSBpbiB0aGUgcGFyc2VyLgorCistRXJpYworCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9UT0RPIGIvZGVidWdnZXIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRlN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvVE9ETwpAQCAtMCwwICsxLDMwIEBACitUaGlzIGlzIGEgbGlzdCBvZiB0aGluZ3MgdGhhdCB0aGVvcmV0aWNhbGx5IHNob3VsZCBiZSBwb3NzaWJsZSBpbiBzb21lCit3YXkgb3IgYW5vdGhlci4gIE5vIGNvbW1pdG1lbnQgdG8gYWN0dWFsbHkgZG8gdGhlc2UsIGJ1dCB0aGVzZSBzb3VuZAorcG9zc2libGUgdG8gbWUgcmlnaHQgbm93LiAgIEluIG5vIHBhcnRpY3VsYXIgb3JkZXIuICBJZiBzb21lb25lIGVsc2UKK3dhbnRzIHRvIGRpZyBpbiwgZmVlbCBmcmVlLgorCisxKSBTb21lIGtpbmQgb2YgY3J1ZGUgZGlzcGxheSBjYXBhYmlsaXR5LiAgTm90IHRvbyBoYXJkLCBJIGd1ZXNzLgorCUp1c3Qga2VlcCBhIGxpc3Qgb2YgYWRkcmVzc2VzLCBjb3VudHMgYW5kIGZvcm1hdHMgdGhhdCB3ZQorCXdhbnQgZGlzcGxheWVkIGVhY2ggdGltZSB3ZSBlbnRlciB0aGUgZGVidWdnZXIuCisKKzIpIFNvbWUga2luZCBvZiBzaW5nbGUgc3RlcCBjYXBhYmlsaXR5LgorCUkgYW0gbm90IHN1cmUgLSBJIHRoaW5rIHlvdSBqdXN0IHNldCBhIGZsYWcKKwlpbiBBRkxBR1MsIGFuZCB5b3UgZ2V0IGFuIGludGVycnVwdCBiYWNrIGFnYWluLgorCVRoZSBzaWduYWwgdHlwZSB3b3VsZCBwcm9hYmFibHkgYmUgZGlmZmVyZW50LCBob3dldmVyLAorCWJ1dCBXaW5lIGNvdWxkIGVhc2lseSBiZSBwYXRjaGVkIHRvIGFjY2VwdCB0aGlzIG9uZSBhcyB3ZWxsLgorCVRoZSBtYWluIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgZ2RiIG5vcm1hbGx5IHJ1bnMgaW4gYQorCXNlcGFyYXRlIHByb2Nlc3Mgc28gaXQgaXMgZWFzeSB0byBzaW5nbGUgc3RlcCBzZWNvbmQgcHJvY2Vzcy4KKwlIZXJlIHdlIGFyZSBhbGwgcGFydCBvZiB0aGUgc2FtZSBwcm9jZXNzLiAgUGVyaGFwcyB3ZSBjb3VsZCBsb29rCisJYWhlYWQgdG8gdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHNldCBhbm90aGVyIGJyZWFrcG9pbnQ/CisKKzMpIFNvbWUga2luZCBvZiBicmVha3BvaW50IGNhcGFiaWxpdHkuCisJUmVxdWlyZXMgc2luZ2xlIHN0ZXAuICBXaGVuIHdlIHJlc3RhcnQsIHdlCisJcmVtb3ZlIHRoZSBicmVha3BvaW50LCBzaW5nbGUgc3RlcCBvbmUgaW5zdHJ1Y3Rpb24KKwlyZXBsYWNlIHRoZSBicmVha3BvaW50LCBhbmQgdGhlbiBjb250aW51ZS4KKworNCkgU29tZSBraW5kIG9mIHdhdGNocG9pbnQgY2FwYWJpbGl0eS4gIFByZXR0eSBlYXN5IG9uY2Ugd2UgaGF2ZSBhCisJc2luZ2xlIHN0ZXAgY2FwYWJpbGl0eSwgYnV0IHdlIGVuZCB1cCBydW5uaW5nIHRoZSBwcm9ncmFtCisJcmVhbGx5IHNsb3dseSBvbmUgaW5zdHJ1Y3Rpb24gYXQgYSB0aW1lLgorCis1KSBTb21lIGtpbmQgb2YgLndkYmluaXQgZmlsZS4KKwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvYW5zaWRlY2wuaCBiL2RlYnVnZ2VyL2Fuc2lkZWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlNGQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2Fuc2lkZWNsLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIEFOU0kgYW5kIHRyYWRpdGlvbmFsIEMgY29tcGF0YWJpbGl0eSBtYWNyb3MKKyAgIENvcHlyaWdodCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisvKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGliaWxpdHkgbWFjcm9zCisKKyAgIEFOU0kgQyBpcyBhc3N1bWVkIGlmIF9fU1REQ19fIGlzICNkZWZpbmVkLgorCisgICBNYWNybwlBTlNJIEMgZGVmaW5pdGlvbglUcmFkaXRpb25hbCBDIGRlZmluaXRpb24KKyAgIC0tLS0tCS0tLS0gLSAtLS0tLS0tLS0tCS0tLS0tLS0tLS0tIC0gLS0tLS0tLS0tLQorICAgUFRSCQlgdm9pZCAqJwkJYGNoYXIgKicKKyAgIExPTkdfRE9VQkxFCWBsb25nIGRvdWJsZScJCWBkb3VibGUnCisgICBDT05TVAlgY29uc3QnCQkJYCcKKyAgIFZPTEFUSUxFCWB2b2xhdGlsZScJCWAnCisgICBTSUdORUQJYHNpZ25lZCcJCWAnCisgICBQVFJDT05TVAlgdm9pZCAqY29uc3QnCQlgY2hhciAqJworCisgICBERUZVTihuYW1lLCBhcmdsaXN0LCBhcmdzKQorCisJRGVmaW5lcyBmdW5jdGlvbiBOQU1FLgorCisJQVJHTElTVCBsaXN0cyB0aGUgYXJndW1lbnRzLCBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBlbmNsb3NlZCBpbgorCXBhcmVudGhlc2VzLiAgQVJHTElTVCBiZWNvbWVzIHRoZSBhcmd1bWVudCBsaXN0IGluIHRyYWRpdGlvbmFsIEMuCisKKwlBUkdTIGxpc3QgdGhlIGFyZ3VtZW50cyB3aXRoIHRoZWlyIHR5cGVzLiAgSXQgYmVjb21lcyBhIHByb3RvdHlwZSBpbgorCUFOU0kgQywgYW5kIHRoZSB0eXBlIGRlY2xhcmF0aW9ucyBpbiB0cmFkaXRpb25hbCBDLiAgQXJndW1lbnRzIHNob3VsZAorCWJlIHNlcGFyYXRlZCB3aXRoIGBBTkQnLiAgRm9yIGZ1bmN0aW9ucyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCisJYXJndW1lbnRzLCB0aGUgbGFzdCB0aGluZyBsaXN0ZWQgc2hvdWxkIGJlIGBET1RTJy4KKworICAgREVGVU5fVk9JRChuYW1lKQorCisJRGVmaW5lcyBhIGZ1bmN0aW9uIE5BTUUsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4KKworICAgRVhGVU4obmFtZSwgcHJvdG90eXBlKQorCisJSXMgdXNlZCBpbiBhbiBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKwlJbiBBTlNJIEMgaXQgaXMgYE5BTUVQUk9UT1RZUEUnIChzbyBQUk9UT1RZUEUgc2hvdWxkIGJlIGVuY2xvc2VkIGluCisJcGFyZW50aGVzZXMpLiAgSW4gdHJhZGl0aW9uYWwgQyBpdCBpcyBgTkFNRSgpJy4KKwlGb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cywgUFJPVE9UWVBFIHNob3VsZCBiZSBgKE5PQVJHUyknLgorCisgICAgRm9yIGV4YW1wbGU6CisJZXh0ZXJuIGludCBFWEZVTihwcmludGYsIChDT05TVCBjaGFyICpmb3JtYXQgRE9UUykpOworCWludCBERUZVTihmcHJpbnRmLCAoc3RyZWFtLCBmb3JtYXQpLAorCQkgIEZJTEUgKnN0cmVhbSBBTkQgQ09OU1QgY2hhciAqZm9ybWF0IERPVFMpIHsgLi4uIH0KKwl2b2lkIERFRlVOX1ZPSUQoYWJvcnQpIHsgLi4uIH0KKyovCisKKyNpZm5kZWYJX0FOU0lERUNMX0gKKworI2RlZmluZQlfQU5TSURFQ0xfSAkxCisKKworLyogRXZlcnkgc291cmNlIGZpbGUgaW5jbHVkZXMgdGhpcyBmaWxlLAorICAgc28gdGhleSB3aWxsIGFsbCBnZXQgdGhlIHN3aXRjaCBmb3IgbGludC4gICovCisvKiBMSU5UTElCUkFSWSAqLworCisKKyNpZmRlZglfX1NURENfXworCisjZGVmaW5lCVBUUgkJdm9pZCAqCisjZGVmaW5lCVBUUkNPTlNUCXZvaWQgKkNPTlNUCisjZGVmaW5lCUxPTkdfRE9VQkxFCWxvbmcgZG91YmxlCisKKyNkZWZpbmUJQU5ECQksCisjZGVmaW5lCU5PQVJHUwkJdm9pZAorI2RlZmluZQlDT05TVAkJY29uc3QKKyNkZWZpbmUJVk9MQVRJTEUJdm9sYXRpbGUKKyNkZWZpbmUJU0lHTkVECQlzaWduZWQKKyNkZWZpbmUJRE9UUwkJLCAuLi4KKworI2RlZmluZQlFWEZVTihuYW1lLCBwcm90bykJCW5hbWUgcHJvdG8KKyNkZWZpbmUJREVGVU4obmFtZSwgYXJnbGlzdCwgYXJncykJbmFtZShhcmdzKQorI2RlZmluZQlERUZVTl9WT0lEKG5hbWUpCQluYW1lKE5PQVJHUykKKworI2RlZmluZSBQUk9UTyh0eXBlLCBuYW1lLCBhcmdsaXN0KSB0eXBlIG5hbWUgYXJnbGlzdAorCisvKiBXZSBjb3VsZCB1c2UgdGhlIEVYRlVOIG1hY3JvIHRvIGhhbmRsZSBwcm90b3R5cGVzLCBidXQKKyAgIHRoZSBuYW1lIGlzIG1pc2xlYWRpbmcgYW5kIHRoZSByZXN1bHQgaXMgdWdseS4gIFNvIGp1c3QgZGVmaW5lIGEKKyAgIHNpbXBsZSBtYWNybyB0byBoYW5kbGUgdGhlIHBhcmFtZXRlciBsaXN0cywgYXMgaW46CisKKwlzdGF0aWMgaW50IGZvbyBQQVJBTVMgKChpbnQsIGNoYXIpKTsKKworICAgRVhGVU4gd291bGQgZG8gaXQgbGlrZSB0aGlzOgorCisJc3RhdGljIGludCBFWEZVTiAoZm9vLCAoaW50LCBjaGFyKSk7CisKKyAgIGJ1dCB0aGUgZnVuY3Rpb24gaXMgbm90IGV4dGVybmFsLi4uICBFWEZVTiBzaG91bGQgYmUgY29uc2lkZXJlZAorICAgb2Jzb2xldGUsIGFuZCBuZXcgY29kZSB3cml0dGVuIHRvIHVzZSBQQVJBTVMuICAqLworCisjZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpIHBhcmFtbGlzdAorCisjZWxzZQkvKiBOb3QgQU5TSSBDLiAgKi8KKworI2RlZmluZQlQVFIJCWNoYXIgKgorI2RlZmluZQlQVFJDT05TVAlQVFIKKyNkZWZpbmUJTE9OR19ET1VCTEUJZG91YmxlCisKKyNkZWZpbmUJQU5ECQk7CisjZGVmaW5lCU5PQVJHUworI2RlZmluZQlDT05TVAorI2RlZmluZQlWT0xBVElMRQorI2RlZmluZQlTSUdORUQKKyNkZWZpbmUJRE9UUworCisjZGVmaW5lCUVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSgpCisjZGVmaW5lCURFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUgYXJnbGlzdCBhcmdzOworI2RlZmluZQlERUZVTl9WT0lEKG5hbWUpCQluYW1lKCkKKyNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkgdHlwZSBuYW1lICgpCisjZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpCQkoKQorCisjZW5kaWYJLyogQU5TSSBDLiAgKi8KKworI2VuZGlmCS8qIGFuc2lkZWNsLmgJKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2JmZC5oIGIvZGVidWdnZXIvYmZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwYjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2JmZC5oCkBAIC0wLDAgKzEsMTQyMSBAQAorLyogQSAtKi0gQyAtKi0gaGVhZGVyIGZpbGUgZm9yIHRoZSBiZmQgbGlicmFyeQorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworLyogYmZkLmggLS0gVGhlIG9ubHkgaGVhZGVyIGZpbGUgcmVxdWlyZWQgYnkgdXNlcnMgb2YgdGhlIGJmZCBsaWJyYXJ5IAorCitUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gdmFyaW91cyAuYyBmaWxlcywgaWYgeW91IGNoYW5nZSBpdCwgeW91cgorYml0cyBtYXkgYmUgbG9zdC4KKworQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKK0lTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgorQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQorYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKK2NoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKK2RvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQord2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCisKK0lmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKK3NhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgorWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCitmaWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKK2hlcmUuICAqLworCisjaWZuZGVmIF9fQkZEX0hfU0VFTl9fCisjZGVmaW5lIF9fQkZEX0hfU0VFTl9fCisKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKworLyogTWFrZSBpdCBlYXNpZXIgdG8gZGVjbGFyZSBwcm90b3R5cGVzIChwdXRzIGNvbmRpdGlvbmFsIGhlcmUpICovCisjaWZuZGVmIFBST1RPCisjCWlmIF9fU1REQ19fCisjCQlkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkgdHlwZSBuYW1lIGFyZ2xpc3QKKyMJZWxzZQorIwkJZGVmaW5lIFBST1RPKHR5cGUsIG5hbWUsIGFyZ2xpc3QpIHR5cGUgbmFtZSAoKQorIwllbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQkZEX1ZFUlNJT04gIjIuMCIKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgX2JmZCBiZmQ7CisKKy8qIEdlbmVyYWwgcnVsZXM6IGZ1bmN0aW9ucyB3aGljaCBhcmUgYm9vbGVhbiByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCisgICBhbmQgZmFsc2Ugb24gZmFpbHVyZSAodW5sZXNzIHRoZXkncmUgYSBwcmVkaWNhdGUpLiAgIC0tIGJmZC5kb2MgKi8KKy8qIEknbSBzdXJlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgc29tZXRoaW5nIGFuZCBzb21lb25lIGlzIGdvaW5nIHRvCisgICBmb3JjZSBtZSB0byBjaGFuZ2UgaXQuICovCisvKiB0eXBlZGVmIGVudW0gYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47ICovCisvKiBZdXAsIFNWUjQgaGFzIGEgInR5cGVkZWYgZW51bSBib29sZWFuIiBpbiA8c3lzL3R5cGVzLmg+ICAtZm5mICovCit0eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2ZhbHNlLCB0cnVlfSBib29sZWFuOworCisvKiBBIHBvaW50ZXIgdG8gYSBwb3NpdGlvbiBpbiBhIGZpbGUuICAqLworLyogRklYTUU6ICBUaGlzIHNob3VsZCBiZSB1c2luZyBvZmZfdCBmcm9tIDxzeXMvdHlwZXMuaD4uCisgICBGb3Igbm93LCB0cnkgdG8gYXZvaWQgYnJlYWtpbmcgc3R1ZmYgYnkgbm90IGluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IGhlcmUuCisgICBUaGlzIHdpbGwgYnJlYWsgb24gc3lzdGVtcyB3aXRoIDY0LWJpdCBmaWxlIG9mZnNldHMgKGUuZy4gNC40QlNEKS4KKyAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBhbnN3ZXIgaXMgdG8gYXZvaWQgdXNpbmcgZmlsZV9wdHIgQU5EIG9mZl90IAorICAgaW4gdGhpcyBoZWFkZXIgZmlsZSwgYW5kIHRvIGhhbmRsZSB0aGlzIGluIHRoZSBCRkQgaW1wbGVtZW50YXRpb24KKyAgIHJhdGhlciB0aGFuIGluIGl0cyBpbnRlcmZhY2UuICAqLworLyogdHlwZWRlZiBvZmZfdAlmaWxlX3B0cjsgKi8KK3R5cGVkZWYgbG9uZyBpbnQgZmlsZV9wdHI7CisKKy8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBzaXplcyBvZiB0YXJnZXQgZm9ybWF0IGludHMgYW5kIGFkZHJlc3NlcyAqLworCisjaWZkZWYJSE9TVF82NF9CSVQKK3R5cGVkZWYgSE9TVF82NF9CSVQgcmF3ZGF0YV9vZmZzZXQ7Cit0eXBlZGVmIEhPU1RfNjRfQklUIGJmZF92bWE7Cit0eXBlZGVmIEhPU1RfNjRfQklUIGJmZF93b3JkOwordHlwZWRlZiBIT1NUXzY0X0JJVCBiZmRfb2Zmc2V0OwordHlwZWRlZiBIT1NUXzY0X0JJVCBiZmRfc2l6ZV90eXBlOwordHlwZWRlZiBIT1NUXzY0X0JJVCBzeW12YWx1ZTsKK3R5cGVkZWYgSE9TVF82NF9CSVQgYmZkXzY0X3R5cGU7CisjZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAorCQlmcHJpbnRmKHMsIiUwOHglMDh4IiwgdWludDY0X3R5cGVISUdIKHgpLCB1aW50NjRfdHlwZUxPVyh4KSkKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7aW50IGEsYjt9IGJmZF82NF90eXBlOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHJhd2RhdGFfb2Zmc2V0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF92bWE7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX29mZnNldDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfd29yZDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW12YWx1ZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZV90eXBlOworI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIGZwcmludGYocywgIiUwOGx4IiwgeCkKKyNlbmRpZgorI2RlZmluZSBwcmludGZfdm1hKHgpIGZwcmludGZfdm1hKHN0ZG91dCx4KQorCit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnd29yZDsJLyogMzIgYml0cyBvZiBmbGFncyAqLworDAorLyoqIEZpbGUgZm9ybWF0cyAqLworCit0eXBlZGVmIGVudW0gYmZkX2Zvcm1hdCB7CisJICAgICAgYmZkX3Vua25vd24gPSAwLAkvKiBmaWxlIGZvcm1hdCBpcyB1bmtub3duICovCisJICAgICAgYmZkX29iamVjdCwJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLworCSAgICAgIGJmZF9hcmNoaXZlLAkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCisJICAgICAgYmZkX2NvcmUsCQkvKiBjb3JlIGR1bXAgKi8KKwkgICAgICBiZmRfdHlwZV9lbmR9CS8qIG1hcmtzIHRoZSBlbmQ7IGRvbid0IHVzZSBpdCEgKi8KKyAgICAgICAgIGJmZF9mb3JtYXQ7CisKKy8qIE9iamVjdCBmaWxlIGZsYWcgdmFsdWVzICovCisjZGVmaW5lIE5PX0ZMQUdTICAgIAkweDAwCisjZGVmaW5lIEhBU19SRUxPQyAgIAkweDAxCisjZGVmaW5lIEVYRUNfUCAgICAgIAkweDAyCisjZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0CisjZGVmaW5lIEhBU19ERUJVRyAgIAkweDA4CisjZGVmaW5lIEhBU19TWU1TICAgIAkweDEwCisjZGVmaW5lIEhBU19MT0NBTFMgIAkweDIwCisjZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCisjZGVmaW5lIFdQX1RFWFQgICAgIAkweDgwCisjZGVmaW5lIERfUEFHRUQgICAgIAkweDEwMAorI2RlZmluZSBCRkRfSVNfUkVMQVhBQkxFIDB4MjAwCisMCisvKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbmRleDsKKworI2RlZmluZSBCRkRfTk9fTU9SRV9TWU1CT0xTICgoc3ltaW5kZXgpIH4wKQorCit0eXBlZGVmIGVudW0gYmZkX3N5bWNsYXNzIHsKKwkgICAgICBiZmRfc3ltY2xhc3NfdW5rbm93biA9IDAsCisJICAgICAgYmZkX3N5bWNsYXNzX2Zjb21tb24sIC8qIGZvcnRyYW4gY29tbW9uIHN5bWJvbHMgKi8KKwkgICAgICBiZmRfc3ltY2xhc3NfZ2xvYmFsLCAvKiBnbG9iYWwgc3ltYm9sLCB3aGF0IGEgc3VycHJpc2UgKi8KKwkgICAgICBiZmRfc3ltY2xhc3NfZGVidWdnZXIsIC8qIHNvbWUgZGVidWdnZXIgc3ltYm9sICovCisJICAgICAgYmZkX3N5bWNsYXNzX3VuZGVmaW5lZCAvKiBub25lIGtub3duICovCisJICAgIH0gc3ltY2xhc3M7CisKKwordHlwZWRlZiBpbnQgc3ltdHlwZTsJCS8qIFdobyBrbm93cywgeWV0PyAqLworCisKKy8qIGdlbmVyYWwgcHVycG9zZSBwYXJ0IG9mIGEgc3ltYm9sOworICAgdGFyZ2V0IHNwZWNpZmljIHBhcnRzIHdpbGwgYmUgZm91bmQgaW4gbGliY29mZi5oLCBsaWJhLm91dC5oIGV0YyAqLworCisKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCisjZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCisjZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCisjZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbj8oKHgpLT5zZWN0aW9uLT52bWEpOjApCisjZGVmaW5lIGJmZF9hc3ltYm9sX3ZhbHVlKHgpIChiZmRfYXN5bWJvbF9iYXNlKHgpICsgeC0+dmFsdWUpCisjZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKKworLyogVGhpcyBpcyBhIHR5cGUgcHVuIHdpdGggc3RydWN0IHJhbmxpYiBvbiBwdXJwb3NlISAqLwordHlwZWRlZiBzdHJ1Y3QgY2Fyc3ltIHsKKyAgY2hhciAqbmFtZTsKKyAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7CQkvKiBsb29rIGhlcmUgdG8gZmluZCB0aGUgZmlsZSAqLworfSBjYXJzeW07CQkJLyogdG8gbWFrZSB0aGVzZSB5b3UgY2FsbCBhIGNhcnN5bW9nZW4gKi8KKworICAKKy8qIFVzZWQgaW4gZ2VuZXJhdGluZyBhcm1hcHMuICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCitzdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCisgIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAorICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCisgIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KK307CisKKwwKKworLyogTGluZW51bWJlciBzdHVmZiAqLwordHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5IHsKKyAgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyOwkvKiBMaW5lbnVtYmVyIGZyb20gc3RhcnQgb2YgZnVuY3Rpb24qLyAgCisgIHVuaW9uIHsKKyBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW07CQkvKiBGdW5jdGlvbiBuYW1lICovCisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KKyAgfSB1OworfSBhbGVudDsKKwwKKy8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCisKKworI2RlZmluZQlhbGlnbl9wb3dlcihhZGRyLCBhbGlnbikJXAorCSggKChhZGRyKSArICgoMTw8KGFsaWduKSktMSkpICYgKC0xIDw8IChhbGlnbikpKQorCit0eXBlZGVmIHN0cnVjdCBzZWMgKnNlY19wdHI7CisKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSArIDApCisjZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hICsgMCkKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIgKyAwKQorI2RlZmluZSBiZmRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUpCisjZGVmaW5lIGJmZF9zZWN0aW9uX3NpemUoYmZkLCBwdHIpIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MocHRyKSkKKyNkZWZpbmUgYmZkX3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSkKKyNkZWZpbmUgYmZkX3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlcikKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGJmZCwgcHRyKSAoKHB0ciktPmZsYWdzICsgMCkKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3VzZXJkYXRhKGJmZCwgcHRyKSAoKHB0ciktPnVzZXJkYXRhKQorCisjZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dm1hID0gKHZhbCkpLCAoKHB0ciktPnVzZXJfc2V0X3ZtYSA9IHRydWUpLCB0cnVlKQorI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPmFsaWdubWVudF9wb3dlciA9ICh2YWwpKSx0cnVlKQorI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dXNlcmRhdGEgPSAodmFsKSksdHJ1ZSkKKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdCBzdGF0X3R5cGU7IAorDAorLyoqIEVycm9yIGhhbmRsaW5nICovCisKK3R5cGVkZWYgZW51bSBiZmRfZXJyb3IgeworCSAgICAgIG5vX2Vycm9yID0gMCwgc3lzdGVtX2NhbGxfZXJyb3IsIGludmFsaWRfdGFyZ2V0LAorCSAgICAgIHdyb25nX2Zvcm1hdCwgaW52YWxpZF9vcGVyYXRpb24sIG5vX21lbW9yeSwKKwkgICAgICBub19zeW1ib2xzLCBub19yZWxvY2F0aW9uX2luZm8sCisJICAgICAgbm9fbW9yZV9hcmNoaXZlZF9maWxlcywgbWFsZm9ybWVkX2FyY2hpdmUsCisJICAgICAgc3ltYm9sX25vdF9mb3VuZCwgZmlsZV9ub3RfcmVjb2duaXplZCwKKwkgICAgICBmaWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsIG5vX2NvbnRlbnRzLAorCSAgICAgIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCisJICAgICAgbm9fZGVidWdfc2VjdGlvbiwgYmFkX3ZhbHVlLAorCSAgICAgIGludmFsaWRfZXJyb3JfY29kZX0gYmZkX2VjOworCitleHRlcm4gYmZkX2VjIGJmZF9lcnJvcjsKK3N0cnVjdCByZWxvY19jYWNoZV9lbnRyeTsKK3N0cnVjdCBiZmRfc2VjbGV0X3N0cnVjdCA7CisKKwordHlwZWRlZiBzdHJ1Y3QgYmZkX2Vycm9yX3ZlY3RvciB7CisgIFBST1RPKHZvaWQsKCogbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uICksKENPTlNUIGJmZCAgKkNPTlNUIGFiZmQsCisJCQkJCSAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lKSk7CisgIFBST1RPKHZvaWQsKCogdW5kZWZpbmVkX3N5bWJvbCksKENPTlNUIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqcmVsLAorCQkJCSAgIENPTlNUIHN0cnVjdCBiZmRfc2VjbGV0X3N0cnVjdCAqc2VjCisJCQkJICAgKSk7CisgIFBST1RPKHZvaWQsICgqIHJlbG9jX3ZhbHVlX3RydW5jYXRlZCksKENPTlNUIHN0cnVjdAorCQkJCQkgIHJlbG9jX2NhY2hlX2VudHJ5ICpyZWwsCisJCQkJCSAgc3RydWN0IGJmZF9zZWNsZXRfc3RydWN0ICpzZWMpKTsKKworICBQUk9UTyh2b2lkLCAoKiByZWxvY19kYW5nZXJvdXMpLChDT05TVCBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKnJlbCwKKwkJCQkgICBDT05TVCBzdHJ1Y3QgYmZkX3NlY2xldF9zdHJ1Y3QgKnNlYykpOworICAKK30gYmZkX2Vycm9yX3ZlY3Rvcl90eXBlOworCitQUk9UTyAoQ09OU1QgY2hhciAqLCBiZmRfZXJybXNnLCAoYmZkX2VjIGVycm9yX3RhZykpOworUFJPVE8gKHZvaWQsIGJmZF9wZXJyb3IsIChDT05TVCBjaGFyICptZXNzYWdlKSk7CisMCisKK3R5cGVkZWYgZW51bSBiZmRfcHJpbnRfc3ltYm9sCit7IAorICBiZmRfcHJpbnRfc3ltYm9sX25hbWUsCisgIGJmZF9wcmludF9zeW1ib2xfbW9yZSwKKyAgYmZkX3ByaW50X3N5bWJvbF9hbGwsCisgIGJmZF9wcmludF9zeW1ib2xfbm0JLyogUHJldHR5IGZvcm1hdCBzdWl0YWJsZSBmb3Igbm0gcHJvZ3JhbS4gKi8KK30gYmZkX3ByaW50X3N5bWJvbF90eXBlOworICAgIAorDAorDAorLyogVGhlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRhcmdldHMgY2FuIGluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhpcworICAgbWFjcm8uICBJdCBtdXN0IG5hbWUgYWxsIGl0cyByb3V0aW5lcyB0aGUgc2FtZSB3YXkgKGEgcHJlZml4IHBsdXMKKyAgIHRoZSBzdGFuZGFyZCByb3V0aW5lIHN1ZmZpeCksIG9yIGl0IG11c3QgI2RlZmluZSB0aGUgcm91dGluZXMgdGhhdAorICAgYXJlIG5vdCBzbyBuYW1lZCwgYmVmb3JlIGNhbGxpbmcgSlVNUF9UQUJMRSBpbiB0aGUgaW5pdGlhbGl6ZXIuICAqLworCisvKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcCAqLworI2lmbmRlZiBDQVQKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBDQVQoYSxiKSBhIyNiCisjZWxzZQorI2RlZmluZSBDQVQoYSxiKSBhLyoqL2IKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgSlVNUF9UQUJMRShOQU1FKVwKK0NBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKSxcCitDQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSxcCitDQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKSxcCitDQVQoTkFNRSxfc2x1cnBfYXJtYXApLFwKK0NBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCitDQVQoTkFNRSxfdHJ1bmNhdGVfYXJuYW1lKSxcCitDQVQoTkFNRSxfd3JpdGVfYXJtYXApLFwKK0NBVChOQU1FLF9jbG9zZV9hbmRfY2xlYW51cCksCVwKK0NBVChOQU1FLF9zZXRfc2VjdGlvbl9jb250ZW50cyksXAorQ0FUKE5BTUUsX2dldF9zZWN0aW9uX2NvbnRlbnRzKSxcCitDQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAorQ0FUKE5BTUUsX2dldF9zeW10YWJfdXBwZXJfYm91bmQpLFwKK0NBVChOQU1FLF9nZXRfc3ltdGFiKSxcCitDQVQoTkFNRSxfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSxcCitDQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCitDQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKK0NBVChOQU1FLF9wcmludF9zeW1ib2wpLFwKK0NBVChOQU1FLF9nZXRfbGluZW5vKSxcCitDQVQoTkFNRSxfc2V0X2FyY2hfbWFjaCksXAorQ0FUKE5BTUUsX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSksXAorQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCitDQVQoTkFNRSxfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KSxcCitDQVQoTkFNRSxfc2l6ZW9mX2hlYWRlcnMpLFwKK0NBVChOQU1FLF9iZmRfZGVidWdfaW5mb19zdGFydCksXAorQ0FUKE5BTUUsX2JmZF9kZWJ1Z19pbmZvX2VuZCksXAorQ0FUKE5BTUUsX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUpLFwKK0NBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCitDQVQoTkFNRSxfYmZkX3JlbGF4X3NlY3Rpb24pCisKKyNkZWZpbmUgQ09GRl9TV0FQX1RBQkxFIFwKKyBjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfc3ltX2luLCBjb2ZmX3N3YXBfbGluZW5vX2luLCBcCisgY29mZl9zd2FwX2F1eF9vdXQsIGNvZmZfc3dhcF9zeW1fb3V0LCBcCisgY29mZl9zd2FwX2xpbmVub19vdXQsIGNvZmZfc3dhcF9yZWxvY19vdXQsIFwKKyBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQsIGNvZmZfc3dhcF9hb3V0aGRyX291dCwgXAorIGNvZmZfc3dhcF9zY25oZHJfb3V0CisKKworDAorLyogVXNlciBwcm9ncmFtIGFjY2VzcyB0byBCRkQgZmFjaWxpdGllcyAqLworCitleHRlcm4gQ09OU1Qgc2hvcnQgX2JmZF9ob3N0X2JpZ19lbmRpYW47CisjZGVmaW5lIEhPU1RfQllURV9PUkRFUl9CSUdfUAkoKihjaGFyICopJl9iZmRfaG9zdF9iaWdfZW5kaWFuKQorCisvKiBUaGUgYmZkIGl0c2VsZiAqLworCisvKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCisgICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCisjZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCisjZGVmaW5lIGJmZF9nZXRfZm9ybWF0KGFiZmQpICgoYWJmZCktPmZvcm1hdCkKKyNkZWZpbmUgYmZkX2dldF90YXJnZXQoYWJmZCkgKChhYmZkKS0+eHZlYy0+bmFtZSkKKyNkZWZpbmUgYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPmZsYWdzKQorI2RlZmluZSBiZmRfYXBwbGljYWJsZV9maWxlX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPm9iamVjdF9mbGFncykKKyNkZWZpbmUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5zZWN0aW9uX2ZsYWdzKQorI2RlZmluZSBiZmRfbXlfYXJjaGl2ZShhYmZkKSAoKGFiZmQpLT5teV9hcmNoaXZlKQorI2RlZmluZSBiZmRfaGFzX21hcChhYmZkKSAoKGFiZmQpLT5oYXNfYXJtYXApCisjZGVmaW5lIGJmZF9oZWFkZXJfdHdpZGRsZV9yZXF1aXJlZChhYmZkKSBcCisgICAgICAgICgoKChhYmZkKS0+eHZlYy0+aGVhZGVyX2J5dGVvcmRlcl9iaWdfcCkJCVwKKwkgICE9IChib29sZWFuKUhPU1RfQllURV9PUkRFUl9CSUdfUCkgPyB0cnVlOmZhbHNlKQorCisjZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKKyNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKKworI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKKyNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKKyNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCisjZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQorI2RlZmluZSBiZmRfZ2V0X2FyY2hpdGVjdHVyZShhYmZkKSAoKGFiZmQpLT5vYmpfYXJjaCkKKyNkZWZpbmUgYmZkX2dldF9tYWNoaW5lKGFiZmQpICgoYWJmZCktPm9ial9tYWNoaW5lKQorCisjZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQorCisjZGVmaW5lIEJZVEVfU0laRSAxCisjZGVmaW5lIFNIT1JUX1NJWkUgMgorI2RlZmluZSBMT05HX1NJWkUgNAorCisvKiBBbmQgbW9yZSBmcm9tIHRoZSBzb3VyY2UuICAqLwordm9pZCBFWEZVTihiZmRfaW5pdCwgKHZvaWQpKTsKK2JmZCAqRVhGVU4oYmZkX29wZW5yLCAoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIqdGFyZ2V0KSk7CitiZmQgKkVYRlVOKGJmZF9mZG9wZW5yLCAoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCwgaW50IGZkKSk7CitiZmQgKkVYRlVOKGJmZF9vcGVudywgKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQpKTsKK2Jvb2xlYW4gRVhGVU4oYmZkX2Nsb3NlLCAoYmZkICopKTsKK2Jvb2xlYW4gRVhGVU4oYmZkX2Nsb3NlX2FsbF9kb25lLCAoYmZkICopKTsKK2JmZF9zaXplX3R5cGUgRVhGVU4oYmZkX2FsbG9jX3NpemUsIChiZmQgKmFiZmQpKTsKK2JmZCAqRVhGVU4oYmZkX2NyZWF0ZSwgKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBiZmQgKnRlbXBsYXRlKSk7CisjZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgICgqKChjaGFyICopcHRyKSA9IChjaGFyKXZhbCkKKyNkZWZpbmUgYmZkX2dldF84KGFiZmQsIHB0cikgXAorICAgICAgICAgICAgICAgICgqKChjaGFyICopcHRyKSkKKyNkZWZpbmUgYmZkX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MTYsICh2YWwscHRyKSkKKyNkZWZpbmUgYmZkX2dldF8xNihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDE2LCAocHRyKSkKKyNkZWZpbmUgYmZkX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4MzIsICh2YWwscHRyKSkKKyNkZWZpbmUgYmZkX2dldF8zMihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDMyLCAocHRyKSkKKyNkZWZpbmUgYmZkX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICh2YWwsIHB0cikpCisjZGVmaW5lIGJmZF9nZXRfNjQoYWJmZCwgcHRyKSBcCisgICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCisjZGVmaW5lIGJmZF9oX3B1dF84KGFiZmQsIHZhbCwgcHRyKSBcCisgICAgICAgICAgICAgICAgKCooKGNoYXIgKilwdHIpID0gKGNoYXIpdmFsKQorI2RlZmluZSBiZmRfaF9nZXRfOChhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICAoKigoY2hhciAqKXB0cikpCisjZGVmaW5lIGJmZF9oX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgxNiwodmFsLHB0cikpCisjZGVmaW5lIGJmZF9oX2dldF8xNihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MTYsKHB0cikpCisjZGVmaW5lIGJmZF9oX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgzMiwodmFsLHB0cikpCisjZGVmaW5lIGJmZF9oX2dldF8zMihhYmZkLCBwdHIpIFwKKyAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MzIsKHB0cikpCisjZGVmaW5lIGJmZF9oX3B1dF82NChhYmZkLCB2YWwsIHB0cikgXAorICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQorI2RlZmluZSBiZmRfaF9nZXRfNjQoYWJmZCwgcHRyKSBcCisgICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDY0LChwdHIpKQordHlwZWRlZiBzdHJ1Y3Qgc2VjIAoreworICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24sIHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAgdGhlIHNhbWUgYXMgdGhhdCBwYXNzZWQgdG8gYmZkX21ha2Vfc2VjdGlvbi4gKi8KKworICAgIENPTlNUIGNoYXIgKm5hbWU7CisKKworICAgICAgICAgLyogV2hpY2ggc2VjdGlvbiBpcyBpdCAwLm50aCAgICAgICovCisKKyAgIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgIC8qIFRoZSBuZXh0IHNlY3Rpb24gaW4gdGhlIGxpc3QgYmVsb25naW5nIHRvIHRoZSBCRkQsIG9yIE5VTEwuICovCisKKyAgICBzdHJ1Y3Qgc2VjICpuZXh0OworCisgICAgICAgICAvKiBUaGUgZmllbGQgZmxhZ3MgY29udGFpbnMgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbi4gU29tZSBvZgorICAgICAgICAgICBmbGFncyBhcmUgcmVhZCBpbiBmcm9tIHRoZSBvYmplY3QgZmlsZSwgYW5kIHNvbWUgYXJlCisgICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqLyAgICAgICAgIAorCisgICAgZmxhZ3dvcmQgZmxhZ3M7CisKKyNkZWZpbmUgU0VDX05PX0ZMQUdTICAgMHgwMDAKKworICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzIHNlY3Rpb24gd2hlbiBsb2FkZWQuCisgICAgICAgICAgIFRoaXMgd291bGQgY2xlYXIgZm9yIGEgc2VjdGlvbiBjb250YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uCisgICAgICAgICAgIG9ubHkuICovCisgICAgICAgICAgCisKKyNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKKyAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBsb2FkIHRoZSBzZWN0aW9uIGZyb20gdGhlIGZpbGUgd2hlbiBsb2FkaW5nLgorICAgICAgICAgICBUaGlzIHdvdWxkIGJlIGNsZWFyIGZvciBhIC5ic3Mgc2VjdGlvbiAqLworCisjZGVmaW5lIFNFQ19MT0FEICAgICAgIDB4MDAyCisgICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgd2lsbAorICAgICAgICAgICBiZSBzb21lIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG9vLiAqLworCisjZGVmaW5lIFNFQ19SRUxPQyAgICAgIDB4MDA0CisKKyAgICAgICAgIC8qIE9ic29sZXRlID8gKi8KKworI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAorCisgICAgICAgICAvKiBBIHNpZ25hbCB0byB0aGUgT1MgdGhhdCB0aGUgc2VjdGlvbiBjb250YWlucyByZWFkIG9ubHkKKyAgICAgICAgICBkYXRhLiAqLworI2RlZmluZSBTRUNfUkVBRE9OTFkgICAweDAxMAorCisgICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb2RlIG9ubHkuICovCisKKyNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqLworCisjZGVmaW5lIFNFQ19EQVRBICAgICAgICAweDA0MAorCisgICAgICAgICAvKiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICovCisKKyNkZWZpbmUgU0VDX1JPTSAgICAgICAgMHgwODAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgorICAgICAgICAgICB0eXBlIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBjcmVhdGUgbGlzdHMgb2YgY29uc3RydWN0b3JzIGFuZAorICAgICAgICAgICBkZXN0cnVjdG9ycyB1c2VkIGJ5IDw8ZysrPj4uIFdoZW4gYSBiYWNrIGVuZCBzZWVzIGEgc3ltYm9sCisgICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldworICAgICAgICAgICBzZWN0aW9uIGZvciB0aGUgdHlwZSBvZiBuYW1lIChlZyA8PF9fQ1RPUl9MSVNUX18+PiksIGF0dGFjaGVzCisgICAgICAgICAgIHRoZSBzeW1ib2wgdG8gaXQgYW5kIGJ1aWxkcyBhIHJlbG9jYXRpb24uIFRvIGJ1aWxkIHRoZSBsaXN0cworICAgICAgICAgICBvZiBjb25zdHJ1Y3RvcnMsIGFsbCB0aGUgbGlua2VyIGhhcyB0byB0byBpcyBjYXRlbmF0ZSBhbGwgdGhlCisgICAgICAgICAgIHNlY3Rpb25zIGNhbGxlZCA8PF9fQ1RPUl9MSVNUX18+PiBhbmQgcmVsb2N0ZSB0aGUgZGF0YQorICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KKyAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKi8KKworI2RlZmluZSBTRUNfQ09OU1RSVUNUT1IgMHgxMDAKKworICAgICAgICAgLyogVGhlIHNlY3Rpb24gaXMgYSBjb25zdHVjdG9yLCBhbmQgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUKKyAgICAgICAgICBlbmQgb2YgdGhlIC4gKi8KKworCisjZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAorCisjZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9EQVRBIDB4MjEwMAorCisjZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9CU1MgIDB4MzEwMAorCisKKyAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgYnNzIHNlY3Rpb24gY291bGQgYmUKKyAgICAgICAgICAgPDxTRUNfQUxMT0M+PiB8IDw8U0VDX0hBU19DT05URU5UUz4+LCBhIGRlYnVnIHNlY3Rpb24gY291bGQgYmUKKyAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKi8KKworI2RlZmluZSBTRUNfSEFTX0NPTlRFTlRTIDB4MjAwCisKKyAgICAgICAgIC8qIEFuIGluc3RydWN0aW9uIHRvIHRoZSBsaW5rZXIgbm90IHRvIG91dHB1dCBzZWN0aW9ucworICAgICAgICAgIGNvbnRhaW5pbmcgdGhpcyBmbGFnIGV2ZW4gaWYgdGhleSBoYXZlIGluZm9ybWF0aW9uIHdoaWNoCisgICAgICAgICAgd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKi8KKworI2RlZmluZSBTRUNfTkVWRVJfTE9BRCAweDQwMAorCisKKyAgICAgICAKKyAgIGJmZF92bWEgdm1hOworICAgYm9vbGVhbiB1c2VyX3NldF92bWE7CisKKyAgICAgICAgIC8qIFRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGluIGJ5dGVzLCBhcyBpdCB3aWxsIGJlIG91dHB1dC4KKyAgICAgICAgICAgY29udGFpbnMgYSB2YWx1ZSBldmVuIGlmIHRoZSBzZWN0aW9uIGhhcyBubyBjb250ZW50cyAoZWcsIHRoZQorICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICovCisKKyAgIGJmZF9zaXplX3R5cGUgX2Nvb2tlZF9zaXplOyAgICAKKworICAgICAgICAgLyogVGhlIHNpemUgb24gZGlzayBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcyBvcmlnaW5hbGx5LiAgTm9ybWFsbHkgdGhpcworCSAgICB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2l6ZSwgYnV0IGlmIHNvbWUgcmVsYXhpbmcgaGFzCisJICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKi8KKworICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7ICAgIAorCisgICAgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB0aGVuIHRoaXMgdmFsdWUgaXMgdGhlCisgICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKKyAgICAgICAgICAgc2VjdGlvbi4gRWcsIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCisgICAgICAgICAgIHRoZSBvdXRwdXQgc2VjdGlvbiwgdGhpcyB2YWx1ZSB3b3VsZCBiZSAxMDAuICovCisKKyAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKKworICAgICAgICAgLyogVGhlIG91dHB1dCBzZWN0aW9uIHRocm91Z2ggd2hpY2ggdG8gbWFwIG9uIG91dHB1dC4gKi8KKworICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247CisKKyAgICAgICAgIC8qIFRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgdGhlIHNlY3Rpb24sIGFzIGFuIGV4cG9uZW50IC0gZWcKKyAgICAgICAgICAgMyBhbGlnbnMgdG8gMl4zIChvciA4KSAqLworCisgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOworCisgICAgICAgICAvKiBJZiBhbiBpbnB1dCBzZWN0aW9uLCBhIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcmVsb2NhdGlvbgorICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICovCisKKyAgIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAqcmVsb2NhdGlvbjsKKworICAgICAgICAgLyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bworICAgICAgICAgICByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KKworICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247CisKKyAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzIGluIG9uZSBvZiB0aGUgYWJvdmUgICovCisKKyAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OworCisgICAgICAgICAvKiBJbmZvcm1hdGlvbiBiZWxvdyBpcyBiYWNrIGVuZCBzcGVjaWZpYyAtIGFuZCBub3QgYWx3YXlzIHVzZWQKKyAgICAgICAgICAgb3IgdXBkYXRlZCAKKworICAgICAgICAgICBGaWxlIHBvc2l0aW9uIG9mIHNlY3Rpb24gZGF0YSAgICAqLworCisgICBmaWxlX3B0ciBmaWxlcG9zOyAgICAgIAorICAgICAgICAKKyAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICovCisKKyAgIGZpbGVfcHRyIHJlbF9maWxlcG9zOworCisgICAgICAgICAvKiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqLworCisgICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7CisKKyAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICovCisKKyAgIFBUUiB1c2VyZGF0YTsKKworICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb24gKm90aGVydXNlcmRhdGE7CisKKyAgICAgICAgIC8qIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICovCisKKyAgIGFsZW50ICpsaW5lbm87CisgICAgICAgIAorICAgICAgICAgLyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqLworCisgICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OworCisgICAgICAgICAvKiBXaGVuIGEgc2VjdGlvbiBpcyBiZWluZyBvdXRwdXQsIHRoaXMgdmFsdWUgY2hhbmdlcyBhcyBtb3JlCisgICAgICAgICAgIGxpbmVudW1iZXJzIGFyZSB3cml0dGVuIG91dCAqLworCisgICBmaWxlX3B0ciBtb3ZpbmdfbGluZV9maWxlcG9zOworCisgICAgICAgICAvKiB3aGF0IHRoZSBzZWN0aW9uIG51bWJlciBpcyBpbiB0aGUgdGFyZ2V0IHdvcmxkICAqLworCisgICBpbnQgdGFyZ2V0X2luZGV4OworCisgICBQVFIgdXNlZF9ieV9iZmQ7CisKKyAgICAgICAgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRoZW4gaGVyZSBpcyBhIGxpc3Qgb2YgdGhlCisgICAgICAgICAgIHJlbG9jYXRpb25zIGNyZWF0ZWQgdG8gcmVsb2NhdGUgaXRlbXMgd2l0aGluIGl0LiAqLworCisgICBzdHJ1Y3QgcmVsZW50X2NoYWluICpjb25zdHJ1Y3Rvcl9jaGFpbjsKKworICAgICAgICAgLyogVGhlIEJGRCB3aGljaCBvd25zIHRoZSBzZWN0aW9uLiAqLworCisgICBiZmQgKm93bmVyOworCisgICBib29sZWFuIHJlbG9jX2RvbmU7CisJICAvKiBBIHN5bWJvbCB3aGljaCBwb2ludHMgYXQgdGhpcyBzZWN0aW9uIG9ubHkgKi8KKyAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsgIAorICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bWJvbF9wdHJfcHRyOworICAgc3RydWN0IGJmZF9zZWNsZXRfc3RydWN0ICpzZWNsZXRzX2hlYWQ7CisgICBzdHJ1Y3QgYmZkX3NlY2xldF9zdHJ1Y3QgKnNlY2xldHNfdGFpbDsKK30gYXNlY3Rpb24gOworCisKKyNkZWZpbmUgQkZEX0FCU19TRUNUSU9OX05BTUUgIipBQlMqIgorI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCisjZGVmaW5lIEJGRF9DT01fU0VDVElPTl9OQU1FICIqQ09NKiIKKworICAgICAvKiB0aGUgYWJzb2x1dGUgc2VjdGlvbiAqLworIGV4dGVybiAgIGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKKyAgICAgLyogUG9pbnRlciB0byB0aGUgdW5kZWZpbmVkIHNlY3Rpb24gKi8KKyBleHRlcm4gICBhc2VjdGlvbiBiZmRfdW5kX3NlY3Rpb247CisgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICovCisgZXh0ZXJuIGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKKworIGV4dGVybiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpiZmRfYWJzX3N5bWJvbDsKKyBleHRlcm4gc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqYmZkX2NvbV9zeW1ib2w7CisgZXh0ZXJuIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKmJmZF91bmRfc3ltYm9sOworI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2Moc2VjdGlvbikgXAorICAgICAoc2VjdGlvbi0+cmVsb2NfZG9uZSA/IChhYm9ydCgpLDEpOiAoc2VjdGlvbiktPl9yYXdfc2l6ZSkKKyNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2Moc2VjdGlvbikgXAorICAgICAoKHNlY3Rpb24tPnJlbG9jX2RvbmUpID8gKHNlY3Rpb24pLT5fY29va2VkX3NpemU6IChhYm9ydCgpLDEpKQorYXNlY3Rpb24gKkVYRlVOKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lLCAoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Cithc2VjdGlvbiAqRVhGVU4oYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5LCAoYmZkICosIENPTlNUIGNoYXIgKm5hbWUpKTsKK2FzZWN0aW9uICogRVhGVU4oYmZkX21ha2Vfc2VjdGlvbiwgKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKSk7Citib29sZWFuIEVYRlVOKGJmZF9zZXRfc2VjdGlvbl9mbGFncywgKGJmZCAqLCBhc2VjdGlvbiAqLCBmbGFnd29yZCkpOwordm9pZCBFWEZVTihiZmRfbWFwX292ZXJfc2VjdGlvbnMsIChiZmQgKmFiZmQsCisgICAgdm9pZCAoKmZ1bmMpKGJmZCAqYWJmZCwKKyAgICBhc2VjdGlvbiAqc2VjdCwKKyAgICBQVFIgb2JqKSwKKyAgICBQVFIgb2JqKSk7Citib29sZWFuIEVYRlVOKGJmZF9zZXRfc2VjdGlvbl9zaXplLCAoYmZkICosIGFzZWN0aW9uICosIGJmZF9zaXplX3R5cGUgdmFsKSk7Citib29sZWFuIEVYRlVOKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cworICAgICwgKGJmZCAqYWJmZCwgICAgICAgIAorICAgIGFzZWN0aW9uICpzZWN0aW9uLAorICAgIFBUUiBkYXRhLAorICAgIGZpbGVfcHRyIG9mZnNldCwKKyAgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Citib29sZWFuIEVYRlVOKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAKKyAgICAsIChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sCisgICAgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KSk7CitlbnVtIGJmZF9hcmNoaXRlY3R1cmUgCit7CisgIGJmZF9hcmNoX3Vua25vd24sICAgIC8qIEZpbGUgYXJjaCBub3Qga25vd24gKi8KKyAgYmZkX2FyY2hfb2JzY3VyZSwgICAgLyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqLworICBiZmRfYXJjaF9tNjhrLCAgICAgICAvKiBNb3Rvcm9sYSA2OHh4eCAqLworICBiZmRfYXJjaF92YXgsICAgICAgICAvKiBERUMgVmF4ICovICAgCisgIGJmZF9hcmNoX2k5NjAsICAgICAgIC8qIEludGVsIDk2MCAqLworICAgICAvKiBUaGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQuCisgICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAorICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCisgICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKKyAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0IAorICAgICAgICJjb3JlIi4gKi8KKworI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NvcmUgICAgICAxCisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfa2Ffc2EgICAgIDIKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMworI2RlZmluZSBiZmRfbWFjaF9pOTYwX21jICAgICAgICA0CisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfeGEgICAgICAgIDUKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgorCisgIGJmZF9hcmNoX2EyOWssICAgICAgIC8qIEFNRCAyOTAwMCAqLworICBiZmRfYXJjaF9zcGFyYywgICAgICAvKiBTUEFSQyAqLworICBiZmRfYXJjaF9taXBzLCAgICAgICAvKiBNSVBTIFJ4eHh4ICovCisgIGJmZF9hcmNoX2kzODYsICAgICAgIC8qIEludGVsIDM4NiAqLworICBiZmRfYXJjaF93ZTMyaywgICAgICAvKiBBVCZUIFdFMzJ4eHggKi8KKyAgYmZkX2FyY2hfdGFob2UsICAgICAgLyogQ0NJL0hhcnJpcyBUYWhvZSAqLworICBiZmRfYXJjaF9pODYwLCAgICAgICAvKiBJbnRlbCA4NjAgKi8KKyAgYmZkX2FyY2hfcm9tcCwgICAgICAgLyogSUJNIFJPTVAgUEMvUlQgKi8KKyAgYmZkX2FyY2hfYWxsaWFudCwgICAgLyogQWxsaWFudCAqLworICBiZmRfYXJjaF9jb252ZXgsICAgICAvKiBDb252ZXggKi8KKyAgYmZkX2FyY2hfbTg4aywgICAgICAgLyogTW90b3JvbGEgODh4eHggKi8KKyAgYmZkX2FyY2hfcHlyYW1pZCwgICAgLyogUHlyYW1pZCBUZWNobm9sb2d5ICovCisgIGJmZF9hcmNoX2g4MzAwLCAgICAgIC8qIEhpdGFjaGkgSDgvMzAwICovCisgIGJmZF9hcmNoX3JzNjAwMCwgICAgIC8qIElCTSBSUy82MDAwICovCisgIGJmZF9hcmNoX2hwcGEsICAgICAgIC8qIEhQIFBBIFJJU0MgKi8KKyAgYmZkX2FyY2hfejhrLCAgICAgICAgLyogWmlsb2cgWjgwMDAgKi8KKyNkZWZpbmUgYmZkX21hY2hfejgwMDEJCTEKKyNkZWZpbmUgYmZkX21hY2hfejgwMDIJCTIKKyAgYmZkX2FyY2hfbGFzdAorICB9OworCit0eXBlZGVmIHN0cnVjdCBiZmRfYXJjaF9pbmZvIAoreworICBpbnQgYml0c19wZXJfd29yZDsKKyAgaW50IGJpdHNfcGVyX2FkZHJlc3M7CisgIGludCBiaXRzX3Blcl9ieXRlOworICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKKyAgbG9uZyBtYWNoOworICBjaGFyICphcmNoX25hbWU7CisgIENPTlNUICBjaGFyICpwcmludGFibGVfbmFtZTsKKyAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7CisgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICovCisgIGJvb2xlYW4gdGhlX2RlZmF1bHQ7CQorICBDT05TVCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqIEVYRlVOKCgqY29tcGF0aWJsZSksCisJKENPTlNUIHN0cnVjdCBiZmRfYXJjaF9pbmZvICphLAorCSBDT05TVCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYikpOworCisgIGJvb2xlYW4gRVhGVU4oKCpzY2FuKSwoQ09OU1Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKixDT05TVCBjaGFyICopKTsKKyAgdW5zaWduZWQgaW50IEVYRlVOKCgqZGlzYXNzZW1ibGUpLChiZmRfdm1hIGFkZHIsIENPTlNUIGNoYXIgKmRhdGEsCisJCQkJICAgICBQVFIgc3RyZWFtKSk7CisKKyAgc3RydWN0IGJmZF9hcmNoX2luZm8gKm5leHQ7Cit9IGJmZF9hcmNoX2luZm9fdHlwZTsKK0NPTlNUIGNoYXIgKkVYRlVOKGJmZF9wcmludGFibGVfbmFtZSwgKGJmZCAqYWJmZCkpOworYmZkX2FyY2hfaW5mb190eXBlICpFWEZVTihiZmRfc2Nhbl9hcmNoLCAoQ09OU1QgY2hhciAqKSk7CitDT05TVCBiZmRfYXJjaF9pbmZvX3R5cGUgKkVYRlVOKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlLCAoCisgICAgQ09OU1QgYmZkICphYmZkLAorICAgIENPTlNUIGJmZCAqYmJmZCkpOwordm9pZCBFWEZVTihiZmRfc2V0X2FyY2hfaW5mbywgKGJmZCAqLCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOworZW51bSBiZmRfYXJjaGl0ZWN0dXJlIEVYRlVOKGJmZF9nZXRfYXJjaCwgKGJmZCAqYWJmZCkpOwordW5zaWduZWQgbG9uZyBFWEZVTihiZmRfZ2V0X21hY2gsIChiZmQgKmFiZmQpKTsKK3Vuc2lnbmVkIGludCBFWEZVTihiZmRfYXJjaF9iaXRzX3Blcl9ieXRlLCAoYmZkICphYmZkKSk7Cit1bnNpZ25lZCBpbnQgRVhGVU4oYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcywgKGJmZCAqYWJmZCkpOworYmZkX2FyY2hfaW5mb190eXBlICogRVhGVU4oYmZkX2dldF9hcmNoX2luZm8sIChiZmQgKikpOworYmZkX2FyY2hfaW5mb190eXBlICpFWEZVTihiZmRfbG9va3VwX2FyY2gKKyAgICAsIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUKKyAgICBhcmNoLAorICAgIGxvbmcgbWFjaGluZSkpOworQ09OU1QgY2hhciAqIEVYRlVOKGJmZF9wcmludGFibGVfYXJjaF9tYWNoCisgICAgLCAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsIHVuc2lnbmVkIGxvbmcgbWFjaGluZSkpOwordHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMgCit7CisgICAgICAgIC8qIE5vIGVycm9ycyBkZXRlY3RlZCAqLworICBiZmRfcmVsb2Nfb2ssCisKKyAgICAgICAgLyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IHRoZXJlIHdhcyBhbiBvdmVyZmxvdy4gKi8KKyAgYmZkX3JlbG9jX292ZXJmbG93LAorCisgICAgICAgIC8qIFRoZSBhZGRyZXNzIHRvIHJlbG9jYXRlIHdhcyBub3Qgd2l0aGluIHRoZSBzZWN0aW9uIHN1cHBsaWVkKi8KKyAgYmZkX3JlbG9jX291dG9mcmFuZ2UsCisKKyAgICAgICAgLyogVXNlZCBieSBzcGVjaWFsIGZ1bmN0aW9ucyAqLworICBiZmRfcmVsb2NfY29udGludWUsCisKKyAgICAgICAgLyogVW51c2VkICovCisgIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQsCisKKyAgICAgICAgLyogVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBzaXplIHJlcXVlc3RlZC4gICovCisgIGJmZF9yZWxvY19vdGhlciwKKworICAgICAgICAvKiBUaGUgc3ltYm9sIHRvIHJlbG9jYXRlIGFnYWluc3Qgd2FzIHVuZGVmaW5lZC4qLworICBiZmRfcmVsb2NfdW5kZWZpbmVkLAorCisgICAgICAgIC8qIFRoZSByZWxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIGJ1dCBtYXkgbm90IGJlIG9rIC0gcHJlc2VudGx5CisgICAgICAgICAgZ2VuZXJhdGVkIG9ubHkgd2hlbiBsaW5raW5nIGk5NjAgY29mZiBmaWxlcyB3aXRoIGk5NjAgYi5vdXQKKyAgICAgICAgICBzeW1ib2xzLiAqLworICBiZmRfcmVsb2NfZGFuZ2Vyb3VzCisgfQorIGJmZF9yZWxvY19zdGF0dXNfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCByZWxvY19jYWNoZV9lbnRyeSAKK3sKKyAgICAgICAgLyogQSBwb2ludGVyIGludG8gdGhlIGNhbm9uaWNhbCB0YWJsZSBvZiBwb2ludGVycyAgKi8KKyAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bV9wdHJfcHRyOworCisgICAgICAgIC8qIG9mZnNldCBpbiBzZWN0aW9uICovCisgIHJhd2RhdGFfb2Zmc2V0IGFkZHJlc3M7CisKKyAgICAgICAgLyogYWRkZW5kIGZvciByZWxvY2F0aW9uIHZhbHVlICovCisgIGJmZF92bWEgYWRkZW5kOyAgICAKKworICAgICAgICAvKiBQb2ludGVyIHRvIGhvdyB0byBwZXJmb3JtIHRoZSByZXF1aXJlZCByZWxvY2F0aW9uICovCisgIENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKmhvd3RvOworCit9IGFyZWxlbnQ7CisKK3R5cGVkZWYgQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAKK3sgCisgICAgICAgIC8qICBUaGUgdHlwZSBmaWVsZCBoYXMgbWFpbmx5IGEgZG9jdW1ldGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCisgICAgICAgICAgIHRvIHdoYXQgaXQgd2FudHMgd2l0aCBpdCwgdGhvdWdoIHRoZSBub3JtYWxseSB0aGUgYmFjayBlbmQncworICAgICAgICAgICBleHRlcm5hbCBpZGVhIG9mIHdoYXQgYSByZWxvYyBudW1iZXIgd291bGQgYmUgd291bGQgYmUgc3RvcmVkCisgICAgICAgICAgIGluIHRoaXMgZmllbGQuIEZvciBleGFtcGxlLCB0aGUgYSBQQyByZWxhdGl2ZSB3b3JkIHJlbG9jYXRpb24KKyAgICAgICAgICAgaW4gYSBjb2ZmIGVudmlyb25tZW50IHdvdWxkIGhhdmUgdGhlIHR5cGUgMDIzIC0gYmVjYXVzZSB0aGF0J3MKKyAgICAgICAgICAgd2hhdCB0aGUgb3V0c2lkZSB3b3JsZCBjYWxscyBhIFJfUENSV09SRCByZWxvYy4gKi8KKyAgdW5zaWduZWQgaW50IHR5cGU7CisKKyAgICAgICAgLyogIFRoZSB2YWx1ZSB0aGUgZmluYWwgcmVsb2NhdGlvbiBpcyBzaGlmdGVkIHJpZ2h0IGJ5LiBUaGlzIGRyb3BzCisgICAgICAgICAgIHVud2FudGVkIGRhdGEgZnJvbSB0aGUgcmVsb2NhdGlvbi4gICovCisgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OworCisgICAgICAgIC8qICBUaGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQgLSAwLCBpcyBvbmUgYnl0ZSwgMSBpcyAyCisgICAgICAgICAgIGJ5dGVzLCAzIGlzIGZvdXIgYnl0ZXMuICBBIC12ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUKKwkgICAgcmVzdWx0IGlzIHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgZGF0YSovCisgIGludCBzaXplOworCisgICAgICAgIC8qICBOb3cgb2Jzb2xldGUgKi8KKyAgdW5zaWduZWQgaW50IGJpdHNpemU7CisKKyAgICAgICAgLyogIE5vdGVzIHRoYXQgdGhlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZQorICAgICAgICAgICBkYXRhIHNlY3Rpb24gb2YgdGhlIGFkZGVuZC4gVGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gd2lsbAorICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgorICAgICAgICAgICBiZWluZyByZWxvY2F0ZWQuICovCisgIGJvb2xlYW4gcGNfcmVsYXRpdmU7CisKKyAgICAgICAgLyogIE5vdyBvYnNvbGV0ZSAqLworICB1bnNpZ25lZCBpbnQgYml0cG9zOworCisgICAgICAgIC8qICBOb3cgb2Jzb2xldGUgKi8KKyAgYm9vbGVhbiBhYnNvbHV0ZTsKKworICAgICAgICAvKiBDYXVzZXMgdGhlIHJlbG9jYXRpb24gcm91dGluZSB0byByZXR1cm4gYW4gZXJyb3IgaWYgb3ZlcmZsb3cKKyAgICAgICAgICBpcyBkZXRlY3RlZCB3aGVuIHJlbG9jYXRpbmcuICovCisgIGJvb2xlYW4gY29tcGxhaW5fb25fb3ZlcmZsb3c7CisKKyAgICAgICAgLyogSWYgdGhpcyBmaWVsZCBpcyBub24gbnVsbCwgdGhlbiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gaXMKKyAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5CisgICAgICAgICAgc3RyYW5nZSByZWxvY2F0aW9uIG1ldGhvZHMgdG8gYmUgYWNjb21vZGF0ZWQgKGVnLCBpOTYwIGNhbGxqCisgICAgICAgICAgaW5zdHJ1Y3Rpb25zKS4gKi8KKyAgYmZkX3JlbG9jX3N0YXR1c190eXBlIEVYRlVOICgoKnNwZWNpYWxfZnVuY3Rpb24pLCAKKwkJCQkJICAgIChiZmQgKmFiZmQsCisJCQkJCSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICpvdXRwdXRfYmZkICAgICApKTsKKworICAgICAgICAvKiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICovCisgIGNoYXIgKm5hbWU7CisKKyAgICAgICAgLyogV2hlbiBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rLCBzb21lIGZvcm1hdHMgbXVzdCBtb2RpZnkgdGhlCisgICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLiovCisgIGJvb2xlYW4gcGFydGlhbF9pbnBsYWNlOworCisgICAgICAgIC8qIFRoZSBzcmNfbWFzayBpcyB1c2VkIHRvIHNlbGVjdCB3aGF0IHBhcnRzIG9mIHRoZSByZWFkIGluIGRhdGEKKyAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uIEVnLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAorICAgICAgICAgIGJpdCBvZiBkYXRhIHdoaWNoIHdlIHJlYWQgYW5kIHJlbG9jYXRlZCwgdGhpcyB3b3VsZCBiZQorICAgICAgICAgIDB4MDAwMDAwZmYuIFdoZW4gd2UgaGF2ZSByZWxvY3Mgd2hpY2ggaGF2ZSBhbiBhZGRlbmQsIHN1Y2ggYXMKKyAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCisgICAgICAgICAgcmVsb2NhdGluZyBmaWVsZCBpcyBnYXJiYWdlIHNvIHdlIG5ldmVyIHVzZSBpdC4gSW4gdGhpcyBjYXNlCisgICAgICAgICAgdGhlIG1hc2sgd291bGQgYmUgMHgwMDAwMDAwMC4gKi8KKyAgYmZkX3dvcmQgc3JjX21hc2s7CisKKyAgICAgICAgLyogVGhlIGRzdF9tYXNrIGlzIHdoYXQgcGFydHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSByZXBsYWNlZAorICAgICAgICAgIGludG8gdGhlIGluc3RydWN0aW9uLiBJbiBtb3N0IGNhc2VzIHNyY19tYXNrID09IGRzdF9tYXNrLAorICAgICAgICAgIGV4Y2VwdCBpbiB0aGUgYWJvdmUgc3BlY2lhbCBjYXNlLCB3aGVyZSBkc3RfbWFzayB3b3VsZCBiZQorICAgICAgICAgIDB4MDAwMDAwZmYsIGFuZCBzcmNfbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAgICovCisgIGJmZF93b3JkIGRzdF9tYXNrOyAgICAgICAgICAgCisKKyAgICAgICAgLyogV2hlbiBzb21lIGZvcm1hdHMgY3JlYXRlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucywgdGhleSBsZWF2ZQorICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGMgb2YgdGhlIHBsYWNlIGJlaW5nIHJlbG9jYXRlZCBpbiB0aGUgb2Zmc2V0CisgICAgICAgICAgc2xvdCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIHRoYXQgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGNhbgorICAgICAgICAgIGJlIG1hZGUganVzdCBieSBhZGRpbmcgaW4gYW4gb3JkaW5hcnkgb2Zmc2V0IChlZyBzdW4zIGEub3V0KS4KKyAgICAgICAgICBTb21lIGZvcm1hdHMgbGVhdmUgdGhlIGRpc3BsYWNlbWVudCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uCisgICAgICAgICAgZW1wdHkgKGVnIG04OGsgYmNzKSwgdGhpcyBmbGFnIHNpZ25hbHMgdGhlIGZhY3QuKi8KKyAgYm9vbGVhbiBwY3JlbF9vZmZzZXQ7CisKK30gcmVsb2NfaG93dG9fdHlwZTsKKyNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBBQlMsIE8sIFNGLCBOQU1FLCBJTlBMQUNFLCBNQVNLU1JDLCBNQVNLRFNULCBQQykgXAorICB7KHVuc2lnbmVkKUMsUixTLEIsIFAsIEJJLCBBQlMsTyxTRixOQU1FLElOUExBQ0UsTUFTS1NSQyxNQVNLRFNULFBDfQorI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsZmFsc2UsZmFsc2UsRlVOQ1RJT04sIE5BTUUsZmFsc2UsMCwwLElOKQorCisjZGVmaW5lIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sKSAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoc3ltYm9sICE9IChhc3ltYm9sICopTlVMTCkgeyAgICAgICAgICAgICBcCisgICAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX2NvbV9zZWN0aW9uKSB7IFwKKyAgICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7CisKK3R5cGVkZWYgc3RydWN0IHJlbGVudF9jaGFpbiB7CisgIGFyZWxlbnQgcmVsZW50OworICBzdHJ1Y3QgICByZWxlbnRfY2hhaW4gKm5leHQ7Cit9IGFyZWxlbnRfY2hhaW47CitiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKK0VYRlVOKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24KKyAgICAsIChiZmQgKiBhYmZkLAorICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAorICAgIFBUUiBkYXRhLAorICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAorICAgIGJmZCAqb3V0cHV0X2JmZCkpOwordHlwZWRlZiBlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwgCisKK3sKKyAgICAgICAgLyogMTYgYml0cyB3aWRlLCBzaW1wbGUgcmVsb2MgKi8KKyAgQkZEX1JFTE9DXzE2LCAgICAgICAgCisKKyAgICAgICAgLyogOCBiaXRzIHdpZGUsIGJ1dCB1c2VkIHRvIGZvcm0gYW4gYWRkcmVzcyBsaWtlIDB4ZmZubiAqLworICBCRkRfUkVMT0NfOF9GRm5uLAorCisgICAgICAgIC8qIDggYml0cyB3aWRlLCBzaW1wbGUgKi8KKyAgQkZEX1JFTE9DXzgsCisKKyAgICAgICAgLyogOCBiaXRzIHdpZGUsIHBjIHJlbGF0aXZlICovCisgIEJGRF9SRUxPQ184X1BDUkVMLAorCisgICAgICAgIC8qIFRoZSB0eXBlIG9mIHJlbG9jIHVzZWQgdG8gYnVpbGQgYSBjb250cnVjdG9yIHRhYmxlIC0gYXQgdGhlCisgICAgICAgICAgbW9tZW50IHByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzIGFkZHJlc3MsIGJ1dCB0aGUgY3B1IGNhbgorICAgICAgICAgIGNob29zZS4gKi8KKworICBCRkRfUkVMT0NfQ1RPUiwKKworICAgICAgICAvKiAzMiBiaXRzIHdpZGUsIHNpbXBsZSByZWxvYyAqLworICBCRkRfUkVMT0NfMzIsCisJIC8qIDMyIGJpdHMsIFBDLXJlbGF0aXZlICovCisgIEJGRF9SRUxPQ18zMl9QQ1JFTCwKKworCSAvKiBIaWdoIDIyIGJpdHMgb2YgMzItYml0IHZhbHVlOyBzaW1wbGUgcmVsb2MuICAqLworICBCRkRfUkVMT0NfSEkyMiwKKwkgLyogTG93IDEwIGJpdHMuICAqLworICBCRkRfUkVMT0NfTE8xMCwKKworCSAvKiBSZWxvYyB0eXBlcyB1c2VkIGZvciBpOTYwL2Iub3V0LiAgKi8KKyAgQkZEX1JFTE9DXzI0X1BDUkVMLAorICBCRkRfUkVMT0NfSTk2MF9DQUxMSiwKKworICBCRkRfUkVMT0NfMTZfUENSRUwsCisJIC8qIDMyLWJpdCBwYy1yZWxhdGl2ZSwgc2hpZnRlZCByaWdodCAyIGJpdHMgKGkuZS4sIDMwLWJpdAorCSAgIHdvcmQgZGlzcGxhY2VtZW50LCBlLmcuIGZvciBTUEFSQykgKi8KKyAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLAorCisgICAvKiBub3cgZm9yIHRoZSBzcGFyYy9lbGYgY29kZXMgKi8KKyAgQkZEX1JFTE9DX05PTkUsCQkgLyogYWN0dWFsbHkgdXNlZCAqLworICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwKKyAgQkZEX1JFTE9DX1NQQVJDMjIsCisgIEJGRF9SRUxPQ19TUEFSQzEzLAorICBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzLAorICBCRkRfUkVMT0NfU1BBUkNfR09UMTAsCisgIEJGRF9SRUxPQ19TUEFSQ19HT1QxMywKKyAgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLAorICBCRkRfUkVMT0NfU1BBUkNfUEMxMCwKKyAgQkZEX1JFTE9DX1NQQVJDX1BDMjIsCisgIEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsCisgIEJGRF9SRUxPQ19TUEFSQ19DT1BZLAorICBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsCisgIEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCwKKyAgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLAorICBCRkRfUkVMT0NfU1BBUkNfVUEzMiwKKworICAgLyogdGhpcyBvbmUgaXMgYS5vdXQgc3BlY2lmaWM/ICovCisgIEJGRF9SRUxPQ19TUEFSQ19CQVNFMjIsCisKKyAgIC8qIHRoaXMgbXVzdCBiZSB0aGUgaGlnaGVzdCBudW1lcmljIHZhbHVlICovCisgIEJGRF9SRUxPQ19VTlVTRUQKKyB9IGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZTsKK0NPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgorRVhGVU4oYmZkX3JlbG9jX3R5cGVfbG9va3VwICwgKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKK3R5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAKK3sKKwkgLyogQSBwb2ludGVyIHRvIHRoZSBCRkQgd2hpY2ggb3ducyB0aGUgc3ltYm9sLiBUaGlzIGluZm9ybWF0aW9uCisJICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCisgICAJICAgKGludmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24gd3JpdGVyKSBpbmZvcm1hdGlvbiBpcyBjYXJyaWVkCisJICAgd2l0aCB0aGUgc3ltYm9sLiAgKi8KKworICBzdHJ1Y3QgX2JmZCAqdGhlX2JmZDsKKworCSAvKiBUaGUgdGV4dCBvZiB0aGUgc3ltYm9sLiBUaGUgbmFtZSBpcyBsZWZ0IGFsb25lLCBhbmQgbm90IGNvcGllZCAtIHRoZQorCSAgIGFwcGxpY2F0aW9uIG1heSBub3QgYWx0ZXIgaXQuICovCisgIENPTlNUIGNoYXIgKm5hbWU7CisKKwkgLyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuKi8KKyAgc3ltdmFsdWUgdmFsdWU7CisKKwkgLyogQXR0cmlidXRlcyBvZiBhIHN5bWJvbDogKi8KKworI2RlZmluZSBCU0ZfTk9fRkxBR1MgICAgMHgwMAorCisJIC8qIFRoZSBzeW1ib2wgaGFzIGxvY2FsIHNjb3BlOyA8PHN0YXRpYz4+IGluIDw8Qz4+LiBUaGUgdmFsdWUKKyAJICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLworI2RlZmluZSBCU0ZfTE9DQUwJMHgwMQorCisJIC8qIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZTsgaW5pdGlhbGl6ZWQgZGF0YSBpbiA8PEM+Pi4gVGhlCisJICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLworI2RlZmluZSBCU0ZfR0xPQkFMCTB4MDIKKworCSAvKiBPYnNvbGV0ZSAqLworI2RlZmluZSBCU0ZfSU1QT1JUCTB4MDQKKworCSAvKiBUaGUgc3ltYm9sIGhhcyBnbG9iYWwgc2NvcGUsIGFuZCBpcyBleHBvcnRlZC4gVGhlIHZhbHVlIGlzCisJICAgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLworI2RlZmluZSBCU0ZfRVhQT1JUCTB4MDgKKworCSAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gPDxleHRlcm4+PiBpbiA8PEM+Pi4gVGhlIHZhbHVlIGhhcworCSAgIG5vIG1lYW5pbmcuICovCisjZGVmaW5lIEJTRl9VTkRFRklORURfT0JTIDB4MTAJCisKKwkgLyogVGhlIHN5bWJvbCBpcyBjb21tb24sIGluaXRpYWxpemVkIHRvIHplcm87IGRlZmF1bHQgaW4KKwkgICA8PEM+Pi4gVGhlIHZhbHVlIGlzIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuICovCisjZGVmaW5lIEJTRl9GT1JUX0NPTU1fT0JTCTB4MjAJCisKKwkgLyogQSBub3JtYWwgQyBzeW1ib2wgd291bGQgYmUgb25lIG9mOgorCSAgIDw8QlNGX0xPQ0FMPj4sIDw8QlNGX0ZPUlRfQ09NTT4+LCAgPDxCU0ZfVU5ERUZJTkVEPj4gb3IKKwkgICA8PEJTRl9FWFBPUlR8QlNEX0dMT0JBTD4+ICovCisKKwkgLyogVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyByZWNvcmQuIFRoZSB2YWx1ZSBoYXMgYW4gYXJiaXRhcnkKKwkgICBtZWFuaW5nLiAqLworI2RlZmluZSBCU0ZfREVCVUdHSU5HCTB4NDAKKworCSAvKiBVc2VkIGJ5IHRoZSBsaW5rZXIgKi8KKyNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgQlNGX0tFRVBfRyAgICAgIDB4ODAwMDAKKworCSAvKiBVbnVzZWQgKi8KKyNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIEJTRl9DVE9SICAgICAgICAweDIwMDAwMCAKKworICAgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCB0byBwb2ludCB0byBhIHNlY3Rpb24sIGUuZy4gRUxGJ3MKKwkgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4NDAwMDAwIAorCisJIC8qIFRoZSBzeW1ib2wgdXNlZCB0byBiZSBhIGNvbW1vbiBzeW1ib2wsIGJ1dCBub3cgaXQgaXMKKwkgICBhbGxvY2F0ZWQuICovCisjZGVmaW5lIEJTRl9PTERfQ09NTU9OICAweDgwMDAwMCAgCisKKwkgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNvbW1vbiBkYXRhLiAqLworI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAorCisJIC8qIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKKwkgICBsb2NhdGlvbiBpbiBhbiBvdXRwdXQgZmlsZSAtIGllIGluIGNvZmYgYSA8PElTRkNOPj4gc3ltYm9sCisJICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCisJICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAorICAJICAgYnkgdGhlIHRhcmdldCBCRkQgcGFydCB0byBjb252ZXkgdGhpcyBpbmZvcm1hdGlvbi4gKi8KKworI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMDAwCisKKwkgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyB0aGUgbGFiZWwgb2YgY29uc3RydWN0b3Igc2VjdGlvbi4gKi8KKyNkZWZpbmUgQlNGX0NPTlNUUlVDVE9SICAgMHgxMDAwMDAwCisKKwkgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiBJZiB0aGUgc3ltYm9sCisJICAgaXMgYSB3YXJuaW5nIHN5bWJvbCwgdGhlbiB0aGUgdmFsdWUgZmllbGQgKEkga25vdyB0aGlzIGlzCisJICAgdGFja3kpIHdpbGwgcG9pbnQgdG8gdGhlIGFzeW1ib2wgd2hpY2ggd2hlbiByZWZlcmVuY2VkIHdpbGwKKwkgICBjYXVzZSB0aGUgd2FybmluZy4gKi8KKyNkZWZpbmUgQlNGX1dBUk5JTkcgICAgICAgMHgyMDAwMDAwCisKKwkgLyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBpbmRpcmVjdC4gVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wKKwkgICBpcyBhIHBvaW50ZXIgdG8gYW4gdW5kZWZpbmVkIGFzeW1ib2wgd2hpY2ggY29udGFpbnMgdGhlCisJICAgbmFtZSB0byB1c2UgaW5zdGVhZC4gKi8KKyNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHg0MDAwMDAwCisKKwkgLyogQlNGX0ZJTEUgbWFya3Mgc3ltYm9scyB0aGF0IGNvbnRhaW4gYSBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQKKwkgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqLworI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDA4MDAwMDAwCisKKyAgZmxhZ3dvcmQgZmxhZ3M7CisKKwkgLyogQSBwb2ludGVyIHRvIHRoZSBzZWN0aW9uIHRvIHdoaWNoIHRoaXMgc3ltYm9sIGlzIAorCSAgIHJlbGF0aXZlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBub24gTlVMTCwgdGhlcmUgYXJlIHNwZWNpYWwKKyAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzICovCisgIHN0cnVjdCBzZWMgKnNlY3Rpb247CisKKwkgLyogQmFjayBlbmQgc3BlY2lhbCBkYXRhLiBUaGlzIGlzIGJlaW5nIHBoYXNlZCBvdXQgaW4gZmF2b3VyCisJICAgb2YgbWFraW5nIHRoaXMgYSB1bmlvbi4gKi8KKyAgUFRSIHVkYXRhOwkKKworfSBhc3ltYm9sOworI2RlZmluZSBnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKKyAgICAgQkZEX1NFTkQgKGFiZmQsIF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCisjZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCisgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIsXAorICAgICAgICAgICAgICAgICAgKGFiZmQsIGxvY2F0aW9uKSkKK2Jvb2xlYW4gRVhGVU4oYmZkX3NldF9zeW10YWIgLCAoYmZkICosIGFzeW1ib2wgKiosIHVuc2lnbmVkIGludCApKTsKK3ZvaWQgRVhGVU4oYmZkX3ByaW50X3N5bWJvbF92YW5kZiwgKFBUUiBmaWxlLCBhc3ltYm9sICpzeW1ib2wpKTsKKyNkZWZpbmUgYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpIFwKKyAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKKyNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wsIChhYmZkLCBwdHIsIHNpemUpKQoraW50IEVYRlVOKGJmZF9kZWNvZGVfc3ltY2xhc3MsIChhc3ltYm9sICpzeW1ib2wpKTsKK3N0cnVjdCBfYmZkIAoreworICAgICAvKiBUaGUgZmlsZW5hbWUgdGhlIGFwcGxpY2F0aW9uIG9wZW5lZCB0aGUgQkZEIHdpdGguICAqLworICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAgICAKKworICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOworCisgICAgIC8qIFRvIGF2b2lkIGRyYWdnaW5nIHRvbyBtYW55IGhlYWRlciBmaWxlcyBpbnRvIGV2ZXJ5IGZpbGUgdGhhdAorICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCisgICAgICAgKiIsIGFuZCBNVElNRSBhcyBhICJsb25nIi4gIFRoZWlyIGNvcnJlY3QgdHlwZXMsIHRvIHdoaWNoIHRoZXkKKyAgICAgICBhcmUgY2FzdCB3aGVuIHVzZWQsIGFyZSAiRklMRSAqIiBhbmQgInRpbWVfdCIuICAgIFRoZSBpb3N0cmVhbQorICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAqLworICAgIGNoYXIgKmlvc3RyZWFtOworCisgICAgIC8qIElzIHRoZSBmaWxlIGJlaW5nIGNhY2hlZCAqLworCisgICAgYm9vbGVhbiBjYWNoZWFibGU7CisKKyAgICAgLyogTWFya3Mgd2hldGhlciB0aGVyZSB3YXMgYSBkZWZhdWx0IHRhcmdldCBzcGVjaWZpZWQgd2hlbiB0aGUKKyAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGF0IG1hdGNoaW5nIGFsZ29yaXRobQorICAgICAgIHRvIHVzZSB0byBjaG9zZSB0aGUgYmFjayBlbmQuICovCisKKyAgICBib29sZWFuIHRhcmdldF9kZWZhdWx0ZWQ7CisKKyAgICAgLyogVGhlIGNhY2hpbmcgcm91dGluZXMgdXNlIHRoZXNlIHRvIG1haW50YWluIGEKKyAgICAgICBsZWFzdC1yZWNlbnRseS11c2VkIGxpc3Qgb2YgQkZEcyAqLworCisgICAgc3RydWN0IF9iZmQgKmxydV9wcmV2LCAqbHJ1X25leHQ7CisKKyAgICAgLyogV2hlbiBhIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBjYWNoaW5nIHJvdXRpbmVzLCBCRkQgcmV0YWlucworICAgICAgIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaWxlIGhlcmU6IAorICAgICAqLworCisgICAgZmlsZV9wdHIgd2hlcmU7ICAgICAgICAgICAgICAKKworICAgICAvKiBhbmQgaGVyZToqLworCisgICAgYm9vbGVhbiBvcGVuZWRfb25jZTsKKworICAgICAvKiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KKyAgICAgICBnZXR0aW5nIGl0IGZyb20gdGhlIGZpbGUgZWFjaCB0aW1lOiAqLworCisgICAgYm9vbGVhbiBtdGltZV9zZXQ7CisKKyAgICAgLyogRmlsZSBtb2RpZmllZCB0aW1lLCBpZiBtdGltZV9zZXQgaXMgdHJ1ZTogKi8KKworICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAorCisgICAgIC8qIFJlc2VydmVkIGZvciBhbiB1bmltcGxlbWVudGVkIGZpbGUgbG9ja2luZyBleHRlbnNpb24uKi8KKworICAgIGludCBpZmQ7CisKKyAgICAgLyogVGhlIGZvcm1hdCB3aGljaCBiZWxvbmdzIHRvIHRoZSBCRkQuKi8KKworICAgIGJmZF9mb3JtYXQgZm9ybWF0OworCisgICAgIC8qIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqLworCisgICAgZW51bSBiZmRfZGlyZWN0aW9uIHtub19kaXJlY3Rpb24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZGlyZWN0aW9uID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdGhfZGlyZWN0aW9uID0gM30gZGlyZWN0aW9uOworCisgICAgIC8qIEZvcm1hdF9zcGVjaWZpYyBmbGFncyovCisKKyAgICBmbGFnd29yZCBmbGFnczsgICAgICAgICAgICAgIAorCisgICAgIC8qIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bworICAgICAgIGFueXRoaW5nLiBJIGJlbGlldmUgdGhhdCB0aGlzIGNhbiBiZWNvbWUgYWx3YXlzIGFuIGFkZCBvZgorICAgICAgIG9yaWdpbiwgd2l0aCBvcmlnaW4gc2V0IHRvIDAgZm9yIG5vbiBhcmNoaXZlIGZpbGVzLiAgICovCisKKyAgICBmaWxlX3B0ciBvcmlnaW47ICAgICAgICAgICAgIAorCisgICAgIC8qIFJlbWVtYmVyIHdoZW4gb3V0cHV0IGhhcyBiZWd1biwgdG8gc3RvcCBzdHJhbmdlIHRoaW5ncworICAgICAgIGhhcHBlbmluZy4gKi8KKyAgICBib29sZWFuIG91dHB1dF9oYXNfYmVndW47CisKKyAgICAgLyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyovCisgICAgc3RydWN0IHNlYyAgKnNlY3Rpb25zOworCisgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKKworICAgICAvKiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3Igb2JqZWN0IGZpbGVzOiAKKyAgICAgICBUaGUgc3RhcnQgYWRkcmVzcy4gKi8KKyAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7CisKKyAgICAgLyogVXNlZCBmb3IgaW5wdXQgYW5kIG91dHB1dCovCisgICAgdW5zaWduZWQgaW50IHN5bWNvdW50OworCisgICAgIC8qIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCovCisgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKKworICAgICAvKiBQb2ludGVyIHRvIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24qLworICAgIHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoX2luZm87CisKKyAgICAgLyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOiovCisgICAgUFRSIGFyZWx0X2RhdGE7ICAgICAgICAgICAgICAKKyAgICBzdHJ1Y3QgX2JmZCAqbXlfYXJjaGl2ZTsgICAgIAorICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgCisgICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICAKKyAgICBib29sZWFuIGhhc19hcm1hcDsgICAgICAgICAgIAorCisgICAgIC8qIFVzZWQgYnkgdGhlIGJhY2sgZW5kIHRvIGhvbGQgcHJpdmF0ZSBkYXRhLiAqLworCisgICAgdW5pb24gCisgICAgICB7CisgICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOworICAgICAgc3RydWN0IGFydGRhdGEgKmFvdXRfYXJfZGF0YTsKKyAgICAgIHN0cnVjdCBfb2FzeXNfZGF0YSAqb2FzeXNfb2JqX2RhdGE7CisgICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7CisgICAgICBzdHJ1Y3QgY29mZl90ZGF0YSAqY29mZl9vYmpfZGF0YTsKKyAgICAgIHN0cnVjdCBpZWVlX2RhdGFfc3RydWN0ICppZWVlX2RhdGE7CisgICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOworICAgICAgc3RydWN0IHNyZWNfZGF0YV9zdHJ1Y3QgKnNyZWNfZGF0YTsKKyAgICAgIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKKyAgICAgIHN0cnVjdCBlbGZfb2JqX3RkYXRhICplbGZfb2JqX2RhdGE7CisgICAgICBzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCAqYm91dF9kYXRhOworICAgICAgc3RydWN0IHN1bl9jb3JlX3N0cnVjdCAqc3VuX2NvcmVfZGF0YTsKKyAgICAgIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICp0cmFkX2NvcmVfZGF0YTsKKyAgICAgIHN0cnVjdCBocHBhX2RhdGFfc3RydWN0ICpocHBhX2RhdGE7CisgICAgICBQVFIgYW55OworICAgICAgfSB0ZGF0YTsKKyAgCisgICAgIC8qIFVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIGhvbGQgcHJpdmF0ZSBkYXRhKi8KKyAgICBQVFIgdXNyZGF0YTsKKworICAgICAvKiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzICovCisgICAgc3RydWN0IG9ic3RhY2sgbWVtb3J5OworCisgICAgIC8qIElzIHRoaXMgcmVhbGx5IG5lZWRlZCBpbiBhZGRpdGlvbiB0byB1c3JkYXRhPyAgKi8KKyAgICBhc3ltYm9sICoqbGRfc3ltYm9sczsKK307CisKK3Vuc2lnbmVkIGludCBFWEZVTihiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCAoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCkpOwordW5zaWduZWQgaW50IEVYRlVOKGJmZF9jYW5vbmljYWxpemVfcmVsb2MKKyAgICAsIChiZmQgKmFiZmQsCisgICAgYXNlY3Rpb24gKnNlYywKKyAgICBhcmVsZW50ICoqbG9jLAorICAgIGFzeW1ib2wJKipzeW1zKSk7Citib29sZWFuIEVYRlVOKGJmZF9zZXRfZmlsZV9mbGFncywgKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKK3ZvaWQgRVhGVU4oYmZkX3NldF9yZWxvYworICAgICwgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQorICAgIAorICAgICk7Citib29sZWFuIEVYRlVOKGJmZF9zZXRfc3RhcnRfYWRkcmVzcywgKGJmZCAqLCBiZmRfdm1hKSk7Citsb25nIEVYRlVOKGJmZF9nZXRfbXRpbWUsIChiZmQgKikpOworI2RlZmluZSBiZmRfc2l6ZW9mX2hlYWRlcnMoYWJmZCwgcmVsb2MpIFwKKyAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2l6ZW9mX2hlYWRlcnMsIChhYmZkLCByZWxvYykpCisKKyNkZWZpbmUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSBcCisgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLCAgKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSkKKworICAgICAgICAvKiBEbyB0aGVzZSB0aHJlZSBkbyBhbnl0aGluZyB1c2VmdWwgYXQgYWxsLCBmb3IgYW55IGJhY2sgZW5kPyAgKi8KKyNkZWZpbmUgYmZkX2RlYnVnX2luZm9fc3RhcnQoYWJmZCkgXAorICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYWJmZCkpCisKKyNkZWZpbmUgYmZkX2RlYnVnX2luZm9fZW5kKGFiZmQpIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19lbmQsIChhYmZkKSkKKworI2RlZmluZSBiZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlKGFiZmQsIHNlY3Rpb24pIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYWJmZCwgc2VjdGlvbikpCisKKworI2RlZmluZSBiZmRfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KSBcCisgICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3N0YXRfYXJjaF9lbHQsKGFiZmQsIHN0YXQpKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaSkgXAorICAgICAgICBCRkRfU0VORCAoYSwgX2JmZF9jb2ZmX3N3YXBfYXV4X2luLCAoYSxlLHQsYyxpKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9pbihhLGUsaSkgXAorICAgICAgICBCRkRfU0VORCAoYSwgX2JmZF9jb2ZmX3N3YXBfc3ltX2luLCAoYSxlLGkpKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luKGEsZSxpKSBcCisgICAgICAgIEJGRF9TRU5EICggYSwgX2JmZF9jb2ZmX3N3YXBfbGluZW5vX2luLCAoYSxlLGkpKQorCisjZGVmaW5lIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2gpXAorICAgICAgICBCRkRfU0VORCAoIGFiZmQsIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGFiZmQsIGFyY2gsIG1hY2gpKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KGFiZmQsIGksIG8pIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY29mZl9zd2FwX3JlbG9jX291dCwgKGFiZmQsIGksIG8pKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dChhYmZkLCBpLCBvKSBcCisgICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0LCAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KGFiZmQsIGksIHQsYyxvKSBcCisgICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2NvZmZfc3dhcF9hdXhfb3V0LCAoYWJmZCwgaSx0LGMsIG8pKQorCisjZGVmaW5lIGJmZF9jb2ZmX3N3YXBfc3ltX291dChhYmZkLCBpLG8pIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY29mZl9zd2FwX3N5bV9vdXQsIChhYmZkLCBpLCBvKSkKKworI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQoYWJmZCwgaSxvKSBcCisgICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0LCAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dChhYmZkLCBpLG8pIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCBpLG8pIFwKKyAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0LCAoYWJmZCwgaSwgbykpCisKKyNkZWZpbmUgYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyhhYmZkLCBzZWNsZXQsIGRhdGEpIFwKKwlCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIChhYmZkLCBzZWNsZXQsIGRhdGEpKQorIAorI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSBcCisgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVsYXhfc2VjdGlvbiwgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQorc3ltaW5kZXggRVhGVU4oYmZkX2dldF9uZXh0X21hcGVudCwgKGJmZCAqLCBzeW1pbmRleCBwcmV2aW91cywgY2Fyc3ltICoqIHN5bSkpOworYm9vbGVhbiBFWEZVTihiZmRfc2V0X2FyY2hpdmVfaGVhZCwgKGJmZCAqb3V0cHV0LCBiZmQgKm5ld19oZWFkKSk7CitiZmQgKkVYRlVOKGJmZF9nZXRfZWx0X2F0X2luZGV4LCAoYmZkICogYXJjaGl2ZSwgaW50IGluZGV4KSk7CitiZmQqIEVYRlVOKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUsIChiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpKTsKK0NPTlNUIGNoYXIgKkVYRlVOKGJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLCAoYmZkICopKTsKK2ludCBFWEZVTihiZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCAoYmZkICopKTsKK2Jvb2xlYW4gRVhGVU4oY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCisgICAgLCAoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOworI2RlZmluZSBTREVGKHJldCwgbmFtZSwgYXJnbGlzdCkgXAorICAgICAgICAgICAgICAgIFBST1RPKHJldCwoKm5hbWUpLGFyZ2xpc3QpCisjZGVmaW5lIFNERUZfRk1UKHJldCwgbmFtZSwgYXJnbGlzdCkgXAorICAgICAgICAgICAgICAgIFBST1RPKHJldCwoKm5hbWVbYmZkX3R5cGVfZW5kXSksYXJnbGlzdCkKKyNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCisgICAgICAgICAgICAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KQorI2RlZmluZSBCRkRfU0VORF9GTVQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCisgICAgICAgICAgICAoKChiZmQpLT54dmVjLT5tZXNzYWdlWyhpbnQpKChiZmQpLT5mb3JtYXQpXSkgYXJnbGlzdCkKK3R5cGVkZWYgc3RydWN0IGJmZF90YXJnZXQKK3sKKyAgY2hhciAqbmFtZTsKKyAgZW51bSB0YXJnZXRfZmxhdm91ciB7CisgICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgICAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCisgICAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCisgICAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKKyAgICBiZmRfdGFyZ2V0X2llZWVfZmxhdm91ciwKKyAgICBiZmRfdGFyZ2V0X29hc3lzX2ZsYXZvdXIsCisgICAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKKyAgICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKKyAgICBiZmRfdGFyZ2V0X2hwcGFfZmxhdm91cn0gZmxhdm91cjsKKyAgYm9vbGVhbiBieXRlb3JkZXJfYmlnX3A7CisgIGJvb2xlYW4gaGVhZGVyX2J5dGVvcmRlcl9iaWdfcDsKKyAgZmxhZ3dvcmQgb2JqZWN0X2ZsYWdzOyAgICAgICAKKyAgZmxhZ3dvcmQgc2VjdGlvbl9mbGFnczsKKyAgY2hhciBzeW1ib2xfbGVhZGluZ19jaGFyOworICBjaGFyIGFyX3BhZF9jaGFyOyAgICAgICAgICAgIAorIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOworICB1bnNpZ25lZCBpbnQgYWxpZ25fcG93ZXJfbWluOworICBTREVGIChiZmRfdm1hLCAgICAgIGJmZF9nZXR4NjQsIChiZmRfYnl0ZSAqKSk7CisgIFNERUYgKHZvaWQsICAgICAgICAgYmZkX3B1dHg2NCwgKGJmZF92bWEsIGJmZF9ieXRlICopKTsKKyAgU0RFRiAoYmZkX3ZtYSwgYmZkX2dldHgzMiwgKGJmZF9ieXRlICopKTsKKyAgU0RFRiAodm9pZCwgICAgICAgICBiZmRfcHV0eDMyLCAoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOworICBTREVGIChiZmRfdm1hLCBiZmRfZ2V0eDE2LCAoYmZkX2J5dGUgKikpOworICBTREVGICh2b2lkLCAgICAgICAgIGJmZF9wdXR4MTYsIChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisgIFNERUYgKGJmZF92bWEsICAgYmZkX2hfZ2V0eDY0LCAoYmZkX2J5dGUgKikpOworICBTREVGICh2b2lkLCAgICAgICAgICBiZmRfaF9wdXR4NjQsIChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7CisgIFNERUYgKGJmZF92bWEsICBiZmRfaF9nZXR4MzIsIChiZmRfYnl0ZSAqKSk7CisgIFNERUYgKHZvaWQsICAgICAgICAgIGJmZF9oX3B1dHgzMiwgKGJmZF92bWEsIGJmZF9ieXRlICopKTsKKyAgU0RFRiAoYmZkX3ZtYSwgIGJmZF9oX2dldHgxNiwgKGJmZF9ieXRlICopKTsKKyAgU0RFRiAodm9pZCwgICAgICAgICAgYmZkX2hfcHV0eDE2LCAoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOworICBTREVGX0ZNVCAoc3RydWN0IGJmZF90YXJnZXQgKiwgX2JmZF9jaGVja19mb3JtYXQsIChiZmQgKikpOworICBTREVGX0ZNVCAoYm9vbGVhbiwgICAgICAgICAgICBfYmZkX3NldF9mb3JtYXQsIChiZmQgKikpOworICBTREVGX0ZNVCAoYm9vbGVhbiwgICAgICAgICAgICBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYmZkICopKTsKKyAgU0RFRiAoY2hhciAqLCBfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwgKGJmZCAqKSk7CisgIFNERUYgKGludCwgICAgX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwgKGJmZCAqKSk7CisgIFNERUYgKGJvb2xlYW4sIF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AsIChiZmQgKiwgYmZkICopKTsKKyBTREVGIChib29sZWFuLCBfYmZkX3NsdXJwX2FybWFwLCAoYmZkICopKTsKKyBTREVGIChib29sZWFuLCBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUsIChiZmQgKikpOworIFNERUYgKHZvaWQsICAgX2JmZF90cnVuY2F0ZV9hcm5hbWUsIChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKKyBTREVGIChib29sZWFuLCB3cml0ZV9hcm1hcCwgKGJmZCAqYXJjaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcmwgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkeCkpOworICBTREVGIChib29sZWFuLCBfY2xvc2VfYW5kX2NsZWFudXAsIChiZmQgKikpOworICBTREVGIChib29sZWFuLCBfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzLCAoYmZkICosIHNlY19wdHIsIFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKKyAgU0RFRiAoYm9vbGVhbiwgX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cywgKGJmZCAqLCBzZWNfcHRyLCBQVFIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOworICBTREVGIChib29sZWFuLCBfbmV3X3NlY3Rpb25faG9vaywgKGJmZCAqLCBzZWNfcHRyKSk7CisgIFNERUYgKHVuc2lnbmVkIGludCwgX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIChiZmQgKikpOworICBTREVGICh1bnNpZ25lZCBpbnQsIF9iZmRfY2Fub25pY2FsaXplX3N5bXRhYiwKKyAgICAgICAgICAgKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7CisgIFNERUYgKHVuc2lnbmVkIGludCwgX2dldF9yZWxvY191cHBlcl9ib3VuZCwgKGJmZCAqLCBzZWNfcHRyKSk7CisgIFNERUYgKHVuc2lnbmVkIGludCwgX2JmZF9jYW5vbmljYWxpemVfcmVsb2MsIChiZmQgKiwgc2VjX3B0ciwgYXJlbGVudCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSoqKSk7CisgIFNERUYgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICosIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChiZmQgKikpOworICBTREVGICh2b2lkLCAgICAgX2JmZF9wcmludF9zeW1ib2wsIChiZmQgKiwgUFRSLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKKyNkZWZpbmUgYmZkX3ByaW50X3N5bWJvbChiLHAscyxlKSBCRkRfU0VORChiLCBfYmZkX3ByaW50X3N5bWJvbCwgKGIscCxzLGUpKQorICBTREVGIChhbGVudCAqLCAgIF9nZXRfbGluZW5vLCAoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICopKTsKKworICBTREVGIChib29sZWFuLCAgIF9iZmRfc2V0X2FyY2hfbWFjaCwgKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKSk7CisKKyAgU0RFRiAoYmZkICosICBvcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUsIChiZmQgKmFyY2gsIGJmZCAqcHJldikpOworICBTREVGIChib29sZWFuLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLAorICAgICAgICAoYmZkICphYmZkLCBzdHJ1Y3Qgc2VjICAqc2VjdGlvbiwKKyAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoqc3ltYm9scyxiZmRfdm1hIG9mZnNldCwKKyAgICAgICAgQ09OU1QgY2hhciAqKmZpbGUsIENPTlNUIGNoYXIgKipmdW5jLCB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKKyAgU0RFRiAoaW50LCAgICBfYmZkX3N0YXRfYXJjaF9lbHQsIChiZmQgKiwgc3RydWN0IHN0YXQgKikpOworCisgIFNERUYgKGludCwgICAgX2JmZF9zaXplb2ZfaGVhZGVycywgKGJmZCAqLCBib29sZWFuKSk7CisKKyAgU0RFRiAodm9pZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYmZkICopKTsKKyAgU0RFRiAodm9pZCwgX2JmZF9kZWJ1Z19pbmZvX2VuZCwgKGJmZCAqKSk7CisgIFNERUYgKHZvaWQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYmZkICosIHN0cnVjdCBzZWMgICopKTsKKyAgU0RFRiAoYmZkX2J5dGUgKiwgX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsIChiZmQqLHN0cnVjdCBiZmRfc2VjbGV0X3N0cnVjdCAqLCBiZmRfYnl0ZSAqZGF0YSkpOworICBTREVGIChib29sZWFuLF9iZmRfcmVsYXhfc2VjdGlvbiwoYmZkICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOworICBTREVGKHZvaWQsIF9iZmRfY29mZl9zd2FwX2F1eF9pbiwoCisgICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAorICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCisgICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCisgICAgICAgaW50ICAgICAgICAgICAgIGNsYXNzICwKKyAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKKworICBTREVGKHZvaWQsIF9iZmRfY29mZl9zd2FwX3N5bV9pbiwoCisgICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAorICAgICAgIFBUUiAgICAgICAgICAgICBleHQsCisgICAgICAgUFRSICAgICAgICAgICAgIGluKSk7CisKKyAgU0RFRih2b2lkLCBfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4sICAoCisgICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCisgICAgICAgUFRSICAgICAgICAgICAgZXh0LAorICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOworCisgU0RFRih1bnNpZ25lZCBpbnQsIF9iZmRfY29mZl9zd2FwX2F1eF9vdXQsKAorICAgICAgIGJmZCAgIAkqYWJmZCwKKyAgICAgICBQVFIJaW4sCisgICAgICAgaW50ICAgIAl0eXBlLAorICAgICAgIGludCAgICAJY2xhc3MsCisgICAgICAgUFRSICAgIAlleHQpKTsKKworIFNERUYodW5zaWduZWQgaW50LCBfYmZkX2NvZmZfc3dhcF9zeW1fb3V0LCgKKyAgICAgIGJmZCAgICAgICphYmZkLAorICAgICAgUFRSCWluLAorICAgICAgUFRSCWV4dCkpOworCisgU0RFRih1bnNpZ25lZCBpbnQsIF9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQsKAorICAgICAgCWJmZCAgIAkqYWJmZCwKKyAgICAgIAlQVFIJaW4sCisJUFRSCWV4dCkpOworCisgU0RFRih1bnNpZ25lZCBpbnQsIF9iZmRfY29mZl9zd2FwX3JlbG9jX291dCwoCisgICAgICAJYmZkICAgICAqYWJmZCwKKyAgICAgCVBUUglzcmMsCisJUFRSCWRzdCkpOworCisgU0RFRih1bnNpZ25lZCBpbnQsIF9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfb3V0LCgKKyAgICAgIAliZmQgIAkqYWJmZCwKKwlQVFIgCWluLAorCVBUUiAJb3V0KSk7CisKKyBTREVGKHVuc2lnbmVkIGludCwgX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQsKAorICAgICAgCWJmZCAJKmFiZmQsCisJUFRSIAlpbiwKKwlQVFIJb3V0KSk7CisKKyBTREVGKHVuc2lnbmVkIGludCwgX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCwoCisgICAgICAJYmZkICAJKmFiZmQsCisgICAgICAJUFRSCWluLAorCVBUUglvdXQpKTsKKworICAvKiBTZWUgZG9jdW1lbnRhdGlvbiBvbiByZWxvYyB0eXBlcy4gICovCisgU0RFRiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqLAorICAgICAgIHJlbG9jX3R5cGVfbG9va3VwLAorICAgICAgIChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7CisKKyAgLyogQ29tcGxldGUgYW5kIHV0dGVyIGNyb2NrLCBjdXJyZW50bHkgdXNlZCBmb3IgdGhlIGFzc2VtYmxlcgorICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICovCisgU0RFRiAoYXN5bWJvbCAqLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoCisgICAgICAgYmZkICphYmZkLAorICAgICAgIHZvaWQgKnB0ciwKKyAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKKyBQVFIgYmFja2VuZF9kYXRhOworfSBiZmRfdGFyZ2V0OworYmZkX3RhcmdldCAqRVhGVU4oYmZkX2ZpbmRfdGFyZ2V0LCAoQ09OU1QgY2hhciAqLCBiZmQgKikpOworQ09OU1QgY2hhciAqKkVYRlVOKGJmZF90YXJnZXRfbGlzdCwgKHZvaWQpKTsKK2Jvb2xlYW4gRVhGVU4oYmZkX2NoZWNrX2Zvcm1hdCwgKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpKTsKK2Jvb2xlYW4gRVhGVU4oYmZkX3NldF9mb3JtYXQsIChiZmQgKiwgYmZkX2Zvcm1hdCkpOworQ09OU1QgY2hhciAqRVhGVU4oYmZkX2Zvcm1hdF9zdHJpbmcsIChiZmRfZm9ybWF0KSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZy55IGIvZGVidWdnZXIvZGJnLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlOGQzNAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2RiZy55CkBAIC0wLDAgKzEsMTUxIEBACisKKyV7CisKKy8qIFBhcnNlciBmb3IgY29tbWFuZCBsaW5lcyBpbiB0aGUgV2luZSBkZWJ1Z2dlcgorICoKKyAqIFZlcnNpb24gMS4wCisgKiBFcmljIFlvdW5nZGFsZQorICogOS85MworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBZWVNUWVBFIGludAorCisjaW5jbHVkZSAicmVncG9zLmgiCitleHRlcm4gRklMRSAqIHl5aW47Cit1bnNpZ25lZCBpbnQgKiByZWd2YWwgPSBOVUxMOwordW5zaWduZWQgaW50IGRiZ19tYXNrID0gMDsKK3Vuc2lnbmVkIGludCBkYmdfbW9kZSA9IDA7CisKK3ZvaWQgaXNzdWVfcHJvbXB0KCk7CislfQorCisKKyV0b2tlbiBDT05UCisldG9rZW4gUVVJVAorJXRva2VuIEhFTFAKKyV0b2tlbiBJTkZPCisldG9rZW4gU1RBQ0sKKyV0b2tlbiBSRUcKKyV0b2tlbiBSRUdTCisldG9rZW4gTlVNCisldG9rZW4gU0VUCisldG9rZW4gUFJJTlQKKyV0b2tlbiBJREVOVElGSUVSCisldG9rZW4gTk9fU1lNQk9MCisldG9rZW4gU1lNQk9MRklMRQorJXRva2VuIERFRklORQorCislJQorCisgaW5wdXQ6ICAvKiBlbXB0eSAqLworCXwgaW5wdXQgbGluZSAgeyBpc3N1ZV9wcm9tcHQoKTsgfQorCisgbGluZToJCSdcbicKKwl8IGluZm9jbWQgJ1xuJworCXwgZXJyb3IgJ1xuJyAgICAgICB7eXllcnJvazsgfQorCXwgUVVJVCAgJ1xuJyAgICAgICB7IGV4aXQoMCk7IH07CisJfCBIRUxQICAnXG4nICAgICAgIHsgZGJnX2hlbHAoKTsgfTsKKwl8IENPTlQgJ1xuJyAgICAgICAgeyByZXR1cm47IH07CisJfCBTWU1CT0xGSUxFIElERU5USUZJRVIgJ1xuJyB7IHJlYWRfc3ltYm9sdGFibGUoJDIpOyB9OworCXwgREVGSU5FIElERU5USUZJRVIgZXhwciAnXG4nICB7IGFkZF9oYXNoKCQyLCAkMyk7IH07CisJfCB4X2NvbW1hbmQKKwl8IHByaW50X2NvbW1hbmQKKwl8IGRlcG9zaXRfY29tbWFuZAorCitkZXBvc2l0X2NvbW1hbmQ6CisJU0VUIFJFRyAnPScgZXhwciAnXG4nIHsgcmVndmFsWyQyXSA9ICQ0OyB9CisJfCBTRVQgJyonIGV4cHIgJz0nIGV4cHIgJ1xuJyB7ICooKHVuc2lnbmVkIGludCAqKSAkMykgPSAkNTsgfQorCXwgU0VUIHN5bWJvbCAnPScgZXhwciAnXG4nIHsgKigodW5zaWduZWQgaW50ICopICQyKSA9ICQ0OyB9CisKKworeF9jb21tYW5kOgorCSAgJ3gnIGV4cHIgICdcbicgeyBleGFtaW5lX21lbW9yeSgkMiwgMSwgJ3gnKTsgfTsKKwl8ICd4JyAnLycgZm10IGV4cHIgICdcbicgeyBleGFtaW5lX21lbW9yeSgkNCwgMSwgJDMpOyB9OworCXwgJ3gnICcvJyBOVU0gZm10IGV4cHIgICdcbicgeyBleGFtaW5lX21lbW9yeSgkNSwgJDMsICQ0KTsgfTsKKworIHByaW50X2NvbW1hbmQ6CisJUFJJTlQgZXhwciAgJ1xuJyB7IGV4YW1pbmVfbWVtb3J5KCgodW5zaWduZWQgaW50KSAmJDIgKSwgMSwgJ3gnKTsgfTsKKworIGZtdDogICd4JyAgICAgeyAkJCA9ICd4JzsgfQorCXwgJ2QnICB7ICQkID0gJ2QnOyB9CisJfCAnaScgIHsgJCQgPSAnaSc7IH0KKwl8ICd3JyAgeyAkJCA9ICd3JzsgfQorCXwgJ3MnICB7ICQkID0gJ3MnOyB9CisJfCAnYycgIHsgJCQgPSAnYyc7IH0KKwl8ICdiJyB7ICQkID0gJ2InOyB9CisKKyBzeW1ib2w6IElERU5USUZJRVIgICAgICAgICAgICAgeyAkJCA9IGZpbmRfaGFzaCgkMSk7CisJCQkgICAgICAgICAgIGlmKCQkID09IDB4ZmZmZmZmZmYpIHsKKwkJCQkJICAgZnByaW50ZihzdGRlcnIsIlN5bWJvbCAlcyBub3QgZm91bmRcbiIsICQxKTsKKwkJCQkJICAgWVlFUlJPUjsKKwkJCQkgICB9OworCQkJICAgICAgICB9OyAKKworIGV4cHI6ICBOVU0JCQl7ICQkID0gJDE7CX0KKwl8IFJFRwkJCXsgJCQgPSByZWd2YWxbJDFdOyB9CisJfCBzeW1ib2wgICAJCXsgJCQgPSAqKCh1bnNpZ25lZCBpbnQgKikgJDEpOyB9CisJfCBleHByICcrJyBOVU0JCXsgJCQgPSAkMSArICQzOyB9CisJfCBleHByICctJyBOVU0JCXsgJCQgPSAkMSAtICQzOyB9OworCXwgJygnIGV4cHIgJyknCQl7ICQkID0gJDI7IH07CisJfCAnKicgZXhwcgkJeyAkJCA9ICooKHVuc2lnbmVkIGludCAqKSAkMik7IH07CisJCisgaW5mb2NtZDogSU5GTyBSRUdTIHsgaW5mb19yZWcoKTsgfQorCXwgSU5GTyBTVEFDSyAgeyBpbmZvX3N0YWNrKCk7IH07CisKKworJSUKKwordm9pZCAKK2lzc3VlX3Byb21wdCgpeworI2lmbmRlZiBVU0VfUkVBRExJTkUKKwlmcHJpbnRmKHN0ZGVyciwiV2luZS1kYmc+Iik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBsb2FkZWRfc3ltYm9scyA9IDA7CisKK3ZvaWQKK3dpbmVfZGVidWcoaW50ICogcmVncykKK3sKKwlpbnQgaTsKKyNpZmRlZiBZWURFQlVHCisJeXlkZWJ1ZyA9IDA7CisjZW5kaWYKKwl5eWluID0gc3RkaW47CisJcmVndmFsID0gcmVnczsKKworCS8qIFRoaXMgb25seSB3b3JrcyBmb3IgbGludXggLSBOZXRCU0Qgd2lsbCBuZWVkIHNvbWV0aGluZyBkaWZmZXJlbnQgaGVyZS4gKi8KKwlpZigoU0NfQ1MgJiA3KSAhPSA3KSB7CisJCWRiZ19tYXNrID0gMHhmZmZmZmZmZjsKKwkJZGJnX21vZGUgPSAzMjsKKwl9IGVsc2UgeworCQlkYmdfbWFzayA9IDB4ZmZmZjsKKwkJZGJnX21vZGUgPSAxNjsKKwl9OworCisJLyogVGhpcyBpcyBpbnRlbmRlZCB0byByZWFkIHRoZSBlbnRyeSBwb2ludHMgZnJvbSB0aGUgV2luZG93cyBpbWFnZSwgYW5kCisJICAgaW5zZXJ0IHRoZW0gaW4gdGhlIGhhc2ggdGFibGUuICBJdCBkb2VzIG5vdCB3b3JrIHlldCwgc28gaXQgaXMgY29tbWVudGVkIG91dC4gKi8KKyNpZiAwCisJaWYoIWxvYWRlZF9zeW1ib2xzKXsKKwkJbG9hZGVkX3N5bWJvbHMrKzsKKwkJbG9hZF9lbnRyeXBvaW50cygpOworCX07CisjZW5kaWYKKworCS8qIFNob3cgd2hlcmUgd2UgY3Jhc2hlZCAqLworCWV4YW1pbmVfbWVtb3J5KFNDX0VJUChkYmdfbWFzayksIDEsICdpJyk7CisKKwlpc3N1ZV9wcm9tcHQoKTsKKworCXl5cGFyc2UoKTsKKwlmbHVzaF9zeW1ib2xzKCk7CisJZnByaW50ZihzdGRlcnIsIlJldHVybmluZyB0byBXaW5lLi4uXG4iKTsKKworfQorCisKK3l5ZXJyb3IoY2hhciAqIHMpeworCWZwcmludGYoc3RkZXJyLCIlc1xuIiwgcyk7Cit9CisKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RlYnVnLmwgYi9kZWJ1Z2dlci9kZWJ1Zy5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzdkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9kZWJ1Zy5sCkBAIC0wLDAgKzEsMTk3IEBACisKKworLyogTGV4aWNhbCBzY2FubmVyIGZvciBjb21tYW5kIGxpbmUgcGFyc2luZyBpbiB0aGUgV2luZSBkZWJ1Z2dlcgorICoKKyAqIFZlcnNpb24gMS4wCisgKiBFcmljIFlvdW5nZGFsZQorICogOS85MworICovCisKKyV7CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkYmcudGFiLmgiCisjaW5jbHVkZSAicmVncG9zLmgiCisKKyNpZmRlZiBVU0VfUkVBRExJTkUKKyN1bmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCisJaWYgKCAocmVzdWx0ID0gZGJnX3JlYWQoKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSApKSA8IDAgKSBcCisJICAgIFlZX0ZBVEFMX0VSUk9SKCAicmVhZCgpIGluIGZsZXggc2Nhbm5lciBmYWlsZWQiICk7CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKiByZWFkbGluZShjaGFyICopOworc3RhdGljIGNoYXIgKiBtYWtlX3N5bWJvbChjaGFyICopOwordm9pZCBmbHVzaF9zeW1ib2xzKCk7CitzdGF0aWMgaW50IHN5bnRheF9lcnJvcjsKKyV9CisKK0RJR0lUCVswLTldCitIRVhESUdJVCBbMC05YS1mQS1GXQorCitJREVOVElGSUVSIFtfYS16QS1aXC5+XVtfYS16QS1aMC05XC5+XSoKKworJSUKKworXG4JCXsgc3ludGF4X2Vycm9yID0gMDsgcmV0dXJuICdcbic7IH0gLyogSW5kaWNhdGUgZW5kIG9mIGNvbW1hbmQgKi8KKworIisiCQl7IHJldHVybiAnKyc7IH0gCisKKyItIgkJeyByZXR1cm4gJy0nOyB9IAorCisiLyIJCXsgcmV0dXJuICcvJzsgfSAKKworIj0iCQl7IHJldHVybiAnPSc7IH0gCisKKyIoIgkJeyByZXR1cm4gJygnOyB9IAorCisiKSIJCXsgcmV0dXJuICcpJzsgfSAKKworIioiCQl7IHJldHVybiAnKic7IH0gCisKKyI/IgkJeyByZXR1cm4gSEVMUDsgfQorCisiMHgiK3tIRVhESUdJVH0rICAgeworCQlzc2NhbmYoeXl0ZXh0LCAiJWx4IiwgJnl5bHZhbCk7CisJCXJldHVybiBOVU07CisJCX0KKwore0RJR0lUfSsgICB7CisJCXNzY2FuZih5eXRleHQsICIlbHgiLCAmeXlsdmFsKTsKKwkJcmV0dXJuIE5VTTsKKwkJfQorCiskcGMJCXsgeXlsdmFsID0gUk5fRUlQOyByZXR1cm4gUkVHO30KKyRzcAkJeyB5eWx2YWwgPSBSTl9FU1A7IHJldHVybiBSRUc7fQorJGVpcAkJeyB5eWx2YWwgPSBSTl9FSVA7IHJldHVybiBSRUc7fQorJGVzcAkJeyB5eWx2YWwgPSBSTl9FU1A7IHJldHVybiBSRUc7fQorJGVicAkJeyB5eWx2YWwgPSBSTl9FQlA7IHJldHVybiBSRUc7fQorJGVheAkJeyB5eWx2YWwgPSBSTl9FQVg7IHJldHVybiBSRUc7fQorJGVieAkJeyB5eWx2YWwgPSBSTl9FQlg7IHJldHVybiBSRUc7fQorJGVjeAkJeyB5eWx2YWwgPSBSTl9FQ1g7IHJldHVybiBSRUc7fQorJGVkeAkJeyB5eWx2YWwgPSBSTl9FRFg7IHJldHVybiBSRUc7fQorJGVzaQkJeyB5eWx2YWwgPSBSTl9FU0k7IHJldHVybiBSRUc7fQorJGVkaQkJeyB5eWx2YWwgPSBSTl9FREk7IHJldHVybiBSRUc7fQorCitpbmZvfGluZnxpbgkJeyByZXR1cm4gSU5GTzsgfQorCitxdWl0fHF1aXxxdSAJeyByZXR1cm4gUVVJVDsgfQorCitoZWxwfGhlbHxoZQl7IHJldHVybiBIRUxQOyB9CisKK3NldHxzZQkJeyByZXR1cm4gU0VUOyB9CisKK2NvbnR8Y29ufGNvCQl7IHJldHVybiBDT05UOyB9CisKK3N5bWJvbGZpbGV8c3ltYm9sZmlsfHN5bWJvbGZpfHN5bWJvbGZ8c3ltYm9sfHN5bWJvfHN5bWIgeyByZXR1cm4gU1lNQk9MRklMRTsgfQorCitkZWZpbmV8ZGVmaW58ZGVmaXxkZWZ8ZGUgICAgICAgIHsgcmV0dXJuIERFRklORTsgfQorcHJpbnR8cHJpbnxwcml8cHIJCXsgcmV0dXJuIFBSSU5UOyB9CisKK3JlZ3N8cmVnfHJlCXsgcmV0dXJuIFJFR1M7IH0KKworc3RhY2t8c3RhY3xzdGF8c3QgICAgIAl7IHJldHVybiBTVEFDSzsgfQorCit4CQl7IHJldHVybiAneCc7IH0KK2QJCXsgcmV0dXJuICdkJzsgfQoraQkJeyByZXR1cm4gJ2knOyB9Cit3CQl7IHJldHVybiAndyc7IH0KK2IJCXsgcmV0dXJuICdiJzsgfQorcwkJeyByZXR1cm4gJ3MnOyB9CitjCQl7IHJldHVybiAnYyc7IH0KKwore0lERU5USUZJRVJ9CXt5eWx2YWwgPSAoaW50KSBtYWtlX3N5bWJvbCh5eXRleHQpOyAKKwkgICAgICAgICAgcmV0dXJuIElERU5USUZJRVI7CisJICAgICAgICAgfQorCitbIFx0XSsgICAgICAgIC8qIEVhdCB1cCB3aGl0ZXNwYWNlICovCisKKy4JCXsgaWYoc3ludGF4X2Vycm9yID09IDApIHsKKwkJc3ludGF4X2Vycm9yICsrOyBmcHJpbnRmKHN0ZGVyciwgIlN5bnRheCBFcnJvclxuIik7IH0KKwkJfQorCislJQorCisjaWZkZWYgVVNFX1JFQURMSU5FCisjaWZuZGVmIHdoaXRlc3BhY2UKKyNkZWZpbmUgd2hpdGVzcGFjZShjKSAoKChjKSA9PSAnICcpIHx8ICgoYykgPT0gJ1x0JykpCisjZW5kaWYKKworI2lmIDAKKy8qIFVzZWQgb25seSB3aXRoIEdOVSByZWFkbGluZSAqLworI2luY2x1ZGUgInJlYWRsaW5lL3JlYWRsaW5lLmgiCisjaW5jbHVkZSAicmVhZGxpbmUvY2hhcmRlZnMuaCIKKyNlbmRpZgorCitkYmdfcmVhZChjaGFyICogYnVmLCBpbnQgc2l6ZSl7CisJY2hhciAqIGxpbmU7CisJaW50IGxlbjsKKworCWRveworCQlmbHVzaF9zeW1ib2xzKCk7CisJCWxpbmUgPSByZWFkbGluZSAoIldpbmUtZGJnPiIpOworCQlsZW4gPSBzdHJsZW4obGluZSk7CisJCQkJCisJCWlmICghbGluZSkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBsaW5lLgorCQkJICAgVGhlbiwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCwgYWRkIGl0IHRvIHRoZSBoaXN0b3J5IGxpc3QKKwkJCSAgIGFuZCBleGVjdXRlIGl0LiAqLworCQkJc3RyaXB3aGl0ZSAobGluZSk7CisJCQkKKwkJCWlmICgqbGluZSkKKwkJCXsKKwkJCQlhZGRfaGlzdG9yeSAobGluZSk7CisJCQkJaWYoc2l6ZSA8IGxlbiArIDEpeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiRmF0YWwgcmVhZGxpbmUgZ29vZi5cbiIpOworCQkJCQlleGl0KDApOworCQkJCX07CisJCQkJc3RyY3B5KGJ1ZiwgbGluZSk7CisJCQkJYnVmW2xlbl0gPSAnXG4nOworCQkJCWJ1ZltsZW4rMV0gPSAwOworCQkJCWZyZWUobGluZSk7CisJCQkJcmV0dXJuIGxlbiArIDE7CisJCQl9CisJCX0KKworCX0gd2hpbGUgKDE9PTEpOworfQorCisvKiBTdHJpcCB3aGl0ZXNwYWNlIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgU1RSSU5HLiAqLworc3RyaXB3aGl0ZSAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIHJlZ2lzdGVyIGludCBpID0gMDsKKworICB3aGlsZSAod2hpdGVzcGFjZSAoc3RyaW5nW2ldKSkKKyAgICBpKys7CisKKyAgaWYgKGkpCisgICAgc3RyY3B5IChzdHJpbmcsIHN0cmluZyArIGkpOworCisgIGkgPSBzdHJsZW4gKHN0cmluZykgLSAxOworCisgIHdoaWxlIChpID4gMCAmJiB3aGl0ZXNwYWNlIChzdHJpbmdbaV0pKQorICAgIGktLTsKKworICBzdHJpbmdbKytpXSA9ICdcMCc7Cit9CisKK3N0YXRpYyBjaGFyICpsb2NhbF9zeW1ib2xzWzEwXTsKK3N0YXRpYyBpbnQgbmV4dF9zeW1ib2w7CisKK2NoYXIgKiBtYWtlX3N5bWJvbChjaGFyICogc3ltYm9sKXsKKwlyZXR1cm4gbG9jYWxfc3ltYm9sc1tuZXh0X3N5bWJvbCsrXSA9IHN0cmR1cChzeW1ib2wpOworfQorCit2b2lkCitmbHVzaF9zeW1ib2xzKCl7CisJd2hpbGUoLS1uZXh0X3N5bWJvbD49IDApIGZyZWUobG9jYWxfc3ltYm9sc1tuZXh0X3N5bWJvbF0pOworCW5leHRfc3ltYm9sID0gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kZWZzLmggYi9kZWJ1Z2dlci9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4OWRkMwotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2RlZnMuaApAQCAtMCwwICsxLDgxOCBAQAorLyogQmFzaWMsIGhvc3Qtc3BlY2lmaWMsIGFuZCB0YXJnZXQtc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChERUZTX0gpCisjZGVmaW5lIERFRlNfSCAxCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBGaXJzdCBpbmNsdWRlIGFuc2lkZWNsLmggc28gd2UgY2FuIHVzZSB0aGUgdmFyaW91cyBtYWNybyBkZWZpbml0aW9ucworICAgaGVyZSBhbmQgaW4gYWxsIHN1YnNlcXVlbnQgZmlsZSBpbmNsdXNpb25zLiAgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKy8qIEFuIGFkZHJlc3MgaW4gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICBIb3N0IGJ5dGUgb3JkZXIuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgQ09SRV9BRERSOworCisjZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBtYXgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKworLyogVGhlIGNoYXJhY3RlciBDKysgdXNlcyB0byBidWlsZCBpZGVudGlmaWVycyB0aGF0IG11c3QgYmUgdW5pcXVlIGZyb20KKyAgIHRoZSBwcm9ncmFtJ3MgaWRlbnRpZmllcnMgKHN1Y2ggYXMgJHRoaXMgYW5kICQkdnB0cikuICAqLworI2RlZmluZSBDUExVU19NQVJLRVIgJyQnCS8qIE1heSBiZSBvdmVycmlkZGVuIHRvICcuJyBmb3IgU3lzViAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4JCS8qIFN5c3RlbSBjYWxsIGVycm9yIHJldHVybiBzdGF0dXMgKi8KKworZXh0ZXJuIGludCBxdWl0X2ZsYWc7CitleHRlcm4gaW50IGltbWVkaWF0ZV9xdWl0OworCitleHRlcm4gdm9pZAorcXVpdCBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgUVVJVCB7IGlmIChxdWl0X2ZsYWcpIHF1aXQgKCk7IH0KKworLyogQ29tbWFuZCBjbGFzc2VzIGFyZSB0b3AtbGV2ZWwgY2F0ZWdvcmllcyBpbnRvIHdoaWNoIGNvbW1hbmRzIGFyZSBicm9rZW4KKyAgIGRvd24gZm9yICJoZWxwIiBwdXJwb3Nlcy4gIAorICAgTm90ZXMgb24gY2xhc3NlczogY2xhc3NfYWxpYXMgaXMgZm9yIGFsaWFzIGNvbW1hbmRzIHdoaWNoIGFyZSBub3QKKyAgIGFiYnJldmlhdGlvbnMgb2YgdGhlIG9yaWdpbmFsIGNvbW1hbmQuICBjbGFzcy1wc2V1ZG8gaXMgZm9yIGNvbW1hbmRzCisgICB3aGljaCBhcmUgbm90IHJlYWxseSBjb21tYW5kcyBub3IgaGVscCB0b3BpY3MgKCJzdG9wIikuICAqLworCitlbnVtIGNvbW1hbmRfY2xhc3MKK3sKKyAgLyogU3BlY2lhbCBhcmdzIHRvIGhlbHBfbGlzdCAqLworICBhbGxfY2xhc3NlcyA9IC0yLCBhbGxfY29tbWFuZHMgPSAtMSwKKyAgLyogQ2xhc3NlcyBvZiBjb21tYW5kcyAqLworICBub19jbGFzcyA9IC0xLCBjbGFzc19ydW4gPSAwLCBjbGFzc192YXJzLCBjbGFzc19zdGFjaywKKyAgY2xhc3NfZmlsZXMsIGNsYXNzX3N1cHBvcnQsIGNsYXNzX2luZm8sIGNsYXNzX2JyZWFrcG9pbnQsCisgIGNsYXNzX2FsaWFzLCBjbGFzc19vYnNjdXJlLCBjbGFzc191c2VyLCBjbGFzc19tYWludGVuYW5jZSwKKyAgY2xhc3NfcHNldWRvCit9OworCisvKiB0aGUgY2xlYW51cCBsaXN0IHJlY29yZHMgdGhpbmdzIHRoYXQgaGF2ZSB0byBiZSB1bmRvbmUKKyAgIGlmIGFuIGVycm9yIGhhcHBlbnMgKGRlc2NyaXB0b3JzIHRvIGJlIGNsb3NlZCwgbWVtb3J5IHRvIGJlIGZyZWVkLCBldGMuKQorICAgRWFjaCBsaW5rIGluIHRoZSBjaGFpbiByZWNvcmRzIGEgZnVuY3Rpb24gdG8gY2FsbCBhbmQgYW4KKyAgIGFyZ3VtZW50IHRvIGdpdmUgaXQuCisKKyAgIFVzZSBtYWtlX2NsZWFudXAgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIGNsZWFudXAgY2hhaW4uCisgICBVc2UgZG9fY2xlYW51cHMgdG8gZG8gYWxsIGNsZWFudXAgYWN0aW9ucyBiYWNrIHRvIGEgZ2l2ZW4KKyAgIHBvaW50IGluIHRoZSBjaGFpbi4gIFVzZSBkaXNjYXJkX2NsZWFudXBzIHRvIHJlbW92ZSBjbGVhbnVwcworICAgZnJvbSB0aGUgY2hhaW4gYmFjayB0byBhIGdpdmVuIHBvaW50LCBub3QgZG9pbmcgdGhlbS4gICovCisKK3N0cnVjdCBjbGVhbnVwCit7CisgIHN0cnVjdCBjbGVhbnVwICpuZXh0OworICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOworICBQVFIgYXJnOworfTsKKworLyogRnJvbSBibG9ja2ZyYW1lLmMgKi8KKworZXh0ZXJuIGludAoraW5zaWRlX2VudHJ5X2Z1bmMgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK2V4dGVybiBpbnQKK2luc2lkZV9lbnRyeV9maWxlIFBBUkFNUyAoKENPUkVfQUREUiBhZGRyKSk7CisKK2V4dGVybiBpbnQKK2luc2lkZV9tYWluX2Z1bmMgUEFSQU1TICgoQ09SRV9BRERSIHBjKSk7CisKKy8qIEZyb20gY3BsdXMtZGVtLmMgKi8KKworZXh0ZXJuIGNoYXIgKgorY3BsdXNfZGVtYW5nbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKKworZXh0ZXJuIGNoYXIgKgorY3BsdXNfbWFuZ2xlX29wbmFtZSBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBGcm9tIGxpYm1tYWxsb2MuYSAobWVtb3J5IG1hcHBlZCBtYWxsb2MgbGlicmFyeSkgKi8KKworZXh0ZXJuIFBUUgorbW1hbGxvY19hdHRhY2ggUEFSQU1TICgoaW50LCBQVFIpKTsKKworZXh0ZXJuIFBUUgorbW1hbGxvY19kZXRhY2ggUEFSQU1TICgoUFRSKSk7CisKK2V4dGVybiBQVFIKK21tYWxsb2MgUEFSQU1TICgoUFRSLCBsb25nKSk7CisKK2V4dGVybiBQVFIKK21yZWFsbG9jIFBBUkFNUyAoKFBUUiwgUFRSLCBsb25nKSk7CisKK2V4dGVybiB2b2lkCittZnJlZSBQQVJBTVMgKChQVFIsIFBUUikpOworCitleHRlcm4gaW50CittbWFsbG9jX3NldGtleSBQQVJBTVMgKChQVFIsIGludCwgUFRSKSk7CisKK2V4dGVybiBQVFIKK21tYWxsb2NfZ2V0a2V5IFBBUkFNUyAoKFBUUiwgaW50KSk7CisKKy8qIEZyb20gdXRpbHMuYyAqLworCitleHRlcm4gY2hhciAqCitkZW1hbmdsZV9hbmRfbWF0Y2ggUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOworCitleHRlcm4gaW50CitzdHJjbXBfaXcgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKworZXh0ZXJuIGNoYXIgKgorc2FmZV9zdHJlcnJvciBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIGNoYXIgKgorc2FmZV9zdHJzaWduYWwgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkCitpbml0X21hbGxvYyBQQVJBTVMgKChQVFIpKTsKKworZXh0ZXJuIHZvaWQKK3JlcXVlc3RfcXVpdCBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2RvX2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICopKTsKKworZXh0ZXJuIHZvaWQKK2Rpc2NhcmRfY2xlYW51cHMgUEFSQU1TICgoc3RydWN0IGNsZWFudXAgKikpOworCisvKiBUaGUgYmFyZSBtYWtlX2NsZWFudXAgZnVuY3Rpb24gaXMgb25lIG9mIHRob3NlIHJhcmUgYmVhc3RzIHRoYXQKKyAgIHRha2VzIGFsbW9zdCBhbnkgdHlwZSBvZiBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJnIGFuZCBhbnl0aGluZyB0aGF0CisgICB3aWxsIGZpdCBpbiBhICJ2b2lkICoiIGFzIHRoZSBzZWNvbmQgYXJnLgorCisgICBTaG91bGQgYmUsIG9uY2UgYWxsIGNhbGxzIGFuZCBjYWxsZWQtZnVuY3Rpb25zIGFyZSBjbGVhbmVkIHVwOgorZXh0ZXJuIHN0cnVjdCBjbGVhbnVwICoKK21ha2VfY2xlYW51cCBQQVJBTVMgKCh2b2lkICgqZnVuY3Rpb24pIChQVFIpLCBQVFIpKTsKKworICAgVW50aWwgdGhlbiwgbGludCBhbmQvb3IgdmFyaW91cyB0eXBlLWNoZWNraW5nIGNvbXBpbGVyIG9wdGlvbnMgd2lsbAorICAgY29tcGxhaW4gYWJvdXQgbWFrZV9jbGVhbnVwIGNhbGxzLiAgSXQnZCBiZSB3cm9uZyB0byBqdXN0IGNhc3QgdGhpbmdzLAorICAgc2luY2UgdGhlIHR5cGUgYWN0dWFsbHkgcGFzc2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3b3VsZCBiZQorICAgd3JvbmcuICAqLworCitleHRlcm4gc3RydWN0IGNsZWFudXAgKgorbWFrZV9jbGVhbnVwICgpOworCitleHRlcm4gc3RydWN0IGNsZWFudXAgKgorc2F2ZV9jbGVhbnVwcyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCityZXN0b3JlX2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICopKTsKKworZXh0ZXJuIHZvaWQKK2ZyZWVfY3VycmVudF9jb250ZW50cyBQQVJBTVMgKChjaGFyICoqKSk7CisKK2V4dGVybiB2b2lkCitudWxsX2NsZWFudXAgUEFSQU1TICgoY2hhciAqKikpOworCitleHRlcm4gaW50CitteXJlYWQgUEFSQU1TICgoaW50LCBjaGFyICosIGludCkpOworCitleHRlcm4gaW50CitxdWVyeSAoKTsKKworZXh0ZXJuIHZvaWQKK3dyYXBfaGVyZSBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK3JlaW5pdGlhbGl6ZV9tb3JlX2ZpbHRlciBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQKK3ByaW50X2luc24gUEFSQU1TICgoQ09SRV9BRERSLCBDT1JFX0FERFIsIEZJTEUgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCitmcHV0c19maWx0ZXJlZCBQQVJBTVMgKChjb25zdCBjaGFyICosIEZJTEUgKikpOworCitleHRlcm4gdm9pZAorcHV0c19maWx0ZXJlZCBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK3ZmcHJpbnRmX2ZpbHRlcmVkICgpOworCitleHRlcm4gdm9pZAorZnByaW50Zl9maWx0ZXJlZCAoKTsKKworZXh0ZXJuIHZvaWQKK2ZwcmludGZpX2ZpbHRlcmVkICgpOworCitleHRlcm4gdm9pZAorcHJpbnRmX2ZpbHRlcmVkICgpOworCitleHRlcm4gdm9pZAorcHJpbnRmaV9maWx0ZXJlZCAoKTsKKworZXh0ZXJuIHZvaWQKK3ByaW50X3NwYWNlcyBQQVJBTVMgKChpbnQsIEZJTEUgKikpOworCitleHRlcm4gdm9pZAorcHJpbnRfc3BhY2VzX2ZpbHRlcmVkIFBBUkFNUyAoKGludCwgRklMRSAqKSk7CisKK2V4dGVybiBjaGFyICoKK25fc3BhY2VzIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gdm9pZAorcHJpbnRjaGFyIFBBUkFNUyAoKGludCwgRklMRSAqLCBpbnQpKTsKKworZXh0ZXJuIGNoYXIgKgorc3RyZHVwX2RlbWFuZ2xlZCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2ZwcmludF9zeW1ib2wgUEFSQU1TICgoRklMRSAqLCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2ZwdXRzX2RlbWFuZ2xlZCBQQVJBTVMgKChjaGFyICosIEZJTEUgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCitwZXJyb3Jfd2l0aF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCitleHRlcm4gdm9pZAorcHJpbnRfc3lzX2Vycm1zZyBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBGcm9tIHJlZ2V4LmMgKi8KKworZXh0ZXJuIGNoYXIgKgorcmVfY29tcCBQQVJBTVMgKChjaGFyICopKTsKKworLyogRnJvbSBzeW1maWxlLmMgKi8KKworZXh0ZXJuIHZvaWQKK3N5bWJvbF9maWxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworLyogRnJvbSBtYWluLmMgKi8KKworZXh0ZXJuIGNoYXIgKgorc2tpcF9xdW90ZWQgUEFSQU1TICgoY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICoKK2dkYl9yZWFkbGluZSBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIGNoYXIgKgorY29tbWFuZF9saW5lX2lucHV0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCitwcmludF9wcm9tcHQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gaW50CitiYXRjaF9tb2RlIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludAoraW5wdXRfZnJvbV90ZXJtaW5hbF9wIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludAorY2F0Y2hfZXJyb3JzIFBBUkFNUyAoKGludCAoKikgKGNoYXIgKiksIGNoYXIgKiwgY2hhciAqKSk7CisKKy8qIEZyb20gcHJpbnRjbWQuYyAqLworCitleHRlcm4gdm9pZAorc2V0X25leHRfYWRkcmVzcyBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworZXh0ZXJuIHZvaWQKK3ByaW50X2FkZHJlc3Nfc3ltYm9saWMgUEFSQU1TICgoQ09SRV9BRERSLCBGSUxFICosIGludCwgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkCitwcmludF9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgRklMRSAqKSk7CisKKy8qIEZyb20gc291cmNlLmMgKi8KKworZXh0ZXJuIGludAorb3BlbnAgUEFSQU1TICgoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50LCBpbnQsIGNoYXIgKiopKTsKKworZXh0ZXJuIHZvaWQKK21vZF9wYXRoIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOworCitleHRlcm4gdm9pZAorZGlyZWN0b3J5X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2luaXRfc291cmNlX3BhdGggUEFSQU1TICgodm9pZCkpOworCisvKiBGcm9tIGZpbmR2YXIuYyAqLworCitleHRlcm4gaW50CityZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyBQQVJBTVMgKChpbnQsIGNoYXIgKikpOworCisvKiBGcm9tIHJlYWRsaW5lIChidXQgbm90IGluIGFueSByZWFkbGluZSAuaCBmaWxlcykuICAqLworCitleHRlcm4gY2hhciAqCit0aWxkZV9leHBhbmQgUEFSQU1TICgoY2hhciAqKSk7CisKKy8qIFN0cnVjdHVyZSBmb3Igc2F2ZWQgY29tbWFuZHMgbGluZXMKKyAgIChmb3IgYnJlYWtwb2ludHMsIGRlZmluZWQgY29tbWFuZHMsIGV0YykuICAqLworCitzdHJ1Y3QgY29tbWFuZF9saW5lCit7CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKm5leHQ7CisgIGNoYXIgKmxpbmU7Cit9OworCitleHRlcm4gc3RydWN0IGNvbW1hbmRfbGluZSAqCityZWFkX2NvbW1hbmRfbGluZXMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZAorZnJlZV9jb21tYW5kX2xpbmVzIFBBUkFNUyAoKHN0cnVjdCBjb21tYW5kX2xpbmUgKiopKTsKKworLyogU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ICh3aGF0IGdldHdkIHdvdWxkIHJldHVybikuICAqLworCitleHRlcm4gY2hhciAqY3VycmVudF9kaXJlY3Rvcnk7CisKKy8qIERlZmF1bHQgcmFkaXhlcyBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIE9ubHkgc29tZSB2YWx1ZXMgc3VwcG9ydGVkLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnB1dF9yYWRpeDsKK2V4dGVybiB1bnNpZ25lZCBvdXRwdXRfcmFkaXg7CisKKy8qIEJhdWQgcmF0ZSBzcGVjaWZpZWQgZm9yIGNvbW11bmljYXRpb24gd2l0aCBzZXJpYWwgdGFyZ2V0IHN5c3RlbXMuICAqLworZXh0ZXJuIGNoYXIgKmJhdWRfcmF0ZTsKKworLyogTGFuZ3VhZ2VzIHJlcHJlc2VudGVkIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIGVsc2V3aGVyZS4gKi8KKworZW51bSBsYW5ndWFnZSAKK3sKKyAgIGxhbmd1YWdlX3Vua25vd24sIAkJLyogTGFuZ3VhZ2Ugbm90IGtub3duICovCisgICBsYW5ndWFnZV9hdXRvLAkJLyogUGxhY2Vob2xkZXIgZm9yIGF1dG9tYXRpYyBzZXR0aW5nICovCisgICBsYW5ndWFnZV9jLCAJCQkvKiBDICovCisgICBsYW5ndWFnZV9jcGx1cywgCQkvKiBDKysgKi8KKyAgIGxhbmd1YWdlX20yCQkJLyogTW9kdWxhLTIgKi8KK307CisKKy8qIFJldHVybiBhIGZvcm1hdCBzdHJpbmcgZm9yIHByaW50ZiB0aGF0IHdpbGwgcHJpbnQgYSBudW1iZXIgaW4gdGhlIGxvY2FsCisgICAobGFuZ3VhZ2Utc3BlY2lmaWMpIGhleGFkZWNpbWFsIGZvcm1hdC4gIFJlc3VsdCBpcyBzdGF0aWMgYW5kIGlzCisgICBvdmVyd3JpdHRlbiBieSB0aGUgbmV4dCBjYWxsLiAgbG9jYWxfaGV4X2Zvcm1hdF9jdXN0b20gdGFrZXMgcHJpbnRmCisgICBvcHRpb25zIGxpa2UgIjA4IiBvciAibCIgKHRvIHByb2R1Y2UgZS5nLiAlMDh4IG9yICVseCkuICAqLworCisjZGVmaW5lIGxvY2FsX2hleF9mb3JtYXQoKSAoY3VycmVudF9sYW5ndWFnZS0+bGFfaGV4X2Zvcm1hdCkKKworZXh0ZXJuIGNoYXIgKgorbG9jYWxfaGV4X2Zvcm1hdF9jdXN0b20gUEFSQU1TICgoY2hhciAqKSk7CS8qIGxhbmd1YWdlLmMgKi8KKworLyogUmV0dXJuIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBudW1iZXIgZm9ybWF0dGVkIGluIHRoZSBsb2NhbAorICAgKGxhbmd1YWdlLXNwZWNpZmljKSBoZXhhZGVjaW1hbCBmb3JtYXQuICBSZXN1bHQgaXMgc3RhdGljIGFuZCBpcworICAgb3ZlcndyaXR0ZW4gYnkgdGhlIG5leHQgY2FsbC4gIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tIHRha2VzIHByaW50ZgorICAgb3B0aW9ucyBsaWtlICIwOCIgb3IgImwiLiAgKi8KKworZXh0ZXJuIGNoYXIgKgorbG9jYWxfaGV4X3N0cmluZyBQQVJBTVMgKChpbnQpKTsJCS8qIGxhbmd1YWdlLmMgKi8KKworZXh0ZXJuIGNoYXIgKgorbG9jYWxfaGV4X3N0cmluZ19jdXN0b20gUEFSQU1TICgoaW50LCBjaGFyICopKTsJLyogbGFuZ3VhZ2UuYyAqLworCisMCisvKiBIb3N0IG1hY2hpbmUgZGVmaW5pdGlvbi4gIFRoaXMgd2lsbCBiZSBhIHN5bWxpbmsgdG8gb25lIG9mIHRoZQorICAgeG0tKi5oIGZpbGVzLCBidWlsdCBieSB0aGUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgKi8KKworI2luY2x1ZGUgInhtLmgiCisKKy8qIElmIHRoZSB4bS5oIGZpbGUgZGlkIG5vdCBkZWZpbmUgdGhlIG1vZGUgc3RyaW5nIHVzZWQgdG8gb3BlbiB0aGUKKyAgIGZpbGVzLCBhc3N1bWUgdGhhdCBiaW5hcnkgZmlsZXMgYXJlIG9wZW5lZCB0aGUgc2FtZSB3YXkgYXMgdGV4dAorICAgZmlsZXMgKi8KKyNpZm5kZWYgRk9QRU5fUkIKKyNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCisjZW5kaWYKKworLyoKKyAqIEFsbG93IHRoaW5ncyBpbiBnZGIgdG8gYmUgZGVjbGFyZWQgImNvbnN0Ii4gIElmIGNvbXBpbGluZyBBTlNJLCBpdAorICoganVzdCB3b3Jrcy4gIElmIGNvbXBpbGluZyB3aXRoIGdjYyBidXQgbm9uLWFuc2ksIHJlZGVmaW5lIHRvIF9fY29uc3RfXy4KKyAqIElmIG5vbi1hbnNpLCBub24tZ2NjLCB0aGVuIGVsaW1pbmF0ZSAiY29uc3QiIGVudGlyZWx5LCBtYWtpbmcgdGhvc2UKKyAqIG9iamVjdHMgYmUgcmVhZC13cml0ZSByYXRoZXIgdGhhbiByZWFkLW9ubHkuCisgKi8KKworI2lmbmRlZiBjb25zdAorI2lmbmRlZiBfX1NURENfXworIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIGNvbnN0IF9fY29uc3RfXworIyBlbHNlCisjICBkZWZpbmUgY29uc3QgLypub3RoaW5nKi8KKyMgZW5kaWYgLyogR05VQyAqLworI2VuZGlmIC8qIFNUREMgKi8KKyNlbmRpZiAvKiBjb25zdCAqLworCisjaWZuZGVmIHZvbGF0aWxlCisjaWZuZGVmIF9fU1REQ19fCisjIGlmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgdm9sYXRpbGUgX192b2xhdGlsZV9fCisjIGVsc2UKKyMgIGRlZmluZSB2b2xhdGlsZSAvKm5vdGhpbmcqLworIyBlbmRpZiAvKiBHTlVDICovCisjZW5kaWYgLyogU1REQyAqLworI2VuZGlmIC8qIHZvbGF0aWxlICovCisKKy8qIFNvbWUgY29tcGlsZXJzIChtYW55IEFUJlQgU1ZSNCBjb21waWxlcnMgZm9yIGluc3RhbmNlKSwgZG8gbm90IGFjY2VwdAorICAgZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyB0aGF0IG5ldmVyIHJldHVybiAoZXhpdCBmb3IgaW5zdGFuY2UpIGFzCisgICAidm9sYXRpbGUgdm9pZCIuICBGb3Igc3VjaCBjb21waWxlcnMgIk5PUkVUVVJOIiBjYW4gYmUgZGVmaW5lZCBhd2F5CisgICB0byBrZWVwIHRoZW0gaGFwcHkgKi8KKworI2lmbmRlZiBOT1JFVFVSTgorIyBpZmRlZiBfX2x1Y2lkCisjICAgZGVmaW5lIE5PUkVUVVJOIC8qbm90aGluZyovCisjIGVsc2UKKyMgICBkZWZpbmUgTk9SRVRVUk4gdm9sYXRpbGUKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWZhdWx0cyBmb3Igc3lzdGVtLXdpZGUgY29uc3RhbnRzIChpZiBub3QgZGVmaW5lZCBieSB4bS5oLCB3ZSBmYWtlIGl0KS4gICovCisKKyNpZiAhZGVmaW5lZCAoVUlOVF9NQVgpCisjZGVmaW5lIFVJTlRfTUFYIDB4ZmZmZmZmZmYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKExPTkdfTUFYKQorI2RlZmluZSBMT05HX01BWCAweDdmZmZmZmZmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChJTlRfTUFYKQorI2RlZmluZSBJTlRfTUFYIDB4N2ZmZmZmZmYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKElOVF9NSU4pCisvKiBUd28ncyBjb21wbGVtZW50LCAzMiBiaXQuICAqLworI2RlZmluZSBJTlRfTUlOIC0weDgwMDAwMDAwCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBjaGFyIG9yIHVuc2lnbmVkIGNoYXIgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgIEp1c3QgbGlrZSBDSEFSX0JJVCBpbiA8bGltaXRzLmg+IGJ1dCBkZXNjcmliZXMgdGhlIHRhcmdldCBtYWNoaW5lLiAgKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0NIQVJfQklUKQorI2RlZmluZSBUQVJHRVRfQ0hBUl9CSVQgOAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgc2hvcnQgb3IgdW5zaWduZWQgc2hvcnQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX1NIT1JUX0JJVCkKKyNkZWZpbmUgVEFSR0VUX1NIT1JUX0JJVCAoc2l6ZW9mIChzaG9ydCkgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50IG9yIHVuc2lnbmVkIGludCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAqLworI2lmICFkZWZpbmVkIChUQVJHRVRfSU5UX0JJVCkKKyNkZWZpbmUgVEFSR0VUX0lOVF9CSVQgKHNpemVvZiAoaW50KSAqIFRBUkdFVF9DSEFSX0JJVCkKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGxvbmcgb3IgdW5zaWduZWQgbG9uZyBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAqLworI2lmICFkZWZpbmVkIChUQVJHRVRfTE9OR19CSVQpCisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVCAoc2l6ZW9mIChsb25nKSAqIFRBUkdFVF9DSEFSX0JJVCkKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGxvbmcgbG9uZyBvciB1bnNpZ25lZCBsb25nIGxvbmcgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0xPTkdfTE9OR19CSVQpCisjZGVmaW5lIFRBUkdFVF9MT05HX0xPTkdfQklUICgyICogVEFSR0VUX0xPTkdfQklUKQorI2VuZGlmCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgZmxvYXQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0ZMT0FUX0JJVCkKKyNkZWZpbmUgVEFSR0VUX0ZMT0FUX0JJVCAoc2l6ZW9mIChmbG9hdCkgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBkb3VibGUgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0RPVUJMRV9CSVQpCisjZGVmaW5lIFRBUkdFVF9ET1VCTEVfQklUIChzaXplb2YgKGRvdWJsZSkgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIGRvdWJsZSBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAqLworI2lmICFkZWZpbmVkIChUQVJHRVRfTE9OR19ET1VCTEVfQklUKQorI2RlZmluZSBUQVJHRVRfTE9OR19ET1VCTEVfQklUICgyICogVEFSR0VUX0RPVUJMRV9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSAiY29tcGxleCIgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0NPTVBMRVhfQklUKQorI2RlZmluZSBUQVJHRVRfQ09NUExFWF9CSVQgKDIgKiBUQVJHRVRfRkxPQVRfQklUKQorI2VuZGlmCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgImRvdWJsZSBjb21wbGV4IiBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAqLworI2lmICFkZWZpbmVkIChUQVJHRVRfRE9VQkxFX0NPTVBMRVhfQklUKQorI2RlZmluZSBUQVJHRVRfRE9VQkxFX0NPTVBMRVhfQklUICgyICogVEFSR0VUX0RPVUJMRV9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBwb2ludGVyIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUgKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX1BUUl9CSVQpCisjZGVmaW5lIFRBUkdFVF9QVFJfQklUIFRBUkdFVF9JTlRfQklUCisjZW5kaWYKKworLyogQ29udmVydCBhIExPTkdFU1QgdG8gYW4gaW50LiAgVGhpcyBpcyB1c2VkIGluIGNvbnRleHRzIChlLmcuIG51bWJlcgorICAgb2YgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24sIG51bWJlciBpbiBhIHZhbHVlIGhpc3RvcnksIHJlZ2lzdGVyCisgICBudW1iZXIsIGV0Yy4pIHdoZXJlIHRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiBjYW4gZml0CisgICBpbiBhbiBpbnQuICAqLworI2lmICFkZWZpbmVkIChsb25nZXN0X3RvX2ludCkKKyNpZiBkZWZpbmVkIChMT05HX0xPTkcpCisjZGVmaW5lIGxvbmdlc3RfdG9faW50KHgpICgoKHgpID4gSU5UX01BWCB8fCAoeCkgPCBJTlRfTUlOKSBcCisJCQkgICA/IChlcnJvciAoIlZhbHVlIG91dCBvZiByYW5nZS4iKSwwKSA6IChpbnQpICh4KSkKKyNlbHNlIC8qIE5vIExPTkdfTE9ORy4gICovCisvKiBBc3N1bWUgc2l6ZW9mIChpbnQpID09IHNpemVvZiAobG9uZykuICAqLworI2RlZmluZSBsb25nZXN0X3RvX2ludCh4KSAoKGludCkgKHgpKQorI2VuZGlmIC8qIE5vIExPTkdfTE9ORy4gICovCisjZW5kaWYgLyogTm8gbG9uZ2VzdF90b19pbnQuICAqLworCisvKiBUaGlzIHNob3VsZCBub3QgYmUgYSB0eXBlZGVmLCBiZWNhdXNlICJ1bnNpZ25lZCBMT05HRVNUIiBuZWVkcworICAgdG8gd29yay4gTE9OR19MT05HIGlzIGRlZmluZWQgaWYgdGhlIGhvc3QgaGFzICJsb25nIGxvbmciLiAgKi8KKworI2lmbmRlZiBMT05HRVNUCisjIGlmZGVmIExPTkdfTE9ORworIyAgZGVmaW5lIExPTkdFU1QgbG9uZyBsb25nCisjIGVsc2UKKyMgIGRlZmluZSBMT05HRVNUIGxvbmcKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBc3NvcnRlZCBmdW5jdGlvbnMgd2UgY2FuIGRlY2xhcmUsIG5vdyB0aGF0IGNvbnN0IGFuZCB2b2xhdGlsZSBhcmUgCisgICBkZWZpbmVkLiAgKi8KKworZXh0ZXJuIGNoYXIgKgorc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworCitleHRlcm4gY2hhciAqCittc2F2ZXN0cmluZyBQQVJBTVMgKCh2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiBjaGFyICoKK3N0cnNhdmUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICoKK21zdHJzYXZlIFBBUkFNUyAoKHZvaWQgKiwgY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICoKK2NvbmNhdCBQQVJBTVMgKChjaGFyICosIC4uLikpOworCitleHRlcm4gUFRSCit4bWFsbG9jIFBBUkFNUyAoKGxvbmcpKTsKKworZXh0ZXJuIFBUUgoreHJlYWxsb2MgUEFSQU1TICgoUFRSLCBsb25nKSk7CisKK2V4dGVybiBQVFIKK3htbWFsbG9jIFBBUkFNUyAoKFBUUiwgbG9uZykpOworCitleHRlcm4gUFRSCit4bXJlYWxsb2MgUEFSQU1TICgoUFRSLCBQVFIsIGxvbmcpKTsKKworZXh0ZXJuIFBUUgorbW1hbGxvYyBQQVJBTVMgKChQVFIsIGxvbmcpKTsKKworZXh0ZXJuIFBUUgorbXJlYWxsb2MgUEFSQU1TICgoUFRSLCBQVFIsIGxvbmcpKTsKKworZXh0ZXJuIHZvaWQKK21mcmVlIFBBUkFNUyAoKFBUUiwgUFRSKSk7CisKK2V4dGVybiBpbnQKK21tY2hlY2sgUEFSQU1TICgoUFRSLCB2b2lkICgqKSAodm9pZCkpKTsKKworZXh0ZXJuIGludAorbW10cmFjZSBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQKK3BhcnNlX2VzY2FwZSBQQVJBTVMgKChjaGFyICoqKSk7CisKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgcmVnX25hbWVzW107CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkCQkJLyogRG9lcyBub3QgcmV0dXJuIHRvIHRoZSBjYWxsZXIuICAqLworZXJyb3IgKCk7CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkCQkJLyogRG9lcyBub3QgcmV0dXJuIHRvIHRoZSBjYWxsZXIuICAqLworZmF0YWwgKCk7CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkCQkJLyogTm90IHNwZWNpZmllZCBhcyB2b2xhdGlsZSBpbiAuLi4gKi8KK2V4aXQgUEFSQU1TICgoaW50KSk7CQkJLyogNC4xMC40LjMgKi8KKworZXh0ZXJuIE5PUkVUVVJOIHZvaWQJCQkvKiBEb2VzIG5vdCByZXR1cm4gdG8gdGhlIGNhbGxlci4gICovCitub21lbSBQQVJBTVMgKChsb25nKSk7CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkCQkJLyogRG9lcyBub3QgcmV0dXJuIHRvIHRoZSBjYWxsZXIuICAqLworcmV0dXJuX3RvX3RvcF9sZXZlbCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCit3YXJuaW5nX3NldHVwIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK3dhcm5pbmcgKCk7CisKKy8qIEdsb2JhbCBmdW5jdGlvbnMgZnJvbSBvdGhlciwgbm9uLWdkYiBHTlUgdGhpbmdpZXMgKGxpYmliZXJ0eSBmb3IKKyAgIGluc3RhbmNlKSAqLworCitleHRlcm4gY2hhciAqCitiYXNlbmFtZSBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIGNoYXIgKgorZ2V0ZW52IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCitleHRlcm4gY2hhciAqKgorYnVpbGRhcmd2IFBBUkFNUyAoKGNoYXIgKikpOworCitleHRlcm4gdm9pZAorZnJlZWFyZ3YgUEFSQU1TICgoY2hhciAqKikpOworCitleHRlcm4gY2hhciAqCitzdHJlcnJubyBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIGNoYXIgKgorc3Ryc2lnbm8gUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiBpbnQKK2Vycm5vX21heCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQKK3NpZ25vX21heCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQKK3N0cnRvZXJybm8gUEFSQU1TICgoY2hhciAqKSk7CisKK2V4dGVybiBpbnQKK3N0cnRvc2lnbm8gUEFSQU1TICgoY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICoKK3N0cnNpZ25hbCBQQVJBTVMgKChpbnQpKTsKKworLyogRnJvbSBvdGhlciBzeXN0ZW0gbGlicmFyaWVzICovCisKKyNpZm5kZWYgUFNJR05BTF9JTl9TSUdOQUxfSAorZXh0ZXJuIHZvaWQKK3BzaWduYWwgUEFSQU1TICgodW5zaWduZWQsIGNoYXIgKikpOworI2VuZGlmCisKKy8qIEZvciBub3csIHdlIGNhbid0IGluY2x1ZGUgPHN0ZGxpYi5oPiBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoCisgICAiLi4vaW5jbHVkZS9nZXRvcHQuaCIuICAoRklYTUUpCisKKyAgIEhvd2V2ZXIsIGlmIGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiB0aGUgQU5TSSBDIHN0YW5kYXJkIGFuZCBhIHByb3RvdHlwZQorICAgZm9yIHRoYXQgZnVuY3Rpb24gaXMgZGVmaW5lZCBhbmQgdmlzaWJsZSBpbiBhbnkgaGVhZGVyIGZpbGUgaW4gYW4gQU5TSQorICAgY29uZm9ybWluZyBlbnZpcm9ubWVudCwgdGhlbiB0aGF0IHByb3RvdHlwZSBtdXN0IG1hdGNoIHRoZSBkZWZpbml0aW9uIGluCisgICB0aGUgQU5TSSBzdGFuZGFyZC4gIFNvIHdlIGNhbiBqdXN0IGR1cGxpY2F0ZSB0aGVtIGhlcmUgd2l0aG91dCBjb25mbGljdCwKKyAgIHNpbmNlIHRoZXkgbXVzdCBiZSB0aGUgc2FtZSBpbiBhbGwgY29uZm9ybWluZyBBTlNJIGVudmlyb25tZW50cy4gIElmCisgICB0aGVzZSBjYXVzZSBwcm9ibGVtcywgdGhlbiB0aGUgZW52aXJvbm1lbnQgaXMgbm90IEFOU0kgY29uZm9ybWFudC4gKi8KKyAgIAorI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworZXh0ZXJuIGludAorZmNsb3NlIFBBUkFNUyAoKEZJTEUgKnN0cmVhbSkpOwkJCQkvKiA0LjkuNS4xICovCisKK2V4dGVybiB2b2lkCitwZXJyb3IgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CQkJCS8qIDQuOS4xMC40ICovCisKK2V4dGVybiBkb3VibGUKK2F0b2YgUEFSQU1TICgoY29uc3QgY2hhciAqbnB0cikpOwkJCS8qIDQuMTAuMS4xICovCisKK2V4dGVybiBpbnQKK2F0b2kgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CQkJCS8qIDQuMTAuMS4yICovCisKKyNpZm5kZWYgTUFMTE9DX0lOQ09NUEFUSUJMRQorCitleHRlcm4gUFRSCittYWxsb2MgUEFSQU1TICgoc2l6ZV90IHNpemUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQuMTAuMy4zICovCisKK2V4dGVybiBQVFIKK3JlYWxsb2MgUEFSQU1TICgodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkpOyAgICAgICAgICAgICAgLyogNC4xMC4zLjQgKi8KKworZXh0ZXJuIHZvaWQKK2ZyZWUgUEFSQU1TICgodm9pZCAqKSk7CQkJCQkvKiA0LjEwLjMuMiAqLworCisjZW5kaWYJLyogTUFMTE9DX0lOQ09NUEFUSUJMRSAqLworCitleHRlcm4gdm9pZAorcXNvcnQgUEFSQU1TICgodm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLAkJLyogNC4xMC41LjIgKi8KKwkgICAgICAgc2l6ZV90IHNpemUsCisJICAgICAgIGludCAoKmNvbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkpOworCisjaWZuZGVmCU1FTV9GTlNfREVDTEFSRUQJLyogU29tZSBub24tQU5TSSB1c2Ugdm9pZCAqLCBub3QgY2hhciAqLiAgKi8KK2V4dGVybiBQVFIKK21lbWNweSBQQVJBTVMgKCh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSk7CQkvKiA0LjExLjIuMSAqLworI2VuZGlmCisKK2V4dGVybiBpbnQKK21lbWNtcCBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSk7CS8qIDQuMTEuNC4xICovCisKK2V4dGVybiBjaGFyICoKK3N0cmNociBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwkJCS8qIDQuMTEuNS4yICovCisKK2V4dGVybiBjaGFyICoKK3N0cnJjaHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsJCQkvKiA0LjExLjUuNSAqLworCitleHRlcm4gY2hhciAqCitzdHJzdHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsJCS8qIDQuMTEuNS43ICovCisKK2V4dGVybiBjaGFyICoKK3N0cnRvayBQQVJBTVMgKChjaGFyICosIGNvbnN0IGNoYXIgKikpOwkJCS8qIDQuMTEuNS44ICovCisKKyNpZm5kZWYJTUVNX0ZOU19ERUNMQVJFRAkvKiBTb21lIG5vbi1BTlNJIHVzZSB2b2lkICosIG5vdCBjaGFyICouICAqLworZXh0ZXJuIFBUUgorbWVtc2V0IFBBUkFNUyAoKHZvaWQgKiwgaW50LCBzaXplX3QpKTsJCQkvKiA0LjExLjYuMSAqLworI2VuZGlmCisKK2V4dGVybiBjaGFyICoKK3N0cmVycm9yIFBBUkFNUyAoKGludCkpOwkJCQkvKiA0LjExLjYuMiAqLworCisvKiBWYXJpb3VzIHBvc3NpYmlsaXRpZXMgZm9yIGFsbG9jYS4gICovCisjaWZuZGVmIGFsbG9jYQorIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjIGVsc2UKKyMgIGlmZGVmIHNwYXJjCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CQkvKiBOT1RFOiAgRG9lc24ndCBkZWNsYXJlIGFsbG9jYSgpICovCisjICBlbmRpZgorIyAgaWZkZWYgX19TVERDX18KKyAgIGV4dGVybiB2b2lkICphbGxvY2EgKHNpemVfdCk7CisjICBlbHNlIC8qIF9fU1REQ19fICovCisgICBleHRlcm4gY2hhciAqYWxsb2NhICgpOworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBUQVJHRVRfQllURV9PUkRFUiBhbmQgSE9TVF9CWVRFX09SREVSIG11c3QgYmUgZGVmaW5lZCB0byBvbmUgb2YgdGhlc2UuICAqLworCisjaWYgIWRlZmluZWQgKEJJR19FTkRJQU4pCisjZGVmaW5lIEJJR19FTkRJQU4gNDMyMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTElUVExFX0VORElBTikKKyNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKworLyogVGFyZ2V0LXN5c3RlbS1kZXBlbmRlbnQgcGFyYW1ldGVycyBmb3IgR0RCLgorCisgICBUaGUgc3RhbmRhcmQgdGhpbmcgaXMgdG8gaW5jbHVkZSBkZWZzLmguICBIb3dldmVyLCBmaWxlcyB0aGF0IGFyZQorICAgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHRhcmdldCBjYW4gZGVmaW5lIFRNX0ZJTEVfT1ZFUlJJREUgYmVmb3JlCisgICBpbmNsdWRpbmcgZGVmcy5oLCB0aGVuIGNhbiBpbmNsdWRlIGFueSBwYXJ0aWN1bGFyIHRtLWZpbGUgdGhleSBkZXNpcmUuICAqLworCisvKiBUYXJnZXQgbWFjaGluZSBkZWZpbml0aW9uLiAgVGhpcyB3aWxsIGJlIGEgc3ltbGluayB0byBvbmUgb2YgdGhlCisgICB0bS0qLmggZmlsZXMsIGJ1aWx0IGJ5IHRoZSBgY29uZmlndXJlJyBzY3JpcHQuICAqLworCisjaWZuZGVmIFRNX0ZJTEVfT1ZFUlJJREUKKyNpbmNsdWRlICJ0bS5oIgorI2VuZGlmCisKKy8qIFRoZSBiaXQgYnl0ZS1vcmRlciBoYXMgdG8gZG8ganVzdCB3aXRoIG51bWJlcmluZyBvZiBiaXRzIGluCisgICBkZWJ1Z2dpbmcgc3ltYm9scyBhbmQgc3VjaC4gIENvbmNlcHR1YWxseSwgaXQncyBxdWl0ZSBzZXBhcmF0ZQorICAgZnJvbSBieXRlL3dvcmQgYnl0ZSBvcmRlci4gICovCisKKyNpZiAhZGVmaW5lZCAoQklUU19CSUdfRU5ESUFOKQorI2lmIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4KKyNkZWZpbmUgQklUU19CSUdfRU5ESUFOIDEKKyNlbmRpZiAvKiBCaWcgZW5kaWFuLiAgKi8KKworI2lmIFRBUkdFVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgQklUU19CSUdfRU5ESUFOIDAKKyNlbmRpZiAvKiBMaXR0bGUgZW5kaWFuLiAgKi8KKyNlbmRpZiAvKiBCSVRTX0JJR19FTkRJQU4gbm90IGRlZmluZWQuICAqLworCisvKiBTd2FwIExFTiBieXRlcyBhdCBCVUZGRVIgYmV0d2VlbiB0YXJnZXQgYW5kIGhvc3QgYnl0ZS1vcmRlci4gICovCisjaWYgVEFSR0VUX0JZVEVfT1JERVIgPT0gSE9TVF9CWVRFX09SREVSCisjZGVmaW5lIFNXQVBfVEFSR0VUX0FORF9IT1NUKGJ1ZmZlcixsZW4pCisjZWxzZSAvKiBUYXJnZXQgYW5kIGhvc3QgYnl0ZSBvcmRlciBkaWZmZXIuICAqLworI2RlZmluZSBTV0FQX1RBUkdFVF9BTkRfSE9TVChidWZmZXIsbGVuKSBcCisgIHsJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgICAgCSBcCisgICAgY2hhciB0bXA7CQkJCQkJCQkgXAorICAgIGNoYXIgKnAgPSAoY2hhciAqKShidWZmZXIpOwkJCQkJCSBcCisgICAgY2hhciAqcSA9ICgoY2hhciAqKShidWZmZXIpKSArIGxlbiAtIDE7CQkgICAJCSBcCisgICAgZm9yICg7IHAgPCBxOyBwKyssIHEtLSkJCQkJIAkJIFwKKyAgICAgIHsJCQkJCQkJCQkgXAorICAgICAgICB0bXAgPSAqcTsJCQkJCQkJIFwKKyAgICAgICAgKnEgPSAqcDsJCQkJCQkJIFwKKyAgICAgICAgKnAgPSB0bXA7CQkJCQkJCSBcCisgICAgICB9CQkJCQkJCQkJIFwKKyAgfQorI2VuZGlmIC8qIFRhcmdldCBhbmQgaG9zdCBieXRlIG9yZGVyIGRpZmZlci4gICovCisKKy8qIE9uIHNvbWUgbWFjaGluZXMgdGhlcmUgYXJlIGJpdHMgaW4gYWRkcmVzc2VzIHdoaWNoIGFyZSBub3QgcmVhbGx5CisgICBwYXJ0IG9mIHRoZSBhZGRyZXNzLCBidXQgYXJlIHVzZWQgYnkgdGhlIGtlcm5lbCwgdGhlIGhhcmR3YXJlLCBldGMuCisgICBmb3Igc3BlY2lhbCBwdXJwb3Nlcy4gIEFERFJfQklUU19SRU1PVkUgdGFrZXMgb3V0IGFueSBzdWNoIGJpdHMKKyAgIHNvIHdlIGdldCBhICJyZWFsIiBhZGRyZXNzIHN1Y2ggYXMgb25lIHdvdWxkIGZpbmQgaW4gYSBzeW1ib2wKKyAgIHRhYmxlLiAgQUREUl9CSVRTX1NFVCBzZXRzIHRob3NlIGJpdHMgdGhlIHdheSB0aGUgc3lzdGVtIHdhbnRzCisgICB0aGVtLiAgKi8KKyNpZiAhZGVmaW5lZCAoQUREUl9CSVRTX1JFTU9WRSkKKyNkZWZpbmUgQUREUl9CSVRTX1JFTU9WRShhZGRyKSAoYWRkcikKKyNkZWZpbmUgQUREUl9CSVRTX1NFVChhZGRyKSAoYWRkcikKKyNlbmRpZiAvKiBObyBBRERSX0JJVFNfUkVNT1ZFLiAgKi8KKworLyogRnJvbSB2YWxvcHMuYyAqLworCitleHRlcm4gQ09SRV9BRERSCitwdXNoX2J5dGVzIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQpKTsKKworLyogSW4gc29tZSBtb2R1bGVzLCB3ZSBkb24ndCBoYXZlIGEgZGVmaW5pdGlvbiBvZiBSRUdJU1RFUl9UWVBFIHlldCwgc28gd2UKKyAgIG11c3QgYXZvaWQgcHJvdG90eXBpbmcgdGhpcyBmdW5jdGlvbiBmb3Igbm93LiAgRklYTUUuICBTaG91bGQgYmU6CitleHRlcm4gQ09SRV9BRERSCitwdXNoX3dvcmQgUEFSQU1TICgoQ09SRV9BRERSLCBSRUdJU1RFUl9UWVBFKSk7CisgKi8KK2V4dGVybiBDT1JFX0FERFIKK3B1c2hfd29yZCAoKTsKKworLyogU29tZSBwYXJ0cyBvZiBnZGIgbWlnaHQgYmUgY29uc2lkZXJlZCBvcHRpb25hbCwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleQorICAgYXJlIG5vdCBlc3NlbnRpYWwgZm9yIGJlaW5nIGFibGUgdG8gYnVpbGQgYSB3b3JraW5nLCB1c2FibGUgZGVidWdnZXIKKyAgIGZvciBhIHNwZWNpZmljIGVudmlyb25tZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBtYWludGVuYW5jZSBjb21tYW5kcworICAgYXJlIHRoZXJlIGZvciB0aGUgYmVuZWZpdCBvZiBnZGIgbWFpbnRhaW5lcnMuICBBcyBhbm90aGVyIGV4YW1wbGUsCisgICBzb21lIGVudmlyb25tZW50cyByZWFsbHkgZG9uJ3QgbmVlZCBnZGIncyB0aGF0IGFyZSBhYmxlIHRvIHJlYWQgTgorICAgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMuICBJbiBvcmRlciB0byBtYWtlIGl0IHBvc3NpYmxlIChidXQKKyAgIG5vdCBuZWNlc3NhcmlseSByZWNvbW1lbmRlZCkgdG8gYnVpbGQgInN0cmlwcGVkIGRvd24iIHZlcnNpb25zIG9mCisgICBnZGIsIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBjb250cm9sIHNlbGVjdGl2ZSBjb21waWxhdGlvbiBvZiB0aG9zZQorICAgcGFydHMgb2YgZ2RiIHdoaWNoIGNhbiBiZSBzYWZlbHkgbGVmdCBvdXQgd2hlbiBuZWNlc3NhcnkuICBOb3RlIHRoYXQKKyAgIHRoZSBkZWZhdWx0IGlzIHRvIGluY2x1ZGUgZXZlcnl0aGluZy4gKi8KKworI2lmbmRlZiBNQUlOVEVOQU5DRV9DTURTCisjZGVmaW5lIE1BSU5URU5BTkNFX0NNRFMgMQorI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoREVGU19IKSAqLwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZHRlc3QuYyBiL2RlYnVnZ2VyL2R0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MDAwOAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2R0ZXN0LmMKQEAgLTAsMCArMSw5NiBAQAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2V4dGVybiB2b2lkIHdpbmVfZGVidWcodW5zaWduZWQgaW50Kik7CisKKworI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjZW5kaWYKKworc3RydWN0IHNpZ2FjdGlvbiBzZWd2X2FjdDsKKworI2lmZGVmIGxpbnV4CisKK3N0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgc2NfZ3MsIF9fZ3NoOworCXVuc2lnbmVkIHNob3J0IHNjX2ZzLCBfX2ZzaDsKKwl1bnNpZ25lZCBzaG9ydCBzY19lcywgX19lc2g7CisJdW5zaWduZWQgc2hvcnQgc2NfZHMsIF9fZHNoOworCXVuc2lnbmVkIGxvbmcgc2NfZWRpOworCXVuc2lnbmVkIGxvbmcgc2NfZXNpOworCXVuc2lnbmVkIGxvbmcgc2NfZWJwOworCXVuc2lnbmVkIGxvbmcgc2NfZXNwOworCXVuc2lnbmVkIGxvbmcgc2NfZWJ4OworCXVuc2lnbmVkIGxvbmcgc2NfZWR4OworCXVuc2lnbmVkIGxvbmcgc2NfZWN4OworCXVuc2lnbmVkIGxvbmcgc2NfZWF4OworCXVuc2lnbmVkIGxvbmcgc2NfdHJhcG5vOworCXVuc2lnbmVkIGxvbmcgc2NfZXJyOworCXVuc2lnbmVkIGxvbmcgc2NfZWlwOworCXVuc2lnbmVkIHNob3J0IHNjX2NzLCBfX2NzaDsKKwl1bnNpZ25lZCBsb25nIHNjX2VmbGFnczsKKwl1bnNpZ25lZCBsb25nIGVzcF9hdF9zaWduYWw7CisJdW5zaWduZWQgc2hvcnQgc2Nfc3MsIF9fc3NoOworCXVuc2lnbmVkIGxvbmcgaTM4NzsKKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisJdW5zaWduZWQgbG9uZyBjcjI7Cit9OworI2VuZGlmCisKKyNpZmRlZiBsaW51eAorc3RhdGljIHZvaWQgd2luX2ZhdWx0KGludCBzaWduYWwsIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0KXsKKyAgICAgICAgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpzY3AgPSAmY29udGV4dDsKKyNlbHNlCitzdGF0aWMgdm9pZCB3aW5fZmF1bHQoaW50IHNpZ25hbCwgaW50IGNvZGUsIHN0cnVjdCBzaWdjb250ZXh0ICpzY3ApeworI2VuZGlmCisKKwl3aW5lX2RlYnVnKCh1bnNpZ25lZCBpbnQgKikgc2NwKTsgIC8qIEVudGVyIG91ciBkZWJ1Z2dlciAqLworfQorCitjaGFyIHJlYWx0ZXh0W10gPSAiVGhpcyBpcyB3aGF0IHNob3VsZCByZWFsbHkgYmUgcHJpbnRlZFxuIjsKKworaW50IAorbWFpbigpeworCWNoYXIgKiBwbnQ7CisjaWZkZWYgbGludXgKKwlzZWd2X2FjdC5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSB3aW5fZmF1bHQ7CisJLyogUG9pbnQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG1pbnVzIDQganVzdCBpbiBjYXNlLCBhbmQgbWFrZQorCSAgIGl0IGFsaWduZWQgICovCisJc2lnYWN0aW9uKFNJR1NFR1YsICZzZWd2X2FjdCwgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBfX05ldEJTRF9fCisgICAgICAgIHN0cnVjdCBzaWdzdGFjayBzczsKKyAgICAgICAgc2lnc2V0X3Qgc2lnX21hc2s7CisgICAgICAgIAorICAgICAgICBzcy5zc19zcCA9IChjaGFyICopICgoKHVuc2lnbmVkIGludCkoY3N0YWNrICsgc2l6ZW9mKGNzdGFjaykgLSA0KSkgJiB+Myk7CisgICAgICAgIHNzLnNzX29uc3RhY2sgPSAwOworICAgICAgICBpZiAoc2lnc3RhY2soJnNzLCBOVUxMKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoInNpZ3N0YWNrIik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBzaWdlbXB0eXNldCgmc2lnX21hc2spOworICAgICAgICBzZWd2X2FjdC5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSB3aW5fZmF1bHQ7CisJc2Vndl9hY3Quc2FfZmxhZ3MgPSBTQV9PTlNUQUNLOworICAgICAgICBzZWd2X2FjdC5zYV9tYXNrID0gc2lnX21hc2s7CisJaWYgKHNpZ2FjdGlvbihTSUdCVVMsICZzZWd2X2FjdCwgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgcGVycm9yKCJzaWdhY3Rpb24iKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisjZW5kaWYKKworCWZwcmludGYoc3RkZXJyLCIleFxuIiwgcmVhbHRleHQpOworCisJLyogTm93IGZvcmNlIGEgc2VnbWVudGF0aW9uIGZhdWx0ICovCisJcG50ID0gKGNoYXIgKikgMHhjMDAwMDAwMDsKKworCWZwcmludGYoc3RkZXJyLCIlcyIsIHBudCk7CisJcmV0dXJuIDA7CisKK30KKworCit1bnNpZ25lZCBpbnQgKiB3aW5lX2ZpbGVzID0gTlVMTDsKKworR2V0RW50cnlQb2ludEZyb21PcmRpbmFsKGludCB3cG50LCBpbnQgb3JkaW5hbCkge30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2ZvcGVuLXNhbWUuaCBiL2RlYnVnZ2VyL2ZvcGVuLXNhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM3NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvZm9wZW4tc2FtZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIE1hY3JvcyBmb3IgdGhlICd0eXBlJyBwYXJ0IG9mIGFuIGZvcGVuLCBmcmVvcGVuIG9yIGZkb3Blbi4gCisKKwk8UmVhZHxXcml0ZT5bVXBkYXRlXTxCaW5hcnkgZmlsZXx0ZXh0IGZpbGU+CisKKyAgIFRoaXMgdmVyc2lvbiBpcyBmb3IgInNhbWUiIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKKyAgIHRoZSBzYW1lLiAgQW4gZXhhbXBsZSBpcyBVbml4LiAgTWFueSBVbml4IHN5c3RlbXMgY291bGQgYWxzbyBhZGQgYQorICAgImIiIHRvIHRoZSBzdHJpbmcsIGluZGljYXRpbmcgYmluYXJ5IGZpbGVzLCBidXQgc29tZSByZWplY3QgdGhpcworICAgKGFuZCB0aGVyZWJ5IGRvbid0IGNvbmZvcm0gdG8gQU5TSSBDLCBidXQgd2hhdCBlbHNlIGlzIG5ldz8pLgorCisgICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCisgICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKKyAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCisgICB2YXJpYW50IHN5c3RlbXMuICAqLworCisjZGVmaW5lIEZPUEVOX1JCCSJyIgorI2RlZmluZSBGT1BFTl9XQiAJInciCisjZGVmaW5lIEZPUEVOX0FCIAkiYSIKKyNkZWZpbmUgRk9QRU5fUlVCIAkicisiCisjZGVmaW5lIEZPUEVOX1dVQiAJIncrIgorI2RlZmluZSBGT1BFTl9BVUIgCSJhKyIKKworI2RlZmluZSBGT1BFTl9SVAkiciIKKyNkZWZpbmUgRk9QRU5fV1QgCSJ3IgorI2RlZmluZSBGT1BFTl9BVCAJImEiCisjZGVmaW5lIEZPUEVOX1JVVCAJInIrIgorI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKKyNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9nZGJjb3JlLmggYi9kZWJ1Z2dlci9nZGJjb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljODQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2dkYmNvcmUuaApAQCAtMCwwICsxLDExOSBAQAorLyogTWFjaGluZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGUgY29yZSBmaWxlIHVuZGVyIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkwLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisvKiBJbnRlcmZhY2Ugcm91dGluZXMgZm9yIGNvcmUsIGV4ZWN1dGFibGUsIGV0Yy4gICovCisKKyNpZiAhZGVmaW5lZCAoR0RCQ09SRV9IKQorI2RlZmluZSBHREJDT1JFX0ggMQorCisjaW5jbHVkZSAiYmZkLmgiCQkvKiBCaW5hcnkgRmlsZSBEZXNjcmlwdGlvbiAqLworCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhcyBhIHN0cmluZy4KKyAgIEVSUiBub256ZXJvIG1lYW5zIGdldCBlcnJvciBpZiB0aGVyZSBpcyBub25lIHNwZWNpZmllZDsKKyAgIG90aGVyd2lzZSByZXR1cm4gMCBpbiB0aGF0IGNhc2UuICAqLworCitleHRlcm4gY2hhciAqCitnZXRfZXhlY19maWxlIFBBUkFNUyAoKGludCBlcnIpKTsKKworLyogTm9uemVybyBpZiB0aGVyZSBpcyBhIGNvcmUgZmlsZS4gICovCisKK2V4dGVybiBpbnQKK2hhdmVfY29yZV9maWxlX3AgUEFSQU1TICgodm9pZCkpOworCisvKiBSZWFkICJtZW1vcnkgZGF0YSIgZnJvbSB3aGF0ZXZlciB0YXJnZXQgb3IgaW5mZXJpb3Igd2UgaGF2ZS4gCisgICBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgZXJybm8gdmFsdWUgaWYgbm90LiAgRUlPIGlzIHVzZWQKKyAgIGZvciBhZGRyZXNzIG91dCBvZiBib3VuZHMuICBJZiBicmVha3BvaW50cyBhcmUgaW5zZXJ0ZWQsIHJldHVybnMKKyAgIHNoYWRvdyBjb250ZW50cywgbm90IHRoZSBicmVha3BvaW50cyB0aGVtc2VsdmVzLiAgRnJvbSBicmVha3BvaW50LmMuICAqLworCitleHRlcm4gaW50CityZWFkX21lbW9yeV9ub2JwdCBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCB1bnNpZ25lZCBsZW4pKTsKKworLyogUmVwb3J0IGEgbWVtb3J5IGVycm9yIHdpdGggZXJyb3IoKS4gICovCisKK2V4dGVybiB2b2lkCittZW1vcnlfZXJyb3IgUEFSQU1TICgoaW50IHN0YXR1cywgQ09SRV9BRERSIG1lbWFkZHIpKTsKKworLyogTGlrZSB0YXJnZXRfcmVhZF9tZW1vcnksIGJ1dCByZXBvcnQgYW4gZXJyb3IgaWYgY2FuJ3QgcmVhZC4gICovCisKK2V4dGVybiB2b2lkCityZWFkX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuKSk7CisKKy8qIFJlYWQgYW4gaW50ZWdlciBmcm9tIGRlYnVnZ2VkIG1lbW9yeSwgZ2l2ZW4gYWRkcmVzcyBhbmQgbnVtYmVyIG9mIGJ5dGVzLiAgKi8KKworZXh0ZXJuIGxvbmcKK3JlYWRfbWVtb3J5X2ludGVnZXIgUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsIGludCBsZW4pKTsKKworLyogSWYgdGhpcyBpcyBwcm90b3R5cGVkLCBuZWVkIHRvIGRlYWwgd2l0aCB2b2lkKiB2cy4gY2hhciouICAqLworCitleHRlcm4gdm9pZAord3JpdGVfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4pKTsKKworLyogSG9vayBmb3IgYGV4ZWNfZmlsZV9jb21tYW5kJyBjb21tYW5kIHRvIGNhbGwuICAqLworCitleHRlcm4gdm9pZCAoKmV4ZWNfZmlsZV9kaXNwbGF5X2hvb2spIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisgICAKK2V4dGVybiB2b2lkCitzcGVjaWZ5X2V4ZWNfZmlsZV9ob29rIFBBUkFNUyAoKHZvaWQgKCpob29rKSAoY2hhciAqZmlsZW5hbWUpKSk7CisKKy8qIEJpbmFyeSBGaWxlIERpZGRsZXJzIGZvciB0aGUgZXhlYyBhbmQgY29yZSBmaWxlcyAqLworZXh0ZXJuIGJmZCAqY29yZV9iZmQ7CitleHRlcm4gYmZkICpleGVjX2JmZDsKKworLyogV2hldGhlciB0byBvcGVuIGV4ZWMgYW5kIGNvcmUgZmlsZXMgcmVhZC1vbmx5IG9yIHJlYWQtd3JpdGUuICAqLworCitleHRlcm4gaW50IHdyaXRlX2ZpbGVzOworCitleHRlcm4gdm9pZAorY29yZV9maWxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGludCBmcm9tX3R0eSkpOworCitleHRlcm4gdm9pZAorZXhlY19maWxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGludCBmcm9tX3R0eSkpOworCitleHRlcm4gdm9pZAordmFsaWRhdGVfZmlsZXMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdW5zaWduZWQgaW50CityZWdpc3Rlcl9hZGRyIFBBUkFNUyAoKGludCByZWdubywgaW50IGJsb2NrZW5kKSk7CisKK2V4dGVybiBpbnQKK3hmZXJfY29yZV9maWxlIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4pKTsKKworZXh0ZXJuIHZvaWQKK2ZldGNoX2NvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGNoYXIgKmNvcmVfcmVnX3NlY3QsIHVuc2lnbmVkIGNvcmVfcmVnX3NpemUsCisJCQkgICAgICBpbnQgd2hpY2gsIHVuc2lnbmVkIGludCByZWdfYWRkcikpOworCitleHRlcm4gdm9pZAorcmVnaXN0ZXJzX2ZldGNoZWQgUEFSQU1TICgodm9pZCkpOworCisjaWYgIWRlZmluZWQgKEtFUk5FTF9VX0FERFIpCitleHRlcm4gQ09SRV9BRERSIGtlcm5lbF91X2FkZHI7CisjZGVmaW5lIEtFUk5FTF9VX0FERFIga2VybmVsX3VfYWRkcgorI2VuZGlmCisKKy8qIFRoZSB0YXJnZXQgdmVjdG9yIGZvciBjb3JlIGZpbGVzICovCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgY29yZV9vcHM7CisKKyAvKiB0YXJnZXQgdmVjdG9yIGZ1bmN0aW9ucyBjYWxsZWQgZGlyZWN0bHkgZnJvbSBlbHNld2hlcmUgKi8KK3ZvaWQKK2NvcmVfb3BlbiBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkCitjb3JlX2RldGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCisjZW5kaWYJLyogIWRlZmluZWQgKEdEQkNPUkVfSCkgKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2hhc2guYyBiL2RlYnVnZ2VyL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ2NDBmCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvaGFzaC5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogRmlsZSBoYXNoLmMgLSBnZW5lcmF0ZSBoYXNoIHRhYmxlcyBmb3IgV2luZSBkZWJ1Z2dlciBzeW1ib2xzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCBFcmljIFlvdW5nZGFsZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5lZXhlLmg+CisjaW5jbHVkZSA8c2VnbWVtLmg+CisjaW5jbHVkZSA8cHJvdG90eXBlcy5oPgorI2luY2x1ZGUgPHdpbmUuaD4KKworc3RydWN0ICBuYW1lX2hhc2h7CisJc3RydWN0IG5hbWVfaGFzaCAqIG5leHQ7CisJdW5zaWduZWQgaW50ICogYWRkcmVzczsKKwljaGFyICogbmFtZTsKK307CisKKyNkZWZpbmUgTlJfTkFNRV9IQVNIIDEyOAorCitzdGF0aWMgc3RydWN0IG5hbWVfaGFzaCAqIG5hbWVfaGFzaF90YWJsZVtOUl9OQU1FX0hBU0hdID0gezAsfTsKKworc3RhdGljICB1bnNpZ25lZCBpbnQgbmFtZV9oYXNoKGNvbnN0IGNoYXIgKiBuYW1lKXsKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IDA7CisJY29uc3QgY2hhciAqIHA7CisKKwlwID0gbmFtZTsKKworCXdoaWxlICgqcCkgaGFzaCA9IChoYXNoIDw8IDE1KSArIChoYXNoIDw8IDMpICsgKGhhc2ggPj4gMykgKyAqcCsrOworCXJldHVybiBoYXNoICUgTlJfTkFNRV9IQVNIOworCit9CisKKwordm9pZCBhZGRfaGFzaChjaGFyICogbmFtZSwgdW5zaWduZWQgaW50ICogYWRkcmVzcyl7CisJc3RydWN0IG5hbWVfaGFzaCAgKiBuZXc7CisJaW50IGhhc2g7CisKKwluZXcgPSAoc3RydWN0ICBuYW1lX2hhc2ggKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmFtZV9oYXNoKSk7CisJbmV3LT5hZGRyZXNzID0gYWRkcmVzczsKKwluZXctPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJbmV3LT5uZXh0ID0gTlVMTDsKKwloYXNoID0gbmFtZV9oYXNoKG5hbWUpOworCisJLyogTm93IGluc2VydCBpbnRvIHRoZSBoYXNoIHRhYmxlICovCisJbmV3LT5uZXh0ID0gbmFtZV9oYXNoX3RhYmxlW2hhc2hdOworCW5hbWVfaGFzaF90YWJsZVtoYXNoXSA9IG5ldzsKK30KKwordW5zaWduZWQgaW50ICogZmluZF9oYXNoKGNoYXIgKiBuYW1lKXsKKwljaGFyIGJ1ZmZlclsyNTZdOworCXN0cnVjdCBuYW1lX2hhc2ggICogbmg7CisKKwlmb3IobmggPSBuYW1lX2hhc2hfdGFibGVbbmFtZV9oYXNoKG5hbWUpXTsgbmg7IG5oID0gbmgtPm5leHQpCisJCWlmKHN0cmNtcChuaC0+bmFtZSwgbmFtZSkgPT0gMCkgcmV0dXJuIG5oLT5hZGRyZXNzOworCisJaWYobmFtZVswXSAhPSAnXycpeworCQlidWZmZXJbMF0gPSAnXyc7CisJCXN0cmNweShidWZmZXIrMSwgbmFtZSk7CisJCWZvcihuaCA9IG5hbWVfaGFzaF90YWJsZVtuYW1lX2hhc2goYnVmZmVyKV07IG5oOyBuaCA9IG5oLT5uZXh0KQorCQkJaWYoc3RyY21wKG5oLT5uYW1lLCBidWZmZXIpID09IDApIHJldHVybiBuaC0+YWRkcmVzczsKKwl9OworCisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCAqKSAweGZmZmZmZmZmOworfQorCisKK3N0YXRpYyBjaGFyIG5hbWVfYnVmZmVyWzI1Nl07CisKK2NoYXIgKiBmaW5kX25lYXJlc3Rfc3ltYm9sKHVuc2lnbmVkIGludCAqIGFkZHJlc3MpeworCXN0cnVjdCBuYW1lX2hhc2ggKiBuZWFyZXN0OworCXN0cnVjdCBuYW1lX2hhc2ggc3RhcnQ7CisJc3RydWN0IG5hbWVfaGFzaCAgKiBuaDsKKwlpbnQgaTsKKwkKKwluZWFyZXN0ID0gJnN0YXJ0OworCXN0YXJ0LmFkZHJlc3MgPSAodW5zaWduZWQgaW50ICopIDA7CisJCisJZm9yKGk9MDsgaTxOUl9OQU1FX0hBU0g7IGkrKykgeworCQlmb3IobmggPSBuYW1lX2hhc2hfdGFibGVbaV07IG5oOyBuaCA9IG5oLT5uZXh0KQorCQkJaWYobmgtPmFkZHJlc3MgPD0gYWRkcmVzcyAmJiBuaC0+YWRkcmVzcyA+IG5lYXJlc3QtPmFkZHJlc3MpCisJCQkJbmVhcmVzdCA9IG5oOworCX07CisJaWYoKHVuc2lnbmVkIGludCkgbmVhcmVzdC0+YWRkcmVzcyA9PSAwKSByZXR1cm4gTlVMTDsKKworCXNwcmludGYobmFtZV9idWZmZXIsICIlcysweCV4IiwgbmVhcmVzdC0+bmFtZSwgKCh1bnNpZ25lZCBpbnQpIGFkZHJlc3MpIC0gCisJCSgodW5zaWduZWQgaW50KSBuZWFyZXN0LT5hZGRyZXNzKSk7CisJcmV0dXJuIG5hbWVfYnVmZmVyOworfQorCisKK3ZvaWQKK3JlYWRfc3ltYm9sdGFibGUoY2hhciAqIGZpbGVuYW1lKXsKKwlGSUxFICogc3ltYm9sZmlsZTsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlpbnQgbmFyZ3M7CisJY2hhciB0eXBlOworCWNoYXIgKiBjcG50OworCWNoYXIgYnVmZmVyWzI1Nl07CisJY2hhciBuYW1lWzI1Nl07CisKKwlzeW1ib2xmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJaWYoIXN5bWJvbGZpbGUpIHsKKwkJZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBvcGVuIHN5bWJvbCB0YWJsZSAlc1xuIiwgZmlsZW5hbWUpOworCQlyZXR1cm47CisJfTsKKworCWZwcmludGYoc3RkZXJyLCJSZWFkaW5nIHN5bWJvbHMgZnJvbSBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisKKworCXdoaWxlICgxKQorCXsKKwkJZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIHN5bWJvbGZpbGUpOworCQlpZiAoZmVvZihzeW1ib2xmaWxlKSkgYnJlYWs7CisJCQorCQkvKiBTdHJpcCBhbnkgdGV4dCBhZnRlciBhICMgc2lnbiAoaS5lLiBjb21tZW50cykgKi8KKwkJY3BudCA9IGJ1ZmZlcjsKKwkJd2hpbGUoKmNwbnQpeworCQkJaWYoKmNwbnQgPT0gJyMnKSB7KmNwbnQgPSAwOyBicmVhazsgfTsKKwkJCWNwbnQrKzsKKwkJfTsKKwkJCisJCS8qIFF1aWV0bHkgaWdub3JlIGFueSBsaW5lcyB0aGF0IGhhdmUganVzdCB3aGl0ZXNwYWNlICovCisJCWNwbnQgPSBidWZmZXI7CisJCXdoaWxlKCpjcG50KXsKKwkJCWlmKCpjcG50ICE9ICcgJyAmJiAqY3BudCAhPSAnXHQnKSBicmVhazsKKwkJCWNwbnQrKzsKKwkJfTsKKwkJaWYgKCEoKmNwbnQpIHx8ICpjcG50ID09ICdcbicpIHsKKwkJCWNvbnRpbnVlOworCQl9OworCQkKKwkJbmFyZ3MgPSBzc2NhbmYoYnVmZmVyLCAiJXggJWMgJXMiLCAmYWRkciwgJnR5cGUsIG5hbWUpOworCQlhZGRfaGFzaChuYW1lLCAodW5zaWduZWQgaW50ICopIGFkZHIpOworICAgICAgfTsKKyAgICAgIGZjbG9zZShzeW1ib2xmaWxlKTsKK30KKworCisvKiBMb2FkIHRoZSBlbnRyeSBwb2ludHMgZnJvbSB0aGUgZHluYW1pYyBsaW5raW5nIGludG8gdGhlIGhhc2ggdGFibGVzLiAKKyAqIFRoaXMgZG9lcyBub3Qgd29yayB5ZXQgLSBzb21ldGhpbmcgbmVlZHMgdG8gYmUgYWRkZWQgYmVmb3JlIGl0IHNjYW5zIHRoZQorICogdGFibGVzIGNvcnJlY3RseSAKKyAqLworCit2b2lkCitsb2FkX2VudHJ5cG9pbnRzKCl7CisJY2hhciBidWZmZXJbMjU2XTsKKwljaGFyICogY3BudDsKKwlpbnQgaiwgb3JkaW5hbCwgbGVuOworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCisJc3RydWN0IHdfZmlsZXMgKiB3cG50OworCWZvcih3cG50ID0gd2luZV9maWxlczsgd3BudDsgd3BudCA9IHdwbnQtPm5leHQpeworCQljcG50ICA9IHdwbnQtPm5ybmFtZV90YWJsZTsKKwkJd2hpbGUoMT09MSl7CisJCQlpZiggKChpbnQpIGNwbnQpICAtICgoaW50KXdwbnQtPm5ybmFtZV90YWJsZSkgPiAgCisJCQkgICB3cG50LT5uZV9oZWFkZXItPm5ybmFtZV90YWJfbGVuZ3RoKSAgYnJlYWs7CisJCQlsZW4gPSAqY3BudCsrOworCQkJc3RybmNweShidWZmZXIsIGNwbnQsIGxlbik7CisJCQlidWZmZXJbbGVuXSA9IDA7CisJCQlvcmRpbmFsID0gICooKHVuc2lnbmVkIHNob3J0ICopICAoY3BudCArICBsZW4pKTsKKwkJCWogPSBHZXRFbnRyeVBvaW50RnJvbU9yZGluYWwod3BudCwgb3JkaW5hbCk7CQkKKwkJCWFkZHJlc3MgID0gaiAmIDB4ZmZmZjsKKwkJCWogPSBqID4+IDE2OworCQkJYWRkcmVzcyB8PSAod3BudC0+c2VsZWN0b3JfdGFibGVbal0uc2VsZWN0b3IpIDw8IDE2OworCQkJZnByaW50ZihzdGRlcnIsIiVzIC0+ICV4XG4iLCBidWZmZXIsIGFkZHJlc3MpOworCQkJYWRkX2hhc2goYnVmZmVyLCAodW5zaWduZWQgaW50ICopIGFkZHJlc3MpOworCQkJY3BudCArPSBsZW4gKyAyOworCQl9OworCX07CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaTM4Ni1waW5zbi5jIGIvZGVidWdnZXIvaTM4Ni1waW5zbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjJhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9pMzg2LXBpbnNuLmMKQEAgLTAsMCArMSwxOTA1IEBACisvKiBQcmludCBpMzg2IGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisvKgorICogODAzODYgaW5zdHJ1Y3Rpb24gcHJpbnRlciBieSBQYWNlIFdpbGxpc3NvbiAocGFjZUBwcmVwLmFpLm1pdC5lZHUpCisgKiBKdWx5IDE5ODgKKyAqLworCisvKgorICogVGhlIG1haW4gdGFibGVzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9ucyBpcyBlc3NlbnRpYWxseSBhIGNvcHkKKyAqIG9mIHRoZSAiT3Bjb2RlIE1hcCIgY2hhcHRlciAoQXBwZW5kaXggQSkgb2YgdGhlIEludGVsIDgwMzg2CisgKiBQcm9ncmFtbWVycyBNYW51YWwuICBVc3VhbGx5LCB0aGVyZSBpcyBhIGNhcGl0YWwgbGV0dGVyLCBmb2xsb3dlZAorICogYnkgYSBzbWFsbCBsZXR0ZXIuICBUaGUgY2FwaXRhbCBsZXR0ZXIgdGVsbCB0aGUgYWRkcmVzc2luZyBtb2RlLAorICogYW5kIHRoZSBzbWFsbCBsZXR0ZXIgdGVsbHMgYWJvdXQgdGhlIG9wZXJhbmQgc2l6ZS4gIFJlZmVyIHRvIAorICogdGhlIEludGVsIG1hbnVhbCBmb3IgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogRm9yIHRoZSBHREIgaW50ZXJmYWNlIGF0IHRoZSBib3R0b20gb2YgdGhlIGZpbGUuLi4gKi8KKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNkZWZpbmUgRWIgT1BfRSwgYl9tb2RlCisjZGVmaW5lIGluZGlyRWIgT1BfaW5kaXJFLCBiX21vZGUKKyNkZWZpbmUgR2IgT1BfRywgYl9tb2RlCisjZGVmaW5lIEV2IE9QX0UsIHZfbW9kZQorI2RlZmluZSBpbmRpckV2IE9QX2luZGlyRSwgdl9tb2RlCisjZGVmaW5lIEV3IE9QX0UsIHdfbW9kZQorI2RlZmluZSBNYSBPUF9FLCB2X21vZGUKKyNkZWZpbmUgTSBPUF9FLCAwCisjZGVmaW5lIE1wIE9QX0UsIDAJCS8qID8gKi8KKyNkZWZpbmUgR3YgT1BfRywgdl9tb2RlCisjZGVmaW5lIEd3IE9QX0csIHdfbW9kZQorI2RlZmluZSBSdyBPUF9ybSwgd19tb2RlCisjZGVmaW5lIFJkIE9QX3JtLCBkX21vZGUKKyNkZWZpbmUgSWIgT1BfSSwgYl9tb2RlCisjZGVmaW5lIHNJYiBPUF9zSSwgYl9tb2RlCS8qIHNpZ24gZXh0ZW5lZCBieXRlICovCisjZGVmaW5lIEl2IE9QX0ksIHZfbW9kZQorI2RlZmluZSBJdyBPUF9JLCB3X21vZGUKKyNkZWZpbmUgSmIgT1BfSiwgYl9tb2RlCisjZGVmaW5lIEp2IE9QX0osIHZfbW9kZQorI2RlZmluZSBPTkUgT1BfT05FLCAwCisjZGVmaW5lIENkIE9QX0MsIGRfbW9kZQorI2RlZmluZSBEZCBPUF9ELCBkX21vZGUKKyNkZWZpbmUgVGQgT1BfVCwgZF9tb2RlCisKKyNkZWZpbmUgZUFYIE9QX1JFRywgZUFYX3JlZworI2RlZmluZSBlQlggT1BfUkVHLCBlQlhfcmVnCisjZGVmaW5lIGVDWCBPUF9SRUcsIGVDWF9yZWcKKyNkZWZpbmUgZURYIE9QX1JFRywgZURYX3JlZworI2RlZmluZSBlU1AgT1BfUkVHLCBlU1BfcmVnCisjZGVmaW5lIGVCUCBPUF9SRUcsIGVCUF9yZWcKKyNkZWZpbmUgZVNJIE9QX1JFRywgZVNJX3JlZworI2RlZmluZSBlREkgT1BfUkVHLCBlRElfcmVnCisjZGVmaW5lIEFMIE9QX1JFRywgYWxfcmVnCisjZGVmaW5lIENMIE9QX1JFRywgY2xfcmVnCisjZGVmaW5lIERMIE9QX1JFRywgZGxfcmVnCisjZGVmaW5lIEJMIE9QX1JFRywgYmxfcmVnCisjZGVmaW5lIEFIIE9QX1JFRywgYWhfcmVnCisjZGVmaW5lIENIIE9QX1JFRywgY2hfcmVnCisjZGVmaW5lIERIIE9QX1JFRywgZGhfcmVnCisjZGVmaW5lIEJIIE9QX1JFRywgYmhfcmVnCisjZGVmaW5lIEFYIE9QX1JFRywgYXhfcmVnCisjZGVmaW5lIERYIE9QX1JFRywgZHhfcmVnCisjZGVmaW5lIGluZGlyRFggT1BfUkVHLCBpbmRpcl9keF9yZWcKKworI2RlZmluZSBTdyBPUF9TRUcsIHdfbW9kZQorI2RlZmluZSBBcCBPUF9ESVIsIGxwdHIKKyNkZWZpbmUgQXYgT1BfRElSLCB2X21vZGUKKyNkZWZpbmUgT2IgT1BfT0ZGLCBiX21vZGUKKyNkZWZpbmUgT3YgT1BfT0ZGLCB2X21vZGUKKyNkZWZpbmUgWGIgT1BfRFNTSSwgYl9tb2RlCisjZGVmaW5lIFh2IE9QX0RTU0ksIHZfbW9kZQorI2RlZmluZSBZYiBPUF9FU0RJLCBiX21vZGUKKyNkZWZpbmUgWXYgT1BfRVNESSwgdl9tb2RlCisKKyNkZWZpbmUgZXMgT1BfUkVHLCBlc19yZWcKKyNkZWZpbmUgc3MgT1BfUkVHLCBzc19yZWcKKyNkZWZpbmUgY3MgT1BfUkVHLCBjc19yZWcKKyNkZWZpbmUgZHMgT1BfUkVHLCBkc19yZWcKKyNkZWZpbmUgZnMgT1BfUkVHLCBmc19yZWcKKyNkZWZpbmUgZ3MgT1BfUkVHLCBnc19yZWcKKworaW50IE9QX0UoKSwgT1BfaW5kaXJFKCksIE9QX0coKSwgT1BfSSgpLCBPUF9zSSgpLCBPUF9SRUcoKTsKK2ludCBPUF9KKCksIE9QX1NFRygpOworaW50IE9QX0RJUigpLCBPUF9PRkYoKSwgT1BfRFNTSSgpLCBPUF9FU0RJKCksIE9QX09ORSgpLCBPUF9DKCk7CitpbnQgT1BfRCgpLCBPUF9UKCksIE9QX3JtKCk7CisKK3N0YXRpYyB2b2lkIGRvZmxvYXQgKCksIHB1dG9wICgpLCBhcHBlbmRfcHJlZml4ICgpLCBzZXRfb3AgKCk7CitzdGF0aWMgaW50IGdldDE2ICgpLCBnZXQzMiAoKTsKKworI2RlZmluZSBiX21vZGUgMQorI2RlZmluZSB2X21vZGUgMgorI2RlZmluZSB3X21vZGUgMworI2RlZmluZSBkX21vZGUgNAorCisjZGVmaW5lIGVzX3JlZyAxMDAKKyNkZWZpbmUgY3NfcmVnIDEwMQorI2RlZmluZSBzc19yZWcgMTAyCisjZGVmaW5lIGRzX3JlZyAxMDMKKyNkZWZpbmUgZnNfcmVnIDEwNAorI2RlZmluZSBnc19yZWcgMTA1CisjZGVmaW5lIGVBWF9yZWcgMTA3CisjZGVmaW5lIGVDWF9yZWcgMTA4CisjZGVmaW5lIGVEWF9yZWcgMTA5CisjZGVmaW5lIGVCWF9yZWcgMTEwCisjZGVmaW5lIGVTUF9yZWcgMTExCisjZGVmaW5lIGVCUF9yZWcgMTEyCisjZGVmaW5lIGVTSV9yZWcgMTEzCisjZGVmaW5lIGVESV9yZWcgMTE0CisKKyNkZWZpbmUgbHB0ciAxMTUKKworI2RlZmluZSBhbF9yZWcgMTE2CisjZGVmaW5lIGNsX3JlZyAxMTcKKyNkZWZpbmUgZGxfcmVnIDExOAorI2RlZmluZSBibF9yZWcgMTE5CisjZGVmaW5lIGFoX3JlZyAxMjAKKyNkZWZpbmUgY2hfcmVnIDEyMQorI2RlZmluZSBkaF9yZWcgMTIyCisjZGVmaW5lIGJoX3JlZyAxMjMKKworI2RlZmluZSBheF9yZWcgMTI0CisjZGVmaW5lIGN4X3JlZyAxMjUKKyNkZWZpbmUgZHhfcmVnIDEyNgorI2RlZmluZSBieF9yZWcgMTI3CisjZGVmaW5lIHNwX3JlZyAxMjgKKyNkZWZpbmUgYnBfcmVnIDEyOQorI2RlZmluZSBzaV9yZWcgMTMwCisjZGVmaW5lIGRpX3JlZyAxMzEKKworI2RlZmluZSBpbmRpcl9keF9yZWcgMTUwCisKKyNkZWZpbmUgR1JQMWIgTlVMTCwgTlVMTCwgMAorI2RlZmluZSBHUlAxUyBOVUxMLCBOVUxMLCAxCisjZGVmaW5lIEdSUDFTcyBOVUxMLCBOVUxMLCAyCisjZGVmaW5lIEdSUDJiIE5VTEwsIE5VTEwsIDMKKyNkZWZpbmUgR1JQMlMgTlVMTCwgTlVMTCwgNAorI2RlZmluZSBHUlAyYl9vbmUgTlVMTCwgTlVMTCwgNQorI2RlZmluZSBHUlAyU19vbmUgTlVMTCwgTlVMTCwgNgorI2RlZmluZSBHUlAyYl9jbCBOVUxMLCBOVUxMLCA3CisjZGVmaW5lIEdSUDJTX2NsIE5VTEwsIE5VTEwsIDgKKyNkZWZpbmUgR1JQM2IgTlVMTCwgTlVMTCwgOQorI2RlZmluZSBHUlAzUyBOVUxMLCBOVUxMLCAxMAorI2RlZmluZSBHUlA0ICBOVUxMLCBOVUxMLCAxMQorI2RlZmluZSBHUlA1ICBOVUxMLCBOVUxMLCAxMgorI2RlZmluZSBHUlA2ICBOVUxMLCBOVUxMLCAxMworI2RlZmluZSBHUlA3IE5VTEwsIE5VTEwsIDE0CisjZGVmaW5lIEdSUDggTlVMTCwgTlVMTCwgMTUKKworI2RlZmluZSBGTE9BVENPREUgNTAKKyNkZWZpbmUgRkxPQVQgTlVMTCwgTlVMTCwgRkxPQVRDT0RFCisKK3N0cnVjdCBkaXMzODYgeworICBjaGFyICpuYW1lOworICBpbnQgKCpvcDEpKCk7CisgIGludCBieXRlbW9kZTE7CisgIGludCAoKm9wMikoKTsKKyAgaW50IGJ5dGVtb2RlMjsKKyAgaW50ICgqb3AzKSgpOworICBpbnQgYnl0ZW1vZGUzOworfTsKKworc3RydWN0IGRpczM4NiBkaXMzODZbXSA9IHsKKyAgLyogMDAgKi8KKyAgeyAiYWRkYiIsCUViLCBHYiB9LAorICB7ICJhZGRTIiwJRXYsIEd2IH0sCisgIHsgImFkZGIiLAlHYiwgRWIgfSwKKyAgeyAiYWRkUyIsCUd2LCBFdiB9LAorICB7ICJhZGRiIiwJQUwsIEliIH0sCisgIHsgImFkZFMiLAllQVgsIEl2IH0sCisgIHsgInB1c2hsIiwJZXMgfSwKKyAgeyAicG9wbCIsCWVzIH0sCisgIC8qIDA4ICovCisgIHsgIm9yYiIsCUViLCBHYiB9LAorICB7ICJvclMiLAlFdiwgR3YgfSwKKyAgeyAib3JiIiwJR2IsIEViIH0sCisgIHsgIm9yUyIsCUd2LCBFdiB9LAorICB7ICJvcmIiLAlBTCwgSWIgfSwKKyAgeyAib3JTIiwJZUFYLCBJdiB9LAorICB7ICJwdXNobCIsCWNzIH0sCisgIHsgIihiYWQpIiB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KKyAgLyogMTAgKi8KKyAgeyAiYWRjYiIsCUViLCBHYiB9LAorICB7ICJhZGNTIiwJRXYsIEd2IH0sCisgIHsgImFkY2IiLAlHYiwgRWIgfSwKKyAgeyAiYWRjUyIsCUd2LCBFdiB9LAorICB7ICJhZGNiIiwJQUwsIEliIH0sCisgIHsgImFkY1MiLAllQVgsIEl2IH0sCisgIHsgInB1c2hsIiwJc3MgfSwKKyAgeyAicG9wbCIsCXNzIH0sCisgIC8qIDE4ICovCisgIHsgInNiYmIiLAlFYiwgR2IgfSwKKyAgeyAic2JiUyIsCUV2LCBHdiB9LAorICB7ICJzYmJiIiwJR2IsIEViIH0sCisgIHsgInNiYlMiLAlHdiwgRXYgfSwKKyAgeyAic2JiYiIsCUFMLCBJYiB9LAorICB7ICJzYmJTIiwJZUFYLCBJdiB9LAorICB7ICJwdXNobCIsCWRzIH0sCisgIHsgInBvcGwiLAlkcyB9LAorICAvKiAyMCAqLworICB7ICJhbmRiIiwJRWIsIEdiIH0sCisgIHsgImFuZFMiLAlFdiwgR3YgfSwKKyAgeyAiYW5kYiIsCUdiLCBFYiB9LAorICB7ICJhbmRTIiwJR3YsIEV2IH0sCisgIHsgImFuZGIiLAlBTCwgSWIgfSwKKyAgeyAiYW5kUyIsCWVBWCwgSXYgfSwKKyAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIEVTIHByZWZpeCAqLworICB7ICJkYWEiIH0sCisgIC8qIDI4ICovCisgIHsgInN1YmIiLAlFYiwgR2IgfSwKKyAgeyAic3ViUyIsCUV2LCBHdiB9LAorICB7ICJzdWJiIiwJR2IsIEViIH0sCisgIHsgInN1YlMiLAlHdiwgRXYgfSwKKyAgeyAic3ViYiIsCUFMLCBJYiB9LAorICB7ICJzdWJTIiwJZUFYLCBJdiB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgQ1MgcHJlZml4ICovCisgIHsgImRhcyIgfSwKKyAgLyogMzAgKi8KKyAgeyAieG9yYiIsCUViLCBHYiB9LAorICB7ICJ4b3JTIiwJRXYsIEd2IH0sCisgIHsgInhvcmIiLAlHYiwgRWIgfSwKKyAgeyAieG9yUyIsCUd2LCBFdiB9LAorICB7ICJ4b3JiIiwJQUwsIEliIH0sCisgIHsgInhvclMiLAllQVgsIEl2IH0sCisgIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBTUyBwcmVmaXggKi8KKyAgeyAiYWFhIiB9LAorICAvKiAzOCAqLworICB7ICJjbXBiIiwJRWIsIEdiIH0sCisgIHsgImNtcFMiLAlFdiwgR3YgfSwKKyAgeyAiY21wYiIsCUdiLCBFYiB9LAorICB7ICJjbXBTIiwJR3YsIEV2IH0sCisgIHsgImNtcGIiLAlBTCwgSWIgfSwKKyAgeyAiY21wUyIsCWVBWCwgSXYgfSwKKyAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIERTIHByZWZpeCAqLworICB7ICJhYXMiIH0sCisgIC8qIDQwICovCisgIHsgImluY1MiLAllQVggfSwKKyAgeyAiaW5jUyIsCWVDWCB9LAorICB7ICJpbmNTIiwJZURYIH0sCisgIHsgImluY1MiLAllQlggfSwKKyAgeyAiaW5jUyIsCWVTUCB9LAorICB7ICJpbmNTIiwJZUJQIH0sCisgIHsgImluY1MiLAllU0kgfSwKKyAgeyAiaW5jUyIsCWVESSB9LAorICAvKiA0OCAqLworICB7ICJkZWNTIiwJZUFYIH0sCisgIHsgImRlY1MiLAllQ1ggfSwKKyAgeyAiZGVjUyIsCWVEWCB9LAorICB7ICJkZWNTIiwJZUJYIH0sCisgIHsgImRlY1MiLAllU1AgfSwKKyAgeyAiZGVjUyIsCWVCUCB9LAorICB7ICJkZWNTIiwJZVNJIH0sCisgIHsgImRlY1MiLAllREkgfSwKKyAgLyogNTAgKi8KKyAgeyAicHVzaFMiLAllQVggfSwKKyAgeyAicHVzaFMiLAllQ1ggfSwKKyAgeyAicHVzaFMiLAllRFggfSwKKyAgeyAicHVzaFMiLAllQlggfSwKKyAgeyAicHVzaFMiLAllU1AgfSwKKyAgeyAicHVzaFMiLAllQlAgfSwKKyAgeyAicHVzaFMiLAllU0kgfSwKKyAgeyAicHVzaFMiLAllREkgfSwKKyAgLyogNTggKi8KKyAgeyAicG9wUyIsCWVBWCB9LAorICB7ICJwb3BTIiwJZUNYIH0sCisgIHsgInBvcFMiLAllRFggfSwKKyAgeyAicG9wUyIsCWVCWCB9LAorICB7ICJwb3BTIiwJZVNQIH0sCisgIHsgInBvcFMiLAllQlAgfSwKKyAgeyAicG9wUyIsCWVTSSB9LAorICB7ICJwb3BTIiwJZURJIH0sCisgIC8qIDYwICovCisgIHsgInB1c2hhIiB9LAorICB7ICJwb3BhIiB9LAorICB7ICJib3VuZFMiLAlHdiwgTWEgfSwKKyAgeyAiYXJwbCIsCUV3LCBHdyB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiBzZWcgZnMgKi8KKyAgeyAiKGJhZCkiIH0sCQkJLyogc2VnIGdzICovCisgIHsgIihiYWQpIiB9LAkJCS8qIG9wIHNpemUgcHJlZml4ICovCisgIHsgIihiYWQpIiB9LAkJCS8qIGFkciBzaXplIHByZWZpeCAqLworICAvKiA2OCAqLworICB7ICJwdXNoUyIsCUl2IH0sCQkvKiAzODYgYm9vayB3cm9uZyAqLworICB7ICJpbXVsUyIsCUd2LCBFdiwgSXYgfSwKKyAgeyAicHVzaGwiLAlzSWIgfSwJCS8qIHB1c2ggb2YgYnl0ZSByZWFsbHkgcHVzaGVzIDQgYnl0ZXMgKi8KKyAgeyAiaW11bFMiLAlHdiwgRXYsIEliIH0sCisgIHsgImluc2IiLAlZYiwgaW5kaXJEWCB9LAorICB7ICJpbnNTIiwJWXYsIGluZGlyRFggfSwKKyAgeyAib3V0c2IiLAlpbmRpckRYLCBYYiB9LAorICB7ICJvdXRzUyIsCWluZGlyRFgsIFh2IH0sCisgIC8qIDcwICovCisgIHsgImpvIiwJCUpiIH0sCisgIHsgImpubyIsCUpiIH0sCisgIHsgImpiIiwJCUpiIH0sCisgIHsgImphZSIsCUpiIH0sCisgIHsgImplIiwJCUpiIH0sCisgIHsgImpuZSIsCUpiIH0sCisgIHsgImpiZSIsCUpiIH0sCisgIHsgImphIiwJCUpiIH0sCisgIC8qIDc4ICovCisgIHsgImpzIiwJCUpiIH0sCisgIHsgImpucyIsCUpiIH0sCisgIHsgImpwIiwJCUpiIH0sCisgIHsgImpucCIsCUpiIH0sCisgIHsgImpsIiwJCUpiIH0sCisgIHsgImpubCIsCUpiIH0sCisgIHsgImpsZSIsCUpiIH0sCisgIHsgImpnIiwJCUpiIH0sCisgIC8qIDgwICovCisgIHsgR1JQMWIgfSwKKyAgeyBHUlAxUyB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyBHUlAxU3MgfSwKKyAgeyAidGVzdGIiLAlFYiwgR2IgfSwKKyAgeyAidGVzdFMiLAlFdiwgR3YgfSwKKyAgeyAieGNoZ2IiLAlFYiwgR2IgfSwKKyAgeyAieGNoZ1MiLAlFdiwgR3YgfSwKKyAgLyogODggKi8KKyAgeyAibW92YiIsCUViLCBHYiB9LAorICB7ICJtb3ZTIiwJRXYsIEd2IH0sCisgIHsgIm1vdmIiLAlHYiwgRWIgfSwKKyAgeyAibW92UyIsCUd2LCBFdiB9LAorICB7ICJtb3Z3IiwJRXcsIFN3IH0sCisgIHsgImxlYVMiLAlHdiwgTSB9LAorICB7ICJtb3Z3IiwJU3csIEV3IH0sCisgIHsgInBvcFMiLAlFdiB9LAorICAvKiA5MCAqLworICB7ICJub3AiIH0sCisgIHsgInhjaGdTIiwJZUNYLCBlQVggfSwKKyAgeyAieGNoZ1MiLAllRFgsIGVBWCB9LAorICB7ICJ4Y2hnUyIsCWVCWCwgZUFYIH0sCisgIHsgInhjaGdTIiwJZVNQLCBlQVggfSwKKyAgeyAieGNoZ1MiLAllQlAsIGVBWCB9LAorICB7ICJ4Y2hnUyIsCWVTSSwgZUFYIH0sCisgIHsgInhjaGdTIiwJZURJLCBlQVggfSwKKyAgLyogOTggKi8KKyAgeyAiY3d0bCIgfSwKKyAgeyAiY2x0ZCIgfSwKKyAgeyAibGNhbGwiLAlBcCB9LAorICB7ICIoYmFkKSIgfSwJCS8qIGZ3YWl0ICovCisgIHsgInB1c2hmIiB9LAorICB7ICJwb3BmIiB9LAorICB7ICJzYWhmIiB9LAorICB7ICJsYWhmIiB9LAorICAvKiBhMCAqLworICB7ICJtb3ZiIiwJQUwsIE9iIH0sCisgIHsgIm1vdlMiLAllQVgsIE92IH0sCisgIHsgIm1vdmIiLAlPYiwgQUwgfSwKKyAgeyAibW92UyIsCU92LCBlQVggfSwKKyAgeyAibW92c2IiLAlZYiwgWGIgfSwKKyAgeyAibW92c1MiLAlZdiwgWHYgfSwKKyAgeyAiY21wc2IiLAlZYiwgWGIgfSwKKyAgeyAiY21wc1MiLAlZdiwgWHYgfSwKKyAgLyogYTggKi8KKyAgeyAidGVzdGIiLAlBTCwgSWIgfSwKKyAgeyAidGVzdFMiLAllQVgsIEl2IH0sCisgIHsgInN0b3NiIiwJWWIsIEFMIH0sCisgIHsgInN0b3NTIiwJWXYsIGVBWCB9LAorICB7ICJsb2RzYiIsCUFMLCBYYiB9LAorICB7ICJsb2RzUyIsCWVBWCwgWHYgfSwKKyAgeyAic2Nhc2IiLAlBTCwgWGIgfSwKKyAgeyAic2Nhc1MiLAllQVgsIFh2IH0sCisgIC8qIGIwICovCisgIHsgIm1vdmIiLAlBTCwgSWIgfSwKKyAgeyAibW92YiIsCUNMLCBJYiB9LAorICB7ICJtb3ZiIiwJREwsIEliIH0sCisgIHsgIm1vdmIiLAlCTCwgSWIgfSwKKyAgeyAibW92YiIsCUFILCBJYiB9LAorICB7ICJtb3ZiIiwJQ0gsIEliIH0sCisgIHsgIm1vdmIiLAlESCwgSWIgfSwKKyAgeyAibW92YiIsCUJILCBJYiB9LAorICAvKiBiOCAqLworICB7ICJtb3ZTIiwJZUFYLCBJdiB9LAorICB7ICJtb3ZTIiwJZUNYLCBJdiB9LAorICB7ICJtb3ZTIiwJZURYLCBJdiB9LAorICB7ICJtb3ZTIiwJZUJYLCBJdiB9LAorICB7ICJtb3ZTIiwJZVNQLCBJdiB9LAorICB7ICJtb3ZTIiwJZUJQLCBJdiB9LAorICB7ICJtb3ZTIiwJZVNJLCBJdiB9LAorICB7ICJtb3ZTIiwJZURJLCBJdiB9LAorICAvKiBjMCAqLworICB7IEdSUDJiIH0sCisgIHsgR1JQMlMgfSwKKyAgeyAicmV0IiwJSXcgfSwKKyAgeyAicmV0IiB9LAorICB7ICJsZXNTIiwJR3YsIE1wIH0sCisgIHsgImxkc1MiLAlHdiwgTXAgfSwKKyAgeyAibW92YiIsCUViLCBJYiB9LAorICB7ICJtb3ZTIiwJRXYsIEl2IH0sCisgIC8qIGM4ICovCisgIHsgImVudGVyIiwJSXcsIEliIH0sCisgIHsgImxlYXZlIiB9LAorICB7ICJscmV0IiwJSXcgfSwKKyAgeyAibHJldCIgfSwKKyAgeyAiaW50MyIgfSwKKyAgeyAiaW50IiwJSWIgfSwKKyAgeyAiaW50byIgfSwKKyAgeyAiaXJldCIgfSwKKyAgLyogZDAgKi8KKyAgeyBHUlAyYl9vbmUgfSwKKyAgeyBHUlAyU19vbmUgfSwKKyAgeyBHUlAyYl9jbCB9LAorICB7IEdSUDJTX2NsIH0sCisgIHsgImFhbSIsCUliIH0sCisgIHsgImFhZCIsCUliIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJ4bGF0IiB9LAorICAvKiBkOCAqLworICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgLyogZTAgKi8KKyAgeyAibG9vcG5lIiwJSmIgfSwKKyAgeyAibG9vcGUiLAlKYiB9LAorICB7ICJsb29wIiwJSmIgfSwKKyAgeyAiakNjeHoiLAlKYiB9LAorICB7ICJpbmIiLAlBTCwgSWIgfSwKKyAgeyAiaW5TIiwJZUFYLCBJYiB9LAorICB7ICJvdXRiIiwJSWIsIEFMIH0sCisgIHsgIm91dFMiLAlJYiwgZUFYIH0sCisgIC8qIGU4ICovCisgIHsgImNhbGwiLAlBdiB9LAorICB7ICJqbXAiLAlKdiB9LAorICB7ICJsam1wIiwJQXAgfSwKKyAgeyAiam1wIiwJSmIgfSwKKyAgeyAiaW5iIiwJQUwsIGluZGlyRFggfSwKKyAgeyAiaW5TIiwJZUFYLCBpbmRpckRYIH0sCisgIHsgIm91dGIiLAlpbmRpckRYLCBBTCB9LAorICB7ICJvdXRTIiwJaW5kaXJEWCwgZUFYIH0sCisgIC8qIGYwICovCisgIHsgIihiYWQpIiB9LAkJCS8qIGxvY2sgcHJlZml4ICovCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwJCQkvKiByZXBuZSAqLworICB7ICIoYmFkKSIgfSwJCQkvKiByZXB6ICovCisgIHsgImhsdCIgfSwKKyAgeyAiY21jIiB9LAorICB7IEdSUDNiIH0sCisgIHsgR1JQM1MgfSwKKyAgLyogZjggKi8KKyAgeyAiY2xjIiB9LAorICB7ICJzdGMiIH0sCisgIHsgImNsaSIgfSwKKyAgeyAic3RpIiB9LAorICB7ICJjbGQiIH0sCisgIHsgInN0ZCIgfSwKKyAgeyBHUlA0IH0sCisgIHsgR1JQNSB9LAorfTsKKworc3RydWN0IGRpczM4NiBkaXMzODZfdHdvYnl0ZVtdID0geworICAvKiAwMCAqLworICB7IEdSUDYgfSwKKyAgeyBHUlA3IH0sCisgIHsgImxhclMiLCBHdiwgRXcgfSwKKyAgeyAibHNsUyIsIEd2LCBFdyB9LCAgCisgIHsgIihiYWQpIiB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAiY2x0cyIgfSwKKyAgeyAiKGJhZCkiIH0sICAKKyAgLyogMDggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogMTAgKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogMTggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogMjAgKi8KKyAgLyogdGhlc2UgYXJlIGFsbCBiYWNrd2FyZCBpbiBhcHBlbmRpeCBBIG9mIHRoZSBpbnRlbCBib29rICovCisgIHsgIm1vdmwiLCBSZCwgQ2QgfSwKKyAgeyAibW92bCIsIFJkLCBEZCB9LAorICB7ICJtb3ZsIiwgQ2QsIFJkIH0sCisgIHsgIm1vdmwiLCBEZCwgUmQgfSwgIAorICB7ICJtb3ZsIiwgUmQsIFRkIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJtb3ZsIiwgVGQsIFJkIH0sCisgIHsgIihiYWQpIiB9LCAgCisgIC8qIDI4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDMwICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDM4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDQwICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDQ4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDUwICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDU4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDYwICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDY4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDcwICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDc4ICovCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgCisgIC8qIDgwICovCisgIHsgImpvIiwgSnYgfSwKKyAgeyAiam5vIiwgSnYgfSwKKyAgeyAiamIiLCBKdiB9LAorICB7ICJqYWUiLCBKdiB9LCAgCisgIHsgImplIiwgSnYgfSwKKyAgeyAiam5lIiwgSnYgfSwKKyAgeyAiamJlIiwgSnYgfSwKKyAgeyAiamEiLCBKdiB9LCAgCisgIC8qIDg4ICovCisgIHsgImpzIiwgSnYgfSwKKyAgeyAiam5zIiwgSnYgfSwKKyAgeyAianAiLCBKdiB9LAorICB7ICJqbnAiLCBKdiB9LCAgCisgIHsgImpsIiwgSnYgfSwKKyAgeyAiamdlIiwgSnYgfSwKKyAgeyAiamxlIiwgSnYgfSwKKyAgeyAiamciLCBKdiB9LCAgCisgIC8qIDkwICovCisgIHsgInNldG8iLCBFYiB9LAorICB7ICJzZXRubyIsIEViIH0sCisgIHsgInNldGIiLCBFYiB9LAorICB7ICJzZXRhZSIsIEViIH0sCisgIHsgInNldGUiLCBFYiB9LAorICB7ICJzZXRuZSIsIEViIH0sCisgIHsgInNldGJlIiwgRWIgfSwKKyAgeyAic2V0YSIsIEViIH0sCisgIC8qIDk4ICovCisgIHsgInNldHMiLCBFYiB9LAorICB7ICJzZXRucyIsIEViIH0sCisgIHsgInNldHAiLCBFYiB9LAorICB7ICJzZXRucCIsIEViIH0sCisgIHsgInNldGwiLCBFYiB9LAorICB7ICJzZXRnZSIsIEViIH0sCisgIHsgInNldGxlIiwgRWIgfSwKKyAgeyAic2V0ZyIsIEViIH0sICAKKyAgLyogYTAgKi8KKyAgeyAicHVzaGwiLCBmcyB9LAorICB7ICJwb3BsIiwgZnMgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgImJ0UyIsIEV2LCBHdiB9LCAgCisgIHsgInNobGRTIiwgRXYsIEd2LCBJYiB9LAorICB7ICJzaGxkUyIsIEV2LCBHdiwgQ0wgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LCAgCisgIC8qIGE4ICovCisgIHsgInB1c2hsIiwgZ3MgfSwKKyAgeyAicG9wbCIsIGdzIH0sCisgIHsgIihiYWQpIiB9LAorICB7ICJidHNTIiwgRXYsIEd2IH0sICAKKyAgeyAic2hyZFMiLCBFdiwgR3YsIEliIH0sCisgIHsgInNocmRTIiwgRXYsIEd2LCBDTCB9LAorICB7ICIoYmFkKSIgfSwKKyAgeyAiaW11bFMiLCBHdiwgRXYgfSwgIAorICAvKiBiMCAqLworICB7ICIoYmFkKSIgfSwKKyAgeyAiKGJhZCkiIH0sCisgIHsgImxzc1MiLCBHdiwgTXAgfSwJLyogMzg2IGxpc3RzIG9ubHkgTXAgKi8KKyAgeyAiYnRyUyIsIEV2LCBHdiB9LCAgCisgIHsgImxmc1MiLCBHdiwgTXAgfSwJLyogMzg2IGxpc3RzIG9ubHkgTXAgKi8KKyAgeyAibGdzUyIsIEd2LCBNcCB9LAkvKiAzODYgbGlzdHMgb25seSBNcCAqLworICB7ICJtb3Z6YlMiLCBHdiwgRWIgfSwKKyAgeyAibW92endTIiwgR3YsIEV3IH0sICAKKyAgLyogYjggKi8KKyAgeyAiKGJhZCkiIH0sCisgIHsgIihiYWQpIiB9LAorICB7IEdSUDggfSwKKyAgeyAiYnRjUyIsIEV2LCBHdiB9LCAgCisgIHsgImJzZlMiLCBHdiwgRXYgfSwKKyAgeyAiYnNyUyIsIEd2LCBFdiB9LAorICB7ICJtb3ZzYlMiLCBHdiwgRWIgfSwKKyAgeyAibW92c3dTIiwgR3YsIEV3IH0sICAKKyAgLyogYzAgKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogYzggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogZDAgKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogZDggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogZTAgKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogZTggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogZjAgKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgLyogZjggKi8KKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKKyAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICAKK307CisKK3N0YXRpYyBjaGFyIG9idWZbMTAwXTsKK3N0YXRpYyBjaGFyICpvYnVmcDsKK3N0YXRpYyBjaGFyIHNjcmF0Y2hidWZbMTAwXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzdGFydF9jb2RlcDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2RlcDsKK3N0YXRpYyBpbnQgbW9kOworc3RhdGljIGludCBybTsKK3N0YXRpYyBpbnQgcmVnOworc3RhdGljIHZvaWQgb2FwcGVuZCAoKTsKKworc3RhdGljIGNoYXIgKm5hbWVzMzJbXT17CisgICIlZWF4IiwiJWVjeCIsIiVlZHgiLCIlZWJ4IiwgIiVlc3AiLCIlZWJwIiwiJWVzaSIsIiVlZGkiLAorfTsKK3N0YXRpYyBjaGFyICpuYW1lczE2W10gPSB7CisgICIlYXgiLCIlY3giLCIlZHgiLCIlYngiLCIlc3AiLCIlYnAiLCIlc2kiLCIlZGkiLAorfTsKK3N0YXRpYyBjaGFyICpuYW1lczhbXSA9IHsKKyAgIiVhbCIsIiVjbCIsIiVkbCIsIiVibCIsIiVhaCIsIiVjaCIsIiVkaCIsIiViaCIsCit9Oworc3RhdGljIGNoYXIgKm5hbWVzX3NlZ1tdID0geworICAiJWVzIiwiJWNzIiwiJXNzIiwiJWRzIiwiJWZzIiwiJWdzIiwiJT8iLCIlPyIsCit9OworCitzdHJ1Y3QgZGlzMzg2IGdycHNbXVs4XSA9IHsKKyAgLyogR1JQMWIgKi8KKyAgeworICAgIHsgImFkZGIiLAlFYiwgSWIgfSwKKyAgICB7ICJvcmIiLAlFYiwgSWIgfSwKKyAgICB7ICJhZGNiIiwJRWIsIEliIH0sCisgICAgeyAic2JiYiIsCUViLCBJYiB9LAorICAgIHsgImFuZGIiLAlFYiwgSWIgfSwKKyAgICB7ICJzdWJiIiwJRWIsIEliIH0sCisgICAgeyAieG9yYiIsCUViLCBJYiB9LAorICAgIHsgImNtcGIiLAlFYiwgSWIgfQorICB9LAorICAvKiBHUlAxUyAqLworICB7CisgICAgeyAiYWRkUyIsCUV2LCBJdiB9LAorICAgIHsgIm9yUyIsCUV2LCBJdiB9LAorICAgIHsgImFkY1MiLAlFdiwgSXYgfSwKKyAgICB7ICJzYmJTIiwJRXYsIEl2IH0sCisgICAgeyAiYW5kUyIsCUV2LCBJdiB9LAorICAgIHsgInN1YlMiLAlFdiwgSXYgfSwKKyAgICB7ICJ4b3JTIiwJRXYsIEl2IH0sCisgICAgeyAiY21wUyIsCUV2LCBJdiB9CisgIH0sCisgIC8qIEdSUDFTcyAqLworICB7CisgICAgeyAiYWRkUyIsCUV2LCBzSWIgfSwKKyAgICB7ICJvclMiLAlFdiwgc0liIH0sCisgICAgeyAiYWRjUyIsCUV2LCBzSWIgfSwKKyAgICB7ICJzYmJTIiwJRXYsIHNJYiB9LAorICAgIHsgImFuZFMiLAlFdiwgc0liIH0sCisgICAgeyAic3ViUyIsCUV2LCBzSWIgfSwKKyAgICB7ICJ4b3JTIiwJRXYsIHNJYiB9LAorICAgIHsgImNtcFMiLAlFdiwgc0liIH0KKyAgfSwKKyAgLyogR1JQMmIgKi8KKyAgeworICAgIHsgInJvbGIiLAlFYiwgSWIgfSwKKyAgICB7ICJyb3JiIiwJRWIsIEliIH0sCisgICAgeyAicmNsYiIsCUViLCBJYiB9LAorICAgIHsgInJjcmIiLAlFYiwgSWIgfSwKKyAgICB7ICJzaGxiIiwJRWIsIEliIH0sCisgICAgeyAic2hyYiIsCUViLCBJYiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInNhcmIiLAlFYiwgSWIgfSwKKyAgfSwKKyAgLyogR1JQMlMgKi8KKyAgeworICAgIHsgInJvbFMiLAlFdiwgSWIgfSwKKyAgICB7ICJyb3JTIiwJRXYsIEliIH0sCisgICAgeyAicmNsUyIsCUV2LCBJYiB9LAorICAgIHsgInJjclMiLAlFdiwgSWIgfSwKKyAgICB7ICJzaGxTIiwJRXYsIEliIH0sCisgICAgeyAic2hyUyIsCUV2LCBJYiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInNhclMiLAlFdiwgSWIgfSwKKyAgfSwKKyAgLyogR1JQMmJfb25lICovCisgIHsKKyAgICB7ICJyb2xiIiwJRWIgfSwKKyAgICB7ICJyb3JiIiwJRWIgfSwKKyAgICB7ICJyY2xiIiwJRWIgfSwKKyAgICB7ICJyY3JiIiwJRWIgfSwKKyAgICB7ICJzaGxiIiwJRWIgfSwKKyAgICB7ICJzaHJiIiwJRWIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJzYXJiIiwJRWIgfSwKKyAgfSwKKyAgLyogR1JQMlNfb25lICovCisgIHsKKyAgICB7ICJyb2xTIiwJRXYgfSwKKyAgICB7ICJyb3JTIiwJRXYgfSwKKyAgICB7ICJyY2xTIiwJRXYgfSwKKyAgICB7ICJyY3JTIiwJRXYgfSwKKyAgICB7ICJzaGxTIiwJRXYgfSwKKyAgICB7ICJzaHJTIiwJRXYgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJzYXJTIiwJRXYgfSwKKyAgfSwKKyAgLyogR1JQMmJfY2wgKi8KKyAgeworICAgIHsgInJvbGIiLAlFYiwgQ0wgfSwKKyAgICB7ICJyb3JiIiwJRWIsIENMIH0sCisgICAgeyAicmNsYiIsCUViLCBDTCB9LAorICAgIHsgInJjcmIiLAlFYiwgQ0wgfSwKKyAgICB7ICJzaGxiIiwJRWIsIENMIH0sCisgICAgeyAic2hyYiIsCUViLCBDTCB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInNhcmIiLAlFYiwgQ0wgfSwKKyAgfSwKKyAgLyogR1JQMlNfY2wgKi8KKyAgeworICAgIHsgInJvbFMiLAlFdiwgQ0wgfSwKKyAgICB7ICJyb3JTIiwJRXYsIENMIH0sCisgICAgeyAicmNsUyIsCUV2LCBDTCB9LAorICAgIHsgInJjclMiLAlFdiwgQ0wgfSwKKyAgICB7ICJzaGxTIiwJRXYsIENMIH0sCisgICAgeyAic2hyUyIsCUV2LCBDTCB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgInNhclMiLAlFdiwgQ0wgfQorICB9LAorICAvKiBHUlAzYiAqLworICB7CisgICAgeyAidGVzdGIiLAlFYiwgSWIgfSwKKyAgICB7ICIoYmFkKSIsCUViIH0sCisgICAgeyAibm90YiIsCUViIH0sCisgICAgeyAibmVnYiIsCUViIH0sCisgICAgeyAibXVsYiIsCUFMLCBFYiB9LAorICAgIHsgImltdWxiIiwJQUwsIEViIH0sCisgICAgeyAiZGl2YiIsCUFMLCBFYiB9LAorICAgIHsgImlkaXZiIiwJQUwsIEViIH0KKyAgfSwKKyAgLyogR1JQM1MgKi8KKyAgeworICAgIHsgInRlc3RTIiwJRXYsIEl2IH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAibm90UyIsCUV2IH0sCisgICAgeyAibmVnUyIsCUV2IH0sCisgICAgeyAibXVsUyIsCWVBWCwgRXYgfSwKKyAgICB7ICJpbXVsUyIsCWVBWCwgRXYgfSwKKyAgICB7ICJkaXZTIiwJZUFYLCBFdiB9LAorICAgIHsgImlkaXZTIiwJZUFYLCBFdiB9LAorICB9LAorICAvKiBHUlA0ICovCisgIHsKKyAgICB7ICJpbmNiIiwgRWIgfSwKKyAgICB7ICJkZWNiIiwgRWIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogR1JQNSAqLworICB7CisgICAgeyAiaW5jUyIsCUV2IH0sCisgICAgeyAiZGVjUyIsCUV2IH0sCisgICAgeyAiY2FsbCIsCWluZGlyRXYgfSwKKyAgICB7ICJsY2FsbCIsCWluZGlyRXYgfSwKKyAgICB7ICJqbXAiLAlpbmRpckV2IH0sCisgICAgeyAibGptcCIsCWluZGlyRXYgfSwKKyAgICB7ICJwdXNoUyIsCUV2IH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCisgIC8qIEdSUDYgKi8KKyAgeworICAgIHsgInNsZHQiLAlFdyB9LAorICAgIHsgInN0ciIsCUV3IH0sCisgICAgeyAibGxkdCIsCUV3IH0sCisgICAgeyAibHRyIiwJRXcgfSwKKyAgICB7ICJ2ZXJyIiwJRXcgfSwKKyAgICB7ICJ2ZXJ3IiwJRXcgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfQorICB9LAorICAvKiBHUlA3ICovCisgIHsKKyAgICB7ICJzZ2R0IiwgRXcgfSwKKyAgICB7ICJzaWR0IiwgRXcgfSwKKyAgICB7ICJsZ2R0IiwgRXcgfSwKKyAgICB7ICJsaWR0IiwgRXcgfSwKKyAgICB7ICJzbXN3IiwgRXcgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJsbXN3IiwgRXcgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogR1JQOCAqLworICB7CisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiYnRTIiwJRXYsIEliIH0sCisgICAgeyAiYnRzUyIsCUV2LCBJYiB9LAorICAgIHsgImJ0clMiLAlFdiwgSWIgfSwKKyAgICB7ICJidGNTIiwJRXYsIEliIH0sCisgIH0KK307CisKKyNkZWZpbmUgUFJFRklYX1JFUFogMQorI2RlZmluZSBQUkVGSVhfUkVQTlogMgorI2RlZmluZSBQUkVGSVhfTE9DSyA0CisjZGVmaW5lIFBSRUZJWF9DUyA4CisjZGVmaW5lIFBSRUZJWF9TUyAweDEwCisjZGVmaW5lIFBSRUZJWF9EUyAweDIwCisjZGVmaW5lIFBSRUZJWF9FUyAweDQwCisjZGVmaW5lIFBSRUZJWF9GUyAweDgwCisjZGVmaW5lIFBSRUZJWF9HUyAweDEwMAorI2RlZmluZSBQUkVGSVhfREFUQSAweDIwMAorI2RlZmluZSBQUkVGSVhfQURSIDB4NDAwCisjZGVmaW5lIFBSRUZJWF9GV0FJVCAweDgwMAorCitzdGF0aWMgaW50IHByZWZpeGVzOworCitzdGF0aWMgdm9pZAorY2twcmVmaXggKCkKK3sKKyAgcHJlZml4ZXMgPSAwOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBzd2l0Y2ggKCpjb2RlcCkKKwl7CisJY2FzZSAweGYzOgorCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUFo7CisJICBicmVhazsKKwljYXNlIDB4ZjI6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7CisJICBicmVhazsKKwljYXNlIDB4ZjA6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfTE9DSzsKKwkgIGJyZWFrOworCWNhc2UgMHgyZToKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9DUzsKKwkgIGJyZWFrOworCWNhc2UgMHgzNjoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9TUzsKKwkgIGJyZWFrOworCWNhc2UgMHgzZToKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9EUzsKKwkgIGJyZWFrOworCWNhc2UgMHgyNjoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9FUzsKKwkgIGJyZWFrOworCWNhc2UgMHg2NDoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9GUzsKKwkgIGJyZWFrOworCWNhc2UgMHg2NToKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9HUzsKKwkgIGJyZWFrOworCWNhc2UgMHg2NjoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9EQVRBOworCSAgYnJlYWs7CisJY2FzZSAweDY3OgorCSAgcHJlZml4ZXMgfD0gUFJFRklYX0FEUjsKKwkgIGJyZWFrOworCWNhc2UgMHg5YjoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICByZXR1cm47CisJfQorICAgICAgY29kZXArKzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGZsYWc7CitzdGF0aWMgaW50IGFmbGFnOwkJCisKK3N0YXRpYyBjaGFyIG9wMW91dFsxMDBdLCBvcDJvdXRbMTAwXSwgb3Azb3V0WzEwMF07CitzdGF0aWMgaW50IG9wX2FkZHJlc3NbM10sIG9wX2FkLCBvcF9pbmRleFszXTsKK3N0YXRpYyBpbnQgc3RhcnRfcGM7CitleHRlcm4gdm9pZCBmcHV0c19maWx0ZXJlZCAoKTsKKworLyoKKyAqIGRpc2Fzc2VtYmxlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiAnaW5idWYnLiAgWW91IGhhdmUgdG8gbWFrZQorICogICBzdXJlIGFsbCBvZiB0aGUgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSBmaWxsZWQgaW4uCisgKiAgIE9uIHRoZSAzODYncyBvZiAxOTg4LCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMgMTUgYnl0ZXMuCisgKiAgIChzZWUgdG9waWMgIlJlZHVuZGFudCBwcmVmaXhlcyIgaW4gdGhlICJEaWZmZXJlbmNlcyBmcm9tIDgwODYiCisgKiAgIHNlY3Rpb24gb2YgdGhlICJWaXJ0dWFsIDgwODYgTW9kZSIgY2hhcHRlci4pCisgKiAncGMnIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGlzIGluc3RydWN0aW9uLCBpdCB3aWxsCisgKiAgIGJlIHVzZWQgdG8gcHJpbnQgdGhlIHRhcmdldCBhZGRyZXNzIGlmIHRoaXMgaXMgYSByZWxhdGl2ZSBqdW1wIG9yIGNhbGwKKyAqICdvdXRidWYnIGdldHMgZmlsbGVkIGluIHdpdGggdGhlIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbi4gIGl0IHNob3VsZAorICogICBiZSBsb25nIGVub3VnaCB0byBob2xkIHRoZSBsb25nZXN0IGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbi4KKyAqICAgMTAwIGJ5dGVzIGlzIGNlcnRhaW5seSBlbm91Z2gsIHVubGVzcyBzeW1ib2wgcHJpbnRpbmcgaXMgYWRkZWQgbGF0ZXIKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAqLworCitpbnQKK2kzODZkaXMgKHBjLCBpbmJ1Ziwgc3RyZWFtKQorICAgICBpbnQgcGM7CisgICAgIHVuc2lnbmVkIGNoYXIgKmluYnVmOworICAgICBGSUxFICpzdHJlYW07Cit7CisgIHN0cnVjdCBkaXMzODYgKmRwOworICBpbnQgaTsKKyAgaW50IGVudGVyX2luc3RydWN0aW9uOworICBjaGFyICpmaXJzdCwgKnNlY29uZCwgKnRoaXJkOworICBpbnQgbmVlZGNvbW1hOworICAKKyAgb2J1ZlswXSA9IDA7CisgIG9wMW91dFswXSA9IDA7CisgIG9wMm91dFswXSA9IDA7CisgIG9wM291dFswXSA9IDA7CisKKyAgb3BfaW5kZXhbMF0gPSBvcF9pbmRleFsxXSA9IG9wX2luZGV4WzJdID0gLTE7CisgIAorICBzdGFydF9wYyA9IHBjOworICBzdGFydF9jb2RlcCA9IGluYnVmOworICBjb2RlcCA9IGluYnVmOworICAKKyAgY2twcmVmaXggKCk7CisgIAorICBpZiAoKmNvZGVwID09IDB4YzgpCisgICAgZW50ZXJfaW5zdHJ1Y3Rpb24gPSAxOworICBlbHNlCisgICAgZW50ZXJfaW5zdHJ1Y3Rpb24gPSAwOworICAKKyAgb2J1ZnAgPSBvYnVmOworICAKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUFopCisgICAgb2FwcGVuZCAoInJlcHogIik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBOWikKKyAgICBvYXBwZW5kICgicmVwbnogIik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9MT0NLKQorICAgIG9hcHBlbmQgKCJsb2NrICIpOworICAKKyAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkKKyAgICAgICYmICgoKmNvZGVwIDwgMHhkOCkgfHwgKCpjb2RlcCA+IDB4ZGYpKSkKKyAgICB7CisgICAgICAvKiBmd2FpdCBub3QgZm9sbG93ZWQgYnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiZndhaXQiLCBzdHJlYW0pOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisgIAorICAvKiB0aGVzZSB3b3VsZCBiZSBpbml0aWFsaXplZCB0byAwIGlmIGRpc2Fzc2VtYmxpbmcgZm9yIDgwODYgb3IgMjg2ICovCisKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCisgICAgZGZsYWcgXj0gMTsKKyAgCisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9BRFIpCisgICAgeworICAgICAgYWZsYWcgXj0gMTsKKyAgICAgIG9hcHBlbmQgKCJhZGRyMTYgIik7CisgICAgfQorICAKKyAgaWYgKCpjb2RlcCA9PSAweDBmKQorICAgIGRwID0gJmRpczM4Nl90d29ieXRlWyorK2NvZGVwXTsKKyAgZWxzZQorICAgIGRwID0gJmRpczM4NlsqY29kZXBdOworICBjb2RlcCsrOworICBtb2QgPSAoKmNvZGVwID4+IDYpICYgMzsKKyAgcmVnID0gKCpjb2RlcCA+PiAzKSAmIDc7CisgIHJtID0gKmNvZGVwICYgNzsKKyAgCisgIGlmIChkcC0+bmFtZSA9PSBOVUxMICYmIGRwLT5ieXRlbW9kZTEgPT0gRkxPQVRDT0RFKQorICAgIHsKKyAgICAgIGRvZmxvYXQgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGRwLT5uYW1lID09IE5VTEwpCisJZHAgPSAmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtyZWddOworICAgICAgCisgICAgICBwdXRvcCAoZHAtPm5hbWUpOworICAgICAgCisgICAgICBvYnVmcCA9IG9wMW91dDsKKyAgICAgIG9wX2FkID0gMjsKKyAgICAgIGlmIChkcC0+b3AxKQorCSgqZHAtPm9wMSkoZHAtPmJ5dGVtb2RlMSk7CisgICAgICAKKyAgICAgIG9idWZwID0gb3Ayb3V0OworICAgICAgb3BfYWQgPSAxOworICAgICAgaWYgKGRwLT5vcDIpCisJKCpkcC0+b3AyKShkcC0+Ynl0ZW1vZGUyKTsKKyAgICAgIAorICAgICAgb2J1ZnAgPSBvcDNvdXQ7CisgICAgICBvcF9hZCA9IDA7CisgICAgICBpZiAoZHAtPm9wMykKKwkoKmRwLT5vcDMpKGRwLT5ieXRlbW9kZTMpOworICAgIH0KKyAgCisgIG9idWZwID0gb2J1ZiArIHN0cmxlbiAob2J1Zik7CisgIGZvciAoaSA9IHN0cmxlbiAob2J1Zik7IGkgPCA2OyBpKyspCisgICAgb2FwcGVuZCAoIiAiKTsKKyAgb2FwcGVuZCAoIiAiKTsKKyAgZnB1dHNfZmlsdGVyZWQgKG9idWYsIHN0cmVhbSk7CisgIAorICAvKiBlbnRlciBpbnN0cnVjdGlvbiBpcyBwcmludGVkIHdpdGggb3BlcmFuZHMgaW4gdGhlCisgICAqIHNhbWUgb3JkZXIgYXMgdGhlIGludGVsIGJvb2s7IGV2ZXJ5dGhpbmcgZWxzZQorICAgKiBpcyBwcmludGVkIGluIHJldmVyc2Ugb3JkZXIgCisgICAqLworICBpZiAoZW50ZXJfaW5zdHJ1Y3Rpb24pCisgICAgeworICAgICAgZmlyc3QgPSBvcDFvdXQ7CisgICAgICBzZWNvbmQgPSBvcDJvdXQ7CisgICAgICB0aGlyZCA9IG9wM291dDsKKyAgICAgIG9wX2FkID0gb3BfaW5kZXhbMF07CisgICAgICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzJdOworICAgICAgb3BfaW5kZXhbMl0gPSBvcF9hZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXJzdCA9IG9wM291dDsKKyAgICAgIHNlY29uZCA9IG9wMm91dDsKKyAgICAgIHRoaXJkID0gb3Axb3V0OworICAgIH0KKyAgbmVlZGNvbW1hID0gMDsKKyAgaWYgKCpmaXJzdCkKKyAgICB7CisgICAgICBpZiAob3BfaW5kZXhbMF0gIT0gLTEpCisJcHJpbnRfYWRkcmVzcyAob3BfYWRkcmVzc1tvcF9pbmRleFswXV0sIHN0cmVhbSk7CisgICAgICBlbHNlCisJZnB1dHNfZmlsdGVyZWQgKGZpcnN0LCBzdHJlYW0pOworICAgICAgbmVlZGNvbW1hID0gMTsKKyAgICB9CisgIGlmICgqc2Vjb25kKQorICAgIHsKKyAgICAgIGlmIChuZWVkY29tbWEpCisJZnB1dHNfZmlsdGVyZWQgKCIsIiwgc3RyZWFtKTsKKyAgICAgIGlmIChvcF9pbmRleFsxXSAhPSAtMSkKKwlwcmludF9hZGRyZXNzIChvcF9hZGRyZXNzW29wX2luZGV4WzFdXSwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0c19maWx0ZXJlZCAoc2Vjb25kLCBzdHJlYW0pOworICAgICAgbmVlZGNvbW1hID0gMTsKKyAgICB9CisgIGlmICgqdGhpcmQpCisgICAgeworICAgICAgaWYgKG5lZWRjb21tYSkKKwlmcHV0c19maWx0ZXJlZCAoIiwiLCBzdHJlYW0pOworICAgICAgaWYgKG9wX2luZGV4WzJdICE9IC0xKQorCXByaW50X2FkZHJlc3MgKG9wX2FkZHJlc3Nbb3BfaW5kZXhbMl1dLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwdXRzX2ZpbHRlcmVkICh0aGlyZCwgc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiAoY29kZXAgLSBpbmJ1Zik7Cit9CisKK2NoYXIgKmZsb2F0X21lbVtdID0geworICAvKiBkOCAqLworICAiZmFkZHMiLAorICAiZm11bHMiLAorICAiZmNvbXMiLAorICAiZmNvbXBzIiwKKyAgImZzdWJzIiwKKyAgImZzdWJycyIsCisgICJmZGl2cyIsCisgICJmZGl2cnMiLAorICAvKiAgZDkgKi8KKyAgImZsZHMiLAorICAiKGJhZCkiLAorICAiZnN0cyIsCisgICJmc3RwcyIsCisgICJmbGRlbnYiLAorICAiZmxkY3ciLAorICAiZk5zdGVudiIsCisgICJmTnN0Y3ciLAorICAvKiBkYSAqLworICAiZmlhZGRsIiwKKyAgImZpbXVsbCIsCisgICJmaWNvbWwiLAorICAiZmljb21wbCIsCisgICJmaXN1YmwiLAorICAiZmlzdWJybCIsCisgICJmaWRpdmwiLAorICAiZmlkaXZybCIsCisgIC8qIGRiICovCisgICJmaWxkbCIsCisgICIoYmFkKSIsCisgICJmaXN0bCIsCisgICJmaXN0cGwiLAorICAiKGJhZCkiLAorICAiZmxkdCIsCisgICIoYmFkKSIsCisgICJmc3RwdCIsCisgIC8qIGRjICovCisgICJmYWRkbCIsCisgICJmbXVsbCIsCisgICJmY29tbCIsCisgICJmY29tcGwiLAorICAiZnN1YmwiLAorICAiZnN1YnJsIiwKKyAgImZkaXZsIiwKKyAgImZkaXZybCIsCisgIC8qIGRkICovCisgICJmbGRsIiwKKyAgIihiYWQpIiwKKyAgImZzdGwiLAorICAiZnN0cGwiLAorICAiZnJzdG9yIiwKKyAgIihiYWQpIiwKKyAgImZOc2F2ZSIsCisgICJmTnN0c3ciLAorICAvKiBkZSAqLworICAiZmlhZGQiLAorICAiZmltdWwiLAorICAiZmljb20iLAorICAiZmljb21wIiwKKyAgImZpc3ViIiwKKyAgImZpc3ViciIsCisgICJmaWRpdiIsCisgICJmaWRpdnIiLAorICAvKiBkZiAqLworICAiZmlsZCIsCisgICIoYmFkKSIsCisgICJmaXN0IiwKKyAgImZpc3RwIiwKKyAgImZibGQiLAorICAiZmlsZGxsIiwKKyAgImZic3RwIiwKKyAgImZpc3RwbGwiLAorfTsKKworI2RlZmluZSBTVCBPUF9TVCwgMAorI2RlZmluZSBTVGkgT1BfU1RpLCAwCitpbnQgT1BfU1QoKSwgT1BfU1RpKCk7CisKKyNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgTlVMTCwgMAorI2RlZmluZSBGR1JQZDlfNCBOVUxMLCBOVUxMLCAxCisjZGVmaW5lIEZHUlBkOV81IE5VTEwsIE5VTEwsIDIKKyNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgTlVMTCwgMworI2RlZmluZSBGR1JQZDlfNyBOVUxMLCBOVUxMLCA0CisjZGVmaW5lIEZHUlBkYV81IE5VTEwsIE5VTEwsIDUKKyNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgTlVMTCwgNgorI2RlZmluZSBGR1JQZGVfMyBOVUxMLCBOVUxMLCA3CisjZGVmaW5lIEZHUlBkZl80IE5VTEwsIE5VTEwsIDgKKworc3RydWN0IGRpczM4NiBmbG9hdF9yZWdbXVs4XSA9IHsKKyAgLyogZDggKi8KKyAgeworICAgIHsgImZhZGQiLAlTVCwgU1RpIH0sCisgICAgeyAiZm11bCIsCVNULCBTVGkgfSwKKyAgICB7ICJmY29tIiwJU1RpIH0sCisgICAgeyAiZmNvbXAiLAlTVGkgfSwKKyAgICB7ICJmc3ViIiwJU1QsIFNUaSB9LAorICAgIHsgImZzdWJyIiwJU1QsIFNUaSB9LAorICAgIHsgImZkaXYiLAlTVCwgU1RpIH0sCisgICAgeyAiZmRpdnIiLAlTVCwgU1RpIH0sCisgIH0sCisgIC8qIGQ5ICovCisgIHsKKyAgICB7ICJmbGQiLAlTVGkgfSwKKyAgICB7ICJmeGNoIiwJU1RpIH0sCisgICAgeyBGR1JQZDlfMiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgRkdSUGQ5XzQgfSwKKyAgICB7IEZHUlBkOV81IH0sCisgICAgeyBGR1JQZDlfNiB9LAorICAgIHsgRkdSUGQ5XzcgfSwKKyAgfSwKKyAgLyogZGEgKi8KKyAgeworICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgRkdSUGRhXzUgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogZGIgKi8KKyAgeworICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgRkdSUGRiXzQgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgfSwKKyAgLyogZGMgKi8KKyAgeworICAgIHsgImZhZGQiLAlTVGksIFNUIH0sCisgICAgeyAiZm11bCIsCVNUaSwgU1QgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICJmc3ViIiwJU1RpLCBTVCB9LAorICAgIHsgImZzdWJyIiwJU1RpLCBTVCB9LAorICAgIHsgImZkaXYiLAlTVGksIFNUIH0sCisgICAgeyAiZmRpdnIiLAlTVGksIFNUIH0sCisgIH0sCisgIC8qIGRkICovCisgIHsKKyAgICB7ICJmZnJlZSIsCVNUaSB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgImZzdCIsCVNUaSB9LAorICAgIHsgImZzdHAiLAlTVGkgfSwKKyAgICB7ICJmdWNvbSIsCVNUaSB9LAorICAgIHsgImZ1Y29tcCIsCVNUaSB9LAorICAgIHsgIihiYWQpIiB9LAorICAgIHsgIihiYWQpIiB9LAorICB9LAorICAvKiBkZSAqLworICB7CisgICAgeyAiZmFkZHAiLAlTVGksIFNUIH0sCisgICAgeyAiZm11bHAiLAlTVGksIFNUIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyBGR1JQZGVfMyB9LAorICAgIHsgImZzdWJwIiwJU1RpLCBTVCB9LAorICAgIHsgImZzdWJycCIsCVNUaSwgU1QgfSwKKyAgICB7ICJmZGl2cCIsCVNUaSwgU1QgfSwKKyAgICB7ICJmZGl2cnAiLAlTVGksIFNUIH0sCisgIH0sCisgIC8qIGRmICovCisgIHsKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7ICIoYmFkKSIgfSwKKyAgICB7IEZHUlBkZl80IH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgICAgeyAiKGJhZCkiIH0sCisgIH0sCit9OworCisKK2NoYXIgKmZncnBzW11bOF0gPSB7CisgIC8qIGQ5XzIgIDAgKi8KKyAgeworICAgICJmbm9wIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAorICB9LAorCisgIC8qIGQ5XzQgIDEgKi8KKyAgeworICAgICJmY2hzIiwiZmFicyIsIihiYWQpIiwiKGJhZCkiLCJmdHN0IiwiZnhhbSIsIihiYWQpIiwiKGJhZCkiLAorICB9LAorCisgIC8qIGQ5XzUgIDIgKi8KKyAgeworICAgICJmbGQxIiwiZmxkbDJ0IiwiZmxkbDJlIiwiZmxkcGkiLCJmbGRsZzIiLCJmbGRsbjIiLCJmbGR6IiwiKGJhZCkiLAorICB9LAorCisgIC8qIGQ5XzYgIDMgKi8KKyAgeworICAgICJmMnhtMSIsImZ5bDJ4IiwiZnB0YW4iLCJmcGF0YW4iLCJmeHRyYWN0IiwiZnByZW0xIiwiZmRlY3N0cCIsImZpbmNzdHAiLAorICB9LAorCisgIC8qIGQ5XzcgIDQgKi8KKyAgeworICAgICJmcHJlbSIsImZ5bDJ4cDEiLCJmc3FydCIsImZzaW5jb3MiLCJmcm5kaW50IiwiZnNjYWxlIiwiZnNpbiIsImZjb3MiLAorICB9LAorCisgIC8qIGRhXzUgIDUgKi8KKyAgeworICAgICIoYmFkKSIsImZ1Y29tcHAiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAorICB9LAorCisgIC8qIGRiXzQgIDYgKi8KKyAgeworICAgICJmZW5pKDI4NyBvbmx5KSIsImZkaXNpKDI4NyBvbmx5KSIsImZOY2xleCIsImZOaW5pdCIsCisgICAgImZOc2V0cG0oMjg3IG9ubHkpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKKyAgfSwKKworICAvKiBkZV8zICA3ICovCisgIHsKKyAgICAiKGJhZCkiLCJmY29tcHAiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAorICB9LAorCisgIC8qIGRmXzQgIDggKi8KKyAgeworICAgICJmTnN0c3ciLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCisgIH0sCit9OworCitzdGF0aWMgdm9pZAorZG9mbG9hdCAoKQoreworICBzdHJ1Y3QgZGlzMzg2ICpkcDsKKyAgdW5zaWduZWQgY2hhciBmbG9hdG9wOworICAKKyAgZmxvYXRvcCA9IGNvZGVwWy0xXTsKKyAgCisgIGlmIChtb2QgIT0gMykKKyAgICB7CisgICAgICBwdXRvcCAoZmxvYXRfbWVtWyhmbG9hdG9wIC0gMHhkOCkgKiA4ICsgcmVnXSk7CisgICAgICBvYnVmcCA9IG9wMW91dDsKKyAgICAgIE9QX0UgKHZfbW9kZSk7CisgICAgICByZXR1cm47CisgICAgfQorICBjb2RlcCsrOworICAKKyAgZHAgPSAmZmxvYXRfcmVnW2Zsb2F0b3AgLSAweGQ4XVtyZWddOworICBpZiAoZHAtPm5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBwdXRvcCAoZmdycHNbZHAtPmJ5dGVtb2RlMV1bcm1dKTsKKyAgICAgIC8qIGluc3RydWN0aW9uIGZuc3RzdyBpcyBvbmx5IG9uZSB3aXRoIHN0cmFuZ2UgYXJnICovCisgICAgICBpZiAoZmxvYXRvcCA9PSAweGRmICYmICpjb2RlcCA9PSAweGUwKQorCXN0cmNweSAob3Axb3V0LCAiJWVheCIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHB1dG9wIChkcC0+bmFtZSk7CisgICAgICBvYnVmcCA9IG9wMW91dDsKKyAgICAgIGlmIChkcC0+b3AxKQorCSgqZHAtPm9wMSkoZHAtPmJ5dGVtb2RlMSk7CisgICAgICBvYnVmcCA9IG9wMm91dDsKKyAgICAgIGlmIChkcC0+b3AyKQorCSgqZHAtPm9wMikoZHAtPmJ5dGVtb2RlMik7CisgICAgfQorfQorCisvKiBBUkdTVVNFRCAqLworaW50CitPUF9TVCAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBvYXBwZW5kICgiJXN0Iik7CisgIHJldHVybiAoMCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitpbnQKK09QX1NUaSAoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVzdCglZCkiLCBybSk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICByZXR1cm4gKDApOworfQorCisKKy8qIGNhcGl0YWwgbGV0dGVycyBpbiB0ZW1wbGF0ZSBhcmUgbWFjcm9zICovCitzdGF0aWMgdm9pZAorcHV0b3AgKHRlbXBsYXRlKQorICAgICBjaGFyICp0ZW1wbGF0ZTsKK3sKKyAgY2hhciAqcDsKKyAgCisgIGZvciAocCA9IHRlbXBsYXRlOyAqcDsgcCsrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKnApCisJeworCWRlZmF1bHQ6CisJICAqb2J1ZnArKyA9ICpwOworCSAgYnJlYWs7CisJY2FzZSAnQyc6CQkvKiBGb3IgamN4ei9qZWN4eiAqLworCSAgaWYgKGFmbGFnID09IDApCisJICAgICpvYnVmcCsrID0gJ2UnOworCSAgYnJlYWs7CisJY2FzZSAnTic6CisJICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKSA9PSAwKQorCSAgICAqb2J1ZnArKyA9ICduJzsKKwkgIGJyZWFrOworCWNhc2UgJ1MnOgorCSAgLyogb3BlcmFuZCBzaXplIGZsYWcgKi8KKwkgIGlmIChkZmxhZykKKwkgICAgKm9idWZwKysgPSAnbCc7CisJICBlbHNlCisJICAgICpvYnVmcCsrID0gJ3cnOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgKm9idWZwID0gMDsKK30KKworc3RhdGljIHZvaWQKK29hcHBlbmQgKHMpCisgICAgIGNoYXIgKnM7Cit7CisgIHN0cmNweSAob2J1ZnAsIHMpOworICBvYnVmcCArPSBzdHJsZW4gKHMpOworICAqb2J1ZnAgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kX3ByZWZpeCAoKQoreworICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQ1MpCisgICAgb2FwcGVuZCAoIiVjczoiKTsKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RTKQorICAgIG9hcHBlbmQgKCIlZHM6Iik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKKyAgICBvYXBwZW5kICgiJXNzOiIpOworICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRVMpCisgICAgb2FwcGVuZCAoIiVlczoiKTsKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX0ZTKQorICAgIG9hcHBlbmQgKCIlZnM6Iik7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKKyAgICBvYXBwZW5kICgiJWdzOiIpOworfQorCitpbnQKK09QX2luZGlyRSAoYnl0ZW1vZGUpCisgICAgIGludCBieXRlbW9kZTsKK3sKKyAgb2FwcGVuZCAoIioiKTsKKyAgT1BfRSAoYnl0ZW1vZGUpOworICByZXR1cm4gKDApOworfQorCitpbnQKK09QX0UgKGJ5dGVtb2RlKQorICAgICBpbnQgYnl0ZW1vZGU7Cit7CisgIGludCBkaXNwOworICBpbnQgaGF2ZXNpYjsKKyAgaW50IGJhc2U7CisgIGludCBpbmRleDsKKyAgaW50IHNjYWxlOworICBpbnQgaGF2ZWJhc2U7CisgIAorICAvKiBza2lwIG1vZC9ybSBieXRlICovCisgIGNvZGVwKys7CisgIAorICBoYXZlc2liID0gMDsKKyAgaGF2ZWJhc2UgPSAwOworICBkaXNwID0gMDsKKyAgCisgIGlmIChtb2QgPT0gMykKKyAgICB7CisgICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQorCXsKKwljYXNlIGJfbW9kZToKKwkgIG9hcHBlbmQgKG5hbWVzOFtybV0pOworCSAgYnJlYWs7CisJY2FzZSB3X21vZGU6CisJICBvYXBwZW5kIChuYW1lczE2W3JtXSk7CisJICBicmVhazsKKwljYXNlIHZfbW9kZToKKwkgIGlmIChkZmxhZykKKwkgICAgb2FwcGVuZCAobmFtZXMzMltybV0pOworCSAgZWxzZQorCSAgICBvYXBwZW5kIChuYW1lczE2W3JtXSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgb2FwcGVuZCAoIjxiYWQgZGlzIHRhYmxlPiIpOworCSAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIAorICBhcHBlbmRfcHJlZml4ICgpOworICBpZiAocm0gPT0gNCkKKyAgICB7CisgICAgICBoYXZlc2liID0gMTsKKyAgICAgIGhhdmViYXNlID0gMTsKKyAgICAgIHNjYWxlID0gKCpjb2RlcCA+PiA2KSAmIDM7CisgICAgICBpbmRleCA9ICgqY29kZXAgPj4gMykgJiA3OworICAgICAgYmFzZSA9ICpjb2RlcCAmIDc7CisgICAgICBjb2RlcCsrOworICAgIH0KKyAgCisgIHN3aXRjaCAobW9kKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKHJtKQorCXsKKwljYXNlIDQ6CisJICAvKiBpbXBsaWVzIGhhdmVzaWIgYW5kIGhhdmViYXNlICovCisJICBpZiAoYmFzZSA9PSA1KSB7CisJICAgIGhhdmViYXNlID0gMDsKKwkgICAgZGlzcCA9IGdldDMyICgpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSA1OgorCSAgZGlzcCA9IGdldDMyICgpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGhhdmViYXNlID0gMTsKKwkgIGJhc2UgPSBybTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGRpc3AgPSAqKGNoYXIgKiljb2RlcCsrOworICAgICAgaWYgKHJtICE9IDQpCisJeworCSAgaGF2ZWJhc2UgPSAxOworCSAgYmFzZSA9IHJtOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGRpc3AgPSBnZXQzMiAoKTsKKyAgICAgIGlmIChybSAhPSA0KQorCXsKKwkgIGhhdmViYXNlID0gMTsKKwkgIGJhc2UgPSBybTsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisgIAorICBpZiAobW9kICE9IDAgfHwgcm0gPT0gNSB8fCAoaGF2ZXNpYiAmJiBiYXNlID09IDUpKQorICAgIHsKKyAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7CisgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgICB9CisgIAorICBpZiAoaGF2ZWJhc2UgfHwgaGF2ZXNpYikgCisgICAgeworICAgICAgb2FwcGVuZCAoIigiKTsKKyAgICAgIGlmIChoYXZlYmFzZSkKKwlvYXBwZW5kIChuYW1lczMyW2Jhc2VdKTsKKyAgICAgIGlmIChoYXZlc2liKSAKKwl7CisJICBpZiAoaW5kZXggIT0gNCkgCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiLCVzIiwgbmFtZXMzMltpbmRleF0pOworCSAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworCSAgICB9CisJICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiLCVkIiwgMSA8PCBzY2FsZSk7CisJICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKwl9CisgICAgICBvYXBwZW5kICgiKSIpOworICAgIH0KKyAgcmV0dXJuICgwKTsKK30KKworaW50CitPUF9HIChieXRlbW9kZSkKKyAgICAgaW50IGJ5dGVtb2RlOworeworICBzd2l0Y2ggKGJ5dGVtb2RlKSAKKyAgICB7CisgICAgY2FzZSBiX21vZGU6CisgICAgICBvYXBwZW5kIChuYW1lczhbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHdfbW9kZToKKyAgICAgIG9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGRfbW9kZToKKyAgICAgIG9hcHBlbmQgKG5hbWVzMzJbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIGlmIChkZmxhZykKKwlvYXBwZW5kIChuYW1lczMyW3JlZ10pOworICAgICAgZWxzZQorCW9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2FwcGVuZCAoIjxpbnRlcm5hbCBkaXNhc3NlbWJsZXIgZXJyb3I+Iik7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dldDMyICgpCit7CisgIGludCB4ID0gMDsKKyAgCisgIHggPSAqY29kZXArKyAmIDB4ZmY7CisgIHggfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgODsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAxNjsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAyNDsKKyAgcmV0dXJuICh4KTsKK30KKworc3RhdGljIGludAorZ2V0MTYgKCkKK3sKKyAgaW50IHggPSAwOworICAKKyAgeCA9ICpjb2RlcCsrICYgMHhmZjsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OworICByZXR1cm4gKHgpOworfQorCitzdGF0aWMgdm9pZAorc2V0X29wIChvcCkKKyAgICAgaW50IG9wOworeworICBvcF9pbmRleFtvcF9hZF0gPSBvcF9hZDsKKyAgb3BfYWRkcmVzc1tvcF9hZF0gPSBvcDsKK30KKworaW50CitPUF9SRUcgKGNvZGUpCisgICAgIGludCBjb2RlOworeworICBjaGFyICpzOworICAKKyAgc3dpdGNoIChjb2RlKSAKKyAgICB7CisgICAgY2FzZSBpbmRpcl9keF9yZWc6IHMgPSAiKCVkeCkiOyBicmVhazsKKwljYXNlIGF4X3JlZzogY2FzZSBjeF9yZWc6IGNhc2UgZHhfcmVnOiBjYXNlIGJ4X3JlZzoKKwljYXNlIHNwX3JlZzogY2FzZSBicF9yZWc6IGNhc2Ugc2lfcmVnOiBjYXNlIGRpX3JlZzoKKwkJcyA9IG5hbWVzMTZbY29kZSAtIGF4X3JlZ107CisJCWJyZWFrOworCWNhc2UgZXNfcmVnOiBjYXNlIHNzX3JlZzogY2FzZSBjc19yZWc6CisJY2FzZSBkc19yZWc6IGNhc2UgZnNfcmVnOiBjYXNlIGdzX3JlZzoKKwkJcyA9IG5hbWVzX3NlZ1tjb2RlIC0gZXNfcmVnXTsKKwkJYnJlYWs7CisJY2FzZSBhbF9yZWc6IGNhc2UgYWhfcmVnOiBjYXNlIGNsX3JlZzogY2FzZSBjaF9yZWc6CisJY2FzZSBkbF9yZWc6IGNhc2UgZGhfcmVnOiBjYXNlIGJsX3JlZzogY2FzZSBiaF9yZWc6CisJCXMgPSBuYW1lczhbY29kZSAtIGFsX3JlZ107CisJCWJyZWFrOworCWNhc2UgZUFYX3JlZzogY2FzZSBlQ1hfcmVnOiBjYXNlIGVEWF9yZWc6IGNhc2UgZUJYX3JlZzoKKwljYXNlIGVTUF9yZWc6IGNhc2UgZUJQX3JlZzogY2FzZSBlU0lfcmVnOiBjYXNlIGVESV9yZWc6CisgICAgICBpZiAoZGZsYWcpCisJcyA9IG5hbWVzMzJbY29kZSAtIGVBWF9yZWddOworICAgICAgZWxzZQorCXMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzID0gIjxpbnRlcm5hbCBkaXNhc3NlbWJsZXIgZXJyb3I+IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgb2FwcGVuZCAocyk7CisgIHJldHVybiAoMCk7Cit9CisKK2ludAorT1BfSSAoYnl0ZW1vZGUpCisgICAgIGludCBieXRlbW9kZTsKK3sKKyAgaW50IG9wOworICAKKyAgc3dpdGNoIChieXRlbW9kZSkgCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgICAgb3AgPSAqY29kZXArKyAmIDB4ZmY7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIGlmIChkZmxhZykKKwlvcCA9IGdldDMyICgpOworICAgICAgZWxzZQorCW9wID0gZ2V0MTYgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHdfbW9kZToKKyAgICAgIG9wID0gZ2V0MTYgKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2FwcGVuZCAoIjxpbnRlcm5hbCBkaXNhc3NlbWJsZXIgZXJyb3I+Iik7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiQweCV4Iiwgb3ApOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgcmV0dXJuICgwKTsKK30KKworaW50CitPUF9zSSAoYnl0ZW1vZGUpCisgICAgIGludCBieXRlbW9kZTsKK3sKKyAgaW50IG9wOworICAKKyAgc3dpdGNoIChieXRlbW9kZSkgCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgICAgb3AgPSAqKGNoYXIgKiljb2RlcCsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBpZiAoZGZsYWcpCisJb3AgPSBnZXQzMiAoKTsKKyAgICAgIGVsc2UKKwlvcCA9IChzaG9ydClnZXQxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB3X21vZGU6CisgICAgICBvcCA9IChzaG9ydClnZXQxNiAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvYXBwZW5kICgiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKTsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgiLCBvcCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICByZXR1cm4gKDApOworfQorCitpbnQKK09QX0ogKGJ5dGVtb2RlKQorICAgICBpbnQgYnl0ZW1vZGU7Cit7CisgIGludCBkaXNwOworICBpbnQgbWFzayA9IC0xOworICAKKyAgc3dpdGNoIChieXRlbW9kZSkgCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgICAgZGlzcCA9ICooY2hhciAqKWNvZGVwKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIGlmIChkZmxhZykKKwlkaXNwID0gZ2V0MzIgKCk7CisgICAgICBlbHNlCisJeworCSAgZGlzcCA9IChzaG9ydClnZXQxNiAoKTsKKwkgIC8qIGZvciBzb21lIHJlYXNvbiwgYSBkYXRhMTYgcHJlZml4IG9uIGEganVtcCBpbnN0cnVjdGlvbgorCSAgICAgbWVhbnMgdGhhdCB0aGUgcGMgaXMgbWFza2VkIHRvIDE2IGJpdHMgYWZ0ZXIgdGhlCisJICAgICBkaXNwbGFjZW1lbnQgaXMgYWRkZWQhICAqLworCSAgbWFzayA9IDB4ZmZmZjsKKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2FwcGVuZCAoIjxpbnRlcm5hbCBkaXNhc3NlbWJsZXIgZXJyb3I+Iik7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgZGlzcCA9IChzdGFydF9wYyArIGNvZGVwIC0gc3RhcnRfY29kZXAgKyBkaXNwKSAmIG1hc2s7CisgIHNldF9vcCAoZGlzcCk7CisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICByZXR1cm4gKDApOworfQorCisvKiBBUkdTVVNFRCAqLworaW50CitPUF9TRUcgKGR1bW15KQorICAgICBpbnQgZHVtbXk7Cit7CisgIHN0YXRpYyBjaGFyICpzcmVnW10gPSB7CisgICAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAorICB9OworCisgIG9hcHBlbmQgKHNyZWdbcmVnXSk7CisgIHJldHVybiAoMCk7Cit9CisKK2ludAorT1BfRElSIChzaXplKQorICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IHNlZywgb2Zmc2V0OworICAKKyAgc3dpdGNoIChzaXplKSAKKyAgICB7CisgICAgY2FzZSBscHRyOgorICAgICAgaWYgKGFmbGFnKSAKKwl7CisJICBvZmZzZXQgPSBnZXQzMiAoKTsKKwkgIHNlZyA9IGdldDE2ICgpOworCX0gCisgICAgICBlbHNlIAorCXsKKwkgIG9mZnNldCA9IGdldDE2ICgpOworCSAgc2VnID0gZ2V0MTYgKCk7CisJfQorICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgsMHgleCIsIHNlZywgb2Zmc2V0KTsKKyAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBpZiAoYWZsYWcpCisJb2Zmc2V0ID0gZ2V0MzIgKCk7CisgICAgICBlbHNlCisJb2Zmc2V0ID0gKHNob3J0KWdldDE2ICgpOworICAgICAgCisgICAgICBvZmZzZXQgPSBzdGFydF9wYyArIGNvZGVwIC0gc3RhcnRfY29kZXAgKyBvZmZzZXQ7CisgICAgICBzZXRfb3AgKG9mZnNldCk7CisgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZnNldCk7CisgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvYXBwZW5kICgiPGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvcj4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICgwKTsKK30KKworLyogQVJHU1VTRUQgKi8KK2ludAorT1BfT0ZGIChieXRlbW9kZSkKKyAgICAgaW50IGJ5dGVtb2RlOworeworICBpbnQgb2ZmOworICAKKyAgaWYgKGFmbGFnKQorICAgIG9mZiA9IGdldDMyICgpOworICBlbHNlCisgICAgb2ZmID0gZ2V0MTYgKCk7CisgIAorICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiMHgleCIsIG9mZik7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICByZXR1cm4gKDApOworfQorCisvKiBBUkdTVVNFRCAqLworaW50CitPUF9FU0RJIChkdW1teSkKKyAgICBpbnQgZHVtbXk7Cit7CisgIG9hcHBlbmQgKCIlZXM6KCIpOworICBvYXBwZW5kIChhZmxhZyA/ICIlZWRpIiA6ICIlZGkiKTsKKyAgb2FwcGVuZCAoIikiKTsKKyAgcmV0dXJuICgwKTsKK30KKworLyogQVJHU1VTRUQgKi8KK2ludAorT1BfRFNTSSAoZHVtbXkpCisgICAgaW50IGR1bW15OworeworICBvYXBwZW5kICgiJWRzOigiKTsKKyAgb2FwcGVuZCAoYWZsYWcgPyAiJWVzaSIgOiAiJXNpIik7CisgIG9hcHBlbmQgKCIpIik7CisgIHJldHVybiAoMCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitpbnQKK09QX09ORSAoZHVtbXkpCisgICAgaW50IGR1bW15OworeworICBvYXBwZW5kICgiMSIpOworICByZXR1cm4gKDApOworfQorCisvKiBBUkdTVVNFRCAqLworaW50CitPUF9DIChkdW1teSkKKyAgICBpbnQgZHVtbXk7Cit7CisgIGNvZGVwKys7IC8qIHNraXAgbW9kL3JtICovCisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJWNyJWQiLCByZWcpOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgcmV0dXJuICgwKTsKK30KKworLyogQVJHU1VTRUQgKi8KK2ludAorT1BfRCAoZHVtbXkpCisgICAgaW50IGR1bW15OworeworICBjb2RlcCsrOyAvKiBza2lwIG1vZC9ybSAqLworICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVkYiVkIiwgcmVnKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisgIHJldHVybiAoMCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitpbnQKK09QX1QgKGR1bW15KQorICAgICBpbnQgZHVtbXk7Cit7CisgIGNvZGVwKys7IC8qIHNraXAgbW9kL3JtICovCisgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXRyJWQiLCByZWcpOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKyAgcmV0dXJuICgwKTsKK30KKworaW50CitPUF9ybSAoYnl0ZW1vZGUpCisgICAgIGludCBieXRlbW9kZTsKK3sKKyAgc3dpdGNoIChieXRlbW9kZSkgCisgICAgeworICAgIGNhc2UgZF9tb2RlOgorICAgICAgb2FwcGVuZCAobmFtZXMzMltybV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSB3X21vZGU6CisgICAgICBvYXBwZW5kIChuYW1lczE2W3JtXSk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAoMCk7Cit9CisJCisjZGVmaW5lIE1BWExFTiAyMAorCitpbnQKK3ByaW50X2luc24gKHJlYWxtZW1hZGRyLCBtZW1hZGRyLCBzdHJlYW0sIGFkZHJsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyLCByZWFsbWVtYWRkcjsKKyAgICAgRklMRSAqc3RyZWFtOworICAgICBpbnQgYWRkcmxlbjsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbTUFYTEVOXTsKKyAgCisgIGlmKGFkZHJsZW4gPT0gMzIpeworCSAgZGZsYWcgPSAxOworCSAgYWZsYWcgPSAxOworICB9IGVsc2UgeworCSAgZGZsYWcgPSAwOworCSAgYWZsYWcgPSAwOworICB9OyAgCisKKworICByZWFkX21lbW9yeSAobWVtYWRkciwgKGNoYXIgKikgYnVmZmVyLCBNQVhMRU4pOworICAKKyAgcmV0dXJuIChpMzg2ZGlzICgoaW50KXJlYWxtZW1hZGRyLCBidWZmZXIsIHN0cmVhbSkpOworfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9pbmZvLmMgYi9kZWJ1Z2dlci9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwNDZlOAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2luZm8uYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIFdpbmUgZGVidWdnZXIgdXRpbGl0eSByb3V0aW5lcworICogRXJpYyBZb3VuZ2RhbGUKKyAqIDkvOTMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJyZWdwb3MuaCIKKworZXh0ZXJuIGludCAqIHJlZ3ZhbDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZGJnX21hc2s7CitleHRlcm4gdW5zaWduZWQgaW50IGRiZ19tb2RlOworCitleHRlcm4gaW50IHByaW50X2luc24oY2hhciAqIG1lbWFkZHIsIGNoYXIgKiByZWFsYWRkciwgRklMRSAqIHN0cmVhbSwgaW50IGFkZHJsZW4pOworCisvKiBUSGVzZSB0aHJlZSBoZWxwZXIgZnVuY3Rpb25zIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgcGF0Y2hpbmcgdGhlCittb2R1bGUgZnJvbSBnZGIgZm9yIGRpc2Fzc2VtYmx5IG9mIGNvZGUgKi8KKwordm9pZCByZWFkX21lbW9yeShjaGFyICogbWVtYWRkciwgY2hhciAqIGJ1ZmZlciwgaW50IGxlbil7CisJbWVtY3B5KGJ1ZmZlciwgbWVtYWRkciwgbGVuKTsKK30KKwordm9pZCBmcHV0c19maWx0ZXJlZChjaGFyICogYnVmZmVyLCBGSUxFICogb3V0ZmlsZSl7CisJZnB1dHMoYnVmZmVyLCBvdXRmaWxlKTsKK30KKwordm9pZCBwcmludF9hZGRyZXNzKHVuc2lnbmVkIGludCBhZGRyLCBGSUxFICogb3V0ZmlsZSl7CisJY2hhciAqIG5hbWU7CisJbmFtZSA9IGZpbmRfbmVhcmVzdF9zeW1ib2woYWRkcik7CisJaWYobmFtZSkKKwkJZnByaW50ZihvdXRmaWxlLCIweCU4Ljh4KCVzKSIsIGFkZHIsIG5hbWUpOworCWVsc2UKKwkJZnByaW50ZihvdXRmaWxlLCIweCU4Ljh4IiwgYWRkcik7CisKK30KKworCit2b2lkIGluZm9fcmVnKCl7CisJZnByaW50ZihzdGRlcnIsIlJlZ2lzdGVyIGR1bXA6XG4iKTsKKwkvKiBGaXJzdCBnZXQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIG91dCBvZiB0aGUgd2F5ICovCisJZnByaW50ZihzdGRlcnIsIiBDUzolNC40eCBTUzolNC40eCBEUzolNC40eCBFUzolNC40eCBHUzolNC40eCBGUzolNC40eFxuIiwgCisJCVNDX0NTLCBTQ19TUywgU0NfRFMsIFNDX0VTLCBTQ19HUywgU0NfRlMpOworCisJLyogTm93IGR1bXAgdGhlIG1haW4gcmVnaXN0ZXJzICovCisJZnByaW50ZihzdGRlcnIsIiBFSVA6JTguOHggRVNQOiU4Ljh4IEVCUDolOC44eCBFRkxBR1M6JTguOHhcbiIsIAorCQlTQ19FSVAoZGJnX21hc2spLCBTQ19FU1AoZGJnX21hc2spLCBTQ19FQlAoZGJnX21hc2spLCBTQ19FRkxBR1MpOworCisJLyogQW5kIGR1bXAgdGhlIHJlZ3VsYXIgcmVnaXN0ZXJzICovCisKKwlmcHJpbnRmKHN0ZGVyciwiIEVBWDolOC44eCBFQlg6JTguOHggRUNYOiU4Ljh4IEVEWDolOC44eFxuIiwgCisJCVNDX0VBWChkYmdfbWFzayksIFNDX0VCWChkYmdfbWFzayksIFNDX0VDWChkYmdfbWFzayksIFNDX0VEWChkYmdfbWFzaykpOworCisJLyogRmluYWxseSBkdW1wIHRoZXNlIG1haW4gcmVnaXN0ZXJzICovCisJZnByaW50ZihzdGRlcnIsIiBFREk6JTguOHggRVNJOiU4Ljh4XG4iLCAKKwkJU0NfRURJKGRiZ19tYXNrKSwgU0NfRVNJKGRiZ19tYXNrKSk7CisKK30KKwordm9pZCBpbmZvX3N0YWNrKCl7CisJdW5zaWduZWQgaW50ICogZHVtcDsKKwlpbnQgaTsKKworCisJZnByaW50ZihzdGRlcnIsIlN0YWNrIGR1bXA6XG4iKTsKKwlkdW1wID0gKGludCopIFNDX0VJUChkYmdfbWFzayk7CisJZm9yKGk9MDsgaTwyMjsgaSsrKSAKKwl7CisJICAgIGZwcmludGYoc3RkZXJyLCIgJTguOHgiLCAqZHVtcCsrKTsKKwkgICAgaWYgKChpICUgOCkgPT0gNykKKwkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJfQorCWZwcmludGYoc3RkZXJyLCJcbiIpOworfQorCisKK3ZvaWQgZXhhbWluZV9tZW1vcnkoaW50IGFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQpeworCWNoYXIgKiBwbnQ7CisJdW5zaWduZWQgaW50ICogZHVtcDsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgKiB3ZHVtcDsKKwlpbnQgaTsKKworCWlmKChhZGRyICYgMHhmZmZmMDAwMCkgPT0gMCAmJiBkYmdfbW9kZSA9PSAxNikKKwkgICAgICAgIGFkZHIgfD0gKGZvcm1hdCA9PSAnaScgPyBTQ19DUyA6IFNDX0RTKSA8PCAxNjsKKworCisJaWYoZm9ybWF0ICE9ICdpJyAmJiBjb3VudCA+IDEpIHsKKwkJcHJpbnRfYWRkcmVzcyhhZGRyLCBzdGRlcnIpOworCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7CisJfTsKKworCisJc3dpdGNoKGZvcm1hdCl7CisJY2FzZSAncyc6CisJCXBudCA9IChjaGFyICopIGFkZHI7CisJCWlmIChjb3VudCA9PSAxKSBjb3VudCA9IDI1NjsKKwkgICAgICAgIHdoaWxlKCpwbnQgJiYgY291bnQpIHsKKwkJCWZwdXRjKCAqcG50KyssIHN0ZGVycik7CisJCQljb3VudC0tOworCQl9OworCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJcmV0dXJuOworCisJY2FzZSAnaSc6CisJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgeworCQkJcHJpbnRfYWRkcmVzcyhhZGRyLCBzdGRlcnIpOworCQkJZnByaW50ZihzdGRlcnIsIjogICIpOworCQkJYWRkciArPSBwcmludF9pbnNuKChjaGFyICopIGFkZHIsIChjaGFyICopIGFkZHIsIHN0ZGVyciwgZGJnX21vZGUpOworCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJCX07CisJCXJldHVybjsKKwljYXNlICd4JzoKKwkJZHVtcCA9ICh1bnNpZ25lZCBpbnQgKikgYWRkcjsKKwkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSAKKwkJeworCQkJZnByaW50ZihzdGRlcnIsIiAlOC44eCIsICpkdW1wKyspOworCQkJaWYgKChpICUgOCkgPT0gNykgeworCQkJCWZwcmludGYoc3RkZXJyLCJcbiIpOworCQkJCXByaW50X2FkZHJlc3MoKHVuc2lnbmVkIGludCkgZHVtcCwgc3RkZXJyKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7CisJCQl9OworCQl9CisJCWZwcmludGYoc3RkZXJyLCJcbiIpOworCQlyZXR1cm47CisJCisJY2FzZSAnZCc6CisJCWR1bXAgPSAodW5zaWduZWQgaW50ICopIGFkZHI7CisJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCIgJWQiLCAqZHVtcCsrKTsKKwkJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJCQlwcmludF9hZGRyZXNzKCh1bnNpZ25lZCBpbnQpIGR1bXAsIHN0ZGVycik7CisJCQkJZnByaW50ZihzdGRlcnIsIjogICIpOworCQkJfTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJcmV0dXJuOworCQorCWNhc2UgJ3cnOgorCQl3ZHVtcCA9ICh1bnNpZ25lZCBzaG9ydCBpbnQgKikgYWRkcjsKKwkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSAKKwkJeworCQkJZnByaW50ZihzdGRlcnIsIiAlZCIsICp3ZHVtcCsrKTsKKwkJCWlmICgoaSAlIDEwKSA9PSA3KSB7CisJCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJCQkJcHJpbnRfYWRkcmVzcygodW5zaWduZWQgaW50KSBkdW1wLCBzdGRlcnIpOworCQkJCWZwcmludGYoc3RkZXJyLCI6ICAiKTsKKwkJCX07CisJCX0KKwkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJCXJldHVybjsKKwkKKwljYXNlICdjJzoKKwkJcG50ID0gKGNoYXIgKikgYWRkcjsKKwkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSAKKwkJeworCQkJaWYoKnBudCA8IDB4MjApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiICAiKTsKKwkJCQlwbnQrKzsKKwkJCX0gZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCIgJWMiLCAqcG50KyspOworCQkJaWYgKChpICUgMzIpID09IDcpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJCQlwcmludF9hZGRyZXNzKCh1bnNpZ25lZCBpbnQpIGR1bXAsIHN0ZGVycik7CisJCQkJZnByaW50ZihzdGRlcnIsIjogICIpOworCQkJfTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJcmV0dXJuOworCQorCWNhc2UgJ2InOgorCQlwbnQgPSAoY2hhciAqKSBhZGRyOworCQlmb3IoaT0wOyBpPGNvdW50OyBpKyspIAorCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwiICVkIiwgKnBudCsrKTsKKwkJCWlmICgoaSAlIDMyKSA9PSA3KSB7CisJCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJCQkJcHJpbnRfYWRkcmVzcygodW5zaWduZWQgaW50KSBkdW1wLCBzdGRlcnIpOworCQkJCWZwcmludGYoc3RkZXJyLCI6ICAiKTsKKwkJCX07CisJCX0KKwkJZnByaW50ZihzdGRlcnIsIlxuIik7CisJCXJldHVybjsKKwl9OworCQorCS8qIFRoZSByZXN0IGFyZSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkICovCisKKwlmcHJpbnRmKHN0ZGVyciwiZXhhbWluZSBtZW06ICV4ICVkICVjXG4iLCBhZGRyLCBjb3VudCwgZm9ybWF0KTsKK30KKworY2hhciAqIGhlbHB0ZXh0W10gPSB7CisiVGhlIGNvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSBXaW5lIGRlYnVnZ2VyIGFyZSBhIHNtYWxsIHN1YnNldCIsCisib2YgdGhlIGNvbW1hbmRzIHRoYXQgZ2RiIHdvdWxkIGFjY2VwdC4gIFRoZSBjb21tYW5kcyBjdXJyZW50bHkiLAorImFyZTpcbiIsCisiICBpbmZvIHJlZyIsCisiICBpbmZvIHN0YWNrIiwKKyIgIGhlbHAiLAorIiAgcXVpdCIsCisiICBwcmludCA8ZXhwcj4iLAorIiAgc3ltYm9sZmlsZSA8ZmlsZW5hbWU+IiwKKyIgIGRlZmluZSA8aWRlbnRpZmllcj4gPGV4cHI+IiwKKyIgIHggPGV4cHI+IiwKKyIgIGNvbnQiLAorIiAgc2V0IDxyZWc+ID0gPGV4cHI+IiwKKyIgIHNldCAqPGV4cHI+ID0gPGV4cHI+IiwKKyIiLAorIlRoZSAneCcgY29tbWFuZCBhY2NlcHRzIHJlcGVhdCBjb3VudHMgYW5kIGZvcm1hdHMgKGluY2x1ZGluZyAnaScpIGluIHRoZSIsCisic2FtZSB3YXkgdGhhdCBnZGIgZG9lcy4iLAorIiIsCisiIFRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGxlZ2FsIGV4cHJlc3Npb25zOiIsCisiICRlYXggICAgICRlYXgrMHgzICAgMHgxMDAwICAgKCRlaXAgKyAyNTYpICAqJGVheCAgICooJGVzcCArIDMpIiwKKyIgQWxzbywgYSBubSBmb3JtYXQgc3ltYm9sIHRhYmxlIGNhbiBiZSByZWFkIGZyb20gYSBmaWxlIHVzaW5nIHRoZSIsCisiIHN5bWJvbGZpbGUgY29tbWFuZC4gIFN5bWJvbHMgY2FuIGFsc28gYmUgZGVmaW5lZCBpbmRpdmlkdWFsbHkgd2l0aCIsCisiIHRoZSBkZWZpbmUgY29tbWFuZC4iLAorIiIsCisiVGhlIGRpc2Fzc2VtYmx5IGNvZGUgc2VlbXMgdG8gd29yayBtb3N0IG9mIHRoZSB0aW1lLCBidXQgaXQgZG9lcyBnZXQiLAorImEgbGl0dGxlIGNvbmZ1c2VkIGF0IHRpbWVzLiAgVGhlIDE2IGJpdCBtb2RlIHByb2JhYmx5IGhhcyBub3QgYmVlbiB1c2VkIiwKKyJtdWNoIHNvIHRoZXJlIGFyZSBwcm9iYWJseSBidWdzLiAgSSBzbmFnZ2VkIHRoZSBmaWxlIGZyb20gdGhlIGdkYi00LjciLAorInNvdXJjZSB0cmVlLCB3aGljaCBpcyB3aGF0IHdhcyBvbiBteSBsYXRlc3QgY2Ryb20uICBJIHNob3VsZCBjaGVjayB0byBzZWUiLAorImlmIG5ld2VyIHZlcnNpb25zIG9mIGdkYiBoYXZlIGFueXRoaW5nIHN1YnN0YW5pdGFsbHkgZGlmZmVyZW50IGZvciB0aGUiLAorImRpc2Fzc2VtYmxlci4iLAorIiIsCitOVUxMfTsKKwordm9pZCBkYmdfaGVscCgpeworCWludCBpOworCWkgPSAwOworCXdoaWxlKGhlbHB0ZXh0W2ldKSBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIGhlbHB0ZXh0W2krK10pOworfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS9NYWtlLm9zOSBiL2RlYnVnZ2VyL3JlYWRsaW5lL01ha2Uub3M5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzI4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9yZWFkbGluZS9NYWtlLm9zOQpAQCAtMCwwICsxLDE5IEBACisjIyAgJFJldmlzaW9uOiAxLjIgJAorIyMKKyMjICBPUy05IG1ha2VmaWxlIGZvciBlZGl0bGluZSBsaWJyYXJ5LgorIyMKKworLlNVRkZJWEVTOgorCitSRklMRVMJPSBlZGl0bGluZS5yIGNvbXBsZXRlLnIgc3lzb3M5LnIKKworJS5yOgkJJS5jCisJY2M2OCAtciAtRHN0cmNocj1pbmRleCAtRHN0cnJjaHI9cmluZGV4IC1ETkVFRF9TVFJEVVAgLURTWVNfT1M5ICQqLmMKKwordGVzdGl0OgkJdGVzdGl0LnIgZWRpdGxpbmUubGliCisJY2M2OCAtZj10ZXN0aXQgdGVzdGl0LnIgLWw9ZWRpdGxpbmUubGliCisKKyQoUkZJTEVTKToJJChSRklMRVM6JS5yPSUuYykKKworZWRpdGxpbmUubGliOgkkKFJGSUxFUykKKwljYXQgJChSRklMRVMpID4kQApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUgYi9kZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M2YmZjCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUKQEAgLTAsMCArMSw2NiBAQAorIyMgICRSZXZpc2lvbjogMS4zICQKKyMjCisjIyAgVW5peCBtYWtlZmlsZSBmb3IgZWRpdGxpbmUgbGlicmFyeS4KKyMjCisKKyMjICBTZXQgeW91ciBvcHRpb25zOgorIyMJLURBTlNJX0FSUk9XUwkJQU5TSSBhcnJvd3Mga2V5cyB3b3JrIGxpa2UgZW1hY3MuCisjIwktREhBVkVfU1RETElCCQlIYXZlIDxzdGRsaWIuaD4uCisjIwktREhBVkVfVENHRVRBVFRSCUhhdmUgdGNnZXRhdHRyKCksIHRjc2V0YXR0cigpLgorIyMJLURISURFCQkJTWFrZSBzdGF0aWMgZnVuY3Rpb25zIHN0YXRpYyAobm9uIGRlYnVnKS4KKyMjCS1ESElTVF9TSVpFPW4JCUhpc3Rvcnkgc2l6ZS4KKyMjCS1ETkVFRF9TVFJEVVAJCURvbid0IGhhdmUgc3RyZHVwKCkuCisjIwktRFVOSVFVRV9ISVNUT1JZCURvbid0IHNhdmUgY29tbWFuZCBpZiBzYW1lIGFzIGxhc3Qgb25lLgorIyMJLURVU0VfRElSRU5UCQlVc2UgPGRpcmVudC5oPiwgbm90IDxzeXMvZGlyLmg+PworIyMJLURVU0VfVEVSTUNBUAkJVXNlIHRoZSB0ZXJtY2FwIGxpYnJhcnkgZm9yIHRlcm1pbmFsIHNpemUKKyMjCQkJCXNlZSBMREZMQUdTLCBiZWxvdywgaWYgeW91IHNldCB0aGlzLgorIyMJLURORUVEX1BFUlJPUgkJRG9uJ3QgaGF2ZSBwZXJyb3IoKSAodXNlZCBpbiB0ZXN0aXQpCitERUZTCT0gLURBTlNJX0FSUk9XUyAtREhBVkVfVENHRVRBVFRSIC1ESElERSAtRFVTRV9ESVJFTlQgLURTWVNfVU5JWAorCisjIyAgU2V0IHlvdXIgQyBjb21waWxlcjoKK1dBUk4JPSAtV2FsbCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLVdjYXN0LXF1YWwgLVd3cml0ZS1zdHJpbmdzIFwKKwktV3VudXNlZCAtV2NvbW1lbnQgLVdzd2l0Y2gKK0NDCT0gZ2NjIC1hbnNpICQoV0FSTikKKyNDQwk9IGNjCitDRkxBR1MJPSAkKERFRlMpIC1PIC1nCisKKyMjICBJZiB5b3UgaGF2ZSAtRFVTRV9URVJNQ0FQLCBzZXQgdGhpcyBhcyBhcHByb3ByaWF0ZToKKyNMREZMQUdTID0gLWx0ZXJtbGliCisjTERGTEFHUyA9IC1sdGVybWNhcAorCisjIyAgU2V0IHJhbmxpYiBhcyBhcHByb3ByaWF0ZToKK1JBTkxJQgk9IHJhbmxpYgorI1JBTkxJQgk9IGVjaG8KKworIyMgIEVuZCBvZiBjb25maWd1cmF0aW9uLgorCitTT1VSQ0VTCT0gZWRpdGxpbmUuYyBjb21wbGV0ZS5jIHN5c3VuaXguYworT0JKRUNUUwk9IGVkaXRsaW5lLm8gY29tcGxldGUubyBzeXN1bml4Lm8KK1NIQVJGSUxFUyA9CVJFQURNRSBNYWtlZmlsZSBlZGl0bGluZS4zIGVkaXRsaW5lLmggdW5peC5oIGVkaXRsaW5lLmMgXAorCQljb21wbGV0ZS5jIHN5c3VuaXguYyB0ZXN0aXQuYyBcCisJCU1ha2Uub3M5IG9zOS5oIHN5c29zOS5jCisKK2FsbDoJCWxpYmVkaXQuYQorCit0ZXN0aXQ6CQl0ZXN0aXQuYyBsaWJlZGl0LmEKKwkkKENDKSAkKENGTEFHUykgLW8gdGVzdGl0IHRlc3RpdC5jIGxpYmVkaXQuYSAkKExERkxBR1MpCisKK3NoYXI6CQkkKFNIQVJGSUxFUykKKwlzaGFyICQoU0hBUkZJTEVTKSA+c2hhcgorCitjbGVhbjoKKwlybSAtZiAqLltvYV0gdGVzdGl0IGZvbyBjb3JlIHRhZ3MgbGludCBsaW50LmFsbCBhLm91dCBzaGFyCisKK2xpbnQ6CQl0ZXN0aXQKKwlsaW50IC1hIC1iIC11IC14ICQoREVGUykgJChTT1VSQ0VTKSB0ZXN0aXQuYyA+bGludC5hbGwKKwlzZWQgLWUgJy93YXJuaW5nOiBmdW5jdGlvbiBwcm90b3R5cGUgbm90IGluIHNjb3BlL2QnIFwKKwkJLWUgJy93YXJuaW5nOiBvbGQgc3R5bGUgYXJndW1lbnQgZGVjbGFyYXRpb24vJ2QgXAorCQktZSAnL21peCBvZiBvbGQgYW5kIG5ldyBzdHlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi8nZCBcCisJCTxsaW50LmFsbCA+bGludAorCitsaWJlZGl0LmE6CSQoT0JKRUNUUykKKwlAcm0gLWYgJEAKKwlhciByICRAICQoT0JKRUNUUykKKwkkKFJBTkxJQikgJEAKKworJChPQkpFQ1RTKToJZWRpdGxpbmUuaApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvcmVhZGxpbmUvUkVBRE1FIGIvZGVidWdnZXIvcmVhZGxpbmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDk3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9yZWFkbGluZS9SRUFETUUKQEAgLTAsMCArMSw0NSBAQAorJFJldmlzaW9uOiAxLjUgJAorCitUaGlzIGlzIGEgbGluZS1lZGl0aW5nIGxpYnJhcnkuICBJdCBjYW4gYmUgbGlua2VkIGludG8gYWxtb3N0IGFueQorcHJvZ3JhbSB0byBwcm92aWRlIGNvbW1hbmQtbGluZSBlZGl0aW5nIGFuZCByZWNhbGwuCisKK0l0IGlzIGNhbGwtY29tcGF0aWJsZSB3aXRoIHRoZSBGU0YgcmVhZGxpbmUgbGlicmFyeSwgYnV0IGl0IGlzIGEKK2ZyYWN0aW9uIG9mIHRoZSBzaXplIChhbmQgb2ZmZXJzIGZld2VyIGZlYXR1cmVzKS4gIEl0IGRvZXMgbm90IHVzZQorc3RhbmRhcmQgSS9PLiAgSXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgYSAiQyBOZXdzLWxpa2UiIGNvcHlyaWdodC4KKworQ29uZmlndXJhdGlvbiBpcyBkb25lIGluIHRoZSBNYWtlZmlsZS4gIFR5cGUgIm1ha2UgdGVzdGl0IiB0byBnZXQKK2Egc21hbGwgc2xvdyBzaGVsbCBmb3IgdGVzdGluZy4KKworQW4gZWFybGllciB2ZXJzaW9uIHdhcyBkaXN0cmlidXRlZCB3aXRoIEJ5cm9uJ3MgcmMuICBQcmluY2lwYWwKK2NoYW5nZXMgb3ZlciB0aGF0IHZlcnNpb24gaW5jbHVkZToKKwlGYXN0ZXIuCisJSXMgZWlnaHQtYml0IGNsZWFuICh0aGFua3MgdG8gYnJlbmRhbkBjcy53aWRlbmVyLmVkdSkKKwlXcml0dGVuIGluIEsmUiBDLCBidXQgQU5TSSBjb21wbGlhbnQgKGdjYyBhbGwgd2FybmluZ3MpCisJUHJvcGFnYXRlcyBFT0YgcHJvcGVybHk7IHJjIHRyaXAgdGVzdCBub3cgcGFzc2VzCisJRG9lc24ndCBuZWVkIG9yIHVzZSBvciBwcm92aWRlIG1lbW1vdmUuCisJTW9yZSByb2J1c3QKKwlDYWxsaW5nIHNlcXVlbmNlIGNoYW5nZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHJlYWRsaW5lLgorCVRlc3QgcHJvZ3JhbSwgbmV3IG1hbnBhZ2UsIGJldHRlciBjb25maWd1cmF0aW9uCisJTW9yZSBzeXN0ZW0taW5kZXBlbmRhbnQ7IGluY2x1ZGVzIFVuaXggYW5kIE9TLTkgc3VwcG9ydC4KKworRW5qb3ksCisJUmljaCAkYWx6CisJPHJzYWx6QG9zZi5vcmc+CisKKyBDb3B5cmlnaHQgMTk5MiBTaW1tdWxlIFR1cm5lciBhbmQgUmljaCBTYWx6LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFRoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuIFRlbGVwaG9uZQorIGFuZCBUZWxlZ3JhcGggQ29tcGFueSBvciBvZiB0aGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorCisgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugb24KKyBhbnkgY29tcHV0ZXIgc3lzdGVtLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QKKyB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAxLiBUaGUgYXV0aG9ycyBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgY29uc2VxdWVuY2VzIG9mIHVzZSBvZiB0aGlzCisgICAgc29mdHdhcmUsIG5vIG1hdHRlciBob3cgYXdmdWwsIGV2ZW4gaWYgdGhleSBhcmlzZSBmcm9tIGZsYXdzIGluIGl0LgorIDIuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCwgZWl0aGVyIGJ5CisgICAgZXhwbGljaXQgY2xhaW0gb3IgYnkgb21pc3Npb24uICBTaW5jZSBmZXcgdXNlcnMgZXZlciByZWFkIHNvdXJjZXMsCisgICAgY3JlZGl0cyBtdXN0IGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAzLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgU2luY2UgZmV3IHVzZXJzCisgICAgZXZlciByZWFkIHNvdXJjZXMsIGNyZWRpdHMgbXVzdCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCisgNC4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQuCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS9jb21wbGV0ZS5jIGIvZGVidWdnZXIvcmVhZGxpbmUvY29tcGxldGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2QwMjljCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvcmVhZGxpbmUvY29tcGxldGUuYwpAQCAtMCwwICsxLDIyMiBAQAorLyogICRSZXZpc2lvbjogMS4zICQKKyoqCisqKiAgSGlzdG9yeSBhbmQgZmlsZSBjb21wbGV0aW9uIGZ1bmN0aW9ucyBmb3IgZWRpdGxpbmUgbGlicmFyeS4KKyovCisjaW5jbHVkZSAiZWRpdGxpbmUuaCIKKworCisjaWYJZGVmaW5lZChORUVEX1NUUkRVUCkKKy8qCisqKiAgUmV0dXJuIGFuIGFsbG9jYXRlZCBjb3B5IG9mIGEgc3RyaW5nLgorKi8KK2NoYXIgKgorc3RyZHVwKHApCisgICAgY2hhcgkqcDsKK3sKKyAgICBjaGFyCSpuZXc7CisKKyAgICBpZiAoKG5ldyA9IE5FVyhjaGFyLCBzdHJsZW4ocCkgKyAxKSkgIT0gTlVMTCkKKwkodm9pZClzdHJjcHkobmV3LCBwKTsKKyAgICByZXR1cm4gbmV3OworfQorI2VuZGlmCS8qIGRlZmluZWQoTkVFRF9TVFJEVVApICovCisKKy8qCisqKiAgc3RyY21wLWxpa2Ugc29ydGluZyBwcmVkaWNhdGUgZm9yIHFzb3J0LgorKi8KK1NUQVRJQyBpbnQKK2NvbXBhcmUocDEsIHAyKQorICAgIENPTlNUIHZvaWQJKnAxOworICAgIENPTlNUIHZvaWQJKnAyOworeworICAgIENPTlNUIGNoYXIJKip2MTsKKyAgICBDT05TVCBjaGFyCSoqdjI7CisKKyAgICB2MSA9IChDT05TVCBjaGFyICoqKXAxOworICAgIHYyID0gKENPTlNUIGNoYXIgKiopcDI7CisgICAgcmV0dXJuIHN0cmNtcCgqdjEsICp2Mik7Cit9CisKKy8qCisqKiAgRmlsbCBpbiAqYXZwIHdpdGggYW4gYXJyYXkgb2YgbmFtZXMgdGhhdCBtYXRjaCBmaWxlLCB1cCB0byBpdHMgbGVuZ3RoLgorKiogIElnbm9yZSAuIGFuZCAuLiAuCisqLworU1RBVElDIGludAorRmluZE1hdGNoZXMoZGlyLCBmaWxlLCBhdnApCisgICAgY2hhcgkqZGlyOworICAgIGNoYXIJKmZpbGU7CisgICAgY2hhcgkqKiphdnA7Cit7CisgICAgY2hhcgkqKmF2OworICAgIGNoYXIJKipuZXc7CisgICAgY2hhcgkqcDsKKyAgICBESVIJCSpkcDsKKyAgICBESVJFTlRSWQkqZXA7CisgICAgU0laRV9UCWFjOworICAgIFNJWkVfVAlsZW47CisKKyAgICBpZiAoKGRwID0gb3BlbmRpcihkaXIpKSA9PSBOVUxMKQorCXJldHVybiAwOworCisgICAgYXYgPSBOVUxMOworICAgIGFjID0gMDsKKyAgICBsZW4gPSBzdHJsZW4oZmlsZSk7CisgICAgd2hpbGUgKChlcCA9IHJlYWRkaXIoZHApKSAhPSBOVUxMKSB7CisJcCA9IGVwLT5kX25hbWU7CisJaWYgKHBbMF0gPT0gJy4nICYmIChwWzFdID09ICdcMCcgfHwgKHBbMV0gPT0gJy4nICYmIHBbMl0gPT0gJ1wwJykpKQorCSAgICBjb250aW51ZTsKKwlpZiAobGVuICYmIHN0cm5jbXAocCwgZmlsZSwgbGVuKSAhPSAwKQorCSAgICBjb250aW51ZTsKKworCWlmICgoYWMgJSBNRU1fSU5DKSA9PSAwKSB7CisJICAgIGlmICgobmV3ID0gTkVXKGNoYXIqLCBhYyArIE1FTV9JTkMpKSA9PSBOVUxMKQorCQlicmVhazsKKwkgICAgaWYgKGFjKSB7CisJCUNPUFlGUk9NVE8obmV3LCBhdiwgYWMgKiBzaXplb2YgKGNoYXIgKiopKTsKKwkJRElTUE9TRShhdik7CisJICAgIH0KKwkgICAgKmF2cCA9IGF2ID0gbmV3OworCX0KKworCWlmICgoYXZbYWNdID0gc3RyZHVwKHApKSA9PSBOVUxMKSB7CisJICAgIGlmIChhYyA9PSAwKQorCQlESVNQT1NFKGF2KTsKKwkgICAgYnJlYWs7CisJfQorCWFjKys7CisgICAgfQorCisgICAgLyogQ2xlYW4gdXAgYW5kIHJldHVybi4gKi8KKyAgICAodm9pZCljbG9zZWRpcihkcCk7CisgICAgaWYgKGFjKQorCXFzb3J0KGF2LCBhYywgc2l6ZW9mIChjaGFyICoqKSwgY29tcGFyZSk7CisgICAgcmV0dXJuIGFjOworfQorCisvKgorKiogIFNwbGl0IGEgcGF0aG5hbWUgaW50byBhbGxvY2F0ZWQgZGlyZWN0b3J5IGFuZCB0cmFpbGluZyBmaWxlbmFtZSBwYXJ0cy4KKyovCitTVEFUSUMgaW50CitTcGxpdFBhdGgocGF0aCwgZGlycGFydCwgZmlsZXBhcnQpCisgICAgY2hhcgkqcGF0aDsKKyAgICBjaGFyCSoqZGlycGFydDsKKyAgICBjaGFyCSoqZmlsZXBhcnQ7Cit7CisgICAgc3RhdGljIGNoYXIJRE9UW10gPSAiLiI7CisgICAgY2hhcgkqZHBhcnQ7CisgICAgY2hhcgkqZnBhcnQ7CisKKyAgICBpZiAoKGZwYXJ0ID0gc3RycmNocihwYXRoLCAnLycpKSA9PSBOVUxMKSB7CisJaWYgKChkcGFydCA9IHN0cmR1cChET1QpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gLTE7CisJaWYgKChmcGFydCA9IHN0cmR1cChwYXRoKSkgPT0gTlVMTCkgeworCSAgICBESVNQT1NFKGRwYXJ0KTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisgICAgZWxzZSB7CisJaWYgKChkcGFydCA9IHN0cmR1cChwYXRoKSkgPT0gTlVMTCkKKwkgICAgcmV0dXJuIC0xOworCWRwYXJ0W2ZwYXJ0IC0gcGF0aF0gPSAnXDAnOworCWlmICgoZnBhcnQgPSBzdHJkdXAoKytmcGFydCkpID09IE5VTEwpIHsKKwkgICAgRElTUE9TRShkcGFydCk7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorICAgICpkaXJwYXJ0ID0gZHBhcnQ7CisgICAgKmZpbGVwYXJ0ID0gZnBhcnQ7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiAgQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgcGF0aG5hbWUsIHJldHVybmluZyBhbiBhbGxvY2F0ZWQgY29weS4KKyoqICBGaWxsIGluICp1bmlxdWUgaWYgd2UgY29tcGxldGVkIGl0LCBvciBzZXQgaXQgdG8gMCBpZiBhbWJpZ3VvdXMuCisqLworY2hhciAqCitybF9jb21wbGV0ZShwYXRobmFtZSwgdW5pcXVlKQorICAgIGNoYXIJKnBhdGhuYW1lOworICAgIGludAkJKnVuaXF1ZTsKK3sKKyAgICBjaGFyCSoqYXY7CisgICAgY2hhcgkqZGlyOworICAgIGNoYXIJKmZpbGU7CisgICAgY2hhcgkqbmV3OworICAgIGNoYXIJKnA7CisgICAgU0laRV9UCWFjOworICAgIFNJWkVfVAllbmQ7CisgICAgU0laRV9UCWk7CisgICAgU0laRV9UCWo7CisgICAgU0laRV9UCWxlbjsKKworICAgIGlmIChTcGxpdFBhdGgocGF0aG5hbWUsICZkaXIsICZmaWxlKSA8IDApCisJcmV0dXJuIE5VTEw7CisgICAgaWYgKChhYyA9IEZpbmRNYXRjaGVzKGRpciwgZmlsZSwgJmF2KSkgPT0gMCkgeworCURJU1BPU0UoZGlyKTsKKwlESVNQT1NFKGZpbGUpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHAgPSBOVUxMOworICAgIGxlbiA9IHN0cmxlbihmaWxlKTsKKyAgICBpZiAoYWMgPT0gMSkgeworCS8qIEV4YWN0bHkgb25lIG1hdGNoIC0tIGZpbmlzaCBpdCBvZmYuICovCisJKnVuaXF1ZSA9IDE7CisJaiA9IHN0cmxlbihhdlswXSkgLSBsZW4gKyAyOworCWlmICgocCA9IE5FVyhjaGFyLCBqICsgMSkpICE9IE5VTEwpIHsKKwkgICAgQ09QWUZST01UTyhwLCBhdlswXSArIGxlbiwgaik7CisJICAgIGlmICgobmV3ID0gTkVXKGNoYXIsIHN0cmxlbihkaXIpICsgc3RybGVuKGF2WzBdKSArIDIpKSAhPSBOVUxMKSB7CisJCSh2b2lkKXN0cmNweShuZXcsIGRpcik7CisJCSh2b2lkKXN0cmNhdChuZXcsICIvIik7CisJCSh2b2lkKXN0cmNhdChuZXcsIGF2WzBdKTsKKwkJcmxfYWRkX3NsYXNoKG5ldywgcCk7CisJCURJU1BPU0UobmV3KTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgZWxzZSB7CisJKnVuaXF1ZSA9IDA7CisJaWYgKGxlbikgeworCSAgICAvKiBGaW5kIGxhcmdlc3QgbWF0Y2hpbmcgc3Vic3RyaW5nLiAqLworCSAgICBmb3IgKGkgPSBsZW4sIGVuZCA9IHN0cmxlbihhdlswXSk7IGkgPCBlbmQ7IGkrKykKKwkJZm9yIChqID0gMTsgaiA8IGFjOyBqKyspCisJCSAgICBpZiAoYXZbMF1baV0gIT0gYXZbal1baV0pCisJCQlnb3RvIGJyZWFrb3V0OworICBicmVha291dDoKKwkgICAgaWYgKGkgPiBsZW4pIHsKKwkJaiA9IGkgLSBsZW4gKyAxOworCQlpZiAoKHAgPSBORVcoY2hhciwgaikpICE9IE5VTEwpIHsKKwkJICAgIENPUFlGUk9NVE8ocCwgYXZbMF0gKyBsZW4sIGopOworCQkgICAgcFtqIC0gMV0gPSAnXDAnOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogQ2xlYW4gdXAgYW5kIHJldHVybi4gKi8KKyAgICBESVNQT1NFKGRpcik7CisgICAgRElTUE9TRShmaWxlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWM7IGkrKykKKwlESVNQT1NFKGF2W2ldKTsKKyAgICBESVNQT1NFKGF2KTsKKyAgICByZXR1cm4gcDsKK30KKworLyoKKyoqICBSZXR1cm4gYWxsIHBvc3NpYmxlIGNvbXBsZXRpb25zLgorKi8KK2ludAorcmxfbGlzdF9wb3NzaWIocGF0aG5hbWUsIGF2cCkKKyAgICBjaGFyCSpwYXRobmFtZTsKKyAgICBjaGFyCSoqKmF2cDsKK3sKKyAgICBjaGFyCSpkaXI7CisgICAgY2hhcgkqZmlsZTsKKyAgICBpbnQJCWFjOworCisgICAgaWYgKFNwbGl0UGF0aChwYXRobmFtZSwgJmRpciwgJmZpbGUpIDwgMCkKKwlyZXR1cm4gMDsKKyAgICBhYyA9IEZpbmRNYXRjaGVzKGRpciwgZmlsZSwgYXZwKTsKKyAgICBESVNQT1NFKGRpcik7CisgICAgRElTUE9TRShmaWxlKTsKKyAgICByZXR1cm4gYWM7Cit9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS9lZGl0bGluZS4zIGIvZGVidWdnZXIvcmVhZGxpbmUvZWRpdGxpbmUuMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg1MWVkCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvcmVhZGxpbmUvZWRpdGxpbmUuMwpAQCAtMCwwICsxLDE3NSBAQAorLlwiICRSZXZpc2lvbjogMS4xICQKKy5USCBFRElUTElORSAzCisuU0ggTkFNRQorZWRpdGxpbmUgXC0gY29tbWFuZC1saW5lIGVkaXRpbmcgbGlicmFyeSB3aXRoIGhpc3RvcnkKKy5TSCBTWU5PUFNJUworLm5mCisuQiAiY2hhciAqIgorLkIgInJlYWRsaW5lKHByb21wdCkiCisuQiAiICAgICBjaGFyCSpwcm9tcHQ7IgorCisuQiAidm9pZCIKKy5CICJhZGRfaGlzdG9yeShsaW5lKSIKKy5CICIgICAgY2hhcgkqbGluZTsiCisuZmkKKy5TSCBERVNDUklQVElPTgorLkkgRWRpdGxpbmUKK2lzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIGFuIGxpbmUtZWRpdGluZyBpbnRlcmZhY2Ugd2l0aCB0ZXh0IHJlY2FsbC4KK0l0IGlzIGludGVuZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKKy5JIHJlYWRsaW5lCitsaWJyYXJ5IHByb3ZpZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGJ1dCBtdWNoIHNtYWxsZXIuCitUaGUgYnVsayBvZiB0aGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyB0aGUgdXNlciBpbnRlcmZhY2UuCisuUFAKK1RoZQorLkkgcmVhZGxpbmUKK3JvdXRpbmUgcmV0dXJucyBhIGxpbmUgb2YgdGV4dCB3aXRoIHRoZSB0cmFpbGluZyBuZXdsaW5lIHJlbW92ZWQuCitUaGUgZGF0YSBpcyByZXR1cm5lZCBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQgd2l0aAorLklSIG1hbGxvYyAoMyksCitzbyB0aGUgc3BhY2Ugc2hvdWxkIGJlIHJlbGVhc2VkIHdpdGgKKy5JUiBmcmVlICgzKQord2hlbiB0aGUgY2FsbGluZyBwcm9ncmFtIGlzIGRvbmUgd2l0aCBpdC4KK0JlZm9yZSBhY2NlcHRpbmcgaW5wdXQgZnJvbSB0aGUgdXNlciwgdGhlIHNwZWNpZmllZAorLkkgcHJvbXB0CitpcyBkaXNwbGF5ZWQgb24gdGhlIHRlcm1pbmFsLgorLlBQCitUaGUKKy5JIGFkZF9oaXN0b3J5Cityb3V0aW5lIG1ha2VzIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkCisuSSBsaW5lCithbmQgYWRkcyBpdCB0byB0aGUgaW50ZXJuYWwgaGlzdG9yeSBsaXN0LgorLlNTICJVc2VyIEludGVyZmFjZSIKK0EgcHJvZ3JhbSB0aGF0IHVzZXMgdGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGEgc2ltcGxlIGVtYWNzLWxpa2UgZWRpdGluZworaW50ZXJmYWNlIHRvIGl0cyB1c2Vycy4KK0EgbGluZSBtYXkgYmUgZWRpdGVkIGJlZm9yZSBpdCBpcyBzZW50IHRvIHRoZSBjYWxsaW5nIHByb2dyYW0gYnkgdHlwaW5nIGVpdGhlcgorY29udHJvbCBjaGFyYWN0ZXJzIG9yIGVzY2FwZSBzZXF1ZW5jZXMuCitBIGNvbnRyb2wgY2hhcmFjdGVyLCBzaG93biBhcyBhIGNhcmV0IGZvbGxvd2VkIGJ5IGEgbGV0dGVyLCBpcyB0eXBlZCBieQoraG9sZGluZyBkb3duIHRoZSBgYGNvbnRyb2wnJyBrZXkgd2hpbGUgdGhlIGxldHRlciBpcyB0eXBlZC4KK0ZvciBleGFtcGxlLCBgYF5BJycgaXMgYSBjb250cm9sLUEuCitBbiBlc2NhcGUgc2VxdWVuY2UgaXMgZW50ZXJlZCBieSB0eXBpbmcgdGhlIGBgZXNjYXBlJycga2V5IGZvbGxvd2VkIGJ5IG9uZSBvcgorbW9yZSBjaGFyYWN0ZXJzLgorVGhlIGVzY2FwZSBrZXkgaXMgYWJicmV2aWF0ZWQgYXMgYGBFU0MuJycKK05vdGUgdGhhdCB1bmxpa2UgY29udHJvbCBrZXlzLCBjYXNlIG1hdHRlcnMgaW4gZXNjYXBlIHNlcXVlbmNlczsgYGBFU0NcIEYnJworaXMgbm90IHRoZSBzYW1lIGFzIGBgRVNDXCBmJycuCisuUFAKK0FuIGVkaXRpbmcgY29tbWFuZCBtYXkgYmUgdHlwZWQgYW55d2hlcmUgb24gdGhlIGxpbmUsIG5vdCBqdXN0IGF0IHRoZQorYmVnaW5uaW5nLgorSW4gYWRkaXRpb24sIGEgcmV0dXJuIG1heSBhbHNvIGJlIHR5cGVkIGFueXdoZXJlIG9uIHRoZSBsaW5lLCBub3QganVzdCBhdAordGhlIGVuZC4KKy5QUAorTW9zdCBlZGl0aW5nIGNvbW1hbmRzIG1heSBiZSBnaXZlbiBhIHJlcGVhdCBjb3VudCwKKy5JUiBuICwKK3doZXJlCisuSSBuCitpcyBhIG51bWJlci4KK1RvIGVudGVyIGEgcmVwZWF0IGNvdW50LCB0eXBlIHRoZSBlc2NhcGUga2V5LCB0aGUgbnVtYmVyLCBhbmQgdGhlbgordGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KK0ZvciBleGFtcGxlLCBgYEVTQ1wgNFwgXmYnJyBtb3ZlcyBmb3J3YXJkIGZvdXIgY2hhcmFjdGVycy4KK0lmIGEgY29tbWFuZCBtYXkgYmUgZ2l2ZW4gYSByZXBlYXQgY291bnQgdGhlbiB0aGUgdGV4dCBgYFtuXScnIGlzIGdpdmVuIGF0IHRoZQorZW5kIG9mIGl0cyBkZXNjcmlwdGlvbi4KKy5QUAorVGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnMgYXJlIGFjY2VwdGVkOgorLlJTCisubmYKKy50YSBcdydFU0MgREVMICAndQorXkEJTW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCiteQglNb3ZlIGxlZnQgKGJhY2t3YXJkcykgW25dCiteRAlEZWxldGUgY2hhcmFjdGVyIFtuXQorXkUJTW92ZSB0byBlbmQgb2YgbGluZQorXkYJTW92ZSByaWdodCAoZm9yd2FyZHMpIFtuXQorXkcJUmluZyB0aGUgYmVsbAorXkgJRGVsZXRlIGNoYXJhY3RlciBiZWZvcmUgY3Vyc29yIChiYWNrc3BhY2Uga2V5KSBbbl0KK15JCUNvbXBsZXRlIGZpbGVuYW1lICh0YWIga2V5KTsgc2VlIGJlbG93CiteSglEb25lIHdpdGggbGluZSAocmV0dXJuIGtleSkKK15LCUtpbGwgdG8gZW5kIG9mIGxpbmUgKG9yIGNvbHVtbiBbbl0pCiteTAlSZWRpc3BsYXkgbGluZQorXk0JRG9uZSB3aXRoIGxpbmUgKGFsdGVybmF0ZSByZXR1cm4ga2V5KQorXk4JR2V0IG5leHQgbGluZSBmcm9tIGhpc3RvcnkgW25dCiteUAlHZXQgcHJldmlvdXMgbGluZSBmcm9tIGhpc3RvcnkgW25dCiteUglTZWFyY2ggYmFja3dhcmQgKGZvcndhcmQgaWYgW25dKSB0aHJvdWdoIGhpc3RvcnkgZm9yIHRleHQ7CitcJgltdXN0IHN0YXJ0IGxpbmUgaWYgdGV4dCBiZWdpbnMgd2l0aCBhbiB1cGFycm93CiteVAlUcmFuc3Bvc2UgY2hhcmFjdGVycworXlYJSW5zZXJ0IG5leHQgY2hhcmFjdGVyLCBldmVuIGlmIGl0IGlzIGFuIGVkaXQgY29tbWFuZAorXlcJV2lwZSB0byB0aGUgbWFyaworXlheWAlFeGNoYW5nZSBjdXJyZW50IGxvY2F0aW9uIGFuZCBtYXJrCiteWQlZYW5rIGJhY2sgbGFzdCBraWxsZWQgdGV4dAorXlsJU3RhcnQgYW4gZXNjYXBlIHNlcXVlbmNlIChlc2NhcGUga2V5KQorXl1jCU1vdmUgZm9yd2FyZCB0byBuZXh0IGNoYXJhY3RlciBgYGMnJworXj8JRGVsZXRlIGNoYXJhY3RlciBiZWZvcmUgY3Vyc29yIChkZWxldGUga2V5KSBbbl0KKy5maQorLlJFCisuUFAKK1RoZSBmb2xsb3dpbmcgZXNjYXBlIHNlcXVlbmNlcyBhcmUgcHJvdmlkZWQuCisuUlMKKy5uZgorLnRhIFx3J0VTQyBERUwgICd1CitFU0NcIF5ICURlbGV0ZSBwcmV2aW91cyB3b3JkIChiYWNrc3BhY2Uga2V5KSBbbl0KK0VTQ1wgREVMCURlbGV0ZSBwcmV2aW91cyB3b3JkIChkZWxldGUga2V5KSBbbl0KK0VTQ1wgU1AJU2V0IHRoZSBtYXJrIChzcGFjZSBrZXkpOyBzZWUgXlheWCBhbmQgXlkgYWJvdmUKK0VTQ1wgXC4JR2V0IHRoZSBsYXN0IChvciBbbl0ndGgpIHdvcmQgZnJvbSBwcmV2aW91cyBsaW5lCitFU0NcIFw/CVNob3cgcG9zc2libGUgY29tcGxldGlvbnM7IHNlZSBiZWxvdworRVNDXCA8CU1vdmUgdG8gc3RhcnQgb2YgaGlzdG9yeQorRVNDXCA+CU1vdmUgdG8gZW5kIG9mIGhpc3RvcnkKK0VTQ1wgYglNb3ZlIGJhY2t3YXJkIGEgd29yZCBbbl0KK0VTQ1wgZAlEZWxldGUgd29yZCB1bmRlciBjdXJzb3IgW25dCitFU0NcIGYJTW92ZSBmb3J3YXJkIGEgd29yZCBbbl0KK0VTQ1wgbAlNYWtlIHdvcmQgbG93ZXJjYXNlIFtuXQorRVNDXCB1CU1ha2Ugd29yZCB1cHBlcmNhc2UgW25dCitFU0NcIHkJWWFuayBiYWNrIGxhc3Qga2lsbGVkIHRleHQKK0VTQ1wgdglTaG93IGxpYnJhcnkgdmVyc2lvbgorRVNDXCB3CU1ha2UgYXJlYSB1cCB0byBtYXJrIHlhbmthYmxlCitFU0NcIG5uCVNldCByZXBlYXQgY291bnQgdG8gdGhlIG51bWJlciBubgorRVNDXCBDCVJlYWQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgYF9DXycnLCB3aGVyZSBDIGlzCitcJglhbiB1cHBlcmNhc2UgbGV0dGVyCisuZmkKKy5SRQorLlBQCitUaGUKKy5JIGVkaXRsaW5lCitsaWJyYXJ5IGhhcyBhIHNtYWxsIG1hY3JvIGZhY2lsaXR5LgorSWYgeW91IHR5cGUgdGhlIGVzY2FwZSBrZXkgZm9sbG93ZWQgYnkgYW4gdXBwZXJjYXNlIGxldHRlciwKKy5JUiBDICwKK3RoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkkgX0NfCithcmUgcmVhZCBpbiBhcyBpZiB5b3UgaGFkIHR5cGVkIHRoZW0gYXQgdGhlIGtleWJvYXJkLgorRm9yIGV4YW1wbGUsIGlmIHRoZSB2YXJpYWJsZQorLkkgX0xfCitjb250YWlucyB0aGUgZm9sbG93aW5nOgorLlJTCiteQV5LZWNobyAnXlZeW1tIXlZeW1sySideTQorLlJFCitUaGVuIHR5cGluZyBgYEVTQyBMJycgd2lsbCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUsIGtpbGwgdGhlCitlbnRpcmUgbGluZSwgZW50ZXIgdGhlIGVjaG8gY29tbWFuZCBuZWVkZWQgdG8gY2xlYXIgdGhlIHRlcm1pbmFsIChpZiB5b3VyCit0ZXJtaW5hbCBpcyBsaWtlIGEgVlQtMTAwKSwgYW5kIHNlbmQgdGhlIGxpbmUgYmFjayB0byB0aGUgc2hlbGwuCisuUFAKK1RoZQorLkkgZWRpdGxpbmUKK2xpYnJhcnkgYWxzbyBkb2VzIGZpbGVuYW1lIGNvbXBsZXRpb24uCitTdXBwb3NlIHRoZSByb290IGRpcmVjdG9yeSBoYXMgdGhlIGZvbGxvd2luZyBmaWxlcyBpbiBpdDoKKy5SUworLm5mCisudGEgXHcnY29yZSAgICd1CitiaW4Jdm11bml4Citjb3JlCXZtdW5peC5vbGQKKy5maQorLlJFCitJZiB5b3UgdHlwZSBgYHJtXCAvdicnIGFuZCB0aGVuIHRoZSB0YWIga2V5LgorLkkgRWRpdGxpbmUKK3dpbGwgdGhlbiBmaW5pc2ggb2ZmIGFzIG11Y2ggb2YgdGhlIG5hbWUgYXMgcG9zc2libGUgYnkgYWRkaW5nIGBgbXVuaXgnJy4KK0JlY2F1c2UgdGhlIG5hbWUgaXMgbm90IHVuaXF1ZSwgaXQgd2lsbCB0aGVuIGJlZXAuCitJZiB5b3UgdHlwZSB0aGUgZXNjYXBlIGtleSBhbmQgYSBxdWVzdGlvbiBtYXJrLCBpdCB3aWxsIGRpc3BsYXkgdGhlCit0d28gY2hvaWNlcy4KK0lmIHlvdSB0aGVuIHR5cGUgYSBwZXJpb2QgYW5kIGEgdGFiLCB0aGUgbGlicmFyeSB3aWxsIGZpbmlzaCBvZmYgdGhlIGZpbGVuYW1lCitmb3IgeW91OgorLlJTCisubmYKKy5SSSAicm0gL3ZbVEFCXSIgbXVuaXggLlRBQiBvbGQKKy5maQorLlJFCitUaGUgdGFiIGtleSBpcyBzaG93biBieSBgYFtUQUJdJycgYW5kIHRoZSBhdXRvbWF0aWNhbGx5LWVudGVyZWQgdGV4dAoraXMgc2hvd24gaW4gaXRhbGljcy4KKy5TSCAiQlVHUyBBTkQgTElNSVRBVElPTlMiCitDYW5ub3QgaGFuZGxlIGxpbmVzIG1vcmUgdGhhbiA4MCBjb2x1bW5zLgorLlNIIEFVVEhPUlMKK1NpbW11bGUgUi4gVHVybmVyIDx1dW5ldC51dS5uZXQhY2FwaXRvbCFzeXNnbyFzaW1teT4KK2FuZCBSaWNoICRhbHogPHJzYWx6QG9zZi5vcmc+LgorT3JpZ2luYWwgbWFudWFsIHBhZ2UgYnkgRGF2aUQgVy4gU2FuZGVyc29uIDxkd3NAc3NlYy53aXNjLmVkdT4uCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS9lZGl0bGluZS5jIGIvZGVidWdnZXIvcmVhZGxpbmUvZWRpdGxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM4ZGUwCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvcmVhZGxpbmUvZWRpdGxpbmUuYwpAQCAtMCwwICsxLDEzNzggQEAKKy8qICAkUmV2aXNpb246IDEuNCAkCisqKgorKiogIE1haW4gZWRpdGluZyByb3V0aW5lcyBmb3IgZWRpdGxpbmUgbGlicmFyeS4KKyovCisjaW5jbHVkZSAiZWRpdGxpbmUuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisvKgorKiogIE1hbmlmZXN0IGNvbnN0YW50cy4KKyovCisjZGVmaW5lIFNDUkVFTl9XSURUSAk4MAorI2RlZmluZSBTQ1JFRU5fUk9XUwkyNAorI2RlZmluZSBOT19BUkcJCSgtMSkKKyNkZWZpbmUgREVMCQkxMjcKKyNkZWZpbmUgQ1RMKHgpCQkoKHgpICYgMHgxRikKKyNkZWZpbmUgSVNDVEwoeCkJKCh4KSAmJiAoeCkgPCAnICcpCisjZGVmaW5lIFVOQ1RMKHgpCSgoeCkgKyA2NCkKKyNkZWZpbmUgTUVUQSh4KQkJKCh4KSB8IDB4ODApCisjZGVmaW5lIElTTUVUQSh4KQkoKHgpICYgMHg4MCkKKyNkZWZpbmUgVU5NRVRBKHgpCSgoeCkgJiAweDdGKQorI2lmCSFkZWZpbmVkKEhJU1RfU0laRSkKKyNkZWZpbmUgSElTVF9TSVpFCTIwCisjZW5kaWYJLyogIWRlZmluZWQoSElTVF9TSVpFKSAqLworCisvKgorKiogIENvbW1hbmQgc3RhdHVzIGNvZGVzLgorKi8KK3R5cGVkZWYgZW51bSBfU1RBVFVTIHsKKyAgICBDU2RvbmUsIENTZW9mLCBDU21vdmUsIENTZGlzcGF0Y2gsIENTc3RheQorfSBTVEFUVVM7CisKKy8qCisqKiAgVGhlIHR5cGUgb2YgY2FzZS1jaGFuZ2luZyB0byBwZXJmb3JtLgorKi8KK3R5cGVkZWYgZW51bSBfQ0FTRSB7CisgICAgVE91cHBlciwgVE9sb3dlcgorfSBDQVNFOworCisvKgorKiogIEtleSB0byBjb21tYW5kIG1hcHBpbmcuCisqLwordHlwZWRlZiBzdHJ1Y3QgX0tFWU1BUCB7CisgICAgQ0hBUglLZXk7CisgICAgU1RBVFVTCSgqRnVuY3Rpb24pKCk7Cit9IEtFWU1BUDsKKworLyoKKyoqICBDb21tYW5kIGhpc3Rvcnkgc3RydWN0dXJlLgorKi8KK3R5cGVkZWYgc3RydWN0IF9ISVNUT1JZIHsKKyAgICBpbnQJCVNpemU7CisgICAgaW50CQlQb3M7CisgICAgQ0hBUgkqTGluZXNbSElTVF9TSVpFXTsKK30gSElTVE9SWTsKKworLyoKKyoqICBHbG9iYWxzLgorKi8KK2ludAkJcmxfZW9mOworaW50CQlybF9lcmFzZTsKK2ludAkJcmxfaW50cjsKK2ludAkJcmxfa2lsbDsKKworU1RBVElDIENIQVIJCU5JTFtdID0gIiI7CitTVEFUSUMgQ09OU1QgQ0hBUgkqSW5wdXQgPSBOSUw7CitTVEFUSUMgQ0hBUgkJKkxpbmU7CitTVEFUSUMgQ09OU1QgY2hhcgkqUHJvbXB0OworU1RBVElDIENIQVIJCSpZYW5rZWQ7CitTVEFUSUMgY2hhcgkJKlNjcmVlbjsKK1NUQVRJQyBjaGFyCQlORVdMSU5FW109IENSTEY7CitTVEFUSUMgSElTVE9SWQkJSDsKK2ludAkJcmxfcXVpdDsKK1NUQVRJQyBpbnQJCVJlcGVhdDsKK1NUQVRJQyBpbnQJCUVuZDsKK1NUQVRJQyBpbnQJCU1hcms7CitTVEFUSUMgaW50CQlPbGRQb2ludDsKK1NUQVRJQyBpbnQJCVBvaW50OworU1RBVElDIGludAkJUHVzaEJhY2s7CitTVEFUSUMgaW50CQlQdXNoZWQ7CitGT1JXQVJEIEtFWU1BUAkJTWFwWzMzXTsKK0ZPUldBUkQgS0VZTUFQCQlNZXRhTWFwWzE2XTsKK1NUQVRJQyBTSVpFX1QJCUxlbmd0aDsKK1NUQVRJQyBTSVpFX1QJCVNjcmVlbkNvdW50OworU1RBVElDIFNJWkVfVAkJU2NyZWVuU2l6ZTsKK1NUQVRJQyBjaGFyCQkqYmFja3NwYWNlOworU1RBVElDIGludAkJVFRZd2lkdGg7CitTVEFUSUMgaW50CQlUVFlyb3dzOworCisvKiBEaXNwbGF5IHByaW50IDgtYml0IGNoYXJzIGFzIGBNLXgnIG9yIGFzIHRoZSBhY3R1YWwgOC1iaXQgY2hhcj8gKi8KK2ludAkJcmxfbWV0YV9jaGFycyA9IDE7CisKKy8qCisqKiAgRGVjbGFyYXRpb25zLgorKi8KK1NUQVRJQyBDSEFSCSplZGl0aW5wdXQoKTsKK2V4dGVybiBpbnQJcmVhZCgpOworZXh0ZXJuIGludAl3cml0ZSgpOworI2lmCWRlZmluZWQoVVNFX1RFUk1DQVApCitleHRlcm4gY2hhcgkqZ2V0ZW52KCk7CitleHRlcm4gY2hhcgkqdGdldHN0cigpOworZXh0ZXJuIGludAl0Z2V0ZW50KCk7CisjZW5kaWYJLyogZGVmaW5lZChVU0VfVEVSTUNBUCkgKi8KKwwKKy8qCisqKiAgVFRZIGlucHV0L291dHB1dCBmdW5jdGlvbnMuCisqLworCitTVEFUSUMgdm9pZAorVFRZZmx1c2goKQoreworICAgIGlmIChTY3JlZW5Db3VudCkgeworCSh2b2lkKXdyaXRlKDEsIFNjcmVlbiwgU2NyZWVuQ291bnQpOworCVNjcmVlbkNvdW50ID0gMDsKKyAgICB9Cit9CisKK1NUQVRJQyB2b2lkCitUVFlwdXQoYykKKyAgICBDSEFSCWM7Cit7CisgICAgU2NyZWVuW1NjcmVlbkNvdW50XSA9IGM7CisgICAgaWYgKCsrU2NyZWVuQ291bnQgPj0gU2NyZWVuU2l6ZSAtIDEpIHsKKwlTY3JlZW5TaXplICs9IFNDUkVFTl9JTkM7CisJUkVORVcoU2NyZWVuLCBjaGFyLCBTY3JlZW5TaXplKTsKKyAgICB9Cit9CisKK1NUQVRJQyB2b2lkCitUVFlwdXRzKHApCisgICAgQ0hBUgkqcDsKK3sKKyAgICB3aGlsZSAoKnApCisJVFRZcHV0KCpwKyspOworfQorCitTVEFUSUMgdm9pZAorVFRZc2hvdyhjKQorICAgIENIQVIJYzsKK3sKKyAgICBpZiAoYyA9PSBERUwpIHsKKwlUVFlwdXQoJ14nKTsKKwlUVFlwdXQoJz8nKTsKKyAgICB9CisgICAgZWxzZSBpZiAoSVNDVEwoYykpIHsKKwlUVFlwdXQoJ14nKTsKKwlUVFlwdXQoVU5DVEwoYykpOworICAgIH0KKyAgICBlbHNlIGlmIChybF9tZXRhX2NoYXJzICYmIElTTUVUQShjKSkgeworCVRUWXB1dCgnTScpOworCVRUWXB1dCgnLScpOworCVRUWXB1dChVTk1FVEEoYykpOworICAgIH0KKyAgICBlbHNlCisJVFRZcHV0KGMpOworfQorCitTVEFUSUMgdm9pZAorVFRZc3RyaW5nKHApCisgICAgQ0hBUgkqcDsKK3sKKyAgICB3aGlsZSAoKnApCisJVFRZc2hvdygqcCsrKTsKK30KKworU1RBVElDIHVuc2lnbmVkIGludAorVFRZZ2V0KCkKK3sKKyAgICBDSEFSCWM7CisKKyAgICBUVFlmbHVzaCgpOworICAgIGlmIChQdXNoZWQpIHsKKwlQdXNoZWQgPSAwOworCXJldHVybiBQdXNoQmFjazsKKyAgICB9CisgICAgaWYgKCpJbnB1dCkKKwlyZXR1cm4gKklucHV0Kys7CisgICAgcmV0dXJuIHJlYWQoMCwgJmMsIChTSVpFX1QpMSkgPT0gMSA/IGMgOiBFT0Y7Cit9CisKKyNkZWZpbmUgVFRZYmFjaygpCShiYWNrc3BhY2UgPyBUVFlwdXRzKChDSEFSICopYmFja3NwYWNlKSA6IFRUWXB1dCgnXGInKSkKKworU1RBVElDIHZvaWQKK1RUWWJhY2tuKG4pCisgICAgaW50CQluOworeworICAgIHdoaWxlICgtLW4gPj0gMCkKKwlUVFliYWNrKCk7Cit9CisKK1NUQVRJQyB2b2lkCitUVFlpbmZvKCkKK3sKKyAgICBzdGF0aWMgaW50CQlpbml0OworI2lmCWRlZmluZWQoVVNFX1RFUk1DQVApCisgICAgY2hhcgkJKnRlcm07CisgICAgY2hhcgkJYnVmZlsyMDQ4XTsKKyAgICBjaGFyCQkqYnA7CisjZW5kaWYJLyogZGVmaW5lZChVU0VfVEVSTUNBUCkgKi8KKyNpZglkZWZpbmVkKFRJT0NHV0lOU1opCisgICAgc3RydWN0IHdpbnNpemUJVzsKKyNlbmRpZgkvKiBkZWZpbmVkKFRJT0NHV0lOU1opICovCisKKyAgICBpZiAoaW5pdCkgeworI2lmCWRlZmluZWQoVElPQ0dXSU5TWikKKwkvKiBQZXJoYXBzIHdlIGdvdCByZXNpemVkLiAqLworCWlmIChpb2N0bCgwLCBUSU9DR1dJTlNaLCAmVykgPj0gMAorCSAmJiBXLndzX2NvbCA+IDAgJiYgVy53c19yb3cgPiAwKSB7CisJICAgIFRUWXdpZHRoID0gKGludClXLndzX2NvbDsKKwkgICAgVFRZcm93cyA9IChpbnQpVy53c19yb3c7CisJfQorI2VuZGlmCS8qIGRlZmluZWQoVElPQ0dXSU5TWikgKi8KKwlyZXR1cm47CisgICAgfQorICAgIGluaXQrKzsKKworICAgIFRUWXdpZHRoID0gVFRZcm93cyA9IDA7CisjaWYJZGVmaW5lZChVU0VfVEVSTUNBUCkKKyAgICBicCA9ICZidWZmWzBdOworICAgIGlmICgodGVybSA9IGdldGVudigiVEVSTSIpKSA9PSBOVUxMKQorCXRlcm0gPSAiZHVtYiI7CisgICAgaWYgKHRnZXRlbnQoYnVmZiwgdGVybSkgPCAwKSB7CisgICAgICAgVFRZd2lkdGggPSBTQ1JFRU5fV0lEVEg7CisgICAgICAgVFRZcm93cyA9IFNDUkVFTl9ST1dTOworICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmFja3NwYWNlID0gdGdldHN0cigibGUiLCAmYnApOworICAgIFRUWXdpZHRoID0gdGdldG51bSgiY28iKTsKKyAgICBUVFlyb3dzID0gdGdldG51bSgibGkiKTsKKyNlbmRpZgkvKiBkZWZpbmVkKFVTRV9URVJNQ0FQKSAqLworCisjaWYJZGVmaW5lZChUSU9DR1dJTlNaKQorICAgIGlmIChpb2N0bCgwLCBUSU9DR1dJTlNaLCAmVykgPj0gMCkgeworCVRUWXdpZHRoID0gKGludClXLndzX2NvbDsKKwlUVFlyb3dzID0gKGludClXLndzX3JvdzsKKyAgICB9CisjZW5kaWYJLyogZGVmaW5lZChUSU9DR1dJTlNaKSAqLworCisgICAgaWYgKFRUWXdpZHRoIDw9IDAgfHwgVFRZcm93cyA8PSAwKSB7CisJVFRZd2lkdGggPSBTQ1JFRU5fV0lEVEg7CisJVFRZcm93cyA9IFNDUkVFTl9ST1dTOworICAgIH0KK30KKwwKKworLyoKKyoqICBQcmludCBhbiBhcnJheSBvZiB3b3JkcyBpbiBjb2x1bW5zLgorKi8KK1NUQVRJQyB2b2lkCitjb2x1bW5zKGFjLCBhdikKKyAgICBpbnQJCWFjOworICAgIENIQVIJKiphdjsKK3sKKyAgICBDSEFSCSpwOworICAgIGludAkJaTsKKyAgICBpbnQJCWo7CisgICAgaW50CQlrOworICAgIGludAkJbGVuOworICAgIGludAkJc2tpcDsKKyAgICBpbnQJCWxvbmdlc3Q7CisgICAgaW50CQljb2xzOworCisgICAgLyogRmluZCBsb25nZXN0IG5hbWUsIGRldGVybWluZSBjb2x1bW4gY291bnQgZnJvbSB0aGF0LiAqLworICAgIGZvciAobG9uZ2VzdCA9IDAsIGkgPSAwOyBpIDwgYWM7IGkrKykKKwlpZiAoKGogPSBzdHJsZW4oKGNoYXIgKilhdltpXSkpID4gbG9uZ2VzdCkKKwkgICAgbG9uZ2VzdCA9IGo7CisgICAgY29scyA9IFRUWXdpZHRoIC8gKGxvbmdlc3QgKyAzKTsKKworICAgIFRUWXB1dHMoKENIQVIgKilORVdMSU5FKTsKKyAgICBmb3IgKHNraXAgPSBhYyAvIGNvbHMgKyAxLCBpID0gMDsgaSA8IHNraXA7IGkrKykgeworCWZvciAoaiA9IGk7IGogPCBhYzsgaiArPSBza2lwKSB7CisJICAgIGZvciAocCA9IGF2W2pdLCBsZW4gPSBzdHJsZW4oKGNoYXIgKilwKSwgayA9IGxlbjsgLS1rID49IDA7IHArKykKKwkJVFRZcHV0KCpwKTsKKwkgICAgaWYgKGogKyBza2lwIDwgYWMpCisJCXdoaWxlICgrK2xlbiA8IGxvbmdlc3QgKyAzKQorCQkgICAgVFRZcHV0KCcgJyk7CisJfQorCVRUWXB1dHMoKENIQVIgKilORVdMSU5FKTsKKyAgICB9Cit9CisKK1NUQVRJQyB2b2lkCityZXBvc2l0aW9uKCkKK3sKKyAgICBpbnQJCWk7CisgICAgQ0hBUgkqcDsKKworICAgIFRUWXB1dCgnXHInKTsKKyAgICBUVFlwdXRzKChDSEFSICopUHJvbXB0KTsKKyAgICBmb3IgKGkgPSBQb2ludCwgcCA9IExpbmU7IC0taSA+PSAwOyBwKyspCisJVFRZc2hvdygqcCk7Cit9CisKK1NUQVRJQyB2b2lkCitsZWZ0KENoYW5nZSkKKyAgICBTVEFUVVMJQ2hhbmdlOworeworICAgIFRUWWJhY2soKTsKKyAgICBpZiAoUG9pbnQpIHsKKwlpZiAoSVNDVEwoTGluZVtQb2ludCAtIDFdKSkKKwkgICAgVFRZYmFjaygpOworICAgICAgICBlbHNlIGlmIChybF9tZXRhX2NoYXJzICYmIElTTUVUQShMaW5lW1BvaW50IC0gMV0pKSB7CisJICAgIFRUWWJhY2soKTsKKwkgICAgVFRZYmFjaygpOworCX0KKyAgICB9CisgICAgaWYgKENoYW5nZSA9PSBDU21vdmUpCisJUG9pbnQtLTsKK30KKworU1RBVElDIHZvaWQKK3JpZ2h0KENoYW5nZSkKKyAgICBTVEFUVVMJQ2hhbmdlOworeworICAgIFRUWXNob3coTGluZVtQb2ludF0pOworICAgIGlmIChDaGFuZ2UgPT0gQ1Ntb3ZlKQorCVBvaW50Kys7Cit9CisKK1NUQVRJQyBTVEFUVVMKK3JpbmdfYmVsbCgpCit7CisgICAgVFRZcHV0KCdcMDcnKTsKKyAgICBUVFlmbHVzaCgpOworICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2RvX21hY3JvKGMpCisgICAgdW5zaWduZWQgaW50CWM7Cit7CisgICAgQ0hBUgkJbmFtZVs0XTsKKworICAgIG5hbWVbMF0gPSAnXyc7CisgICAgbmFtZVsxXSA9IGM7CisgICAgbmFtZVsyXSA9ICdfJzsKKyAgICBuYW1lWzNdID0gJ1wwJzsKKworICAgIGlmICgoSW5wdXQgPSAoQ0hBUiAqKWdldGVudigoY2hhciAqKW5hbWUpKSA9PSBOVUxMKSB7CisJSW5wdXQgPSBOSUw7CisJcmV0dXJuIHJpbmdfYmVsbCgpOworICAgIH0KKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCitkb19mb3J3YXJkKG1vdmUpCisgICAgU1RBVFVTCW1vdmU7Cit7CisgICAgaW50CQlpOworICAgIENIQVIJKnA7CisKKyAgICBpID0gMDsKKyAgICBkbyB7CisJcCA9ICZMaW5lW1BvaW50XTsKKwlmb3IgKCA7IFBvaW50IDwgRW5kICYmICgqcCA9PSAnICcgfHwgIWlzYWxudW0oKnApKTsgUG9pbnQrKywgcCsrKQorCSAgICBpZiAobW92ZSA9PSBDU21vdmUpCisJCXJpZ2h0KENTc3RheSk7CisKKwlmb3IgKDsgUG9pbnQgPCBFbmQgJiYgaXNhbG51bSgqcCk7IFBvaW50KyssIHArKykKKwkgICAgaWYgKG1vdmUgPT0gQ1Ntb3ZlKQorCQlyaWdodChDU3N0YXkpOworCisJaWYgKFBvaW50ID09IEVuZCkKKwkgICAgYnJlYWs7CisgICAgfSB3aGlsZSAoKytpIDwgUmVwZWF0KTsKKworICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2RvX2Nhc2UodHlwZSkKKyAgICBDQVNFCXR5cGU7Cit7CisgICAgaW50CQlpOworICAgIGludAkJZW5kOworICAgIGludAkJY291bnQ7CisgICAgQ0hBUgkqcDsKKworICAgICh2b2lkKWRvX2ZvcndhcmQoQ1NzdGF5KTsKKyAgICBpZiAoT2xkUG9pbnQgIT0gUG9pbnQpIHsKKwlpZiAoKGNvdW50ID0gUG9pbnQgLSBPbGRQb2ludCkgPCAwKQorCSAgICBjb3VudCA9IC1jb3VudDsKKwlQb2ludCA9IE9sZFBvaW50OworCWlmICgoZW5kID0gUG9pbnQgKyBjb3VudCkgPiBFbmQpCisJICAgIGVuZCA9IEVuZDsKKwlmb3IgKGkgPSBQb2ludCwgcCA9ICZMaW5lW2ldOyBpIDwgZW5kOyBpKyssIHArKykgeworCSAgICBpZiAodHlwZSA9PSBUT3VwcGVyKSB7CisJCWlmIChpc2xvd2VyKCpwKSkKKwkJICAgICpwID0gdG91cHBlcigqcCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiAoaXN1cHBlcigqcCkpCisJCSpwID0gdG9sb3dlcigqcCk7CisJICAgIHJpZ2h0KENTbW92ZSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCitjYXNlX2Rvd25fd29yZCgpCit7CisgICAgcmV0dXJuIGRvX2Nhc2UoVE9sb3dlcik7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2Nhc2VfdXBfd29yZCgpCit7CisgICAgcmV0dXJuIGRvX2Nhc2UoVE91cHBlcik7Cit9CisKK1NUQVRJQyB2b2lkCitjZW9sKCkKK3sKKyAgICBpbnQJCWV4dHJhczsKKyAgICBpbnQJCWk7CisgICAgQ0hBUgkqcDsKKworICAgIGZvciAoZXh0cmFzID0gMCwgaSA9IFBvaW50LCBwID0gJkxpbmVbaV07IGkgPD0gRW5kOyBpKyssIHArKykgeworCVRUWXB1dCgnICcpOworCWlmIChJU0NUTCgqcCkpIHsKKwkgICAgVFRZcHV0KCcgJyk7CisJICAgIGV4dHJhcysrOworCX0KKwllbHNlIGlmIChybF9tZXRhX2NoYXJzICYmIElTTUVUQSgqcCkpIHsKKwkgICAgVFRZcHV0KCcgJyk7CisJICAgIFRUWXB1dCgnICcpOworCSAgICBleHRyYXMgKz0gMjsKKwl9CisgICAgfQorCisgICAgZm9yIChpICs9IGV4dHJhczsgaSA+IFBvaW50OyBpLS0pCisJVFRZYmFjaygpOworfQorCitTVEFUSUMgdm9pZAorY2xlYXJfbGluZSgpCit7CisgICAgUG9pbnQgPSAtc3RybGVuKFByb21wdCk7CisgICAgVFRZcHV0KCdccicpOworICAgIGNlb2woKTsKKyAgICBQb2ludCA9IDA7CisgICAgRW5kID0gMDsKKyAgICBMaW5lWzBdID0gJ1wwJzsKK30KKworU1RBVElDIFNUQVRVUworaW5zZXJ0X3N0cmluZyhwKQorICAgIENIQVIJKnA7Cit7CisgICAgU0laRV9UCWxlbjsKKyAgICBpbnQJCWk7CisgICAgQ0hBUgkqbmV3OworICAgIENIQVIJKnE7CisKKyAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKilwKTsKKyAgICBpZiAoRW5kICsgbGVuID49IExlbmd0aCkgeworCWlmICgobmV3ID0gTkVXKENIQVIsIExlbmd0aCArIGxlbiArIE1FTV9JTkMpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gQ1NzdGF5OworCWlmIChMZW5ndGgpIHsKKwkgICAgQ09QWUZST01UTyhuZXcsIExpbmUsIExlbmd0aCk7CisJICAgIERJU1BPU0UoTGluZSk7CisJfQorCUxpbmUgPSBuZXc7CisJTGVuZ3RoICs9IGxlbiArIE1FTV9JTkM7CisgICAgfQorCisgICAgZm9yIChxID0gJkxpbmVbUG9pbnRdLCBpID0gRW5kIC0gUG9pbnQ7IC0taSA+PSAwOyApCisJcVtsZW4gKyBpXSA9IHFbaV07CisgICAgQ09QWUZST01UTygmTGluZVtQb2ludF0sIHAsIGxlbik7CisgICAgRW5kICs9IGxlbjsKKyAgICBMaW5lW0VuZF0gPSAnXDAnOworICAgIFRUWXN0cmluZygmTGluZVtQb2ludF0pOworICAgIFBvaW50ICs9IGxlbjsKKworICAgIHJldHVybiBQb2ludCA9PSBFbmQgPyBDU3N0YXkgOiBDU21vdmU7Cit9CisMCisKK1NUQVRJQyBDSEFSICoKK25leHRfaGlzdCgpCit7CisgICAgcmV0dXJuIEguUG9zID49IEguU2l6ZSAtIDEgPyBOVUxMIDogSC5MaW5lc1srK0guUG9zXTsKK30KKworU1RBVElDIENIQVIgKgorcHJldl9oaXN0KCkKK3sKKyAgICByZXR1cm4gSC5Qb3MgPT0gMCA/IE5VTEwgOiBILkxpbmVzWy0tSC5Qb3NdOworfQorCitTVEFUSUMgU1RBVFVTCitkb19pbnNlcnRfaGlzdChwKQorICAgIENIQVIJKnA7Cit7CisgICAgaWYgKHAgPT0gTlVMTCkKKwlyZXR1cm4gcmluZ19iZWxsKCk7CisgICAgUG9pbnQgPSAwOworICAgIHJlcG9zaXRpb24oKTsKKyAgICBjZW9sKCk7CisgICAgRW5kID0gMDsKKyAgICByZXR1cm4gaW5zZXJ0X3N0cmluZyhwKTsKK30KKworU1RBVElDIFNUQVRVUworZG9faGlzdChtb3ZlKQorICAgIENIQVIJKigqbW92ZSkoKTsKK3sKKyAgICBDSEFSCSpwOworICAgIGludAkJaTsKKworICAgIGkgPSAwOworICAgIGRvIHsKKwlpZiAoKHAgPSAoKm1vdmUpKCkpID09IE5VTEwpCisJICAgIHJldHVybiByaW5nX2JlbGwoKTsKKyAgICB9IHdoaWxlICgrK2kgPCBSZXBlYXQpOworICAgIHJldHVybiBkb19pbnNlcnRfaGlzdChwKTsKK30KKworU1RBVElDIFNUQVRVUworaF9uZXh0KCkKK3sKKyAgICByZXR1cm4gZG9faGlzdChuZXh0X2hpc3QpOworfQorCitTVEFUSUMgU1RBVFVTCitoX3ByZXYoKQoreworICAgIHJldHVybiBkb19oaXN0KHByZXZfaGlzdCk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2hfZmlyc3QoKQoreworICAgIHJldHVybiBkb19pbnNlcnRfaGlzdChILkxpbmVzW0guUG9zID0gMF0pOworfQorCitTVEFUSUMgU1RBVFVTCitoX2xhc3QoKQoreworICAgIHJldHVybiBkb19pbnNlcnRfaGlzdChILkxpbmVzW0guUG9zID0gSC5TaXplIC0gMV0pOworfQorCisvKgorKiogIFJldHVybiB6ZXJvIGlmIHBhdCBhcHBlYXJzIGFzIGEgc3Vic3RyaW5nIGluIHRleHQuCisqLworU1RBVElDIGludAorc3Vic3RyY21wKHRleHQsIHBhdCwgbGVuKQorICAgIGNoYXIJKnRleHQ7CisgICAgY2hhcgkqcGF0OworICAgIGludAkJbGVuOworeworICAgIENIQVIJYzsKKworICAgIGlmICgoYyA9ICpwYXQpID09ICdcMCcpCisgICAgICAgIHJldHVybiAqdGV4dCA9PSAnXDAnOworICAgIGZvciAoIDsgKnRleHQ7IHRleHQrKykKKyAgICAgICAgaWYgKCp0ZXh0ID09IGMgJiYgc3RybmNtcCh0ZXh0LCBwYXQsIGxlbikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitTVEFUSUMgQ0hBUiAqCitzZWFyY2hfaGlzdChzZWFyY2gsIG1vdmUpCisgICAgQ0hBUgkqc2VhcmNoOworICAgIENIQVIJKigqbW92ZSkoKTsKK3sKKyAgICBzdGF0aWMgQ0hBUgkqb2xkX3NlYXJjaDsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCXBvczsKKyAgICBpbnQJCSgqbWF0Y2gpKCk7CisgICAgY2hhcgkqcGF0OworCisgICAgLyogU2F2ZSBvciBnZXQgcmVtZW1iZXJlZCBzZWFyY2ggcGF0dGVybi4gKi8KKyAgICBpZiAoc2VhcmNoICYmICpzZWFyY2gpIHsKKwlpZiAob2xkX3NlYXJjaCkKKwkgICAgRElTUE9TRShvbGRfc2VhcmNoKTsKKwlvbGRfc2VhcmNoID0gKENIQVIgKilzdHJkdXAoKGNoYXIgKilzZWFyY2gpOworICAgIH0KKyAgICBlbHNlIHsKKwlpZiAob2xkX3NlYXJjaCA9PSBOVUxMIHx8ICpvbGRfc2VhcmNoID09ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwlzZWFyY2ggPSBvbGRfc2VhcmNoOworICAgIH0KKworICAgIC8qIFNldCB1cCBwYXR0ZXJuLWZpbmRlci4gKi8KKyAgICBpZiAoKnNlYXJjaCA9PSAnXicpIHsKKwltYXRjaCA9IHN0cm5jbXA7CisJcGF0ID0gKGNoYXIgKikoc2VhcmNoICsgMSk7CisgICAgfQorICAgIGVsc2UgeworCW1hdGNoID0gc3Vic3RyY21wOworCXBhdCA9IChjaGFyICopc2VhcmNoOworICAgIH0KKyAgICBsZW4gPSBzdHJsZW4ocGF0KTsKKworICAgIGZvciAocG9zID0gSC5Qb3M7ICgqbW92ZSkoKSAhPSBOVUxMOyApCisJaWYgKCgqbWF0Y2gpKChjaGFyICopSC5MaW5lc1tILlBvc10sIHBhdCwgbGVuKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEguTGluZXNbSC5Qb3NdOworICAgIEguUG9zID0gcG9zOworICAgIHJldHVybiBOVUxMOworfQorCitTVEFUSUMgU1RBVFVTCitoX3NlYXJjaCgpCit7CisgICAgc3RhdGljIGludAlTZWFyY2hpbmc7CisgICAgQ09OU1QgY2hhcgkqb2xkX3Byb21wdDsKKyAgICBDSEFSCSooKm1vdmUpKCk7CisgICAgQ0hBUgkqcDsKKworICAgIGlmIChTZWFyY2hpbmcpCisJcmV0dXJuIHJpbmdfYmVsbCgpOworICAgIFNlYXJjaGluZyA9IDE7CisKKyAgICBjbGVhcl9saW5lKCk7CisgICAgb2xkX3Byb21wdCA9IFByb21wdDsKKyAgICBQcm9tcHQgPSAiU2VhcmNoOiAiOworICAgIFRUWXB1dHMoKENIQVIgKilQcm9tcHQpOworICAgIG1vdmUgPSBSZXBlYXQgPT0gTk9fQVJHID8gcHJldl9oaXN0IDogbmV4dF9oaXN0OworICAgIHAgPSBzZWFyY2hfaGlzdChlZGl0aW5wdXQoKSwgbW92ZSk7CisgICAgY2xlYXJfbGluZSgpOworICAgIFByb21wdCA9IG9sZF9wcm9tcHQ7CisgICAgVFRZcHV0cygoQ0hBUiAqKVByb21wdCk7CisKKyAgICBTZWFyY2hpbmcgPSAwOworICAgIHJldHVybiBkb19pbnNlcnRfaGlzdChwKTsKK30KKworU1RBVElDIFNUQVRVUworZmRfY2hhcigpCit7CisgICAgaW50CQlpOworCisgICAgaSA9IDA7CisgICAgZG8geworCWlmIChQb2ludCA+PSBFbmQpCisJICAgIGJyZWFrOworCXJpZ2h0KENTbW92ZSk7CisgICAgfSB3aGlsZSAoKytpIDwgUmVwZWF0KTsKKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgdm9pZAorc2F2ZV95YW5rKGJlZ2luLCBpKQorICAgIGludAkJYmVnaW47CisgICAgaW50CQlpOworeworICAgIGlmIChZYW5rZWQpIHsKKwlESVNQT1NFKFlhbmtlZCk7CisJWWFua2VkID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaSA8IDEpCisJcmV0dXJuOworCisgICAgaWYgKChZYW5rZWQgPSBORVcoQ0hBUiwgKFNJWkVfVClpICsgMSkpICE9IE5VTEwpIHsKKwlDT1BZRlJPTVRPKFlhbmtlZCwgJkxpbmVbYmVnaW5dLCBpKTsKKwlZYW5rZWRbaV0gPSAnXDAnOworICAgIH0KK30KKworU1RBVElDIFNUQVRVUworZGVsZXRlX3N0cmluZyhjb3VudCkKKyAgICBpbnQJCWNvdW50OworeworICAgIGludAkJaTsKKyAgICBDSEFSCSpwOworCisgICAgaWYgKGNvdW50IDw9IDAgfHwgRW5kID09IFBvaW50KQorCXJldHVybiByaW5nX2JlbGwoKTsKKworICAgIGlmIChjb3VudCA9PSAxICYmIFBvaW50ID09IEVuZCAtIDEpIHsKKwkvKiBPcHRpbWl6ZSBjb21tb24gY2FzZSBvZiBkZWxldGUgYXQgZW5kIG9mIGxpbmUuICovCisJRW5kLS07CisJcCA9ICZMaW5lW1BvaW50XTsKKwlpID0gMTsKKwlUVFlwdXQoJyAnKTsKKwlpZiAoSVNDVEwoKnApKSB7CisJICAgIGkgPSAyOworCSAgICBUVFlwdXQoJyAnKTsKKwl9CisJZWxzZSBpZiAocmxfbWV0YV9jaGFycyAmJiBJU01FVEEoKnApKSB7CisJICAgIGkgPSAzOworCSAgICBUVFlwdXQoJyAnKTsKKwkgICAgVFRZcHV0KCcgJyk7CisJfQorCVRUWWJhY2tuKGkpOworCSpwID0gJ1wwJzsKKwlyZXR1cm4gQ1Ntb3ZlOworICAgIH0KKyAgICBpZiAoUG9pbnQgKyBjb3VudCA+IEVuZCAmJiAoY291bnQgPSBFbmQgLSBQb2ludCkgPD0gMCkKKwlyZXR1cm4gQ1NzdGF5OworCisgICAgaWYgKGNvdW50ID4gMSkKKwlzYXZlX3lhbmsoUG9pbnQsIGNvdW50KTsKKworICAgIGZvciAocCA9ICZMaW5lW1BvaW50XSwgaSA9IEVuZCAtIChQb2ludCArIGNvdW50KSArIDE7IC0taSA+PSAwOyBwKyspCisJcFswXSA9IHBbY291bnRdOworICAgIGNlb2woKTsKKyAgICBFbmQgLT0gY291bnQ7CisgICAgVFRZc3RyaW5nKCZMaW5lW1BvaW50XSk7CisgICAgcmV0dXJuIENTbW92ZTsKK30KKworU1RBVElDIFNUQVRVUworYmtfY2hhcigpCit7CisgICAgaW50CQlpOworCisgICAgaSA9IDA7CisgICAgZG8geworCWlmIChQb2ludCA9PSAwKQorCSAgICBicmVhazsKKwlsZWZ0KENTbW92ZSk7CisgICAgfSB3aGlsZSAoKytpIDwgUmVwZWF0KTsKKworICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2JrX2RlbF9jaGFyKCkKK3sKKyAgICBpbnQJCWk7CisKKyAgICBpID0gMDsKKyAgICBkbyB7CisJaWYgKFBvaW50ID09IDApCisJICAgIGJyZWFrOworCWxlZnQoQ1Ntb3ZlKTsKKyAgICB9IHdoaWxlICgrK2kgPCBSZXBlYXQpOworCisgICAgcmV0dXJuIGRlbGV0ZV9zdHJpbmcoaSk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK3JlZGlzcGxheSgpCit7CisgICAgVFRZcHV0cygoQ0hBUiAqKU5FV0xJTkUpOworICAgIFRUWXB1dHMoKENIQVIgKilQcm9tcHQpOworICAgIFRUWXN0cmluZyhMaW5lKTsKKyAgICByZXR1cm4gQ1Ntb3ZlOworfQorCitTVEFUSUMgU1RBVFVTCitraWxsX2xpbmUoKQoreworICAgIGludAkJaTsKKworICAgIGlmIChSZXBlYXQgIT0gTk9fQVJHKSB7CisJaWYgKFJlcGVhdCA8IFBvaW50KSB7CisJICAgIGkgPSBQb2ludDsKKwkgICAgUG9pbnQgPSBSZXBlYXQ7CisJICAgIHJlcG9zaXRpb24oKTsKKwkgICAgKHZvaWQpZGVsZXRlX3N0cmluZyhpIC0gUG9pbnQpOworCX0KKwllbHNlIGlmIChSZXBlYXQgPiBQb2ludCkgeworCSAgICByaWdodChDU21vdmUpOworCSAgICAodm9pZClkZWxldGVfc3RyaW5nKFJlcGVhdCAtIFBvaW50IC0gMSk7CisJfQorCXJldHVybiBDU21vdmU7CisgICAgfQorCisgICAgc2F2ZV95YW5rKFBvaW50LCBFbmQgLSBQb2ludCk7CisgICAgTGluZVtQb2ludF0gPSAnXDAnOworICAgIGNlb2woKTsKKyAgICBFbmQgPSBQb2ludDsKKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCitpbnNlcnRfY2hhcihjKQorICAgIGludAkJYzsKK3sKKyAgICBTVEFUVVMJczsKKyAgICBDSEFSCWJ1ZmZbMl07CisgICAgQ0hBUgkqcDsKKyAgICBDSEFSCSpxOworICAgIGludAkJaTsKKworICAgIGlmIChSZXBlYXQgPT0gTk9fQVJHIHx8IFJlcGVhdCA8IDIpIHsKKwlidWZmWzBdID0gYzsKKwlidWZmWzFdID0gJ1wwJzsKKwlyZXR1cm4gaW5zZXJ0X3N0cmluZyhidWZmKTsKKyAgICB9CisKKyAgICBpZiAoKHAgPSBORVcoQ0hBUiwgUmVwZWF0ICsgMSkpID09IE5VTEwpCisJcmV0dXJuIENTc3RheTsKKyAgICBmb3IgKGkgPSBSZXBlYXQsIHEgPSBwOyAtLWkgPj0gMDsgKQorCSpxKysgPSBjOworICAgICpxID0gJ1wwJzsKKyAgICBSZXBlYXQgPSAwOworICAgIHMgPSBpbnNlcnRfc3RyaW5nKHApOworICAgIERJU1BPU0UocCk7CisgICAgcmV0dXJuIHM7Cit9CisKK1NUQVRJQyBTVEFUVVMKK21ldGEoKQoreworICAgIHVuc2lnbmVkIGludAljOworICAgIEtFWU1BUAkJKmtwOworCisgICAgaWYgKChjID0gVFRZZ2V0KCkpID09IEVPRikKKwlyZXR1cm4gQ1Nlb2Y7CisjaWYJZGVmaW5lZChBTlNJX0FSUk9XUykKKyAgICAvKiBBbHNvIGluY2x1ZGUgVlQtMTAwIGFycm93cy4gKi8KKyAgICBpZiAoYyA9PSAnWycgfHwgYyA9PSAnTycpCisJc3dpdGNoIChjID0gVFRZZ2V0KCkpIHsKKwlkZWZhdWx0OglyZXR1cm4gcmluZ19iZWxsKCk7CisJY2FzZSBFT0Y6CXJldHVybiBDU2VvZjsKKwljYXNlICdBJzoJcmV0dXJuIGhfcHJldigpOworCWNhc2UgJ0InOglyZXR1cm4gaF9uZXh0KCk7CisJY2FzZSAnQyc6CXJldHVybiBmZF9jaGFyKCk7CisJY2FzZSAnRCc6CXJldHVybiBia19jaGFyKCk7CisJfQorI2VuZGlmCS8qIGRlZmluZWQoQU5TSV9BUlJPV1MpICovCisKKyAgICBpZiAoaXNkaWdpdChjKSkgeworCWZvciAoUmVwZWF0ID0gYyAtICcwJzsgKGMgPSBUVFlnZXQoKSkgIT0gRU9GICYmIGlzZGlnaXQoYyk7ICkKKwkgICAgUmVwZWF0ID0gUmVwZWF0ICogMTAgKyBjIC0gJzAnOworCVB1c2hlZCA9IDE7CisJUHVzaEJhY2sgPSBjOworCXJldHVybiBDU3N0YXk7CisgICAgfQorCisgICAgaWYgKGlzdXBwZXIoYykpCisJcmV0dXJuIGRvX21hY3JvKGMpOworICAgIGZvciAoT2xkUG9pbnQgPSBQb2ludCwga3AgPSBNZXRhTWFwOyBrcC0+RnVuY3Rpb247IGtwKyspCisJaWYgKGtwLT5LZXkgPT0gYykKKwkgICAgcmV0dXJuICgqa3AtPkZ1bmN0aW9uKSgpOworCisgICAgcmV0dXJuIHJpbmdfYmVsbCgpOworfQorCitTVEFUSUMgU1RBVFVTCitlbWFjcyhjKQorICAgIHVuc2lnbmVkIGludAljOworeworICAgIFNUQVRVUwkJczsKKyAgICBLRVlNQVAJCSprcDsKKworICAgIGlmIChJU01FVEEoYykpIHsKKwlQdXNoZWQgPSAxOworCVB1c2hCYWNrID0gVU5NRVRBKGMpOworCXJldHVybiBtZXRhKCk7CisgICAgfQorICAgIGZvciAoa3AgPSBNYXA7IGtwLT5GdW5jdGlvbjsga3ArKykKKwlpZiAoa3AtPktleSA9PSBjKQorCSAgICBicmVhazsKKyAgICBzID0ga3AtPkZ1bmN0aW9uID8gKCprcC0+RnVuY3Rpb24pKCkgOiBpbnNlcnRfY2hhcigoaW50KWMpOworICAgIGlmICghUHVzaGVkKQorCS8qIE5vIHB1c2hiYWNrIG1lYW5zIG5vIHJlcGVhdCBjb3VudDsgaGFja3ksIGJ1dCB0cnVlLiAqLworCVJlcGVhdCA9IE5PX0FSRzsKKyAgICByZXR1cm4gczsKK30KKworU1RBVElDIFNUQVRVUworVFRZc3BlY2lhbChjKQorICAgIHVuc2lnbmVkIGludAljOworeworICAgIGlmIChJU01FVEEoYykpCisJcmV0dXJuIENTZGlzcGF0Y2g7CisKKyAgICBpZiAoYyA9PSBybF9lcmFzZSB8fCBjID09IERFTCkKKwlyZXR1cm4gYmtfZGVsX2NoYXIoKTsKKyAgICBpZiAoYyA9PSBybF9raWxsKSB7CisJaWYgKFBvaW50ICE9IDApIHsKKwkgICAgUG9pbnQgPSAwOworCSAgICByZXBvc2l0aW9uKCk7CisJfQorCVJlcGVhdCA9IE5PX0FSRzsKKwlyZXR1cm4ga2lsbF9saW5lKCk7CisgICAgfQorICAgIGlmIChjID09IHJsX2ludHIgfHwgYyA9PSBybF9xdWl0KSB7CisJUG9pbnQgPSBFbmQgPSAwOworCUxpbmVbMF0gPSAnXDAnOworCXJldHVybiByZWRpc3BsYXkoKTsKKyAgICB9CisgICAgaWYgKGMgPT0gcmxfZW9mICYmIFBvaW50ID09IDAgJiYgRW5kID09IDApCisJcmV0dXJuIENTZW9mOworCisgICAgcmV0dXJuIENTZGlzcGF0Y2g7Cit9CisKK1NUQVRJQyBDSEFSICoKK2VkaXRpbnB1dCgpCit7CisgICAgdW5zaWduZWQgaW50CWM7CisKKyAgICBSZXBlYXQgPSBOT19BUkc7CisgICAgT2xkUG9pbnQgPSBQb2ludCA9IE1hcmsgPSBFbmQgPSAwOworICAgIExpbmVbMF0gPSAnXDAnOworCisgICAgd2hpbGUgKChjID0gVFRZZ2V0KCkpICE9IEVPRikKKwlzd2l0Y2ggKFRUWXNwZWNpYWwoYykpIHsKKwljYXNlIENTZG9uZToKKwkgICAgcmV0dXJuIExpbmU7CisJY2FzZSBDU2VvZjoKKwkgICAgcmV0dXJuIE5VTEw7CisJY2FzZSBDU21vdmU6CisJICAgIHJlcG9zaXRpb24oKTsKKwkgICAgYnJlYWs7CisJY2FzZSBDU2Rpc3BhdGNoOgorCSAgICBzd2l0Y2ggKGVtYWNzKGMpKSB7CisJICAgIGNhc2UgQ1Nkb25lOgorCQlyZXR1cm4gTGluZTsKKwkgICAgY2FzZSBDU2VvZjoKKwkJcmV0dXJuIE5VTEw7CisJICAgIGNhc2UgQ1Ntb3ZlOgorCQlyZXBvc2l0aW9uKCk7CisJCWJyZWFrOworCSAgICBjYXNlIENTZGlzcGF0Y2g6CisJICAgIGNhc2UgQ1NzdGF5OgorCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIENTc3RheToKKwkgICAgYnJlYWs7CisJfQorICAgIHJldHVybiBOVUxMOworfQorCitTVEFUSUMgdm9pZAoraGlzdF9hZGQocCkKKyAgICBDSEFSCSpwOworeworICAgIGludAkJaTsKKworICAgIGlmICgocCA9IChDSEFSICopc3RyZHVwKChjaGFyICopcCkpID09IE5VTEwpCisJcmV0dXJuOworICAgIGlmIChILlNpemUgPCBISVNUX1NJWkUpCisJSC5MaW5lc1tILlNpemUrK10gPSBwOworICAgIGVsc2UgeworCURJU1BPU0UoSC5MaW5lc1swXSk7CisJZm9yIChpID0gMDsgaSA8IEhJU1RfU0laRSAtIDE7IGkrKykKKwkgICAgSC5MaW5lc1tpXSA9IEguTGluZXNbaSArIDFdOworCUguTGluZXNbaV0gPSBwOworICAgIH0KKyAgICBILlBvcyA9IEguU2l6ZSAtIDE7Cit9CisKKy8qCisqKiAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBGU0YgcmVhZGxpbmUuCisqLworLyogQVJHU1VTRUQwICovCit2b2lkCitybF9yZXNldF90ZXJtaW5hbChwKQorICAgIGNoYXIJKnA7Cit7Cit9CisKK3ZvaWQKK3JsX2luaXRpYWxpemUoKQoreworfQorCitjaGFyICoKK3JlYWRsaW5lKHByb21wdCkKKyAgICBDT05TVCBjaGFyCSpwcm9tcHQ7Cit7CisgICAgQ0hBUgkqbGluZTsKKworICAgIGlmIChMaW5lID09IE5VTEwpIHsKKwlMZW5ndGggPSBNRU1fSU5DOworCWlmICgoTGluZSA9IE5FVyhDSEFSLCBMZW5ndGgpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUVFlpbmZvKCk7CisgICAgcmxfdHR5c2V0KDApOworICAgIGhpc3RfYWRkKE5JTCk7CisgICAgU2NyZWVuU2l6ZSA9IFNDUkVFTl9JTkM7CisgICAgU2NyZWVuID0gTkVXKGNoYXIsIFNjcmVlblNpemUpOworICAgIFByb21wdCA9IHByb21wdCA/IHByb21wdCA6IChjaGFyICopTklMOworICAgIFRUWXB1dHMoKENIQVIgKilQcm9tcHQpOworICAgIGlmICgobGluZSA9IGVkaXRpbnB1dCgpKSAhPSBOVUxMKSB7CisJbGluZSA9IChDSEFSICopc3RyZHVwKChjaGFyICopbGluZSk7CisJVFRZcHV0cygoQ0hBUiAqKU5FV0xJTkUpOworCVRUWWZsdXNoKCk7CisgICAgfQorICAgIHJsX3R0eXNldCgxKTsKKyAgICBESVNQT1NFKFNjcmVlbik7CisgICAgRElTUE9TRShILkxpbmVzWy0tSC5TaXplXSk7CisgICAgcmV0dXJuIChjaGFyICopbGluZTsKK30KKwordm9pZAorYWRkX2hpc3RvcnkocCkKKyAgICBjaGFyCSpwOworeworICAgIGlmIChwID09IE5VTEwgfHwgKnAgPT0gJ1wwJykKKwlyZXR1cm47CisKKyNpZglkZWZpbmVkKFVOSVFVRV9ISVNUT1JZKQorICAgIGlmIChILlBvcyAmJiBzdHJjbXAocCwgSC5MaW5lc1tILlBvcyAtIDFdKSA9PSAwKQorICAgICAgICByZXR1cm47CisjZW5kaWYJLyogZGVmaW5lZChVTklRVUVfSElTVE9SWSkgKi8KKyAgICBoaXN0X2FkZCgoQ0hBUiAqKXApOworfQorDAorCitTVEFUSUMgU1RBVFVTCitiZWdfbGluZSgpCit7CisgICAgaWYgKFBvaW50KSB7CisJUG9pbnQgPSAwOworCXJldHVybiBDU21vdmU7CisgICAgfQorICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2RlbF9jaGFyKCkKK3sKKyAgICByZXR1cm4gZGVsZXRlX3N0cmluZyhSZXBlYXQgPT0gTk9fQVJHID8gMSA6IFJlcGVhdCk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2VuZF9saW5lKCkKK3sKKyAgICBpZiAoUG9pbnQgIT0gRW5kKSB7CisJUG9pbnQgPSBFbmQ7CisJcmV0dXJuIENTbW92ZTsKKyAgICB9CisgICAgcmV0dXJuIENTc3RheTsKK30KKworLyoKKyoqICBNb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCB3b3JkIGFuZCByZXR1cm4gYW4KKyoqICBhbGxvY2F0ZWQgY29weSBvZiBpdC4KKyovCitTVEFUSUMgQ0hBUiAqCitmaW5kX3dvcmQoKQoreworICAgIHN0YXRpYyBjaGFyCVNFUFNbXSA9ICIjOyZ8XiQ9YCd7fSgpPD5cblx0ICI7CisgICAgQ0hBUgkqcDsKKyAgICBDSEFSCSpuZXc7CisgICAgU0laRV9UCWxlbjsKKworICAgIGZvciAocCA9ICZMaW5lW1BvaW50XTsgcCA+IExpbmUgJiYgc3RyY2hyKFNFUFMsIChjaGFyKXBbLTFdKSA9PSBOVUxMOyBwLS0pCisJY29udGludWU7CisgICAgbGVuID0gUG9pbnQgLSAocCAtIExpbmUpICsgMTsKKyAgICBpZiAoKG5ldyA9IE5FVyhDSEFSLCBsZW4pKSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIENPUFlGUk9NVE8obmV3LCBwLCBsZW4pOworICAgIG5ld1tsZW4gLSAxXSA9ICdcMCc7CisgICAgcmV0dXJuIG5ldzsKK30KKworU1RBVElDIFNUQVRVUworY19jb21wbGV0ZSgpCit7CisgICAgQ0hBUgkqcDsKKyAgICBDSEFSCSp3b3JkOworICAgIGludAkJdW5pcXVlOworICAgIFNUQVRVUwlzOworCisgICAgd29yZCA9IGZpbmRfd29yZCgpOworICAgIHAgPSAoQ0hBUiAqKXJsX2NvbXBsZXRlKChjaGFyICopd29yZCwgJnVuaXF1ZSk7CisgICAgaWYgKHdvcmQpCisJRElTUE9TRSh3b3JkKTsKKyAgICBpZiAocCAmJiAqcCkgeworCXMgPSBpbnNlcnRfc3RyaW5nKHApOworCWlmICghdW5pcXVlKQorCSAgICAodm9pZClyaW5nX2JlbGwoKTsKKwlESVNQT1NFKHApOworCXJldHVybiBzOworICAgIH0KKyAgICByZXR1cm4gcmluZ19iZWxsKCk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2NfcG9zc2libGUoKQoreworICAgIENIQVIJKiphdjsKKyAgICBDSEFSCSp3b3JkOworICAgIGludAkJYWM7CisKKyAgICB3b3JkID0gZmluZF93b3JkKCk7CisgICAgYWMgPSBybF9saXN0X3Bvc3NpYigoY2hhciAqKXdvcmQsIChjaGFyICoqKikmYXYpOworICAgIGlmICh3b3JkKQorCURJU1BPU0Uod29yZCk7CisgICAgaWYgKGFjKSB7CisJY29sdW1ucyhhYywgYXYpOworCXdoaWxlICgtLWFjID49IDApCisJICAgIERJU1BPU0UoYXZbYWNdKTsKKwlESVNQT1NFKGF2KTsKKwlyZXR1cm4gQ1Ntb3ZlOworICAgIH0KKyAgICByZXR1cm4gcmluZ19iZWxsKCk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2FjY2VwdF9saW5lKCkKK3sKKyAgICBMaW5lW0VuZF0gPSAnXDAnOworICAgIHJldHVybiBDU2RvbmU7Cit9CisKK1NUQVRJQyBTVEFUVVMKK3RyYW5zcG9zZSgpCit7CisgICAgQ0hBUgljOworCisgICAgaWYgKFBvaW50KSB7CisJaWYgKFBvaW50ID09IEVuZCkKKwkgICAgbGVmdChDU21vdmUpOworCWMgPSBMaW5lW1BvaW50IC0gMV07CisJbGVmdChDU3N0YXkpOworCUxpbmVbUG9pbnQgLSAxXSA9IExpbmVbUG9pbnRdOworCVRUWXNob3coTGluZVtQb2ludCAtIDFdKTsKKwlMaW5lW1BvaW50KytdID0gYzsKKwlUVFlzaG93KGMpOworICAgIH0KKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCitxdW90ZSgpCit7CisgICAgdW5zaWduZWQgaW50CWM7CisKKyAgICByZXR1cm4gKGMgPSBUVFlnZXQoKSkgPT0gRU9GID8gQ1Nlb2YgOiBpbnNlcnRfY2hhcigoaW50KWMpOworfQorCitTVEFUSUMgU1RBVFVTCit3aXBlKCkKK3sKKyAgICBpbnQJCWk7CisKKyAgICBpZiAoTWFyayA+IEVuZCkKKwlyZXR1cm4gcmluZ19iZWxsKCk7CisKKyAgICBpZiAoUG9pbnQgPiBNYXJrKSB7CisJaSA9IFBvaW50OworCVBvaW50ID0gTWFyazsKKwlNYXJrID0gaTsKKwlyZXBvc2l0aW9uKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRlbGV0ZV9zdHJpbmcoTWFyayAtIFBvaW50KTsKK30KKworU1RBVElDIFNUQVRVUworbWtfc2V0KCkKK3sKKyAgICBNYXJrID0gUG9pbnQ7CisgICAgcmV0dXJuIENTc3RheTsKK30KKworU1RBVElDIFNUQVRVUworZXhjaGFuZ2UoKQoreworICAgIHVuc2lnbmVkIGludAljOworCisgICAgaWYgKChjID0gVFRZZ2V0KCkpICE9IENUTCgnWCcpKQorCXJldHVybiBjID09IEVPRiA/IENTZW9mIDogcmluZ19iZWxsKCk7CisKKyAgICBpZiAoKGMgPSBNYXJrKSA8PSBFbmQpIHsKKwlNYXJrID0gUG9pbnQ7CisJUG9pbnQgPSBjOworCXJldHVybiBDU21vdmU7CisgICAgfQorICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK3lhbmsoKQoreworICAgIGlmIChZYW5rZWQgJiYgKllhbmtlZCkKKwlyZXR1cm4gaW5zZXJ0X3N0cmluZyhZYW5rZWQpOworICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBTVEFUVVMKK2NvcHlfcmVnaW9uKCkKK3sKKyAgICBpZiAoTWFyayA+IEVuZCkKKwlyZXR1cm4gcmluZ19iZWxsKCk7CisKKyAgICBpZiAoUG9pbnQgPiBNYXJrKQorCXNhdmVfeWFuayhNYXJrLCBQb2ludCAtIE1hcmspOworICAgIGVsc2UKKwlzYXZlX3lhbmsoUG9pbnQsIE1hcmsgLSBQb2ludCk7CisKKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCittb3ZlX3RvX2NoYXIoKQoreworICAgIHVuc2lnbmVkIGludAljOworICAgIGludAkJCWk7CisgICAgQ0hBUgkJKnA7CisKKyAgICBpZiAoKGMgPSBUVFlnZXQoKSkgPT0gRU9GKQorCXJldHVybiBDU2VvZjsKKyAgICBmb3IgKGkgPSBQb2ludCArIDEsIHAgPSAmTGluZVtpXTsgaSA8IEVuZDsgaSsrLCBwKyspCisJaWYgKCpwID09IGMpIHsKKwkgICAgUG9pbnQgPSBpOworCSAgICByZXR1cm4gQ1Ntb3ZlOworCX0KKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCitmZF93b3JkKCkKK3sKKyAgICByZXR1cm4gZG9fZm9yd2FyZChDU21vdmUpOworfQorCitTVEFUSUMgU1RBVFVTCitmZF9raWxsX3dvcmQoKQoreworICAgIGludAkJaTsKKworICAgICh2b2lkKWRvX2ZvcndhcmQoQ1NzdGF5KTsKKyAgICBpZiAoT2xkUG9pbnQgIT0gUG9pbnQpIHsKKwlpID0gUG9pbnQgLSBPbGRQb2ludDsKKwlQb2ludCA9IE9sZFBvaW50OworCXJldHVybiBkZWxldGVfc3RyaW5nKGkpOworICAgIH0KKyAgICByZXR1cm4gQ1NzdGF5OworfQorCitTVEFUSUMgU1RBVFVTCitia193b3JkKCkKK3sKKyAgICBpbnQJCWk7CisgICAgQ0hBUgkqcDsKKworICAgIGkgPSAwOworICAgIGRvIHsKKwlmb3IgKHAgPSAmTGluZVtQb2ludF07IHAgPiBMaW5lICYmICFpc2FsbnVtKHBbLTFdKTsgcC0tKQorCSAgICBsZWZ0KENTbW92ZSk7CisKKwlmb3IgKDsgcCA+IExpbmUgJiYgcFstMV0gIT0gJyAnICYmIGlzYWxudW0ocFstMV0pOyBwLS0pCisJICAgIGxlZnQoQ1Ntb3ZlKTsKKworCWlmIChQb2ludCA9PSAwKQorCSAgICBicmVhazsKKyAgICB9IHdoaWxlICgrK2kgPCBSZXBlYXQpOworCisgICAgcmV0dXJuIENTc3RheTsKK30KKworU1RBVElDIFNUQVRVUworYmtfa2lsbF93b3JkKCkKK3sKKyAgICAodm9pZClia193b3JkKCk7CisgICAgaWYgKE9sZFBvaW50ICE9IFBvaW50KQorCXJldHVybiBkZWxldGVfc3RyaW5nKE9sZFBvaW50IC0gUG9pbnQpOworICAgIHJldHVybiBDU3N0YXk7Cit9CisKK1NUQVRJQyBpbnQKK2FyZ2lmeShsaW5lLCBhdnApCisgICAgQ0hBUgkqbGluZTsKKyAgICBDSEFSCSoqKmF2cDsKK3sKKyAgICBDSEFSCSpjOworICAgIENIQVIJKipwOworICAgIENIQVIJKipuZXc7CisgICAgaW50CQlhYzsKKyAgICBpbnQJCWk7CisKKyAgICBpID0gTUVNX0lOQzsKKyAgICBpZiAoKCphdnAgPSBwID0gTkVXKENIQVIqLCBpKSk9PSBOVUxMKQorCSByZXR1cm4gMDsKKworICAgIGZvciAoYyA9IGxpbmU7IGlzc3BhY2UoKmMpOyBjKyspCisJY29udGludWU7CisgICAgaWYgKCpjID09ICdcbicgfHwgKmMgPT0gJ1wwJykKKwlyZXR1cm4gMDsKKworICAgIGZvciAoYWMgPSAwLCBwW2FjKytdID0gYzsgKmMgJiYgKmMgIT0gJ1xuJzsgKSB7CisJaWYgKGlzc3BhY2UoKmMpKSB7CisJICAgICpjKysgPSAnXDAnOworCSAgICBpZiAoKmMgJiYgKmMgIT0gJ1xuJykgeworCQlpZiAoYWMgKyAxID09IGkpIHsKKwkJICAgIG5ldyA9IE5FVyhDSEFSKiwgaSArIE1FTV9JTkMpOworCQkgICAgaWYgKG5ldyA9PSBOVUxMKSB7CisJCQlwW2FjXSA9IE5VTEw7CisJCQlyZXR1cm4gYWM7CisJCSAgICB9CisJCSAgICBDT1BZRlJPTVRPKG5ldywgcCwgaSAqIHNpemVvZiAoY2hhciAqKikpOworCQkgICAgaSArPSBNRU1fSU5DOworCQkgICAgRElTUE9TRShwKTsKKwkJICAgICphdnAgPSBwID0gbmV3OworCQl9CisJCXBbYWMrK10gPSBjOworCSAgICB9CisJfQorCWVsc2UKKwkgICAgYysrOworICAgIH0KKyAgICAqYyA9ICdcMCc7CisgICAgcFthY10gPSBOVUxMOworICAgIHJldHVybiBhYzsKK30KKworU1RBVElDIFNUQVRVUworbGFzdF9hcmd1bWVudCgpCit7CisgICAgQ0hBUgkqKmF2OworICAgIENIQVIJKnA7CisgICAgU1RBVFVTCXM7CisgICAgaW50CQlhYzsKKworICAgIGlmIChILlNpemUgPT0gMSB8fCAocCA9IEguTGluZXNbSC5TaXplIC0gMl0pID09IE5VTEwpCisJcmV0dXJuIHJpbmdfYmVsbCgpOworCisgICAgaWYgKChwID0gKENIQVIgKilzdHJkdXAoKGNoYXIgKilwKSkgPT0gTlVMTCkKKwlyZXR1cm4gQ1NzdGF5OworICAgIGFjID0gYXJnaWZ5KHAsICZhdik7CisKKyAgICBpZiAoUmVwZWF0ICE9IE5PX0FSRykKKwlzID0gUmVwZWF0IDwgYWMgPyBpbnNlcnRfc3RyaW5nKGF2W1JlcGVhdF0pIDogcmluZ19iZWxsKCk7CisgICAgZWxzZQorCXMgPSBhYyA/IGluc2VydF9zdHJpbmcoYXZbYWMgLSAxXSkgOiBDU3N0YXk7CisKKyAgICBpZiAoYWMpCisJRElTUE9TRShhdik7CisgICAgRElTUE9TRShwKTsKKyAgICByZXR1cm4gczsKK30KKworU1RBVElDIEtFWU1BUAlNYXBbMzNdID0geworICAgIHsJQ1RMKCdAJyksCXJpbmdfYmVsbAl9LAorICAgIHsJQ1RMKCdBJyksCWJlZ19saW5lCX0sCisgICAgewlDVEwoJ0InKSwJYmtfY2hhcgkJfSwKKyAgICB7CUNUTCgnRCcpLAlkZWxfY2hhcgl9LAorICAgIHsJQ1RMKCdFJyksCWVuZF9saW5lCX0sCisgICAgewlDVEwoJ0YnKSwJZmRfY2hhcgkJfSwKKyAgICB7CUNUTCgnRycpLAlyaW5nX2JlbGwJfSwKKyAgICB7CUNUTCgnSCcpLAlia19kZWxfY2hhcgl9LAorICAgIHsJQ1RMKCdJJyksCWNfY29tcGxldGUJfSwKKyAgICB7CUNUTCgnSicpLAlhY2NlcHRfbGluZQl9LAorICAgIHsJQ1RMKCdLJyksCWtpbGxfbGluZQl9LAorICAgIHsJQ1RMKCdMJyksCXJlZGlzcGxheQl9LAorICAgIHsJQ1RMKCdNJyksCWFjY2VwdF9saW5lCX0sCisgICAgewlDVEwoJ04nKSwJaF9uZXh0CQl9LAorICAgIHsJQ1RMKCdPJyksCXJpbmdfYmVsbAl9LAorICAgIHsJQ1RMKCdQJyksCWhfcHJldgkJfSwKKyAgICB7CUNUTCgnUScpLAlyaW5nX2JlbGwJfSwKKyAgICB7CUNUTCgnUicpLAloX3NlYXJjaAl9LAorICAgIHsJQ1RMKCdTJyksCXJpbmdfYmVsbAl9LAorICAgIHsJQ1RMKCdUJyksCXRyYW5zcG9zZQl9LAorICAgIHsJQ1RMKCdVJyksCXJpbmdfYmVsbAl9LAorICAgIHsJQ1RMKCdWJyksCXF1b3RlCQl9LAorICAgIHsJQ1RMKCdXJyksCXdpcGUJCX0sCisgICAgewlDVEwoJ1gnKSwJZXhjaGFuZ2UJfSwKKyAgICB7CUNUTCgnWScpLAl5YW5rCQl9LAorICAgIHsJQ1RMKCdaJyksCXJpbmdfYmVsbAl9LAorICAgIHsJQ1RMKCdbJyksCW1ldGEJCX0sCisgICAgewlDVEwoJ10nKSwJbW92ZV90b19jaGFyCX0sCisgICAgewlDVEwoJ14nKSwJcmluZ19iZWxsCX0sCisgICAgewlDVEwoJ18nKSwJcmluZ19iZWxsCX0sCisgICAgewkwLAkJTlVMTAkJfQorfTsKKworU1RBVElDIEtFWU1BUAlNZXRhTWFwWzE2XT0geworICAgIHsJQ1RMKCdIJyksCWJrX2tpbGxfd29yZAl9LAorICAgIHsJREVMLAkJYmtfa2lsbF93b3JkCX0sCisgICAgewknICcsCQlta19zZXQJfSwKKyAgICB7CScuJywJCWxhc3RfYXJndW1lbnQJfSwKKyAgICB7CSc8JywJCWhfZmlyc3QJCX0sCisgICAgewknPicsCQloX2xhc3QJCX0sCisgICAgewknPycsCQljX3Bvc3NpYmxlCX0sCisgICAgewknYicsCQlia193b3JkCQl9LAorICAgIHsJJ2QnLAkJZmRfa2lsbF93b3JkCX0sCisgICAgewknZicsCQlmZF93b3JkCQl9LAorICAgIHsJJ2wnLAkJY2FzZV9kb3duX3dvcmQJfSwKKyAgICB7CSd1JywJCWNhc2VfdXBfd29yZAl9LAorICAgIHsJJ3knLAkJeWFuawkJfSwKKyAgICB7CSd3JywJCWNvcHlfcmVnaW9uCX0sCisgICAgewkwLAkJTlVMTAkJfQorfTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL2VkaXRsaW5lLmggYi9kZWJ1Z2dlci9yZWFkbGluZS9lZGl0bGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTIwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9yZWFkbGluZS9lZGl0bGluZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qICAkUmV2aXNpb246IDEuMyAkCisqKgorKiogIEludGVybmFsIGhlYWRlciBmaWxlIGZvciBlZGl0bGluZSBsaWJyYXJ5LgorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmCWRlZmluZWQoSEFWRV9TVERMSUIpCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYJLyogZGVmaW5lZChIQVZFX1NURExJQikgKi8KKyNpZglkZWZpbmVkKFNZU19VTklYKQorI2luY2x1ZGUgInVuaXguaCIKKyNlbmRpZgkvKiBkZWZpbmVkKFNZU19VTklYKSAqLworI2lmCWRlZmluZWQoU1lTX09TOSkKKyNpbmNsdWRlICJvczkuaCIKKyNlbmRpZgkvKiBkZWZpbmVkKFNZU19PUzkpICovCisKKyNpZgkhZGVmaW5lZChTSVpFX1QpCisjZGVmaW5lIFNJWkVfVAl1bnNpZ25lZCBpbnQKKyNlbmRpZgkvKiAhZGVmaW5lZChTSVpFX1QpICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcglDSEFSOworCisjaWYJZGVmaW5lZChISURFKQorI2RlZmluZSBTVEFUSUMJc3RhdGljCisjZWxzZQorI2RlZmluZSBTVEFUSUMJLyogTlVMTCAqLworI2VuZGlmCS8qICFkZWZpbmVkKEhJREUpICovCisKKyNpZgkhZGVmaW5lZChDT05TVCkKKyNpZglkZWZpbmVkKF9fU1REQ19fKQorI2RlZmluZSBDT05TVAljb25zdAorI2Vsc2UKKyNkZWZpbmUgQ09OU1QKKyNlbmRpZgkvKiBkZWZpbmVkKF9fU1REQ19fKSAqLworI2VuZGlmCS8qICFkZWZpbmVkKENPTlNUKSAqLworCisKKyNkZWZpbmUgTUVNX0lOQwkJNjQKKyNkZWZpbmUgU0NSRUVOX0lOQwkyNTYKKworI2RlZmluZSBESVNQT1NFKHApCWZyZWUoKGNoYXIgKikocCkpCisjZGVmaW5lIE5FVyhULCBjKQlcCisJKChUICopbWFsbG9jKCh1bnNpZ25lZCBpbnQpKHNpemVvZiAoVCkgKiAoYykpKSkKKyNkZWZpbmUgUkVORVcocCwgVCwgYykJXAorCShwID0gKFQgKilyZWFsbG9jKChjaGFyICopKHApLCAodW5zaWduZWQgaW50KShzaXplb2YgKFQpICogKGMpKSkpCisjZGVmaW5lIENPUFlGUk9NVE8obmV3LCBwLCBsZW4pCVwKKwkodm9pZCltZW1jcHkoKGNoYXIgKikobmV3KSwgKGNoYXIgKikocCksIChpbnQpKGxlbikpCisKKworLyoKKyoqICBWYXJpYWJsZXMgYW5kIHJvdXRpbmVzIGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4KKyovCitleHRlcm4gaW50CXJsX2VvZjsKK2V4dGVybiBpbnQJcmxfZXJhc2U7CitleHRlcm4gaW50CXJsX2ludHI7CitleHRlcm4gaW50CXJsX2tpbGw7CitleHRlcm4gaW50CXJsX3F1aXQ7CitleHRlcm4gY2hhcgkqcmxfY29tcGxldGUoKTsKK2V4dGVybiBpbnQJcmxfbGlzdF9wb3NzaWIoKTsKK2V4dGVybiB2b2lkCXJsX3R0eXNldCgpOworZXh0ZXJuIHZvaWQJcmxfYWRkX3NsYXNoKCk7CisKKyNpZgkhZGVmaW5lZChIQVZFX1NURExJQikKK2V4dGVybiBjaGFyCSpnZXRlbnYoKTsKK2V4dGVybiBjaGFyCSptYWxsb2MoKTsKK2V4dGVybiBjaGFyCSpyZWFsbG9jKCk7CitleHRlcm4gY2hhcgkqbWVtY3B5KCk7CitleHRlcm4gY2hhcgkqc3RyY2F0KCk7CitleHRlcm4gY2hhcgkqc3RyY2hyKCk7CitleHRlcm4gY2hhcgkqc3RycmNocigpOworZXh0ZXJuIGNoYXIJKnN0cmNweSgpOworZXh0ZXJuIGNoYXIJKnN0cmR1cCgpOworZXh0ZXJuIGludAlzdHJjbXAoKTsKK2V4dGVybiBpbnQJc3RybGVuKCk7CitleHRlcm4gaW50CXN0cm5jbXAoKTsKKyNlbmRpZgkvKiAhZGVmaW5lZChIQVZFX1NURExJQikgKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL29zOS5oIGIvZGVidWdnZXIvcmVhZGxpbmUvb3M5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiN2NmMwotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL3JlYWRsaW5lL29zOS5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qICAkUmV2aXNpb246IDEuMSAkCisqKgorKiogIEVkaXRsaW5lIHN5c3RlbSBoZWFkZXIgZmlsZSBmb3IgT1MtOSAob24gNjhrKS4KKyovCisKKyNkZWZpbmUgQ1JMRgkJIlxyXGwiCisjZGVmaW5lIEZPUldBUkQJCWV4dGVybgorCisjaW5jbHVkZSA8ZGlyLmg+Cit0eXBlZGVmIHN0cnVjdCBkaXJlY3QJRElSRU5UUlk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS9zeXNvczkuYyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c29zOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjNhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9yZWFkbGluZS9zeXNvczkuYwpAQCAtMCwwICsxLDQ2IEBACisvKiAgJFJldmlzaW9uOiAxLjEgJAorKioKKyoqICBPUy05IHN5c3RlbS1kZXBlbmRhbnQgcm91dGluZXMgZm9yIGVkaXRsaW5lIGxpYnJhcnkuCisqLworI2luY2x1ZGUgImVkaXRsaW5lLmgiCisjaW5jbHVkZSA8c2dzdGF0Lmg+CisjaW5jbHVkZSA8bW9kZXMuaD4KKworCit2b2lkCitybF90dHlzZXQoUmVzZXQpCisgICAgaW50CQkJUmVzZXQ7Cit7CisgICAgc3RhdGljIHN0cnVjdCBzZ2J1ZglvbGQ7CisgICAgc3RydWN0IHNnYnVmCW5ldzsKKworCisgICAgaWYgKFJlc2V0ID09IDApIHsKKyAgICAgICAgX2dzX29wdCgwLCAmb2xkKTsKKyAgICAgICAgX2dzX29wdCgwLCAmbmV3KTsKKyAgICAgICAgbmV3LnNnX2JhY2tzcCA9IDA7CW5ldy5zZ19kZWxldGUgPSAwOwluZXcuc2dfZWNobyA9IDA7CisgICAgICAgIG5ldy5zZ19hbGYgPSAwOwkJbmV3LnNnX251bGxzID0gMDsJbmV3LnNnX3BhdXNlID0gMDsKKyAgICAgICAgbmV3LnNnX3BhZ2UgPSAwOwluZXcuc2dfYnNwY2ggPSAwOwluZXcuc2dfZGxuY2ggPSAwOworICAgICAgICBuZXcuc2dfZW9yY2ggPSAwOwluZXcuc2dfZW9mY2ggPSAwOwluZXcuc2dfcmxuY2ggPSAwOworICAgICAgICBuZXcuc2dfZHVsbmNoID0gMDsJbmV3LnNnX3BzY2ggPSAwOwluZXcuc2dfa2JpY2ggPSAwOworICAgICAgICBuZXcuc2dfa2JhY2ggPSAwOwluZXcuc2dfYnNlY2ggPSAwOwluZXcuc2dfYmVsbGNoID0gMDsKKyAgICAgICAgbmV3LnNnX3hvbiA9IDA7CQluZXcuc2dfeG9mZiA9IDA7CW5ldy5zZ190YWJjciA9IDA7CisgICAgICAgIG5ldy5zZ190YWJzaXogPSAwOworICAgICAgICBfc3Nfb3B0KDAsICZuZXcpOworICAgICAgICBybF9lcmFzZSA9IG9sZC5zZ19ic3BjaDsKKyAgICAgICAgcmxfa2lsbCA9IG9sZC5zZ19kbG5jaDsKKyAgICAgICAgcmxfZW9mID0gb2xkLnNnX2VvZmNoOworICAgICAgICBybF9pbnRyID0gb2xkLnNnX2tiaWNoOworICAgICAgICBybF9xdWl0ID0gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgX3NzX29wdCgwLCAmb2xkKTsKK30KKwordm9pZAorcmxfYWRkX3NsYXNoKHBhdGgsIHApCisgICAgY2hhcgkqcGF0aDsKKyAgICBjaGFyCSpwOworeworICAgICh2b2lkKXN0cmNhdChwLCBhY2Nlc3MocGF0aCwgU19JUkVBRCB8IFNfSUZESVIpID8gIiAiIDogIi8iKTsKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c3VuaXguYyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c3VuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTA3NDRlMQotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c3VuaXguYwpAQCAtMCwwICsxLDg5IEBACisvKiAgJFJldmlzaW9uOiAxLjEgJAorKioKKyoqICBVbml4IHN5c3RlbS1kZXBlbmRhbnQgcm91dGluZXMgZm9yIGVkaXRsaW5lIGxpYnJhcnkuCisqLworI2luY2x1ZGUgImVkaXRsaW5lLmgiCisKKyNpZglkZWZpbmVkKEhBVkVfVENHRVRBVFRSKQorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKwordm9pZAorcmxfdHR5c2V0KFJlc2V0KQorICAgIGludAkJCQlSZXNldDsKK3sKKyAgICBzdGF0aWMgc3RydWN0IHRlcm1pb3MJb2xkOworICAgIHN0cnVjdCB0ZXJtaW9zCQluZXc7CisKKyAgICBpZiAoUmVzZXQgPT0gMCkgeworCSh2b2lkKXRjZ2V0YXR0cigwLCAmb2xkKTsKKwlybF9lcmFzZSA9IG9sZC5jX2NjW1ZFUkFTRV07CisJcmxfa2lsbCA9IG9sZC5jX2NjW1ZLSUxMXTsKKwlybF9lb2YgPSBvbGQuY19jY1tWRU9GXTsKKwlybF9pbnRyID0gb2xkLmNfY2NbVklOVFJdOworCXJsX3F1aXQgPSBvbGQuY19jY1tWUVVJVF07CisKKwluZXcgPSBvbGQ7CisJbmV3LmNfY2NbVklOVFJdID0gLTE7CisJbmV3LmNfY2NbVlFVSVRdID0gLTE7CisJbmV3LmNfbGZsYWcgJj0gfihFQ0hPIHwgSUNBTk9OKTsKKwluZXcuY19pZmxhZyAmPSB+KElTVFJJUCB8IElOUENLKTsKKwluZXcuY19jY1tWTUlOXSA9IDE7CisJbmV3LmNfY2NbVlRJTUVdID0gMDsKKwkodm9pZCl0Y3NldGF0dHIoMCwgVENTQU5PVywgJm5ldyk7CisgICAgfQorICAgIGVsc2UKKwkodm9pZCl0Y3NldGF0dHIoMCwgVENTQU5PVywgJm9sZCk7Cit9CisKKyNlbHNlCisjaW5jbHVkZSA8c2d0dHkuaD4KKwordm9pZAorcmxfdHR5c2V0KFJlc2V0KQorICAgIGludAkJCQlSZXNldDsKK3sKKyAgICBzdGF0aWMgc3RydWN0IHNndHR5YglvbGRfc2d0dHliOworICAgIHN0YXRpYyBzdHJ1Y3QgdGNoYXJzCW9sZF90Y2hhcnM7CisgICAgc3RydWN0IHNndHR5YgkJbmV3X3NndHR5YjsKKyAgICBzdHJ1Y3QgdGNoYXJzCQluZXdfdGNoYXJzOworCisgICAgaWYgKFJlc2V0ID09IDApIHsKKwkodm9pZClpb2N0bCgwLCBUSU9DR0VUUCwgJm9sZF9zZ3R0eWIpOworCXJsX2VyYXNlID0gb2xkX3NndHR5Yi5zZ19lcmFzZTsKKwlybF9raWxsID0gb2xkX3NndHR5Yi5zZ19raWxsOworCisJKHZvaWQpaW9jdGwoMCwgVElPQ0dFVEMsICZvbGRfdGNoYXJzKTsKKwlybF9lb2YgPSBvbGRfdGNoYXJzLnRfZW9mYzsKKwlybF9pbnRyID0gb2xkX3RjaGFycy50X2ludHJjOworCXJsX3F1aXQgPSBvbGRfdGNoYXJzLnRfcXVpdGM7CisKKwluZXdfc2d0dHliID0gb2xkX3NndHR5YjsKKwluZXdfc2d0dHliLnNnX2ZsYWdzICY9IH5FQ0hPOworCW5ld19zZ3R0eWIuc2dfZmxhZ3MgfD0gUkFXOworI2lmCWRlZmluZWQoUEFTUzgpCisJbmV3X3NndHR5Yi5zZ19mbGFncyB8PSBQQVNTODsKKyNlbmRpZgkvKiBkZWZpbmVkKFBBU1M4KSAqLworCSh2b2lkKWlvY3RsKDAsIFRJT0NTRVRQLCAmbmV3X3NndHR5Yik7CisKKwluZXdfdGNoYXJzID0gb2xkX3RjaGFyczsKKwluZXdfdGNoYXJzLnRfaW50cmMgPSAtMTsKKwluZXdfdGNoYXJzLnRfcXVpdGMgPSAtMTsKKwkodm9pZClpb2N0bCgwLCBUSU9DU0VUQywgJm5ld190Y2hhcnMpOworICAgIH0KKyAgICBlbHNlIHsKKwkodm9pZClpb2N0bCgwLCBUSU9DU0VUUCwgJm9sZF9zZ3R0eWIpOworCSh2b2lkKWlvY3RsKDAsIFRJT0NTRVRDLCAmb2xkX3RjaGFycyk7CisgICAgfQorfQorI2VuZGlmCS8qIGRlZmluZWQoSEFWRV9UQ0dFVEFUVFIpICovCisKK3ZvaWQKK3JsX2FkZF9zbGFzaChwYXRoLCBwKQorICAgIGNoYXIJKnBhdGg7CisgICAgY2hhcgkqcDsKK3sKKyAgICBzdHJ1Y3Qgc3RhdAlTYjsKKworICAgIGlmIChzdGF0KHBhdGgsICZTYikgPj0gMCkKKwkodm9pZClzdHJjYXQocCwgU19JU0RJUihTYi5zdF9tb2RlKSA/ICIvIiA6ICIgIik7Cit9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS90ZXN0aXQuYyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3Rlc3RpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Mzg0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9yZWFkbGluZS90ZXN0aXQuYwpAQCAtMCwwICsxLDYyIEBACisvKiAgJFJldmlzaW9uOiAxLjIgJAorKioKKyoqICBBICJtaWNyby1zaGVsbCIgdG8gdGVzdCBlZGl0bGluZSBsaWJyYXJ5LgorKiogIElmIGdpdmVuIGFueSBhcmd1bWVudHMsIGNvbW1hbmRzIGFyZW4ndCBleGVjdXRlZC4KKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZglkZWZpbmVkKEhBVkVfU1RETElCKQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCS8qIGRlZmluZWQoSEFWRV9TVERMSUIpICovCisKK2NvbnN0IGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9ICI0LjMyMSI7IAorCisKK2V4dGVybiBjaGFyCSpyZWFkbGluZSgpOworZXh0ZXJuIHZvaWQJYWRkX2hpc3RvcnkoKTsKKworI2lmCSFkZWZpbmVkKEhBVkVfU1RETElCKQorZXh0ZXJuIGludAljaGRpcigpOworZXh0ZXJuIGludAlmcmVlKCk7CitleHRlcm4gaW50CXN0cm5jbXAoKTsKK2V4dGVybiBpbnQJc3lzdGVtKCk7CitleHRlcm4gdm9pZAlleGl0KCk7CisjZW5kaWYJLyogIWRlZmluZWQoSEFWRV9TVERMSUIpICovCisKKworI2lmCWRlZmluZWQoTkVFRF9QRVJST1IpCit2b2lkCitwZXJyb3IocykKKyAgICBjaGFyCSpzOworeworICAgIGV4dGVybiBpbnQJZXJybm87CisKKyAgICAodm9pZGYpcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciAlZFxuIiwgcywgZXJybm8pOworfQorI2VuZGlmCS8qIGRlZmluZWQoTkVFRF9QRVJST1IpICovCisKKworLyogQVJHU1VTRUQxICovCitpbnQKK21haW4oYWMsIGF2KQorICAgIGludAkJYWM7CisgICAgY2hhcgkqYXZbXTsKK3sKKyAgICBjaGFyCSpwOworICAgIGludAkJZG9pdDsKKworICAgIGRvaXQgPSBhYyA9PSAxOworICAgIHdoaWxlICgocCA9IHJlYWRsaW5lKCJ0ZXN0aXQ+ICIpKSAhPSBOVUxMKSB7CisJKHZvaWQpcHJpbnRmKCJcdFx0XHR8JXN8XG4iLCBwKTsKKwlpZiAoZG9pdCkKKwkgICAgaWYgKHN0cm5jbXAocCwgImNkICIsIDMpID09IDApIHsKKwkJaWYgKGNoZGlyKCZwWzNdKSA8IDApCisJCSAgICBwZXJyb3IoJnBbM10pOworCSAgICB9CisJICAgIGVsc2UgaWYgKHN5c3RlbShwKSAhPSAwKQorCQlwZXJyb3IocCk7CisJYWRkX2hpc3RvcnkocCk7CisJZnJlZShwKTsKKyAgICB9CisgICAgZXhpdCgwKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS91bml4LmggYi9kZWJ1Z2dlci9yZWFkbGluZS91bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2YmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3VuaXguaApAQCAtMCwwICsxLDIyIEBACisvKiAgJFJldmlzaW9uOiAxLjEgJAorKioKKyoqICBFZGl0bGluZSBzeXN0ZW0gaGVhZGVyIGZpbGUgZm9yIFVuaXguCisqLworCisjZGVmaW5lIENSTEYJCSJcclxuIgorI2RlZmluZSBGT1JXQVJECQlTVEFUSUMKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZglkZWZpbmVkKFVTRV9ESVJFTlQpCisjaW5jbHVkZSA8ZGlyZW50Lmg+Cit0eXBlZGVmIHN0cnVjdCBkaXJlbnQJRElSRU5UUlk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9kaXIuaD4KK3R5cGVkZWYgc3RydWN0IGRpcmVjdAlESVJFTlRSWTsKKyNlbmRpZgkvKiBkZWZpbmVkKFVTRV9ESVJFTlQpICovCisKKyNpZgkhZGVmaW5lZChTX0lTRElSKQorI2RlZmluZSBTX0lTRElSKG0pCQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNlbmRpZgkvKiAhZGVmaW5lZChTX0lTRElSKSAqLwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvcmVhZGxpbmUvdmVyc2lvbi5jIGIvZGVidWdnZXIvcmVhZGxpbmUvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWIyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9yZWFkbGluZS92ZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACitjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5nW10gPSAiMS4yMzQiOworCisKK3N0YXRpYyBjaGFyIGZvb2JhcltdPSJmb29iYXIiOworCitjb25zdCBjaGFyICogZm9vX3N0cmluZyA9IGZvb2JhcjsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlZ3Bvcy5oIGIvZGVidWdnZXIvcmVncG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkMzA4NgotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL3JlZ3Bvcy5oCkBAIC0wLDAgKzEsNTEgQEAKKworI2lmZGVmIGxpbnV4CisvKiBSZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lICBSTl9HUwkJCTAKKyNkZWZpbmUgIFJOX0ZTCQkJMQorI2RlZmluZSAgUk5fRVMJCQkyCisjZGVmaW5lICBSTl9EUwkJCTMKKyNkZWZpbmUgIFJOX0VESSAgCQk0CisjZGVmaW5lICBSTl9FU0kJCQk1CisjZGVmaW5lICBSTl9FQlAJCQk2CisjZGVmaW5lICBSTl9FU1AJCQk3CisjZGVmaW5lICBSTl9FQlgJCQk4CisjZGVmaW5lICBSTl9FRFgJCQk5CisjZGVmaW5lICBSTl9FQ1gJCQkxMAorI2RlZmluZSAgUk5fRUFYCQkJMTEKKyNkZWZpbmUgIFJOX1RSQVBOTwkJMTIKKyNkZWZpbmUgIFJOX0VSUgkJCTEzCisjZGVmaW5lICBSTl9FSVAJCQkxNAorI2RlZmluZSAgUk5fQ1MJCQkxNQorI2RlZmluZSAgUk5fRUZMQUdTCQkxNgorI2RlZmluZSAgUk5fRVNQX0FUX1NJR05BTAkxNworI2RlZmluZSAgUk5fU1MJCQkxOAorI2RlZmluZSAgUk5fSTM4NwkJMTkKKyNkZWZpbmUgIFJOX09MRE1BU0sJCTIwCisjZGVmaW5lICBSTl9DUjIJCQkyMQorI2VuZGlmCisKKworI2RlZmluZSAgU0NfR1MJCQlyZWd2YWxbUk5fR1NdCisjZGVmaW5lICBTQ19GUwkJCXJlZ3ZhbFtSTl9GU10KKyNkZWZpbmUgIFNDX0VTCQkJcmVndmFsW1JOX0VTXQorI2RlZmluZSAgU0NfRFMJCQlyZWd2YWxbUk5fRFNdCisjZGVmaW5lICBTQ19FREkoZGJnX21hc2spICAJKHJlZ3ZhbFtSTl9FREldICYgZGJnX21hc2spCisjZGVmaW5lICBTQ19FU0koZGJnX21hc2spCShyZWd2YWxbUk5fRVNJXSAmIGRiZ19tYXNrKQorI2RlZmluZSAgU0NfRUJQKGRiZ19tYXNrKQkocmVndmFsW1JOX0VCUF0gJiBkYmdfbWFzaykKKyNkZWZpbmUgIFNDX0VTUChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FU1BdICYgZGJnX21hc2spCisjZGVmaW5lICBTQ19FQlgoZGJnX21hc2spCShyZWd2YWxbUk5fRUJYXSAmIGRiZ19tYXNrKQorI2RlZmluZSAgU0NfRURYKGRiZ19tYXNrKQkocmVndmFsW1JOX0VEWF0gJiBkYmdfbWFzaykKKyNkZWZpbmUgIFNDX0VDWChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FQ1hdICYgZGJnX21hc2spCisjZGVmaW5lICBTQ19FQVgoZGJnX21hc2spCShyZWd2YWxbUk5fRUFYXSAmIGRiZ19tYXNrKQorI2RlZmluZSAgU0NfVFJBUE5PCQlyZWd2YWxbUk5fVFJBUE5PXQorI2RlZmluZSAgU0NfRVJSCQkJcmVndmFsW1JOX0VSUl0KKyNkZWZpbmUgIFNDX0VJUChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FSVBdICYgZGJnX21hc2spCisjZGVmaW5lICBTQ19DUwkJCXJlZ3ZhbFtSTl9DU10KKyNkZWZpbmUgIFNDX0VGTEFHUwkJcmVndmFsW1JOX0VGTEFHU10KKyNkZWZpbmUgIEVTUF9BVF9TSUdOQUwJCXJlZ3ZhbFtSTl9FU1BfQVRfU0lHTkFMXQorI2RlZmluZSAgU0NfU1MJCQlyZWd2YWxbUk5fU1NdCisjZGVmaW5lICBJMzg3CQkJcmVndmFsW1JOX0kzODddCisjZGVmaW5lICBPTERNQVNLCQlyZWd2YWxbUk5fT0xETUFTS10KKyNkZWZpbmUgIENSMgkJCXJlZ3ZhbFtSTl9DUjJdCisKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3RtLWkzODZ2LmggYi9kZWJ1Z2dlci90bS1pMzg2di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDBlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci90bS1pMzg2di5oCkBAIC0wLDAgKzEsMzI0IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgaTM4NiwgVW5peCBTeXN0ZW0gVi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKFRNX0kzODZWX0gpCisjZGVmaW5lIFRNX0kzODZWX0ggMQorCisvKgorICogQ2hhbmdlcyBmb3IgODAzODYgYnkgUGFjZSBXaWxsaXNzb24gKHBhY2VAcHJlcC5haS5taXQuZWR1KQorICogSnVseSAxOTg4CisgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKy8qIGRlZmluZSB0aGlzIGlmIHlvdSBkb24ndCBoYXZlIHRoZSBleHRlbnNpb24gdG8gY29mZiB0aGF0IGFsbG93cworICogZmlsZSBuYW1lcyB0byBhcHBlYXIgaW4gdGhlIHN0cmluZyB0YWJsZQorICogKGF1eC54X2ZpbGUueF9mb2ZmKQorICovCisjZGVmaW5lIENPRkZfTk9fTE9OR19GSUxFX05BTUVTCisKKy8qIHR1cm4gdGhpcyBvbiB3aGVuIHJlc3Qgb2YgZ2RiIGlzIHJlYWR5ICovCisjZGVmaW5lIElFRUVfRkxPQVQKKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIEMgY29tcGlsZXIgcHV0cyBhbiB1bmRlcnNjb3JlIGF0IHRoZSBmcm9udAorICAgb2YgZXh0ZXJuYWwgbmFtZXMgYmVmb3JlIGdpdmluZyB0aGVtIHRvIHRoZSBsaW5rZXIuICAqLworCisvKiAjZGVmaW5lIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSAqLworCisvKiBudW1iZXIgb2YgdHJhcHMgdGhhdCBoYXBwZW4gYmV0d2VlbiBleGVjJ2luZyB0aGUgc2hlbGwgCisgKiB0byBydW4gYW4gaW5mZXJpb3IsIGFuZCB3aGVuIHdlIGZpbmFsbHkgZ2V0IHRvIAorICogdGhlIGluZmVyaW9yIGNvZGUuICBUaGlzIGlzIDIgb24gbW9zdCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKyNpZm5kZWYgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQKKyNkZWZpbmUgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgNAorI2VuZGlmCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICAqLworCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUoZnJvbXBjKSAgIHsoZnJvbXBjKSA9IGkzODZfc2tpcF9wcm9sb2d1ZSgoZnJvbXBjKSk7fQorCitleHRlcm4gaW50CitpMzg2X3NraXBfcHJvbG9ndWUgUEFSQU1TICgoaW50KSk7CisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIFwKKyAgKHJlYWRfbWVtb3J5X2ludGVnZXIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSksIDQpKQorCisvKiBBZGRyZXNzIG9mIGVuZCBvZiBzdGFjayBzcGFjZS4gICovCisKKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgMHg4MDAwMDAwMAorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTiA8CisKKy8qIFNlcXVlbmNlIG9mIGJ5dGVzIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uLiAgKi8KKworI2RlZmluZSBCUkVBS1BPSU5UIHsweGNjfQorCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGJyZWFrcG9pbnQuCisgICBUaGlzIGlzIG9mdGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVAorICAgYnV0IG5vdCBhbHdheXMuICAqLworCisjaWZuZGVmIERFQ1JfUENfQUZURVJfQlJFQUsKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAxCisjZW5kaWYKKworLyogTm9uemVybyBpZiBpbnN0cnVjdGlvbiBhdCBQQyBpcyBhIHJldHVybiBpbnN0cnVjdGlvbi4gICovCisKKyNkZWZpbmUgQUJPVVRfVE9fUkVUVVJOKHBjKSAocmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDEpID09IDB4YzMpCisKKy8qIFJldHVybiAxIGlmIFAgcG9pbnRzIHRvIGFuIGludmFsaWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgICBMRU4gaXMgdGhlIGxlbmd0aCBpbiBieXRlcyAtLSBub3QgcmVsZXZhbnQgb24gdGhlIDM4Ni4gICovCisKKyNkZWZpbmUgSU5WQUxJRF9GTE9BVChwLCBsZW4pICgwKQorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9UWVBFIGxvbmcKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTlVNX1JFR1MgMTYKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisvKiB0aGUgb3JkZXIgb2YgdGhlIGZpcnN0IDggcmVnaXN0ZXJzIG11c3QgbWF0Y2ggdGhlIGNvbXBpbGVyJ3MgCisgKiBudW1iZXJpbmcgc2NoZW1lICh3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgMzg2IHNjaGVtZSkKKyAqIGFsc28sIHRoaXMgdGFibGUgbXVzdCBtYXRjaCByZWdtYXAgaW4gaTM4Ni1waW5zbi5jLgorICovCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsgImVheCIsICJlY3giLCAiZWR4IiwgImVieCIsIFwKKwkJCSAiZXNwIiwgImVicCIsICJlc2kiLCAiZWRpIiwgXAorCQkJICJlaXAiLCAicHMiLCAiY3MiLCAic3MiLCBcCisJCQkgImRzIiwgImVzIiwgImZzIiwgImdzIiwgXAorCQkJIH0KKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuCisgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLAorICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLAorICAgYW5kIHNvbWUgYXJlICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlCisgICB0byBiZSBhY3R1YWwgcmVnaXN0ZXIgbnVtYmVycyBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCisgICBidXQgZG8gc2VydmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHZhbHVlcyB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBGUF9SRUdOVU0gNQkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDQJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisKKyNkZWZpbmUgUENfUkVHTlVNIDgKKyNkZWZpbmUgUFNfUkVHTlVNIDkKKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MgKiA0KQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAoKE4pKjQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICg0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgKDQpCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworLyogTm9uemVybyBpZiByZWdpc3RlciBOIHJlcXVpcmVzIGNvbnZlcnNpb24KKyAgIGZyb20gcmF3IGZvcm1hdCB0byB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVElCTEUoTikgKDApCisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTQorICAgdG8gdmlydHVhbCBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTS4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKFJFR05VTSxGUk9NLFRPKSBcCisgIHttZW1jcHkgKChUTyksIChGUk9NKSwgNCk7fQorCisvKiBDb252ZXJ0IGRhdGEgZnJvbSB2aXJ0dWFsIGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNCisgICB0byByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFJFR05VTSxGUk9NLFRPKSBcCisgIHttZW1jcHkgKChUTyksIChGUk9NKSwgNCk7fQorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworLyogUGVyaGFwcyBzaSBhbmQgZGkgc2hvdWxkIGdvIGhlcmUsIGJ1dCBwb3RlbnRpYWxseSB0aGV5IGNvdWxkIGJlCisgICB1c2VkIGZvciB0aGluZ3Mgb3RoZXIgdGhhbiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAgKChOKSA9PSBQQ19SRUdOVU0gfHwgKE4pID09IEZQX1JFR05VTSB8fCAoTikgPT0gU1BfUkVHTlVNID8gICAgICAgICBcCisgICBsb29rdXBfcG9pbnRlcl90eXBlIChidWlsdGluX3R5cGVfdm9pZCkgOiBidWlsdGluX3R5cGVfaW50KQorCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKSBcCisgIHsgKFNQKSAtPSBzaXplb2YgKEFERFIpOwkJXAorICAgIHdyaXRlX21lbW9yeSAoKFNQKSwgKGNoYXIgKikgJihBRERSKSwgc2l6ZW9mIChBRERSKSk7IH0KKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgbWVtY3B5ICgoVkFMQlVGKSwgKFJFR0JVRiksIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoMCwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgKCooaW50ICopKFJFR0JVRikpCisKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4gKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIFwKKyAgKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSA/IFwKKyAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgOlwKKyAgIDApCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSBcCisgIChGUkFNRUxFU1MpID0gZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlKEZJKQorCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSAocmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyA0LCA0KSkKKworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyhudW1hcmdzLCBmaSkgKG51bWFyZ3MpID0gaTM4Nl9mcmFtZV9udW1fYXJncyhmaSkKKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2wncyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKKyNlbmRpZgorCitleHRlcm4gaW50CitpMzg2X2ZyYW1lX251bV9hcmdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDgKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpIFwKK3sgaTM4Nl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKChmcmFtZV9pbmZvKSwgJihmcmFtZV9zYXZlZF9yZWdzKSk7IH0KKworZXh0ZXJuIHZvaWQKK2kzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosCisJCQkJICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICopKTsKKworDAorLyogVGhpbmdzIG5lZWRlZCBmb3IgbWFraW5nIHRoZSBpbmZlcmlvciBjYWxsIGZ1bmN0aW9ucy4gICovCisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIHsgaTM4Nl9wdXNoX2R1bW15X2ZyYW1lICgpOyB9CisKK2V4dGVybiB2b2lkCitpMzg2X3B1c2hfZHVtbXlfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBQT1BfRlJBTUUgIHsgaTM4Nl9wb3BfZnJhbWUgKCk7IH0KKworZXh0ZXJuIHZvaWQKK2kzODZfcG9wX2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogdGhpcyBpcyAKKyAqICAgY2FsbCAxMTIyMzM0NCAoMzIgYml0IHJlbGF0aXZlKQorICogICBpbnQzCisgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsgMHgyMjMzNDRlOCwgMHhjYzExIH0KKworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCA4CisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgMCAgLyogU3RhcnQgZXhlY3V0aW9uIGF0IGJlZ2lubmluZyBvZiBkdW1teSAqLworCisvKiBJbnNlcnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXJncyBhbmQgZnVuY3Rpb24gYWRkcmVzcworICAgaW50byBhIGNhbGwgc2VxdWVuY2Ugb2YgdGhlIGFib3ZlIGZvcm0gc3RvcmVkIGF0IERVTU1ZTkFNRS4gICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApICAgXAoreyBcCisJaW50IGZyb20sIHRvLCBkZWx0YSwgbG9jOyBcCisJbG9jID0gKGludCkocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSAtIENBTExfRFVNTVlfTEVOR1RIKTsgXAorCWZyb20gPSBsb2MgKyA1OyBcCisJdG8gPSAoaW50KShmdW4pOyBcCisJZGVsdGEgPSB0byAtIGZyb207IFwKKwkqKChjaGFyICopKGR1bW15bmFtZSkgKyAxKSA9IChkZWx0YSAmIDB4ZmYpOyBcCisJKigoY2hhciAqKShkdW1teW5hbWUpICsgMikgPSAoKGRlbHRhID4+IDgpICYgMHhmZik7IFwKKwkqKChjaGFyICopKGR1bW15bmFtZSkgKyAzKSA9ICgoZGVsdGEgPj4gMTYpICYgMHhmZik7IFwKKwkqKChjaGFyICopKGR1bW15bmFtZSkgKyA0KSA9ICgoZGVsdGEgPj4gMjQpICYgMHhmZik7IFwKK30KKworZXh0ZXJuIHZvaWQKK3ByaW50XzM4N19jb250cm9sX3dvcmQgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK2V4dGVybiB2b2lkCitwcmludF8zODdfc3RhdHVzX3dvcmQgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKKy8qIE9mZnNldCBmcm9tIFNQIHRvIGZpcnN0IGFyZyBvbiBzdGFjayBhdCBmaXJzdCBpbnN0cnVjdGlvbiBvZiBhIGZ1bmN0aW9uICovCisKKyNkZWZpbmUgU1BfQVJHMCAoMSAqIDQpCisKKyNlbmRpZgkvKiAhZGVmaW5lZCAoVE1fSTM4NlZfSCkgKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3RtLmggYi9kZWJ1Z2dlci90bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjUwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci90bS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBsaW51eC4KKyAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoVE1fTElOVVhfSCkKKyNkZWZpbmUgVE1fTElOVVhfSCAxCisvKiBudW1iZXIgb2YgdHJhcHMgdGhhdCBoYXBwZW4gYmV0d2VlbiBleGVjJ2luZyB0aGUgc2hlbGwKKyAqIHRvIHJ1biBhbiBpbmZlcmlvciwgYW5kIHdoZW4gd2UgZmluYWxseSBnZXQgdG8KKyAqIHRoZSBpbmZlcmlvciBjb2RlLiAgVGhpcyBpcyAyIG9uIG1vc3QgaW1wbGVtZW50YXRpb25zLgorICovCisjZGVmaW5lIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEIDIKKyNpbmNsdWRlICJ0bS1pMzg2di5oIgorLyogRGVmaW5lIHRoaXMgaWYgdGhlIEMgY29tcGlsZXIgcHV0cyBhbiB1bmRlcnNjb3JlIGF0IHRoZSBmcm9udAorICAgb2YgZXh0ZXJuYWwgbmFtZXMgYmVmb3JlIGdpdmluZyB0aGVtIHRvIHRoZSBsaW5rZXIuICAqLworI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKKyNlbmRpZgkJLyogIWRlZmluZWQgKFRNX0xJTlVYX0gpICovCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci94bS1pMzg2di5oIGIvZGVidWdnZXIveG0taTM4NnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmYyMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIveG0taTM4NnYuaApAQCAtMCwwICsxLDQ1IEBACisvKiBIb3N0IHN1cHBvcnQgZm9yIGkzODYuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENoYW5nZXMgZm9yIDgwMzg2IGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSksIEp1bHkgMTk4OC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisvKiBJJ20gcnVubmluZyBnZGIgMy40IHVuZGVyIDM4Ni9peCAyLjAuMiwgd2hpY2ggaXMgYSBkZXJpdmF0aXZlIG9mIEFUJlQncworU3lzIFYvMzg2IDMuMi4KKworT24gc29tZSBtYWNoaW5lcywgZ2RiIGNyYXNoZXMgd2hlbiBpdCdzIHN0YXJ0aW5nIHVwIHdoaWxlIGNhbGxpbmcgdGhlCit2ZW5kb3IncyB0ZXJtaW8gdGdldGVudCgpIHJvdXRpbmUuICBJdCBhbHdheXMgd29ya3Mgd2hlbiBydW4gdW5kZXIKK2l0c2VsZiAoYWN0dWFsbHksIHVuZGVyIDMuMiwgaXQncyBub3QgYW4gaW5maW5pdGVseSByZWN1cnNpdmUgYnVnLikKK0FmdGVyIHNvbWUgcG9raW5nIGFyb3VuZCwgaXQgYXBwZWFycyB0aGF0IGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQKK3NpemUsIG9yIHdoZXRoZXIgeW91J3JlIHJ1bm5pbmcgWVAsIG9yIHRoZSBwaGFzZSBvZiB0aGUgbW9vbiBvciBzb21ldGhpbmcsCit0aGUgc3RhY2sgaXMgbm90IGFsd2F5cyBsb25nLWFsaWduZWQgd2hlbiBtYWluKCkgaXMgY2FsbGVkLCBhbmQgdGdldGVudCgpCit0YWtlcyBzdHJvbmcgb2ZmZW5zZSBhdCB0aGF0LiAgT24gc29tZSBtYWNoaW5lcyB0aGlzIGJ1ZyBuZXZlciBhcHBlYXJzLCBidXQKK29uIHRob3NlIHdoZXJlIGl0IGRvZXMsIGl0IG9jY3VycyBxdWl0ZSByZWxpYWJseS4gICovCisjZGVmaW5lIEFMSUdOX1NUQUNLX09OX1NUQVJUVVAKKworLyogZGVmaW5lIFVTRyBpZiB5b3UgYXJlIHVzaW5nIHN5czUgL3Vzci9pbmNsdWRlJ3MgKi8KKyNkZWZpbmUgVVNHCisKKyNkZWZpbmUgSEFWRV9URVJNSU8KKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSIDB4ZTAwMDAwMDAKKwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIveG0uaCBiL2RlYnVnZ2VyL3htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2NWM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL3htLmgKQEAgLTAsMCArMSwyNiBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIGxpbnV4LCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaW5jbHVkZSAieG0taTM4NnYuaCIKKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKyN1bmRlZiBLRVJORUxfVV9BRERSCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMHgwCisjZGVmaW5lIFBTSUdOQUxfSU5fU0lHTkFMX0gKZGlmZiAtLWdpdCBhL2lmMTYzMi9jYWxsYmFjay5jIGIvaWYxNjMyL2NhbGxiYWNrLmMKaW5kZXggZGQ1ZDAzNS4uM2MzNWU4OCAxMDA2NDQKLS0tIGEvaWYxNjMyL2NhbGxiYWNrLmMKKysrIGIvaWYxNjMyL2NhbGxiYWNrLmMKQEAgLTEzNSwxNyArMTM1LDIyIEBACiBMT05HIENhbGxXaW5kb3dQcm9jKCBGQVJQUk9DIGZ1bmMsIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLAogCQkgICAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCiB7Ci0gICAgaWYgKCh1bnNpZ25lZCBpbnQpZnVuYyAmIDB4ZmZmZjAwMDApCisgICAgaWYgKElzMTZiaXRBZGRyZXNzKGZ1bmMpKQogICAgIHsJCiAJUHVzaE9uMTYoIENBTExCQUNLX1NJWkVfV09SRCwgaHduZCApOwogCVB1c2hPbjE2KCBDQUxMQkFDS19TSVpFX1dPUkQsIG1lc3NhZ2UgKTsKIAlQdXNoT24xNiggQ0FMTEJBQ0tfU0laRV9XT1JELCB3UGFyYW0gKTsKIAlQdXNoT24xNiggQ0FMTEJBQ0tfU0laRV9MT05HLCBsUGFyYW0gKTsKKworCXByaW50ZigiJTguOHgoJTQuNHgsICU0LjR4LCAlNC40eCwgJTguOHgpXG4iLCBmdW5jLCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisKIAlyZXR1cm4gQ2FsbFRvMTYoKHVuc2lnbmVkIGludCkgZnVuYywgCiAJCQlGaW5kRGF0YVNlZ21lbnRGb3JDb2RlKCh1bnNpZ25lZCBsb25nKSBmdW5jKSk7ICAgCiAgICAgfQogICAgIGVsc2UKLQlyZXR1cm4gV0lER0VUU19DYWxsMzJXbmRQcm9jKCBmdW5jLCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOworICAgIHsKKwlyZXR1cm4gKCpmdW5jKShod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTUzLDkgKzE1OCwxNiBAQAogICovCiB2b2lkIENhbGxMaW5lRERBUHJvYyhGQVJQUk9DIGZ1bmMsIHNob3J0IHhQb3MsIHNob3J0IHlQb3MsIGxvbmcgbFBhcmFtKQogewotICAgIFB1c2hPbjE2KCBDQUxMQkFDS19TSVpFX1dPUkQsIHhQb3MgKTsKLSAgICBQdXNoT24xNiggQ0FMTEJBQ0tfU0laRV9XT1JELCB5UG9zICk7Ci0gICAgUHVzaE9uMTYoIENBTExCQUNLX1NJWkVfTE9ORywgbFBhcmFtICk7Ci0gICAgQ2FsbFRvMTYoKHVuc2lnbmVkIGludCkgZnVuYywgCi0JICAgICBGaW5kRGF0YVNlZ21lbnRGb3JDb2RlKCh1bnNpZ25lZCBsb25nKSBmdW5jKSk7ICAgCisgICAgaWYgKElzMTZiaXRBZGRyZXNzKGZ1bmMpKQorICAgIHsKKwlQdXNoT24xNiggQ0FMTEJBQ0tfU0laRV9XT1JELCB4UG9zICk7CisJUHVzaE9uMTYoIENBTExCQUNLX1NJWkVfV09SRCwgeVBvcyApOworCVB1c2hPbjE2KCBDQUxMQkFDS19TSVpFX0xPTkcsIGxQYXJhbSApOworCUNhbGxUbzE2KCh1bnNpZ25lZCBpbnQpIGZ1bmMsIAorCQkgRmluZERhdGFTZWdtZW50Rm9yQ29kZSgodW5zaWduZWQgbG9uZykgZnVuYykpOyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworCSgqZnVuYykoeFBvcywgeVBvcywgbFBhcmFtKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggYmZlYjFiNC4uNjNlYjAwOCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMzIsMTEgKzMyLDE5IEBACiA1MCAgcGFzY2FsIEdldFByb2NBZGRyZXNzKHdvcmQgcHRyKSBHZXRQcm9jQWRkcmVzcygxIDIpCiA1MSAgcGFzY2FsIE1ha2VQcm9jSW5zdGFuY2UocHRyIHdvcmQpIENBTExCQUNLX01ha2VQcm9jSW5zdGFuY2UoMSAyKQogNTIgIHBhc2NhbCBGcmVlUHJvY0luc3RhbmNlKHB0cikgRnJlZVByb2NJbnN0YW5jZSgxKQorNTkgIHBhc2NhbCBXcml0ZVByb2ZpbGVTdHJpbmcocHRyIHB0ciBwdHIpIFdyaXRlUHJvZmlsZVN0cmluZygxIDIgMykKKzYwICBwYXNjYWwgRmluZFJlc291cmNlKHdvcmQgcHRyIHB0cikgRmluZFJlc291cmNlKDEgMiAzKQorNjEgIHBhc2NhbCBMb2FkUmVzb3VyY2Uod29yZCB3b3JkKSBMb2FkUmVzb3VyY2UoMSAyKQorNjIgIHBhc2NhbCBMb2NrUmVzb3VyY2Uod29yZCkgTG9ja1Jlc291cmNlKDEpCis2MyAgcGFzY2FsIEZyZWVSZXNvdXJjZSh3b3JkKSBGcmVlUmVzb3VyY2UoMSkKIDc0ICBwYXNjYWwgT3BlbkZpbGUocHRyIHB0ciB3b3JkKSBLRVJORUxfT3BlbkZpbGUoMSAyIDMpCiA4MSAgcGFzY2FsIF9sY2xvc2Uod29yZCkgS0VSTkVMX19sY2xvc2UoMSkKIDgyICBwYXNjYWwgX2xyZWFkKHdvcmQgcHRyIHdvcmQpIEtFUk5FTF9fbHJlYWQoMSAyIDMpCiA4NSAgcGFzY2FsIF9sb3BlbihwdHIgd29yZCkgS0VSTkVMX19sb3BlbigxIDIpCiA4NiAgcGFzY2FsIF9sd3JpdGUod29yZCBwdHIgd29yZCkgS0VSTkVMX19sd3JpdGUoMSAyIDMpCis4OCAgcGFzY2FsIGxzdHJjcHkocHRyIHB0cikgbHN0cmNweSgxIDIpCis4OSAgcGFzY2FsIGxzdHJjYXQocHRyIHB0cikgbHN0cmNhdCgxIDIpCis5MCAgcGFzY2FsIGxzdHJsZW4ocHRyKSBsc3RyY3B5KDEpCiA5MSAgcmVnaXN0ZXIgSW5pdFRhc2sod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkCiAJCSAgICAgIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgCiAJICAgICBLRVJORUxfSW5pdFRhc2soKQpAQCAtNTEsNiArNTksOCBAQAogCSAgIEdldFByaXZhdGVQcm9maWxlSW50KDEgMiAzIDQpCiAxMjggcGFzY2FsIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyIHB0ciBzX3dvcmQgcHRyKQogCSAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKDEgMiAzIDQgNSA2KQorMTI5IHBhc2NhbCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyIHB0cikKKwkgICBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKDEgMiAzIDQpCiAxMzEgcGFzY2FsIEdldERPU0Vudmlyb25tZW50KCkgR2V0RE9TRW52aXJvbm1lbnQoKQogMTMyIHJldHVybiBHZXRXaW5GbGFncyAwIDB4NDEzCiAxNTQgcmV0dXJuIEdsb2JhbE5vdGlmeSA0IDAKQEAgLTY2LDMgKzc2LDQgQEAKIDU3ICBwYXNjYWwgR2V0UHJvZmlsZUludChwdHIgcHRyIHdvcmQpIEdldFByb2ZpbGVJbnQoMSAyIDMpCiA1OCAgcGFzY2FsIEdldFByb2ZpbGVTdHJpbmcocHRyIHB0ciBwdHIgcHRyIHdvcmQpIEdldFByb2ZpbGVTdHJpbmcoMSAyIDMgNCA1KQogMTk5IHBhc2NhbCBTZXRIYW5kbGVDb3VudCh3b3JkKSBTZXRIYW5kbGVDb3VudCgxKQorMzUzIHBhc2NhbCBsc3RyY3B5bihwdHIgcHRyIHdvcmQpIGxzdHJjcHluKDEgMiAzKQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCBjZjkzZmU3Li45YmY2YjEyIDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMTA3LDExICsxMDcsNiBAQAogCSAgICBJRjE2MzJfU2F2ZWQxNl9zcyAgPT0gMHgwMDk3KQogCSAgICBwcmludGYoIkFDSyEhXG4iKTsKIAotI2lmIDAKLQlJRjE2MzJfU2F2ZWQxNl9lc3AgJj0gMHgwMDAwZmZmZjsKLQlJRjE2MzJfU2F2ZWQxNl9lYnAgJj0gMHgwMDAwZmZmZjsKLSNlbmRpZgotCiAjaWZkZWYgREVCVUdfU1RBQ0sKIAlzdGFja19wID0gKHVuc2lnbmVkIHNob3J0ICopIHNlZ19vZmY7CiAJZm9yIChpID0gMDsgaSA8IDI0OyBpKyssIHN0YWNrX3ArKykKZGlmZiAtLWdpdCBhL2lmMTYzMi9zb3VuZC5zcGVjIGIvaWYxNjMyL3NvdW5kLnNwZWMKaW5kZXggMGU3ZDAxMi4uYmUwYTJmNCAxMDA2NDQKLS0tIGEvaWYxNjMyL3NvdW5kLnNwZWMKKysrIGIvaWYxNjMyL3NvdW5kLnNwZWMKQEAgLTEsNCArMSw0IEBACi0jICRJZDogd2luODdlbS5zcGVjLHYgMS4zIDE5OTMvMDcvMDQgMDQ6MDQ6MjEgcm9vdCBFeHAgcm9vdCAkCisjICRJZDogc291bmQuc3BlYyx2IDEuMyAxOTkzLzA3LzA0IDA0OjA0OjIxIHJvb3QgRXhwIHJvb3QgJAogIwogbmFtZQlzb3VuZAogaWQJNwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggMWRhMGM0ZC4uNGEzMmE2YSAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0xNywxMSArMTcsMTQgQEAKIDE5ICBwYXNjYWwgUmVsZWFzZUNhcHR1cmUoKSBSZWxlYXNlQ2FwdHVyZSgpCiAzMSAgcGFzY2FsIElzSWNvbmljKHdvcmQpIElzSWNvbmljKDEpCiAzMyAgcGFzY2FsIEdldENsaWVudFJlY3Qod29yZCBwdHIpIEdldENsaWVudFJlY3QoMSAyKQorMzYgIHBhc2NhbCBHZXRXaW5kb3dUZXh0KHdvcmQgcHRyIHdvcmQpIEdldFdpbmRvd1RleHQoMSAyIDMpCiszOCAgcGFzY2FsIEdldFdpbmRvd1RleHRMZW5ndGgod29yZCkgR2V0V2luZG93VGV4dExlbmd0aCgxKQogMzkgIHBhc2NhbCBCZWdpblBhaW50KHdvcmQgcHRyKSBCZWdpblBhaW50KDEgMikKIDQwICBwYXNjYWwgRW5kUGFpbnQod29yZCBwdHIpIEVuZFBhaW50KDEgMikKIDQxICBwYXNjYWwgQ3JlYXRlV2luZG93KHB0ciBwdHIgbG9uZyBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgd29yZCB3b3JkIHdvcmQgcHRyKSAKIAkgICBDcmVhdGVXaW5kb3coMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEpCiA0MiAgcGFzY2FsIFNob3dXaW5kb3cod29yZCB3b3JkKSBTaG93V2luZG93KDEgMikKKzQ2ICBwYXNjYWwgR2V0UGFyZW50KHdvcmQpIEdldFBhcmVudCgxKQogNTMgIHBhc2NhbCBEZXN0cm95V2luZG93KHdvcmQpIERlc3Ryb3lXaW5kb3coMSkKIDU3ICBwYXNjYWwgUmVnaXN0ZXJDbGFzcyhwdHIpIFJlZ2lzdGVyQ2xhc3MoMSkKIDY2ICBwYXNjYWwgR2V0REMod29yZCkgR2V0REMoMSkKQEAgLTM3LDYgKzQwLDcgQEAKIDgwICBwYXNjYWwgVW5pb25SZWN0KHB0ciBwdHIgcHRyKSBVbmlvblJlY3QoMSAyIDMpCiA4MSAgcGFzY2FsIEZpbGxSZWN0KHdvcmQgcHRyIHdvcmQpIEZpbGxSZWN0KDEgMiAzKQogODIgIHBhc2NhbCBJbnZlcnRSZWN0KHdvcmQgcHRyKSBJbnZlcnRSZWN0KDEgMikKKzgzICBwYXNjYWwgRnJhbWVSZWN0KHdvcmQgcHRyIHdvcmQpIEZyYW1lUmVjdCgxIDIgMykKIDg1ICBwYXNjYWwgRHJhd1RleHQod29yZCBwdHIgc193b3JkIHB0ciB3b3JkKSBEcmF3VGV4dCgxIDIgMyA0IDUpCiAxMDIgcGFzY2FsIEFkanVzdFdpbmRvd1JlY3QocHRyIGxvbmcgd29yZCkgQWRqdXN0V2luZG93UmVjdCgxIDIgMykKIDEwNCBwYXNjYWwgTWVzc2FnZUJlZXAod29yZCkgTWVzc2FnZUJlZXAoMSkKQEAgLTYwLDYgKzY0LDEwIEBACiAxMzAgcGFzY2FsIFNldENsYXNzV29yZCh3b3JkIHNfd29yZCB3b3JkKSBTZXRDbGFzc1dvcmQoMSAyIDMpCiAxMzEgcGFzY2FsIEdldENsYXNzTG9uZyh3b3JkIHNfd29yZCkgR2V0Q2xhc3NMb25nKDEgMikKIDEzMiBwYXNjYWwgU2V0Q2xhc3NMb25nKHdvcmQgc193b3JkIGxvbmcpIFNldENsYXNzTG9uZygxIDIgMykKKzEzMyBwYXNjYWwgR2V0V2luZG93V29yZCh3b3JkIHNfd29yZCkgR2V0V2luZG93V29yZCgxIDIpCisxMzQgcGFzY2FsIFNldFdpbmRvd1dvcmQod29yZCBzX3dvcmQgd29yZCkgU2V0V2luZG93V29yZCgxIDIgMykKKzEzNSBwYXNjYWwgR2V0V2luZG93TG9uZyh3b3JkIHNfd29yZCkgR2V0V2luZG93TG9uZygxIDIpCisxMzYgcGFzY2FsIFNldFdpbmRvd0xvbmcod29yZCBzX3dvcmQgbG9uZykgU2V0V2luZG93TG9uZygxIDIgMykKIDE1MCBwYXNjYWwgTG9hZE1lbnUod29yZCBwdHIpIExvYWRNZW51KDEgMikKIDE1MSBwYXNjYWwgQ3JlYXRlTWVudSgpIENyZWF0ZU1lbnUoKQogMTU0IHBhc2NhbCBDaGVja01lbnUod29yZCB3b3JkIHdvcmQpIENoZWNrTWVudSgxIDIgMykKQEAgLTY5LDEyICs3NywzMiBAQAogMTc0IHBhc2NhbCBMb2FkSWNvbih3b3JkIHB0cikgTG9hZEljb24oMSAyKQogMTc1IHBhc2NhbCBMb2FkQml0bWFwKHdvcmQgcHRyKSBMb2FkQml0bWFwKDEgMikKIDE3NiBwYXNjYWwgTG9hZFN0cmluZyh3b3JkIHdvcmQgcHRyIHNfd29yZCkgTG9hZFN0cmluZygxIDIgMyA0KQorMTc3IHBhc2NhbCBMb2FkQWNjZWxlcmF0b3JzKHdvcmQgcHRyKSBMb2FkQWNjZWxlcmF0b3JzKDEgMikKIDE3OSBwYXNjYWwgR2V0U3lzdGVtTWV0cmljcyh3b3JkKSBHZXRTeXN0ZW1NZXRyaWNzKDEpCisxODAgcGFzY2FsIEdldFN5c0NvbG9yKHdvcmQpIEdldFN5c0NvbG9yKDEpCisxODEgcGFzY2FsIFNldFN5c0NvbG9ycyh3b3JkIHB0ciBwdHIpIFNldFN5c0NvbG9ycygxIDIgMykKKzQzMCBwYXNjYWwgbHN0cmNtcChwdHIgcHRyKSBsc3RyY21wKDEgMikKKzQzMSBwYXNjYWwgQW5zaVVwcGVyKHB0cikgQW5zaVVwcGVyKDEpCis0MzIgcGFzY2FsIEFuc2lMb3dlcihwdHIpIEFuc2lMb3dlcigxKQorNDMzIHBhc2NhbCBJc0NoYXJBbHBoYShieXRlKSBJc0NoYXJBbHBoYSgxKQorNDM0IHBhc2NhbCBJc0NoYXJBbHBoYW51bWVyaWMoYnl0ZSkgSXNDaGFyQWxwaGFudW1lcmljKDEpCis0MzUgcGFzY2FsIElzQ2hhclVwcGVyKGJ5dGUpIElzQ2hhclVwcGVyKDEpCis0MzYgcGFzY2FsIElzQ2hhckxvd2VyKGJ5dGUpIElzQ2hhckxvd2VyKDEpCis0MzcgcGFzY2FsIEFuc2lVcHBlckJ1ZmYocHRyIHdvcmQpIEFuc2lVcHBlckJ1ZmYoMSAyKQorNDM4IHBhc2NhbCBBbnNpTG93ZXJCdWZmKHB0ciB3b3JkKSBBbnNpTG93ZXJCdWZmKDEgMikKKzQ3MSBwYXNjYWwgbHN0cmNtcGkocHRyIHB0cikgbHN0cmNtcGkoMSAyKQorNDcyIHBhc2NhbCBBbnNpTmV4dChwdHIpIEFuc2lOZXh0KDEgKQorNDczIHBhc2NhbCBBbnNpUHJldihwdHIgcHRyKSBBbnNpUHJldigxIDIpCisKKworCisKIDE4MiBwYXNjYWwgS2lsbFN5c3RlbVRpbWVyKHdvcmQgd29yZCkgS2lsbFN5c3RlbVRpbWVyKDEgMikKIDE5MCBwYXNjYWwgR2V0VXBkYXRlUmVjdCh3b3JkIHB0ciB3b3JkKSBHZXRVcGRhdGVSZWN0KDEgMiAzKQogMjM3IHBhc2NhbCBHZXRVcGRhdGVSZ24od29yZCB3b3JkIHdvcmQpIEdldFVwZGF0ZVJnbigxIDIgMykKIDI0NCBwYXNjYWwgRXF1YWxSZWN0KHB0ciBwdHIpIEVxdWFsUmVjdCgxIDIpCiAyNjYgcGFzY2FsIFNldE1lc3NhZ2VRdWV1ZSh3b3JkKSBTZXRNZXNzYWdlUXVldWUoMSkKKzI4NiBwYXNjYWwgR2V0RGVza3RvcFdpbmRvdygpIEdldERlc2t0b3BXaW5kb3coKQogMjg4IHBhc2NhbCBHZXRNZXNzYWdlRXh0cmFJbmZvKCkgR2V0TWVzc2FnZUV4dHJhSW5mbygpCiAzMjQgcGFzY2FsIEZpbGxXaW5kb3cod29yZCB3b3JkIHdvcmQgd29yZCkgRmlsbFdpbmRvdygxIDIgMyA0KQogMzI1IHBhc2NhbCBQYWludFJlY3Qod29yZCB3b3JkIHdvcmQgd29yZCBwdHIpIFBhaW50UmVjdCgxIDIgMyA0IDUpCkBAIC04Myw1ICsxMTEsNCBAQAogMzczIHBhc2NhbCBTdWJ0cmFjdFJlY3QocHRyIHB0ciBwdHIpIFN1YnRyYWN0UmVjdCgxIDIgMykKIDQwMyBwYXNjYWwgVW5yZWdpc3RlckNsYXNzKHB0ciB3b3JkKSBVbnJlZ2lzdGVyQ2xhc3MoMSAyKQogNDExIHBhc2NhbCBBcHBlbmRNZW51KHdvcmQgd29yZCB3b3JkIHB0cikgQXBwZW5kTWVudSgxIDIgMyA0KQotMTc3IHBhc2NhbCBMb2FkQWNjZWxlcmF0b3JzKHdvcmQgcHRyKSBMb2FkQWNjZWxlcmF0b3JzKDEgMikKIDQyMSBwYXNjYWwgd3ZzcHJpbnRmKHB0ciBwdHIgcHRyKSB3dnNwcmludGYoMSAyIDMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYXNzLmggYi9pbmNsdWRlL2NsYXNzLmgKaW5kZXggZjJjYzgwYS4uOWFiNTBlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFzcy5oCisrKyBiL2luY2x1ZGUvY2xhc3MuaApAQCAtMTcsNyArMTcsNyBAQAogICAgIEhDTEFTUyAgICAgICBoTmV4dDsgICAgICAgICAvKiBOZXh0IGNsYXNzICovCiAgICAgV09SRCAgICAgICAgIHdNYWdpYzsgICAgICAgIC8qIE1hZ2ljIG51bWJlciAobXVzdCBiZSBDTEFTU19NQUdJQykgKi8KICAgICBBVE9NICAgICAgICAgYXRvbU5hbWU7ICAgICAgLyogTmFtZSBvZiB0aGUgY2xhc3MgKi8KLSAgICBIQU5ETEUgICAgICAgaERDRTsgICAgICAgICAgLyogQ2xhc3MgREMgRW50cnkgKGlmIENTX0NMQVNTREMpICovCisgICAgSERDICAgICAgICAgIGhkYzsgICAgICAgICAgIC8qIENsYXNzIERDIChpZiBDU19DTEFTU0RDKSAqLwogICAgIFdPUkQgICAgICAgICBjV2luZG93czsgICAgICAvKiBDb3VudCBvZiBleGlzdGluZyB3aW5kb3dzIG9mIHRoaXMgY2xhc3MgKi8KICAgICBXTkRDTEFTUyAgICAgd2MgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAgLyogQ2xhc3MgaW5mb3JtYXRpb24gKi8KICAgICBXT1JEICAgICAgICAgd0V4dHJhWzFdOyAgICAgLyogQ2xhc3MgZXh0cmEgYnl0ZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VnbWVtLmggYi9pbmNsdWRlL3NlZ21lbS5oCmluZGV4IDU3NzVjZGMuLjZjNGY3YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2VnbWVtLmgKKysrIGIvaW5jbHVkZS9zZWdtZW0uaApAQCAtMzIsNCArMzIsMTEgQEAKICNkZWZpbmUgR0xPQkFMX0ZMQUdTX0VYRUNVVEVPTkxZCTB4MDAwMjAwMDAKICNkZWZpbmUgR0xPQkFMX0ZMQUdTX1JFQURPTkxZCQkweDAwMDIwMDAwCiAKKyNkZWZpbmUgRklSU1RfU0VMRUNUT1IJOAorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgSXMxNmJpdEFkZHJlc3Modm9pZCAqYWRkcmVzcykKK3sKKyAgICByZXR1cm4gKChpbnQpIGFkZHJlc3MgPj0gKCgoRklSU1RfU0VMRUNUT1IgPDwgMykgfCAweDAwMDcpIDw8IDE2KSk7Cit9CisKICNlbmRpZiAvKiBTRUdNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4uaCBiL2luY2x1ZGUvd2luLmgKaW5kZXggNWM3YzIzNS4uODk0ZGE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4uaAorKysgYi9pbmNsdWRlL3dpbi5oCkBAIC0zMiw5ICszMiwxMSBAQAogICAgIEhXTkQgICAgICAgICBod25kTGFzdEFjdGl2ZTsgLyogTGFzdCBhY3RpdmUgcG9wdXAgaHduZCAqLwogICAgIEZBUlBST0MgICAgICBscGZuV25kUHJvYzsgICAgLyogV2luZG93IHByb2NlZHVyZSAqLwogICAgIERXT1JEICAgICAgICBkd1N0eWxlOyAgICAgICAgLyogV2luZG93IHN0eWxlIChmcm9tIENyZWF0ZVdpbmRvdykgKi8KLSAgICBIQU5ETEUgICAgICAgaERDRTsgICAgICAgICAgIC8qIFdpbmRvdyBEQyBFbnRyeSAoaWYgQ1NfT1dOREMpICovCisgICAgRFdPUkQgICAgICAgIGR3RXhTdHlsZTsgICAgICAvKiBFeHRlbmRlZCBzdHlsZSAoZnJvbSBDcmVhdGVXaW5kb3dFeCkgKi8KKyAgICBIREMgICAgICAgICAgaGRjOyAgICAgICAgICAgIC8qIFdpbmRvdyBEQyAoaWYgQ1NfT1dOREMpICovCiAgICAgSE1FTlUgICAgICAgIGhtZW51U3lzdGVtOyAgICAvKiBTeXN0ZW0gbWVudSAqLwogICAgIFdPUkQgICAgICAgICB3SURtZW51OyAgICAgICAgLyogSUQgb3IgaG1lbnUgKGZyb20gQ3JlYXRlV2luZG93KSAqLworICAgIEhBTkRMRSAgICAgICBoVGV4dDsgICAgICAgICAgLyogSGFuZGxlIG9mIHdpbmRvdyB0ZXh0ICovCiAgICAgV09SRCAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiBNaXNjLiBmbGFncyAqLwogICAgIFdpZGdldCAgICAgICBzaGVsbFdpZGdldDsgICAgLyogRm9yIHRvcC1sZXZlbCB3aW5kb3dzICovCiAgICAgV2lkZ2V0ICAgICAgIHdpbldpZGdldDsgICAgICAvKiBGb3IgYWxsIHdpbmRvd3MgKi8KQEAgLTQ3LDEwICs0OSw5IEBACiAjZGVmaW5lIFdJTl9FUkFTRV9VUERBVEVSR04gICAgICAgMSAgIC8qIFVwZGF0ZSByZWdpb24gbmVlZHMgZXJhc2luZyAqLwogCiAKLSAvKiBUaGUgY2FsbGVyIG11c3QgR2xvYmFsVW5sb2NrIHRoZSBwb2ludGVyIHJldHVybmVkIAotICAqIGJ5IHRoaXMgZnVuY3Rpb24gKGV4Y2VwdCB3aGVuIE5VTEwpLgotICAqLworICAvKiBXaW5kb3cgZnVuY3Rpb25zICovCiBXTkQgKiBXSU5fRmluZFduZFB0ciggSFdORCBod25kICk7CitIV05EIFdJTl9GaW5kV2luVG9SZXBhaW50KCBIV05EIGh3bmQgKTsKIAogCiAjZW5kaWYgIC8qIFdJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IDI3ODc3MGIuLjljOGUwZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xMDUsNyArMTA1LDcgQEAKICNkZWZpbmUgR0NXX1NUWUxFICAgICAgICAgICAoLTI2KQogI2RlZmluZSBHQ1dfQVRPTSAgICAgICAgICAgICgtMzIpCiAKLQorICAvKiBXaW5kb3dzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICB2b2lkICogICAgbHBDcmVhdGVQYXJhbXM7CkBAIC0xMjIsNiArMTIyLDE3IEBACiAgICAgRFdPUkQgICAgIGR3RXhTdHlsZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiB9IENSRUFURVNUUlVDVCwgKkxQQ1JFQVRFU1RSVUNUOwogCisgIC8qIE9mZnNldHMgZm9yIEdldFdpbmRvd0xvbmcoKSBhbmQgR2V0V2luZG93V29yZCgpICovCisjZGVmaW5lIEdXTF9FWFNUWUxFICAgICAgICAgKC0yMCkKKyNkZWZpbmUgR1dMX1NUWUxFICAgICAgICAgICAoLTE2KQorI2RlZmluZSBHV1dfSUQgICAgICAgICAgICAgICgtMTIpCisjZGVmaW5lIEdXV19IV05EUEFSRU5UICAgICAgKC04KQorI2RlZmluZSBHV1dfSElOU1RBTkNFICAgICAgICgtNikKKyNkZWZpbmUgR1dMX1dORFBST0MgICAgICAgICAoLTQpCisjZGVmaW5lIERXTF9NU0dSRVNVTFQJICAgIDAKKyNkZWZpbmUgRFdMX0RMR1BST0MJICAgIDQKKyNkZWZpbmUgRFdMX1VTRVIJICAgIDgKKwogCiB0eXBlZGVmIHN0cnVjdCB7IHNob3J0IHgsIHk7IH0gUE9JTlQ7CiB0eXBlZGVmIFBPSU5UICpQUE9JTlQ7CkBAIC0xMzQsNiArMTQ1LDcgQEAKICAgICBzaG9ydCBjeTsKIH0gU0laRSwgKkxQU0laRTsKIAorI2RlZmluZSBNQUtFUE9JTlQobCkgKCooKFBPSU5UICopJihsKSkpCiAKIHR5cGVkZWYgc3RydWN0IHRhZ01TRwogewpAQCAtMTQ1Miw3ICsxNDY0LDcgQEAKIEZjKHZvaWQsT2VtVG9BbnNpQnVmZixMUFNUUixhLExQU1RSLGIsaW50LGMpCiBGYyh2b2lkLE9mZnNldFJlY3QsTFBSRUNULGEsc2hvcnQsYixzaG9ydCxjKQogRmModm9pZCxTZXREbGdJdGVtVGV4dCxIV05ELGEsaW50LGIsTFBTVFIsYykKLUZjKHZvaWQsU2V0U3lzQ29sb3JzLGludCxhLExQSU5ULGIsTE9ORyosYykKK0ZjKHZvaWQsU2V0U3lzQ29sb3JzLGludCxhLExQSU5ULGIsQ09MT1JSRUYqLGMpCiBGYyh2b2lkLFNob3dTY3JvbGxCYXIsSFdORCxhLFdPUkQsYixCT09MLGMpCiBGYyh2b2lkLFN3aXRjaFN0YWNrVG8sV09SRCxhLFdPUkQsYixXT1JELGMpCiBGZChCT09MLEFwcGVuZE1lbnUsSE1FTlUsYSxXT1JELGIsV09SRCxjLExQU1RSLGQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmUuaCBiL2luY2x1ZGUvd2luZS5oCmluZGV4IDYyMWZjZGIuLmFmZTExZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZS5oCisrKyBiL2luY2x1ZGUvd2luZS5oCkBAIC0xNSw4ICsxNSwxMiBAQAogICBjaGFyICogbG9va3VwX3RhYmxlOwogICBjaGFyICogbnJuYW1lX3RhYmxlOwogICBjaGFyICogcm5hbWVfdGFibGU7CisgIHVuc2lnbmVkIHNob3J0IGhpbnN0YW5jZTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgIHdfZmlsZXMgKiB3aW5lX2ZpbGVzOwogCitleHRlcm4gY2hhciAqR2V0RmlsZW5hbWVGcm9tSW5zdGFuY2UodW5zaWduZWQgc2hvcnQgaW5zdGFuY2UpOworZXh0ZXJuIHN0cnVjdCB3X2ZpbGVzICpHZXRGaWxlSW5mbyh1bnNpZ25lZCBzaG9ydCBpbnN0YW5jZSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCA0YTNjNjBlLi5mY2MxYWYzIDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtMywxMiArMyw0NyBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAicHJvdG90eXBlcy5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgIndpbmUuaCIKIAogI2RlZmluZSBNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCitzdGF0aWMgaW50IFJlc291cmNlRmQgPSAtMTsKK3N0YXRpYyBIQU5ETEUgUmVzb3VyY2VJbnN0ID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgd19maWxlcyAqUmVzb3VyY2VGaWxlSW5mbyA9IE5VTEw7CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJT3BlblJlc291cmNlRmlsZQorICovCitpbnQKK09wZW5SZXNvdXJjZUZpbGUoSEFORExFIGluc3RhbmNlKQoreworICAgIHN0cnVjdCB3X2ZpbGVzICp3OworICAgIAorICAgIGlmIChSZXNvdXJjZUluc3QgPT0gaW5zdGFuY2UpCisJcmV0dXJuIFJlc291cmNlRmQ7CisgICAgCisgICAgdyA9IEdldEZpbGVJbmZvKGluc3RhbmNlKTsKKyAgICBpZiAodyA9PSBOVUxMKQorCXJldHVybiAtMTsKKyAgICAKKyAgICBpZiAoUmVzb3VyY2VGZCA+PSAwKQorCWNsb3NlKFJlc291cmNlRmQpOworICAgIAorICAgIFJlc291cmNlSW5zdCA9IGluc3RhbmNlOworICAgIFJlc291cmNlRmlsZUluZm8gPSB3OworICAgIFJlc291cmNlRmQgPSBvcGVuKHctPmZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgCisgICAgcmV0dXJuIFJlc291cmNlRmQ7Cit9CiAMCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCUNvbnZlcnRDb3JlQml0bWFwCkBAIC04OCwxNyArMTIzLDE5IEBACiAgICAgc3RydWN0IHJlc291cmNlX25hbWVpbmZvX3MgbmFtZWluZm87CiAgICAgdW5zaWduZWQgc2hvcnQgc2l6ZV9zaGlmdDsKICAgICBpbnQgaTsKKyAgICBvZmZfdCBydG9mZjsKIAogICAgIC8qCiAgICAgICogTW92ZSB0byBiZWdpbm5pbmcgb2YgcmVzb3VyY2UgdGFibGUuCiAgICAgICovCi0gICAgbHNlZWsoQ3VycmVudE5FRmlsZSwgKEN1cnJlbnRNWkhlYWRlci0+bmVfb2Zmc2V0ICsKLQkJCSAgQ3VycmVudE5FSGVhZGVyLT5yZXNvdXJjZV90YWJfb2Zmc2V0KSwgU0VFS19TRVQpOworICAgIHJ0b2ZmID0gKFJlc291cmNlRmlsZUluZm8tPm16X2hlYWRlci0+bmVfb2Zmc2V0ICsKKwkgICAgIFJlc291cmNlRmlsZUluZm8tPm5lX2hlYWRlci0+cmVzb3VyY2VfdGFiX29mZnNldCk7CisgICAgbHNlZWsoUmVzb3VyY2VGZCwgcnRvZmYsIFNFRUtfU0VUKTsKICAgICAKICAgICAvKgogICAgICAqIFJlYWQgYmxvY2sgc2l6ZS4KICAgICAgKi8KLSAgICBpZiAocmVhZChDdXJyZW50TkVGaWxlLCAmc2l6ZV9zaGlmdCwgc2l6ZW9mKHNpemVfc2hpZnQpKSAhPSAKKyAgICBpZiAocmVhZChSZXNvdXJjZUZkLCAmc2l6ZV9zaGlmdCwgc2l6ZW9mKHNpemVfc2hpZnQpKSAhPSAKIAlzaXplb2Yoc2l6ZV9zaGlmdCkpCiAgICAgewogCXJldHVybiAtMTsKQEAgLTExMCw3ICsxNDcsNyBAQAogICAgIHR5cGVpbmZvLnR5cGVfaWQgPSAweGZmZmY7CiAgICAgd2hpbGUgKHR5cGVpbmZvLnR5cGVfaWQgIT0gMCkKICAgICB7Ci0JaWYgKHJlYWQoQ3VycmVudE5FRmlsZSwgJnR5cGVpbmZvLCBzaXplb2YodHlwZWluZm8pKSAhPQorCWlmIChyZWFkKFJlc291cmNlRmQsICZ0eXBlaW5mbywgc2l6ZW9mKHR5cGVpbmZvKSkgIT0KIAkgICAgc2l6ZW9mKHR5cGVpbmZvKSkKIAl7CiAJICAgIHJldHVybiAtMTsKQEAgLTExOSw3ICsxNTYsNyBAQAogCXsKIAkgICAgZm9yIChpID0gMDsgaSA8IHR5cGVpbmZvLmNvdW50OyBpKyspCiAJICAgIHsKLQkJaWYgKHJlYWQoQ3VycmVudE5FRmlsZSwgJm5hbWVpbmZvLCBzaXplb2YobmFtZWluZm8pKSAhPSAKKwkJaWYgKHJlYWQoUmVzb3VyY2VGZCwgJm5hbWVpbmZvLCBzaXplb2YobmFtZWluZm8pKSAhPSAKIAkJICAgIHNpemVvZihuYW1laW5mbykpCiAJCXsKIAkJICAgIHJldHVybiAtMTsKQEAgLTE1OSwxNyArMTk2LDE5IEBACiAgICAgdW5zaWduZWQgY2hhciBuYnl0ZXM7CiAgICAgY2hhciBuYW1lWzI1Nl07CiAgICAgaW50IGk7CisgICAgb2ZmX3QgcnRvZmY7CiAKICAgICAvKgogICAgICAqIE1vdmUgdG8gYmVnaW5uaW5nIG9mIHJlc291cmNlIHRhYmxlLgogICAgICAqLwotICAgIGxzZWVrKEN1cnJlbnRORUZpbGUsIChDdXJyZW50TVpIZWFkZXItPm5lX29mZnNldCArCi0JCQkgIEN1cnJlbnRORUhlYWRlci0+cmVzb3VyY2VfdGFiX29mZnNldCksIFNFRUtfU0VUKTsKKyAgICBydG9mZiA9IChSZXNvdXJjZUZpbGVJbmZvLT5tel9oZWFkZXItPm5lX29mZnNldCArCisJICAgICBSZXNvdXJjZUZpbGVJbmZvLT5uZV9oZWFkZXItPnJlc291cmNlX3RhYl9vZmZzZXQpOworICAgIGxzZWVrKFJlc291cmNlRmQsIHJ0b2ZmLCBTRUVLX1NFVCk7CiAgICAgCiAgICAgLyoKICAgICAgKiBSZWFkIGJsb2NrIHNpemUuCiAgICAgICovCi0gICAgaWYgKHJlYWQoQ3VycmVudE5FRmlsZSwgJnNpemVfc2hpZnQsIHNpemVvZihzaXplX3NoaWZ0KSkgIT0gCisgICAgaWYgKHJlYWQoUmVzb3VyY2VGZCwgJnNpemVfc2hpZnQsIHNpemVvZihzaXplX3NoaWZ0KSkgIT0gCiAJc2l6ZW9mKHNpemVfc2hpZnQpKQogICAgIHsKIAlyZXR1cm4gLTE7CkBAIC0xODEsNyArMjIwLDcgQEAKICAgICB0eXBlaW5mby50eXBlX2lkID0gMHhmZmZmOwogICAgIHdoaWxlICh0eXBlaW5mby50eXBlX2lkICE9IDApCiAgICAgewotCWlmIChyZWFkKEN1cnJlbnRORUZpbGUsICZ0eXBlaW5mbywgc2l6ZW9mKHR5cGVpbmZvKSkgIT0KKwlpZiAocmVhZChSZXNvdXJjZUZkLCAmdHlwZWluZm8sIHNpemVvZih0eXBlaW5mbykpICE9CiAJICAgIHNpemVvZih0eXBlaW5mbykpCiAJewogCSAgICByZXR1cm4gLTE7CkBAIC0xOTAsNyArMjI5LDcgQEAKIAl7CiAJICAgIGZvciAoaSA9IDA7IGkgPCB0eXBlaW5mby5jb3VudDsgaSsrKQogCSAgICB7Ci0JCWlmIChyZWFkKEN1cnJlbnRORUZpbGUsICZuYW1laW5mbywgc2l6ZW9mKG5hbWVpbmZvKSkgIT0gCisJCWlmIChyZWFkKFJlc291cmNlRmQsICZuYW1laW5mbywgc2l6ZW9mKG5hbWVpbmZvKSkgIT0gCiAJCSAgICBzaXplb2YobmFtZWluZm8pKQogCQl7CiAJCSAgICByZXR1cm4gLTE7CkBAIC0xOTksMTQgKzIzOCwxMiBAQAogCQlpZiAobmFtZWluZm8uaWQgJiAweDgwMDApCiAJCSAgICBjb250aW51ZTsKIAkJCi0JCW9sZF9wb3MgPSBsc2VlayhDdXJyZW50TkVGaWxlLCAwLCBTRUVLX0NVUik7Ci0JCW5ld19wb3MgPSAoQ3VycmVudE1aSGVhZGVyLT5uZV9vZmZzZXQgKwotCQkJICAgQ3VycmVudE5FSGVhZGVyLT5yZXNvdXJjZV90YWJfb2Zmc2V0ICsKLQkJCSAgIG5hbWVpbmZvLmlkKTsKLQkJbHNlZWsoQ3VycmVudE5FRmlsZSwgbmV3X3BvcywgU0VFS19TRVQpOwotCQlyZWFkKEN1cnJlbnRORUZpbGUsICZuYnl0ZXMsIDEpOwotCQlyZWFkKEN1cnJlbnRORUZpbGUsIG5hbWUsIG5ieXRlcyk7Ci0JCWxzZWVrKEN1cnJlbnRORUZpbGUsIG9sZF9wb3MsIFNFRUtfU0VUKTsKKwkJb2xkX3BvcyA9IGxzZWVrKFJlc291cmNlRmQsIDAsIFNFRUtfQ1VSKTsKKwkJbmV3X3BvcyA9IHJ0b2ZmICsgbmFtZWluZm8uaWQ7CisJCWxzZWVrKFJlc291cmNlRmQsIG5ld19wb3MsIFNFRUtfU0VUKTsKKwkJcmVhZChSZXNvdXJjZUZkLCAmbmJ5dGVzLCAxKTsKKwkJcmVhZChSZXNvdXJjZUZkLCBuYW1lLCBuYnl0ZXMpOworCQlsc2VlayhSZXNvdXJjZUZkLCBvbGRfcG9zLCBTRUVLX1NFVCk7CiAJCW5hbWVbbmJ5dGVzXSA9ICdcMCc7CiAKIAkJaWYgKHN0cmNhc2VjbXAobmFtZSwgcmVzb3VyY2VfbmFtZSkgPT0gMCkKQEAgLTIyMiw1MyArMjU5LDYgQEAKIH0KIAwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJTG9hZFN0cmluZwotICovCi1pbnQKLUxvYWRTdHJpbmcoSEFORExFIGluc3RhbmNlLCBXT1JEIHJlc291cmNlX2lkLCBMUFNUUiBidWZmZXIsIGludCBidWZsZW4pCi17Ci0gICAgc3RydWN0IHJlc291cmNlX25hbWVpbmZvX3MgbmFtZWluZm87Ci0gICAgdW5zaWduZWQgc2hvcnQgdGFyZ2V0X2lkOwotICAgIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbmd0aDsKLSAgICBpbnQgc2l6ZV9zaGlmdDsKLSAgICBpbnQgc3RyaW5nX251bTsKLSAgICBpbnQgaTsKLQotI2lmZGVmIERFQlVHX1JFU09VUkNFCi0gICAgcHJpbnRmKCJMb2FkU3RyaW5nOiBpbnN0YW5jZSA9ICUwNHgsIGlkID0gJWQsICIKLQkgICAiYnVmZmVyID0gJTA4eCwgbGVuZ3RoID0gJWRcbiIsCi0JICAgaW5zdGFuY2UsIHJlc291cmNlX2lkLCBidWZmZXIsIGJ1Zmxlbik7Ci0jZW5kaWYKLSAgICAKLSAgICAvKgotICAgICAqIEZpbmQgc3RyaW5nIGVudHJ5LgotICAgICAqLwotICAgIHRhcmdldF9pZCA9IChyZXNvdXJjZV9pZCA+PiA0KSArIDB4ODAwMTsKLSAgICBzdHJpbmdfbnVtID0gcmVzb3VyY2VfaWQgJiAweDAwMGY7Ci0KLSAgICBzaXplX3NoaWZ0ID0gRmluZFJlc291cmNlQnlOdW1iZXIoJm5hbWVpbmZvLCBORV9SU0NUWVBFX1NUUklORywgdGFyZ2V0X2lkKTsKLSAgICBpZiAoc2l6ZV9zaGlmdCA9PSAtMSkKLQlyZXR1cm4gMDsKLSAgICAKLSAgICBsc2VlayhDdXJyZW50TkVGaWxlLCAoaW50KSBuYW1laW5mby5vZmZzZXQgPDwgc2l6ZV9zaGlmdCwgU0VFS19TRVQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ19udW07IGkrKykKLSAgICB7Ci0JcmVhZChDdXJyZW50TkVGaWxlLCAmc3RyaW5nX2xlbmd0aCwgMSk7Ci0JbHNlZWsoQ3VycmVudE5FRmlsZSwgc3RyaW5nX2xlbmd0aCwgU0VFS19DVVIpOwotICAgIH0KLQkJCQotICAgIHJlYWQoQ3VycmVudE5FRmlsZSwgJnN0cmluZ19sZW5ndGgsIDEpOwotICAgIGkgPSBNSU4oc3RyaW5nX2xlbmd0aCwgYnVmbGVuIC0gMSk7Ci0gICAgcmVhZChDdXJyZW50TkVGaWxlLCBidWZmZXIsIGkpOwotICAgIGJ1ZmZlcltpXSA9ICdcMCc7Ci0jaWZkZWYgREVCVUdfUkVTT1VSQ0UKLSAgICBwcmludGYoIiAgICAgICAgICAgICclcydcbiIsIGJ1ZmZlcik7Ci0jZW5kaWYKLSAgICByZXR1cm4gaTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJTG9hZEljb24KICAqLwogSElDT04KQEAgLTI5Nyw2ICsyODcsNDMgQEAKICAgZnByaW50ZihzdGRlcnIsIkxvYWRBY2NlbGVyYXRvcnM6ICglZCksJWRcbiIsaW5zdGFuY2UsbHBUYWJsZU5hbWUpOwogICAgIHJldHVybiAwOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJRmluZFJlc291cmNlCVtLRVJORUwuNjBdCisgKi8KK0hBTkRMRSBGaW5kUmVzb3VyY2UoSEFORExFIGluc3RhbmNlLCBMUFNUUiByZXNvdXJjZV9uYW1lLCBMUFNUUiB0eXBlX25hbWUpCit7CisgICAgZnByaW50ZihzdGRlcnIsIkZpbmRSZXNvdXJjZTogKCVkKSwlZFxuIixpbnN0YW5jZSwgcmVzb3VyY2VfbmFtZSwgdHlwZV9uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCUxvYWRSZXNvdXJjZQlbS0VSTkVMLjYxXQorICovCitIQU5ETEUgTG9hZFJlc291cmNlKEhBTkRMRSBpbnN0YW5jZSwgSEFORExFIGhSZXNJbmZvKQoreworICAgIGZwcmludGYoc3RkZXJyLCJMb2FkUmVzb3VyY2U6ICglZCksJWRcbiIsaW5zdGFuY2UsIGhSZXNJbmZvKTsKKyAgICByZXR1cm4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJTG9ja1Jlc291cmNlCVtLRVJORUwuNjJdCisgKi8KK0xQU1RSIExvY2tSZXNvdXJjZShIQU5ETEUgaFJlc0RhdGEpCit7CisgICAgZnByaW50ZihzdGRlcnIsIkxvY2tSZXNvdXJjZTogJWRcbiIsIGhSZXNEYXRhKTsKKyAgICByZXR1cm4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJRnJlZVJlc291cmNlCVtLRVJORUwuNjNdCisgKi8KK0JPT0wgRnJlZVJlc291cmNlKEhBTkRMRSBoUmVzRGF0YSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwiRnJlZVJlc291cmNlOiAlZFxuIiwgaFJlc0RhdGEpOworICAgIHJldHVybiA7Cit9CisKIAwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJUlNDX0xvYWRSZXNvdXJjZQpAQCAtMzE3LDEwICszNDQsMTMgQEAKICAgICB7CiAJcmV0dXJuIDA7CiAgICAgfQorICAgIGVsc2UgaWYgKE9wZW5SZXNvdXJjZUZpbGUoaW5zdGFuY2UpIDwgMCkKKwlyZXR1cm4gMDsKKyAgICAKICAgICAvKgogICAgICAqIEdldCByZXNvdXJjZSBieSBvcmRpbmFsCiAgICAgICovCi0gICAgZWxzZSBpZiAoKChpbnQpIHJzY19uYW1lICYgMHhmZmZmMDAwMCkgPT0gMCkKKyAgICBpZiAoKChpbnQpIHJzY19uYW1lICYgMHhmZmZmMDAwMCkgPT0gMCkKICAgICB7CiAJc2l6ZV9zaGlmdCA9IEZpbmRSZXNvdXJjZUJ5TnVtYmVyKCZuYW1laW5mbywgdHlwZSwKIAkJCQkJICAoaW50KSByc2NfbmFtZSB8IDB4ODAwMCk7CkBAIC0zMzgsNyArMzY4LDcgQEAKICAgICAvKgogICAgICAqIFJlYWQgcmVzb3VyY2UuCiAgICAgICovCi0gICAgbHNlZWsoQ3VycmVudE5FRmlsZSwgKChpbnQpIG5hbWVpbmZvLm9mZnNldCA8PCBzaXplX3NoaWZ0KSwgU0VFS19TRVQpOworICAgIGxzZWVrKFJlc291cmNlRmQsICgoaW50KSBuYW1laW5mby5vZmZzZXQgPDwgc2l6ZV9zaGlmdCksIFNFRUtfU0VUKTsKIAogICAgIGltYWdlX3NpemUgPSBuYW1laW5mby5sZW5ndGggPDwgc2l6ZV9zaGlmdDsKICAgICBpZiAoaW1hZ2Vfc2l6ZV9yZXQgIT0gTlVMTCkKQEAgLTM0Niw3ICszNzYsNyBAQAogICAgIAogICAgIGhtZW0gPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBpbWFnZV9zaXplKTsKICAgICBpbWFnZSA9IEdsb2JhbExvY2soaG1lbSk7Ci0gICAgaWYgKGltYWdlID09IE5VTEwgfHwgcmVhZChDdXJyZW50TkVGaWxlLCBpbWFnZSwgaW1hZ2Vfc2l6ZSkgIT0gaW1hZ2Vfc2l6ZSkKKyAgICBpZiAoaW1hZ2UgPT0gTlVMTCB8fCByZWFkKFJlc291cmNlRmQsIGltYWdlLCBpbWFnZV9zaXplKSAhPSBpbWFnZV9zaXplKQogICAgIHsKIAlHbG9iYWxGcmVlKGhtZW0pOwogCXJldHVybiAwOwpAQCAtMzU3LDYgKzM4Nyw0NiBAQAogfQogDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQlMb2FkU3RyaW5nCisgKi8KK2ludAorTG9hZFN0cmluZyhIQU5ETEUgaW5zdGFuY2UsIFdPUkQgcmVzb3VyY2VfaWQsIExQU1RSIGJ1ZmZlciwgaW50IGJ1ZmxlbikKK3sKKyAgICBIQU5ETEUgaG1lbTsKKyAgICBpbnQgcnNjX3NpemU7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICBpbnQgc3RyaW5nX251bTsKKyAgICBpbnQgaTsKKworI2lmZGVmIERFQlVHX1JFU09VUkNFCisgICAgcHJpbnRmKCJMb2FkU3RyaW5nOiBpbnN0YW5jZSA9ICUwNHgsIGlkID0gJWQsICIKKwkgICAiYnVmZmVyID0gJTA4eCwgbGVuZ3RoID0gJWRcbiIsCisJICAgaW5zdGFuY2UsIHJlc291cmNlX2lkLCBidWZmZXIsIGJ1Zmxlbik7CisjZW5kaWYKKworICAgIGhtZW0gPSBSU0NfTG9hZFJlc291cmNlKGluc3RhbmNlLCAoY2hhciAqKSAocmVzb3VyY2VfaWQgPj4gNCksCisJCQkgICAgTkVfUlNDVFlQRV9TVFJJTkcsICZyc2Nfc2l6ZSk7CisgICAgaWYgKGhtZW0gPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAKKyAgICBwID0gR2xvYmFsTG9jayhobWVtKTsKKyAgICBzdHJpbmdfbnVtID0gcmVzb3VyY2VfaWQgJiAweDAwMGY7CisgICAgZm9yIChpID0gMDsgaSA8IHJlc291cmNlX2lkOyBpKyspCisJcCArPSAqcDsKKyAgICAKKyAgICBpID0gTUlOKGJ1ZmxlbiAtIDEsICpwKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBwICsgMSwgaSk7CisgICAgYnVmZmVyW2ldID0gJ1wwJzsKKworICAgIEdsb2JhbEZyZWUoaG1lbSk7CisKKyNpZmRlZiBERUJVR19SRVNPVVJDRQorICAgIHByaW50ZigiICAgICAgICAgICAgJyVzJ1xuIiwgYnVmZmVyKTsKKyNlbmRpZgorICAgIHJldHVybiBpOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQlSU0NfTG9hZE1lbnUKICAqLwogSEFORExFCkBAIC00MDMsMyArNDczLDUgQEAKICAgICBSZWxlYXNlREMoIDAsIGhkYyApOwogICAgIHJldHVybiBoYml0bWFwOwogfQorCisKZGlmZiAtLWdpdCBhL2xvYWRlci9zZWxlY3Rvci5jIGIvbG9hZGVyL3NlbGVjdG9yLmMKaW5kZXggNGVjYjQ0OC4uNDg5ZGZkNiAxMDA2NDQKLS0tIGEvbG9hZGVyL3NlbGVjdG9yLmMKKysrIGIvbG9hZGVyL3NlbGVjdG9yLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIHVuc2lnbmVkIGNoYXIgcmFuX291dCA9IDA7CiB1bnNpZ25lZCBzaG9ydCBTZWxlY3Rvck93bmVyc1tNQVhfU0VMRUNUT1JTXTsKIAotc3RhdGljIGludCBuZXh0X3VudXNlZF9zZWxlY3RvciA9IDg7CitzdGF0aWMgaW50IG5leHRfdW51c2VkX3NlbGVjdG9yID0gRklSU1RfU0VMRUNUT1I7CiBleHRlcm4gdm9pZCBLRVJORUxfT3JkaW5hbF8xMDIoKTsKIGV4dGVybiB2b2lkIFVOSVhMSUJfT3JkaW5hbF8wKCk7CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCAzOWY0MDgwLi5hMjQwMTA0IDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC02LDkgKzYsMTUgQEAKICNpbmNsdWRlIDxzeXNjYWxsLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBsaW51eAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2VuZGlmCiAgCitjaGFyICogY3N0YWNrWzQwOTZdOworc3RydWN0IHNpZ2FjdGlvbiBzZWd2X2FjdDsKKworI2lmZGVmIGxpbnV4CiBleHRlcm4gdm9pZCBfX19zaWdfcmVzdG9yZSgpOwogZXh0ZXJuIHZvaWQgX19fbWFza3NpZ19yZXN0b3JlKCk7CiAKQEAgLTI2LDMzICszMiwzNiBAQAogCXJldHVybiAtMTsKIH0KIAotY2hhciAqIGNzdGFja1s0MDk2XTsKLXN0cnVjdCBzaWdhY3Rpb24gc2Vndl9hY3Q7Ci0KIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOwotCXVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKLQl1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7Ci0JdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOwotCXVuc2lnbmVkIGxvbmcgZWRpOwotCXVuc2lnbmVkIGxvbmcgZXNpOwotCXVuc2lnbmVkIGxvbmcgZWJwOwotCXVuc2lnbmVkIGxvbmcgZXNwOwotCXVuc2lnbmVkIGxvbmcgZWJ4OwotCXVuc2lnbmVkIGxvbmcgZWR4OwotCXVuc2lnbmVkIGxvbmcgZWN4OwotCXVuc2lnbmVkIGxvbmcgZWF4OwotCXVuc2lnbmVkIGxvbmcgdHJhcG5vOwotCXVuc2lnbmVkIGxvbmcgZXJyOwotCXVuc2lnbmVkIGxvbmcgZWlwOwotCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKLQl1bnNpZ25lZCBsb25nIGVmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBzY19ncywgX19nc2g7CisJdW5zaWduZWQgc2hvcnQgc2NfZnMsIF9fZnNoOworCXVuc2lnbmVkIHNob3J0IHNjX2VzLCBfX2VzaDsKKwl1bnNpZ25lZCBzaG9ydCBzY19kcywgX19kc2g7CisJdW5zaWduZWQgbG9uZyBzY19lZGk7CisJdW5zaWduZWQgbG9uZyBzY19lc2k7CisJdW5zaWduZWQgbG9uZyBzY19lYnA7CisJdW5zaWduZWQgbG9uZyBzY19lc3A7CisJdW5zaWduZWQgbG9uZyBzY19lYng7CisJdW5zaWduZWQgbG9uZyBzY19lZHg7CisJdW5zaWduZWQgbG9uZyBzY19lY3g7CisJdW5zaWduZWQgbG9uZyBzY19lYXg7CisJdW5zaWduZWQgbG9uZyBzY190cmFwbm87CisJdW5zaWduZWQgbG9uZyBzY19lcnI7CisJdW5zaWduZWQgbG9uZyBzY19laXA7CisJdW5zaWduZWQgc2hvcnQgc2NfY3MsIF9fY3NoOworCXVuc2lnbmVkIGxvbmcgc2NfZWZsYWdzOwogCXVuc2lnbmVkIGxvbmcgZXNwX2F0X3NpZ25hbDsKLQl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisJdW5zaWduZWQgc2hvcnQgc2Nfc3MsIF9fc3NoOwogCXVuc2lnbmVkIGxvbmcgaTM4NzsKIAl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CiAJdW5zaWduZWQgbG9uZyBjcjI7CiB9OworI2VuZGlmCisKKyNpZmRlZiBfX05ldEJTRF9fCisjZGVmaW5lIHNpZ2NvbnRleHRfc3RydWN0IHNpZ2NvbnRleHQKKyNkZWZpbmUgSFogMTAwCisjZW5kaWYKIAogc3RhdGljIHZvaWQKIEdldFRpbWVEYXRlKGludCB0aW1lX2ZsYWcsIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqIGNvbnRleHQpCkBAIC02NCwxNSArNzMsMTUgQEAKICAgICBub3cgPSBsb2NhbHRpbWUoJmx0aW1lKTsKICAgICBpZiAodGltZV9mbGFnKQogICAgIHsKLQkgY29udGV4dC0+ZWN4ID0gKG5vdy0+dG1faG91ciA8PCA4KSB8IG5vdy0+dG1fbWluOwotCSBjb250ZXh0LT5lZHggPSBub3ctPnRtX3NlYyA8PCA4OworCSBjb250ZXh0LT5zY19lY3ggPSAobm93LT50bV9ob3VyIDw8IDgpIHwgbm93LT50bV9taW47CisJIGNvbnRleHQtPnNjX2VkeCA9IG5vdy0+dG1fc2VjIDw8IDg7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0JY29udGV4dC0+ZWN4ID0gbm93LT50bV95ZWFyICsgMTkwMDsKLQljb250ZXh0LT5lZHggPSAoKG5vdy0+dG1fbW9uICsgMSkgPDwgOCkgfCBub3ctPnRtX21kYXk7Ci0JY29udGV4dC0+ZWF4ICY9IDB4ZmYwMDsKLQljb250ZXh0LT5lYXggfD0gbm93LT50bV93ZGF5OworCWNvbnRleHQtPnNjX2VjeCA9IG5vdy0+dG1feWVhciArIDE5MDA7CisJY29udGV4dC0+c2NfZWR4ID0gKChub3ctPnRtX21vbiArIDEpIDw8IDgpIHwgbm93LT50bV9tZGF5OworCWNvbnRleHQtPnNjX2VheCAmPSAweGZmMDA7CisJY29udGV4dC0+c2NfZWF4IHw9IG5vdy0+dG1fd2RheTsKICAgICB9CiB9CiAKQEAgLTgyLDEyICs5MSwxMiBAQAogCiBzdGF0aWMgaW50CiBkb19pbnQyMShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKiBjb250ZXh0KXsKLQlmcHJpbnRmKHN0ZGVyciwiRG9pbmcgaW50MjEgJXggICAiLCAoY29udGV4dC0+ZWF4ID4+IDgpICYgMHhmZik7Ci0Jc3dpdGNoKChjb250ZXh0LT5lYXggPj4gOCkgJiAweGZmKXsKKwlmcHJpbnRmKHN0ZGVyciwiRG9pbmcgaW50MjEgJXggICAiLCAoY29udGV4dC0+c2NfZWF4ID4+IDgpICYgMHhmZik7CisJc3dpdGNoKChjb250ZXh0LT5zY19lYXggPj4gOCkgJiAweGZmKXsKIAljYXNlIDB4MzA6Ci0JCWNvbnRleHQtPmVheCA9IDB4MDMwMzsgIC8qIEhleSBmb2xrcywgdGhpcyBpcyBET1MgVjMuMyEgKi8KLQkJY29udGV4dC0+ZWJ4ID0gMDsKLQkJY29udGV4dC0+ZWN4ID0gMDsKKwkJY29udGV4dC0+c2NfZWF4ID0gMHgwMzAzOyAgLyogSGV5IGZvbGtzLCB0aGlzIGlzIERPUyBWMy4zISAqLworCQljb250ZXh0LT5zY19lYnggPSAwOworCQljb250ZXh0LT5zY19lY3ggPSAwOwogCQlicmVhazsKIAkKIAkJLyogSWdub3JlIGFueSBhdHRlbXB0IHRvIHNldCBhIHNlZ21lbnQgdmVjdG9yICovCkBAIC05Niw4ICsxMDUsOCBAQAogCiAJY2FzZSAweDM1OiAgLyogUmV0dXJuIGEgTlVMTCBzZWdtZW50IHNlbGVjdG9yIC0gdGhpcyB3aWxsIGJvbWIKIAkJICAgICAgIGlmIGFueW9uZSBldmVyIHRyaWVzIHRvIHVzZSBpdCAqLwotCQljb250ZXh0LT5lcyA9IDA7Ci0JCWNvbnRleHQtPmVieCA9IDA7CisJCWNvbnRleHQtPnNjX2VzID0gMDsKKwkJY29udGV4dC0+c2NfZWJ4ID0gMDsKIAkJYnJlYWs7CiAJCQogCWNhc2UgMHgyYToKQEAgLTEwOSwxMSArMTE4LDExIEBACiAJCS8qIEZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiAqLwogCiAJY2FzZSAweDRjOgotCQlleGl0KGNvbnRleHQtPmVheCAmIDB4ZmYpOworCQlleGl0KGNvbnRleHQtPnNjX2VheCAmIDB4ZmYpOwogCQkKIAogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gaGFuZGxlIGludCAweDIxICV4XG4iLCBjb250ZXh0LT5lYXgpOworCQlmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGhhbmRsZSBpbnQgMHgyMSAleFxuIiwgY29udGV4dC0+c2NfZWF4KTsKIAkJcmV0dXJuIDE7CiAJfTsKIAlyZXR1cm4gMTsKQEAgLTEyNCw0MSArMTMzLDUzIEBACiAJdGltZV90IGx0aW1lOwogCWludCB0aWNrczsKIAotCXN3aXRjaCgoY29udGV4dC0+ZWF4ID4+IDgpICYgMHhmZil7CisJc3dpdGNoKChjb250ZXh0LT5zY19lYXggPj4gOCkgJiAweGZmKXsKIAljYXNlIDA6CiAJCWx0aW1lID0gdGltZShOVUxMKTsKIAkJdGlja3MgPSAoaW50KSAobHRpbWUgKiBIWik7Ci0JCWNvbnRleHQtPmVjeCA9IHRpY2tzID4+IDE2OwotCQljb250ZXh0LT5lZHggPSB0aWNrcyAmIDB4MDAwMEZGRkY7Ci0JCWNvbnRleHQtPmVheCA9IDA7ICAvKiBObyBtaWRuaWdodCByb2xsb3ZlciAqLworCQljb250ZXh0LT5zY19lY3ggPSB0aWNrcyA+PiAxNjsKKwkJY29udGV4dC0+c2NfZWR4ID0gdGlja3MgJiAweDAwMDBGRkZGOworCQljb250ZXh0LT5zY19lYXggPSAwOyAgLyogTm8gbWlkbmlnaHQgcm9sbG92ZXIgKi8KIAkJYnJlYWs7CiAJCiAJZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBoYW5kbGUgaW50IDB4MUEgJXhcbiIsIGNvbnRleHQtPmVheCk7CisJCWZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gaGFuZGxlIGludCAweDFBICV4XG4iLCBjb250ZXh0LT5zY19lYXgpOwogCQlyZXR1cm4gMTsKIAl9OwogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCB3aW5fc2VnZmF1bHQoaW50IHNpZ25hbCwgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHQpeworI2lmZGVmIGxpbnV4CitzdGF0aWMgdm9pZCB3aW5fZmF1bHQoaW50IHNpZ25hbCwgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHQpeworICAgICAgICBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKnNjcCA9ICZjb250ZXh0OworI2Vsc2UKK3N0YXRpYyB2b2lkIHdpbl9mYXVsdChpbnQgc2lnbmFsLCBpbnQgY29kZSwgc3RydWN0IHNpZ2NvbnRleHQgKnNjcCl7CisjZW5kaWYKIAl1bnNpZ25lZCBjaGFyICogaW5zdHI7CiAJdW5zaWduZWQgY2hhciBpbnRubzsKIAl1bnNpZ25lZCBpbnQgKiBkdW1wOwogCWludCBpOwogCiAJLyogRmlyc3QgdGFrZSBjYXJlIG9mIGEgZmV3IHByZWxpbWluYXJpZXMgKi8KKyNpZmRlZiBsaW51eAogCWlmKHNpZ25hbCAhPSBTSUdTRUdWKSBleGl0KDEpOwotCWlmKChjb250ZXh0LmNzICYgNykgIT0gNyl7CisJaWYoKHNjcC0+c2NfY3MgJiA3KSAhPSA3KXsKKyNlbmRpZgorI2lmZGVmIF9fTmV0QlNEX18KKy8qICAgICAgICAgc2V0X2VzKDB4MjcpOyBzZXRfZHMoMHgyNyk7ICovCisJaWYoc2lnbmFsICE9IFNJR0JVUykgZXhpdCgxKTsKKwlpZihzY3AtPnNjX2NzID09IDB4MWYpeworI2VuZGlmCiAJCWZwcmludGYoc3RkZXJyLAogCQkJIlNlZ21lbnRhdGlvbiBmYXVsdCBpbiBXaW5lIHByb2dyYW0gKCV4OiV4KS4iCiAJCQkiICBQbGVhc2UgZGVidWdcbiIsCi0JCQljb250ZXh0LmNzLCBjb250ZXh0LmVpcCk7CisJCQlzY3AtPnNjX2NzLCBzY3AtPnNjX2VpcCk7CiAJCWdvdG8gb29wczsKIAl9OwogCiAJLyogIE5vdyB0YWtlIGEgbG9vayBhdCB0aGUgYWN0dWFsIGluc3RydWN0aW9uIHdoZXJlIHRoZSBwcm9ncmFtCiAJICAgIGJvbWJlZCAqLwotCWluc3RyID0gKGNoYXIgKikgKChjb250ZXh0LmNzIDw8IDE2KSB8IChjb250ZXh0LmVpcCAmIDB4ZmZmZikpOworCWluc3RyID0gKGNoYXIgKikgKChzY3AtPnNjX2NzIDw8IDE2KSB8IChzY3AtPnNjX2VpcCAmIDB4ZmZmZikpOwogCiAJaWYoKmluc3RyICE9IDB4Y2QpIHsKIAkJZnByaW50ZihzdGRlcnIsCkBAIC0xNzUsMTAgKzE5NiwxMCBAQAogCWludG5vID0gKmluc3RyOwogCXN3aXRjaChpbnRubyl7CiAJY2FzZSAweDIxOgotCQlpZighZG9faW50MjEoJmNvbnRleHQpKSBnb3RvIG9vcHM7CisJCWlmKCFkb19pbnQyMShzY3ApKSBnb3RvIG9vcHM7CiAJCWJyZWFrOwogCWNhc2UgMHgxQToKLQkJaWYoIWRvX2ludDFBKCZjb250ZXh0KSkgZ290byBvb3BzOworCQlpZighZG9faW50MUEoc2NwKSkgZ290byBvb3BzOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlmcHJpbnRmKHN0ZGVyciwiVW5leHBlY3RlZCBXaW5kb3dzIGludGVycnVwdCAleFxuIiwgaW50bm8pOwpAQCAtMTg3LDEzICsyMDgsMTYgQEAKIAogCS8qIE9LLCBkb25lIGhhbmRsaW5nIHRoZSBpbnRlcnJ1cHQgKi8KIAotCWNvbnRleHQuZWlwICs9IDI7ICAvKiBCeXBhc3MgdGhlIGludCBpbnN0cnVjdGlvbiAqLworCXNjcC0+c2NfZWlwICs9IDI7ICAvKiBCeXBhc3MgdGhlIGludCBpbnN0cnVjdGlvbiAqLwogCXJldHVybjsKIAogIG9vcHM6Ci0JZnByaW50ZihzdGRlcnIsIkluIHdpbl9zZWdmYXVsdCAleDoleFxuIiwgY29udGV4dC5jcywgY29udGV4dC5laXApOwotCWZwcmludGYoc3RkZXJyLCJTdGFjazogJXg6JXhcbiIsIGNvbnRleHQuc3MsIGNvbnRleHQuZXNwX2F0X3NpZ25hbCk7Ci0JZHVtcCA9IChpbnQqKSAmY29udGV4dDsKKwlmcHJpbnRmKHN0ZGVyciwiSW4gd2luX2ZhdWx0ICV4OiV4XG4iLCBzY3AtPnNjX2NzLCBzY3AtPnNjX2VpcCk7CisjaWZkZWYgbGludXgKKwl3aW5lX2RlYnVnKHNjcCk7ICAvKiBFbnRlciBvdXIgZGVidWdnZXIgKi8KKyNlbHNlCisJZnByaW50ZihzdGRlcnIsIlN0YWNrOiAleDoleFxuIiwgc2NwLT5zY19zcywgc2NwLT5zY19lc3ApOworCWR1bXAgPSAoaW50Kikgc2NwOwogCWZvcihpPTA7IGk8MjI7IGkrKykgCiAJewogCSAgICBmcHJpbnRmKHN0ZGVyciwiICU4Ljh4IiwgKmR1bXArKyk7CkBAIC0yMDIsMTUgKzIyNiwzNyBAQAogCX0KIAlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKIAlleGl0KDEpOworI2VuZGlmCiB9CiAKIGludAogaW5pdF93aW5lX3NpZ25hbHMoKXsKLQlzZWd2X2FjdC5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSB3aW5fc2VnZmF1bHQ7CisjaWZkZWYgbGludXgKKwlzZWd2X2FjdC5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSB3aW5fZmF1bHQ7CiAJLyogUG9pbnQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG1pbnVzIDQganVzdCBpbiBjYXNlLCBhbmQgbWFrZQogCSAgIGl0IGFsaWduZWQgICovCiAJc2Vndl9hY3Quc2FfcmVzdG9yZXIgPSAKIAkJKHZvaWQgKCopKCkpICgoKHVuc2lnbmVkIGludCkoY3N0YWNrICsgc2l6ZW9mKGNzdGFjaykgLSA0KSkgJiB+Myk7CiAJd2luZV9zaWdhY3Rpb24oU0lHU0VHViwgJnNlZ3ZfYWN0LCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIF9fTmV0QlNEX18KKyAgICAgICAgc3RydWN0IHNpZ3N0YWNrIHNzOworICAgICAgICBzaWdzZXRfdCBzaWdfbWFzazsKKyAgICAgICAgCisgICAgICAgIHNzLnNzX3NwID0gKGNoYXIgKikgKCgodW5zaWduZWQgaW50KShjc3RhY2sgKyBzaXplb2YoY3N0YWNrKSAtIDQpKSAmIH4zKTsKKyAgICAgICAgc3Muc3Nfb25zdGFjayA9IDA7CisgICAgICAgIGlmIChzaWdzdGFjaygmc3MsIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgICAgIHBlcnJvcigic2lnc3RhY2siKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHNpZ2VtcHR5c2V0KCZzaWdfbWFzayk7CisgICAgICAgIHNlZ3ZfYWN0LnNhX2hhbmRsZXIgPSAoX19zaWdoYW5kbGVyX3QpIHdpbl9mYXVsdDsKKwlzZWd2X2FjdC5zYV9mbGFncyA9IFNBX09OU1RBQ0s7CisgICAgICAgIHNlZ3ZfYWN0LnNhX21hc2sgPSBzaWdfbWFzazsKKwlpZiAoc2lnYWN0aW9uKFNJR0JVUywgJnNlZ3ZfYWN0LCBOVUxMKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoInNpZ2FjdGlvbiIpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9sb2FkZXIvd2luZS5jIGIvbG9hZGVyL3dpbmUuYwppbmRleCBhZDI2ODI0Li4xY2Q3N2EwIDEwMDY0NAotLS0gYS9sb2FkZXIvd2luZS5jCisrKyBiL2xvYWRlci93aW5lLmMKQEAgLTYzLDggKzYzLDM4IEBACiAgICAgZXhpdCgxKTsKIH0KIAwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJR2V0RmlsZW5hbWVGcm9tSW5zdGFuY2UKKyAqLworY2hhciAqCitHZXRGaWxlbmFtZUZyb21JbnN0YW5jZSh1bnNpZ25lZCBzaG9ydCBpbnN0YW5jZSkKK3sKKyAgICByZWdpc3RlciBzdHJ1Y3Qgd19maWxlcyAqdyA9IHdpbmVfZmlsZXM7CiAKLS8qIExvYWQgb25lIE5FIGZvcm1hdCBleGVjdXRhYmxlIGludG8gbWVtb3J5ICovCisgICAgd2hpbGUgKHcgJiYgdy0+aGluc3RhbmNlICE9IGluc3RhbmNlKQorCXcgPSB3LT5uZXh0OworICAgIAorICAgIGlmICh3KQorCXJldHVybiB3LT5maWxlbmFtZTsKKyAgICBlbHNlCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCB3X2ZpbGVzICoKK0dldEZpbGVJbmZvKHVuc2lnbmVkIHNob3J0IGluc3RhbmNlKQoreworICAgIHJlZ2lzdGVyIHN0cnVjdCB3X2ZpbGVzICp3ID0gd2luZV9maWxlczsKKworICAgIHdoaWxlICh3ICYmIHctPmhpbnN0YW5jZSAhPSBpbnN0YW5jZSkKKwl3ID0gdy0+bmV4dDsKKyAgICAKKyAgICByZXR1cm4gdzsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJTG9hZEltYWdlCisgKiBMb2FkIG9uZSBORSBmb3JtYXQgZXhlY3V0YWJsZSBpbnRvIG1lbW9yeQorICovCiBMb2FkSW1hZ2UoY2hhciAqIGZpbGVuYW1lLCAgY2hhciAqIG1vZHVsZW5hbWUpCiB7CiAgICAgdW5zaWduZWQgaW50IHJlYWRfc2l6ZTsKQEAgLTE0Myw2ICsxNzMsOSBAQAogICAgIGlmIChyZWFkKHdwbnQtPmZkLCB3cG50LT5zZWdfdGFibGUsIHJlYWRfc2l6ZSkgIT0gcmVhZF9zaXplKQogCW15ZXJyb3IoIlVuYWJsZSB0byByZWFkIHNlZ21lbnQgdGFibGUgaGVhZGVyIGZyb20gZmlsZSIpOwogICAgIHdwbnQtPnNlbGVjdG9yX3RhYmxlID0gQ3JlYXRlU2VsZWN0b3JzKHdwbnQpOworICAgIHdwbnQtPmhpbnN0YW5jZSAKKwk9IHdwbnQtPgorCSAgICBzZWxlY3Rvcl90YWJsZVt3aW5lX2ZpbGVzLT5uZV9oZWFkZXItPmF1dG9fZGF0YV9zZWctMV0uc2VsZWN0b3I7CiAKICAgICAvKiBHZXQgdGhlIGxvb2t1cCAgdGFibGUuICBUaGlzIGlzIHVzZWQgZm9yIGxvb2tpbmcgdXAgdGhlIGFkZHJlc3NlcwogICAgICAgIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSBleHBvcnRlZCAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9NYWtlZmlsZSBiL21pc2MvTWFrZWZpbGUKaW5kZXggZmFlZWViNi4uMGQ1ZmE4MSAxMDA2NDQKLS0tIGEvbWlzYy9NYWtlZmlsZQorKysgYi9taXNjL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogQ0ZMQUdTPSQoQ09QVFMpICQoREVCVUdPUFRTKSAtSSQoSU5DTFVERV9ESVIpCiAKIE9CSlM9ZG9zLm8ga2VybmVsLm8gdXNlci5vIHh0Lm8gcmVjdC5vIGZpbGUubyBzb3VuZC5vIGVtdWxhdGUubyBcCi0gICAgIGtleWJvYXJkLm8gcHJvZmlsZS5vCisgICAgIGtleWJvYXJkLm8gcHJvZmlsZS5vIGxzdHIubwogCiBkZWZhdWx0OiBtaXNjLm8KIApkaWZmIC0tZ2l0IGEvbWlzYy9maWxlLmMgYi9taXNjL2ZpbGUuYwppbmRleCAyYTEzODhhLi41NTlmYWMwIDEwMDY0NAotLS0gYS9taXNjL2ZpbGUuYworKysgYi9taXNjL2ZpbGUuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCisjZGVmaW5lIE9QRU5fTUFYIDI1NgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBpbmZvbWF0aW9uIG5lZWRlZCBmb3IgYSBzaW5nbGUgRE9TIGRyaXZlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWlzYy9rZXlib2FyZC5jIGIvbWlzYy9rZXlib2FyZC5jCmluZGV4IGIwMWI2OWYuLmNjNGIwMTcgMTAwNjQ0Ci0tLSBhL21pc2Mva2V5Ym9hcmQuYworKysgYi9taXNjL2tleWJvYXJkLmMKQEAgLTExLDYgKzExLDggQEAKICAgcmV0dXJuIC0xOwogfQogCisjaWZkZWYgIEJPR1VTX0FOU0lfT0VNCisKIGludCBBbnNpVG9PZW0oTFBTVFIgbHBBbnNpU3RyLCBMUFNUUiBscE9lbVN0cikKIHsKICAgcHJpbnRmKCJBbnNpVG9PZW0gKCVzKVxuIixscEFuc2lTdHIpOwpAQCAtMjUsNiArMjcsOCBAQAogICByZXR1cm4gLTE7CiB9CiAKKyNlbmRpZgorCiBEV09SRCBPZW1LZXlTY2FuKFdPUkQgd09lbUNoYXIpCiB7CiAgIHByaW50ZigiKk9lbUtleVNjYW4gKCVkKVxuIix3T2VtQ2hhcik7CkBAIC04NCw2ICs4OCw4IEBACiAgIHJldHVybiAwOwogfQogCisjaWZkZWYgIEJPR1VTX0FOU0lfT0VNCisKIHZvaWQgQW5zaVRvT2VtQnVmZihMUFNUUiBscEFuc2lTdHIsIExQU1RSIGxwT2VtU3RyLCBpbnQgbkxlbmd0aCkKIHsKICAgcHJpbnRmKCJBbnNpVG9PZW1CdWZmKCVzLDxwdHI+LCVkKVxuIixscEFuc2lTdHIsbkxlbmd0aCk7CkBAIC05Niw2ICsxMDIsNyBAQAogICBzdHJuY3B5KGxwQW5zaVN0cixscE9lbVN0cixuTGVuZ3RoKTsgIC8qIHNob3VsZCB0cmFuc2xhdGUuLi4gKi8KIH0KIAorI2VuZGlmCiAKIAogCmRpZmYgLS1naXQgYS9taXNjL2xzdHIuYyBiL21pc2MvbHN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjIyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL2xzdHIuYwpAQCAtMCwwICsxLDIxMyBAQAorc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBZbmd2aSBTaWd1cmpvbnNzb24gKHluZ3ZpQGhhZnJvLmlzKSwgMTk5MyI7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKKyNpbmNsdWRlICJyZWdmdW5jLmgiCisjaW5jbHVkZSAid2luZG93cy5oIgorCisKKyNkZWZpbmUgTFBDU1RSIExQU1RSICAvKiBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNvbnN0IGNoYXIgKiovCit0eXBlZGVmICB1bnNpZ25lZCBzaG9ydCBVSU5UOworCisgIC8qIEZ1bm55IHRvIGRpdmlkZSB0aGVtIGJldHdlZW4gdXNlciBhbmQga2VybmVsLiAqLworCisvKiBLRVJORUwuODkgKi8KK0xQU1RSIGxzdHJjYXQoTFBTVFIgdGFyZ2V0LExQQ1NUUiBzb3VyY2UpCit7CisgIGZwcmludGYoc3RkZXJyLCJsc3RyY2F0KCVzLCVzKVxuIix0YXJnZXQsc291cmNlKTsKKyAgcmV0dXJuIHN0cmNhdCh0YXJnZXQsc291cmNlKTsKK30KKworLyogVVNFUi40MzAgKi8KK2ludCBsc3RyY21wKExQQ1NUUiBzdHIxLExQQ1NUUiBzdHIyKQoreworICByZXR1cm4gc3RyY21wKHN0cjEsc3RyMik7Cit9CisKKy8qIFVTRVIuNDcxICovCitpbnQgbHN0cmNtcGkoTFBDU1RSIHN0cjEsTFBDU1RSIHN0cjIpCit7CisgIGludCBpOworICBpPTA7CisgIHdoaWxlKCh0b3VwcGVyKHN0cjFbaV0pPT10b3VwcGVyKHN0cjJbaV0pKSYmKHN0cjFbaV0hPTApKQorICAgIGkrKzsKKyAgcmV0dXJuIHRvdXBwZXIoc3RyMVtpXSktdG91cHBlcihzdHIyW2ldKTsKK30KKworLyogS0VSTkVMLjg4ICovCitMUFNUUiBsc3RyY3B5KExQU1RSIHRhcmdldCxMUENTVFIgc291cmNlKQoreworICByZXR1cm4gc3RyY3B5KHRhcmdldCxzb3VyY2UpOworfQorCisvKiBLRVJORUwuMzUzICovCitMUFNUUiBsc3RyY3B5bihMUFNUUiB0YXJnZXQsTFBDU1RSIHNvdXJjZSxpbnQgbikKK3sKKyAgcmV0dXJuIHN0cm5jcHkodGFyZ2V0LHNvdXJjZSxuKTsKK30KKworLyogS0VSTkVMLjkwICovCitpbnQgbHN0cmxlbihMUENTVFIgc3RyKQoreworICBzdHJsZW4oc3RyKTsKK30KKworLyogQW5zaVVwcGVyIFVTRVIuNDMxICovCitjaGFyIEZBUiogQW5zaVVwcGVyKGNoYXIgRkFSKiBzdHJPckNoYXIpCit7CisgIC8qIEkgYW0gbm90IHN1cmUgaWYgdGhlIGxvY2FsZSBzdHVmZiB3b3JrcyB3aXRoIHRvdXBwZXIsIGJ1dCB0aGVuIGFnYWluIAorICAgICBJIGFtIG5vdCBzdXJlIGlmIHRoZSBMaW51eCBsaWJjIGxvY2FsZSBzdHVmZnMgd29ya3MgYXQgYWxsICovCisgIGlmKChpbnQpc3RyT3JDaGFyPDI1NikKKyAgICByZXR1cm4gKGNoYXIgRkFSKikgdG91cHBlcigoaW50KXN0ck9yQ2hhcik7CisgIGVsc2UgeworICAgIGludCBpOworICAgIGZvcihpPTA7KGk8NjU1MzYpJiZzdHJPckNoYXJbaV07aSsrKQorICAgICAgc3RyT3JDaGFyW2ldPXRvdXBwZXIoc3RyT3JDaGFyW2ldKTsKKyAgICByZXR1cm4gc3RyT3JDaGFyOwkKKyAgfQorfQorCisvKiBBbnNpTG93ZXIgVVNFUi40MzIgKi8KK2NoYXIgRkFSKiBBbnNpTG93ZXIoY2hhciBGQVIqIHN0ck9yQ2hhcikKK3sKKyAgLyogSSBhbSBub3Qgc3VyZSBpZiB0aGUgbG9jYWxlIHN0dWZmIHdvcmtzIHdpdGggdG9sb3dlciwgYnV0IHRoZW4gYWdhaW4gCisgICAgIEkgYW0gbm90IHN1cmUgaWYgdGhlIExpbnV4IGxpYmMgbG9jYWxlIHN0dWZmcyB3b3JrcyBhdCBhbGwgKi8KKyAgaWYoKGludClzdHJPckNoYXI8MjU2KQorICAgIHJldHVybiAoY2hhciBGQVIqKXRvbG93ZXIoKGludClzdHJPckNoYXIpOworICBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IoaT0wOyhpPDY1NTM2KSYmc3RyT3JDaGFyW2ldO2krKykKKyAgICAgIHN0ck9yQ2hhcltpXT10b2xvd2VyKHN0ck9yQ2hhcltpXSk7CisgICAgcmV0dXJuIHN0ck9yQ2hhcjsJCisgIH0KK30KKworLyogQW5zaVVwcGVyQnVmZiBVU0VSLjQzNyAqLworVUlOVCBBbnNpVXBwZXJCdWZmKExQU1RSIHN0cixVSU5UIGxlbikKK3sKKyAgaW50IGk7CisgIGxlbj0obGVuPT0wKT82NTUzNjpsZW47CisKKyAgZm9yKGk9MDtpPGxlbjtpKyspCisgICAgc3RyW2ldPXRvdXBwZXIoc3RyW2ldKTsKKyAgcmV0dXJuIGk7CQorfQorCisvKiBBbnNpTG93ZXJCdWZmIFVTRVIuNDM4ICovCitVSU5UIEFuc2lMb3dlckJ1ZmYoTFBTVFIgc3RyLFVJTlQgbGVuKQoreworICBpbnQgaTsKKyAgbGVuPShsZW49PTApPzY1NTM2OmxlbjsKKyAgaT0wOworCisgIGZvcihpPTA7aTxsZW47aSsrKQorICAgIHN0cltpXT10b2xvd2VyKHN0cltpXSk7CisgCisgIHJldHVybiBpOwkKK30KKworLyogQW5zaU5leHQgVVNFUi40NzIgKi8KK0xQU1RSIEFuc2lOZXh0KExQQ1NUUiBjdXJyZW50KQoreworICByZXR1cm4gKCpjdXJyZW50KT9jdXJyZW50KzE6Y3VycmVudDsKK30KKworLyogQW5zaVByZXYgVVNFUi40NzMgKi8KK2NoYXIgRkFSKiAgQW5zaVByZXYoLypjb25zdCovIGNoYXIgRkFSKiBzdGFydCxjaGFyIEZBUiogY3VycmVudCkKK3sKKyAgcmV0dXJuIChjdXJyZW50PT1zdGFydCk/c3RhcnQ6Y3VycmVudC0xOworfQorCisvKiBJc0NoYXJBbHBoYSBVU0VSIDQzMyAqLworQk9PTCBJc0NoYXJBbHBoYShjaGFyIGNoKQoreworICByZXR1cm4gaXNhbHBoYShjaCk7ICAgLyogVGhpcyBpcyBwcm9iYWJseSBub3QgcmlnaHQgZm9yIE5MUyAqLworfQorLyogSXNDaGFyQWxwaGFudW1lcmljIFVTRVIgNDM0ICovCitCT09MIElzQ2hhckFscGhhbnVtZXJpYyhjaGFyIGNoKQoreworICByZXR1cm4gKGNoPCcwJyk/MDooY2g8JzknKTsKK30KKworLyogSXNDaGFyVXBwZXIgVVNFUiA0MzUgKi8KK0JPT0wgSXNDaGFyVXBwZXIoY2hhciBjaCkKK3sKKyAgcmV0dXJuIGlzdXBwZXIoY2gpOworfQorCisvKiBJc0NoYXJVcHBlciBVU0VSIDQzNiAqLworQk9PTCBJc0NoYXJMb3dlcihjaGFyIGNoKQoreworICByZXR1cm4gaXNsb3dlcihjaCk7Cit9CisKK3N0YXRpYyBjaGFyIE9lbTJBbnNpWzI1Nl07CitzdGF0aWMgY2hhciBBbnNpMk9lbVsyNTZdOworCit2b2lkIEluaXRPZW1BbnNpVHJhbnNsYXRpb25zKCkKK3sKKyAgc3RhdGljIGludCBpbml0ZWQ9MDsgLyogc2hvdWxkIGNhbGxlZCBjYWxsZWQgaW4gc29tZSBpbml0IGZ1bmN0aW9uKi8KKyAgaW50IHRyYW5zZmlsZSxpOworICBpZihpbml0ZWQpIHJldHVybjsKKyAgaWYodHJhbnNmaWxlPW9wZW4oIm9lbTJhbnNpLnRybCIsT19SRE9OTFkpKXsKKyAgICByZWFkKHRyYW5zZmlsZSxPZW0yQW5zaSwyNTYpOworICAgIGNsb3NlKHRyYW5zZmlsZSk7CisgIH0KKyAgZWxzZSB7ICAvKiBzZXRzIHVwIHBhc3NpdmUgdHJhbnNsYXRpb25zIGlmIGl0IGRvZXMgbm90IGZpbmQgdGhlIGZpbGUgKi8KKyAgICBmb3IoaT0wO2k8MjU2O2krKykgIC8qIE5lZWRzIHNvbWUgZml4aW5nICovCisgICAgICBPZW0yQW5zaVtpXT1pOyAgCisgIH0KKyAgaWYodHJhbnNmaWxlPW9wZW4oImFuc2kyb2VtLnRybCIsT19SRE9OTFkpKXsKKyAgICByZWFkKHRyYW5zZmlsZSxBbnNpMk9lbSwyNTYpOworICAgIGNsb3NlKHRyYW5zZmlsZSk7CisgIH0KKyAgZWxzZSB7ICAvKiBzZXRzIHVwIHBhc3NpdmUgdHJhbnNsYXRpb25zIGlmIGl0IGRvZXMgbm90IGZpbmQgdGhlIGZpbGUgKi8KKyAgICBmb3IoaT0wO2k8MjU2O2krKykgIC8qIE5lZWRzIHNvbWUgZml4aW5nICovCisgICAgICBBbnNpMk9lbVtpXT1pOyAgCisgIH0KKyAgaW5pdGVkPTE7Cit9CisKKy8qIEFuc2lUb09lbSBLZXlib2FyZC41ICovCitpbnQgQW5zaVRvT2VtKExQU1RSIGxwQW5zaVN0ciwgTFBTVFIgbHBPZW1TdHIpICAgLyogd2h5IGlzIHRoaXMgaW50ID8/PyAqLworeworICBJbml0T2VtQW5zaVRyYW5zbGF0aW9ucygpOyAvKiBzaG91bGQgY2FsbGVkIGNhbGxlZCBpbiBzb21lIGluaXQgZnVuY3Rpb24qLworICB3aGlsZSgqbHBBbnNpU3RyKXsKKyAgICAqbHBPZW1TdHIrKz1BbnNpMk9lbVsqbHBBbnNpU3RyKytdOworICB9CisgIHJldHVybiAtMTsKK30KKworLyogT2VtVG9BbnNpIEtleWJvYXJkLjYgKi8KK0JPT0wgT2VtVG9BbnNpKExQU1RSIGxwT2VtU3RyLCBMUFNUUiBscEFuc2lTdHIpICAgLyogd2h5IGlzIHRoaXMgQk9PTCA/Pz8/ICovCit7CisgIEluaXRPZW1BbnNpVHJhbnNsYXRpb25zKCk7IC8qIHNob3VsZCBjYWxsZWQgY2FsbGVkIGluIHNvbWUgaW5pdCBmdW5jdGlvbiovCisgIHdoaWxlKCpscE9lbVN0cil7CisgICAgKmxwQW5zaVN0cisrPU9lbTJBbnNpWypscE9lbVN0cisrXTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKy8qIEFuc2lUb09lbUJ1ZmYgS2V5Ym9hcmQuMTM0ICovCit2b2lkIEFuc2lUb09lbUJ1ZmYoTFBTVFIgbHBBbnNpU3RyLCBMUFNUUiBscE9lbVN0ciwgaW50IG5MZW5ndGgpCit7CisgIGludCBpOworICBJbml0T2VtQW5zaVRyYW5zbGF0aW9ucygpOyAvKiBzaG91bGQgY2FsbGVkIGNhbGxlZCBpbiBzb21lIGluaXQgZnVuY3Rpb24qLworICBmb3IoaT0wO2k8bkxlbmd0aDtpKyspCisgICAgbHBPZW1TdHJbaV09QW5zaTJPZW1bbHBBbnNpU3RyW2ldXTsgIAorfQorCisvKiBPZW1Ub0Fuc2kgS2V5Ym9hcmQuMTM1ICovCit2b2lkIE9lbVRvQW5zaUJ1ZmYoTFBTVFIgbHBPZW1TdHIsIExQU1RSIGxwQW5zaVN0ciwgaW50IG5MZW5ndGgpCit7CisgIGludCBpOworICBJbml0T2VtQW5zaVRyYW5zbGF0aW9ucygpOyAvKiBzaG91bGQgY2FsbGVkIGNhbGxlZCBpbiBzb21lIGluaXQgZnVuY3Rpb24qLworICBmb3IoaT0wO2k8bkxlbmd0aDtpKyspCisgICAgbHBBbnNpU3RyW2ldPU9lbTJBbnNpW2xwT2VtU3RyW2ldXTsKK30KZGlmZiAtLWdpdCBhL21pc2MvcHJvZmlsZS5jIGIvbWlzYy9wcm9maWxlLmMKaW5kZXggMjkyNGJkNi4uYjM4YzZmOCAxMDA2NDQKLS0tIGEvbWlzYy9wcm9maWxlLmMKKysrIGIvbWlzYy9wcm9maWxlLmMKQEAgLTEsNDAgKzEsMzIyIEBACi1zdGF0aWMgY2hhciBSQ1NJZFtdID0gIiRJZDogcHJvZmlsZS5jLHYgMS4xIDE5OTMvMDkvMTMgMTY6NDI6MzIgc2NvdHQgRXhwICQiOwotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBBbGV4YW5kcmUgSnVsbGlhcmQsIDE5OTMiOworLyoKKyAqIEluaXRpYWxpemF0aW9uLUZpbGUgRnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MyBNaWd1ZWwgZGUgSWNhemEKKyAqCisgKi8KIAotI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKK3N0YXRpYyBjaGFyIENvcHlyaWdodCBbXSA9ICJDb3B5cmlnaHQgKEMpIDE5OTMgTWlndWVsIGRlIEljYXphIjsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogCisjZGVmaW5lIElOSUZJTEUgIndpbi5pbmkiCisjZGVmaW5lIFNUUlNJWkUgMjU1CisjZGVmaW5lIHhtYWxsb2MoeCkgbWFsbG9jKHgpCisjZGVmaW5lIG92ZXJmbG93IChuZXh0ID09ICZDaGFyQnVmZmVyIFtTVFJTSVpFLTFdKQogCi1XT1JEIEdldFByaXZhdGVQcm9maWxlSW50KCBMUFNUUiBzZWN0aW9uLCBMUFNUUiBlbnRyeSwKLQkJCSAgIHNob3J0IGRlZnZhbCwgTFBTVFIgZmlsZW5hbWUgKQorZW51bSB7IEZpcnN0QnJhY2UsIE9uU2VjSGVhZGVyLCBJZ25vcmVUb0VPTCwgS2V5RGVmLCBLZXlWYWx1ZSB9OworCit0eXBlZGVmIHN0cnVjdCBUS2V5cyB7CisgICAgY2hhciAqS2V5TmFtZTsKKyAgICBjaGFyICpWYWx1ZTsKKyAgICBzdHJ1Y3QgVEtleXMgKmxpbms7Cit9IFRLZXlzOworCit0eXBlZGVmIHN0cnVjdCBUU2VjSGVhZGVyIHsKKyAgICBjaGFyICpBcHBOYW1lOworICAgIFRLZXlzICpLZXlzOworICAgIHN0cnVjdCBUU2VjSGVhZGVyICpsaW5rOworfSBUU2VjSGVhZGVyOworICAgIAordHlwZWRlZiBzdHJ1Y3QgVFByb2ZpbGUgeworICAgIGNoYXIgKkZpbGVOYW1lOworICAgIFRTZWNIZWFkZXIgKlNlY3Rpb247CisgICAgc3RydWN0IFRQcm9maWxlICpsaW5rOworfSBUUHJvZmlsZTsKKworVFByb2ZpbGUgKkN1cnJlbnQgPSAwOworVFByb2ZpbGUgKkJhc2UgPSAwOworCitzdGF0aWMgVFNlY0hlYWRlciAqaXNfbG9hZGVkIChjaGFyICpGaWxlTmFtZSkKIHsKLSAgICBwcmludGYoICJHZXRQcml2YXRlUHJvZmlsZUludDogJXMgJXMgJWQgJXNcbiIsIHNlY3Rpb24sIGVudHJ5LCBkZWZ2YWwsIGZpbGVuYW1lICk7Ci0gICAgcmV0dXJuIGRlZnZhbDsKKyAgICBUUHJvZmlsZSAqcCA9IEJhc2U7CisgICAgCisgICAgd2hpbGUgKHApeworCWlmICghc3RyY2FzZWNtcCAoRmlsZU5hbWUsIHAtPkZpbGVOYW1lKSl7CisJICAgIEN1cnJlbnQgPSBwOworCSAgICByZXR1cm4gcC0+U2VjdGlvbjsKKwl9CisJcCA9IHAtPmxpbms7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCi1zaG9ydCBHZXRQcml2YXRlUHJvZmlsZVN0cmluZyggTFBTVFIgc2VjdGlvbiwgTFBTVFIgZW50cnksIExQU1RSIGRlZnZhbCwKLQkJCSAgICAgICBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50LCBMUFNUUiBmaWxlbmFtZSApCitzdGF0aWMgVFNlY0hlYWRlciAqbG9hZCAoY2hhciAqZmlsZSkKIHsKLSAgICBwcmludGYoICJHZXRQcml2YXRlUHJvZmlsZVN0cmluZzogJXMgJXMgJXMgJWQgJXNcbiIsIHNlY3Rpb24sIGVudHJ5LCBkZWZ2YWwsIGNvdW50LCBmaWxlbmFtZSApOwotICAgIHN0cm5jcHkoIGJ1ZmZlciwgZGVmdmFsLCBjb3VudCApOwotICAgIGJ1ZmZlcltjb3VudC0xXSA9IDA7Ci0gICAgcmV0dXJuIHN0cmxlbihidWZmZXIpOworICAgIEZJTEUgKmY7CisgICAgaW50IHN0YXRlOworICAgIFRTZWNIZWFkZXIgKlNlY0hlYWRlciA9IDA7CisgICAgY2hhciBDaGFyQnVmZmVyIFtTVFJTSVpFXTsKKyAgICBjaGFyICpuZXh0OworICAgIGNoYXIgYzsKKyAgICAKKyAgICBpZiAoKGYgPSBmb3BlbiAoZmlsZSwgInIiKSk9PU5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBzdGF0ZSA9IEZpcnN0QnJhY2U7CisgICAgd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRil7CisJaWYgKGMgPT0gJ1xyJykJCS8qIElnbm9yZSBDYXJyaWFnZSBSZXR1cm4gKi8KKwkgICAgY29udGludWU7CisJCisJc3dpdGNoIChzdGF0ZSl7CisKKwljYXNlIE9uU2VjSGVhZGVyOgorCSAgICBpZiAoYyA9PSAnXScgfHwgb3ZlcmZsb3cpeworCQkqbmV4dCA9ICdcMCc7CisJCW5leHQgPSBDaGFyQnVmZmVyOworCQlTZWNIZWFkZXItPkFwcE5hbWUgPSBzdHJkdXAgKENoYXJCdWZmZXIpOworCQlzdGF0ZSA9IElnbm9yZVRvRU9MOworCSAgICB9IGVsc2UKKwkJKm5leHQrKyA9IGM7CisJICAgIGJyZWFrOworCisJY2FzZSBJZ25vcmVUb0VPTDoKKwkgICAgaWYgKGMgPT0gJ1xuJyl7CisJCXN0YXRlID0gS2V5RGVmOworCQluZXh0ID0gQ2hhckJ1ZmZlcjsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgRmlyc3RCcmFjZToKKwljYXNlIEtleURlZjoKKwkgICAgaWYgKGMgPT0gJ1snKXsKKwkJVFNlY0hlYWRlciAqdGVtcDsKKwkJCisJCXRlbXAgPSBTZWNIZWFkZXI7CisJCVNlY0hlYWRlciA9IChUU2VjSGVhZGVyICopIHhtYWxsb2MgKHNpemVvZiAoVFNlY0hlYWRlcikpOworCQlTZWNIZWFkZXItPmxpbmsgPSB0ZW1wOworCQlTZWNIZWFkZXItPktleXMgPSAwOworCQlzdGF0ZSA9IE9uU2VjSGVhZGVyOworCQluZXh0ID0gQ2hhckJ1ZmZlcjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHN0YXRlID09IEZpcnN0QnJhY2UpIC8qIE9uIGZpcnN0IHBhc3MsIGRvbid0IGFsbG93IGRhbmdsaW5nIGtleXMgKi8KKwkJYnJlYWs7CisJICAgIAorCSAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQorCQlicmVhazsKKwkgICAgCisJICAgIGlmIChjID09ICdcbicgfHwgb3ZlcmZsb3cpIC8qIEFib3J0IERlZmluaXRpb24gKi8KKwkJbmV4dCA9IENoYXJCdWZmZXI7CisJICAgIAorCSAgICBpZiAoYyA9PSAnPScgfHwgb3ZlcmZsb3cpeworCQlUS2V5cyAqdGVtcDsKKworCQl0ZW1wID0gU2VjSGVhZGVyLT5LZXlzOworCQkqbmV4dCA9ICdcMCc7CisJCVNlY0hlYWRlci0+S2V5cyA9IChUS2V5cyAqKSB4bWFsbG9jIChzaXplb2YgKFRLZXlzKSk7CisJCVNlY0hlYWRlci0+S2V5cy0+bGluayA9IHRlbXA7CisJCVNlY0hlYWRlci0+S2V5cy0+S2V5TmFtZSA9IHN0cmR1cCAoQ2hhckJ1ZmZlcik7CisJCXN0YXRlID0gS2V5VmFsdWU7CisJCW5leHQgPSBDaGFyQnVmZmVyOworCSAgICB9IGVsc2UKKwkJKm5leHQrKyA9IGM7CisJICAgIGJyZWFrOworCisJY2FzZSBLZXlWYWx1ZToKKwkgICAgaWYgKG92ZXJmbG93IHx8IGMgPT0gJ1xuJyl7CisJCSpuZXh0ID0gJ1wwJzsKKwkJU2VjSGVhZGVyLT5LZXlzLT5WYWx1ZSA9IHN0cmR1cCAoQ2hhckJ1ZmZlcik7CisJCXN0YXRlID0gYyA9PSAnXG4nID8gS2V5RGVmIDogSWdub3JlVG9FT0w7CisJCW5leHQgPSBDaGFyQnVmZmVyOworI2lmZGVmIERFQlVHCisJCXByaW50ZiAoIlslc10gKCVzKT0lc1xuIiwgU2VjSGVhZGVyLT5BcHBOYW1lLAorCQkJU2VjSGVhZGVyLT5LZXlzLT5LZXlOYW1lLCBTZWNIZWFkZXItPktleXMtPlZhbHVlKTsKKyNlbmRpZgorCSAgICB9IGVsc2UKKwkJKm5leHQrKyA9IGM7CisJICAgIGJyZWFrOworCSAgICAKKwl9IC8qIHN3aXRjaCAqLworCQorICAgIH0gLyogd2hpbGUgKChjID0gZ2V0YyAoZikpICE9IEVPRikgKi8KKyAgICByZXR1cm4gU2VjSGVhZGVyOwogfQogCi0KLVdPUkQgR2V0UHJvZmlsZUludCggTFBTVFIgbHBBcHBOYW1lLCBMUFNUUiBscEtleU5hbWUsIGludCBuRGVmYXVsdCkKK3N0YXRpYyBuZXdfa2V5IChUU2VjSGVhZGVyICpzZWN0aW9uLCBjaGFyICpLZXlOYW1lLCBjaGFyICpWYWx1ZSkKIHsKLSAgcHJpbnRmKCJHZXRQcm9maWxlSW50OiAlcyAlcyAlZFxuIixscEFwcE5hbWUsbHBLZXlOYW1lLG5EZWZhdWx0KTsKLSAgcmV0dXJuIG5EZWZhdWx0OworICAgIFRLZXlzICprZXk7CisgICAgCisgICAga2V5ID0gKFRLZXlzICopIHhtYWxsb2MgKHNpemVvZiAoVEtleXMpKTsKKyAgICBrZXktPktleU5hbWUgPSBzdHJkdXAgKEtleU5hbWUpOworICAgIGtleS0+VmFsdWUgICA9IHN0cmR1cCAoVmFsdWUpOworICAgIGtleS0+bGluayA9IHNlY3Rpb24tPktleXM7CisgICAgc2VjdGlvbi0+S2V5cyA9IGtleTsKIH0KIAotaW50IEdldFByb2ZpbGVTdHJpbmcoTFBTVFIgbHBBcHBOYW1lLCBMUFNUUiBscEtleU5hbWUsIExQU1RSIGxwRGVmYXVsdCwKLQkJICAgICAgIExQU1RSIGxwUmV0dXJuZWRTdHJpbmcsIGludCBuU2l6ZSkKLXsKLSAgICBwcmludGYoICJHZXRQcm9maWxlU3RyaW5nOiAlcyAlcyAlcyAlZCBcbiIsIGxwQXBwTmFtZSxscEtleU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEZWZhdWx0LCBuU2l6ZSApOwotICAgIHN0cm5jcHkoIGxwUmV0dXJuZWRTdHJpbmcsbHBEZWZhdWx0LG5TaXplICk7Ci0gICAgbHBSZXR1cm5lZFN0cmluZ1tuU2l6ZS0xXSA9IDA7Ci0gICAgcmV0dXJuIHN0cmxlbihscFJldHVybmVkU3RyaW5nKTsKK3N0YXRpYyBzaG9ydCBHZXRTZXRQcm9maWxlIChpbnQgc2V0LCBMUFNUUiBBcHBOYW1lLCBMUFNUUiBLZXlOYW1lLAorCQkgICAgIExQU1RSIERlZmF1bHQsIExQU1RSIFJldHVybmVkU3RyaW5nLCBzaG9ydCBTaXplLAorCQkgICAgIExQU1RSIEZpbGVOYW1lKQogCit7CisgICAgVFByb2ZpbGUgICAqTmV3OworICAgIFRTZWNIZWFkZXIgKnNlY3Rpb247CisgICAgVEtleXMgICAgICAqa2V5OworICAgIAorICAgIGlmICghKHNlY3Rpb24gPSBpc19sb2FkZWQgKEZpbGVOYW1lKSkpeworCU5ldyA9IChUUHJvZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKFRQcm9maWxlKSk7CisJTmV3LT5saW5rID0gQmFzZTsKKwlOZXctPkZpbGVOYW1lID0gc3RyZHVwIChGaWxlTmFtZSk7CisJTmV3LT5TZWN0aW9uID0gbG9hZCAoRmlsZU5hbWUpOworCUJhc2UgPSBOZXc7CisJc2VjdGlvbiA9IE5ldy0+U2VjdGlvbjsKKwlDdXJyZW50ID0gTmV3OworICAgIH0KKyAgICAKKyAgICAvKiBTdGFydCBzZWFyY2ggKi8KKyAgICBmb3IgKDsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPmxpbmspeworCWlmIChzdHJjYXNlY21wIChzZWN0aW9uLT5BcHBOYW1lLCBBcHBOYW1lKSkKKwkgICAgY29udGludWU7CisJZm9yIChrZXkgPSBzZWN0aW9uLT5LZXlzOyBrZXk7IGtleSA9IGtleS0+bGluayl7CisJICAgIGlmIChzdHJjYXNlY21wIChrZXktPktleU5hbWUsIEtleU5hbWUpKQorCQljb250aW51ZTsKKwkgICAgaWYgKHNldCl7CisJCWZyZWUgKGtleS0+VmFsdWUpOworCQlrZXktPlZhbHVlID0gc3RyZHVwIChEZWZhdWx0KTsKKwkJcmV0dXJuIDE7CisJICAgIH0KKwkgICAgUmV0dXJuZWRTdHJpbmcgW1NpemUtMV0gPSAwOworCSAgICBzdHJuY3B5IChSZXR1cm5lZFN0cmluZywga2V5LT5WYWx1ZSwgU2l6ZS0xKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCS8qIElmIEdldHRpbmcgdGhlIGluZm9ybWF0aW9uLCB0aGVuIGRvbid0IHdyaXRlIHRoZSBpbmZvcm1hdGlvbgorCSAgIHRvIHRoZSBJTkkgZmlsZSwgbmVlZCB0byBydW4gYSBjb3VwbGUgb2YgdGVzdHMgd2l0aCB3aW5kb2cgKi8KKwkvKiBObyBrZXkgZm91bmQgKi8KKwlpZiAoc2V0KQorCSAgICBuZXdfa2V5IChzZWN0aW9uLCBLZXlOYW1lLCBEZWZhdWx0KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBSZXR1cm5lZFN0cmluZyBbU2l6ZS0xXSA9IDA7CisgICAgICAgICAgICBzdHJuY3B5IChSZXR1cm5lZFN0cmluZywgRGVmYXVsdCwgU2l6ZS0xKTsKKwl9CisJcmV0dXJuIDE7CisgICAgfQorICAgIC8qIE5vbiBleGlzdGVudCBzZWN0aW9uICovCisgICAgaWYgKHNldCl7CisJc2VjdGlvbiA9IChUU2VjSGVhZGVyICopIHhtYWxsb2MgKHNpemVvZiAoVFNlY0hlYWRlcikpOworCXNlY3Rpb24tPkFwcE5hbWUgPSBzdHJkdXAgKEFwcE5hbWUpOworCXNlY3Rpb24tPktleXMgPSAwOworCW5ld19rZXkgKHNlY3Rpb24sIEtleU5hbWUsIERlZmF1bHQpOworCXNlY3Rpb24tPmxpbmsgPSBDdXJyZW50LT5TZWN0aW9uOworCUN1cnJlbnQtPlNlY3Rpb24gPSBzZWN0aW9uOworICAgIH0gZWxzZSB7CisJUmV0dXJuZWRTdHJpbmcgW1NpemUtMV0gPSAwOworCXN0cm5jcHkgKFJldHVybmVkU3RyaW5nLCBEZWZhdWx0LCBTaXplLTEpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KKworc2hvcnQgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcgKExQU1RSIEFwcE5hbWUsIExQU1RSIEtleU5hbWUsCisJCQkgICAgICAgTFBTVFIgRGVmYXVsdCwgTFBTVFIgUmV0dXJuZWRTdHJpbmcsCisJCQkgICAgICAgc2hvcnQgU2l6ZSwgTFBTVFIgRmlsZU5hbWUpCit7CisgICAgcmV0dXJuIChHZXRTZXRQcm9maWxlICgwLCBBcHBOYW1lLCBLZXlOYW1lLCBEZWZhdWx0LCBSZXR1cm5lZFN0cmluZywgU2l6ZSwgRmlsZU5hbWUpKTsKK30KKworaW50IEdldFByb2ZpbGVTdHJpbmcgKExQU1RSIEFwcE5hbWUsIExQU1RSIEtleU5hbWUsIExQU1RSIERlZmF1bHQsIAorCQkgICAgICBMUFNUUiBSZXR1cm5lZFN0cmluZywgaW50IFNpemUpCit7CisgICAgcmV0dXJuIEdldFByaXZhdGVQcm9maWxlU3RyaW5nIChBcHBOYW1lLCBLZXlOYW1lLCBEZWZhdWx0LAorCQkJCSAgICBSZXR1cm5lZFN0cmluZywgU2l6ZSwgSU5JRklMRSk7Cit9CisKK1dPUkQgR2V0UHJpdmF0ZVByb2ZpbGVJbnQgKExQU1RSIEFwcE5hbWUsIExQU1RSIEtleU5hbWUsIHNob3J0IERlZmF1bHQsCisJCQkgICBMUFNUUiBGaWxlKQoreworICAgIHN0YXRpYyBjaGFyIEludEJ1ZiBbNV07CisgICAgc3RhdGljIGNoYXIgYnVmIFs1XTsKKworICAgIHNwcmludGYgKGJ1ZiwgIiVkIiwgRGVmYXVsdCk7CisgICAgCisgICAgLyogQ2hlY2sgdGhlIGV4YWN0IHNlbWFudGljIHdpdGggdGhlIFNESyAqLworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nIChBcHBOYW1lLCBLZXlOYW1lLCBidWYsIEludEJ1ZiwgNSwgRmlsZSk7CisgICAgaWYgKCFzdHJjYXNlY21wIChJbnRCdWYsICJ0cnVlIikpCisJcmV0dXJuIDE7CisgICAgaWYgKCFzdHJjYXNlY21wIChJbnRCdWYsICJ5ZXMiKSkKKwlyZXR1cm4gMTsKKyAgICByZXR1cm4gYXRvaSAoSW50QnVmKTsKK30KKworV09SRCBHZXRQcm9maWxlSW50IChMUFNUUiBBcHBOYW1lLCBMUFNUUiBLZXlOYW1lLCBpbnQgRGVmYXVsdCkKK3sKKyAgICByZXR1cm4gR2V0UHJpdmF0ZVByb2ZpbGVJbnQgKEFwcE5hbWUsIEtleU5hbWUsIERlZmF1bHQsIElOSUZJTEUpOworfQorCitCT09MIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcgKExQU1RSIEFwcE5hbWUsIExQU1RSIEtleU5hbWUsIExQU1RSIFN0cmluZywKKwkJCQlMUFNUUiBGaWxlTmFtZSkKK3sKKyAgICByZXR1cm4gR2V0U2V0UHJvZmlsZSAoMSwgQXBwTmFtZSwgS2V5TmFtZSwgU3RyaW5nLCAiIiwgMCwgRmlsZU5hbWUpOworfQorCitCT09MIFdyaXRlUHJvZmlsZVN0cmluZyAoTFBTVFIgQXBwTmFtZSwgTFBTVFIgS2V5TmFtZSwgTFBTVFIgU3RyaW5nKQoreworICAgIHJldHVybiAoV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyAoQXBwTmFtZSwgS2V5TmFtZSwgU3RyaW5nLCBJTklGSUxFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfa2V5cyAoRklMRSAqcHJvZmlsZSwgVEtleXMgKnApCit7CisgICAgaWYgKCFwKQorCXJldHVybjsKKyAgICBkdW1wX2tleXMgKHByb2ZpbGUsIHAtPmxpbmspOworICAgIGZwcmludGYgKHByb2ZpbGUsICIlcz0lc1xyXG4iLCBwLT5LZXlOYW1lLCBwLT5WYWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc2VjdGlvbnMgKEZJTEUgKnByb2ZpbGUsIFRTZWNIZWFkZXIgKnApCit7CisgICAgaWYgKCFwKQorCXJldHVybjsKKyAgICBkdW1wX3NlY3Rpb25zIChwcm9maWxlLCBwLT5saW5rKTsKKyAgICBmcHJpbnRmIChwcm9maWxlLCAiXHJcblslc11cclxuIiwgcC0+QXBwTmFtZSk7CisgICAgZHVtcF9rZXlzIChwcm9maWxlLCBwLT5LZXlzKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9wcm9maWxlIChUUHJvZmlsZSAqcCkKK3sKKyAgICBGSUxFICpwcm9maWxlOworICAgIAorICAgIGlmICghcCkKKwlyZXR1cm47CisgICAgZHVtcF9wcm9maWxlIChwLT5saW5rKTsKKyAgICBpZiAoKHByb2ZpbGUgPSBmb3BlbiAocC0+RmlsZU5hbWUsICJ3IikpICE9IE5VTEwpeworCWR1bXBfc2VjdGlvbnMgKHByb2ZpbGUsIHAtPlNlY3Rpb24pOworCWZjbG9zZSAocHJvZmlsZSk7CisgICAgfQorfQorCit2b2lkIHN5bmNfcHJvZmlsZXMgKCkKK3sKKyAgICBkdW1wX3Byb2ZpbGUgKEJhc2UpOworfQorCisjaWZkZWYgRFVNQlRFU1QKK21haW4gKCkKK3sKKyAgICBjaGFyIHIgWzEwMF0sIGFwcCBbMTAwXSwga2V5IFsxMDBdLCB2YWxvciBbMTAwXTsKKyAgICAKKyAgICB3aGlsZSAoMSl7CisJcHJpbnRmICgiRGFtZSwgQXBsaWNhY2lvbiwgbGxhdmVcbiIpOworCWdldHMgKGFwcCk7CisJaWYgKCFhcHAgWzBdKXsKKwkgICAgc3luY19wcm9maWxlcyAoKTsKKwkgICAgcmV0dXJuOworCX0KKwlnZXRzIChrZXkpOworCWdldHMgKHZhbG9yKTsKKwlHZXRQcm9maWxlU3RyaW5nIChhcHAsIGtleSwgIjFOb19FbmNvbnRyYWRvIiwgciwgc2l6ZW9mIChyKSk7CisJcHJpbnRmICgiKCVkKVxuIiwgR2V0UHJvZmlsZUludCAoYXBwLCBrZXksIDUpKTsKKwlwcmludGYgKCIlc1xuIiwgcik7CisJV3JpdGVQcm9maWxlU3RyaW5nIChhcHAsIGtleSwgdmFsb3IpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWlzYy9yZWN0LmMgYi9taXNjL3JlY3QuYwppbmRleCBmYjk2ZmQ2Li40ZmQ3YmU0IDEwMDY0NAotLS0gYS9taXNjL3JlY3QuYworKysgYi9taXNjL3JlY3QuYwpAQCAtNzgsNiArNzgsOCBAQAogICovCiB2b2lkIEluZmxhdGVSZWN0KCBMUFJFQ1QgcmVjdCwgc2hvcnQgeCwgc2hvcnQgeSApCiB7CisgICAgcmVjdC0+bGVmdCAgIC09IHg7CisgICAgcmVjdC0+dG9wIAkgLT0geTsKICAgICByZWN0LT5yaWdodCAgKz0geDsKICAgICByZWN0LT5ib3R0b20gKz0geTsKIH0KZGlmZiAtLWdpdCBhL21pc2MvdXNlci5jIGIvbWlzYy91c2VyLmMKaW5kZXggYTc1YmQ0Mi4uNDc2ZDg2MSAxMDA2NDQKLS0tIGEvbWlzYy91c2VyLmMKKysrIGIvbWlzYy91c2VyLmMKQEAgLTM5LDYgKzM5LDkgQEAKIHsKICAgICAgIC8qIEdESSBpbml0aWFsaXNhdGlvbiAqLwogICAgIGlmICghR0RJX0luaXQoKSkgcmV0dXJuIDA7CisKKyAgICAgIC8qIEluaXRpYWxpemUgc3lzdGVtIGNvbG9ycyAqLworICAgIFNZU0NPTE9SX0luaXQoKTsKICAgICAKICAgICAgIC8qIENyZWF0ZSBVU0VSIGhlYXAgKi8KICAgICBpZiAoIVVTRVJfSGVhcEluaXQoKSkgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9taXNjL3h0LmMgYi9taXNjL3h0LmMKaW5kZXggM2JiOThiYi4uNTc1NmQzOSAxMDA2NDQKLS0tIGEvbWlzYy94dC5jCisrKyBiL21pc2MveHQuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImNsYXNzLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCisjaW5jbHVkZSAidXNlci5oIgogCiAjaWZkZWYgX19OZXRCU0RfXwogI2RlZmluZSBIWiAxMDAKQEAgLTU2LDYgKzU3LDggQEAKIHsKICAgICBXTkQgKiB3bmRQdHI7CiAgICAgQ0xBU1MgKiBjbGFzc1B0cjsKKyAgICBMUFNUUiB0ZXh0UHRyOworICAgIGludCBsZW47CiAgICAgCiAjaWZkZWYgREVCVUdfTUVTU0FHRQogICAgIHByaW50ZiggIkRlZldpbmRvd1Byb2M6ICVkICVkICVkICUwOHhcbiIsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKQEAgLTg5LDYgKzkyLDQxIEBACiAJICAgIEdsb2JhbFVubG9jayggaHduZCApOwogCSAgICByZXR1cm4gMDsKIAl9CisKKyAgICBjYXNlIFdNX0dFVFRFWFQ6CisJeworCSAgICBpZiAod1BhcmFtKQorCSAgICB7CisJCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCQlpZiAod25kUHRyLT5oVGV4dCkKKwkJeworCQkgICAgdGV4dFB0ciA9IChMUFNUUilVU0VSX0hFQVBfQUREUih3bmRQdHItPmhUZXh0KTsKKwkJICAgIGlmICgoaW50KXdQYXJhbSA+IChsZW4gPSBzdHJsZW4odGV4dFB0cikpKQorCQkgICAgeworCQkJc3RyY3B5KChMUFNUUilsUGFyYW0sIHRleHRQdHIpOworCQkJR2xvYmFsVW5sb2NrKGh3bmQpOworCQkJcmV0dXJuIChEV09SRClsZW47CisJCSAgICB9CisJCX0KKwkJKChMUFNUUilsUGFyYW0pWzBdID0gTlVMTDsKKwkgICAgfQorCSAgICBHbG9iYWxVbmxvY2soaHduZCk7CisJICAgIHJldHVybiAoMEwpOworCX0KKworICAgIGNhc2UgV01fR0VUVEVYVExFTkdUSDoKKwl7CisJICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCSAgICBpZiAod25kUHRyLT5oVGV4dCkKKwkgICAgeworCQl0ZXh0UHRyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKHduZFB0ci0+aFRleHQpOworCQlsZW4gPSBzdHJsZW4odGV4dFB0cik7CisJCUdsb2JhbFVubG9jayhod25kKTsKKwkJcmV0dXJuIChEV09SRClsZW47CisJICAgIH0KKwkgICAgR2xvYmFsVW5sb2NrKGh3bmQpOworCSAgICByZXR1cm4gKDBMKTsKKwl9CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTA4LDcgKzE0Niw3IEBACiAKIHZvaWQgTWVzc2FnZUJlZXAoIFdPUkQgaSApCiB7Ci0gICAgcHJpbnRmKCAiTWVzc2FnZUJlZXA6ICVkXG4iLCBpICk7CisgICAgWEJlbGwoWFRfZGlzcGxheSwgMTAwKTsKIH0KIAogV09SRCBSZWdpc3RlcldpbmRvd01lc3NhZ2UoIExQU1RSIHN0ciApCkBAIC0xMjMsNyArMTYxLDcgQEAKIERXT1JEIEdldFRpY2tDb3VudCgpCiB7CiAgICAgc3RydWN0IHRtcyBkdW1teTsKLSAgICByZXR1cm4gdGltZXMoJmR1bW15KSAvICgxMDAwIC8gSFopOworICAgIHJldHVybiAodGltZXMoJmR1bW15KSAqIDEwMDApIC8gSFo7CiB9CiAKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9NYWtlZmlsZSBiL29iamVjdHMvTWFrZWZpbGUKaW5kZXggYWQ0ZDExOS4uZjFkY2QwNiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9NYWtlZmlsZQorKysgYi9vYmplY3RzL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogQ0ZMQUdTPSQoQ09QVFMpICQoREVCVUdPUFRTKSAtSSQoSU5DTFVERV9ESVIpCiAKIE9CSlM9Yml0bWFwLm8gYnJ1c2gubyBmb250Lm8gZ2Rpb2JqLm8gcGFsZXR0ZS5vIHBlbi5vIGRpYi5vIHJlZ2lvbi5vIFwKLQl0ZXh0Lm8gZGN2YWx1ZXMubyBjbGlwcGluZy5vIGJpdGJsdC5vIGxpbmVkZGEubworCXRleHQubyBkY3ZhbHVlcy5vIGNsaXBwaW5nLm8gYml0Ymx0Lm8gbGluZWRkYS5vIGNvbG9yLm8KIAogZGVmYXVsdDogb2JqZWN0cy5vCiAKZGlmZiAtLWdpdCBhL29iamVjdHMvY29sb3IuYyBiL29iamVjdHMvY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdiNDZlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0cy9jb2xvci5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29sb3IgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBBbGV4YW5kcmUgSnVsbGlhcmQsIDE5OTMiOworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKworZXh0ZXJuIERpc3BsYXkgKiBYVF9kaXNwbGF5OworZXh0ZXJuIFNjcmVlbiAqIFhUX3NjcmVlbjsKKworCisvKiAKKyAqIFdlIHRyeSB0byB1c2UgYSBwcml2YXRlIGNvbG9yIG1hcCBpZiBwb3NzaWJsZSwgYmVjYXVzZSBXaW5kb3dzIHByb2dyYW1zCisgKiBhc3N1bWUgdGhhdCBwYWxldHRlKDApID09IEJsYWNrIGFuZCBwYWxldHRlKG1heC0xKSA9PSBXaGl0ZS4KKyAqLworCitDb2xvcm1hcCBDT0xPUl9XaW5Db2xvcm1hcCA9IDA7CisKKworICAvKiBTeXN0ZW0gY29sb3JzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogU3lzQ29sb3JzW10gPSAKK3sKKyAgICAgIC8qIExvdyBwaXhlbCB2YWx1ZXMgKDAuLjcpICovCisKKyAgICAiYmxhY2siLCAicmVkNCIsICJncmVlbjQiLCAieWVsbG93NCIsCisgICAgImJsdWU0IiwgIm1hZ2VudGE0IiwgImN5YW40IiwgImdyYXk1MCIsCisKKyAgICAgIC8qIEhpZ2ggcGl4ZWwgdmFsdWVzIChtYXgtNy4ubWF4KSAqLworCisgICAgImdyYXk3NSIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwKKyAgICAiYmx1ZSIsICJtYWdlbnRhIiwgImN5YW4iLCAid2hpdGUiCit9OworCisjZGVmaW5lIE5CX1NZU19DT0xPUlMgICAoc2l6ZW9mKFN5c0NvbG9ycykgLyBzaXplb2YoU3lzQ29sb3JzWzBdKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT0xPUl9GaWxsRGVmYXVsdE1hcAorICoKKyAqIFRyeSB0byBhbGxvY2F0ZSBjb2xvcnMgZnJvbSBkZWZhdWx0IHNjcmVlbiBtYXAgKHVzZWQgd2hlbiB3ZQorICogZG9uJ3Qgd2FudCB0byBvciBjYW4ndCB1c2UgYSBwcml2YXRlIG1hcCkuCisgKi8KK3N0YXRpYyBpbnQgQ09MT1JfRmlsbERlZmF1bHRNYXAoKQoreworICAgIFhDb2xvciBjb2xvcjsKKyAgICBpbnQgaSwgdG90YWwgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IE5CX1NZU19DT0xPUlM7IGkrKykKKyAgICB7CisJaWYgKFhQYXJzZUNvbG9yKCBYVF9kaXNwbGF5LCBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbiggWFRfc2NyZWVuICksCisJCQkgU3lzQ29sb3JzW2ldLCAmY29sb3IgKSkKKwl7CisJICAgIGlmIChYQWxsb2NDb2xvciggWFRfZGlzcGxheSwgRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4oIFhUX3NjcmVlbiApLCAKKwkJCSAgICAgJmNvbG9yICkpCisJCXRvdGFsKys7CisJfQorICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ09MT1JfQnVpbGRNYXAKKyAqCisgKiBGaWxsIHRoZSBwcml2YXRlIGNvbG9ybWFwLgorICovCitzdGF0aWMgQk9PTCBDT0xPUl9CdWlsZE1hcCggQ29sb3JtYXAgbWFwLCBpbnQgZGVwdGgsIGludCBzaXplICkKK3sKKyAgICBYQ29sb3IgY29sb3I7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkJfU1lTX0NPTE9SUzsgaSsrKQorICAgIHsKKwlpZiAoIVhQYXJzZUNvbG9yKCBYVF9kaXNwbGF5LCBtYXAsIFN5c0NvbG9yc1tpXSwgJmNvbG9yICkpCisJICAgIGNvbG9yLnJlZCA9IGNvbG9yLmdyZWVuID0gY29sb3IuYmx1ZSA9IGNvbG9yLmZsYWdzID0gMDsKKwlpZiAoaSA8IE5CX1NZU19DT0xPUlMvMikgY29sb3IucGl4ZWwgPSBpOworCWVsc2UgY29sb3IucGl4ZWwgPSAoMSA8PCBkZXB0aCkgLSBOQl9TWVNfQ09MT1JTICsgaTsKKwlpZiAoY29sb3IucGl4ZWwgPCBzaXplKSBYU3RvcmVDb2xvciggWFRfZGlzcGxheSwgbWFwLCAmY29sb3IgKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ09MT1JfSW5pdAorICovCitCT09MIENPTE9SX0luaXQoKQoreworICAgIFZpc3VhbCAqIHZpc3VhbCA9IERlZmF1bHRWaXN1YWwoIFhUX2Rpc3BsYXksIERlZmF1bHRTY3JlZW4oWFRfZGlzcGxheSkgKTsKKyAgICAKKyAgICBzd2l0Y2godmlzdWFsLT5jbGFzcykKKyAgICB7CisgICAgICBjYXNlIEdyYXlTY2FsZToKKyAgICAgIGNhc2UgUHNldWRvQ29sb3I6CisgICAgICBjYXNlIERpcmVjdENvbG9yOgorCisjaWZkZWYgVVNFX1BSSVZBVEVfTUFQCisJQ09MT1JfV2luQ29sb3JtYXAgPSBYQ3JlYXRlQ29sb3JtYXAoIFhUX2Rpc3BsYXksCisJCQkJCSAgICAgRGVmYXVsdFJvb3RXaW5kb3coWFRfZGlzcGxheSksCisJCQkJCSAgICAgdmlzdWFsLCBBbGxvY0FsbCApOworCWlmIChDT0xPUl9XaW5Db2xvcm1hcCkKKwkgICAgQ09MT1JfQnVpbGRNYXAoQ09MT1JfV2luQ29sb3JtYXAsCisJCQkgICBEZWZhdWx0RGVwdGgoWFRfZGlzcGxheSwgRGVmYXVsdFNjcmVlbihYVF9kaXNwbGF5KSksCisJCQkgICB2aXN1YWwtPm1hcF9lbnRyaWVzICk7CisJZWxzZSBDT0xPUl9GaWxsRGVmYXVsdE1hcCgpOworCWJyZWFrOworI2VuZGlmICAvKiBVU0VfUFJJVkFURV9NQVAgKi8KKworICAgICAgY2FzZSBTdGF0aWNHcmF5OgorICAgICAgY2FzZSBTdGF0aWNDb2xvcjoKKyAgICAgIGNhc2UgVHJ1ZUNvbG9yOgorCUNPTE9SX0ZpbGxEZWZhdWx0TWFwKCk7CisJQ09MT1JfV2luQ29sb3JtYXAgPSBDb3B5RnJvbVBhcmVudDsKKwlicmVhazsJCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggNTUyMzdjMy4uMzJiYjRiOCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC0xNTAsMTMgKzE1MCwxNCBAQAogCiAgICAgICAvKiBDcmVhdGUgR0RJIGhlYXAgKi8KIAotICAgIHMgPSBHZXROZXh0U2VnbWVudCggMCwgMHgxMDAwMCApOworICAgIHMgPSAoc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICopR2V0TmV4dFNlZ21lbnQoIDAsIDB4MTAwMDAgKTsKICAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAgICAgSEVBUF9Jbml0KCAmR0RJX0hlYXAsIHMtPmJhc2VfYWRkciwgR0RJX0hFQVBfU0laRSApOwogICAgIGZyZWUocyk7CiAKICAgICAgIC8qIENyZWF0ZSBkZWZhdWx0IHBhbGV0dGUgKi8KIAorICAgIENPTE9SX0luaXQoKTsKICAgICBQQUxFVFRFX0luaXQoKTsKICAgICBTdG9ja09iamVjdHNbREVGQVVMVF9QQUxFVFRFXSA9IFBBTEVUVEVfc3lzdGVtUGFsZXR0ZTsKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wYWxldHRlLmMgYi9vYmplY3RzL3BhbGV0dGUuYwppbmRleCA4ODdmMWRlLi5lYzY5NzAwIDEwMDY0NAotLS0gYS9vYmplY3RzL3BhbGV0dGUuYworKysgYi9vYmplY3RzL3BhbGV0dGUuYwpAQCAtMjEsNjUgKzIxLDQyIEBACiBleHRlcm4gRGlzcGxheSAqIFhUX2Rpc3BsYXk7CiBleHRlcm4gU2NyZWVuICogWFRfc2NyZWVuOwogCi0KLSNkZWZpbmUgTkJfUkVTRVJWRURfQ09MT1JTICAxNwotc3RhdGljIGNoYXIgKiBSZXNlcnZlZENvbG9yc1tOQl9SRVNFUlZFRF9DT0xPUlNdID0KLXsKLSAgICAiYmxhY2siLAotICAgICJncmF5MjUiLAotICAgICJncmF5NTAiLAotICAgICJncmF5NzUiLAotICAgICJ3aGl0ZSIsCi0gICAgInJlZDEiLAotICAgICJyZWQ0IiwKLSAgICAiZ3JlZW4xIiwKLSAgICAiZ3JlZW40IiwKLSAgICAiYmx1ZTEiLAotICAgICJibHVlNCIsCi0gICAgImN5YW4xIiwKLSAgICAiY3lhbjQiLAotICAgICJtYWdlbnRhMSIsCi0gICAgIm1hZ2VudGE0IiwKLSAgICAieWVsbG93MSIsCi0gICAgInllbGxvdzQiCi19OworZXh0ZXJuIENvbG9ybWFwIENPTE9SX1dpbkNvbG9ybWFwOwogCiBHRElPQkpIRFIgKiBQQUxFVFRFX3N5c3RlbVBhbGV0dGU7CiAKLXN0YXRpYyBpbnQgU3lzQ29sb3JQaXhlbHNbTkJfUkVTRVJWRURfQ09MT1JTXTsKLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQQUxFVFRFX0luaXQKICAqLwogQk9PTCBQQUxFVFRFX0luaXQoKQogewotICAgIGludCBpLCBzaXplLCBwaXhlbDsKLSAgICBYQ29sb3Igc2VydmVyQ29sb3IsIGV4YWN0Q29sb3I7CisgICAgaW50IGksIHNpemU7CisgICAgWENvbG9yIGNvbG9yOworICAgIENvbG9ybWFwIG1hcDsKICAgICBIUEFMRVRURSBocGFsZXR0ZTsKICAgICBMT0dQQUxFVFRFICogcGFsUHRyOwogCi0gICAgc2l6ZSA9IERlZmF1bHRWaXN1YWwoWFRfZGlzcGxheSxEZWZhdWx0U2NyZWVuKFhUX2Rpc3BsYXkpKS0+bWFwX2VudHJpZXM7CisgICAgc2l6ZSA9IERlZmF1bHRWaXN1YWwoIFhUX2Rpc3BsYXksIERlZmF1bHRTY3JlZW4oWFRfZGlzcGxheSkgKS0+bWFwX2VudHJpZXM7CiAgICAgcGFsUHRyID0gbWFsbG9jKCBzaXplb2YoTE9HUEFMRVRURSkgKyAoc2l6ZS0xKSpzaXplb2YoUEFMRVRURUVOVFJZKSApOwogICAgIGlmICghcGFsUHRyKSByZXR1cm4gRkFMU0U7CiAgICAgcGFsUHRyLT5wYWxWZXJzaW9uID0gMHgzMDA7CiAgICAgcGFsUHRyLT5wYWxOdW1FbnRyaWVzID0gc2l6ZTsKICAgICBtZW1zZXQoIHBhbFB0ci0+cGFsUGFsRW50cnksIDB4ZmYsIHNpemUqc2l6ZW9mKFBBTEVUVEVFTlRSWSkgKTsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTkJfUkVTRVJWRURfQ09MT1JTOyBpKyspCisKKyAgICBpZiAoKG1hcCA9IENPTE9SX1dpbkNvbG9ybWFwKSA9PSBDb3B5RnJvbVBhcmVudCkKKwltYXAgPSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbiggWFRfc2NyZWVuICk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgIHsKLQlpZiAoWEFsbG9jTmFtZWRDb2xvciggWFRfZGlzcGxheSwKLQkJCSAgICAgIERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKCBYVF9zY3JlZW4gKSwKLQkJCSAgICAgIFJlc2VydmVkQ29sb3JzW2ldLCAKLQkJCSAgICAgICZzZXJ2ZXJDb2xvciwgJmV4YWN0Q29sb3IgKSkKLQl7Ci0JICAgIHBpeGVsID0gc2VydmVyQ29sb3IucGl4ZWw7Ci0JICAgIHBhbFB0ci0+cGFsUGFsRW50cnlbcGl4ZWxdLnBlUmVkICAgPSBzZXJ2ZXJDb2xvci5yZWQgPj4gODsKLQkgICAgcGFsUHRyLT5wYWxQYWxFbnRyeVtwaXhlbF0ucGVHcmVlbiA9IHNlcnZlckNvbG9yLmdyZWVuID4+IDg7Ci0JICAgIHBhbFB0ci0+cGFsUGFsRW50cnlbcGl4ZWxdLnBlQmx1ZSAgPSBzZXJ2ZXJDb2xvci5ibHVlID4+IDg7Ci0JICAgIHBhbFB0ci0+cGFsUGFsRW50cnlbcGl4ZWxdLnBlRmxhZ3MgPSAwOwotCX0KKwljb2xvci5waXhlbCA9IGk7CisJWFF1ZXJ5Q29sb3IoIFhUX2Rpc3BsYXksIG1hcCwgJmNvbG9yICk7CisJcGFsUHRyLT5wYWxQYWxFbnRyeVtpXS5wZVJlZCAgID0gY29sb3IucmVkID4+IDg7CisJcGFsUHRyLT5wYWxQYWxFbnRyeVtpXS5wZUdyZWVuID0gY29sb3IuZ3JlZW4gPj4gODsKKwlwYWxQdHItPnBhbFBhbEVudHJ5W2ldLnBlQmx1ZSAgPSBjb2xvci5ibHVlID4+IDg7CisJcGFsUHRyLT5wYWxQYWxFbnRyeVtpXS5wZUZsYWdzID0gMDsJCiAgICAgfQorCiAgICAgaHBhbGV0dGUgPSBDcmVhdGVQYWxldHRlKCBwYWxQdHIgKTsKICAgICBQQUxFVFRFX3N5c3RlbVBhbGV0dGUgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0FERFIoIGhwYWxldHRlICk7CiAgICAgZnJlZSggcGFsUHRyICk7CkBAIC0xNTgsMTAgKzEzNSwxOCBAQAogICAgIAogICAgIHBhbFB0ciA9IChQQUxFVFRFT0JKICopIEdESV9HZXRPYmpQdHIoIGhwYWxldHRlLCBQQUxFVFRFX01BR0lDICk7CiAgICAgaWYgKCFwYWxQdHIpIHJldHVybiAwOworCisgICAgaWYgKENPTE9SX1dpbkNvbG9ybWFwICYmIChocGFsZXR0ZSA9PSBTVE9DS19ERUZBVUxUX1BBTEVUVEUpKQorICAgIHsKKwlpZiAoKGNvbG9yICYgMHhmZmZmZmYpID09IDApIHJldHVybiAwOyAgLyogRW50cnkgMCBpcyBibGFjayAqLworCWlmICgoY29sb3IgJiAweGZmZmZmZikgPT0gMHhmZmZmZmYpICAgICAvKiBNYXggZW50cnkgaXMgd2hpdGUgKi8KKwkgICAgcmV0dXJuIHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzIC0gMTsKKyAgICB9CiAgICAgCiAgICAgciA9IEdldFJWYWx1ZShjb2xvcik7CiAgICAgZyA9IEdldEdWYWx1ZShjb2xvcik7CiAgICAgYiA9IEdldEJWYWx1ZShjb2xvcik7CisKICAgICBlbnRyeSA9IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeTsKICAgICBmb3IgKGkgPSAwLCBtaW5EaXN0ID0gTUFYSU5UOyBpIDwgcGFsUHRyLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXM7IGkrKykKICAgICB7CmRpZmYgLS1naXQgYS9vYmplY3RzL3JlZ2lvbi5jIGIvb2JqZWN0cy9yZWdpb24uYwppbmRleCAyYzIyZWU0Li4wODI3NGNhIDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTUzOSwxNyArNTM5LDIwIEBACiAgICAgICBjYXNlIFJHTl9BTkQ6CiAJcmVzID0gSW50ZXJzZWN0UmVjdCggJnJlZ2lvbi0+Ym94LCAmc3JjMU9iai0+cmVnaW9uLmJveCwKIAkJCSAgICAgJnNyYzJPYmotPnJlZ2lvbi5ib3ggKTsKKwlyZWdpb24tPnR5cGUgPSBDT01QTEVYUkVHSU9OOwogCWJyZWFrOwogCiAgICAgICBjYXNlIFJHTl9PUjoKICAgICAgIGNhc2UgUkdOX1hPUjoKIAlyZXMgPSBVbmlvblJlY3QoICZyZWdpb24tPmJveCwgJnNyYzFPYmotPnJlZ2lvbi5ib3gsCiAJCQkgJnNyYzJPYmotPnJlZ2lvbi5ib3ggKTsKKwlyZWdpb24tPnR5cGUgPSBDT01QTEVYUkVHSU9OOwogCWJyZWFrOwogCiAgICAgICBjYXNlIFJHTl9ESUZGOgogCXJlcyA9IFN1YnRyYWN0UmVjdCggJnJlZ2lvbi0+Ym94LCAmc3JjMU9iai0+cmVnaW9uLmJveCwKIAkJCSAgICAmc3JjMk9iai0+cmVnaW9uLmJveCApOworCXJlZ2lvbi0+dHlwZSA9IENPTVBMRVhSRUdJT047CiAJYnJlYWs7CiAKICAgICAgIGNhc2UgUkdOX0NPUFk6CkBAIC01ODIsNyArNTg1LDcgQEAKIAkgIFJFR0lPTl9Db3B5SW50ZXJzZWN0aW9uKCByZWdpb24sICZzcmMxT2JqLT5yZWdpb24gKTsKIAkgIFhTZXRGdW5jdGlvbiggWFRfZGlzcGxheSwgcmVnaW9uR0MsIEdYYW5kICk7CiAJICBSRUdJT05fQ29weUludGVyc2VjdGlvbiggcmVnaW9uLCAmc3JjMk9iai0+cmVnaW9uICk7Ci0JICByZXR1cm4gQ09NUExFWFJFR0lPTjsKKwkgIGJyZWFrOwogCiAgICAgICBjYXNlIFJHTl9PUjoKICAgICAgIGNhc2UgUkdOX1hPUjoKQEAgLTU5Miw3ICs1OTUsNyBAQAogCSAgWFNldEZ1bmN0aW9uKCBYVF9kaXNwbGF5LCByZWdpb25HQywgKG1vZGUgPT0gUkdOX09SKSA/IEdYb3IgOiBHWHhvcik7CiAJICBSRUdJT05fQ29weUludGVyc2VjdGlvbiggcmVnaW9uLCAmc3JjMU9iai0+cmVnaW9uICk7CiAJICBSRUdJT05fQ29weUludGVyc2VjdGlvbiggcmVnaW9uLCAmc3JjMk9iai0+cmVnaW9uICk7Ci0JICByZXR1cm4gQ09NUExFWFJFR0lPTjsKKwkgIGJyZWFrOwogCSAgCiAgICAgICBjYXNlIFJHTl9ESUZGOgogCSAgWFNldEZ1bmN0aW9uKCBYVF9kaXNwbGF5LCByZWdpb25HQywgR1hjbGVhciApOwpAQCAtNjAyLDEzICs2MDUsMTMgQEAKIAkgIFJFR0lPTl9Db3B5SW50ZXJzZWN0aW9uKCByZWdpb24sICZzcmMxT2JqLT5yZWdpb24gKTsKIAkgIFhTZXRGdW5jdGlvbiggWFRfZGlzcGxheSwgcmVnaW9uR0MsIEdYYW5kSW52ZXJ0ZWQgKTsKIAkgIFJFR0lPTl9Db3B5SW50ZXJzZWN0aW9uKCByZWdpb24sICZzcmMyT2JqLT5yZWdpb24gKTsKLQkgIHJldHVybiBDT01QTEVYUkVHSU9OOworCSAgYnJlYWs7CiAJICAKICAgICAgIGNhc2UgUkdOX0NPUFk6CiAJICBYU2V0RnVuY3Rpb24oIFhUX2Rpc3BsYXksIHJlZ2lvbkdDLCBHWGNvcHkgKTsKIAkgIFhDb3B5QXJlYSggWFRfZGlzcGxheSwgc3JjMU9iai0+cmVnaW9uLnBpeG1hcCwgcmVnaW9uLT5waXhtYXAsCiAJCSAgICAgcmVnaW9uR0MsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDAgKTsKLQkgIHJldHVybiByZWdpb24tPnR5cGU7CisJICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIEVSUk9SOworICAgIHJldHVybiByZWdpb24tPnR5cGU7CiB9CmRpZmYgLS1naXQgYS9vZW0yYW5zaS50cmwgYi9vZW0yYW5zaS50cmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjBhYjlmNAotLS0gL2Rldi9udWxsCisrKyBiL29lbTJhbnNpLnRybApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vZW1hbnNpLmV4ZSBiL29lbWFuc2kuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ2YzkwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vZW1hbnNpLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2JsYW5rLmJtcCBiL3Rlc3QvaHlwZXJvaWQvYmxhbmsuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODQwYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL2JsYW5rLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2JvbWIuYm1wIGIvdGVzdC9oeXBlcm9pZC9ib21iLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmNkZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9ib21iLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2NvcHlpbmcudHh0IGIvdGVzdC9oeXBlcm9pZC9jb3B5aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY0ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9jb3B5aW5nLnR4dApAQCAtMCwwICsxLDI5MiBAQAorIA0KKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCisgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEsIEZlYnJ1YXJ5IDE5ODkNCisNCisgQ29weXJpZ2h0IChDKSAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0ENCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzDQorIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLg0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQ0KKw0KKyAgVGhlIGxpY2Vuc2UgYWdyZWVtZW50cyBvZiBtb3N0IHNvZnR3YXJlIGNvbXBhbmllcyB0cnkgdG8ga2VlcCB1c2Vycw0KK2F0IHRoZSBtZXJjeSBvZiB0aG9zZSBjb21wYW5pZXMuICBCeSBjb250cmFzdCwgb3VyIEdlbmVyYWwgUHVibGljDQorTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQ0KK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGUNCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzDQorc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0Lg0KK1lvdSBjYW4gdXNlIGl0IGZvciB5b3VyIHByb2dyYW1zLCB0b28uDQorDQorICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90DQorcHJpY2UuICBTcGVjaWZpY2FsbHksIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGRlc2lnbmVkIHRvIG1ha2UNCitzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZ2l2ZSBhd2F5IG9yIHNlbGwgY29waWVzIG9mIGZyZWUNCitzb2Z0d2FyZSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LA0KK3RoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUNCitwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuDQorDQorICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkDQorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLg0KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91DQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0Lg0KKw0KKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBhIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyDQorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0DQoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUNCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCB0ZWxsIHRoZW0gdGhlaXIgcmlnaHRzLg0KKw0KKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZA0KKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksDQorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4NCisNCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluDQordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUNCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UNCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbw0KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsDQorYXV0aG9ycycgcmVwdXRhdGlvbnMuDQorDQorICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZA0KK21vZGlmaWNhdGlvbiBmb2xsb3cuDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTg0KKw0KKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2gNCitjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZQ0KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUNCisiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZA0KK29uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IHdvcmsgY29udGFpbmluZyB0aGUNCitQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucy4gIEVhY2gNCitsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuDQorDQorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlDQorY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQNCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kDQorZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcw0KK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55DQorb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mDQordHJhbnNmZXJyaW5nIGEgY29weS4NCisNCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YNCitpdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZiBQYXJhZ3JhcGgNCisxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIHRoZSBmb2xsb3dpbmc6DQorDQorICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQNCisgICAgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlOyBhbmQNCisNCisgICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdA0KKyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIGVpdGhlcg0KKyAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbA0KKyAgICB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGV4Y2VwdA0KKyAgICB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IHdhcnJhbnR5IHByb3RlY3Rpb24gdG8gc29tZSBvciBhbGwNCisgICAgdGhpcmQgcGFydGllcywgYXQgeW91ciBvcHRpb24pLg0KKw0KKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5IHdoZW4NCisgICAgcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlDQorICAgIGluIHRoZSBzaW1wbGVzdCBhbmQgbW9zdCB1c3VhbCB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4NCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZQ0KKyAgICB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhDQorICAgIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyIHRoZXNlDQorICAgIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIEdlbmVyYWwNCisgICAgUHVibGljIExpY2Vuc2UuDQorDQorICAgIGQpIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhDQorICAgIGNvcHksIGFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4NCisgICAgZXhjaGFuZ2UgZm9yIGEgZmVlLg0KKw0KK01lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciBpbmRlcGVuZGVudCB3b3JrIHdpdGggdGhlIFByb2dyYW0gKG9yIGl0cw0KK2Rlcml2YXRpdmUpIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nDQordGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoZXNlIHRlcm1zLg0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHBvcnRpb24gb3IgZGVyaXZhdGl2ZSBvZg0KK2l0LCB1bmRlciBQYXJhZ3JhcGggMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZg0KK1BhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOg0KKw0KKyAgICBhKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlDQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLA0KKw0KKyAgICBiKSBhY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQ0KKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwgY2hhcmdlDQorICAgIGZvciB0aGUgY29zdCBvZiBkaXN0cmlidXRpb24pIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQ0KKyAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YNCisgICAgUGFyYWdyYXBocyAxIGFuZCAyIGFib3ZlOyBvciwNCisNCisgICAgYykgYWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB3aGVyZSB0aGUNCisgICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcw0KKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQ0KKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gYWxvbmUuKQ0KKw0KK1NvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcNCittb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgZmlsZSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMNCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwNCitleGNlcHRpb24sIGl0IG5lZWQgbm90IGluY2x1ZGUgc291cmNlIGNvZGUgZm9yIG1vZHVsZXMgd2hpY2ggYXJlIHN0YW5kYXJkDQorbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlDQorZmlsZSBydW5zLCBvciBmb3Igc3RhbmRhcmQgaGVhZGVyIGZpbGVzIG9yIGRlZmluaXRpb25zIGZpbGVzIHRoYXQNCithY2NvbXBhbnkgdGhhdCBvcGVyYXRpbmcgc3lzdGVtLg0KKw0KKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIHRoZQ0KK1Byb2dyYW0gZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuDQorQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2Zlcg0KK3RoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHRvIHVzZQ0KK3RoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQNCitjb3BpZXMsIG9yIHJpZ2h0cyB0byB1c2UgY29waWVzLCBmcm9tIHlvdSB1bmRlciB0aGlzIEdlbmVyYWwgUHVibGljDQorTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMNCityZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLg0KKw0KKyAgNS4gQnkgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQNCitvbiB0aGUgUHJvZ3JhbSkgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIGxpY2Vuc2UgdG8gZG8gc28sDQorYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuDQorDQorICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlDQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwNCitsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvIHRoZXNlDQordGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZQ0KK3JlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uDQorDQorDQorDQorICA3LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucw0KK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbA0KK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bw0KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLg0KKw0KK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0NCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55DQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZg0KK3RoZSBsaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQ0KK0ZvdW5kYXRpb24uDQorDQorICA4LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUNCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yDQordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlDQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzDQorbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMNCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kDQorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuDQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZDQorDQorICA5LiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQ0KK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTg0KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMNCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRA0KK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUw0KK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUNCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywNCitSRVBBSVIgT1IgQ09SUkVDVElPTi4NCisNCisgIDEwLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcNCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SDQorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywNCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcNCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEDQorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZDQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVINCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUNCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuDQorDQorICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQorDQorDQorDQorDQorICAgICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zDQorDQorICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0DQorcG9zc2libGUgdXNlIHRvIGh1bWFuaXR5LCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQNCitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZQ0KK3Rlcm1zLg0KKw0KKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QgdG8NCithdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleQ0KK3RoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlDQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4NCisNCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4NCisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+DQorDQorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikNCisgICAgYW55IGxhdGVyIHZlcnNpb24uDQorDQorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KKw0KK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLg0KKw0KK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMNCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOg0KKw0KKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eHggbmFtZSBvZiBhdXRob3INCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLg0KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0DQorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4NCisNCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUNCithcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlDQorY29tbWFuZHMgeW91IHVzZSBtYXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdw0KK2MnOyB0aGV5IGNvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXINCitwcm9ncmFtLg0KKw0KK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyDQorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYNCituZWNlc3NhcnkuICBIZXJlIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6DQorDQorICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQ0KKyAgcHJvZ3JhbSBgR25vbW92aXNpb24nIChhIHByb2dyYW0gdG8gZGlyZWN0IGNvbXBpbGVycyB0byBtYWtlIHBhc3Nlcw0KKyAgYXQgYXNzZW1ibGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuDQorDQorICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkNCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlDQorDQorVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCENCisgDQpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5jIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTZkNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLmMKQEAgLTAsMCArMSwxODUxIEBACisvLw0KKy8vIEhZUEVST0lEIC0gYSBuZWF0byBnYW1lDQorLy8NCisvLyBWZXJzaW9uOiAxLjEgIENvcHlyaWdodCAoQykgMTk5MCw5MSBIdXRjaGlucyBTb2Z0d2FyZQ0KKy8vICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UNCisvLyAgICAgIFBsZWFzZSByZWFkIHRoZSBhc3NvY2lhdGVkIGxlZ2FsIGRvY3VtZW50YXRpb24NCisvLyBBdXRob3I6IEVkd2FyZCBIdXRjaGlucw0KKy8vIEludGVybmV0OiBlYWgxQGNlYzEud3VzdGwuZWR1DQorLy8gVVNOYWlsOiBjL28gRWR3YXJkIEh1dGNoaW5zLCA2MyBSaWRnZW1vb3IgRHIuLCBDbGF5dG9uLCBNTywgNjMxMDUNCisvLyBSZXZpc2lvbnM6DQorLy8gMTAvMzEvOTEgbWFkZSBnYW1lIGJldHRlci9oYXJkZXIgLSBFZC4NCisvLw0KKy8vIE11c2ljOiBSLkUuTS4vVGhlIEN1cmUvTWluaXN0cnkvRnJvbnQgMjQyL1RoZSBTbWl0aHMvTmV3IE9yZGVyL0hlbmRyaXguLi4NCisvLyBCZWVyczogQmFzcyBBbGUsIEF1Z3NiZXJnZXIgRGFyaw0KKy8vDQorDQorI2luY2x1ZGUgImh5cGVyb2lkLmgiDQorDQorLy8NCisvLyBpbXBvcnRzDQorLy8NCisNCitJTVBPUlQgUE9JTlQgICAgICAgIExldHRlclBhcnRbXSBGUk9NKCByb2lkc3VwcC5jICk7DQorSU1QT1JUIE5QU1RSICAgICAgICBzek51bWJlckRlc2NbXSBGUk9NKCByb2lkc3VwcC5jICk7DQorSU1QT1JUIE5QU1RSICAgICAgICBzekxldHRlckRlc2NbXSBGUk9NKCByb2lkc3VwcC5jICk7DQorDQorLy8NCisvLyBnbG9iYWxzDQorLy8NCisNCitHTE9CQUwgQ0hBUiAgICAgICAgIHN6QXBwTmFtZVszMl07DQorR0xPQkFMIEhBTkRMRSAgICAgICBoQXBwSW5zdDsNCitHTE9CQUwgSFdORCAgICAgICAgIGhBcHBXbmQ7DQorR0xPQkFMIEhQQUxFVFRFICAgICBoQXBwUGFsZXR0ZTsNCitHTE9CQUwgSU5UICAgICAgICAgIG5EcmF3RGVsYXk7DQorR0xPQkFMIElOVCAgICAgICAgICBuTGV2ZWw7DQorR0xPQkFMIElOVCAgICAgICAgICBuU2FmZTsNCitHTE9CQUwgSU5UICAgICAgICAgIG5TaGllbGQ7DQorR0xPQkFMIElOVCAgICAgICAgICBuQm9tYjsNCitHTE9CQUwgSU5UICAgICAgICAgIG5CYWRHdXlzOw0KK0dMT0JBTCBMT05HICAgICAgICAgbFNjb3JlOw0KK0dMT0JBTCBMT05HICAgICAgICAgbExhc3RMaWZlOw0KK0dMT0JBTCBMT05HICAgICAgICAgbEhpZ2hTY29yZTsNCitHTE9CQUwgQk9PTCAgICAgICAgIGJSZXN0YXJ0Ow0KK0dMT0JBTCBCT09MICAgICAgICAgYlBhdXNlZDsNCitHTE9CQUwgQk9PTCAgICAgICAgIGJCVzsNCitHTE9CQUwgSU5UICAgICAgICAgIHZrU2hsZDsNCitHTE9CQUwgSU5UICAgICAgICAgIHZrQ2xrdzsNCitHTE9CQUwgSU5UICAgICAgICAgIHZrQ3RyQ2xrdzsNCitHTE9CQUwgSU5UICAgICAgICAgIHZrVGhyc3Q7DQorR0xPQkFMIElOVCAgICAgICAgICB2a1J2VGhyc3Q7DQorR0xPQkFMIElOVCAgICAgICAgICB2a0ZpcmU7DQorR0xPQkFMIElOVCAgICAgICAgICB2a0JvbWI7DQorR0xPQkFMIE5QT0JKICAgICAgICBucFBsYXllcjsNCitHTE9CQUwgTElTVCAgICAgICAgIEZyZWVMaXN0Ow0KK0dMT0JBTCBMSVNUICAgICAgICAgUm9pZExpc3Q7DQorR0xPQkFMIExJU1QgICAgICAgICBTaG90TGlzdDsNCitHTE9CQUwgTElTVCAgICAgICAgIEZsYW1lTGlzdDsNCitHTE9CQUwgTElTVCAgICAgICAgIFNwaW5uZXJMaXN0Ow0KK0dMT0JBTCBMSVNUICAgICAgICAgSHVudGVyTGlzdDsNCitHTE9CQUwgTElTVCAgICAgICAgIEh1bnRlclNob3RMaXN0Ow0KK0dMT0JBTCBMSVNUICAgICAgICAgU3dhcm1lckxpc3Q7DQorR0xPQkFMIExJU1QgICAgICAgICBMZXR0ZXJMaXN0Ow0KK0dMT0JBTCBMSVNUICAgICAgICAgQm9udXNMaXN0Ow0KK0dMT0JBTCBJTlQgICAgICAgICAgbkNvc1tERUdSRUVfU0laRV07DQorR0xPQkFMIElOVCAgICAgICAgICBuU2luW0RFR1JFRV9TSVpFXTsNCitHTE9CQUwgSFBFTiAgICAgICAgIGhQZW5bUEFMRVRURV9TSVpFXTsNCitHTE9CQUwgT0JKICAgICAgICAgIE9ialtNQVhfT0JKU107DQorR0xPQkFMIEhCSVRNQVAgICAgICBoQml0bWFwW0lEQl9NQVhdOw0KKw0KKy8vDQorLy8gbG9jYWxzDQorLy8NCisNCitMT0NBTCBEV09SRCAgICAgICAgIGR3U2VlZDsNCitMT0NBTCBJTlQgICAgICAgICAgIG5TY29yZUxlbjsNCitMT0NBTCBDSEFSICAgICAgICAgIHN6U2NvcmVbNDBdOw0KK0xPQ0FMIFJFQ1QgICAgICAgICAgcmVjdFNjb3JlQ2xpcDsNCitMT0NBTCBSRUNUICAgICAgICAgIHJlY3RTaG90Q2xpcDsNCitMT0NBTCBQT0lOVCAgICAgICAgIFBsYXllcltdID0NCit7IHswLCAwfSwgezE2MCwgMTUwfSwgezAsIDI1MH0sIHs5NiwgMTUwfSwgezAsIDB9IH07DQorTE9DQUwgUE9JTlQgICAgICAgICBTcGlubmVyW10gPQ0KK3sgezE2MCwgMTUwfSwgezIyNCwgMTAwfSwgezk2LCAxMDB9LCB7MzIsIDE1MH0sIHsxNjAsIDE1MH0gfTsNCitMT0NBTCBQT0lOVCAgICAgICAgIFN3YXJtZXJbXSA9DQoreyB7MCwgMTAwfSwgezY0LCAxMDB9LCB7MTI4LCAxMDB9LCB7MTkyLCAxMDB9LCB7MCwgMTAwfSB9Ow0KK0xPQ0FMIFBPSU5UICAgICAgICAgSHVudGVyW10gPQ0KK3sNCisJezE2MCwgMTUwfSwgezAsIDI1MH0sIHsxOTIsIDMwfSwgezY0LCAzMH0sDQorCXswLCAyNTB9LCB7OTYsIDE1MH0sIHsxMjgsIDE1MH0sIHsxNjAsIDE1MH0NCit9Ow0KK0xPQ0FMIFBPSU5UICAgICAgICAgQm9udXNbXSA9DQoreyB7MCwgMTUwfSwgezEwMiwgMTUwfSwgezIwNSwgMTUwfSwgezUxLCAxNTB9LCB7MTU0LCAxNTB9LCB7MCwgMTUwfSB9Ow0KKw0KKy8vDQorLy8gS2lsbEJhZEd1eSAtIGtpbGwgb2ZmIGEgYmFkZ3V5IChtYWRlIGludG8gYSBtYWNybykNCisvLw0KKw0KKyNkZWZpbmUgS2lsbEJhZEd1eSgpIFwNCisoKC0tbkJhZEd1eXMgPD0gMCk/KFNldFJlc3RhcnQoIFJFU1RBUlRfTkVYVExFVkVMICksVFJVRSk6RkFMU0UpDQorDQorLy8NCisvLyBhcmFuZCAtIHBzZXVkb3JhbmRvbSBudW1iZXIgZnJvbSAwIHRvIHgtMSAodGhhbmtzIGFudG1hbiEpDQorLy8NCisNCitJTlQgTkVBUiBQQVNDQUwgYXJhbmQoIElOVCB4ICkNCit7DQorCWR3U2VlZCA9IGR3U2VlZCAqIDB4MzQzZmQgKyAweDI2OWVjMzsNCisJcmV0dXJuKCAoSU5UKSgoKGR3U2VlZCA+PiAxNikgJiAweDdmZmYpICogeCA+PiAxNSkgKTsNCit9DQorDQorLy8NCisvLyBBZGRIZWFkIC0gYWRkIGFuIG9iamVjdCB0byB0aGUgaGVhZCBvZiBhIGxpc3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgQWRkSGVhZCggTlBMSVNUIG5wTGlzdCwgTlBOT0RFIG5wTm9kZSApDQorew0KKwlpZiAobnBMaXN0LT5ucEhlYWQpDQorCXsNCisJCW5wTm9kZS0+bnBOZXh0ID0gbnBMaXN0LT5ucEhlYWQ7DQorCQlucE5vZGUtPm5wUHJldiA9IE5VTEw7DQorCQlucExpc3QtPm5wSGVhZCA9IChucExpc3QtPm5wSGVhZC0+bnBQcmV2ID0gbnBOb2RlKTsNCisJfQ0KKwllbHNlIC8vIGFkZCB0byBhbiBlbXB0eSBsaXN0DQorCXsNCisJCW5wTGlzdC0+bnBIZWFkID0gbnBMaXN0LT5ucFRhaWwgPSBucE5vZGU7DQorCQlucE5vZGUtPm5wTmV4dCA9IG5wTm9kZS0+bnBQcmV2ID0gTlVMTDsNCisJfQ0KK30NCisNCisvLw0KKy8vIFJlbUhlYWQgLSByZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSBsaXN0DQorLy8NCisNCitOUE5PREUgTkVBUiBQQVNDQUwgUmVtSGVhZCggTlBMSVNUIG5wTGlzdCApDQorew0KKwlpZiAobnBMaXN0LT5ucEhlYWQpDQorCXsNCisJCU5QTk9ERSBucE5vZGUgPSBucExpc3QtPm5wSGVhZDsNCisJCWlmIChucExpc3QtPm5wVGFpbCAhPSBucE5vZGUpDQorCQl7DQorCQkJbnBMaXN0LT5ucEhlYWQgPSBucE5vZGUtPm5wTmV4dDsNCisJCQlucE5vZGUtPm5wTmV4dC0+bnBQcmV2ID0gTlVMTDsNCisJCX0NCisJCWVsc2UgbnBMaXN0LT5ucEhlYWQgPSBucExpc3QtPm5wVGFpbCA9IE5VTEw7DQorCQlyZXR1cm4oIG5wTm9kZSApOw0KKwl9DQorCWVsc2UgcmV0dXJuKCBOVUxMICk7DQorfQ0KKw0KKy8vDQorLy8gUmVtb3ZlIC0gcmVtb3ZlIGFuIGFyYml0cmFyeSBlbGVtZW50IGZyb20gYSBsaXN0DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIFJlbW92ZSggTlBMSVNUIG5wTGlzdCwgTlBOT0RFIG5wTm9kZSApDQorew0KKwlpZiAobnBOb2RlLT5ucFByZXYpIG5wTm9kZS0+bnBQcmV2LT5ucE5leHQgPSBucE5vZGUtPm5wTmV4dDsNCisJZWxzZSBucExpc3QtPm5wSGVhZCA9IG5wTm9kZS0+bnBOZXh0Ow0KKwlpZiAobnBOb2RlLT5ucE5leHQpIG5wTm9kZS0+bnBOZXh0LT5ucFByZXYgPSBucE5vZGUtPm5wUHJldjsNCisJZWxzZSBucExpc3QtPm5wVGFpbCA9IG5wTm9kZS0+bnBQcmV2Ow0KK30NCisNCisvLw0KKy8vIERyYXdPYmplY3QgLSBkcmF3IGEgc2luZ2xlIG9iamVjdA0KKy8vDQorDQorVk9JRCBORUFSIFBBU0NBTCBEcmF3T2JqZWN0KCBIREMgaERDLCBOUE9CSiBucE9iaiApDQorew0KKwlJTlQgICAgICAgICAgICAgbkNudDsNCisJSU5UICAgICAgICAgICAgIG5EaXIgPSAobnBPYmotPm5EaXIgKz0gbnBPYmotPm5TcGluKTsNCisJSU5UICAgICAgICAgICAgIHggPSAobnBPYmotPlBvcy54ICs9IG5wT2JqLT5WZWwueCk7DQorCUlOVCAgICAgICAgICAgICB5ID0gKG5wT2JqLT5Qb3MueSArPSBucE9iai0+VmVsLnkpOw0KKwlQT0lOVCAgICAgICAgICAgUHRzW01BWF9QVFNdOw0KKw0KKwlpZiAoeCA8IC1DTElQX0NPT1JEKSBucE9iai0+UG9zLnggPSB4ID0gQ0xJUF9DT09SRDsNCisJZWxzZSBpZiAoeCA+IENMSVBfQ09PUkQpIG5wT2JqLT5Qb3MueCA9IHggPSAtQ0xJUF9DT09SRDsNCisJaWYgKHkgPCAtQ0xJUF9DT09SRCkgbnBPYmotPlBvcy55ID0geSA9IENMSVBfQ09PUkQ7DQorCWVsc2UgaWYgKHkgPiBDTElQX0NPT1JEKSBucE9iai0+UG9zLnkgPSB5ID0gLUNMSVBfQ09PUkQ7DQorDQorCWZvciAobkNudCA9IG5wT2JqLT5ieVB0cyAtIDE7IG5DbnQgPj0gMDsgLS1uQ250KQ0KKwl7DQorCQlXT1JEIHdEZWcgPSBERUcoIG5wT2JqLT5QdHNbbkNudF0ueCArIG5EaXIgKTsNCisJCUlOVCBuTGVuID0gbnBPYmotPlB0c1tuQ250XS55Ow0KKwkJUHRzW25DbnRdLnggPSB4ICsgTVVMREVHKCBuTGVuLCBuQ29zW3dEZWddICk7DQorCQlQdHNbbkNudF0ueSA9IHkgKyBNVUxERUcoIG5MZW4sIG5TaW5bd0RlZ10gKTsNCisJfQ0KKw0KKwlpZiAobnBPYmotPmJ5UHRzID4gMSkNCisJew0KKwkJU2VsZWN0T2JqZWN0KCBoREMsIGhQZW5bQkxBQ0tdICk7DQorCQlQb2x5bGluZSggaERDLCBucE9iai0+T2xkLCBucE9iai0+YnlQdHMgKTsNCisJCWlmIChucE9iai0+bkNvdW50ID4gMCkNCisJCXsNCisJCQlTZWxlY3RPYmplY3QoIGhEQywgaFBlbltucE9iai0+YnlDb2xvcl0gKTsNCisJCQlQb2x5bGluZSggaERDLCBQdHMsIG5wT2JqLT5ieVB0cyApOw0KKwkJCWZvciAobkNudCA9IG5wT2JqLT5ieVB0cyAtIDE7IG5DbnQgPj0gMDsgLS1uQ250KQ0KKwkJCQlucE9iai0+T2xkW25DbnRdID0gUHRzW25DbnRdOw0KKwkJfQ0KKwl9DQorCWVsc2UgLy8ganVzdCBhIHBvaW50DQorCXsNCisJCVNldFBpeGVsKCBoREMsIG5wT2JqLT5PbGRbMF0ueCwgbnBPYmotPk9sZFswXS55LCBQQUxFVFRFSU5ERVgoIEJMQUNLICkgKTsNCisJCWlmIChucE9iai0+bkNvdW50ID4gMCkNCisJCXsNCisJCQlTZXRQaXhlbCggaERDLCBQdHNbMF0ueCwgUHRzWzBdLnksIFBBTEVUVEVJTkRFWCggbnBPYmotPmJ5Q29sb3IgKSApOw0KKwkJCW5wT2JqLT5PbGRbMF0gPSBQdHNbMF07DQorCQl9DQorCX0NCit9DQorDQorLy8NCisvLyBTZXRSZXN0YXJ0IC0gc2V0IHRoZSByZXN0YXJ0IHRpbWVyDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIFNldFJlc3RhcnQoIFJFU1RBUlRfTU9ERSBSZXN0YXJ0ICkNCit7DQorCVBPSU5UICAgICAgICAgICBQdDsNCisJQ0hBUiAgICAgICAgICAgIHN6QnVmZlszMl07DQorDQorCWlmIChiUmVzdGFydCkgcmV0dXJuOw0KKwlTZXRUaW1lciggaEFwcFduZCwgUkVTVEFSVF9USU1FUiwgUkVTVEFSVF9ERUxBWSwgTlVMTCApOw0KKwliUmVzdGFydCA9IFRSVUU7DQorDQorCVB0LnggPSBQdC55ID0gMDsNCisJc3dpdGNoIChSZXN0YXJ0KQ0KKwl7DQorCWNhc2UgUkVTVEFSVF9HQU1FOg0KKwkJU3BpbkxldHRlcnMoICJHQU1FIE9WRVIiLCBQdCwgUHQsIFJFRCwgNDAwICk7DQorCQlicmVhazsNCisJY2FzZSBSRVNUQVJUX0xFVkVMOg0KKwkJUHJpbnRMZXR0ZXJzKCAiR0VUIFJFQURZIiwgUHQsIFB0LCBCTFVFLCAzMDAgKTsNCisJCWJyZWFrOw0KKwljYXNlIFJFU1RBUlRfTkVYVExFVkVMOg0KKwkJd3NwcmludGYoIHN6QnVmZiwgIkxFVkVMICV1IiwgbkxldmVsICsgMSApOw0KKwkJUHJpbnRMZXR0ZXJzKCBzekJ1ZmYsIFB0LCBQdCwgQkxVRSwgMzAwICk7DQorCQlicmVhazsNCisJfQ0KK30NCisNCisvLw0KKy8vIFByaW50UGxheWVyTWVzc2FnZSAtIHNob3cgdGhlIHBsYXllciBhIHN0YXR1cyBtZXNzYWdlDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIFByaW50UGxheWVyTWVzc2FnZSggTlBTVFIgbnBzelRleHQgKQ0KK3sNCisJUE9JTlQgUG9zLCBWZWw7DQorDQorCVBvcyA9IG5wUGxheWVyLT5Qb3M7DQorCVBvcy55IC09IDQwMDsNCisJVmVsLnggPSAwOw0KKwlWZWwueSA9IC01MDsNCisJUHJpbnRMZXR0ZXJzKCBucHN6VGV4dCwgUG9zLCBWZWwsIEdSRUVOLCAxNTAgKTsNCit9DQorDQorLy8NCisvLyBBZGRFeHRyYUxpZmUgLSBnaXZlIHRoZSBwbGF5ZXIgYW5vdGhlciBsaWZlDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIEFkZEV4dHJhTGlmZSggVk9JRCApDQorew0KKwlQcmludFBsYXllck1lc3NhZ2UoICJFWFRSQSBMSUZFIiApOw0KKwkrK25wUGxheWVyLT5uQ291bnQ7DQorCW5wUGxheWVyLT5ieUNvbG9yID0gKEJZVEUpKEJMQUNLICsgbnBQbGF5ZXItPm5Db3VudCk7DQorCWlmIChucFBsYXllci0+YnlDb2xvciA+IFdISVRFKSBucFBsYXllci0+YnlDb2xvciA9IFdISVRFOw0KK30NCisNCisvLw0KKy8vIEhpdCAtIHNvbWV0aGluZyBoaXQgYW4gb2JqZWN0LCBkbyBmaXJld29ya3MNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgSGl0KCBIREMgaERDLCBOUE9CSiBucE9iaiApDQorew0KKwlJTlQgICAgICAgICAgICAgbkNudDsNCisNCisJZm9yIChuQ250ID0gMDsgbkNudCA8IDY7ICsrbkNudCkNCisJew0KKwkJTlBPQkogbnBGbGFtZSA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApOw0KKwkJaWYgKCFucEZsYW1lKSByZXR1cm47DQorCQlucEZsYW1lLT5Qb3MueCA9IG5wT2JqLT5Qb3MueDsNCisJCW5wRmxhbWUtPlBvcy55ID0gbnBPYmotPlBvcy55Ow0KKwkJbnBGbGFtZS0+VmVsLnggPSBucE9iai0+VmVsLng7DQorCQlucEZsYW1lLT5WZWwueSA9IG5wT2JqLT5WZWwueTsNCisJCW5wRmxhbWUtPm5EaXIgPSBucE9iai0+bkRpciArIChuQ250ICogREVHUkVFX1NJWkUpIC8gNjsNCisJCW5wRmxhbWUtPm5TcGluID0gMDsNCisJCW5wRmxhbWUtPm5Db3VudCA9IDEwICsgYXJhbmQoIDggKTsNCisJCW5wRmxhbWUtPmJ5Q29sb3IgPSBZRUxMT1c7DQorCQlucEZsYW1lLT5ieVB0cyA9IDE7DQorCQlucEZsYW1lLT5QdHNbMF0ueCA9IG5wRmxhbWUtPlB0c1swXS55ID0gMDsNCisJCUFDQ0VMKCBucEZsYW1lLCBucEZsYW1lLT5uRGlyLCA1MCAtIG5wRmxhbWUtPm5Db3VudCApOw0KKwkJQWRkSGVhZE9iaiggJkZsYW1lTGlzdCwgbnBGbGFtZSApOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gRXhwbG9kZSAtIGV4cGxvZGUgYW4gb2JqZWN0DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIEV4cGxvZGUoIEhEQyBoREMsIE5QT0JKIG5wT2JqICkNCit7DQorCUlOVCAgICAgICAgICAgICBuQ250LCBuU2l6ZSA9IG5wT2JqLT5ieVB0czsNCisNCisJRHJhd09iamVjdCggaERDLCBucE9iaiApOw0KKwlmb3IgKG5DbnQgPSAwOyBuQ250IDwgblNpemU7ICsrbkNudCkNCisJew0KKwkJTlBPQkogbnBGbGFtZTsNCisJCWlmIChhcmFuZCggMiApKSBjb250aW51ZTsNCisJCWlmICghKG5wRmxhbWUgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkpIHJldHVybjsNCisJCW5wRmxhbWUtPlBvcy54ID0gbnBPYmotPlBvcy54Ow0KKwkJbnBGbGFtZS0+UG9zLnkgPSBucE9iai0+UG9zLnk7DQorCQlucEZsYW1lLT5WZWwueCA9IG5wT2JqLT5WZWwueDsNCisJCW5wRmxhbWUtPlZlbC55ID0gbnBPYmotPlZlbC55Ow0KKwkJbnBGbGFtZS0+bkRpciA9IG5wT2JqLT5uRGlyICsgbkNudCAqIERFR1JFRV9TSVpFIC8gblNpemUgKyBhcmFuZCggMzIgKTsNCisJCW5wRmxhbWUtPm5TcGluID0gYXJhbmQoIDMxICkgLSAxNTsNCisJCW5wRmxhbWUtPm5Db3VudCA9IDI1ICsgYXJhbmQoIDE2ICk7DQorCQlucEZsYW1lLT5ieUNvbG9yID0gbnBPYmotPmJ5Q29sb3I7DQorCQlucEZsYW1lLT5ieVB0cyA9IDI7DQorCQlucEZsYW1lLT5QdHNbMF0gPSBucE9iai0+UHRzW25DbnRdOw0KKwkJaWYgKG5DbnQgPT0gblNpemUgLSAxKSBucEZsYW1lLT5QdHNbMV0gPSBucE9iai0+UHRzWzBdOw0KKwkJZWxzZSBucEZsYW1lLT5QdHNbMV0gPSBucE9iai0+UHRzW25DbnQgKyAxXTsNCisJCUFDQ0VMKCBucEZsYW1lLCBucEZsYW1lLT5uRGlyLCA2MCAtIG5wRmxhbWUtPm5Db3VudCApOw0KKwkJQWRkSGVhZE9iaiggJkZsYW1lTGlzdCwgbnBGbGFtZSApOw0KKwl9DQorCUhpdCggaERDLCBucE9iaiApOw0KK30NCisNCisvLw0KKy8vIEhpdFBsYXllciAtIGJsb3cgdXAgdGhlIHBsYXllcg0KKy8vDQorDQorQk9PTCBORUFSIFBBU0NBTCBIaXRQbGF5ZXIoIEhEQyBoREMsIE5QT0JKIG5wT2JqICkNCit7DQorCVBPSU5UICAgICAgICAgICBWZWw7DQorCUlOVCAgICAgICAgICAgICBuTWFzcywgblNwaW47DQorDQorCWlmIChuU2FmZSB8fCAobnBQbGF5ZXItPm5Db3VudCA8PSAwKSkgcmV0dXJuKCBGQUxTRSApOw0KKw0KKwkvLyBydW1ibGUgYW5kIHNoYWtlIGJvdGggb2JqZWN0cw0KKwluTWFzcyA9IG5wUGxheWVyLT5uTWFzcyArIG5wT2JqLT5uTWFzczsNCisNCisJblNwaW4gPSBucFBsYXllci0+blNwaW4gKyBucE9iai0+blNwaW47DQorCW5wT2JqLT5uU3BpbiAtPSBNdWxEaXYoIG5TcGluLCBucFBsYXllci0+bk1hc3MsIG5NYXNzICk7DQorCW5wUGxheWVyLT5uU3BpbiAtPSBNdWxEaXYoIG5TcGluLCBucE9iai0+bk1hc3MsIG5NYXNzICk7DQorDQorCVZlbC54ID0gbnBQbGF5ZXItPlZlbC54IC0gbnBPYmotPlZlbC54Ow0KKwlWZWwueSA9IG5wUGxheWVyLT5WZWwueSAtIG5wT2JqLT5WZWwueTsNCisJbnBPYmotPlZlbC54ICs9IE11bERpdiggVmVsLngsIG5wUGxheWVyLT5uTWFzcywgbk1hc3MgKTsNCisJbnBPYmotPlZlbC55ICs9IE11bERpdiggVmVsLnksIG5wUGxheWVyLT5uTWFzcywgbk1hc3MgKTsNCisJbnBQbGF5ZXItPlZlbC54IC09IE11bERpdiggVmVsLngsIG5wT2JqLT5uTWFzcywgbk1hc3MgKTsNCisJbnBQbGF5ZXItPlZlbC55IC09IE11bERpdiggVmVsLnksIG5wT2JqLT5uTWFzcywgbk1hc3MgKTsNCisNCisJaWYgKC0tbnBQbGF5ZXItPm5Db3VudCkNCisJew0KKwkJbnBQbGF5ZXItPmJ5Q29sb3IgPSAoQllURSkoQkxBQ0sgKyBucFBsYXllci0+bkNvdW50KTsNCisJCWlmIChucFBsYXllci0+YnlDb2xvciA+IFdISVRFKSBucFBsYXllci0+YnlDb2xvciA9IFdISVRFOw0KKwkJSGl0KCBoREMsIG5wUGxheWVyICk7DQorCQlyZXR1cm4oIFRSVUUgKTsNCisJfQ0KKw0KKwkvLyBmaW5hbCBkZWF0aA0KKwlucFBsYXllci0+YnlDb2xvciA9IFdISVRFOw0KKwlFeHBsb2RlKCBoREMsIG5wUGxheWVyICk7DQorCVNldFJlc3RhcnQoIFJFU1RBUlRfR0FNRSApOw0KKwlyZXR1cm4oIEZBTFNFICk7DQorfQ0KKw0KKy8vDQorLy8gQ3JlYXRlTGV0dGVyIC0gbWFrZSBhIG5ldyBsZXR0ZXIgb2JqZWN0DQorLy8NCisNCitOUE9CSiBGQVIgUEFTQ0FMIENyZWF0ZUxldHRlciggQ0hBUiBjTGV0dGVyLCBJTlQgblNpemUgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wTHRyOw0KKwlJTlQgICAgICAgICAgICAgbkNudDsNCisJTlBTVFIgICAgICAgICAgIG5wRGVzYzsNCisNCisJaWYgKGNMZXR0ZXIgPj0gJzAnICYmIGNMZXR0ZXIgPD0gJzknKSBucERlc2MgPSBzek51bWJlckRlc2NbY0xldHRlciAtICcwJ107DQorCWVsc2UgaWYgKGNMZXR0ZXIgPj0gJ0EnICYmIGNMZXR0ZXIgPD0gJ1onKSBucERlc2MgPSBzekxldHRlckRlc2NbY0xldHRlciAtICdBJ107DQorCWVsc2UgaWYgKGNMZXR0ZXIgPj0gJ2EnICYmIGNMZXR0ZXIgPD0gJ3onKSBucERlc2MgPSBzekxldHRlckRlc2NbY0xldHRlciAtICdhJ107DQorCWVsc2UgaWYgKGNMZXR0ZXIgPT0gJy4nKSBucERlc2MgPSAibCI7DQorCWVsc2UgcmV0dXJuKCBOVUxMICk7DQorDQorCWlmIChucEx0ciA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApKQ0KKwl7DQorCQlucEx0ci0+bk1hc3MgPSAxOw0KKwkJbnBMdHItPm5EaXIgPSAwOw0KKwkJbnBMdHItPm5TcGluID0gMDsNCisJCW5wTHRyLT5uQ291bnQgPSA0MDsNCisJCW5wTHRyLT5ieUNvbG9yID0gV0hJVEU7DQorCQlucEx0ci0+YnlQdHMgPSAoQllURSkobkNudCA9IHN0cmxlbiggbnBEZXNjICkpOw0KKwkJd2hpbGUgKG5DbnQtLSkNCisJCXsNCisJCQlucEx0ci0+UHRzW25DbnRdID0gTGV0dGVyUGFydFtucERlc2NbbkNudF0gLSAnYSddOw0KKwkJCW5wTHRyLT5QdHNbbkNudF0ueSA9IE11bERpdiggbnBMdHItPlB0c1tuQ250XS55LCBuU2l6ZSwgTEVUVEVSX01BWCApOw0KKwkJfQ0KKwkJQWRkSGVhZE9iaiggJkxldHRlckxpc3QsIG5wTHRyICk7DQorCX0NCisJcmV0dXJuKCBucEx0ciApOw0KK30NCisNCisvLw0KKy8vIERyYXdMZXR0ZXJzIC0gZHJhdyBsZXR0ZXJzIGFuZCBzdWNoDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdMZXR0ZXJzKCBIREMgaERDICkNCit7DQorCU5QT0JKICAgICAgICAgICBucEx0ciwgbnBOZXh0Ow0KKw0KKwlmb3IgKG5wTHRyID0gSGVhZE9iaiggJkxldHRlckxpc3QgKTsgbnBMdHI7IG5wTHRyID0gbnBOZXh0KQ0KKwl7DQorCQlucE5leHQgPSBOZXh0T2JqKCBucEx0ciApOw0KKwkJc3dpdGNoICgtLW5wTHRyLT5uQ291bnQpDQorCQl7DQorCQljYXNlIDM6DQorCQkJLS1ucEx0ci0+YnlDb2xvcjsNCisJCQlicmVhazsNCisJCWNhc2UgMDoNCisJCQlSZW1vdmVPYmooICZMZXR0ZXJMaXN0LCBucEx0ciApOw0KKwkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBMdHIgKTsNCisJCQlicmVhazsNCisJCX0NCisJCURyYXdPYmplY3QoIGhEQywgbnBMdHIgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIENyZWF0ZUJvbnVzIC0gbWFrZSBhIG5ldyBib251cyBvYmplY3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgQ3JlYXRlQm9udXMoIFZPSUQgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wQm9udXM7DQorCUlOVCAgICAgICAgICAgICBuQ250Ow0KKw0KKwlpZiAobnBCb251cyA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApKQ0KKwl7DQorCQlucEJvbnVzLT5Qb3MueCA9IGFyYW5kKCBDTElQX0NPT1JEICogMiApIC0gQ0xJUF9DT09SRDsNCisJCW5wQm9udXMtPlBvcy55ID0gLUNMSVBfQ09PUkQ7DQorCQlucEJvbnVzLT5WZWwueCA9IG5wQm9udXMtPlZlbC55ID0gMDsNCisJCW5wQm9udXMtPm5EaXIgPSBhcmFuZCggREVHUkVFX1NJWkUgKTsNCisJCW5wQm9udXMtPm5TcGluID0gKGFyYW5kKCAyICkgPyAxMiA6IC0xMik7DQorCQlucEJvbnVzLT5uQ291bnQgPSBhcmFuZCggNCApICsgMTsNCisJCW5wQm9udXMtPm5EZWxheSA9IDY0ICsgYXJhbmQoIDEyOCApOw0KKwkJbnBCb251cy0+bk1hc3MgPSAxOw0KKwkJbnBCb251cy0+YnlDb2xvciA9IChCWVRFKShXSElURSArIChucEJvbnVzLT5uQ291bnQgKiAyKSk7DQorCQlucEJvbnVzLT5ieVB0cyA9IERJTShCb251cyk7DQorCQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgRElNKEJvbnVzKTsgKytuQ250KQ0KKwkJCW5wQm9udXMtPlB0c1tuQ250XSA9IEJvbnVzW25DbnRdOw0KKwkJQUNDRUwoIG5wQm9udXMsIG5wQm9udXMtPm5EaXIsIDMwICsgbkxldmVsICogMiApOw0KKwkJQWRkSGVhZE9iaiggJkJvbnVzTGlzdCwgbnBCb251cyApOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gRHJhd0JvbnVzZXMgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBib251cyBsaXN0DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdCb251c2VzKCBIREMgaERDICkNCit7DQorCU5QT0JKICAgICAgICAgICBucEJvbnVzLCBucE5leHQ7DQorCUxPQ0FMIElOVCAgICAgICBuTmV4dEJvbnVzID0gMTAwMDsNCisNCisJaWYgKG5CYWRHdXlzICYmICgtLW5OZXh0Qm9udXMgPCAwKSkNCisJew0KKwkJQ3JlYXRlQm9udXMoKTsNCisJCW5OZXh0Qm9udXMgPSAxMDAwOw0KKwl9DQorDQorCWZvciAobnBCb251cyA9IEhlYWRPYmooICZCb251c0xpc3QgKTsgbnBCb251czsgbnBCb251cyA9IG5wTmV4dCkNCisJew0KKwkJTlBPQkogICAgICAgICAgIG5wU2hvdDsNCisJCUlOVCAgICAgICAgICAgICBuRGVsdGE7DQorCQlSRUNUICAgICAgICAgICAgcmVjdDsNCisNCisJCW5wTmV4dCA9IE5leHRPYmooIG5wQm9udXMgKTsNCisNCisJCU1LUkVDVCggJnJlY3QsIG5wQm9udXMtPlBvcywgMTUwICk7DQorDQorCQlpZiAoUFRJTlJFQ1QoICZyZWN0LCBucFBsYXllci0+UG9zICkpDQorCQl7DQorCQkJaWYgKG5wUGxheWVyLT5uQ291bnQgPiAwKSBzd2l0Y2ggKG5wQm9udXMtPm5Db3VudCkNCisJCQl7DQorCQkJY2FzZSAxOg0KKwkJCQl7DQorCQkJCQlDSEFSIHN6QnVmZlszMl07DQorCQkJCQlMT05HIGxCb251cyA9IDEwMDBMICogbkxldmVsOw0KKwkJCQkJaWYgKGxCb251cyA9PSAwKSBsQm9udXMgPSA1MDA7DQorCQkJCQlsU2NvcmUgKz0gbEJvbnVzOw0KKwkJCQkJd3NwcmludGYoIHN6QnVmZiwgIiVsZCIsIGxCb251cyApOw0KKwkJCQkJUHJpbnRQbGF5ZXJNZXNzYWdlKCBzekJ1ZmYgKTsNCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIDI6DQorCQkJCW5TYWZlID0gMTU7DQorCQkJCSsrblNoaWVsZDsNCisJCQkJbnBQbGF5ZXItPmJ5Q29sb3IgPSBHUkVFTjsNCisJCQkJUHJpbnRQbGF5ZXJNZXNzYWdlKCAiRVhUUkEgU0hJRUxEIiApOw0KKwkJCQlicmVhazsNCisJCQljYXNlIDM6DQorCQkJCSsrbkJvbWI7DQorCQkJCVByaW50UGxheWVyTWVzc2FnZSggIkVYVFJBIEJPTUIiICk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgNDoNCisJCQkJQWRkRXh0cmFMaWZlKCk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQlucEJvbnVzLT5uQ291bnQgPSAwOw0KKwkJCUV4cGxvZGUoIGhEQywgbnBCb251cyApOw0KKwkJCVJlbW92ZU9iaiggJkJvbnVzTGlzdCwgbnBCb251cyApOw0KKwkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBCb251cyApOw0KKwkJfQ0KKwkJZWxzZSBpZiAoSU5UUkVDVCgmcmVjdCwgJnJlY3RTaG90Q2xpcCkpDQorCQl7DQorCQkJZm9yIChucFNob3QgPSBIZWFkT2JqKCAmU2hvdExpc3QgKTsgbnBTaG90OyBucFNob3QgPSBOZXh0T2JqKCBucFNob3QgKSkNCisJCQl7DQorCQkJCWlmICghUFRJTlJFQ1QoICZyZWN0LCBucFNob3QtPlBvcyApKSBjb250aW51ZTsNCisJCQkJbnBTaG90LT5uQ291bnQgPSAxOw0KKwkJCQlucEJvbnVzLT5uQ291bnQgPSAwOw0KKwkJCQlFeHBsb2RlKCBoREMsIG5wQm9udXMgKTsNCisJCQkJUmVtb3ZlT2JqKCAmQm9udXNMaXN0LCBucEJvbnVzICk7DQorCQkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBCb251cyApOw0KKwkJCX0NCisJCX0NCisJCWlmIChucEJvbnVzLT5uQ291bnQgJiYgLS1ucEJvbnVzLT5uRGVsYXkgPD0gMCkNCisJCXsNCisJCQktLW5wQm9udXMtPm5Db3VudDsNCisJCQlucEJvbnVzLT5uRGVsYXkgPSA2NCArIGFyYW5kKCAxMjggKTsNCisJCQlucEJvbnVzLT5ieUNvbG9yID0gKEJZVEUpKFdISVRFICsgKG5wQm9udXMtPm5Db3VudCAqIDIpKTsNCisJCQlpZiAobnBCb251cy0+bkNvdW50ID09IDApDQorCQkJew0KKwkJCQlFeHBsb2RlKCBoREMsIG5wQm9udXMgKTsNCisJCQkJUmVtb3ZlT2JqKCAmQm9udXNMaXN0LCBucEJvbnVzICk7DQorCQkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBCb251cyApOw0KKwkJCX0NCisJCX0NCisJCW5EZWx0YSA9IG5wUGxheWVyLT5Qb3MueCAtIG5wQm9udXMtPlBvcy54Ow0KKwkJd2hpbGUgKG5EZWx0YSA8IC0xNiB8fCBuRGVsdGEgPiAxNikgbkRlbHRhIC89IDI7DQorCQlucEJvbnVzLT5WZWwueCArPSBuRGVsdGEgLSBucEJvbnVzLT5WZWwueCAvIDE2Ow0KKwkJbkRlbHRhID0gbnBQbGF5ZXItPlBvcy55IC0gbnBCb251cy0+UG9zLnk7DQorCQl3aGlsZSAobkRlbHRhIDwgLTE2IHx8IG5EZWx0YSA+IDE2KSBuRGVsdGEgLz0gMjsNCisJCW5wQm9udXMtPlZlbC55ICs9IG5EZWx0YSAtIG5wQm9udXMtPlZlbC55IC8gMTY7DQorCQlEcmF3T2JqZWN0KCBoREMsIG5wQm9udXMgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIERyYXdIdW50ZXJTaG90cyAtIHByb2Nlc3MgYW5kIGRyYXcgdGhlIGh1bnRlciBzaG90IGxpc3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd0h1bnRlclNob3RzKCBIREMgaERDICkNCit7DQorCU5QT0JKICAgICAgICAgICBucFNob3QsIG5wTmV4dDsNCisNCisJZm9yIChucFNob3QgPSBIZWFkT2JqKCAmSHVudGVyU2hvdExpc3QgKTsgbnBTaG90OyBucFNob3QgPSBucE5leHQpDQorCXsNCisJCVJFQ1QgICAgICAgICAgICByZWN0Ow0KKw0KKwkJbnBOZXh0ID0gTmV4dE9iaiggbnBTaG90ICk7DQorDQorCQlNS1JFQ1QoICZyZWN0LCBucFNob3QtPlBvcywgMjAwICk7DQorDQorCQlpZiAoUFRJTlJFQ1QoICZyZWN0LCBucFBsYXllci0+UG9zICkpDQorCQl7DQorCQkJSGl0UGxheWVyKCBoREMsIG5wU2hvdCApOw0KKwkJCW5wU2hvdC0+bkNvdW50ID0gMTsNCisJCX0NCisJCXN3aXRjaCAoLS1ucFNob3QtPm5Db3VudCkNCisJCXsNCisJCWNhc2UgNzoNCisJCQlucFNob3QtPmJ5Q29sb3IgPSBES0dSRUVOOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSAwOg0KKwkJCVJlbW92ZU9iaiggJkh1bnRlclNob3RMaXN0LCBucFNob3QgKTsNCisJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wU2hvdCApOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJRHJhd09iamVjdCggaERDLCBucFNob3QgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIEZpcmVIdW50ZXJTaG90IC0gZmlyZSBhIGh1bnRlciBidWxsZXQNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRmlyZUh1bnRlclNob3QoIE5QT0JKIG5wSHVudCApDQorew0KKwlOUE9CSiAgICAgICAgICAgbnBTaG90Ow0KKw0KKwlpZiAobnBTaG90ID0gUmVtSGVhZE9iaiggJkZyZWVMaXN0ICkpDQorCXsNCisJCW5wU2hvdC0+UG9zLnggPSBucEh1bnQtPlBvcy54Ow0KKwkJbnBTaG90LT5Qb3MueSA9IG5wSHVudC0+UG9zLnk7DQorCQlucFNob3QtPlZlbC54ID0gbnBIdW50LT5WZWwueDsNCisJCW5wU2hvdC0+VmVsLnkgPSBucEh1bnQtPlZlbC55Ow0KKwkJbnBTaG90LT5uTWFzcyA9IDg7DQorCQlucFNob3QtPm5EaXIgPSBucEh1bnQtPm5EaXIgKyBhcmFuZCggNSApIC0gMjsNCisJCW5wU2hvdC0+blNwaW4gPSAoYXJhbmQoIDIgKSA/IDEwIDogLTEwKTsNCisJCW5wU2hvdC0+bkNvdW50ID0gMTYgKyBhcmFuZCggOCApOw0KKwkJbnBTaG90LT5ieUNvbG9yID0gR1JFRU47DQorCQlucFNob3QtPmJ5UHRzID0gMjsNCisJCW5wU2hvdC0+UHRzWzBdLnggPSAxMjg7DQorCQlucFNob3QtPlB0c1swXS55ID0gNTA7DQorCQlucFNob3QtPlB0c1sxXS54ID0gMDsNCisJCW5wU2hvdC0+UHRzWzFdLnkgPSA1MDsNCisJCUFDQ0VMKCBucFNob3QsIG5wU2hvdC0+bkRpciwgMjAwICsgbnBTaG90LT5uQ291bnQgKTsNCisJCUFkZEhlYWRPYmooICZIdW50ZXJTaG90TGlzdCwgbnBTaG90ICk7DQorCX0NCit9DQorDQorLy8NCisvLyBDcmVhdGVIdW50ZXIgLSBtYWtlIGEgbmV3IGh1bnRlcg0KKy8vDQorDQorVk9JRCBORUFSIFBBU0NBTCBDcmVhdGVIdW50ZXIoIFZPSUQgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wSHVudDsNCisJSU5UICAgICAgICAgICAgIG5DbnQ7DQorDQorCWlmIChucEh1bnQgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCisJew0KKwkJbnBIdW50LT5Qb3MueCA9IGFyYW5kKCBDTElQX0NPT1JEICogMiApIC0gQ0xJUF9DT09SRDsNCisJCW5wSHVudC0+UG9zLnkgPSAtQ0xJUF9DT09SRDsNCisJCW5wSHVudC0+VmVsLnggPSBucEh1bnQtPlZlbC55ID0gMDsNCisJCW5wSHVudC0+bk1hc3MgPSAyNTY7DQorCQlucEh1bnQtPm5EaXIgPSBhcmFuZCggREVHUkVFX1NJWkUgKTsNCisJCW5wSHVudC0+blNwaW4gPSAwOw0KKwkJbnBIdW50LT5uQ291bnQgPSAxICsgYXJhbmQoIG5MZXZlbCApOw0KKwkJbnBIdW50LT5uRGVsYXkgPSAyICsgYXJhbmQoIDEwICk7DQorCQlucEh1bnQtPmJ5Q29sb3IgPSBDWUFOOw0KKwkJbnBIdW50LT5ieVB0cyA9IERJTShIdW50ZXIpOw0KKwkJZm9yIChuQ250ID0gMDsgbkNudCA8IERJTShIdW50ZXIpOyArK25DbnQpDQorCQkJbnBIdW50LT5QdHNbbkNudF0gPSBIdW50ZXJbbkNudF07DQorCQlBQ0NFTCggbnBIdW50LCBucEh1bnQtPm5EaXIsIDMwICsgbkxldmVsICogMiApOw0KKwkJQWRkSGVhZE9iaiggJkh1bnRlckxpc3QsIG5wSHVudCApOw0KKwkJKytuQmFkR3V5czsNCisJfQ0KK30NCisNCisvLw0KKy8vIERyYXdIdW50ZXJzIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgaHVudGVyIGxpc3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd0h1bnRlcnMoIEhEQyBoREMgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wSHVudCwgbnBOZXh0Ow0KKwlMT0NBTCBJTlQgICAgICAgbk5leHRIdW50ZXIgPSAyMDA7DQorDQorCWlmIChuQmFkR3V5cyAmJiAoLS1uTmV4dEh1bnRlciA8IDApKQ0KKwl7DQorCQlDcmVhdGVIdW50ZXIoKTsNCisJCW5OZXh0SHVudGVyID0gMTAwMCArIGFyYW5kKCAxMDAwICkgLSBuTGV2ZWwgKiA4Ow0KKwl9DQorDQorCWZvciAobnBIdW50ID0gSGVhZE9iaiggJkh1bnRlckxpc3QgKTsgbnBIdW50OyBucEh1bnQgPSBucE5leHQpDQorCXsNCisJCU5QT0JKICAgICAgICAgICBucFNob3Q7DQorCQlSRUNUICAgICAgICAgICAgcmVjdDsNCisNCisJCW5wTmV4dCA9IE5leHRPYmooIG5wSHVudCApOw0KKw0KKwkJTUtSRUNUKCAmcmVjdCwgbnBIdW50LT5Qb3MsIDIwMCApOw0KKw0KKwkJaWYgKFBUSU5SRUNUKCAmcmVjdCwgbnBQbGF5ZXItPlBvcyApKQ0KKwkJew0KKwkJCUhpdFBsYXllciggaERDLCBucEh1bnQgKTsNCisJCQktLW5wSHVudC0+bkNvdW50Ow0KKwkJCWlmIChucEh1bnQtPm5Db3VudCA8IDEpDQorCQkJew0KKwkJCQlLaWxsQmFkR3V5KCk7DQorCQkJCW5wSHVudC0+YnlDb2xvciA9IENZQU47DQorCQkJCUV4cGxvZGUoIGhEQywgbnBIdW50ICk7DQorCQkJCVJlbW92ZU9iaiggJkh1bnRlckxpc3QsIG5wSHVudCApOw0KKwkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wSHVudCApOw0KKwkJCX0NCisJCQllbHNlIGlmIChucEh1bnQtPm5Db3VudCA9PSAxKSBucEh1bnQtPmJ5Q29sb3IgPSBES0NZQU47DQorCQl9DQorCQllbHNlIGlmIChJTlRSRUNUKCZyZWN0LCAmcmVjdFNob3RDbGlwKSkNCisJCXsNCisJCQlmb3IgKG5wU2hvdCA9IEhlYWRPYmooICZTaG90TGlzdCApOyBucFNob3Q7IG5wU2hvdCA9IE5leHRPYmooIG5wU2hvdCApKQ0KKwkJCXsNCisJCQkJaWYgKCFQVElOUkVDVCggJnJlY3QsIG5wU2hvdC0+UG9zICkpIGNvbnRpbnVlOw0KKwkJCQlucFNob3QtPm5Db3VudCA9IDE7DQorCQkJCWxTY29yZSArPSBucEh1bnQtPm5Db3VudCAqIDEwMDA7DQorCQkJCWlmICgtLW5wSHVudC0+bkNvdW50IDwgMSkNCisJCQkJew0KKwkJCQkJS2lsbEJhZEd1eSgpOw0KKwkJCQkJbnBIdW50LT5ieUNvbG9yID0gQ1lBTjsNCisJCQkJCUV4cGxvZGUoIGhEQywgbnBIdW50ICk7DQorCQkJCQlSZW1vdmVPYmooICZIdW50ZXJMaXN0LCBucEh1bnQgKTsNCisJCQkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBIdW50ICk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlpZiAobnBIdW50LT5uQ291bnQgPT0gMSkgbnBIdW50LT5ieUNvbG9yID0gREtDWUFOOw0KKwkJCQkJSGl0KCBoREMsIG5wSHVudCApOw0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJCUFDQ0VMKCBucEh1bnQsIG5wSHVudC0+bkRpciwgOCApOw0KKwkJbnBIdW50LT5WZWwueCAtPSBucEh1bnQtPlZlbC54IC8gMTY7DQorCQlucEh1bnQtPlZlbC55IC09IG5wSHVudC0+VmVsLnkgLyAxNjsNCisJCWlmICgtLW5wSHVudC0+bkRlbGF5IDw9IDApDQorCQl7DQorCQkJbnBIdW50LT5uRGVsYXkgPSBhcmFuZCggMTAgKTsNCisJCQlucEh1bnQtPm5TcGluID0gYXJhbmQoIDExICkgLSA1Ow0KKwkJCUZpcmVIdW50ZXJTaG90KCBucEh1bnQgKTsNCisJCX0NCisJCURyYXdPYmplY3QoIGhEQywgbnBIdW50ICk7DQorCX0NCit9DQorDQorLy8NCisvLyBDcmVhdGVTd2FybWVyIC0gbWFrZSBhIG5ldyBzd2FybWVyDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIENyZWF0ZVN3YXJtZXIoIFBPSU5UIFBvcywgSU5UIG5EaXIsIElOVCBuQ291bnQgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wU3dhcm07DQorCUlOVCAgICAgICAgICAgICBuQ250Ow0KKw0KKwlpZiAobnBTd2FybSA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApKQ0KKwl7DQorCQlucFN3YXJtLT5Qb3MgPSBQb3M7DQorCQlucFN3YXJtLT5WZWwueCA9IG5wU3dhcm0tPlZlbC55ID0gMDsNCisJCW5wU3dhcm0tPm5EaXIgPSBuRGlyOw0KKwkJbnBTd2FybS0+blNwaW4gPSBhcmFuZCggMzEgKSAtIDE1Ow0KKwkJbnBTd2FybS0+bkNvdW50ID0gbkNvdW50Ow0KKwkJbnBTd2FybS0+bkRlbGF5ID0gNjQgKyBhcmFuZCggNjQgKTsNCisJCW5wU3dhcm0tPm5NYXNzID0gMzI7DQorCQlucFN3YXJtLT5ieUNvbG9yID0gREtHUkVFTjsNCisJCW5wU3dhcm0tPmJ5UHRzID0gRElNKFN3YXJtZXIpOw0KKwkJZm9yIChuQ250ID0gMDsgbkNudCA8IERJTShTd2FybWVyKTsgKytuQ250KQ0KKwkJew0KKwkJCW5wU3dhcm0tPlB0c1tuQ250XSA9IFN3YXJtZXJbbkNudF07DQorCQkJbnBTd2FybS0+UHRzW25DbnRdLnkgKz0gbkNvdW50ICogMTA7DQorCQl9DQorCQlBQ0NFTCggbnBTd2FybSwgbnBTd2FybS0+bkRpciwgMzAgKyBuTGV2ZWwgKiAyICk7DQorCQlBZGRIZWFkT2JqKCAmU3dhcm1lckxpc3QsIG5wU3dhcm0gKTsNCisJCSsrbkJhZEd1eXM7DQorCX0NCit9DQorDQorLy8NCisvLyBEcmF3U3dhcm1lcnMgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBzd2FybWVyIGxpc3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd1N3YXJtZXJzKCBIREMgaERDICkNCit7DQorCU5QT0JKICAgICAgICAgICBucFN3YXJtLCBucE5leHQ7DQorCUxPQ0FMIElOVCAgICAgICBuTmV4dFN3YXJtZXIgPSAxMDAwOw0KKw0KKwlpZiAobkJhZEd1eXMgJiYgKC0tbk5leHRTd2FybWVyIDwgMCkpDQorCXsNCisJCVBPSU5UIFBvczsNCisJCVBvcy54ID0gYXJhbmQoIENMSVBfQ09PUkQgKiAyICkgLSBDTElQX0NPT1JEOw0KKwkJUG9zLnkgPSAtQ0xJUF9DT09SRDsNCisJCUNyZWF0ZVN3YXJtZXIoIFBvcywgYXJhbmQoIERFR1JFRV9TSVpFICksIDggKyBuTGV2ZWwgKiAyICk7DQorCQluTmV4dFN3YXJtZXIgPSAxMDAwICsgYXJhbmQoIDUwMCApIC0gbkxldmVsICogNDsNCisJfQ0KKw0KKwlmb3IgKG5wU3dhcm0gPSBIZWFkT2JqKCAmU3dhcm1lckxpc3QgKTsgbnBTd2FybTsgbnBTd2FybSA9IG5wTmV4dCkNCisJew0KKwkJTlBPQkogICAgICAgICAgIG5wU2hvdDsNCisJCVJFQ1QgICAgICAgICAgICByZWN0Ow0KKw0KKwkJbnBOZXh0ID0gTmV4dE9iaiggbnBTd2FybSApOw0KKw0KKwkJTUtSRUNUKCAmcmVjdCwgbnBTd2FybS0+UG9zLCAxNTAgKyBucFN3YXJtLT5uQ291bnQgKiAxMCApOw0KKw0KKwkJaWYgKFBUSU5SRUNUKCAmcmVjdCwgbnBQbGF5ZXItPlBvcyApKQ0KKwkJew0KKwkJCUhpdFBsYXllciggaERDLCBucFN3YXJtICk7DQorCQkJbnBTd2FybS0+bkNvdW50ID0gMDsNCisJCX0NCisJCWVsc2UgaWYgKElOVFJFQ1QoJnJlY3QsICZyZWN0U2hvdENsaXApKQ0KKwkJew0KKwkJCWZvciAobnBTaG90ID0gSGVhZE9iaiggJlNob3RMaXN0ICk7IG5wU2hvdDsgbnBTaG90ID0gTmV4dE9iaiggbnBTaG90ICkpDQorCQkJew0KKwkJCQlpZiAoIVBUSU5SRUNUKCAmcmVjdCwgbnBTaG90LT5Qb3MgKSkgY29udGludWU7DQorCQkJCW5wU2hvdC0+bkNvdW50ID0gMTsNCisJCQkJbFNjb3JlICs9IG5wU3dhcm0tPm5Db3VudCAqIDI1Ow0KKwkJCQlucFN3YXJtLT5uQ291bnQgPSAwOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQlpZiAobnBTd2FybS0+bkNvdW50IDw9IDApDQorCQl7DQorCQkJbnBTd2FybS0+YnlDb2xvciA9IEdSRUVOOw0KKwkJCUtpbGxCYWRHdXkoKTsNCisJCQlFeHBsb2RlKCBoREMsIG5wU3dhcm0gKTsNCisJCQlSZW1vdmVPYmooICZTd2FybWVyTGlzdCwgbnBTd2FybSApOw0KKwkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBTd2FybSApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmICgobnBTd2FybS0+bkNvdW50ID4gMSkgJiYgKC0tbnBTd2FybS0+bkRlbGF5IDw9IDApKQ0KKwkJCXsNCisJCQkJSU5UIG5EaXIgPSBhcmFuZCggREVHUkVFX1NJWkUgKTsNCisJCQkJSU5UIG5Db3VudCA9IG5wU3dhcm0tPm5Db3VudCAvIDI7DQorCQkJCUNyZWF0ZVN3YXJtZXIoIG5wU3dhcm0tPlBvcywgbkRpciwgbkNvdW50ICk7DQorCQkJCW5Db3VudCA9IG5wU3dhcm0tPm5Db3VudCAtIG5Db3VudDsNCisJCQkJQ3JlYXRlU3dhcm1lciggbnBTd2FybS0+UG9zLCBuRGlyICsgMTI4LCBuQ291bnQgKTsNCisJCQkJbnBTd2FybS0+bkNvdW50ID0gMDsNCisJCQl9DQorCQkJRHJhd09iamVjdCggaERDLCBucFN3YXJtICk7DQorCQl9DQorCX0NCit9DQorDQorLy8NCisvLyBDcmVhdGVTcGlubmVyIC0gbWFrZSBhIG5ldyBzcGlubmVyDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIENyZWF0ZVNwaW5uZXIoIFZPSUQgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wU3BpbjsNCisJSU5UICAgICAgICAgICAgIG5DbnQ7DQorDQorCWlmIChucFNwaW4gPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCisJew0KKwkJbnBTcGluLT5Qb3MueCA9IGFyYW5kKCBDTElQX0NPT1JEICogMiApIC0gQ0xJUF9DT09SRDsNCisJCW5wU3Bpbi0+UG9zLnkgPSAtQ0xJUF9DT09SRDsNCisJCW5wU3Bpbi0+VmVsLnggPSBucFNwaW4tPlZlbC55ID0gMDsNCisJCW5wU3Bpbi0+bkRpciA9IGFyYW5kKCBERUdSRUVfU0laRSApOw0KKwkJbnBTcGluLT5uU3BpbiA9IC0xMjsNCisJCW5wU3Bpbi0+bkNvdW50ID0gMSArIGFyYW5kKCBuTGV2ZWwgKTsNCisJCW5wU3Bpbi0+bk1hc3MgPSA2NCArIG5wU3Bpbi0+bkNvdW50ICogMzI7DQorCQlucFNwaW4tPmJ5Q29sb3IgPSAoQllURSkoTUFHRU5UQSAtIG5wU3Bpbi0+bkNvdW50KTsNCisJCW5wU3Bpbi0+YnlQdHMgPSBESU0oU3Bpbm5lcik7DQorCQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgRElNKFNwaW5uZXIpOyArK25DbnQpDQorCQkJbnBTcGluLT5QdHNbbkNudF0gPSBTcGlubmVyW25DbnRdOw0KKwkJQUNDRUwoIG5wU3BpbiwgbnBTcGluLT5uRGlyLCAzMCArIG5MZXZlbCAqIDIgKTsNCisJCUFkZEhlYWRPYmooICZTcGlubmVyTGlzdCwgbnBTcGluICk7DQorCQkrK25CYWRHdXlzOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gRHJhd1NwaW5uZXJzIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgc3Bpbm5lciBsaXN0DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdTcGlubmVycyggSERDIGhEQyApDQorew0KKwlOUE9CSiAgICAgICAgICAgbnBTcGluLCBucE5leHQ7DQorCUxPQ0FMIElOVCAgICAgICBuTmV4dFNwaW5uZXIgPSAxMDAwOw0KKw0KKwlpZiAobkJhZEd1eXMgJiYgKC0tbk5leHRTcGlubmVyIDwgMCkpDQorCXsNCisJCUNyZWF0ZVNwaW5uZXIoKTsNCisJCW5OZXh0U3Bpbm5lciA9IDEwMCArIGFyYW5kKCA5MDAgKSAtIG5MZXZlbCAqIDI7DQorCX0NCisNCisJZm9yIChucFNwaW4gPSBIZWFkT2JqKCAmU3Bpbm5lckxpc3QgKTsgbnBTcGluOyBucFNwaW4gPSBucE5leHQpDQorCXsNCisJCU5QT0JKICAgICAgICAgICBucFNob3Q7DQorCQlJTlQgICAgICAgICAgICAgbkRlbHRhOw0KKwkJUkVDVCAgICAgICAgICAgIHJlY3Q7DQorDQorCQlucE5leHQgPSBOZXh0T2JqKCBucFNwaW4gKTsNCisNCisJCU1LUkVDVCggJnJlY3QsIG5wU3Bpbi0+UG9zLCAxNTAgKTsNCisNCisJCWlmIChQVElOUkVDVCggJnJlY3QsIG5wUGxheWVyLT5Qb3MgKSkNCisJCXsNCisJCQlIaXRQbGF5ZXIoIGhEQywgbnBTcGluICk7DQorCQkJLS1ucFNwaW4tPm5Db3VudDsNCisJCQlucFNwaW4tPmJ5Q29sb3IgPSAoQllURSkoTUFHRU5UQSAtIG5wU3Bpbi0+bkNvdW50KTsNCisJCQlpZiAobnBTcGluLT5uQ291bnQgPCAxKQ0KKwkJCXsNCisJCQkJS2lsbEJhZEd1eSgpOw0KKwkJCQlFeHBsb2RlKCBoREMsIG5wU3BpbiApOw0KKwkJCQlSZW1vdmVPYmooICZTcGlubmVyTGlzdCwgbnBTcGluICk7DQorCQkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBTcGluICk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiAoSU5UUkVDVCgmcmVjdCwgJnJlY3RTaG90Q2xpcCkpDQorCQl7DQorCQkJZm9yIChucFNob3QgPSBIZWFkT2JqKCAmU2hvdExpc3QgKTsgbnBTaG90OyBucFNob3QgPSBOZXh0T2JqKCBucFNob3QgKSkNCisJCQl7DQorCQkJCWlmICghUFRJTlJFQ1QoICZyZWN0LCBucFNob3QtPlBvcyApKSBjb250aW51ZTsNCisJCQkJbnBTaG90LT5uQ291bnQgPSAxOw0KKwkJCQlsU2NvcmUgKz0gbnBTcGluLT5uQ291bnQgKiA1MDA7DQorCQkJCW5wU3Bpbi0+YnlDb2xvciA9IChCWVRFKShNQUdFTlRBIC0gKC0tbnBTcGluLT5uQ291bnQpKTsNCisJCQkJaWYgKG5wU3Bpbi0+bkNvdW50IDwgMSkNCisJCQkJew0KKwkJCQkJS2lsbEJhZEd1eSgpOw0KKwkJCQkJRXhwbG9kZSggaERDLCBucFNwaW4gKTsNCisJCQkJCVJlbW92ZU9iaiggJlNwaW5uZXJMaXN0LCBucFNwaW4gKTsNCisJCQkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBTcGluICk7DQorCQkJCX0NCisJCQkJZWxzZSBIaXQoIGhEQywgbnBTcGluICk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJCW5EZWx0YSA9IG5wUGxheWVyLT5Qb3MueCAtIG5wU3Bpbi0+UG9zLng7DQorCQl3aGlsZSAobkRlbHRhIDwgLTE2IHx8IG5EZWx0YSA+IDE2KSBuRGVsdGEgLz0gMjsNCisJCW5wU3Bpbi0+VmVsLnggKz0gbkRlbHRhIC0gbnBTcGluLT5WZWwueCAvIDE2Ow0KKwkJbkRlbHRhID0gbnBQbGF5ZXItPlBvcy55IC0gbnBTcGluLT5Qb3MueTsNCisJCXdoaWxlIChuRGVsdGEgPCAtMTYgfHwgbkRlbHRhID4gMTYpIG5EZWx0YSAvPSAyOw0KKwkJbnBTcGluLT5WZWwueSArPSBuRGVsdGEgLSBucFNwaW4tPlZlbC55IC8gMTY7DQorCQlEcmF3T2JqZWN0KCBoREMsIG5wU3BpbiApOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gQ3JlYXRlUm9pZCAtIG1ha2UgYSBuZXcgYXN0ZXJvaWQNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgQ3JlYXRlUm9pZCggUE9JTlQgUG9zLCBQT0lOVCBWZWwsIElOVCBuU2lkZXMsIEJZVEUgYnlDb2xvciwNCisJCQkJCQkJIElOVCBuRGlyLCBJTlQgblNwZWVkLCBJTlQgblNwaW4gKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wUm9pZDsNCisJSU5UICAgICAgICAgICAgIG5DbnQ7DQorDQorCWlmIChucFJvaWQgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCisJew0KKwkJbnBSb2lkLT5Qb3MgPSBQb3M7DQorCQlucFJvaWQtPlZlbCA9IFZlbDsNCisJCW5wUm9pZC0+bk1hc3MgPSBuU2lkZXMgKiAxMjg7DQorCQlucFJvaWQtPm5EaXIgPSBuRGlyOw0KKwkJbnBSb2lkLT5uU3BpbiA9IG5TcGluICsgYXJhbmQoIDExICkgLSA1Ow0KKwkJbnBSb2lkLT5uQ291bnQgPSBuU2lkZXMgKiAxMDA7DQorCQlucFJvaWQtPmJ5Q29sb3IgPSBieUNvbG9yOw0KKwkJbnBSb2lkLT5ieVB0cyA9IChCWVRFKShuU2lkZXMgKyAxKTsNCisJCWZvciAobkNudCA9IDA7IG5DbnQgPCBuU2lkZXM7ICsrbkNudCkNCisJCXsNCisJCQlucFJvaWQtPlB0c1tuQ250XS54ID0gbkNudCAqIERFR1JFRV9TSVpFIC8gblNpZGVzICsgYXJhbmQoIDMwICk7DQorCQkJbnBSb2lkLT5QdHNbbkNudF0ueSA9IChuU2lkZXMgLSAxKSAqIDEwMCArIDIwICsgYXJhbmQoIDgwICk7DQorCQl9DQorCQlucFJvaWQtPlB0c1tuU2lkZXNdID0gbnBSb2lkLT5QdHNbMF07DQorCQlBQ0NFTCggbnBSb2lkLCBuRGlyLCBuU3BlZWQgKTsNCisJCUFkZEhlYWRPYmooICZSb2lkTGlzdCwgbnBSb2lkICk7DQorCQkrK25CYWRHdXlzOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gQnJlYWtSb2lkIC0gYnJlYWsgdXAgYW4gYXN0ZXJvaWQNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgQnJlYWtSb2lkKCBIREMgaERDLCBOUE9CSiBucFJvaWQsIE5QT0JKIG5wU2hvdCApDQorew0KKwlJTlQgICAgICAgICAgICAgbkNudCwgbk5ldzsNCisNCisJbFNjb3JlICs9IG5wUm9pZC0+bkNvdW50Ow0KKwlpZiAobnBTaG90KSBucFNob3QtPm5Db3VudCA9IDE7DQorCXN3aXRjaCAobnBSb2lkLT5ieVB0cykNCisJew0KKwljYXNlIDg6DQorCQluTmV3ID0gMiArIGFyYW5kKCAzICk7DQorCQlicmVhazsNCisJY2FzZSA3Og0KKwkJbk5ldyA9IDEgKyBhcmFuZCggMyApOw0KKwkJYnJlYWs7DQorCWNhc2UgNjoNCisJCW5OZXcgPSAxICsgYXJhbmQoIDIgKTsNCisJCWJyZWFrOw0KKwljYXNlIDU6DQorCQluTmV3ID0gYXJhbmQoIDIgKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJbk5ldyA9IDA7DQorCQlicmVhazsNCisJfQ0KKwlpZiAobk5ldyA9PSAxKSAvLyBkb24ndCBleHBsb2RlIG91dHdhcmQNCisJew0KKwkJUE9JTlQgUHQgPSBucFJvaWQtPlBvczsNCisJCVB0LnggKz0gYXJhbmQoIDMwMSApIC0gMTUwOyBQdC55ICs9IGFyYW5kKCAzMDEgKSAtIDE1MDsNCisJCUNyZWF0ZVJvaWQoIFB0LCBucFJvaWQtPlZlbCwgbnBSb2lkLT5ieVB0cyAtIChuTmV3ICsgMSksDQorCQkJCQlucFJvaWQtPmJ5Q29sb3IsIG5wU2hvdC0+bkRpciwgOCwgbnBSb2lkLT5uU3BpbiApOw0KKwl9DQorCWVsc2UgaWYgKG5OZXcgPiAwKQ0KKwl7DQorCQlJTlQgblNwZWVkID0gbnBSb2lkLT5uU3BpbiAqIG5wUm9pZC0+blNwaW4gKiBuTmV3ICsgMTY7DQorCQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgbk5ldzsgKytuQ250KQ0KKwkJew0KKwkJCVBPSU5UIFB0ID0gbnBSb2lkLT5Qb3M7DQorCQkJUHQueCArPSBhcmFuZCggNjAxICkgLSAzMDA7IFB0LnkgKz0gYXJhbmQoIDYwMSApIC0gMzAwOw0KKwkJCUNyZWF0ZVJvaWQoIFB0LCBucFJvaWQtPlZlbCwgbnBSb2lkLT5ieVB0cyAtIChuTmV3ICsgMSksDQorCQkJCQkJbnBSb2lkLT5ieUNvbG9yLA0KKwkJCQkJCW5wUm9pZC0+bkRpciArIG5DbnQgKiBERUdSRUVfU0laRSAvIG5OZXcgKyBhcmFuZCggMzIgKSwNCisJCQkJCQluU3BlZWQgKyBhcmFuZCggbkxldmVsICogNCApLA0KKwkJCQkJCW5wUm9pZC0+blNwaW4gLyAyICk7DQorCQl9DQorCX0NCisJS2lsbEJhZEd1eSgpOw0KKwkrK25wUm9pZC0+YnlDb2xvcjsNCisJbnBSb2lkLT5uQ291bnQgPSAwOw0KKwlpZiAobk5ldykNCisJew0KKwkJSGl0KCBoREMsIG5wUm9pZCApOw0KKwkJRHJhd09iamVjdCggaERDLCBucFJvaWQgKTsNCisJfQ0KKwllbHNlIEV4cGxvZGUoIGhEQywgbnBSb2lkICk7DQorCVJlbW92ZU9iaiggJlJvaWRMaXN0LCBucFJvaWQgKTsNCisJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCBucFJvaWQgKTsNCit9DQorDQorLy8NCisvLyBEcmF3Um9pZHMgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBhc3Rlcm9pZCBsaXN0DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdSb2lkcyggSERDIGhEQyApDQorew0KKwlOUE9CSiAgICAgICAgICAgbnBSb2lkLCBucE5leHQ7DQorDQorCWZvciAobnBSb2lkID0gSGVhZE9iaiggJlJvaWRMaXN0ICk7IG5wUm9pZDsgbnBSb2lkID0gbnBOZXh0KQ0KKwl7DQorCQlJTlQgICAgICAgICAgICAgblNpemUgPSBucFJvaWQtPm5Db3VudDsNCisJCU5QT0JKICAgICAgICAgICBucFNob3Q7DQorCQlSRUNUICAgICAgICAgICAgcmVjdDsNCisNCisJCW5wTmV4dCA9IE5leHRPYmooIG5wUm9pZCApOw0KKw0KKwkJRHJhd09iamVjdCggaERDLCBucFJvaWQgKTsNCisNCisJCU1LUkVDVCggJnJlY3QsIG5wUm9pZC0+UG9zLCBuU2l6ZSApOw0KKw0KKwkJaWYgKFBUSU5SRUNUKCAmcmVjdCwgbnBQbGF5ZXItPlBvcyApICYmIEhpdFBsYXllciggaERDLCBucFJvaWQgKSkNCisJCXsNCisJCQlucFBsYXllci0+bkNvdW50ID0gLW5wUGxheWVyLT5uQ291bnQ7DQorCQkJbnBQbGF5ZXItPmJ5Q29sb3IgPSBXSElURTsNCisJCQlFeHBsb2RlKCBoREMsIG5wUGxheWVyICk7DQorCQkJQnJlYWtSb2lkKCBoREMsIG5wUm9pZCwgTlVMTCApOw0KKwkJCWlmIChuQmFkR3V5cykgU2V0UmVzdGFydCggUkVTVEFSVF9MRVZFTCApOw0KKwkJCWVsc2UgU2V0UmVzdGFydCggUkVTVEFSVF9ORVhUTEVWRUwgKTsNCisJCX0NCisJCWVsc2UgaWYgKElOVFJFQ1QoJnJlY3QsICZyZWN0U2hvdENsaXApKQ0KKwkJew0KKwkJCWZvciAobnBTaG90ID0gSGVhZE9iaiggJlNob3RMaXN0ICk7IG5wU2hvdDsgbnBTaG90ID0gTmV4dE9iaiggbnBTaG90ICkpDQorCQkJew0KKwkJCQlpZiAoIVBUSU5SRUNUKCAmcmVjdCwgbnBTaG90LT5Qb3MgKSkgY29udGludWU7DQorCQkJCUJyZWFrUm9pZCggaERDLCBucFJvaWQsIG5wU2hvdCApOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCit9DQorDQorLy8NCisvLyBEcmF3U2hvdHMgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBwbGF5ZXIgc2hvdCBsaXN0DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdTaG90cyggSERDIGhEQyApDQorew0KKwlOUE9CSiAgICAgICAgICAgbnBTaG90LCBucE5leHQ7DQorDQorCWlmIChucFNob3QgPSBIZWFkT2JqKCAmU2hvdExpc3QgKSkNCisJew0KKwkJcmVjdFNob3RDbGlwLmxlZnQgPSByZWN0U2hvdENsaXAucmlnaHQgPSBucFNob3QtPlBvcy54Ow0KKwkJcmVjdFNob3RDbGlwLnRvcCA9IHJlY3RTaG90Q2xpcC5ib3R0b20gPSBucFNob3QtPlBvcy55Ow0KKwkJd2hpbGUgKG5wU2hvdCkNCisJCXsNCisJCQlucE5leHQgPSBOZXh0T2JqKCBucFNob3QgKTsNCisJCQlzd2l0Y2ggKC0tbnBTaG90LT5uQ291bnQpDQorCQkJew0KKwkJCWNhc2UgMTA6DQorCQkJCW5wU2hvdC0+YnlDb2xvciA9IERLQ1lBTjsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSA1Og0KKwkJCQlucFNob3QtPmJ5Q29sb3IgPSBES0JMVUU7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMDoNCisJCQkJUmVtb3ZlT2JqKCAmU2hvdExpc3QsIG5wU2hvdCApOw0KKwkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wU2hvdCApOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQkJRHJhd09iamVjdCggaERDLCBucFNob3QgKTsNCisJCQlpZiAobnBTaG90LT5Qb3MueCA8IHJlY3RTaG90Q2xpcC5sZWZ0KSByZWN0U2hvdENsaXAubGVmdCA9IG5wU2hvdC0+UG9zLng7DQorCQkJZWxzZSBpZiAobnBTaG90LT5Qb3MueCA+IHJlY3RTaG90Q2xpcC5yaWdodCkgcmVjdFNob3RDbGlwLnJpZ2h0ID0gbnBTaG90LT5Qb3MueDsNCisJCQlpZiAobnBTaG90LT5Qb3MueSA8IHJlY3RTaG90Q2xpcC50b3ApIHJlY3RTaG90Q2xpcC50b3AgPSBucFNob3QtPlBvcy55Ow0KKwkJCWVsc2UgaWYgKG5wU2hvdC0+UG9zLnkgPiByZWN0U2hvdENsaXAuYm90dG9tKSByZWN0U2hvdENsaXAuYm90dG9tID0gbnBTaG90LT5Qb3MueTsNCisJCQlucFNob3QgPSBucE5leHQ7DQorCQl9DQorCX0NCisJZWxzZSByZWN0U2hvdENsaXAubGVmdCA9IHJlY3RTaG90Q2xpcC5yaWdodCA9IHJlY3RTaG90Q2xpcC50b3AgPSByZWN0U2hvdENsaXAuYm90dG9tID0gMzI3Njc7DQorfQ0KKw0KKy8vDQorLy8gRHJhd0ZsYW1lcyAtIHByb2Nlc3MgYW5kIGRyYXcgdGhlIGZsYW1lIGxpc3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd0ZsYW1lcyggSERDIGhEQyApDQorew0KKwlOUE9CSiAgICAgICAgICAgbnBGbGFtZSwgbnBOZXh0Ow0KKw0KKwlmb3IgKG5wRmxhbWUgPSBIZWFkT2JqKCAmRmxhbWVMaXN0ICk7IG5wRmxhbWU7IG5wRmxhbWUgPSBucE5leHQpDQorCXsNCisJCW5wTmV4dCA9IE5leHRPYmooIG5wRmxhbWUgKTsNCisJCXN3aXRjaCAoLS1ucEZsYW1lLT5uQ291bnQpDQorCQl7DQorCQljYXNlIDc6DQorCQkJbnBGbGFtZS0+YnlDb2xvciA9IFJFRDsNCisJCQlicmVhazsNCisJCWNhc2UgMzoNCisJCQlucEZsYW1lLT5ieUNvbG9yID0gREtSRUQ7DQorCQkJYnJlYWs7DQorCQljYXNlIDA6DQorCQkJUmVtb3ZlT2JqKCAmRmxhbWVMaXN0LCBucEZsYW1lICk7DQorCQkJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCBucEZsYW1lICk7DQorCQkJYnJlYWs7DQorCQl9DQorCQlEcmF3T2JqZWN0KCBoREMsIG5wRmxhbWUgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIEZpcmVTaG90IC0gZmlyZSBhIGJ1bGxldA0KKy8vDQorDQorVk9JRCBORUFSIFBBU0NBTCBGaXJlU2hvdCggVk9JRCApDQorew0KKwlOUE9CSiAgICAgICAgICAgbnBTaG90Ow0KKw0KKwlpZiAobnBTaG90ID0gUmVtSGVhZE9iaiggJkZyZWVMaXN0ICkpDQorCXsNCisJCW5wU2hvdC0+UG9zLnggPSBucFBsYXllci0+UG9zLng7DQorCQlucFNob3QtPlBvcy55ID0gbnBQbGF5ZXItPlBvcy55Ow0KKwkJbnBTaG90LT5WZWwueCA9IG5wUGxheWVyLT5WZWwueDsNCisJCW5wU2hvdC0+VmVsLnkgPSBucFBsYXllci0+VmVsLnk7DQorCQlucFNob3QtPm5NYXNzID0gODsNCisJCW5wU2hvdC0+bkRpciA9IG5wUGxheWVyLT5uRGlyICsgYXJhbmQoIDUgKSAtIDI7DQorCQlucFNob3QtPm5TcGluID0gMDsNCisJCW5wU2hvdC0+bkNvdW50ID0gMTYgKyBhcmFuZCggOCApOw0KKwkJbnBTaG90LT5ieUNvbG9yID0gQ1lBTjsNCisJCW5wU2hvdC0+YnlQdHMgPSAyOw0KKwkJbnBTaG90LT5QdHNbMF0ueCA9IDEyODsNCisJCW5wU2hvdC0+UHRzWzBdLnkgPSA1MDsNCisJCW5wU2hvdC0+UHRzWzFdLnggPSAwOw0KKwkJbnBTaG90LT5QdHNbMV0ueSA9IDUwOw0KKwkJQUNDRUwoIG5wU2hvdCwgbnBTaG90LT5uRGlyLCAyMDAgKyBucFNob3QtPm5Db3VudCApOw0KKwkJQWRkSGVhZE9iaiggJlNob3RMaXN0LCBucFNob3QgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIEFjY2VsUGxheWVyIC0gbW92ZSB0aGUgcGxheWVyIGZvcndhcmQNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgQWNjZWxQbGF5ZXIoIElOVCBuRGlyLCBJTlQgbkFjY2VsICkNCit7DQorCU5QT0JKICAgICAgICAgICBucEZsYW1lOw0KKw0KKwluRGlyICs9IG5wUGxheWVyLT5uRGlyOw0KKwlpZiAobkFjY2VsKSBBQ0NFTCggbnBQbGF5ZXIsIG5EaXIsIG5BY2NlbCApOw0KKwlpZiAobnBGbGFtZSA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApKQ0KKwl7DQorCQlucEZsYW1lLT5Qb3MueCA9IG5wUGxheWVyLT5Qb3MueDsNCisJCW5wRmxhbWUtPlBvcy55ID0gbnBQbGF5ZXItPlBvcy55Ow0KKwkJbnBGbGFtZS0+VmVsLnggPSBucFBsYXllci0+VmVsLng7DQorCQlucEZsYW1lLT5WZWwueSA9IG5wUGxheWVyLT5WZWwueTsNCisJCW5wRmxhbWUtPm5EaXIgPSBuRGlyICsgMTAwICsgYXJhbmQoIDU3ICk7DQorCQlucEZsYW1lLT5uU3BpbiA9IDA7DQorCQlucEZsYW1lLT5uQ291bnQgPSBuQWNjZWwgKyBhcmFuZCggNyApOw0KKwkJbnBGbGFtZS0+YnlDb2xvciA9IFlFTExPVzsNCisJCW5wRmxhbWUtPmJ5UHRzID0gMTsNCisJCW5wRmxhbWUtPlB0c1swXS54ID0gbnBGbGFtZS0+UHRzWzBdLnkgPSAwOw0KKwkJQUNDRUwoIG5wRmxhbWUsIG5wRmxhbWUtPm5EaXIsIDUwICsgYXJhbmQoIDEwICkgKTsNCisJCUFkZEhlYWRPYmooICZGbGFtZUxpc3QsIG5wRmxhbWUgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIERyYXdQbGF5ZXIgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBwbGF5ZXINCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd1BsYXllciggSERDIGhEQyApDQorew0KKwlMT0NBTCBJTlQgICAgICAgbkJvbWJpbmcgPSAwOw0KKwlMT0NBTCBJTlQgICAgICAgblNob3REZWxheSA9IDA7DQorDQorCWlmIChucFBsYXllci0+bkNvdW50IDw9IDApIHJldHVybjsNCisNCisJaWYgKG5TYWZlID4gMCkNCisJew0KKwkJaWYgKC0tblNhZmUgPT0gMCkNCisJCXsNCisJCQlucFBsYXllci0+YnlDb2xvciA9IChCWVRFKShCTEFDSyArIG5wUGxheWVyLT5uQ291bnQpOw0KKwkJCWlmIChucFBsYXllci0+YnlDb2xvciA+IFdISVRFKSBucFBsYXllci0+YnlDb2xvciA9IFdISVRFOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYgKElzS2V5RG93biggdmtTaGxkICkgJiYgblNoaWVsZCA+IDApDQorCXsNCisJCW5TYWZlID0gMTU7DQorCQlpZiAoLS1uU2hpZWxkID4gMCkgbnBQbGF5ZXItPmJ5Q29sb3IgPSBHUkVFTjsNCisJCWVsc2UgbnBQbGF5ZXItPmJ5Q29sb3IgPSBES0dSRUVOOw0KKwl9DQorDQorCWlmIChuQm9tYmluZyA+IDApDQorCXsNCisJCWlmICgtLW5Cb21iaW5nID09IDApDQorCQl7DQorCQkJRXhwbG9kZUJhZGd1eXMoIGhEQywgJlNwaW5uZXJMaXN0ICk7DQorCQkJRXhwbG9kZUJhZGd1eXMoIGhEQywgJlN3YXJtZXJMaXN0ICk7DQorCQkJRXhwbG9kZUJhZGd1eXMoIGhEQywgJkh1bnRlckxpc3QgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlIaXRMaXN0KCBoREMsICZTcGlubmVyTGlzdCApOw0KKwkJCUhpdExpc3QoIGhEQywgJlN3YXJtZXJMaXN0ICk7DQorCQkJSGl0TGlzdCggaERDLCAmSHVudGVyTGlzdCApOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYgKG5Cb21iICYmIElzS2V5RG93biggdmtCb21iICkpIC0tbkJvbWIsIG5Cb21iaW5nID0gNTsNCisNCisJaWYgKElzS2V5RG93biggdmtDbGt3ICkpIG5wUGxheWVyLT5uU3BpbiArPSA4Ow0KKwlpZiAoSXNLZXlEb3duKCB2a0N0ckNsa3cgKSkgbnBQbGF5ZXItPm5TcGluIC09IDg7DQorCWlmIChJc0tleURvd24oIHZrVGhyc3QgKSkgQWNjZWxQbGF5ZXIoIDAsIDEyICk7DQorCWlmIChJc0tleURvd24oIHZrUnZUaHJzdCApKSBBY2NlbFBsYXllciggMTI4LCAxMiApOw0KKwlpZiAoblNob3REZWxheSkgLS1uU2hvdERlbGF5Ow0KKwllbHNlIGlmIChJc0tleURvd24oIHZrRmlyZSApKSBGaXJlU2hvdCgpLCBuU2hvdERlbGF5ID0gMjsNCisJRHJhd09iamVjdCggaERDLCBucFBsYXllciApOw0KKwlucFBsYXllci0+blNwaW4gLz0gMjsNCit9DQorDQorLy8NCisvLyBHZXRIeXBlcm9pZERDIC0gZ2V0IHRoZSBjb3JyZWN0IERDIGZvciBoeXBlcm9pZCByZW5kZXJpbmcNCisvLw0KKw0KK0hEQyBORUFSIFBBU0NBTCBHZXRIeXBlcm9pZERDKCBIV05EIGhXbmQgKQ0KK3sNCisJSERDICAgICAgICAgICAgIGhEQzsNCisJSU5UICAgICAgICAgICAgIGN4LCBjeTsNCisJUkVDVCAgICAgICAgICAgIHJlY3Q7DQorDQorCUdldENsaWVudFJlY3QoIGhXbmQsICZyZWN0ICk7DQorCWN4ID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsNCisJY3kgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOw0KKw0KKwloREMgPSBHZXREQyggaFduZCApOw0KKw0KKwkvLyBzZXQgdXAgdGhlIG1hcHBpbmcgbW9kZQ0KKwlTZXRNYXBNb2RlKCBoREMsIE1NX0lTT1RST1BJQyApOw0KKwlTZXRXaW5kb3dFeHQoIGhEQywgTUFYX0NPT1JELCBNQVhfQ09PUkQgKTsNCisJU2V0Vmlld3BvcnRFeHQoIGhEQywgY3ggLyAyLCAtY3kgLyAyICk7DQorCVNldFZpZXdwb3J0T3JnKCBoREMsIGN4IC8gMiwgY3kgLyAyICk7DQorDQorCS8vIHJlYWxpemUgdGhlIHBhbGV0dGUNCisJU2VsZWN0UGFsZXR0ZSggaERDLCBoQXBwUGFsZXR0ZSwgMCApOw0KKwlSZWFsaXplUGFsZXR0ZSggaERDICk7DQorDQorCXJldHVybiggaERDICk7DQorfQ0KKw0KKy8vDQorLy8gRHJhd09iamVjdHMgLSB0cmFuc2Zvcm0gYW5kIHJlZHJhdyBldmVyeXRoaW5nIGluIHRoZSBzeXN0ZW0NCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd09iamVjdHMoIEhXTkQgaFduZCApDQorew0KKwlIREMgICAgICAgICAgICAgaERDID0gR2V0SHlwZXJvaWREQyggaFduZCApOw0KKw0KKwkvLyBtb3ZlIGFuZCBkcmF3IHRoaW5ncyAoSSBkb24ndCB0aGluayB0aGUgb3JkZXIgaXMgaW1wb3J0YW50Li4uKQ0KKwlEcmF3UGxheWVyKCBoREMgKTsNCisJRHJhd0ZsYW1lcyggaERDICk7DQorCURyYXdTaG90cyggaERDICk7DQorCURyYXdSb2lkcyggaERDICk7DQorCURyYXdTcGlubmVycyggaERDICk7DQorCURyYXdTd2FybWVycyggaERDICk7DQorCURyYXdIdW50ZXJzKCBoREMgKTsNCisJRHJhd0h1bnRlclNob3RzKCBoREMgKTsNCisJRHJhd0xldHRlcnMoIGhEQyApOw0KKwlEcmF3Qm9udXNlcyggaERDICk7DQorCS8vICguLi5idXQgSSdtIG5vdCBjaGFuZ2luZyBpdCEhISA6LSkNCisNCisJUmVsZWFzZURDKCBoV25kLCBoREMgKTsNCit9DQorDQorLy8NCisvLyBTZXRJbmRpY2F0b3IgLSBzZXQgYSBxdWFudGl0eSBpbmRpY2F0b3INCisvLw0KKw0KK0lOVCBORUFSIFBBU0NBTCBTZXRJbmRpY2F0b3IoIE5QU1RSIG5wQnVmZiwgQ0hBUiBJREJpdG1hcCwgSU5UIG5RdWFudCApDQorew0KKwlpZiAoblF1YW50ID4gNSkNCisJew0KKwkJKm5wQnVmZisrID0gSURCaXRtYXA7ICpucEJ1ZmYrKyA9IElEQml0bWFwOw0KKwkJKm5wQnVmZisrID0gSURCaXRtYXA7ICpucEJ1ZmYrKyA9IElEQml0bWFwOw0KKwkJKm5wQnVmZisrID0gSURCX3BsdXM7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlJTlQgbkJsYW5rID0gNSAtIG5RdWFudDsNCisJCXdoaWxlIChuUXVhbnQtLSkgKm5wQnVmZisrID0gSURCaXRtYXA7DQorCQl3aGlsZSAobkJsYW5rLS0pICpucEJ1ZmYrKyA9IElEQl9ibGFuazsNCisJfQ0KKwlyZXR1cm4oIDUgKTsNCit9DQorDQorLy8NCisvLyBDaGVja1Njb3JlIC0gc2hvdyB0aGUgc2NvcmUgYW5kIHN1Y2ggc3R1ZmYNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgQ2hlY2tTY29yZSggSFdORCBoV25kICkNCit7DQorCUNIQVIgICAgICAgICAgICBzekJ1ZmZbc2l6ZW9mKHN6U2NvcmUpXTsNCisJTlBTVFIgICAgICAgICAgIG5wQnVmZiA9IHN6QnVmZjsNCisJSU5UICAgICAgICAgICAgIG5MaXZlcywgbkxlbiwgbkNudCwgeCwgeTsNCisJSEJJVE1BUCAgICAgICAgIGhibU9sZDsNCisJSERDICAgICAgICAgICAgIGhEQywgaERDTWVtOw0KKw0KKwlpZiAoSXNJY29uaWMoIGhXbmQgKSkgcmV0dXJuOw0KKwlpZiAobFNjb3JlIC0gbExhc3RMaWZlID4gRVhUUkFfTElGRSkNCisJew0KKwkJQWRkRXh0cmFMaWZlKCk7DQorCQlsTGFzdExpZmUgPSBsU2NvcmU7DQorCX0NCisJbkxpdmVzID0gKChucFBsYXllci0+bkNvdW50ID4gMCkgPyBucFBsYXllci0+bkNvdW50IDogLW5wUGxheWVyLT5uQ291bnQpOw0KKw0KKwkqbnBCdWZmKysgPSBJREJfbGV2ZWw7DQorCXdzcHJpbnRmKCBucEJ1ZmYsICIlMi4ydSIsIG5MZXZlbCApOw0KKwl3aGlsZSAoaXNkaWdpdCggKm5wQnVmZiApKQ0KKwkJKm5wQnVmZiA9IChDSEFSKSgqbnBCdWZmICsgSURCX251bTAgLSAnMCcpLCArK25wQnVmZjsNCisJKm5wQnVmZisrID0gSURCX2JsYW5rOyAqbnBCdWZmKysgPSBJREJfc2NvcmU7DQorCXdzcHJpbnRmKCBucEJ1ZmYsICIlNy43bHUiLCBsU2NvcmUgKTsNCisJd2hpbGUgKGlzZGlnaXQoICpucEJ1ZmYgKSkNCisJCSpucEJ1ZmYgPSAoQ0hBUikoKm5wQnVmZiArIElEQl9udW0wIC0gJzAnKSwgKytucEJ1ZmY7DQorCSpucEJ1ZmYrKyA9IElEQl9ibGFuazsNCisJbnBCdWZmICs9IFNldEluZGljYXRvciggbnBCdWZmLCBJREJfbGlmZSwgbkxpdmVzICk7DQorCW5wQnVmZiArPSBTZXRJbmRpY2F0b3IoIG5wQnVmZiwgSURCX3NoaWVsZCwgblNoaWVsZCApOw0KKwlucEJ1ZmYgKz0gU2V0SW5kaWNhdG9yKCBucEJ1ZmYsIElEQl9ib21iLCBuQm9tYiApOw0KKwluTGVuID0gbnBCdWZmIC0gc3pCdWZmOw0KKw0KKwloREMgPSBHZXRXaW5kb3dEQyggaFduZCApOw0KKwlJbnRlcnNlY3RDbGlwUmVjdCggaERDLCByZWN0U2NvcmVDbGlwLmxlZnQsIHJlY3RTY29yZUNsaXAudG9wLA0KKwkJCQkJCQlyZWN0U2NvcmVDbGlwLnJpZ2h0LCByZWN0U2NvcmVDbGlwLmJvdHRvbSApOw0KKwloRENNZW0gPSBDcmVhdGVDb21wYXRpYmxlREMoIGhEQyApOw0KKwloYm1PbGQgPSBTZWxlY3RPYmplY3QoIGhEQ01lbSwgaEJpdG1hcFswXSApOw0KKwl4ID0gcmVjdFNjb3JlQ2xpcC5sZWZ0Ow0KKwl5ID0gcmVjdFNjb3JlQ2xpcC50b3A7DQorDQorCWZvciAobkNudCA9IDA7IG5DbnQgPCBuTGVuOyArK25DbnQpDQorCXsNCisJCWlmIChzekJ1ZmZbbkNudF0gIT0gc3pTY29yZVtuQ250XSkNCisJCXsNCisJCQlTZWxlY3RPYmplY3QoIGhEQ01lbSwgaEJpdG1hcFtzekJ1ZmZbbkNudF0gLSBJREJfYmxhbmtdICk7DQorCQkJQml0Qmx0KCBoREMsIHgsIHksIENYX0JJVE1BUCwgQ1lfQklUTUFQLCBoRENNZW0sIDAsIDAsIFNSQ0NPUFkgKTsNCisJCQlzelNjb3JlW25DbnRdID0gc3pCdWZmW25DbnRdOw0KKwkJfQ0KKwkJeCArPSBDWF9CSVRNQVA7DQorCX0NCisJaWYgKG5DbnQgPCBuU2NvcmVMZW4pDQorCXsNCisJCVNlbGVjdE9iamVjdCggaERDTWVtLCBoQml0bWFwWzBdICk7DQorCQlkbyB7DQorCQkJaWYgKHN6U2NvcmVbbkNudF0gIT0gSURCX2JsYW5rKQ0KKwkJCXsNCisJCQkJQml0Qmx0KCBoREMsIHgsIHksIENYX0JJVE1BUCwgQ1lfQklUTUFQLCBoRENNZW0sIDAsIDAsIFNSQ0NPUFkgKTsNCisJCQkJc3pTY29yZVtuQ250XSA9IElEQl9ibGFuazsNCisJCQl9DQorCQkJeCArPSBDWF9CSVRNQVA7DQorCQl9IHdoaWxlICgrK25DbnQgPCBuU2NvcmVMZW4pOw0KKwl9DQorCW5TY29yZUxlbiA9IG5MZW47DQorDQorCVNlbGVjdE9iamVjdCggaERDTWVtLCBoYm1PbGQgKTsNCisJRGVsZXRlREMoIGhEQ01lbSApOw0KKwlSZWxlYXNlREMoIGhXbmQsIGhEQyApOw0KK30NCisNCisvLw0KKy8vIEhpdExpc3QgLSBIaXQoKSBhIGxpc3Qgb2YgdGhpbmdzDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIEhpdExpc3QoIEhEQyBoREMsIE5QTElTVCBucExpc3QgKQ0KK3sNCisJTlBPQkogICAgICAgICAgIG5wT2JqOw0KKw0KKwlmb3IgKG5wT2JqID0gSGVhZE9iaiggbnBMaXN0ICk7IG5wT2JqOyBucE9iaiA9IE5leHRPYmooIG5wT2JqICkpDQorCQlpZiAobnBPYmotPm5Db3VudCkgSGl0KCBoREMsIG5wT2JqICk7DQorfQ0KKw0KKy8vDQorLy8gRXhwbG9kZUJhZGd1eXMgLSBleHBsb2RlIGEgbGlzdCBvZiBiYWRndXlzDQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIEV4cGxvZGVCYWRndXlzKCBIREMgaERDLCBOUExJU1QgbnBMaXN0ICkNCit7DQorCU5QT0JKICAgICAgICAgICBucE9iajsNCisNCisJd2hpbGUgKG5wT2JqID0gSGVhZE9iaiggbnBMaXN0ICkpDQorCXsNCisJCUtpbGxCYWRHdXkoKTsNCisJCW5wT2JqLT5uQ291bnQgPSAwOw0KKwkJRXhwbG9kZSggaERDLCBucE9iaiApOw0KKwkJUmVtb3ZlT2JqKCBucExpc3QsIG5wT2JqICk7DQorCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wT2JqICk7DQorCX0NCit9DQorDQorLy8NCisvLyBOZXdHYW1lIC0gc3RhcnQgYSBuZXcgZ2FtZQ0KKy8vDQorDQorVk9JRCBORUFSIFBBU0NBTCBOZXdHYW1lKCBIV05EIGhXbmQgKQ0KK3sNCisJSERDICAgICAgICAgICAgIGhEQyA9IEdldEh5cGVyb2lkREMoIGhXbmQgKTsNCisNCisJbnBQbGF5ZXItPm5Db3VudCA9IDA7DQorCW5wUGxheWVyLT5ieUNvbG9yID0gV0hJVEU7DQorCUV4cGxvZGUoIGhEQywgbnBQbGF5ZXIgKTsNCisJU2V0UmVzdGFydCggUkVTVEFSVF9HQU1FICk7DQorCUV4cGxvZGVCYWRndXlzKCBoREMsICZSb2lkTGlzdCApOw0KKwlFeHBsb2RlQmFkZ3V5cyggaERDLCAmU3Bpbm5lckxpc3QgKTsNCisJRXhwbG9kZUJhZGd1eXMoIGhEQywgJlN3YXJtZXJMaXN0ICk7DQorCUV4cGxvZGVCYWRndXlzKCBoREMsICZIdW50ZXJMaXN0ICk7DQorDQorCVJlbGVhc2VEQyggaFduZCwgaERDICk7DQorfQ0KKw0KKy8vDQorLy8gUmVzdGFydEh5cGVyb2lkIC0gc2V0IHVwIGEgZ2FtZSENCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgUmVzdGFydEh5cGVyb2lkKCBWT0lEICkNCit7DQorCWlmIChucFBsYXllci0+bkNvdW50ID09IDApDQorCXsNCisJCVBPSU5UIFBvcywgVmVsOw0KKwkJUG9zLnggPSAwOw0KKwkJUG9zLnkgPSAtQ0xJUF9DT09SRCAvIDI7DQorCQlWZWwueCA9IDA7DQorCQlWZWwueSA9IDE1MDsNCisJCVByaW50TGV0dGVycyggc3pBcHBOYW1lLCBQb3MsIFZlbCwgWUVMTE9XLCA4MDAgKTsNCisJCW5wUGxheWVyLT5uQ291bnQgPSAzOw0KKwkJaWYgKGxIaWdoU2NvcmUgPCBsU2NvcmUpIGxIaWdoU2NvcmUgPSBsU2NvcmU7DQorCQlsTGFzdExpZmUgPSBsU2NvcmUgPSAwOw0KKwkJbkxldmVsID0gMDsNCisJCW5TaGllbGQgPSBuQm9tYiA9IDM7DQorCX0NCisJZWxzZSBpZiAobnBQbGF5ZXItPm5Db3VudCA8IDApDQorCXsNCisJCS8vIGNoZWVzeSB3YXkgb2YgcmVzdGFydGluZyBhZnRlciBhIG1ham9yIGNvbGxpc2lvbg0KKwkJbnBQbGF5ZXItPm5Db3VudCA9IC1ucFBsYXllci0+bkNvdW50Ow0KKwkJblNoaWVsZCA9IG5Cb21iID0gMzsNCisJfQ0KKw0KKwlucFBsYXllci0+UG9zLnggPSBucFBsYXllci0+UG9zLnkgPSAwOw0KKwlucFBsYXllci0+VmVsLnggPSBucFBsYXllci0+VmVsLnkgPSAwOw0KKwlucFBsYXllci0+bkRpciA9IDY0Ow0KKwlucFBsYXllci0+blNwaW4gPSAwOw0KKwlucFBsYXllci0+YnlDb2xvciA9IEdSRUVOOw0KKwluU2FmZSA9IDMwOw0KKw0KKwlpZiAoU2hvdExpc3QubnBIZWFkKQ0KKwl7DQorCQlOUE9CSiBucFNob3Q7DQorCQlmb3IgKG5wU2hvdCA9IEhlYWRPYmooICZTaG90TGlzdCApOyBucFNob3Q7IG5wU2hvdCA9IE5leHRPYmooIG5wU2hvdCApKQ0KKwkJCW5wU2hvdC0+bkNvdW50ID0gMTsNCisJfQ0KKw0KKwkvLyByZXNlZWQgdGhlIGFzdGVyb2lkIGZpZWxkDQorCWlmIChuQmFkR3V5cyA9PSAwKQ0KKwl7DQorCQlJTlQgbkNudDsNCisJCSsrbkxldmVsOw0KKwkJZm9yIChuQ250ID0gNSArIG5MZXZlbDsgbkNudDsgLS1uQ250KQ0KKwkJew0KKwkJCVBPSU5UIFBvcywgVmVsOw0KKwkJCVBvcy54ID0gYXJhbmQoIE1BWF9DT09SRCAqIDIgKSAtIE1BWF9DT09SRDsNCisJCQlQb3MueSA9IGFyYW5kKCBNQVhfQ09PUkQgKiAyICkgLSBNQVhfQ09PUkQ7DQorCQkJVmVsLnggPSBWZWwueSA9IDA7DQorCQkJQ3JlYXRlUm9pZCggUG9zLCBWZWwsIDYgKyBhcmFuZCggMiApLA0KKwkJCQkJCShCWVRFKShhcmFuZCggMiApID8gREtZRUxMT1cgOiBES0dSRVkpLA0KKwkJCQkJCWFyYW5kKCBERUdSRUVfTUFYICksIDMwICsgYXJhbmQoIG5MZXZlbCAqIDggKSwgMCApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8vDQorLy8gUGFuaWMgLSBib3NzIGtleSAob3IganVzdCBwYXVzZSkNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgUGFuaWMoIEJPT0wgYlBhbmljICkNCit7DQorCWlmIChiUGFuaWMgJiYgIWJQYXVzZWQpDQorCXsNCisJCWJQYXVzZWQgPSBUUlVFOw0KKwkJS2lsbFRpbWVyKCBoQXBwV25kLCBEUkFXX1RJTUVSICk7DQorCQlTZXRXaW5kb3dUZXh0KCBoQXBwV25kLCAiUHJvZ3JhbSBNYW5hZ2VyIEhlbHAgLSBQUk9HTUFOLkhMUCIgKTsNCisJCVNob3dXaW5kb3coIGhBcHBXbmQsIFNXX1NIT1dNSU5OT0FDVElWRSApOw0KKwkJSW52YWxpZGF0ZVJlY3QoIGhBcHBXbmQsIE5VTEwsIFRSVUUgKTsNCisJfQ0KKwllbHNlIGlmIChiUGF1c2VkKSAvLyBkb3VibGUtcGFuaWMgPT0gbm9ybWFsDQorCXsNCisJCWJQYXVzZWQgPSBGQUxTRTsNCisJCVNldFdpbmRvd1RleHQoIGhBcHBXbmQsIHN6QXBwTmFtZSApOw0KKwkJaWYgKGJQYW5pYykgU2hvd1dpbmRvdyggaEFwcFduZCwgU1dfUkVTVE9SRSApOw0KKwkJU2V0VGltZXIoIGhBcHBXbmQsIERSQVdfVElNRVIsIG5EcmF3RGVsYXksIE5VTEwgKTsNCisJfQ0KK30NCisNCisvLw0KKy8vIFBhaW50SHlwZXJvaWQgLSBwYWludCB0aGUgaHlwZXJvaWQgd2luZG93DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIFBhaW50SHlwZXJvaWQoIEhXTkQgaFduZCApDQorew0KKwlQQUlOVFNUUlVDVCAgICAgcHM7DQorDQorCUJlZ2luUGFpbnQoIGhXbmQsICZwcyApOw0KKwlpZiAoYlBhdXNlZCkgRHJhd0ljb24oIHBzLmhkYywgMiwgMiwgTG9hZEljb24oIGhBcHBJbnN0LCBJTlRSRVMoSURJX1BBTklDKSApICk7DQorCUVuZFBhaW50KCBoV25kLCAmcHMgKTsNCit9DQorDQorLy8NCisvLyBFcmFzZUh5cGVyb2lkQmtnbmQgLSBmaWxsIGluIHRoZSBiYWNrZ3JvdW5kDQorLy8NCisNCitCT09MIE5FQVIgUEFTQ0FMIEVyYXNlSHlwZXJvaWRCa2duZCggSFdORCBoV25kLCBIREMgaERDICkNCit7DQorCUhCUlVTSCAgICAgICAgICBoYnI7DQorCVJFQ1QgICAgICAgICAgICByZWN0Ow0KKw0KKwlHZXRDbGllbnRSZWN0KCBoV25kLCAmcmVjdCApOw0KKw0KKwlpZiAoYlBhdXNlZCkNCisJew0KKwkJU2V0QnJ1c2hPcmcoIGhEQywgMCwgMCApOw0KKwkJaGJyID0gQ3JlYXRlU29saWRCcnVzaCggR2V0U3lzQ29sb3IoIENPTE9SX0JBQ0tHUk9VTkQgKSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJU2VsZWN0UGFsZXR0ZSggaERDLCBoQXBwUGFsZXR0ZSwgMCApOw0KKwkJUmVhbGl6ZVBhbGV0dGUoIGhEQyApOw0KKwkJaGJyID0gQ3JlYXRlU29saWRCcnVzaCggUEFMRVRURUlOREVYKCBCTEFDSyApICk7DQorCX0NCisNCisJRmlsbFJlY3QoIGhEQywgJnJlY3QsIGhiciApOw0KKwlEZWxldGVPYmplY3QoIGhiciApOw0KKwlyZXR1cm4oIFRSVUUgKTsNCit9DQorDQorLy8NCisvLyBEcmF3U2hhZG93UmVjdCAtIGRyYXcgYSBzaGFkZWQgcmVjdGFuZ2xlIGFyb3VuZCBhbiBvYmplY3QNCisvLw0KKw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd1NoYWRvd1JlY3QoIEhEQyBoREMsIE5QUkVDVCBucFJlY3QsIEhQRU4gaEhpLCBIUEVOIGhMbyApDQorew0KKwlTZWxlY3RPYmplY3QoIGhEQywgaEhpICk7DQorCU1vdmVUbyggaERDLCBucFJlY3QtPnJpZ2h0LCBucFJlY3QtPnRvcCApOw0KKwlMaW5lVG8oIGhEQywgbnBSZWN0LT5sZWZ0LCBucFJlY3QtPnRvcCApOw0KKwlMaW5lVG8oIGhEQywgbnBSZWN0LT5sZWZ0LCBucFJlY3QtPmJvdHRvbSApOw0KKwlTZWxlY3RPYmplY3QoIGhEQywgaExvICk7DQorCUxpbmVUbyggaERDLCBucFJlY3QtPnJpZ2h0LCBucFJlY3QtPmJvdHRvbSApOw0KKwlMaW5lVG8oIGhEQywgbnBSZWN0LT5yaWdodCwgbnBSZWN0LT50b3AgKTsNCit9DQorDQorLy8NCisvLyBOQ1BhaW50SHlwZXJvaWQgLSBwYWludCBhIGN1c3RvbSBmcmFtZQ0KKy8vDQorDQorVk9JRCBORUFSIFBBU0NBTCBOQ1BhaW50SHlwZXJvaWQoIEhXTkQgaFduZCApDQorew0KKwlIREMgICAgICAgICAgICAgaERDLCBoRENNZW07DQorCUlOVCAgICAgICAgICAgICBjeCwgY3ksIGN5Q2FwLCBoOw0KKwlIUEVOICAgICAgICAgICAgaHBlbkhpLCBocGVuTG87DQorCUhCUlVTSCAgICAgICAgICBoYnI7DQorCUhCSVRNQVAgICAgICAgICBoYm0sIGhibU9sZDsNCisJQklUTUFQICAgICAgICAgIGJtOw0KKwlSRUNUICAgICAgICAgICAgcmVjdDsNCisNCisJaWYgKElzSWNvbmljKCBoV25kICkpIHJldHVybjsNCisJaERDID0gR2V0V2luZG93REMoIGhXbmQgKTsNCisJR2V0V2luZG93UmVjdCggaFduZCwgJnJlY3QgKTsNCisJcmVjdC5yaWdodCAtPSByZWN0LmxlZnQsIHJlY3QubGVmdCA9IDA7DQorCXJlY3QuYm90dG9tIC09IHJlY3QudG9wLCByZWN0LnRvcCA9IDA7DQorCWN4ID0gR2V0U3lzdGVtTWV0cmljcyggU01fQ1hGUkFNRSApOw0KKwljeSA9IEdldFN5c3RlbU1ldHJpY3MoIFNNX0NZRlJBTUUgKTsNCisJY3lDYXAgPSBjeSArIEdldFN5c3RlbU1ldHJpY3MoIFNNX0NZQ0FQVElPTiApIC0gMTsNCisJaCA9IHJlY3QuYm90dG9tIC0gKGN5Q2FwICsgY3kpOw0KKw0KKwlTZWxlY3RQYWxldHRlKCBoREMsIGhBcHBQYWxldHRlLCAwICk7DQorCVJlYWxpemVQYWxldHRlKCBoREMgKTsNCisJaWYgKGJCVykNCisJew0KKwkJaGJyID0gU2VsZWN0T2JqZWN0KCBoREMsIENyZWF0ZVNvbGlkQnJ1c2goIFBBTEVUVEVJTkRFWCggV0hJVEUgKSApICk7DQorCQlocGVuSGkgPSBoUGVuW0JMQUNLXTsNCisJCWhwZW5MbyA9IGhQZW5bQkxBQ0tdOw0KKwl9DQorCWVsc2UNCisJew0KKwkJaGJyID0gU2VsZWN0T2JqZWN0KCBoREMsIENyZWF0ZVNvbGlkQnJ1c2goIFBBTEVUVEVJTkRFWCggR1JFWSApICkgKTsNCisJCWhwZW5IaSA9IGhQZW5bV0hJVEVdOw0KKwkJaHBlbkxvID0gaFBlbltES0dSRVldOw0KKwl9DQorDQorCVBhdEJsdCggaERDLCAwLCAwLCByZWN0LnJpZ2h0LCBjeUNhcCwgUEFUQ09QWSApOw0KKwlQYXRCbHQoIGhEQywgMCwgcmVjdC5ib3R0b20gLSBjeSwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIFBBVENPUFkgKTsNCisJUGF0Qmx0KCBoREMsIDAsIGN5Q2FwLCBjeCwgaCwgUEFUQ09QWSApOw0KKwlQYXRCbHQoIGhEQywgcmVjdC5yaWdodCAtIGN4LCBjeUNhcCwgY3gsIGgsIFBBVENPUFkgKTsNCisNCisJLS1yZWN0LmJvdHRvbTsgLS1yZWN0LnJpZ2h0Ow0KKwlEcmF3U2hhZG93UmVjdCggaERDLCAmcmVjdCwgaHBlbkhpLCBocGVuTG8gKTsNCisJLS1jeDsgLS1jeTsNCisJcmVjdC5sZWZ0ICs9IGN4OyByZWN0LnRvcCArPSBjeTsNCisJcmVjdC5yaWdodCAtPSBjeDsgcmVjdC5ib3R0b20gLT0gY3k7DQorCWlmICghYkJXKSBEcmF3U2hhZG93UmVjdCggaERDLCAmcmVjdCwgaHBlbkxvLCBocGVuSGkgKTsNCisNCisJLy8gZ2V0IHRoZSB0aXRsZSBiYXIgcmVjdA0KKwkrK3JlY3QubGVmdDsgKytyZWN0LnRvcDsgLS1yZWN0LnJpZ2h0Ow0KKwlyZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgY3lDYXAgLSAoY3kgKyAyKTsNCisJRHJhd1NoYWRvd1JlY3QoIGhEQywgJnJlY3QsIGhwZW5IaSwgaHBlbkxvICk7DQorCSsrcmVjdC5yaWdodDsgLy8gZm9yIHpvb20vcmVzdG9yZSBiaXRtYXANCisNCisJaERDTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDKCBoREMgKTsNCisNCisJaGJtID0gTG9hZEJpdG1hcCggTlVMTCwgSU5UUkVTKE9CTV9DTE9TRSkgKTsNCisJR2V0T2JqZWN0KCBoYm0sIHNpemVvZihibSksIChMUFNUUikmYm0gKTsNCisJYm0uYm1XaWR0aCAvPSAyOyAvLyB0aGV5IHBhY2tlZCB0d28gaW1hZ2VzIGluIGhlcmUhDQorCWhibU9sZCA9IFNlbGVjdE9iamVjdCggaERDTWVtLCBoYm0gKTsNCisJQml0Qmx0KCBoREMsIHJlY3QubGVmdCwgcmVjdC50b3AsIGJtLmJtV2lkdGgsIGJtLmJtSGVpZ2h0LCBoRENNZW0sIDAsIDAsIFNSQ0NPUFkgKTsNCisJcmVjdC5sZWZ0ICs9IGJtLmJtV2lkdGg7DQorDQorCWlmIChJc1pvb21lZCggaFduZCApKSBoYm0gPSBMb2FkQml0bWFwKCBOVUxMLCBJTlRSRVMoT0JNX1JFU1RPUkUpICk7DQorCWVsc2UgaGJtID0gTG9hZEJpdG1hcCggTlVMTCwgSU5UUkVTKE9CTV9aT09NKSApOw0KKwlHZXRPYmplY3QoIGhibSwgc2l6ZW9mKGJtKSwgKExQU1RSKSZibSApOw0KKwlTZWxlY3RPYmplY3QoIGhEQ01lbSwgaGJtICk7DQorCXJlY3QucmlnaHQgLT0gYm0uYm1XaWR0aDsNCisJQml0Qmx0KCBoREMsIHJlY3QucmlnaHQsIHJlY3QudG9wLCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCwgaERDTWVtLCAwLCAwLCBTUkNDT1BZICk7DQorDQorCWhibSA9IExvYWRCaXRtYXAoIE5VTEwsIElOVFJFUyhPQk1fUkVEVUNFKSApOw0KKwlHZXRPYmplY3QoIGhibSwgc2l6ZW9mKGJtKSwgKExQU1RSKSZibSApOw0KKwlTZWxlY3RPYmplY3QoIGhEQ01lbSwgaGJtICk7DQorCXJlY3QucmlnaHQgLT0gYm0uYm1XaWR0aDsNCisJQml0Qmx0KCBoREMsIHJlY3QucmlnaHQsIHJlY3QudG9wLCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCwgaERDTWVtLCAwLCAwLCBTUkNDT1BZICk7DQorDQorCS0tcmVjdC5yaWdodDsNCisJRHJhd1NoYWRvd1JlY3QoIGhEQywgJnJlY3QsIGhwZW5IaSwgaHBlbkxvICk7DQorDQorCS8vIGNsaXAgdGhlIHNjb3JlIHRvIHRoZSBmcmVlIHRpdGxlYmFyIGFyZWENCisJKytyZWN0LmxlZnQ7ICsrcmVjdC50b3A7DQorCXJlY3RTY29yZUNsaXAgPSByZWN0Ow0KKw0KKwlEZWxldGVPYmplY3QoIFNlbGVjdE9iamVjdCggaERDTWVtLCBoYm1PbGQgKSApOw0KKwlEZWxldGVPYmplY3QoIFNlbGVjdE9iamVjdCggaERDLCBoYnIgKSApOw0KKwlEZWxldGVEQyggaERDTWVtICk7DQorCVJlbGVhc2VEQyggaFduZCwgaERDICk7DQorDQorCS8vIG1ha2Ugc3VyZSB0aGUgc2NvcmUgZ2V0cyByZWRyYXduDQorCWZvciAoY3ggPSAwOyBjeCA8IG5TY29yZUxlbjsgKytjeCkgc3pTY29yZVtjeF0gPSAnXDAnOw0KK30NCisNCisvLw0KKy8vIEh5cGVyb2lkV25kUHJvYyAtIHRoZSBtYWluIHdpbmRvdyBwcm9jIGZvciBIeXBlcm9pZA0KKy8vDQorDQorTE9ORyBGQVIgUEFTQ0FMIEVYUE9SVCBIeXBlcm9pZFduZFByb2MoIEhXTkQgaFduZCwgdW5zaWduZWQgbWVzc2FnZSwNCisJCQkJCQkJCQkJV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkNCit7DQorCXN3aXRjaCAobWVzc2FnZSkNCisJew0KKwljYXNlIFdNX0NSRUFURToNCisJCVJlc3RhcnRIeXBlcm9pZCgpOw0KKwkJU2V0VGltZXIoIGhXbmQsIERSQVdfVElNRVIsIG5EcmF3RGVsYXksIE5VTEwgKTsNCisJCU5DUGFpbnRIeXBlcm9pZCggaFduZCApOw0KKwkJYnJlYWs7DQorDQorCWNhc2UgV01fVElNRVI6DQorCQlzd2l0Y2ggKHdQYXJhbSkNCisJCXsNCisJCWNhc2UgRFJBV19USU1FUjoNCisJCQlDaGVja1Njb3JlKCBoV25kICk7DQorCQkJRHJhd09iamVjdHMoIGhXbmQgKTsNCisJCQlyZXR1cm4oIDAgKTsNCisNCisJCWNhc2UgUkVTVEFSVF9USU1FUjoNCisJCQlLaWxsVGltZXIoIGhXbmQsIFJFU1RBUlRfVElNRVIgKTsNCisJCQliUmVzdGFydCA9IEZBTFNFOw0KKwkJCVJlc3RhcnRIeXBlcm9pZCgpOw0KKwkJCXJldHVybiggMCApOw0KKwkJfQ0KKwkJYnJlYWs7DQorDQorCWNhc2UgV01fU1lTQ09NTUFORDoNCisJCXN3aXRjaCAod1BhcmFtKQ0KKwkJew0KKwkJY2FzZSBJRE1fTkVXOg0KKwkJCU5ld0dhbWUoIGhXbmQgKTsNCisJCQlicmVhazsNCisNCisJCWNhc2UgSURNX0FCT1VUOg0KKwkJCUFib3V0SHlwZXJvaWQoIGhXbmQgKTsNCisJCQlicmVhazsNCisNCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuKCBEZWZXaW5kb3dQcm9jKCBoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApICk7DQorCQl9DQorCQlicmVhazsNCisNCisJY2FzZSBXTV9RVUVSWU9QRU46DQorCQlQYW5pYyggRkFMU0UgKTsNCisJCXJldHVybiggRGVmV2luZG93UHJvYyggaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKSApOw0KKw0KKwljYXNlIFdNX0NIQVI6DQorCQlpZiAod1BhcmFtID09IFZLX0VTQ0FQRSkgUGFuaWMoIFRSVUUgKTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIFdNX1NZU0tFWURPV046DQorCWNhc2UgV01fU1lTS0VZVVA6DQorCWNhc2UgV01fU1lTQ0hBUjoNCisJCWlmIChsUGFyYW0gJiAoMUw8PDI5KSkgLy8gYWx0IGtleSBpcyBkb3duDQorCQl7DQorCQkJcmV0dXJuKCBEZWZXaW5kb3dQcm9jKCBoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApICk7DQorCQl9DQorCQlzd2l0Y2ggKHdQYXJhbSkNCisJCXsNCisJCWNhc2UgVktfRVNDQVBFOg0KKwkJCWlmIChtZXNzYWdlID09IFdNX1NZU0tFWURPV04pIFBhbmljKCBUUlVFICk7DQorCQkJcmV0dXJuKCAwICk7DQorCQljYXNlIFZLX1NQQUNFOg0KKwkJY2FzZSBWS19UQUI6DQorCQkJcmV0dXJuKCAwICk7DQorCQlkZWZhdWx0Og0KKwkJCXJldHVybiggRGVmV2luZG93UHJvYyggaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKSApOw0KKwkJfQ0KKwkJYnJlYWs7DQorDQorCWNhc2UgV01fRVJBU0VCS0dORDoNCisJCXJldHVybiggRXJhc2VIeXBlcm9pZEJrZ25kKCBoV25kLCAoSERDKXdQYXJhbSApICk7DQorDQorCWNhc2UgV01fTkNBQ1RJVkFURToNCisJY2FzZSBXTV9OQ1BBSU5UOg0KKwkJTkNQYWludEh5cGVyb2lkKCBoV25kICk7DQorCQlyZXR1cm4oIFRSVUUgKTsNCisNCisJY2FzZSBXTV9QQUlOVDoNCisJCVBhaW50SHlwZXJvaWQoIGhXbmQgKTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIFdNX1FVRVJZTkVXUEFMRVRURToNCisJCXsNCisJCQlIREMgaERDID0gR2V0REMoIGhXbmQgKTsNCisJCQlTZWxlY3RQYWxldHRlKCBoREMsIGhBcHBQYWxldHRlLCAwICk7DQorCQkJUmVhbGl6ZVBhbGV0dGUoIGhEQyApOw0KKwkJCVJlbGVhc2VEQyggaFduZCwgaERDICk7DQorCQl9DQorCQlyZXR1cm4oIFRSVUUgKTsNCisNCisgICAgY2FzZSBXTV9ERVNUUk9ZOg0KKwkJS2lsbFRpbWVyKCBoV25kLCBEUkFXX1RJTUVSICk7DQorCQlLaWxsVGltZXIoIGhXbmQsIFJFU1RBUlRfVElNRVIgKTsNCisJCVNhdmVIeXBlcm9pZFdpbmRvd1BvcyggaFduZCApOw0KKwkJUG9zdFF1aXRNZXNzYWdlKCAwICk7DQorICAgICAgICBicmVhazsNCisNCisJZGVmYXVsdDoNCisJCXJldHVybiggRGVmV2luZG93UHJvYyggaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKSApOw0KKyAgICB9DQorCXJldHVybiggMCApOw0KK30NCisNCisvLw0KKy8vIEluaXRIeXBlcm9pZCAtIGluaXRpYWxpemUgZXZlcnl0aGluZw0KKy8vDQorDQorQk9PTCBORUFSIFBBU0NBTCBJbml0SHlwZXJvaWQoIFZPSUQgKQ0KK3sNCisJRE9VQkxFICAgICAgICAgIGRSYWQ7DQorCUlOVCAgICAgICAgICAgICBuQ250Ow0KKw0KKwkvLyBhbGxvY2F0ZSB0aGUgbG9naWNhbCBwYWxldHRlDQorCWhBcHBQYWxldHRlID0gQ3JlYXRlSHlwZXJvaWRQYWxldHRlKCk7DQorCWlmICghaEFwcFBhbGV0dGUpIHJldHVybiggRkFMU0UgKTsNCisJZm9yIChuQ250ID0gMDsgbkNudCA8IFBBTEVUVEVfU0laRTsgKytuQ250KQ0KKwl7DQorCQloUGVuW25DbnRdID0gQ3JlYXRlUGVuKCBQU19TT0xJRCwgMSwgUEFMRVRURUlOREVYKCBuQ250ICkgKTsNCisJCWlmICghaFBlbltuQ250XSkgcmV0dXJuKCBGQUxTRSApOw0KKwl9DQorCWZvciAobkNudCA9IDA7IG5DbnQgPCBJREJfTUFYOyArK25DbnQpDQorCXsNCisJCWhCaXRtYXBbbkNudF0gPSBMb2FkQml0bWFwKCBoQXBwSW5zdCwgSU5UUkVTKElEQl9ibGFuayArIG5DbnQpICk7DQorCQlpZiAoIWhQZW5bbkNudF0pIHJldHVybiggRkFMU0UgKTsNCisJfQ0KKw0KKwkvLyBzZWVkIHRoZSByYW5kb21pemVyDQorCWR3U2VlZCA9IEdldEN1cnJlbnRUaW1lKCk7DQorDQorCS8vIGNyZWF0ZSB0aGUgbG9va3VwIHRhYmxlIChzaG91bGQgdXNlIHJlc291cmNlcykNCisJZm9yIChuQ250ID0gMDsgbkNudCA8IERFR1JFRV9TSVpFOyArK25DbnQpDQorCXsNCisJCWRSYWQgPSBuQ250ICogNi4yODMxODU1IC8gREVHUkVFX1NJWkU7DQorCQluQ29zW25DbnRdID0gKElOVCkoREVHUkVFX01BWCAqIGNvcyggZFJhZCApKTsNCisJCW5TaW5bbkNudF0gPSAoSU5UKShERUdSRUVfTUFYICogc2luKCBkUmFkICkpOw0KKwl9DQorDQorCS8vIGdldCB0aGUgaW5pdGlhbGl6YXRpb24gZmlsZSBpbmZvDQorCUdldEh5cGVyb2lkSW5pKCk7DQorDQorCS8vIGFsbG9jYXRlIGFsbCBvYmplY3RzIGFzIGZyZWUNCisJZm9yIChuQ250ID0gMDsgbkNudCA8IE1BWF9PQkpTOyArK25DbnQpDQorCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsICYoT2JqW25DbnRdKSApOw0KKw0KKwkvLyBzZXQgdXAgdGhlIHBsYXllcg0KKwlucFBsYXllciA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApOw0KKwlucFBsYXllci0+YnlQdHMgPSBESU0oUGxheWVyKTsNCisJbnBQbGF5ZXItPm5NYXNzID0gMjU2Ow0KKwlmb3IgKG5DbnQgPSAwOyBuQ250IDwgRElNKFBsYXllcik7ICsrbkNudCkNCisJCW5wUGxheWVyLT5QdHNbbkNudF0gPSBQbGF5ZXJbbkNudF07DQorDQorCXJldHVybiggVFJVRSApOw0KK30NCisNCisvLw0KKy8vIEV4aXRIeXBlcm9pZCAtIHF1aXQgdGhlIGRhbW4gZ2FtZSBhbHJlYWR5IQ0KKy8vDQorDQorVk9JRCBORUFSIFBBU0NBTCBFeGl0SHlwZXJvaWQoIFZPSUQgKQ0KK3sNCisJSU5UICAgICAgICAgICAgIG5DbnQ7DQorDQorCWlmIChoQXBwUGFsZXR0ZSkgRGVsZXRlT2JqZWN0KCBoQXBwUGFsZXR0ZSApOw0KKwlmb3IgKG5DbnQgPSAwOyBuQ250IDwgUEFMRVRURV9TSVpFOyArK25DbnQpDQorCQlpZiAoaFBlbltuQ250XSkgRGVsZXRlT2JqZWN0KCBoUGVuW25DbnRdICk7DQorCWZvciAobkNudCA9IDA7IG5DbnQgPCBJREJfTUFYOyArK25DbnQpDQorCQlpZiAoaEJpdG1hcFtuQ250XSkgRGVsZXRlT2JqZWN0KCBoQml0bWFwW25DbnRdICk7DQorfQ0KKw0KKy8vDQorLy8gV2luTWFpbiAtIGV2ZXJ5Ym9keSBoYXMgdG8gaGF2ZSBvbmUNCisvLw0KKw0KK0lOVCBGQVIgUEFTQ0FMIFdpbk1haW4oIEhBTkRMRSBoSW5zdGFuY2UsIEhBTkRMRSBoUHJldkluc3RhbmNlLA0KKwkJCQkJCUxQU1RSIGxwc3pDbWRMaW5lLCBJTlQgbkNtZFNob3cgKQ0KK3sNCisJTVNHICAgICAgICAgbXNnOw0KKw0KKwloQXBwSW5zdCA9IGhJbnN0YW5jZTsNCisJaWYgKCFoUHJldkluc3RhbmNlKQ0KKwl7DQorCQkvLyBjcmVhdGUgdGhlIGNsYXNzIGlmIHdlJ3JlIGZpcnN0DQorCQlpZiAoIUNyZWF0ZUh5cGVyb2lkQ2xhc3MoKSkgcmV0dXJuKCBGQUxTRSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJLy8gQ29weSBkYXRhIGZyb20gcHJldmlvdXMgaW5zdGFuY2UNCisJCUdldEluc3RhbmNlRGF0YSggaFByZXZJbnN0YW5jZSwgKFBTVFIpc3pBcHBOYW1lLCBzaXplb2Yoc3pBcHBOYW1lKSApOw0KKwl9DQorCWlmICghSW5pdEh5cGVyb2lkKCkpIGdvdG8gQWJvcnQ7IC8vIEkgTE9WRSBHT1RPUyEgUkVBTExZIEkgRE8hDQorCWhBcHBXbmQgPSBDcmVhdGVIeXBlcm9pZFdpbmRvdyggbHBzekNtZExpbmUsIG5DbWRTaG93ICk7DQorCWlmICghaEFwcFduZCkgcmV0dXJuKCBGQUxTRSApOw0KKw0KKwl3aGlsZSAoR2V0TWVzc2FnZSggJm1zZywgTlVMTCwgMCwgMCApKQ0KKwl7DQorCQlUcmFuc2xhdGVNZXNzYWdlKCAmbXNnICk7DQorCQlEaXNwYXRjaE1lc3NhZ2UoICZtc2cgKTsNCisJfQ0KKw0KK0Fib3J0Og0KKwlFeGl0SHlwZXJvaWQoKTsNCisJcmV0dXJuKCBtc2cud1BhcmFtICk7DQorfQ0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuZGVmIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwOTAwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuZGVmCkBAIC0wLDAgKzEsMTUgQEAKK05BTUUgICAgICAgICAgICAgICAgICAgIEh5cGVyb2lkDQorREVTQ1JJUFRJT04gICAgICAgICAgICAgJ0h5cGVyb2lkIENvcHlyaWdodCAoQykgMTk5MCw5MSBIdXRjaGlucyBTb2Z0d2FyZScNCitFWEVUWVBFICAgICAgICAgICAgICAgICBXSU5ET1dTDQorU1RVQiAgICAgICAgICAgICAgICAgICAgJ1dJTlNUVUIuRVhFJw0KK1NUQUNLU0laRSAgICAgICAgICAgICAgIDQwOTYNCitIRUFQU0laRSAgICAgICAgICAgICAgICAzMjc2OA0KK0RBVEEgICAgICAgICAgICAgICAgICAgIE1PVkVBQkxFIE1VTFRJUExFDQorQ09ERSAgICAgICAgICAgICAgICAgICAgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQ0KK1NFR01FTlRTDQorCUhZUEVST0lEICAgICAgICAgICAgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQ0KKwlST0lEU1VQUCAgICAgICAgICAgIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUNCisNCitFWFBPUlRTDQorCUh5cGVyb2lkV25kUHJvYyAgICAgQDENCisJSHlwZXJvaWRBYm91dERsZyAgICBAMg0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuZXhlIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNGY2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaCBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZiMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5oCkBAIC0wLDAgKzEsMjQxIEBACisvLw0KKy8vIEhZUEVST0lELkggLSBoeXBlcm9pZCBpbnRlcm5hbCBoZWFkZXIgaW5mb3JtYXRpb24NCisvLw0KKy8vIFZlcnNpb246IDEuMSAgQ29weXJpZ2h0IChDKSAxOTkwLDkxIEh1dGNoaW5zIFNvZnR3YXJlDQorLy8gICAgICBUaGlzIHNvZnR3YXJlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQ0KKy8vICAgICAgUGxlYXNlIHJlYWQgdGhlIGFzc29jaWF0ZWQgbGVnYWwgZG9jdW1lbnRhdGlvbg0KKy8vIEF1dGhvcjogRWR3YXJkIEh1dGNoaW5zDQorLy8gUmV2aXNpb25zOg0KKy8vDQorDQorI2lmbmRlZiBSQ19JTlZPS0VEDQorDQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVkZSA8Y3R5cGUuaD4NCisjaW5jbHVkZSA8bWF0aC5oPg0KKyNpbmNsdWRlIDxsaW1pdHMuaD4NCisjZGVmaW5lIE9FTVJFU09VUkNFDQorI2luY2x1ZGUgPHdpbmV4dC5oPg0KKw0KKy8vDQorLy8gdHlwZWRlZnMgYW5kIGRlZmluZXMNCisvLw0KKw0KKy8vIGNvbG9yIHN0dWZmDQorI2RlZmluZSBQQUxFVFRFX1NJWkUgMTYNCit0eXBlZGVmIGVudW0NCit7DQorCUJMQUNLLCBES0dSRVksIEdSRVksIFdISVRFLA0KKwlES1JFRCwgUkVELCBES0dSRUVOLCBHUkVFTiwgREtCTFVFLCBCTFVFLA0KKwlES1lFTExPVywgWUVMTE9XLCBES0NZQU4sIENZQU4sIERLTUFHRU5UQSwgTUFHRU5UQQ0KK30gQ09MT1JTOw0KKw0KKy8vIGRlZ3JlZXMgc2NhbGVkIHRvIGludGVnZXIgbWF0aA0KKyNkZWZpbmUgREVHUkVFX1NJWkUgMjU2DQorI2RlZmluZSBERUdSRUVfTUFTSyAyNTUNCisjZGVmaW5lIERFR1JFRV9NQVggMHg0MDAwDQorDQorLy8gb2JqZWN0IGxpbWl0cw0KKyNkZWZpbmUgTUFYX1BUUyA4DQorI2RlZmluZSBNQVhfT0JKUyAxMDANCisjZGVmaW5lIE1BWF9DT09SRCAweDIwMDANCisjZGVmaW5lIENMSVBfQ09PUkQgKE1BWF9DT09SRCszMDApDQorDQorLy8gdGltZXIgc3R1ZmYNCisjZGVmaW5lIERSQVdfVElNRVIgMQ0KKyNkZWZpbmUgRFJBV19ERUxBWSA1MA0KKyNkZWZpbmUgUkVTVEFSVF9USU1FUiAyDQorI2RlZmluZSBSRVNUQVJUX0RFTEFZIDUwMDANCisNCisvLyByZXN0YXJ0IG1vZGVzDQordHlwZWRlZiBlbnVtIHsgUkVTVEFSVF9HQU1FLCBSRVNUQVJUX0xFVkVMLCBSRVNUQVJUX05FWFRMRVZFTCB9IFJFU1RBUlRfTU9ERTsNCisNCisvLyBsZXR0ZXIgc2NhbGluZw0KKyNkZWZpbmUgTEVUVEVSX01BWCAyNTYNCisNCisvLyBleHRyYSBsaWZlIGV2ZXJ5DQorI2RlZmluZSBFWFRSQV9MSUZFIDEwMDAwMA0KKw0KKy8vIGxpc3Qgbm9kZQ0KK3R5cGVkZWYgc3RydWN0IHRhZ05PREUNCit7DQorCXN0cnVjdCB0YWdOT0RFICAqbnBOZXh0LCAqbnBQcmV2Ow0KK30gTk9ERTsNCitwb2ludGVyZGVmKCBOT0RFICk7DQorDQorLy8gbGlzdCBoZWFkZXINCit0eXBlZGVmIHN0cnVjdA0KK3sNCisJTlBOT0RFICAgICAgICAgIG5wSGVhZCwgbnBUYWlsOw0KK30gTElTVDsNCitwb2ludGVyZGVmKCBMSVNUICk7DQorDQorLy8gb2JqZWN0IGRlc2NyaXB0b3INCit0eXBlZGVmIHN0cnVjdA0KK3sNCisJTk9ERSAgICAgICAgICAgIExpbms7ICAgICAgICAgICAgICAgLy8gZm9yIG9iamVjdCBsaXN0DQorCVBPSU5UICAgICAgICAgICBQb3M7ICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIGNlbnRlciBvZiBvYmplY3QNCisJUE9JTlQgICAgICAgICAgIFZlbDsgICAgICAgICAgICAgICAgLy8gdmVsb2NpdHkgaW4gbG9naWNhbCB1bml0cy91cGRhdGUNCisJSU5UICAgICAgICAgICAgIG5NYXNzOyAgICAgICAgICAgICAgLy8gbWFzcyBvZiBvYmplY3QNCisJSU5UICAgICAgICAgICAgIG5EaXI7ICAgICAgICAgICAgICAgLy8gZGlyZWN0aW9uIGluIGRlZ3JlZXMNCisJSU5UICAgICAgICAgICAgIG5TcGluOyAgICAgICAgICAgICAgLy8gYW5ndWxhciBtb21lbnR1bSBkZWdyZWVzL3VwZGF0ZQ0KKwlJTlQgICAgICAgICAgICAgbkNvdW50OyAgICAgICAgICAgICAvLyB1c2VkIGJ5IGRpZmZlcmVudCBvYmplY3RzDQorCUlOVCAgICAgICAgICAgICBuRGVsYXk7ICAgICAgICAgICAgIC8vIHVzZWQgYnkgZGlmZmVyZW50IG9iamVjdHMNCisJQllURSAgICAgICAgICAgIGJ5Q29sb3I7ICAgICAgICAgICAgLy8gcGFsZXR0ZSBjb2xvcg0KKwlCWVRFICAgICAgICAgICAgYnlQdHM7ICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcG9pbnRzIGluIG9iamVjdA0KKwlQT0lOVCAgICAgICAgICAgUHRzW01BWF9QVFNdOyAgICAgICAvLyBwb2ludHMgbWFraW5nIHVwIGFuIG9iamVjdA0KKwlQT0lOVCAgICAgICAgICAgT2xkW01BWF9QVFNdOyAgICAgICAvLyBsYXN0IHBsb3R0ZWQgbG9jYXRpb24NCit9IE9CSjsNCitwb2ludGVyZGVmKCBPQkogKTsNCisNCisvLw0KKy8vIGlubGluZSBtYWNybyBmdW5jdGlvbnMNCisvLw0KKw0KKy8vIGZ1bmN0aW9uIGFsaWFzZXMNCisjZGVmaW5lIEFkZEhlYWRPYmoobCxvKSBBZGRIZWFkKChsKSwoKE5QTk9ERSlvKSkNCisjZGVmaW5lIFJlbUhlYWRPYmoobCkgKChOUE9CSilSZW1IZWFkKGwpKQ0KKyNkZWZpbmUgUmVtb3ZlT2JqKGwsbykgUmVtb3ZlKChsKSwoKE5QTk9ERSlvKSkNCisjZGVmaW5lIEhlYWRPYmoobCkgKChOUE9CSikoKGwpLT5ucEhlYWQpKQ0KKyNkZWZpbmUgTmV4dE9iaihvKSAoKE5QT0JKKSgobyktPkxpbmsubnBOZXh0KSkNCisNCisvLyByZWFsLXRpbWUgY2hlY2sgb2YgdGhlIGtleWJvYXJkDQorI2RlZmluZSBJc0tleURvd24oeCkgKEdldEFzeW5jS2V5U3RhdGUoeCk8MCkNCisNCisvLyBJIEhBVEUgdHlwaW5nIHRoaXMgYWxsYXRpbWUhDQorI2RlZmluZSBJTlRSRVMoeCkgTUFLRUlOVFJFU09VUkNFKHgpDQorDQorLy8gc2l6ZSBvZiBhbiBhcnJheQ0KKyNkZWZpbmUgRElNKHgpIChzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpDQorDQorLy8gZmFzdGVyIHRoYW4gTXVsRGl2IQ0KKyNkZWZpbmUgTVVMREVHKHgseSkgKChJTlQpKCgoTE9ORykoeCkqKHkpKS9ERUdSRUVfTUFYKSkNCisNCisvLyBERUcgLSBjb252ZXJ0IGFuIGludGVnZXIgaW50byBhIGRlZ3JlZSBsb29rdXAgaW5kZXgNCisjZGVmaW5lIERFRyh4KSAoKFdPUkQpKHgpJkRFR1JFRV9NQVNLKQ0KKw0KKy8vIEFDQ0VMIC0gYWNjZWxlcmF0ZSBhbiBvYmplY3QgaW4gYSBnaXZlbiBkaXJlY3Rpb24NCisjZGVmaW5lIEFDQ0VMKG8sZCxzKSBcDQorKCgobyktPlZlbC54ICs9IE1VTERFRygocyksbkNvc1tERUcoZCldKSksIFwNCisoKG8pLT5WZWwueSArPSBNVUxERUcoKHMpLG5TaW5bREVHKGQpXSkpKQ0KKw0KKy8vIFBUSU5SRUNUIC0gYSBmYXN0ZXIgUHRJblJlY3QNCisjZGVmaW5lIFBUSU5SRUNUKHIscCkgXA0KKygoKHIpLT5sZWZ0IDw9IChwKS54KSAmJiAoKHIpLT5yaWdodCA+IChwKS54KSAmJiBcDQorKChyKS0+dG9wIDw9IChwKS55KSAmJiAoKHIpLT5ib3R0b20gPiAocCkueSkpDQorDQorLy8gSU5UUkVDVCAtIGEgZmFzdGVyIEludGVyc2VjdFJlY3QgdGhhdCBqdXN0IHJldHVybnMgdGhlIGNvbmRpdGlvbg0KKyNkZWZpbmUgSU5UUkVDVChyMSxyMikgXA0KKygoKHIxKS0+cmlnaHQgPj0gKHIyKS0+bGVmdCkgJiYgXA0KKygocjEpLT5sZWZ0IDwgKHIyKS0+cmlnaHQpICYmIFwNCisoKHIxKS0+Ym90dG9tID49IChyMiktPnRvcCkgJiYgXA0KKygocjEpLT50b3AgPCAocjIpLT5ib3R0b20pKQ0KKw0KKy8vIE1LUkVDVCAtIG1ha2UgYSByZWN0IGFyb3VuZCBhIHBvaW50DQorI2RlZmluZSBNS1JFQ1QocixwLHMpIFwNCisoKChyKS0+bGVmdCA9ICgocCkueC0ocykpKSwgKChyKS0+cmlnaHQgPSAoKHApLngrKHMpKSksIFwNCisoKHIpLT50b3AgPSAoKHApLnktKHMpKSksICgociktPmJvdHRvbSA9ICgocCkueSsocykpKSkNCisNCisvLw0KKy8vIHByb3RvdHlwZXMNCisvLw0KKw0KKy8vIGh5cGVyb2lkLmMNCitJTlQgTkVBUiBQQVNDQUwgYXJhbmQoIElOVCB4ICk7DQorVk9JRCBORUFSIFBBU0NBTCBBZGRIZWFkKCBOUExJU1QgbnBMaXN0LCBOUE5PREUgbnBOb2RlICk7DQorTlBOT0RFIE5FQVIgUEFTQ0FMIFJlbUhlYWQoIE5QTElTVCBucExpc3QgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIFJlbW92ZSggTlBMSVNUIG5wTGlzdCwgTlBOT0RFIG5wTm9kZSApOw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd09iamVjdCggSERDIGhEQywgTlBPQkogbnBPYmogKTsNCitWT0lEIE5FQVIgUEFTQ0FMIFNldFJlc3RhcnQoIEJPT0wgYkdhbWVPdmVyICk7DQorVk9JRCBORUFSIFBBU0NBTCBBZGRFeHRyYUxpZmUoIFZPSUQgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIEhpdCggSERDIGhEQywgTlBPQkogbnBPYmogKTsNCitWT0lEIE5FQVIgUEFTQ0FMIEV4cGxvZGUoIEhEQyBoREMsIE5QT0JKIG5wT2JqICk7DQorQk9PTCBORUFSIFBBU0NBTCBIaXRQbGF5ZXIoIEhEQyBoREMsIE5QT0JKIG5wT2JqICk7DQorTlBPQkogRkFSIFBBU0NBTCBDcmVhdGVMZXR0ZXIoIENIQVIgY0xldHRlciwgSU5UIG5TaXplICk7DQorVk9JRCBORUFSIFBBU0NBTCBEcmF3TGV0dGVycyggSERDIGhEQyApOw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd0h1bnRlclNob3RzKCBIREMgaERDICk7DQorVk9JRCBORUFSIFBBU0NBTCBGaXJlSHVudGVyU2hvdCggTlBPQkogbnBIdW50ICk7DQorVk9JRCBORUFSIFBBU0NBTCBDcmVhdGVIdW50ZXIoIFZPSUQgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdIdW50ZXJzKCBIREMgaERDICk7DQorVk9JRCBORUFSIFBBU0NBTCBDcmVhdGVTcGlubmVyKCBWT0lEICk7DQorVk9JRCBORUFSIFBBU0NBTCBEcmF3U3Bpbm5lcnMoIEhEQyBoREMgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIENyZWF0ZVJvaWQoIFBPSU5UIFBvcywgUE9JTlQgVmVsLCBJTlQgblNpZGVzLCBCWVRFIGJ5Q29sb3IsIElOVCBuRGlyLCBJTlQgblNwZWVkLCBJTlQgblNwaW4gKTsNCitWT0lEIE5FQVIgUEFTQ0FMIEJyZWFrUm9pZCggSERDIGhEQywgTlBPQkogbnBSb2lkLCBOUE9CSiBucFNob3QgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIERyYXdSb2lkcyggSERDIGhEQyApOw0KK1ZPSUQgTkVBUiBQQVNDQUwgRHJhd1Nob3RzKCBIREMgaERDICk7DQorVk9JRCBORUFSIFBBU0NBTCBEcmF3RmxhbWVzKCBIREMgaERDICk7DQorVk9JRCBORUFSIFBBU0NBTCBGaXJlU2hvdCggVk9JRCApOw0KK1ZPSUQgTkVBUiBQQVNDQUwgQWNjZWxQbGF5ZXIoIElOVCBuRGlyLCBJTlQgbkFjY2VsICk7DQorVk9JRCBORUFSIFBBU0NBTCBEcmF3UGxheWVyKCBIREMgaERDICk7DQorVk9JRCBORUFSIFBBU0NBTCBEcmF3T2JqZWN0cyggSFdORCBoV25kICk7DQorVk9JRCBORUFSIFBBU0NBTCBDaGVja1Njb3JlKCBIV05EIGhXbmQgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIEhpdExpc3QoIEhEQyBoREMsIE5QTElTVCBucExpc3QgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIEV4cGxvZGVCYWRndXlzKCBIREMgaERDLCBOUExJU1QgbnBMaXN0ICk7DQorVk9JRCBORUFSIFBBU0NBTCBOZXdHYW1lKCBIV05EIGhXbmQgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIFJlc3RhcnRIeXBlcm9pZCggVk9JRCApOw0KK1ZPSUQgTkVBUiBQQVNDQUwgUGFuaWMoIEJPT0wgYlBhbmljICk7DQorVk9JRCBORUFSIFBBU0NBTCBQYWludEh5cGVyb2lkKCBIV05EIGhXbmQgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIERpc2FibGVIeXBlcm9pZElucHV0KCBIV05EIGhXbmQsIEJPT0wgYkNhcHR1cmUgKTsNCitMT05HIEZBUiBQQVNDQUwgRVhQT1JUIEh5cGVyb2lkV25kUHJvYyggSFdORCBoV25kLCB1bnNpZ25lZCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsNCitCT09MIE5FQVIgUEFTQ0FMIEluaXRIeXBlcm9pZCggVk9JRCApOw0KK1ZPSUQgTkVBUiBQQVNDQUwgRXhpdEh5cGVyb2lkKCBWT0lEICk7DQorSU5UIEZBUiBQQVNDQUwgV2luTWFpbiggSEFORExFIGhJbnN0YW5jZSwgSEFORExFIGhQcmV2SW5zdGFuY2UsIExQU1RSIGxwc3pDbWRMaW5lLCBJTlQgbkNtZFNob3cgKTsNCisNCisvLyByb2lkc3VwcC5jDQorVk9JRCBGQVIgUEFTQ0FMIFByaW50TGV0dGVycyggTlBTVFIgbnBzelRleHQsIFBPSU5UIFBvcywgUE9JTlQgVmVsLCBCWVRFIGJ5Q29sb3IsIElOVCBuU2l6ZSApOw0KK1ZPSUQgRkFSIFBBU0NBTCBTcGluTGV0dGVycyggTlBTVFIgbnBzelRleHQsIFBPSU5UIFBvcywgUE9JTlQgVmVsLCBCWVRFIGJ5Q29sb3IsIElOVCBuU2l6ZSApOw0KK0hQQUxFVFRFIEZBUiBQQVNDQUwgQ3JlYXRlSHlwZXJvaWRQYWxldHRlKCBWT0lEICk7DQorQk9PTCBGQVIgUEFTQ0FMIENyZWF0ZUh5cGVyb2lkQ2xhc3MoIFZPSUQgKTsNCitWT0lEIE5FQVIgUEFTQ0FMIFNldEh5cGVyb2lkTWVudSggSFdORCBoV25kLCBJTlQgbkZpcnN0SUQsIElOVCBuTGFzdElEICk7DQorSFdORCBGQVIgUEFTQ0FMIENyZWF0ZUh5cGVyb2lkV2luZG93KCBMUFNUUiBscHN6Q21kLCBJTlQgbkNtZFNob3cgKTsNCitWT0lEIEZBUiBQQVNDQUwgU2F2ZUh5cGVyb2lkV2luZG93UG9zKCBIV05EIGhXbmQgKTsNCitWT0lEIEZBUiBQQVNDQUwgR2V0SHlwZXJvaWRJbmkoIFZPSUQgKTsNCitWT0lEIEZBUiBQQVNDQUwgSHlwZXJvaWRIZWxwKCBIV05EIGhXbmQgKTsNCitCT09MIEZBUiBQQVNDQUwgRVhQT1JUIEh5cGVyb2lkQWJvdXREbGcoIEhXTkQgaERsZywgV09SRCBtZXNzLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsNCitWT0lEIEZBUiBQQVNDQUwgQWJvdXRIeXBlcm9pZCggSFdORCBoV25kICk7DQorDQorI2VuZGlmIC8vIFJDX0lOVk9LRUQgLy8NCisNCisvLw0KKy8vIHJlc291cmNlIElEcw0KKy8vDQorDQorLy8gaWNvbnMgYW5kIGJpdG1hcHMNCisjZGVmaW5lIElESV9IWVBFUk9JRCAgICAxMA0KKyNkZWZpbmUgSURJX1BBTklDICAgICAgIDIwDQorDQorLy8gYml0bWFwcw0KKyNkZWZpbmUgSURCX2JsYW5rICAgICAgIDUwDQorI2RlZmluZSBJREJfYm9tYiAgICAgICAgNTENCisjZGVmaW5lIElEQl9sZXZlbCAgICAgICA1Mg0KKyNkZWZpbmUgSURCX2xpZmUgICAgICAgIDUzDQorI2RlZmluZSBJREJfbnVtMCAgICAgICAgNTQNCisjZGVmaW5lIElEQl9udW0xICAgICAgICA1NQ0KKyNkZWZpbmUgSURCX251bTIgICAgICAgIDU2DQorI2RlZmluZSBJREJfbnVtMyAgICAgICAgNTcNCisjZGVmaW5lIElEQl9udW00ICAgICAgICA1OA0KKyNkZWZpbmUgSURCX251bTUgICAgICAgIDU5DQorI2RlZmluZSBJREJfbnVtNiAgICAgICAgNjANCisjZGVmaW5lIElEQl9udW03ICAgICAgICA2MQ0KKyNkZWZpbmUgSURCX251bTggICAgICAgIDYyDQorI2RlZmluZSBJREJfbnVtOSAgICAgICAgNjMNCisjZGVmaW5lIElEQl9wbHVzICAgICAgICA2NA0KKyNkZWZpbmUgSURCX3Njb3JlICAgICAgIDY1DQorI2RlZmluZSBJREJfc2hpZWxkICAgICAgNjYNCisvLyBhZGRpdGlvbmFsIGJpdG1hcCBzdHVmZg0KKyNkZWZpbmUgSURCX01BWCAgICAgICAgIDE3DQorI2RlZmluZSBDWF9CSVRNQVAgICAgICAgMTYNCisjZGVmaW5lIENZX0JJVE1BUCAgICAgICAxNg0KKw0KKy8vIHN0cmluZ3MNCisjZGVmaW5lIElEU19OQU1FICAgICAgICAxMDANCisNCisvLyBtZW51cw0KKyNkZWZpbmUgSURNX05FVyAgICAgICAgIDIwMA0KKyNkZWZpbmUgSURNX0FCT1VUICAgICAgIDIwMQ0KKw0KKy8vIGFib3V0IGJveA0KKyNkZWZpbmUgSUREX0FCT1VUICAgICAgIDUwMA0KKyNkZWZpbmUgSUREX0FfSEVMUCAgICAgIDUwMQ0KKyNkZWZpbmUgSUREX0FfSElTQ09SRSAgIDUwMg0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaWNvIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0MWE4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQubWFrIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4NWExYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQubWFrCkBAIC0wLDAgKzEsMzUgQEAKK1BST0oJPUhZUEVST0lEDQorREVCVUcJPTENCitDQwk9cWNsDQorQ0ZMQUdTX0cJPSAvQU0gL1czIC9aZSANCitDRkxBR1NfRAk9IC9aaSAvT2QgDQorQ0ZMQUdTX1IJPSAvTyAvT2wgL0dzIC9ETkRFQlVHIA0KK0NGTEFHUwk9JChDRkxBR1NfRykgJChDRkxBR1NfRCkNCitMRkxBR1NfRwk9IC9DUDoweGZmZmYgL05PSSAvU0U6MHg4MCAvU1Q6MHgyMDAwIA0KK0xGTEFHU19ECT0gL0NPIC9NIA0KK0xGTEFHU19SCT0gDQorTEZMQUdTCT0kKExGTEFHU19HKSAkKExGTEFHU19EKQ0KK1JVTkZMQUdTCT0NCitPQkpTX0VYVCA9IAkNCitMSUJTX0VYVCA9IAkNCisNCithbGw6CSQoUFJPSikuZXhlDQorDQoraHlwZXJvaWQub2JqOgloeXBlcm9pZC5jDQorDQorcm9pZHN1cHAub2JqOglyb2lkc3VwcC5jDQorDQorJChQUk9KKS5leGU6CWh5cGVyb2lkLm9iaiByb2lkc3VwcC5vYmogJChPQkpTX0VYVCkNCisJZWNobyA+TlVMIEA8PCQoUFJPSikuY3JmDQoraHlwZXJvaWQub2JqICsNCityb2lkc3VwcC5vYmogKw0KKyQoT0JKU19FWFQpDQorJChQUk9KKS5leGUNCisNCiskKExJQlNfRVhUKTsNCis8PA0KKwlpbGluayAtYSAtZSAibGluayAkKExGTEFHUykgQCQoUFJPSikuY3JmIiAkKFBST0opDQorDQorcnVuOiAkKFBST0opLmV4ZQ0KKwkkKFBST0opICQoUlVORkxBR1MpDQorDQpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5tYXAgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGVkZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5tYXAKQEAgLTAsMCArMSw2NzEgQEAKK1N0YWNrIEFsbG9jYXRpb24gPSA4MTkyIGJ5dGVzDQorDQorIGh5cGVyb2lkDQorDQorIFN0YXJ0ICAgICBMZW5ndGggICAgIE5hbWUgICAgICAgICAgICAgICAgICAgQ2xhc3MNCisgMDAwMTowMDAwIDAyMkQ4SCAgICAgSFlQRVJPSUQgICAgICAgICAgICAgICBDT0RFDQorIDAwMDE6MjJEOCAwMDZFOEggICAgIFJPSURTVVBQICAgICAgICAgICAgICAgQ09ERQ0KKyAwMDAxOjI5QzAgMDI4MzRIICAgICBfVEVYVCAgICAgICAgICAgICAgICAgIENPREUNCisgMDAwMTo1MjAwIDAyNkYwSCAgICAgRU1VTEFUT1JfVEVYVCAgICAgICAgICBDT0RFDQorIDAwMDE6NzhGMCAwMDAwMEggICAgIENfRVRFWFQgICAgICAgICAgICAgICAgRU5EQ09ERQ0KKyAwMDAyOjAwMDAgMDAxNzBIICAgICBFTVVMQVRPUl9EQVRBICAgICAgICAgIEZBUl9EQVRBDQorIDAwMDM6MDAwMCAwMDA0MkggICAgIE5VTEwgICAgICAgICAgICAgICAgICAgQkVHREFUQQ0KKyAwMDAzOjAwNDIgMDBBMDBIICAgICBfREFUQSAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTQyIDAwMDAySCAgICAgWElRQyAgICAgICAgICAgICAgICAgICBEQVRBDQorIDAwMDM6MEE0NCAwMDAwRUggICAgIERCREFUQSAgICAgICAgICAgICAgICAgREFUQQ0KKyAwMDAzOjBBNTIgMDAwMEVIICAgICBDREFUQSAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTYwIDAwMDAwSCAgICAgWElGQiAgICAgICAgICAgICAgICAgICBEQVRBDQorIDAwMDM6MEE2MCAwMDAwMEggICAgIFhJRiAgICAgICAgICAgICAgICAgICAgREFUQQ0KKyAwMDAzOjBBNjAgMDAwMDBIICAgICBYSUZFICAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTYwIDAwMDAwSCAgICAgWElCICAgICAgICAgICAgICAgICAgICBEQVRBDQorIDAwMDM6MEE2MCAwMDAwQ0ggICAgIFhJICAgICAgICAgICAgICAgICAgICAgREFUQQ0KKyAwMDAzOjBBNkMgMDAwMDBIICAgICBYSUUgICAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTZDIDAwMDAwSCAgICAgWFBCICAgICAgICAgICAgICAgICAgICBEQVRBDQorIDAwMDM6MEE2QyAwMDAwMEggICAgIFhQICAgICAgICAgICAgICAgICAgICAgREFUQQ0KKyAwMDAzOjBBNkMgMDAwMDBIICAgICBYUEUgICAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTZDIDAwMDAwSCAgICAgWENCICAgICAgICAgICAgICAgICAgICBEQVRBDQorIDAwMDM6MEE2QyAwMDAwMEggICAgIFhDICAgICAgICAgICAgICAgICAgICAgREFUQQ0KKyAwMDAzOjBBNkMgMDAwMDBIICAgICBYQ0UgICAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTZDIDAwMDAwSCAgICAgWENGQiAgICAgICAgICAgICAgICAgICBEQVRBDQorIDAwMDM6MEE2QyAwMDAwMEggICAgIFhDRiAgICAgICAgICAgICAgICAgICAgREFUQQ0KKyAwMDAzOjBBNkMgMDAwMDBIICAgICBYQ0ZFICAgICAgICAgICAgICAgICAgIERBVEENCisgMDAwMzowQTZDIDAwMDE4SCAgICAgQ09OU1QgICAgICAgICAgICAgICAgICBDT05TVA0KKyAwMDAzOjBBODQgMDAwMDhIICAgICBIRFIgICAgICAgICAgICAgICAgICAgIE1TRw0KKyAwMDAzOjBBOEMgMDAxRERIICAgICBNU0cgICAgICAgICAgICAgICAgICAgIE1TRw0KKyAwMDAzOjBDNjkgMDAwMDJIICAgICBQQUQgICAgICAgICAgICAgICAgICAgIE1TRw0KKyAwMDAzOjBDNkIgMDAwMDFIICAgICBFUEFEICAgICAgICAgICAgICAgICAgIE1TRw0KKyAwMDAzOjBDNkMgMDAwNkVIICAgICBfQlNTICAgICAgICAgICAgICAgICAgIEJTUw0KKyAwMDAzOjBDREEgMDAwMDBIICAgICBYT0IgICAgICAgICAgICAgICAgICAgIEJTUw0KKyAwMDAzOjBDREEgMDAwMDBIICAgICBYTyAgICAgICAgICAgICAgICAgICAgIEJTUw0KKyAwMDAzOjBDREEgMDAwMDBIICAgICBYT0UgICAgICAgICAgICAgICAgICAgIEJTUw0KKyAwMDAzOjBDRTAgMDI2MTZIICAgICBjX2NvbW1vbiAgICAgICAgICAgICAgIEJTUw0KKyAwMDAzOjMzMDAgMDIwMDBIICAgICBTVEFDSyAgICAgICAgICAgICAgICAgIFNUQUNLDQorDQorIE9yaWdpbiAgIEdyb3VwDQorIDAwMDM6MCAgIERHUk9VUA0KKw0KKyBBZGRyZXNzICAgRXhwb3J0ICAgICAgICAgICAgICAgICAgQWxpYXMNCisNCisgMDAwMToyOEQ5IEhZUEVST0lEQUJPVVRETEcgICAgICAgIEhZUEVST0lEQUJPVVRETEcNCisgMDAwMToxRUNBIEhZUEVST0lEV05EUFJPQyAgICAgICAgIEhZUEVST0lEV05EUFJPQw0KKw0KKyAgQWRkcmVzcyAgICAgICAgIFB1YmxpY3MgYnkgTmFtZQ0KKw0KKyAwMDAxOjNCNDQgICAgICAgJEkxMF9PVVRQVVQNCisgMDAwMTozODJFICAgICAgICRpOF9vdXRwdXQNCisgMDAwMTozQUVGICAgICAgICRpOF90cHdyMTANCisgMDAwMToyOTZDICAgICAgIEFCT1VUSFlQRVJPSUQNCisgMDAwMTowMjlEICAgICAgIEFDQ0VMRVJBVEUNCisgMDAwMToxOEI2ICAgICAgIEFDQ0VMUExBWUVSDQorIDAwMDE6MDA2QiAgICAgICBBRERIRUFEDQorIDAwMDE6MDAwMCAgICAgICBBUkFORA0KKyAwMDAxOjEzRDkgICAgICAgQlJFQUtST0lEDQorIDAwMDE6MUI5NCAgICAgICBDSEVDS1NDT1JFDQorIDAwMDE6MEM4QSAgICAgICBDUkVBVEVIVU5URVINCisgMDAwMToyNTk1ICAgICAgIENSRUFURUhZUEVST0lEQ0xBU1MNCisgMDAwMToyM0FDICAgICAgIENSRUFURUhZUEVST0lEUEFMRVRURQ0KKyAwMDAxOjI2OEYgICAgICAgQ1JFQVRFSFlQRVJPSURXSU5ET1cNCisgMDAwMTowOEU4ICAgICAgIENSRUFURUxFVFRFUg0KKyAwMDAxOjEyRDMgICAgICAgQ1JFQVRFUk9JRA0KKyAwMDAxOjBGOTggICAgICAgQ1JFQVRFU1BJTk5FUg0KKyAwMDAxOjE3NTQgICAgICAgRFJBV0ZMQU1FUw0KKyAwMDAxOjBENUUgICAgICAgRFJBV0hVTlRFUlMNCisgMDAwMTowQUQyICAgICAgIERSQVdIVU5URVJTSE9UUw0KKyAwMDAxOjBBNDQgICAgICAgRFJBV0xFVFRFUlMNCisgMDAwMTowMkYyICAgICAgIERSQVdPQkpFQ1QNCisgMDAwMToxQUI2ICAgICAgIERSQVdPQkpFQ1RTDQorIDAwMDE6MTk4RSAgICAgICBEUkFXUExBWUVSDQorIDAwMDE6MTVBQyAgICAgICBEUkFXUk9JRFMNCisgMDAwMToxNkM1ICAgICAgIERSQVdTSE9UUw0KKyAwMDAxOjEwN0QgICAgICAgRFJBV1NQSU5ORVJTDQorIDAwMDE6MUU0MSAgICAgICBFUkFTRUhZUEVST0lEQktHTkQNCisgMDAwMToyMUNDICAgICAgIEVYSVRIWVBFUk9JRA0KKyAwMDAxOjA2MzAgICAgICAgRVhQTE9ERQ0KKyAwMDAxOjM1NTIgICAgICAgZkZZVE9YDQorIDAwMDA6RkUzMiAgQWJzICBGSUFSUVENCisgMDAwMDowRTMyICBBYnMgIEZJQ1JRUQ0KKyAwMDAwOjVDMzIgIEFicyAgRklEUlFRDQorIDAwMDA6MTYzMiAgQWJzICBGSUVSUVENCisgMDAwMTowQkFDICAgICAgIEZJUkVIVU5URVJTSE9UDQorIDAwMDE6MTdFMyAgICAgICBGSVJFU0hPVA0KKyAwMDAwOjA2MzIgIEFicyAgRklTUlFRDQorIDAwMDA6QTIzRCAgQWJzICBGSVdSUVENCisgMDAwMDo0MDAwICBBYnMgIEZKQVJRUQ0KKyAwMDAwOkMwMDAgIEFicyAgRkpDUlFRDQorIDAwMDA6ODAwMCAgQWJzICBGSlNSUVENCisgMDAwMTowNTQ3ICAgICAgIEhJVA0KKyAwMDAxOjA3ODcgICAgICAgSElUUExBWUVSDQorIDAwMDE6MjhEOSAgICAgICBIWVBFUk9JREFCT1VURExHDQorIDAwMDE6MjhBQSAgICAgICBIWVBFUk9JREhFTFANCisgMDAwMToxRUNBICAgICAgIEhZUEVST0lEV05EUFJPQw0KKyAwMDAxOjIxNEMgICAgICAgSU5JVEhZUEVST0lEDQorIDAwMDE6MDE5NSAgICAgICBJTklUT0JKRUNUUw0KKyAwMDAxOjFERjIgICAgICAgUEFJTlRIWVBFUk9JRA0KKyAwMDAxOjFENTEgICAgICAgUEFOSUMNCisgMDAwMzowQ0U0ICAgICAgIFBMT0NBTEhFQVANCisgMDAwMToyMkQ4ICAgICAgIFBSSU5UTEVUVEVSUw0KKyAwMDAxOjAwRDAgICAgICAgUkVNSEVBRA0KKyAwMDAxOjAxMzYgICAgICAgUkVNT1ZFDQorIDAwMDE6MUMxMyAgICAgICBSRVNUQVJUSFlQRVJPSUQNCisgMDAwMToyNzkwICAgICAgIFNBVkVIWVBFUk9JRFdJTkRPV1BPUw0KKyAwMDAxOjI2MTYgICAgICAgU0VUSFlQRVJPSURNRU5VDQorIDAwMDE6MDUxMyAgICAgICBTRVRSRVNUQVJUDQorIDAwMDE6MjIyMiAgICAgICBXSU5NQUlODQorIDAwMDE6MzE3QyAgICAgICBfYXRvZg0KKyAwMDAxOjMxNzggICAgICAgX2F0b2kNCisgMDAwMzozMkM2ICAgICAgIF9iUGF1c2VkDQorIDAwMDM6MzJCRSAgICAgICBfYlJlc3RhcnQNCisgMDAwMTo0QUU0ICAgICAgIF9jb3MNCisgMDAwMzowQzZDICAgICAgIF9lZGF0YQ0KKyAwMDAzOjMzMDAgICAgICAgX2VuZA0KKyAwMDAzOjA2QUYgICAgICAgX2Vudmlyb24NCisgMDAwMzowNjg4ICAgICAgIF9lcnJubw0KKyAwMDAxOjJCOEQgICAgICAgX2V4aXQNCisgMDAwMzozMDg2ICAgICAgIF9GbGFtZUxpc3QNCisgMDAwMzozMkMyICAgICAgIF9GcmVlTGlzdA0KKyAwMDAzOjMwQUUgICAgICAgX2hBcHBJbnN0DQorIDAwMDM6MzJEMiAgICAgICBfaEFwcFBhbGV0dGUNCisgMDAwMzozMkMwICAgICAgIF9oQXBwV25kDQorIDAwMDM6MzA4RSAgICAgICBfaFBlbg0KKyAwMDAzOjBBMzggICAgICAgX0hVR0UNCisgMDAwMzozMEIwICAgICAgIF9IdW50ZXJMaXN0DQorIDAwMDM6MENFOCAgICAgICBfSHVudGVyU2hvdExpc3QNCisgMDAwMzowQ0UwICAgICAgIF9MZXR0ZXJMaXN0DQorIDAwMDM6MDI1MCAgICAgICBfTGV0dGVyUGFydA0KKyAwMDAzOjMwQjggICAgICAgX2xTY29yZQ0KKyAwMDAxOjJGMzQgICAgICAgX21hbGxvYw0KKyAwMDAxOjRFMzAgICAgICAgX21hdGhlcnINCisgMDAwMTozMkY0ICAgICAgIF9tZW1tb3ZlDQorIDAwMDE6MzMzQyAgICAgICBfbWVtc2V0DQorIDAwMDM6MzJCQyAgICAgICBfbkJhZEd1eXMNCisgMDAwMzowQ0VFICAgICAgIF9uQ29zDQorIDAwMDM6MzJDOCAgICAgICBfbkdyYXZpdHkNCisgMDAwMzozMDhDICAgICAgIF9uTGV2ZWwNCisgMDAwMzowQ0VDICAgICAgIF9ucFBsYXllcg0KKyAwMDAzOjBDRTYgICAgICAgX25TYWZlDQorIDAwMDM6MzJGNCAgICAgICBfblNoaWVsZA0KKyAwMDAzOjMwQkMgICAgICAgX25TaW4NCisgMDAwMzowRUVFICAgICAgIF9PYmoNCisgMDAwMzozMkNFICAgICAgIF9Sb2lkTGlzdA0KKyAwMDAzOjMyQ0EgICAgICAgX1Nob3RMaXN0DQorIDAwMDE6NEFERSAgICAgICBfc2luDQorIDAwMDM6MzBCNCAgICAgICBfU3Bpbm5lckxpc3QNCisgMDAwMTozMTMwICAgICAgIF9zdHJjbXANCisgMDAwMTozMEZFICAgICAgIF9zdHJjcHkNCisgMDAwMTozMTVDICAgICAgIF9zdHJsZW4NCisgMDAwMzozMkQ0ICAgICAgIF9zekFwcE5hbWUNCisgMDAwMzowMjk4ICAgICAgIF9zekxldHRlckRlc2MNCisgMDAwMzowMjg0ICAgICAgIF9zek51bWJlckRlc2MNCisgMDAwMTo0QUU5ICAgICAgIF90YW4NCisgMDAwMzozMDhBICAgICAgIF93VGljaw0KKyAwMDAzOjA5QTQgICAgICAgX184MHg4Nw0KKyAwMDAzOjA2NkMgICAgICAgX19hY2ZpbmZvDQorIDAwMDA6OTg3NiAgQWJzICBfX2FjcnRtc2cNCisgMDAwMDo5ODc2ICBBYnMgIF9fYWNydHVzZWQNCisgMDAwMDpENkQ2ICBBYnMgIF9fYURCZG9zd3ANCisgMDAwMzowNkJFICAgICAgIF9fYWRiZ21zZw0KKyAwMDAzOjA2NTAgICAgICAgX19hZXhpdF9ydG4NCisgMDAwMTo0QUY0ICAgICAgIF9fYUZDSWNvcw0KKyAwMDAxOjRBRUUgICAgICAgX19hRkNJc2luDQorIDAwMDE6NEFGOSAgICAgICBfX2FGQ0l0YW4NCisgMDAwMTo0RDA4ICAgICAgIF9fYUZmdG9sDQorIDAwMDE6MzM4NiAgICAgICBfX2FGbGRpdg0KKyAwMDAxOjM0MjAgICAgICAgX19hRmxtdWwNCisgMDAwMTozNDIwICAgICAgIF9fYUZ1bG11bA0KKyAwMDAzOjA2N0EgICAgICAgX19haW50ZGl2DQorIDAwMDM6MDZDNiAgICAgICBfX2FtYmxrc2l6DQorIDAwMDE6MkFBMyAgICAgICBfX2Ftc2dfZXhpdA0KKyAwMDAzOjAwNDIgICAgICAgX19hbnVsbHNpemUNCisgMDAwMzowNjY4ICAgICAgIF9fYXNlZ2hpDQorIDAwMDM6MDY2QSAgICAgICBfX2FzZWdsbw0KKyAwMDAzOjA2NTIgICAgICAgX19hc2l6ZHMNCisgMDAwMzowNkU0ICAgICAgIF9fYXNpemVDDQorIDAwMDM6MDZFNSAgICAgICBfX2FzaXplRA0KKyAwMDAxOjI5RDAgICAgICAgX19hc3RhcnQNCisgMDAwMTo1MUQwICAgICAgIF9fYXRvbGQNCisgMDAwMzowNjRFICAgICAgIF9fYXRvcHNwDQorIDAwMDE6MzFDMiAgICAgICBfX2NhdG94DQorIDAwMDE6MkI5QyAgICAgICBfX2NleGl0DQorIDAwMDE6NEE2NCAgICAgICBfX2NmbHRjdnQNCisgMDAwMzowNkM4ICAgICAgIF9fY2ZsdGN2dF90YWINCisgMDAwMTo0NzRFICAgICAgIF9fY2Z0b2UNCisgMDAwMTo0ODlDICAgICAgIF9fY2Z0b2YNCisgMDAwMTo0OUIyICAgICAgIF9fY2Z0b2cNCisgMDAwMzowNkI2ICAgICAgIF9fY2hpbGQNCisgMDAwMToyQUM4ICAgICAgIF9fY2luaXQNCisgMDAwMToyQTkzICAgICAgIF9fY2ludERJVg0KKyAwMDAxOjRCQTIgICAgICAgX19jaW50cmluZGlzcDENCisgMDAwMTo0Qjc5ICAgICAgIF9fY2ludHJpbmRpc3AyDQorIDAwMDE6NTE3QSAgICAgICBfX2NsZGN2dA0KKyAwMDAxOjRFNDAgICAgICAgX19jbGR0b2UNCisgMDAwMTo0RkNFICAgICAgIF9fY2xkdG9mDQorIDAwMDE6NTEwQyAgICAgICBfX2NsZHRvZw0KKyAwMDAzOjA4RTIgICAgICAgX19jb3NqbXB0YWINCisgMDAwMzowOTEyICAgICAgIF9fY290YW5qbXB0YWINCisgMDAwMzowN0ZDICAgICAgIF9fY3Bvd2VyDQorIDAwMDE6NDY1NiAgICAgICBfX2Nyb3B6ZXJvcw0KKyAwMDAxOjJDMTAgICAgICAgX19jdGVybXN1Yg0KKyAwMDAxOjRCRDcgICAgICAgX19jdHJhbmRpc3AxDQorIDAwMDE6NEJDNCAgICAgICBfX2N0cmFuZGlzcDINCisgMDAwMzowNkU2ICAgICAgIF9fY3R5cGUNCisgMDAwMzowNkU2ICAgICAgIF9fY3R5cGVfDQorIDAwMDE6MkJBNiAgICAgICBfX2NfZXhpdA0KKyAwMDAxOjJBQzUgICAgICAgX19kYXRhc2VnDQorIDAwMDE6MzJCQiAgICAgICBfX0RPU0NSRUFURUNTQUxJQVMNCisgMDAwMTozMjg2ICAgICAgIF9fRE9TREVWQ09ORklHDQorIDAwMDM6MDY5MyAgICAgICBfX2Rvc2Vycm5vDQorIDAwMDE6MzJEMSAgICAgICBfX0RPU0ZSRUVTRUcNCisgMDAwMTozMjlEICAgICAgIF9fRE9TR0VUTUFDSElORU1PREUNCisgMDAwMTozMkIyICAgICAgIF9fRE9TU0VUVkVDDQorIDAwMDM6MDY5MCAgICAgICBfX2Rvc3Zlcm1ham9yDQorIDAwMDM6MDY5MSAgICAgICBfX2Rvc3Zlcm1pbm9yDQorIDAwMDE6MzJEQSAgICAgICBfX0RPU1dSSVRFDQorIDAwMDE6NTIwMCAgICAgICBfX0VtRGF0YVNlZw0KKyAwMDAxOjJCOTQgICAgICAgX19leGl0DQorIDAwMDM6MDhBMCAgICAgICBfX2V4cGptcHRhYg0KKyAwMDAzOjA2N0UgICAgICAgX19mYWMNCisgMDAwMTo0NkYyICAgICAgIF9fZmFzc2lnbg0KKyAwMDAxOjM2RDcgICAgICAgX19mRkNPUw0KKyAwMDAxOjM1NUUgICAgICAgX19mRkVYUA0KKyAwMDAxOjM2ODYgICAgICAgX19mZmV4cG0xDQorIDAwMDE6MzYwQiAgICAgICBfX2ZGTE4NCisgMDAwMTozNkYwICAgICAgIF9fZkZTSU4NCisgMDAwMToyQzUwICAgICAgIF9fRkZfTVNHQkFOTkVSDQorIDAwMDE6MzBERCAgICAgICBfX2ZpbmRsYXN0DQorIDAwMDE6NEQzQyAgICAgICBfX2ZsdGluDQorIDAwMDE6NEQ5MiAgICAgICBfX2ZsdG91dA0KKyAwMDAwOjk4NzYgIEFicyAgX19mbHR1c2VkDQorIDAwMDE6NDVFRSAgICAgICBfX2ZvcmNkZWNwdA0KKyAwMDAxOjVBN0YgICAgICAgX19mcGVtdWxhdG9yDQorIDAwMDE6NTIxMCAgICAgICBfX2ZwZW11bGF0b3JiZWdpbg0KKyAwMDAxOjc4NkYgICAgICAgX19mcGVtdWxhdG9yZW5kDQorIDAwMDE6NTRERSAgICAgICBfX0ZQRVhDRVBUSU9OODcNCisgMDAwMzowQTU0ICAgICAgIF9fZnBpbml0DQorIDAwMDE6Nzg3QSAgICAgICBfX0ZQSU5TVEFMTDg3DQorIDAwMDE6NTIzQSAgICAgICBfX2ZwbWF0aA0KKyAwMDAxOjRERDggICAgICAgX19mcHNpZ25hbA0KKyAwMDAyOjAxNjkgICAgICAgX19mcHRhc2tkYXRhDQorIDAwMDE6NzhBOSAgICAgICBfX0ZQVEVSTUlOQVRFODcNCisgMDAwMTozMjE2ICAgICAgIF9fZnB0b3N0cg0KKyAwMDAxOjJDNzIgICAgICAgX19mcHRyYXANCisgMDAwMTo0RDA4ICAgICAgIF9fZnRvbA0KKyAwMDAxOjMwMDAgICAgICAgX19ncm93c2VnDQorIDAwMDE6MzA4QyAgICAgICBfX2luY3NlZw0KKyAwMDAzOjA3RTggICAgICAgX19pbmRlZmluaXRlDQorIDAwMDM6MDgwRSAgICAgICBfX2luZmluaXR5DQorIDAwMDE6NEFGRSAgICAgICBfX0luaXQ4MHg4Nw0KKyAwMDAzOjA2QjkgICAgICAgX19pbnRubw0KKyAwMDAxOjQwREYgICAgICAgX19MRDEyTVVMVA0KKyAwMDAxOjQwMEEgICAgICAgX19MRDEyTVVMVFRFTlBPV0VSDQorIDAwMDM6MDg4OCAgICAgICBfX2xuam1wdGFiDQorIDAwMDM6MDgxOCAgICAgICBfX2xvZ2VtYXgNCisgMDAwMzowODcwICAgICAgIF9fbG9nam1wdGFiDQorIDAwMDE6NDI2NCAgICAgICBfX01BTlRPTEQxMg0KKyAwMDAzOjBBNDAgICAgICAgX19tYXRoZXJyX2ZsYWcNCisgMDAwMToyRjBFICAgICAgIF9fbXlhbGxvYw0KKyAwMDAzOjA2OTUgICAgICAgX19uZmlsZQ0KKyAwMDAxOjJGM0EgICAgICAgX19uZnJlZQ0KKyAwMDAzOjA2NTQgICAgICAgX19uaGVhcF9kZXNjDQorIDAwMDE6MkY1QiAgICAgICBfX25tYWxsb2MNCisgMDAwMToyRUFDICAgICAgIF9fTk1TR19URVhUDQorIDAwMDE6MkVENyAgICAgICBfX05NU0dfV1JJVEUNCisgMDAwMToyQzc4ICAgICAgIF9fbnVsbGNoZWNrDQorIDAwMDM6MDY5MyAgICAgICBfX29zZXJyDQorIDAwMDM6MDY5NyAgICAgICBfX29zZmlsZQ0KKyAwMDAzOjA2OTAgICAgICAgX19vc21ham9yDQorIDAwMDM6MDY5MSAgICAgICBfX29zbWlub3INCisgMDAwMzowNjkyICAgICAgIF9fb3Ntb2RlDQorIDAwMDM6MDY5MCAgICAgICBfX29zdmVyc2lvbg0KKyAwMDAzOjA2QjggICAgICAgX19vdmxmbGFnDQorIDAwMDM6MDZCQSAgICAgICBfX292bHZlYw0KKyAwMDAzOjA2QjEgICAgICAgX19wZ21wdHINCisgMDAwMzowN0YyICAgICAgIF9fcGlieTINCisgMDAwMTo0NkM0ICAgICAgIF9fcG9zaXRpdmUNCisgMDAwMzowNjhFICAgICAgIF9fcHNwDQorIDAwMDM6MDY4QyAgICAgICBfX3BzcGFkcg0KKyAwMDAxOjM1MUEgICAgICAgX19ydGJpZ25hbg0KKyAwMDAxOjM1NDkgICAgICAgX19ydGNoc2lmbmVnDQorIDAwMDE6MzU0MCAgICAgICBfX3J0aWZwcm9qbnBvcA0KKyAwMDAxOjM1MjEgICAgICAgX19ydGlmcHJvanBvcA0KKyAwMDAxOjM1MkIgICAgICAgX19ydGluZGZucG9wDQorIDAwMDE6MzUyOCAgICAgICBfX3J0aW5kZnBvcA0KKyAwMDAxOjM2NkIgICAgICAgX19ydGluZm5wb3ANCisgMDAwMTozNUZFICAgICAgIF9fcnRpbmZucG9wc2UNCisgMDAwMTozNjY4ICAgICAgIF9fcnRpbmZwb3ANCisgMDAwMTozNUZCICAgICAgIF9fcnRpbmZwb3BzZQ0KKyAwMDAxOjM0RkQgICAgICAgX19ydG5vc3BvcA0KKyAwMDAxOjM1MDEgICAgICAgX19ydG5vc3BvcGRlDQorIDAwMDE6MzUxMyAgICAgICBfX3J0b25lbnBvcA0KKyAwMDAxOjM1MTAgICAgICAgX19ydG9uZXBvcA0KKyAwMDAxOjM1MDAgICAgICAgX19ydHRvc25wb3ANCisgMDAwMTozNTM5ICAgICAgIF9fcnR0b3NucG9wZGUNCisgMDAwMTozNEZBICAgICAgIF9fcnR0b3Nwb3ANCisgMDAwMTozNEY3ICAgICAgIF9fcnR0b3Nwb3BkZQ0KKyAwMDAxOjM1MDkgICAgICAgX19ydHplcm9ucG9wDQorIDAwMDE6MzUwNiAgICAgICBfX3J0emVyb3BvcA0KKyAwMDAxOjJGODQgICAgICAgX19zZWFyY2hzZWcNCisgMDAwMToyQzlDICAgICAgIF9fc2V0YXJndg0KKyAwMDAxOjJFMkUgICAgICAgX19zZXRlbnZwDQorIDAwMDM6MDZFMiAgICAgICBfX3NpZ2ludG9mZg0KKyAwMDAzOjA2RTAgICAgICAgX19zaWdpbnRzZWcNCisgMDAwMzowOENBICAgICAgIF9fc2luam1wdGFiDQorIDAwMDE6NDMxRSAgICAgICBfX1NUUklOR1RPRA0KKyAwMDAxOjQzODYgICAgICAgX19TVFJJTkdUT0xEDQorIDAwMDM6MDhGQSAgICAgICBfX3RhbmptcHRhYg0KKyAwMDAxOjM0NTIgICAgICAgX190cmFuZGlzcDENCisgMDAwMTozNDk0ICAgICAgIF9fdHJhbmRpc3AyDQorIDAwMDM6MDY4QSAgICAgICBfX3VtYXNrdmFsDQorIDAwMDE6MzM2QSAgICAgICBfX3dydDJlcnINCisgMDAwMzowODQwICAgICAgIF9feXRveGptcHRhYg0KKyAwMDAzOjBBNEEgICAgICAgX19fYURCZXhpdA0KKyAwMDAzOjBBNTAgICAgICAgX19fYURCcHRyY2hrDQorIDAwMDM6MEE0OCAgICAgICBfX19hREJydGVycg0KKyAwMDAzOjBBNDYgICAgICAgX19fYURCc3dwY2hrDQorIDAwMDM6MEE0NCAgICAgICBfX19hREJzd3BmbGcNCisgMDAwMzowNkFCICAgICAgIF9fX2FyZ2MNCisgMDAwMzowNkFEICAgICAgIF9fX2FyZ3YNCisgMDAwMzowQTQyICAgICAgIF9fX3FjenJpbml0DQorDQorICBBZGRyZXNzICAgICAgICAgUHVibGljcyBieSBWYWx1ZQ0KKw0KKyAwMDAwOjA2MzIgIEFicyAgRklTUlFRDQorIDAwMDA6MEUzMiAgQWJzICBGSUNSUVENCisgMDAwMDoxNjMyICBBYnMgIEZJRVJRUQ0KKyAwMDAwOjQwMDAgIEFicyAgRkpBUlFRDQorIDAwMDA6NUMzMiAgQWJzICBGSURSUVENCisgMDAwMDo4MDAwICBBYnMgIEZKU1JRUQ0KKyAwMDAwOjk4NzYgIEFicyAgX19hY3J0bXNnDQorIDAwMDA6OTg3NiAgQWJzICBfX2FjcnR1c2VkDQorIDAwMDA6OTg3NiAgQWJzICBfX2ZsdHVzZWQNCisgMDAwMDpBMjNEICBBYnMgIEZJV1JRUQ0KKyAwMDAwOkMwMDAgIEFicyAgRkpDUlFRDQorIDAwMDA6RDZENiAgQWJzICBfX2FEQmRvc3dwDQorIDAwMDA6RkUzMiAgQWJzICBGSUFSUVENCisgMDAwMTowMDAwICAgICAgIEFSQU5EDQorIDAwMDE6MDA2QiAgICAgICBBRERIRUFEDQorIDAwMDE6MDBEMCAgICAgICBSRU1IRUFEDQorIDAwMDE6MDEzNiAgICAgICBSRU1PVkUNCisgMDAwMTowMTk1ICAgICAgIElOSVRPQkpFQ1RTDQorIDAwMDE6MDI5RCAgICAgICBBQ0NFTEVSQVRFDQorIDAwMDE6MDJGMiAgICAgICBEUkFXT0JKRUNUDQorIDAwMDE6MDUxMyAgICAgICBTRVRSRVNUQVJUDQorIDAwMDE6MDU0NyAgICAgICBISVQNCisgMDAwMTowNjMwICAgICAgIEVYUExPREUNCisgMDAwMTowNzg3ICAgICAgIEhJVFBMQVlFUg0KKyAwMDAxOjA4RTggICAgICAgQ1JFQVRFTEVUVEVSDQorIDAwMDE6MEE0NCAgICAgICBEUkFXTEVUVEVSUw0KKyAwMDAxOjBBRDIgICAgICAgRFJBV0hVTlRFUlNIT1RTDQorIDAwMDE6MEJBQyAgICAgICBGSVJFSFVOVEVSU0hPVA0KKyAwMDAxOjBDOEEgICAgICAgQ1JFQVRFSFVOVEVSDQorIDAwMDE6MEQ1RSAgICAgICBEUkFXSFVOVEVSUw0KKyAwMDAxOjBGOTggICAgICAgQ1JFQVRFU1BJTk5FUg0KKyAwMDAxOjEwN0QgICAgICAgRFJBV1NQSU5ORVJTDQorIDAwMDE6MTJEMyAgICAgICBDUkVBVEVST0lEDQorIDAwMDE6MTNEOSAgICAgICBCUkVBS1JPSUQNCisgMDAwMToxNUFDICAgICAgIERSQVdST0lEUw0KKyAwMDAxOjE2QzUgICAgICAgRFJBV1NIT1RTDQorIDAwMDE6MTc1NCAgICAgICBEUkFXRkxBTUVTDQorIDAwMDE6MTdFMyAgICAgICBGSVJFU0hPVA0KKyAwMDAxOjE4QjYgICAgICAgQUNDRUxQTEFZRVINCisgMDAwMToxOThFICAgICAgIERSQVdQTEFZRVINCisgMDAwMToxQUI2ICAgICAgIERSQVdPQkpFQ1RTDQorIDAwMDE6MUI5NCAgICAgICBDSEVDS1NDT1JFDQorIDAwMDE6MUMxMyAgICAgICBSRVNUQVJUSFlQRVJPSUQNCisgMDAwMToxRDUxICAgICAgIFBBTklDDQorIDAwMDE6MURGMiAgICAgICBQQUlOVEhZUEVST0lEDQorIDAwMDE6MUU0MSAgICAgICBFUkFTRUhZUEVST0lEQktHTkQNCisgMDAwMToxRUNBICAgICAgIEhZUEVST0lEV05EUFJPQw0KKyAwMDAxOjIxNEMgICAgICAgSU5JVEhZUEVST0lEDQorIDAwMDE6MjFDQyAgICAgICBFWElUSFlQRVJPSUQNCisgMDAwMToyMjIyICAgICAgIFdJTk1BSU4NCisgMDAwMToyMkQ4ICAgICAgIFBSSU5UTEVUVEVSUw0KKyAwMDAxOjIzQUMgICAgICAgQ1JFQVRFSFlQRVJPSURQQUxFVFRFDQorIDAwMDE6MjU5NSAgICAgICBDUkVBVEVIWVBFUk9JRENMQVNTDQorIDAwMDE6MjYxNiAgICAgICBTRVRIWVBFUk9JRE1FTlUNCisgMDAwMToyNjhGICAgICAgIENSRUFURUhZUEVST0lEV0lORE9XDQorIDAwMDE6Mjc5MCAgICAgICBTQVZFSFlQRVJPSURXSU5ET1dQT1MNCisgMDAwMToyOEFBICAgICAgIEhZUEVST0lESEVMUA0KKyAwMDAxOjI4RDkgICAgICAgSFlQRVJPSURBQk9VVERMRw0KKyAwMDAxOjI5NkMgICAgICAgQUJPVVRIWVBFUk9JRA0KKyAwMDAxOjI5RDAgICAgICAgX19hc3RhcnQNCisgMDAwMToyQTkzICAgICAgIF9fY2ludERJVg0KKyAwMDAxOjJBQTMgICAgICAgX19hbXNnX2V4aXQNCisgMDAwMToyQUM1ICAgICAgIF9fZGF0YXNlZw0KKyAwMDAxOjJBQzggICAgICAgX19jaW5pdA0KKyAwMDAxOjJCOEQgICAgICAgX2V4aXQNCisgMDAwMToyQjk0ICAgICAgIF9fZXhpdA0KKyAwMDAxOjJCOUMgICAgICAgX19jZXhpdA0KKyAwMDAxOjJCQTYgICAgICAgX19jX2V4aXQNCisgMDAwMToyQzEwICAgICAgIF9fY3Rlcm1zdWINCisgMDAwMToyQzUwICAgICAgIF9fRkZfTVNHQkFOTkVSDQorIDAwMDE6MkM3MiAgICAgICBfX2ZwdHJhcA0KKyAwMDAxOjJDNzggICAgICAgX19udWxsY2hlY2sNCisgMDAwMToyQzlDICAgICAgIF9fc2V0YXJndg0KKyAwMDAxOjJFMkUgICAgICAgX19zZXRlbnZwDQorIDAwMDE6MkVBQyAgICAgICBfX05NU0dfVEVYVA0KKyAwMDAxOjJFRDcgICAgICAgX19OTVNHX1dSSVRFDQorIDAwMDE6MkYwRSAgICAgICBfX215YWxsb2MNCisgMDAwMToyRjM0ICAgICAgIF9tYWxsb2MNCisgMDAwMToyRjNBICAgICAgIF9fbmZyZWUNCisgMDAwMToyRjVCICAgICAgIF9fbm1hbGxvYw0KKyAwMDAxOjJGODQgICAgICAgX19zZWFyY2hzZWcNCisgMDAwMTozMDAwICAgICAgIF9fZ3Jvd3NlZw0KKyAwMDAxOjMwOEMgICAgICAgX19pbmNzZWcNCisgMDAwMTozMEREICAgICAgIF9fZmluZGxhc3QNCisgMDAwMTozMEZFICAgICAgIF9zdHJjcHkNCisgMDAwMTozMTMwICAgICAgIF9zdHJjbXANCisgMDAwMTozMTVDICAgICAgIF9zdHJsZW4NCisgMDAwMTozMTc4ICAgICAgIF9hdG9pDQorIDAwMDE6MzE3QyAgICAgICBfYXRvZg0KKyAwMDAxOjMxQzIgICAgICAgX19jYXRveA0KKyAwMDAxOjMyMTYgICAgICAgX19mcHRvc3RyDQorIDAwMDE6MzI4NiAgICAgICBfX0RPU0RFVkNPTkZJRw0KKyAwMDAxOjMyOUQgICAgICAgX19ET1NHRVRNQUNISU5FTU9ERQ0KKyAwMDAxOjMyQjIgICAgICAgX19ET1NTRVRWRUMNCisgMDAwMTozMkJCICAgICAgIF9fRE9TQ1JFQVRFQ1NBTElBUw0KKyAwMDAxOjMyRDEgICAgICAgX19ET1NGUkVFU0VHDQorIDAwMDE6MzJEQSAgICAgICBfX0RPU1dSSVRFDQorIDAwMDE6MzJGNCAgICAgICBfbWVtbW92ZQ0KKyAwMDAxOjMzM0MgICAgICAgX21lbXNldA0KKyAwMDAxOjMzNkEgICAgICAgX193cnQyZXJyDQorIDAwMDE6MzM4NiAgICAgICBfX2FGbGRpdg0KKyAwMDAxOjM0MjAgICAgICAgX19hRnVsbXVsDQorIDAwMDE6MzQyMCAgICAgICBfX2FGbG11bA0KKyAwMDAxOjM0NTIgICAgICAgX190cmFuZGlzcDENCisgMDAwMTozNDk0ICAgICAgIF9fdHJhbmRpc3AyDQorIDAwMDE6MzRGNyAgICAgICBfX3J0dG9zcG9wZGUNCisgMDAwMTozNEZBICAgICAgIF9fcnR0b3Nwb3ANCisgMDAwMTozNEZEICAgICAgIF9fcnRub3Nwb3ANCisgMDAwMTozNTAwICAgICAgIF9fcnR0b3NucG9wDQorIDAwMDE6MzUwMSAgICAgICBfX3J0bm9zcG9wZGUNCisgMDAwMTozNTA2ICAgICAgIF9fcnR6ZXJvcG9wDQorIDAwMDE6MzUwOSAgICAgICBfX3J0emVyb25wb3ANCisgMDAwMTozNTEwICAgICAgIF9fcnRvbmVwb3ANCisgMDAwMTozNTEzICAgICAgIF9fcnRvbmVucG9wDQorIDAwMDE6MzUxQSAgICAgICBfX3J0YmlnbmFuDQorIDAwMDE6MzUyMSAgICAgICBfX3J0aWZwcm9qcG9wDQorIDAwMDE6MzUyOCAgICAgICBfX3J0aW5kZnBvcA0KKyAwMDAxOjM1MkIgICAgICAgX19ydGluZGZucG9wDQorIDAwMDE6MzUzOSAgICAgICBfX3J0dG9zbnBvcGRlDQorIDAwMDE6MzU0MCAgICAgICBfX3J0aWZwcm9qbnBvcA0KKyAwMDAxOjM1NDkgICAgICAgX19ydGNoc2lmbmVnDQorIDAwMDE6MzU1MiAgICAgICBmRllUT1gNCisgMDAwMTozNTVFICAgICAgIF9fZkZFWFANCisgMDAwMTozNUZCICAgICAgIF9fcnRpbmZwb3BzZQ0KKyAwMDAxOjM1RkUgICAgICAgX19ydGluZm5wb3BzZQ0KKyAwMDAxOjM2MEIgICAgICAgX19mRkxODQorIDAwMDE6MzY2OCAgICAgICBfX3J0aW5mcG9wDQorIDAwMDE6MzY2QiAgICAgICBfX3J0aW5mbnBvcA0KKyAwMDAxOjM2ODYgICAgICAgX19mZmV4cG0xDQorIDAwMDE6MzZENyAgICAgICBfX2ZGQ09TDQorIDAwMDE6MzZGMCAgICAgICBfX2ZGU0lODQorIDAwMDE6MzgyRSAgICAgICAkaThfb3V0cHV0DQorIDAwMDE6M0FFRiAgICAgICAkaThfdHB3cjEwDQorIDAwMDE6M0I0NCAgICAgICAkSTEwX09VVFBVVA0KKyAwMDAxOjQwMEEgICAgICAgX19MRDEyTVVMVFRFTlBPV0VSDQorIDAwMDE6NDBERiAgICAgICBfX0xEMTJNVUxUDQorIDAwMDE6NDI2NCAgICAgICBfX01BTlRPTEQxMg0KKyAwMDAxOjQzMUUgICAgICAgX19TVFJJTkdUT0QNCisgMDAwMTo0Mzg2ICAgICAgIF9fU1RSSU5HVE9MRA0KKyAwMDAxOjQ1RUUgICAgICAgX19mb3JjZGVjcHQNCisgMDAwMTo0NjU2ICAgICAgIF9fY3JvcHplcm9zDQorIDAwMDE6NDZDNCAgICAgICBfX3Bvc2l0aXZlDQorIDAwMDE6NDZGMiAgICAgICBfX2Zhc3NpZ24NCisgMDAwMTo0NzRFICAgICAgIF9fY2Z0b2UNCisgMDAwMTo0ODlDICAgICAgIF9fY2Z0b2YNCisgMDAwMTo0OUIyICAgICAgIF9fY2Z0b2cNCisgMDAwMTo0QTY0ICAgICAgIF9fY2ZsdGN2dA0KKyAwMDAxOjRBREUgICAgICAgX3Npbg0KKyAwMDAxOjRBRTQgICAgICAgX2Nvcw0KKyAwMDAxOjRBRTkgICAgICAgX3Rhbg0KKyAwMDAxOjRBRUUgICAgICAgX19hRkNJc2luDQorIDAwMDE6NEFGNCAgICAgICBfX2FGQ0ljb3MNCisgMDAwMTo0QUY5ICAgICAgIF9fYUZDSXRhbg0KKyAwMDAxOjRBRkUgICAgICAgX19Jbml0ODB4ODcNCisgMDAwMTo0Qjc5ICAgICAgIF9fY2ludHJpbmRpc3AyDQorIDAwMDE6NEJBMiAgICAgICBfX2NpbnRyaW5kaXNwMQ0KKyAwMDAxOjRCQzQgICAgICAgX19jdHJhbmRpc3AyDQorIDAwMDE6NEJENyAgICAgICBfX2N0cmFuZGlzcDENCisgMDAwMTo0RDA4ICAgICAgIF9fYUZmdG9sDQorIDAwMDE6NEQwOCAgICAgICBfX2Z0b2wNCisgMDAwMTo0RDNDICAgICAgIF9fZmx0aW4NCisgMDAwMTo0RDkyICAgICAgIF9fZmx0b3V0DQorIDAwMDE6NEREOCAgICAgICBfX2Zwc2lnbmFsDQorIDAwMDE6NEUzMCAgICAgICBfbWF0aGVycg0KKyAwMDAxOjRFNDAgICAgICAgX19jbGR0b2UNCisgMDAwMTo0RkNFICAgICAgIF9fY2xkdG9mDQorIDAwMDE6NTEwQyAgICAgICBfX2NsZHRvZw0KKyAwMDAxOjUxN0EgICAgICAgX19jbGRjdnQNCisgMDAwMTo1MUQwICAgICAgIF9fYXRvbGQNCisgMDAwMTo1MjAwICAgICAgIF9fRW1EYXRhU2VnDQorIDAwMDE6NTIxMCAgICAgICBfX2ZwZW11bGF0b3JiZWdpbg0KKyAwMDAxOjUyM0EgICAgICAgX19mcG1hdGgNCisgMDAwMTo1NERFICAgICAgIF9fRlBFWENFUFRJT044Nw0KKyAwMDAxOjVBN0YgICAgICAgX19mcGVtdWxhdG9yDQorIDAwMDE6Nzg2RiAgICAgICBfX2ZwZW11bGF0b3JlbmQNCisgMDAwMTo3ODdBICAgICAgIF9fRlBJTlNUQUxMODcNCisgMDAwMTo3OEE5ICAgICAgIF9fRlBURVJNSU5BVEU4Nw0KKyAwMDAyOjAxNjkgICAgICAgX19mcHRhc2tkYXRhDQorIDAwMDM6MDA0MiAgICAgICBfX2FudWxsc2l6ZQ0KKyAwMDAzOjAyNTAgICAgICAgX0xldHRlclBhcnQNCisgMDAwMzowMjg0ICAgICAgIF9zek51bWJlckRlc2MNCisgMDAwMzowMjk4ICAgICAgIF9zekxldHRlckRlc2MNCisgMDAwMzowNjRFICAgICAgIF9fYXRvcHNwDQorIDAwMDM6MDY1MCAgICAgICBfX2FleGl0X3J0bg0KKyAwMDAzOjA2NTIgICAgICAgX19hc2l6ZHMNCisgMDAwMzowNjU0ICAgICAgIF9fbmhlYXBfZGVzYw0KKyAwMDAzOjA2NjggICAgICAgX19hc2VnaGkNCisgMDAwMzowNjZBICAgICAgIF9fYXNlZ2xvDQorIDAwMDM6MDY2QyAgICAgICBfX2FjZmluZm8NCisgMDAwMzowNjdBICAgICAgIF9fYWludGRpdg0KKyAwMDAzOjA2N0UgICAgICAgX19mYWMNCisgMDAwMzowNjg4ICAgICAgIF9lcnJubw0KKyAwMDAzOjA2OEEgICAgICAgX191bWFza3ZhbA0KKyAwMDAzOjA2OEMgICAgICAgX19wc3BhZHINCisgMDAwMzowNjhFICAgICAgIF9fcHNwDQorIDAwMDM6MDY5MCAgICAgICBfX29zdmVyc2lvbg0KKyAwMDAzOjA2OTAgICAgICAgX19kb3N2ZXJtYWpvcg0KKyAwMDAzOjA2OTAgICAgICAgX19vc21ham9yDQorIDAwMDM6MDY5MSAgICAgICBfX29zbWlub3INCisgMDAwMzowNjkxICAgICAgIF9fZG9zdmVybWlub3INCisgMDAwMzowNjkyICAgICAgIF9fb3Ntb2RlDQorIDAwMDM6MDY5MyAgICAgICBfX29zZXJyDQorIDAwMDM6MDY5MyAgICAgICBfX2Rvc2Vycm5vDQorIDAwMDM6MDY5NSAgICAgICBfX25maWxlDQorIDAwMDM6MDY5NyAgICAgICBfX29zZmlsZQ0KKyAwMDAzOjA2QUIgICAgICAgX19fYXJnYw0KKyAwMDAzOjA2QUQgICAgICAgX19fYXJndg0KKyAwMDAzOjA2QUYgICAgICAgX2Vudmlyb24NCisgMDAwMzowNkIxICAgICAgIF9fcGdtcHRyDQorIDAwMDM6MDZCNiAgICAgICBfX2NoaWxkDQorIDAwMDM6MDZCOCAgICAgICBfX292bGZsYWcNCisgMDAwMzowNkI5ICAgICAgIF9faW50bm8NCisgMDAwMzowNkJBICAgICAgIF9fb3ZsdmVjDQorIDAwMDM6MDZCRSAgICAgICBfX2FkYmdtc2cNCisgMDAwMzowNkM2ICAgICAgIF9fYW1ibGtzaXoNCisgMDAwMzowNkM4ICAgICAgIF9fY2ZsdGN2dF90YWINCisgMDAwMzowNkUwICAgICAgIF9fc2lnaW50c2VnDQorIDAwMDM6MDZFMiAgICAgICBfX3NpZ2ludG9mZg0KKyAwMDAzOjA2RTQgICAgICAgX19hc2l6ZUMNCisgMDAwMzowNkU1ICAgICAgIF9fYXNpemVEDQorIDAwMDM6MDZFNiAgICAgICBfX2N0eXBlXw0KKyAwMDAzOjA2RTYgICAgICAgX19jdHlwZQ0KKyAwMDAzOjA3RTggICAgICAgX19pbmRlZmluaXRlDQorIDAwMDM6MDdGMiAgICAgICBfX3BpYnkyDQorIDAwMDM6MDdGQyAgICAgICBfX2Nwb3dlcg0KKyAwMDAzOjA4MEUgICAgICAgX19pbmZpbml0eQ0KKyAwMDAzOjA4MTggICAgICAgX19sb2dlbWF4DQorIDAwMDM6MDg0MCAgICAgICBfX3l0b3hqbXB0YWINCisgMDAwMzowODcwICAgICAgIF9fbG9nam1wdGFiDQorIDAwMDM6MDg4OCAgICAgICBfX2xuam1wdGFiDQorIDAwMDM6MDhBMCAgICAgICBfX2V4cGptcHRhYg0KKyAwMDAzOjA4Q0EgICAgICAgX19zaW5qbXB0YWINCisgMDAwMzowOEUyICAgICAgIF9fY29zam1wdGFiDQorIDAwMDM6MDhGQSAgICAgICBfX3RhbmptcHRhYg0KKyAwMDAzOjA5MTIgICAgICAgX19jb3RhbmptcHRhYg0KKyAwMDAzOjA5QTQgICAgICAgX184MHg4Nw0KKyAwMDAzOjBBMzggICAgICAgX0hVR0UNCisgMDAwMzowQTQwICAgICAgIF9fbWF0aGVycl9mbGFnDQorIDAwMDM6MEE0MiAgICAgICBfX19xY3pyaW5pdA0KKyAwMDAzOjBBNDQgICAgICAgX19fYURCc3dwZmxnDQorIDAwMDM6MEE0NiAgICAgICBfX19hREJzd3BjaGsNCisgMDAwMzowQTQ4ICAgICAgIF9fX2FEQnJ0ZXJyDQorIDAwMDM6MEE0QSAgICAgICBfX19hREJleGl0DQorIDAwMDM6MEE1MCAgICAgICBfX19hREJwdHJjaGsNCisgMDAwMzowQTU0ICAgICAgIF9fZnBpbml0DQorIDAwMDM6MEM2QyAgICAgICBfZWRhdGENCisgMDAwMzowQ0UwICAgICAgIF9MZXR0ZXJMaXN0DQorIDAwMDM6MENFNCAgICAgICBQTE9DQUxIRUFQDQorIDAwMDM6MENFNiAgICAgICBfblNhZmUNCisgMDAwMzowQ0U4ICAgICAgIF9IdW50ZXJTaG90TGlzdA0KKyAwMDAzOjBDRUMgICAgICAgX25wUGxheWVyDQorIDAwMDM6MENFRSAgICAgICBfbkNvcw0KKyAwMDAzOjBFRUUgICAgICAgX09iag0KKyAwMDAzOjMwODYgICAgICAgX0ZsYW1lTGlzdA0KKyAwMDAzOjMwOEEgICAgICAgX3dUaWNrDQorIDAwMDM6MzA4QyAgICAgICBfbkxldmVsDQorIDAwMDM6MzA4RSAgICAgICBfaFBlbg0KKyAwMDAzOjMwQUUgICAgICAgX2hBcHBJbnN0DQorIDAwMDM6MzBCMCAgICAgICBfSHVudGVyTGlzdA0KKyAwMDAzOjMwQjQgICAgICAgX1NwaW5uZXJMaXN0DQorIDAwMDM6MzBCOCAgICAgICBfbFNjb3JlDQorIDAwMDM6MzBCQyAgICAgICBfblNpbg0KKyAwMDAzOjMyQkMgICAgICAgX25CYWRHdXlzDQorIDAwMDM6MzJCRSAgICAgICBfYlJlc3RhcnQNCisgMDAwMzozMkMwICAgICAgIF9oQXBwV25kDQorIDAwMDM6MzJDMiAgICAgICBfRnJlZUxpc3QNCisgMDAwMzozMkM2ICAgICAgIF9iUGF1c2VkDQorIDAwMDM6MzJDOCAgICAgICBfbkdyYXZpdHkNCisgMDAwMzozMkNBICAgICAgIF9TaG90TGlzdA0KKyAwMDAzOjMyQ0UgICAgICAgX1JvaWRMaXN0DQorIDAwMDM6MzJEMiAgICAgICBfaEFwcFBhbGV0dGUNCisgMDAwMzozMkQ0ICAgICAgIF9zekFwcE5hbWUNCisgMDAwMzozMkY0ICAgICAgIF9uU2hpZWxkDQorIDAwMDM6MzMwMCAgICAgICBfZW5kDQorDQorUHJvZ3JhbSBlbnRyeSBwb2ludCBhdCAwMDAxOjI5RDANCisNCisgOiBlcnJvciBMMjAyOTogJ0VORERJQUxPRycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdJU1pPT01FRCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdfbWFpbicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdHRVRQUklWQVRFUFJPRklMRUlOVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdTRUxFQ1RQQUxFVFRFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0NSRUFURVdJTkRPVycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdTRVRCUlVTSE9SRycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdNVUxESVYnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnTVVMRElWJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ193c3ByaW50ZicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdfd3NwcmludGYnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnR0VUUFJJVkFURVBST0ZJTEVTVFJJTkcnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnR0VUQVNZTkNLRVlTVEFURScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdSRUxFQVNFREMnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnREVMRVRFREMnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnUE9TVFFVSVRNRVNTQUdFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ01FU1NBR0VCT1gnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnVVBEQVRFV0lORE9XJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0xPQURTVFJJTkcnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnR0VUREMnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnTUFLRVBST0NJTlNUQU5DRScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdHRVRDVVJSRU5UVElNRScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdGUkVFUFJPQ0lOU1RBTkNFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0NSRUFURUlDJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1NFVE1BUE1PREUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnRklMTFJFQ1QnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnTE9BRElDT04nIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnUkVHSVNURVJDTEFTUycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdMT0FEQ1VSU09SJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0dFVFNZU1RFTU1FTlUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnV1JJVEVQUklWQVRFUFJPRklMRVNUUklORycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdEUkFXSUNPTicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdDUkVBVEVQRU4nIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnQ1JFQVRFU09MSURCUlVTSCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdTRVRWSUVXUE9SVE9SRycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdFTkRQQUlOVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdUUkFOU0xBVEVNRVNTQUdFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0dFVE1FU1NBR0UnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnU0VUV0lORE9XRVhUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1BUSU5SRUNUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0dFVERFVklDRUNBUFMnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnREVMRVRFT0JKRUNUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0tJTExUSU1FUicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdESVNQQVRDSE1FU1NBR0UnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnU0VUVklFV1BPUlRFWFQnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnREVGV0lORE9XUFJPQycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdTSE9XV0lORE9XJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1NIT1dXSU5ET1cnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnR0VUQ0xJRU5UUkVDVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdJTlZBTElEQVRFUkVDVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdTRUxFQ1RPQkpFQ1QnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnR0VUSU5TVEFOQ0VEQVRBJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1NFVFRJTUVSJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0JFR0lOUEFJTlQnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnQ0hBTkdFTUVOVScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQorIDogZXJyb3IgTDIwMjk6ICdHRVRXSU5ET1dSRUNUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0NSRUFURVBBTEVUVEUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnUE9MWUxJTkUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKyA6IGVycm9yIEwyMDI5OiAnRElBTE9HQk9YJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1JFQUxJWkVQQUxFVFRFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1NFVFBJWEVMJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ0dFVFNZU0NPTE9SJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCisgOiBlcnJvciBMMjAyOTogJ1NFVFdJTkRPV1RFWFQnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KKw0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQucmMgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGFmYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLnJjCkBAIC0wLDAgKzEsNTkgQEAKKy8vDQorLy8gSFlQRVJPSUQuUkMgLSBvcmJpdGVyIHJlc291cmNlcw0KKy8vDQorDQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisjaW5jbHVkZSAiaHlwZXJvaWQuaCINCisNCitJRElfSFlQRVJPSUQgSUNPTiAiaHlwZXJvaWQuaWNvIg0KK0lESV9QQU5JQyBJQ09OICJwYW5pYy5pY28iDQorDQorU1RSSU5HVEFCTEUNCit7DQorCUlEU19OQU1FLCAiSHlwZXJvaWQiDQorCUlETV9ORVcsICJOZXcgR2FtZSYhIg0KKwlJRE1fQUJPVVQsICImQWJvdXQuLi4iDQorfQ0KKw0KKy8vDQorLy8gQWJvdXQgYm94DQorLy8NCisNCitJRERfQUJPVVQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzAsIDMwLCAxNTAsIDEyMA0KK0NBUFRJT04gIkFib3V0Ig0KK1NUWUxFIFdTX0JPUkRFUiB8IFdTX0NBUFRJT04gfCBXU19ETEdGUkFNRSB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQDQorew0KKwlDVEVYVCAgICAgICAgICAgIkh5cGVyb2lkIiwgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDAsIDEwLCAxNTAsIDgNCisJQ1RFWFQgICAgICAgICAgICJUaGUgY2xhc3NpYyBnYW1lIiwgICAgICAgICAgICAgICAgIC0xLCAwLCAyMCwgMTUwLCA4DQorCUNURVhUICAgICAgICAgICAiVmVyc2lvbiAxLjEiLCAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMzAsIDE1MCwgOA0KKwlDVEVYVCAgICAgICAgICAgIkNvcHlyaWdodCCpIDE5OTEgSHV0Y2hpbnMgU29mdHdhcmUiLCAtMSwgMCwgNDUsIDE1MCwgOA0KKwlDVEVYVCAgICAgICAgICAgIlRoaXMgcHJvZ3JhbSBpcyBmcmVld2FyZSIsICAgICAgICAgLTEsIDAsIDU1LCAxNTAsIDgNCisJQ1RFWFQgICAgICAgICAgICJBdXRob3I6IEVkd2FyZCBIdXRjaGlucyIsICAgICAgICAgIC0xLCAwLCA2NSwgMTUwLCA4DQorCUNURVhUICAgICAgICAgICAiZWFoMUBjZWMxLnd1c3RsLmVkdSIsICAgICAgICAgICAgICAtMSwgMCwgNzUsIDE1MCwgOA0KKwlDVEVYVCAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUREX0FfSElTQ09SRSwgMCwgODUsIDE1MCwgOA0KKwlJQ09OICAgICAgICAgICAgSURJX0hZUEVST0lELCAgICAgICAgICAgICAgICAgICAgICAgLTEsIDEwLCAxNiwgMCwgMA0KKwlERUZQVVNIQlVUVE9OICAgIk9rISIsIElET0ssICAgICAgICAgICAgICAgICAgICAgICAgMjAsIDEwMCwgNDAsIDEyDQorCUNPTlRST0wgICAgICAgICAiJkhlbHAiLCBJRERfQV9IRUxQLCAgICAgICAgICAgICAgICAiYnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19DSElMRCwgOTAsIDEwMCwgNDAsIDEyDQorfQ0KKw0KKy8vDQorLy8gYml0bWFwcw0KKy8vDQorDQorSURCX2JsYW5rICAgQklUTUFQIERJU0NBUkRBQkxFICAiYmxhbmsuYm1wIg0KK0lEQl9ib21iICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgImJvbWIuYm1wIg0KK0lEQl9sZXZlbCAgIEJJVE1BUCBESVNDQVJEQUJMRSAgImxldmVsLmJtcCINCitJREJfbGlmZSAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJsaWZlLmJtcCINCitJREJfbnVtMCAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW0wLmJtcCINCitJREJfbnVtMSAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW0xLmJtcCINCitJREJfbnVtMiAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW0yLmJtcCINCitJREJfbnVtMyAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW0zLmJtcCINCitJREJfbnVtNCAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW00LmJtcCINCitJREJfbnVtNSAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW01LmJtcCINCitJREJfbnVtNiAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW02LmJtcCINCitJREJfbnVtNyAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW03LmJtcCINCitJREJfbnVtOCAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW04LmJtcCINCitJREJfbnVtOSAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJudW05LmJtcCINCitJREJfcGx1cyAgICBCSVRNQVAgRElTQ0FSREFCTEUgICJwbHVzLmJtcCINCitJREJfc2NvcmUgICBCSVRNQVAgRElTQ0FSREFCTEUgICJzY29yZS5ibXAiDQorSURCX3NoaWVsZCAgQklUTUFQIERJU0NBUkRBQkxFICAic2hpZWxkLmJtcCINCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2xldmVsLmJtcCBiL3Rlc3QvaHlwZXJvaWQvbGV2ZWwuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWYwM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL2xldmVsLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2xpZmUuYm1wIGIvdGVzdC9oeXBlcm9pZC9saWZlLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZkNjIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9saWZlLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2xpc3QuYyBiL3Rlc3QvaHlwZXJvaWQvbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjcwNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL2xpc3QuYwpAQCAtMCwwICsxLDYxIEBACisvLw0KKy8vIExJU1QgLSBsaXN0IHByb2Nlc3NpbmcgZnVuY3Rpb25zIGZvciBvcmJpdGVyDQorLy8NCisvLyBWZXJzaW9uOiAxLjAgIENvcHlyaWdodCAoQykgMTk5MCwgSHV0Y2hpbnMgU29mdHdhcmUNCisvLyBBdXRob3I6IEVkd2FyZCBIdXRjaGlucw0KKy8vIFJldmlzaW9uczoNCisvLw0KKw0KKyNpbmNsdWRlICJvcmJpdGVyLmgiDQorDQorLy8NCisvLyBBZGRIZWFkIC0gYWRkIGFuIG9iamVjdCB0byB0aGUgaGVhZCBvZiBhIGxpc3QNCisvLw0KKw0KK1ZPSUQgRkFSIFBBU0NBTCBBZGRIZWFkKCBOUExJU1QgbnBMaXN0LCBOUE5PREUgbnBOb2RlICkNCit7DQorCWlmIChucExpc3QtPm5wSGVhZCkNCisJew0KKwkJbnBOb2RlLT5ucE5leHQgPSBucExpc3QtPm5wSGVhZDsNCisJCW5wTm9kZS0+bnBQcmV2ID0gTlVMTDsNCisJCW5wTGlzdC0+bnBIZWFkID0gKG5wTGlzdC0+bnBIZWFkLT5ucFByZXYgPSBucE5vZGUpOw0KKwl9DQorCWVsc2UgLy8gYWRkIHRvIGFuIGVtcHR5IGxpc3QNCisJew0KKwkJbnBMaXN0LT5ucEhlYWQgPSBucExpc3QtPm5wVGFpbCA9IG5wTm9kZTsNCisJCW5wTm9kZS0+bnBOZXh0ID0gbnBOb2RlLT5ucFByZXYgPSBOVUxMOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gUmVtSGVhZCAtIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3QNCisvLw0KKw0KK05QTk9ERSBGQVIgUEFTQ0FMIFJlbUhlYWQoIE5QTElTVCBucExpc3QgKQ0KK3sNCisJaWYgKG5wTGlzdC0+bnBIZWFkKQ0KKwl7DQorCQlOUE5PREUgbnBOb2RlID0gbnBMaXN0LT5ucEhlYWQ7DQorCQlpZiAobnBMaXN0LT5ucFRhaWwgIT0gbnBOb2RlKQ0KKwkJew0KKwkJCW5wTGlzdC0+bnBIZWFkID0gbnBOb2RlLT5ucE5leHQ7DQorCQkJbnBOb2RlLT5ucE5leHQtPm5wUHJldiA9IE5VTEw7DQorCQl9DQorCQllbHNlIG5wTGlzdC0+bnBIZWFkID0gbnBMaXN0LT5ucFRhaWwgPSBOVUxMOw0KKwkJcmV0dXJuKCBucE5vZGUgKTsNCisJfQ0KKwllbHNlIHJldHVybiggTlVMTCApOw0KK30NCisNCisvLw0KKy8vIFJlbW92ZSAtIHJlbW92ZSBhbiBhcmJpdHJhcnkgZWxlbWVudCBmcm9tIGEgbGlzdA0KKy8vDQorDQorVk9JRCBGQVIgUEFTQ0FMIFJlbW92ZSggTlBMSVNUIG5wTGlzdCwgTlBOT0RFIG5wTm9kZSApDQorew0KKwlpZiAobnBOb2RlLT5ucFByZXYpIG5wTm9kZS0+bnBQcmV2LT5ucE5leHQgPSBucE5vZGUtPm5wTmV4dDsNCisJZWxzZSBucExpc3QtPm5wSGVhZCA9IG5wTm9kZS0+bnBOZXh0Ow0KKwlpZiAobnBOb2RlLT5ucE5leHQpIG5wTm9kZS0+bnBOZXh0LT5ucFByZXYgPSBucE5vZGUtPm5wUHJldjsNCisJZWxzZSBucExpc3QtPm5wVGFpbCA9IG5wTm9kZS0+bnBQcmV2Ow0KK30NCisNCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL21ha2VmaWxlLm1rIGIvdGVzdC9oeXBlcm9pZC9tYWtlZmlsZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMzOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9tYWtlZmlsZS5tawpAQCAtMCwwICsxLDI2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjICAgaHlwZXJvaWQgbWFrZWZpbGUNCisjDQorIyAgIENvcHlyaWdodCAoQykgMTk4OC0xOTkwIExhbnRlcm4gQ29ycC4NCisjDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCisjIFRoaXMgaXMganVzdCBhIHRlYXNlciB0byBzaG93IGhvdyBsaXR0bGUgeW91IGhhdmUgdG8gZG8gdG8gbWFrZSBwcm9qZWN0cw0KKyMgdW5kZXIgTGFudGVybiBDb3JwLidzIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHN5c3RlbS4gVG8gbWFrZSBIeXBlcm9pZCBvbg0KKyMgeW91ciBzeXN0ZW0sIG1ha2Ugc3VyZSA8d2luZXh0Lmg+IGlzIGluIHlvdXIgaW5jbHVkZSBwYXRoIGFuZCBzZXQgdXAgeW91cg0KKyMgbWFrZWZpbGUgbGlrZSB5b3Ugbm9ybWFsbHkgZG8gZm9yIHlvdXIgb3duIHN0dWZmLg0KKyMgSSdsbCAoaG9wZWZ1bGx5KSBwb3N0IHRoZSAxMDBrIG9mIHN0dWZmIHlvdSBuZWVkIGZvciB0aGlzIG1ha2VmaWxlIHRvDQorIyBiZSB1c2VmdWxsLiBJJ2xsIGhhdmUgdG8gdGFsayB0byBteSBib3NzIGZpcnN0Li4uDQorIyBQLlMuIFRoZSBzeXN0ZW0gb25seSB3b3JrcyBmb3IgdGhlIE1pcmNvc29mdCBDNi4wIGNvbXBpbGVyLCBidXQgaXRzIGVhc3kNCisjIGVub3VnaCB0byBjaGFuZ2UuDQorIyBQLlAuUy4gSSBoYXRlIGV2ZXJ5IGludGVncmF0ZWQgZW52aXJvbm1lbnQgSSd2ZSBydW4gYWNyb3NzIHNvIGZhciwgdGh1cw0KKyMgdGhlIHN5c3RlbSBpcyBydW4gZnJvbSBhIGNvbW1hbmQgcHJvbXB0Lg0KKw0KK1BST0ogPSBoeXBlcm9pZA0KK09CSlMgPSBoeXBlcm9pZC5vYmogcm9pZHN1cHAub2JqDQorUkVTUyA9IGh5cGVyb2lkLnJlcw0KK0xJQlMgPQ0KKw0KKyFpbmNsdWRlIDx3aW5kb3dzLm1rPg0KKw0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtMC5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTAuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmE4NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTAuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtMS5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTEuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmQwZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTEuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtMi5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTIuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjcwZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTIuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtMy5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTMuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Yjk5NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTMuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtNC5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTQuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTRhNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTQuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtNS5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTUuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmNhNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTUuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtNi5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTYuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjAwYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTYuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtNy5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTcuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWFmNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTcuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtOC5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTguYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWVlYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTguYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtOS5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTkuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjE4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL251bTkuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvcGFuaWMuaWNvIGIvdGVzdC9oeXBlcm9pZC9wYW5pYy5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlNDQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHlwZXJvaWQvcGFuaWMuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvcGx1cy5ibXAgYi90ZXN0L2h5cGVyb2lkL3BsdXMuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWRhOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL3BsdXMuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvcmVhZC5tZSBiL3Rlc3QvaHlwZXJvaWQvcmVhZC5tZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWY3MGRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9yZWFkLm1lCkBAIC0wLDAgKzEsMTA5IEBACisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorTEVHQUwgSlVOSzoNCisNCisJSHlwZXJvaWQgLSBhIGdhbWUgZm9yIE1pcmNvc29mdCBXaW5kb3dzICh0bSkNCisJQ29weXJpZ2h0IChDKSAxOTkxIEVkd2FyZCBIdXRjaGlucw0KKwlpbnRlcm5ldDogZWFoMUBjZWMxLnd1c3RsLmVkdQ0KKwl1c25haWw6IGMvbyBFZHdhcmQgSHV0Y2hpbnMsIDYzIFJpZGdlbW9vciBEci4sIENsYXl0b24sIE1PIDYzMTA1DQorDQorCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikNCisJYW55IGxhdGVyIHZlcnNpb24uDQorDQorCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KKw0KK05vdGU6IFdpbmRvd3MgaXMgYSB0cmFkZW1hcmsgb2YgTWljcm9zb2Z0IENvcnAuIChEdWgpDQorDQorV2l0aCB0aGlzIGFzaWRlLA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisNCitIZWxsbywgYW5kIFdlbGNvbWUgdG8gSHlwZXJvaWQgdmVyc2lvbiAxLjEhDQorDQorVGhlIG9iamVjdCBvZiB0aGUgZ2FtZSBpcyBpbnR1aXRpdmUtLS1zaG9vdCBldmVyeXRoaW5nISAoV2VsbCwgYWxtb3N0DQorZXZlcnl0aGluZywgaGVoIGhlaCEpLiBJZiB0aGUga2V5Ym9hcmQgYnVmZmVyIG92ZXJmbG93cyBpbiBhbGwgdGhlDQorZXhjaXRlbWVudCwgaWdub3JlIHRoZSBiZWVwcyB5b3UgaGVhciBhbmQgdGhleSdsbCBnbyBhd2F5Lg0KKw0KK0h5cGVyb2lkcyB1c2VzIHRoZSBwYWxldHRlIG1hbmFnZXIsIHNvIGlmIHlvdSBoYXZlIGEgcGFsZXR0ZS1jYXBhYmxlIGRpc3BsYXkNCisoYW5kIHlvdSByZWFkIHRoZSBvbi1saW5lIGhlbHAgcGFnZXMpIHlvdSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdXAgYmV0dGVyDQorY29sb3JzIHRoYW4gdGhlIFdpbmRvd3MgZGVmYXVsdHMuIEkgaGF2ZSB0ZXN0ZWQgaHlwZXJvaWRzIG9uIGEgbW9ub2Nocm9tZQ0KKycyODYsIGFuZCBpdCBzZWVtcyB0byB3b3JrIGZpbmUuIElmIHlvdSB3YW50IHRvIHJlLW1hcCB0aGUga2V5cywgbG9vayBhdA0KK0FwcGVuZGl4IEEgKG9yIHRoZSBXaW5kb3dzIFNESykgZm9yIHNvbWUgbm9uLUFTQ0lJIHZpcnR1YWwga2V5IGNvZGVzLg0KKw0KK1RoZSBzb3VyY2UgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHNhbWUgY2hhbm5lbCB0aGF0IHlvdSBnb3QgdGhlIGV4ZWN1dGFibGUNCit0aHJvdWdoLCBhcyBwZXIgdGhlIEdOVSBnZW5lcmFsIHB1YmxpYyBsaWNlbmNlLiBQbGVhc2UgcmVhZCB0aGUgbGljZW5jZSBpZg0KK3lvdSBoYXZlIGFueSBxdWVzdGlvbnMsIG9yIGNvbnRhY3QgbWUgYXQgdGhlIGFib3ZlIGFkZHJlc3NlcyAoZW1haWwNCitwcmVmZXJyZWQpLg0KKw0KK0lmIHlvdSBtYWtlIG1vZGlmaWNhdGlvbnMvYnVnIGZpeGVzIHRvIEh5cGVyb2lkLCBwbGVhc2UgdXNlIG1lIGFzIGEgY2xlYXJpbmcNCitob3VzZSB0byBwcmV2ZW50IHZlcnNpb25zIGZsb29kaW5nIG91dCBpbnRvIHRoZSB1bml2ZXJzZS4gKFlvdSBkb24ndCBoYXZlIHRvLA0KK2J1dCBJJ2QgYXBwcmVjaWF0ZSBpdCA6LSkuIElmIHlvdSB3cml0ZSB0aGUgd29ybGQncyBncmVhdGVzdCBnYW1lIHVzaW5nIHNvbWUNCitvZiBteSBzb3VyY2UsIHBsZWFzZSBzZW5kIG1lIG5vdGUgdGVsbGluZyB3aGF0IGl0IGlzIGFuZCB3aGVyZSBpdCdzIGF2YWlsYWJsZS4NCisNCitDaGFuZ2VzIHNpbmNlIDEuMDoNCisJRXhwbG9zaW9uIHByb2Nlc3NpbmcgYSBsaXR0bGUgZmFzdGVyDQorCVN3YXJtZXJzIChsaXR0bGUgZ3JlZW4gZ3V5cykgbm8gbG9uZ2VyIGZsb29kIHRoZSBzeXN0ZW0NCisJU2NvcmluZyBpcyBiZXR0ZXINCisJRXh0cmEgbGl2ZXMgZXZlcnkgMTAwLDAwMCBwb2ludHMgKG5vdCA1MCwwMDApDQorCUZpcmVwb3dlciByZWR1Y2VkIGEgbGl0dGxlIChoZXksIHRoZSBnYW1lIHdhcyB0b28gZGFybiBlYXN5KQ0KKwlTcGlubmluZyBHYW1lIE92ZXIgKE9vb29vaC4uLikNCisNCitMb29rIGZvcjoNCisgIGxzIC0gKm5peCBscyBjb21tYW5kIHdpdGggTVVDSE8gYmVsbHMmd2hpc3RsZXMgKGNvdWxkbid0IGxpdmUgdy9vdXQgaXQhKQ0KKyAgYmxpdGZpeCAtIHV0aWwgdGhhdCBzZXRzIHRoZSBDU19CWVRFQUxJR05DTElFTlQgYml0IG9uIGFsbCB0b3Agd2luZG93cw0KKwkJCShzcGVlZHMgdXAgbXkgMTAyNHg3NjggZGlzcGxheSBieSBhIGZhY3RvciBvZiAzKQ0KKyAgZXllY29uIC0geGV5ZXMgY2xvbmUgKG1heSBoYXZlIHRvIGJlIHJlbmFtZWQpDQorICBpbGJtIC0gQW1pZ2EgSUZGIGJpdG1hcCB2aWV3ZXIgKHN1cHBvcnRzIEhBTSBtb2RlIGFuZCBwYWxldHRlcyEpDQorICBsaWZlIC0gNyBibGl0IGxpZmUgd2l0aCBhIGZldyBiZWxscyZ3aGlzdGxlcw0KKyAgbG9hZG1vbiAtIG5pZnR5IHN5c3RlbSBwZXJmb3JtYW5jZSBtb25pdG9yDQorICBtYnJvdCAtIG1hbmRlbGJyb3QgaGFjayB0aGF0IHJ1bnMgaW4gdGhlIGJhY2tncm91bmQNCisgIHlvdyAtIFppcHB5IHRoZSBQaW5oZWFkIGluIGhpcyB2ZXJ5IG93biBpY29uLCB0ZWxsaW5nIGl0IGxpa2UgaXQgaXMNCisgIChtb3JlIGdhbWVzLi4uIHN0dWZmLi4uIGp1bmsuLi4pDQorQ29taW5nIHJlYWwgc29vbiBub3cgdG8gYSAobmV0LEJCUyxXaGVyZXZlciB0aGlzIHN0dWZmIGVuZHMgdXApIG5lYXIgWU9VIQ0KKw0KK0FwcGVuZGl4IEE6IFZpcnR1YWwgS2V5IENvZGVzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisJVktfVEFCICAgICAgICAgICAgICA5ID0gZGVmYXVsdCBzaGllbGRzDQorCVZLX1JFVFVSTiAgICAgICAgICAgMTMNCisJVktfU0hJRlQgICAgICAgICAgICAxNg0KKwlWS19DT05UUk9MICAgICAgICAgIDE3DQorCVZLX0NBUElUQUwgICAgICAgICAgMjAgLSB1c2VmdWwgZm9yIGF1dG9maXJlIQ0KKwlWS19FU0NBUEUgICAgICAgICAgIDI3ID0gZGVmYXVsdCBib3NzIGtleQ0KKwlWS19TUEFDRSAgICAgICAgICAgIDMyID0gZGVmYXVsdCBmaXJlIGtleQ0KKwlWS19QUklPUiAgICAgICAgICAgIDMzDQorCVZLX05FWFQgICAgICAgICAgICAgMzQNCisJVktfRU5EICAgICAgICAgICAgICAzNQ0KKwlWS19IT01FICAgICAgICAgICAgIDM2DQorCVZLX0xFRlQgICAgICAgICAgICAgMzcgPSBkZWZhdWx0IGNvdW50ZXItY2xvY2t3aXNlIGtleQ0KKwlWS19VUCAgICAgICAgICAgICAgIDM4ID0gZGVmYXVsdCByZXZlcnNlIHRocnVzdCBrZXkNCisJVktfUklHSFQgICAgICAgICAgICAzOSA9IGRlZmF1bHQgY2xvY2t3aXNlIGtleQ0KKwlWS19ET1dOICAgICAgICAgICAgIDQwID0gZGVmYXVsdCB0aHJ1c3Qga2V5DQorCVZLX0lOU0VSVCAgICAgICAgICAgNDUNCisJVktfREVMRVRFICAgICAgICAgICA0Ng0KKwlWS19BLVZLX1ogICAgICAgICAgIDY0LTkwLCA4MyA9IGRlZmF1bHQgc21hcnRib21iIGtleSAoQVNDSUkgJ1MnKQ0KKwlWS19OVU1QQUQwICAgICAgICAgIDk2DQorCVZLX05VTVBBRDEgICAgICAgICAgOTcNCisJVktfTlVNUEFEMiAgICAgICAgICA5OA0KKwlWS19OVU1QQUQzICAgICAgICAgIDk5DQorCVZLX05VTVBBRDQgICAgICAgICAgMTAwDQorCVZLX05VTVBBRDUgICAgICAgICAgMTAxDQorCVZLX05VTVBBRDYgICAgICAgICAgMTAyDQorCVZLX05VTVBBRDcgICAgICAgICAgMTAzDQorCVZLX05VTVBBRDggICAgICAgICAgMTA0DQorCVZLX05VTVBBRDkgICAgICAgICAgMTA1DQorCVZLX01VTFRJUExZICAgICAgICAgMTA2DQorCVZLX0FERCAgICAgICAgICAgICAgMTA3DQorCVZLX1NFUEFSQVRPUiAgICAgICAgMTA4DQorCVZLX1NVQlRSQUNUICAgICAgICAgMTA5DQorCVZLX0RFQ0lNQUwgICAgICAgICAgMTEwDQorCVZLX0RJVklERSAgICAgICAgICAgMTExDQorCVZLX0YxLVZLX0YxNiAgICAgICAgMTEyLTEyNw0KKw0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvcm9pZHN1cHAuYyBiL3Rlc3QvaHlwZXJvaWQvcm9pZHN1cHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGEzMGYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC9yb2lkc3VwcC5jCkBAIC0wLDAgKzEsNDk3IEBACisvLw0KKy8vIFJPSURTVVBQIC0gaHlwZXJvaWQgc3VwcG9ydCBmdW5jdGlvbnMNCisvLw0KKy8vIFZlcnNpb246IDEuMSAgQ29weXJpZ2h0IChDKSAxOTkxLCBIdXRjaGlucyBTb2Z0d2FyZQ0KKy8vICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UNCisvLyAgICAgIFBsZWFzZSByZWFkIHRoZSBhc3NvY2lhdGVkIGxlZ2FsIGRvY3VtZW50YXRpb24NCisvLyBBdXRob3I6IEVkd2FyZCBIdXRjaGlucw0KKy8vIFJldmlzaW9uczoNCisvLyAxMS8wMS85MSBhZGRlZCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAtIEVkLg0KKy8vDQorDQorI2luY2x1ZGUgImh5cGVyb2lkLmgiDQorDQorLy8NCisvLyBkZWZpbmVzDQorLy8NCisNCisvLyB5b3UgbWF5IGFzaywgIndoeSBkaWQgaGUgZW1iZWQgYWxsIHRoZXNlIHN0cmluZyBjb25zdGFudHMgaW5zdGVhZCBvZg0KKy8vIHVzaW5nIHRoZSByZXNvdXJjZSBmaWxlPyIuIEdvb2QgcXVlc3Rpb24uIFRoZSBhbnN3ZXIgaXM6IEkgZmVlbCBiZXR0ZXINCisvLyBrbm93aW5nIHRoaXMgc3R1ZmYgaXMgcGFydCBvZiB0aGUgZXhlY3V0YWJsZSwgYW5kIG5vdCBwYXJ0IG9mIHRoZSByZXNvdXJjZQ0KKy8vIGZpbGUgKHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGJ5IHNuZWFreSBwZW9wbGUpLiBPciBtYXliZSBJIHd1eiBsYXp5Lg0KKy8vIElmIHlvdSBkb24ndCBsaWtlIGl0LCB0aGVuIFlPVSBjYW4gY2hhbmdlIGl0IQ0KKw0KKyNkZWZpbmUgTkwgIlx4MGRceDBhIg0KKw0KKyNkZWZpbmUgSFlQRVJPSURfSEVMUCBcDQorIlRoZSBmb2xsb3dpbmcga2V5cyBjb250cm9sIHlvdXIgc2hpcDoiIE5MIE5MIFwNCisiICBMZWZ0LCBSaWdodCBBcnJvdyAuLi4uIHNwaW4gbGVmdCBvciByaWdodCIgTkwgXA0KKyIgIERvd24sIFVwIEFycm93IC4uLi4uIGZvcndhcmQgb3IgcmV2ZXJzZSB0aHJ1c3QiIE5MIFwNCisiICBTcGFjZSBCYXIgLi4uLi4uLi4uLi4uLi4gZmlyZSEiIE5MIFwNCisiICBUYWIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBzaGllbGRzIiBOTCBcDQorIiAgUyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBzbWFydGJvbWIiIE5MIFwNCisiICBFc2MgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBwYXVzZS9ib3NzIGtleSIgTkwgTkwgXA0KKyJOb3RlOiBZb3UgaGF2ZSAzIGxpdmVzLCB1bmxpbWl0ZWQgZnVlbCBhbmQgZmlyZXBvd2VyLCAzIHNoaWVsZHMgYW5kIDMgIiBcDQorInNtYXJ0Ym9tYnMuIFlvdXIgc2hpcCBnZXRzIGRhcmtlciB3aGVuIHlvdSBsb3NlIGEgbGlmZSwgYnV0IHlvdSBrZWVwIG9uICIgXA0KKyJwbGF5aW5nICh1bmxlc3MgeW91IGhpdCBhbiBhc3Rlcm9pZCkuIFlvdSBnZXQgYW4gZXh0cmEgbGlmZSBldmVyeSAxMDAsMDAwICIgXA0KKyJwb2ludHMuIFdoZW4geW91IGxvc2UgdGhlIGdhbWUsIHlvdSBzdGFydCBvdmVyIGltbWVkaWF0ZWx5IGFuZCBjYW4gZmluaXNoICIgXA0KKyJvZmYgdGhlIGN1cnJlbnQgbGV2ZWwgKHdoaWNoIHNob3VsZCBub3cgYmUgMCkgYmVmb3JlIHN0YXJ0aW5nIG92ZXIgYXQgIiBcDQorImxldmVsIDEgKFRoZXJlIGlzIG5vIHdhaXRpbmcgYXJvdW5kIGJldHdlZW4gZ2FtZXMpLiINCisNCisjZGVmaW5lIEhZUEVST0lEX0hFTFAyIFwNCisiVGhlIEhZUEVST0lELklOSSBmaWxlIGNhbiBiZSBjcmVhdGVkL21vZGlmaWVkIHRvIGNoYW5nZSBkZWZhdWx0IHNldHRpbmdzICIgXA0KKyJpbiBIeXBlcm9pZC4gSGVyZSBhcmUgc29tZSBvZiB0aGUgaXRlbXMgeW91IGNhbiBzZXQ6IiBOTCBcDQorTkwgIltIeXBlcm9pZF0iIE5MICJNYXg9PDAvMT4iIE5MICJ7WCxZLFcsSH09PG4+IiBOTCAiTW9ubz08MC8xPiIgTkwgXA0KKyJEcmF3RGVsYXk9PG1zPiA7bWljcm9zZWNvbmRzL2ZyYW1lIiBOTCBcDQorTkwgIltQYWxldHRlXSIgTkwgXA0KKyJ7QmxhY2ssRGtHcmV5LEdyZXksV2hpdGUsIiBOTCBcDQorIiBEa1JlZCxSZWQsRGtHcmVlbixHcmVlbixEa0JsdWUsQmx1ZSwiIE5MIFwNCisiIERrWWVsbG93LFllbGxvdyxEa0N5YW4sQ3lhbiwiIE5MIFwNCisiIERrTWFnZW50YSxNYWdlbnRhfT08cj4sPGc+LDxiPiIgTkwgXA0KK05MICJbS2V5c10iIE5MIFwNCisie1NoaWVsZCxDbG9ja3dpc2UsQ3RyQ2xvY2t3aXNlLCIgTkwgXA0KKyIgVGhydXN0LFJldlRocnVzdCxGaXJlLEJvbWJ9PTx2aXJ0dWFsIGtleWNvZGU+IiBOTCBOTCBcDQorIk5vdGU6IFZpcnR1YWwga2V5Y29kZXMgdXN1YWxseSBtYXRjaCB0aGUga2V5J3MgQVNDSUkgdmFsdWUuIg0KKw0KKyNkZWZpbmUgSFlQRVJPSURfSEVMUFNUWUxFIChNQl9PSyB8IE1CX0lDT05BU1RFUklTSykNCisNCisvLyB0aGlzIGlzIHRoZSBwYXJ0IEkgZXNwZWNpYWxseSB3YW50IGluIHRoZSBleGVjdXRhYmxlIGltYWdlDQorDQorI2RlZmluZSBIWVBFUk9JRF9MSUNFTlNFIFwNCisiVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgIiBcDQorIml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICIgXA0KKyJ0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pICIgXA0KKyJhbnkgbGF0ZXIgdmVyc2lvbi4gIiBcDQorTkwgTkwgXA0KKyJUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgIiBcDQorImJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICIgXA0KKyJNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICIgXA0KKyJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAiIFwNCitOTCBOTCBcDQorIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICIgXA0KKyJhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAiIFwNCisiRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICINCisNCisvLw0KKy8vIGltcG9ydHMNCisvLw0KKw0KK0lNUE9SVCBDSEFSICAgICAgICAgc3pBcHBOYW1lWzMyXSBGUk9NKCBoeXBlcm9pZC5jICk7DQorSU1QT1JUIEhBTkRMRSAgICAgICBoQXBwSW5zdCBGUk9NKCBoeXBlcm9pZC5jICk7DQorSU1QT1JUIEJPT0wgICAgICAgICBiQlcgRlJPTSggaHlwZXJvaWQuYyApOw0KK0lNUE9SVCBJTlQgICAgICAgICAgbkRyYXdEZWxheSBGUk9NKCBoeXBlcm9pZC5jICk7DQorSU1QT1JUIElOVCAgICAgICAgICB2a1NobGQgRlJPTSggaHlwZXJvaWQuYyApOw0KK0lNUE9SVCBJTlQgICAgICAgICAgdmtDbGt3IEZST00oIGh5cGVyb2lkLmMgKTsNCitJTVBPUlQgSU5UICAgICAgICAgIHZrQ3RyQ2xrdyBGUk9NKCBoeXBlcm9pZC5jICk7DQorSU1QT1JUIElOVCAgICAgICAgICB2a1RocnN0IEZST00oIGh5cGVyb2lkLmMgKTsNCitJTVBPUlQgSU5UICAgICAgICAgIHZrUnZUaHJzdCBGUk9NKCBoeXBlcm9pZC5jICk7DQorSU1QT1JUIElOVCAgICAgICAgICB2a0ZpcmUgRlJPTSggaHlwZXJvaWQuYyApOw0KK0lNUE9SVCBJTlQgICAgICAgICAgdmtCb21iIEZST00oIGh5cGVyb2lkLmMgKTsNCitJTVBPUlQgTE9ORyAgICAgICAgIGxIaWdoU2NvcmUgRlJPTSggaHlwZXJvaWQuYyApOw0KKw0KKy8vDQorLy8gZ2xvYmFscw0KKy8vDQorDQorLy8gdGhlc2UgcGFydHMgbWFwIHRvICJhYmNkZWZnaGlqa2xtIg0KK0dMT0JBTCBQT0lOVCAgICAgICAgTGV0dGVyUGFydFtdID0NCit7DQorCXs4MywgNTcyfSwgezY0LCA1MTJ9LCB7NDUsIDU3Mn0sIHs5NiwgMzYyfSwgezMyLCAzNjJ9LA0KKwl7MTI4LCAyNTZ9LCB7MCwgMH0sIHswLCAyNTZ9LA0KKwl7MTYwLCAzNjJ9LCB7MjI0LCAzNjJ9LCB7MTczLCA1NzJ9LCB7MTkyLCA1MTJ9LCB7MjExLCA1NzJ9DQorfTsNCisvLyBoZXJlJ3MgdGhlIHZlY3RvciBmb250DQorR0xPQkFMIE5QU1RSICAgICAgICBzek51bWJlckRlc2NbXSA9DQorew0KKwkiY2FrbWNrIiwgICAgICAgLy8gMA0KKwkiZGJsIiwgICAgICAgICAgLy8gMQ0KKwkiYWJla20iLCAgICAgICAgLy8gMg0KKwkiYWJlZ2psayIsICAgICAgLy8gMw0KKwkibWNmaCIsICAgICAgICAgLy8gNA0KKwkiY2JmZ2psayIsICAgICAgLy8gNQ0KKwkiYmRpbGpnaSIsICAgICAgLy8gNg0KKwkiYWNnbCIsICAgICAgICAgLy8gNw0KKwkiYmRqbGllYiIsICAgICAgLy8gOA0KKwkibGplYmRnZSIgICAgICAgLy8gOQ0KK307DQorR0xPQkFMIE5QU1RSICAgICAgICBzekxldHRlckRlc2NbXSA9DQorew0KKwkia2RiZW1oZiIsICAgICAgLy8gQQ0KKwkia2FiZWdqbGsiLCAgICAgLy8gQg0KKwkiY2JmbG0iLCAgICAgICAgLy8gQw0KKwkia2FiZWpsayIsICAgICAgLy8gRA0KKwkiY2FmZ2ZrbSIsICAgICAgLy8gRQ0KKwkiY2FmZ2ZrIiwgICAgICAgLy8gRg0KKwkiYmRpbGpoZyIsICAgICAgLy8gRw0KKwkia2FmaGNtIiwgICAgICAgLy8gSA0KKwkiYmwiLCAgICAgICAgICAgLy8gSQ0KKwkiY2psaSIsICAgICAgICAgLy8gSg0KKwkiYWtjZ20iLCAgICAgICAgLy8gSw0KKwkiYWttIiwgICAgICAgICAgLy8gTA0KKwkia2FnY20iLCAgICAgICAgLy8gTQ0KKwkia2FtYyIsICAgICAgICAgLy8gTg0KKwkiYmRpbGplYiIsICAgICAgLy8gTw0KKwkia2FiZWdmIiwgICAgICAgLy8gUA0KKwkibWxpZGJlamwiLCAgICAgLy8gUQ0KKwkia2FiZWdmZ20iLCAgICAgLy8gUg0KKwkiZWJkamxpIiwgICAgICAgLy8gUw0KKwkibGJhYyIsICAgICAgICAgLy8gVA0KKwkiYWlsamMiLCAgICAgICAgLy8gVQ0KKwkiYWxjIiwgICAgICAgICAgLy8gVg0KKwkiYWtnbWMiLCAgICAgICAgLy8gVw0KKwkiYW1na2MiLCAgICAgICAgLy8gWA0KKwkiYWdsZ2MiLCAgICAgICAgLy8gWQ0KKwkiYWNrbSIgICAgICAgICAgLy8gWg0KK307DQorDQorLy8NCisvLyBsb2NhbHMNCisvLw0KKw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pJbmlbXSA9ICJIWVBFUk9JRC5JTkkiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pMaWNlbnNlW10gPSAiTGljZW5zZVJlYWQiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pEcmF3RGVsYXlbXSA9ICJEcmF3RGVsYXkiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pNYXhbXSA9ICJNYXgiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pYW10gPSAiWCI7DQorTE9DQUwgQ0hBUiAgICAgICAgICBzellbXSA9ICJZIjsNCitMT0NBTCBDSEFSICAgICAgICAgIHN6V1tdID0gIlciOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pIW10gPSAiSCI7DQorTE9DQUwgQ0hBUiAgICAgICAgICBzekJXW10gPSAiTW9ubyI7DQorTE9DQUwgQ0hBUiAgICAgICAgICBzelBhbGV0dGVbXSA9ICJQYWxldHRlIjsNCitMT0NBTCBDSEFSICAgICAgICAgIHN6S2V5c1tdID0gIktleXMiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pTaGllbGRbXSA9ICJTaGllbGQiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pDbG9ja3dpc2VbXSA9ICJDbG9ja3dpc2UiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pDdHJDbG9ja3dpc2VbXSA9ICJDdHJDbG9ja3dpc2UiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pUaHJ1c3RbXSA9ICJUaHJ1c3QiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pSZXZUaHJ1c3RbXSA9ICJSZXZUaHJ1c3QiOw0KK0xPQ0FMIENIQVIgICAgICAgICAgc3pGaXJlW10gPSAiRmlyZSI7DQorTE9DQUwgQ0hBUiAgICAgICAgICBzekJvbWJbXSA9ICJCb21iIjsNCitMT0NBTCBDSEFSICAgICAgICAgIHN6SGlbXSA9ICJIaSI7DQorTE9DQUwgQ0hBUiAgICAgICAgICAqc3pDb2xvck5hbWVbXSA9DQorew0KKwkiQmxhY2siLCAiRGtHcmV5IiwgIkdyZXkiLCAiV2hpdGUiLA0KKwkiRGtSZWQiLCAiUmVkIiwgICJEa0dyZWVuIiwgIkdyZWVuIiwgIkRrQmx1ZSIsICJCbHVlIiwNCisJIkRrWWVsbG93IiwgIlllbGxvdyIsICJEa0N5YW4iLCAiQ3lhbiIsICJEa01hZ2VudGEiLCAiTWFnZW50YSINCit9Ow0KK0xPQ0FMIERXT1JEICAgICAgICAgZHdDb2xvcnNbXSA9DQorew0KKwlSR0IoMCwwLDApLCBSR0IoMTI4LDEyOCwxMjgpLA0KKwlSR0IoMTkyLDE5MiwxOTIpLCBSR0IoMjU1LDI1NSwyNTUpLA0KKwlSR0IoMTI4LDAsMCksIFJHQigyNTUsMCwwKSwNCisJUkdCKDAsMTI4LDApLCBSR0IoMCwyNTUsMCksDQorCVJHQigwLDAsMTI4KSwgUkdCKDAsMCwyNTUpLA0KKwlSR0IoMTI4LDEyOCwwKSwgUkdCKDI1NSwyNTUsMCksDQorCVJHQigwLDEyOCwxMjgpLCBSR0IoMCwyNTUsMjU1KSwNCisJUkdCKDEyOCwwLDEyOCksIFJHQigyNTUsMCwyNTUpLA0KK307DQorDQorLy8NCisvLyBQcmludExldHRlcnMgLSBjcmVhdGUgbGV0dGVyIG9iamVjdHMgZnJvbSBhIHN0cmluZw0KKy8vDQorDQorVk9JRCBGQVIgUEFTQ0FMIFByaW50TGV0dGVycyggTlBTVFIgbnBzelRleHQsIFBPSU5UIFBvcywgUE9JTlQgVmVsLA0KKwkJCQkJCQkgIEJZVEUgYnlDb2xvciwgSU5UIG5TaXplICkNCit7DQorCUlOVCAgICAgICAgICAgICBuTGVuID0gc3RybGVuKCBucHN6VGV4dCApOw0KKwlJTlQgICAgICAgICAgICAgbkNudCA9IG5MZW47DQorCUlOVCAgICAgICAgICAgICBuU3BhY2UgPSBuU2l6ZSArIG5TaXplIC8gMjsNCisJSU5UICAgICAgICAgICAgIG5CYXNlID0gKG5MZW4gLSAxKSAqIG5TcGFjZTsNCisJSU5UICAgICAgICAgICAgIG5CYXNlU3RhcnQgPSBQb3MueCArIG5CYXNlIC8gMjsNCisNCisJd2hpbGUgKG5DbnQtLSkNCisJew0KKwkJTlBPQkogbnBMdHIgPSBDcmVhdGVMZXR0ZXIoIG5wc3pUZXh0W25DbnRdLCBuU2l6ZSAvIDIgKTsNCisJCWlmIChucEx0cikNCisJCXsNCisJCQlucEx0ci0+UG9zLnggPSBuQmFzZVN0YXJ0Ow0KKwkJCW5wTHRyLT5Qb3MueSA9IFBvcy55Ow0KKwkJCW5wTHRyLT5WZWwgPSBWZWw7DQorCQkJbnBMdHItPmJ5Q29sb3IgPSBieUNvbG9yOw0KKwkJfQ0KKwkJbkJhc2VTdGFydCAtPSBuU3BhY2U7DQorCX0NCit9DQorDQorLy8NCisvLyBTcGluTGV0dGVycyAtIHNwaW4gbGV0dGVyIG9iamVjdHMgYXdheSBmcm9tIGNlbnRlciBmb3IgZWZmZWN0DQorLy8NCisNCitWT0lEIEZBUiBQQVNDQUwgU3BpbkxldHRlcnMoIE5QU1RSIG5wc3pUZXh0LCBQT0lOVCBQb3MsIFBPSU5UIFZlbCwNCisJCQkJCQkJIEJZVEUgYnlDb2xvciwgSU5UIG5TaXplICkNCit7DQorCUlOVCAgICAgICAgICAgICBuTGVuID0gc3RybGVuKCBucHN6VGV4dCApOw0KKwlJTlQgICAgICAgICAgICAgbkNudCA9IG5MZW47DQorCUlOVCAgICAgICAgICAgICBuU3BhY2UgPSBuU2l6ZSArIG5TaXplIC8gMjsNCisJSU5UICAgICAgICAgICAgIG5CYXNlID0gKG5MZW4gLSAxKSAqIG5TcGFjZTsNCisJSU5UICAgICAgICAgICAgIG5CYXNlU3RhcnQgPSBQb3MueCArIG5CYXNlIC8gMjsNCisNCisJd2hpbGUgKG5DbnQtLSkNCisJew0KKwkJTlBPQkogbnBMdHIgPSBDcmVhdGVMZXR0ZXIoIG5wc3pUZXh0W25DbnRdLCBuU2l6ZSAvIDIgKTsNCisJCWlmIChucEx0cikNCisJCXsNCisJCQlJTlQgblNwaW4gPSAobkNudCAtIG5MZW4gLyAyKSAqIDI7DQorCQkJbnBMdHItPlBvcy54ID0gbkJhc2VTdGFydDsNCisJCQlucEx0ci0+UG9zLnkgPSBQb3MueTsNCisJCQlucEx0ci0+VmVsID0gVmVsOw0KKwkJCW5wTHRyLT5WZWwueCArPSBuU3BpbiAqIDE2Ow0KKwkJCW5wTHRyLT5uU3BpbiA9IC1uU3BpbjsNCisJCQlucEx0ci0+YnlDb2xvciA9IGJ5Q29sb3I7DQorCQl9DQorCQluQmFzZVN0YXJ0IC09IG5TcGFjZTsNCisJfQ0KK30NCisNCisvLw0KKy8vIENyZWF0ZUh5cGVyb2lkUGFsZXR0ZSAtIGNyZWF0ZSBhIGxvZ2ljYWwgcGFsZXR0ZQ0KKy8vDQorDQorSFBBTEVUVEUgRkFSIFBBU0NBTCBDcmVhdGVIeXBlcm9pZFBhbGV0dGUoIFZPSUQgKQ0KK3sNCisJSFBBTEVUVEUgICAgICAgIGhQYWxldHRlOw0KKwlIREMgICAgICAgICAgICAgaElDID0gQ3JlYXRlSUMoICJESVNQTEFZIiwgTlVMTCwgTlVMTCwgTlVMTCApOw0KKwlJTlQgICAgICAgICAgICAgdDsNCisJUEFMRVRURUVOVFJZICAgIFBhbFtQQUxFVFRFX1NJWkUgKyAyXTsNCisJTlBMT0dQQUxFVFRFICAgIG5wTG9nUGFsZXR0ZSA9IChOUExPR1BBTEVUVEUpUGFsOw0KKw0KKwkvLyBhcmUgd2UgZm9yY2VkIGludG8gdXNpbmcgYiZ3Pw0KKwliQlcgPSBGQUxTRTsNCisJaWYgKEdldERldmljZUNhcHMoIGhJQywgTlVNQ09MT1JTICkgPCA4KSBiQlcgPSBUUlVFOw0KKwlEZWxldGVEQyggaElDICk7DQorCWlmIChHZXRQcml2YXRlUHJvZmlsZUludCggc3pBcHBOYW1lLCBzekJXLCBGQUxTRSwgc3pJbmkgKSkgYkJXID0gVFJVRTsNCisNCisJbnBMb2dQYWxldHRlLT5wYWxWZXJzaW9uID0gMHgwMzAwOw0KKwlucExvZ1BhbGV0dGUtPnBhbE51bUVudHJpZXMgPSBQQUxFVFRFX1NJWkU7DQorDQorCWZvciAodCA9IDA7IHQgPCBQQUxFVFRFX1NJWkU7ICsrdCkNCisJew0KKwkJRFdPUkQgICAgICAgICAgIGR3Q29sb3IgPSBkd0NvbG9yc1t0XTsNCisJCUNIQVIgICAgICAgICAgICBzekJ1ZmZbMzJdOw0KKw0KKwkJR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6UGFsZXR0ZSwgc3pDb2xvck5hbWVbdF0sICIiLA0KKwkJCQkJCQkJIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZiksIHN6SW5pICk7DQorCQlpZiAoc3pCdWZmWzBdKQ0KKwkJew0KKwkJCUlOVCByLCBnLCBiOw0KKwkJCU5QU1RSIG5wQnVmZiA9IHN6QnVmZjsNCisJCQlyID0gZyA9IGIgPSAyNTU7DQorCQkJd2hpbGUgKCpucEJ1ZmYgPT0gJyAnKSArK25wQnVmZjsNCisJCQlyID0gYXRvaSggbnBCdWZmICk7DQorCQkJd2hpbGUgKCpucEJ1ZmYgJiYgKm5wQnVmZiAhPSAnLCcpICsrbnBCdWZmOw0KKwkJCWlmICgqbnBCdWZmID09ICcsJykgZyA9IGF0b2koICsrbnBCdWZmICk7DQorCQkJd2hpbGUgKCpucEJ1ZmYgJiYgKm5wQnVmZiAhPSAnLCcpICsrbnBCdWZmOw0KKwkJCWlmICgqbnBCdWZmID09ICcsJykgYiA9IGF0b2koICsrbnBCdWZmICk7DQorCQkJZHdDb2xvciA9IFJHQiggciwgZywgYiApOw0KKwkJfQ0KKwkJaWYgKGJCVykgZHdDb2xvciA9ICgoZHdDb2xvciA9PSBSR0IoMCwwLDApKSA/IFJHQigwLDAsMCkgOiBSR0IoMjU1LDI1NSwyNTUpKTsNCisJCW5wTG9nUGFsZXR0ZS0+cGFsUGFsRW50cnlbdF0ucGVSZWQgPSBHZXRSVmFsdWUoIGR3Q29sb3IgKTsNCisJCW5wTG9nUGFsZXR0ZS0+cGFsUGFsRW50cnlbdF0ucGVHcmVlbiA9IEdldEdWYWx1ZSggZHdDb2xvciApOw0KKwkJbnBMb2dQYWxldHRlLT5wYWxQYWxFbnRyeVt0XS5wZUJsdWUgPSBHZXRCVmFsdWUoIGR3Q29sb3IgKTsNCisJCW5wTG9nUGFsZXR0ZS0+cGFsUGFsRW50cnlbdF0ucGVGbGFncyA9IDA7DQorCX0NCisNCisJaFBhbGV0dGUgPSBDcmVhdGVQYWxldHRlKCBucExvZ1BhbGV0dGUgKTsNCisJcmV0dXJuKCBoUGFsZXR0ZSApOw0KK30NCisNCisvLw0KKy8vIENyZWF0ZUh5cGVyb2lkQ2xhc3MgLSBjcmVhdGUgdGhlIGNsYXNzIG9mIEh5cGVyb2lkJ3Mgd2luZG93DQorLy8NCisNCitCT09MIEZBUiBQQVNDQUwgQ3JlYXRlSHlwZXJvaWRDbGFzcyggVk9JRCApDQorew0KKwlXTkRDTEFTUyAgICAgICAgQ2xhc3M7DQorDQorCS8vIGxvYWQgdGhlIG5hbWUgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZQ0KKwlMb2FkU3RyaW5nKCBoQXBwSW5zdCwgSURTX05BTUUsIHN6QXBwTmFtZSwgc2l6ZW9mKHN6QXBwTmFtZSkgKTsNCisNCisJQ2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsNCisJQ2xhc3MubHBmblduZFByb2MgPSBIeXBlcm9pZFduZFByb2M7DQorCUNsYXNzLmNiQ2xzRXh0cmEgPSAwOw0KKwlDbGFzcy5jYlduZEV4dHJhID0gMDsNCisJQ2xhc3MuaEluc3RhbmNlID0gaEFwcEluc3Q7DQorCUNsYXNzLmhJY29uID0gTlVMTDsNCisJQ2xhc3MuaEN1cnNvciA9IExvYWRDdXJzb3IoIE5VTEwsIElEQ19DUk9TUyApOw0KKwlDbGFzcy5oYnJCYWNrZ3JvdW5kID0gSE5VTEw7DQorCUNsYXNzLmxwc3pNZW51TmFtZSA9IHN6QXBwTmFtZTsNCisJQ2xhc3MubHBzekNsYXNzTmFtZSA9IHN6QXBwTmFtZTsNCisNCisJcmV0dXJuKCBSZWdpc3RlckNsYXNzKCAmQ2xhc3MgKSApOw0KK30NCisNCisvLw0KKy8vIFNldEh5cGVyb2lkTWVudSAtIGFkZCBIeXBlcm9pZCdzIG1lbnUgaXRlbXMgdG8gdGhlIHN5c3RlbSBtZW51DQorLy8NCisNCitWT0lEIE5FQVIgUEFTQ0FMIFNldEh5cGVyb2lkTWVudSggSFdORCBoV25kLCBJTlQgbkZpcnN0SUQsIElOVCBuTGFzdElEICkNCit7DQorCUNIQVIgICAgICAgICAgICBzek1lbnVOYW1lWzQwXTsNCisJSE1FTlUgICAgICAgICAgIGhNZW51Ow0KKw0KKwloTWVudSA9IEdldFN5c3RlbU1lbnUoIGhXbmQsIFRSVUUgKTsNCisJaWYgKGhNZW51ID09IEhOVUxMKSBoTWVudSA9IEdldFN5c3RlbU1lbnUoIGhXbmQsIEZBTFNFICk7DQorCWlmIChoTWVudSA9PSBITlVMTCkgcmV0dXJuOw0KKw0KKwl3aGlsZSAobkZpcnN0SUQgPD0gbkxhc3RJRCkNCisJew0KKwkJTG9hZFN0cmluZyggaEFwcEluc3QsIG5GaXJzdElELCBzek1lbnVOYW1lLCBzaXplb2Yoc3pNZW51TmFtZSkgKTsNCisJCUNoYW5nZU1lbnUoIGhNZW51LCAwLCBzek1lbnVOYW1lLCBuRmlyc3RJRCwgTUZfQVBQRU5EICk7DQorCQkrK25GaXJzdElEOw0KKwl9DQorfQ0KKw0KKy8vDQorLy8gQ3JlYXRlSHlwZXJvaWRXaW5kb3cgLSBvcGVuIHRoZSBIeXBlcm9pZCB3aW5kb3cNCisvLw0KKw0KK0hXTkQgRkFSIFBBU0NBTCBDcmVhdGVIeXBlcm9pZFdpbmRvdyggTFBTVFIgbHBzekNtZCwgSU5UIG5DbWRTaG93ICkNCit7DQorCUhXTkQgICAgICAgICAgICBoV25kOw0KKwlJTlQgICAgICAgICAgICAgeCwgeSwgdywgaDsNCisJQ0hBUiAgICAgICAgICAgIHN6QnVmZlszMl07DQorDQorCS8vIGdldCB0aGUgaGlnaHNjb3JlIHByb2ZpbGUgaGVyZSBmb3IgbGFjayBvZiBhIGJldHRlciBwbGFjZS4uLg0KKwlHZXRQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzekhpLCAiMCIsIHN6QnVmZiwgc2l6ZW9mKHN6QnVmZiksIHN6SW5pICk7DQorCWxIaWdoU2NvcmUgPSBhdG9sKCBzekJ1ZmYgKTsNCisNCisJeCA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6WCwgQ1dfVVNFREVGQVVMVCwgc3pJbmkgKTsNCisJeSA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6WSwgQ1dfVVNFREVGQVVMVCwgc3pJbmkgKTsNCisJdyA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6VywgQ1dfVVNFREVGQVVMVCwgc3pJbmkgKTsNCisJaCA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6SCwgQ1dfVVNFREVGQVVMVCwgc3pJbmkgKTsNCisJaWYgKEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6TWF4LCBGQUxTRSwgc3pJbmkgKSAmJg0KKwkJbkNtZFNob3cgPT0gU1dfTk9STUFMKSBuQ21kU2hvdyA9IFNXX1NIT1dNQVhJTUlaRUQ7DQorDQorCWhXbmQgPSBDcmVhdGVXaW5kb3coIHN6QXBwTmFtZSwgc3pBcHBOYW1lLCBXU19PVkVSTEFQUEVEV0lORE9XLA0KKwkJCQkJCSB4LCB5LCB3LCBoLCBITlVMTCwgSE5VTEwsIGhBcHBJbnN0LCBOVUxMICk7DQorCWlmIChoV25kID09IEhOVUxMKSByZXR1cm4oIEhOVUxMICk7DQorDQorCVNob3dXaW5kb3coIGhXbmQsIG5DbWRTaG93ICk7DQorCVVwZGF0ZVdpbmRvdyggaFduZCApOw0KKwlTZXRIeXBlcm9pZE1lbnUoIGhXbmQsIElETV9ORVcsIElETV9BQk9VVCApOw0KKw0KKwkvLyBzaG93IHRoZSBsaWNlbnNlLi4uDQorCWlmICghR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pMaWNlbnNlLCBGQUxTRSwgc3pJbmkgKSkNCisJew0KKwkJTWVzc2FnZUJlZXAoIEhZUEVST0lEX0hFTFBTVFlMRSApOw0KKwkJTWVzc2FnZUJveCggaFduZCwgSFlQRVJPSURfTElDRU5TRSwgIkh5cGVyb2lkIExpY2Vuc2UiLCBIWVBFUk9JRF9IRUxQU1RZTEUgKTsNCisJCS8vIC4uLmFuZCBuZXZlciBzaG93IGl0IGFnYWluICh1bmxlc3MgdGhleSB3YW50IHRvIHNlZSBpdCkNCisJCVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6QXBwTmFtZSwgc3pMaWNlbnNlLCAiMSIsIHN6SW5pICk7DQorCX0NCisNCisJcmV0dXJuKCBoV25kICk7DQorfQ0KKw0KKy8vDQorLy8gU2F2ZUh5cGVyb2lkV2luZG93UG9zIC0gd3JpdGUgb3V0IHRoZSAuaW5pIGluZm9ybWF0aW9uDQorLy8NCisNCitWT0lEIEZBUiBQQVNDQUwgU2F2ZUh5cGVyb2lkV2luZG93UG9zKCBIV05EIGhXbmQgKQ0KK3sNCisJUkVDVCAgICAgICAgICAgIHJlY3Q7DQorCUNIQVIgICAgICAgICAgICBzekJ1ZmZbMzJdOw0KKw0KKwkvLyBzYXZlIHRoZSBoaWdoc2NvcmUgcHJvZmlsZSBoZXJlIGZvciBsYWNrIG9mIGEgYmV0dGVyIHBsYWNlLi4uDQorCWlmIChsSGlnaFNjb3JlKQ0KKwl7DQorCQl3c3ByaW50Ziggc3pCdWZmLCAiJWx1IiwgbEhpZ2hTY29yZSApOw0KKwkJV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzekhpLCBzekJ1ZmYsIHN6SW5pICk7DQorCX0NCisNCisJaWYgKElzSWNvbmljKCBoV25kICkpIHJldHVybjsNCisJaWYgKElzWm9vbWVkKCBoV25kICkpDQorCXsNCisJCVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6QXBwTmFtZSwgc3pNYXgsICIxIiwgc3pJbmkgKTsNCisJCXJldHVybjsNCisJfQ0KKwllbHNlIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6QXBwTmFtZSwgc3pNYXgsIE5VTEwsIHN6SW5pICk7DQorDQorCUdldFdpbmRvd1JlY3QoIGhXbmQsICZyZWN0ICk7DQorCXdzcHJpbnRmKCBzekJ1ZmYsICIlZCIsIHJlY3QubGVmdCApOw0KKwlXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKCBzekFwcE5hbWUsIHN6WCwgc3pCdWZmLCBzekluaSApOw0KKwl3c3ByaW50Ziggc3pCdWZmLCAiJWQiLCByZWN0LnRvcCApOw0KKwlXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKCBzekFwcE5hbWUsIHN6WSwgc3pCdWZmLCBzekluaSApOw0KKwl3c3ByaW50Ziggc3pCdWZmLCAiJWQiLCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0ICk7DQorCVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6QXBwTmFtZSwgc3pXLCBzekJ1ZmYsIHN6SW5pICk7DQorCXdzcHJpbnRmKCBzekJ1ZmYsICIlZCIsIHJlY3QuYm90dG9tIC0gcmVjdC50b3AgKTsNCisJV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzekgsIHN6QnVmZiwgc3pJbmkgKTsNCit9DQorDQorLy8NCisvLyBHZXRIeXBlcm9pZEluaSAtIGxvYWQgdGhlIGluaSBmaWxlIGluZm9ybWF0aW9uDQorLy8NCisNCitWT0lEIEZBUiBQQVNDQUwgR2V0SHlwZXJvaWRJbmkoIFZPSUQgKQ0KK3sNCisJbkRyYXdEZWxheSA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6RHJhd0RlbGF5LCBEUkFXX0RFTEFZLCBzekluaSApOw0KKwl2a1NobGQgPSBHZXRQcml2YXRlUHJvZmlsZUludCggc3pLZXlzLCBzelNoaWVsZCwgVktfVEFCLCBzekluaSApOw0KKwl2a0Nsa3cgPSBHZXRQcml2YXRlUHJvZmlsZUludCggc3pLZXlzLCBzekNsb2Nrd2lzZSwgVktfTEVGVCwgc3pJbmkgKTsNCisJdmtDdHJDbGt3ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6S2V5cywgc3pDdHJDbG9ja3dpc2UsIFZLX1JJR0hULCBzekluaSApOw0KKwl2a1RocnN0ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6S2V5cywgc3pUaHJ1c3QsIFZLX0RPV04sIHN6SW5pICk7DQorCXZrUnZUaHJzdCA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzektleXMsIHN6UmV2VGhydXN0LCBWS19VUCwgc3pJbmkgKTsNCisJdmtGaXJlID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6S2V5cywgc3pGaXJlLCBWS19TUEFDRSwgc3pJbmkgKTsNCisJdmtCb21iID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6S2V5cywgc3pCb21iLCAnUycsIHN6SW5pICk7DQorfQ0KKw0KKy8vDQorLy8gSHlwZXJvaWRIZWxwIC0gc2hvdyBoZWxwDQorLy8NCisNCitWT0lEIEZBUiBQQVNDQUwgSHlwZXJvaWRIZWxwKCBIV05EIGhXbmQgKQ0KK3sNCisJTWVzc2FnZUJveCggaFduZCwgSFlQRVJPSURfSEVMUCwgIkh5cGVyb2lkIGhlbHAiLCBIWVBFUk9JRF9IRUxQU1RZTEUgKTsNCisJTWVzc2FnZUJveCggaFduZCwgSFlQRVJPSURfSEVMUDIsICJIeXBlcm9pZC5pbmkgaGVscCIsIEhZUEVST0lEX0hFTFBTVFlMRSApOw0KK30NCisNCisvLw0KKy8vIEh5cGVyb2lkQWJvdXREbGcgLSB0aGUgYWJvdXQgYm94IHByb2MNCisvLw0KKw0KK0JPT0wgRkFSIFBBU0NBTCBFWFBPUlQgSHlwZXJvaWRBYm91dERsZyggSFdORCBoRGxnLCBXT1JEIG1lc3MsDQorCQkJCQkJCQkJCSBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQ0KK3sNCisJc3dpdGNoIChtZXNzKQ0KKwl7DQorCWNhc2UgV01fSU5JVERJQUxPRzoNCisJCWlmIChsSGlnaFNjb3JlKQ0KKwkJew0KKwkJCUNIQVIgc3pCdWZmWzQwXTsNCisJCQl3c3ByaW50Ziggc3pCdWZmLCAiSGlnaCBTY29yZTogJTcuN2x1IiwgbEhpZ2hTY29yZSApOw0KKwkJCVNldERsZ0l0ZW1UZXh0KCBoRGxnLCBJRERfQV9ISVNDT1JFLCBzekJ1ZmYgKTsNCisJCX0NCisJCWJyZWFrOw0KKw0KKwljYXNlIFdNX0NPTU1BTkQ6DQorCQlzd2l0Y2ggKHdQYXJhbSkNCisJCXsNCisJCWNhc2UgSUREX0FfSEVMUDoNCisJCQlIeXBlcm9pZEhlbHAoIGhEbGcgKTsNCisJCQkvLyBmYWxsIHRocm91Z2guLi4NCisJCWNhc2UgSURPSzoNCisJCQlFbmREaWFsb2coIGhEbGcsIDAgKTsNCisJCQlicmVhazsNCisNCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuKCBGQUxTRSApOw0KKwkJfQ0KKwkJYnJlYWs7DQorDQorCWNhc2UgV01fQ0xPU0U6DQorCQlFbmREaWFsb2coIGhEbGcsIEZBTFNFICk7DQorCQlicmVhazsNCisNCisJZGVmYXVsdDoNCisJCXJldHVybiggRkFMU0UgKTsNCisJfQ0KKwlyZXR1cm4oIFRSVUUgKTsNCit9DQorDQorLy8NCisvLyBBYm91dEh5cGVyb2lkIC0gc2hvdyB0aGUgYWJvdXQgYm94DQorLy8NCisNCitWT0lEIEZBUiBQQVNDQUwgQWJvdXRIeXBlcm9pZCggSFdORCBoV25kICkNCit7DQorCUZBUlBST0MgbHBwcm9jQWJvdXQgPSBNYWtlUHJvY0luc3RhbmNlKCBIeXBlcm9pZEFib3V0RGxnLCBoQXBwSW5zdCApOw0KKwlEaWFsb2dCb3goIGhBcHBJbnN0LCBJTlRSRVMoIElERF9BQk9VVCApLCBoV25kLCBscHByb2NBYm91dCApOw0KKwlGcmVlUHJvY0luc3RhbmNlKCBscHByb2NBYm91dCApOw0KK30NCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL3Njb3JlLmJtcCBiL3Rlc3QvaHlwZXJvaWQvc2NvcmUuYm1wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTM1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2h5cGVyb2lkL3Njb3JlLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL3NoaWVsZC5ibXAgYi90ZXN0L2h5cGVyb2lkL3NoaWVsZC5ibXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxNjA2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHlwZXJvaWQvc2hpZWxkLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL3dpbmV4dC5oIGIvdGVzdC9oeXBlcm9pZC93aW5leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njk0OTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oeXBlcm9pZC93aW5leHQuaApAQCAtMCwwICsxLDEwOSBAQAorI2lmICFkZWZpbmVkKFdJTkVYVF9IKQ0KKyNkZWZpbmUgV0lORVhUX0gNCisNCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykNCitleHRlcm4gIkMiIHsNCisjZW5kaWYgLy8gX19jcGx1c3BsdXMNCisNCisvLw0KKy8vIFdJTkVYVC5IIC0gYWRkaXRpb25hbCB3aW5kb3dzIGRlZmluaXRpb25zDQorLy8NCisvLyBWZXJzaW9uIDEuMCAgMDMvMjEvODkgIENvcHlyaWdodCAoQykgMTk4OSw5MCw5MSBMYW50ZXJuIENvcm9wb3JhdGlvbi4NCisvLyBBdXRob3I6IEVkd2FyZCBIdXRjaGlucw0KKy8vIFN0YXR1czogRnJlZXdhcmUNCisvLyBSZXZpc2lvbnM6DQorLy8gMDYvMDYvOTAgbW9kaWZpZWQgSFVHRSB0byBMQVJHRSB0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGggbWF0aC5oDQorLy8gICAgICAgICAgYWxzbyBuZXN0ZWQgd2luZG93cy5oIGluY2x1ZGUgdG8gcHJldmVudCBtb2RpZmljYXRpb25zIG9uIHRoZQ0KKy8vICAgICAgICAgIGFjdHVhbCBzb3VyY2UgZmlsZSAtIEVkLg0KKy8vIDEwLzAxLzkwIGFkZGVkIENPTlNUIGFuZCBDT05TVFAsTlAsTFAsSFAgYW5kIGEgZmV3IGNvbW1lbnRzIC0gRWQuDQorLy8gMDgvMjgvOTEgYWRkZWQgRVhQT1JUIGFuZCBTRUdNRU5UIC0gRWQuDQorLy8gMTAvMjgvOTEgYWRkZWQgRExMRVhQIC0gRWQuDQorLy8gMTEvMDIvOTEgcG9zdGVkIG9uIENvbXB1c2VydmUgLSBFZC4NCisvLw0KKw0KKy8vDQorLy8gaW5jbHVkZSBXSU5ET1dTLkgsIGlmIG5lZWRlZA0KKy8vDQorDQorI2lmICFkZWZpbmVkKFdJTkRPV1NfSCkNCisJI2lmIGRlZmluZWQoTlVMTCkNCisJCSN1bmRlZiBOVUxMDQorCSNlbmRpZg0KKwkjaW5jbHVkZSA8d2luZG93cy5oPg0KKwkjaWYgIWRlZmluZWQoTlVMTCkNCisJCSNkZWZpbmUgTlVMTCAwDQorCSNlbmRpZg0KKwkjZGVmaW5lIFdJTkRPV1NfSA0KKyNlbmRpZiAvLyBXSU5ET1dTX0gNCisNCisvLw0KKy8vIGV4dHJhIGRhdGEgdHlwZXMgYW5kIGRlZmluZXMNCisvLw0KKw0KKyNkZWZpbmUgTEFSR0UgaHVnZQ0KKyNkZWZpbmUgQ0RFQ0wgY2RlY2wNCisjZGVmaW5lIENPTlNUIGNvbnN0DQorI2RlZmluZSBITlVMTCAoMCkNCisjZGVmaW5lIExQTlVMTCAoMEwpDQorDQordHlwZWRlZiBjaGFyICAgICAgICBDSEFSOw0KK3R5cGVkZWYgaW50ICAgICAgICAgSU5UOw0KK3R5cGVkZWYgZmxvYXQgICAgICAgRkxPQVQ7DQordHlwZWRlZiBkb3VibGUgICAgICBET1VCTEU7DQordHlwZWRlZiBsb25nIGRvdWJsZSBMRE9VQkxFOw0KKw0KKy8vIGV4dGVuZCB0aGUgc3RyaW5nIHR5cGUNCit0eXBlZGVmIENIQVIgTEFSR0UgICpIUFNUUjsNCisNCisvLyB1c2VmdWwgbWFjcm9zIGZvciB0eXBlZGVmaW5nIHBvaW50ZXJzIHRvIG9iamVjdHMgLy8NCisjZGVmaW5lIG5wb2ludGVyZGVmKG8pIHR5cGVkZWYgbyBORUFSICogTlAgIyMgbw0KKyNkZWZpbmUgbHBvaW50ZXJkZWYobykgdHlwZWRlZiBvIEZBUiAqIExQICMjIG8NCisjZGVmaW5lIGhwb2ludGVyZGVmKG8pIHR5cGVkZWYgbyBMQVJHRSAqIEhQICMjIG8NCisjZGVmaW5lIHBvaW50ZXJkZWYobykgbnBvaW50ZXJkZWYobyk7IGxwb2ludGVyZGVmKG8pOyBocG9pbnRlcmRlZihvKQ0KKw0KKy8vIGRlZmluZSB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIHBvaW50ZXJzIHRvIHRoaW5ncyAvLw0KK3BvaW50ZXJkZWYoIEJPT0wgKTsNCitucG9pbnRlcmRlZiggQllURSApOyBocHRyZGVmKCBCWVRFICk7DQorcG9pbnRlcmRlZiggQ0hBUiApOw0KK25wb2ludGVyZGVmKCBJTlQgKTsgaHBvaW50ZXJkZWYoIElOVCApOw0KK25wb2ludGVyZGVmKCBXT1JEICk7IGhwb2ludGVyZGVmKCBXT1JEICk7DQorbnBvaW50ZXJkZWYoIExPTkcgKTsgaHBvaW50ZXJkZWYoIExPTkcgKTsNCitucG9pbnRlcmRlZiggRFdPUkQgKTsgaHBvaW50ZXJkZWYoIERXT1JEICk7DQorcG9pbnRlcmRlZiggRkxPQVQgKTsNCitwb2ludGVyZGVmKCBET1VCTEUgKTsNCitwb2ludGVyZGVmKCBMRE9VQkxFICk7DQorbnBvaW50ZXJkZWYoIEhBTkRMRSApOyBocG9pbnRlcmRlZiggSEFORExFICk7DQorbnBvaW50ZXJkZWYoIFZPSUQgKTsgaHBvaW50ZXJkZWYoIFZPSUQgKTsNCisNCisvLyB0aGVzZSBhcmUgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSAtIHVzZSBOUFZPSUQgZXRjLi4uDQordHlwZWRlZiBWT0lEIE5FQVIgKk5QTUVNOw0KK3R5cGVkZWYgVk9JRCBGQVIgKkxQTUVNOw0KKw0KKy8vIHdpbmRvdyBwcm9jIGZ1bmN0aW9uIHBvaW50ZXINCit0eXBlZGVmIExPTkcgKEZBUiBQQVNDQUwgKldORFBST0MpKCBIV05ELCB1bnNpZ25lZCwgV09SRCwgTE9ORyApOw0KKw0KKy8vDQorLy8gc2NvcGUgcHJvdG9jb2wgZGVmaW5pdGlvbnMNCisvLw0KKw0KKyNkZWZpbmUgR0xPQkFMICAgICAgLy8gR0xPQkFMDQorI2RlZmluZSBMT0NBTCAgICAgICBzdGF0aWMNCisjZGVmaW5lIElNUE9SVCAgICAgIGV4dGVybg0KKyNkZWZpbmUgRlJPTSh3aGVyZSkgLy8gRlJPTSB3aGVyZQ0KKyNkZWZpbmUgUFJPVE8gICAgICAgLy8gUFJPVE9UWVBFDQorDQorI2RlZmluZSBFWFBPUlQgX2V4cG9ydA0KKyNkZWZpbmUgU0VHTUVOVCBfc2VnbWVudA0KKw0KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQ0KK30NCisjZW5kaWYgLy8gX19jcGx1c3BsdXMNCisNCisvLyBjKysgY2xhc3MgZXhwb3J0IHR5cGUNCisjaWYgZGVmaW5lZChfX0RMTF9fKQ0KKyNkZWZpbmUgRExMRVhQIEVYUE9SVA0KKyNlbHNlDQorI2RlZmluZSBETExFWFAgTEFSR0UNCisjZW5kaWYNCisNCisjZW5kaWYgLy8gV0lORVhUX0gNCmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCAwMGE1NTBmLi5kMTNjNzE3IDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTYwNiw2ICs2MDYsOCBAQAogCiAgICAgZnByaW50ZihmcCwgIlx0Lmdsb2JsIF8lc19EaXNwYXRjaFxuIiwgVXBwZXJETExOYW1lKTsKICAgICBmcHJpbnRmKGZwLCAiXyVzX0Rpc3BhdGNoOlxuIiwgVXBwZXJETExOYW1lKTsKKyAgICBmcHJpbnRmKGZwLCAiXHRhbmRsXHQkMHgwMDAwZmZmZiwlJWVzcFxuIik7CisgICAgZnByaW50ZihmcCwgIlx0YW5kbFx0JDB4MDAwMGZmZmYsJSVlYnBcbiIpOwogICAgIGZwcmludGYoZnAsICJcdG9ybFx0JDB4JTA4eCwlJWVheFxuIiwgRExMSWQgPDwgMTYpOwogICAgIGZwcmludGYoZnAsICJcdGptcFx0X0NhbGxUbzMyXG5cbiIpOwogCkBAIC02MTcsOCArNjE5LDEwIEBACiAJaWYgKCFvZHAtPnZhbGlkKQogCXsKIAkgICAgZnByaW50ZihmcCwgIl8lc19PcmRpbmFsXyVkOlxuIiwgVXBwZXJETExOYW1lLCBpKTsKKyNpZmRlZiBCT0JfU0FZU19OTwogCSAgICBmcHJpbnRmKGZwLCAiXHRhbmRsXHQkMHgwMDAwZmZmZiwlJWVzcFxuIik7CiAJICAgIGZwcmludGYoZnAsICJcdGFuZGxcdCQweDAwMDBmZmZmLCUlZWJwXG4iKTsKKyNlbmRpZgogCSAgICBmcHJpbnRmKGZwLCAiXHRtb3ZsXHQkJWQsJSVlYXhcbiIsIGkpOwogCSAgICBmcHJpbnRmKGZwLCAiXHRwdXNod1x0JDBcbiIpOwogCSAgICBmcHJpbnRmKGZwLCAiXHRqbXBcdF8lc19EaXNwYXRjaFxuXG4iLCBVcHBlckRMTE5hbWUpOwpAQCAtNjg0LDggKzY4OCwxMCBAQAogCiAJICAgICAgY2FzZSBGVU5DVFlQRV9QQVNDQUw6CiAJCWZwcmludGYoZnAsICJfJXNfT3JkaW5hbF8lZDpcbiIsIFVwcGVyRExMTmFtZSwgaSk7CisjaWZkZWYgQk9CX1NBWVNfTk8KIAkJZnByaW50ZihmcCwgIlx0YW5kbFx0JDB4MDAwMGZmZmYsJSVlc3BcbiIpOwogCQlmcHJpbnRmKGZwLCAiXHRhbmRsXHQkMHgwMDAwZmZmZiwlJWVicFxuIik7CisjZW5kaWYKIAkJZnByaW50ZihmcCwgIlx0bW92bFx0JCVkLCUlZWF4XG4iLCBpKTsKIAkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCQlZFxuIiwgZmRwLT5hcmdfMTZfc2l6ZSk7CiAJCWZwcmludGYoZnAsICJcdGptcFx0XyVzX0Rpc3BhdGNoXG5cbiIsIFVwcGVyRExMTmFtZSk7CkBAIC02OTQsOCArNzAwLDEwIEBACiAJICAgICAgY2FzZSBGVU5DVFlQRV9DOgogCSAgICAgIGRlZmF1bHQ6CiAJCWZwcmludGYoZnAsICJfJXNfT3JkaW5hbF8lZDpcbiIsIFVwcGVyRExMTmFtZSwgaSk7CisjaWZkZWYgQk9CX1NBWVNfTk8KIAkJZnByaW50ZihmcCwgIlx0YW5kbFx0JDB4MDAwMGZmZmYsJSVlc3BcbiIpOwogCQlmcHJpbnRmKGZwLCAiXHRhbmRsXHQkMHgwMDAwZmZmZiwlJWVicFxuIik7CisjZW5kaWYKIAkJZnByaW50ZihmcCwgIlx0bW92bFx0JCVkLCUlZWF4XG4iLCBpKTsKIAkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCQwXG4iKTsKIAkJZnByaW50ZihmcCwgIlx0am1wXHRfJXNfRGlzcGF0Y2hcblxuIiwgVXBwZXJETExOYW1lKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvTWFrZWZpbGUgYi93aW5kb3dzL01ha2VmaWxlCmluZGV4IDJkYzc2MTYuLmY3ZGUxNzIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvTWFrZWZpbGUKKysrIGIvd2luZG93cy9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIENGTEFHUz0kKENPUFRTKSAkKERFQlVHT1BUUykgLUkkKElOQ0xVREVfRElSKQogCiBPQkpTPWNsYXNzLm8gZGMubyBkY2UubyBldmVudC5vIG1lc3NhZ2UubyB3aW4ubyB0aW1lci5vIGdyYXBoaWNzLm8gXAotICAgIAljbGlwcGluZy5vIG1hcHBpbmcubyBwYWludGluZy5vIGtleWJvYXJkLm8gdXRpbGl0eS5vCisgICAgCWNsaXBwaW5nLm8gbWFwcGluZy5vIHBhaW50aW5nLm8ga2V5Ym9hcmQubyB1dGlsaXR5Lm8gc3lzY29sb3IubwogCiBkZWZhdWx0OiB3aW5kb3dzLm8KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGFzcy5jIGIvd2luZG93cy9jbGFzcy5jCmluZGV4IDE3ZDM2ZTAuLjIzYTJjNDkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2xhc3MuYworKysgYi93aW5kb3dzL2NsYXNzLmMKQEAgLTY2LDEwICs2NiwxMyBAQAogICAgIG5ld0NsYXNzLT5oTmV4dCAgICAgID0gZmlyc3RDbGFzczsKICAgICBuZXdDbGFzcy0+d01hZ2ljICAgICA9IENMQVNTX01BR0lDOwogICAgIG5ld0NsYXNzLT5hdG9tTmFtZSAgID0gaGFuZGxlOyAgLyogU2hvdWxkIGJlIGFuIGF0b20gKi8KLSAgICBuZXdDbGFzcy0+aERDRSAgICAgICA9IDA7ICAvKiBTaG91bGQgYWxsb2NhdGUgYSBEQ0UgaWYgbmVlZGVkICovCiAgICAgbmV3Q2xhc3MtPmNXaW5kb3dzICAgPSAwOyAgCiAgICAgbmV3Q2xhc3MtPndjICAgICAgICAgPSAqY2xhc3M7Ci0gICAgICAgIAorCisgICAgaWYgKG5ld0NsYXNzLT53Yy5zdHlsZSAmIENTX0NMQVNTREMpCisJbmV3Q2xhc3MtPmhkYyA9IENyZWF0ZURDKCAiRElTUExBWSIsIE5VTEwsIE5VTEwsIE5VTEwgKTsKKyAgICBlbHNlIG5ld0NsYXNzLT5oZGMgPSAwOworCiAgICAgICAvKiBDbGFzcyBuYW1lIHNob3VsZCBhbHNvIGJlIHNldCB0byB6ZXJvLiBGb3Igbm93IHdlIG5lZWQgdGhlCiAgICAgICAgKiBuYW1lIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhdG9tcy4KICAgICAgICAqLwpAQCAtMTEzLDcgKzExNiwxMCBAQAogCX0KIAlwcmV2Q2xhc3NQdHItPmhOZXh0ID0gY2xhc3NQdHItPmhOZXh0OwogICAgIH0KLSAgICAKKworICAgICAgLyogRGVsZXRlIHRoZSBjbGFzcyAqLworICAgIGlmIChjbGFzc1B0ci0+aGRjKSBEZWxldGVEQyggY2xhc3NQdHItPmhkYyApOworICAgIGlmIChjbGFzc1B0ci0+d2MuaGJyQmFja2dyb3VuZCkgRGVsZXRlT2JqZWN0KCBjbGFzc1B0ci0+d2MuaGJyQmFja2dyb3VuZCApOwogICAgIFVTRVJfSEVBUF9GUkVFKCBjbGFzcyApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTM1LDE2ICsxNDEsMTMgQEAKIHsKICAgICBDTEFTUyAqIGNsYXNzUHRyOwogICAgIFdORCAqIHduZFB0cjsKLSAgICBXT1JEIHJldHZhbCA9IDA7CisgICAgV09SRCAqcHRyLCByZXR2YWwgPSAwOwogICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKLSAgICBpZiAoKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkKLSAgICB7Ci0JV09SRCAqIHB0ciA9IChXT1JEICopKCgoY2hhciAqKWNsYXNzUHRyLT53RXh0cmEpICsgb2Zmc2V0KTsKLQlyZXR2YWwgPSAqcHRyOwotCSpwdHIgPSBuZXd2YWw7Ci0gICAgfQotICAgIEdsb2JhbFVubG9jayggaHduZCApOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDA7CisgICAgcHRyID0gKFdPUkQgKikoKChjaGFyICopY2xhc3NQdHItPndFeHRyYSkgKyBvZmZzZXQpOworICAgIHJldHZhbCA9ICpwdHI7CisgICAgKnB0ciA9IG5ld3ZhbDsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xNTYsMTMgKzE1OSwxMCBAQAogewogICAgIENMQVNTICogY2xhc3NQdHI7CiAgICAgV05EICogd25kUHRyOwotICAgIExPTkcgcmV0dmFsID0gMDsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKChjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKSkpCi0JcmV0dmFsID0gKihMT05HICopKCgoY2hhciAqKWNsYXNzUHRyLT53RXh0cmEpICsgb2Zmc2V0KTsKLSAgICBHbG9iYWxVbmxvY2soIGh3bmQgKTsKLSAgICByZXR1cm4gcmV0dmFsOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuICooTE9ORyAqKSgoKGNoYXIgKiljbGFzc1B0ci0+d0V4dHJhKSArIG9mZnNldCk7CiB9CiAKIApAQCAtMTczLDE1ICsxNzMsMTIgQEAKIHsKICAgICBDTEFTUyAqIGNsYXNzUHRyOwogICAgIFdORCAqIHduZFB0cjsKLSAgICBMT05HIHJldHZhbCA9IDA7CisgICAgTE9ORyAqcHRyLCByZXR2YWwgPSAwOwogICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKLSAgICBpZiAoKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkKLSAgICB7Ci0JTE9ORyAqIHB0ciA9IChMT05HICopKCgoY2hhciAqKWNsYXNzUHRyLT53RXh0cmEpICsgb2Zmc2V0KTsKLQlyZXR2YWwgPSAqcHRyOwotCSpwdHIgPSBuZXd2YWw7Ci0gICAgfQotICAgIEdsb2JhbFVubG9jayggaHduZCApOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDA7CisgICAgcHRyID0gKExPTkcgKikoKChjaGFyICopY2xhc3NQdHItPndFeHRyYSkgKyBvZmZzZXQpOworICAgIHJldHZhbCA9ICpwdHI7CisgICAgKnB0ciA9IG5ld3ZhbDsKICAgICByZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGlwcGluZy5jIGIvd2luZG93cy9jbGlwcGluZy5jCmluZGV4IDgwYjE5ZDIuLjIxMjZjMjggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2xpcHBpbmcuYworKysgYi93aW5kb3dzL2NsaXBwaW5nLmMKQEAgLTEwNywxMiArMTA3LDkgQEAKICAqLwogQk9PTCBHZXRVcGRhdGVSZWN0KCBIV05EIGh3bmQsIExQUkVDVCByZWN0LCBCT09MIGVyYXNlICkKIHsKLSAgICBCT09MIHJldHZhbDsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CiAKLSAgICByZXR2YWwgPSAod25kUHRyLT5ocmduVXBkYXRlICE9IDApOwotCiAgICAgaWYgKHJlY3QpCiAgICAgewogICAgICAgICBpZiAod25kUHRyLT5ocmduVXBkYXRlKSBHZXRSZ25Cb3goIHduZFB0ci0+aHJnblVwZGF0ZSwgcmVjdCApOwpAQCAtMTI3LDggKzEyNCw3IEBACiAJICAgIH0KIAl9CiAgICAgfQotICAgIEdsb2JhbFVubG9jayggaHduZCApOwotICAgIHJldHVybiByZXR2YWw7CisgICAgcmV0dXJuICh3bmRQdHItPmhyZ25VcGRhdGUgIT0gMCk7CiB9CiAKIApAQCAtMTM3LDcgKzEzMyw2IEBACiAgKi8KIGludCBHZXRVcGRhdGVSZ24oIEhXTkQgaHduZCwgSFJHTiBocmduLCBCT09MIGVyYXNlICkKIHsKLSAgICBpbnQgcmV0dmFsOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgaWYgKCF3bmRQdHIpIHJldHVybiBFUlJPUjsKIApAQCAtMTUwLDcgKzE0NSw1IEBACiAJICAgIFJlbGVhc2VEQyggaHduZCwgaGRjICk7CiAJfQogICAgIH0KLSAgICByZXR2YWwgPSBDb21iaW5lUmduKCBocmduLCB3bmRQdHItPmhyZ25VcGRhdGUsIDAsIFJHTl9DT1BZICk7Ci0gICAgR2xvYmFsVW5sb2NrKCBod25kICk7Ci0gICAgcmV0dXJuIHJldHZhbDsgICAgCisgICAgcmV0dXJuIENvbWJpbmVSZ24oIGhyZ24sIHduZFB0ci0+aHJnblVwZGF0ZSwgMCwgUkdOX0NPUFkgKTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IGQwMDE5YjIuLmFhZWE0YjAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtNyw4ICs3LDEwIEBACiBzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIEFsZXhhbmRyZSBKdWxsaWFyZCwgMTk5MyI7CiAKICNpbmNsdWRlICJkY2UuaCIKKyNpbmNsdWRlICJjbGFzcy5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgInVzZXIuaCIKIAogCiAjZGVmaW5lIE5CX0RDRSAgICA1ICAvKiBOdW1iZXIgb2YgRENFcyBjcmVhdGVkIGF0IHN0YXJ0dXAgKi8KQEAgLTMxLDE0ICszMywxMyBAQAogICAgICAgICAKICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfRENFOyBpKyspCiAgICAgewotCWhhbmRsZSA9IEdsb2JhbEFsbG9jKCBHTUVNX01PVkVBQkxFLCBzaXplb2YoRENFKSApOworCWhhbmRsZSA9IFVTRVJfSEVBUF9BTExPQyggR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKERDRSkgKTsKIAlpZiAoIWhhbmRsZSkgcmV0dXJuOwotCWRjZSA9IChEQ0UgKikgR2xvYmFsTG9jayggaGFuZGxlICk7CisJZGNlID0gKERDRSAqKSBVU0VSX0hFQVBfQUREUiggaGFuZGxlICk7CiAJZGNlLT5oZGMgPSBDcmVhdGVEQyggIkRJU1BMQVkiLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAJaWYgKCFkY2UtPmhkYykKIAl7Ci0JICAgIEdsb2JhbFVubG9jayggaGFuZGxlICk7Ci0JICAgIEdsb2JhbEZyZWUoIGhhbmRsZSApOworCSAgICBVU0VSX0hFQVBfRlJFRSggaGFuZGxlICk7CiAJICAgIHJldHVybjsKIAl9CiAJZGNlLT5od25kQ3VycmVudCA9IDA7CkBAIC00OSw3ICs1MCw2IEBACiAJZGNlLT5oTmV4dCA9IGZpcnN0RENFOwogCWZpcnN0RENFID0gaGFuZGxlOwogCWlmICghZGVmYXVsdERDc3RhdGUpIGRlZmF1bHREQ3N0YXRlID0gR2V0RENTdGF0ZSggZGNlLT5oZGMgKTsKLQlHbG9iYWxVbmxvY2soIGhhbmRsZSApOwogICAgIH0KIH0KIApAQCAtNTksNTggKzU5LDU0IEBACiAgKi8KIEhEQyBHZXREQyggSFdORCBod25kICkKIHsKLSAgICBIQU5ETEUgaGRjZSwgbmV4dDsKLSAgICBIREMgaGRjOworICAgIEhBTkRMRSBoZGNlOworICAgIEhEQyBoZGMgPSAwOwogICAgIERDRSAqIGRjZTsKICAgICBEQyAqIGRjOwogICAgIFdORCAqIHduZFB0ciA9IE5VTEw7CisgICAgQ0xBU1MgKiBjbGFzc1B0cjsKICAgICAKICAgICBpZiAoaHduZCkKICAgICB7Ci0Jd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLQlpZiAoIXduZFB0cikgcmV0dXJuIDA7CisJaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAwOworCWlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDA7CisJaWYgKHduZFB0ci0+aGRjKSBoZGMgPSB3bmRQdHItPmhkYzsKKwllbHNlIGlmIChjbGFzc1B0ci0+aGRjKSBoZGMgPSBjbGFzc1B0ci0+aGRjOwogICAgIH0KICAgICAgICAgCi0gICAgZm9yIChoZGNlID0gZmlyc3REQ0U7IChoZGNlKTsgaGRjZSA9IG5leHQpCisgICAgaWYgKCFoZGMpCiAgICAgewotCWRjZSA9IChEQ0UgKikgR2xvYmFsTG9jayggaGRjZSApOwotCWlmICghZGNlKSByZXR1cm4gMDsKLQlpZiAoIWRjZS0+aW5Vc2UpIGJyZWFrOwotCW5leHQgPSBkY2UtPmhOZXh0OwotCUdsb2JhbFVubG9jayggaGRjZSApOwotICAgIH0KLQotICAgIGlmICghaGRjZSkKLSAgICB7Ci0JaWYgKGh3bmQpIEdsb2JhbFVubG9jayggaHduZCApOwotCXJldHVybiAwOworCWZvciAoaGRjZSA9IGZpcnN0RENFOyAoaGRjZSk7IGhkY2UgPSBkY2UtPmhOZXh0KQorCXsKKwkgICAgZGNlID0gKERDRSAqKSBVU0VSX0hFQVBfQUREUiggaGRjZSApOworCSAgICBpZiAoIWRjZSkgcmV0dXJuIDA7CisJICAgIGlmICghZGNlLT5pblVzZSkgYnJlYWs7CisJfQorCWlmICghaGRjZSkgcmV0dXJuIDA7CisJZGNlLT5od25kQ3VycmVudCA9IGh3bmQ7CisJZGNlLT5pblVzZSAgICAgICA9IFRSVUU7CisJaGRjID0gZGNlLT5oZGM7CiAgICAgfQogICAgIAogICAgICAgLyogSW5pdGlhbGl6ZSBEQyAqLwogICAgIAotICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGRjZS0+aGRjLCBEQ19NQUdJQyApOwotICAgIGlmICghZGMpCi0gICAgewotCWlmIChod25kKSBHbG9iYWxVbmxvY2soIGh3bmQgKTsKLQlyZXR1cm4gMDsKLSAgICB9CisgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggZGNlLT5oZGMsIERDX01BR0lDICkpKSByZXR1cm4gMDsKKwogICAgIGlmICh3bmRQdHIpCiAgICAgewogCWRjLT51LnguZHJhd2FibGUgPSBYdFdpbmRvdyggd25kUHRyLT53aW5XaWRnZXQgKTsKICAgICAJZGMtPnUueC53aWRnZXQgICA9IHduZFB0ci0+d2luV2lkZ2V0OworCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DTElQQ0hJTERSRU4pCisJICAgIFhTZXRTdWJ3aW5kb3dNb2RlKCBYVF9kaXNwbGF5LCBkYy0+dS54LmdjLCBDbGlwQnlDaGlsZHJlbiApOworCWVsc2UgWFNldFN1YndpbmRvd01vZGUoIFhUX2Rpc3BsYXksIGRjLT51LnguZ2MsIEluY2x1ZGVJbmZlcmlvcnMpOwogICAgIH0KICAgICBlbHNlCiAgICAgewogCWRjLT51LnguZHJhd2FibGUgPSBEZWZhdWx0Um9vdFdpbmRvdyggWFRfZGlzcGxheSApOwogCWRjLT51Lngud2lkZ2V0ICAgPSAwOworCVhTZXRTdWJ3aW5kb3dNb2RlKCBYVF9kaXNwbGF5LCBkYy0+dS54LmdjLCBJbmNsdWRlSW5mZXJpb3JzICk7ICAgIAogICAgIH0gICAKLSAgICBTZXREQ1N0YXRlKCBkY2UtPmhkYywgZGVmYXVsdERDc3RhdGUgKTsKIAotICAgIGRjZS0+aHduZEN1cnJlbnQgPSBod25kOwotICAgIGRjZS0+aW5Vc2UgICAgICAgPSBUUlVFOwotICAgIGhkYyA9IGRjZS0+aGRjOwotICAgIEdsb2JhbFVubG9jayggaGRjZSApOwotICAgIGlmIChod25kKSBHbG9iYWxVbmxvY2soIGh3bmQgKTsKICNpZmRlZiBERUJVR19XSU4KICAgICBwcmludGYoICJHZXREQyglZCk6IHJldHVybmluZyAlZFxuIiwgaHduZCwgaGRjICk7CiAjZW5kaWYKQEAgLTEyNiw2ICsxMjIsNyBAQAogICAgIEhBTkRMRSBoZGNlLCBuZXh0OwogICAgIERDRSAqIGRjZTsKICAgICBXTkQgKiB3bmRQdHIgPSBOVUxMOworICAgIENMQVNTICogY2xhc3NQdHI7CiAgICAgCiAjaWZkZWYgREVCVUdfV0lOCiAgICAgcHJpbnRmKCAiUmVsZWFzZURDOiAlZCAlZFxuIiwgaHduZCwgaGRjICk7CkBAIC0xMzMsMjUgKzEzMCwyMiBAQAogICAgICAgICAKICAgICBpZiAoaHduZCkKICAgICB7Ci0Jd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLQlpZiAoIXduZFB0cikgcmV0dXJuIDA7CisJaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAwOworCWlmICh3bmRQdHItPmhkYyAmJiAod25kUHRyLT5oZGMgPT0gaGRjKSkgcmV0dXJuIDE7CisJaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NQdHIoIHduZFB0ci0+aENsYXNzICkpKSByZXR1cm4gMDsKKwlpZiAoY2xhc3NQdHItPmhkYyAmJiAoY2xhc3NQdHItPmhkYyA9PSBoZGMpKSByZXR1cm4gMTsKICAgICB9CiAKLSAgICBmb3IgKGhkY2UgPSBmaXJzdERDRTsgKGhkY2UpOyBoZGNlID0gbmV4dCkKKyAgICBmb3IgKGhkY2UgPSBmaXJzdERDRTsgKGhkY2UpOyBoZGNlID0gZGNlLT5oTmV4dCkKICAgICB7Ci0JZGNlID0gKERDRSAqKSBHbG9iYWxMb2NrKCBoZGNlICk7Ci0JaWYgKCFkY2UpIHJldHVybiAwOworCWlmICghKGRjZSA9IChEQ0UgKikgVVNFUl9IRUFQX0FERFIoIGhkY2UgKSkpIHJldHVybiAwOwogCWlmIChkY2UtPmluVXNlICYmIChkY2UtPmhkYyA9PSBoZGMpKSBicmVhazsKLQluZXh0ID0gZGNlLT5oTmV4dDsKLQlHbG9iYWxVbmxvY2soIGhkY2UgKTsKICAgICB9CiAKLSAgICBpZiAoaGRjZSkgCisgICAgaWYgKGhkY2UpCiAgICAgeworCVNldERDU3RhdGUoIGRjZS0+aGRjLCBkZWZhdWx0RENzdGF0ZSApOwogCWRjZS0+aW5Vc2UgPSBGQUxTRTsKLSAgICAJR2xvYmFsVW5sb2NrKCBoZGNlICk7Ci0gICAgfQotCi0gICAgaWYgKGh3bmQpIEdsb2JhbFVubG9jayggaHduZCApOworICAgIH0gICAgCiAgICAgcmV0dXJuIChoZGNlICE9IDApOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IGVhMGJmYzQuLjEzOGYwNTcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJjbGFzcy5oIgogCiAKICNkZWZpbmUgTkJfQlVUVE9OUyAgICAgIDMgICAgIC8qIFdpbmRvd3MgY2FuIGhhbmRsZSAzIGJ1dHRvbnMgKi8KQEAgLTE3NSw3ICsxNzYsMTUgQEAKICAgICB7ICAvKiBDaGVjayBpZiBkb3VibGUtY2xpY2sgKi8KIAlwcmV2VGltZSA9IGxhc3RDbGlja1RpbWVbYnV0dG9uTnVtXTsKIAlsYXN0Q2xpY2tUaW1lW2J1dHRvbk51bV0gPSBldmVudC0+dGltZTsKLQl0eXBlID0gKGV2ZW50LT50aW1lIC0gcHJldlRpbWUgPCBEQkxDTElDS19USU1FKSA/IDIgOiAwOworCWlmIChldmVudC0+dGltZSAtIHByZXZUaW1lIDwgREJMQ0xJQ0tfVElNRSkKKwl7CisJICAgIFdORCAqIHduZFB0cjsKKwkgICAgQ0xBU1MgKiBjbGFzc1B0cjsKKwkgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybjsKKwkgICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NQdHIoIHduZFB0ci0+aENsYXNzICkpKSByZXR1cm47CisJICAgIHR5cGUgPSAoY2xhc3NQdHItPndjLnN0eWxlICYgQ1NfREJMQ0xLUykgPyAyIDogMDsKKwl9CisJZWxzZSB0eXBlID0gMDsKICAgICB9CQogICAgIAogICAgIG1zZy5od25kICAgID0gaHduZDsKQEAgLTIzNyw3ICsyNDYsNiBAQAogCQkgICAgICAgQnV0dG9uUHJlc3NNYXNrIHwgQnV0dG9uUmVsZWFzZU1hc2sgfCBCdXR0b25Nb3Rpb25NYXNrLAogCQkgICAgICAgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVTeW5jLCBOb25lLCBOb25lLCBDdXJyZW50VGltZSk7CiAKLSAgICBHbG9iYWxVbmxvY2sod25kKTsKICAgICBpZiAocnYgPT0gR3JhYlN1Y2Nlc3MpCiAgICAgewogCWNhcHR1cmVXbmQgPSB3bmQ7CkBAIC0yNjMsNiArMjcxLDUgQEAKICAgICAKICAgICBYdFVuZ3JhYlBvaW50ZXIod25kX3AtPndpbldpZGdldCwgQ3VycmVudFRpbWUpOwogCi0gICAgR2xvYmFsVW5sb2NrKGNhcHR1cmVXbmQpOwogICAgIGNhcHR1cmVXbmQgPSAwOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ncmFwaGljcy5jIGIvd2luZG93cy9ncmFwaGljcy5jCmluZGV4IGNmMzM5YjkuLjMzODczM2EgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZ3JhcGhpY3MuYworKysgYi93aW5kb3dzL2dyYXBoaWNzLmMKQEAgLTIyNiw2ICsyMjYsMzQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGcmFtZVJlY3QgICAgKFVTRVIuODMpCisgKi8KK2ludCBGcmFtZVJlY3QoIEhEQyBoZGMsIExQUkVDVCByZWN0LCBIQlJVU0ggaGJydXNoICkKK3sKKyAgICBIQlJVU0ggcHJldkJydXNoOworICAgIGludCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoKHJlY3QtPnJpZ2h0IDw9IHJlY3QtPmxlZnQpIHx8IChyZWN0LT5ib3R0b20gPD0gcmVjdC0+dG9wKSkgcmV0dXJuIDA7CisgICAgaWYgKCEocHJldkJydXNoID0gU2VsZWN0T2JqZWN0KCBoZGMsIGhicnVzaCApKSkgcmV0dXJuIDA7CisgICAgCisgICAgbGVmdCAgID0gWExQVE9EUCggZGMsIHJlY3QtPmxlZnQgKTsKKyAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgcmVjdC0+dG9wICk7CisgICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJlY3QtPnJpZ2h0ICk7CisgICAgYm90dG9tID0gWUxQVE9EUCggZGMsIHJlY3QtPmJvdHRvbSApOworICAgIAorICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCisJWERyYXdSZWN0YW5nbGUoIFhUX2Rpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgICAgICAgbGVmdCwgdG9wLCByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSApOworCSAgICAKKyAgICBTZWxlY3RPYmplY3QoIGhkYywgcHJldkJydXNoICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0UGl4ZWwgICAgKEdESS4zMSkKICAqLwogQ09MT1JSRUYgU2V0UGl4ZWwoIEhEQyBoZGMsIHNob3J0IHgsIHNob3J0IHksIENPTE9SUkVGIGNvbG9yICkKQEAgLTI0Miw2ICsyNzAsNyBAQAogICAgIEdldFBhbGV0dGVFbnRyaWVzKCBkYy0+dy5oUGFsZXR0ZSwgcGl4ZWwsIDEsICZlbnRyeSApOwogICAgIAogICAgIFhTZXRGb3JlZ3JvdW5kKCBYVF9kaXNwbGF5LCBkYy0+dS54LmdjLCBwaXhlbCApOworICAgIFhTZXRGdW5jdGlvbiggWFRfZGlzcGxheSwgZGMtPnUueC5nYywgR1hjb3B5ICk7CiAgICAgWERyYXdQb2ludCggWFRfZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgeCwgeSApOwogCiAgICAgcmV0dXJuIFJHQiggZW50cnkucGVSZWQsIGVudHJ5LnBlR3JlZW4sIGVudHJ5LnBlQmx1ZSApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCBhMTI4OGM1Li43MzA3NDYxIDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMzUwLDE1ICszNTAsOSBAQAogICovCiBMT05HIFNlbmRNZXNzYWdlKCBIV05EIGh3bmQsIFdPUkQgbXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQogewotICAgIExPTkcgcmV0dmFsID0gMDsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICh3bmRQdHIpCi0gICAgewotCXJldHZhbCA9IENhbGxXaW5kb3dQcm9jKCB3bmRQdHItPmxwZm5XbmRQcm9jLCBod25kLCBtc2csIAotCQkJCSB3UGFyYW0sIGxQYXJhbSApOwotCUdsb2JhbFVubG9jayggaHduZCApOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOworICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKKyAgICByZXR1cm4gQ2FsbFdpbmRvd1Byb2MoIHduZFB0ci0+bHBmblduZFByb2MsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKIH0KIAogCkBAIC0zODYsNyArMzgwLDYgQEAKICAqLwogTE9ORyBEaXNwYXRjaE1lc3NhZ2UoIExQTVNHIG1zZyApCiB7Ci0gICAgTE9ORyByZXR2YWwgPSAwOwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBtc2ctPmh3bmQgKTsKIAogI2lmZGVmIERFQlVHX01TRwpAQCAtMzk0LDEzICszODcsOSBAQAogCSAgICBtc2ctPmh3bmQsIG1zZy0+bWVzc2FnZSwgbXNnLT53UGFyYW0sIG1zZy0+bFBhcmFtLCAKIAkgICAgbXNnLT50aW1lLCBtc2ctPnB0LngsIG1zZy0+cHQueSApOwogI2VuZGlmCi0gICAgaWYgKHduZFB0cikgCi0gICAgewotCXJldHZhbCA9IENhbGxXaW5kb3dQcm9jKHduZFB0ci0+bHBmblduZFByb2MsIG1zZy0+aHduZCwgbXNnLT5tZXNzYWdlLAotCQkJCW1zZy0+d1BhcmFtLCBtc2ctPmxQYXJhbSApOwotCUdsb2JhbFVubG9jayggbXNnLT5od25kICk7Ci0gICAgfQotICAgIHJldHVybiByZXR2YWw7CisgICAgaWYgKCF3bmRQdHIpICByZXR1cm4gMDsKKyAgICByZXR1cm4gQ2FsbFdpbmRvd1Byb2MoIHduZFB0ci0+bHBmblduZFByb2MsIG1zZy0+aHduZCwgbXNnLT5tZXNzYWdlLAorCQkJICAgbXNnLT53UGFyYW0sIG1zZy0+bFBhcmFtICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDA1MGE1Y2IuLjRmMjFiMTMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKICAgICBpZiAoISh3bmRQdHItPmZsYWdzICYgV0lOX0VSQVNFX1VQREFURVJHTikpIGxwcy0+ZkVyYXNlID0gVFJVRTsKICAgICBlbHNlIGxwcy0+ZkVyYXNlID0gIVNlbmRNZXNzYWdlKCBod25kLCBXTV9FUkFTRUJLR05ELCBscHMtPmhkYywgMCApOwogCi0gICAgR2xvYmFsVW5sb2NrKCBod25kICk7CiAgICAgcmV0dXJuIGxwcy0+aGRjOwogfQogCkBAIC03MSw3ICs3MCw2IEBACiAgICAgcmVjdC5yaWdodCAgPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKICAgICByZWN0LmJvdHRvbSA9IHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLSB3bmRQdHItPnJlY3RDbGllbnQudG9wOwogICAgIFBhaW50UmVjdCggaHduZFBhcmVudCwgaHduZCwgaGRjLCBoYnJ1c2gsICZyZWN0ICk7Ci0gICAgR2xvYmFsVW5sb2NrKCBod25kICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9zeXNjb2xvci5jIGIvd2luZG93cy9zeXNjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTRmZDEKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL3N5c2NvbG9yLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBzeXN0ZW0gY29sb3JzCisgKgorICogQ29weXJpZ2h0ICBEYXZpZCBXLiBNZXRjYWxmZSwgMTk5MworICoKKyAqLworCitzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIERhdmlkIFcuIE1ldGNhbGZlLCAxOTkzIjsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZ2RpLmgiCisKKy8qIERlZmF1bHQgc3lzdGVtIGNvbG9ycyAtIGxvb3NlbHkgYmFzZWQgb24gV2luZG93cyBkZWZhdWx0IGNvbG9yIHNldCAqLworc3RhdGljIGNvbnN0IGNoYXIgKkRlZlN5c0NvbG9yc1tdID0KK3sKKyAgICAiZ3JheTgwIiwgICAgICAgICAgICAgIC8qIENPTE9SX1NDUk9MTEJBUiAgICAgICAgICAgKi8KKyAgICAiZ3JheTYwIiwgICAgICAgICAgICAgIC8qIENPTE9SX0JBQ0tHUk9VTkQgICAgICAgICAgKi8KKyAgICAiYmx1ZTQiLCAgICAgICAgICAgICAgIC8qIENPTE9SX0FDVElWRUNBUFRJT04gICAgICAgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX0lOQUNUSVZFQ0FQVElPTiAgICAgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX01FTlUgICAgICAgICAgICAgICAgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX1dJTkRPVyAgICAgICAgICAgICAgKi8KKyAgICAiYmxhY2siLCAgICAgICAgICAgICAgIC8qIENPTE9SX1dJTkRPV0ZSQU1FICAgICAgICAgKi8KKyAgICAiYmxhY2siLCAgICAgICAgICAgICAgIC8qIENPTE9SX01FTlVURVhUICAgICAgICAgICAgKi8KKyAgICAiYmxhY2siLCAgICAgICAgICAgICAgIC8qIENPTE9SX1dJTkRPV1RFWFQgICAgICAgICAgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX0NBUFRJT05URVhUICAgICAgICAgKi8KKyAgICAiZ3JheTQwIiwgICAgICAgICAgICAgIC8qIENPTE9SX0FDVElWRUJPUkRFUiAgICAgICAgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX0lOQUNUSVZFQk9SREVSICAgICAgKi8KKyAgICAiZ3JheTYwIiwgICAgICAgICAgICAgIC8qIENPTE9SX0FQUFdPUktTUEFDRSAgICAgICAgKi8KKyAgICAiYmxhY2siLCAgICAgICAgICAgICAgIC8qIENPTE9SX0hJR0hMSUdIVCAgICAgICAgICAgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX0hJR0hMSUdIVFRFWFQgICAgICAgKi8KKyAgICAiZ3JheTcwIiwgICAgICAgICAgICAgIC8qIENPTE9SX0JUTkZBQ0UgICAgICAgICAgICAgKi8KKyAgICAiZ3JheTMwIiwgICAgICAgICAgICAgIC8qIENPTE9SX0JUTlNIQURPVyAgICAgICAgICAgKi8KKyAgICAiZ3JheTcwIiwgICAgICAgICAgICAgIC8qIENPTE9SX0dSQVlURVhUICAgICAgICAgICAgKi8KKyAgICAiYmxhY2siLCAgICAgICAgICAgICAgIC8qIENPTE9SX0JUTlRFWFQgICAgICAgICAgICAgKi8KKyAgICAiYmxhY2siLCAgICAgICAgICAgICAgIC8qIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQgKi8KKyAgICAid2hpdGUiLCAgICAgICAgICAgICAgIC8qIENPTE9SX0JUTkhJR0hMSUdIVCAgICAgICAgKi8KK307CisKKyNkZWZpbmUgTlVNX1NZU19DT0xPUlMgICAgIChzaXplb2YoRGVmU3lzQ29sb3JzKSAvIHNpemVvZihEZWZTeXNDb2xvcnNbMF0pKQorCitzdGF0aWMgQ09MT1JSRUYgU3lzQ29sb3JzW05VTV9TWVNfQ09MT1JTXTsKKworZXh0ZXJuIENvbG9ybWFwIENPTE9SX1dpbkNvbG9ybWFwOworCisKK3ZvaWQgU1lTQ09MT1JfSW5pdCgpCit7CisgICAgQ29sb3JtYXAgbWFwOworICAgIFhDb2xvciBjb2xvcjsKKyAgICBpbnQgaTsKKworICAgIGlmICgobWFwID09IENPTE9SX1dpbkNvbG9ybWFwKSA9PSBDb3B5RnJvbVBhcmVudCkKKwltYXAgPSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbihYVF9zY3JlZW4pOworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9TWVNfQ09MT1JTOyBpKyspCisgICAgeworCWlmIChYUGFyc2VDb2xvcihYVF9kaXNwbGF5LCBtYXAsIERlZlN5c0NvbG9yc1tpXSwgJmNvbG9yKSkKKwl7CisJICAgIGlmIChYQWxsb2NDb2xvcihYVF9kaXNwbGF5LCBtYXAsICZjb2xvcikpCisJICAgIHsKKwkJU3lzQ29sb3JzW2ldID0gUkdCKGNvbG9yLnJlZCA+PiA4LCBjb2xvci5ncmVlbiA+PiA4LAorCQkJCSAgICAgICAgICAgICAgICAgICAgY29sb3IuYmx1ZSA+PiA4KTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEdldFN5c0NvbG9yICAgICAgICAgICAoVVNFUi4xODApCisgKi8KKworQ09MT1JSRUYgR2V0U3lzQ29sb3Ioc2hvcnQgbkluZGV4KQoreworI2lmZGVmIERFQlVHX1NZU0NPTE9SCisgICAgcHJpbnRmKCJTeXN0ZW0gQ29sb3IgJWQgPSAlNnhcbiIsIG5JbmRleCwgU3lzQ29sb3JzW25JbmRleF0pOworI2VuZGlmCisgICAgcmV0dXJuIFN5c0NvbG9yc1tuSW5kZXhdOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTZXRTeXNDb2xvcnMgICAgICAgICAgKFVTRVIuMTgxKQorICovCisKK3ZvaWQgU2V0U3lzQ29sb3JzKGludCBuQ2hhbmdlcywgTFBJTlQgbHBTeXNDb2xvciwgQ09MT1JSRUYgKmxwQ29sb3JWYWx1ZXMpCit7CisgICAgQ29sb3JtYXAgbWFwOworICAgIFhDb2xvciBjb2xvcjsKKyAgICBjaGFyIGNvbG9yU3RyWzhdOworICAgIGludCBpOworCisgICAgaWYgKChtYXAgPT0gQ09MT1JfV2luQ29sb3JtYXApID09IENvcHlGcm9tUGFyZW50KQorCW1hcCA9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKFhUX3NjcmVlbik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW5nZXM7IGkrKykKKyAgICB7CisJc3ByaW50Zihjb2xvclN0ciwgIiMlMi4yeCUyLjJ4JTIuMngiLCBHZXRSVmFsdWUobHBDb2xvclZhbHVlc1tpXSksCisJCUdldEdWYWx1ZShscENvbG9yVmFsdWVzW2ldKSwgR2V0QlZhbHVlKGxwQ29sb3JWYWx1ZXNbaV0pKTsKKworCWlmIChYUGFyc2VDb2xvcihYVF9kaXNwbGF5LCBtYXAsIGNvbG9yU3RyLCAmY29sb3IpKQorCXsKKwkgICAgaWYgKFhBbGxvY0NvbG9yKFhUX2Rpc3BsYXksIG1hcCwgJmNvbG9yKSkKKwkgICAgeworCQlTeXNDb2xvcnNbbHBTeXNDb2xvcltpXV0gPSBSR0IoY29sb3IucmVkID4+IDgsIAorCQkJCQkJY29sb3IuZ3JlZW4gPj4gOCwKKwkJCQkJCWNvbG9yLmJsdWUgPj4gOCk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyogU2VuZCBXTV9TWVNDT0xPUkNIQU5HRSBtZXNzYWdlIHRvIGFsbCB3aW5kb3dzICovCisKKyAgICAvKiAuLi4uLi4uLi4uLi4uLi4uICovCisKKyAgICAvKiBSZXBhaW50IGFmZmVjdGVkIHBvcnRpb25zIG9mIGFsbCB2aXNpYmxlIHdpbmRvd3MgKi8KKworICAgIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KK30KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IDZlMjM2MWUuLjRkNTE3ZDMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtMTQsMTAgKzE0LDEwIEBACiAKICNpbmNsdWRlICJjbGFzcy5oIgogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCiAKIGV4dGVybiBEaXNwbGF5ICogWFRfZGlzcGxheTsKLQorZXh0ZXJuIENvbG9ybWFwIENPTE9SX1dpbkNvbG9ybWFwOwogCiBzdGF0aWMgSFdORCBmaXJzdFdpbmRvdyA9IDA7CiAKQEAgLTI4LDE5ICsyOCwxNCBAQAogICogICAgICAgICAgIFdJTl9GaW5kV25kUHRyCiAgKgogICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgV05EIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgSFdORC4KLSAqIFRoZSBjYWxsZXIgbXVzdCBHbG9iYWxVbmxvY2sgdGhlIHBvaW50ZXIuCiAgKi8KIFdORCAqIFdJTl9GaW5kV25kUHRyKCBIV05EIGh3bmQgKQogewogICAgIFdORCAqIHB0cjsKICAgICAKICAgICBpZiAoIWh3bmQpIHJldHVybiBOVUxMOwotICAgIHB0ciA9IChXTkQgKikgR2xvYmFsTG9jayggaHduZCApOwotICAgIGlmIChwdHItPmR3TWFnaWMgIT0gV05EX01BR0lDKQotICAgIHsKLQlHbG9iYWxVbmxvY2soIGh3bmQgKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9CisgICAgcHRyID0gKFdORCAqKSBVU0VSX0hFQVBfQUREUiggaHduZCApOworICAgIGlmIChwdHItPmR3TWFnaWMgIT0gV05EX01BR0lDKSByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gcHRyOwogfQogCkBAIC04NCw3ICs3OSw3IEBACiAgICAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3Q7CiAgICAgSEFORExFIGhjcmVhdGVTdHJ1Y3Q7CiAgICAgaW50IHdtY3JlYXRlOwotICAgIFdpZGdldCBwYXJlbnRXaWRnZXQgPSAwOworICAgIExQU1RSIHRleHRQdHI7CiAKICNpZmRlZiBERUJVR19XSU4KICAgICBwcmludGYoICJDcmVhdGVXaW5kb3c6ICVzICVzICVkLCVkICVkeCVkXG4iLCBjbGFzc05hbWUsIHdpbmRvd05hbWUsIHgsIHksIHdpZHRoLCBoZWlnaHQgKTsKQEAgLTEwNiwyMyArMTAxLDE2IEBACiAgICAgZWxzZSBpZiAoc3R5bGUgJiBXU19DSElMRCkgcmV0dXJuIDA7ICAvKiBXU19DSElMRCBuZWVkcyBhIHBhcmVudCAqLwogCiAgICAgaWYgKCEoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIGNsYXNzTmFtZSwgJmNsYXNzUHRyICkpKQotICAgIHsKLQlHbG9iYWxVbmxvY2soIHBhcmVudCApOwogCXJldHVybiAwOwotICAgIH0KICAgICAKICAgICAgIC8qIENyZWF0ZSB0aGUgd2luZG93IHN0cnVjdHVyZSAqLwogCi0gICAgaHduZCA9IEdsb2JhbEFsbG9jKCBHTUVNX01PVkVBQkxFLCBzaXplb2YoV05EKStjbGFzc1B0ci0+d2MuY2JXbmRFeHRyYSApOwotICAgIGlmICghaHduZCkKLSAgICB7Ci0JR2xvYmFsVW5sb2NrKCBwYXJlbnQgKTsKLQlyZXR1cm4gMDsKLSAgICB9CisgICAgaHduZCA9IFVTRVJfSEVBUF9BTExPQyhHTUVNX01PVkVBQkxFLCBzaXplb2YoV05EKStjbGFzc1B0ci0+d2MuY2JXbmRFeHRyYSk7CisgICAgaWYgKCFod25kKSByZXR1cm4gMDsKIAogICAgICAgLyogRmlsbCB0aGUgc3RydWN0dXJlICovCiAKLSAgICB3bmRQdHIgPSAoV05EICopIEdsb2JhbExvY2soIGh3bmQgKTsKKyAgICB3bmRQdHIgPSAoV05EICopIFVTRVJfSEVBUF9BRERSKCBod25kICk7CiAgICAgd25kUHRyLT5od25kTmV4dCAgID0gMDsKICAgICB3bmRQdHItPmh3bmRDaGlsZCAgPSAwOwogICAgIHduZFB0ci0+ZHdNYWdpYyAgICA9IFdORF9NQUdJQzsKQEAgLTEzOSwxNCArMTI3LDIzIEBACiAgICAgd25kUHRyLT5od25kTGFzdEFjdGl2ZSAgICA9IDA7CiAgICAgd25kUHRyLT5scGZuV25kUHJvYyAgICAgICA9IGNsYXNzUHRyLT53Yy5scGZuV25kUHJvYzsKICAgICB3bmRQdHItPmR3U3R5bGUgICAgICAgICAgID0gc3R5bGU7Ci0gICAgd25kUHRyLT5oRENFICAgICAgICAgICAgICA9IDA7CisgICAgd25kUHRyLT5kd0V4U3R5bGUgICAgICAgICA9IDA7CiAgICAgd25kUHRyLT5obWVudVN5c3RlbSAgICAgICA9IDA7CiAgICAgd25kUHRyLT53SURtZW51ICAgICAgICAgICA9IG1lbnU7CiAgICAgd25kUHRyLT5mbGFncyAgICAgICAgICAgICA9IDA7CisKICAgICBpZiAoY2xhc3NQdHItPndjLmNiV25kRXh0cmEpCiAJbWVtc2V0KCB3bmRQdHItPndFeHRyYSwgMCwgY2xhc3NQdHItPndjLmNiV25kRXh0cmEgKTsKKyAgICBpZiAoY2xhc3NQdHItPndjLnN0eWxlICYgQ1NfT1dOREMpCisJd25kUHRyLT5oZGMgPSBDcmVhdGVEQyggIkRJU1BMQVkiLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBlbHNlIHduZFB0ci0+aGRjID0gMDsKICAgICBjbGFzc1B0ci0+Y1dpbmRvd3MrKzsKIAorICAgICAgLyogQ3JlYXRlIGJ1ZmZlciBmb3Igd2luZG93IHRleHQgKi8KKyAgICB3bmRQdHItPmhUZXh0ID0gVVNFUl9IRUFQX0FMTE9DKEdNRU1fTU9WRUFCTEUsIHN0cmxlbih3aW5kb3dOYW1lKSArIDEpOworICAgIHRleHRQdHIgPSAoTFBTVFIpVVNFUl9IRUFQX0FERFIod25kUHRyLT5oVGV4dCk7CisgICAgc3RyY3B5KHRleHRQdHIsIHdpbmRvd05hbWUpOworCiAgICAgICAvKiBJbnNlcnQgdGhlIHdpbmRvdyBpbiB0aGUgbGlua2VkIGxpc3QgKi8KIAogICAgIGlmIChwYXJlbnQpCkBAIC0xNjIsMTUgKzE1OSwxMSBAQAogICAgIAogICAgICAgLyogQ3JlYXRlIHRoZSB3aWRnZXRzICovCiAKLSAgICBpZiAoIXN0cmNhc2VjbXAoY2xhc3NOYW1lLCAiQlVUVE9OIikpCisgICAgaWYgKHN0eWxlICYgV1NfQ0hJTEQpCiAgICAgewotCUJVVFRPTl9DcmVhdGVCdXR0b24oY2xhc3NOYW1lLCB3aW5kb3dOYW1lLCBod25kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpZiAoc3R5bGUgJiBXU19DSElMRCkKLQl7Ci0JICAgIHduZFB0ci0+c2hlbGxXaWRnZXQgPSAwOworCXduZFB0ci0+c2hlbGxXaWRnZXQgPSAwOworCWlmIChzdHlsZSAmIChXU19CT1JERVIgfCBXU19ETEdGUkFNRSB8IFdTX1RISUNLRlJBTUUpKQorCXsgCiAJICAgIHduZFB0ci0+d2luV2lkZ2V0ID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoY2xhc3NOYW1lLAogCQkJCQkJICAgIGNvcmVXaWRnZXRDbGFzcywKIAkJCQkJCSAgICBwYXJlbnRQdHItPndpbldpZGdldCwKQEAgLTE4MiwzOCArMTc1LDU0IEBACiAJfQogCWVsc2UKIAl7Ci0JICAgIHduZFB0ci0+c2hlbGxXaWRnZXQgPSBYdFZhQXBwQ3JlYXRlU2hlbGwoY2xhc3NOYW1lLCAKKwkgICAgd25kUHRyLT53aW5XaWRnZXQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChjbGFzc05hbWUsCisJCQkJCQkgICAgY29yZVdpZGdldENsYXNzLAorCQkJCQkJICAgIHBhcmVudFB0ci0+d2luV2lkZ2V0LAorCQkJCQkJICAgIFh0TngsIHgsCisJCQkJCQkgICAgWHROeSwgeSwKKwkJCQkJCSAgICBYdE53aWR0aCwgd2lkdGgsCisJCQkJCQkgICAgWHROaGVpZ2h0LCBoZWlnaHQsCisJCQkJCQkgICAgWHROYm9yZGVyV2lkdGgsIDAsCisJCQkJCQkgICAgTlVMTCApOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl3bmRQdHItPnNoZWxsV2lkZ2V0ID0gWHRWYUFwcENyZWF0ZVNoZWxsKGNsYXNzTmFtZSwgCiAJCQkJCQkgd2luZG93TmFtZSwKIAkJCQkJCSB0b3BMZXZlbFNoZWxsV2lkZ2V0Q2xhc3MsCiAJCQkJCQkgWFRfZGlzcGxheSwKIAkJCQkJCSBYdE54LCB4LAogCQkJCQkJIFh0TnksIHksCisjaWZkZWYgVVNFX1BSSVZBVEVfTUFQCisJCQkJCQkgWHROY29sb3JtYXAsIENPTE9SX1dpbkNvbG9ybWFwLAorI2VuZGlmCiAJCQkJCQkgTlVMTCApOwotCSAgICB3bmRQdHItPmNvbXBvc2l0ZVdpZGdldCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KGNsYXNzTmFtZSwKKwl3bmRQdHItPmNvbXBvc2l0ZVdpZGdldCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KGNsYXNzTmFtZSwKIAkJCQkJCSAgICBmb3JtV2lkZ2V0Q2xhc3MsCiAJCQkJCQkgICAgd25kUHRyLT5zaGVsbFdpZGdldCwKIAkJCQkJCSAgICBOVUxMICk7Ci0JICAgIGlmICh3bmRQdHItPndJRG1lbnUgPT0gMCkKLQkgICAgewotCQl3bmRQdHItPm1lbnVCYXJQdHIgPSAKKwlpZiAod25kUHRyLT53SURtZW51ID09IDApCisJeworCSAgICB3bmRQdHItPm1lbnVCYXJQdHIgPSAKIAkJICAgIE1FTlVfQ3JlYXRlTWVudUJhcih3bmRQdHItPmNvbXBvc2l0ZVdpZGdldCwKIAkJCQkgICAgICAgaW5zdGFuY2UsIGh3bmQsCiAJCQkJICAgICAgIGNsYXNzUHRyLT53Yy5scHN6TWVudU5hbWUsCiAJCQkJICAgICAgIHdpZHRoKTsKLQkJaWYgKHduZFB0ci0+bWVudUJhclB0cikKKwkgICAgaWYgKHduZFB0ci0+bWVudUJhclB0cikKIAkJICAgIHduZFB0ci0+d0lEbWVudSA9IAogCQkJR2xvYmFsSGFuZGxlRnJvbVBvaW50ZXIod25kUHRyLT5tZW51QmFyUHRyLT5maXJzdEl0ZW0pOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQl3bmRQdHItPm1lbnVCYXJQdHIgPSBNRU5VX1VzZU1lbnUod25kUHRyLT5jb21wb3NpdGVXaWRnZXQsCisJfQorCWVsc2UKKwl7CisJICAgIHduZFB0ci0+bWVudUJhclB0ciA9IE1FTlVfVXNlTWVudSh3bmRQdHItPmNvbXBvc2l0ZVdpZGdldCwKIAkJCQkJCSAgaW5zdGFuY2UsIGh3bmQsCiAJCQkJCQkgIHduZFB0ci0+d0lEbWVudSwgd2lkdGgpOwotCSAgICB9CisJfQogCi0JICAgIGlmICh3bmRQdHItPm1lbnVCYXJQdHIgIT0gTlVMTCkKLQkgICAgewotCQl3bmRQdHItPndpbldpZGdldCA9IAorCWlmICh3bmRQdHItPm1lbnVCYXJQdHIgIT0gTlVMTCkKKwl7CisJICAgIHduZFB0ci0+d2luV2lkZ2V0ID0gCiAJCSAgICBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChjbGFzc05hbWUsCiAJCQkJCSAgICBjb21wb3NpdGVXaWRnZXRDbGFzcywKIAkJCQkJICAgIHduZFB0ci0+Y29tcG9zaXRlV2lkZ2V0LApAQCAtMjIzLDE3ICsyMzIsMTYgQEAKIAkJCQkJICAgIHduZFB0ci0+bWVudUJhclB0ci0+bWVudUJhcldpZGdldCwKIAkJCQkJICAgIFh0TnZlcnREaXN0YW5jZSwgNCwKIAkJCQkJICAgIE5VTEwgKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJd25kUHRyLT53aW5XaWRnZXQgPSAKKwl9CisJZWxzZQorCXsKKwkgICAgd25kUHRyLT53aW5XaWRnZXQgPSAKIAkJICAgIFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KGNsYXNzTmFtZSwKIAkJCQkJY29tcG9zaXRlV2lkZ2V0Q2xhc3MsCiAJCQkJCXduZFB0ci0+Y29tcG9zaXRlV2lkZ2V0LAogCQkJCQlYdE53aWR0aCwgd2lkdGgsCiAJCQkJCVh0TmhlaWdodCwgaGVpZ2h0LAogCQkJCQlOVUxMICk7Ci0JICAgIH0KIAl9CiAgICAgfQogCkBAIC0yNjQsMTggKzI3MiwxMyBAQAogCSAgLyogQWJvcnQgd2luZG93IGNyZWF0aW9uICovCiAJaWYgKHduZFB0ci0+c2hlbGxXaWRnZXQpIFh0RGVzdHJveVdpZGdldCggd25kUHRyLT5zaGVsbFdpZGdldCApOwogCWVsc2UgWHREZXN0cm95V2lkZ2V0KCB3bmRQdHItPndpbldpZGdldCApOwotCUdsb2JhbFVubG9jayggcGFyZW50ICk7Ci0JR2xvYmFsVW5sb2NrKCBod25kICk7Ci0JR2xvYmFsRnJlZSggaHduZCApOworCVVTRVJfSEVBUF9GUkVFKCBod25kICk7CiAJcmV0dXJuIDA7CiAgICAgfQogICAgIAogICAgIEVWRU5UX0FkZEhhbmRsZXJzKCB3bmRQdHItPndpbldpZGdldCwgaHduZCApOwogCiAgICAgaWYgKHN0eWxlICYgV1NfVklTSUJMRSkgU2hvd1dpbmRvdyggaHduZCwgU1dfU0hPVyApOwotICAgIAotICAgIEdsb2JhbFVubG9jayggcGFyZW50ICk7Ci0gICAgR2xvYmFsVW5sb2NrKCBod25kICk7CiAgICAgcmV0dXJuIGh3bmQ7CiB9CiAKQEAgLTMxOCwxMCArMzIxLDEwIEBACiAKICAgICBpZiAod25kUHRyLT5zaGVsbFdpZGdldCkgWHREZXN0cm95V2lkZ2V0KCB3bmRQdHItPnNoZWxsV2lkZ2V0ICk7CiAgICAgZWxzZSBYdERlc3Ryb3lXaWRnZXQoIHduZFB0ci0+d2luV2lkZ2V0ICk7CisgICAgaWYgKHduZFB0ci0+aGRjKSBEZWxldGVEQyggd25kUHRyLT5oZGMgKTsKICAgICBjbGFzc1B0ci0+Y1dpbmRvd3MtLTsKLSAgICBpZiAod25kUHRyLT5od25kUGFyZW50KSBHbG9iYWxVbmxvY2soIHduZFB0ci0+aHduZFBhcmVudCApOwotICAgIEdsb2JhbFVubG9jayggaHduZCApOwotICAgIEdsb2JhbEZyZWUoIGh3bmQgKTsKKyAgICBVU0VSX0hFQVBfRlJFRSh3bmRQdHItPmhUZXh0KTsKKyAgICBVU0VSX0hFQVBfRlJFRSggaHduZCApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0zNDEsNyArMzQ0LDYgQEAKIAkJICAgICAgWHROd2lkdGgsICZ3aWR0aCwKIAkJICAgICAgWHROaGVpZ2h0LCAmaGVpZ2h0LAogCQkgICAgICBOVUxMICk7Ci0JR2xvYmFsVW5sb2NrKCBod25kICk7CiAJcmVjdC0+cmlnaHQgID0gd2lkdGggJiAweGZmZmY7CiAJcmVjdC0+Ym90dG9tID0gaGVpZ2h0ICYgMHhmZmZmOwogICAgIH0KQEAgLTM1OSw3ICszNjEsNiBAQAogICAgIGlmICh3bmRQdHIpIAogICAgIHsKIAlpZiAod25kUHRyLT5zaGVsbFdpZGdldCkgWHRSZWFsaXplV2lkZ2V0KCB3bmRQdHItPnNoZWxsV2lkZ2V0ICk7Ci0JR2xvYmFsVW5sb2NrKCBod25kICk7CiAJWHRWYUdldFZhbHVlcyh3bmRQdHItPndpbldpZGdldCwgCiAJCSAgICAgIFh0TndpZHRoLCAmd2lkdGgsCiAJCSAgICAgIFh0TmhlaWdodCwgJmhlaWdodCwKQEAgLTM4NiwxNyArMzg3LDEwIEBACiAgKi8KIEhNRU5VIEdldE1lbnUoIEhXTkQgaHduZCApIAogeyAKLSAgICBXTkQgKnduZFB0cjsKLSAgICBITUVOVSBobWVudTsKLSAgICAKLSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKICAgICBpZiAod25kUHRyID09IE5VTEwpCiAJcmV0dXJuIDA7Ci0KLSAgICBobWVudSA9IHduZFB0ci0+d0lEbWVudTsKLSAgICAKLSAgICBHbG9iYWxVbmxvY2soaHduZCk7Ci0gICAgcmV0dXJuIGhtZW51OworICAgIHJldHVybiB3bmRQdHItPndJRG1lbnU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MTAsMTEgKzQwNCw3IEBACiAgICAgaWYgKHduZFB0ciA9PSBOVUxMKQogCXJldHVybiBGQUxTRTsKIAotICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKLSAgICB7Ci0JR2xvYmFsVW5sb2NrKGh3bmQpOwotCXJldHVybiBGQUxTRTsKLSAgICB9CisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAod25kUHRyLT5tZW51QmFyUHRyICE9IE5VTEwpCiAgICAgewpAQCAtNDQ0LDExICs0MzQsMTQ1IEBACiAJCQkJCSAgICAgIHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAtCiAJCQkJCSAgICAgIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0KTsKIAl9Ci0JCi0JR2xvYmFsVW5sb2NrKGh3bmQpOwogCXJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICBHbG9iYWxVbmxvY2soaHduZCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXREZXNrdG9wV2luZG93ICAgICAgICAoVVNFUi4yODYpCisgKi8KK0hXTkQgR2V0RGVza3RvcFdpbmRvdygpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBHZXRXaW5kb3dXb3JkICAgIChVU0VSLjEzMykKKyAqLworV09SRCBHZXRXaW5kb3dXb3JkKCBIV05EIGh3bmQsIHNob3J0IG9mZnNldCApCit7CisgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CisgICAgaWYgKG9mZnNldCA+PSAwKSByZXR1cm4gKihXT1JEICopKCgoY2hhciAqKXduZFB0ci0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgc3dpdGNoKG9mZnNldCkKKyAgICB7CisJY2FzZSBHV1dfSUQ6ICAgICAgICAgcmV0dXJuIHduZFB0ci0+d0lEbWVudTsKKwljYXNlIEdXV19IV05EUEFSRU5UOiByZXR1cm4gd25kUHRyLT5od25kUGFyZW50OworCWNhc2UgR1dXX0hJTlNUQU5DRTogIHJldHVybiB3bmRQdHItPmhJbnN0YW5jZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgU2V0V2luZG93V29yZCAgICAoVVNFUi4xMzQpCisgKi8KK1dPUkQgU2V0V2luZG93V29yZCggSFdORCBod25kLCBzaG9ydCBvZmZzZXQsIFdPUkQgbmV3dmFsICkKK3sKKyAgICBXT1JEICpwdHIsIHJldHZhbDsKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKKyAgICBpZiAob2Zmc2V0ID49IDApIHB0ciA9IChXT1JEICopKCgoY2hhciAqKXduZFB0ci0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgZWxzZSBzd2l0Y2gob2Zmc2V0KQorICAgIHsKKwljYXNlIEdXV19JRDogcHRyID0gJnduZFB0ci0+d0lEbWVudTsKKwljYXNlIEdXV19ISU5TVEFOQ0U6IHB0ciA9ICZ3bmRQdHItPmhJbnN0YW5jZTsKKwlkZWZhdWx0OiByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dmFsID0gKnB0cjsKKyAgICAqcHRyID0gbmV3dmFsOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgR2V0V2luZG93TG9uZyAgICAoVVNFUi4xMzUpCisgKi8KK0xPTkcgR2V0V2luZG93TG9uZyggSFdORCBod25kLCBzaG9ydCBvZmZzZXQgKQoreworICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYgKCF3bmRQdHIpIHJldHVybiAwOworICAgIGlmIChvZmZzZXQgPj0gMCkgcmV0dXJuICooTE9ORyAqKSgoKGNoYXIgKil3bmRQdHItPndFeHRyYSkgKyBvZmZzZXQpOworICAgIHN3aXRjaChvZmZzZXQpCisgICAgeworCWNhc2UgR1dMX1NUWUxFOiAgIHJldHVybiB3bmRQdHItPmR3U3R5bGU7CisgICAgICAgIGNhc2UgR1dMX0VYU1RZTEU6IHJldHVybiB3bmRQdHItPmR3RXhTdHlsZTsKKwljYXNlIEdXTF9XTkRQUk9DOiByZXR1cm4gd25kUHRyLT5scGZuV25kUHJvYzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgU2V0V2luZG93TG9uZyAgICAoVVNFUi4xMzYpCisgKi8KK0xPTkcgU2V0V2luZG93TG9uZyggSFdORCBod25kLCBzaG9ydCBvZmZzZXQsIExPTkcgbmV3dmFsICkKK3sKKyAgICBMT05HICpwdHIsIHJldHZhbDsKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKKyAgICBpZiAob2Zmc2V0ID49IDApIHB0ciA9IChMT05HICopKCgoY2hhciAqKXduZFB0ci0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgZWxzZSBzd2l0Y2gob2Zmc2V0KQorICAgIHsKKwljYXNlIEdXTF9TVFlMRTogICBwdHIgPSAmd25kUHRyLT5kd1N0eWxlOworICAgICAgICBjYXNlIEdXTF9FWFNUWUxFOiBwdHIgPSAmd25kUHRyLT5kd0V4U3R5bGU7CisJY2FzZSBHV0xfV05EUFJPQzogcHRyID0gJnduZFB0ci0+bHBmblduZFByb2M7CisJZGVmYXVsdDogcmV0dXJuIDA7CisgICAgfQorICAgIHJldHZhbCA9ICpwdHI7CisgICAgKnB0ciA9IG5ld3ZhbDsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRQYXJlbnQgICAgICAgICAgICAgIChVU0VSLjQ2KQorICovCisKK0hXTkQgR2V0UGFyZW50KEhXTkQgaHduZCkKK3sKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIEhXTkQgaHduZFBhcmVudCA9IHduZFB0ci0+aHduZFBhcmVudDsKKyAgICBHbG9iYWxVbmxvY2soaHduZCk7CisgICAgcmV0dXJuIGh3bmRQYXJlbnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldERsZ0N0cmxJRCAgICAgICAgICAgKFVTRVIuMjc3KQorICovCisKK2ludCBHZXREbGdDdHJsSUQoSFdORCBod25kKQoreworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgaW50IGN0cmxJRCA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBHbG9iYWxVbmxvY2soaHduZCk7CisgICAgcmV0dXJuIGN0cmxJRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRXaW5kb3dUZXh0ICAgICAgICAgIChVU0VSLjM2KQorICovCisKK2ludCBHZXRXaW5kb3dUZXh0KEhXTkQgaHduZCwgTFBTVFIgbHBTdHJpbmcsIGludCBuTWF4Q291bnQpCit7CisgICAgcmV0dXJuIChpbnQpU2VuZE1lc3NhZ2UoaHduZCwgV01fR0VUVEVYVCwgKFdPUkQpbk1heENvdW50LCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBTdHJpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRXaW5kb3dUZXh0TGVuZ3RoICAgIChVU0VSLjM4KQorICovCisKK2ludCBHZXRXaW5kb3dUZXh0TGVuZ3RoKEhXTkQgaHduZCkKK3sKKyAgICByZXR1cm4gKGludClTZW5kTWVzc2FnZShod25kLCBXTV9HRVRURVhUTEVOR1RILCAoV09SRClOVUxMLCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpTlVMTCk7Cit9CisKKwo=