LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCk0qIE1vZHVsOiAgICAgICAgIGx3bW9uLmMKTSoKTSogQ29udGVudDogICAgICAgTFdNT04gc3BlY2lmaWMgVS1Cb290IGNvbW1hbmRzLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDEsIDIwMDIKICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZwogKiBXb2xmZ2FuZyBEZW5rLCB3ZEBkZW54LmRlCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCkQqIERlc2lnbjogICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246ICBkenVAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVhZGVyZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzh4eC5oPgojaW5jbHVkZSA8Y29tbXByb2MuaD4KI2luY2x1ZGUgPGkyYy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlIDxwb3N0Lmg+CiNpbmNsdWRlIDxzZXJpYWwuaD4KCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGZvciBzdHJkdXAgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2FsIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQsIGxvbmcgaW50ICosIGxvbmcgaW50KTsKc3RhdGljIHZvaWQga2JkX2luaXQgKHZvaWQpOwpzdGF0aWMgaW50IGNvbXBhcmVfbWFnaWMgKHVjaGFyICprYmRfZGF0YSwgdWNoYXIgKnN0cik7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9jYWwgbWFjcm9zIGFuZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lCV9OT1RfVVNFRF8JMHhGRkZGRkZGRgoKI2lmZGVmIENPTkZJR19NT0RFTV9TVVBQT1JUCnN0YXRpYyBpbnQga2V5X3ByZXNzZWQodm9pZCk7CmV4dGVybiB2b2lkIGRpc2FibGVfcHV0Yyh2b2lkKTsKI2VuZGlmIC8qIENPTkZJR19NT0RFTV9TVVBQT1JUICovCgovKgogKiA2NiBNSHogU0RSQU0gYWNjZXNzIHVzaW5nIFVQTSBBCiAqLwpjb25zdCB1aW50IHNkcmFtX3RhYmxlW10gPQp7CiNpZiBkZWZpbmVkKENGR19NRU1PUllfNzUpIHx8IGRlZmluZWQoQ0ZHX01FTU9SWV84RSkKCS8qCgkgKiBTaW5nbGUgUmVhZC4gKE9mZnNldCAwIGluIFVQTSBSQU0pCgkgKi8KCTB4MUYwREZDMDQsIDB4RUVBRkJDMDQsIDB4MTFBRjdDMDQsIDB4RUZCQUZDMDAsCgkweDFGRjVGQzQ3LCAvKiBsYXN0ICovCgkvKgoJICogU0RSQU0gSW5pdGlhbGl6YXRpb24gKG9mZnNldCA1IGluIFVQTSBSQU0pCgkgKgoJICogVGhpcyBpcyBubyBVUE0gZW50cnkgcG9pbnQuIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiB1c2VzCgkgKiB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIGVzdGFibGlzaCBhbiBpbml0aWFsaXphdGlvbgoJICogc2VxdWVuY2UsIHdoaWNoIGlzIGV4ZWN1dGVkIGJ5IGEgUlVOIGNvbW1hbmQuCgkgKgoJICovCgkJICAgIDB4MUZGNUZDMzQsIDB4RUZFQUJDMzQsIDB4MUZCNTdDMzUsIC8qIGxhc3QgKi8KCS8qCgkgKiBCdXJzdCBSZWFkLiAoT2Zmc2V0IDggaW4gVVBNIFJBTSkKCSAqLwoJMHgxRjBERkMwNCwgMHhFRUFGQkMwNCwgMHgxMEFGN0MwNCwgMHhGMEFGRkMwMCwKCTB4RjBBRkZDMDAsIDB4RjFBRkZDMDAsIDB4RUZCQUZDMDAsIDB4MUZGNUZDNDcsIC8qIGxhc3QgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIFNpbmdsZSBXcml0ZS4gKE9mZnNldCAxOCBpbiBVUE0gUkFNKQoJICovCgkweDFGMkRGQzA0LCAweEVFQUJCQzAwLCAweDAxQjI3QzA0LCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIEJ1cnN0IFdyaXRlLiAoT2Zmc2V0IDIwIGluIFVQTSBSQU0pCgkgKi8KCTB4MUYwREZDMDQsIDB4RUVBQkJDMDAsIDB4MTBBNzdDMDAsIDB4RjBBRkZDMDAsCgkweEYwQUZGQzAwLCAweEUxQkFGQzA0LCAweDAxRkY1RkM0NywgLyogbGFzdCAqLwoJCQkJCSAgICBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKgoJICogUmVmcmVzaCAgKE9mZnNldCAzMCBpbiBVUE0gUkFNKQoJICovCgkweDFGRkQ3Qzg0LCAweEZGRkZGQzA0LCAweEZGRkZGQzA0LCAweEZGRkZGQzA0LAoJMHhGRkZGRkM4NCwgMHhGRkZGRkMwNywgLyogbGFzdCAqLwoJCQkJX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKgoJICogRXhjZXB0aW9uLiAoT2Zmc2V0IDNjIGluIFVQTSBSQU0pCgkgKi8KCTB4N0ZGRkZDMDcsIC8qIGxhc3QgKi8KCQkgICAgMHhGRkZGRkNGRiwgMHhGRkZGRkNGRiwgMHhGRkZGRkNGRiwKI2VuZGlmCiNpZmRlZiBDRkdfTUVNT1JZXzdFCgkvKgoJICogU2luZ2xlIFJlYWQuIChPZmZzZXQgMCBpbiBVUE0gUkFNKQoJICovCgkweDBFMkRCQzA0LCAweDExQUY3QzA0LCAweEVGQkFGQzAwLCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCglfTk9UX1VTRURfLAoJLyoKCSAqIFNEUkFNIEluaXRpYWxpemF0aW9uIChvZmZzZXQgNSBpbiBVUE0gUkFNKQoJICoKCSAqIFRoaXMgaXMgbm8gVVBNIGVudHJ5IHBvaW50LiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb24gdXNlcwoJICogdGhlIHJlbWFpbmluZyBzcGFjZSB0byBlc3RhYmxpc2ggYW4gaW5pdGlhbGl6YXRpb24KCSAqIHNlcXVlbmNlLCB3aGljaCBpcyBleGVjdXRlZCBieSBhIFJVTiBjb21tYW5kLgoJICoKCSAqLwoJCSAgICAweDFGRjVGQzM0LCAweEVGRUFCQzM0LCAweDFGQjU3QzM1LCAvKiBsYXN0ICovCgkvKgoJICogQnVyc3QgUmVhZC4gKE9mZnNldCA4IGluIFVQTSBSQU0pCgkgKi8KCTB4MEUyREJDMDQsIDB4MTBBRjdDMDQsIDB4RjBBRkZDMDAsIDB4RjBBRkZDMDAsCgkweEYxQUZGQzAwLCAweEVGQkFGQzAwLCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCgkJCQkJICAgIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBTaW5nbGUgV3JpdGUuIChPZmZzZXQgMTggaW4gVVBNIFJBTSkKCSAqLwoJMHgwRTI5QkMwNCwgMHgwMUIyN0MwNCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJCQkJCSAgICBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBCdXJzdCBXcml0ZS4gKE9mZnNldCAyMCBpbiBVUE0gUkFNKQoJICovCgkweDBFMjlCQzA0LCAweDEwQTc3QzAwLCAweEYwQUZGQzAwLCAweEYwQUZGQzAwLAoJMHhFMUJBRkMwNCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJCQkJX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIFJlZnJlc2ggIChPZmZzZXQgMzAgaW4gVVBNIFJBTSkKCSAqLwoJMHgxRkZEN0M4NCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwKCTB4RkZGRkZDODQsIDB4RkZGRkZDMDcsIC8qIGxhc3QgKi8KCQkJCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIEV4Y2VwdGlvbi4gKE9mZnNldCAzYyBpbiBVUE0gUkFNKQoJICovCgkweDdGRkZGQzA3LCAvKiBsYXN0ICovCgkJICAgIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsCiNlbmRpZgp9OwoKLyoKICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CiAqCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGNoZWNrYm9hcmQgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQgLSAwIGlzIGFsd2F5cyByZXR1cm5lZAogKgpaKiBJbnRlbnRpb246ICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNoZWNrYm9hcmQoKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLiAgT25seSBhIHN0YW5kYXJkIG1lc3NhZ2UgaXMgcHJpbnRlZC4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGNoZWNrYm9hcmQgKHZvaWQpCnsKCXB1dHMgKCJCb2FyZDogTElDQ09OIEtvbnNvbGUgTENEMlxuIik7CglyZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIGludCBib2FyZF90eXBlClAqICAgICAgICAgICAgICAgIC0gVXN1YWxseSB0eXBlIG9mIHRoZSBib2FyZCAtIGlnbm9yZWQgaGVyZS4KUCoKUCogUmV0dXJudmFsdWU6ICBsb25nIGludApQKiAgICAgICAgICAgICAgICAtIFNpemUgb2YgaW5pdGlhbGl6ZWQgbWVtb3J5CiAqCloqIEludGVudGlvbjogICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW5pdGRyYW0oKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLgpaKiAgICAgICAgICAgICAgIFRoZSBtZW1vcnkgY29udHJvbGxlciBpcyBpbml0aWFsaXplZCB0byBhY2Nlc3MgdGhlCloqICAgICAgICAgICAgICAgRFJBTS4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbXItPmltX21lbWN0bDsKCWxvbmcgaW50IHNpemVfYjA7Cglsb25nIGludCBzaXplOCwgc2l6ZTk7CglpbnQgaTsKCgkvKgoJICogQ29uZmlndXJlIFVQTUEgZm9yIFNEUkFNCgkgKi8KCXVwbWNvbmZpZyAoVVBNQSwgKHVpbnQgKilzZHJhbV90YWJsZSwgc2l6ZW9mKHNkcmFtX3RhYmxlKS9zaXplb2YodWludCkpOwoKCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUjsKCgkvKiBidXJzdCBsZW5ndGg9NCwgYnVyc3QgdHlwZT1zZXF1ZW50aWFsLCBDQVMgbGF0ZW5jeT0yICovCgltZW1jdGwtPm1lbWNfbWFyID0gQ0ZHX01BUjsKCgkvKgoJICogTWFwIGNvbnRyb2xsZXIgYmFuayAzIHRvIHRoZSBTRFJBTSBiYW5rIGF0IHByZWxpbWluYXJ5IGFkZHJlc3MuCgkgKi8KCW1lbWN0bC0+bWVtY19vcjMgPSBDRkdfT1IzX1BSRUxJTTsKCW1lbWN0bC0+bWVtY19icjMgPSBDRkdfQlIzX1BSRUxJTTsKCgkvKiBpbml0aWFsaXplIG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovCgltZW1jdGwtPm1lbWNfbWFtciA9IENGR19NQU1SXzhDT0w7CS8qIHJlZnJlc2ggbm90IGVuYWJsZWQgeWV0ICovCgoJLyogbW9kZSBpbml0aWFsaXphdGlvbiAob2Zmc2V0IDUpICovCgl1ZGVsYXkgKDIwMCk7CQkJCS8qIDB4ODAwMDYxMDUgKi8KCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX01CX0NTMyB8IE1DUl9NTENGICgxKSB8IE1DUl9NQUQgKDB4MDUpOwoKCS8qIHJ1biAyIHJlZnJlc2ggc2VxdWVuY2Ugd2l0aCA0LWJlYXQgcmVmcmVzaCBidXJzdCAob2Zmc2V0IDB4MzApICovCgl1ZGVsYXkgKDEpOwkJCQkvKiAweDgwMDA2MTMwICovCgltZW1jdGwtPm1lbWNfbWNyID0gTUNSX09QX1JVTiB8IE1DUl9NQl9DUzMgfCBNQ1JfTUxDRiAoMSkgfCBNQ1JfTUFEICgweDMwKTsKCXVkZWxheSAoMSk7CQkJCS8qIDB4ODAwMDYxMzAgKi8KCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX01CX0NTMyB8IE1DUl9NTENGICgxKSB8IE1DUl9NQUQgKDB4MzApOwoKCXVkZWxheSAoMSk7CQkJCS8qIDB4ODAwMDYxMDYgKi8KCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX01CX0NTMyB8IE1DUl9NTENGICgxKSB8IE1DUl9NQUQgKDB4MDYpOwoKCW1lbWN0bC0+bWVtY19tYW1yIHw9IE1BTVJfUFRBRTsJLyogcmVmcmVzaCBlbmFibGVkICovCgoJdWRlbGF5ICgyMDApOwoKCS8qIE5lZWQgYXQgbGVhc3QgMTAgRFJBTSBhY2Nlc3NlcyB0byBzdGFiaWxpemUgKi8KCWZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CgkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciA9CgkJCSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIFNEUkFNX0JBU0UzX1BSRUxJTTsKCQl1bnNpZ25lZCBsb25nIHZhbDsKCgkJdmFsID0gKihhZGRyICsgaSk7CgkJKihhZGRyICsgaSkgPSB2YWw7Cgl9CgoJLyoKCSAqIENoZWNrIEJhbmsgMCBNZW1vcnkgU2l6ZSBmb3IgcmUtY29uZmlndXJhdGlvbgoJICoKCSAqIHRyeSA4IGNvbHVtbiBtb2RlCgkgKi8KCXNpemU4ID0gZHJhbV9zaXplIChDRkdfTUFNUl84Q09MLCAodWxvbmcgKilTRFJBTV9CQVNFM19QUkVMSU0sIFNEUkFNX01BWF9TSVpFKTsKCgl1ZGVsYXkgKDEwMDApOwoKCS8qCgkgKiB0cnkgOSBjb2x1bW4gbW9kZQoJICovCglzaXplOSA9IGRyYW1fc2l6ZSAoQ0ZHX01BTVJfOUNPTCwgKHVsb25nICopU0RSQU1fQkFTRTNfUFJFTElNLCBTRFJBTV9NQVhfU0laRSk7CgoJaWYgKHNpemU4IDwgc2l6ZTkpIHsJCS8qIGxlYXZlIGNvbmZpZ3VyYXRpb24gYXQgOSBjb2x1bW5zICovCgkJc2l6ZV9iMCA9IHNpemU5OwoJCW1lbWN0bC0+bWVtY19tYW1yID0gQ0ZHX01BTVJfOUNPTCB8IE1BTVJfUFRBRTsKCQl1ZGVsYXkgKDUwMCk7Cgl9IGVsc2UgewkJCS8qIGJhY2sgdG8gOCBjb2x1bW5zICAgICAgICAgICAgKi8KCQlzaXplX2IwID0gc2l6ZTg7CgkJbWVtY3RsLT5tZW1jX21hbXIgPSBDRkdfTUFNUl84Q09MIHwgTUFNUl9QVEFFOwoJCXVkZWxheSAoNTAwKTsKCX0KCgkvKgoJICogRmluYWwgbWFwcGluZzoKCSAqLwoKCW1lbWN0bC0+bWVtY19vcjMgPSAoKC1zaXplX2IwKSAmIDB4RkZGRjAwMDApIHwKCQkJT1JfQ1NOVF9TQU0gfCBPUl9HNUxTIHwgU0RSQU1fVElNSU5HOwoJbWVtY3RsLT5tZW1jX2JyMyA9IChDRkdfU0RSQU1fQkFTRSAmIEJSX0JBX01TSykgfCBCUl9NU19VUE1BIHwgQlJfVjsKCXVkZWxheSAoMTAwMCk7CgoJcmV0dXJuIChzaXplX2IwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQgbWFtcl92YWx1ZSwKRiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludCAqYmFzZSwKRiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludCBtYXhzaXplKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBsb25nIGludCBtYW1yX3ZhbHVlClAqICAgICAgICAgICAgICAgIC0gVmFsdWUgZm9yIE1BTVIgZm9yIHRoZSB0ZXN0ClAqICAgICAgICAgICAgICAgbG9uZyBpbnQgKmJhc2UKUCogICAgICAgICAgICAgICAgLSBCYXNlIGFkZHJlc3MgZm9yIHRoZSB0ZXN0ClAqICAgICAgICAgICAgICAgbG9uZyBpbnQgbWF4c2l6ZQpQKiAgICAgICAgICAgICAgICAtIE1heGltdW0gc2l6ZSB0byB0ZXN0IGZvcgpQKgpQKiBSZXR1cm52YWx1ZTogIGxvbmcgaW50ClAqICAgICAgICAgICAgICAgIC0gU2l6ZSBvZiBwcm9iZWQgbWVtb3J5CiAqCloqIEludGVudGlvbjogICAgQ2hlY2sgbWVtb3J5IHJhbmdlIGZvciB2YWxpZCBSQU0uIEEgc2ltcGxlIG1lbW9yeSB0ZXN0CloqICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsbHkgYXZhaWxhYmxlIFJBTSBzaXplIGJldHdlZW4KWiogICAgICAgICAgICAgICBhZGRyZXNzZXMgYGJhc2UnIGFuZCBgYmFzZSArIG1heHNpemUnLiBTb21lIChub3QgYWxsKQpaKiAgICAgICAgICAgICAgIGhhcmR3YXJlIGVycm9ycyBhcmUgZGV0ZWN0ZWQ6CloqICAgICAgICAgICAgICAgIC0gc2hvcnQgYmV0d2VlbiBhZGRyZXNzIGxpbmVzCloqICAgICAgICAgICAgICAgIC0gc2hvcnQgYmV0d2VlbiBkYXRhIGxpbmVzCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBsb25nIGludCBkcmFtX3NpemUgKGxvbmcgaW50IG1hbXJfdmFsdWUsIGxvbmcgaW50ICpiYXNlLCBsb25nIGludCBtYXhzaXplKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbXItPmltX21lbWN0bDsKCgltZW1jdGwtPm1lbWNfbWFtciA9IG1hbXJfdmFsdWU7CgoJcmV0dXJuIChnZXRfcmFtX3NpemUoYmFzZSwgbWF4c2l6ZSkpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaWZuZGVmCVBCX0VORVRfVEVOQQojIGRlZmluZSBQQl9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDIwMDApCS8qIFBCIDE4ICovCiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGJvYXJkX2Vhcmx5X2luaXRfZiAodm9pZCkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgbm9uZQpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgaXMgYWx3YXlzIHJldHVybmVkLgogKgpaKiBJbnRlbnRpb246ICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGJvYXJkX2Vhcmx5X2luaXRfZigpIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgpaKiAgICAgICAgICAgICAgIGZvciB0aGUgbHdtb24gYm9hcmQuCloqICAgICAgICAgICAgICAgRGlzYWJsZSBFdGhlcm5ldCBURU5BIG9uIFBvcnQgQi4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGJvYXJkX2Vhcmx5X2luaXRfZiAodm9pZCkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENGR19JTU1SOwoKCS8qIERpc2FibGUgRXRoZXJuZXQgVEVOQSBvbiBQb3J0IEIKCSAqIE5lY2Vzc2FyeSBiZWNhdXNlIG9mIHB1bGwgdXAgaW4gQ09NMyBwb3J0LgoJICoKCSAqIFRoaXMgaXMganVzdCBhIHByZWxpbWluYXJ5IGZpeCwgaW50ZW5kZWQgdG8gdHVybiBvZmYgVEVOQQoJICogYXMgc29vbiBhcyBwb3NzaWJsZSB0byBhdm9pZCBub2lzZSBvbiB0aGUgbmV0d29yay4gT25jZQoJICogSbJDIGlzIHJ1bm5pbmcgd2Ugd2lsbCBtYWtlIHN1cmUgdGhlIGludGVyZmFjZSBpcwoJICogY29ycmVjdGx5IGluaXRpYWxpemVkLgoJICovCglpbW1yLT5pbV9jcG0uY3BfcGJwYXIgJj0gflBCX0VORVRfVEVOQTsKCWltbXItPmltX2NwbS5jcF9wYm9kciAmPSB+UEJfRU5FVF9URU5BOwoJaW1tci0+aW1fY3BtLmNwX3BiZGF0ICY9IH5QQl9FTkVUX1RFTkE7CS8qIHNldCB0byAwID0gZGlzYWJsZWQgKi8KCWltbXItPmltX2NwbS5jcF9wYmRpciB8PSBQQl9FTkVUX1RFTkE7CgoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgdm9pZCByZXNldF9waHkgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBub25lCiAqCloqIEludGVudGlvbjogICAgUmVzZXQgdGhlIFBIWS4gIEluIHRoZSBsd21vbiBjYXNlIHdlIGRvIHRoaXMgYnkgdGhlCloqICAgICAgICAgICAgICAgc2lnbmFsaW5nIHRoZSBQSUMgSS9PIGV4cGFuZGVyLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHJlc2V0X3BoeSAodm9pZCkKewoJdWNoYXIgYzsKCiNpZmRlZiBERUJVRwoJcHJpbnRmICgiIyMjIFN3aXRjaCBvbiBFdGhlcm5ldCBmb3IgU0NDMiAjIyNcbiIpOwojZW5kaWYKCWMgPSBwaWNfcmVhZCAoMHg2MSk7CiNpZmRlZiBERUJVRwoJcHJpbnRmICgiT2xkIFBJQyByZWFkOiByZWdfNjEgPSAweCUwMnhcbiIsIGMpOwojZW5kaWYKCWMgfD0gMHg0MDsJCQkJCS8qIGRpc2FibGUgQ09NMyAqLwoJYyAmPSB+MHg4MDsJCQkJCS8qIGVuYWJsZSBFdGhlcm5ldCAqLwoJcGljX3dyaXRlICgweDYxLCBjKTsKI2lmZGVmIERFQlVHCgljID0gcGljX3JlYWQgKDB4NjEpOwoJcHJpbnRmICgiTmV3IFBJQyByZWFkOiByZWdfNjEgPSAweCUwMnhcbiIsIGMpOwojZW5kaWYKCXVkZWxheSAoMTAwMCk7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gS2V5Ym9hcmQgY29udHJvbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIGNvbW1hbmQgY29kZXMgKi8KI2RlZmluZQlLRVlCRF9DTURfUkVBRF9LRVlTCTB4MDEKI2RlZmluZSBLRVlCRF9DTURfUkVBRF9WRVJTSU9OCTB4MDIKI2RlZmluZSBLRVlCRF9DTURfUkVBRF9TVEFUVVMJMHgwMwojZGVmaW5lIEtFWUJEX0NNRF9SRVNFVF9FUlJPUlMJMHgxMAoKLyogc3RhdHVzIGNvZGVzICovCiNkZWZpbmUgS0VZQkRfU1RBVFVTX01BU0sJMHgzRgojZGVmaW5lCUtFWUJEX1NUQVRVU19IX1JFU0VUCTB4MjAKI2RlZmluZSBLRVlCRF9TVEFUVVNfQlJPV05PVVQJMHgxMAojZGVmaW5lIEtFWUJEX1NUQVRVU19XRF9SRVNFVAkweDA4CiNkZWZpbmUgS0VZQkRfU1RBVFVTX09WRVJMT0FECTB4MDQKI2RlZmluZSBLRVlCRF9TVEFUVVNfSUxMRUdBTF9XUgkweDAyCiNkZWZpbmUgS0VZQkRfU1RBVFVTX0lMTEVHQUxfUkQJMHgwMQoKLyogTnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIGZyb20gS2V5Ym9hcmQgQ29udHJvbGxlciAqLwojZGVmaW5lIEtFWUJEX1ZFUlNJT05MRU4JMgkvKiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiNkZWZpbmUJS0VZQkRfREFUQUxFTgkJOQkvKiBub3JtYWwga2V5IHNjYW4gZGF0YSAqLwoKLyogbWF4aW11bSBudW1iZXIgb2YgIm1hZ2ljIiBrZXkgY29kZXMgdGhhdCBjYW4gYmUgYXNzaWduZWQgKi8KCnN0YXRpYyB1Y2hhciBrYmRfYWRkciA9IENGR19JMkNfS0VZQkRfQUREUjsKCnN0YXRpYyB1Y2hhciAqa2V5X21hdGNoICh1Y2hhciAqKTsKCiNkZWZpbmUJS0VZQkRfU0VUX0RFQlVHTU9ERQknIycJLyogTWFnaWMga2V5IHRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIGludCBib2FyZF9wb3N0Y2xrX2luaXQgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwIGlzIGFsd2F5cyByZXR1cm5lZC4KICoKWiogSW50ZW50aW9uOiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBib2FyZF9wb3N0Y2xrX2luaXQoKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBib2FyZF9wb3N0Y2xrX2luaXQgKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKCWtiZF9pbml0KCk7CgojaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKCWlmIChrZXlfcHJlc3NlZCgpKSB7CgkJZGlzYWJsZV9wdXRjKCk7CS8qIG1vZGVtIGRvZXNuJ3QgdW5kZXJzdGFuZCBiYW5uZXIgZXRjICovCgkJZ2QtPmRvX21kbV9pbml0ID0gMTsKCX0KI2VuZGlmCgoJcmV0dXJuICgwKTsKfQoKc3RydWN0IHNlcmlhbF9kZXZpY2UgKiBkZWZhdWx0X3NlcmlhbF9jb25zb2xlICh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCglyZXR1cm4gZ2QtPmRvX21kbV9pbml0ID8gJnNlcmlhbF9zY2NfZGV2aWNlIDogJnNlcmlhbF9zbWNfZGV2aWNlOwp9CgpzdGF0aWMgdm9pZCBrYmRfaW5pdCAodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgoJdWNoYXIga2JkX2RhdGFbS0VZQkRfREFUQUxFTl07Cgl1Y2hhciB0bXBfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIHZhbCwgZXJyY2Q7CglpbnQgaTsKCglpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CgoJZ2QtPmtiZF9zdGF0dXMgPSAwOwoKCS8qIEZvcmNlZCBieSBQSUMuIERlbGF5cyA8PSAxNzV1cyBsb29zZSAqLwoJdWRlbGF5KDEwMDApOwoKCS8qIFJlYWQgaW5pdGlhbCBrZXlib2FyZCBlcnJvciBjb2RlICovCgl2YWwgPSBLRVlCRF9DTURfUkVBRF9TVEFUVVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwgJmVycmNkLCAxKTsKCS8qIGNsZWFyIHVudXNlZCBiaXRzICovCgllcnJjZCAmPSBLRVlCRF9TVEFUVVNfTUFTSzsKCS8qIGNsZWFyICJpcnJlbGV2YW50IiBiaXRzLiBSZWNvbW1lbmRlZCBieSBNYXJ0aW4gUmFqZWssIExXTiAqLwoJZXJyY2QgJj0gfihLRVlCRF9TVEFUVVNfSF9SRVNFVHxLRVlCRF9TVEFUVVNfQlJPV05PVVQpOwoJaWYgKGVycmNkKSB7CgkJZ2QtPmtiZF9zdGF0dXMgfD0gZXJyY2QgPDwgODsKCX0KCS8qIFJlc2V0IGVycm9yIGNvZGUgYW5kIHZlcmlmeSAqLwoJdmFsID0gS0VZQkRfQ01EX1JFU0VUX0VSUk9SUzsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJdWRlbGF5KDEwMDApOwkvKiBkZWxheSBORUVERUQgYnkga2V5Ym9hcmQgUElDICEhISAqLwoKCXZhbCA9IEtFWUJEX0NNRF9SRUFEX1NUQVRVUzsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCgl2YWwgJj0gS0VZQkRfU1RBVFVTX01BU0s7CS8qIGNsZWFyIHVudXNlZCBiaXRzICovCglpZiAodmFsKSB7CQkJLyogcGVybWFuZW50IGVycm9yLCByZXBvcnQgaXQgKi8KCQlnZC0+a2JkX3N0YXR1cyB8PSB2YWw7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiBSZWFkIGN1cnJlbnQga2V5Ym9hcmQgc3RhdGUuCgkgKgoJICogQWZ0ZXIgdGhlIGVycm9yIHJlc2V0IGl0IG1heSB0YWtlIHNvbWUgdGltZSBiZWZvcmUgdGhlCgkgKiBrZXlib2FyZCBQSUMgcGlja3MgdXAgYSB2YWxpZCBrZXlib2FyZCBzY2FuIC0gdGhlIHRvdGFsCgkgKiBzY2FuIHRpbWUgaXMgYXBwcm94LiAxLjYgbXMgKGluZm9ybWF0aW9uIGJ5IE1hcnRpbiBSYWplaywKCSAqIDI4IFNlcCAyMDAyKS4gV2UgcmVhZCBhIGNvdXBsZSBvZiB0aW1lcyBmb3IgdGhlIGtleWJvYXJkCgkgKiB0byBzdGFiaWxpemUsIHVzaW5nIGEgYmlnIGVub3VnaCBkZWxheS4KCSAqIDEwIHRpbWVzIHNob3VsZCBiZSBlbm91Z2guIElmIHRoZSBkYXRhIGlzIHN0aWxsIGNoYW5naW5nLAoJICogd2UgdXNlIHdoYXQgd2UgZ2V0IDotKAoJICovCgoJbWVtc2V0ICh0bXBfZGF0YSwgMHhGRiwgS0VZQkRfREFUQUxFTik7CS8qIGltcG9zc2libGUgdmFsdWUgKi8KCWZvciAoaT0wOyBpPDEwOyArK2kpIHsKCQl2YWwgPSBLRVlCRF9DTURfUkVBRF9LRVlTOwoJCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOwoKCQlpZiAobWVtY21wKGtiZF9kYXRhLCB0bXBfZGF0YSwgS0VZQkRfREFUQUxFTikgPT0gMCkgewoJCQkvKiBjb25zaXN0ZW50IHN0YXRlLCBkb25lICovCgkJCWJyZWFrOwoJCX0KCQkvKiByZW1lYmVyIGxhc3Qgc3RhdGUsIGRlbGF5LCBhbmQgcmV0cnkgKi8KCQltZW1jcHkgKHRtcF9kYXRhLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CgkJdWRlbGF5ICg1MDAwKTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IG1pc2NfaW5pdF9yICh2b2lkKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBub25lClAqClAqIFJldHVybnZhbHVlOiAgaW50ClAqICAgICAgICAgICAgICAgIC0gMCBpcyBhbHdheXMgcmV0dXJuZWQsIGV2ZW4gaW4gdGhlIGNhc2Ugb2YgYSBrZXlib2FyZApQKiAgICAgICAgICAgICAgICAgICAgZXJyb3IuCiAqCloqIEludGVudGlvbjogICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWlzY19pbml0X3IoKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLgpaKiAgICAgICAgICAgICAgIFRoZSBrZXlib2FyZCBjb250cm9sbGVyIGlzIGluaXRpYWxpemVkIGFuZCB0aGUgcmVzdWx0CloqICAgICAgICAgICAgICAgb2YgYSByZWFkIGNvcGllZCB0byB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgImtleWJkIi4KWiogICAgICAgICAgICAgICBJZiBLRVlCRF9TRVRfREVCVUdNT0RFIGlzIGRlZmluZWQsIGEgY2hlY2sgaXMgbWFkZSBmb3IKWiogICAgICAgICAgICAgICB0aGlzIGtleSwgYW5kIGlmIGZvdW5kIGRpc3BsYXkgdG8gdGhlIExDRCB3aWxsIGJlIGVuYWJsZWQuCloqICAgICAgICAgICAgICAgVGhlIGtleXMgaW4gImtleWJkIiBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBtYWdpYwpaKiAgICAgICAgICAgICAgIGtleWNvbW1hbmRzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LgpaKiAgICAgICAgICAgICAgIFNlZSBhbHNvIGtleV9tYXRjaCgpLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgbWlzY19pbml0X3IgKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKCXVjaGFyIGtiZF9kYXRhW0tFWUJEX0RBVEFMRU5dOwoJdWNoYXIga2V5YmRfZW52WzIgKiBLRVlCRF9EQVRBTEVOICsgMV07Cgl1Y2hhciBrYmRfaW5pdF9zdGF0dXMgPSBnZC0+a2JkX3N0YXR1cyA+PiA4OwoJdWNoYXIga2JkX3N0YXR1cyA9IGdkLT5rYmRfc3RhdHVzOwoJdWNoYXIgdmFsOwoJdWNoYXIgKnN0cjsKCWludCBpOwoKCWlmIChrYmRfaW5pdF9zdGF0dXMpIHsKCQlwcmludGYgKCJLRVlCRDogRXJyb3IgJTAyWFxuIiwga2JkX2luaXRfc3RhdHVzKTsKCX0KCWlmIChrYmRfc3RhdHVzKSB7CQkvKiBwZXJtYW5lbnQgZXJyb3IsIHJlcG9ydCBpdCAqLwoJCXByaW50ZiAoIioqKiBLZXlib2FyZCBlcnJvciBjb2RlICUwMlggKioqXG4iLCBrYmRfc3RhdHVzKTsKCQlzcHJpbnRmIChrZXliZF9lbnYsICIlMDJYIiwga2JkX3N0YXR1cyk7CgkJc2V0ZW52ICgia2V5YmQiLCBrZXliZF9lbnYpOwoJCXJldHVybiAwOwoJfQoKCS8qCgkgKiBOb3cgd2Uga25vdyB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICBrZXlib2FyZCwgIHNvICBkaXNhYmxlCgkgKiBhbGwgb3V0cHV0IHRvIHRoZSBMQ0QgZXhjZXB0IHdoZW4gYSBrZXkgcHJlc3MgaXMgZGV0ZWN0ZWQuCgkgKi8KCglpZiAoKGNvbnNvbGVfYXNzaWduIChzdGRvdXQsICJzZXJpYWwiKSA8IDApIHx8CgkJKGNvbnNvbGVfYXNzaWduIChzdGRlcnIsICJzZXJpYWwiKSA8IDApKSB7CgkJcHJpbnRmICgiQ2FuJ3QgYXNzaWduIHNlcmlhbCBwb3J0IGFzIG91dHB1dCBkZXZpY2VcbiIpOwoJfQoKCS8qIFJlYWQgVmVyc2lvbiAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfVkVSU0lPTjsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfVkVSU0lPTkxFTik7CglwcmludGYgKCJLRVlCRDogVmVyc2lvbiAlZC4lZFxuIiwga2JkX2RhdGFbMF0sIGtiZF9kYXRhWzFdKTsKCgkvKiBSZWFkIGN1cnJlbnQga2V5Ym9hcmQgc3RhdGUgKi8KCXZhbCA9IEtFWUJEX0NNRF9SRUFEX0tFWVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOwoKCWZvciAoaSA9IDA7IGkgPCBLRVlCRF9EQVRBTEVOOyArK2kpIHsKCQlzcHJpbnRmIChrZXliZF9lbnYgKyBpICsgaSwgIiUwMlgiLCBrYmRfZGF0YVtpXSk7Cgl9CglzZXRlbnYgKCJrZXliZCIsIGtleWJkX2Vudik7CgoJc3RyID0gc3RyZHVwIChrZXlfbWF0Y2ggKGtiZF9kYXRhKSk7CS8qIGRlY29kZSBrZXlzICovCiNpZmRlZiBLRVlCRF9TRVRfREVCVUdNT0RFCglpZiAoa2JkX2RhdGFbMF0gPT0gS0VZQkRfU0VUX0RFQlVHTU9ERSkgewkvKiBzZXQgZGVidWcgbW9kZSAqLwoJCWlmICgoY29uc29sZV9hc3NpZ24gKHN0ZG91dCwgImxjZCIpIDwgMCkgfHwKCQkJKGNvbnNvbGVfYXNzaWduIChzdGRlcnIsICJsY2QiKSA8IDApKSB7CgkJCXByaW50ZiAoIkNhbid0IGFzc2lnbiBMQ0QgZGlzcGxheSBhcyBvdXRwdXQgZGV2aWNlXG4iKTsKCQl9Cgl9CiNlbmRpZiAvKiBLRVlCRF9TRVRfREVCVUdNT0RFICovCiNpZmRlZiBDT05GSUdfUFJFQk9PVAkvKiBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSAicHJlYm9vdCIgY29tbWFuZCBvbiBrZXkgbWF0Y2ggKi8KCXNldGVudiAoInByZWJvb3QiLCBzdHIpOwkvKiBzZXQgb3IgZGVsZXRlIGRlZmluaXRpb24gKi8KI2VuZGlmIC8qIENPTkZJR19QUkVCT09UICovCglpZiAoc3RyICE9IE5VTEwpIHsKCQlmcmVlIChzdHIpOwoJfQoJcmV0dXJuICgwKTsKfQoKI2lmZGVmIENPTkZJR19QUkVCT09UCgpzdGF0aWMgdWNoYXIga2JkX21hZ2ljX3ByZWZpeFtdID0gImtleV9tYWdpYyI7CnN0YXRpYyB1Y2hhciBrYmRfY29tbWFuZF9wcmVmaXhbXSA9ICJrZXlfY21kIjsKCnN0YXRpYyBpbnQgY29tcGFyZV9tYWdpYyAodWNoYXIgKmtiZF9kYXRhLCB1Y2hhciAqc3RyKQp7Cgl1Y2hhciBjb21wYXJlW0tFWUJEX0RBVEFMRU4tMV07CgljaGFyICpueHQ7CglpbnQgaTsKCgkvKiBEb24ndCBpbmNsdWRlIG1vZGlmaWVyIGJ5dGUgKi8KCW1lbWNweSAoY29tcGFyZSwga2JkX2RhdGErMSwgS0VZQkRfREFUQUxFTi0xKTsKCglmb3IgKDsgc3RyICE9IE5VTEw7IHN0ciA9ICgqbnh0KSA/IG54dCsxIDogbnh0KSB7CgkJdWNoYXIgYzsKCQlpbnQgazsKCgkJYyA9ICh1Y2hhcikgc2ltcGxlX3N0cnRvdWwgKHN0ciwgKGNoYXIgKiopICgmbnh0KSwgMTYpOwoKCQlpZiAoc3RyID09ICh1Y2hhciAqKW54dCkgewkvKiBpbnZhbGlkIGNoYXJhY3RlciAqLwoJCQlicmVhazsKCQl9CgoJCS8qCgkJICogQ2hlY2sgaWYgdGhpcyBrZXkgbWF0Y2hlcyB0aGUgaW5wdXQuCgkJICogU2V0IG1hdGNoZXMgdG8gemVybywgc28gdGhleSBtYXRjaCBvbmx5IG9uY2UKCQkgKiBhbmQgd2UgY2FuIGZpbmQgZHVwbGljYXRlcyBvciBleHRyYSBrZXlzCgkJICovCgkJZm9yIChrID0gMDsgayA8IHNpemVvZihjb21wYXJlKTsgKytrKSB7CgkJCWlmIChjb21wYXJlW2tdID09ICdcMCcpCS8qIG9ubHkgbm9uLXplcm8gZW50cmllcyAqLwoJCQkJY29udGludWU7CgkJCWlmIChjID09IGNvbXBhcmVba10pIHsJLyogZm91bmQgbWF0Y2hpbmcga2V5ICovCgkJCQljb21wYXJlW2tdID0gJ1wwJzsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChrID09IHNpemVvZihjb21wYXJlKSkgewoJCQlyZXR1cm4gLTE7CQkvKiB1bm1hdGNoZWQga2V5ICovCgkJfQoJfQoKCS8qCgkgKiBBIGZ1bGwgbWF0Y2ggbGVhdmVzIG5vIGtleXMgaW4gdGhlIGBjb21wYXJlJyBhcnJheSwKCSAqLwoJZm9yIChpID0gMDsgaSA8IHNpemVvZihjb21wYXJlKTsgKytpKSB7CgkJaWYgKGNvbXBhcmVbaV0pCgkJewoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBzdGF0aWMgdWNoYXIgKmtleV9tYXRjaCAodWNoYXIgKmtiZF9kYXRhKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICB1Y2hhciAqa2JkX2RhdGEKUCogICAgICAgICAgICAgICAgLSBUaGUga2V5cyB0byBtYXRjaCBhZ2FpbnN0IG91ciBtYWdpYyBkZWZpbml0aW9ucwpQKgpQKiBSZXR1cm52YWx1ZTogIHVjaGFyICoKUCogICAgICAgICAgICAgICAgLSAhPSBOVUxMOiBQb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQocykKUCogICAgICAgICAgICAgICAgICAgICBOVUxMOiBObyBtYWdpYyBpcyBhYm91dCB0byBoYXBwZW4KICoKWiogSW50ZW50aW9uOiAgICBDaGVjayBpZiBwcmVzc2VkIGtleShzKSBtYXRjaCBtYWdpYyBzZXF1ZW5jZSwKWiogICAgICAgICAgICAgICBhbmQgcmV0dXJuIHRoZSBjb21tYW5kIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkocykuCloqCloqICAgICAgICAgICAgICAgSWYgbm8ga2V5IHByZXNzIHdhcyBkZWNvZGVkLCBOVUxMIGlzIHJldHVybmVkLgpaKgpaKiAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGFyZ3VtZW50IHdpbGwgYmUKWiogICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiB3aXRoIHRoZSAibWFnaWMgY2hhcmN0ZXIgY29kZSIgb2YgdGhlCloqICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBrZXkocyksIG9yICdcMCcuCloqCloqICAgICAgICAgICAgICAgTm90ZTogdGhlIHN0cmluZyBwb2ludHMgdG8gc3RhdGljIGVudmlyb25tZW50IGRhdGEKWiogICAgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBiZSBzYXZlZCBiZWZvcmUgeW91IGNhbGwgYW55IGZ1bmN0aW9uIHRoYXQKWiogICAgICAgICAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZW52aXJvbm1lbnQuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB1Y2hhciAqa2V5X21hdGNoICh1Y2hhciAqa2JkX2RhdGEpCnsKCXVjaGFyIG1hZ2ljW3NpemVvZiAoa2JkX21hZ2ljX3ByZWZpeCkgKyAxXTsKCXVjaGFyICpzdWZmaXg7Cgl1Y2hhciAqa2JkX21hZ2ljX2tleXM7CgoJLyoKCSAqIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGRlZmluZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCBjYW4gcGUgYXBwZW5kZWQKCSAqIHRvICJrZXlfbWFnaWMiIHRvIGZvcm0gdGhlIG5hbWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0CgkgKiBob2xkICJtYWdpYyIga2V5IGNvZGVzLCBpLiBlLiBzdWNoIGtleSBjb2RlcyB0aGF0IGNhbiBjYXVzZQoJICogcHJlLWJvb3QgYWN0aW9ucy4gSWYgdGhlIHN0cmluZyBpcyBlbXB0eSAoIiIpLCB0aGVuIG9ubHkKCSAqICJrZXlfbWFnaWMiIGlzIGNoZWNrZWQgKG9sZCBiZWhhdmlvdXIpOyB0aGUgc3RyaW5nICIxMjUiIGNhdXNlcwoJICogY2hlY2tzIGZvciAia2V5X21hZ2ljMSIsICJrZXlfbWFnaWMyIiBhbmQgImtleV9tYWdpYzUiLCBldGMuCgkgKi8KCWlmICgoa2JkX21hZ2ljX2tleXMgPSBnZXRlbnYgKCJtYWdpY19rZXlzIikpID09IE5VTEwpCgkJa2JkX21hZ2ljX2tleXMgPSAiIjsKCgkvKiBsb29wIG92ZXIgYWxsIG1hZ2ljIGtleXM7CgkgKiB1c2UgJ1wwJyBzdWZmaXggaW4gY2FzZSBvZiBlbXB0eSBzdHJpbmcKCSAqLwoJZm9yIChzdWZmaXg9a2JkX21hZ2ljX2tleXM7ICpzdWZmaXggfHwgc3VmZml4PT1rYmRfbWFnaWNfa2V5czsgKytzdWZmaXgpIHsKCQlzcHJpbnRmIChtYWdpYywgIiVzJWMiLCBrYmRfbWFnaWNfcHJlZml4LCAqc3VmZml4KTsKI2lmIDAKCQlwcmludGYgKCIjIyMgQ2hlY2sgbWFnaWMgXCIlc1wiXG4iLCBtYWdpYyk7CiNlbmRpZgoJCWlmIChjb21wYXJlX21hZ2ljKGtiZF9kYXRhLCBnZXRlbnYobWFnaWMpKSA9PSAwKSB7CgkJCXVjaGFyIGNtZF9uYW1lW3NpemVvZiAoa2JkX2NvbW1hbmRfcHJlZml4KSArIDFdOwoJCQljaGFyICpjbWQ7CgoJCQlzcHJpbnRmIChjbWRfbmFtZSwgIiVzJWMiLCBrYmRfY29tbWFuZF9wcmVmaXgsICpzdWZmaXgpOwoKCQkJY21kID0gZ2V0ZW52IChjbWRfbmFtZSk7CiNpZiAwCgkJCXByaW50ZiAoIiMjIyBTZXQgUFJFQk9PVCB0byAkKCVzKTogXCIlc1wiXG4iLAoJCQkJCWNtZF9uYW1lLCBjbWQgPyBjbWQgOiAiPDxOVUxMPj4iKTsKI2VuZGlmCgkJCSprYmRfZGF0YSA9ICpzdWZmaXg7CgkJCXJldHVybiAoY21kKTsKCQl9Cgl9CiNpZiAwCglwcmludGYgKCIjIyMgRGVsZXRlIFBSRUJPT1RcbiIpOwojZW5kaWYKCSprYmRfZGF0YSA9ICdcMCc7CglyZXR1cm4gKE5VTEwpOwp9CiNlbmRpZiAvKiBDT05GSUdfUFJFQk9PVCAqLwoKLyotLS0tLS0tLS0tLS0tLS1Cb2FyZCBTcGVjaWFsIENvbW1hbmRzOiBQSUMgcmVhZC93cml0ZSAtLS0tLS0tLS0tLS0tLS0qLwoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGRvX3BpYyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsCkYqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgY21kX3RibF90ICpjbWR0cApQKiAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gb3VyIGNvbW1hbmQgdGFibGUgZW50cnkKUCogICAgICAgICAgICAgICBpbnQgZmxhZwpQKiAgICAgICAgICAgICAgICAtIElmIHRoZSBDTURfRkxBR19SRVBFQVQgYml0IGlzIHNldCwgdGhlbiB0aGlzIGNhbGwgaXMKUCogICAgICAgICAgICAgICAgICBhIHJlcGV0aXRpb24KUCogICAgICAgICAgICAgICBpbnQgYXJnYwpQKiAgICAgICAgICAgICAgICAtIEFyZ3VtZW50IGNvdW50ClAqICAgICAgICAgICAgICAgY2hhciAqYXJndltdClAqICAgICAgICAgICAgICAgIC0gQXJyYXkgb2YgdGhlIGFjdHVhbCBhcmd1bWVudHMKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwICBUaGUgY29tbWFuZCB3YXMgaGFuZGxlZCBzdWNjZXNzZnVsbHkKUCogICAgICAgICAgICAgICAgICAxICBBbiBlcnJvciBvY2N1cnJlZAogKgpaKiBJbnRlbnRpb246ICAgIEltcGxlbWVudCB0aGUgInBpYyBbcmVhZHx3cml0ZV0iIGNvbW1hbmRzLgpaKiAgICAgICAgICAgICAgIFRoZSByZWFkIHN1YmNvbW1hbmQgdGFrZXMgb25lIGFyZ3VtZW50LCB0aGUgcmVnaXN0ZXIsCloqICAgICAgICAgICAgICAgd2hlcmVhcyB0aGUgd3JpdGUgY29tbWFuZCB0YWtlcyB0d28sIHRoZSByZWdpc3RlciBhbmQKWiogICAgICAgICAgICAgICB0aGUgbmV3IHZhbHVlLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgZG9fcGljIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJdWNoYXIgcmVnLCB2YWw7CgoJc3dpdGNoIChhcmdjKSB7CgljYXNlIDM6CQkJCQkvKiBQSUMgcmVhZCByZWcgKi8KCQlpZiAoc3RyY21wIChhcmd2WzFdLCAicmVhZCIpICE9IDApCgkJCWJyZWFrOwoKCQlyZWcgPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOwoKCQlwcmludGYgKCJQSUMgcmVhZDogcmVnICUwMng6ICUwMnhcblxuIiwgcmVnLCBwaWNfcmVhZCAocmVnKSk7CgoJCXJldHVybiAwOwoJY2FzZSA0OgkJCQkJLyogUElDIHdyaXRlIHJlZyB2YWwgKi8KCQlpZiAoc3RyY21wIChhcmd2WzFdLCAid3JpdGUiKSAhPSAwKQoJCQlicmVhazsKCgkJcmVnID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKCQl2YWwgPSBzaW1wbGVfc3RydG91bCAoYXJndlszXSwgTlVMTCwgMTYpOwoKCQlwcmludGYgKCJQSUMgd3JpdGU6IHJlZyAlMDJ4IHZhbCAweCUwMng6ICUwMnggPT4gIiwKCQkJCXJlZywgdmFsLCBwaWNfcmVhZCAocmVnKSk7CgkJcGljX3dyaXRlIChyZWcsIHZhbCk7CgkJcHJpbnRmICgiJTAyeFxuXG4iLCBwaWNfcmVhZCAocmVnKSk7CgkJcmV0dXJuIDA7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglwaWMsCTQsCTEsCWRvX3BpYywKCSJwaWMgICAgIC0gcmVhZCBhbmQgd3JpdGUgUElDIHJlZ2lzdGVyc1xuIiwKCSJyZWFkICByZWcgICAgICAtIHJlYWQgUElDIHJlZ2lzdGVyIGByZWcnXG4iCgkicGljIHdyaXRlIHJlZyB2YWwgIC0gd3JpdGUgdmFsdWUgYHZhbCcgdG8gUElDIHJlZ2lzdGVyIGByZWcnXG4iCik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgZG9fa2JkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKRiogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBjbWRfdGJsX3QgKmNtZHRwClAqICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBvdXIgY29tbWFuZCB0YWJsZSBlbnRyeQpQKiAgICAgICAgICAgICAgIGludCBmbGFnClAqICAgICAgICAgICAgICAgIC0gSWYgdGhlIENNRF9GTEFHX1JFUEVBVCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgY2FsbCBpcwpQKiAgICAgICAgICAgICAgICAgIGEgcmVwZXRpdGlvbgpQKiAgICAgICAgICAgICAgIGludCBhcmdjClAqICAgICAgICAgICAgICAgIC0gQXJndW1lbnQgY291bnQKUCogICAgICAgICAgICAgICBjaGFyICphcmd2W10KUCogICAgICAgICAgICAgICAgLSBBcnJheSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50cwpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgaXMgYWx3YXlzIHJldHVybmVkLgogKgpaKiBJbnRlbnRpb246ICAgIEltcGxlbWVudCB0aGUgImtiZCIgY29tbWFuZC4KWiogICAgICAgICAgICAgICBUaGUga2V5Ym9hcmQgc3RhdHVzIGlzIHJlYWQuICBUaGUgcmVzdWx0IGlzIHByaW50ZWQgb24KWiogICAgICAgICAgICAgICB0aGUgY29uc29sZSBhbmQgd3JpdHRlbiBpbnRvIHRoZSAia2V5YmQiIGVudmlyb25tZW50CloqICAgICAgICAgICAgICAgdmFyaWFibGUuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBkb19rYmQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQp7Cgl1Y2hhciBrYmRfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIGtleWJkX2VudlsyICogS0VZQkRfREFUQUxFTiArIDFdOwoJdWNoYXIgdmFsOwoJaW50IGk7CgojaWYgMCAvKiBEb25lIGluIGtiZF9pbml0ICovCglpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CiNlbmRpZgoKCS8qIFJlYWQga2V5cyAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfS0VZUzsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CgoJcHV0cyAoIktleXM6Iik7Cglmb3IgKGkgPSAwOyBpIDwgS0VZQkRfREFUQUxFTjsgKytpKSB7CgkJc3ByaW50ZiAoa2V5YmRfZW52ICsgaSArIGksICIlMDJYIiwga2JkX2RhdGFbaV0pOwoJCXByaW50ZiAoIiAlMDJ4Iiwga2JkX2RhdGFbaV0pOwoJfQoJcHV0YyAoJ1xuJyk7CglzZXRlbnYgKCJrZXliZCIsIGtleWJkX2Vudik7CglyZXR1cm4gMDsKfQoKVV9CT09UX0NNRCgKCWtiZCwJMSwJMSwJZG9fa2JkLAoJImtiZCAgICAgLSByZWFkIGtleWJvYXJkIHN0YXR1c1xuIiwKCU5VTEwKKTsKCi8qIFJlYWQgYW5kIHNldCBMU0Igc3dpdGNoICovCiNkZWZpbmUgQ0ZHX1BDX1RYRDFfRU5BCQkweDAwMDgJCS8qIFBDLjEyICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgZG9fbHNiIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKRiogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBjbWRfdGJsX3QgKmNtZHRwClAqICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBvdXIgY29tbWFuZCB0YWJsZSBlbnRyeQpQKiAgICAgICAgICAgICAgIGludCBmbGFnClAqICAgICAgICAgICAgICAgIC0gSWYgdGhlIENNRF9GTEFHX1JFUEVBVCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgY2FsbCBpcwpQKiAgICAgICAgICAgICAgICAgIGEgcmVwZXRpdGlvbgpQKiAgICAgICAgICAgICAgIGludCBhcmdjClAqICAgICAgICAgICAgICAgIC0gQXJndW1lbnQgY291bnQKUCogICAgICAgICAgICAgICBjaGFyICphcmd2W10KUCogICAgICAgICAgICAgICAgLSBBcnJheSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50cwpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgIFRoZSBjb21tYW5kIHdhcyBoYW5kbGVkIHN1Y2Nlc3NmdWxseQpQKiAgICAgICAgICAgICAgICAgIDEgIEFuIGVycm9yIG9jY3VycmVkCiAqCloqIEludGVudGlvbjogICAgSW1wbGVtZW50IHRoZSAibHNiIFtvbnxvZmZdIiBjb21tYW5kcy4KWiogICAgICAgICAgICAgICBUaGUgbHNiIGlzIHN3aXRjaGVkIGFjY29yZGluZyB0byB0aGUgZmlyc3QgcGFyYW1ldGVyIGJ5CloqICAgICAgICAgICAgICAgYnkgc2lnbmFsaW5nIHRoZSBQSUMgSS9PIGV4cGFuZGVyLgpaKiAgICAgICAgICAgICAgIENhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgdGhlIGN1cnJlbnQgc2V0dGluZyBpcwpaKiAgICAgICAgICAgICAgIHByaW50ZWQuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBkb19sc2IgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQp7Cgl1Y2hhciB2YWw7CglpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CgoJc3dpdGNoIChhcmdjKSB7CgljYXNlIDE6CQkJCQkvKiBsc2IgLSBwcmludCBzZXR0aW5nICovCgkJdmFsID0gcGljX3JlYWQgKDB4NjApOwoJCXByaW50ZiAoIkxTQiBpcyBvJXNcbiIsICh2YWwgJiAweDIwKSA/ICJuIiA6ICJmZiIpOwoJCXJldHVybiAwOwoJY2FzZSAyOgkJCQkJLyogbHNiIG9uIG9yIGxzYiBvZmYgLSBzZXQgc3dpdGNoICovCgkJdmFsID0gcGljX3JlYWQgKDB4NjApOwoKCQlpZiAoc3RyY21wIChhcmd2WzFdLCAib24iKSA9PSAwKSB7CgkJCXZhbCB8PSAweDIwOwoJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oQ0ZHX1BDX1RYRDFfRU5BKTsKCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSBDRkdfUENfVFhEMV9FTkE7CgkJCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gQ0ZHX1BDX1RYRDFfRU5BOwoJCX0gZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAib2ZmIikgPT0gMCkgewoJCQl2YWwgJj0gfjB4MjA7CgkJCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfihDRkdfUENfVFhEMV9FTkEpOwoJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oQ0ZHX1BDX1RYRDFfRU5BKTsKCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSBDRkdfUENfVFhEMV9FTkE7CgkJfSBlbHNlIHsKCQkJYnJlYWs7CgkJfQoJCXBpY193cml0ZSAoMHg2MCwgdmFsKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwoJcmV0dXJuIDE7Cn0KClVfQk9PVF9DTUQoCglsc2IsCTIsCTEsCWRvX2xzYiwKCSJsc2IgICAgIC0gY2hlY2sgYW5kIHNldCBMU0Igc3dpdGNoXG4iLAoJIm9uICAtIHN3aXRjaCBMU0Igb25cbiIKCSJsc2Igb2ZmIC0gc3dpdGNoIExTQiBvZmZcbiIKCSJsc2IgICAgIC0gcHJpbnQgY3VycmVudCBzZXR0aW5nXG4iCik7CgojZW5kaWYgLyogQ0ZHX0NNRF9CU1AgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgdWNoYXIgcGljX3JlYWQgKHVjaGFyIHJlZykgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgdWNoYXIgcmVnClAqICAgICAgICAgICAgICAgIC0gUmVnaXN0ZXIgdG8gcmVhZApQKgpQKiBSZXR1cm52YWx1ZTogIHVjaGFyClAqICAgICAgICAgICAgICAgIC0gVmFsdWUgcmVhZCBmcm9tIHJlZ2lzdGVyCiAqCloqIEludGVudGlvbjogICAgUmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIFBJQyBJL08gZXhwYW5kZXIuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVjaGFyIHBpY19yZWFkICh1Y2hhciByZWcpCnsKCXJldHVybiAoaTJjX3JlZ19yZWFkIChDRkdfSTJDX1BJQ0lPX0FERFIsIHJlZykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICB2b2lkIHBpY193cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIHVjaGFyIHJlZwpQKiAgICAgICAgICAgICAgICAtIFJlZ2lzdGVyIHRvIHJlYWQKUCogICAgICAgICAgICAgICB1Y2hhciB2YWwKUCogICAgICAgICAgICAgICAgLSBWYWx1ZSB0byB3cml0ZQpQKgpQKiBSZXR1cm52YWx1ZTogIG5vbmUKICoKWiogSW50ZW50aW9uOiAgICBXcml0ZSB0byBhIHJlZ2lzdGVyIG9uIHRoZSBQSUMgSS9PIGV4cGFuZGVyLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHBpY193cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpCnsKCWkyY19yZWdfd3JpdGUgKENGR19JMkNfUElDSU9fQUREUiwgcmVnLCB2YWwpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQm9hcmQgQ29udHJvbCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIHZvaWQgYm9hcmRfcG93ZXJvZmYgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBub25lCiAqCloqIEludGVudGlvbjogICAgVHVybiBvZmYgdGhlIGJhdHRlcnkgcG93ZXIgYW5kIGxvb3AgZW5kbGVzcywgc28gdGhpcwpaKiAgICAgICAgICAgICAgIHNob3VsZCBiZXR0ZXIgYmUgdGhlIGxhc3QgZnVuY3Rpb24geW91IGNhbGwuLi4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBib2FyZF9wb3dlcm9mZiAodm9pZCkKewogICAgLyogVHVybiBiYXR0ZXJ5IG9mZiAqLwogICAgKCh2b2xhdGlsZSBpbW1hcF90ICopQ0ZHX0lNTVIpLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oMSA8PCAoMzEgLSAxMykpOwoKICAgIHdoaWxlICgxKTsKfQoKI2lmZGVmIENPTkZJR19NT0RFTV9TVVBQT1JUCnN0YXRpYyBpbnQga2V5X3ByZXNzZWQodm9pZCkKewoJdWNoYXIga2JkX2RhdGFbS0VZQkRfREFUQUxFTl07Cgl1Y2hhciB2YWw7CgoJLyogUmVhZCBrZXlzICovCgl2YWwgPSBLRVlCRF9DTURfUkVBRF9LRVlTOwoJaTJjX3dyaXRlIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CglpMmNfcmVhZCAoa2JkX2FkZHIsIDAsIDAsIGtiZF9kYXRhLCBLRVlCRF9EQVRBTEVOKTsKCglyZXR1cm4gKGNvbXBhcmVfbWFnaWMoa2JkX2RhdGEsIENPTkZJR19NT0RFTV9LRVlfTUFHSUMpID09IDApOwp9CiNlbmRpZgkvKiBDT05GSUdfTU9ERU1fU1VQUE9SVCAqLwoKI2lmZGVmIENPTkZJR19QT1NUCi8qCiAqIFJldHVybnMgMSBpZiBrZXlzIHByZXNzZWQgdG8gc3RhcnQgdGhlIHBvd2VyLW9uIGxvbmctcnVubmluZyB0ZXN0cwogKiBDYWxsZWQgZnJvbSBib2FyZF9pbml0X2YoKS4KICovCmludCBwb3N0X2hvdGtleXNfcHJlc3NlZCh2b2lkKQp7Cgl1Y2hhciBrYmRfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIHZhbDsKCgkvKiBSZWFkIGtleXMgKi8KCXZhbCA9IEtFWUJEX0NNRF9SRUFEX0tFWVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwga2JkX2RhdGEsIEtFWUJEX0RBVEFMRU4pOwoKCXJldHVybiAoY29tcGFyZV9tYWdpYyhrYmRfZGF0YSwgQ09ORklHX1BPU1RfS0VZX01BR0lDKSA9PSAwKTsKfQojZW5kaWYK