ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dAppbmRleCAxNjc5OWNlLi41MWIxY2QzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2dvdmVybm9ycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9nb3Zlcm5vcnMudHh0CkBAIC0yMTIsMTMgKzIxMiwxMyBAQAogd2l0aGluIDEtMiB0aWNrcy4gIElmIHRoZSBjcHUgaXMgdmVyeSBidXN5IGJldHdlZW4gZXhpdGluZyBpZGxlIGFuZAogd2hlbiB0aGUgdGltZXIgZmlyZXMgdGhlbiB3ZSBhc3N1bWUgdGhlIGNwdSBpcyB1bmRlcnBvd2VyZWQgYW5kIHJhbXAKIHRvIE1BWCBzcGVlZC4KLSAgICAKKwogSWYgdGhlIGNwdSB3YXMgbm90IHN1ZmZpY2llbnRseSBidXN5IHRvIGltbWVkaWF0ZWx5IHJhbXAgdG8gTUFYIHNwZWVkLAogdGhlbiBnb3Zlcm5vciBldmFsdWF0ZXMgdGhlIGNwdSBsb2FkIHNpbmNlIHRoZSBsYXN0IHNwZWVkIGFkanVzdG1lbnQsCi1jaG9vc2luZyB0aCBoaWdoZXN0IHZhbHVlIGJldHdlZW4gdGhhdCBsb25nZXItdGVybSBsb2FkIG9yIHRoZQorY2hvb3NpbmcgdGhlIGhpZ2hlc3QgdmFsdWUgYmV0d2VlbiB0aGF0IGxvbmdlci10ZXJtIGxvYWQgb3IgdGhlCiBzaG9ydC10ZXJtIGxvYWQgc2luY2UgaWRsZSBleGl0IHRvIGRldGVybWluZSB0aGUgY3B1IHNwZWVkIHRvIHJhbXAgdG8uCiAKLVRoZSB0dW5lYWJsZSB2YWx1ZSBmb3IgdGhpcyBnb3Zlcm5vciBhcmU6CitUaGUgdHVuZWFibGUgdmFsdWVzIGZvciB0aGlzIGdvdmVybm9yIGFyZToKIAogbWluX3NhbXBsZV90aW1lOiBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSB0byBzcGVuZCBhdCB0aGUgY3VycmVudAogZnJlcXVlbmN5IGJlZm9yZSByYW1waW5nIGRvd24uIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGdvdmVybm9yIGhhcwpAQCAtMjI4LDYgKzIyOCw4IEBACiBnb19tYXhzcGVlZF9sb2FkOiBUaGUgQ1BVIGxvYWQgYXQgd2hpY2ggdG8gcmFtcCB0byBtYXggc3BlZWQuICBEZWZhdWx0CiBpcyA4NS4KIAordGltZXJfcmF0ZTogU2FtcGxlIHJhdGUgZm9yIHJlZXZhbHVhdGluZyBjcHUgbG9hZCB3aGVuIHRoZSBzeXN0ZW0gaXMKK25vdCBpZGxlLiAgRGVmYXVsdCBpcyAzMDAwMCB1Uy4KIAogMy4gVGhlIEdvdmVybm9yIEludGVyZmFjZSBpbiB0aGUgQ1BVZnJlcSBDb3JlCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY2FjaGluZy9uZXRmcy1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9jYWNoaW5nL25ldGZzLWFwaS50eHQKaW5kZXggYTE2N2FiOC4uN2NjNmJmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9jYWNoaW5nL25ldGZzLWFwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9jYWNoaW5nL25ldGZzLWFwaS50eHQKQEAgLTY3Myw2ICs2NzMsMjIgQEAKIGluIHdoaWNoIGNhc2UgdGhlIHBhZ2Ugd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSBjYWNoZSB0aGlzIHRpbWUuCiAKIAorQlVMSyBJTk9ERSBQQUdFIFVOQ0FDSEUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgY29udmVuaWVuY2Ugcm91dGluZSBpcyBwcm92aWRlZCB0byBwZXJmb3JtIGFuIHVuY2FjaGUgb24gYWxsIHRoZSBwYWdlcworYXR0YWNoZWQgdG8gYW4gaW5vZGUuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgcGFnZXMgb24gdGhlIGlub2RlIGNvcnJlc3BvbmQgb24gYQorMToxIGJhc2lzIHdpdGggdGhlIHBhZ2VzIGluIHRoZSBjYWNoZS4KKworCXZvaWQgZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSwKKwkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworVGhpcyB0YWtlcyB0aGUgbmV0ZnMgY29va2llIHRoYXQgdGhlIHBhZ2VzIHdlcmUgY2FjaGVkIHdpdGggYW5kIHRoZSBpbm9kZSB0aGF0Cit0aGUgcGFnZXMgYXJlIGF0dGFjaGVkIHRvLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHBhZ2VzIHRvIGZpbmlzaCBiZWluZword3JpdHRlbiB0byB0aGUgY2FjaGUgYW5kIGZvciB0aGUgY2FjaGUgdG8gZmluaXNoIHdpdGggdGhlIHBhZ2UgZ2VuZXJhbGx5LiAgTm8KK2Vycm9yIGlzIHJldHVybmVkLgorCisKID09PT09PT09PT09PT09PT09PT09PT09PT09CiBJTkRFWCBBTkQgREFUQSBGSUxFIFVQREFURQogPT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwppbmRleCA1ZWJmNWFmLi41YWE1MzM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCkBAIC0zOCw3ICszOCw3IEBACiAJCS5uYW1lCT0gImZvbyIsCiAJfSwKIAotCS5pZF90YWJsZQk9IGZvb19pZHMsCisJLmlkX3RhYmxlCT0gZm9vX2lkdGFibGUsCiAJLnByb2JlCQk9IGZvb19wcm9iZSwKIAkucmVtb3ZlCQk9IGZvb19yZW1vdmUsCiAJLyogaWYgZGV2aWNlIGF1dG9kZXRlY3Rpb24gaXMgbmVlZGVkOiAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBjYzg1YTkyLi4wNjZiNjQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMjU5MCw2ICsyNTkwLDggQEAKIAkJCQkJdW5sb2NrIGVqZWN0YWJsZSBtZWRpYSk7CiAJCQkJbSA9IE1BWF9TRUNUT1JTXzY0IChkb24ndCB0cmFuc2ZlciBtb3JlCiAJCQkJCXRoYW4gNjQgc2VjdG9ycyA9IDMyIEtCIGF0IGEgdGltZSk7CisJCQkJbiA9IElOSVRJQUxfUkVBRDEwIChmb3JjZSBhIHJldHJ5IG9mIHRoZQorCQkJCQlpbml0aWFsIFJFQUQoMTApIGNvbW1hbmQpOwogCQkJCW8gPSBDQVBBQ0lUWV9PSyAoYWNjZXB0IHRoZSBjYXBhY2l0eQogCQkJCQlyZXBvcnRlZCBieSB0aGUgZGV2aWNlKTsKIAkJCQlyID0gSUdOT1JFX1JFU0lEVUUgKHRoZSBkZXZpY2UgcmVwb3J0cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvbGludXgtY2RjLWFjbS5pbmYgYi9Eb2N1bWVudGF0aW9uL3VzYi9saW51eC1jZGMtYWNtLmluZgppbmRleCA2MTJlNzIyLi4zN2EwMmNlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9saW51eC1jZGMtYWNtLmluZgorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9saW51eC1jZGMtYWNtLmluZgpAQCAtOTAsMTAgKzkwLDEwIEBACiBbU291cmNlRGlza3NGaWxlc10KIFtTb3VyY2VEaXNrc05hbWVzXQogW0RldmljZUxpc3RdCi0lREVTQ1JJUFRJT04lPURyaXZlckluc3RhbGwsIFVTQlxWSURfMDUyNSZQSURfQTRBNywgVVNCXFZJRF8wNTI1JlBJRF9BNEFCJk1JXzAyCislREVTQ1JJUFRJT04lPURyaXZlckluc3RhbGwsIFVTQlxWSURfMDUyNSZQSURfQTRBNywgVVNCXFZJRF8xRDZCJlBJRF8wMTA0Jk1JXzAyCiAKIFtEZXZpY2VMaXN0Lk5UYW1kNjRdCi0lREVTQ1JJUFRJT04lPURyaXZlckluc3RhbGwsIFVTQlxWSURfMDUyNSZQSURfQTRBNywgVVNCXFZJRF8wNTI1JlBJRF9BNEFCJk1JXzAyCislREVTQ1JJUFRJT04lPURyaXZlckluc3RhbGwsIFVTQlxWSURfMDUyNSZQSURfQTRBNywgVVNCXFZJRF8xRDZCJlBJRF8wMTA0Jk1JXzAyCiAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvbGludXguaW5mIGIvRG9jdW1lbnRhdGlvbi91c2IvbGludXguaW5mCmluZGV4IDRkZWU5NTguLjRmZmE3MTViMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvbGludXguaW5mCisrKyBiL0RvY3VtZW50YXRpb24vdXNiL2xpbnV4LmluZgpAQCAtMTgsMTUgKzE4LDE1IEBACiAKIDsgRGVjb3JhdGlvbiBmb3IgeDg2IGFyY2hpdGVjdHVyZQogW0xpbnV4RGV2aWNlcy5OVHg4Nl0KLSVMaW51eERldmljZSUgICAgICAgPSBSTkRJUy5OVC41LjEsIFVTQlxWSURfMDUyNSZQSURfYTRhMiwgVVNCXFZJRF8wNTI1JlBJRF9hNGFiJk1JXzAwCislTGludXhEZXZpY2UlICAgICAgID0gUk5ESVMuTlQuNS4xLCBVU0JcVklEXzA1MjUmUElEX2E0YTIsIFVTQlxWSURfMWQ2YiZQSURfMDEwNCZNSV8wMAogCiA7IERlY29yYXRpb24gZm9yIHg2NCBhcmNoaXRlY3R1cmUKIFtMaW51eERldmljZXMuTlRhbWQ2NF0KLSVMaW51eERldmljZSUgICAgICAgPSBSTkRJUy5OVC41LjEsIFVTQlxWSURfMDUyNSZQSURfYTRhMiwgVVNCXFZJRF8wNTI1JlBJRF9hNGFiJk1JXzAwCislTGludXhEZXZpY2UlICAgICAgID0gUk5ESVMuTlQuNS4xLCBVU0JcVklEXzA1MjUmUElEX2E0YTIsIFVTQlxWSURfMWQ2YiZQSURfMDEwNCZNSV8wMAogCiA7IERlY29yYXRpb24gZm9yIGlhNjQgYXJjaGl0ZWN0dXJlCiBbTGludXhEZXZpY2VzLk5UaWE2NF0KLSVMaW51eERldmljZSUgICAgICAgPSBSTkRJUy5OVC41LjEsIFVTQlxWSURfMDUyNSZQSURfYTRhMiwgVVNCXFZJRF8wNTI1JlBJRF9hNGFiJk1JXzAwCislTGludXhEZXZpY2UlICAgICAgID0gUk5ESVMuTlQuNS4xLCBVU0JcVklEXzA1MjUmUElEX2E0YTIsIFVTQlxWSURfMWQ2YiZQSURfMDEwNCZNSV8wMAogCiA7QEBAIFRoaXMgaXMgdGhlIGNvbW1vbiBzZXR0aW5nIGZvciBzZXR1cAogW0NvbnRyb2xGbGFnc10KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggMTIzZDg1OGQuLjFiMmE3MzYgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2CiBTVUJMRVZFTCA9IDM5Ci1FWFRSQVZFUlNJT04gPQorRVhUUkFWRVJTSU9OID0gLjQKIE5BTUUgPSBGbGVzaC1FYXRpbmcgQmF0cyB3aXRoIEZhbmdzCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0xMzc0LDcgKzEzNzQsNyBAQAogY2xlYW46ICQoY2xlYW4tZGlycykKIAkkKGNhbGwgY21kLHJtZGlycykKIAkkKGNhbGwgY21kLHJtZmlsZXMpCi0JQGZpbmQgJChvciAkKEtCVUlMRF9FWFRNT0QpLCAuKSAkKFJDU19GSU5EX0lHTk9SRSkgXAorCUBmaW5kICQoaWYgJChLQlVJTERfRVhUTU9EKSwgJChLQlVJTERfRVhUTU9EKSwgLikgJChSQ1NfRklORF9JR05PUkUpIFwKIAkJXCggLW5hbWUgJyouW29hc10nIC1vIC1uYW1lICcqLmtvJyAtbyAtbmFtZSAnLiouY21kJyBcCiAJCS1vIC1uYW1lICcuKi5kJyAtbyAtbmFtZSAnLioudG1wJyAtbyAtbmFtZSAnKi5tb2QuYycgXAogCQktbyAtbmFtZSAnKi5zeW10eXBlcycgLW8gLW5hbWUgJ21vZHVsZXMub3JkZXInIFwKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYwppbmRleCAzNzZmMjIxLi4zMjZmMGEyIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC00MDksNyArNDA5LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsZW4gPSBuYW1lbGVuOwotCWlmIChuYW1lbGVuID4gMzIpCisJaWYgKGxlbiA+IDMyKQogCQlsZW4gPSAzMjsKIAogCWRvd25fcmVhZCgmdXRzX3NlbSk7CkBAIC01OTQsNyArNTk0LDcgQEAKIAlkb3duX3JlYWQoJnV0c19zZW0pOwogCXJlcyA9IHN5c2luZm9fdGFibGVbb2Zmc2V0XTsKIAlsZW4gPSBzdHJsZW4ocmVzKSsxOwotCWlmIChsZW4gPiBjb3VudCkKKwlpZiAoKHVuc2lnbmVkIGxvbmcpbGVuID4gKHVuc2lnbmVkIGxvbmcpY291bnQpCiAJCWxlbiA9IGNvdW50OwogCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByZXMsIGxlbikpCiAJCWVyciA9IC1FRkFVTFQ7CkBAIC02NDksNyArNjQ5LDcgQEAKIAkJcmV0dXJuIDE7CiAKIAljYXNlIEdTSV9HRVRfSFdSUEI6Ci0JCWlmIChuYnl0ZXMgPCBzaXplb2YoKmh3cnBiKSkKKwkJaWYgKG5ieXRlcyA+IHNpemVvZigqaHdycGIpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBod3JwYiwgbmJ5dGVzKSAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMDA4LDYgKzEwMDgsNyBAQAogewogCXN0cnVjdCBydXNhZ2UgcjsKIAlsb25nIHJldCwgZXJyOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOwogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKIAlpZiAoIXVyKQpAQCAtMTAxNiwxMyArMTAxNywxNSBAQAogCW9sZF9mcyA9IGdldF9mcygpOwogCQkKIAlzZXRfZnMgKEtFUk5FTF9EUyk7Ci0JcmV0ID0gc3lzX3dhaXQ0KHBpZCwgdXN0YXR1cywgb3B0aW9ucywgKHN0cnVjdCBydXNhZ2UgX191c2VyICopICZyKTsKKwlyZXQgPSBzeXNfd2FpdDQocGlkLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSAmc3RhdHVzLCBvcHRpb25zLAorCQkJKHN0cnVjdCBydXNhZ2UgX191c2VyICopICZyKTsKIAlzZXRfZnMgKG9sZF9mcyk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVyLCBzaXplb2YoKnVyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJZXJyID0gMDsKKwllcnIgfD0gcHV0X3VzZXIoc3RhdHVzLCB1c3RhdHVzKTsKIAllcnIgfD0gX19wdXRfdXNlcihyLnJ1X3V0aW1lLnR2X3NlYywgJnVyLT5ydV91dGltZS50dl9zZWMpOwogCWVyciB8PSBfX3B1dF91c2VyKHIucnVfdXRpbWUudHZfdXNlYywgJnVyLT5ydV91dGltZS50dl91c2VjKTsKIAllcnIgfD0gX19wdXRfdXNlcihyLnJ1X3N0aW1lLnR2X3NlYywgJnVyLT5ydV9zdGltZS50dl9zZWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKaW5kZXggMDNkMDFkNy4uNjI4OWNjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL2FybS9LY29uZmlnLmRlYnVnCkBAIC03MCw2ICs3MCwyNyBAQAogCSAgRW5hYmxlcyB0aGUgZGlzcGxheSBvZiB0aGUgbWluaW11bSBhbW91bnQgb2YgZnJlZSBzdGFjayB3aGljaCBlYWNoCiAJICB0YXNrIGhhcyBldmVyIGhhZCBhdmFpbGFibGUgaW4gdGhlIHN5c3JxLVQgb3V0cHV0LgogCitjb25maWcgREVCVUdfUk9EQVRBCisJYm9vbCAiV3JpdGUgcHJvdGVjdCBrZXJuZWwgdGV4dCBzZWN0aW9uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIE1NVQorCS0tLWhlbHAtLS0KKwkgIE1hcmsgdGhlIGtlcm5lbCB0ZXh0IHNlY3Rpb24gYXMgd3JpdGUtcHJvdGVjdGVkIGluIHRoZSBwYWdldGFibGVzLAorCSAgaW4gb3JkZXIgdG8gY2F0Y2ggYWNjaWRlbnRhbCAoYW5kIGluY29ycmVjdCkgd3JpdGVzIHRvIHN1Y2ggY29uc3QKKwkgIGRhdGEuIFRoaXMgd2lsbCBjYXVzZSB0aGUgc2l6ZSBvZiB0aGUga2VybmVsLCBwbHVzIHVwIHRvIDRNQiwgdG8KKwkgIGJlIG1hcHBlZCBhcyBwYWdlcyBpbnN0ZWFkIG9mIHNlY3Rpb25zLCB3aGljaCB3aWxsIGluY3JlYXNlIFRMQgorCSAgcHJlc3N1cmUuCisJICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KKworY29uZmlnIERFQlVHX1JPREFUQV9URVNUCisJYm9vbCAiVGVzdGNhc2UgZm9yIHRoZSBERUJVR19ST0RBVEEgZmVhdHVyZSIKKwlkZXBlbmRzIG9uIERFQlVHX1JPREFUQQorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYSB0ZXN0Y2FzZSBmb3IgdGhlIERFQlVHX1JPREFUQQorCSAgZmVhdHVyZS4KKwkgIElmIGluIGRvdWJ0LCBzYXkgIk4iCisKICMgVGhlc2Ugb3B0aW9ucyBhcmUgb25seSBmb3IgcmVhbCBrZXJuZWwgaGFja2VycyB3aG8gd2FudCB0byBnZXQgdGhlaXIgaGFuZHMgZGlydHkuCiBjb25maWcgREVCVUdfTEwKIAlib29sICJLZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBmdW5jdGlvbnMiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZmlxX2RlYnVnZ2VyLmMgYi9hcmNoL2FybS9jb21tb24vZmlxX2RlYnVnZ2VyLmMKaW5kZXggMDgwZjY5ZS4uNWU1MDFkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2ZpcV9kZWJ1Z2dlci5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9maXFfZGVidWdnZXIuYwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJCWludCBpOwogCQlpbnQgY291bnQgPSBmaXFfZGVidWdnZXJfcmluZ2J1Zl9sZXZlbChzdGF0ZS0+dHR5X3JidWYpOwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGMgPSBmaXFfZGVidWdnZXJfcmluZ2J1Zl9wZWVrKHN0YXRlLT50dHlfcmJ1ZiwgaSk7CisJCQlpbnQgYyA9IGZpcV9kZWJ1Z2dlcl9yaW5nYnVmX3BlZWsoc3RhdGUtPnR0eV9yYnVmLCAwKTsKIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHN0YXRlLT50dHksIGMsIFRUWV9OT1JNQUwpOwogCQkJaWYgKCFmaXFfZGVidWdnZXJfcmluZ2J1Zl9jb25zdW1lKHN0YXRlLT50dHlfcmJ1ZiwgMSkpCiAJCQkJcHJfd2FybigiZmlxIHR0eSBmYWlsZWQgdG8gY29uc3VtZSBieXRlXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAppbmRleCAxMjUyYTI2Li41Njg0Y2JjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9zaG1wYXJhbS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZXR5cGUuaD4KICNpbmNsdWRlIDxhc20vb3V0ZXJjYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9yb2RhdGEuaD4KIAogI2RlZmluZSBDQUNIRV9DT0xPVVIodmFkZHIpCSgodmFkZHIgJiAoU0hNTEJBIC0gMSkpID4+IFBBR0VfU0hJRlQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NvcmVzaWdodC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY29yZXNpZ2h0LmgKaW5kZXggN2VjZDc5My4uNjY0M2Q2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY29yZXNpZ2h0LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY29yZXNpZ2h0LmgKQEAgLTE3LDE1ICsxNywxNyBAQAogI2RlZmluZSBUUkFDRVJfQUNDRVNTRURfQklUCTAKICNkZWZpbmUgVFJBQ0VSX1JVTk5JTkdfQklUCTEKICNkZWZpbmUgVFJBQ0VSX0NZQ0xFX0FDQ19CSVQJMgorI2RlZmluZSBUUkFDRVJfVFJBQ0VfREFUQV9CSVQJMwogI2RlZmluZSBUUkFDRVJfQUNDRVNTRUQJCUJJVChUUkFDRVJfQUNDRVNTRURfQklUKQogI2RlZmluZSBUUkFDRVJfUlVOTklORwkJQklUKFRSQUNFUl9SVU5OSU5HX0JJVCkKICNkZWZpbmUgVFJBQ0VSX0NZQ0xFX0FDQwlCSVQoVFJBQ0VSX0NZQ0xFX0FDQ19CSVQpCisjZGVmaW5lIFRSQUNFUl9UUkFDRV9EQVRBCUJJVChUUkFDRVJfVFJBQ0VfREFUQV9CSVQpCiAKICNkZWZpbmUgVFJBQ0VSX1RJTUVPVVQgMTAwMDAKIAotI2RlZmluZSBldG1fd3JpdGVsKHQsIHYsIHgpIFwKLQkoX19yYXdfd3JpdGVsKCh2KSwgKHQpLT5ldG1fcmVncyArICh4KSkpCi0jZGVmaW5lIGV0bV9yZWFkbCh0LCB4KSAoX19yYXdfcmVhZGwoKHQpLT5ldG1fcmVncyArICh4KSkpCisjZGVmaW5lIGV0bV93cml0ZWwodCwgaWQsIHYsIHgpIFwKKwkoX19yYXdfd3JpdGVsKCh2KSwgKHQpLT5ldG1fcmVnc1soaWQpXSArICh4KSkpCisjZGVmaW5lIGV0bV9yZWFkbCh0LCBpZCwgeCkgKF9fcmF3X3JlYWRsKCh0KS0+ZXRtX3JlZ3NbKGlkKV0gKyAoeCkpKQogCiAvKiBDb3JlU2lnaHQgTWFuYWdlbWVudCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgQ1NNUl9MT0NLQUNDRVNTIDB4ZmIwCkBAIC0xMTMsMTEgKzExNSwxOSBAQAogI2RlZmluZSBFVE1SX1RSQUNFRU5DVFJMCTB4MjQKICNkZWZpbmUgRVRNVEVfSU5DTEVYQ0wJCUJJVCgyNCkKICNkZWZpbmUgRVRNUl9UUkFDRUVORVZUCQkweDIwCisKKyNkZWZpbmUgRVRNUl9WSUVXREFUQUVWVAkweDMwCisjZGVmaW5lIEVUTVJfVklFV0RBVEFDVFJMMQkweDM0CisjZGVmaW5lIEVUTVJfVklFV0RBVEFDVFJMMgkweDM4CisjZGVmaW5lIEVUTVJfVklFV0RBVEFDVFJMMwkweDNjCisjZGVmaW5lIEVUTVZEQzNfRVhDTE9OTFkJQklUKDE2KQorCiAjZGVmaW5lIEVUTUNUUkxfT1BUUwkJKEVUTUNUUkxfRE9fQ1BSVCB8IFwKLQkJCQlFVE1DVFJMX0RBVEFfRE9fQUREUiB8IFwKIAkJCQlFVE1DVFJMX0JSQU5DSF9PVVRQVVQgfCBcCiAJCQkJRVRNQ1RSTF9ET19DT05URVhUSUQpCiAKKyNkZWZpbmUgRVRNUl9UUkFDRUlEUgkJMHgyMDAKKwogLyogRVRNIG1hbmFnZW1lbnQgcmVnaXN0ZXJzLCAiRVRNIEFyY2hpdGVjdHVyZSIsIDMuNS4yNCAqLwogI2RlZmluZSBFVE1NUl9PU0xBUgkweDMwMAogI2RlZmluZSBFVE1NUl9PU0xTUgkweDMwNApAQCAtMTQwLDE0ICsxNTAsMTYgQEAKICNkZWZpbmUgRVRCRkZfVFJJR0lOCQlCSVQoOCkKICNkZWZpbmUgRVRCRkZfVFJJR0VWVAkJQklUKDkpCiAjZGVmaW5lIEVUQkZGX1RSSUdGTAkJQklUKDEwKQorI2RlZmluZSBFVEJGRl9TVE9QRkwJCUJJVCgxMikKIAogI2RlZmluZSBldGJfd3JpdGVsKHQsIHYsIHgpIFwKIAkoX19yYXdfd3JpdGVsKCh2KSwgKHQpLT5ldGJfcmVncyArICh4KSkpCiAjZGVmaW5lIGV0Yl9yZWFkbCh0LCB4KSAoX19yYXdfcmVhZGwoKHQpLT5ldGJfcmVncyArICh4KSkpCiAKLSNkZWZpbmUgZXRtX2xvY2sodCkgZG8geyBldG1fd3JpdGVsKCh0KSwgMCwgQ1NNUl9MT0NLQUNDRVNTKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgZXRtX3VubG9jayh0KSBcCi0JZG8geyBldG1fd3JpdGVsKCh0KSwgVU5MT0NLX01BR0lDLCBDU01SX0xPQ0tBQ0NFU1MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBldG1fbG9jayh0LCBpZCkgXAorCWRvIHsgZXRtX3dyaXRlbCgodCksIChpZCksIDAsIENTTVJfTE9DS0FDQ0VTUyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGV0bV91bmxvY2sodCwgaWQpIFwKKwlkbyB7IGV0bV93cml0ZWwoKHQpLCAoaWQpLCBVTkxPQ0tfTUFHSUMsIENTTVJfTE9DS0FDQ0VTUyk7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgZXRiX2xvY2sodCkgZG8geyBldGJfd3JpdGVsKCh0KSwgMCwgQ1NNUl9MT0NLQUNDRVNTKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZXRiX3VubG9jayh0KSBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9yb2RhdGEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3JvZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGFkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9yb2RhdGEuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogIGFyY2gvYXJtL2luY2x1ZGUvYXNtL3JvZGF0YS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUsIEluYy4KKyAqCisgKiAgQXV0aG9yOiBDb2xpbiBDcm9zcyA8Y2Nyb3NzQGFuZHJvaWQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX0FTTUFSTV9ST0RBVEFfSAorI2RlZmluZSBfQVNNQVJNX1JPREFUQV9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBDT05GSUdfREVCVUdfUk9EQVRBCisKK2ludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgdmlydCwgaW50IG51bXBhZ2VzKTsKK2ludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgdmlydCwgaW50IG51bXBhZ2VzKTsKKwordm9pZCBtYXJrX3JvZGF0YV9ybyh2b2lkKTsKK3ZvaWQgc2V0X2tlcm5lbF90ZXh0X3J3KHZvaWQpOwordm9pZCBzZXRfa2VybmVsX3RleHRfcm8odm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldF9rZXJuZWxfdGV4dF9ydyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfa2VybmVsX3RleHRfcm8odm9pZCkgeyB9CisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2V0bS5jIGIvYXJjaC9hcm0va2VybmVsL2V0bS5jCmluZGV4IDFiZWM4YjUuLjQ5NmI4YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9ldG0uYworKysgYi9hcmNoL2FybS9rZXJuZWwvZXRtLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtMzYsMjYgKzM3LDM2IEBACiBzdHJ1Y3QgdHJhY2VjdHggewogCXVuc2lnbmVkIGludAlldGJfYnVmc3o7CiAJdm9pZCBfX2lvbWVtCSpldGJfcmVnczsKLQl2b2lkIF9faW9tZW0JKmV0bV9yZWdzOworCXZvaWQgX19pb21lbQkqKmV0bV9yZWdzOworCWludAkJZXRtX3JlZ3NfY291bnQ7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQJCW5jbXBwYWlyczsKIAlpbnQJCWV0bV9wb3J0c3o7CisJdTMyCQlldGJfZmM7CisJdW5zaWduZWQgbG9uZwlyYW5nZV9zdGFydDsKKwl1bnNpZ25lZCBsb25nCXJhbmdlX2VuZDsKKwl1bnNpZ25lZCBsb25nCWRhdGFfcmFuZ2Vfc3RhcnQ7CisJdW5zaWduZWQgbG9uZwlkYXRhX3JhbmdlX2VuZDsKKwlib29sCQlkdW1wX2luaXRpYWxfZXRiOwogCXN0cnVjdCBkZXZpY2UJKmRldjsKIAlzdHJ1Y3QgY2xrCSplbXVfY2xrOwogCXN0cnVjdCBtdXRleAltdXRleDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhY2VjdHggdHJhY2VyOworc3RhdGljIHN0cnVjdCB0cmFjZWN0eCB0cmFjZXIgPSB7CisJLnJhbmdlX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX3N0ZXh0LAorCS5yYW5nZV9lbmQgPSAodW5zaWduZWQgbG9uZylfZXRleHQsCit9OwogCiBzdGF0aWMgaW5saW5lIGJvb2wgdHJhY2VfaXNydW5uaW5nKHN0cnVjdCB0cmFjZWN0eCAqdCkKIHsKIAlyZXR1cm4gISEodC0+ZmxhZ3MgJiBUUkFDRVJfUlVOTklORyk7CiB9CiAKLXN0YXRpYyBpbnQgZXRtX3NldHVwX2FkZHJlc3NfcmFuZ2Uoc3RydWN0IHRyYWNlY3R4ICp0LCBpbnQgbiwKK3N0YXRpYyBpbnQgZXRtX3NldHVwX2FkZHJlc3NfcmFuZ2Uoc3RydWN0IHRyYWNlY3R4ICp0LCBpbnQgaWQsIGludCBuLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IGV4Y2x1ZGUsIGludCBkYXRhKQogewotCXUzMiBmbGFncyA9IEVUTUFBVF9BUk0gfCBFVE1BQVRfSUdOQ09OVEVYVElEIHwgRVRNQUFUX05TT05MWSB8IFwKKwl1MzIgZmxhZ3MgPSBFVE1BQVRfQVJNIHwgRVRNQUFUX0lHTkNPTlRFWFRJRCB8IEVUTUFBVF9JR05TRUNVUklUWSB8CiAJCSAgICBFVE1BQVRfTk9WQUxDTVA7CiAKIAlpZiAobiA8IDEgfHwgbiA+IHQtPm5jbXBwYWlycykKQEAgLTcxLDk1ICs4MiwxNTUgQEAKIAkJZmxhZ3MgfD0gRVRNQUFUX0lFWEVDOwogCiAJLyogZmlyc3QgY29tcGFyYXRvciBmb3IgdGhlIHJhbmdlICovCi0JZXRtX3dyaXRlbCh0LCBmbGFncywgRVRNUl9DT01QX0FDQ19UWVBFKG4gKiAyKSk7Ci0JZXRtX3dyaXRlbCh0LCBzdGFydCwgRVRNUl9DT01QX1ZBTChuICogMikpOworCWV0bV93cml0ZWwodCwgaWQsIGZsYWdzLCBFVE1SX0NPTVBfQUNDX1RZUEUobiAqIDIpKTsKKwlldG1fd3JpdGVsKHQsIGlkLCBzdGFydCwgRVRNUl9DT01QX1ZBTChuICogMikpOwogCiAJLyogc2Vjb25kIGNvbXBhcmF0b3IgaXMgcmlnaHQgbmV4dCB0byBpdCAqLwotCWV0bV93cml0ZWwodCwgZmxhZ3MsIEVUTVJfQ09NUF9BQ0NfVFlQRShuICogMiArIDEpKTsKLQlldG1fd3JpdGVsKHQsIGVuZCwgRVRNUl9DT01QX1ZBTChuICogMiArIDEpKTsKKwlldG1fd3JpdGVsKHQsIGlkLCBmbGFncywgRVRNUl9DT01QX0FDQ19UWVBFKG4gKiAyICsgMSkpOworCWV0bV93cml0ZWwodCwgaWQsIGVuZCwgRVRNUl9DT01QX1ZBTChuICogMiArIDEpKTsKIAotCWZsYWdzID0gZXhjbHVkZSA/IEVUTVRFX0lOQ0xFWENMIDogMDsKLQlldG1fd3JpdGVsKHQsIGZsYWdzIHwgKDEgPDwgbiksIEVUTVJfVFJBQ0VFTkNUUkwpOworCWlmIChkYXRhKSB7CisJCWZsYWdzID0gZXhjbHVkZSA/IEVUTVZEQzNfRVhDTE9OTFkgOiAwOworCQlpZiAoZXhjbHVkZSkKKwkJCW4gKz0gODsKKwkJZXRtX3dyaXRlbCh0LCBpZCwgZmxhZ3MgfCBCSVQobiksIEVUTVJfVklFV0RBVEFDVFJMMyk7CisJfSBlbHNlIHsKKwkJZmxhZ3MgPSBleGNsdWRlID8gRVRNVEVfSU5DTEVYQ0wgOiAwOworCQlldG1fd3JpdGVsKHQsIGlkLCBmbGFncyB8ICgxIDw8IG4pLCBFVE1SX1RSQUNFRU5DVFJMKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0cmFjZV9zdGFydChzdHJ1Y3QgdHJhY2VjdHggKnQpCitzdGF0aWMgaW50IHRyYWNlX3N0YXJ0X2V0bShzdHJ1Y3QgdHJhY2VjdHggKnQsIGludCBpZCkKIHsKIAl1MzIgdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBUUkFDRVJfVElNRU9VVDsKIAotCWV0Yl91bmxvY2sodCk7Ci0KLQlldGJfd3JpdGVsKHQsIDAsIEVUQlJfRk9STUFUVEVSQ1RSTCk7Ci0JZXRiX3dyaXRlbCh0LCAxLCBFVEJSX0NUUkwpOwotCi0JZXRiX2xvY2sodCk7Ci0KLQkvKiBjb25maWd1cmUgZXRtICovCiAJdiA9IEVUTUNUUkxfT1BUUyB8IEVUTUNUUkxfUFJPR1JBTSB8IEVUTUNUUkxfUE9SVFNJWkUodC0+ZXRtX3BvcnRzeik7CiAKIAlpZiAodC0+ZmxhZ3MgJiBUUkFDRVJfQ1lDTEVfQUNDKQogCQl2IHw9IEVUTUNUUkxfQ1lDTEVBQ0NVUkFURTsKIAotCWV0bV91bmxvY2sodCk7CisJaWYgKHQtPmZsYWdzICYgVFJBQ0VSX1RSQUNFX0RBVEEpCisJCXYgfD0gRVRNQ1RSTF9EQVRBX0RPX0FERFI7CiAKLQlldG1fd3JpdGVsKHQsIHYsIEVUTVJfQ1RSTCk7CisJZXRtX3VubG9jayh0LCBpZCk7CiAKLQl3aGlsZSAoIShldG1fcmVhZGwodCwgRVRNUl9DVFJMKSAmIEVUTUNUUkxfUFJPR1JBTSkgJiYgLS10aW1lb3V0KQorCWV0bV93cml0ZWwodCwgaWQsIHYsIEVUTVJfQ1RSTCk7CisKKwl3aGlsZSAoIShldG1fcmVhZGwodCwgaWQsIEVUTVJfQ1RSTCkgJiBFVE1DVFJMX1BST0dSQU0pICYmIC0tdGltZW91dCkKIAkJOwogCWlmICghdGltZW91dCkgewogCQlkZXZfZGJnKHQtPmRldiwgIldhaXRpbmcgZm9yIHByb2diaXQgdG8gYXNzZXJ0IHRpbWVkIG91dFxuIik7Ci0JCWV0bV9sb2NrKHQpOworCQlldG1fbG9jayh0LCBpZCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWV0bV9zZXR1cF9hZGRyZXNzX3JhbmdlKHQsIDEsICh1bnNpZ25lZCBsb25nKV9zdGV4dCwKLQkJCSh1bnNpZ25lZCBsb25nKV9ldGV4dCwgMCwgMCk7Ci0JZXRtX3dyaXRlbCh0LCAwLCBFVE1SX1RSQUNFRU5DVFJMMik7Ci0JZXRtX3dyaXRlbCh0LCAwLCBFVE1SX1RSQUNFU1NDVFJMKTsKLQlldG1fd3JpdGVsKHQsIDB4NmYsIEVUTVJfVFJBQ0VFTkVWVCk7CisJaWYgKHQtPnJhbmdlX3N0YXJ0IHx8IHQtPnJhbmdlX2VuZCkKKwkJZXRtX3NldHVwX2FkZHJlc3NfcmFuZ2UodCwgaWQsIDEsCisJCQkJCXQtPnJhbmdlX3N0YXJ0LCB0LT5yYW5nZV9lbmQsIDAsIDApOworCWVsc2UKKwkJZXRtX3dyaXRlbCh0LCBpZCwgRVRNVEVfSU5DTEVYQ0wsIEVUTVJfVFJBQ0VFTkNUUkwpOworCisJZXRtX3dyaXRlbCh0LCBpZCwgMCwgRVRNUl9UUkFDRUVOQ1RSTDIpOworCWV0bV93cml0ZWwodCwgaWQsIDAsIEVUTVJfVFJBQ0VTU0NUUkwpOworCWV0bV93cml0ZWwodCwgaWQsIDB4NmYsIEVUTVJfVFJBQ0VFTkVWVCk7CisKKwlldG1fd3JpdGVsKHQsIGlkLCAwLCBFVE1SX1ZJRVdEQVRBQ1RSTDEpOworCWV0bV93cml0ZWwodCwgaWQsIDAsIEVUTVJfVklFV0RBVEFDVFJMMik7CisKKwlpZiAodC0+ZGF0YV9yYW5nZV9zdGFydCB8fCB0LT5kYXRhX3JhbmdlX2VuZCkKKwkJZXRtX3NldHVwX2FkZHJlc3NfcmFuZ2UodCwgaWQsIDIsIHQtPmRhdGFfcmFuZ2Vfc3RhcnQsCisJCQkJCXQtPmRhdGFfcmFuZ2VfZW5kLCAwLCAxKTsKKwllbHNlCisJCWV0bV93cml0ZWwodCwgaWQsIEVUTVZEQzNfRVhDTE9OTFksIEVUTVJfVklFV0RBVEFDVFJMMyk7CisKKwlldG1fd3JpdGVsKHQsIGlkLCAweDZmLCBFVE1SX1ZJRVdEQVRBRVZUKTsKIAogCXYgJj0gfkVUTUNUUkxfUFJPR1JBTTsKIAl2IHw9IEVUTUNUUkxfUE9SVFNFTDsKIAotCWV0bV93cml0ZWwodCwgdiwgRVRNUl9DVFJMKTsKKwlldG1fd3JpdGVsKHQsIGlkLCB2LCBFVE1SX0NUUkwpOwogCiAJdGltZW91dCA9IFRSQUNFUl9USU1FT1VUOwotCXdoaWxlIChldG1fcmVhZGwodCwgRVRNUl9DVFJMKSAmIEVUTUNUUkxfUFJPR1JBTSAmJiAtLXRpbWVvdXQpCisJd2hpbGUgKGV0bV9yZWFkbCh0LCBpZCwgRVRNUl9DVFJMKSAmIEVUTUNUUkxfUFJPR1JBTSAmJiAtLXRpbWVvdXQpCiAJCTsKIAlpZiAoIXRpbWVvdXQpIHsKIAkJZGV2X2RiZyh0LT5kZXYsICJXYWl0aW5nIGZvciBwcm9nYml0IHRvIGRlYXNzZXJ0IHRpbWVkIG91dFxuIik7Ci0JCWV0bV9sb2NrKHQpOworCQlldG1fbG9jayh0LCBpZCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWV0bV9sb2NrKHQpOworCWV0bV9sb2NrKHQsIGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cmFjZV9zdGFydChzdHJ1Y3QgdHJhY2VjdHggKnQpCit7CisJaW50IHJldDsKKwlpbnQgaWQ7CisJdTMyIGV0Yl9mYyA9IHQtPmV0Yl9mYzsKKworCWV0Yl91bmxvY2sodCk7CisKKwl0LT5kdW1wX2luaXRpYWxfZXRiID0gZmFsc2U7CisJZXRiX3dyaXRlbCh0LCAwLCBFVEJSX1dSSVRFQUREUik7CisJZXRiX3dyaXRlbCh0LCBldGJfZmMsIEVUQlJfRk9STUFUVEVSQ1RSTCk7CisJZXRiX3dyaXRlbCh0LCAxLCBFVEJSX0NUUkwpOworCisJZXRiX2xvY2sodCk7CisKKwkvKiBjb25maWd1cmUgZXRtKHMpICovCisJZm9yIChpZCA9IDA7IGlkIDwgdC0+ZXRtX3JlZ3NfY291bnQ7IGlkKyspIHsKKwkJcmV0ID0gdHJhY2Vfc3RhcnRfZXRtKHQsIGlkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJdC0+ZmxhZ3MgfD0gVFJBQ0VSX1JVTk5JTkc7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0cmFjZV9zdG9wKHN0cnVjdCB0cmFjZWN0eCAqdCkKK3N0YXRpYyBpbnQgdHJhY2Vfc3RvcF9ldG0oc3RydWN0IHRyYWNlY3R4ICp0LCBpbnQgaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gVFJBQ0VSX1RJTUVPVVQ7CiAKLQlldG1fdW5sb2NrKHQpOworCWV0bV91bmxvY2sodCwgaWQpOwogCi0JZXRtX3dyaXRlbCh0LCAweDQ0MCwgRVRNUl9DVFJMKTsKLQl3aGlsZSAoIShldG1fcmVhZGwodCwgRVRNUl9DVFJMKSAmIEVUTUNUUkxfUFJPR1JBTSkgJiYgLS10aW1lb3V0KQorCWV0bV93cml0ZWwodCwgaWQsIDB4NDQxLCBFVE1SX0NUUkwpOworCXdoaWxlICghKGV0bV9yZWFkbCh0LCBpZCwgRVRNUl9DVFJMKSAmIEVUTUNUUkxfUFJPR1JBTSkgJiYgLS10aW1lb3V0KQogCQk7CiAJaWYgKCF0aW1lb3V0KSB7CiAJCWRldl9kYmcodC0+ZGV2LCAiV2FpdGluZyBmb3IgcHJvZ2JpdCB0byBhc3NlcnQgdGltZWQgb3V0XG4iKTsKLQkJZXRtX2xvY2sodCk7CisJCWV0bV9sb2NrKHQsIGlkKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JZXRtX2xvY2sodCk7CisJZXRtX2xvY2sodCwgaWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyYWNlX3N0b3Aoc3RydWN0IHRyYWNlY3R4ICp0KQoreworCWludCBpZDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IFRSQUNFUl9USU1FT1VUOworCXUzMiBldGJfZmMgPSB0LT5ldGJfZmM7CisKKwlmb3IgKGlkID0gMDsgaWQgPCB0LT5ldG1fcmVnc19jb3VudDsgaWQrKykgeworCQlyZXQgPSB0cmFjZV9zdG9wX2V0bSh0LCBpZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCWV0Yl91bmxvY2sodCk7Ci0JZXRiX3dyaXRlbCh0LCBFVEJGRl9NQU5VQUxfRkxVU0gsIEVUQlJfRk9STUFUVEVSQ1RSTCk7CisJaWYgKGV0Yl9mYykgeworCQlldGJfZmMgfD0gRVRCRkZfU1RPUEZMOworCQlldGJfd3JpdGVsKHQsIHQtPmV0Yl9mYywgRVRCUl9GT1JNQVRURVJDVFJMKTsKKwl9CisJZXRiX3dyaXRlbCh0LCBldGJfZmMgfCBFVEJGRl9NQU5VQUxfRkxVU0gsIEVUQlJfRk9STUFUVEVSQ1RSTCk7CiAKIAl0aW1lb3V0ID0gVFJBQ0VSX1RJTUVPVVQ7CiAJd2hpbGUgKGV0Yl9yZWFkbCh0LCBFVEJSX0ZPUk1BVFRFUkNUUkwpICYKQEAgLTE4NCwyNCArMjU1LDE1IEBACiBzdGF0aWMgaW50IGV0Yl9nZXRkYXRhbGVuKHN0cnVjdCB0cmFjZWN0eCAqdCkKIHsKIAl1MzIgdjsKLQlpbnQgcnAsIHdwOworCWludCB3cDsKIAogCXYgPSBldGJfcmVhZGwodCwgRVRCUl9TVEFUVVMpOwogCiAJaWYgKHYgJiAxKQogCQlyZXR1cm4gdC0+ZXRiX2J1ZnN6OwogCi0JcnAgPSBldGJfcmVhZGwodCwgRVRCUl9SRUFEQUREUik7CiAJd3AgPSBldGJfcmVhZGwodCwgRVRCUl9XUklURUFERFIpOwotCi0JaWYgKHJwID4gd3ApIHsKLQkJZXRiX3dyaXRlbCh0LCAwLCBFVEJSX1JFQURBRERSKTsKLQkJZXRiX3dyaXRlbCh0LCAwLCBFVEJSX1dSSVRFQUREUik7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIHdwIC0gcnA7CisJcmV0dXJuIHdwOwogfQogCiAvKiBzeXNycSt2IHdpbGwgYWx3YXlzIHN0b3AgdGhlIHJ1bm5pbmcgdHJhY2UgYW5kIGxlYXZlIGl0IGF0IHRoYXQgKi8KQEAgLTIzNCwyMSArMjk2LDE4IEBACiAJCXByaW50aygiJTA4eCIsIGNwdV90b19iZTMyKGV0Yl9yZWFkbCh0LCBFVEJSX1JFQURNRU0pKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiXG4tLS0gRVRCIGJ1ZmZlciBlbmQgLS0tXG4iKTsKIAotCS8qIGRlYXNzZXJ0IHRoZSBvdmVyZmxvdyBiaXQgKi8KLQlldGJfd3JpdGVsKHQsIDEsIEVUQlJfQ1RSTCk7Ci0JZXRiX3dyaXRlbCh0LCAwLCBFVEJSX0NUUkwpOwotCi0JZXRiX3dyaXRlbCh0LCAwLCBFVEJSX1RSSUdHRVJDT1VOVCk7Ci0JZXRiX3dyaXRlbCh0LCAwLCBFVEJSX1JFQURBRERSKTsKLQlldGJfd3JpdGVsKHQsIDAsIEVUQlJfV1JJVEVBRERSKTsKLQogCWV0Yl9sb2NrKHQpOwogfQogCiBzdGF0aWMgdm9pZCBzeXNycV9ldG1fZHVtcChpbnQga2V5KQogeworCWlmICghbXV0ZXhfdHJ5bG9jaygmdHJhY2VyLm11dGV4KSkgeworCQlwcmludGsoS0VSTl9JTkZPICJUcmFjaW5nIGhhcmR3YXJlIGJ1c3lcbiIpOworCQlyZXR1cm47CisJfQogCWRldl9kYmcodHJhY2VyLmRldiwgIkR1bXBpbmcgRVRCIGJ1ZmZlclxuIik7CiAJZXRtX2R1bXAoKTsKKwltdXRleF91bmxvY2soJnRyYWNlci5tdXRleCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX2V0bV9vcCA9IHsKQEAgLTI3NSw2ICszMzQsMTAgQEAKIAlzdHJ1Y3QgdHJhY2VjdHggKnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdTMyIGZpcnN0ID0gMDsKIAl1MzIgKmJ1ZjsKKwlpbnQgd3BvczsKKwlpbnQgc2tpcDsKKwlsb25nIHdsZW5ndGg7CisJbG9mZl90IHBvcyA9ICpwcG9zOwogCiAJbXV0ZXhfbG9jaygmdC0+bXV0ZXgpOwogCkBAIC0yODYsMzEgKzM0OSwzOSBAQAogCWV0Yl91bmxvY2sodCk7CiAKIAl0b3RhbCA9IGV0Yl9nZXRkYXRhbGVuKHQpOworCWlmICh0b3RhbCA9PSAwICYmIHQtPmR1bXBfaW5pdGlhbF9ldGIpCisJCXRvdGFsID0gdC0+ZXRiX2J1ZnN6OwogCWlmICh0b3RhbCA9PSB0LT5ldGJfYnVmc3opCiAJCWZpcnN0ID0gZXRiX3JlYWRsKHQsIEVUQlJfV1JJVEVBRERSKTsKIAorCWlmIChwb3MgPiB0b3RhbCAqIDQpIHsKKwkJc2tpcCA9IDA7CisJCXdwb3MgPSB0b3RhbDsKKwl9IGVsc2UgeworCQlza2lwID0gKGludClwb3MgJSA0OworCQl3cG9zID0gKGludClwb3MgLyA0OworCX0KKwl0b3RhbCAtPSB3cG9zOworCWZpcnN0ID0gKGZpcnN0ICsgd3BvcykgJSB0LT5ldGJfYnVmc3o7CisKIAlldGJfd3JpdGVsKHQsIGZpcnN0LCBFVEJSX1JFQURBRERSKTsKIAotCWxlbmd0aCA9IG1pbih0b3RhbCAqIDQsIChpbnQpbGVuKTsKLQlidWYgPSB2bWFsbG9jKGxlbmd0aCk7CisJd2xlbmd0aCA9IG1pbih0b3RhbCwgRElWX1JPVU5EX1VQKHNraXAgKyAoaW50KWxlbiwgNCkpOworCWxlbmd0aCA9IG1pbih0b3RhbCAqIDQgLSBza2lwLCAoaW50KWxlbik7CisJYnVmID0gdm1hbGxvYyh3bGVuZ3RoICogNCk7CiAKLQlkZXZfZGJnKHQtPmRldiwgIkVUQiBidWZmZXIgbGVuZ3RoOiAlZFxuIiwgdG90YWwpOworCWRldl9kYmcodC0+ZGV2LCAiRVRCIHJlYWQgJWxkIGJ5dGVzIHRvICVsbGQgZnJvbSAlbGQgd29yZHMgYXQgJWRcbiIsCisJCWxlbmd0aCwgcG9zLCB3bGVuZ3RoLCBmaXJzdCk7CisJZGV2X2RiZyh0LT5kZXYsICJFVEIgYnVmZmVyIGxlbmd0aDogJWRcbiIsIHRvdGFsICsgd3Bvcyk7CiAJZGV2X2RiZyh0LT5kZXYsICJFVEIgc3RhdHVzIHJlZzogJXhcbiIsIGV0Yl9yZWFkbCh0LCBFVEJSX1NUQVRVUykpOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGggLyA0OyBpKyspCisJZm9yIChpID0gMDsgaSA8IHdsZW5ndGg7IGkrKykKIAkJYnVmW2ldID0gZXRiX3JlYWRsKHQsIEVUQlJfUkVBRE1FTSk7CiAKLQkvKiB0aGUgb25seSB3YXkgdG8gZGVhc3NlcnQgb3ZlcmZsb3cgYml0IGluIEVUQiBzdGF0dXMgaXMgdGhpcyAqLwotCWV0Yl93cml0ZWwodCwgMSwgRVRCUl9DVFJMKTsKLQlldGJfd3JpdGVsKHQsIDAsIEVUQlJfQ1RSTCk7Ci0KLQlldGJfd3JpdGVsKHQsIDAsIEVUQlJfV1JJVEVBRERSKTsKLQlldGJfd3JpdGVsKHQsIDAsIEVUQlJfUkVBREFERFIpOwotCWV0Yl93cml0ZWwodCwgMCwgRVRCUl9UUklHR0VSQ09VTlQpOwotCiAJZXRiX2xvY2sodCk7CiAKLQlsZW5ndGggLT0gY29weV90b191c2VyKGRhdGEsIGJ1ZiwgbGVuZ3RoKTsKKwlsZW5ndGggLT0gY29weV90b191c2VyKGRhdGEsICh1OCAqKWJ1ZiArIHNraXAsIGxlbmd0aCk7CiAJdmZyZWUoYnVmKTsKKwkqcHBvcyA9IHBvcyArIGxlbmd0aDsKIAogb3V0OgogCW11dGV4X3VubG9jaygmdC0+bXV0ZXgpOwpAQCAtMzQ3LDI4ICs0MTgsMTcgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAorCW11dGV4X2xvY2soJnQtPm11dGV4KTsKIAl0LT5ldGJfcmVncyA9IGlvcmVtYXBfbm9jYWNoZShkZXYtPnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmZGV2LT5yZXMpKTsKIAlpZiAoIXQtPmV0Yl9yZWdzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCisJdC0+ZGV2ID0gJmRldi0+ZGV2OworCXQtPmR1bXBfaW5pdGlhbF9ldGIgPSB0cnVlOwogCWFtYmFfc2V0X2RydmRhdGEoZGV2LCB0KTsKIAotCWV0Yl9taXNjZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmV0Yl9taXNjZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF91bm1hcDsKLQotCXQtPmVtdV9jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgImVtdV9zcmNfY2siKTsKLQlpZiAoSVNfRVJSKHQtPmVtdV9jbGspKSB7Ci0JCWRldl9kYmcoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIG9idGFpbiBlbXVfc3JjX2NrLlxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWNsa19lbmFibGUodC0+ZW11X2Nsayk7Ci0KIAlldGJfdW5sb2NrKHQpOwogCXQtPmV0Yl9idWZzeiA9IGV0Yl9yZWFkbCh0LCBFVEJSX0RFUFRIKTsKIAlkZXZfZGJnKCZkZXYtPmRldiwgIlNpemU6ICV4XG4iLCB0LT5ldGJfYnVmc3opOwpAQCAtMzc3LDYgKzQzNywyMCBAQAogCWV0Yl93cml0ZWwodCwgMCwgRVRCUl9DVFJMKTsKIAlldGJfd3JpdGVsKHQsIDB4MTAwMCwgRVRCUl9GT1JNQVRURVJDVFJMKTsKIAlldGJfbG9jayh0KTsKKwltdXRleF91bmxvY2soJnQtPm11dGV4KTsKKworCWV0Yl9taXNjZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmV0Yl9taXNjZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bm1hcDsKKworCS8qIEdldCBvcHRpb25hbCBjbG9jay4gQ3VycmVudGx5IHVzZWQgdG8gc2VsZWN0IGNsb2NrIHNvdXJjZSBvbiBvbWFwMyAqLworCXQtPmVtdV9jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgImVtdV9zcmNfY2siKTsKKwlpZiAoSVNfRVJSKHQtPmVtdV9jbGspKQorCQlkZXZfZGJnKCZkZXYtPmRldiwgIkZhaWxlZCB0byBvYnRhaW4gZW11X3NyY19jay5cbiIpOworCWVsc2UKKwkJY2xrX2VuYWJsZSh0LT5lbXVfY2xrKTsKIAogCWRldl9kYmcoJmRldi0+ZGV2LCAiRVRCIEFNQkEgZHJpdmVyIGluaXRpYWxpemVkLlxuIik7CiAKQEAgLTM4NCwxMCArNDU4LDEzIEBACiAJcmV0dXJuIHJldDsKIAogb3V0X3VubWFwOgorCW11dGV4X2xvY2soJnQtPm11dGV4KTsKIAlhbWJhX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJaW91bm1hcCh0LT5ldGJfcmVncyk7CisJdC0+ZXRiX3JlZ3MgPSBOVUxMOwogCiBvdXRfcmVsZWFzZToKKwltdXRleF91bmxvY2soJnQtPm11dGV4KTsKIAlhbWJhX3JlbGVhc2VfcmVnaW9ucyhkZXYpOwogCiAJcmV0dXJuIHJldDsKQEAgLTQwMiw4ICs0NzksMTAgQEAKIAlpb3VubWFwKHQtPmV0Yl9yZWdzKTsKIAl0LT5ldGJfcmVncyA9IE5VTEw7CiAKLQljbGtfZGlzYWJsZSh0LT5lbXVfY2xrKTsKLQljbGtfcHV0KHQtPmVtdV9jbGspOworCWlmICghSVNfRVJSKHQtPmVtdV9jbGspKSB7CisJCWNsa19kaXNhYmxlKHQtPmVtdV9jbGspOworCQljbGtfcHV0KHQtPmVtdV9jbGspOworCX0KIAogCWFtYmFfcmVsZWFzZV9yZWdpb25zKGRldik7CiAKQEAgLTQ0Nyw3ICs1MjYsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZ0cmFjZXIubXV0ZXgpOwotCXJldCA9IHZhbHVlID8gdHJhY2Vfc3RhcnQoJnRyYWNlcikgOiB0cmFjZV9zdG9wKCZ0cmFjZXIpOworCWlmICghdHJhY2VyLmV0Yl9yZWdzKQorCQlyZXQgPSAtRU5PREVWOworCWVsc2UKKwkJcmV0ID0gdmFsdWUgPyB0cmFjZV9zdGFydCgmdHJhY2VyKSA6IHRyYWNlX3N0b3AoJnRyYWNlcik7CiAJbXV0ZXhfdW5sb2NrKCZ0cmFjZXIubXV0ZXgpOwogCiAJcmV0dXJuIHJldCA/IDogbjsKQEAgLTQ2MiwzNiArNTQ0LDUwIEBACiB7CiAJdTMyIGV0Yl93YSwgZXRiX3JhLCBldGJfc3QsIGV0Yl9mYywgZXRtX2N0cmwsIGV0bV9zdDsKIAlpbnQgZGF0YWxlbjsKKwlpbnQgaWQ7CisJaW50IHJldDsKIAotCWV0Yl91bmxvY2soJnRyYWNlcik7Ci0JZGF0YWxlbiA9IGV0Yl9nZXRkYXRhbGVuKCZ0cmFjZXIpOwotCWV0Yl93YSA9IGV0Yl9yZWFkbCgmdHJhY2VyLCBFVEJSX1dSSVRFQUREUik7Ci0JZXRiX3JhID0gZXRiX3JlYWRsKCZ0cmFjZXIsIEVUQlJfUkVBREFERFIpOwotCWV0Yl9zdCA9IGV0Yl9yZWFkbCgmdHJhY2VyLCBFVEJSX1NUQVRVUyk7Ci0JZXRiX2ZjID0gZXRiX3JlYWRsKCZ0cmFjZXIsIEVUQlJfRk9STUFUVEVSQ1RSTCk7Ci0JZXRiX2xvY2soJnRyYWNlcik7CisJbXV0ZXhfbG9jaygmdHJhY2VyLm11dGV4KTsKKwlpZiAodHJhY2VyLmV0Yl9yZWdzKSB7CisJCWV0Yl91bmxvY2soJnRyYWNlcik7CisJCWRhdGFsZW4gPSBldGJfZ2V0ZGF0YWxlbigmdHJhY2VyKTsKKwkJZXRiX3dhID0gZXRiX3JlYWRsKCZ0cmFjZXIsIEVUQlJfV1JJVEVBRERSKTsKKwkJZXRiX3JhID0gZXRiX3JlYWRsKCZ0cmFjZXIsIEVUQlJfUkVBREFERFIpOworCQlldGJfc3QgPSBldGJfcmVhZGwoJnRyYWNlciwgRVRCUl9TVEFUVVMpOworCQlldGJfZmMgPSBldGJfcmVhZGwoJnRyYWNlciwgRVRCUl9GT1JNQVRURVJDVFJMKTsKKwkJZXRiX2xvY2soJnRyYWNlcik7CisJfSBlbHNlIHsKKwkJZXRiX3dhID0gZXRiX3JhID0gZXRiX3N0ID0gZXRiX2ZjID0gfjA7CisJCWRhdGFsZW4gPSAtMTsKKwl9CiAKLQlldG1fdW5sb2NrKCZ0cmFjZXIpOwotCWV0bV9jdHJsID0gZXRtX3JlYWRsKCZ0cmFjZXIsIEVUTVJfQ1RSTCk7Ci0JZXRtX3N0ID0gZXRtX3JlYWRsKCZ0cmFjZXIsIEVUTVJfU1RBVFVTKTsKLQlldG1fbG9jaygmdHJhY2VyKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlRyYWNlIGJ1ZmZlciBsZW46ICVkXG5Db21wYXJhdG9yIHBhaXJzOiAlZFxuIgorCXJldCA9IHNwcmludGYoYnVmLCAiVHJhY2UgYnVmZmVyIGxlbjogJWRcbkNvbXBhcmF0b3IgcGFpcnM6ICVkXG4iCiAJCQkiRVRCUl9XUklURUFERFI6XHQlMDh4XG4iCiAJCQkiRVRCUl9SRUFEQUREUjpcdCUwOHhcbiIKIAkJCSJFVEJSX1NUQVRVUzpcdCUwOHhcbiIKLQkJCSJFVEJSX0ZPUk1BVFRFUkNUUkw6XHQlMDh4XG4iCi0JCQkiRVRNUl9DVFJMOlx0JTA4eFxuIgotCQkJIkVUTVJfU1RBVFVTOlx0JTA4eFxuIiwKKwkJCSJFVEJSX0ZPUk1BVFRFUkNUUkw6XHQlMDh4XG4iLAogCQkJZGF0YWxlbiwKIAkJCXRyYWNlci5uY21wcGFpcnMsCiAJCQlldGJfd2EsCiAJCQlldGJfcmEsCiAJCQlldGJfc3QsCi0JCQlldGJfZmMsCisJCQlldGJfZmMKKwkJCSk7CisKKwlmb3IgKGlkID0gMDsgaWQgPCB0cmFjZXIuZXRtX3JlZ3NfY291bnQ7IGlkKyspIHsKKwkJZXRtX3VubG9jaygmdHJhY2VyLCBpZCk7CisJCWV0bV9jdHJsID0gZXRtX3JlYWRsKCZ0cmFjZXIsIGlkLCBFVE1SX0NUUkwpOworCQlldG1fc3QgPSBldG1fcmVhZGwoJnRyYWNlciwgaWQsIEVUTVJfU1RBVFVTKTsKKwkJZXRtX2xvY2soJnRyYWNlciwgaWQpOworCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJFVE1SX0NUUkw6XHQlMDh4XG4iCisJCQkiRVRNUl9TVEFUVVM6XHQlMDh4XG4iLAogCQkJZXRtX2N0cmwsCiAJCQlldG1fc3QKIAkJCSk7CisJfQorCW11dGV4X3VubG9jaygmdHJhY2VyLm11dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgdHJhY2VfaW5mb19hdHRyID0KQEAgLTUzMCw0MiArNjI2LDEyMSBAQAogc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB0cmFjZV9tb2RlX2F0dHIgPQogCV9fQVRUUih0cmFjZV9tb2RlLCAwNjQ0LCB0cmFjZV9tb2RlX3Nob3csIHRyYWNlX21vZGVfc3RvcmUpOwogCitzdGF0aWMgc3NpemVfdCB0cmFjZV9yYW5nZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwOGx4ICUwOGx4XG4iLAorCQkJdHJhY2VyLnJhbmdlX3N0YXJ0LCB0cmFjZXIucmFuZ2VfZW5kKTsKK30KKworc3RhdGljIHNzaXplX3QgdHJhY2VfcmFuZ2Vfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pCit7CisJdW5zaWduZWQgbG9uZyByYW5nZV9zdGFydCwgcmFuZ2VfZW5kOworCisJaWYgKHNzY2FuZihidWYsICIlbHggJWx4IiwgJnJhbmdlX3N0YXJ0LCAmcmFuZ2VfZW5kKSAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnRyYWNlci5tdXRleCk7CisJdHJhY2VyLnJhbmdlX3N0YXJ0ID0gcmFuZ2Vfc3RhcnQ7CisJdHJhY2VyLnJhbmdlX2VuZCA9IHJhbmdlX2VuZDsKKwltdXRleF91bmxvY2soJnRyYWNlci5tdXRleCk7CisKKwlyZXR1cm4gbjsKK30KKworCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHRyYWNlX3JhbmdlX2F0dHIgPQorCV9fQVRUUih0cmFjZV9yYW5nZSwgMDY0NCwgdHJhY2VfcmFuZ2Vfc2hvdywgdHJhY2VfcmFuZ2Vfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCB0cmFjZV9kYXRhX3JhbmdlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyByYW5nZV9zdGFydDsKKwl1NjQgcmFuZ2VfZW5kOworCW11dGV4X2xvY2soJnRyYWNlci5tdXRleCk7CisJcmFuZ2Vfc3RhcnQgPSB0cmFjZXIuZGF0YV9yYW5nZV9zdGFydDsKKwlyYW5nZV9lbmQgPSB0cmFjZXIuZGF0YV9yYW5nZV9lbmQ7CisJaWYgKCFyYW5nZV9lbmQgJiYgKHRyYWNlci5mbGFncyAmIFRSQUNFUl9UUkFDRV9EQVRBKSkKKwkJcmFuZ2VfZW5kID0gMHgxMDAwMDAwMDBVTEw7CisJbXV0ZXhfdW5sb2NrKCZ0cmFjZXIubXV0ZXgpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwOGx4ICUwOGxseFxuIiwgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRyYWNlX2RhdGFfcmFuZ2Vfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pCit7CisJdW5zaWduZWQgbG9uZyByYW5nZV9zdGFydDsKKwl1NjQgcmFuZ2VfZW5kOworCisJaWYgKHNzY2FuZihidWYsICIlbHggJWxseCIsICZyYW5nZV9zdGFydCwgJnJhbmdlX2VuZCkgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ0cmFjZXIubXV0ZXgpOworCXRyYWNlci5kYXRhX3JhbmdlX3N0YXJ0ID0gcmFuZ2Vfc3RhcnQ7CisJdHJhY2VyLmRhdGFfcmFuZ2VfZW5kID0gKHVuc2lnbmVkIGxvbmcpcmFuZ2VfZW5kOworCWlmIChyYW5nZV9lbmQpCisJCXRyYWNlci5mbGFncyB8PSBUUkFDRVJfVFJBQ0VfREFUQTsKKwllbHNlCisJCXRyYWNlci5mbGFncyAmPSB+VFJBQ0VSX1RSQUNFX0RBVEE7CisJbXV0ZXhfdW5sb2NrKCZ0cmFjZXIubXV0ZXgpOworCisJcmV0dXJuIG47Cit9CisKKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB0cmFjZV9kYXRhX3JhbmdlX2F0dHIgPQorCV9fQVRUUih0cmFjZV9kYXRhX3JhbmdlLCAwNjQ0LAorCQl0cmFjZV9kYXRhX3JhbmdlX3Nob3csIHRyYWNlX2RhdGFfcmFuZ2Vfc3RvcmUpOworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBldG1fcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBhbWJhX2lkICppZCkKIHsKIAlzdHJ1Y3QgdHJhY2VjdHggKnQgPSAmdHJhY2VyOwogCWludCByZXQgPSAwOworCXZvaWQgX19pb21lbSAqKm5ld19yZWdzOworCWludCBuZXdfY291bnQ7CiAKLQlpZiAodC0+ZXRtX3JlZ3MpIHsKLQkJZGV2X2RiZygmZGV2LT5kZXYsICJFVE0gYWxyZWFkeSBpbml0aWFsaXplZFxuIik7Ci0JCXJldCA9IC1FQlVTWTsKKwltdXRleF9sb2NrKCZ0LT5tdXRleCk7CisJbmV3X2NvdW50ID0gdC0+ZXRtX3JlZ3NfY291bnQgKyAxOworCW5ld19yZWdzID0ga3JlYWxsb2ModC0+ZXRtX3JlZ3MsCisJCQkJc2l6ZW9mKHQtPmV0bV9yZWdzWzBdKSAqIG5ld19jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW5ld19yZWdzKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIEVUTSByZWdpc3RlciBhcnJheVxuIik7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KKwl0LT5ldG1fcmVncyA9IG5ld19yZWdzOwogCiAJcmV0ID0gYW1iYV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBOVUxMKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXQtPmV0bV9yZWdzID0gaW9yZW1hcF9ub2NhY2hlKGRldi0+cmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlcykpOwotCWlmICghdC0+ZXRtX3JlZ3MpIHsKKwl0LT5ldG1fcmVnc1t0LT5ldG1fcmVnc19jb3VudF0gPQorCQlpb3JlbWFwX25vY2FjaGUoZGV2LT5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJmRldi0+cmVzKSk7CisJaWYgKCF0LT5ldG1fcmVnc1t0LT5ldG1fcmVnc19jb3VudF0pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKLQlhbWJhX3NldF9kcnZkYXRhKGRldiwgdCk7CisJYW1iYV9zZXRfZHJ2ZGF0YShkZXYsIHQtPmV0bV9yZWdzW3QtPmV0bV9yZWdzX2NvdW50XSk7CiAKLQltdXRleF9pbml0KCZ0LT5tdXRleCk7Ci0JdC0+ZGV2ID0gJmRldi0+ZGV2OwotCXQtPmZsYWdzID0gVFJBQ0VSX0NZQ0xFX0FDQzsKKwl0LT5mbGFncyA9IFRSQUNFUl9DWUNMRV9BQ0MgfCBUUkFDRVJfVFJBQ0VfREFUQTsKIAl0LT5ldG1fcG9ydHN6ID0gMTsKIAotCWV0bV91bmxvY2sodCk7Ci0JKHZvaWQpZXRtX3JlYWRsKHQsIEVUTU1SX1BEU1IpOworCWV0bV91bmxvY2sodCwgdC0+ZXRtX3JlZ3NfY291bnQpOworCSh2b2lkKWV0bV9yZWFkbCh0LCB0LT5ldG1fcmVnc19jb3VudCwgRVRNTVJfUERTUik7CiAJLyogZHVtbXkgZmlyc3QgcmVhZCAqLwotCSh2b2lkKWV0bV9yZWFkbCgmdHJhY2VyLCBFVE1NUl9PU1NSUik7CisJKHZvaWQpZXRtX3JlYWRsKCZ0cmFjZXIsIHQtPmV0bV9yZWdzX2NvdW50LCBFVE1NUl9PU1NSUik7CiAKLQl0LT5uY21wcGFpcnMgPSBldG1fcmVhZGwodCwgRVRNUl9DT05GQ09ERSkgJiAweGY7Ci0JZXRtX3dyaXRlbCh0LCAweDQ0MCwgRVRNUl9DVFJMKTsKLQlldG1fbG9jayh0KTsKKwl0LT5uY21wcGFpcnMgPSBldG1fcmVhZGwodCwgdC0+ZXRtX3JlZ3NfY291bnQsIEVUTVJfQ09ORkNPREUpICYgMHhmOworCWV0bV93cml0ZWwodCwgdC0+ZXRtX3JlZ3NfY291bnQsIDB4NDQxLCBFVE1SX0NUUkwpOworCWV0bV93cml0ZWwodCwgdC0+ZXRtX3JlZ3NfY291bnQsIG5ld19jb3VudCwgRVRNUl9UUkFDRUlEUik7CisJZXRtX2xvY2sodCwgdC0+ZXRtX3JlZ3NfY291bnQpOwogCiAJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LmtvYmosCiAJCQkmdHJhY2VfcnVubmluZ19hdHRyLmF0dHIpOwpAQCAtNTgxLDM1ICs3NTYsNjcgQEAKIAlpZiAocmV0KQogCQlkZXZfZGJnKCZkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgdHJhY2VfbW9kZSBpbiBzeXNmc1xuIik7CiAKLQlkZXZfZGJnKHQtPmRldiwgIkVUTSBBTUJBIGRyaXZlciBpbml0aWFsaXplZC5cbiIpOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZkZXYtPmRldi5rb2JqLCAmdHJhY2VfcmFuZ2VfYXR0ci5hdHRyKTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgdHJhY2VfcmFuZ2UgaW4gc3lzZnNcbiIpOworCisJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LmtvYmosICZ0cmFjZV9kYXRhX3JhbmdlX2F0dHIuYXR0cik7CisJaWYgKHJldCkKKwkJZGV2X2RiZygmZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGNyZWF0ZSB0cmFjZV9kYXRhX3JhbmdlIGluIHN5c2ZzXG4iKTsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAiRVRNIEFNQkEgZHJpdmVyIGluaXRpYWxpemVkLlxuIik7CisKKwkvKiBFbmFibGUgZm9ybWF0dGVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmFjZSBzb3VyY2VzICovCisJaWYgKG5ld19jb3VudCA+IDEpCisJCXQtPmV0Yl9mYyA9IEVUQkZGX0VORkNPTlQgfCBFVEJGRl9FTkZUQzsKKworCXQtPmV0bV9yZWdzX2NvdW50ID0gbmV3X2NvdW50OwogCiBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIAogb3V0X3VubWFwOgogCWFtYmFfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQlpb3VubWFwKHQtPmV0bV9yZWdzKTsKKwlpb3VubWFwKHQtPmV0bV9yZWdzW3QtPmV0bV9yZWdzX2NvdW50XSk7CiAKIG91dF9yZWxlYXNlOgogCWFtYmFfcmVsZWFzZV9yZWdpb25zKGRldik7CiAKKwltdXRleF91bmxvY2soJnQtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGV0bV9yZW1vdmUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHRyYWNlY3R4ICp0ID0gYW1iYV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JYW1iYV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotCi0JaW91bm1hcCh0LT5ldG1fcmVncyk7Ci0JdC0+ZXRtX3JlZ3MgPSBOVUxMOwotCi0JYW1iYV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdHJhY2VjdHggKnQgPSAmdHJhY2VyOworCXZvaWQgX19pb21lbQkqZXRtX3JlZ3MgPSBhbWJhX2dldF9kcnZkYXRhKGRldik7CiAKIAlzeXNmc19yZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX3J1bm5pbmdfYXR0ci5hdHRyKTsKIAlzeXNmc19yZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX2luZm9fYXR0ci5hdHRyKTsKIAlzeXNmc19yZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX21vZGVfYXR0ci5hdHRyKTsKKwlzeXNmc19yZW1vdmVfZmlsZSgmZGV2LT5kZXYua29iaiwgJnRyYWNlX3JhbmdlX2F0dHIuYXR0cik7CisJc3lzZnNfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LmtvYmosICZ0cmFjZV9kYXRhX3JhbmdlX2F0dHIuYXR0cik7CisKKwlhbWJhX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwltdXRleF9sb2NrKCZ0LT5tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IHQtPmV0bV9yZWdzX2NvdW50OyBpKyspCisJCWlmICh0LT5ldG1fcmVnc1tpXSA9PSBldG1fcmVncykKKwkJCWJyZWFrOworCWZvciAoOyBpIDwgdC0+ZXRtX3JlZ3NfY291bnQgLSAxOyBpKyspCisJCXQtPmV0bV9yZWdzW2ldID0gdC0+ZXRtX3JlZ3NbaSArIDFdOworCXQtPmV0bV9yZWdzX2NvdW50LS07CisJaWYgKCF0LT5ldG1fcmVnc19jb3VudCkgeworCQlrZnJlZSh0LT5ldG1fcmVncyk7CisJCXQtPmV0bV9yZWdzID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ0LT5tdXRleCk7CisKKwlpb3VubWFwKGV0bV9yZWdzKTsKKwlhbWJhX3JlbGVhc2VfcmVnaW9ucyhkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MTksNiArODI2LDEwIEBACiAJCS5pZAk9IDB4MDAwM2I5MjEsCiAJCS5tYXNrCT0gMHgwMDA3ZmZmZiwKIAl9LAorCXsKKwkJLmlkCT0gMHgwMDAzYjk1MCwKKwkJLm1hc2sJPSAweDAwMDdmZmZmLAorCX0sCiAJeyAwLCAwIH0sCiB9OwogCkBAIC02MzYsNiArODQ3LDggQEAKIHsKIAlpbnQgcmV0dmFsOwogCisJbXV0ZXhfaW5pdCgmdHJhY2VyLm11dGV4KTsKKwogCXJldHZhbCA9IGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZldGJfZHJpdmVyKTsKIAlpZiAocmV0dmFsKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIGV0YlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMKaW5kZXggYzAwNjJhZC4uNGM2ZTVlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYwpAQCAtMTE1LDYgKzExNSwyMCBAQAogfQogI2VuZGlmCiAKK2ludCBmdHJhY2VfYXJjaF9jb2RlX21vZGlmeV9wcmVwYXJlKHZvaWQpCit7CisJc2V0X2tlcm5lbF90ZXh0X3J3KCk7CisJc2V0X2FsbF9tb2R1bGVzX3RleHRfcncoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZ0cmFjZV9hcmNoX2NvZGVfbW9kaWZ5X3Bvc3RfcHJvY2Vzcyh2b2lkKQoreworCXNldF9hbGxfbW9kdWxlc190ZXh0X3JvKCk7CisJc2V0X2tlcm5lbF90ZXh0X3JvKCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZ0cmFjZV9jYWxsX3JlcGxhY2UodW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXJldHVybiBmdHJhY2VfZ2VuX2JyYW5jaChwYywgYWRkciwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbGVkcy5jIGIvYXJjaC9hcm0va2VybmVsL2xlZHMuYwppbmRleCAzMWEzMTZjLi4wMTg4ZmEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbGVkcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9sZWRzLmMKQEAgLTksNiArOSw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KIAogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CkBAIC05OSw2ICsxMDEsMjUgQEAKIAkuY2xzCQk9ICZsZWRzX3N5c2NsYXNzLAogfTsKIAorc3RhdGljIGludCBsZWRzX2lkbGVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIElETEVfU1RBUlQ6CisJCWxlZHNfZXZlbnQobGVkX2lkbGVfc3RhcnQpOworCQlicmVhazsKKwljYXNlIElETEVfRU5EOgorCQlsZWRzX2V2ZW50KGxlZF9pZGxlX2VuZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGxlZHNfaWRsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGxlZHNfaWRsZV9ub3RpZmllciwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGxlZHNfaW5pdCh2b2lkKQogewogCWludCByZXQ7CkBAIC0xMDcsNiArMTI4LDkgQEAKIAkJcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZsZWRzX2RldmljZSk7CiAJaWYgKHJldCA9PSAwKQogCQlyZXQgPSBzeXNkZXZfY3JlYXRlX2ZpbGUoJmxlZHNfZGV2aWNlLCAmYXR0cl9ldmVudCk7CisJaWYgKHJldCA9PSAwKQorCQlpZGxlX25vdGlmaWVyX3JlZ2lzdGVyKCZsZWRzX2lkbGVfbmIpOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggMTM5ZTNjOC4uZDI4NGEzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC01ODgsNyArNTg4LDcgQEAKIHN0YXRpYyB2b2lkIGFybXBtdV9lbmFibGUoc3RydWN0IHBtdSAqcG11KQogewogCS8qIEVuYWJsZSBhbGwgb2YgdGhlIHBlcmYgZXZlbnRzIG9uIGhhcmR3YXJlLiAqLwotCWludCBpZHg7CisJaW50IGlkeCwgZW5hYmxlZCA9IDA7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKIAogCWlmICghYXJtcG11KQpAQCAtNjAxLDkgKzYwMSwxMSBAQAogCQkJY29udGludWU7CiAKIAkJYXJtcG11LT5lbmFibGUoJmV2ZW50LT5odywgaWR4KTsKKwkJZW5hYmxlZCA9IDE7CiAJfQogCi0JYXJtcG11LT5zdGFydCgpOworCWlmIChlbmFibGVkKQorCQlhcm1wbXUtPnN0YXJ0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFybXBtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDM0ZWE4NjQuLmNkMTYxMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+CkBAIC0xODIsOCArMTgxLDggQEAKIAogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKKwkJaWRsZV9ub3RpZmllcl9jYWxsX2NoYWluKElETEVfU1RBUlQpOwogCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOwotCQlsZWRzX2V2ZW50KGxlZF9pZGxlX3N0YXJ0KTsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCQkJaWYgKGNwdV9pc19vZmZsaW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpCkBAIC0yMDcsOCArMjA2LDggQEAKIAkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCQl9CiAJCX0KLQkJbGVkc19ldmVudChsZWRfaWRsZV9lbmQpOwogCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCWlkbGVfbm90aWZpZXJfY2FsbF9jaGFpbihJRExFX0VORCk7CiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAkJc2NoZWR1bGUoKTsKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKaW5kZXggYzY3ZjY4NC4uMDlhODdlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYwpAQCAtNTIwLDcgKzUyMCw3IEBACiAJICovCiAJaWYgKGhhdmVfaW1hZ2VyKCkpIHsKIAkJbGFiZWwgPSAiSEQgaW1hZ2VyIjsKLQkJbXV4IHw9IDE7CisJCW11eCB8PSAyOwogCiAJCS8qIGV4dGVybmFsbHkgbXV4IE1NQzEvRU5FVC9BSUMzMyB0byBpbWFnZXIgKi8KIAkJbXV4IHw9IEJJVCg2KSB8IEJJVCg1KSB8IEJJVCgzKTsKQEAgLTU0MCw3ICs1NDAsNyBAQAogCQlyZXNldHMgJj0gfkJJVCgxKTsKIAogCQlpZiAoaGF2ZV90dnA3MDAyKCkpIHsKLQkJCW11eCB8PSAyOworCQkJbXV4IHw9IDE7CiAJCQlyZXNldHMgJj0gfkJJVCgyKTsKIAkJCWxhYmVsID0gInR2cDcwMDIgSEQiOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbml0LmMKaW5kZXggY2Y5MWY1MC4uYThhODNlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5pdC5jCkBAIC0zNSw2ICszNSw3IEBACiAJCQl0Y2ZnLT5jbG9ja3MgPSBleHlub3M0X3NlcmlhbF9jbG9ja3M7CiAJCQl0Y2ZnLT5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUoZXh5bm9zNF9zZXJpYWxfY2xvY2tzKTsKIAkJfQorCQl0Y2ZnLT5mbGFncyB8PSBOT19ORUVEX0NIRUNLX0NMS1NSQzsKIAl9CiAKIAlzM2MyNHh4X2luaXRfdWFydGRldnMoInM1cHYyMTAtdWFydCIsIHM1cF91YXJ0X3Jlc291cmNlcywgY2ZnLCBubyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9weGExNjguYyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCmluZGV4IDcyYjRlNzYuLmFiOWY5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTE2OC5jCkBAIC03OSw3ICs3OSw3IEBACiBzdGF0aWMgQVBCQ19DTEsoc3NwNSwgUFhBMTY4X1NTUDUsIDQsIDApOwogc3RhdGljIEFQQkNfQ0xLKGtleXBhZCwgUFhBMTY4X0tQQywgMCwgMzIwMDApOwogCi1zdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgwMWRiLCAyMDgwMDAwMDApOworc3RhdGljIEFQTVVfQ0xLKG5hbmQsIE5BTkQsIDB4MTliLCAxNTYwMDAwMDApOwogc3RhdGljIEFQTVVfQ0xLKGxjZCwgTENELCAweDdmLCAzMTIwMDAwMDApOwogCiAvKiBkZXZpY2UgYW5kIGNsb2NrIGJpbmRpbmdzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9weGE5MTAuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCmluZGV4IDhmOTJjY2QuLjE0NjQ2MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL3B4YTkxMC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIHN0YXRpYyBBUEJDX0NMSyhwd20zLCBQWEE5MTBfUFdNMywgMSwgMTMwMDAwMDApOwogc3RhdGljIEFQQkNfQ0xLKHB3bTQsIFBYQTkxMF9QV000LCAxLCAxMzAwMDAwMCk7CiAKLXN0YXRpYyBBUE1VX0NMSyhuYW5kLCBOQU5ELCAweDAxZGIsIDIwODAwMDAwMCk7CitzdGF0aWMgQVBNVV9DTEsobmFuZCwgTkFORCwgMHgxOWIsIDE1NjAwMDAwMCk7CiBzdGF0aWMgQVBNVV9DTEsodTJvLCBVU0IsIDB4MWIsIDQ4MDAwMDAwMCk7CiAKIC8qIGRldmljZSBhbmQgY2xvY2sgYmluZGluZ3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYwppbmRleCAxZDE0MTliLi5kZmZmMWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCkBAIC0zNDcsOSArMzQ3LDkgQEAKIAkJaWYgKChncGlvX2Rlc2NbaV0uY29uZmlnICYgTUZQX0xQTV9LRUVQX09VVFBVVCkgJiYKIAkJICAgIChHUERSKGkpICYgR1BJT19iaXQoaSkpKSB7CiAJCQlpZiAoR1BMUihpKSAmIEdQSU9fYml0KGkpKQotCQkJCVBHU1IoaSkgfD0gR1BJT19iaXQoaSk7CisJCQkJUEdTUihncGlvX3RvX2JhbmsoaSkpIHw9IEdQSU9fYml0KGkpOwogCQkJZWxzZQotCQkJCVBHU1IoaSkgJj0gfkdQSU9fYml0KGkpOworCQkJCVBHU1IoZ3Bpb190b19iYW5rKGkpKSAmPSB+R1BJT19iaXQoaSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL01ha2VmaWxlIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKaW5kZXggYmNhN2U2MS4uMzdkYTJjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiAKIG9iai0kKENPTkZJR19NTVUpCQkrPSBmYXVsdC1hcm12Lm8gZmx1c2gubyBpZG1hcC5vIGlvcmVtYXAubyBcCiAJCQkJICAgbW1hcC5vIHBnZC5vIG1tdS5vIHZtcmVnaW9uLm8KK29iai0kKENPTkZJR19ERUJVR19ST0RBVEEpCSs9IHJvZGF0YS5vCiAKIGlmbmVxICgkKENPTkZJR19NTVUpLHkpCiBvYmoteQkJCQkrPSBub21tdS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12Ni5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjYuUwppbmRleCA3YTRlMGFlLi42YjU0NDFkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjYuUworKysgYi9hcmNoL2FybS9tbS9jYWNoZS12Ni5TCkBAIC0xNzYsNiArMTc2LDcgQEAKICAqLwogRU5UUlkodjZfZmx1c2hfa2Vybl9kY2FjaGVfYXJlYSkKIAlhZGQJcjEsIHIwLCByMQorCWJpYwlyMCwgcjAsICNEX0NBQ0hFX0xJTkVfU0laRSAtIDEKIDE6CiAjaWZkZWYgSEFSVkFSRF9DQUNIRQogCW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGxpbmUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMgYi9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCmluZGV4IGRjMThkODEuLmQzMmYwMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUwpAQCAtMjIxLDYgKzIyMSw4IEBACiBFTlRSWSh2N19mbHVzaF9rZXJuX2RjYWNoZV9hcmVhKQogCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCiAJYWRkCXIxLCByMCwgcjEKKwlzdWIJcjMsIHIyLCAjMQorCWJpYwlyMCwgcjAsIHIzCiAxOgogCW1jcglwMTUsIDAsIHIwLCBjNywgYzE0LCAxCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGxpbmUgLyB1bmlmaWVkIGxpbmUKIAlhZGQJcjAsIHIwLCByMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW11LmMgYi9hcmNoL2FybS9tbS9tbXUuYwppbmRleCA2Y2Y3NmIzLi4yMTkwZjg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbXUuYworKysgYi9hcmNoL2FybS9tbS9tbXUuYwpAQCAtNTMwLDExICs1MzAsMjUgQEAKIAlyZXR1cm4gcHRyOwogfQogCi1zdGF0aWMgcHRlX3QgKiBfX2luaXQgZWFybHlfcHRlX2FsbG9jKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwcm90KQorc3RhdGljIHB0ZV90ICogX19pbml0IGVhcmx5X3B0ZV9hbGxvYyhwbWRfdCAqcG1kKQoreworCWlmIChwbWRfbm9uZSgqcG1kKSB8fCBwbWRfYmFkKCpwbWQpKQorCQlyZXR1cm4gZWFybHlfYWxsb2MoUFRFX0hXVEFCTEVfT0ZGICsgUFRFX0hXVEFCTEVfU0laRSk7CisJcmV0dXJuIHBtZF9wYWdlX3ZhZGRyKCpwbWQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfcHRlX2luc3RhbGwocG1kX3QgKnBtZCwgcHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBwcm90KQoreworCV9fcG1kX3BvcHVsYXRlKHBtZCwgX19wYShwdGUpLCBwcm90KTsKKwlCVUdfT04ocG1kX2JhZCgqcG1kKSk7Cit9CisKK3N0YXRpYyBwdGVfdCAqIF9faW5pdCBlYXJseV9wdGVfYWxsb2NfYW5kX2luc3RhbGwocG1kX3QgKnBtZCwKKwl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcHJvdCkKIHsKIAlpZiAocG1kX25vbmUoKnBtZCkpIHsKLQkJcHRlX3QgKnB0ZSA9IGVhcmx5X2FsbG9jKFBURV9IV1RBQkxFX09GRiArIFBURV9IV1RBQkxFX1NJWkUpOwotCQlfX3BtZF9wb3B1bGF0ZShwbWQsIF9fcGEocHRlKSwgcHJvdCk7CisJCXB0ZV90ICpwdGUgPSBlYXJseV9wdGVfYWxsb2MocG1kKTsKKwkJZWFybHlfcHRlX2luc3RhbGwocG1kLCBwdGUsIHByb3QpOwogCX0KIAlCVUdfT04ocG1kX2JhZCgqcG1kKSk7CiAJcmV0dXJuIHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcik7CkBAIC01NDQsMTYgKzU1OCwyMyBAQAogCQkJCSAgdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJCSAgY29uc3Qgc3RydWN0IG1lbV90eXBlICp0eXBlKQogewotCXB0ZV90ICpwdGUgPSBlYXJseV9wdGVfYWxsb2MocG1kLCBhZGRyLCB0eXBlLT5wcm90X2wxKTsKKwlwdGVfdCAqc3RhcnRfcHRlID0gZWFybHlfcHRlX2FsbG9jKHBtZCk7CisJcHRlX3QgKnB0ZSA9IHN0YXJ0X3B0ZSArIHB0ZV9pbmRleChhZGRyKTsKKworCS8qIElmIHJlcGxhY2luZyBhIHNlY3Rpb24gbWFwcGluZywgdGhlIHdob2xlIHNlY3Rpb24gbXVzdCBiZSByZXBsYWNlZCAqLworCUJVR19PTihwbWRfYmFkKCpwbWQpICYmICgoYWRkciB8IGVuZCkgJiB+UE1EX01BU0spKTsKKwogCWRvIHsKIAkJc2V0X3B0ZV9leHQocHRlLCBwZm5fcHRlKHBmbiwgX19wZ3Byb3QodHlwZS0+cHJvdF9wdGUpKSwgMCk7CiAJCXBmbisrOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOworCWVhcmx5X3B0ZV9pbnN0YWxsKHBtZCwgc3RhcnRfcHRlLCB0eXBlLT5wcm90X2wxKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGFsbG9jX2luaXRfc2VjdGlvbihwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBlbmQsIHBoeXNfYWRkcl90IHBoeXMsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG1lbV90eXBlICp0eXBlKQorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBtZW1fdHlwZSAqdHlwZSwKKwkJCQkgICAgICBib29sIGZvcmNlX3BhZ2VzKQogewogCXBtZF90ICpwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CiAKQEAgLTU2Myw3ICs1ODQsNyBAQAogCSAqIEwxIGVudHJpZXMsIHdoZXJlYXMgUEdEcyByZWZlciB0byBhIGdyb3VwIG9mIEwxIGVudHJpZXMgbWFraW5nCiAJICogdXAgb25lIGxvZ2ljYWwgcG9pbnRlciB0byBhbiBMMiB0YWJsZS4KIAkgKi8KLQlpZiAoKChhZGRyIHwgZW5kIHwgcGh5cykgJiB+U0VDVElPTl9NQVNLKSA9PSAwKSB7CisJaWYgKCgoYWRkciB8IGVuZCB8IHBoeXMpICYgflNFQ1RJT05fTUFTSykgPT0gMCAmJiAhZm9yY2VfcGFnZXMpIHsKIAkJcG1kX3QgKnAgPSBwbWQ7CiAKIAkJaWYgKGFkZHIgJiBTRUNUSU9OX1NJWkUpCkBAIC01ODUsMTQgKzYwNiwxNCBAQAogfQogCiBzdGF0aWMgdm9pZCBhbGxvY19pbml0X3B1ZChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAotCXVuc2lnbmVkIGxvbmcgcGh5cywgY29uc3Qgc3RydWN0IG1lbV90eXBlICp0eXBlKQorCXVuc2lnbmVkIGxvbmcgcGh5cywgY29uc3Qgc3RydWN0IG1lbV90eXBlICp0eXBlLCBib29sIGZvcmNlX3BhZ2VzKQogewogCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CiAJdW5zaWduZWQgbG9uZyBuZXh0OwogCiAJZG8gewogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0JCWFsbG9jX2luaXRfc2VjdGlvbihwdWQsIGFkZHIsIG5leHQsIHBoeXMsIHR5cGUpOworCQlhbGxvY19pbml0X3NlY3Rpb24ocHVkLCBhZGRyLCBuZXh0LCBwaHlzLCB0eXBlLCBmb3JjZV9wYWdlcyk7CiAJCXBoeXMgKz0gbmV4dCAtIGFkZHI7CiAJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiB9CkBAIC02NjQsNyArNjg1LDcgQEAKICAqIG9mZnNldHMsIGFuZCB3ZSB0YWtlIGZ1bGwgYWR2YW50YWdlIG9mIHNlY3Rpb25zIGFuZAogICogc3VwZXJzZWN0aW9ucy4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV9tYXBwaW5nKHN0cnVjdCBtYXBfZGVzYyAqbWQpCitzdGF0aWMgdm9pZCBfX2luaXQgY3JlYXRlX21hcHBpbmcoc3RydWN0IG1hcF9kZXNjICptZCwgYm9vbCBmb3JjZV9wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIsIGxlbmd0aCwgZW5kOwogCXBoeXNfYWRkcl90IHBoeXM7CkBAIC03MTEsNyArNzMyLDcgQEAKIAlkbyB7CiAJCXVuc2lnbmVkIGxvbmcgbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCi0JCWFsbG9jX2luaXRfcHVkKHBnZCwgYWRkciwgbmV4dCwgcGh5cywgdHlwZSk7CisJCWFsbG9jX2luaXRfcHVkKHBnZCwgYWRkciwgbmV4dCwgcGh5cywgdHlwZSwgZm9yY2VfcGFnZXMpOwogCiAJCXBoeXMgKz0gbmV4dCAtIGFkZHI7CiAJCWFkZHIgPSBuZXh0OwpAQCAtNzI2LDcgKzc0Nyw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKLQkJY3JlYXRlX21hcHBpbmcoaW9fZGVzYyArIGkpOworCQljcmVhdGVfbWFwcGluZyhpb19kZXNjICsgaSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCAqIF9faW5pdGRhdGEgdm1hbGxvY19taW4gPSAodm9pZCAqKShWTUFMTE9DX0VORCAtIFNaXzEyOE0pOwpAQCAtOTY5LDEyICs5OTAsMTIgQEAKIAltYXAudmlydHVhbCA9IDB4ZmZmZjAwMDA7CiAJbWFwLmxlbmd0aCA9IFBBR0VfU0laRTsKIAltYXAudHlwZSA9IE1UX0hJR0hfVkVDVE9SUzsKLQljcmVhdGVfbWFwcGluZygmbWFwKTsKKwljcmVhdGVfbWFwcGluZygmbWFwLCBmYWxzZSk7CiAKIAlpZiAoIXZlY3RvcnNfaGlnaCgpKSB7CiAJCW1hcC52aXJ0dWFsID0gMDsKIAkJbWFwLnR5cGUgPSBNVF9MT1dfVkVDVE9SUzsKLQkJY3JlYXRlX21hcHBpbmcoJm1hcCk7CisJCWNyZWF0ZV9tYXBwaW5nKCZtYXAsIGZhbHNlKTsKIAl9CiAKIAkvKgpAQCAtOTk2LDIwICsxMDE3LDIzIEBACiBzdGF0aWMgdm9pZCBfX2luaXQga21hcF9pbml0KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlwa21hcF9wYWdlX3RhYmxlID0gZWFybHlfcHRlX2FsbG9jKHBtZF9vZmZfayhQS01BUF9CQVNFKSwKKwlwa21hcF9wYWdlX3RhYmxlID0gZWFybHlfcHRlX2FsbG9jX2FuZF9pbnN0YWxsKHBtZF9vZmZfayhQS01BUF9CQVNFKSwKIAkJUEtNQVBfQkFTRSwgX1BBR0VfS0VSTkVMX1RBQkxFKTsKICNlbmRpZgogfQogCisKIHN0YXRpYyB2b2lkIF9faW5pdCBtYXBfbG93bWVtKHZvaWQpCiB7CiAJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcmVnOworCXBoeXNfYWRkcl90IHN0YXJ0OworCXBoeXNfYWRkcl90IGVuZDsKKwlzdHJ1Y3QgbWFwX2Rlc2MgbWFwOwogCiAJLyogTWFwIGFsbCB0aGUgbG93bWVtIG1lbW9yeSBiYW5rcy4gKi8KIAlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIHJlZykgewotCQlwaHlzX2FkZHJfdCBzdGFydCA9IHJlZy0+YmFzZTsKLQkJcGh5c19hZGRyX3QgZW5kID0gc3RhcnQgKyByZWctPnNpemU7Ci0JCXN0cnVjdCBtYXBfZGVzYyBtYXA7CisJCXN0YXJ0ID0gcmVnLT5iYXNlOworCQllbmQgPSBzdGFydCArIHJlZy0+c2l6ZTsKIAogCQlpZiAoZW5kID4gbG93bWVtX2xpbWl0KQogCQkJZW5kID0gbG93bWVtX2xpbWl0OwpAQCAtMTAyMSw4ICsxMDQ1LDIwIEBACiAJCW1hcC5sZW5ndGggPSBlbmQgLSBzdGFydDsKIAkJbWFwLnR5cGUgPSBNVF9NRU1PUlk7CiAKLQkJY3JlYXRlX21hcHBpbmcoJm1hcCk7CisJCWNyZWF0ZV9tYXBwaW5nKCZtYXAsIGZhbHNlKTsKIAl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfUk9EQVRBCisJc3RhcnQgPSBfX3BhKF9zdGV4dCkgJiBQTURfTUFTSzsKKwllbmQgPSBBTElHTihfX3BhKF9fZW5kX3JvZGF0YSksIFBNRF9TSVpFKTsKKworCW1hcC5wZm4gPSBfX3BoeXNfdG9fcGZuKHN0YXJ0KTsKKwltYXAudmlydHVhbCA9IF9fcGh5c190b192aXJ0KHN0YXJ0KTsKKwltYXAubGVuZ3RoID0gZW5kIC0gc3RhcnQ7CisJbWFwLnR5cGUgPSBNVF9NRU1PUlk7CisKKwljcmVhdGVfbWFwcGluZygmbWFwLCB0cnVlKTsKKyNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcm9kYXRhLmMgYi9hcmNoL2FybS9tbS9yb2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThlYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbW0vcm9kYXRhLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vcm9kYXRhLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqICBBdXRob3I6IENvbGluIENyb3NzIDxjY3Jvc3NAYW5kcm9pZC5jb20+CisgKgorICogIEJhc2VkIG9uIHg4NiBpbXBsZW1lbnRhdGlvbiBpbiBhcmNoL3g4Ni9tbS9pbml0XzMyLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcm9kYXRhLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKyNpbmNsdWRlICJtbS5oIgorCitzdGF0aWMgaW50IGtlcm5lbF9zZXRfdG9fcmVhZG9ubHkgX19yZWFkX21vc3RseTsKKworI2lmZGVmIENPTkZJR19ERUJVR19ST0RBVEFfVEVTVAorc3RhdGljIGNvbnN0IGludCByb2RhdGFfdGVzdF9kYXRhID0gMHhDMzsKKworc3RhdGljIG5vaW5saW5lIHZvaWQgcm9kYXRhX3Rlc3Qodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfaW5mbygiJXM6IGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gcmVhZC1vbmx5IHNlY3Rpb246XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoKih2b2xhdGlsZSBpbnQgKikmcm9kYXRhX3Rlc3RfZGF0YSAhPSAweEMzKSB7CisJCXByX2VycigicmVhZCBvbmx5IGRhdGEgY2hhbmdlZCBiZWZvcmUgdGVzdFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gdG8gd3JpdGUgdG8gcm9kYXRhX3Rlc3RfZGF0YSwgdHJhcHBpbmcgdGhlIGV4cGVjdGVkCisJICogZGF0YSBhYm9ydC4gIElmIHRoZSB0cmFwIGV4ZWN1dGVkLCByZXN1bHQgd2lsbCBiZSAxLiAgSWYgaXQgZGlkbid0LAorCSAqIHJlc3VsdCB3aWxsIGJlIDB4RkYuCisJICovCisJYXNtIHZvbGF0aWxlKAorCQkiMDoJc3RyCSVbemVyb10sIFslW3JvZGF0YV90ZXN0X2RhdGFdXVxuIgorCQkiCW1vdgklW3Jlc3VsdF0sICMweEZGXG4iCisJCSIJYgkyZlxuIgorCQkiMToJbW92CSVbcmVzdWx0XSwgIzFcbiIKKwkJIjI6XG4iCisKKwkJLyogRXhjZXB0aW9uIGZpeHVwIC0gaWYgc3RvcmUgYXQgbGFiZWwgMCBmYXVsdHMsIGp1bXBzIHRvIDEgKi8KKwkJIi5wdXNoc2VjdGlvbiBfX2V4X3RhYmxlLCBcImFcIlxuIgorCQkiCS5sb25nCTBiLCAxYlxuIgorCQkiLnBvcHNlY3Rpb25cbiIKKworCQk6IFtyZXN1bHRdICI9ciIgKHJlc3VsdCkKKwkJOiBbcm9kYXRhX3Rlc3RfZGF0YV0gInIiICgmcm9kYXRhX3Rlc3RfZGF0YSksIFt6ZXJvXSAiciIgKDApCisJCTogIm1lbW9yeSIKKwkpOworCisJaWYgKHJlc3VsdCA9PSAxKQorCQlwcl9pbmZvKCJ3cml0ZSB0byByZWFkLW9ubHkgc2VjdGlvbiB0cmFwcGVkLCBzdWNjZXNzXG4iKTsKKwllbHNlCisJCXByX2Vycigid3JpdGUgdG8gcmVhZC1vbmx5IHNlY3Rpb24gTk9UIHRyYXBwZWQsIHRlc3QgZmFpbGVkXG4iKTsKKworCWlmICgqKHZvbGF0aWxlIGludCAqKSZyb2RhdGFfdGVzdF9kYXRhICE9IDB4QzMpCisJCXByX2VycigicmVhZCBvbmx5IGRhdGEgY2hhbmdlZCBkdXJpbmcgd3JpdGVcbiIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByb2RhdGFfdGVzdCh2b2lkKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IHNldF9wYWdlX2F0dHJpYnV0ZXModW5zaWduZWQgbG9uZyB2aXJ0LCBpbnQgbnVtcGFnZXMsCisJcHRlX3QgKCpmKShwdGVfdCkpCit7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2aXJ0OworCXVuc2lnbmVkIGxvbmcgZW5kID0gdmlydCArIChudW1wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwl1bnNpZ25lZCBsb25nIHBtZF9lbmQ7CisKKwl3aGlsZSAodmlydCA8IGVuZCkgeworCQlwbWQgPSBwbWRfb2ZmX2sodmlydCk7CisJCXBtZF9lbmQgPSBtaW4oQUxJR04odmlydCArIDEsIFBNRF9TSVpFKSwgZW5kKTsKKworCQlpZiAoKHBtZF92YWwoKnBtZCkgJiBQTURfVFlQRV9NQVNLKSAhPSBQTURfVFlQRV9UQUJMRSkgeworCQkJcHJfZXJyKCIlczogcG1kICVwPSUwOGx4IGZvciAlMDhseCBub3QgcGFnZSB0YWJsZVxuIiwKKwkJCQlfX2Z1bmNfXywgcG1kLCBwbWRfdmFsKCpwbWQpLCB2aXJ0KTsKKwkJCXZpcnQgPSBwbWRfZW5kOworCQkJY29udGludWU7CisJCX0KKworCQl3aGlsZSAodmlydCA8IHBtZF9lbmQpIHsKKwkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgdmlydCk7CisJCQlzZXRfcHRlX2V4dChwdGUsIGYoKnB0ZSksIDApOworCQkJdmlydCArPSBQQUdFX1NJWkU7CisJCX0KKwl9CisKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfbWVtb3J5X3JvKHVuc2lnbmVkIGxvbmcgdmlydCwgaW50IG51bXBhZ2VzKQoreworCXJldHVybiBzZXRfcGFnZV9hdHRyaWJ1dGVzKHZpcnQsIG51bXBhZ2VzLCBwdGVfd3Jwcm90ZWN0KTsKK30KK0VYUE9SVF9TWU1CT0woc2V0X21lbW9yeV9ybyk7CisKK2ludCBzZXRfbWVtb3J5X3J3KHVuc2lnbmVkIGxvbmcgdmlydCwgaW50IG51bXBhZ2VzKQoreworCXJldHVybiBzZXRfcGFnZV9hdHRyaWJ1dGVzKHZpcnQsIG51bXBhZ2VzLCBwdGVfbWt3cml0ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNldF9tZW1vcnlfcncpOworCit2b2lkIHNldF9rZXJuZWxfdGV4dF9ydyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBQQUdFX0FMSUdOKCh1bnNpZ25lZCBsb25nKV90ZXh0KTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBQQUdFX0FMSUdOKCh1bnNpZ25lZCBsb25nKV9fZW5kX3JvZGF0YSkgLSBzdGFydDsKKworCWlmICgha2VybmVsX3NldF90b19yZWFkb25seSkKKwkJcmV0dXJuOworCisJcHJfZGVidWcoIlNldCBrZXJuZWwgdGV4dDogJWx4IC0gJWx4IHRvIHJlYWQtd3JpdGVcbiIsCisJCSBzdGFydCwgc3RhcnQgKyBzaXplKTsKKworCXNldF9tZW1vcnlfcncoc3RhcnQsIHNpemUgPj4gUEFHRV9TSElGVCk7Cit9CisKK3ZvaWQgc2V0X2tlcm5lbF90ZXh0X3JvKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpX3RleHQpOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpX19lbmRfcm9kYXRhKSAtIHN0YXJ0OworCisJaWYgKCFrZXJuZWxfc2V0X3RvX3JlYWRvbmx5KQorCQlyZXR1cm47CisKKwlwcl9pbmZvX29uY2UoIldyaXRlIHByb3RlY3RpbmcgdGhlIGtlcm5lbCB0ZXh0IHNlY3Rpb24gJWx4IC0gJWx4XG4iLAorCQlzdGFydCwgc3RhcnQgKyBzaXplKTsKKworCXByX2RlYnVnKCJTZXQga2VybmVsIHRleHQ6ICVseCAtICVseCB0byByZWFkIG9ubHlcbiIsCisJCSBzdGFydCwgc3RhcnQgKyBzaXplKTsKKworCXNldF9tZW1vcnlfcm8oc3RhcnQsIHNpemUgPj4gUEFHRV9TSElGVCk7Cit9CisKK3ZvaWQgbWFya19yb2RhdGFfcm8odm9pZCkKK3sKKwlrZXJuZWxfc2V0X3RvX3JlYWRvbmx5ID0gMTsKKworCXNldF9rZXJuZWxfdGV4dF9ybygpOworCisJcm9kYXRhX3Rlc3QoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaAppbmRleCA3ODg4MzdlOS4uZDJlZjA3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNlcmlhbC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaApAQCAtMjI0LDYgKzIyNCw4IEBACiAjZGVmaW5lIFM1UFYyMTBfVUZTVEFUX1JYTUFTSwkoMjU1PDwwKQogI2RlZmluZSBTNVBWMjEwX1VGU1RBVF9SWFNISUZUCSgwKQogCisjZGVmaW5lIE5PX05FRURfQ0hFQ0tfQ0xLU1JDCTEKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyogc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCBmNzQ2OTUwLi43NTRlYTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC00MTUsNyArNDE1LDcgQEAKIAl9CiAKIAkvKiBjbGVhciBhbnkgaW5mb3JtYXRpb24gd2UgaGFkIGFib3V0IGxhc3QgY29udGV4dCBzdGF0ZSAqLwotCW1lbXNldChsYXN0X1ZGUF9jb250ZXh0LCAwLCBzaXplb2YobGFzdF9WRlBfY29udGV4dCkpOworCWxhc3RfVkZQX2NvbnRleHRbdGktPmNwdV0gPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3N5c2NhbGx0YWJsZS5TIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNjYWxsdGFibGUuUwppbmRleCA5YjgzOTNkLi5jNTRjY2E4NyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zeXNjYWxsdGFibGUuUworKysgYi9hcmNoL202OGsva2VybmVsL3N5c2NhbGx0YWJsZS5TCkBAIC0zMTksOCArMzE5LDggQEAKIAkubG9uZyBzeXNfcmVhZGxpbmthdAogCS5sb25nIHN5c19mY2htb2RhdAogCS5sb25nIHN5c19mYWNjZXNzYXQJCS8qIDMwMCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBSZXNlcnZlZCBmb3IgcHNlbGVjdDYgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogUmVzZXJ2ZWQgZm9yIHBwb2xsICovCisJLmxvbmcgc3lzX3BzZWxlY3Q2CisJLmxvbmcgc3lzX3Bwb2xsCiAJLmxvbmcgc3lzX3Vuc2hhcmUKIAkubG9uZyBzeXNfc2V0X3JvYnVzdF9saXN0CiAJLmxvbmcgc3lzX2dldF9yb2J1c3RfbGlzdAkvKiAzMDUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggM2ViODJjMmEuLjljYmMyYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC04MTQsOCArODE0LDE0IEBACiAjZGVmaW5lIF9fTlJfcmVjdm1tc2cJCShfX05SX0xpbnV4ICsgMzE5KQogI2RlZmluZSBfX05SX2FjY2VwdDQJCShfX05SX0xpbnV4ICsgMzIwKQogI2RlZmluZSBfX05SX3BybGltaXQ2NAkJKF9fTlJfTGludXggKyAzMjEpCisjZGVmaW5lIF9fTlJfZmFub3RpZnlfaW5pdAkoX19OUl9MaW51eCArIDMyMikKKyNkZWZpbmUgX19OUl9mYW5vdGlmeV9tYXJrCShfX05SX0xpbnV4ICsgMzIzKQorI2RlZmluZSBfX05SX2Nsb2NrX2FkanRpbWUJKF9fTlJfTGludXggKyAzMjQpCisjZGVmaW5lIF9fTlJfbmFtZV90b19oYW5kbGVfYXQJKF9fTlJfTGludXggKyAzMjUpCisjZGVmaW5lIF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQJKF9fTlJfTGludXggKyAzMjYpCisjZGVmaW5lIF9fTlJfc3luY2ZzCQkoX19OUl9MaW51eCArIDMyNykKIAotI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCShfX05SX3BybGltaXQ2NCArIDEpCisjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfc3luY2ZzICsgMSkKIAogCiAjZGVmaW5lIF9fSUdOT1JFX3NlbGVjdAkJLyogbmV3c2VsZWN0ICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYzMyLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYzMyLmMKaW5kZXggODhhMGFkMS4uZGM5YTYyNCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c19wYXJpc2MzMi5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjMzIuYwpAQCAtMjI4LDMgKzIyOCwxMSBAQAogICAgICAgICByZXR1cm4gc3lzX2ZhbGxvY2F0ZShmZCwgbW9kZSwgKChsb2ZmX3Qpb2ZmaGkgPDwgMzIpIHwgb2ZmbG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobG9mZl90KWxlbmhpIDw8IDMyKSB8IGxlbmxvKTsKIH0KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZmFub3RpZnlfbWFyayhpbnQgZmFuX2ZkLCBpbnQgZmxhZ3MsIHUzMiBtYXNrX2hpLAorCQkJCQkgdTMyIG1hc2tfbG8sIGludCBmZCwKKwkJCQkJIGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSkKK3sKKwlyZXR1cm4gc3lzX2Zhbm90aWZ5X21hcmsoZmFuX2ZkLCBmbGFncywgKCh1NjQpbWFza19oaSA8PCAzMikgfCBtYXNrX2xvLAorCQkJCSBmZCwgcGF0aG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggNGJlODVlZS4uYTViMDJjZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC00MjAsNiArNDIwLDEyIEBACiAJRU5UUllfQ09NUChyZWN2bW1zZykKIAlFTlRSWV9TQU1FKGFjY2VwdDQpCQkvKiAzMjAgKi8KIAlFTlRSWV9TQU1FKHBybGltaXQ2NCkKKwlFTlRSWV9TQU1FKGZhbm90aWZ5X2luaXQpCisJRU5UUllfQ09NUChmYW5vdGlmeV9tYXJrKQorCUVOVFJZX0NPTVAoY2xvY2tfYWRqdGltZSkKKwlFTlRSWV9TQU1FKG5hbWVfdG9faGFuZGxlX2F0KQkvKiAzMjUgKi8KKwlFTlRSWV9DT01QKG9wZW5fYnlfaGFuZGxlX2F0KQorCUVOVFJZX1NBTUUoc3luY2ZzKQogCiAJLyogTm90aGluZyB5ZXQgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCmluZGV4IDViNWUxZjAuLmMzN2ZmNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCWludCBpOwogCiAJbXNlY3MgPSAxMDAwMDsKLQlmb3IgKGk9MDsgaSA8IE5SX0NQVVMgJiYgbXNlY3MgPiAwOyBpKyspIHsKKwlmb3IgKGk9MDsgaSA8IG5yX2NwdV9pZHMgJiYgbXNlY3MgPiAwOyBpKyspIHsKIAkJaWYgKGkgPT0gY3B1KQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggYzVjMjRiZS4uNzI3ZjQwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTg5Niw3ICs4OTYsNyBAQAogCXJsd2lubQlyMSxyMSwwLDAsKDMxLVRIUkVBRF9TSElGVCkJLyogY3VycmVudF90aHJlYWRfaW5mbygpICovCiAJYWRkaQlyMSxyMSxUSFJFQURfU0laRS1TVEFDS19GUkFNRV9PVkVSSEVBRAogCWxpCXIzLDAKLQlzdGQJcjMsMChyMSkJCS8qIFplcm8gdGhlIHN0YWNrIGZyYW1lIHBvaW50ZXIJKi8KKwlzdHcJcjMsMChyMSkJCS8qIFplcm8gdGhlIHN0YWNrIGZyYW1lIHBvaW50ZXIJKi8KIAlibAlzdGFydF9zZWNvbmRhcnkKIAliCS4KICNlbmRpZiAvKiBDT05GSUdfU01QICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCmluZGV4IDIwNmEzMjEuLmU4OWRmNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCkBAIC00NjIsNyArNDYyLDggQEAKICAqIHdhaXQgZm9yIHRoZSBmbGFnIHRvIGNoYW5nZSwgaW5kaWNhdGluZyB0aGlzIGtlcm5lbCBpcyBnb2luZyBhd2F5IGJ1dAogICogdGhlIHNsYXZlIGNvZGUgZm9yIHRoZSBuZXh0IG9uZSBpcyBhdCBhZGRyZXNzZXMgMCB0byAxMDAuCiAgKgotICogVGhpcyBpcyB1c2VkIGJ5IGFsbCBzbGF2ZXMuCisgKiBUaGlzIGlzIHVzZWQgYnkgYWxsIHNsYXZlcywgZXZlbiB0aG9zZSB0aGF0IGRpZCBub3QgZmluZCBhIG1hdGNoaW5nCisgKiBwYWNhIGluIHRoZSBzZWNvbmRhcnkgc3RhcnR1cCBjb2RlLgogICoKICAqIFBoeXNpY2FsIChoYXJkd2FyZSkgY3B1IGlkIHNob3VsZCBiZSBpbiByMy4KICAqLwpAQCAtNDcxLDEwICs0NzIsNiBAQAogMToJbWZscglyNQogCWFkZGkJcjUscjUsa2V4ZWNfZmxhZy0xYgogCi0JbGkJcjQsS0VYRUNfU1RBVEVfUkVBTF9NT0RFCi0Jc3RiCXI0LFBBQ0FLRVhFQ1NUQVRFKHIxMykKLQlTWU5DCi0KIDk5OglITVRfTE9XCiAjaWZkZWYgQ09ORklHX0tFWEVDCQkvKiB1c2Ugbm8gbWVtb3J5IHdpdGhvdXQga2V4ZWMgKi8KIAlsd3oJcjQsMChyNSkKQEAgLTQ5OSwxMSArNDk2LDE3IEBACiAgKgogICogZ2V0IHBoeXMgaWQgZnJvbSBwYWNhCiAgKiBzd2l0Y2ggdG8gcmVhbCBtb2RlCisgKiBtYXJrIHRoZSBwYWNhIGFzIG5vIGxvbmdlciB1c2VkCiAgKiBqb2luIG90aGVyIGNwdXMgaW4ga2V4ZWNfd2FpdChwaHlzX2lkKQogICovCiBfR0xPQkFMKGtleGVjX3NtcF93YWl0KQogCWxoeglyMyxQQUNBSFdDUFVJRChyMTMpCiAJYmwJcmVhbF9tb2RlCisKKwlsaQlyNCxLRVhFQ19TVEFURV9SRUFMX01PREUKKwlzdGIJcjQsUEFDQUtFWEVDU1RBVEUocjEzKQorCVNZTkMKKwogCWIJLmtleGVjX3dhaXQKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IGNiZGJiMTQuLmYyZGNhYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtNDEwLDggKzQxMCw2IEBACiB7CiAJaW50IHJjLCBjOwogCi0Jc2Vjb25kYXJ5X3RpID0gY3VycmVudF9zZXRbY3B1XTsKLQogCWlmIChzbXBfb3BzID09IE5VTEwgfHwKIAkgICAgKHNtcF9vcHMtPmNwdV9ib290YWJsZSAmJiAhc21wX29wcy0+Y3B1X2Jvb3RhYmxlKGNwdSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyMSw2ICs0MTksOCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCisJc2Vjb25kYXJ5X3RpID0gY3VycmVudF9zZXRbY3B1XTsKKwogCS8qIE1ha2Ugc3VyZSBjYWxsaW4tbWFwIGVudHJ5IGlzIDAgKGNhbiBiZSBsZWZ0b3ZlciBhIENQVQogCSAqIGhvdHBsdWcKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYwppbmRleCA4ZWU1MWEyLi5lNmJlYzc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCkBAIC0yNjEsNiArMjYxLDI4IEBACiAJcmV0dXJuIGlzX2tlcm5lbDsKIH0KIAorc3RhdGljIGJvb2wgcG1jX292ZXJmbG93KHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWlmICgoaW50KXZhbCA8IDApCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBFdmVudHMgb24gUE9XRVI3IGNhbiByb2xsIGJhY2sgaWYgYSBzcGVjdWxhdGl2ZSBldmVudCBkb2Vzbid0CisJICogZXZlbnR1YWxseSBjb21wbGV0ZS4gVW5mb3J0dW5hdGVseSBpbiBzb21lIHJhcmUgY2FzZXMgdGhleSB3aWxsCisJICogcmFpc2UgYSBwZXJmb3JtYW5jZSBtb25pdG9yIGV4Y2VwdGlvbi4gV2UgbmVlZCB0byBjYXRjaCB0aGlzIHRvCisJICogZW5zdXJlIHdlIHJlc2V0IHRoZSBQTUMuIEluIGFsbCBjYXNlcyB0aGUgUE1DIHdpbGwgYmUgMjU2IG9yIGxlc3MKKwkgKiBjeWNsZXMgZnJvbSBvdmVyZmxvdy4KKwkgKgorCSAqIFdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgZmlyc3QgcGFzcyBmYWlscyB0byBmaW5kIGFueSBvdmVyZmxvd2luZworCSAqIFBNQ3MgYmVjYXVzZSBhIHVzZXIgbWlnaHQgc2V0IGEgcGVyaW9kIG9mIGxlc3MgdGhhbiAyNTYgYW5kIHdlCisJICogZG9uJ3Qgd2FudCB0byBtaXN0YWtlbmx5IHJlc2V0IHRoZW0uCisJICovCisJaWYgKF9faXNfcHJvY2Vzc29yKFBWX1BPV0VSNykgJiYgKCgweDgwMDAwMDAwIC0gdmFsKSA8PSAyNTYpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQgcG93ZXI0X2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkJICAgIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQogewpAQCAtMjgxLDcgKzMwMyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgKytpKSB7CiAJCXZhbCA9IGNsYXNzaWNfY3RyX3JlYWQoaSk7Ci0JCWlmICh2YWwgPCAwKSB7CisJCWlmIChwbWNfb3ZlcmZsb3codmFsKSkgewogCQkJaWYgKG9wcm9maWxlX3J1bm5pbmcgJiYgY3RyW2ldLmVuYWJsZWQpIHsKIAkJCQlvcHJvZmlsZV9hZGRfZXh0X3NhbXBsZShwYywgcmVncywgaSwgaXNfa2VybmVsKTsKIAkJCQljbGFzc2ljX2N0cl93cml0ZShpLCByZXNldF92YWx1ZVtpXSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUKaW5kZXggZDQ5YzIxMy4uYWU5NTkzNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZQpAQCAtMTcsNyArMTcsNSBAQAogCiBvYmotJChDT05GSUdfU0hfQURDKQkJKz0gYWRjLm8KIG9iai0kKENPTkZJR19TSF9DTEtfQ1BHX0xFR0FDWSkJKz0gY2xvY2stY3BnLm8KLW9iai0kKENPTkZJR19TSF9GUFUpCQkrPSBmcHUubwotb2JqLSQoQ09ORklHX1NIX0ZQVV9FTVUpCSs9IGZwdS5vCiAKLW9iai15CSs9IGlycS8gaW5pdC5vIGNsb2NrLm8gaHdibGsubyBwcm9jLm8KK29iai15CSs9IGlycS8gaW5pdC5vIGNsb2NrLm8gZnB1Lm8gaHdibGsubyBwcm9jLm8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9rZXJuZWwvcGNpLmMgYi9hcmNoL3RpbGUva2VybmVsL3BjaS5jCmluZGV4IGVhMzhmMGMuLjEwNzMyNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC9wY2kuYwpAQCAtMTc5LDEyICsxNzksNiBAQAogCiAJCWNvbnRyb2xsZXIgPSAmY29udHJvbGxlcnNbbnVtX2NvbnRyb2xsZXJzXTsKIAotCQlpZiAodGlsZV9pbml0X2lycXMoaSwgY29udHJvbGxlcikpIHsKLQkJCXByX2VycigiUENJOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSAiCi0JCQkgICAgICAgIklSUXMsIGFib3J0aW5nLlxuIik7Ci0JCQlnb3RvIGVycl9jb250OwotCQl9Ci0KIAkJY29udHJvbGxlci0+aW5kZXggPSBudW1fY29udHJvbGxlcnM7CiAJCWNvbnRyb2xsZXItPmh2X2NmZ19mZFswXSA9IGh2X2NmZ19mZDA7CiAJCWNvbnRyb2xsZXItPmh2X2NmZ19mZFsxXSA9IGh2X2NmZ19mZDE7CkBAIC0zMDAsNiArMjk0LDExIEBACiAJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlciA9ICZjb250cm9sbGVyc1tpXTsKIAkJc3RydWN0IHBjaV9idXMgKmJ1czsKIAorCQlpZiAodGlsZV9pbml0X2lycXMoaSwgY29udHJvbGxlcikpIHsKKwkJCXByX2VycigiUENJOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBJUlFTXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJcHJfaW5mbygiUENJOiBpbml0aWFsaXppbmcgY29udHJvbGxlciAjJWRcbiIsIGkpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcueDg2IGIvYXJjaC91bS9LY29uZmlnLng4NgppbmRleCBhOWRhNTE2Li43OTVlYThlIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcueDg2CisrKyBiL2FyY2gvdW0vS2NvbmZpZy54ODYKQEAgLTI5LDEwICsyOSwxMCBAQAogCWRlZl9ib29sIDY0QklUCiAKIGNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQotCWRlZl9ib29sIFg4Nl9YQURECisJZGVmX2Jvb2wgWDg2X1hBREQgJiYgNjRCSVQKIAogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKLQlkZWZfYm9vbCAhWDg2X1hBREQKKwlkZWZfYm9vbCAhUldTRU1fWENIR0FERF9BTEdPUklUSE0KIAogY29uZmlnIDNfTEVWRUxfUEdUQUJMRVMKIAlib29sICJUaHJlZS1sZXZlbCBwYWdldGFibGVzIChFWFBFUklNRU5UQUwpIiBpZiAhNjRCSVQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAppbmRleCA5MWYzZTA4Ny4uY2M1YjA1MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaApAQCAtMTI1LDcgKzEyNSw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX09TWFNBVkUJKDQqMzIrMjcpIC8qICIiIFhTQVZFIGVuYWJsZWQgaW4gdGhlIE9TICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWAkJKDQqMzIrMjgpIC8qIEFkdmFuY2VkIFZlY3RvciBFeHRlbnNpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0YxNkMJKDQqMzIrMjkpIC8qIDE2LWJpdCBmcCBjb252ZXJzaW9ucyAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9SRFJORAkoNCozMiszMCkgLyogVGhlIFJEUkFORCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9SRFJBTkQJKDQqMzIrMzApIC8qIFRoZSBSRFJBTkQgaW5zdHJ1Y3Rpb24gKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfSFlQRVJWSVNPUgkoNCozMiszMSkgLyogUnVubmluZyBvbiBhIGh5cGVydmlzb3IgKi8KIAogLyogVklBL0N5cml4L0NlbnRhdXItZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4QzAwMDAwMDEsIHdvcmQgNSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaWRsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaWRsZS5oCmluZGV4IDM4ZDg3MzcuLjE5MmU1YTAyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pZGxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaWRsZS5oCkBAIC0xLDEzICsxLDYgQEAKICNpZm5kZWYgX0FTTV9YODZfSURMRV9ICiAjZGVmaW5lIF9BU01fWDg2X0lETEVfSAogCi0jZGVmaW5lIElETEVfU1RBUlQgMQotI2RlZmluZSBJRExFX0VORCAyCi0KLXN0cnVjdCBub3RpZmllcl9ibG9jazsKLXZvaWQgaWRsZV9ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pOwotdm9pZCBpZGxlX25vdGlmaWVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKTsKLQogI2lmZGVmIENPTkZJR19YODZfNjQKIHZvaWQgZW50ZXJfaWRsZSh2b2lkKTsKIHZvaWQgZXhpdF9pZGxlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCmluZGV4IDMxZDg0YWMuLmE1MThjMGE0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCkBAIC0yMiw2ICsyMiw4IEBACiAJdTY0IHByb2R1Y3Q7CiAjaWZkZWYgX19pMzg2X18KIAl1MzIgdG1wMSwgdG1wMjsKKyNlbHNlCisJdWxvbmcgdG1wOwogI2VuZGlmCiAKIAlpZiAoc2hpZnQgPCAwKQpAQCAtNDIsOCArNDQsMTEgQEAKIAkJOiAiYSIgKCh1MzIpZGVsdGEpLCAiMSIgKCh1MzIpKGRlbHRhID4+IDMyKSksICIyIiAobXVsX2ZyYWMpICk7CiAjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAJX19hc21fXyAoCi0JCSJtdWwgJSVyZHggOyBzaHJkICQzMiwlJXJkeCwlJXJheCIKLQkJOiAiPWEiIChwcm9kdWN0KSA6ICIwIiAoZGVsdGEpLCAiZCIgKCh1NjQpbXVsX2ZyYWMpICk7CisJCSJtdWwgJVttdWxfZnJhY10gOyBzaHJkICQzMiwgJVtoaV0sICVbbG9dIgorCQk6IFtsb10iPWEiKHByb2R1Y3QpLAorCQkgIFtoaV0iPWQiKHRtcCkKKwkJOiAiMCIoZGVsdGEpLAorCQkgIFttdWxfZnJhY10icm0iKCh1NjQpbXVsX2ZyYWMpKTsKICNlbHNlCiAjZXJyb3IgaW1wbGVtZW50IG1lIQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYWJkM2UwZS4uOTlmMGFkNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtNDIsNyArNDIsNyBAQAogICogUmV0dXJucyAwIGlmIHRoZSByYW5nZSBpcyB2YWxpZCwgbm9uemVybyBvdGhlcndpc2UuCiAgKgogICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVzdDoKLSAqICh1MzMpYWRkciArICh1MzMpc2l6ZSA+PSAodTMzKWN1cnJlbnQtPmFkZHJfbGltaXQuc2VnICh1NjUgZm9yIHg4Nl82NCkKKyAqICh1MzMpYWRkciArICh1MzMpc2l6ZSA+ICh1MzMpY3VycmVudC0+YWRkcl9saW1pdC5zZWcgKHU2NSBmb3IgeDg2XzY0KQogICoKICAqIFRoaXMgbmVlZHMgMzMtYml0ICg2NS1iaXQgZm9yIHg4Nl82NCkgYXJpdGhtZXRpYy4gV2UgaGF2ZSBhIGNhcnJ5Li4uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5TIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLlMKaW5kZXggZWFkMjFiNi4uYjRmZDgzNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLlMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLlMKQEAgLTI4LDYgKzI4LDggQEAKIHBtb2RlX2NyNDoJLmxvbmcJMAkvKiBTYXZlZCAlY3I0ICovCiBwbW9kZV9lZmVyOgkucXVhZAkwCS8qIFNhdmVkIEVGRVIgKi8KIHBtb2RlX2dkdDoJLnF1YWQJMAorcG1vZGVfbWlzY19lbjoJLnF1YWQJMAkvKiBTYXZlZCBNSVNDX0VOQUJMRSBNU1IgKi8KK3Btb2RlX2JlaGF2aW9yOgkubG9uZwkwCS8qIFdha2V1cCBiZWhhdmlvciBmbGFncyAqLwogcmVhbG1vZGVfZmxhZ3M6CS5sb25nCTAKIHJlYWxfbWFnaWM6CS5sb25nCTAKIHRyYW1wb2xpbmVfc2VnbWVudDoJLndvcmQgMApAQCAtOTEsNiArOTMsMTggQEAKIAkvKiBDYWxsIHRoZSBDIGNvZGUgKi8KIAljYWxsbAltYWluCiAKKwkvKiBSZXN0b3JlIE1JU0NfRU5BQkxFIGJlZm9yZSBlbnRlcmluZyBwcm90ZWN0ZWQgbW9kZSwgaW4gY2FzZQorCSAgIEJJT1MgZGVjaWRlZCB0byBjbGVhciBYRF9ESVNBQkxFIGR1cmluZyBTMy4gKi8KKwltb3ZsCXBtb2RlX2JlaGF2aW9yLCAlZWF4CisJYnRsCSRXQUtFVVBfQkVIQVZJT1JfUkVTVE9SRV9NSVNDX0VOQUJMRSwgJWVheAorCWpuYwkxZgorCisJbW92bAlwbW9kZV9taXNjX2VuLCAlZWF4CisJbW92bAlwbW9kZV9taXNjX2VuICsgNCwgJWVkeAorCW1vdmwJJE1TUl9JQTMyX01JU0NfRU5BQkxFLCAlZWN4CisJd3Jtc3IKKzE6CisKIAkvKiBEbyBhbnkgb3RoZXIgc3R1ZmYuLi4gKi8KIAogI2lmbmRlZiBDT05GSUdfNjRCSVQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3dha2V1cC5oIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLmgKaW5kZXggZTE4MjhjMC4uOTdhMjllMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLmgKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvd2FrZXVwLmgKQEAgLTIxLDYgKzIxLDkgQEAKIAl1MzIgcG1vZGVfZWZlcl9sb3c7CS8qIFByb3RlY3RlZCBtb2RlIEVGRVIgKi8KIAl1MzIgcG1vZGVfZWZlcl9oaWdoOwogCXU2NCBwbW9kZV9nZHQ7CisJdTMyIHBtb2RlX21pc2NfZW5fbG93OwkvKiBQcm90ZWN0ZWQgbW9kZSBNSVNDX0VOQUJMRSAqLworCXUzMiBwbW9kZV9taXNjX2VuX2hpZ2g7CisJdTMyIHBtb2RlX2JlaGF2aW9yOwkvKiBXYWtldXAgcm91dGluZSBiZWhhdmlvciBmbGFncyAqLwogCXUzMiByZWFsbW9kZV9mbGFnczsKIAl1MzIgcmVhbF9tYWdpYzsKIAl1MTYgdHJhbXBvbGluZV9zZWdtZW50OwkvKiBzZWdtZW50IHdpdGggdHJhbXBvbGluZSBjb2RlLCA2NC1iaXQgb25seSAqLwpAQCAtMzksNCArNDIsNyBAQAogI2RlZmluZSBXQUtFVVBfSEVBREVSX1NJR05BVFVSRSAweDUxZWUxMTExCiAjZGVmaW5lIFdBS0VVUF9FTkRfU0lHTkFUVVJFCTB4NjVhMjJjODIKIAorLyogV2FrZXVwIGJlaGF2aW9yIGJpdHMgKi8KKyNkZWZpbmUgV0FLRVVQX0JFSEFWSU9SX1JFU1RPUkVfTUlTQ19FTkFCTEUgICAgIDAKKwogI2VuZGlmIC8qIEFSQ0hfWDg2X0tFUk5FTF9BQ1BJX1JNX1dBS0VVUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCBmZjkzYmMxLi5jZGRkZmZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKQEAgLTc3LDYgKzc3LDEyIEBACiAKIAloZWFkZXItPnBtb2RlX2NyMCA9IHJlYWRfY3IwKCk7CiAJaGVhZGVyLT5wbW9kZV9jcjQgPSByZWFkX2NyNF9zYWZlKCk7CisJaGVhZGVyLT5wbW9kZV9iZWhhdmlvciA9IDA7CisJaWYgKCFyZG1zcl9zYWZlKE1TUl9JQTMyX01JU0NfRU5BQkxFLAorCQkJJmhlYWRlci0+cG1vZGVfbWlzY19lbl9sb3csCisJCQkmaGVhZGVyLT5wbW9kZV9taXNjX2VuX2hpZ2gpKQorCQloZWFkZXItPnBtb2RlX2JlaGF2aW9yIHw9CisJCQkoMSA8PCBXQUtFVVBfQkVIQVZJT1JfUkVTVE9SRV9NSVNDX0VOQUJMRSk7CiAJaGVhZGVyLT5yZWFsbW9kZV9mbGFncyA9IGFjcGlfcmVhbG1vZGVfZmxhZ3M7CiAJaGVhZGVyLT5yZWFsX21hZ2ljID0gMHgxMjM0NTY3ODsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCmluZGV4IDU3Y2E3NzcuLmU3MTE1YzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vZ2FydC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vYW1kX2lvbW11X3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL2FtZF9pb21tdV90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9hbWRfaW9tbXUuaD4KQEAgLTE1Myw2ICsxNTQsMTAgQEAKIAlwZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoUENJX0JVUyhhbGlhcyksIGFsaWFzICYgMHhmZik7CiAJaWYgKHBkZXYpCiAJCWRldl9kYXRhLT5hbGlhcyA9ICZwZGV2LT5kZXY7CisJZWxzZSB7CisJCWtmcmVlKGRldl9kYXRhKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CiAKIAlhdG9taWNfc2V0KCZkZXZfZGF0YS0+YmluZCwgMCk7CiAKQEAgLTE2Miw2ICsxNjcsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaW9tbXVfaWdub3JlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTE2IGRldmlkLCBhbGlhczsKKworCWRldmlkID0gZ2V0X2RldmljZV9pZChkZXYpOworCWFsaWFzID0gYW1kX2lvbW11X2FsaWFzX3RhYmxlW2RldmlkXTsKKworCW1lbXNldCgmYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0sIDAsIHNpemVvZihzdHJ1Y3QgZGV2X3RhYmxlX2VudHJ5KSk7CisJbWVtc2V0KCZhbWRfaW9tbXVfZGV2X3RhYmxlW2FsaWFzXSwgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfdGFibGVfZW50cnkpKTsKKworCWFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXSA9IE5VTEw7CisJYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbYWxpYXNdID0gTlVMTDsKK30KKwogc3RhdGljIHZvaWQgaW9tbXVfdW5pbml0X2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJa2ZyZWUoZGV2LT5hcmNoZGF0YS5pb21tdSk7CkBAIC0xOTEsNyArMjEwLDkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXJldCA9IGlvbW11X2luaXRfZGV2aWNlKCZwZGV2LT5kZXYpOwotCQlpZiAocmV0KQorCQlpZiAocmV0ID09IC1FTk9UU1VQUCkKKwkJCWlvbW11X2lnbm9yZV9kZXZpY2UoJnBkZXYtPmRldik7CisJCWVsc2UgaWYgKHJldCkKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCkBAIC0yMjk2LDYgKzIzMTcsMjMgQEAKIAkuZG1hX3N1cHBvcnRlZCA9IGFtZF9pb21tdV9kbWFfc3VwcG9ydGVkLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGRldmljZV9kbWFfb3BzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdW5zaWduZWQgdW5oYW5kbGVkID0gMDsKKworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgeworCQlpZiAoIWNoZWNrX2RldmljZSgmcGRldi0+ZGV2KSkgeworCQkJdW5oYW5kbGVkICs9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBkZXYtPmRldi5hcmNoZGF0YS5kbWFfb3BzID0gJmFtZF9pb21tdV9kbWFfb3BzOworCX0KKworCXJldHVybiB1bmhhbmRsZWQ7Cit9CisKIC8qCiAgKiBUaGUgZnVuY3Rpb24gd2hpY2ggY2x1ZXMgdGhlIEFNRCBJT01NVSBkcml2ZXIgaW50byBkbWFfb3BzLgogICovCkBAIC0yMzA4LDcgKzIzNDYsNyBAQAogaW50IF9faW5pdCBhbWRfaW9tbXVfaW5pdF9kbWFfb3BzKHZvaWQpCiB7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCB1bmhhbmRsZWQ7CiAKIAkvKgogCSAqIGZpcnN0IGFsbG9jYXRlIGEgZGVmYXVsdCBwcm90ZWN0aW9uIGRvbWFpbiBmb3IgZXZlcnkgSU9NTVUgd2UKQEAgLTIzMzQsNyArMjM3MiwxMSBAQAogCXN3aW90bGIgPSAwOwogCiAJLyogTWFrZSB0aGUgZHJpdmVyIGZpbmFsbHkgdmlzaWJsZSB0byB0aGUgZHJpdmVycyAqLwotCWRtYV9vcHMgPSAmYW1kX2lvbW11X2RtYV9vcHM7CisJdW5oYW5kbGVkID0gZGV2aWNlX2RtYV9vcHNfaW5pdCgpOworCWlmICh1bmhhbmRsZWQgJiYgbWF4X3BmbiA+IE1BWF9ETUEzMl9QRk4pIHsKKwkJLyogVGhlcmUgYXJlIHVuaGFuZGxlZCBkZXZpY2VzIC0gaW5pdGlhbGl6ZSBzd2lvdGxiIGZvciB0aGVtICovCisJCXN3aW90bGIgPSAxOworCX0KIAogCWFtZF9pb21tdV9zdGF0c19pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKaW5kZXggMjQ2ZDcyNy4uYjllMjA3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKQEAgLTcwMSw4ICs3MDEsOCBAQAogewogCXU4ICpwID0gKHU4ICopaDsKIAl1OCAqZW5kID0gcCwgZmxhZ3MgPSAwOwotCXUxNiBkZXZfaSwgZGV2aWQgPSAwLCBkZXZpZF9zdGFydCA9IDAsIGRldmlkX3RvID0gMDsKLQl1MzIgZXh0X2ZsYWdzID0gMDsKKwl1MTYgZGV2aWQgPSAwLCBkZXZpZF9zdGFydCA9IDAsIGRldmlkX3RvID0gMDsKKwl1MzIgZGV2X2ksIGV4dF9mbGFncyA9IDA7CiAJYm9vbCBhbGlhcyA9IGZhbHNlOwogCXN0cnVjdCBpdmhkX2VudHJ5ICplOwogCkBAIC04NTcsNyArODU3LDcgQEAKIC8qIEluaXRpYWxpemVzIHRoZSBkZXZpY2UtPmlvbW11IG1hcHBpbmcgZm9yIHRoZSBkcml2ZXIgKi8KIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaW9tbXVfZGV2aWNlcyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKLQl1MTYgaTsKKwl1MzIgaTsKIAogCWZvciAoaSA9IGlvbW11LT5maXJzdF9kZXZpY2U7IGkgPD0gaW9tbXUtPmxhc3RfZGV2aWNlOyArK2kpCiAJCXNldF9pb21tdV9mb3JfZGV2aWNlKGlvbW11LCBpKTsKQEAgLTExNDYsNyArMTE0Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGluaXRfZGV2aWNlX3RhYmxlKHZvaWQpCiB7Ci0JdTE2IGRldmlkOworCXUzMiBkZXZpZDsKIAogCWZvciAoZGV2aWQgPSAwOyBkZXZpZCA8PSBhbWRfaW9tbXVfbGFzdF9iZGY7ICsrZGV2aWQpIHsKIAkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9WQUxJRCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKaW5kZXggNDVmZDMzZC4uZGY2MzYyMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwpAQCAtNjIxLDE0ICs2MjEsMTQgQEAKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzOwogCiAJaW9hcGljX2VudHJpZXMgPSBremFsbG9jKHNpemVvZigqaW9hcGljX2VudHJpZXMpICogbnJfaW9hcGljcywKLQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlHRlBfQVRPTUlDKTsKIAlpZiAoIWlvYXBpY19lbnRyaWVzKQogCQlyZXR1cm4gMDsKIAogCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKIAkJaW9hcGljX2VudHJpZXNbYXBpY10gPQogCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkpICoKLQkJCQlucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdLCBHRlBfS0VSTkVMKTsKKwkJCQlucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFpb2FwaWNfZW50cmllc1thcGljXSkKIAkJCWdvdG8gbm9tZW07CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggNmY5ZDFmNi4uYjEzZWQzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC02MTIsOCArNjEyLDExIEBACiAJfQogI2VuZGlmCiAKLQkvKiBBcyBhIHJ1bGUgcHJvY2Vzc29ycyBoYXZlIEFQSUMgdGltZXIgcnVubmluZyBpbiBkZWVwIEMgc3RhdGVzICovCi0JaWYgKGMtPng4NiA+IDB4ZiAmJiAhY3B1X2hhc19hbWRfZXJyYXR1bShhbWRfZXJyYXR1bV80MDApKQorCS8qCisJICogRmFtaWx5IDB4MTIgYW5kIGFib3ZlIHByb2Nlc3NvcnMgaGF2ZSBBUElDIHRpbWVyCisJICogcnVubmluZyBpbiBkZWVwIEMgc3RhdGVzLgorCSAqLworCWlmIChjLT54ODYgPiAweDExKQogCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9BUkFUKTsKIAogCS8qCkBAIC02MjksMTAgKzYzMiwxMyBAQAogCQkgKiBGaXhlczogaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzAxMgogCQkgKi8KIAkJdTY0IG1hc2s7CisJCWludCBlcnI7CiAKLQkJcmRtc3JsKE1TUl9BTUQ2NF9NQ3hfTUFTSyg0KSwgbWFzayk7Ci0JCW1hc2sgfD0gKDEgPDwgMTApOwotCQl3cm1zcmwoTVNSX0FNRDY0X01DeF9NQVNLKDQpLCBtYXNrKTsKKwkJZXJyID0gcmRtc3JsX3NhZmUoTVNSX0FNRDY0X01DeF9NQVNLKDQpLCAmbWFzayk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJbWFzayB8PSAoMSA8PCAxMCk7CisJCQljaGVja2luZ193cm1zcmwoTVNSX0FNRDY0X01DeF9NQVNLKDQpLCBtYXNrKTsKKwkJfQogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggZTJjZWQwMC4uMTczZjNhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC01NjUsOCArNTY1LDcgQEAKIAogCQljcHVpZF9jb3VudCgweDAwMDAwMDA3LCAwLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAotCQlpZiAoZWF4ID4gMCkKLQkJCWMtPng4Nl9jYXBhYmlsaXR5WzldID0gZWJ4OworCQljLT54ODZfY2FwYWJpbGl0eVs5XSA9IGVieDsKIAl9CiAKIAkvKiBBTUQtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHg4MDAwMDAwMSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3BjYy1jcHVmcmVxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcGNjLWNwdWZyZXEuYwppbmRleCA3NTVhMzFlLi45MDdjOGU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcGNjLWNwdWZyZXEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcGNjLWNwdWZyZXEuYwpAQCAtMzksNyArMzksNyBAQAogCiAjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KIAotI2RlZmluZSBQQ0NfVkVSU0lPTiAJIjEuMDAuMDAiCisjZGVmaW5lIFBDQ19WRVJTSU9OCSIxLjEwLjAwIgogI2RlZmluZSBQT0xMX0xPT1BTIAkzMDAKIAogI2RlZmluZSBDTURfQ09NUExFVEUgCTB4MQpAQCAtMTAyLDcgKzEwMiw3IEBACiBzdGF0aWMgdTY0IGRvb3JiZWxsX3ByZXNlcnZlOwogc3RhdGljIHU2NCBkb29yYmVsbF93cml0ZTsKIAotc3RhdGljIHU4IE9TQ19VVUlEWzE2XSA9IHsweDYzLCAweDlCLCAweDJDLCAweDlGLCAweDcwLCAweDkxLCAweDQ5LCAweDFmLAorc3RhdGljIHU4IE9TQ19VVUlEWzE2XSA9IHsweDlGLCAweDJDLCAweDlCLCAweDYzLCAweDkxLCAweDcwLCAweDFmLCAweDQ5LAogCQkJICAweEJCLCAweDRGLCAweEE1LCAweDk4LCAweDJGLCAweEExLCAweEI1LCAweDQ2fTsKIAogc3RydWN0IHBjY19jcHUgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYyBiL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKaW5kZXggZTkwZjA4NC4uYmVhOWMwMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogCiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vaXJxX2NvbnRyb2xsZXIuaD4KQEAgLTk4LDYgKzk5LDE2IEBACiAJcmV0dXJuIF9fYWxsb2NfYm9vdG1lbShzaXplLCBhbGlnbiwgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKIH0KIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBfX2luaXQgZWFybHlfaW5pdF9kdF9zZXR1cF9pbml0cmRfYXJjaCh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShzdGFydCk7CisJaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoZW5kKTsKKwlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOworfQorI2VuZGlmCisKIHZvaWQgX19pbml0IGFkZF9kdGIodTY0IGRhdGEpCiB7CiAJaW5pdGlhbF9kdGIgPSBkYXRhICsgb2Zmc2V0b2Yoc3RydWN0IHNldHVwX2RhdGEsIGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggOGQxMjg3OC4uYTNkMGRjNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC0yNDUsNyArMjQ1LDYgQEAKIHsKIAlzZXRfdXNlcl9ncyhyZWdzLCAwKTsKIAlyZWdzLT5mcwkJPSAwOwotCXNldF9mcyhVU0VSX0RTKTsKIAlyZWdzLT5kcwkJPSBfX1VTRVJfRFM7CiAJcmVncy0+ZXMJCT0gX19VU0VSX0RTOwogCXJlZ3MtPnNzCQk9IF9fVVNFUl9EUzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IDZjOWRkOTIuLjYzYzhhZWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtNTYsMzEgKzU2LDE3IEBACiBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBvbGRfcnNwKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBjaGFyLCBpc19pZGxlKTsKIAotc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGlkbGVfbm90aWZpZXIpOwotCi12b2lkIGlkbGVfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKQotewotCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmaWRsZV9ub3RpZmllciwgbik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpZGxlX25vdGlmaWVyX3JlZ2lzdGVyKTsKLQotdm9pZCBpZGxlX25vdGlmaWVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKQotewotCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZpZGxlX25vdGlmaWVyLCBuKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkbGVfbm90aWZpZXJfdW5yZWdpc3Rlcik7Ci0KIHZvaWQgZW50ZXJfaWRsZSh2b2lkKQogewogCXBlcmNwdV93cml0ZShpc19pZGxlLCAxKTsKLQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmaWRsZV9ub3RpZmllciwgSURMRV9TVEFSVCwgTlVMTCk7CisJaWRsZV9ub3RpZmllcl9jYWxsX2NoYWluKElETEVfU1RBUlQpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXRfaWRsZSh2b2lkKQogewogCWlmICh4ODZfdGVzdF9hbmRfY2xlYXJfYml0X3BlcmNwdSgwLCBpc19pZGxlKSA9PSAwKQogCQlyZXR1cm47Ci0JYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmlkbGVfbm90aWZpZXIsIElETEVfRU5ELCBOVUxMKTsKKwlpZGxlX25vdGlmaWVyX2NhbGxfY2hhaW4oSURMRV9FTkQpOwogfQogCiAvKiBDYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRvIHNpZ25pZnkgaWRsZSBlbmQgKi8KQEAgLTMzOCw3ICszMjQsNiBAQAogCXJlZ3MtPmNzCQk9IF9jczsKIAlyZWdzLT5zcwkJPSBfc3M7CiAJcmVncy0+ZmxhZ3MJCT0gWDg2X0VGTEFHU19JRjsKLQlzZXRfZnMoVVNFUl9EUyk7CiAJLyoKIAkgKiBGcmVlIHRoZSBvbGQgRlAgYW5kIG90aGVyIGV4dGVuZGVkIHN0YXRlCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggMDhjNDRiMC4uMWRlZjI3OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtNDExLDYgKzQxMSwxNCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjOSwxIiksCiAJCX0sCiAJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiB0aGUgTGF0aXR1ZGUgRTU0MjAuICovCisJCS5jYWxsYmFjayA9IHNldF9wY2lfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBFNTQyMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEU1NDIwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGMyODcxZDMuLmM1OGQxNDQwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTI4NSw2ICsyODUsMTkgQEAKIAlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7CiAJeDg2X3BsYXRmb3JtLm5taV9pbml0KCk7CiAKKwkvKgorCSAqIFdhaXQgdW50aWwgdGhlIGNwdSB3aGljaCBicm91Z2h0IHRoaXMgb25lIHVwIG1hcmtlZCBpdAorCSAqIG9ubGluZSBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cy4gSWYgd2UgZG9uJ3QgZG8gdGhhdCB0aGVuCisJICogd2UgY2FuIGVuZCB1cCB3YWtpbmcgdXAgdGhlIHNvZnRpcnEgdGhyZWFkIGJlZm9yZSB0aGlzIGNwdQorCSAqIHJlYWNoZWQgdGhlIGFjdGl2ZSBzdGF0ZSwgd2hpY2ggbWFrZXMgdGhlIHNjaGVkdWxlciB1bmhhcHB5CisJICogYW5kIHNjaGVkdWxlIHRoZSBzb2Z0aXJxIHRocmVhZCBvbiB0aGUgd3JvbmcgY3B1LiBUaGlzIGlzCisJICogb25seSBvYnNlcnZhYmxlIHdpdGggZm9yY2VkIHRocmVhZGVkIGludGVycnVwdHMsIGJ1dCBpbgorCSAqIHRoZW9yeSBpdCBjb3VsZCBhbHNvIGhhcHBlbiB3L28gdGhlbS4gSXQncyBqdXN0IHdheSBoYXJkZXIKKwkgKiB0byBhY2hpZXZlLgorCSAqLworCXdoaWxlICghY3B1bWFza190ZXN0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9hY3RpdmVfbWFzaykpCisJCWNwdV9yZWxheCgpOworCiAJLyogZW5hYmxlIGxvY2FsIGludGVycnVwdHMgKi8KIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xndWVzdC9ib290LmMgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCmluZGV4IDFjZDYwODkuLjQ5M2VhMWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xndWVzdC9ib290LmMKKysrIGIvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYwpAQCAtOTk1LDYgKzk5NSw3IEBACiBzdGF0aWMgdm9pZCBsZ3Vlc3RfdGltZV9pbml0KHZvaWQpCiB7CiAJLyogU2V0IHVwIHRoZSB0aW1lciBpbnRlcnJ1cHQgKDApIHRvIGdvIHRvIG91ciBzaW1wbGUgdGltZXIgcm91dGluZSAqLworCWxndWVzdF9zZXR1cF9pcnEoMCk7CiAJaXJxX3NldF9oYW5kbGVyKDAsIGxndWVzdF90aW1lX2lycSk7CiAKIAljbG9ja3NvdXJjZV9yZWdpc3RlcigmbGd1ZXN0X2Nsb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUyBiL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUwppbmRleCA5OWU0ODI2Li5hNzMzOTdmNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL2NvcHlfdXNlcl82NC5TCisrKyBiL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUwpAQCAtNzIsNyArNzIsNyBAQAogCWFkZHEgJXJkeCwlcmN4CiAJamMgYmFkX3RvX3VzZXIKIAljbXBxIFRJX2FkZHJfbGltaXQoJXJheCksJXJjeAotCWphZSBiYWRfdG9fdXNlcgorCWphIGJhZF90b191c2VyCiAJQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxjb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhfY29weV90b191c2VyKQpAQCAtODUsNyArODUsNyBAQAogCWFkZHEgJXJkeCwlcmN4CiAJamMgYmFkX2Zyb21fdXNlcgogCWNtcHEgVElfYWRkcl9saW1pdCglcmF4KSwlcmN4Ci0JamFlIGJhZF9mcm9tX3VzZXIKKwlqYSBiYWRfZnJvbV91c2VyCiAJQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxjb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhfY29weV9mcm9tX3VzZXIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggY2Y5NzUwMC4uNjg4OTRmZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtMTEyLDggKzExMiwxMCBAQAogc3RhdGljIGludCBubWlfc3RhcnQodm9pZCkKIHsKIAlnZXRfb25saW5lX2NwdXMoKTsKLQlvbl9lYWNoX2NwdShubWlfY3B1X3N0YXJ0LCBOVUxMLCAxKTsKIAljdHJfcnVubmluZyA9IDE7CisJLyogbWFrZSBjdHJfcnVubmluZyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKKwlvbl9lYWNoX2NwdShubWlfY3B1X3N0YXJ0LCBOVUxMLCAxKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUwNCwxNSArNTA2LDE4IEBACiAKIAlubWlfZW5hYmxlZCA9IDA7CiAJY3RyX3J1bm5pbmcgPSAwOwotCWJhcnJpZXIoKTsKKwkvKiBtYWtlIHZhcmlhYmxlcyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKIAllcnIgPSByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnByb2ZpbGVfZXhjZXB0aW9uc19uYik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbmIpOwotCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDEpOwogCW5taV9lbmFibGVkID0gMTsKKwkvKiBtYWtlIG5taV9lbmFibGVkIHZpc2libGUgdG8gdGhlIG5taSBoYW5kbGVyOiAqLworCXNtcF9tYigpOworCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDEpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJcmV0dXJuIDA7CkBAIC01MzEsNyArNTM2LDggQEAKIAlubWlfZW5hYmxlZCA9IDA7CiAJY3RyX3J1bm5pbmcgPSAwOwogCXB1dF9vbmxpbmVfY3B1cygpOwotCWJhcnJpZXIoKTsKKwkvKiBtYWtlIHZhcmlhYmxlcyB2aXNpYmxlIHRvIHRoZSBubWkgaGFuZGxlcjogKi8KKwlzbXBfbWIoKTsKIAl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcHJvZmlsZV9leGNlcHRpb25zX25iKTsKIAltc3JzID0gJmdldF9jcHVfdmFyKGNwdV9tc3JzKTsKIAltb2RlbC0+c2h1dGRvd24obXNycyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCmluZGV4IGMzYjhlMjQuLjlmZDhhNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCkBAIC0zMTYsMTYgKzMxNiwyMyBAQAogCQl3cm1zcmwoTVNSX0FNRDY0X0lCU09QQ1RMLCAwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZWlsdnRfaXNfYXZhaWxhYmxlKGludCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIGludCBnZXRfZWlsdnQoaW50IG9mZnNldCkKIHsKLQkvKiBjaGVjayBpZiB3ZSBtYXkgYXNzaWduIGEgdmVjdG9yICovCiAJcmV0dXJuICFzZXR1cF9BUElDX2VpbHZ0KG9mZnNldCwgMCwgQVBJQ19FSUxWVF9NU0dfTk1JLCAxKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcHV0X2VpbHZ0KGludCBvZmZzZXQpCit7CisJcmV0dXJuICFzZXR1cF9BUElDX2VpbHZ0KG9mZnNldCwgMCwgMCwgMSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlic19laWx2dF92YWxpZCh2b2lkKQogewogCWludCBvZmZzZXQ7CiAJdTY0IHZhbDsKKwlpbnQgdmFsaWQgPSAwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlyZG1zcmwoTVNSX0FNRDY0X0lCU0NUTCwgdmFsKTsKIAlvZmZzZXQgPSB2YWwgJiBJQlNDVExfTFZUX09GRlNFVF9NQVNLOwpAQCAtMzMzLDE2ICszNDAsMjAgQEAKIAlpZiAoISh2YWwgJiBJQlNDVExfTFZUX09GRlNFVF9WQUxJRCkpIHsKIAkJcHJfZXJyKEZXX0JVRyAiY3B1ICVkLCBpbnZhbGlkIElCUyBpbnRlcnJ1cHQgb2Zmc2V0ICVkIChNU1IlMDhYPTB4JTAxNmxseClcbiIsCiAJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIG9mZnNldCwgTVNSX0FNRDY0X0lCU0NUTCwgdmFsKTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCX0KIAotCWlmICghZWlsdnRfaXNfYXZhaWxhYmxlKG9mZnNldCkpIHsKKwlpZiAoIWdldF9laWx2dChvZmZzZXQpKSB7CiAJCXByX2VycihGV19CVUcgImNwdSAlZCwgSUJTIGludGVycnVwdCBvZmZzZXQgJWQgbm90IGF2YWlsYWJsZSAoTVNSJTA4WD0weCUwMTZsbHgpXG4iLAogCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBvZmZzZXQsIE1TUl9BTUQ2NF9JQlNDVEwsIHZhbCk7Ci0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAl9CiAKLQlyZXR1cm4gMTsKKwl2YWxpZCA9IDE7CitvdXQ6CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiB2YWxpZDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2lic19vZmZzZXQodm9pZCkKQEAgLTYwMCw2NyArNjExLDY5IEBACiAKIHN0YXRpYyBpbnQgZm9yY2VfaWJzX2VpbHZ0X3NldHVwKHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IG9mZnNldDsKIAlpbnQgcmV0OwogCi0JLyogZmluZCB0aGUgbmV4dCBmcmVlIGF2YWlsYWJsZSBFSUxWVCBlbnRyeSAqLwotCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKLQkJaWYgKCFlaWx2dF9pc19hdmFpbGFibGUoaSkpCi0JCQljb250aW51ZTsKLQkJcmV0ID0gc2V0dXBfaWJzX2N0bChpKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXByX2VycihGV19CVUcgInVzaW5nIG9mZnNldCAlZCBmb3IgSUJTIGludGVycnVwdHNcbiIsIGkpOwotCQlyZXR1cm4gMDsKKwkvKgorCSAqIGZpbmQgdGhlIG5leHQgZnJlZSBhdmFpbGFibGUgRUlMVlQgZW50cnksIHNraXAgb2Zmc2V0IDAsCisJICogcGluIHNlYXJjaCB0byB0aGlzIGNwdQorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCWZvciAob2Zmc2V0ID0gMTsgb2Zmc2V0IDwgQVBJQ19FSUxWVF9OUl9NQVg7IG9mZnNldCsrKSB7CisJCWlmIChnZXRfZWlsdnQob2Zmc2V0KSkKKwkJCWJyZWFrOworCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworCisJaWYgKG9mZnNldCA9PSBBUElDX0VJTFZUX05SX01BWCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gRUlMVlQgZW50cnkgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiTm8gRUlMVlQgZW50cnkgYXZhaWxhYmxlXG4iKTsKLQotCXJldHVybiAtRUJVU1k7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0X2lic19ubWkodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKGlic19laWx2dF92YWxpZCgpKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IGZvcmNlX2lic19laWx2dF9zZXR1cCgpOworCXJldCA9IHNldHVwX2lic19jdGwob2Zmc2V0KTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAotCWlmICghaWJzX2VpbHZ0X3ZhbGlkKCkpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghaWJzX2VpbHZ0X3ZhbGlkKCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQogCisJcHJfZXJyKEZXX0JVRyAidXNpbmcgb2Zmc2V0ICVkIGZvciBJQlMgaW50ZXJydXB0c1xuIiwgb2Zmc2V0KTsKIAlwcl9lcnIoRldfQlVHICJ3b3JrYXJvdW5kIGVuYWJsZWQgZm9yIElCUyBMVlQgb2Zmc2V0XG4iKTsKIAogCXJldHVybiAwOworb3V0OgorCXByZWVtcHRfZGlzYWJsZSgpOworCXB1dF9laWx2dChvZmZzZXQpOworCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKICAqIGNoZWNrIGFuZCByZXNlcnZlIEFQSUMgZXh0ZW5kZWQgaW50ZXJydXB0IExWVCBvZmZzZXQgZm9yIElCUyBpZgogICogYXZhaWxhYmxlCi0gKgotICogaW5pdF9pYnMoKSBwcmVmb3JtcyBpbXBsaWNpdGx5IGNwdS1sb2NhbCBvcGVyYXRpb25zLCBzbyBwaW4gdGhpcwotICogdGhyZWFkIHRvIGl0cyBjdXJyZW50IENQVQogICovCiAKIHN0YXRpYyB2b2lkIGluaXRfaWJzKHZvaWQpCiB7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KIAlpYnNfY2FwcyA9IGdldF9pYnNfY2FwcygpOworCiAJaWYgKCFpYnNfY2FwcykKKwkJcmV0dXJuOworCisJaWYgKGlic19laWx2dF92YWxpZCgpKQogCQlnb3RvIG91dDsKIAotCWlmIChfX2luaXRfaWJzX25taSgpIDwgMCkKLQkJaWJzX2NhcHMgPSAwOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IEFNRCBJQlMgZGV0ZWN0ZWQgKDB4JTA4eClcbiIsIGlic19jYXBzKTsKKwlpZiAoIWZvcmNlX2lic19laWx2dF9zZXR1cCgpKQorCQlnb3RvIG91dDsKKworCS8qIEZhaWxlZCB0byBzZXR1cCBpYnMgKi8KKwlpYnNfY2FwcyA9IDA7CisJcmV0dXJuOwogCiBvdXQ6Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogQU1EIElCUyBkZXRlY3RlZCAoMHglMDh4KVxuIiwgaWJzX2NhcHMpOwogfQogCiBzdGF0aWMgaW50ICgqY3JlYXRlX2FyY2hfZmlsZXMpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKnJvb3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3hlbi5jIGIvYXJjaC94ODYvcGNpL3hlbi5jCmluZGV4IGUzN2I0MDcuLjYzMmJhMzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS94ZW4uYworKysgYi9hcmNoL3g4Ni9wY2kveGVuLmMKQEAgLTMxNiw3ICszMTYsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1hFTl9ET00wCi1zdGF0aWMgaW50IHhlbl9yZWdpc3Rlcl9waXJxKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nKQorc3RhdGljIGludCB4ZW5fcmVnaXN0ZXJfcGlycSh1MzIgZ3NpLCBpbnQgZ3NpX292ZXJyaWRlLCBpbnQgdHJpZ2dlcmluZykKIHsKIAlpbnQgcmMsIHBpcnEsIGlycSA9IC0xOwogCXN0cnVjdCBwaHlzZGV2X21hcF9waXJxIG1hcF9pcnE7CkBAIC0zMzMsMTYgKzMzMywxOCBAQAogCQlzaGFyZWFibGUgPSAxOwogCQluYW1lID0gImlvYXBpYy1sZXZlbCI7CiAJfQotCiAJcGlycSA9IHhlbl9hbGxvY2F0ZV9waXJxX2dzaShnc2kpOwogCWlmIChwaXJxIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlpcnEgPSB4ZW5fYmluZF9waXJxX2dzaV90b19pcnEoZ3NpLCBwaXJxLCBzaGFyZWFibGUsIG5hbWUpOworCWlmIChnc2lfb3ZlcnJpZGUgPj0gMCkKKwkJaXJxID0geGVuX2JpbmRfcGlycV9nc2lfdG9faXJxKGdzaV9vdmVycmlkZSwgcGlycSwgc2hhcmVhYmxlLCBuYW1lKTsKKwllbHNlCisJCWlycSA9IHhlbl9iaW5kX3BpcnFfZ3NpX3RvX2lycShnc2ksIHBpcnEsIHNoYXJlYWJsZSwgbmFtZSk7CiAJaWYgKGlycSA8IDApCiAJCWdvdG8gb3V0OwogCi0JcHJpbnRrKEtFUk5fREVCVUcgInhlbjogLS0+IHBpcnE9JWQgLT4gaXJxPSVkXG4iLCBwaXJxLCBpcnEpOworCXByaW50ayhLRVJOX0RFQlVHICJ4ZW46IC0tPiBwaXJxPSVkIC0+IGlycT0lZCAoZ3NpPSVkKVxuIiwgcGlycSwgaXJxLCBnc2kpOwogCiAJbWFwX2lycS5kb21pZCA9IERPTUlEX1NFTEY7CiAJbWFwX2lycS50eXBlID0gTUFQX1BJUlFfVFlQRV9HU0k7CkBAIC0zNTksNyArMzYxLDcgQEAKIAlyZXR1cm4gaXJxOwogfQogCi1zdGF0aWMgaW50IHhlbl9yZWdpc3Rlcl9nc2kodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKK3N0YXRpYyBpbnQgeGVuX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZ3NpX292ZXJyaWRlLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQogewogCWludCByYywgaXJxOwogCXN0cnVjdCBwaHlzZGV2X3NldHVwX2dzaSBzZXR1cF9nc2k7CkBAIC0zNzAsNyArMzcyLDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAieGVuOiByZWdpc3RlcmluZyBnc2kgJXUgdHJpZ2dlcmluZyAlZCBwb2xhcml0eSAlZFxuIiwKIAkJCWdzaSwgdHJpZ2dlcmluZywgcG9sYXJpdHkpOwogCi0JaXJxID0geGVuX3JlZ2lzdGVyX3BpcnEoZ3NpLCB0cmlnZ2VyaW5nKTsKKwlpcnEgPSB4ZW5fcmVnaXN0ZXJfcGlycShnc2ksIGdzaV9vdmVycmlkZSwgdHJpZ2dlcmluZyk7CiAKIAlzZXR1cF9nc2kuZ3NpID0gZ3NpOwogCXNldHVwX2dzaS50cmlnZ2VyaW5nID0gKHRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDAgOiAxKTsKQEAgLTM5Miw2ICszOTQsOCBAQAogCWludCByYzsKIAlpbnQgdHJpZ2dlciwgcG9sYXJpdHk7CiAJaW50IGdzaSA9IGFjcGlfc2NpX292ZXJyaWRlX2dzaTsKKwlpbnQgaXJxID0gLTE7CisJaW50IGdzaV9vdmVycmlkZSA9IC0xOwogCiAJaWYgKCFnc2kpCiAJCXJldHVybjsKQEAgLTQwOCw3ICs0MTIsMjUgQEAKIAlwcmludGsoS0VSTl9JTkZPICJ4ZW46IHNjaSBvdmVycmlkZTogZ2xvYmFsX2lycT0lZCB0cmlnZ2VyPSVkICIKIAkJCSJwb2xhcml0eT0lZFxuIiwgZ3NpLCB0cmlnZ2VyLCBwb2xhcml0eSk7CiAKLQlnc2kgPSB4ZW5fcmVnaXN0ZXJfZ3NpKGdzaSwgdHJpZ2dlciwgcG9sYXJpdHkpOworCS8qIEJlZm9yZSB3ZSBiaW5kIHRoZSBHU0kgdG8gYSBMaW51eCBJUlEsIGNoZWNrIHdoZXRoZXIKKwkgKiB3ZSBuZWVkIHRvIG92ZXJyaWRlIGl0IHdpdGggYnVzX2lycSAoSVJRKSB2YWx1ZS4gVXN1YWxseSBmb3IKKwkgKiBJUlFzIGJlbG93IElSUV9MRUdBQ1lfSVJRIHRoaXMgaG9sZHMgSVJRID09IEdTSSwgYXMgc286CisJICogIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSA5IGxvdyBsZXZlbCkKKwkgKiBidXQgdGhlcmUgYXJlIG9kZGJhbGxzIHdoZXJlIHRoZSBJUlEgIT0gR1NJOgorCSAqICBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAgYnVzX2lycSA5IGdsb2JhbF9pcnEgMjAgbG93IGxldmVsKQorCSAqIHdoaWNoIGVuZHMgdXAgYmVpbmc6IGdzaV90b19pcnFbOV0gPT0gMjAKKwkgKiAod2hpY2ggaXMgd2hhdCBhY3BpX2dzaV90b19pcnEgZW5kcyB1cCBjYWxsaW5nIHdoZW4gc3RhcnRpbmcgdGhlCisJICogdGhlIEFDUEkgaW50ZXJwcmV0ZXIgYW5kIGtlZWxzIG92ZXIgc2luY2UgSVJRIDkgaGFzIG5vdCBiZWVuCisJICogc2V0dXAgYXMgd2UgaGFkIHNldHVwIElSUSAyMCBmb3IgaXQpLgorCSAqLworCS8qIENoZWNrIHdoZXRoZXIgdGhlIEdTSSAhPSBJUlEgKi8KKwlpZiAoYWNwaV9nc2lfdG9faXJxKGdzaSwgJmlycSkgPT0gMCkgeworCQlpZiAoaXJxID49IDAgJiYgaXJxICE9IGdzaSkKKwkJCS8qIEJ1Z2dlciwgd2UgTVVTVCBoYXZlIHRoYXQgSVJRLiAqLworCQkJZ3NpX292ZXJyaWRlID0gaXJxOworCX0KKworCWdzaSA9IHhlbl9yZWdpc3Rlcl9nc2koZ3NpLCBnc2lfb3ZlcnJpZGUsIHRyaWdnZXIsIHBvbGFyaXR5KTsKIAlwcmludGsoS0VSTl9JTkZPICJ4ZW46IGFjcGkgc2NpICVkXG4iLCBnc2kpOwogCiAJcmV0dXJuOwpAQCAtNDE3LDcgKzQzOSw3IEBACiBzdGF0aWMgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpX3hlbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBnc2ksCiAJCQkJIGludCB0cmlnZ2VyLCBpbnQgcG9sYXJpdHkpCiB7Ci0JcmV0dXJuIHhlbl9yZWdpc3Rlcl9nc2koZ3NpLCB0cmlnZ2VyLCBwb2xhcml0eSk7CisJcmV0dXJuIHhlbl9yZWdpc3Rlcl9nc2koZ3NpLCAtMSAvKiBubyBHU0kgb3ZlcnJpZGUgKi8sIHRyaWdnZXIsIHBvbGFyaXR5KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcGNpX3hlbl9pbml0aWFsX2RvbWFpbih2b2lkKQpAQCAtNDU2LDcgKzQ3OCw3IEBACiAJCWlmIChhY3BpX2dldF9vdmVycmlkZV9pcnEoaXJxLCAmdHJpZ2dlciwgJnBvbGFyaXR5KSA9PSAtMSkKIAkJCWNvbnRpbnVlOwogCi0JCXhlbl9yZWdpc3Rlcl9waXJxKGlycSwKKwkJeGVuX3JlZ2lzdGVyX3BpcnEoaXJxLCAtMSAvKiBubyBHU0kgb3ZlcnJpZGUgKi8sCiAJCQl0cmlnZ2VyID8gQUNQSV9MRVZFTF9TRU5TSVRJVkUgOiBBQ1BJX0VER0VfU0VOU0lUSVZFKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggMDY4NGYzYy4uMGQ2NjhkMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2luaXQuaD4KICNpbmNsdWRlIDxhc20vcGF0Lmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KQEAgLTExODcsNyArMTE4OCw3IEBACiAKIAlhY3RpdmVfbW0gPSBwZXJjcHVfcmVhZChjcHVfdGxic3RhdGUuYWN0aXZlX21tKTsKIAotCWlmIChhY3RpdmVfbW0gPT0gbW0pCisJaWYgKGFjdGl2ZV9tbSA9PSBtbSAmJiBwZXJjcHVfcmVhZChjcHVfdGxic3RhdGUuc3RhdGUpICE9IFRMQlNUQVRFX09LKQogCQlsZWF2ZV9tbShzbXBfcHJvY2Vzc29yX2lkKCkpOwogCiAJLyogSWYgdGhpcyBjcHUgc3RpbGwgaGFzIGEgc3RhbGUgY3IzIHJlZmVyZW5jZSwgdGhlbiBtYWtlIHN1cmUKQEAgLTEzNTMsNyArMTM1NCwxMSBAQAogewogCXN0cnVjdCB7CiAJCXN0cnVjdCBtbXVleHRfb3Agb3A7CisjaWZkZWYgQ09ORklHX1NNUAorCQlERUNMQVJFX0JJVE1BUChtYXNrLCBudW1fcHJvY2Vzc29ycyk7CisjZWxzZQogCQlERUNMQVJFX0JJVE1BUChtYXNrLCBOUl9DUFVTKTsKKyNlbmRpZgogCX0gKmFyZ3M7CiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CiAKQEAgLTE3MjEsNiArMTcyNiwxMSBAQAogCQlmb3IgKHB0ZWlkeCA9IDA7IHB0ZWlkeCA8IFBUUlNfUEVSX1BURTsgcHRlaWR4KyssIHBmbisrKSB7CiAJCQlwdGVfdCBwdGU7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJCQlpZiAocGZuID4gbWF4X3Bmbl9tYXBwZWQpCisJCQkJbWF4X3Bmbl9tYXBwZWQgPSBwZm47CisjZW5kaWYKKwogCQkJaWYgKCFwdGVfbm9uZShwdGVfcGFnZVtwdGVpZHhdKSkKIAkJCQljb250aW51ZTsKIApAQCAtMTg4OCw3ICsxODk4LDkgQEAKIAlpbml0aWFsX2tlcm5lbF9wbWQgPQogCQlleHRlbmRfYnJrKHNpemVvZihwbWRfdCkgKiBQVFJTX1BFUl9QTUQsIFBBR0VfU0laRSk7CiAKLQltYXhfcGZuX21hcHBlZCA9IFBGTl9ET1dOKF9fcGEoeGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0KSk7CisJbWF4X3Bmbl9tYXBwZWQgPSBQRk5fRE9XTihfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSArCisJCQkJICB4ZW5fc3RhcnRfaW5mby0+bnJfcHRfZnJhbWVzICogUEFHRV9TSVpFICsKKwkJCQkgIDUxMioxMDI0KTsKIAogCWtlcm5lbF9wbWQgPSBtMnYocGdkW0tFUk5FTF9QR0RfQk9VTkRBUlldLnBnZCk7CiAJbWVtY3B5KGluaXRpYWxfa2VybmVsX3BtZCwga2VybmVsX3BtZCwgc2l6ZW9mKHBtZF90KSAqIFBUUlNfUEVSX1BNRCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5jIGIvYXJjaC94ODYveGVuL211bHRpY2FsbHMuYwppbmRleCA4YmZmN2U3Li4xYjJiNzNmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5jCisrKyBiL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMKQEAgLTE4OSwxMCArMTg5LDEwIEBACiAJdW5zaWduZWQgYXJnaWR4ID0gcm91bmR1cChiLT5hcmdpZHgsIHNpemVvZih1NjQpKTsKIAogCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKLQlCVUdfT04oYi0+YXJnaWR4ID4gTUNfQVJHUyk7CisJQlVHX09OKGItPmFyZ2lkeCA+PSBNQ19BUkdTKTsKIAogCWlmIChiLT5tY2lkeCA9PSBNQ19CQVRDSCB8fAotCSAgICAoYXJnaWR4ICsgYXJncykgPiBNQ19BUkdTKSB7CisJICAgIChhcmdpZHggKyBhcmdzKSA+PSBNQ19BUkdTKSB7CiAJCW1jX3N0YXRzX2ZsdXNoKGItPm1jaWR4ID09IE1DX0JBVENIID8gRkxfU0xPVFMgOiBGTF9BUkdTKTsKIAkJeGVuX21jX2ZsdXNoKCk7CiAJCWFyZ2lkeCA9IHJvdW5kdXAoYi0+YXJnaWR4LCBzaXplb2YodTY0KSk7CkBAIC0yMDYsNyArMjA2LDcgQEAKIAlyZXQuYXJncyA9ICZiLT5hcmdzW2FyZ2lkeF07CiAJYi0+YXJnaWR4ID0gYXJnaWR4ICsgYXJnczsKIAotCUJVR19PTihiLT5hcmdpZHggPiBNQ19BUkdTKTsKKwlCVUdfT04oYi0+YXJnaWR4ID49IE1DX0FSR1MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgcmV0ID0geyBOVUxMLCBOVUxMIH07CiAKIAlCVUdfT04ocHJlZW1wdGlibGUoKSk7Ci0JQlVHX09OKGItPmFyZ2lkeCA+IE1DX0FSR1MpOworCUJVR19PTihiLT5hcmdpZHggPj0gTUNfQVJHUyk7CiAKIAlpZiAoYi0+bWNpZHggPT0gMCkKIAkJcmV0dXJuIHJldDsKQEAgLTIyNCwxNCArMjI0LDE0IEBACiAJaWYgKGItPmVudHJpZXNbYi0+bWNpZHggLSAxXS5vcCAhPSBvcCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICgoYi0+YXJnaWR4ICsgc2l6ZSkgPiBNQ19BUkdTKQorCWlmICgoYi0+YXJnaWR4ICsgc2l6ZSkgPj0gTUNfQVJHUykKIAkJcmV0dXJuIHJldDsKIAogCXJldC5tYyA9ICZiLT5lbnRyaWVzW2ItPm1jaWR4IC0gMV07CiAJcmV0LmFyZ3MgPSAmYi0+YXJnc1tiLT5hcmdpZHhdOwogCWItPmFyZ2lkeCArPSBzaXplOwogCi0JQlVHX09OKGItPmFyZ2lkeCA+IE1DX0FSR1MpOworCUJVR19PTihiLT5hcmdpZHggPj0gTUNfQVJHUyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3AybS5jIGIvYXJjaC94ODYveGVuL3AybS5jCmluZGV4IDE0MWViMGQuLmM4ODFhZTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9wMm0uYworKysgYi9hcmNoL3g4Ni94ZW4vcDJtLmMKQEAgLTUyMiwxMSArNTIyLDIwIEBACiAJLyogQm91bmRhcnkgY3Jvc3Mtb3ZlciBmb3IgdGhlIGVkZ2VzOiAqLwogCWlmIChpZHgpIHsKIAkJdW5zaWduZWQgbG9uZyAqcDJtID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJCXVuc2lnbmVkIGxvbmcgKm1pZF9tZm5fcDsKIAogCQlwMm1faW5pdChwMm0pOwogCiAJCXAybV90b3BbdG9waWR4XVttaWRpZHhdID0gcDJtOwogCisJCS8qIEZvciBzYXZlL3Jlc3RvcmUgd2UgbmVlZCB0byBNRk4gb2YgdGhlIFAyTSBzYXZlZCAqLworCisJCW1pZF9tZm5fcCA9IHAybV90b3BfbWZuX3BbdG9waWR4XTsKKwkJV0FSTihtaWRfbWZuX3BbbWlkaWR4XSAhPSB2aXJ0X3RvX21mbihwMm1fbWlzc2luZyksCisJCQkiUDJNX1RPUF9QWyVkXVslZF0gIT0gTUZOIG9mIHAybV9taXNzaW5nIVxuIiwKKwkJCXRvcGlkeCwgbWlkaWR4KTsKKwkJbWlkX21mbl9wW21pZGlkeF0gPSB2aXJ0X3RvX21mbihwMm0pOworCiAJfQogCXJldHVybiBpZHggIT0gMDsKIH0KQEAgLTU0OSwxMiArNTU4LDI5IEBACiAJCXBmbiArPSBQMk1fTUlEX1BFUl9QQUdFICogUDJNX1BFUl9QQUdFKQogCXsKIAkJdW5zaWduZWQgdG9waWR4ID0gcDJtX3RvcF9pbmRleChwZm4pOwotCQlpZiAocDJtX3RvcFt0b3BpZHhdID09IHAybV9taWRfbWlzc2luZykgewotCQkJdW5zaWduZWQgbG9uZyAqKm1pZCA9IGV4dGVuZF9icmsoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCQl1bnNpZ25lZCBsb25nICptaWRfbWZuX3A7CisJCXVuc2lnbmVkIGxvbmcgKiptaWQ7CisKKwkJbWlkID0gcDJtX3RvcFt0b3BpZHhdOworCQltaWRfbWZuX3AgPSBwMm1fdG9wX21mbl9wW3RvcGlkeF07CisJCWlmIChtaWQgPT0gcDJtX21pZF9taXNzaW5nKSB7CisJCQltaWQgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKIAogCQkJcDJtX21pZF9pbml0KG1pZCk7CiAKIAkJCXAybV90b3BbdG9waWR4XSA9IG1pZDsKKworCQkJQlVHX09OKG1pZF9tZm5fcCAhPSBwMm1fbWlkX21pc3NpbmdfbWZuKTsKKwkJfQorCQkvKiBBbmQgdGhlIHNhdmUvcmVzdG9yZSBQMk0gdGFibGVzLi4gKi8KKwkJaWYgKG1pZF9tZm5fcCA9PSBwMm1fbWlkX21pc3NpbmdfbWZuKSB7CisJCQltaWRfbWZuX3AgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwkJCXAybV9taWRfbWZuX2luaXQobWlkX21mbl9wKTsKKworCQkJcDJtX3RvcF9tZm5fcFt0b3BpZHhdID0gbWlkX21mbl9wOworCQkJcDJtX3RvcF9tZm5bdG9waWR4XSA9IHZpcnRfdG9fbWZuKG1pZF9tZm5fcCk7CisJCQkvKiBOb3RlOiB3ZSBkb24ndCBzZXQgbWlkX21mbl9wW21pZGl4XSBoZXJlLAorCQkgCSAqIGxvb2sgaW4gX19lYXJseV9hbGxvY19wMm0gKi8KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwppbmRleCA5MGJhYzBhLi5jYTYyOTdiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCWlmIChsYXN0ID4gZW5kKQogCQkJY29udGludWU7CiAKLQkJaWYgKGVudHJ5LT50eXBlID09IEU4MjBfUkFNKSB7CisJCWlmICgoZW50cnktPnR5cGUgPT0gRTgyMF9SQU0pIHx8IChlbnRyeS0+dHlwZSA9PSBFODIwX1VOVVNBQkxFKSkgewogCQkJaWYgKHN0YXJ0ID4gc3RhcnRfcGNpKQogCQkJCWlkZW50aXR5ICs9IHNldF9waHlzX3JhbmdlX2lkZW50aXR5KAogCQkJCQkJUEZOX1VQKHN0YXJ0X3BjaSksIFBGTl9ET1dOKHN0YXJ0KSk7CkBAIC0yMjcsNyArMjI3LDExIEBACiAKIAltZW1jcHkobWFwX3JhdywgbWFwLCBzaXplb2YobWFwKSk7CiAJZTgyMC5ucl9tYXAgPSAwOworI2lmZGVmIENPTkZJR19YODZfMzIKKwl4ZW5fZXh0cmFfbWVtX3N0YXJ0ID0gbWVtX2VuZDsKKyNlbHNlCiAJeGVuX2V4dHJhX21lbV9zdGFydCA9IG1heCgoMVVMTCA8PCAzMiksIG1lbV9lbmQpOworI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9lbnRyaWVzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIGVuZDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NtcC5jIGIvYXJjaC94ODYveGVuL3NtcC5jCmluZGV4IDMwNjEyNDQxLi5hZTQ5MDQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc21wLmMKKysrIGIvYXJjaC94ODYveGVuL3NtcC5jCkBAIC0yMDYsMTEgKzIwNiwxOCBAQAogc3RhdGljIHZvaWQgX19pbml0IHhlbl9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKIAl1bnNpZ25lZCBjcHU7CisJdW5zaWduZWQgaW50IGk7CiAKIAl4ZW5faW5pdF9sb2NrX2NwdSgwKTsKIAogCXNtcF9zdG9yZV9jcHVfaW5mbygwKTsKIAljcHVfZGF0YSgwKS54ODZfbWF4X2NvcmVzID0gMTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGkpLCBHRlBfS0VSTkVMKTsKKwkJemFsbG9jX2NwdW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9jb3JlX21hcCwgaSksIEdGUF9LRVJORUwpOworCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X2xsY19zaGFyZWRfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CisJfQogCXNldF9jcHVfc2libGluZ19tYXAoMCk7CiAKIAlpZiAoeGVuX3NtcF9pbnRyX2luaXQoMCkpCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCAzZmUwMGExLi41MzIzMDc2IDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTM0NSw2ICszNDUsNyBAQAogewogCWtvYmplY3RfcHV0KCZxLT5rb2JqKTsKIH0KK0VYUE9SVF9TWU1CT0woYmxrX3B1dF9xdWV1ZSk7CiAKIC8qCiAgKiBOb3RlOiBJZiBhIGRyaXZlciBzdXBwbGllZCB0aGUgcXVldWUgbG9jaywgaXQgc2hvdWxkIG5vdCB6YXAgdGhhdCBsb2NrCkBAIC01NjYsNiArNTY3LDcgQEAKIAogCXJldHVybiAxOwogfQorRVhQT1JUX1NZTUJPTChibGtfZ2V0X3F1ZXVlKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGJsa19mcmVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1mbHVzaC5jIGIvYmxvY2svYmxrLWZsdXNoLmMKaW5kZXggNmM5YjVlMS4uYmIyMWU0YyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWZsdXNoLmMKKysrIGIvYmxvY2svYmxrLWZsdXNoLmMKQEAgLTIxMiwxMyArMjEyLDE5IEBACiAJfQogCiAJLyoKLQkgKiBNb3ZpbmcgYSByZXF1ZXN0IHNpbGVudGx5IHRvIGVtcHR5IHF1ZXVlX2hlYWQgbWF5IHN0YWxsIHRoZQotCSAqIHF1ZXVlLiAgS2ljayB0aGUgcXVldWUgaW4gdGhvc2UgY2FzZXMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAotCSAqIGZyb20gcmVxdWVzdCBjb21wbGV0aW9uIHBhdGggYW5kIGNhbGxpbmcgZGlyZWN0bHkgaW50bwotCSAqIHJlcXVlc3RfZm4gbWF5IGNvbmZ1c2UgdGhlIGRyaXZlci4gIEFsd2F5cyB1c2Uga2Jsb2NrZC4KKwkgKiBLaWNrIHRoZSBxdWV1ZSB0byBhdm9pZCBzdGFsbCBmb3IgdHdvIGNhc2VzOgorCSAqIDEuIE1vdmluZyBhIHJlcXVlc3Qgc2lsZW50bHkgdG8gZW1wdHkgcXVldWVfaGVhZCBtYXkgc3RhbGwgdGhlCisJICogcXVldWUuCisJICogMi4gV2hlbiBmbHVzaCByZXF1ZXN0IGlzIHJ1bm5pbmcgaW4gbm9uLXF1ZXVlYWJsZSBxdWV1ZSwgdGhlCisJICogcXVldWUgaXMgaG9sZC4gUmVzdGFydCB0aGUgcXVldWUgYWZ0ZXIgZmx1c2ggcmVxdWVzdCBpcyBmaW5pc2hlZAorCSAqIHRvIGF2b2lkIHN0YWxsLgorCSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcmVxdWVzdCBjb21wbGV0aW9uIHBhdGggYW5kIGNhbGxpbmcKKwkgKiBkaXJlY3RseSBpbnRvIHJlcXVlc3RfZm4gbWF5IGNvbmZ1c2UgdGhlIGRyaXZlci4gIEFsd2F5cyB1c2UKKwkgKiBrYmxvY2tkLgogCSAqLwotCWlmIChxdWV1ZWQpCisJaWYgKHF1ZXVlZCB8fCBxLT5mbHVzaF9xdWV1ZV9kZWxheWVkKQogCQlibGtfcnVuX3F1ZXVlX2FzeW5jKHEpOworCXEtPmZsdXNoX3F1ZXVlX2RlbGF5ZWQgPSAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zZXR0aW5ncy5jIGIvYmxvY2svYmxrLXNldHRpbmdzLmMKaW5kZXggMWZhNzY5Mi4uZmExZWIwNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXNldHRpbmdzLmMKKysrIGIvYmxvY2svYmxrLXNldHRpbmdzLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCWxpbS0+ZGlzY2FyZF9ncmFudWxhcml0eSA9IDA7CiAJbGltLT5kaXNjYXJkX2FsaWdubWVudCA9IDA7CiAJbGltLT5kaXNjYXJkX21pc2FsaWduZWQgPSAwOwotCWxpbS0+ZGlzY2FyZF96ZXJvZXNfZGF0YSA9IC0xOworCWxpbS0+ZGlzY2FyZF96ZXJvZXNfZGF0YSA9IDE7CiAJbGltLT5sb2dpY2FsX2Jsb2NrX3NpemUgPSBsaW0tPnBoeXNpY2FsX2Jsb2NrX3NpemUgPSBsaW0tPmlvX21pbiA9IDUxMjsKIAlsaW0tPmJvdW5jZV9wZm4gPSAodW5zaWduZWQgbG9uZykoQkxLX0JPVU5DRV9BTlkgPj4gUEFHRV9TSElGVCk7CiAJbGltLT5hbGlnbm1lbnRfb2Zmc2V0ID0gMDsKQEAgLTE2Niw2ICsxNjYsNyBAQAogCiAJYmxrX3NldF9kZWZhdWx0X2xpbWl0cygmcS0+bGltaXRzKTsKIAlibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMocSwgQkxLX1NBRkVfTUFYX1NFQ1RPUlMpOworCXEtPmxpbWl0cy5kaXNjYXJkX3plcm9lc19kYXRhID0gMDsKIAogCS8qCiAJICogYnkgZGVmYXVsdCBhc3N1bWUgb2xkIGJlaGF2aW91ciBhbmQgYm91bmNlIGZvciBhbnkgaGlnaG1lbSBwYWdlCkBAIC03OTAsNiArNzkxLDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChibGtfcXVldWVfZmx1c2gpOwogCit2b2lkIGJsa19xdWV1ZV9mbHVzaF9xdWV1ZWFibGUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGJvb2wgcXVldWVhYmxlKQoreworCXEtPmZsdXNoX25vdF9xdWV1ZWFibGUgPSAhcXVldWVhYmxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3F1ZXVlX2ZsdXNoX3F1ZXVlYWJsZSk7CisKIHN0YXRpYyBpbnQgX19pbml0IGJsa19zZXR0aW5nc19pbml0KHZvaWQpCiB7CiAJYmxrX21heF9sb3dfcGZuID0gbWF4X2xvd19wZm4gLSAxOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXN5c2ZzLmMgYi9ibG9jay9ibGstc3lzZnMuYwppbmRleCBiZDIzNjMxLi5kOTM1YmQ4IDEwMDY0NAotLS0gYS9ibG9jay9ibGstc3lzZnMuYworKysgYi9ibG9jay9ibGstc3lzZnMuYwpAQCAtMTUyLDcgKzE1Miw4IEBACiAKIHN0YXRpYyBzc2l6ZV90IHF1ZXVlX2Rpc2NhcmRfbWF4X3Nob3coc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKnBhZ2UpCiB7Ci0JcmV0dXJuIHF1ZXVlX3Zhcl9zaG93KHEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzIDw8IDksIHBhZ2UpOworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycyA8PCA5KTsKIH0KIAogc3RhdGljIHNzaXplX3QgcXVldWVfZGlzY2FyZF96ZXJvZXNfZGF0YV9zaG93KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpwYWdlKQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLmggYi9ibG9jay9ibGsuaAppbmRleCA2MTI2MzQ2Li4xNTY2ZThkIDEwMDY0NAotLS0gYS9ibG9jay9ibGsuaAorKysgYi9ibG9jay9ibGsuaApAQCAtNjEsOCArNjEsMjggQEAKIAkJCXJxID0gbGlzdF9lbnRyeV9ycShxLT5xdWV1ZV9oZWFkLm5leHQpOwogCQkJcmV0dXJuIHJxOwogCQl9Ci0KLQkJaWYgKCFxLT5lbGV2YXRvci0+b3BzLT5lbGV2YXRvcl9kaXNwYXRjaF9mbihxLCAwKSkKKwkJLyoKKwkJICogRmx1c2ggcmVxdWVzdCBpcyBydW5uaW5nIGFuZCBmbHVzaCByZXF1ZXN0IGlzbid0IHF1ZXVlYWJsZQorCQkgKiBpbiB0aGUgZHJpdmUsIHdlIGNhbiBob2xkIHRoZSBxdWV1ZSB0aWxsIGZsdXNoIHJlcXVlc3QgaXMKKwkJICogZmluaXNoZWQuIEV2ZW4gd2UgZG9uJ3QgZG8gdGhpcywgZHJpdmVyIGNhbid0IGRpc3BhdGNoIG5leHQKKwkJICogcmVxdWVzdHMgYW5kIHdpbGwgcmVxdWV1ZSB0aGVtLiBBbmQgdGhpcyBjYW4gaW1wcm92ZQorCQkgKiB0aHJvdWdocHV0IHRvby4gRm9yIGV4YW1wbGUsIHdlIGhhdmUgcmVxdWVzdCBmbHVzaDEsIHdyaXRlMSwKKwkJICogZmx1c2ggMi4gZmx1c2gxIGlzIGRpc3BhdGNoZWQsIHRoZW4gcXVldWUgaXMgaG9sZCwgd3JpdGUxCisJCSAqIGlzbid0IGluc2VydGVkIHRvIHF1ZXVlLiBBZnRlciBmbHVzaDEgaXMgZmluaXNoZWQsIGZsdXNoMgorCQkgKiB3aWxsIGJlIGRpc3BhdGNoZWQuIFNpbmNlIGRpc2sgY2FjaGUgaXMgYWxyZWFkeSBjbGVhbiwKKwkJICogZmx1c2gyIHdpbGwgYmUgZmluaXNoZWQgdmVyeSBzb29uLCBzbyBsb29rcyBsaWtlIGZsdXNoMiBpcworCQkgKiBmb2xkZWQgdG8gZmx1c2gxLgorCQkgKiBTaW5jZSB0aGUgcXVldWUgaXMgaG9sZCwgYSBmbGFnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUgcXVldWUKKwkJICogc2hvdWxkIGJlIHJlc3RhcnRlZCBsYXRlci4gUGxlYXNlIHNlZSBmbHVzaF9lbmRfaW8oKSBmb3IKKwkJICogZGV0YWlscy4KKwkJICovCisJCWlmIChxLT5mbHVzaF9wZW5kaW5nX2lkeCAhPSBxLT5mbHVzaF9ydW5uaW5nX2lkeCAmJgorCQkJCSFxdWV1ZV9mbHVzaF9xdWV1ZWFibGUocSkpIHsKKwkJCXEtPmZsdXNoX3F1ZXVlX2RlbGF5ZWQgPSAxOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKSB8fAorCQkgICAgIXEtPmVsZXZhdG9yLT5vcHMtPmVsZXZhdG9yX2Rpc3BhdGNoX2ZuKHEsIDApKQogCQkJcmV0dXJuIE5VTEw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYmxvY2svY2ZxLWlvc2NoZWQuYyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKaW5kZXggYWI3YTllNi4uYmQyZmE1ZiAxMDA2NDQKLS0tIGEvYmxvY2svY2ZxLWlvc2NoZWQuYworKysgYi9ibG9jay9jZnEtaW9zY2hlZC5jCkBAIC0yNzA0LDggKzI3MDQsMTQgQEAKIAlzbXBfd21iKCk7CiAJY2ljLT5rZXkgPSBjZnFkX2RlYWRfa2V5KGNmcWQpOwogCi0JaWYgKGlvYy0+aW9jX2RhdGEgPT0gY2ljKQorCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAocmN1X2RlcmVmZXJlbmNlKGlvYy0+aW9jX2RhdGEpID09IGNpYykgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc3Bpbl9sb2NrKCZpb2MtPmxvY2spOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoaW9jLT5pb2NfZGF0YSwgTlVMTCk7CisJCXNwaW5fdW5sb2NrKCZpb2MtPmxvY2spOworCX0gZWxzZQorCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChjaWMtPmNmcXFbQkxLX1JXX0FTWU5DXSkgewogCQljZnFfZXhpdF9jZnFxKGNmcWQsIGNpYy0+Y2ZxcVtCTEtfUldfQVNZTkNdKTsKQEAgLTMwMTIsNyArMzAxOCw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5sb2NrLCBmbGFncyk7CiAKLQlCVUdfT04oaW9jLT5pb2NfZGF0YSA9PSBjaWMpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2VfY2hlY2soaW9jLT5pb2NfZGF0YSwKKwkJbG9ja2RlcF9pc19oZWxkKCZpb2MtPmxvY2spKSA9PSBjaWMpOwogCiAJcmFkaXhfdHJlZV9kZWxldGUoJmlvYy0+cmFkaXhfcm9vdCwgY2ZxZC0+Y2ljX2luZGV4KTsKIAlobGlzdF9kZWxfcmN1KCZjaWMtPmNpY19saXN0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IDBiMzQ3MzMuLjUwYjYxYzMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMTc0NSw3ICsxNzQ1LDcgQEAKIHsKIAlzdHJ1Y3QgZGlza19ldmVudHMgKmV2OwogCi0JaWYgKCFkaXNrLT5mb3BzLT5jaGVja19ldmVudHMgfHwgIShkaXNrLT5ldmVudHMgfCBkaXNrLT5hc3luY19ldmVudHMpKQorCWlmICghZGlzay0+Zm9wcy0+Y2hlY2tfZXZlbnRzKQogCQlyZXR1cm47CiAKIAlldiA9IGt6YWxsb2Moc2l6ZW9mKCpldiksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCBkYWQ5ZmQ2Li4xN2I3NGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtMjgwMiwxMCArMjgwMiwxMSBAQAogCX0KIAogCS8qCi0JICogU29tZSBjb250cm9sbGVycyBjYW4ndCBiZSBmcm96ZW4gdmVyeSB3ZWxsIGFuZCBtYXkgc2V0Ci0JICogc3B1cnVpb3VzIGVycm9yIGNvbmRpdGlvbnMgZHVyaW5nIHJlc2V0LiAgQ2xlYXIgYWNjdW11bGF0ZWQKLQkgKiBlcnJvciBpbmZvcm1hdGlvbi4gIEFzIHJlc2V0IGlzIHRoZSBmaW5hbCByZWNvdmVyeSBhY3Rpb24sCi0JICogbm90aGluZyBpcyBsb3N0IGJ5IGRvaW5nIHRoaXMuCisJICogU29tZSBjb250cm9sbGVycyBjYW4ndCBiZSBmcm96ZW4gdmVyeSB3ZWxsIGFuZCBtYXkgc2V0IHNwdXJpb3VzCisJICogZXJyb3IgY29uZGl0aW9ucyBkdXJpbmcgcmVzZXQuICBDbGVhciBhY2N1bXVsYXRlZCBlcnJvcgorCSAqIGluZm9ybWF0aW9uIGFuZCByZS10aGF3IHRoZSBwb3J0IGlmIGZyb3plbi4gIEFzIHJlc2V0IGlzIHRoZQorCSAqIGZpbmFsIHJlY292ZXJ5IGFjdGlvbiBhbmQgd2UgY3Jvc3MgY2hlY2sgbGluayBvbmxpbmVuZXNzIGFnYWluc3QKKwkgKiBkZXZpY2UgY2xhc3NpZmljYXRpb24gbGF0ZXIsIG5vIGhvdHBsdWcgZXZlbnQgaXMgbG9zdCBieSB0aGlzLgogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKGxpbmstPmFwLT5sb2NrLCBmbGFncyk7CiAJbWVtc2V0KCZsaW5rLT5laF9pbmZvLCAwLCBzaXplb2YobGluay0+ZWhfaW5mbykpOwpAQCAtMjgxNCw2ICsyODE1LDkgQEAKIAlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfRUhfUEVORElORzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxpbmstPmFwLT5sb2NrLCBmbGFncyk7CiAKKwlpZiAoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19GUk9aRU4pCisJCWF0YV9laF90aGF3X3BvcnQoYXApOworCiAJLyoKIAkgKiBNYWtlIHN1cmUgb25saW5lbmVzcyBhbmQgY2xhc3NpZmljYXRpb24gcmVzdWx0IGNvcnJlc3BvbmQuCiAJICogSG90cGx1ZyBjb3VsZCBoYXZlIGhhcHBlbmVkIGR1cmluZyByZXNldCBhbmQgc29tZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggZTJmNTdlOWUuLmQ1MWY5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMTA4OSwyMSArMTA4OSwyMSBAQAogc3RhdGljIGludCBhdGFfc2NzaV9kZXZfY29uZmlnKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKIAkJCSAgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogeworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsKKwogCWlmICghYXRhX2lkX2hhc191bmxvYWQoZGV2LT5pZCkpCiAJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX05PX1VOTE9BRDsKIAogCS8qIGNvbmZpZ3VyZSBtYXggc2VjdG9ycyAqLwotCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBkZXYtPm1heF9zZWN0b3JzKTsKKwlibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMocSwgZGV2LT5tYXhfc2VjdG9ycyk7CiAKIAlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJKSB7Ci0JCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsKIAkJdm9pZCAqYnVmOwogCiAJCXNkZXYtPnNlY3Rvcl9zaXplID0gQVRBX1NFQ1RfU0laRTsKIAogCQkvKiBzZXQgRE1BIHBhZGRpbmcgKi8KLQkJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfcGFkKHNkZXYtPnJlcXVlc3RfcXVldWUsCi0JCQkJCSBBVEFfRE1BX1BBRF9TWiAtIDEpOworCQlibGtfcXVldWVfdXBkYXRlX2RtYV9wYWQocSwgQVRBX0RNQV9QQURfU1ogLSAxKTsKIAogCQkvKiBjb25maWd1cmUgZHJhaW5pbmcgKi8KIAkJYnVmID0ga21hbGxvYyhBVEFQSV9NQVhfRFJBSU4sIHEtPmJvdW5jZV9nZnAgfCBHRlBfS0VSTkVMKTsKQEAgLTExMzEsOCArMTEzMSw3IEBACiAJCQkic2VjdG9yX3NpemU9JXUgPiBQQUdFX1NJWkUsIFBJTyBtYXkgbWFsZnVuY3Rpb25cbiIsCiAJCQlzZGV2LT5zZWN0b3Jfc2l6ZSk7CiAKLQlibGtfcXVldWVfdXBkYXRlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwKLQkJCQkgICAgICAgc2Rldi0+c2VjdG9yX3NpemUgLSAxKTsKKwlibGtfcXVldWVfdXBkYXRlX2RtYV9hbGlnbm1lbnQocSwgc2Rldi0+c2VjdG9yX3NpemUgLSAxKTsKIAogCWlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0FOKQogCQlzZXRfYml0KFNERVZfRVZUX01FRElBX0NIQU5HRSwgc2Rldi0+c3VwcG9ydGVkX2V2ZW50cyk7CkBAIC0xMTQ1LDYgKzExNDQsOCBAQAogCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfU0lNUExFX1RBRywgZGVwdGgpOwogCX0KIAorCWJsa19xdWV1ZV9mbHVzaF9xdWV1ZWFibGUocSwgZmFsc2UpOworCiAJZGV2LT5zZGV2ID0gc2RldjsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMzgsNyArMjEzOSw3IEBACiAJICogd2l0aCB0aGUgdW5tYXAgYml0IHNldC4KIAkgKi8KIAlpZiAoYXRhX2lkX2hhc190cmltKGFyZ3MtPmlkKSkgewotCQlwdXRfdW5hbGlnbmVkX2JlMzIoNjU1MzUgKiA1MTIgLyA4LCAmcmJ1ZlsyMF0pOworCQlwdXRfdW5hbGlnbmVkX2JlNjQoNjU1MzUgKiA1MTIgLyA4LCAmcmJ1ZlszNl0pOwogCQlwdXRfdW5hbGlnbmVkX2JlMzIoMSwgJnJidWZbMjhdKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCmluZGV4IDkwNWZmNzYuLjYzNWE3NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYwpAQCAtNDEsNiArNDEsOSBAQAogZW51bSB7CiAJQ0ZSIAkJPSAweDUwLAogCQlDRlJfSU5UUl9DSDAgID0gMHgwNCwKKwlDTlRSTAkJPSAweDUxLAorCQlDTlRSTF9DSDAgICAgID0gMHgwNCwKKwkJQ05UUkxfQ0gxICAgICA9IDB4MDgsCiAJQ01EVElNIAkJPSAweDUyLAogCUFSVFRJTTAgCT0gMHg1MywKIAlEUldUSU0wIAk9IDB4NTQsCkBAIC0zMjgsOSArMzMxLDE5IEBACiAJCQkucG9ydF9vcHMgPSAmY21kNjQ4X3BvcnRfb3BzCiAJCX0KIAl9OwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmNtZF9pbmZvW2lkLT5kcml2ZXJfZGF0YV0sIE5VTEwgfTsKLQl1OCBtcmRtb2RlOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsKKwkJJmNtZF9pbmZvW2lkLT5kcml2ZXJfZGF0YV0sCisJCSZjbWRfaW5mb1tpZC0+ZHJpdmVyX2RhdGFdLAorCQlOVUxMCisJfTsKKwl1OCBtcmRtb2RlLCByZWc7CiAJaW50IHJjOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBwZGV2LT5idXMtPnNlbGY7CisJLyogbW9iaWxpdHkgc3BsaXQgYnJpZGdlcyBkb24ndCByZXBvcnQgZW5hYmxlZCBwb3J0cyBjb3JyZWN0bHkgKi8KKwlpbnQgcG9ydF9vayA9ICEoYnJpZGdlICYmIGJyaWRnZS0+dmVuZG9yID09CisJCQlQQ0lfVkVORE9SX0lEX01PQklMSVRZX0VMRUNUUk9OSUNTKTsKKwkvKiBhbGwgKHdpdGggZXhjZXB0aW9ucyBiZWxvdykgYXBhcnQgZnJvbSA2NDMgaGF2ZSBDTlRSTF9DSDAgYml0ICovCisJaW50IGNudHJsX2NoMF9vayA9IChpZC0+ZHJpdmVyX2RhdGEgIT0gMCk7CiAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCkBAIC0zNDEsMTEgKzM1NCwxOCBAQAogCiAJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NNRF82NDYpIHsKIAkJLyogRG9lcyBVRE1BIHdvcmsgPyAqLwotCQlpZiAocGRldi0+cmV2aXNpb24gPiA0KQorCQlpZiAocGRldi0+cmV2aXNpb24gPiA0KSB7CiAJCQlwcGlbMF0gPSAmY21kX2luZm9bMl07CisJCQlwcGlbMV0gPSAmY21kX2luZm9bMl07CisJCX0KIAkJLyogRWFybHkgcmV2IHdpdGggb3RoZXIgcHJvYmxlbXMgPyAqLwotCQllbHNlIGlmIChwZGV2LT5yZXZpc2lvbiA9PSAxKQorCQllbHNlIGlmIChwZGV2LT5yZXZpc2lvbiA9PSAxKSB7CiAJCQlwcGlbMF0gPSAmY21kX2luZm9bM107CisJCQlwcGlbMV0gPSAmY21kX2luZm9bM107CisJCX0KKwkJLyogcmV2cyAxLDIgaGF2ZSBubyBDTlRSTF9DSDAgKi8KKwkJaWYgKHBkZXYtPnJldmlzaW9uIDwgMykKKwkJCWNudHJsX2NoMF9vayA9IDA7CiAJfQogCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7CkBAIC0zNTQsNiArMzc0LDIwIEBACiAJbXJkbW9kZSB8PSAweDAyOwkvKiBNZW1vcnkgcmVhZCBsaW5lIGVuYWJsZSAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBNUkRNT0RFLCBtcmRtb2RlKTsKIAorCS8qIGNoZWNrIGZvciBlbmFibGVkIHBvcnRzICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgQ05UUkwsICZyZWcpOworCWlmICghcG9ydF9vaykKKwkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBkZXYtPmRldiwgIk1vYmlsaXR5IEJyaWRnZSBkZXRlY3RlZCwgaWdub3JpbmcgQ05UUkwgcG9ydCBlbmFibGUvZGlzYWJsZVxuIik7CisJaWYgKHBvcnRfb2sgJiYgY250cmxfY2gwX29rICYmICEocmVnICYgQ05UUkxfQ0gwKSkgeworCQlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmcGRldi0+ZGV2LCAiUHJpbWFyeSBwb3J0IGlzIGRpc2FibGVkXG4iKTsKKwkJcHBpWzBdID0gJmF0YV9kdW1teV9wb3J0X2luZm87CisKKwl9CisJaWYgKHBvcnRfb2sgJiYgIShyZWcgJiBDTlRSTF9DSDEpKSB7CisJCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZwZGV2LT5kZXYsICJTZWNvbmRhcnkgcG9ydCBpcyBkaXNhYmxlZFxuIik7CisJCXBwaVsxXSA9ICZhdGFfZHVtbXlfcG9ydF9pbmZvOworCX0KKwogCS8qIEZvcmNlIFBJTyAwIGhlcmUuLiAqLwogCiAJLyogUFBDIHNwZWNpZmljIGZpeHVwIGNvcGllZCBmcm9tIG9sZCBkcml2ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggOWUwZTRmYy4uNWQ1YmQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTM2Nyw3ICszNjcsNyBAQAogICoKICAqIFJldHVybnMgJnN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG9pbnRlciBvbiBzdWNjZXNzLCBvciBFUlJfUFRSKCkgb24gZXJyb3IuCiAgKi8KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdF9vcl9tb2R1bGUgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKAogCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKIAkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBudW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCBkYTJlZTlhLi41ZGFjMjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKQEAgLTY0LDcgKzY0LDggQEAKICAqLwogdm9pZCBkZXZpY2VfcG1faW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CisJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOworCWRldi0+cG93ZXIuaXNfc3VzcGVuZGVkID0gZmFsc2U7CiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCWNvbXBsZXRlX2FsbCgmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAlkZXYtPnBvd2VyLndha2V1cCA9IE5VTEw7CkBAIC05OCw3ICs5OSw3IEBACiAJcHJfZGVidWcoIlBNOiBBZGRpbmcgaW5mbyBmb3IgJXM6JXNcbiIsCiAJCSBkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsIGRldl9uYW1lKGRldikpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0JaWYgKGRldi0+cGFyZW50ICYmIGRldi0+cGFyZW50LT5wb3dlci5pbl9zdXNwZW5kKQorCWlmIChkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldl93YXJuKGRldiwgInBhcmVudCAlcyBzaG91bGQgbm90IGJlIHNsZWVwaW5nXG4iLAogCQkJZGV2X25hbWUoZGV2LT5wYXJlbnQpKTsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX2xpc3QpOwpAQCAtNTIxLDcgKzUyMiwxNCBAQAogCQlkcG1fd2FpdChkZXYtPnBhcmVudCwgYXN5bmMpOwogCWRldmljZV9sb2NrKGRldik7CiAKLQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkvKgorCSAqIFRoaXMgaXMgYSBmaWIuICBCdXQgd2UnbGwgYWxsb3cgbmV3IGNoaWxkcmVuIHRvIGJlIGFkZGVkIGJlbG93CisJICogYSByZXN1bWVkIGRldmljZSwgZXZlbiBpZiB0aGUgZGV2aWNlIGhhc24ndCBiZWVuIGNvbXBsZXRlZCB5ZXQuCisJICovCisJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOworCisJaWYgKCFkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCkKKwkJZ290byBVbmxvY2s7CiAKIAlpZiAoZGV2LT5wd3JfZG9tYWluKSB7CiAJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgInBvd2VyIGRvbWFpbiAiKTsKQEAgLTU1Nyw2ICs1NjUsOSBAQAogCX0KIAogIEVuZDoKKwlkZXYtPnBvd2VyLmlzX3N1c3BlbmRlZCA9IGZhbHNlOworCisgVW5sb2NrOgogCWRldmljZV91bmxvY2soZGV2KTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAKQEAgLTcwMCw3ICs3MTEsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkJZGV2LT5wb3dlci5pc19wcmVwYXJlZCA9IGZhbHNlOwogCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCkBAIC04NzcsMTEgKzg4OCwxMSBAQAogCWRldmljZV9sb2NrKGRldik7CiAKIAlpZiAoYXN5bmNfZXJyb3IpCi0JCWdvdG8gRW5kOworCQlnb3RvIFVubG9jazsKIAogCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7CiAJCWFzeW5jX2Vycm9yID0gLUVCVVNZOwotCQlnb3RvIEVuZDsKKwkJZ290byBVbmxvY2s7CiAJfQogCiAJaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnBtKSB7CkBAIC05MTksNiArOTMwLDkgQEAKIAl9CiAKICBFbmQ6CisJZGV2LT5wb3dlci5pc19zdXNwZW5kZWQgPSAhZXJyb3I7CisKKyBVbmxvY2s6CiAJZGV2aWNlX3VubG9jayhkZXYpOwogCiAJZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKQEAgLTEwODQsNyArMTA5OCw3IEBACiAJCQlwdXRfZGV2aWNlKGRldik7CiAJCQlicmVhazsKIAkJfQotCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSB0cnVlOworCQlkZXYtPnBvd2VyLmlzX3ByZXBhcmVkID0gdHJ1ZTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKIAkJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3ByZXBhcmVkX2xpc3QpOwogCQlwdXRfZGV2aWNlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2JyZC5jIGIvZHJpdmVycy9ibG9jay9icmQuYwppbmRleCBiN2Y1MWU0Li5jOTRiYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2JyZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYnJkLmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogCXN0cnVjdCBrb2JqZWN0ICprb2JqOwogCiAJbXV0ZXhfbG9jaygmYnJkX2RldmljZXNfbXV0ZXgpOwotCWJyZCA9IGJyZF9pbml0X29uZShkZXYgJiBNSU5PUk1BU0spOworCWJyZCA9IGJyZF9pbml0X29uZShNSU5PUihkZXYpID4+IHBhcnRfc2hpZnQpOwogCWtvYmogPSBicmQgPyBnZXRfZGlzayhicmQtPmJyZF9kaXNrKSA6IEVSUl9QVFIoLUVOT01FTSk7CiAJbXV0ZXhfdW5sb2NrKCZicmRfZGV2aWNlc19tdXRleCk7CiAKQEAgLTU4NSwxNSArNTg1LDE4IEBACiAJaWYgKG1heF9wYXJ0ID4gMCkKIAkJcGFydF9zaGlmdCA9IGZscyhtYXhfcGFydCk7CiAKKwlpZiAoKDFVTCA8PCBwYXJ0X3NoaWZ0KSA+IERJU0tfTUFYX1BBUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChyZF9uciA+IDFVTCA8PCAoTUlOT1JCSVRTIC0gcGFydF9zaGlmdCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHJkX25yKSB7CiAJCW5yID0gcmRfbnI7Ci0JCXJhbmdlID0gcmRfbnI7CisJCXJhbmdlID0gcmRfbnIgPDwgcGFydF9zaGlmdDsKIAl9IGVsc2UgewogCQluciA9IENPTkZJR19CTEtfREVWX1JBTV9DT1VOVDsKLQkJcmFuZ2UgPSAxVUwgPDwgKE1JTk9SQklUUyAtIHBhcnRfc2hpZnQpOworCQlyYW5nZSA9IDFVTCA8PCBNSU5PUkJJVFM7CiAJfQogCiAJaWYgKHJlZ2lzdGVyX2Jsa2RldihSQU1ESVNLX01BSk9SLCAicmFtZGlzayIpKQpAQCAtNjMyLDcgKzYzNSw3IEBACiAJdW5zaWduZWQgbG9uZyByYW5nZTsKIAlzdHJ1Y3QgYnJkX2RldmljZSAqYnJkLCAqbmV4dDsKIAotCXJhbmdlID0gcmRfbnIgPyByZF9uciA6ICAxVUwgPDwgKE1JTk9SQklUUyAtIHBhcnRfc2hpZnQpOworCXJhbmdlID0gcmRfbnIgPyByZF9uciA8PCBwYXJ0X3NoaWZ0IDogMVVMIDw8IE1JTk9SQklUUzsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicmQsIG5leHQsICZicmRfZGV2aWNlcywgYnJkX2xpc3QpCiAJCWJyZF9kZWxfb25lKGJyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IGEwNzZhMTQuLmM1OWE2NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC0xNjU4LDcgKzE2NTgsNyBAQAogCXN0cnVjdCBrb2JqZWN0ICprb2JqOwogCiAJbXV0ZXhfbG9jaygmbG9vcF9kZXZpY2VzX211dGV4KTsKLQlsbyA9IGxvb3BfaW5pdF9vbmUoZGV2ICYgTUlOT1JNQVNLKTsKKwlsbyA9IGxvb3BfaW5pdF9vbmUoTUlOT1IoZGV2KSA+PiBwYXJ0X3NoaWZ0KTsKIAlrb2JqID0gbG8gPyBnZXRfZGlzayhsby0+bG9fZGlzaykgOiBFUlJfUFRSKC1FTk9NRU0pOwogCW11dGV4X3VubG9jaygmbG9vcF9kZXZpY2VzX211dGV4KTsKIApAQCAtMTY5MSwxNSArMTY5MSwxOCBAQAogCWlmIChtYXhfcGFydCA+IDApCiAJCXBhcnRfc2hpZnQgPSBmbHMobWF4X3BhcnQpOwogCisJaWYgKCgxVUwgPDwgcGFydF9zaGlmdCkgPiBESVNLX01BWF9QQVJUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAobWF4X2xvb3AgPiAxVUwgPDwgKE1JTk9SQklUUyAtIHBhcnRfc2hpZnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChtYXhfbG9vcCkgewogCQluciA9IG1heF9sb29wOwotCQlyYW5nZSA9IG1heF9sb29wOworCQlyYW5nZSA9IG1heF9sb29wIDw8IHBhcnRfc2hpZnQ7CiAJfSBlbHNlIHsKIAkJbnIgPSA4OwotCQlyYW5nZSA9IDFVTCA8PCAoTUlOT1JCSVRTIC0gcGFydF9zaGlmdCk7CisJCXJhbmdlID0gMVVMIDw8IE1JTk9SQklUUzsKIAl9CiAKIAlpZiAocmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIikpCkBAIC0xNzM4LDcgKzE3NDEsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmFuZ2U7CiAJc3RydWN0IGxvb3BfZGV2aWNlICpsbywgKm5leHQ7CiAKLQlyYW5nZSA9IG1heF9sb29wID8gbWF4X2xvb3AgOiAgMVVMIDw8IChNSU5PUkJJVFMgLSBwYXJ0X3NoaWZ0KTsKKwlyYW5nZSA9IG1heF9sb29wID8gbWF4X2xvb3AgPDwgcGFydF9zaGlmdCA6IDFVTCA8PCBNSU5PUkJJVFM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG8sIG5leHQsICZsb29wX2RldmljZXMsIGxvX2xpc3QpCiAJCWxvb3BfZGVsX29uZShsbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCBlNmZjNzE2Li5hNTc2NDA2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC03NTYsNiArNzU2LDEyIEBACiAJaWYgKG1heF9wYXJ0ID4gMCkKIAkJcGFydF9zaGlmdCA9IGZscyhtYXhfcGFydCk7CiAKKwlpZiAoKDFVTCA8PCBwYXJ0X3NoaWZ0KSA+IERJU0tfTUFYX1BBUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuYmRzX21heCA+IDFVTCA8PCAoTUlOT1JCSVRTIC0gcGFydF9zaGlmdCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJZm9yIChpID0gMDsgaSA8IG5iZHNfbWF4OyBpKyspIHsKIAkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBhbGxvY19kaXNrKDEgPDwgcGFydF9zaGlmdCk7CiAJCWlmICghZGlzaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMKaW5kZXggODY5MGUzMS4uNDZiODEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCQlkaXNrLT5maXJzdF9taW5vciA9IHVuaXQ7CiAJCXN0cmNweShkaXNrLT5kaXNrX25hbWUsIGNkLT5uYW1lKTsJLyogdW1tLi4uICovCiAJCWRpc2stPmZvcHMgPSAmcGNkX2Jkb3BzOworCQlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS92aW9jZC5jIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCmluZGV4IGU0MjdmYmUuLjc4NzhkYTg5ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKQEAgLTYyNSw3ICs2MjUsOCBAQAogCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhxLCA0MDk2IC8gNTEyKTsKIAlnZW5kaXNrLT5xdWV1ZSA9IHE7CiAJZ2VuZGlzay0+Zm9wcyA9ICZ2aW9jZF9mb3BzOwotCWdlbmRpc2stPmZsYWdzID0gR0VOSERfRkxfQ0R8R0VOSERfRkxfUkVNT1ZBQkxFOworCWdlbmRpc2stPmZsYWdzID0gR0VOSERfRkxfQ0QgfCBHRU5IRF9GTF9SRU1PVkFCTEUgfAorCQkJIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFOwogCXNldF9jYXBhY2l0eShnZW5kaXNrLCAwKTsKIAlnZW5kaXNrLT5wcml2YXRlX2RhdGEgPSBkOwogCWQtPnZpb2NkX2Rpc2sgPSBnZW5kaXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2k4ay5jIGIvZHJpdmVycy9jaGFyL2k4ay5jCmluZGV4IGQ3MjQzM2YuLmVlMDE3MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pOGsuYworKysgYi9kcml2ZXJzL2NoYXIvaThrLmMKQEAgLTEzOSw4ICsxMzksOCBAQAogCQkibW92bCAlJWVkaSwyMCglJXJheClcblx0IgogCQkicG9wcSAlJXJkeFxuXHQiCiAJCSJtb3ZsICUlZWR4LDAoJSVyYXgpXG5cdCIKLQkJImxhaGZcblx0IgotCQkic2hybCAkOCwlJWVheFxuXHQiCisJCSJwdXNoZnFcblx0IgorCQkicG9wcSAlJXJheFxuXHQiCiAJCSJhbmRsICQxLCUlZWF4XG4iCiAJCToiPWEiKHJjKQogCQk6ICAgICJhIihyZWdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwppbmRleCAyMTlkODhhLi5kZGU2YTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwpAQCAtMTM5LDYgKzEzOSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJmRldi0+Y2JkZXYtPnF1ZXVlX2xvY2spOwogCiAJaWYgKGNicSAhPSBOVUxMKSB7CisJCWVyciA9IDA7CiAJCWNicS0+Y2FsbGJhY2sobXNnLCBuc3ApOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJY25fcXVldWVfcmVsZWFzZV9jYWxsYmFjayhjYnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwppbmRleCBkMzg0YmNhLi40OWNlNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZworKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwpAQCAtMTgzLDYgKzE4MywxNyBAQAogCSAgJ2ludGVyYWN0aXZlJyAtIFRoaXMgZHJpdmVyIGFkZHMgYSBkeW5hbWljIGNwdWZyZXEgcG9saWN5IGdvdmVybm9yCiAJICBkZXNpZ25lZCBmb3IgbGF0ZW5jeS1zZW5zaXRpdmUgd29ya2xvYWRzLgogCisJICBUaGlzIGdvdmVybm9yIGF0dGVtcHRzIHRvIHJlZHVjZSB0aGUgbGF0ZW5jeSBvZiBjbG9jaworCSAgaW5jcmVhc2VzIHNvIHRoYXQgdGhlIHN5c3RlbSBpcyBtb3JlIHJlc3BvbnNpdmUgdG8KKwkgIGludGVyYWN0aXZlIHdvcmtsb2Fkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3B1ZnJlcV9pbnRlcmFjdGl2ZS4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IGxpbnV4L0RvY3VtZW50YXRpb24vY3B1LWZyZXEuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIENQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkUKIAl0cmlzdGF0ZSAiJ2NvbnNlcnZhdGl2ZScgY3B1ZnJlcSBnb3Zlcm5vciIKIAlkZXBlbmRzIG9uIENQVV9GUkVRCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwppbmRleCAyZGFmYzVjLi43YzEwZjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKQEAgLTEyMDgsMTIgKzEyMDgsMjggQEAKIAkJY3B1ZnJlcV9kcml2ZXItPmV4aXQoZGF0YSk7CiAJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCisJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwkvKiB3aGVuIHRoZSBDUFUgd2hpY2ggaXMgdGhlIHBhcmVudCBvZiB0aGUga29iaiBpcyBob3RwbHVnZ2VkCisJICogb2ZmbGluZSwgY2hlY2sgZm9yIHNpYmxpbmdzLCBhbmQgY3JlYXRlIGNwdWZyZXEgc3lzZnMgaW50ZXJmYWNlCisJICogYW5kIHN5bWxpbmtzCisJICovCisJaWYgKHVubGlrZWx5KGNwdW1hc2tfd2VpZ2h0KGRhdGEtPmNwdXMpID4gMSkpIHsKKwkJLyogZmlyc3Qgc2libGluZyBub3cgb3ducyB0aGUgbmV3IHN5c2ZzIGRpciAqLworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGRhdGEtPmNwdXMpOworCQljcHVmcmVxX2FkZF9kZXYoZ2V0X2NwdV9zeXNkZXYoY3B1bWFza19maXJzdChkYXRhLT5jcHVzKSkpOworCisJCS8qIGZpbmFsbHkgcmVtb3ZlIG91ciBvd24gc3ltbGluayAqLworCQlsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOworCQlfX2NwdWZyZXFfcmVtb3ZlX2RldihzeXNfZGV2KTsKKwl9CisjZW5kaWYKKwogCWZyZWVfY3B1bWFza192YXIoZGF0YS0+cmVsYXRlZF9jcHVzKTsKIAlmcmVlX2NwdW1hc2tfdmFyKGRhdGEtPmNwdXMpOwogCWtmcmVlKGRhdGEpOwotCXBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YSwgY3B1KSA9IE5VTEw7CiAKLQljcHVmcmVxX2RlYnVnX2VuYWJsZV9yYXRlbGltaXQoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfaW50ZXJhY3RpdmUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2ludGVyYWN0aXZlLmMKaW5kZXggODE3ODMyOC4uMDZhZWE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfaW50ZXJhY3RpdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9pbnRlcmFjdGl2ZS5jCkBAIC0yMiwxMyArMjIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdXRpbWUuaD4KIAotc3RhdGljIHZvaWQgKCpwbV9pZGxlX29sZCkodm9pZCk7CiBzdGF0aWMgYXRvbWljX3QgYWN0aXZlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CiAKIHN0cnVjdCBjcHVmcmVxX2ludGVyYWN0aXZlX2NwdWluZm8gewpAQCAtNTYsMTAzICs1NywyNiBAQAogc3RhdGljIHNwaW5sb2NrX3QgdXBfY3B1bWFza19sb2NrOwogc3RhdGljIGNwdW1hc2tfdCBkb3duX2NwdW1hc2s7CiBzdGF0aWMgc3BpbmxvY2tfdCBkb3duX2NwdW1hc2tfbG9jazsKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggc2V0X3NwZWVkX2xvY2s7CiAKLS8qIEdvIHRvIG1heCBzcGVlZCB3aGVuIENQVSBsb2FkIGF0IG9yIGFib3ZlIHRoaXMgdmFsdWUuICovCi0jZGVmaW5lIERFRkFVTFRfR09fTUFYU1BFRURfTE9BRCA4NQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ29fbWF4c3BlZWRfbG9hZDsKKy8qIEhpIHNwZWVkIHRvIGJ1bXAgdG8gZnJvbSBsbyBzcGVlZCB3aGVuIGxvYWQgYnVyc3QgKGRlZmF1bHQgbWF4KSAqLworc3RhdGljIHU2NCBoaXNwZWVkX2ZyZXE7CisKKy8qIEdvIHRvIGhpIHNwZWVkIHdoZW4gQ1BVIGxvYWQgYXQgb3IgYWJvdmUgdGhpcyB2YWx1ZS4gKi8KKyNkZWZpbmUgREVGQVVMVF9HT19ISVNQRUVEX0xPQUQgOTUKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdvX2hpc3BlZWRfbG9hZDsKIAogLyoKICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRvIHNwZW5kIGF0IGEgZnJlcXVlbmN5IGJlZm9yZSB3ZSBjYW4gcmFtcCBkb3duLgogICovCi0jZGVmaW5lIERFRkFVTFRfTUlOX1NBTVBMRV9USU1FIDgwMDAwOworI2RlZmluZSBERUZBVUxUX01JTl9TQU1QTEVfVElNRSAyMCAqIFVTRUNfUEVSX01TRUMKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1pbl9zYW1wbGVfdGltZTsKIAotI2RlZmluZSBERUJVRyAwCi0jZGVmaW5lIEJVRlNaIDEyOAotCi0jaWYgREVCVUcKLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0KLXN0cnVjdCBkYmdsbiB7Ci0JaW50IGNwdTsKLQl1bnNpZ25lZCBsb25nIGppZmZ5OwotCXVuc2lnbmVkIGxvbmcgcnVuOwotCWNoYXIgYnVmW0JVRlNaXTsKLX07Ci0KLSNkZWZpbmUgTkRCR0xOUyAyNTYKLQotc3RhdGljIHN0cnVjdCBkYmdsbiBkYmdidWZbTkRCR0xOU107Ci1zdGF0aWMgaW50IGRiZ2J1ZnM7Ci1zdGF0aWMgaW50IGRiZ2J1ZmU7Ci1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSpkYmdfcHJvYzsKLXN0YXRpYyBzcGlubG9ja190IGRiZ3ByX2xvY2s7Ci0KLXN0YXRpYyB1NjQgdXBfcmVxdWVzdF90aW1lOwotc3RhdGljIHVuc2lnbmVkIGludCB1cF9tYXhfbGF0ZW5jeTsKLQotc3RhdGljIHZvaWQgZGJncHIoY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWludCBuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGJncHJfbG9jaywgZmxhZ3MpOwotCW4gPSBkYmdidWZlOwotICAgICAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgICAgICB2c25wcmludGYoZGJnYnVmW25dLmJ1ZiwgQlVGU1osIGZtdCwgYXJncyk7Ci0gICAgICAgIHZhX2VuZChhcmdzKTsKLQlkYmdidWZbbl0uY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWRiZ2J1ZltuXS5ydW4gPSBucl9ydW5uaW5nKCk7Ci0JZGJnYnVmW25dLmppZmZ5ID0gamlmZmllczsKLQotCWlmICgrK2RiZ2J1ZmUgPj0gTkRCR0xOUykKLQkJZGJnYnVmZSA9IDA7Ci0KLQlpZiAoZGJnYnVmZSA9PSBkYmdidWZzKQotCQlpZiAoKytkYmdidWZzID49IE5EQkdMTlMpCi0JCQlkYmdidWZzID0gMDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiZ3ByX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZGJnZHVtcCh2b2lkKQotewotCWludCBpLCBqOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RhdGljIHN0cnVjdCBkYmdsbiBwcmJ1ZltOREJHTE5TXTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkYmdwcl9sb2NrLCBmbGFncyk7Ci0JaSA9IGRiZ2J1ZnM7Ci0JaiA9IGRiZ2J1ZmU7Ci0JbWVtY3B5KHByYnVmLCBkYmdidWYsIHNpemVvZihkYmdidWYpKTsKLQlkYmdidWZzID0gMDsKLQlkYmdidWZlID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYmdwcl9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaSAhPSBqKQotCXsKLQkJcHJpbnRrKCIlbHUgJWQgJWx1ICVzIiwKLQkJICAgICAgIHByYnVmW2ldLmppZmZ5LCBwcmJ1ZltpXS5jcHUsIHByYnVmW2ldLnJ1biwKLQkJICAgICAgIHByYnVmW2ldLmJ1Zik7Ci0JCWlmICgrK2kgPT0gTkRCR0xOUykKLQkJCWkgPSAwOwotCX0KLX0KLQotc3RhdGljIGludCBkYmdfcHJvY19yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCQkgICAgICAgaW50IGNvdW50LCBpbnQgKnBlb2YsIHZvaWQgKmRhdCkKLXsKLQlwcmludGsoIm1heCB1cF90YXNrIGxhdGVuY3k9JXV1c1xuIiwgdXBfbWF4X2xhdGVuY3kpOwotCWRiZ2R1bXAoKTsKLQkqcGVvZiA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotI2Vsc2UKLSNkZWZpbmUgZGJncHIoLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgorLyoKKyAqIFRoZSBzYW1wbGUgcmF0ZSBvZiB0aGUgdGltZXIgdXNlZCB0byBpbmNyZWFzZSBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBERUZBVUxUX1RJTUVSX1JBVEUgMjAgKiBVU0VDX1BFUl9NU0VDCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl9yYXRlOwogCiBzdGF0aWMgaW50IGNwdWZyZXFfZ292ZXJub3JfaW50ZXJhY3RpdmUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCiAJCXVuc2lnbmVkIGludCBldmVudCk7CkBAIC0yMDIsMTYgKzEyNiw4IEBACiAJc21wX3dtYigpOwogCiAJLyogSWYgd2UgcmFjZWQgd2l0aCBjYW5jZWxsaW5nIGEgdGltZXIsIHNraXAuICovCi0JaWYgKCFpZGxlX2V4aXRfdGltZSkgewotCQlkYmdwcigidGltZXIgJWQ6IG5vIHZhbGlkIGlkbGUgZXhpdCBzYW1wbGVcbiIsIChpbnQpIGRhdGEpOworCWlmICghaWRsZV9leGl0X3RpbWUpCiAJCWdvdG8gZXhpdDsKLQl9Ci0KLSNpZiBERUJVRwotCWlmICgoaW50KSBqaWZmaWVzIC0gKGludCkgcGNwdS0+Y3B1X3RpbWVyLmV4cGlyZXMgPj0gMTApCi0JCWRiZ3ByKCJ0aW1lciAlZDogbGF0ZSBieSAlZCB0aWNrc1xuIiwKLQkJICAgICAgKGludCkgZGF0YSwgamlmZmllcyAtIHBjcHUtPmNwdV90aW1lci5leHBpcmVzKTsKLSNlbmRpZgogCiAJZGVsdGFfaWRsZSA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIobm93X2lkbGUsIHRpbWVfaW5faWRsZSk7CiAJZGVsdGFfdGltZSA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIocGNwdS0+dGltZXJfcnVuX3RpbWUsCkBAIC0yMjAsMTEgKzEzNiw4IEBACiAJLyoKIAkgKiBJZiB0aW1lciByYW4gbGVzcyB0aGFuIDFtcyBhZnRlciBzaG9ydC10ZXJtIHNhbXBsZSBzdGFydGVkLCByZXRyeS4KIAkgKi8KLQlpZiAoZGVsdGFfdGltZSA8IDEwMDApIHsKLQkJZGJncHIoInRpbWVyICVkOiB0aW1lIGRlbHRhICV1IHRvbyBzaG9ydCBleGl0PSVsbHUgbm93PSVsbHVcbiIsIChpbnQpIGRhdGEsCi0JCSAgICAgIGRlbHRhX3RpbWUsIGlkbGVfZXhpdF90aW1lLCBwY3B1LT50aW1lcl9ydW5fdGltZSk7CisJaWYgKGRlbHRhX3RpbWUgPCAxMDAwKQogCQlnb3RvIHJlYXJtOwotCX0KIAogCWlmIChkZWx0YV9pZGxlID4gZGVsdGFfdGltZSkKIAkJY3B1X2xvYWQgPSAwOwpAQCAtMjMyLDExICsxNDUsMTEgQEAKIAkJY3B1X2xvYWQgPSAxMDAgKiAoZGVsdGFfdGltZSAtIGRlbHRhX2lkbGUpIC8gZGVsdGFfdGltZTsKIAogCWRlbHRhX2lkbGUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKG5vd19pZGxlLAotCQkJCQkJIHBjcHUtPmZyZXFfY2hhbmdlX3RpbWVfaW5faWRsZSk7CisJCQkJCQlwY3B1LT5mcmVxX2NoYW5nZV90aW1lX2luX2lkbGUpOwogCWRlbHRhX3RpbWUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKHBjcHUtPnRpbWVyX3J1bl90aW1lLAogCQkJCQkJICBwY3B1LT5mcmVxX2NoYW5nZV90aW1lKTsKIAotCWlmIChkZWx0YV9pZGxlID4gZGVsdGFfdGltZSkKKwlpZiAoKGRlbHRhX3RpbWUgPT0gMCkgfHwgKGRlbHRhX2lkbGUgPiBkZWx0YV90aW1lKSkKIAkJbG9hZF9zaW5jZV9jaGFuZ2UgPSAwOwogCWVsc2UKIAkJbG9hZF9zaW5jZV9jaGFuZ2UgPQpAQCAtMjUwLDQwICsxNjMsMzggQEAKIAlpZiAobG9hZF9zaW5jZV9jaGFuZ2UgPiBjcHVfbG9hZCkKIAkJY3B1X2xvYWQgPSBsb2FkX3NpbmNlX2NoYW5nZTsKIAotCWlmIChjcHVfbG9hZCA+PSBnb19tYXhzcGVlZF9sb2FkKQotCQluZXdfZnJlcSA9IHBjcHUtPnBvbGljeS0+bWF4OwotCWVsc2UKLQkJbmV3X2ZyZXEgPSBwY3B1LT5wb2xpY3ktPm1heCAqIGNwdV9sb2FkIC8gMTAwOworCWlmIChjcHVfbG9hZCA+PSBnb19oaXNwZWVkX2xvYWQpIHsKKwkJaWYgKHBjcHUtPnBvbGljeS0+Y3VyID09IHBjcHUtPnBvbGljeS0+bWluKQorCQkJbmV3X2ZyZXEgPSBoaXNwZWVkX2ZyZXE7CisJCWVsc2UKKwkJCW5ld19mcmVxID0gcGNwdS0+cG9saWN5LT5tYXggKiBjcHVfbG9hZCAvIDEwMDsKKwl9IGVsc2UgeworCQluZXdfZnJlcSA9IHBjcHUtPnBvbGljeS0+Y3VyICogY3B1X2xvYWQgLyAxMDA7CisJfQogCiAJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwY3B1LT5wb2xpY3ksIHBjcHUtPmZyZXFfdGFibGUsCiAJCQkJCSAgIG5ld19mcmVxLCBDUFVGUkVRX1JFTEFUSU9OX0gsCiAJCQkJCSAgICZpbmRleCkpIHsKLQkJZGJncHIoInRpbWVyICVkOiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQgZXJyb3JcbiIsIChpbnQpIGRhdGEpOworCQlwcl93YXJuX29uY2UoInRpbWVyICVkOiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQgZXJyb3JcbiIsCisJCQkgICAgIChpbnQpIGRhdGEpOwogCQlnb3RvIHJlYXJtOwogCX0KIAogCW5ld19mcmVxID0gcGNwdS0+ZnJlcV90YWJsZVtpbmRleF0uZnJlcXVlbmN5OwogCiAJaWYgKHBjcHUtPnRhcmdldF9mcmVxID09IG5ld19mcmVxKQotCXsKLQkJZGJncHIoInRpbWVyICVkOiBsb2FkPSVkLCBhbHJlYWR5IGF0ICVkXG4iLCAoaW50KSBkYXRhLCBjcHVfbG9hZCwgbmV3X2ZyZXEpOwogCQlnb3RvIHJlYXJtX2lmX25vdG1heDsKLQl9CiAKIAkvKgogCSAqIERvIG5vdCBzY2FsZSBkb3duIHVubGVzcyB3ZSBoYXZlIGJlZW4gYXQgdGhpcyBmcmVxdWVuY3kgZm9yIHRoZQogCSAqIG1pbmltdW0gc2FtcGxlIHRpbWUuCiAJICovCiAJaWYgKG5ld19mcmVxIDwgcGNwdS0+dGFyZ2V0X2ZyZXEpIHsKLQkJaWYgKGNwdXRpbWU2NF9zdWIocGNwdS0+dGltZXJfcnVuX3RpbWUsIHBjcHUtPmZyZXFfY2hhbmdlX3RpbWUpIDwKLQkJICAgIG1pbl9zYW1wbGVfdGltZSkgewotCQkJZGJncHIoInRpbWVyICVkOiBsb2FkPSVkIGN1cj0lZCB0Z3Q9JWQgbm90IHlldFxuIiwgKGludCkgZGF0YSwgY3B1X2xvYWQsIHBjcHUtPnRhcmdldF9mcmVxLCBuZXdfZnJlcSk7CisJCWlmIChjcHV0aW1lNjRfc3ViKHBjcHUtPnRpbWVyX3J1bl90aW1lLCBwY3B1LT5mcmVxX2NoYW5nZV90aW1lKQorCQkgICAgPCBtaW5fc2FtcGxlX3RpbWUpCiAJCQlnb3RvIHJlYXJtOwotCQl9CiAJfQogCi0JZGJncHIoInRpbWVyICVkOiBsb2FkPSVkIGN1cj0lZCB0Z3Q9JWQgcXVldWVcbiIsIChpbnQpIGRhdGEsIGNwdV9sb2FkLCBwY3B1LT50YXJnZXRfZnJlcSwgbmV3X2ZyZXEpOwotCiAJaWYgKG5ld19mcmVxIDwgcGNwdS0+dGFyZ2V0X2ZyZXEpIHsKIAkJcGNwdS0+dGFyZ2V0X2ZyZXEgPSBuZXdfZnJlcTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRvd25fY3B1bWFza19sb2NrLCBmbGFncyk7CkBAIC0yOTIsOSArMjAzLDYgQEAKIAkJcXVldWVfd29yayhkb3duX3dxLCAmZnJlcV9zY2FsZV9kb3duX3dvcmspOwogCX0gZWxzZSB7CiAJCXBjcHUtPnRhcmdldF9mcmVxID0gbmV3X2ZyZXE7Ci0jaWYgREVCVUcKLQkJdXBfcmVxdWVzdF90aW1lID0ga3RpbWVfdG9fdXMoa3RpbWVfZ2V0KCkpOwotI2VuZGlmCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ1cF9jcHVtYXNrX2xvY2ssIGZsYWdzKTsKIAkJY3B1bWFza19zZXRfY3B1KGRhdGEsICZ1cF9jcHVtYXNrKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBfY3B1bWFza19sb2NrLCBmbGFncyk7CkBAIC0zMTksMzQgKzIyNywzMCBAQAogCQlpZiAocGNwdS0+dGFyZ2V0X2ZyZXEgPT0gcGNwdS0+cG9saWN5LT5taW4pIHsKIAkJCXNtcF9ybWIoKTsKIAotCQkJaWYgKHBjcHUtPmlkbGluZykgewotCQkJCWRiZ3ByKCJ0aW1lciAlZDogY3B1IGlkbGUsIGRvbid0IHJlLWFybVxuIiwgKGludCkgZGF0YSk7CisJCQlpZiAocGNwdS0+aWRsaW5nKQogCQkJCWdvdG8gZXhpdDsKLQkJCX0KIAogCQkJcGNwdS0+dGltZXJfaWRsZWNhbmNlbCA9IDE7CiAJCX0KIAogCQlwY3B1LT50aW1lX2luX2lkbGUgPSBnZXRfY3B1X2lkbGVfdGltZV91cygKIAkJCWRhdGEsICZwY3B1LT5pZGxlX2V4aXRfdGltZSk7Ci0JCW1vZF90aW1lcigmcGNwdS0+Y3B1X3RpbWVyLCBqaWZmaWVzICsgMik7Ci0JCWRiZ3ByKCJ0aW1lciAlZDogc2V0IHRpbWVyIGZvciAlbHUgZXhpdD0lbGx1XG4iLCAoaW50KSBkYXRhLCBwY3B1LT5jcHVfdGltZXIuZXhwaXJlcywgcGNwdS0+aWRsZV9leGl0X3RpbWUpOworCQltb2RfdGltZXIoJnBjcHUtPmNwdV90aW1lciwKKwkJCSAgamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXModGltZXJfcmF0ZSkpOwogCX0KIAogZXhpdDoKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGNwdWZyZXFfaW50ZXJhY3RpdmVfaWRsZSh2b2lkKQorc3RhdGljIHZvaWQgY3B1ZnJlcV9pbnRlcmFjdGl2ZV9pZGxlX3N0YXJ0KHZvaWQpCiB7CiAJc3RydWN0IGNwdWZyZXFfaW50ZXJhY3RpdmVfY3B1aW5mbyAqcGNwdSA9CiAJCSZwZXJfY3B1KGNwdWluZm8sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaW50IHBlbmRpbmc7CiAKLQlpZiAoIXBjcHUtPmdvdmVybm9yX2VuYWJsZWQpIHsKLQkJcG1faWRsZV9vbGQoKTsKKwlpZiAoIXBjcHUtPmdvdmVybm9yX2VuYWJsZWQpCiAJCXJldHVybjsKLQl9CiAKIAlwY3B1LT5pZGxpbmcgPSAxOwogCXNtcF93bWIoKTsKQEAgLTM2NiwxMCArMjcwLDggQEAKIAkJCXBjcHUtPnRpbWVfaW5faWRsZSA9IGdldF9jcHVfaWRsZV90aW1lX3VzKAogCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgJnBjcHUtPmlkbGVfZXhpdF90aW1lKTsKIAkJCXBjcHUtPnRpbWVyX2lkbGVjYW5jZWwgPSAwOwotCQkJbW9kX3RpbWVyKCZwY3B1LT5jcHVfdGltZXIsIGppZmZpZXMgKyAyKTsKLQkJCWRiZ3ByKCJpZGxlOiBlbnRlciBhdCAlZCwgc2V0IHRpbWVyIGZvciAlbHUgZXhpdD0lbGx1XG4iLAotCQkJICAgICAgcGNwdS0+dGFyZ2V0X2ZyZXEsIHBjcHUtPmNwdV90aW1lci5leHBpcmVzLAotCQkJICAgICAgcGNwdS0+aWRsZV9leGl0X3RpbWUpOworCQkJbW9kX3RpbWVyKCZwY3B1LT5jcHVfdGltZXIsCisJCQkJICBqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyh0aW1lcl9yYXRlKSk7CiAJCX0KICNlbmRpZgogCX0gZWxzZSB7CkBAIC0zODAsNyArMjgyLDYgQEAKIAkJICogQ1BVIGRpZG4ndCBnbyBidXN5OyB3ZSdsbCByZWNoZWNrIHRoaW5ncyB1cG9uIGlkbGUgZXhpdC4KIAkJICovCiAJCWlmIChwZW5kaW5nICYmIHBjcHUtPnRpbWVyX2lkbGVjYW5jZWwpIHsKLQkJCWRiZ3ByKCJpZGxlOiBjYW5jZWwgdGltZXIgZm9yICVsdVxuIiwgcGNwdS0+Y3B1X3RpbWVyLmV4cGlyZXMpOwogCQkJZGVsX3RpbWVyKCZwY3B1LT5jcHVfdGltZXIpOwogCQkJLyoKIAkJCSAqIEVuc3VyZSBsYXN0IHRpbWVyIHJ1biB0aW1lIGlzIGFmdGVyIGN1cnJlbnQgaWRsZQpAQCAtMzkyLDcgKzI5MywxMyBAQAogCQl9CiAJfQogCi0JcG1faWRsZV9vbGQoKTsKK30KKworc3RhdGljIHZvaWQgY3B1ZnJlcV9pbnRlcmFjdGl2ZV9pZGxlX2VuZCh2b2lkKQoreworCXN0cnVjdCBjcHVmcmVxX2ludGVyYWN0aXZlX2NwdWluZm8gKnBjcHUgPQorCQkmcGVyX2NwdShjcHVpbmZvLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCiAJcGNwdS0+aWRsaW5nID0gMDsKIAlzbXBfd21iKCk7CiAKQEAgLTQxNCwxNCArMzIxLDggQEAKIAkJCWdldF9jcHVfaWRsZV90aW1lX3VzKHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkJCQkJICAgICAmcGNwdS0+aWRsZV9leGl0X3RpbWUpOwogCQlwY3B1LT50aW1lcl9pZGxlY2FuY2VsID0gMDsKLQkJbW9kX3RpbWVyKCZwY3B1LT5jcHVfdGltZXIsIGppZmZpZXMgKyAyKTsKLQkJZGJncHIoImlkbGU6IGV4aXQsIHNldCB0aW1lciBmb3IgJWx1IGV4aXQ9JWxsdVxuIiwgcGNwdS0+Y3B1X3RpbWVyLmV4cGlyZXMsIHBjcHUtPmlkbGVfZXhpdF90aW1lKTsKLSNpZiBERUJVRwotCX0gZWxzZSBpZiAodGltZXJfcGVuZGluZygmcGNwdS0+Y3B1X3RpbWVyKSA9PSAwICYmCi0JCSAgIHBjcHUtPnRpbWVyX3J1bl90aW1lIDwgcGNwdS0+aWRsZV9leGl0X3RpbWUpIHsKLQkJZGJncHIoImlkbGU6IHRpbWVyIG5vdCBydW4geWV0OiBleGl0PSVsbHUgdG1ycnVuPSVsbHVcbiIsCi0JCSAgICAgIHBjcHUtPmlkbGVfZXhpdF90aW1lLCBwY3B1LT50aW1lcl9ydW5fdGltZSk7Ci0jZW5kaWYKKwkJbW9kX3RpbWVyKCZwY3B1LT5jcHVfdGltZXIsCisJCQkgIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRpbWVyX3JhdGUpKTsKIAl9CiAKIH0KQEAgLTQzMywxMiArMzM0LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjcHVmcmVxX2ludGVyYWN0aXZlX2NwdWluZm8gKnBjcHU7CiAKLSNpZiBERUJVRwotCXU2NCBub3c7Ci0JdTY0IHRoZW47Ci0JdW5zaWduZWQgaW50IGxhdDsKLSNlbmRpZgotCiAJd2hpbGUgKDEpIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwX2NwdW1hc2tfbG9jaywgZmxhZ3MpOwpAQCAtNDU1LDQyICszNTAsNDAgQEAKIAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCi0jaWYgREVCVUcKLQkJdGhlbiA9IHVwX3JlcXVlc3RfdGltZTsKLQkJbm93ID0ga3RpbWVfdG9fdXMoa3RpbWVfZ2V0KCkpOwotCi0JCWlmIChub3cgPiB0aGVuKSB7Ci0JCQlsYXQgPSBrdGltZV90b191cyhrdGltZV9nZXQoKSkgLSB0aGVuOwotCi0JCQlpZiAobGF0ID4gdXBfbWF4X2xhdGVuY3kpCi0JCQkJdXBfbWF4X2xhdGVuY3kgPSBsYXQ7Ci0JCX0KLSNlbmRpZgotCiAJCXRtcF9tYXNrID0gdXBfY3B1bWFzazsKIAkJY3B1bWFza19jbGVhcigmdXBfY3B1bWFzayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwX2NwdW1hc2tfbG9jaywgZmxhZ3MpOwogCiAJCWZvcl9lYWNoX2NwdShjcHUsICZ0bXBfbWFzaykgewotCQkJcGNwdSA9ICZwZXJfY3B1KGNwdWluZm8sIGNwdSk7CisJCQl1bnNpZ25lZCBpbnQgajsKKwkJCXVuc2lnbmVkIGludCBtYXhfZnJlcSA9IDA7CiAKLQkJCWlmIChucl9ydW5uaW5nKCkgPT0gMSkgewotCQkJCWRiZ3ByKCJ1cCAlZDogdGd0PSVkIG5vdGhpbmcgZWxzZSBydW5uaW5nXG4iLCBjcHUsCi0JCQkJICAgICAgcGNwdS0+dGFyZ2V0X2ZyZXEpOwotCQkJfQorCQkJcGNwdSA9ICZwZXJfY3B1KGNwdWluZm8sIGNwdSk7CiAKIAkJCXNtcF9ybWIoKTsKIAogCQkJaWYgKCFwY3B1LT5nb3Zlcm5vcl9lbmFibGVkKQogCQkJCWNvbnRpbnVlOwogCi0JCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwY3B1LT5wb2xpY3ksCi0JCQkJCQlwY3B1LT50YXJnZXRfZnJlcSwKLQkJCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7CisJCQltdXRleF9sb2NrKCZzZXRfc3BlZWRfbG9jayk7CisKKwkJCWZvcl9lYWNoX2NwdShqLCBwY3B1LT5wb2xpY3ktPmNwdXMpIHsKKwkJCQlzdHJ1Y3QgY3B1ZnJlcV9pbnRlcmFjdGl2ZV9jcHVpbmZvICpwamNwdSA9CisJCQkJCSZwZXJfY3B1KGNwdWluZm8sIGopOworCisJCQkJaWYgKHBqY3B1LT50YXJnZXRfZnJlcSA+IG1heF9mcmVxKQorCQkJCQltYXhfZnJlcSA9IHBqY3B1LT50YXJnZXRfZnJlcTsKKwkJCX0KKworCQkJaWYgKG1heF9mcmVxICE9IHBjcHUtPnBvbGljeS0+Y3VyKQorCQkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBjcHUtPnBvbGljeSwKKwkJCQkJCQltYXhfZnJlcSwKKwkJCQkJCQlDUFVGUkVRX1JFTEFUSU9OX0gpOworCQkJbXV0ZXhfdW5sb2NrKCZzZXRfc3BlZWRfbG9jayk7CisKIAkJCXBjcHUtPmZyZXFfY2hhbmdlX3RpbWVfaW5faWRsZSA9CiAJCQkJZ2V0X2NwdV9pZGxlX3RpbWVfdXMoY3B1LAogCQkJCQkJICAgICAmcGNwdS0+ZnJlcV9jaGFuZ2VfdGltZSk7Ci0JCQlkYmdwcigidXAgJWQ6IHNldCB0Z3Q9JWQgKGFjdHVhbD0lZClcbiIsIGNwdSwgcGNwdS0+dGFyZ2V0X2ZyZXEsIHBjcHUtPnBvbGljeS0+Y3VyKTsKIAkJfQogCX0KIApAQCAtNTEwLDM3ICs0MDMsODEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb3duX2NwdW1hc2tfbG9jaywgZmxhZ3MpOwogCiAJZm9yX2VhY2hfY3B1KGNwdSwgJnRtcF9tYXNrKSB7Ci0JCXBjcHUgPSAmcGVyX2NwdShjcHVpbmZvLCBjcHUpOworCQl1bnNpZ25lZCBpbnQgajsKKwkJdW5zaWduZWQgaW50IG1heF9mcmVxID0gMDsKIAorCQlwY3B1ID0gJnBlcl9jcHUoY3B1aW5mbywgY3B1KTsKIAkJc21wX3JtYigpOwogCiAJCWlmICghcGNwdS0+Z292ZXJub3JfZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwogCi0JCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBjcHUtPnBvbGljeSwKLQkJCQkJcGNwdS0+dGFyZ2V0X2ZyZXEsCi0JCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7CisJCW11dGV4X2xvY2soJnNldF9zcGVlZF9sb2NrKTsKKworCQlmb3JfZWFjaF9jcHUoaiwgcGNwdS0+cG9saWN5LT5jcHVzKSB7CisJCQlzdHJ1Y3QgY3B1ZnJlcV9pbnRlcmFjdGl2ZV9jcHVpbmZvICpwamNwdSA9CisJCQkJJnBlcl9jcHUoY3B1aW5mbywgaik7CisKKwkJCWlmIChwamNwdS0+dGFyZ2V0X2ZyZXEgPiBtYXhfZnJlcSkKKwkJCQltYXhfZnJlcSA9IHBqY3B1LT50YXJnZXRfZnJlcTsKKwkJfQorCisJCWlmIChtYXhfZnJlcSAhPSBwY3B1LT5wb2xpY3ktPmN1cikKKwkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBjcHUtPnBvbGljeSwgbWF4X2ZyZXEsCisJCQkJCQlDUFVGUkVRX1JFTEFUSU9OX0gpOworCisJCW11dGV4X3VubG9jaygmc2V0X3NwZWVkX2xvY2spOwogCQlwY3B1LT5mcmVxX2NoYW5nZV90aW1lX2luX2lkbGUgPQogCQkJZ2V0X2NwdV9pZGxlX3RpbWVfdXMoY3B1LAogCQkJCQkgICAgICZwY3B1LT5mcmVxX2NoYW5nZV90aW1lKTsKLQkJZGJncHIoImRvd24gJWQ6IHNldCB0Z3Q9JWQgKGFjdHVhbD0lZClcbiIsIGNwdSwgcGNwdS0+dGFyZ2V0X2ZyZXEsIHBjcHUtPnBvbGljeS0+Y3VyKTsKIAl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZ29fbWF4c3BlZWRfbG9hZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaGlzcGVlZF9mcmVxKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgaGlzcGVlZF9mcmVxKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfaGlzcGVlZF9mcmVxKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJdTY0IHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsbChidWYsIDAsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWhpc3BlZWRfZnJlcSA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2xvYmFsX2F0dHIgaGlzcGVlZF9mcmVxX2F0dHIgPSBfX0FUVFIoaGlzcGVlZF9mcmVxLCAwNjQ0LAorCQlzaG93X2hpc3BlZWRfZnJlcSwgc3RvcmVfaGlzcGVlZF9mcmVxKTsKKworCitzdGF0aWMgc3NpemVfdCBzaG93X2dvX2hpc3BlZWRfbG9hZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGdvX21heHNwZWVkX2xvYWQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgZ29faGlzcGVlZF9sb2FkKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfZ29fbWF4c3BlZWRfbG9hZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2dvX2hpc3BlZWRfbG9hZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXJldHVybiBzdHJpY3Rfc3RydG91bChidWYsIDAsICZnb19tYXhzcGVlZF9sb2FkKTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlnb19oaXNwZWVkX2xvYWQgPSB2YWw7CisJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGdsb2JhbF9hdHRyIGdvX21heHNwZWVkX2xvYWRfYXR0ciA9IF9fQVRUUihnb19tYXhzcGVlZF9sb2FkLCAwNjQ0LAotCQlzaG93X2dvX21heHNwZWVkX2xvYWQsIHN0b3JlX2dvX21heHNwZWVkX2xvYWQpOworc3RhdGljIHN0cnVjdCBnbG9iYWxfYXR0ciBnb19oaXNwZWVkX2xvYWRfYXR0ciA9IF9fQVRUUihnb19oaXNwZWVkX2xvYWQsIDA2NDQsCisJCXNob3dfZ29faGlzcGVlZF9sb2FkLCBzdG9yZV9nb19oaXNwZWVkX2xvYWQpOwogCiBzdGF0aWMgc3NpemVfdCBzaG93X21pbl9zYW1wbGVfdGltZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC01NTEsMTUgKzQ4OCw0NiBAQAogc3RhdGljIHNzaXplX3Qgc3RvcmVfbWluX3NhbXBsZV90aW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJm1pbl9zYW1wbGVfdGltZSk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbWluX3NhbXBsZV90aW1lID0gdmFsOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHN0cnVjdCBnbG9iYWxfYXR0ciBtaW5fc2FtcGxlX3RpbWVfYXR0ciA9IF9fQVRUUihtaW5fc2FtcGxlX3RpbWUsIDA2NDQsCiAJCXNob3dfbWluX3NhbXBsZV90aW1lLCBzdG9yZV9taW5fc2FtcGxlX3RpbWUpOwogCitzdGF0aWMgc3NpemVfdCBzaG93X3RpbWVyX3JhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCB0aW1lcl9yYXRlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfdGltZXJfcmF0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXRpbWVyX3JhdGUgPSB2YWw7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGdsb2JhbF9hdHRyIHRpbWVyX3JhdGVfYXR0ciA9IF9fQVRUUih0aW1lcl9yYXRlLCAwNjQ0LAorCQlzaG93X3RpbWVyX3JhdGUsIHN0b3JlX3RpbWVyX3JhdGUpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW50ZXJhY3RpdmVfYXR0cmlidXRlc1tdID0gewotCSZnb19tYXhzcGVlZF9sb2FkX2F0dHIuYXR0ciwKKwkmaGlzcGVlZF9mcmVxX2F0dHIuYXR0ciwKKwkmZ29faGlzcGVlZF9sb2FkX2F0dHIuYXR0ciwKIAkmbWluX3NhbXBsZV90aW1lX2F0dHIuYXR0ciwKKwkmdGltZXJfcmF0ZV9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTU2OCwyNiArNTM2LDM3IEBACiAJLm5hbWUgPSAiaW50ZXJhY3RpdmUiLAogfTsKIAotc3RhdGljIGludCBjcHVmcmVxX2dvdmVybm9yX2ludGVyYWN0aXZlKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqbmV3X3BvbGljeSwKK3N0YXRpYyBpbnQgY3B1ZnJlcV9nb3Zlcm5vcl9pbnRlcmFjdGl2ZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJdW5zaWduZWQgaW50IGV2ZW50KQogewogCWludCByYzsKLQlzdHJ1Y3QgY3B1ZnJlcV9pbnRlcmFjdGl2ZV9jcHVpbmZvICpwY3B1ID0KLQkJJnBlcl9jcHUoY3B1aW5mbywgbmV3X3BvbGljeS0+Y3B1KTsKKwl1bnNpZ25lZCBpbnQgajsKKwlzdHJ1Y3QgY3B1ZnJlcV9pbnRlcmFjdGl2ZV9jcHVpbmZvICpwY3B1OworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIENQVUZSRVFfR09WX1NUQVJUOgotCQlpZiAoIWNwdV9vbmxpbmUobmV3X3BvbGljeS0+Y3B1KSkKKwkJaWYgKCFjcHVfb25saW5lKHBvbGljeS0+Y3B1KSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXBjcHUtPnBvbGljeSA9IG5ld19wb2xpY3k7Ci0JCXBjcHUtPmZyZXFfdGFibGUgPSBjcHVmcmVxX2ZyZXF1ZW5jeV9nZXRfdGFibGUobmV3X3BvbGljeS0+Y3B1KTsKLQkJcGNwdS0+dGFyZ2V0X2ZyZXEgPSBuZXdfcG9saWN5LT5jdXI7Ci0JCXBjcHUtPmZyZXFfY2hhbmdlX3RpbWVfaW5faWRsZSA9Ci0JCQlnZXRfY3B1X2lkbGVfdGltZV91cyhuZXdfcG9saWN5LT5jcHUsCisJCWZyZXFfdGFibGUgPQorCQkJY3B1ZnJlcV9mcmVxdWVuY3lfZ2V0X3RhYmxlKHBvbGljeS0+Y3B1KTsKKworCQlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7CisJCQlwY3B1ID0gJnBlcl9jcHUoY3B1aW5mbywgaik7CisJCQlwY3B1LT5wb2xpY3kgPSBwb2xpY3k7CisJCQlwY3B1LT50YXJnZXRfZnJlcSA9IHBvbGljeS0+Y3VyOworCQkJcGNwdS0+ZnJlcV90YWJsZSA9IGZyZXFfdGFibGU7CisJCQlwY3B1LT5mcmVxX2NoYW5nZV90aW1lX2luX2lkbGUgPQorCQkJCWdldF9jcHVfaWRsZV90aW1lX3VzKGosCiAJCQkJCSAgICAgJnBjcHUtPmZyZXFfY2hhbmdlX3RpbWUpOwotCQlwY3B1LT5nb3Zlcm5vcl9lbmFibGVkID0gMTsKLQkJc21wX3dtYigpOworCQkJcGNwdS0+Z292ZXJub3JfZW5hYmxlZCA9IDE7CisJCQlzbXBfd21iKCk7CisJCX0KKworCQlpZiAoIWhpc3BlZWRfZnJlcSkKKwkJCWhpc3BlZWRfZnJlcSA9IHBvbGljeS0+bWF4OworCiAJCS8qCiAJCSAqIERvIG5vdCByZWdpc3RlciB0aGUgaWRsZSBob29rIGFuZCBjcmVhdGUgc3lzZnMKIAkJICogZW50cmllcyBpZiB3ZSBoYXZlIGFscmVhZHkgZG9uZSBzby4KQEAgLTYwMCw1MiArNTc5LDc0IEBACiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAotCQlwbV9pZGxlX29sZCA9IHBtX2lkbGU7Ci0JCXBtX2lkbGUgPSBjcHVmcmVxX2ludGVyYWN0aXZlX2lkbGU7CiAJCWJyZWFrOwogCiAJY2FzZSBDUFVGUkVRX0dPVl9TVE9QOgotCQlwY3B1LT5nb3Zlcm5vcl9lbmFibGVkID0gMDsKLQkJc21wX3dtYigpOwotCQlkZWxfdGltZXJfc3luYygmcGNwdS0+Y3B1X3RpbWVyKTsKLQkJZmx1c2hfd29yaygmZnJlcV9zY2FsZV9kb3duX3dvcmspOwotCQkvKgotCQkgKiBSZXNldCBpZGxlIGV4aXQgdGltZSBzaW5jZSB3ZSBtYXkgY2FuY2VsIHRoZSB0aW1lcgotCQkgKiBiZWZvcmUgaXQgY2FuIHJ1biBhZnRlciB0aGUgbGFzdCBpZGxlIGV4aXQgdGltZSwKLQkJICogdG8gYXZvaWQgdHJpcHBpbmcgdGhlIGNoZWNrIGluIGlkbGUgZXhpdCBmb3IgYSB0aW1lcgotCQkgKiB0aGF0IGlzIHRyeWluZyB0byBydW4uCi0JCSAqLwotCQlwY3B1LT5pZGxlX2V4aXRfdGltZSA9IDA7CisJCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKKwkJCXBjcHUgPSAmcGVyX2NwdShjcHVpbmZvLCBqKTsKKwkJCXBjcHUtPmdvdmVybm9yX2VuYWJsZWQgPSAwOworCQkJc21wX3dtYigpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBjcHUtPmNwdV90aW1lcik7CiAKKwkJCS8qCisJCQkgKiBSZXNldCBpZGxlIGV4aXQgdGltZSBzaW5jZSB3ZSBtYXkgY2FuY2VsIHRoZSB0aW1lcgorCQkJICogYmVmb3JlIGl0IGNhbiBydW4gYWZ0ZXIgdGhlIGxhc3QgaWRsZSBleGl0IHRpbWUsCisJCQkgKiB0byBhdm9pZCB0cmlwcGluZyB0aGUgY2hlY2sgaW4gaWRsZSBleGl0IGZvciBhIHRpbWVyCisJCQkgKiB0aGF0IGlzIHRyeWluZyB0byBydW4uCisJCQkgKi8KKwkJCXBjcHUtPmlkbGVfZXhpdF90aW1lID0gMDsKKwkJfQorCisJCWZsdXNoX3dvcmsoJmZyZXFfc2NhbGVfZG93bl93b3JrKTsKIAkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZhY3RpdmVfY291bnQpID4gMCkKIAkJCXJldHVybiAwOwogCiAJCXN5c2ZzX3JlbW92ZV9ncm91cChjcHVmcmVxX2dsb2JhbF9rb2JqZWN0LAogCQkJCSZpbnRlcmFjdGl2ZV9hdHRyX2dyb3VwKTsKIAotCQlwbV9pZGxlID0gcG1faWRsZV9vbGQ7CiAJCWJyZWFrOwogCiAJY2FzZSBDUFVGUkVRX0dPVl9MSU1JVFM6Ci0JCWlmIChuZXdfcG9saWN5LT5tYXggPCBuZXdfcG9saWN5LT5jdXIpCi0JCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChuZXdfcG9saWN5LAotCQkJCQluZXdfcG9saWN5LT5tYXgsIENQVUZSRVFfUkVMQVRJT05fSCk7Ci0JCWVsc2UgaWYgKG5ld19wb2xpY3ktPm1pbiA+IG5ld19wb2xpY3ktPmN1cikKLQkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KG5ld19wb2xpY3ksCi0JCQkJCW5ld19wb2xpY3ktPm1pbiwgQ1BVRlJFUV9SRUxBVElPTl9MKTsKKwkJaWYgKHBvbGljeS0+bWF4IDwgcG9saWN5LT5jdXIpCisJCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksCisJCQkJCXBvbGljeS0+bWF4LCBDUFVGUkVRX1JFTEFUSU9OX0gpOworCQllbHNlIGlmIChwb2xpY3ktPm1pbiA+IHBvbGljeS0+Y3VyKQorCQkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LAorCQkJCQlwb2xpY3ktPm1pbiwgQ1BVRlJFUV9SRUxBVElPTl9MKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGNwdWZyZXFfaW50ZXJhY3RpdmVfaWRsZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIElETEVfU1RBUlQ6CisJCWNwdWZyZXFfaW50ZXJhY3RpdmVfaWRsZV9zdGFydCgpOworCQlicmVhazsKKwljYXNlIElETEVfRU5EOgorCQljcHVmcmVxX2ludGVyYWN0aXZlX2lkbGVfZW5kKCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNwdWZyZXFfaW50ZXJhY3RpdmVfaWRsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNwdWZyZXFfaW50ZXJhY3RpdmVfaWRsZV9ub3RpZmllciwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfaW50ZXJhY3RpdmVfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBjcHVmcmVxX2ludGVyYWN0aXZlX2NwdWluZm8gKnBjcHU7CiAJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CiAKLQlnb19tYXhzcGVlZF9sb2FkID0gREVGQVVMVF9HT19NQVhTUEVFRF9MT0FEOworCWdvX2hpc3BlZWRfbG9hZCA9IERFRkFVTFRfR09fSElTUEVFRF9MT0FEOwogCW1pbl9zYW1wbGVfdGltZSA9IERFRkFVTFRfTUlOX1NBTVBMRV9USU1FOworCXRpbWVyX3JhdGUgPSBERUZBVUxUX1RJTUVSX1JBVEU7CiAKIAkvKiBJbml0YWxpemUgcGVyLWNwdSB0aW1lcnMgKi8KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewpAQCAtNjY3LDcgKzY2OCw3IEBACiAJICAgd2FybSBjYWNoZSAocHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgbXVjaCkuICovCiAJZG93bl93cSA9IGFsbG9jX3dvcmtxdWV1ZSgia250ZXJhY3RpdmVfZG93biIsIDAsIDEpOwogCi0JaWYgKCEgZG93bl93cSkKKwlpZiAoIWRvd25fd3EpCiAJCWdvdG8gZXJyX2ZyZWV1cHRhc2s7CiAKIAlJTklUX1dPUksoJmZyZXFfc2NhbGVfZG93bl93b3JrLApAQCAtNjc1LDEyICs2NzYsOSBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnVwX2NwdW1hc2tfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRvd25fY3B1bWFza19sb2NrKTsKKwltdXRleF9pbml0KCZzZXRfc3BlZWRfbG9jayk7CiAKLSNpZiBERUJVRwotCXNwaW5fbG9ja19pbml0KCZkYmdwcl9sb2NrKTsKLQlkYmdfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpZ292IiwgU19JV1VTUiB8IFNfSVJVR08sIE5VTEwpOwotCWRiZ19wcm9jLT5yZWFkX3Byb2MgPSBkYmdfcHJvY19yZWFkOwotI2VuZGlmCisJaWRsZV9ub3RpZmllcl9yZWdpc3RlcigmY3B1ZnJlcV9pbnRlcmFjdGl2ZV9pZGxlX25iKTsKIAogCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2dvdmVybm9yKCZjcHVmcmVxX2dvdl9pbnRlcmFjdGl2ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IGNhM2YyNGMuLjdjN2ExZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMTY1LDE3ICsxNjUsMjcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKy8qIHNob3VsZCBiZSBjYWxsZWQgbGF0ZSBpbiB0aGUgQ1BVIHJlbW92YWwgc2VxdWVuY2Ugc28gdGhhdCB0aGUgc3RhdHMKKyAqIG1lbW9yeSBpcyBzdGlsbCBhdmFpbGFibGUgaW4gY2FzZSBzb21lb25lIHRyaWVzIHRvIHVzZSBpdC4KKyAqLwogc3RhdGljIHZvaWQgY3B1ZnJlcV9zdGF0c19mcmVlX3RhYmxlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdWZyZXFfc3RhdHMgKnN0YXQgPSBwZXJfY3B1KGNwdWZyZXFfc3RhdHNfdGFibGUsIGNwdSk7Ci0Jc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoY3B1KTsKLQlpZiAocG9saWN5ICYmIHBvbGljeS0+Y3B1ID09IGNwdSkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZzdGF0c19hdHRyX2dyb3VwKTsKIAlpZiAoc3RhdCkgewogCQlrZnJlZShzdGF0LT50aW1lX2luX3N0YXRlKTsKIAkJa2ZyZWUoc3RhdCk7CiAJfQogCXBlcl9jcHUoY3B1ZnJlcV9zdGF0c190YWJsZSwgY3B1KSA9IE5VTEw7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIGVhcmx5IGluIHRoZSBDUFUgcmVtb3ZhbCBzZXF1ZW5jZSAoYmVmb3JlCisgKiBjcHVmcmVxX3JlbW92ZV9kZXYpIHNvIHRoYXQgcG9saWN5IGlzIHN0aWxsIHZhbGlkLgorICovCitzdGF0aWMgdm9pZCBjcHVmcmVxX3N0YXRzX2ZyZWVfc3lzZnModW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChjcHUpOworCWlmIChwb2xpY3kgJiYgcG9saWN5LT5jcHUgPT0gY3B1KQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBvbGljeS0+a29iaiwgJnN0YXRzX2F0dHJfZ3JvdXApOwogCWlmIChwb2xpY3kpCiAJCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogfQpAQCAtMzA1LDI3ICszMTUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNwdWZyZXFfc3RhdHNfY3JlYXRlX3RhYmxlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQotewotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OwotCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGU7Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0KLQlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoY3B1KTsKLQlpZiAoIXBvbGljeSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl0YWJsZSA9IGNwdWZyZXFfZnJlcXVlbmN5X2dldF90YWJsZShjcHUpOwotCWlmICghdGFibGUpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGUocG9saWN5LCB0YWJsZSk7Ci0KLW91dDoKLQljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBjcHVmcmVxX3N0YXRfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sCiAJCQkJCSAgICAgICB2b2lkICpoY3B1KQpAQCAtMzM4LDE3ICszMjcsMTcgQEAKIAkJY3B1ZnJlcV91cGRhdGVfcG9saWN5KGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgotCQljcHVmcmVxX3N0YXRzX2ZyZWVfdGFibGUoY3B1KTsKKwkJY3B1ZnJlcV9zdGF0c19mcmVlX3N5c2ZzKGNwdSk7CiAJCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJY3B1ZnJlcV9zdGF0c19jcmVhdGVfdGFibGVfY3B1KGNwdSk7CisJY2FzZSBDUFVfREVBRDoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwkJY3B1ZnJlcV9zdGF0c19mcmVlX3RhYmxlKGNwdSk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gTk9USUZZX09LOwogfQogCisvKiBwcmlvcml0eT0xIHNvIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGJlZm9yZSBjcHVmcmVxX3JlbW92ZV9kZXYgKi8KIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3B1ZnJlcV9zdGF0X2NwdV9ub3RpZmllciBfX3JlZmRhdGEgPQogewogCS5ub3RpZmllcl9jYWxsID0gY3B1ZnJlcV9zdGF0X2NwdV9jYWxsYmFjaywKQEAgLTM5OSw2ICszODgsNyBAQAogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQljcHVmcmVxX3N0YXRzX2ZyZWVfdGFibGUoY3B1KTsKKwkJY3B1ZnJlcV9zdGF0c19mcmVlX3N5c2ZzKGNwdSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL21lbnUuYyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jCmluZGV4IGY1MDg2OTAuLmM0N2YzZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jCkBAIC0yMzcsNiArMjM3LDcgQEAKIAl1bnNpZ25lZCBpbnQgcG93ZXJfdXNhZ2UgPSAtMTsKIAlpbnQgaTsKIAlpbnQgbXVsdGlwbGllcjsKKwlzdHJ1Y3QgdGltZXNwZWMgdDsKIAogCWlmIChkYXRhLT5uZWVkc191cGRhdGUpIHsKIAkJbWVudV91cGRhdGUoZGV2KTsKQEAgLTI1MSw4ICsyNTIsOSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGRldGVybWluZSB0aGUgZXhwZWN0ZWQgcmVzaWRlbmN5IHRpbWUsIHJvdW5kIHVwICovCisJdCA9IGt0aW1lX3RvX3RpbWVzcGVjKHRpY2tfbm9oel9nZXRfc2xlZXBfbGVuZ3RoKCkpOwogCWRhdGEtPmV4cGVjdGVkX3VzID0KLQkgICAgRElWX1JPVU5EX1VQKCh1MzIpa3RpbWVfdG9fbnModGlja19ub2h6X2dldF9zbGVlcF9sZW5ndGgoKSksIDEwMDApOworCQl0LnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIHQudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7CiAKIAogCWRhdGEtPmJ1Y2tldCA9IHdoaWNoX2J1Y2tldChkYXRhLT5leHBlY3RlZF91cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCmluZGV4IDIzZDE0NjguLjU3OGQxMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCkBAIC0yNjQsNiArMjY0LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BR0VSRV9GVzY0MwkweDU5MDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9GVwkweDIzODAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9UU0IxMkxWMjIJMHg4MDA5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUElOTkFDTEVfU1lTVEVNUwkweDExYmQKIAogI2RlZmluZSBRVUlSS19DWUNMRV9USU1FUgkJMQogI2RlZmluZSBRVUlSS19SRVNFVF9QQUNLRVQJCTIKQEAgLTMxNzAsNiArMzE3MSwxMSBAQAogCWludCBpLCBlcnI7CiAJc2l6ZV90IHNpemU7CiAKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9QSU5OQUNMRV9TWVNURU1TKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiUGlubmFjbGUgTW92aWVCb2FyZCBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKwogCW9oY2kgPSBremFsbG9jKHNpemVvZigqb2hjaSksIEdGUF9LRVJORUwpOwogCWlmIChvaGNpID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCmluZGV4IGUxYWVlNGYuLmI2YTE5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiB9CiAKIAotaW50IGRybV9wY2lfaXJxX2J5X2J1c2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faXJxX2J1c2lkICpwKQorc3RhdGljIGludCBkcm1fcGNpX2lycV9ieV9idXNpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2lycV9idXNpZCAqcCkKIHsKIAlpZiAoKHAtPmJ1c251bSA+PiA4KSAhPSBkcm1fZ2V0X3BjaV9kb21haW4oZGV2KSB8fAogCSAgICAocC0+YnVzbnVtICYgMHhmZikgIT0gZGV2LT5wZGV2LT5idXMtPm51bWJlciB8fApAQCAtMjkyLDYgKzI5Miw3IEBACiAJLmdldF9uYW1lID0gZHJtX3BjaV9nZXRfbmFtZSwKIAkuc2V0X2J1c2lkID0gZHJtX3BjaV9zZXRfYnVzaWQsCiAJLnNldF91bmlxdWUgPSBkcm1fcGNpX3NldF91bmlxdWUsCisJLmlycV9ieV9idXNpZCA9IGRybV9wY2lfaXJxX2J5X2J1c2lkLAogCS5hZ3BfaW5pdCA9IGRybV9wY2lfYWdwX2luaXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCAxODhiNDk3Li41OGM3ZjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKQEAgLTE1NjcsNiArMTU2NywxNyBAQAogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlJOTE1X1dSSVRFKEhXU1RBTSwgMHhlZmZlKTsKKwlpZiAoSVNfR0VONihkZXYpKSB7CisJCS8qIFdvcmthcm91bmQgc3RhbGxzIG9ic2VydmVkIG9uIFNhbmR5IEJyaWRnZSBHUFVzIGJ5CisJCSAqIG1ha2luZyB0aGUgYmxpdHRlciBjb21tYW5kIHN0cmVhbWVyIGdlbmVyYXRlIGEKKwkJICogd3JpdGUgdG8gdGhlIEhhcmR3YXJlIFN0YXR1cyBQYWdlIGZvcgorCQkgKiBNSV9VU0VSX0lOVEVSUlVQVC4gIFRoaXMgYXBwZWFycyB0byBzZXJpYWxpemUgdGhlCisJCSAqIHByZXZpb3VzIHNlcW5vIHdyaXRlIG91dCBiZWZvcmUgdGhlIGludGVycnVwdAorCQkgKiBoYXBwZW5zLgorCQkgKi8KKwkJSTkxNV9XUklURShHRU42X0JMSVRURVJfSFdTVEFNLCB+R0VONl9CTElUVEVSX1VTRVJfSU5URVJSVVBUKTsKKwkJSTkxNV9XUklURShHRU42X0JTRF9IV1NUQU0sIH5HRU42X0JTRF9VU0VSX0lOVEVSUlVQVCk7CisJfQogCiAJLyogWFhYIGhvdHBsdWcgZnJvbSBQQ0ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKaW5kZXggZjM5YWMzYS4uNWE5NmZkMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtNTI4LDYgKzUyOCw3IEBACiAjZGVmaW5lICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9FTkFCTEUJCTAKICNkZWZpbmUgICBHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfSURMRV9JTkRJQ0FUT1IJCQkoMSA8PCAzKQogCisjZGVmaW5lIEdFTjZfQlNEX0hXU1RBTQkJCTB4MTIwOTgKICNkZWZpbmUgR0VONl9CU0RfSU1SCQkJMHgxMjBhOAogI2RlZmluZSAgIEdFTjZfQlNEX1VTRVJfSU5URVJSVVBUCSgxIDw8IDEyKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCmluZGV4IGQzYjkwM2IuLmQ5OGNlZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jCkBAIC00MDEsOCArNDAxLDcgQEAKIAkJYnVzLT5yZWcwID0gaSB8IEdNQlVTX1JBVEVfMTAwS0haOwogCiAJCS8qIFhYWCBmb3JjZSBiaXQgYmFuZ2luZyB1bnRpbCBHTUJVUyBpcyBmdWxseSBkZWJ1Z2dlZCAqLwotCQlpZiAoSVNfR0VOMihkZXYpKQotCQkJYnVzLT5mb3JjZV9iaXQgPSBpbnRlbF9ncGlvX2NyZWF0ZShkZXZfcHJpdiwgaSk7CisJCWJ1cy0+Zm9yY2VfYml0ID0gaW50ZWxfZ3Bpb19jcmVhdGUoZGV2X3ByaXYsIGkpOwogCX0KIAogCWludGVsX2kyY19yZXNldChkZXZfcHJpdi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCA2N2NiMDc2Li5iMjhmN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC03MjcsNiArNzI3LDE0IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlU4MDAiKSwKIAkJfSwKIAl9LAorCXsKKwkJLmNhbGxiYWNrID0gaW50ZWxfbm9fbHZkc19kbWlfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJBc3VzIEVlZUJveCBQQyBFQjEwMDciLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJFQjEwMDciKSwKKwkJfSwKKwl9LAogCiAJeyB9CS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCmluZGV4IGU5ZTZmNzEuLmM0NTA0YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKQEAgLTY2NiwxMiArNjY2LDM3IEBACiBzdGF0aWMgYm9vbAogYnNkX3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0JcmV0dXJuIHJpbmdfZ2V0X2lycShyaW5nLCBHVF9CU0RfVVNFUl9JTlRFUlJVUFQpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIWRldi0+aXJxX2VuYWJsZWQpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9jaygmcmluZy0+aXJxX2xvY2spOworCWlmIChyaW5nLT5pcnFfcmVmY291bnQrKyA9PSAwKSB7CisJCWlmIChJU19HNFgoZGV2KSkKKwkJCWk5MTVfZW5hYmxlX2lycShkZXZfcHJpdiwgSTkxNV9CU0RfVVNFUl9JTlRFUlJVUFQpOworCQllbHNlCisJCQlpcm9ubGFrZV9lbmFibGVfaXJxKGRldl9wcml2LCBHVF9CU0RfVVNFUl9JTlRFUlJVUFQpOworCX0KKwlzcGluX3VubG9jaygmcmluZy0+aXJxX2xvY2spOworCisJcmV0dXJuIHRydWU7CiB9CiBzdGF0aWMgdm9pZAogYnNkX3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0JcmluZ19wdXRfaXJxKHJpbmcsIEdUX0JTRF9VU0VSX0lOVEVSUlVQVCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXNwaW5fbG9jaygmcmluZy0+aXJxX2xvY2spOworCWlmICgtLXJpbmctPmlycV9yZWZjb3VudCA9PSAwKSB7CisJCWlmIChJU19HNFgoZGV2KSkKKwkJCWk5MTVfZGlzYWJsZV9pcnEoZGV2X3ByaXYsIEk5MTVfQlNEX1VTRVJfSU5URVJSVVBUKTsKKwkJZWxzZQorCQkJaXJvbmxha2VfZGlzYWJsZV9pcnEoZGV2X3ByaXYsIEdUX0JTRF9VU0VSX0lOVEVSUlVQVCk7CisJfQorCXNwaW5fdW5sb2NrKCZyaW5nLT5pcnFfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggNTI5YTNhNy4uMDI3MDVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAJdWludDY0X3QgZmJfbG9jYXRpb247CiAJdWludDMyX3QgZmJfZm9ybWF0LCBmYl9waXRjaF9waXhlbHMsIHRpbGluZ19mbGFnczsKIAl1MzIgZmJfc3dhcCA9IEVWRVJHUkVFTl9HUlBIX0VORElBTl9TV0FQKEVWRVJHUkVFTl9HUlBIX0VORElBTl9OT05FKTsKLQl1MzIgdG1wOworCXUzMiB0bXAsIHZpZXdwb3J0X3csIHZpZXdwb3J0X2g7CiAJaW50IHI7CiAKIAkvKiBubyBmYiBib3VuZCAqLwpAQCAtMTEzNyw4ICsxMTM3LDEwIEBACiAJeSAmPSB+MTsKIAlXUkVHMzIoRVZFUkdSRUVOX1ZJRVdQT1JUX1NUQVJUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAogCSAgICAgICAoeCA8PCAxNikgfCB5KTsKKwl2aWV3cG9ydF93ID0gY3J0Yy0+bW9kZS5oZGlzcGxheTsKKwl2aWV3cG9ydF9oID0gKGNydGMtPm1vZGUudmRpc3BsYXkgKyAxKSAmIH4xOwogCVdSRUczMihFVkVSR1JFRU5fVklFV1BPUlRfU0laRSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKLQkgICAgICAgKGNydGMtPm1vZGUuaGRpc3BsYXkgPDwgMTYpIHwgY3J0Yy0+bW9kZS52ZGlzcGxheSk7CisJICAgICAgICh2aWV3cG9ydF93IDw8IDE2KSB8IHZpZXdwb3J0X2gpOwogCiAJLyogcGFnZWZsaXAgc2V0dXAgKi8KIAkvKiBtYWtlIHN1cmUgZmxpcCBpcyBhdCB2YiByYXRoZXIgdGhhbiBoYiAqLwpAQCAtMTE3OSw3ICsxMTgxLDcgQEAKIAl1aW50NjRfdCBmYl9sb2NhdGlvbjsKIAl1aW50MzJfdCBmYl9mb3JtYXQsIGZiX3BpdGNoX3BpeGVscywgdGlsaW5nX2ZsYWdzOwogCXUzMiBmYl9zd2FwID0gUjYwMF9EMUdSUEhfU1dBUF9FTkRJQU5fTk9ORTsKLQl1MzIgdG1wOworCXUzMiB0bXAsIHZpZXdwb3J0X3csIHZpZXdwb3J0X2g7CiAJaW50IHI7CiAKIAkvKiBubyBmYiBib3VuZCAqLwpAQCAtMTMwNCw4ICsxMzA2LDEwIEBACiAJeSAmPSB+MTsKIAlXUkVHMzIoQVZJVk9fRDFNT0RFX1ZJRVdQT1JUX1NUQVJUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAogCSAgICAgICAoeCA8PCAxNikgfCB5KTsKKwl2aWV3cG9ydF93ID0gY3J0Yy0+bW9kZS5oZGlzcGxheTsKKwl2aWV3cG9ydF9oID0gKGNydGMtPm1vZGUudmRpc3BsYXkgKyAxKSAmIH4xOwogCVdSRUczMihBVklWT19EMU1PREVfVklFV1BPUlRfU0laRSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKLQkgICAgICAgKGNydGMtPm1vZGUuaGRpc3BsYXkgPDwgMTYpIHwgY3J0Yy0+bW9kZS52ZGlzcGxheSk7CisJICAgICAgICh2aWV3cG9ydF93IDw8IDE2KSB8IHZpZXdwb3J0X2gpOwogCiAJLyogcGFnZWZsaXAgc2V0dXAgKi8KIAkvKiBtYWtlIHN1cmUgZmxpcCBpcyBhdCB2YiByYXRoZXIgdGhhbiBoYiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKaW5kZXggOTA3M2UzYi4uMTBlNGUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCkBAIC05NjAsMTcgKzk2MCwxOSBAQAogewogCXNhdmUtPnZnYV9jb250cm9sWzBdID0gUlJFRzMyKEQxVkdBX0NPTlRST0wpOwogCXNhdmUtPnZnYV9jb250cm9sWzFdID0gUlJFRzMyKEQyVkdBX0NPTlRST0wpOwotCXNhdmUtPnZnYV9jb250cm9sWzJdID0gUlJFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MKTsKLQlzYXZlLT52Z2FfY29udHJvbFszXSA9IFJSRUczMihFVkVSR1JFRU5fRDRWR0FfQ09OVFJPTCk7Ci0Jc2F2ZS0+dmdhX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0Q1VkdBX0NPTlRST0wpOwotCXNhdmUtPnZnYV9jb250cm9sWzVdID0gUlJFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MKTsKIAlzYXZlLT52Z2FfcmVuZGVyX2NvbnRyb2wgPSBSUkVHMzIoVkdBX1JFTkRFUl9DT05UUk9MKTsKIAlzYXZlLT52Z2FfaGRwX2NvbnRyb2wgPSBSUkVHMzIoVkdBX0hEUF9DT05UUk9MKTsKIAlzYXZlLT5jcnRjX2NvbnRyb2xbMF0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOwogCXNhdmUtPmNydGNfY29udHJvbFsxXSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CisJCXNhdmUtPnZnYV9jb250cm9sWzJdID0gUlJFRzMyKEVWRVJHUkVFTl9EM1ZHQV9DT05UUk9MKTsKKwkJc2F2ZS0+dmdhX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wpOwogCQlzYXZlLT5jcnRjX2NvbnRyb2xbMl0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOwogCQlzYXZlLT5jcnRjX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlzYXZlLT52Z2FfY29udHJvbFs0XSA9IFJSRUczMihFVkVSR1JFRU5fRDVWR0FfQ09OVFJPTCk7CisJCXNhdmUtPnZnYV9jb250cm9sWzVdID0gUlJFRzMyKEVWRVJHUkVFTl9ENlZHQV9DT05UUk9MKTsKIAkJc2F2ZS0+Y3J0Y19jb250cm9sWzRdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VUKTsKIAkJc2F2ZS0+Y3J0Y19jb250cm9sWzVdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAl9CkBAIC05NzksMzUgKzk4MSw0NSBAQAogCVdSRUczMihWR0FfUkVOREVSX0NPTlRST0wsIDApOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDEpOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMSk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDEpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOwogCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJfQogCiAJV1JFRzMyKEQxVkdBX0NPTlRST0wsIDApOwogCVdSRUczMihEMlZHQV9DT05UUk9MLCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0QzVkdBX0NPTlRST0wsIDApOwotCVdSRUczMihFVkVSR1JFRU5fRDRWR0FfQ09OVFJPTCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9ENVZHQV9DT05UUk9MLCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsIDApOworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CisJCVdSRUczMihFVkVSR1JFRU5fRDNWR0FfQ09OVFJPTCwgMCk7CisJCVdSRUczMihFVkVSR1JFRU5fRDRWR0FfQ09OVFJPTCwgMCk7CisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CisJCVdSRUczMihFVkVSR1JFRU5fRDVWR0FfQ09OVFJPTCwgMCk7CisJCVdSRUczMihFVkVSR1JFRU5fRDZWR0FfQ09OVFJPTCwgMCk7CisJfQogfQogCiB2b2lkIGV2ZXJncmVlbl9tY19yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCBldmVyZ3JlZW5fbWNfc2F2ZSAqc2F2ZSkKQEAgLTEwMzAsNyArMTA0Miw3IEBACiAJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULAogCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwogCi0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKIAkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKQEAgLTEwNDgsNyArMTA2MCw4IEBACiAJCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCiAJCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwotCisJfQorCWlmIChyZGV2LT5udW1fY3J0YyA+PSA2KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwKIAkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwogCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwKQEAgLTEwNzYsMzEgKzEwODksNDEgQEAKIAkvKiBSZXN0b3JlIHZpZGVvIHN0YXRlICovCiAJV1JFRzMyKEQxVkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzBdKTsKIAlXUkVHMzIoRDJWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbMV0pOwotCVdSRUczMihFVkVSR1JFRU5fRDNWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbMl0pOwotCVdSRUczMihFVkVSR1JFRU5fRDRWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbM10pOwotCVdSRUczMihFVkVSR1JFRU5fRDVWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbNF0pOwotCVdSRUczMihFVkVSR1JFRU5fRDZWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbNV0pOworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CisJCVdSRUczMihFVkVSR1JFRU5fRDNWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbMl0pOworCQlXUkVHMzIoRVZFUkdSRUVOX0Q0VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzNdKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKKwkJV1JFRzMyKEVWRVJHUkVFTl9ENVZHQV9DT05UUk9MLCBzYXZlLT52Z2FfY29udHJvbFs0XSk7CisJCVdSRUczMihFVkVSR1JFRU5fRDZWR0FfQ09OVFJPTCwgc2F2ZS0+dmdhX2NvbnRyb2xbNV0pOworCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDEpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJfQogCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzBdKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFsxXSk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzJdKTsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbM10pOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgewogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFs0XSk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzVdKTsKIAl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOwogCX0KQEAgLTE1NzgsNyArMTYwMSw3IEBACiAJdTMyIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMjsKIAl1MzIgc3Ffc3RhY2tfcmVzb3VyY2VfbWdtdF8zOwogCXUzMiB2Z3RfY2FjaGVfaW52YWxpZGF0aW9uOwotCXUzMiBoZHBfaG9zdF9wYXRoX2NudGw7CisJdTMyIGhkcF9ob3N0X3BhdGhfY250bCwgdG1wOwogCWludCBpLCBqLCBudW1fc2hhZGVyX2VuZ2luZXMsIHBzX3RocmVhZF9jb3VudDsKIAogCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CkBAIC0xOTAwLDcgKzE5MjMsNyBAQAogCQkJZ2JfYmFja2VuZF9tYXAgPSAweDY2NDQyMjAwOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hJUF9KVU5JUEVSOgotCQkJZ2JfYmFja2VuZF9tYXAgPSAweDAwMDA2NDIwOworCQkJZ2JfYmFja2VuZF9tYXAgPSAweDAwMDAyMjAwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlnYl9iYWNrZW5kX21hcCA9CkBAIC0yMTQxLDYgKzIxNjQsMTAgQEAKIAlmb3IgKGkgPSBTUV9BTFVfQ09OU1RfQlVGRkVSX1NJWkVfSFNfMDsgaSA8IDB4MjkwMDA7IGkgKz0gNCkKIAkJV1JFRzMyKGksIDApOwogCisJdG1wID0gUlJFRzMyKEhEUF9NSVNDX0NOVEwpOworCXRtcCB8PSBIRFBfRkxVU0hfSU5WQUxJREFURV9DQUNIRTsKKwlXUkVHMzIoSERQX01JU0NfQ05UTCwgdG1wKTsKKwogCWhkcF9ob3N0X3BhdGhfY250bCA9IFJSRUczMihIRFBfSE9TVF9QQVRIX0NOVEwpOwogCVdSRUczMihIRFBfSE9TVF9QQVRIX0NOVEwsIGhkcF9ob3N0X3BhdGhfY250bCk7CiAKQEAgLTIzMjMsMTggKzIzNTAsMjIgQEAKIAlXUkVHMzIoR1JCTV9JTlRfQ05UTCwgMCk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCWlmIChyZGV2LT5udW1fY3J0YyA+PSA0KSB7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOwogCX0KIAogCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAl9CkBAIC0yNDUzLDE5ICsyNDg0LDI1IEBACiAKIAlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBjcnRjMSk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgY3J0YzIpOwotCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgewogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBjcnRjMyk7CiAJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIGNydGM0KTsKKwl9CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDYpIHsKIAkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgY3J0YzUpOwogCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBjcnRjNik7CiAJfQogCiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBncnBoMSk7CiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBncnBoMik7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBncnBoMyk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBncnBoNCk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBncnBoNSk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBncnBoNik7CisJaWYgKHJkZXYtPm51bV9jcnRjID49IDQpIHsKKwkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBncnBoMyk7CisJCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgZ3JwaDQpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIGdycGg1KTsKKwkJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBncnBoNik7CisJfQogCiAJV1JFRzMyKERDX0hQRDFfSU5UX0NPTlRST0wsIGhwZDEpOwogCVdSRUczMihEQ19IUEQyX0lOVF9DT05UUk9MLCBocGQyKTsKQEAgLTI0ODksNTMgKzI1MjYsNTcgQEAKIAlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1KTsKIAlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOwogCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7Ci0JcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKLQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOwotCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7Ci0JcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kM2dycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCX0KKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNmdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQpOworCX0KIAogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCiAJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKIAkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQotCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOwotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCi0JCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKLQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKLQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQotCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOwotCiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKIAlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBMQl9EMV9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOwotCiAJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKQogCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgTEJfRDJfVkxJTkVfSU5URVJSVVBUKQogCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKIAotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNCkgeworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ0Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZCTEFOS19JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBMQl9EM19WTElORV9JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkJMQU5LX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOworCX0KIAotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKLQotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgTEJfRDVfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKLQotCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZCTEFOS19JTlRFUlJVUFQpCi0JCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkxJTkVfSU5URVJSVVBUKQotCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwlpZiAocmRldi0+bnVtX2NydGMgPj0gNikgeworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDVncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ2Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WTElORV9JTlRFUlJVUFQpCisJCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkJMQU5LX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkKKwkJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOworCX0KIAogCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7CiAJCXRtcCA9IFJSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MKTsKQEAgLTMxNDYsNiArMzE4Nyw3IEBACiAJcjcwMF9jcF9maW5pKHJkZXYpOwogCXI2MDBfaXJxX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CisJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCWV2ZXJncmVlbl9wY2llX2dhcnRfZmluaShyZGV2KTsKIAlyYWRlb25fZ2VtX2ZpbmkocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCmluZGV4IGZjNDBlMGMuLjI3M2U3ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCkBAIC02NCw2ICs2NCw4IEBACiAjZGVmaW5lIEdCX0JBQ0tFTkRfTUFQICAJCQkJMHg5OEZDCiAjZGVmaW5lIERNSUZfQUREUl9DT05GSUcgIAkJCQkweEJENAogI2RlZmluZSBIRFBfQUREUl9DT05GSUcgIAkJCQkweDJGNDgKKyNkZWZpbmUgSERQX01JU0NfQ05UTCAgCQkJCQkweDJGNEMKKyNkZWZpbmUJCUhEUF9GTFVTSF9JTlZBTElEQVRFX0NBQ0hFICAgICAgCSgxIDw8IDApCiAKICNkZWZpbmUJQ0NfU1lTX1JCX0JBQ0tFTkRfRElTQUJMRQkJCTB4M0Y4OAogI2RlZmluZQlHQ19VU0VSX1JCX0JBQ0tFTkRfRElTQUJMRQkJCTB4OUI3QwpAQCAtNDU4LDcgKzQ2MCw3IEBACiAjZGVmaW5lIElIX1JCX1dQVFJfQUREUl9MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZTE0CiAjZGVmaW5lIElIX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZTE4CiAjICAgICAgIGRlZmluZSBFTkFCTEVfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKLSMgICAgICAgZGVmaW5lIElIX01DX1NXQVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDIpCisjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAxKQogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfMTZCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzMyQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgpAQCAtNTM5LDcgKzU0MSw3IEBACiAjICAgICAgIGRlZmluZSBMQl9ENV9WQkxBTktfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCiAjICAgICAgIGRlZmluZSBEQ19IUEQ1X0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE3KQogIyAgICAgICBkZWZpbmUgRENfSFBENV9SWF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkKLSNkZWZpbmUgRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFNSAgICAgICAgICAgICAgICAgMHg2MDUwCisjZGVmaW5lIERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTUgICAgICAgICAgICAgICAgIDB4NjE1MAogIyAgICAgICBkZWZpbmUgTEJfRDZfVkxJTkVfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQogIyAgICAgICBkZWZpbmUgTEJfRDZfVkJMQU5LX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQogIyAgICAgICBkZWZpbmUgRENfSFBENl9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwppbmRleCAzZDhhNzYzLi41OGY1MDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCkBAIC00MTcsNyArNDE3LDcgQEAKIAkJbnVtX3NoYWRlcl9lbmdpbmVzID0gMTsKIAlpZiAobnVtX3NoYWRlcl9lbmdpbmVzID4gcmRldi0+Y29uZmlnLmNheW1hbi5tYXhfc2hhZGVyX2VuZ2luZXMpCiAJCW51bV9zaGFkZXJfZW5naW5lcyA9IHJkZXYtPmNvbmZpZy5jYXltYW4ubWF4X3NoYWRlcl9lbmdpbmVzOwotCWlmIChudW1fYmFja2VuZHNfcGVyX2FzaWMgPiBudW1fc2hhZGVyX2VuZ2luZXMpCisJaWYgKG51bV9iYWNrZW5kc19wZXJfYXNpYyA8IG51bV9zaGFkZXJfZW5naW5lcykKIAkJbnVtX2JhY2tlbmRzX3Blcl9hc2ljID0gbnVtX3NoYWRlcl9lbmdpbmVzOwogCWlmIChudW1fYmFja2VuZHNfcGVyX2FzaWMgPiAocmRldi0+Y29uZmlnLmNheW1hbi5tYXhfYmFja2VuZHNfcGVyX3NlICogbnVtX3NoYWRlcl9lbmdpbmVzKSkKIAkJbnVtX2JhY2tlbmRzX3Blcl9hc2ljID0gcmRldi0+Y29uZmlnLmNheW1hbi5tYXhfYmFja2VuZHNfcGVyX3NlICogbnVtX3NoYWRlcl9lbmdpbmVzOwpAQCAtODI5LDcgKzgyOSw3IEBACiAJcmRldi0+Y29uZmlnLmNheW1hbi50aWxlX2NvbmZpZyB8PQogCQkoKG1jX2FyYl9yYW1jZmcgJiBOT09GQkFOS19NQVNLKSA+PiBOT09GQkFOS19TSElGVCkgPDwgNDsKIAlyZGV2LT5jb25maWcuY2F5bWFuLnRpbGVfY29uZmlnIHw9Ci0JCShnYl9hZGRyX2NvbmZpZyAmIFBJUEVfSU5URVJMRUFWRV9TSVpFX01BU0spID4+IFBJUEVfSU5URVJMRUFWRV9TSVpFX1NISUZUOworCQkoKGdiX2FkZHJfY29uZmlnICYgUElQRV9JTlRFUkxFQVZFX1NJWkVfTUFTSykgPj4gUElQRV9JTlRFUkxFQVZFX1NJWkVfU0hJRlQpIDw8IDg7CiAJcmRldi0+Y29uZmlnLmNheW1hbi50aWxlX2NvbmZpZyB8PQogCQkoKGdiX2FkZHJfY29uZmlnICYgUk9XX1NJWkVfTUFTSykgPj4gUk9XX1NJWkVfU0hJRlQpIDw8IDEyOwogCkBAIC05MzEsNiArOTMxLDEwIEBACiAJV1JFRzMyKENCX1BFUkZfQ1RSM19TRUxfMCwgMCk7CiAJV1JFRzMyKENCX1BFUkZfQ1RSM19TRUxfMSwgMCk7CiAKKwl0bXAgPSBSUkVHMzIoSERQX01JU0NfQ05UTCk7CisJdG1wIHw9IEhEUF9GTFVTSF9JTlZBTElEQVRFX0NBQ0hFOworCVdSRUczMihIRFBfTUlTQ19DTlRMLCB0bXApOworCiAJaGRwX2hvc3RfcGF0aF9jbnRsID0gUlJFRzMyKEhEUF9IT1NUX1BBVEhfQ05UTCk7CiAJV1JFRzMyKEhEUF9IT1NUX1BBVEhfQ05UTCwgaGRwX2hvc3RfcGF0aF9jbnRsKTsKIApAQCAtMTU4MCw2ICsxNTg0LDcgQEAKIAljYXltYW5fY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOworCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAljYXltYW5fcGNpZV9nYXJ0X2ZpbmkocmRldik7CiAJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKaW5kZXggMGY5YTA4Yi4uYjIwODhjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCkBAIC0xMzYsNiArMTM2LDggQEAKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfSU5GTwkJCQkweDJDMDgKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfU0laRQkJCQkweDJDMEMKICNkZWZpbmUgSERQX0FERFJfQ09ORklHICAJCQkJMHgyRjQ4CisjZGVmaW5lIEhEUF9NSVNDX0NOVEwJCQkJCTB4MkY0QworI2RlZmluZSAJSERQX0ZMVVNIX0lOVkFMSURBVEVfQ0FDSEUJCQkoMSA8PCAwKQogCiAjZGVmaW5lCUNDX1NZU19SQl9CQUNLRU5EX0RJU0FCTEUJCQkweDNGODgKICNkZWZpbmUJR0NfVVNFUl9TWVNfUkJfQkFDS0VORF9ESVNBQkxFCQkJMHgzRjhDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCmluZGV4IDJmZWY5ZGUuLjY4NmY5ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCkBAIC02Myw3ICs2Myw3IEBACiAJdW5zaWduZWQJCQludW1fYXJyYXlzOwogCXVuc2lnbmVkCQkJbWF4X2luZHg7CiAJdW5zaWduZWQJCQljb2xvcl9jaGFubmVsX21hc2s7Ci0Jc3RydWN0IHIxMDBfY3NfdHJhY2tfYXJyYXkJYXJyYXlzWzExXTsKKwlzdHJ1Y3QgcjEwMF9jc190cmFja19hcnJheQlhcnJheXNbMTZdOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrX2NiIAljYltSMzAwX01BWF9DQl07CiAJc3RydWN0IHIxMDBfY3NfdHJhY2tfY2IgCXpiOwogCXN0cnVjdCByMTAwX2NzX3RyYWNrX2NiIAlhYTsKQEAgLTE0Niw2ICsxNDYsMTIgQEAKIAlpYiA9IHAtPmliLT5wdHI7CiAJdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKIAljID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrKykgJiAweDFGOworCWlmIChjID4gMTYpIHsKKwkgICAgRFJNX0VSUk9SKCJPbmx5IDE2IHZlcnRleCBidWZmZXJzIGFyZSBhbGxvd2VkICVkXG4iLAorCQkgICAgICBwa3QtPm9wY29kZSk7CisJICAgIHIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQogCXRyYWNrLT5udW1fYXJyYXlzID0gYzsKIAlmb3IgKGkgPSAwOyBpIDwgKGMgLSAxKTsgaSs9MiwgaWR4Kz0zKSB7CiAJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCmluZGV4IDZmMjc1OTMuLjA2OGNjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCkBAIC0yNjEzLDYgKzI2MTMsNyBAQAogCXI2MDBfY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOworCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlyNjAwX3BjaWVfZ2FydF9maW5pKHJkZXYpOwogCXJhZGVvbl9hZ3BfZmluaShyZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAppbmRleCBiMmI5NDRiYy4uZTVlYWVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaApAQCAtNTM2LDcgKzUzNiw3IEBACiAjZGVmaW5lIElIX1JCX1dQVFJfQUREUl9MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZTE0CiAjZGVmaW5lIElIX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZTE4CiAjICAgICAgIGRlZmluZSBFTkFCTEVfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKLSMgICAgICAgZGVmaW5lIElIX01DX1NXQVAoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDIpCisjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCAxKQogIyAgICAgICBkZWZpbmUgSUhfTUNfU1dBUF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIElIX01DX1NXQVBfMTZCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAjICAgICAgIGRlZmluZSBJSF9NQ19TV0FQXzMyQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCmluZGV4IGNhNTc2MTkuLmQ5NDgyNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKQEAgLTc4Miw2ICs3ODIsNyBAQAogCS5ocGRfZmluaSA9ICZldmVyZ3JlZW5faHBkX2ZpbmksCiAJLmhwZF9zZW5zZSA9ICZldmVyZ3JlZW5faHBkX3NlbnNlLAogCS5ocGRfc2V0X3BvbGFyaXR5ID0gJmV2ZXJncmVlbl9ocGRfc2V0X3BvbGFyaXR5LAorCS5pb2N0bF93YWl0X2lkbGUgPSByNjAwX2lvY3RsX3dhaXRfaWRsZSwKIAkuZ3VpX2lkbGUgPSAmcjYwMF9ndWlfaWRsZSwKIAkucG1fbWlzYyA9ICZldmVyZ3JlZW5fcG1fbWlzYywKIAkucG1fcHJlcGFyZSA9ICZldmVyZ3JlZW5fcG1fcHJlcGFyZSwKQEAgLTgyOCw2ICs4MjksNyBAQAogCS5ocGRfZmluaSA9ICZldmVyZ3JlZW5faHBkX2ZpbmksCiAJLmhwZF9zZW5zZSA9ICZldmVyZ3JlZW5faHBkX3NlbnNlLAogCS5ocGRfc2V0X3BvbGFyaXR5ID0gJmV2ZXJncmVlbl9ocGRfc2V0X3BvbGFyaXR5LAorCS5pb2N0bF93YWl0X2lkbGUgPSByNjAwX2lvY3RsX3dhaXRfaWRsZSwKIAkuZ3VpX2lkbGUgPSAmcjYwMF9ndWlfaWRsZSwKIAkucG1fbWlzYyA9ICZldmVyZ3JlZW5fcG1fbWlzYywKIAkucG1fcHJlcGFyZSA9ICZldmVyZ3JlZW5fcG1fcHJlcGFyZSwKQEAgLTg3NCw2ICs4NzYsNyBAQAogCS5ocGRfZmluaSA9ICZldmVyZ3JlZW5faHBkX2ZpbmksCiAJLmhwZF9zZW5zZSA9ICZldmVyZ3JlZW5faHBkX3NlbnNlLAogCS5ocGRfc2V0X3BvbGFyaXR5ID0gJmV2ZXJncmVlbl9ocGRfc2V0X3BvbGFyaXR5LAorCS5pb2N0bF93YWl0X2lkbGUgPSByNjAwX2lvY3RsX3dhaXRfaWRsZSwKIAkuZ3VpX2lkbGUgPSAmcjYwMF9ndWlfaWRsZSwKIAkucG1fbWlzYyA9ICZldmVyZ3JlZW5fcG1fbWlzYywKIAkucG1fcHJlcGFyZSA9ICZldmVyZ3JlZW5fcG1fcHJlcGFyZSwKQEAgLTkyMCw2ICs5MjMsNyBAQAogCS5ocGRfZmluaSA9ICZldmVyZ3JlZW5faHBkX2ZpbmksCiAJLmhwZF9zZW5zZSA9ICZldmVyZ3JlZW5faHBkX3NlbnNlLAogCS5ocGRfc2V0X3BvbGFyaXR5ID0gJmV2ZXJncmVlbl9ocGRfc2V0X3BvbGFyaXR5LAorCS5pb2N0bF93YWl0X2lkbGUgPSByNjAwX2lvY3RsX3dhaXRfaWRsZSwKIAkuZ3VpX2lkbGUgPSAmcjYwMF9ndWlfaWRsZSwKIAkucG1fbWlzYyA9ICZldmVyZ3JlZW5fcG1fbWlzYywKIAkucG1fcHJlcGFyZSA9ICZldmVyZ3JlZW5fcG1fcHJlcGFyZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMKaW5kZXggODkwMjE3ZTYuLjVkNmNjYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCkBAIC03NTIsNiArNzUyLDcgQEAKIAlkbWFfYml0cyA9IHJkZXYtPm5lZWRfZG1hMzIgPyAzMiA6IDQwOwogCXIgPSBwY2lfc2V0X2RtYV9tYXNrKHJkZXYtPnBkZXYsIERNQV9CSVRfTUFTSyhkbWFfYml0cykpOwogCWlmIChyKSB7CisJCXJkZXYtPm5lZWRfZG1hMzIgPSB0cnVlOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJyYWRlb246IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwppbmRleCBiZGJhYjVjLi4yODAyYzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCkBAIC0yNjQsNiArMjY0LDggQEAKIAkJcmFkZW9uX2JvX3VucmVzZXJ2ZSh3b3JrLT5vbGRfcmJvKTsKIAl9IGVsc2UKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVzZXJ2ZSBidWZmZXIgYWZ0ZXIgZmxpcFxuIik7CisKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmd29yay0+b2xkX3Jiby0+Z2VtX2Jhc2UpOwogCWtmcmVlKHdvcmspOwogfQogCkBAIC0zNzEsNiArMzczLDggQEAKIAluZXdfcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKGZiKTsKIAkvKiBzY2hlZHVsZSB1bnBpbiBvZiB0aGUgb2xkIGJ1ZmZlciAqLwogCW9iaiA9IG9sZF9yYWRlb25fZmItPm9iajsKKwkvKiB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgb2JqZWN0ICovCisJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7CiAJcmJvID0gZ2VtX3RvX3JhZGVvbl9ibyhvYmopOwogCXdvcmstPm9sZF9yYm8gPSByYm87CiAJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCByYWRlb25fdW5waW5fd29ya19mdW5jKTsKQEAgLTM3OCwxMiArMzgyLDkgQEAKIAkvKiBXZSBib3Jyb3cgdGhlIGV2ZW50IHNwaW4gbG9jayBmb3IgcHJvdGVjdGluZyB1bnBpbl93b3JrICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCWlmIChyYWRlb25fY3J0Yy0+dW5waW5fd29yaykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQkJa2ZyZWUod29yayk7Ci0JCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOwotCiAJCURSTV9ERUJVR19EUklWRVIoImZsaXAgcXVldWU6IGNydGMgYWxyZWFkeSBidXN5XG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJciA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2tfZnJlZTsKIAl9CiAJcmFkZW9uX2NydGMtPnVucGluX3dvcmsgPSB3b3JrOwogCXJhZGVvbl9jcnRjLT5kZWZlcnJlZF9mbGlwX2NvbXBsZXRpb24gPSAwOwpAQCAtNDk3LDYgKzQ5OCw4IEBACiBwZmxpcF9jbGVhbnVwOgogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlyYWRlb25fY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7Cit1bmxvY2tfZnJlZToKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvbGRfcmFkZW9uX2ZiLT5vYmopOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOwogCWtmcmVlKHdvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKaW5kZXggYjQyNzQ4OC4uOTQyM2ZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCkBAIC0xMjk0LDcgKzEyOTQsMTEgQEAKIAlpZiAoaXNfZGlnKSB7CiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIERSTV9NT0RFX0RQTVNfT046Ci0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFX09VVFBVVCwgMCwgMCk7CisJCQkvKiBzb21lIGVhcmx5IGRjZTMuMiBib2FyZHMgaGF2ZSBhIGJ1ZyBpbiB0aGVpciB0cmFuc21pdHRlciBjb250cm9sIHRhYmxlICovCisJCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNzEwKSB8fCAocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MzApKQorCQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEUsIDAsIDApOworCQkJZWxzZQorCQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEVfT1VUUFVULCAwLCAwKTsKIAkJCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7CiAJCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKaW5kZXggZWY4YTViYWIuLjMzYjg1NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKQEAgLTU3Miw2ICs1NzIsMTIgQEAKIAllbHNlCiAJCXRjcF9jaGFuX3N0ZWVyID0gMHgwMGZhYzY4ODsKIAorCS8qIFJWNzcwIENFIGhhcyBzcGVjaWFsIGNocmVtYXAgc2V0dXAgKi8KKwlpZiAocmRldi0+cGRldi0+ZGV2aWNlID09IDB4OTQ0ZSkgeworCQl0Y3BfY2hhbl9zdGVlciA9IDB4MDBiMDhiMDg7CisJCW1jX3NoYXJlZF9jaHJlbWFwID0gMHgwMGIwOGIwODsKKwl9CisKIAlXUkVHMzIoVENQX0NIQU5fU1RFRVIsIHRjcF9jaGFuX3N0ZWVyKTsKIAlXUkVHMzIoTUNfU0hBUkVEX0NIUkVNQVAsIG1jX3NoYXJlZF9jaHJlbWFwKTsKIH0KQEAgLTEzNTksNiArMTM2NSw3IEBACiAJcjcwMF9jcF9maW5pKHJkZXYpOwogCXI2MDBfaXJxX2ZpbmkocmRldik7CiAJcmFkZW9uX3diX2ZpbmkocmRldik7CisJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCXJ2NzcwX3BjaWVfZ2FydF9maW5pKHJkZXYpOwogCXJ2NzcwX3ZyYW1fc2NyYXRjaF9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvS2NvbmZpZyBiL2RyaXZlcnMvaGlkL0tjb25maWcKaW5kZXggOWRlOWU5Ny4uY2VlYmZjOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL0tjb25maWcKKysrIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpAQCAtMzI3LDYgKzMyNyw3IEBACiAJICAtICdTZW5zaW5nIFdpbjctVHdvRmluZ2VyJyBwYW5lbCBieSBHZW5lcmFsVG91Y2gKICAgICAgICAgICAtIGVHYWxheCBkdWFsLXRvdWNoIHBhbmVscywgaW5jbHVkaW5nIHRoZQogCSAgICBKb29qb28gYW5kIFdldGFiIHRhYmxldHMKKwkgIC0gTEcgRGlzcGxheSBwYW5lbHMgKERlbGwgU1QyMjIwVGMpCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IDQwOGM0YmUuLmUwM2E4YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMTM4Niw2ICsxMzg2LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9FUkdPXzUyNVYpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xBQlRFQywgVVNCX0RFVklDRV9JRF9MQUJURUNfV0lSRUxFU1NfS0VZQk9BUkQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xDUE9XRVIsIFVTQl9ERVZJQ0VfSURfTENQT1dFUl9MQzEwMDAgKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRywgVVNCX0RFVklDRV9JRF9MR19NVUxUSVRPVUNIKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9NWDMwMDBfUkVDRUlWRVIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVJfMikgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jIGIvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMKaW5kZXggYmFlNDg3NC4uOWEyNDNjYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jCkBAIC00NTAsNiArNDUwLDExIEBACiAJCXNlcV9wcmludGYoZiwgIkxvZ2ljYWwoIik7CiAJCWhpZF9yZXNvbHZfdXNhZ2UoZmllbGQtPmxvZ2ljYWwsIGYpOyBzZXFfcHJpbnRmKGYsICIpXG4iKTsKIAl9CisJaWYgKGZpZWxkLT5hcHBsaWNhdGlvbikgeworCQl0YWIobiwgZik7CisJCXNlcV9wcmludGYoZiwgIkFwcGxpY2F0aW9uKCIpOworCQloaWRfcmVzb2x2X3VzYWdlKGZpZWxkLT5hcHBsaWNhdGlvbiwgZik7IHNlcV9wcmludGYoZiwgIilcbiIpOworCX0KIAl0YWIobiwgZik7IHNlcV9wcmludGYoZiwgIlVzYWdlKCVkKVxuIiwgZmllbGQtPm1heHVzYWdlKTsKIAlmb3IgKGogPSAwOyBqIDwgZmllbGQtPm1heHVzYWdlOyBqKyspIHsKIAkJdGFiKG4rMiwgZik7IGhpZF9yZXNvbHZfdXNhZ2UoZmllbGQtPnVzYWdlW2pdLmhpZCwgZik7IHNlcV9wcmludGYoZiwgIlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMDBhOTRiNS4uZDk4ZDhkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtMzgxLDYgKzM4MSw5IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfUE9XRVJDT05UUk9MCTB4MjAzMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX01BQ0hJTkVURVNUCTB4MjA0MAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTEcJCTB4MWZkMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xHX01VTFRJVE9VQ0gJMHgwMDY0CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSAkJMHgwNDZkCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIJMHhjMTAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9GSVJTVCAgMHhjMTEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCmluZGV4IDMzZGRlODcuLjAzZmQxNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCkBAIC05MjcsNiArOTI3LDkgQEAKIAkJCQkgKiBVR0NJKSBjcmFtIGEgbG90IG9mIHVucmVsYXRlZCBpbnB1dHMgaW50byB0aGUKIAkJCQkgKiBzYW1lIGludGVyZmFjZS4gKi8KIAkJCQloaWRpbnB1dC0+cmVwb3J0ID0gcmVwb3J0OworCQkJCWlmIChoaWQtPmRyaXZlci0+aW5wdXRfcmVnaXN0ZXIgJiYKKwkJCQkJCWhpZC0+ZHJpdmVyLT5pbnB1dF9yZWdpc3RlcihoaWQsIGhpZGlucHV0KSkKKwkJCQkJZ290byBvdXRfY2xlYW51cDsKIAkJCQlpZiAoaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhpZGlucHV0LT5pbnB1dCkpCiAJCQkJCWdvdG8gb3V0X2NsZWFudXA7CiAJCQkJaGlkaW5wdXQgPSBOVUxMOwpAQCAtOTM0LDYgKzkzNywxMCBAQAogCQl9CiAJfQogCisJaWYgKGhpZC0+ZHJpdmVyLT5pbnB1dF9yZWdpc3RlciAmJgorCQkJaGlkLT5kcml2ZXItPmlucHV0X3JlZ2lzdGVyKGhpZCwgaGlkaW5wdXQpKQorCQlnb3RvIG91dF9jbGVhbnVwOworCiAJaWYgKGhpZGlucHV0ICYmIGlucHV0X3JlZ2lzdGVyX2RldmljZShoaWRpbnB1dC0+aW5wdXQpKQogCQlnb3RvIG91dF9jbGVhbnVwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jIGIvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYwppbmRleCAwZWM5MWMxLi40ZjY0MzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKQEAgLTM2NSw4ICszNjUsMTAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgbWFnaWNtb3VzZV9zZXR1cF9pbnB1dChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwgc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCitzdGF0aWMgaW50IG1hZ2ljbW91c2Vfc2V0dXBfaW5wdXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpKQogeworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gaGktPmlucHV0OworCQogCV9fc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7CiAKIAlpZiAoaW5wdXQtPmlkLnByb2R1Y3QgPT0gVVNCX0RFVklDRV9JRF9BUFBMRV9NQUdJQ01PVVNFKSB7CkBAIC00MjYsNiArNDI4LDggQEAKIAkJX19zZXRfYml0KEVWX01TQywgaW5wdXQtPmV2Yml0KTsKIAkJX19zZXRfYml0KE1TQ19SQVcsIGlucHV0LT5tc2NiaXQpOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1hZ2ljbW91c2VfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKQEAgLTQ3OCwxMiArNDgyLDYgQEAKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQkvKiBXZSBkbyB0aGlzIGFmdGVyIGhpZC1pbnB1dCBpcyBkb25lIHBhcnNpbmcgcmVwb3J0cyBzbyB0aGF0Ci0JICogaGlkLWlucHV0IHVzZXMgdGhlIG1vc3QgbmF0dXJhbCBidXR0b24gYW5kIGF4aXMgSURzLgotCSAqLwotCWlmIChtc2MtPmlucHV0KQotCQltYWdpY21vdXNlX3NldHVwX2lucHV0KG1zYy0+aW5wdXQsIGhkZXYpOwotCiAJaWYgKGlkLT5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfQVBQTEVfTUFHSUNNT1VTRSkKIAkJcmVwb3J0ID0gaGlkX3JlZ2lzdGVyX3JlcG9ydChoZGV2LCBISURfSU5QVVRfUkVQT1JULAogCQkJTU9VU0VfUkVQT1JUX0lEKTsKQEAgLTUwMSw5ICs0OTksMTcgQEAKIAl9CiAJcmVwb3J0LT5zaXplID0gNjsKIAorCS8qCisJICogU29tZSBkZXZpY2VzIHJlcG9uZCB3aXRoICdpbnZhbGlkIHJlcG9ydCBpZCcgd2hlbiBmZWF0dXJlCisJICogcmVwb3J0IHN3aXRjaGluZyBpdCBpbnRvIG11bHRpdG91Y2ggbW9kZSBpcyBzZW50IHRvIGl0LgorCSAqCisJICogVGhpcyByZXN1bHRzIGluIC1FSU8gZnJvbSB0aGUgX3JhdyBsb3ctbGV2ZWwgdHJhbnNwb3J0IGNhbGxiYWNrLAorCSAqIGJ1dCB0aGVyZSBzZWVtcyB0byBiZSBubyBvdGhlciB3YXkgb2Ygc3dpdGNoaW5nIHRoZSBtb2RlLgorCSAqIFRodXMgdGhlIHN1cGVyLXVnbHkgaGFja3kgc3VjY2VzcyBjaGVjayBiZWxvdy4KKwkgKi8KIAlyZXQgPSBoZGV2LT5oaWRfb3V0cHV0X3Jhd19yZXBvcnQoaGRldiwgZmVhdHVyZSwgc2l6ZW9mKGZlYXR1cmUpLAogCQkJSElEX0ZFQVRVUkVfUkVQT1JUKTsKLQlpZiAocmV0ICE9IHNpemVvZihmZWF0dXJlKSkgeworCWlmIChyZXQgIT0gLUVJTyAmJiByZXQgIT0gc2l6ZW9mKGZlYXR1cmUpKSB7CiAJCWhpZF9lcnIoaGRldiwgInVuYWJsZSB0byByZXF1ZXN0IHRvdWNoIGRhdGEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfc3RvcF9odzsKIAl9CkBAIC01NDAsNiArNTQ2LDcgQEAKIAkucmVtb3ZlID0gbWFnaWNtb3VzZV9yZW1vdmUsCiAJLnJhd19ldmVudCA9IG1hZ2ljbW91c2VfcmF3X2V2ZW50LAogCS5pbnB1dF9tYXBwaW5nID0gbWFnaWNtb3VzZV9pbnB1dF9tYXBwaW5nLAorCS5pbnB1dF9yZWdpc3RlciA9IG1hZ2ljbW91c2Vfc2V0dXBfaW5wdXQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtYWdpY21vdXNlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCmluZGV4IGVlMDFlNjUuLmU4NGNlZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYwpAQCAtMTY1LDYgKzE2NSwxNiBAQAogCXN0cnVjdCBtdF9jbGFzcyAqY2xzID0gdGQtPm10Y2xhc3M7CiAJX19zMzIgcXVpcmtzID0gY2xzLT5xdWlya3M7CiAKKwkvKiBPbmx5IG1hcCBmaWVsZHMgZnJvbSBUb3VjaFNjcmVlbiBvciBUb3VjaFBhZCBjb2xsZWN0aW9ucy4KKyAgICAgICAgICogV2UgbmVlZCB0byBpZ25vcmUgZmllbGRzIHRoYXQgYmVsb25nIHRvIG90aGVyIGNvbGxlY3Rpb25zCisgICAgICAgICAqIHN1Y2ggYXMgTW91c2UgdGhhdCBtaWdodCBoYXZlIHRoZSBzYW1lIEdlbmVyaWNEZXNrdG9wIHVzYWdlcy4gKi8KKwlpZiAoZmllbGQtPmFwcGxpY2F0aW9uID09IEhJRF9ER19UT1VDSFNDUkVFTikKKwkJc2V0X2JpdChJTlBVVF9QUk9QX0RJUkVDVCwgaGktPmlucHV0LT5wcm9wYml0KTsKKwllbHNlIGlmIChmaWVsZC0+YXBwbGljYXRpb24gPT0gSElEX0RHX1RPVUNIUEFEKQorCQlzZXRfYml0KElOUFVUX1BST1BfUE9JTlRFUiwgaGktPmlucHV0LT5wcm9wYml0KTsKKwllbHNlCisJCXJldHVybiAwOworCiAJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpIHsKIAogCWNhc2UgSElEX1VQX0dFTkRFU0s6CkBAIC01MDMsNiArNTEzLDExIEBACiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSVJUT1VDSFNZU1RFTVMsCiAJCQlVU0JfREVWSUNFX0lEX0lSVE9VQ0hfSU5GUkFSRURfVVNCKSB9LAogCisJLyogTEcgRGlzcGxheSBwYW5lbHMgKi8KKwl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19ERUZBVUxULAorCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xHLAorCQkJVVNCX0RFVklDRV9JRF9MR19NVUxUSVRPVUNIKSB9LAorCiAJLyogUGl4Q2lyLWJhc2VkIHBhbmVscyAqLwogCXsgLmRyaXZlcl9kYXRhID0gTVRfQ0xTX0RVQUxfSU5SQU5HRV9DT05UQUNUSUQsCiAJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSEFOVk9OLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYyBiL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKaW5kZXggYjVlODkyMC4uMzQ2MjI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCkBAIC02NzMsNiArNjczLDcgQEAKIAllbHNlCiAJCWVyciA9IC1FSU87CiAKKwlBQ1BJX0ZSRUUocmV0KTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKaW5kZXggMTk0Y2EwYS4uMDhjZWE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCSAqIElmIHRoZSBUak1heCBpcyBub3QgcGxhdXNpYmxlLCBhbiBhc3N1bXB0aW9uCiAJCSAqIHdpbGwgYmUgdXNlZAogCQkgKi8KLQkJaWYgKCh2YWwgPiA4MCkgJiYgKHZhbCA8IDEyMCkpIHsKKwkJaWYgKHZhbCA+PSA3MCAmJiB2YWwgPD0gMTI1KSB7CiAJCQlkZXZfaW5mbyhkZXYsICJUak1heCBpcyAlZCBDLlxuIiwgdmFsKTsKIAkJCXJldHVybiB2YWwgKiAxMDAwOwogCQl9CkBAIC0yNzEsMjQgKzI3MSw5IEBACiAKIAkvKgogCSAqIEFuIGFzc3VtcHRpb24gaXMgbWFkZSBmb3IgZWFybHkgQ1BVcyBhbmQgdW5yZWFkYWJsZSBNU1IuCi0JICogTk9URTogdGhlIGdpdmVuIHZhbHVlIG1heSBub3QgYmUgY29ycmVjdC4KKwkgKiBOT1RFOiB0aGUgY2FsY3VsYXRlZCB2YWx1ZSBtYXkgbm90IGJlIGNvcnJlY3QuCiAJICovCi0KLQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewotCWNhc2UgMHhlOgotCWNhc2UgMHhmOgotCWNhc2UgMHgxNjoKLQljYXNlIDB4MWE6Ci0JCWRldl93YXJuKGRldiwgIlRqTWF4IGlzIGFzc3VtZWQgYXMgMTAwIEMhXG4iKTsKLQkJcmV0dXJuIDEwMDAwMDsKLQljYXNlIDB4MTc6Ci0JY2FzZSAweDFjOgkJLyogQXRvbSBDUFVzICovCi0JCXJldHVybiBhZGp1c3RfdGptYXgoYywgaWQsIGRldik7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oZGV2LCAiQ1BVIChtb2RlbD0weCV4KSBpcyBub3Qgc3VwcG9ydGVkIHlldCwiCi0JCQkiIHVzaW5nIGRlZmF1bHQgVGpNYXggb2YgMTAwQy5cbiIsIGMtPng4Nl9tb2RlbCk7Ci0JCXJldHVybiAxMDAwMDA7Ci0JfQorCXJldHVybiBhZGp1c3RfdGptYXgoYywgaWQsIGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfdWNvZGVfcmV2X29uX2NwdSh2b2lkICplZHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2libWFlbS5jIGIvZHJpdmVycy9od21vbi9pYm1hZW0uYwppbmRleCBiYzZlMmFiLi5hZmZjMTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libWFlbS5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKQEAgLTk0Nyw2ICs5NDcsNyBAQAogCiAJLyogU2V0IHVwIHJlYWQtb25seSBzZW5zb3JzICovCiAJd2hpbGUgKHJvLT5sYWJlbCkgeworCQlzeXNmc19hdHRyX2luaXQoJnNlbnNvcnMtPmRldl9hdHRyLmF0dHIpOwogCQlzZW5zb3JzLT5kZXZfYXR0ci5hdHRyLm5hbWUgPSByby0+bGFiZWw7CiAJCXNlbnNvcnMtPmRldl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CiAJCXNlbnNvcnMtPmRldl9hdHRyLnNob3cgPSByby0+c2hvdzsKQEAgLTk2Myw2ICs5NjQsNyBAQAogCiAJLyogU2V0IHVwIHJlYWQtd3JpdGUgc2Vuc29ycyAqLwogCXdoaWxlIChydy0+bGFiZWwpIHsKKwkJc3lzZnNfYXR0cl9pbml0KCZzZW5zb3JzLT5kZXZfYXR0ci5hdHRyKTsKIAkJc2Vuc29ycy0+ZGV2X2F0dHIuYXR0ci5uYW1lID0gcnctPmxhYmVsOwogCQlzZW5zb3JzLT5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUjsKIAkJc2Vuc29ycy0+ZGV2X2F0dHIuc2hvdyA9IHJ3LT5zaG93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1wZXguYyBiL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKaW5kZXggMDZkNGVhZi4uNDFkYmY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pYm1wZXguYworKysgYi9kcml2ZXJzL2h3bW9uL2libXBleC5jCkBAIC0zNTgsNiArMzU4LDcgQEAKIAllbHNlIGlmICh0eXBlID09IFBPV0VSX1NFTlNPUikKIAkJc3ByaW50ZihuLCBwb3dlcl9zZW5zb3JfbmFtZV90ZW1wbGF0ZXNbZnVuY10sICJwb3dlciIsIGNvdW50ZXIpOwogCisJc3lzZnNfYXR0cl9pbml0KCZkYXRhLT5zZW5zb3JzW3NlbnNvcl0uYXR0cltmdW5jXS5kZXZfYXR0ci5hdHRyKTsKIAlkYXRhLT5zZW5zb3JzW3NlbnNvcl0uYXR0cltmdW5jXS5kZXZfYXR0ci5hdHRyLm5hbWUgPSBuOwogCWRhdGEtPnNlbnNvcnNbc2Vuc29yXS5hdHRyW2Z1bmNdLmRldl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CiAJZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuc2hvdyA9IGlibXBleF9zaG93X3NlbnNvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggMzE2YjY0OC4uYThkMjM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTE1MzUsNyArMTUzNSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpdDg3X2dyb3VwX2xhYmVsID0gewotCS5hdHRycyA9IGl0ODdfYXR0cmlidXRlc192aWQsCisJLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2xhYmVsLAogfTsKIAogLyogU3VwZXJJTyBkZXRlY3Rpb24gLSB3aWxsIGNoYW5nZSBpc2FfYWRkcmVzcyBpZiBhIGNoaXAgaXMgZm91bmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jIGIvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKaW5kZXggMWE2ZGZiNi4uZDNiNDY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQxLmMKQEAgLTk4LDExICs5OCwxNiBAQAogfTsKIAogLyogQ29udmVyc2lvbnMgKi8KLXN0YXRpYyBpbnQgVGVtcEZyb21SZWcodTggdmFsX2gsIHU4IHZhbF9sKQorc3RhdGljIGludCB0ZW1wX2Zyb21fcmVnX3NpZ25lZCh1OCB2YWxfaCwgdTggdmFsX2wpCiB7Ci0JaWYgKHZhbF9oICYgMHg4MCkKLQkJcmV0dXJuIHZhbF9oIC0gMHgxMDA7Ci0JcmV0dXJuIHZhbF9oICogMTAwMCArIHZhbF9sICogMTAwMCAvIDI1NjsKKwlzMTYgdmFsX2hsID0gKHZhbF9oIDw8IDgpIHwgdmFsX2w7CisJcmV0dXJuIHZhbF9obCAqIDEwMDAgLyAyNTY7Cit9CisKK3N0YXRpYyBpbnQgdGVtcF9mcm9tX3JlZ191bnNpZ25lZCh1OCB2YWxfaCwgdTggdmFsX2wpCit7CisJdTE2IHZhbF9obCA9ICh2YWxfaCA8PCA4KSB8IHZhbF9sOworCXJldHVybiB2YWxfaGwgKiAxMDAwIC8gMjU2OwogfQogCiBzdGF0aWMgc3RydWN0IGxtOTUyNDFfZGF0YSAqbG05NTI0MV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTEzNSwxMCArMTQwLDEzIEBACiAJCQkgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKLQkJVGVtcEZyb21SZWcoZGF0YS0+dGVtcFt0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4XSwKLQkJCSAgICBkYXRhLT50ZW1wW3RvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggKyAxXSkpOworCQkJaW5kZXggPT0gMCB8fCAoZGF0YS0+Y29uZmlnICYgKDEgPDwgKGluZGV4IC8gMikpKSA/CisJCXRlbXBfZnJvbV9yZWdfc2lnbmVkKGRhdGEtPnRlbXBbaW5kZXhdLCBkYXRhLT50ZW1wW2luZGV4ICsgMV0pIDoKKwkJdGVtcF9mcm9tX3JlZ191bnNpZ25lZChkYXRhLT50ZW1wW2luZGV4XSwKKwkJCQkgICAgICAgZGF0YS0+dGVtcFtpbmRleCArIDFdKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMzM5LDcgKzM0Nyw3IEBACiAJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCiAJICAgICA9PSBNQU5VRkFDVFVSRVJfSUQpCiAJICAgICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKQotCQk+PSBERUZBVUxUX1JFVklTSU9OKSkgeworCQk9PSBERUZBVUxUX1JFVklTSU9OKSkgewogCQluYW1lID0gREVWTkFNRTsKIAl9IGVsc2UgewogCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJMTTk1MjQxIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxMTExLmMgYi9kcml2ZXJzL2h3bW9uL21heDExMTEuYwppbmRleCAxMmE1NGFhLi4xNDMzNWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDExMTEuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDExMTEuYwpAQCAtNDAsNiArNDAsOCBAQAogCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlclsyXTsKIAl1aW50OF90ICp0eF9idWY7CiAJdWludDhfdCAqcnhfYnVmOworCXN0cnVjdCBtdXRleAkJZHJ2ZGF0YV9sb2NrOworCS8qIHByb3RlY3QgbXNnLCB4ZmVyIGFuZCBidWZmZXJzIGZyb20gbXVsdGlwbGUgYWNjZXNzICovCiB9OwogCiBzdGF0aWMgaW50IG1heDExMTFfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjaGFubmVsKQpAQCAtNDgsNiArNTAsOSBAQAogCXVpbnQ4X3QgdjEsIHYyOwogCWludCBlcnI7CiAKKwkvKiB3cml0aW5nIHRvIGRydmRhdGEgc3RydWN0IGlzIG5vdCB0aHJlYWQgc2FmZSwgd2FpdCBvbiBtdXRleCAqLworCW11dGV4X2xvY2soJmRhdGEtPmRydmRhdGFfbG9jayk7CisKIAlkYXRhLT50eF9idWZbMF0gPSAoY2hhbm5lbCA8PCBNQVgxMTExX0NUUkxfU0VMX1NIKSB8CiAJCU1BWDExMTFfQ1RSTF9QRDAgfCBNQVgxMTExX0NUUkxfUEQxIHwKIAkJTUFYMTExMV9DVFJMX1NHTCB8IE1BWDExMTFfQ1RSTF9VTkkgfCBNQVgxMTExX0NUUkxfU1RSOwpAQCAtNTUsMTIgKzYwLDE1IEBACiAJZXJyID0gc3BpX3N5bmMoZGF0YS0+c3BpLCAmZGF0YS0+bXNnKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKGRldiwgInNwaV9zeW5jIGZhaWxlZCB3aXRoICVkXG4iLCBlcnIpOworCQltdXRleF91bmxvY2soJmRhdGEtPmRydmRhdGFfbG9jayk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJdjEgPSBkYXRhLT5yeF9idWZbMF07CiAJdjIgPSBkYXRhLT5yeF9idWZbMV07CiAKKwltdXRleF91bmxvY2soJmRhdGEtPmRydmRhdGFfbG9jayk7CisKIAlpZiAoKHYxICYgMHhjMCkgfHwgKHYyICYgMHgzZikpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNzYsNiArMTg0LDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9mcmVlX2RhdGE7CiAKKwltdXRleF9pbml0KCZkYXRhLT5kcnZkYXRhX2xvY2spOworCiAJZGF0YS0+c3BpID0gc3BpOwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGRhdGEpOwogCkBAIC0yMTMsNiArMjIzLDcgQEAKIAogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmbWF4MTExMV9hdHRyX2dyb3VwKTsKKwltdXRleF9kZXN0cm95KCZkYXRhLT5kcnZkYXRhX2xvY2spOwogCWtmcmVlKGRhdGEtPnJ4X2J1Zik7CiAJa2ZyZWUoZGF0YS0+dHhfYnVmKTsKIAlrZnJlZShkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMuYwppbmRleCA5OGUyZTI4Li45YjFmMGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy5jCkBAIC00NywyMiArNDcsMjkgQEAKIAlpZiAoaW5mby0+ZnVuY1swXQogCSAgICAmJiBwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfU1RBVFVTX0lOUFVUKSkKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1NUQVRVU19JTlBVVDsKLQlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfRkFOX1NQRUVEXzEpKSB7CisJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19GQU5fQ09ORklHXzEyKSAmJgorCSAgICBwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9GQU5fU1BFRURfMSkpIHsKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX0ZBTjEyOwogCQlpZiAocG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1NUQVRVU19GQU5fMTIpKQogCQkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1NUQVRVU19GQU4xMjsKIAl9Ci0JaWYgKHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19SRUFEX0ZBTl9TUEVFRF8zKSkgeworCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfRkFOX0NPTkZJR18zNCkgJiYKKwkgICAgcG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfRkFOX1NQRUVEXzMpKSB7CiAJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9GQU4zNDsKIAkJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19TVEFUVVNfRkFOXzM0KSkKIAkJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9TVEFUVVNfRkFOMzQ7CiAJfQotCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9URU1QRVJBVFVSRV8xKSkgeworCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfUkVBRF9URU1QRVJBVFVSRV8xKSkKIAkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1RFTVA7Ci0JCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwKLQkJCQkJICAgICAgUE1CVVNfU1RBVFVTX1RFTVBFUkFUVVJFKSkKKwlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMikpCisJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9URU1QMjsKKwlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIDAsIFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMykpCisJCWluZm8tPmZ1bmNbMF0gfD0gUE1CVVNfSEFWRV9URU1QMzsKKwlpZiAoaW5mby0+ZnVuY1swXSAmIChQTUJVU19IQVZFX1RFTVAgfCBQTUJVU19IQVZFX1RFTVAyCisJCQkgICAgIHwgUE1CVVNfSEFWRV9URU1QMykKKwkgICAgJiYgcG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihjbGllbnQsIDAsCisJCQkJCSBQTUJVU19TVEFUVVNfVEVNUEVSQVRVUkUpKQogCQkJaW5mby0+ZnVuY1swXSB8PSBQTUJVU19IQVZFX1NUQVRVU19URU1QOwotCX0KIAogCS8qIFNlbnNvcnMgZGV0ZWN0ZWQgb24gYWxsIHBhZ2VzICovCiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IGluZm8tPnBhZ2VzOyBwYWdlKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jIGIvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKaW5kZXggMTk2ZmZhZi4uODIxN2QxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKQEAgLTM1NSw4ICszNTUsOCBAQAogICogQ29udmVydCBsaW5lYXIgc2Vuc29yIHZhbHVlcyB0byBtaWxsaS0gb3IgbWljcm8tdW5pdHMKICAqIGRlcGVuZGluZyBvbiBzZW5zb3IgdHlwZS4KICAqLwotc3RhdGljIGludCBwbWJ1c19yZWcyZGF0YV9saW5lYXIoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCi0JCQkJIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKK3N0YXRpYyBsb25nIHBtYnVzX3JlZzJkYXRhX2xpbmVhcihzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKKwkJCQkgIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKIHsKIAlzMTYgZXhwb25lbnQ7CiAJczMyIG1hbnRpc3NhOwpAQCAtMzkwLDE1ICszOTAsMTUgQEAKIAllbHNlCiAJCXZhbCA+Pj0gLWV4cG9uZW50OwogCi0JcmV0dXJuIChpbnQpdmFsOworCXJldHVybiB2YWw7CiB9CiAKIC8qCiAgKiBDb252ZXJ0IGRpcmVjdCBzZW5zb3IgdmFsdWVzIHRvIG1pbGxpLSBvciBtaWNyby11bml0cwogICogZGVwZW5kaW5nIG9uIHNlbnNvciB0eXBlLgogICovCi1zdGF0aWMgaW50IHBtYnVzX3JlZzJkYXRhX2RpcmVjdChzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKLQkJCQkgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQorc3RhdGljIGxvbmcgcG1idXNfcmVnMmRhdGFfZGlyZWN0KHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAorCQkJCSAgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQogewogCWxvbmcgdmFsID0gKHMxNikgc2Vuc29yLT5kYXRhOwogCWxvbmcgbSwgYiwgUjsKQEAgLTQzMywxMiArNDMzLDEyIEBACiAJCVIrKzsKIAl9CiAKLQlyZXR1cm4gKGludCkoKHZhbCAtIGIpIC8gbSk7CisJcmV0dXJuICh2YWwgLSBiKSAvIG07CiB9CiAKLXN0YXRpYyBpbnQgcG1idXNfcmVnMmRhdGEoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKK3N0YXRpYyBsb25nIHBtYnVzX3JlZzJkYXRhKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLCBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IpCiB7Ci0JaW50IHZhbDsKKwlsb25nIHZhbDsKIAogCWlmIChkYXRhLT5pbmZvLT5kaXJlY3Rbc2Vuc29yLT5jbGFzc10pCiAJCXZhbCA9IHBtYnVzX3JlZzJkYXRhX2RpcmVjdChkYXRhLCBzZW5zb3IpOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAJaWYgKCFzMSAmJiAhczIpCiAJCSp2YWwgPSAhIXJlZ3ZhbDsKIAllbHNlIHsKLQkJaW50IHYxLCB2MjsKKwkJbG9uZyB2MSwgdjI7CiAJCXN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcjEsICpzZW5zb3IyOwogCiAJCXNlbnNvcjEgPSAmZGF0YS0+c2Vuc29yc1tzMV07CkBAIC02NTQsNyArNjU0LDcgQEAKIAlpZiAoc2Vuc29yLT5kYXRhIDwgMCkKIAkJcmV0dXJuIHNlbnNvci0+ZGF0YTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBwbWJ1c19yZWcyZGF0YShkYXRhLCBzZW5zb3IpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIHBtYnVzX3JlZzJkYXRhKGRhdGEsIHNlbnNvcikpOwogfQogCiBzdGF0aWMgc3NpemVfdCBwbWJ1c19zZXRfc2Vuc29yKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTcwMCw2ICs3MDAsNyBAQAogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYQkJCQlcCiAJICAgID0gJmRhdGEtPl90eXBlIyNzW2RhdGEtPm51bV8jI190eXBlIyNzXS5hdHRyaWJ1dGU7CQlcCiAJQlVHX09OKGRhdGEtPm51bV9hdHRyaWJ1dGVzID49IGRhdGEtPm1heF9hdHRyaWJ1dGVzKTsJCVwKKwlzeXNmc19hdHRyX2luaXQoJmEtPmRldl9hdHRyLmF0dHIpOwkJCQlcCiAJYS0+ZGV2X2F0dHIuYXR0ci5uYW1lID0gX25hbWU7CQkJCQlcCiAJYS0+ZGV2X2F0dHIuYXR0ci5tb2RlID0gX21vZGU7CQkJCQlcCiAJYS0+ZGV2X2F0dHIuc2hvdyA9IF9zaG93OwkJCQkJXApAQCAtMTUxNywxNCArMTUxOCw5IEBACiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JLyoKLQkgKiBCYWlsIG91dCBpZiBzdGF0dXMgcmVnaXN0ZXIgb3IgUE1CdXMgcmV2aXNpb24gcmVnaXN0ZXIKLQkgKiBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgUE1CVVNfU1RBVFVTX0JZVEUpIDwgMAotCSAgICB8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBQTUJVU19SRVZJU0lPTikgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJIlN0YXR1cyBvciByZXZpc2lvbiByZWdpc3RlciBub3QgZm91bmRcbiIpOworCS8qIEJhaWwgb3V0IGlmIFBNQnVzIHN0YXR1cyByZWdpc3RlciBkb2VzIG5vdCBleGlzdC4gKi8KKwlpZiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgUE1CVVNfU1RBVFVTX0JZVEUpIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBNQnVzIHN0YXR1cyByZWdpc3RlciBub3QgZm91bmRcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dF9kYXRhOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vczNjLWh3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL3MzYy1od21vbi5jCmluZGV4IDkyYjQyZGIuLmIzOWY1MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vczNjLWh3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9zM2MtaHdtb24uYwpAQCAtMjMyLDYgKzIzMiw3IEBACiAKIAlhdHRyID0gJmF0dHJzLT5pbjsKIAlhdHRyLT5pbmRleCA9IGNoYW5uZWw7CisJc3lzZnNfYXR0cl9pbml0KCZhdHRyLT5kZXZfYXR0ci5hdHRyKTsKIAlhdHRyLT5kZXZfYXR0ci5hdHRyLm5hbWUgID0gYXR0cnMtPmluX25hbWU7CiAJYXR0ci0+ZGV2X2F0dHIuYXR0ci5tb2RlICA9IFNfSVJVR087CiAJYXR0ci0+ZGV2X2F0dHIuc2hvdyA9IHMzY19od21vbl9jaF9zaG93OwpAQCAtMjQ5LDYgKzI1MCw3IEBACiAKIAkJYXR0ciA9ICZhdHRycy0+bGFiZWw7CiAJCWF0dHItPmluZGV4ID0gY2hhbm5lbDsKKwkJc3lzZnNfYXR0cl9pbml0KCZhdHRyLT5kZXZfYXR0ci5hdHRyKTsKIAkJYXR0ci0+ZGV2X2F0dHIuYXR0ci5uYW1lICA9IGF0dHJzLT5sYWJlbF9uYW1lOwogCQlhdHRyLT5kZXZfYXR0ci5hdHRyLm1vZGUgID0gU19JUlVHTzsKIAkJYXR0ci0+ZGV2X2F0dHIuc2hvdyA9IHMzY19od21vbl9sYWJlbF9zaG93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10YW9zLWV2bS5jCmluZGV4IGRkMzljMWUuLjI2YzM1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGFvcy1ldm0uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRhb3MtZXZtLmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiAJaWYgKHRhb3MtPnN0YXRlICE9IFRBT1NfU1RBVEVfSURMRSkgewogCQllcnIgPSAtRU5PREVWOwotCQlkZXZfZGJnKCZzZXJpby0+ZGV2LCAiVEFPUyBFVk0gcmVzZXQgZmFpbGVkIChzdGF0ZT0lZCwgIgorCQlkZXZfZXJyKCZzZXJpby0+ZGV2LCAiVEFPUyBFVk0gcmVzZXQgZmFpbGVkIChzdGF0ZT0lZCwgIgogCQkJInBvcz0lZClcbiIsIHRhb3MtPnN0YXRlLCB0YW9zLT5wb3MpOwogCQlnb3RvIGV4aXRfY2xvc2U7CiAJfQpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDI1MCkpOwogCWlmICh0YW9zLT5zdGF0ZSAhPSBUQU9TX1NUQVRFX0lETEUpIHsKIAkJZXJyID0gLUVOT0RFVjsKLQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiRWNobyBvZmYgZmFpbGVkICIKKwkJZGV2X2Vycigmc2VyaW8tPmRldiwgIlRBT1MgRVZNIGVjaG8gb2ZmIGZhaWxlZCAiCiAJCQkiKHN0YXRlPSVkKVxuIiwgdGFvcy0+c3RhdGUpOwogCQlnb3RvIGV4aXRfY2xvc2U7CiAJfQpAQCAtMjYzLDcgKzI2Myw3IEBACiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKGFkYXB0ZXIpOwogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9jbG9zZTsKLQlkZXZfZGJnKCZzZXJpby0+ZGV2LCAiQ29ubmVjdGVkIHRvIFRBT1MgRVZNXG4iKTsKKwlkZXZfaW5mbygmc2VyaW8tPmRldiwgIkNvbm5lY3RlZCB0byBUQU9TIEVWTVxuIik7CiAKIAl0YW9zLT5jbGllbnQgPSB0YW9zX2luc3RhbnRpYXRlX2RldmljZShhZGFwdGVyKTsKIAlyZXR1cm4gMDsKQEAgLTI4OCw3ICsyODgsNyBAQAogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKIAlrZnJlZSh0YW9zKTsKIAotCWRldl9kYmcoJnNlcmlvLT5kZXYsICJEaXNjb25uZWN0ZWQgZnJvbSBUQU9TIEVWTVxuIik7CisJZGV2X2luZm8oJnNlcmlvLT5kZXYsICJEaXNjb25uZWN0ZWQgZnJvbSBUQU9TIEVWTVxuIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkIHRhb3Nfc2VyaW9faWRzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKaW5kZXggYjRhYjM5Yi4uNWYxYjkyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYwpAQCAtMzMwLDYgKzMzMCwxMSBAQAogCWkyY193cml0ZWwoaTJjX2RldiwgMCwgSTJDX0lOVF9NQVNLKTsKIAljbGtfc2V0X3JhdGUoaTJjX2Rldi0+Y2xrLCBpMmNfZGV2LT5idXNfY2xrX3JhdGUgKiA4KTsKIAorCWlmICghaTJjX2Rldi0+aXNfZHZjKSB7CisJCXUzMiBzbF9jZmcgPSBpMmNfcmVhZGwoaTJjX2RldiwgSTJDX1NMX0NORkcpOworCQlpMmNfd3JpdGVsKGkyY19kZXYsIHNsX2NmZyB8IEkyQ19TTF9DTkZHX05FV1NMLCBJMkNfU0xfQ05GRyk7CisJfQorCiAJdmFsID0gNyA8PCBJMkNfRklGT19DT05UUk9MX1RYX1RSSUdfU0hJRlQgfAogCQkwIDw8IEkyQ19GSUZPX0NPTlRST0xfUlhfVFJJR19TSElGVDsKIAlpMmNfd3JpdGVsKGkyY19kZXYsIHZhbCwgSTJDX0ZJRk9fQ09OVFJPTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9wY2E5NTR4LmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9wY2E5NTR4LmMKaW5kZXggNTRlMWNlNy4uNmY4OTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvcGNhOTU0eC5jCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL3BjYTk1NHguYwpAQCAtMjAxLDEwICsyMDEsMTEgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCi0JLyogUmVhZCB0aGUgbXV4IHJlZ2lzdGVyIGF0IGFkZHIgdG8gdmVyaWZ5Ci0JICogdGhhdCB0aGUgbXV4IGlzIGluIGZhY3QgcHJlc2VudC4KKwkvKiBXcml0ZSB0aGUgbXV4IHJlZ2lzdGVyIGF0IGFkZHIgdG8gdmVyaWZ5CisJICogdGhhdCB0aGUgbXV4IGlzIGluIGZhY3QgcHJlc2VudC4gVGhpcyBhbHNvCisJICogaW5pdGlhbGl6ZXMgdGhlIG11eCB0byBkaXNjb25uZWN0ZWQgc3RhdGUuCiAJICovCi0JaWYgKGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KSA8IDApIHsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAwKSA8IDApIHsKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAicHJvYmUgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCBhNWVjNWE3Yy4uOTU2MDgyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTE3NzMsNyArMTc3Myw4IEBACiAKIAlnLT5taW5vcnMgPSAxOwogCWctPmRyaXZlcmZzX2RldiA9ICZkcml2ZS0+Z2VuZGV2OwotCWctPmZsYWdzID0gR0VOSERfRkxfQ0QgfCBHRU5IRF9GTF9SRU1PVkFCTEU7CisJZy0+ZmxhZ3MgPSBHRU5IRF9GTF9DRCB8IEdFTkhEX0ZMX1JFTU9WQUJMRSB8CisJCSAgIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFOwogCWlmIChpZGVfY2Ryb21fc2V0dXAoZHJpdmUpKSB7CiAJCXB1dF9kZXZpY2UoJmluZm8tPmRldik7CiAJCWdvdG8gZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IGViYmNlZWQuLmUzYzg4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTE3NTcsNyArMTc1Nyw3IEBACiAJfSBlbHNlIGlmICh0ZXN0X2JpdChBQlNfTVRfVFJBQ0tJTkdfSUQsIGRldi0+YWJzYml0KSkgewogCQltdF9zbG90cyA9IGRldi0+YWJzaW5mb1tBQlNfTVRfVFJBQ0tJTkdfSURdLm1heGltdW0gLQogCQkJICAgZGV2LT5hYnNpbmZvW0FCU19NVF9UUkFDS0lOR19JRF0ubWluaW11bSArIDEsCi0JCWNsYW1wKG10X3Nsb3RzLCAyLCAzMik7CisJCW10X3Nsb3RzID0gY2xhbXAobXRfc2xvdHMsIDIsIDMyKTsKIAl9IGVsc2UgaWYgKHRlc3RfYml0KEFCU19NVF9QT1NJVElPTl9YLCBkZXYtPmFic2JpdCkpIHsKIAkJbXRfc2xvdHMgPSAyOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKaW5kZXggNzYzMDI3M2UuLmY4YmE3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlpZiAoc2l6ZSA9PSAwKQogCQkJc2l6ZSA9IHhyZXMgPyA6IDE7CiAKLQkJY2xhbXAodmFsdWUsIG1pbiwgbWF4KTsKKwkJdmFsdWUgPSBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpOwogCiAJCW1vdXNlZGV2LT5wYWNrZXQueCA9ICgodmFsdWUgLSBtaW4pICogeHJlcykgLyBzaXplOwogCQltb3VzZWRldi0+cGFja2V0LmFic19ldmVudCA9IDE7CkBAIC0yMDEsNyArMjAxLDcgQEAKIAkJaWYgKHNpemUgPT0gMCkKIAkJCXNpemUgPSB5cmVzID8gOiAxOwogCi0JCWNsYW1wKHZhbHVlLCBtaW4sIG1heCk7CisJCXZhbHVlID0gY2xhbXAodmFsdWUsIG1pbiwgbWF4KTsKIAogCQltb3VzZWRldi0+cGFja2V0LnkgPSB5cmVzIC0gKCh2YWx1ZSAtIG1pbikgKiB5cmVzKSAvIHNpemU7CiAJCW1vdXNlZGV2LT5wYWNrZXQuYWJzX2V2ZW50ID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDVjOTM2MjcuLjcwYmQ3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtNDkzLDExICs0OTMsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlzYiA9IGttYXBfYXRvbWljKGJpdG1hcC0+c2JfcGFnZSwgS01fVVNFUjApOwogCXNiLT5ldmVudHMgPSBjcHVfdG9fbGU2NChiaXRtYXAtPm1kZGV2LT5ldmVudHMpOwotCWlmIChiaXRtYXAtPm1kZGV2LT5ldmVudHMgPCBiaXRtYXAtPmV2ZW50c19jbGVhcmVkKSB7CisJaWYgKGJpdG1hcC0+bWRkZXYtPmV2ZW50cyA8IGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQpCiAJCS8qIHJvY2tpbmcgYmFjayB0byByZWFkLW9ubHkgKi8KIAkJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGJpdG1hcC0+bWRkZXYtPmV2ZW50czsKLQkJc2ItPmV2ZW50c19jbGVhcmVkID0gY3B1X3RvX2xlNjQoYml0bWFwLT5ldmVudHNfY2xlYXJlZCk7Ci0JfQorCXNiLT5ldmVudHNfY2xlYXJlZCA9IGNwdV90b19sZTY0KGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQpOworCXNiLT5zdGF0ZSA9IGNwdV90b19sZTMyKGJpdG1hcC0+ZmxhZ3MpOwogCS8qIEp1c3QgaW4gY2FzZSB0aGVzZSBoYXZlIGJlZW4gY2hhbmdlZCB2aWEgc3lzZnM6ICovCiAJc2ItPmRhZW1vbl9zbGVlcCA9IGNwdV90b19sZTMyKGJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcC9IWik7CiAJc2ItPndyaXRlX2JlaGluZCA9IGNwdV90b19sZTMyKGJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQpOwpAQCAtNjE4LDcgKzYxOCw3IEBACiAJaWYgKGxlMzJfdG9fY3B1KHNiLT52ZXJzaW9uKSA9PSBCSVRNQVBfTUFKT1JfSE9TVEVORElBTikKIAkJYml0bWFwLT5mbGFncyB8PSBCSVRNQVBfSE9TVEVORElBTjsKIAliaXRtYXAtPmV2ZW50c19jbGVhcmVkID0gbGU2NF90b19jcHUoc2ItPmV2ZW50c19jbGVhcmVkKTsKLQlpZiAoc2ItPnN0YXRlICYgY3B1X3RvX2xlMzIoQklUTUFQX1NUQUxFKSkKKwlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9TVEFMRSkKIAkJYml0bWFwLT5ldmVudHNfY2xlYXJlZCA9IGJpdG1hcC0+bWRkZXYtPmV2ZW50czsKIAllcnIgPSAwOwogb3V0OgpAQCAtNjUyLDkgKzY1MiwxMSBAQAogCXN3aXRjaCAob3ApIHsKIAljYXNlIE1BU0tfU0VUOgogCQlzYi0+c3RhdGUgfD0gY3B1X3RvX2xlMzIoYml0cyk7CisJCWJpdG1hcC0+ZmxhZ3MgfD0gYml0czsKIAkJYnJlYWs7CiAJY2FzZSBNQVNLX1VOU0VUOgogCQlzYi0+c3RhdGUgJj0gY3B1X3RvX2xlMzIofmJpdHMpOworCQliaXRtYXAtPmZsYWdzICY9IH5iaXRzOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCBhNTUwYTA1Ny4uYWE0ZTU3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwpAQCAtMTI5MCw3ICsxMjkwLDcgQEAKIAlpZiAoIWVycm9yICYmICFjbG9uZS0+ZXJyb3JzKQogCQlyZXR1cm4gMDsJLyogSS9PIGNvbXBsZXRlICovCiAKLQlpZiAoZXJyb3IgPT0gLUVPUE5PVFNVUFAgfHwgZXJyb3IgPT0gLUVSRU1PVEVJTykKKwlpZiAoZXJyb3IgPT0gLUVPUE5PVFNVUFAgfHwgZXJyb3IgPT0gLUVSRU1PVEVJTyB8fCBlcnJvciA9PSAtRUlMU0VRKQogCQlyZXR1cm4gZXJyb3I7CiAKIAlpZiAobXBpby0+cGdwYXRoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IGNiODM4MGMuLjUzZTYwM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTM2Miw2ICszNjIsNyBAQAogc3RhdGljIGludCBkZXZpY2VfYXJlYV9pc19pbnZhbGlkKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZXYsCiAJCQkJICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwogCXN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cyA9IGRhdGE7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGRldi0+YmRldjsKIAlzZWN0b3JfdCBkZXZfc2l6ZSA9CkBAIC0zNzAsNiArMzcxLDIyIEBACiAJCWxpbWl0cy0+bG9naWNhbF9ibG9ja19zaXplID4+IFNFQ1RPUl9TSElGVDsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyBleGlzdCB3aXRob3V0IHJlcXVlc3QgZnVuY3Rpb25zLAorCSAqIHN1Y2ggYXMgbG9vcCBkZXZpY2VzIG5vdCB5ZXQgYm91bmQgdG8gYmFja2luZyBmaWxlcy4KKwkgKiBGb3JiaWQgdGhlIHVzZSBvZiBzdWNoIGRldmljZXMuCisJICovCisJcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCWlmICghcSB8fCAhcS0+bWFrZV9yZXF1ZXN0X2ZuKSB7CisJCURNV0FSTigiJXM6ICVzIGlzIG5vdCB5ZXQgaW5pdGlhbGlzZWQ6ICIKKwkJICAgICAgICJzdGFydD0lbGx1LCBsZW49JWxsdSwgZGV2X3NpemU9JWxsdSIsCisJCSAgICAgICBkbV9kZXZpY2VfbmFtZSh0aS0+dGFibGUtPm1kKSwgYmRldm5hbWUoYmRldiwgYiksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZW4sCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldl9zaXplKTsKKwkJcmV0dXJuIDE7CisJfQorCiAJaWYgKCFkZXZfc2l6ZSkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCA3ZDZmN2YxLi5hN2VkMDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0yNDYyLDcgKzI0NjIsNyBAQAogCQlpZiAocmRldi0+cmFpZF9kaXNrID09IC0xKQogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCS8qIHBlcnNvbmFsaXR5IGRvZXMgYWxsIG5lZWRlZCBjaGVja3MgKi8KLQkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2sgPT0gTlVMTCkKKwkJaWYgKHJkZXYtPm1kZGV2LT5wZXJzLT5ob3RfcmVtb3ZlX2Rpc2sgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQllcnIgPSByZGV2LT5tZGRldi0+cGVycy0+CiAJCQlob3RfcmVtb3ZlX2Rpc2socmRldi0+bWRkZXYsIHJkZXYtPnJhaWRfZGlzayk7CkBAIC00MzQ3LDEzICs0MzQ3LDE5IEBACiAJZGlzay0+Zm9wcyA9ICZtZF9mb3BzOwogCWRpc2stPnByaXZhdGVfZGF0YSA9IG1kZGV2OwogCWRpc2stPnF1ZXVlID0gbWRkZXYtPnF1ZXVlOworCWJsa19xdWV1ZV9mbHVzaChtZGRldi0+cXVldWUsIFJFUV9GTFVTSCB8IFJFUV9GVUEpOwogCS8qIEFsbG93IGV4dGVuZGVkIHBhcnRpdGlvbnMuICBUaGlzIG1ha2VzIHRoZQogCSAqICdtZHAnIGRldmljZSByZWR1bmRhbnQsIGJ1dCB3ZSBjYW4ndCByZWFsbHkKIAkgKiByZW1vdmUgaXQgbm93LgogCSAqLwogCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX0VYVF9ERVZUOwotCWFkZF9kaXNrKGRpc2spOwogCW1kZGV2LT5nZW5kaXNrID0gZGlzazsKKwkvKiBBcyBzb29uIGFzIHdlIGNhbGwgYWRkX2Rpc2soKSwgYW5vdGhlciB0aHJlYWQgY291bGQgZ2V0CisJICogdGhyb3VnaCB0byBtZF9vcGVuLCBzbyBtYWtlIHN1cmUgaXQgZG9lc24ndCBnZXQgdG9vIGZhcgorCSAqLworCW11dGV4X2xvY2soJm1kZGV2LT5vcGVuX211dGV4KTsKKwlhZGRfZGlzayhkaXNrKTsKKwogCWVycm9yID0ga29iamVjdF9pbml0X2FuZF9hZGQoJm1kZGV2LT5rb2JqLCAmbWRfa3R5cGUsCiAJCQkJICAgICAmZGlza190b19kZXYoZGlzayktPmtvYmosICIlcyIsICJtZCIpOwogCWlmIChlcnJvcikgewpAQCAtNDM2Nyw4ICs0MzczLDcgQEAKIAlpZiAobWRkZXYtPmtvYmouc2QgJiYKIAkgICAgc3lzZnNfY3JlYXRlX2dyb3VwKCZtZGRldi0+a29iaiwgJm1kX2JpdG1hcF9ncm91cCkpCiAJCXByaW50ayhLRVJOX0RFQlVHICJwb2ludGxlc3Mgd2FybmluZ1xuIik7Ci0KLQlibGtfcXVldWVfZmx1c2gobWRkZXYtPnF1ZXVlLCBSRVFfRkxVU0ggfCBSRVFfRlVBKTsKKwltdXRleF91bmxvY2soJm1kZGV2LT5vcGVuX211dGV4KTsKICBhYm9ydDoKIAltdXRleF91bmxvY2soJmRpc2tzX211dGV4KTsKIAlpZiAoIWVycm9yICYmIG1kZGV2LT5rb2JqLnNkKSB7CkBAIC03MDU3LDYgKzcwNjIsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQmxvY2tlZCwgJnJkZXYtPmZsYWdzKSkKIAkJCQlzcGFyZXMrKzsKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggNDliZjVmOC4uM2QxM2QxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYWlkNV9zZXRfYmlfaHdfc2VnbWVudHMoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgY250KQogewotCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IHJhaWQ1X2JpX3BoeXNfc2VnbWVudHMoYmlvKSB8fCAoY250IDw8IDE2KTsKKwliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSByYWlkNV9iaV9waHlzX3NlZ21lbnRzKGJpbykgfCAoY250IDw8IDE2KTsKIH0KIAogLyogRmluZCBmaXJzdCBkYXRhIGRpc2sgaW4gYSByYWlkNiBzdHJpcGUgKi8KQEAgLTUxNCw3ICs1MTQsNyBAQAogCQliaSA9ICZzaC0+ZGV2W2ldLnJlcTsKIAogCQliaS0+YmlfcncgPSBydzsKLQkJaWYgKHJ3ID09IFdSSVRFKQorCQlpZiAocncgJiBXUklURSkKIAkJCWJpLT5iaV9lbmRfaW8gPSByYWlkNV9lbmRfd3JpdGVfcmVxdWVzdDsKIAkJZWxzZQogCQkJYmktPmJpX2VuZF9pbyA9IHJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q7CkBAIC01NDgsMTMgKzU0OCwxMyBAQAogCQkJYmktPmJpX2lvX3ZlY1swXS5idl9vZmZzZXQgPSAwOwogCQkJYmktPmJpX3NpemUgPSBTVFJJUEVfU0laRTsKIAkJCWJpLT5iaV9uZXh0ID0gTlVMTDsKLQkJCWlmIChydyA9PSBXUklURSAmJgorCQkJaWYgKChydyAmIFdSSVRFKSAmJgogCQkJICAgIHRlc3RfYml0KFI1X1JlV3JpdGUsICZzaC0+ZGV2W2ldLmZsYWdzKSkKIAkJCQlhdG9taWNfYWRkKFNUUklQRV9TRUNUT1JTLAogCQkJCQkmcmRldi0+Y29ycmVjdGVkX2Vycm9ycyk7CiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaSk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocncgPT0gV1JJVEUpCisJCQlpZiAocncgJiBXUklURSkKIAkJCQlzZXRfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CiAJCQlwcl9kZWJ1Zygic2tpcCBvcCAlbGQgb24gZGlzYyAlZCBmb3Igc2VjdG9yICVsbHVcbiIsCiAJCQkJYmktPmJpX3J3LCBpLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZub2RlLmMgYi9kcml2ZXJzL21lZGlhL21lZGlhLWRldm5vZGUuYwppbmRleCBhZjUyNjNjLi43YjQyYWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL21lZGlhLWRldm5vZGUuYworKysgYi9kcml2ZXJzL21lZGlhL21lZGlhLWRldm5vZGUuYwpAQCAtMjEzLDE0ICsyMTMsMTQgQEAKIAogCS8qIFBhcnQgMTogRmluZCBhIGZyZWUgbWlub3IgbnVtYmVyICovCiAJbXV0ZXhfbG9jaygmbWVkaWFfZGV2bm9kZV9sb2NrKTsKLQltaW5vciA9IGZpbmRfbmV4dF96ZXJvX2JpdChtZWRpYV9kZXZub2RlX251bXMsIDAsIE1FRElBX05VTV9ERVZJQ0VTKTsKKwltaW5vciA9IGZpbmRfbmV4dF96ZXJvX2JpdChtZWRpYV9kZXZub2RlX251bXMsIE1FRElBX05VTV9ERVZJQ0VTLCAwKTsKIAlpZiAobWlub3IgPT0gTUVESUFfTlVNX0RFVklDRVMpIHsKIAkJbXV0ZXhfdW5sb2NrKCZtZWRpYV9kZXZub2RlX2xvY2spOwogCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBnZXQgYSBmcmVlIG1pbm9yXG4iKTsKIAkJcmV0dXJuIC1FTkZJTEU7CiAJfQogCi0Jc2V0X2JpdChtZGV2LT5taW5vciwgbWVkaWFfZGV2bm9kZV9udW1zKTsKKwlzZXRfYml0KG1pbm9yLCBtZWRpYV9kZXZub2RlX251bXMpOwogCW11dGV4X3VubG9jaygmbWVkaWFfZGV2bm9kZV9sb2NrKTsKIAogCW1kZXYtPm1pbm9yID0gbWlub3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzEzLWkyYy5jCmluZGV4IGRlY2EyZTAuLmM5ZjRhOGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYwpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKIAkJY2hhciBwc19uYW1lW01BWF9SRFNfUFNfTkFNRSArIDFdOwogCiAJCWxlbiA9IGNvbnRyb2wtPnNpemUgLSAxOwotCQlpZiAobGVuID4gTUFYX1JEU19QU19OQU1FKSB7CisJCWlmIChsZW4gPCAwIHx8IGxlbiA+IE1BWF9SRFNfUFNfTkFNRSkgewogCQkJcnZhbCA9IC1FUkFOR0U7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAJCWNoYXIgcmFkaW9fdGV4dFtNQVhfUkRTX1JBRElPX1RFWFQgKyAxXTsKIAogCQlsZW4gPSBjb250cm9sLT5zaXplIC0gMTsKLQkJaWYgKGxlbiA+IE1BWF9SRFNfUkFESU9fVEVYVCkgeworCQlpZiAobGVuIDwgMCB8fCBsZW4gPiBNQVhfUkRTX1JBRElPX1RFWFQpIHsKIAkJCXJ2YWwgPSAtRVJBTkdFOwogCQkJZ290byBleGl0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYwppbmRleCAxMWMxOWQ4Li40MjNlZDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKQEAgLTExNCwxOCArMTE0LDIwIEBACiAJczY0CQkJZGVsdGE7IC8qIG5zICovCiAJREVGSU5FX0lSX1JBV19FVkVOVChldik7CiAJaW50CQkJcmMgPSAwOworCWludAkJCWRlbGF5OwogCiAJaWYgKCFkZXYtPnJhdykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlub3cgPSBrdGltZV9nZXQoKTsKIAlkZWx0YSA9IGt0aW1lX3RvX25zKGt0aW1lX3N1Yihub3csIGRldi0+cmF3LT5sYXN0X2V2ZW50KSk7CisJZGVsYXkgPSBNU19UT19OUyhkZXYtPmlucHV0X2Rldi0+cmVwW1JFUF9ERUxBWV0pOwogCiAJLyogQ2hlY2sgZm9yIGEgbG9uZyBkdXJhdGlvbiBzaW5jZSBsYXN0IGV2ZW50IG9yIGlmIHdlJ3JlCiAJICogYmVpbmcgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgbm90ZSB0aGF0IGRlbHRhIGNhbid0CiAJICogcG9zc2libHkgYmUgbmVnYXRpdmUuCiAJICovCi0JaWYgKGRlbHRhID4gSVJfTUFYX0RVUkFUSU9OIHx8ICFkZXYtPnJhdy0+bGFzdF90eXBlKQorCWlmIChkZWx0YSA+IGRlbGF5IHx8ICFkZXYtPnJhdy0+bGFzdF90eXBlKQogCQl0eXBlIHw9IElSX1NUQVJUX0VWRU5UOwogCWVsc2UKIAkJZXYuZHVyYXRpb24gPSBkZWx0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMKaW5kZXggNDM5MDhhNy4uYzE3MTdiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMKQEAgLTEzNTcsNiArMTM1Nyw3IEBACiAJewkvKiAwOiBJVEU4NzA0ICovCiAJICAgICAgIC5tb2RlbCA9ICJJVEU4NzA0IENJUiB0cmFuc2NlaXZlciIsCiAJICAgICAgIC5pb19yZWdpb25fc2l6ZSA9IElUODdfSU9SRUdfTEVOR1RILAorCSAgICAgICAuaW9fcnNyY19ubyA9IDAsCiAJICAgICAgIC5od190eF9jYXBhYmxlID0gdHJ1ZSwKIAkgICAgICAgLnNhbXBsZV9wZXJpb2QgPSAodTMyKSAoMTAwMDAwMDAwMFVMTCAvIDExNTIwMCksCiAJICAgICAgIC50eF9jYXJyaWVyX2ZyZXEgPSAzODAwMCwKQEAgLTEzODEsNiArMTM4Miw3IEBACiAJewkvKiAxOiBJVEU4NzEzICovCiAJICAgICAgIC5tb2RlbCA9ICJJVEU4NzEzIENJUiB0cmFuc2NlaXZlciIsCiAJICAgICAgIC5pb19yZWdpb25fc2l6ZSA9IElUODdfSU9SRUdfTEVOR1RILAorCSAgICAgICAuaW9fcnNyY19ubyA9IDAsCiAJICAgICAgIC5od190eF9jYXBhYmxlID0gdHJ1ZSwKIAkgICAgICAgLnNhbXBsZV9wZXJpb2QgPSAodTMyKSAoMTAwMDAwMDAwMFVMTCAvIDExNTIwMCksCiAJICAgICAgIC50eF9jYXJyaWVyX2ZyZXEgPSAzODAwMCwKQEAgLTE0MDUsNiArMTQwNyw3IEBACiAJewkvKiAyOiBJVEU4NzA4ICovCiAJICAgICAgIC5tb2RlbCA9ICJJVEU4NzA4IENJUiB0cmFuc2NlaXZlciIsCiAJICAgICAgIC5pb19yZWdpb25fc2l6ZSA9IElUODcwOF9JT1JFR19MRU5HVEgsCisJICAgICAgIC5pb19yc3JjX25vID0gMCwKIAkgICAgICAgLmh3X3R4X2NhcGFibGUgPSB0cnVlLAogCSAgICAgICAuc2FtcGxlX3BlcmlvZCA9ICh1MzIpICgxMDAwMDAwMDAwVUxMIC8gMTE1MjAwKSwKIAkgICAgICAgLnR4X2NhcnJpZXJfZnJlcSA9IDM4MDAwLApAQCAtMTQzMCw2ICsxNDMzLDcgQEAKIAl7CS8qIDM6IElURTg3MDkgKi8KIAkgICAgICAgLm1vZGVsID0gIklURTg3MDkgQ0lSIHRyYW5zY2VpdmVyIiwKIAkgICAgICAgLmlvX3JlZ2lvbl9zaXplID0gSVQ4NzA5X0lPUkVHX0xFTkdUSCwKKwkgICAgICAgLmlvX3JzcmNfbm8gPSAyLAogCSAgICAgICAuaHdfdHhfY2FwYWJsZSA9IHRydWUsCiAJICAgICAgIC5zYW1wbGVfcGVyaW9kID0gKHUzMikgKDEwMDAwMDAwMDBVTEwgLyAxMTUyMDApLAogCSAgICAgICAudHhfY2Fycmllcl9mcmVxID0gMzgwMDAsCkBAIC0xNDcxLDYgKzE0NzUsNyBAQAogCXN0cnVjdCByY19kZXYgKnJkZXYgPSBOVUxMOwogCWludCByZXQgPSAtRU5PTUVNOwogCWludCBtb2RlbF9ubzsKKwlpbnQgaW9fcnNyY19ubzsKIAogCWl0ZV9kYmcoIiVzIGNhbGxlZCIsIF9fZnVuY19fKTsKIApAQCAtMTUwMCwxMCArMTUwNSwxMSBAQAogCiAJLyogZ2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGRldmljZSAqLwogCWRldl9kZXNjID0gJml0ZV9kZXZfZGVzY3NbbW9kZWxfbm9dOworCWlvX3JzcmNfbm8gPSBkZXZfZGVzYy0+aW9fcnNyY19ubzsKIAogCS8qIHZhbGlkYXRlIHBucCByZXNvdXJjZXMgKi8KLQlpZiAoIXBucF9wb3J0X3ZhbGlkKHBkZXYsIDApIHx8Ci0JICAgIHBucF9wb3J0X2xlbihwZGV2LCAwKSAhPSBkZXZfZGVzYy0+aW9fcmVnaW9uX3NpemUpIHsKKwlpZiAoIXBucF9wb3J0X3ZhbGlkKHBkZXYsIGlvX3JzcmNfbm8pIHx8CisJICAgIHBucF9wb3J0X2xlbihwZGV2LCBpb19yc3JjX25vKSAhPSBkZXZfZGVzYy0+aW9fcmVnaW9uX3NpemUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVIgUE5QIFBvcnQgbm90IHZhbGlkIVxuIik7CiAJCWdvdG8gZmFpbHVyZTsKIAl9CkBAIC0xNTE0LDcgKzE1MjAsNyBAQAogCX0KIAogCS8qIHN0b3JlIHJlc291cmNlIHZhbHVlcyAqLwotCWl0ZGV2LT5jaXJfYWRkciA9IHBucF9wb3J0X3N0YXJ0KHBkZXYsIDApOworCWl0ZGV2LT5jaXJfYWRkciA9IHBucF9wb3J0X3N0YXJ0KHBkZXYsIGlvX3JzcmNfbm8pOwogCWl0ZGV2LT5jaXJfaXJxID0gcG5wX2lycShwZGV2LCAwKTsKIAogCS8qIGluaXRpYWxpemUgc3BpbmxvY2tzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuaCBiL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5oCmluZGV4IDE2YTE5ZjUuLmFhODk5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5oCkBAIC01Nyw2ICs1Nyw5IEBACiAJLyogc2l6ZSBvZiB0aGUgSS9PIHJlZ2lvbiAqLwogCWludCBpb19yZWdpb25fc2l6ZTsKIAorCS8qIElSIHBucCBJL08gcmVzb3VyY2UgbnVtYmVyICovCisJaW50IGlvX3JzcmNfbm87CisKIAkvKiB0cnVlIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyB0cmFuc21pc3Npb24gKi8KIAlib29sIGh3X3R4X2NhcGFibGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1wY3R2LWhkLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jCmluZGV4IGJiMTBmZmUwOC4uOGQ1NThhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jCkBAIC0xNSw0MyArMTUsMzkgQEAKIC8qIFBpbm5hY2xlIFBDVFYgSEQgODAwaSBtaW5pIHJlbW90ZSAqLwogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBwaW5uYWNsZV9wY3R2X2hkW10gPSB7Ci0KLQl7IDB4MGYsIEtFWV8xIH0sCi0JeyAweDE1LCBLRVlfMiB9LAotCXsgMHgxMCwgS0VZXzMgfSwKLQl7IDB4MTgsIEtFWV80IH0sCi0JeyAweDFiLCBLRVlfNSB9LAotCXsgMHgxZSwgS0VZXzYgfSwKLQl7IDB4MTEsIEtFWV83IH0sCi0JeyAweDIxLCBLRVlfOCB9LAotCXsgMHgxMiwgS0VZXzkgfSwKLQl7IDB4MjcsIEtFWV8wIH0sCi0KLQl7IDB4MjQsIEtFWV9aT09NIH0sCi0JeyAweDJhLCBLRVlfU1VCVElUTEUgfSwKLQotCXsgMHgwMCwgS0VZX01VVEUgfSwKLQl7IDB4MDEsIEtFWV9FTlRFUiB9LAkvKiBQaW5uYWNsZSBMb2dvICovCi0JeyAweDM5LCBLRVlfUE9XRVIgfSwKLQotCXsgMHgwMywgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDA5LCBLRVlfVk9MVU1FRE9XTiB9LAotCXsgMHgwNiwgS0VZX0NIQU5ORUxVUCB9LAotCXsgMHgwYywgS0VZX0NIQU5ORUxET1dOIH0sCi0KLQl7IDB4MmQsIEtFWV9SRVdJTkQgfSwKLQl7IDB4MzAsIEtFWV9QTEFZUEFVU0UgfSwKLQl7IDB4MzMsIEtFWV9GQVNURk9SV0FSRCB9LAotCXsgMHgzYywgS0VZX1NUT1AgfSwKLQl7IDB4MzYsIEtFWV9SRUNPUkQgfSwKLQl7IDB4M2YsIEtFWV9FUEcgfSwJLyogTGFiZWxlZCAiPyIgKi8KKwkvKiBLZXkgY29kZXMgZm9yIHRoZSB0aW55IFBpbm5hY2xlIHJlbW90ZSovCisJeyAweDA3MDAsIEtFWV9NVVRFIH0sCisJeyAweDA3MDEsIEtFWV9NRU5VIH0sIC8qIFBpbm5hY2xlIGxvZ28gKi8KKwl7IDB4MDczOSwgS0VZX1BPV0VSIH0sCisJeyAweDA3MDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwNzA5LCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwNzA2LCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDA3MGMsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwNzBmLCBLRVlfMSB9LAorCXsgMHgwNzE1LCBLRVlfMiB9LAorCXsgMHgwNzEwLCBLRVlfMyB9LAorCXsgMHgwNzE4LCBLRVlfNCB9LAorCXsgMHgwNzFiLCBLRVlfNSB9LAorCXsgMHgwNzFlLCBLRVlfNiB9LAorCXsgMHgwNzExLCBLRVlfNyB9LAorCXsgMHgwNzIxLCBLRVlfOCB9LAorCXsgMHgwNzEyLCBLRVlfOSB9LAorCXsgMHgwNzI3LCBLRVlfMCB9LAorCXsgMHgwNzI0LCBLRVlfWk9PTSB9LCAvKiAnU3F1YXJlJyBrZXkgKi8KKwl7IDB4MDcyYSwgS0VZX1NVQlRJVExFIH0sICAgLyogJ1QnIGtleSAqLworCXsgMHgwNzJkLCBLRVlfUkVXSU5EIH0sCisJeyAweDA3MzAsIEtFWV9QTEFZUEFVU0UgfSwKKwl7IDB4MDczMywgS0VZX0ZBU1RGT1JXQVJEIH0sCisJeyAweDA3MzYsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDczYywgS0VZX1NUT1AgfSwKKwl7IDB4MDczZiwgS0VZX0hFTFAgfSwgLyogJz8nIGtleSAqLwogfTsKIAogc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBwaW5uYWNsZV9wY3R2X2hkX21hcCA9IHsKIAkubWFwID0gewogCQkuc2NhbiAgICA9IHBpbm5hY2xlX3BjdHZfaGQsCiAJCS5zaXplICAgID0gQVJSQVlfU0laRShwaW5uYWNsZV9wY3R2X2hkKSwKLQkJLnJjX3R5cGUgPSBSQ19UWVBFX1VOS05PV04sCS8qIExlZ2FjeSBJUiB0eXBlICovCisJCS5yY190eXBlID0gUkNfVFlQRV9SQzUsCiAJCS5uYW1lICAgID0gUkNfTUFQX1BJTk5BQ0xFX1BDVFZfSEQsCiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwppbmRleCA5MTM5OWM5Li4zZWExYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCkBAIC0zNDc0LDcgKzM0NzQsNyBAQAogCWlmICgwICE9IHQtPmluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWJ0dHZfY2FsbF9hbGwoYnR2LCB0dW5lciwgZ190dW5lciwgdCk7CisJYnR0dl9jYWxsX2FsbChidHYsIHR1bmVyLCBzX3R1bmVyLCB0KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCmluZGV4IDk5MzM4MTAuLjJhM2ZhYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKQEAgLTIwNjAsMTIgKzIwNjAsOCBAQAogCQlnb3RvIGZhaWxfaXJxOwogCX0KIAotCWlmICghcGNpX2VuYWJsZV9tc2kocGNpX2RldikpCi0JCWVyciA9IHJlcXVlc3RfaXJxKHBjaV9kZXYtPmlycSwgY3gyMzg4NV9pcnEsCi0JCQkJICBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7Ci0JZWxzZQotCQllcnIgPSByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIGN4MjM4ODVfaXJxLAotCQkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CisJZXJyID0gcmVxdWVzdF9pcnEocGNpX2Rldi0+aXJxLCBjeDIzODg1X2lycSwKKwkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgcGNpX2Rldi0+aXJxKTsKQEAgLTIxMTQsNyArMjExMCw2IEBACiAKIAkvKiB1bnJlZ2lzdGVyIHN0dWZmICovCiAJZnJlZV9pcnEocGNpX2Rldi0+aXJxLCBkZXYpOwotCXBjaV9kaXNhYmxlX21zaShwY2lfZGV2KTsKIAogCWN4MjM4ODVfZGV2X3VucmVnaXN0ZXIoZGV2KTsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggYmNhMzA3ZS4uZjYzN2QzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTExMjIsNyArMTEyMiw2IEBACiAJbXV0ZXhfbG9jaygmZGV2LT5jb3JlLT5sb2NrKTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCWtmcmVlKGZoKTsKLQltdXRleF91bmxvY2soJmRldi0+Y29yZS0+bG9jayk7CiAKIAkvKiBNYWtlIHN1cmUgd2UgcmVsZWFzZSB0aGUgaGFyZHdhcmUgKi8KIAlkcnYgPSBjeDg4MDJfZ2V0X2RyaXZlcihkZXYsIENYODhfTVBFR19CTEFDS0JJUkQpOwpAQCAtMTEzMSw2ICsxMTMwLDggQEAKIAogCWF0b21pY19kZWMoJmRldi0+Y29yZS0+bXBlZ191c2Vycyk7CiAKKwltdXRleF91bmxvY2soJmRldi0+Y29yZS0+bG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMzNCwxMSArMTMzNSw5IEBACiAJYmxhY2tiaXJkX3JlZ2lzdGVyX3ZpZGVvKGRldik7CiAKIAkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uOiBuZWVkZWQgPyAqLwotCW11dGV4X2xvY2soJmRldi0+Y29yZS0+bG9jayk7CiAvLwlpbml0X2NvbnRyb2xzKGNvcmUpOwogCWN4ODhfc2V0X3R2bm9ybShjb3JlLGNvcmUtPnR2bm9ybSk7CiAJY3g4OF92aWRlb19tdXgoY29yZSwwKTsKLQltdXRleF91bmxvY2soJmRldi0+Y29yZS0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwppbmRleCA3YjhjOWQzLi5jNjlkZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwpAQCAtMTMzLDYgKzEzMyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCW11dGV4X2xvY2soJmRldi0+Y29yZS0+bG9jayk7CiAJZHJ2ID0gY3g4ODAyX2dldF9kcml2ZXIoZGV2LCBDWDg4X01QRUdfRFZCKTsKIAlpZiAoZHJ2KSB7CiAJCWlmIChhY3F1aXJlKXsKQEAgLTE0Myw2ICsxNDQsNyBAQAogCQkJZGV2LT5mcm9udGVuZHMuYWN0aXZlX2ZlX2lkID0gMDsKIAkJfQogCX0KKwltdXRleF91bmxvY2soJmRldi0+Y29yZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IGFkZGY5NTQ1Li40OTdmMjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC02MjQsMTMgKzYyNCwxMSBAQAogCiAJaWYgKGRydi0+YWR2aXNlX2FjcXVpcmUpCiAJewotCQltdXRleF9sb2NrKCZkcnYtPmNvcmUtPmxvY2spOwogCQljb3JlLT5hY3RpdmVfcmVmKys7CiAJCWlmIChjb3JlLT5hY3RpdmVfdHlwZV9pZCA9PSBDWDg4X0JPQVJEX05PTkUpIHsKIAkJCWNvcmUtPmFjdGl2ZV90eXBlX2lkID0gZHJ2LT50eXBlX2lkOwogCQkJZHJ2LT5hZHZpc2VfYWNxdWlyZShkcnYpOwogCQl9Ci0JCW11dGV4X3VubG9jaygmZHJ2LT5jb3JlLT5sb2NrKTsKIAogCQltcGVnX2RiZygxLCIlcygpIFBvc3QgYWNxdWlyZSBHUElPPSV4XG4iLCBfX2Z1bmNfXywgY3hfcmVhZChNT19HUDBfSU8pKTsKIAl9CkBAIC02NDMsMTQgKzY0MSwxMiBAQAogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CiAKLQltdXRleF9sb2NrKCZkcnYtPmNvcmUtPmxvY2spOwogCWlmIChkcnYtPmFkdmlzZV9yZWxlYXNlICYmIC0tY29yZS0+YWN0aXZlX3JlZiA9PSAwKQogCXsKIAkJZHJ2LT5hZHZpc2VfcmVsZWFzZShkcnYpOwogCQljb3JlLT5hY3RpdmVfdHlwZV9pZCA9IENYODhfQk9BUkRfTk9ORTsKIAkJbXBlZ19kYmcoMSwiJXMoKSBQb3N0IHJlbGVhc2UgR1BJTz0leFxuIiwgX19mdW5jX18sIGN4X3JlYWQoTU9fR1AwX0lPKSk7CiAJfQotCW11dGV4X3VubG9jaygmZHJ2LT5jb3JlLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzEzLDE4ICs3MDksMTcgQEAKIAkJZHJ2LT5yZXF1ZXN0X3JlbGVhc2UgPSBjeDg4MDJfcmVxdWVzdF9yZWxlYXNlOwogCQltZW1jcHkoZHJpdmVyLCBkcnYsIHNpemVvZigqZHJpdmVyKSk7CiAKKwkJbXV0ZXhfbG9jaygmZHJ2LT5jb3JlLT5sb2NrKTsKIAkJZXJyID0gZHJ2LT5wcm9iZShkcml2ZXIpOwogCQlpZiAoZXJyID09IDApIHsKIAkJCWkrKzsKLQkJCW11dGV4X2xvY2soJmRydi0+Y29yZS0+bG9jayk7CiAJCQlsaXN0X2FkZF90YWlsKCZkcml2ZXItPmRydmxpc3QsICZkZXYtPmRydmxpc3QpOwotCQkJbXV0ZXhfdW5sb2NrKCZkcnYtPmNvcmUtPmxvY2spOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIiVzLzI6IGN4ODgwMiBwcm9iZSBmYWlsZWQsIGVyciA9ICVkXG4iLAogCQkJICAgICAgIGRldi0+Y29yZS0+bmFtZSwgZXJyKTsKIAkJfQotCisJCW11dGV4X3VubG9jaygmZHJ2LT5jb3JlLT5sb2NrKTsKIAl9CiAKIAlyZXR1cm4gaSA/IDAgOiAtRU5PREVWOwpAQCAtNzQ4LDYgKzc0Myw4IEBACiAJCSAgICAgICBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSwgZGV2LT5jb3JlLT5ib2FyZC5uYW1lLAogCQkgICAgICAgZGV2LT5jb3JlLT5ib2FyZG5yKTsKIAorCQltdXRleF9sb2NrKCZkZXYtPmNvcmUtPmxvY2spOworCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkLCBkdG1wLCAmZGV2LT5kcnZsaXN0LCBkcnZsaXN0KSB7CiAJCQkvKiBvbmx5IHVucmVnaXN0ZXIgdGhlIGNvcnJlY3QgZHJpdmVyIHR5cGUgKi8KIAkJCWlmIChkLT50eXBlX2lkICE9IGRydi0+dHlwZV9pZCkKQEAgLTc1NSwxNSArNzUyLDE0IEBACiAKIAkJCWVyciA9IGQtPnJlbW92ZShkKTsKIAkJCWlmIChlcnIgPT0gMCkgewotCQkJCW11dGV4X2xvY2soJmRydi0+Y29yZS0+bG9jayk7CiAJCQkJbGlzdF9kZWwoJmQtPmRydmxpc3QpOwotCQkJCW11dGV4X3VubG9jaygmZHJ2LT5jb3JlLT5sb2NrKTsKIAkJCQlrZnJlZShkKTsKIAkJCX0gZWxzZQogCQkJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogY3g4ODAyIGRyaXZlciByZW1vdmUgIgogCQkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGRldi0+Y29yZS0+bmFtZSwgZXJyKTsKIAkJfQogCisJCW11dGV4X3VubG9jaygmZGV2LT5jb3JlLT5sb2NrKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtODI3LDYgKzgyMyw4IEBACiAKIAlmbHVzaF9yZXF1ZXN0X21vZHVsZXMoZGV2KTsKIAorCW11dGV4X2xvY2soJmRldi0+Y29yZS0+bG9jayk7CisKIAlpZiAoIWxpc3RfZW1wdHkoJmRldi0+ZHJ2bGlzdCkpIHsKIAkJc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydiwgKnRtcDsKIAkJaW50IGVycjsKQEAgLTgzOCw5ICs4MzYsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZHJ2LCB0bXAsICZkZXYtPmRydmxpc3QsIGRydmxpc3QpIHsKIAkJCWVyciA9IGRydi0+cmVtb3ZlKGRydik7CiAJCQlpZiAoZXJyID09IDApIHsKLQkJCQltdXRleF9sb2NrKCZkcnYtPmNvcmUtPmxvY2spOwogCQkJCWxpc3RfZGVsKCZkcnYtPmRydmxpc3QpOwotCQkJCW11dGV4X3VubG9jaygmZHJ2LT5jb3JlLT5sb2NrKTsKIAkJCX0gZWxzZQogCQkJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogY3g4ODAyIGRyaXZlciByZW1vdmUgIgogCQkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGRldi0+Y29yZS0+bmFtZSwgZXJyKTsKQEAgLTg0OCw2ICs4NDQsOCBAQAogCQl9CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmNvcmUtPmxvY2spOworCiAJLyogRGVzdHJveSBhbnkgODgwMiByZWZlcmVuY2UuICovCiAJZGV2LT5jb3JlLT5kdmJkZXYgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAppbmRleCA5YjM3NDJhLi4zZDMyZjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKQEAgLTUwNSw2ICs1MDUsOCBAQAogCWludCAoKnN1c3BlbmQpKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOwogCisJLyogQ2FsbGVycyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtdXN0IGhvbGQgY29yZS0+bG9jayAqLworCiAJLyogTVBFRyA4ODAyIC0+IG1pbmkgZHJpdmVyIC0gRHJpdmVyIHByb2JlIGFuZCBjb25maWd1cmF0aW9uICovCiAJaW50ICgqcHJvYmUpKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpOwogCWludCAoKnJlbW92ZSkoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydik7CkBAIC01NjEsOCArNTYzLDkgQEAKIAkvKiBmb3Igc3dpdGNoaW5nIG1vZHVsYXRpb24gdHlwZXMgKi8KIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICB0c19nZW5fY250cmw7CiAKLQkvKiBMaXN0IG9mIGF0dGFjaGVkIGRyaXZlcnMgKi8KKwkvKiBMaXN0IG9mIGF0dGFjaGVkIGRyaXZlcnM7IG11c3QgaG9sZCBjb3JlLT5sb2NrIHRvIGFjY2VzcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJICAgZHJ2bGlzdDsKKwogCXN0cnVjdCB3b3JrX3N0cnVjdAkgICByZXF1ZXN0X21vZHVsZV93azsKIH07CiAKQEAgLTY4NSw2ICs2ODgsOCBAQAogCiBpbnQgY3g4ODAyX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KTsKIGludCBjeDg4MDJfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydik7CisKKy8qIENhbGxlciBtdXN0IGhvbGQgY29yZS0+bG9jayAqLwogc3RydWN0IGN4ODgwMl9kcml2ZXIgKiBjeDg4MDJfZ2V0X2RyaXZlcihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2LCBlbnVtIGN4ODhfYm9hcmRfdHlwZSBidHlwZSk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCmluZGV4IDlkMGRkMDguLmU5OGQzODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCkBAIC0zMDQ2LDYgKzMwNDYsOCBAQAogCWlmIChoZHctPmlucHV0X2RpcnR5IHx8IGhkdy0+YXVkaW9tb2RlX2RpcnR5IHx8IGhkdy0+Zm9yY2VfZGlydHkpIHsKIAkJc3RydWN0IHY0bDJfdHVuZXIgdnQ7CiAJCW1lbXNldCgmdnQsIDAsIHNpemVvZih2dCkpOworCQl2dC50eXBlID0gKGhkdy0+aW5wdXRfdmFsID09IFBWUjJfQ1ZBTF9JTlBVVF9SQURJTykgPworCQkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQl2dC5hdWRtb2RlID0gaGR3LT5hdWRpb21vZGVfdmFsOwogCQl2NGwyX2RldmljZV9jYWxsX2FsbCgmaGR3LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfdHVuZXIsICZ2dCk7CiAJfQpAQCAtNTE3MSw2ICs1MTczLDggQEAKIHsKIAlzdHJ1Y3QgdjRsMl90dW5lciAqdnRwID0gJmhkdy0+dHVuZXJfc2lnbmFsX2luZm87CiAJbWVtc2V0KHZ0cCwgMCwgc2l6ZW9mKCp2dHApKTsKKwl2dHAtPnR5cGUgPSAoaGR3LT5pbnB1dF92YWwgPT0gUFZSMl9DVkFMX0lOUFVUX1JBRElPKSA/CisJCVY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAloZHctPnR1bmVyX3NpZ25hbF9zdGFsZSA9IDA7CiAJLyogTm90ZTogVGhlcmUgYXBwYXJlbnRseSBpcyBubyByZXBsYWNlbWVudCBmb3IgVklESU9DX0NST1BDQVAKIAkgICB1c2luZyB2NGwyLXN1YmRldiAtIHRoZXJlZm9yZSB3ZSBjYW4ndCBzdXBwb3J0IHRoYXQgQVQgQUxMIHJpZ2h0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDkzNjNlZDkuLjE4NDNmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC03MjQsMTkgKzcyNCwxNSBAQAogfQogCiAvKioKLSAqIHNldF9tb2RlX2ZyZXEgLSBTd2l0Y2ggdHVuZXIgdG8gb3RoZXIgbW9kZS4KLSAqIEBjbGllbnQ6CXN0cnVjdCBpMmNfY2xpZW50IHBvaW50ZXIKKyAqIHNldF9tb2RlIC0gU3dpdGNoIHR1bmVyIHRvIG90aGVyIG1vZGUuCiAgKiBAdDoJCWEgcG9pbnRlciB0byB0aGUgbW9kdWxlJ3MgaW50ZXJuYWwgc3RydWN0X3R1bmVyCiAgKiBAbW9kZToJZW51bSB2NGwyX3R5cGUgKHJhZGlvIG9yIFRWKQotICogQGZyZXE6CWZyZXF1ZW5jeSB0byBzZXQgKDAgbWVhbnMgdG8gdXNlIHRoZSBwcmV2aW91cyBvbmUpCiAgKgogICogSWYgdHVuZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBuZWVkZWQgbW9kZSAocmFkaW8gb3IgVFYpLCBwcmludHMgYQogICogZGVidWcgbWVzc2FnZSBhbmQgcmV0dXJucyAtRUlOVkFMLCBjaGFuZ2luZyBpdHMgc3RhdGUgdG8gc3RhbmRieS4KLSAqIE90aGVyd2lzZSwgY2hhbmdlcyB0aGUgc3RhdGUgYW5kIHNldHMgZnJlcXVlbmN5IHRvIHRoZSBsYXN0IHZhbHVlLCBpZgotICogdGhlIHR1bmVyIGNhbiBzbGVlcCBvciBpZiBpdCBzdXBwb3J0cyBib3RoIFJhZGlvIGFuZCBUVi4KKyAqIE90aGVyd2lzZSwgY2hhbmdlcyB0aGUgbW9kZSBhbmQgcmV0dXJucyAwLgogICovCi1zdGF0aWMgaW50IHNldF9tb2RlX2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHR1bmVyICp0LAotCQkJIGVudW0gdjRsMl90dW5lcl90eXBlIG1vZGUsIHVuc2lnbmVkIGludCBmcmVxKQorc3RhdGljIGludCBzZXRfbW9kZShzdHJ1Y3QgdHVuZXIgKnQsIGVudW0gdjRsMl90dW5lcl90eXBlIG1vZGUpCiB7CiAJc3RydWN0IGFuYWxvZ19kZW1vZF9vcHMgKmFuYWxvZ19vcHMgPSAmdC0+ZmUub3BzLmFuYWxvZ19vcHM7CiAKQEAgLTc1MiwxOSArNzQ4LDI5IEBACiAJCXQtPm1vZGUgPSBtb2RlOwogCQl0dW5lcl9kYmcoIkNoYW5naW5nIHRvIG1vZGUgJWRcbiIsIG1vZGUpOwogCX0KLQlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKSB7Ci0JCWlmIChmcmVxKQotCQkJdC0+cmFkaW9fZnJlcSA9IGZyZXE7Ci0JCXNldF9yYWRpb19mcmVxKGNsaWVudCwgdC0+cmFkaW9fZnJlcSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZyZXEpCi0JCQl0LT50dl9mcmVxID0gZnJlcTsKLQkJc2V0X3R2X2ZyZXEoY2xpZW50LCB0LT50dl9mcmVxKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBzZXRfZnJlcSAtIFNldCB0aGUgdHVuZXIgdG8gdGhlIGRlc2lyZWQgZnJlcXVlbmN5LgorICogQHQ6CQlhIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSdzIGludGVybmFsIHN0cnVjdF90dW5lcgorICogQGZyZXE6CWZyZXF1ZW5jeSB0byBzZXQgKDAgbWVhbnMgdG8gdXNlIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSkKKyAqLworc3RhdGljIHZvaWQgc2V0X2ZyZXEoc3RydWN0IHR1bmVyICp0LCB1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmdC0+c2QpOworCisJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlpZiAoIWZyZXEpCisJCQlmcmVxID0gdC0+cmFkaW9fZnJlcTsKKwkJc2V0X3JhZGlvX2ZyZXEoY2xpZW50LCBmcmVxKTsKKwl9IGVsc2UgeworCQlpZiAoIWZyZXEpCisJCQlmcmVxID0gdC0+dHZfZnJlcTsKKwkJc2V0X3R2X2ZyZXEoY2xpZW50LCBmcmVxKTsKKwl9Cit9CisKIC8qCiAgKiBGdW5jdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIFRWIG1vZGUKICAqLwpAQCAtMTA1OCwxMCArMTA2NCw5IEBACiBzdGF0aWMgaW50IHR1bmVyX3NfcmFkaW8oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JaWYgKHNldF9tb2RlX2ZyZXEoY2xpZW50LCB0LCBWNEwyX1RVTkVSX1JBRElPLCAwKSA9PSAtRUlOVkFMKQotCQlyZXR1cm4gMDsKKwlpZiAoc2V0X21vZGUodCwgVjRMMl9UVU5FUl9SQURJTykgPT0gMCkKKwkJc2V0X2ZyZXEodCwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTMsMjUgKzEwOTgsMjIgQEAKIHN0YXRpYyBpbnQgdHVuZXJfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQogewogCXN0cnVjdCB0dW5lciAqdCA9IHRvX3R1bmVyKHNkKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAKLQlpZiAoc2V0X21vZGVfZnJlcShjbGllbnQsIHQsIFY0TDJfVFVORVJfQU5BTE9HX1RWLCAwKSA9PSAtRUlOVkFMKQorCWlmIChzZXRfbW9kZSh0LCBWNEwyX1RVTkVSX0FOQUxPR19UVikpCiAJCXJldHVybiAwOwogCiAJdC0+c3RkID0gc3RkOwogCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKLQorCXNldF9mcmVxKHQsIDApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHR1bmVyX3NfZnJlcXVlbmN5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSB0b190dW5lcihzZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCi0JaWYgKHNldF9tb2RlX2ZyZXEoY2xpZW50LCB0LCBmLT50eXBlLCBmLT5mcmVxdWVuY3kpID09IC1FSU5WQUwpCi0JCXJldHVybiAwOwotCisJaWYgKHNldF9tb2RlKHQsIGYtPnR5cGUpID09IDApCisJCXNldF9mcmVxKHQsIGYtPmZyZXF1ZW5jeSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExODAsMTMgKzExODIsMTMgQEAKIHN0YXRpYyBpbnQgdHVuZXJfc190dW5lcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gdG9fdHVuZXIoc2QpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAotCWlmIChzZXRfbW9kZV9mcmVxKGNsaWVudCwgdCwgdnQtPnR5cGUsIDApID09IC1FSU5WQUwpCisJaWYgKHNldF9tb2RlKHQsIHZ0LT50eXBlKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKQogCQl0LT5hdWRtb2RlID0gdnQtPmF1ZG1vZGU7CisJc2V0X2ZyZXEodCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjEsNyArMTIyMyw4IEBACiAJdHVuZXJfZGJnKCJyZXN1bWVcbiIpOwogCiAJaWYgKCF0LT5zdGFuZGJ5KQotCQlzZXRfbW9kZV9mcmVxKGMsIHQsIHQtPnR5cGUsIDApOworCQlpZiAoc2V0X21vZGUodCwgdC0+bW9kZSkgPT0gMCkKKwkJCXNldF9mcmVxKHQsIDApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfcXVldWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19xdWV1ZS5jCmluZGV4IGYxNDU4MWIuLjQ4YzVjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19xdWV1ZS5jCkBAIC0xMDQsNiArMTA0LDggQEAKIAl9CiAKIAlpZiAocXVldWUtPmNvdW50KSB7CisJCXV2Y19xdWV1ZV9jYW5jZWwocXVldWUsIDApOworCQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPm1haW5xdWV1ZSk7CiAJCXZmcmVlKHF1ZXVlLT5tZW0pOwogCQlxdWV1ZS0+Y291bnQgPSAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMKaW5kZXggNTA2ZWRjYzIuLmEyZTQ0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pb2N0bC5jCkBAIC0xODIyLDYgKzE4MjIsOCBAQAogCQlpZiAoIW9wcy0+dmlkaW9jX2dfdHVuZXIpCiAJCQlicmVhazsKIAorCQlwLT50eXBlID0gKHZmZC0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfUkFESU8pID8KKwkJCVY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAkJcmV0ID0gb3BzLT52aWRpb2NfZ190dW5lcihmaWxlLCBmaCwgcCk7CiAJCWlmICghcmV0KQogCQkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCB0eXBlPSVkLCAiCkBAIC0xODQwLDYgKzE4NDIsOCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc190dW5lcikKIAkJCWJyZWFrOworCQlwLT50eXBlID0gKHZmZC0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfUkFESU8pID8KKwkJCVY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCB0eXBlPSVkLCAiCiAJCQkJImNhcGFiaWxpdHk9MHgleCwgcmFuZ2Vsb3c9JWQsICIKIAkJCQkicmFuZ2VoaWdoPSVkLCBzaWduYWw9JWQsIGFmYz0lZCwgIgpAQCAtMTg1OCw2ICsxODYyLDggQEAKIAkJaWYgKCFvcHMtPnZpZGlvY19nX2ZyZXF1ZW5jeSkKIAkJCWJyZWFrOwogCisJCXAtPnR5cGUgPSAodmZkLT52ZmxfdHlwZSA9PSBWRkxfVFlQRV9SQURJTykgPworCQkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZyZXF1ZW5jeShmaWxlLCBmaCwgcCk7CiAJCWlmICghcmV0KQogCQkJZGJnYXJnKGNtZCwgInR1bmVyPSVkLCB0eXBlPSVkLCBmcmVxdWVuY3k9JWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMgYi9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMKaW5kZXggM2FiOWZmYS4uNTVjNWQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jCisrKyBiL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYwpAQCAtOTk0LDYgKzk5NCwyNCBAQAogCQkJZGV2X2RiZyhkZXYsICJvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKIAl9CiAKKwlpZiAoaXNfb21hcF91c2Joc19yZXYyKG9tYXApKSB7CisJCWlmIChpc19laGNpX3RsbF9tb2RlKHBkYXRhLT5wb3J0X21vZGVbMF0pKQorCQkJY2xrX2VuYWJsZShvbWFwLT51c2J0bGxfcDFfZmNrKTsKKwkJaWYgKGlzX2VoY2lfdGxsX21vZGUocGRhdGEtPnBvcnRfbW9kZVsxXSkpCisJCQljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9wMl9mY2spOworCQljbGtfZGlzYWJsZShvbWFwLT51dG1pX3AyX2Zjayk7CisJCWNsa19kaXNhYmxlKG9tYXAtPnV0bWlfcDFfZmNrKTsKKwl9CisKKwljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfaWNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfZmNrKTsKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2ZzX2Zjayk7CisJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9oc19mY2spOworCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfaWNrKTsKKworCS8qIFRoZSBncGlvX2ZyZWUgbWlnaCBzbGVlcDsgc28gdW5sb2NrIHRoZSBzcGlubG9jayAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9tYXAtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChwZGF0YS0+ZWhjaV9kYXRhLT5waHlfcmVzZXQpIHsKIAkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmVoY2lfZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzBdKSkKIAkJCWdwaW9fZnJlZShwZGF0YS0+ZWhjaV9kYXRhLT5yZXNldF9ncGlvX3BvcnRbMF0pOwpAQCAtMTAwMSwxNCArMTAxOSw3IEBACiAJCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5laGNpX2RhdGEtPnJlc2V0X2dwaW9fcG9ydFsxXSkpCiAJCQlncGlvX2ZyZWUocGRhdGEtPmVoY2lfZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzFdKTsKIAl9Ci0KLQljbGtfZGlzYWJsZShvbWFwLT51dG1pX3AyX2Zjayk7Ci0JY2xrX2Rpc2FibGUob21hcC0+dXRtaV9wMV9mY2spOwotCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9pY2spOwotCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9mY2spOwotCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfZnNfZmNrKTsKLQljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0X2hzX2Zjayk7Ci0JY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9pY2spOworCXJldHVybjsKIAogZW5kX2Rpc2JsZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbWFwLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGtkdG0uYyBiL2RyaXZlcnMvbWlzYy9sa2R0bS5jCmluZGV4IDgxZDdmYTQuLjE1MGNkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jCisrKyBiL2RyaXZlcnMvbWlzYy9sa2R0bS5jCkBAIC0xMjAsNiArMTIwLDcgQEAKIHN0YXRpYyBlbnVtIGNuYW1lIGNwb2ludCA9IENOX0lOVkFMSUQ7CiBzdGF0aWMgZW51bSBjdHlwZSBjcHR5cGUgPSBDVF9OT05FOwogc3RhdGljIGludCBjb3VudCA9IERFRkFVTFRfQ09VTlQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvdW50X2xvY2spOwogCiBtb2R1bGVfcGFyYW0ocmVjdXJfY291bnQsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlY3VyX2NvdW50LCAiIFJlY3Vyc2lvbiBsZXZlbCBmb3IgdGhlIHN0YWNrIG92ZXJmbG93IHRlc3QsICJcCkBAIC0yMzAsMTEgKzIzMSwxNCBAQAogc3RhdGljIGludCBsa2R0bV9wYXJzZV9jb21tYW5kbGluZSh2b2lkKQogewogCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY3BvaW50X2NvdW50IDwgMSB8fCByZWN1cl9jb3VudCA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50X2xvY2ssIGZsYWdzKTsKIAljb3VudCA9IGNwb2ludF9jb3VudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudF9sb2NrLCBmbGFncyk7CiAKIAkvKiBObyBzcGVjaWFsIHBhcmFtZXRlcnMgKi8KIAlpZiAoIWNwb2ludF90eXBlICYmICFjcG9pbnRfbmFtZSkKQEAgLTM0OSw2ICszNTMsOSBAQAogCiBzdGF0aWMgdm9pZCBsa2R0bV9oYW5kbGVyKHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudF9sb2NrLCBmbGFncyk7CiAJY291bnQtLTsKIAlwcmludGsoS0VSTl9JTkZPICJsa2R0bTogQ3Jhc2ggcG9pbnQgJXMgb2YgdHlwZSAlcyBoaXQsIHRyaWdnZXIgaW4gJWQgcm91bmRzXG4iLAogCQkJY3BfbmFtZV90b19zdHIoY3BvaW50KSwgY3BfdHlwZV90b19zdHIoY3B0eXBlKSwgY291bnQpOwpAQCAtMzU3LDYgKzM2NCw3IEBACiAJCWxrZHRtX2RvX2FjdGlvbihjcHR5cGUpOwogCQljb3VudCA9IGNwb2ludF9jb3VudDsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IGxrZHRtX3JlZ2lzdGVyX2Nwb2ludChlbnVtIGNuYW1lIHdoaWNoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9idXMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKaW5kZXggZDZkNjJmZDAuLmE2MGMzMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9idXMuYwpAQCAtMTIwLDE4ICsxMjAsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtbWNfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IG1tY19idXNfcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1tY19kcml2ZXIgKmRydiA9IHRvX21tY19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1tY19kZXZfdG9fY2FyZChkZXYpOwogCWludCByZXQgPSAwOworCXBtX21lc3NhZ2VfdCBzdGF0ZSA9IHsgUE1fRVZFTlRfU1VTUEVORCB9OwogCiAJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKIAkJcmV0ID0gZHJ2LT5zdXNwZW5kKGNhcmQsIHN0YXRlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG1tY19idXNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbW1jX2J1c19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtbWNfZHJpdmVyICpkcnYgPSB0b19tbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtbWNfZGV2X3RvX2NhcmQoZGV2KTsKQEAgLTE0Myw3ICsxNDQsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKLQogc3RhdGljIGludCBtbWNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtbWNfZGV2X3RvX2NhcmQoZGV2KTsKQEAgLTE2MiwyMSArMTYyLDEzIEBACiB7CiAJcmV0dXJuIHBtX3J1bnRpbWVfc3VzcGVuZChkZXYpOwogfQorI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBtbWNfYnVzX3BtX29wcyA9IHsKLQkucnVudGltZV9zdXNwZW5kCT0gbW1jX3J1bnRpbWVfc3VzcGVuZCwKLQkucnVudGltZV9yZXN1bWUJCT0gbW1jX3J1bnRpbWVfcmVzdW1lLAotCS5ydW50aW1lX2lkbGUJCT0gbW1jX3J1bnRpbWVfaWRsZSwKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhtbWNfYnVzX3BtX3N1c3BlbmQsIG1tY19idXNfcG1fcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhtbWNfcnVudGltZV9zdXNwZW5kLCBtbWNfcnVudGltZV9yZXN1bWUsIG1tY19ydW50aW1lX2lkbGUpCiB9OwogCi0jZGVmaW5lIE1NQ19QTV9PUFNfUFRSCSgmbW1jX2J1c19wbV9vcHMpCi0KLSNlbHNlIC8qICFDT05GSUdfUE1fUlVOVElNRSAqLwotCi0jZGVmaW5lIE1NQ19QTV9PUFNfUFRSCU5VTEwKLQotI2VuZGlmIC8qICFDT05GSUdfUE1fUlVOVElNRSAqLwotCiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIG1tY19idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAibW1jIiwKIAkuZGV2X2F0dHJzCT0gbW1jX2Rldl9hdHRycywKQEAgLTE4NCw5ICsxNzYsNyBAQAogCS51ZXZlbnQJCT0gbW1jX2J1c191ZXZlbnQsCiAJLnByb2JlCQk9IG1tY19idXNfcHJvYmUsCiAJLnJlbW92ZQkJPSBtbWNfYnVzX3JlbW92ZSwKLQkuc3VzcGVuZAk9IG1tY19idXNfc3VzcGVuZCwKLQkucmVzdW1lCQk9IG1tY19idXNfcmVzdW1lLAotCS5wbQkJPSBNTUNfUE1fT1BTX1BUUiwKKwkucG0JCT0gJm1tY19idXNfcG1fb3BzLAogfTsKIAogaW50IG1tY19yZWdpc3Rlcl9idXModm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggYzA1ZTgxYi4uNjYwMTQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTE3OTgsNyArMTc5OCw3IEBACiAJfQogCW1tY19idXNfcHV0KGhvc3QpOwogCi0JaWYgKCFlcnIgJiYgIShob3N0LT5wbV9mbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKSkKKwlpZiAoIWVyciAmJiAhbW1jX2NhcmRfa2VlcF9wb3dlcihob3N0KSkKIAkJbW1jX3Bvd2VyX29mZihob3N0KTsKIAogCXJldHVybiBlcnI7CkBAIC0xODIyLDcgKzE4MjIsNyBAQAogCX0KIAogCWlmIChob3N0LT5idXNfb3BzICYmICFob3N0LT5idXNfZGVhZCkgewotCQlpZiAoIShob3N0LT5wbV9mbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKSkgeworCQlpZiAoIW1tY19jYXJkX2tlZXBfcG93ZXIoaG9zdCkpIHsKIAkJCW1tY19wb3dlcl91cChob3N0KTsKIAkJCW1tY19zZWxlY3Rfdm9sdGFnZShob3N0LCBob3N0LT5vY3IpOwogCQkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKaW5kZXggZWU0YjNkMi4uMWY5Zjc1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKQEAgLTY0NSw3ICs2NDUsNyBAQAogCQl9CiAJfQogCi0JaWYgKCFlcnIgJiYgaG9zdC0+cG1fZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikgeworCWlmICghZXJyICYmIG1tY19jYXJkX2tlZXBfcG93ZXIoaG9zdCkgJiYgbW1jX2NhcmRfd2FrZV9zZGlvX2lycShob3N0KSkgewogCQltbWNfY2xhaW1faG9zdChob3N0KTsKIAkJc2Rpb19kaXNhYmxlX3dpZGUoaG9zdC0+Y2FyZCk7CiAJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CkBAIC02NjUsMTAgKzY2NSwxMCBAQAogCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogCiAJLyogTm8gbmVlZCB0byByZWluaXRpYWxpemUgcG93ZXJlZC1yZXN1bWVkIG5vbnJlbW92YWJsZSBjYXJkcyAqLwotCWlmIChtbWNfY2FyZF9pc19yZW1vdmFibGUoaG9zdCkgfHwgIW1tY19jYXJkX2lzX3Bvd2VyZWRfcmVzdW1lZChob3N0KSkKKwlpZiAobW1jX2NhcmRfaXNfcmVtb3ZhYmxlKGhvc3QpIHx8ICFtbWNfY2FyZF9rZWVwX3Bvd2VyKGhvc3QpKQogCQllcnIgPSBtbWNfc2Rpb19pbml0X2NhcmQoaG9zdCwgaG9zdC0+b2NyLCBob3N0LT5jYXJkLAotCQkJCSAoaG9zdC0+cG1fZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikpOwotCWVsc2UgaWYgKG1tY19jYXJkX2lzX3Bvd2VyZWRfcmVzdW1lZChob3N0KSkgeworCQkJCQltbWNfY2FyZF9rZWVwX3Bvd2VyKGhvc3QpKTsKKwllbHNlIGlmIChtbWNfY2FyZF9rZWVwX3Bvd2VyKGhvc3QpICYmIG1tY19jYXJkX3dha2Vfc2Rpb19pcnEoaG9zdCkpIHsKIAkJLyogV2UgbWF5IGhhdmUgc3dpdGNoZWQgdG8gMS1iaXQgbW9kZSBkdXJpbmcgc3VzcGVuZCAqLwogCQllcnIgPSBzZGlvX2VuYWJsZV80Yml0X2J1cyhob3N0LT5jYXJkKTsKIAkJaWYgKGVyciA+IDApIHsKQEAgLTcxMSw3ICs3MTEsNyBAQAogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJcmV0ID0gbW1jX3NkaW9faW5pdF9jYXJkKGhvc3QsIGhvc3QtPm9jciwgaG9zdC0+Y2FyZCwKLQkJCShob3N0LT5wbV9mbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKSk7CisJCQkJbW1jX2NhcmRfa2VlcF9wb3dlcihob3N0KSk7CiAJaWYgKCFyZXQgJiYgaG9zdC0+c2Rpb19pcnFzKQogCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QpOwogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwppbmRleCBhMTk5NjdkLi5iYTMxYWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKQEAgLTc0LDcgKzc0LDcgQEAKIAkJaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykKIAkJCQkmJiBncGlvX2dldF92YWx1ZShib2FyZGRhdGEtPmNkX2dwaW8pKQogCQkJLyogbm8gY2FyZCwgaWYgYSB2YWxpZCBncGlvIHNheXMgc28uLi4gKi8KLQkJCXZhbCAmPSBTREhDSV9DQVJEX1BSRVNFTlQ7CisJCQl2YWwgJj0gflNESENJX0NBUkRfUFJFU0VOVDsKIAkJZWxzZQogCQkJLyogLi4uIGluIGFsbCBvdGhlciBjYXNlcyBhc3N1bWUgY2FyZCBpcyBwcmVzZW50ICovCiAJCQl2YWwgfD0gU0RIQ0lfQ0FSRF9QUkVTRU5UOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKaW5kZXggNzEwMzM5YS4uYjk4MTk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCkBAIC03NjAsOCArNzYwLDggQEAKIAlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gaG9zdC0+cGRhdGE7CiAKLQlyZXR1cm4gKChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSkgfHwKLQkJIShzZF9jdHJsX3JlYWQzMihob3N0LCBDVExfU1RBVFVTKSAmIFRNSU9fU1RBVF9XUlBST1RFQ1QpKTsKKwlyZXR1cm4gISgocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfV1JQUk9URUNUX0RJU0FCTEUpIHx8CisJCSAoc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX1NUQVRVUykgJiBUTUlPX1NUQVRfV1JQUk9URUNUKSk7CiB9CiAKIHN0YXRpYyBpbnQgdG1pb19tbWNfZ2V0X2NkKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMgYi9kcml2ZXJzL210ZC9tdGRjb25jYXQuYwppbmRleCA1MDYwZTYwLi5lNjAxNjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjb25jYXQuYworKysgYi9kcml2ZXJzL210ZC9tdGRjb25jYXQuYwpAQCAtMzE5LDcgKzMxOSw3IEBACiAJaWYgKCEobXRkLT5mbGFncyAmIE1URF9XUklURUFCTEUpKQogCQlyZXR1cm4gLUVST0ZTOwogCi0Jb3BzLT5yZXRsZW4gPSAwOworCW9wcy0+cmV0bGVuID0gb3BzLT5vb2JyZXRsZW4gPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IGNvbmNhdC0+bnVtX3N1YmRldjsgaSsrKSB7CiAJCXN0cnVjdCBtdGRfaW5mbyAqc3ViZGV2ID0gY29uY2F0LT5zdWJkZXZbaV07CkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJCWRldm9wcy5sZW4gPSBzdWJkZXYtPnNpemUgLSB0bzsKIAogCQllcnIgPSBzdWJkZXYtPndyaXRlX29vYihzdWJkZXYsIHRvLCAmZGV2b3BzKTsKLQkJb3BzLT5yZXRsZW4gKz0gZGV2b3BzLnJldGxlbjsKKwkJb3BzLT5yZXRsZW4gKz0gZGV2b3BzLm9vYnJldGxlbjsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IDk2YTIzZjEuLjc5ODVhM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMzExMiw2ICszMTEyLDggQEAKIAkJY2hpcC0+Y2hpcF9zaGlmdCArPSAzMiAtIDE7CiAJfQogCisJY2hpcC0+YmFkYmxvY2tiaXRzID0gODsKKwogCS8qIFNldCB0aGUgYmFkIGJsb2NrIHBvc2l0aW9uICovCiAJaWYgKG10ZC0+d3JpdGVzaXplID4gNTEyIHx8IChidXN3ICYgTkFORF9CVVNXSURUSF8xNikpCiAJCWNoaXAtPmJhZGJsb2NrcG9zID0gTkFORF9MQVJHRV9CQURCTE9DS19QT1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMgYi9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMKaW5kZXggZGE5YTM1MS4uMmM4MDQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYwpAQCAtMjYzLDExICsyNjMsMTAgQEAKIAlpZiAocmV0KSB7CiAJCS8qIFBGUFcgZW5naW5lIGlzIGJ1c3ksIHVzZSBjcHUgY29weSBtZXRob2QgKi8KIAkJaWYgKGluZm8tPm5hbmQub3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpCi0JCQlvbWFwX3JlYWRfYnVmMTYobXRkLCBidWYsIGxlbik7CisJCQlvbWFwX3JlYWRfYnVmMTYobXRkLCAodV9jaGFyICopcCwgbGVuKTsKIAkJZWxzZQotCQkJb21hcF9yZWFkX2J1ZjgobXRkLCBidWYsIGxlbik7CisJCQlvbWFwX3JlYWRfYnVmOChtdGQsICh1X2NoYXIgKilwLCBsZW4pOwogCX0gZWxzZSB7Ci0JCXAgPSAodTMyICopIGJ1ZjsKIAkJZG8gewogCQkJcl9jb3VudCA9IGdwbWNfcmVhZF9zdGF0dXMoR1BNQ19QUkVGRVRDSF9GSUZPX0NOVCk7CiAJCQlyX2NvdW50ID0gcl9jb3VudCA+PiAyOwpAQCAtMjkzLDcgKzI5Miw3IEBACiAJCQkJCQlzdHJ1Y3Qgb21hcF9uYW5kX2luZm8sIG10ZCk7CiAJdWludDMyX3Qgd19jb3VudCA9IDA7CiAJaW50IGkgPSAwLCByZXQgPSAwOwotCXUxNiAqcDsKKwl1MTYgKnAgPSAodTE2ICopYnVmOwogCXVuc2lnbmVkIGxvbmcgdGltLCBsaW1pdDsKIAogCS8qIHRha2UgY2FyZSBvZiBzdWJwYWdlIHdyaXRlcyAqLwpAQCAtMzA5LDExICszMDgsMTAgQEAKIAlpZiAocmV0KSB7CiAJCS8qIFBGUFcgZW5naW5lIGlzIGJ1c3ksIHVzZSBjcHUgY29weSBtZXRob2QgKi8KIAkJaWYgKGluZm8tPm5hbmQub3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpCi0JCQlvbWFwX3dyaXRlX2J1ZjE2KG10ZCwgYnVmLCBsZW4pOworCQkJb21hcF93cml0ZV9idWYxNihtdGQsICh1X2NoYXIgKilwLCBsZW4pOwogCQllbHNlCi0JCQlvbWFwX3dyaXRlX2J1ZjgobXRkLCBidWYsIGxlbik7CisJCQlvbWFwX3dyaXRlX2J1ZjgobXRkLCAodV9jaGFyICopcCwgbGVuKTsKIAl9IGVsc2UgewotCQlwID0gKHUxNiAqKSBidWY7CiAJCXdoaWxlIChsZW4pIHsKIAkJCXdfY291bnQgPSBncG1jX3JlYWRfc3RhdHVzKEdQTUNfUFJFRkVUQ0hfRklGT19DTlQpOwogCQkJd19jb3VudCA9IHdfY291bnQgPj4gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwppbmRleCBiYTcxNTgyLi5hMjBiZmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCkBAIC0xNjMsOCArMTYzLDYgQEAKIAlzdHJ1Y3QgdGxiX2NsaWVudF9pbmZvICpuZXdfaGFzaHRibDsKIAlpbnQgaTsKIAotCXNwaW5fbG9ja19pbml0KCYoYm9uZF9pbmZvLT50eF9oYXNodGJsX2xvY2spKTsKLQogCW5ld19oYXNodGJsID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19oYXNodGJsKSB7CiAJCXByX2VycigiJXM6IEVycm9yOiBGYWlsZWQgdG8gYWxsb2NhdGUgVExCIGhhc2ggdGFibGVcbiIsCkBAIC03NjQsOCArNzYyLDYgQEAKIAlpbnQgc2l6ZSA9IFJMQl9IQVNIX1RBQkxFX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJsYl9jbGllbnRfaW5mbyk7CiAJaW50IGk7CiAKLQlzcGluX2xvY2tfaW5pdCgmKGJvbmRfaW5mby0+cnhfaGFzaHRibF9sb2NrKSk7Ci0KIAluZXdfaGFzaHRibCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfaGFzaHRibCkgewogCQlwcl9lcnIoIiVzOiBFcnJvcjogRmFpbGVkIHRvIGFsbG9jYXRlIFJMQiBoYXNoIHRhYmxlXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggMTZkNmZlOS4uZmZiMGZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0xNTM1LDEyICsxNTM1LDYgQEAKIAkJCSAgIGJvbmRfZGV2LT5uYW1lLCBzbGF2ZV9kZXYtPm5hbWUpOwogCX0KIAotCS8qIGJvbmQgbXVzdCBiZSBpbml0aWFsaXplZCBieSBib25kX29wZW4oKSBiZWZvcmUgZW5zbGF2aW5nICovCi0JaWYgKCEoYm9uZF9kZXYtPmZsYWdzICYgSUZGX1VQKSkgewotCQlwcl93YXJuaW5nKCIlczogbWFzdGVyX2RldiBpcyBub3QgdXAgaW4gYm9uZF9lbnNsYXZlXG4iLAotCQkJICAgYm9uZF9kZXYtPm5hbWUpOwotCX0KLQogCS8qIGFscmVhZHkgZW5zbGF2ZWQgKi8KIAlpZiAoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgewogCQlwcl9kZWJ1ZygiRXJyb3IsIERldmljZSB3YXMgYWxyZWFkeSBlbnNsYXZlZFxuIik7CkBAIC00OTc1LDkgKzQ5NjksMTkgQEAKIHsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IG5ldGRldl9wcml2KGJvbmRfZGV2KTsKIAlzdHJ1Y3QgYm9uZF9uZXQgKmJuID0gbmV0X2dlbmVyaWMoZGV2X25ldChib25kX2RldiksIGJvbmRfbmV0X2lkKTsKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKIAogCXByX2RlYnVnKCJCZWdpbiBib25kX2luaXQgZm9yICVzXG4iLCBib25kX2Rldi0+bmFtZSk7CiAKKwkvKgorCSAqIEluaXRpYWxpemUgbG9ja3MgdGhhdCBtYXkgYmUgcmVxdWlyZWQgZHVyaW5nCisJICogZW4vZGVzbGF2ZSBvcGVyYXRpb25zLiAgQWxsIG9mIHRoZSBib25kX29wZW4gd29yaworCSAqIChvZiB3aGljaCB0aGlzIGlzIHBhcnQpIHNob3VsZCByZWFsbHkgYmUgbW92ZWQgdG8KKwkgKiBhIHBoYXNlIHByaW9yIHRvIGRldl9vcGVuCisJICovCisJc3Bpbl9sb2NrX2luaXQoJihib25kX2luZm8tPnR4X2hhc2h0YmxfbG9jaykpOworCXNwaW5fbG9ja19pbml0KCYoYm9uZF9pbmZvLT5yeF9oYXNodGJsX2xvY2spKTsKKwogCWJvbmQtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoYm9uZF9kZXYtPm5hbWUpOwogCWlmICghYm9uZC0+d3EpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwppbmRleCBkZTg3YWVhLi44YTI3MTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwpAQCAtMjI3LDEyICsyMjcsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCi0JLyogUXVpY2sgc2FuaXR5IGNoZWNrIC0tIGlzIHRoZSBib25kIGludGVyZmFjZSB1cD8gKi8KLQlpZiAoIShib25kLT5kZXYtPmZsYWdzICYgSUZGX1VQKSkgewotCQlwcl93YXJuaW5nKCIlczogZG9pbmcgc2xhdmUgdXBkYXRlcyB3aGVuIGludGVyZmFjZSBpcyBkb3duLlxuIiwKLQkJCSAgIGJvbmQtPmRldi0+bmFtZSk7Ci0JfQotCiAJaWYgKCFydG5sX3RyeWxvY2soKSkKIAkJcmV0dXJuIHJlc3RhcnRfc3lzY2FsbCgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwppbmRleCAzZTVkMGI2Li4wZDI4Mzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKQEAgLTY5MiwxMCArNjkyLDEwIEBACiB7CiAJc3RydWN0IHNpeHBhY2sgKnNwOwogCi0Jd3JpdGVfbG9jaygmZGlzY19kYXRhX2xvY2spOworCXdyaXRlX2xvY2tfYmgoJmRpc2NfZGF0YV9sb2NrKTsKIAlzcCA9IHR0eS0+ZGlzY19kYXRhOwogCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKLQl3cml0ZV91bmxvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmRpc2NfZGF0YV9sb2NrKTsKIAlpZiAoIXNwKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCmluZGV4IDRjNjI4MzkuLmJjMDI5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYwpAQCAtODEzLDEwICs4MTMsMTAgQEAKIHsKIAlzdHJ1Y3QgbWtpc3MgKmF4OwogCi0Jd3JpdGVfbG9jaygmZGlzY19kYXRhX2xvY2spOworCXdyaXRlX2xvY2tfYmgoJmRpc2NfZGF0YV9sb2NrKTsKIAlheCA9IHR0eS0+ZGlzY19kYXRhOwogCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKLQl3cml0ZV91bmxvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmRpc2NfZGF0YV9sb2NrKTsKIAogCWlmICghYXgpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKaW5kZXggMGRmZDFiOS4uMGUzZmNjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKQEAgLTIzNzIsNiArMjM3Miw5IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfSU9WICovCiAJYWRhcHRlci0+cnNzX3F1ZXVlcyA9IG1pbl90KHUzMiwgSUdCX01BWF9SWF9RVUVVRVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwkvKiBpMzUwIGNhbm5vdCBkbyBSU1MgYW5kIFNSLUlPViBhdCB0aGUgc2FtZSB0aW1lICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9pMzUwICYmIGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQpCisJCWFkYXB0ZXItPnJzc19xdWV1ZXMgPSAxOwogCiAJLyoKIAkgKiBpZiByc3NfcXVldWVzID4gNCBvciB2ZnMgYXJlIGdvaW5nIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHJzc19xdWV1ZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY3ZsYW4uYyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwppbmRleCA3OGUzNGU5Li42ZDM1N2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjdmxhbi5jCkBAIC01OTgsOCArNTk4LDggQEAKIAllcnIgPSBuZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3RlcihkZXYsIG1hY3ZsYW5faGFuZGxlX2ZyYW1lLCBwb3J0KTsKIAlpZiAoZXJyKQogCQlrZnJlZShwb3J0KTsKLQotCWRldi0+cHJpdl9mbGFncyB8PSBJRkZfTUFDVkxBTl9QT1JUOworCWVsc2UKKwkJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9NQUNWTEFOX1BPUlQ7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jIGIvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jCmluZGV4IDg5Zjc1NDAuLjVmNTk3Y2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9weGExNjhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvcHhhMTY4X2V0aC5jCkBAIC0xMjczLDcgKzEyNzMsNyBAQAogCXdtYigpOwogCXdybChwZXAsIFNETUFfQ01ELCBTRE1BX0NNRF9UWERIIHwgU0RNQV9DTURfRVJEKTsKIAotCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gbGVuZ3RoOwogCXN0YXRzLT50eF9wYWNrZXRzKys7CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJaWYgKHBlcC0+dHhfcmluZ19zaXplIC0gcGVwLT50eF9kZXNjX2NvdW50IDw9IDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggZjVlOWFjMC4uNTFkM2Y5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTEyMTQsNiArMTIxNCwxMiBAQAogCWludCB2bmV0X2hkcl9zejsKIAlpbnQgcmV0OwogCisjaWZkZWYgQ09ORklHX0FORFJPSURfUEFSQU5PSURfTkVUV09SSworCWlmIChjbWQgIT0gVFVOR0VUSUZGICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCXJldHVybiAtRVBFUk07CisJfQorI2VuZGlmCisKIAlpZiAoY21kID09IFRVTlNFVElGRiB8fCBfSU9DX1RZUEUoY21kKSA9PSAweDg5KQogCQlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgYXJncCwgaWZyZXFfbGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKaW5kZXggMTAzM2VmNi4uZjJiOTc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYworKysgYi9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCkBAIC0xMjU0LDYgKzEyNTQsNyBAQAogCS5kaXNjb25uZWN0ID0gY2RjX25jbV9kaXNjb25uZWN0LAogCS5zdXNwZW5kID0gdXNibmV0X3N1c3BlbmQsCiAJLnJlc3VtZSA9IHVzYm5ldF9yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCiAJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCmluZGV4IDM0OWE1OTYuLjc2ZDUwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwpAQCAtNzIsNiArNzIsMTEgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChhbGxfY2hhbm5lbHMsIG1vZHBhcmFtX2FsbF9jaGFubmVscywgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGFsbF9jaGFubmVscywgIkV4cG9zZSBhbGwgY2hhbm5lbHMgdGhlIGRldmljZSBjYW4gdXNlLiIpOwogCitzdGF0aWMgaW50IG1vZHBhcmFtX2Zhc3RjaGFuc3dpdGNoOworbW9kdWxlX3BhcmFtX25hbWVkKGZhc3RjaGFuc3dpdGNoLCBtb2RwYXJhbV9mYXN0Y2hhbnN3aXRjaCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGZhc3RjaGFuc3dpdGNoLCAiRW5hYmxlIGZhc3QgY2hhbm5lbCBzd2l0Y2hpbmcgZm9yIEFSMjQxMy9BUjU0MTMgcmFkaW9zLiIpOworCisKIC8qIE1vZHVsZSBpbmZvICovCiBNT0RVTEVfQVVUSE9SKCJKaXJpIFNsYWJ5Iik7CiBNT0RVTEVfQVVUSE9SKCJOaWNrIEtvc3NpZmlkaXMiKTsKQEAgLTI2NDQsNiArMjY0OSw3IEBACiAJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAlpbnQgcmV0LCBhbmlfbW9kZTsKKwlib29sIGZhc3Q7CiAKIAlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAicmVzZXR0aW5nXG4iKTsKIApAQCAtMjY2Myw3ICsyNjY5LDEwIEBACiAJYXRoNWtfZHJhaW5fdHhfYnVmZnMoc2MpOwogCWlmIChjaGFuKQogCQlzYy0+Y3VyY2hhbiA9IGNoYW47Ci0JcmV0ID0gYXRoNWtfaHdfcmVzZXQoYWgsIHNjLT5vcG1vZGUsIHNjLT5jdXJjaGFuLCBjaGFuICE9IE5VTEwsCisKKwlmYXN0ID0gKChjaGFuICE9IE5VTEwpICYmIG1vZHBhcmFtX2Zhc3RjaGFuc3dpdGNoKSA/IDEgOiAwOworCisJcmV0ID0gYXRoNWtfaHdfcmVzZXQoYWgsIHNjLT5vcG1vZGUsIHNjLT5jdXJjaGFuLCBmYXN0LAogCQkJCQkJCQlza2lwX3BjdSk7CiAJaWYgKHJldCkgewogCQlBVEg1S19FUlIoc2MsICJjYW4ndCByZXNldCBoYXJkd2FyZSAoJWQpXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCmluZGV4IGVmYjY3MmMuLmEzM2FlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKQEAgLTE1NjUsMTQgKzE1NjUsMTIgQEAKIAkJaWYgKCFjaGluZm9bcGllcl0ucGRfY3VydmVzKQogCQkJY29udGludWU7CiAKLQkJZm9yIChwZGcgPSAwOyBwZGcgPCBlZS0+ZWVfcGRfZ2FpbnNbbW9kZV07IHBkZysrKSB7CisJCWZvciAocGRnID0gMDsgcGRnIDwgQVI1S19FRVBST01fTl9QRF9DVVJWRVM7IHBkZysrKSB7CiAJCQlzdHJ1Y3QgYXRoNWtfcGRnYWluX2luZm8gKnBkID0KIAkJCQkJJmNoaW5mb1twaWVyXS5wZF9jdXJ2ZXNbcGRnXTsKIAotCQkJaWYgKHBkICE9IE5VTEwpIHsKLQkJCQlrZnJlZShwZC0+cGRfc3RlcCk7Ci0JCQkJa2ZyZWUocGQtPnBkX3B3cik7Ci0JCQl9CisJCQlrZnJlZShwZC0+cGRfc3RlcCk7CisJCQlrZnJlZShwZC0+cGRfcHdyKTsKIAkJfQogCiAJCWtmcmVlKGNoaW5mb1twaWVyXS5wZF9jdXJ2ZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCmluZGV4IDNjNDQ2ODkuLjJlMjUxZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKQEAgLTI2NSw3ICsyNjUsOSBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBhdGg1a19wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsKIAogCWF0aDVrX2xlZF9vZmYoc2MpOwogCXJldHVybiAwOwpAQCAtMjc0LDcgKzI3Niw4IEBACiBzdGF0aWMgaW50IGF0aDVrX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCiAJLyoKIAkgKiBTdXNwZW5kL1Jlc3VtZSByZXNldHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLCBzbyB3ZSBoYXZlIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCmluZGV4IDg0MjA2ODkuLjZmNTNkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCkBAIC0xMTE5LDggKzExMTksMTEgQEAKIAkJCS8qIE5vbiBmYXRhbCwgY2FuIGhhcHBlbiBlZy4KIAkJCSAqIG9uIG1vZGUgY2hhbmdlICovCiAJCQlyZXQgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKKwkJCUFUSDVLX0RCRyhhaC0+YWhfc2MsIEFUSDVLX0RFQlVHX1JFU0VULAorCQkJCSJmYXN0IGNoYW4gY2hhbmdlIHN1Y2Nlc3NmdWxcbiIpOwogCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3N5c2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYwppbmRleCA5MjljNjhjLi5hMDczY2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvc3lzZnMuYwpAQCAtMTAsNyArMTAsOCBAQAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQkJXAogCQkJY2hhciAqYnVmKQkJCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsJCQkJXAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBnZXQpOyAJCQlcCiB9CQkJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMTgsNyArMTksOCBAQAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQkJXAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSBody0+cHJpdjsJCQkJXAogCWludCB2YWw7CQkJCQkJCVwKIAkJCQkJCQkJCVwKIAl2YWwgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKQEAgLTMzLDcgKzM1LDggQEAKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKIAkJCWNoYXIgKmJ1ZikJCQkJCVwKIHsJCQkJCQkJCQlcCi0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CQkJCVwKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZ2V0KTsgCQkJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhdGg1a19hdHRyX3Nob3dfIyNuYW1lLCBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKaW5kZXggNmVhZGY5Ny4uZGI0NDE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCkBAIC02NTIsNyArNjUyLDcgQEAKIAkJLnJlZ0RtbiA9IHsgTEUxNigwKSwgTEUxNigweDFmKSB9LAogCQkudHhyeE1hc2sgPSAgMHg3NywgLyogNCBiaXRzIHR4IGFuZCA0IGJpdHMgcnggKi8KIAkJLm9wQ2FwRmxhZ3MgPSB7Ci0JCQkub3BGbGFncyA9IEFSNTQxNl9PUEZMQUdTXzExRyB8IEFSNTQxNl9PUEZMQUdTXzExQSwKKwkJCS5vcEZsYWdzID0gQVI1NDE2X09QRkxBR1NfMTFBLAogCQkJLmVlcE1pc2MgPSAwLAogCQl9LAogCQkucmZTaWxlbnQgPSAwLApAQCAtOTIyLDcgKzkyMiw3IEBACiAJCS5kYl9zdGFnZTIgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KIAkJLmRiX3N0YWdlMyA9IHszLCAzLCAzfSwgLyogZG9lc24ndCBleGlzdCBmb3IgMkcgKi8KIAkJLmRiX3N0YWdlNCA9IHszLCAzLCAzfSwJIC8qIGRvbid0IGV4aXN0IGZvciAyRyAqLwotCQkueHBhQmlhc0x2bCA9IDAsCisJCS54cGFCaWFzTHZsID0gMHhmLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLAogCQkudHhDbGlwID0gMywgLyogNCBiaXRzIHR4X2NsaXAsIDQgYml0cyBkYWNfc2NhbGVfY2NrICovCkBAIC0zOTk0LDYgKzM5OTQsMTYgQEAKIAkJICBQT1dfU00ocFB3ckFycmF5W0FMTF9UQVJHRVRfTEVHQUNZXzFMXzVMXSwgMCkKIAkgICAgKTsKIAorICAgICAgICAvKiBXcml0ZSB0aGUgcG93ZXIgZm9yIGR1cGxpY2F0ZWQgZnJhbWVzIC0gSFQ0MCAqLworCisgICAgICAgIC8qIGR1cDQwX2NjayAoTFNCKSwgZHVwNDBfb2ZkbSwgZXh0MjBfY2NrLCBleHQyMF9vZmRtIChNU0IpICovCisJUkVHX1dSSVRFKGFoLCAweGEzZTAsCisJCSAgUE9XX1NNKHBQd3JBcnJheVtBTExfVEFSR0VUX0xFR0FDWV82XzI0XSwgMjQpIHwKKwkJICBQT1dfU00ocFB3ckFycmF5W0FMTF9UQVJHRVRfTEVHQUNZXzFMXzVMXSwgMTYpIHwKKwkJICBQT1dfU00ocFB3ckFycmF5W0FMTF9UQVJHRVRfTEVHQUNZXzZfMjRdLCAgOCkgfAorCQkgIFBPV19TTShwUHdyQXJyYXlbQUxMX1RBUkdFVF9MRUdBQ1lfMUxfNUxdLCAgMCkKKwkgICAgKTsKKwogCS8qIFdyaXRlIHRoZSBIVDIwIHBvd2VyIHBlciByYXRlIHNldCAqLwogCiAJLyogMC84LzE2IChMU0IpLCAxLTMvOS0xMS8xNy0xOSwgNCwgNSAoTVNCKSAqLwpAQCAtNDU4OCwxMCArNDU5OCwxNiBAQAogCWNhc2UgMToKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTjsKKwkJaWYgKHNjYWxlZFBvd2VyID4gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU4pCisJCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTjsKKwkJZWxzZQorCQkJc2NhbGVkUG93ZXIgPSAwOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCXNjYWxlZFBvd2VyIC09IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU47CisJCWlmIChzY2FsZWRQb3dlciA+IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4pCisJCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOOworCQllbHNlCisJCQlzY2FsZWRQb3dlciA9IDA7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwppbmRleCA4NjQ5NTgxLi5mZTNjMTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwpAQCAtNjksMTUgKzY5LDIxIEBACiAJCQkJCSAgICAgIGludDE2X3QgKm5mYXJyYXkpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmNvbW1vbi0+aHctPmNvbmY7CiAJc3RydWN0IGF0aF9uZl9saW1pdHMgKmxpbWl0OwogCXN0cnVjdCBhdGg5a19uZmNhbF9oaXN0ICpoOwogCWJvb2wgaGlnaF9uZl9taWQgPSBmYWxzZTsKKwl1OCBjaGFpbm1hc2sgPSAoYWgtPnJ4Y2hhaW5tYXNrIDw8IDMpIHwgYWgtPnJ4Y2hhaW5tYXNrOwogCWludCBpOwogCiAJaCA9IGNhbC0+bmZDYWxIaXN0OwogCWxpbWl0ID0gYXRoOWtfaHdfZ2V0X25mX2xpbWl0cyhhaCwgYWgtPmN1cmNoYW4pOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9ORl9SRUFESU5HUzsgaSsrKSB7CisJCWlmICghKGNoYWlubWFzayAmICgxIDw8IGkpKSB8fAorCQkgICAgKChpID49IEFSNTQxNl9NQVhfQ0hBSU5TKSAmJiAhY29uZl9pc19odDQwKGNvbmYpKSkKKwkJCWNvbnRpbnVlOworCiAJCWhbaV0ubmZDYWxCdWZmZXJbaFtpXS5jdXJySW5kZXhdID0gbmZhcnJheVtpXTsKIAogCQlpZiAoKytoW2ldLmN1cnJJbmRleCA+PSBBVEg5S19ORl9DQUxfSElTVF9NQVgpCkBAIC0yMjUsNiArMjMxLDcgQEAKIAlpbnQzMl90IHZhbDsKIAl1OCBjaGFpbm1hc2sgPSAoYWgtPnJ4Y2hhaW5tYXNrIDw8IDMpIHwgYWgtPnJ4Y2hhaW5tYXNrOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZjb21tb24tPmh3LT5jb25mOwogCXMxNiBkZWZhdWx0X25mID0gYXRoOWtfaHdfZ2V0X2RlZmF1bHRfbmYoYWgsIGNoYW4pOwogCiAJaWYgKGFoLT5jYWxkYXRhKQpAQCAtMjM0LDYgKzI0MSw5IEBACiAJCWlmIChjaGFpbm1hc2sgJiAoMSA8PCBpKSkgewogCQkJczE2IG5mdmFsOwogCisJCQlpZiAoKGkgPj0gQVI1NDE2X01BWF9DSEFJTlMpICYmICFjb25mX2lzX2h0NDAoY29uZikpCisJCQkJY29udGludWU7CisKIAkJCWlmIChoKQogCQkJCW5mdmFsID0gaFtpXS5wcml2TkY7CiAJCQllbHNlCkBAIC0yOTMsNiArMzAzLDkgQEAKIAlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX05GX1JFQURJTkdTOyBpKyspIHsKIAkJaWYgKGNoYWlubWFzayAmICgxIDw8IGkpKSB7CisJCQlpZiAoKGkgPj0gQVI1NDE2X01BWF9DSEFJTlMpICYmICFjb25mX2lzX2h0NDAoY29uZikpCisJCQkJY29udGludWU7CisKIAkJCXZhbCA9IFJFR19SRUFEKGFoLCBhaC0+bmZfcmVnc1tpXSk7CiAJCQl2YWwgJj0gMHhGRkZGRkUwMDsKIAkJCXZhbCB8PSAoKCh1MzIpICgtNTApIDw8IDEpICYgMHgxZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwppbmRleCA4Y2Q4MzMzLi45NDVlNDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwpAQCAtNTIyLDEwICs1MjIsMTYgQEAKIAljYXNlIDE6CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU47CisJCWlmIChzY2FsZWRQb3dlciA+IFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOKQorCQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9UV09fQ0hBSU47CisJCWVsc2UKKwkJCXNjYWxlZFBvd2VyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlzY2FsZWRQb3dlciAtPSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOOworCQlpZiAoc2NhbGVkUG93ZXIgPiBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOKQorCQkJc2NhbGVkUG93ZXIgLT0gUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTjsKKwkJZWxzZQorCQkJc2NhbGVkUG93ZXIgPSAwOwogCQlicmVhazsKIAl9CiAJc2NhbGVkUG93ZXIgPSBtYXgoKHUxNikwLCBzY2FsZWRQb3dlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwppbmRleCAxNDgyZmE2Li44NDZiYjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKQEAgLTYzMyw3ICs2MzMsOCBAQAogCXUzMiBzdGF0dXMgPSBzYy0+aW50cnN0YXR1czsKIAl1MzIgcnhtYXNrOwogCi0JaWYgKHN0YXR1cyAmIEFUSDlLX0lOVF9GQVRBTCkgeworCWlmICgoc3RhdHVzICYgQVRIOUtfSU5UX0ZBVEFMKSB8fAorCSAgICAoc3RhdHVzICYgQVRIOUtfSU5UX0JCX1dBVENIRE9HKSkgewogCQlhdGhfcmVzZXQoc2MsIHRydWUpOwogCQlyZXR1cm47CiAJfQpAQCAtNjk5LDYgKzcwMCw3IEBACiB7CiAjZGVmaW5lIFNDSEVEX0lOVFIgKAkJCQlcCiAJCUFUSDlLX0lOVF9GQVRBTCB8CQlcCisJCUFUSDlLX0lOVF9CQl9XQVRDSERPRyB8CQlcCiAJCUFUSDlLX0lOVF9SWE9STiB8CQlcCiAJCUFUSDlLX0lOVF9SWEVPTCB8CQlcCiAJCUFUSDlLX0lOVF9SWCB8CQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCmluZGV4IDljNjU0NTkuLmUxMzcyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKQEAgLTI3OCw2ICsyNzgsMTIgQEAKIAogCWF0aDlrX2h3X3NldF9ncGlvKHNjLT5zY19haCwgc2MtPnNjX2FoLT5sZWRfcGluLCAxKTsKIAorCS8qIFRoZSBkZXZpY2UgaGFzIHRvIGJlIG1vdmVkIHRvIEZVTExTTEVFUCBmb3JjaWJseS4KKwkgKiBPdGhlcndpc2UgdGhlIGNoaXAgbmV2ZXIgbW92ZWQgdG8gZnVsbCBzbGVlcCwKKwkgKiB3aGVuIG5vIGludGVyZmFjZSBpcyB1cC4KKwkgKi8KKwlhdGg5a19od19zZXRwb3dlcihzYy0+c2NfYWgsIEFUSDlLX1BNX0ZVTExfU0xFRVApOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKaW5kZXggNGMwZDM2YS4uYTM5ZGZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKQEAgLTY4OSw3ICs2ODksOCBAQAogCiAJaWYgKFdMQU5fUkNfUEhZX0hUKHJhdGVfdGFibGUtPmluZm9bcml4XS5waHkpKSB7CiAJCXJhdGUtPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JCWlmIChXTEFOX1JDX1BIWV80MChyYXRlX3RhYmxlLT5pbmZvW3JpeF0ucGh5KSkKKwkJaWYgKFdMQU5fUkNfUEhZXzQwKHJhdGVfdGFibGUtPmluZm9bcml4XS5waHkpICYmCisJCSAgICBjb25mX2lzX2h0NDAoJnR4cmMtPmh3LT5jb25mKSkKIAkJCXJhdGUtPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEg7CiAJCWlmIChXTEFOX1JDX1BIWV9TR0kocmF0ZV90YWJsZS0+aW5mb1tyaXhdLnBoeSkpCiAJCQlyYXRlLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwppbmRleCA4OGZhN2ZkLi40ZjJjOGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKQEAgLTY2Miw3ICs2NjIsOCBAQAogCSAqIFRPRE8gLSB0aGlzIGNvdWxkIGJlIGltcHJvdmVkIHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgcmF0ZS4KIAkgKiAgICAgIFRoZSBoYXJkd2FyZSBjYW4ga2VlcCB1cCBhdCBsb3dlciByYXRlcywgYnV0IG5vdCBoaWdoZXIgcmF0ZXMKIAkgKi8KLQlpZiAoZmktPmtleWl4ICE9IEFUSDlLX1RYS0VZSVhfSU5WQUxJRCkKKwlpZiAoKGZpLT5rZXlpeCAhPSBBVEg5S19UWEtFWUlYX0lOVkFMSUQpICYmCisJICAgICEoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkpCiAJCW5kZWxpbSArPSBBVEhfQUdHUl9FTkNSWVBUREVMSU07CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCmluZGV4IDJmYjUzZDAuLjMzM2I2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKQEAgLTExMiw2ICsxMTIsOCBAQAogCXsgVVNCX0RFVklDRSgweDA0YmIsIDB4MDkzZikgfSwKIAkvKiBORUMgV0wzMDBOVS1HICovCiAJeyBVU0JfREVWSUNFKDB4MDQwOSwgMHgwMjQ5KSB9LAorCS8qIE5FQyBXTDMwME5VLUFHICovCisJeyBVU0JfREVWSUNFKDB4MDQwOSwgMHgwMmI0KSB9LAogCS8qIEFWTSBGUklUWiFXTEFOIFVTQiBTdGljayBOICovCiAJeyBVU0JfREVWSUNFKDB4MDU3YywgMHg4NDAxKSB9LAogCS8qIEFWTSBGUklUWiFXTEFOIFVTQiBTdGljayBOIDIuNCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDMyOS9saW51eF9vc2wuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzMjkvbGludXhfb3NsLmMKaW5kZXggY2Y3MmEwNy4uYzVjOTQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDMyOS9saW51eF9vc2wuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200MzI5L2xpbnV4X29zbC5jCkBAIC0xNTUsMTAgKzE1NSw5IEBACiAJZ2ZwX3QgZmxhZ3M7CiAKIAlmbGFncyA9IChpbl9hdG9taWMoKSkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKLQlvc2ggPSBrbWFsbG9jKHNpemVvZihvc2xfdCksIGZsYWdzKTsKKwlvc2ggPSBremFsbG9jKHNpemVvZihvc2xfdCksIGZsYWdzKTsKIAlBU1NFUlQob3NoKTsKIAotCWJ6ZXJvKG9zaCwgc2l6ZW9mKG9zbF90KSk7CiAKIAkKIAlBU1NFUlQoQUJTKEJDTUVfTEFTVCkgPT0gKEFSUkFZU0laRShsaW51eGJjbWVycm9ybWFwKSAtIDEpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzMjkvd2xfaXcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzMjkvd2xfaXcuYwppbmRleCA0MzRlNTg0Li5iZDkzOWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200MzI5L3dsX2l3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDMyOS93bF9pdy5jCkBAIC01ODczLDcgKzU4NzMsNyBAQAogCWludCBuc3NpZCA9IDA7CiAJaW50IG5jaGFuID0gMDsKIAotCVdMX1RSQUNFKCgiXCVzOiBpbmZvLT5jbWQ6JXgsIGluZm8tPmZsYWdzOiV4LCB1LmRhdGE9MHglcCwgdS5sZW49JWRcbiIsCisJV0xfVFJBQ0UoKCIlczogaW5mby0+Y21kOiV4LCBpbmZvLT5mbGFnczoleCwgdS5kYXRhPTB4JXAsIHUubGVuPSVkXG4iLAogCQlfX0ZVTkNUSU9OX18sIGluZm8tPmNtZCwgaW5mby0+ZmxhZ3MsCiAJCXdycXUtPmRhdGEucG9pbnRlciwgd3JxdS0+ZGF0YS5sZW5ndGgpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYwppbmRleCA1YThhM2NjLi40NTVmMWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYwpAQCAtNjI4LDExICs2MjgsMTEgQEAKIAogCS8qIHJ4X3N0YXR1cyBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQgdG8gbWFjODAyMTEgKi8KIAlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHBoeV9yZXMtPnRpbWVzdGFtcCk7CisJcnhfc3RhdHVzLmJhbmQgPSAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykgPworCQkJCUlFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOwogCXJ4X3N0YXR1cy5mcmVxID0KIAkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGxlMTZfdG9fY3B1KHBoeV9yZXMtPmNoYW5uZWwpLAogCQkJCQkJCXJ4X3N0YXR1cy5iYW5kKTsKLQlyeF9zdGF0dXMuYmFuZCA9IChwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/Ci0JCQkJSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7CiAJcnhfc3RhdHVzLnJhdGVfaWR4ID0KIAkJaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHJhdGVfbl9mbGFncywgcnhfc3RhdHVzLmJhbmQpOwogCXJ4X3N0YXR1cy5mbGFnID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jCmluZGV4IGY1NDMzYzcuLmZhY2M5NGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKQEAgLTEyMTgsMTAgKzEyMTgsMTAgQEAKIAkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKIAkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwogCSAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CisJaWYgKHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSAmJgorCSAgICAocHJpdi0+c3dpdGNoX2NoYW5uZWwgIT0gY3R4LT5zdGFnaW5nLmNoYW5uZWwpKSB7CiAJCUlXTF9ERUJVR18xMUgocHJpdiwgImFib3J0IGNoYW5uZWwgc3dpdGNoIG9uICVkXG4iLAotCQkgICAgICBsZTE2X3RvX2NwdShwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsKSk7CisJCSAgICAgIGxlMTZfdG9fY3B1KHByaXYtPnN3aXRjaF9jaGFubmVsKSk7CiAJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7CiAJfQogCkBAIC0xMjM3LDcgKzEyMzcsNyBAQAogCiAJCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwogCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gc2V0X3R4X3Bvd2VyOwogCX0KIAogCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKQEAgLTEzMTcsNiArMTMxNyw3IEBACiAKIAlpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHkocHJpdik7CiAKK3NldF90eF9wb3dlcjoKIAkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAogCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLwogCXJldCA9IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIHRydWUpOwpAQCAtMTQwMyw5ICsxNDA0LDYgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCXByaXYtPnN3aXRjaF9yeG9uLmNoYW5uZWwgPSBjbWQuY2hhbm5lbDsKLQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSB0cnVlOwotCiAJcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsCiAJCQkgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKIH0KQEAgLTE1NDMsNyArMTU0MSw3IEBACiAJczMyIHRlbXA7CiAKIAl0ZW1wID0gaXdsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUocHJpdik7Ci0JaWYgKHRlbXAgPCAwKQorCWlmIChJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfT1VUX09GX1JBTkdFKHRlbXApKQogCQlyZXR1cm47CiAKIAlpZiAocHJpdi0+dGVtcGVyYXR1cmUgIT0gdGVtcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMKaW5kZXggNDJkYjBmYy4uOGFkNzkyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCkBAIC04NjIsMTIgKzg2Miw4IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQogfQogRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUpOwogCkBAIC04NzksMTkgKzg3NSwxOSBAQAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CiAJc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAodm9pZCAqKSZjdHgtPmFjdGl2ZTsKIAotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MpIHsKLQkJaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYKLQkJICAgIChjc2EtPmNoYW5uZWwgPT0gcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCkpIHsKLQkJCXJ4b24tPmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKLQkJCUlXTF9ERUJVR18xMUgocHJpdiwgIkNTQSBub3RpZjogY2hhbm5lbCAlZFxuIiwKKwlpZiAoIXRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYgY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9jaGFubmVsKSB7CisJCXJ4b24tPmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7CisJCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCiAJCQkgICAgICBsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKLQkJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAotCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwotCQl9CisJCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKKwl9IGVsc2UgeworCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOworCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9jc2EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmgKaW5kZXggZjAzYjQ2My4uZTQ5MTc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCkBAIC01NjEsNyArNTYxLDcgQEAKICNkZWZpbmUgU1RBVFVTX1NDQU5fSFcJCTE1CiAjZGVmaW5lIFNUQVRVU19QT1dFUl9QTUkJMTYKICNkZWZpbmUgU1RBVFVTX0ZXX0VSUk9SCQkxNwotCisjZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oCmluZGV4IGY0M2FjMWUuLjU0Zjg5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKQEAgLTg1NCwxNyArODU0LDYgQEAKIH07CiAKIC8qCi0gKiBpd2xfc3dpdGNoX3J4b246ICJjaGFubmVsIHN3aXRjaCIgc3RydWN0dXJlCi0gKgotICogQCBzd2l0Y2hfaW5fcHJvZ3Jlc3M6IGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzCi0gKiBAIGNoYW5uZWw6IG5ldyBjaGFubmVsCi0gKi8KLXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gewotCWJvb2wgc3dpdGNoX2luX3Byb2dyZXNzOwotCV9fbGUxNiBjaGFubmVsOwotfTsKLQotLyoKICAqIHNjaGVkdWxlIHRoZSB0aW1lciB0byB3YWtlIHVwIGV2ZXJ5IFVDT0RFX1RSQUNFX1BFUklPRCBtaWxsaXNlY29uZHMKICAqIHRvIHBlcmZvcm0gY29udGludW91cyB1Q29kZSBldmVudCBsb2dnaW5nIG9wZXJhdGlvbiBpZiBlbmFibGVkCiAgKi8KQEAgLTExMTUsNyArMTEwNCw3IEBACiAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCBjb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsKIAotCXN0cnVjdCBpd2xfc3dpdGNoX3J4b24gc3dpdGNoX3J4b247CisJX19sZTE2IHN3aXRjaF9jaGFubmVsOwogCiAJLyogMXN0IHJlc3BvbnNlcyBmcm9tIGluaXRpYWxpemUgYW5kIHJ1bnRpbWUgdUNvZGUgaW1hZ2VzLgogCSAqIF80OTY1J3MgaW5pdGlhbGl6ZSBhbGl2ZSByZXNwb25zZSBjb250YWlucyBzb21lIGNhbGlicmF0aW9uIGRhdGEuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCmluZGV4IGE2MmZlMjQuLmQ2NTQ4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCkBAIC0yODUxLDE2ICsyODUxLDEzIEBACiAJCWdvdG8gb3V0X2V4aXQ7CiAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWdvdG8gb3V0X2V4aXQ7CiAKIAlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKIAkJZ290byBvdXRfZXhpdDsKIAotCS8qIGNoYW5uZWwgc3dpdGNoIGluIHByb2dyZXNzICovCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9PSB0cnVlKQotCQlnb3RvIG91dF9leGl0OwotCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpIHsKIApAQCAtMjkxMCwxNiArMjkwNywyMCBAQAogCQkJICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKIAkJCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCiAJCQkgKi8KKwkJCXNldF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOworCQkJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7CiAJCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKHByaXYsCi0JCQkJCQkJCSAgICBjaF9zd2l0Y2gpKQotCQkJCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQkJCQkJCQkgICAgY2hfc3dpdGNoKSkgeworCQkJCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywKKwkJCQkJICAmcHJpdi0+c3RhdHVzKTsKKwkJCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKKwkJCX0KIAkJfQogCX0KIG91dDoKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIG91dF9leGl0OgotCWlmICghcHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKQotCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgZmFsc2UpOwogCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKaW5kZXggZDdiNjEyNi4uZDQ3NGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwpAQCAtMTgxLDc5ICsxODEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGl3bDIwMzBfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQotewotCS8qCi0JICogTVVMVEktRklYTUUKLQkgKiBTZWUgaXdsX21hY19jaGFubmVsX3N3aXRjaC4KLQkgKi8KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpd2w2MDAwX2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOwotCXUxNiBjaDsKLQl1MzIgdHNmX2xvdzsKLQl1OCBzd2l0Y2hfY291bnQ7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsCi0JCS5sZW4gPSBzaXplb2YoY21kKSwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCi0JCS5kYXRhID0gJmNtZCwKLQl9OwotCi0JY21kLmJhbmQgPSBwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0JY2ggPSBjaF9zd2l0Y2gtPmNoYW5uZWwtPmh3X3ZhbHVlOwotCUlXTF9ERUJVR18xMUgocHJpdiwgImNoYW5uZWwgc3dpdGNoIGZyb20gJXUgdG8gJXVcbiIsCi0JCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKLQljbWQucnhvbl9mbGFncyA9IGN0eC0+c3RhZ2luZy5mbGFnczsKLQljbWQucnhvbl9maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOwotCXN3aXRjaF9jb3VudCA9IGNoX3N3aXRjaC0+Y291bnQ7Ci0JdHNmX2xvdyA9IGNoX3N3aXRjaC0+dGltZXN0YW1wICYgMHgwZmZmZmZmZmY7Ci0JLyoKLQkgKiBjYWxjdWxhdGUgdGhlIHVjb2RlIGNoYW5uZWwgc3dpdGNoIHRpbWUKLQkgKiBhZGRpbmcgVFNGIGFzIG9uZSBvZiB0aGUgZmFjdG9yIGZvciB3aGVuIHRvIHN3aXRjaAotCSAqLwotCWlmICgocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgPiB0c2ZfbG93KSAmJiBiZWFjb25faW50ZXJ2YWwpIHsKLQkJaWYgKHN3aXRjaF9jb3VudCA+ICgocHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgLSB0c2ZfbG93KSAvCi0JCSAgICBiZWFjb25faW50ZXJ2YWwpKSB7Ci0JCQlzd2l0Y2hfY291bnQgLT0gKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0KLQkJCQl0c2ZfbG93KSAvIGJlYWNvbl9pbnRlcnZhbDsKLQkJfSBlbHNlCi0JCQlzd2l0Y2hfY291bnQgPSAwOwotCX0KLQlpZiAoc3dpdGNoX2NvdW50IDw9IDEpCi0JCWNtZC5zd2l0Y2hfdGltZSA9IGNwdV90b19sZTMyKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lKTsKLQllbHNlIHsKLQkJc3dpdGNoX3RpbWVfaW5fdXNlYyA9Ci0JCQl2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgKiBzd2l0Y2hfY291bnQgKiBUSU1FX1VOSVQ7Ci0JCXVjb2RlX3N3aXRjaF90aW1lID0gaXdsX3VzZWNzX3RvX2JlYWNvbnMocHJpdiwKLQkJCQkJCXN3aXRjaF90aW1lX2luX3VzZWMsCi0JCQkJCQliZWFjb25faW50ZXJ2YWwpOwotCQljbWQuc3dpdGNoX3RpbWUgPSBpd2xfYWRkX2JlYWNvbl90aW1lKHByaXYsCi0JCQkJCQlwcml2LT51Y29kZV9iZWFjb25fdGltZSwKLQkJCQkJCXVjb2RlX3N3aXRjaF90aW1lLAotCQkJCQkJYmVhY29uX2ludGVydmFsKTsKLQl9Ci0JSVdMX0RFQlVHXzExSChwcml2LCAidUNvZGUgdGltZSBmb3IgdGhlIHN3aXRjaCBpcyAweCV4XG4iLAotCQkgICAgICBjbWQuc3dpdGNoX3RpbWUpOwotCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBwcml2LT5iYW5kLCBjaCk7Ci0JaWYgKGNoX2luZm8pCi0JCWNtZC5leHBlY3RfYmVhY29uID0gaXNfY2hhbm5lbF9yYWRhcihjaF9pbmZvKTsKLQllbHNlIHsKLQkJSVdMX0VSUihwcml2LCAiaW52YWxpZCBjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAotCQkJY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwotCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7Ci0KLQlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwotfQotCiBzdGF0aWMgc3RydWN0IGl3bF9saWJfb3BzIGl3bDIwMDBfbGliID0gewogCS5zZXRfaHdfcGFyYW1zID0gaXdsMjAwMF9od19zZXRfaHdfcGFyYW1zLAogCS50eHFfdXBkYXRlX2J5dGVfY250X3RibCA9IGl3bGFnbl90eHFfdXBkYXRlX2J5dGVfY250X3RibCwKQEAgLTI3Nyw3ICsyMDQsNiBAQAogCS5hbGl2ZV9ub3RpZnkgPSBpd2xhZ25fYWxpdmVfbm90aWZ5LAogCS5zZW5kX3R4X3Bvd2VyID0gaXdsYWduX3NlbmRfdHhfcG93ZXIsCiAJLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bF91cGRhdGVfY2hhaW5fZmxhZ3MsCi0JLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDIwMzBfaHdfY2hhbm5lbF9zd2l0Y2gsCiAJLmFwbV9vcHMgPSB7CiAJCS5pbml0ID0gaXdsX2FwbV9pbml0LAogCQkuY29uZmlnID0gaXdsMjAwMF9uaWNfY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCmluZGV4IDIyZTA0NWIuLmRjZjQwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKQEAgLTMzNyw4ICszMzcsNiBAQAogCQkJY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwotCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7CiAKIAlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwogfQpAQCAtNTEzLDcgKzUxMSw2IEBACiB9Owogc3RhdGljIHN0cnVjdCBpd2xfaHRfcGFyYW1zIGl3bDUwMDBfaHRfcGFyYW1zID0gewogCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLAotCS51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbiA9IHRydWUsIC8qIHVzZSBydHMvY3RzIHByb3RlY3Rpb24gKi8KIH07CiAKICNkZWZpbmUgSVdMX0RFVklDRV81MDAwCQkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCmluZGV4IGE3NDViMDEuLjkwMzUyNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKQEAgLTI3Nyw4ICsyNzcsNiBAQAogCQkJY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JcHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCA9IGNtZC5jaGFubmVsOwotCXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcyA9IHRydWU7CiAKIAlyZXR1cm4gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWhjbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMKaW5kZXggNDE1NDNhZDQuLjEyOWE1NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1oY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWhjbWQuYwpAQCAtMjE3LDE3ICsyMTcsOSBAQAogCQkJCSAgICAgX19sZTE2IGZjLCBfX2xlMzIgKnR4X2ZsYWdzKQogewogCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTIHx8Ci0JICAgIGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSB7CisJICAgIGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUIHx8CisJICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKIAkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfUFJPVF9SRVFVSVJFX01TSzsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwcml2LT5jZmctPmh0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24gJiYKLQkgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7Ci0JCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1BST1RfUkVRVUlSRV9NU0s7Ci0JCXJldHVybjsKLQl9CiB9CiAKIC8qIENhbGMgbWF4IHNpZ25hbCBsZXZlbCAoZEJtKSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKaW5kZXggZmJiZGUwNzEuLjdjMGY4MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYwpAQCAtMTczLDYgKzE3MywxNCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiBmb3JjZSBDVFMtdG8tc2VsZiBmcmFtZXMgcHJvdGVjdGlvbiBpZiBSVFMtQ1RTIGlzIG5vdCBwcmVmZXJyZWQKKwkgKiBvbmUgYWdncmVnYXRpb24gcHJvdGVjdGlvbiBtZXRob2QKKwkgKi8KKwlpZiAoIShwcml2LT5jZmctPmh0X3BhcmFtcyAmJgorCSAgICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikpCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TRUxGX0NUU19FTjsKKwogCWlmICgoY3R4LT52aWYgJiYgY3R4LT52aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KSB8fAogCSAgICAhKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykpCiAJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKQEAgLTE4OSwxMCArMTk3LDEwIEBACiAJICogcmVjZWl2ZSBjb21taXRfcnhvbiByZXF1ZXN0CiAJICogYWJvcnQgYW55IHByZXZpb3VzIGNoYW5uZWwgc3dpdGNoIGlmIHN0aWxsIGluIHByb2Nlc3MKIAkgKi8KLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzICYmCi0JICAgIChwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgeworCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKKwkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewogCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX3J4b24uY2hhbm5lbCkpOworCQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX2NoYW5uZWwpKTsKIAkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwogCX0KIApAQCAtMjEwLDYgKzIxOCwxMSBAQAogCiAJCW1lbWNweShhY3RpdmUsICZjdHgtPnN0YWdpbmcsIHNpemVvZigqYWN0aXZlKSk7CiAJCWl3bF9wcmludF9yeF9jb25maWdfY21kKHByaXYsIGN0eCk7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBjb21taXQgdHggcG93ZXIgc2V0dGluZ3Mgd2hpbGUgY2hhbm5lbCBjaGFuZ2luZywKKwkJICogZG8gaXQgbm93IGlmIGFmdGVyIHNldHRpbmdzIGNoYW5nZWQuCisJCSAqLworCQlpd2xfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCmluZGV4IDMyMWIxOGI1Li41OTQxZTYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKQEAgLTM0NjEsMTYgKzM0NjEsMTMgQEAKIAkJZ290byBvdXRfZXhpdDsKIAogCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKQorCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKIAkJZ290byBvdXRfZXhpdDsKIAogCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCiAJCWdvdG8gb3V0X2V4aXQ7CiAKLQkvKiBjaGFubmVsIHN3aXRjaCBpbiBwcm9ncmVzcyAqLwotCWlmIChwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPT0gdHJ1ZSkKLQkJZ290byBvdXRfZXhpdDsKLQogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKSB7CiAKQEAgLTM1MjAsMTYgKzM1MTcsMjAgQEAKIAkJCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCiAJCQkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAogCQkJICovCisJCQlzZXRfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKKwkJCXByaXYtPnN3aXRjaF9jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOwogCQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LAotCQkJCQkJCQkgICAgY2hfc3dpdGNoKSkKLQkJCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCQkJCQkJICAgIGNoX3N3aXRjaCkpIHsKKwkJCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsCisJCQkJCSAgJnByaXYtPnN0YXR1cyk7CisJCQkJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSAwOworCQkJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJCQl9CiAJCX0KIAl9CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiBvdXRfZXhpdDoKLQlpZiAoIXByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCmluZGV4IGJhZmJlNTcuLjdmZDdmZTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCkBAIC04NjEsMTIgKzg2MSw4IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQlpZiAocHJpdi0+c3dpdGNoX3J4b24uc3dpdGNoX2luX3Byb2dyZXNzKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCiAJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlwcml2LT5zd2l0Y2hfcnhvbi5zd2l0Y2hfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQogfQogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKQEAgLTE3NzYsNiArMTc3Miw3IEBACiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXA7CisJZW51bSBubDgwMjExX2lmdHlwZSBuZXd2aWZ0eXBlID0gbmV3dHlwZTsKIAl1MzIgaW50ZXJmYWNlX21vZGVzOwogCWludCBlcnI7CiAKQEAgLTE3ODMsNiArMTc4MCwxNSBAQAogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCisJaWYgKCFjdHgtPnZpZiB8fCAhaXdsX2lzX3JlYWR5X3JmKHByaXYpKSB7CisJCS8qCisJCSAqIEh1aD8gQnV0IHdhaXQgLi4uIHRoaXMgY2FuIG1heWJlIGhhcHBlbiB3aGVuCisJCSAqIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBmaXJtd2FyZSByZXN0YXJ0IQorCQkgKi8KKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKIAlpbnRlcmZhY2VfbW9kZXMgPSBjdHgtPmludGVyZmFjZV9tb2RlcyB8IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKIAogCWlmICghKGludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKQEAgLTE4MDksNyArMTgxNSw4IEBACiAKIAkvKiBzdWNjZXNzICovCiAJaXdsX3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIHRydWUpOwotCXZpZi0+dHlwZSA9IG5ld3R5cGU7CisJdmlmLT50eXBlID0gbmV3dmlmdHlwZTsKKwl2aWYtPnAycCA9IG5ld3AycDsKIAllcnIgPSBpd2xfc2V0dXBfaW50ZXJmYWNlKHByaXYsIGN0eCk7CiAJV0FSTl9PTihlcnIpOwogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKaW5kZXggYjMxNmQ4MzMuLjkyZjY1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTY2Miw3ICs2NjIsNyBAQAogI2RlZmluZSBTVEFUVVNfU0NBTl9IVwkJMTUKICNkZWZpbmUgU1RBVFVTX1BPV0VSX1BNSQkxNgogI2RlZmluZSBTVEFUVVNfRldfRVJST1IJCTE3Ci0KKyNkZWZpbmUgU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcgMTkKIAogc3RhdGljIGlubGluZSBpbnQgaXdsX2lzX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKaW5kZXggNjhiOTUzZi4uNjVhMTZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKQEAgLTEwMzcsMTcgKzEwMzcsNiBAQAogfTsKIAogLyoKLSAqIGl3bF9zd2l0Y2hfcnhvbjogImNoYW5uZWwgc3dpdGNoIiBzdHJ1Y3R1cmUKLSAqCi0gKiBAIHN3aXRjaF9pbl9wcm9ncmVzczogY2hhbm5lbCBzd2l0Y2ggaW4gcHJvZ3Jlc3MKLSAqIEAgY2hhbm5lbDogbmV3IGNoYW5uZWwKLSAqLwotc3RydWN0IGl3bF9zd2l0Y2hfcnhvbiB7Ci0JYm9vbCBzd2l0Y2hfaW5fcHJvZ3Jlc3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci19OwotCi0vKgogICogc2NoZWR1bGUgdGhlIHRpbWVyIHRvIHdha2UgdXAgZXZlcnkgVUNPREVfVFJBQ0VfUEVSSU9EIG1pbGxpc2Vjb25kcwogICogdG8gcGVyZm9ybSBjb250aW51b3VzIHVDb2RlIGV2ZW50IGxvZ2dpbmcgb3BlcmF0aW9uIGlmIGVuYWJsZWQKICAqLwpAQCAtMTM0NCw3ICsxMzMzLDcgQEAKIAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0IGNvbnRleHRzW05VTV9JV0xfUlhPTl9DVFhdOwogCi0Jc3RydWN0IGl3bF9zd2l0Y2hfcnhvbiBzd2l0Y2hfcnhvbjsKKwlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CiAKIAkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCiAJICogX2FnbidzIGluaXRpYWxpemUgYWxpdmUgcmVzcG9uc2UgY29udGFpbnMgc29tZSBjYWxpYnJhdGlvbiBkYXRhLiAqLwpAQCAtMTY1OCwyMSArMTY0NywyNCBAQAogCSAgICAgY3R4IDwgJnByaXYtPmNvbnRleHRzW05VTV9JV0xfUlhPTl9DVFhdOyBjdHgrKykJXAogCQlpZiAocHJpdi0+dmFsaWRfY29udGV4dHMgJiBCSVQoY3R4LT5jdHhpZCkpCiAKK3N0YXRpYyBpbmxpbmUgaW50IGl3bF9pc19hc3NvY2lhdGVkX2N0eChzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQoreworCXJldHVybiAoY3R4LT5hY3RpdmUuZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKSA/IDEgOiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBpd2xfaXNfYXNzb2NpYXRlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHhpZCkKIHsKLQlyZXR1cm4gKHByaXYtPmNvbnRleHRzW2N0eGlkXS5hY3RpdmUuZmlsdGVyX2ZsYWdzICYKLQkJCVJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKKwlyZXR1cm4gaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KCZwcml2LT5jb250ZXh0c1tjdHhpZF0pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpd2xfaXNfYW55X2Fzc29jaWF0ZWQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXJldHVybiBpd2xfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JcmV0dXJuIChjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spID8gMSA6IDA7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKKwkJaWYgKGl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpc19jaGFubmVsX3ZhbGlkKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKaW5kZXggNmY5YTJmYS4uODA1NTkxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCkBAIC0yOTksMTkgKzI5OSwxOSBAQAogCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CiAJc3RydWN0IGl3bF9yeG9uX2NtZCAqcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOwogCi0JaWYgKHByaXYtPnN3aXRjaF9yeG9uLnN3aXRjaF9pbl9wcm9ncmVzcykgewotCQlpZiAoIWxlMzJfdG9fY3B1KGNzYS0+c3RhdHVzKSAmJgotCQkgICAgKGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfcnhvbi5jaGFubmVsKSkgewotCQkJcnhvbi0+Y2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKLQkJCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAorCWlmICghdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoIWxlMzJfdG9fY3B1KGNzYS0+c3RhdHVzKSAmJiBjc2EtPmNoYW5uZWwgPT0gcHJpdi0+c3dpdGNoX2NoYW5uZWwpIHsKKwkJcnhvbi0+Y2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7CisJCUlXTF9ERUJVR18xMUgocHJpdiwgIkNTQSBub3RpZjogY2hhbm5lbCAlZFxuIiwKIAkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKLQkJCSAgICAgIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQkJaXdsX2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwotCQl9CisJCWl3bF9jaHN3aXRjaF9kb25lKHByaXYsIHRydWUpOworCX0gZWxzZSB7CisJCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAorCQkJbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7CisJCWl3bF9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYwppbmRleCBlMTgzNTg3Li5hOGYzYmM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYwpAQCAtODIsNiArODIsNyBAQAogCXtVU0JfREVWSUNFKDB4MDZiOSwgMHgwMTIxKX0sCS8qIFRob21zb24gU3BlZWRUb3VjaCAxMjFnICovCiAJe1VTQl9ERVZJQ0UoMHgwNzA3LCAweGVlMTMpfSwgICAvKiBTTUMgMjg2MlctRyB2ZXJzaW9uIDIgKi8KIAl7VVNCX0RFVklDRSgweDA4M2EsIDB4NDUyMSl9LCAgIC8qIFNpZW1lbnMgR2lnYXNldCBVU0IgQWRhcHRlciA1NCB2ZXJzaW9uIDIgKi8KKwl7VVNCX0RFVklDRSgweDA4M2EsIDB4YzUwMSl9LAkvKiBab29tIFdpcmVsZXNzLUcgNDQxMCAqLwogCXtVU0JfREVWSUNFKDB4MDgzYSwgMHhmNTAzKX0sCS8qIEFjY3RvbiBGRDcwNTBFIHZlciAxMDEwZWMgICovCiAJe1VTQl9ERVZJQ0UoMHgwODQ2LCAweDQyNDApfSwJLyogTmV0Z2VhciBXRzExMSAodjIpICovCiAJe1VTQl9ERVZJQ0UoMHgwOTE1LCAweDIwMDApfSwJLyogQ29oaWJhIFByb3RvIGJvYXJkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYwppbmRleCA3MTI0NGEzLi45MWJmMTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKQEAgLTI3OCw2ICsyNzgsNyBAQAogCXtSVExfVVNCX0RFVklDRSgweDA2ZjgsIDB4ZTAzMywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qSGVyY3VsZXMgLSBFZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDA3YjgsIDB4ODE4OCwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQWJvY29tIC0gQWJvY29tKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxODksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkZ1bmFpIC0gQWJvY29tKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDkwNDEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKk5ldEdlYXIgV05BMTAwME0qLwogCXtSVExfVVNCX0RFVklDRSgweDBEZjYsIDB4MDA1MiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbSAtIEVkaW1heCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MGViMCwgMHg5MDcxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOTyBCcmFuZCAtIEV0b3AqLwogCS8qIEhQIC0gTGl0ZS1PbiAsODE4OENVUyBTbGltIENvbWJvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IGFiNjA3YmIuLjEzYzBjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC0xNTMzLDYgKzE1MzMsMzEgQEAKIG1vZHVsZV9pbml0KHVzYl9pbml0KTsKIG1vZHVsZV9leGl0KHVzYl9leGl0KTsKIAorc3RhdGljIGludCB6ZF9lcF9yZWdzX291dF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHZvaWQgKmRhdGEsIGludCBsZW4sCisJCQkgICAgICBpbnQgKmFjdHVhbF9sZW5ndGgsIGludCB0aW1lb3V0KQoreworCS8qIEluIFVTQiAyLjAgbW9kZSBFUF9SRUdTX09VVCBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgdHlwZS4gSG93ZXZlciBpbgorCSAqIFVTQiAxLjEgbW9kZSBlbmRwb2ludCBpcyBidWxrLiBTZWxlY3QgY29ycmVjdCB0eXBlIFVSQiBieSBlbmRwb2ludAorCSAqIGRlc2NyaXB0b3IuCisJICovCisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKworCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1ZGV2LCBFUF9SRUdTX09VVCk7CisJZXAgPSB1c2JfcGlwZV9lbmRwb2ludCh1ZGV2LCBwaXBlKTsKKwlpZiAoIWVwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoJmVwLT5kZXNjKSkgeworCQlyZXR1cm4gdXNiX2ludGVycnVwdF9tc2codWRldiwgcGlwZSwgZGF0YSwgbGVuLAorCQkJCQkgYWN0dWFsX2xlbmd0aCwgdGltZW91dCk7CisJfSBlbHNlIHsKKwkJcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCBFUF9SRUdTX09VVCk7CisJCXJldHVybiB1c2JfYnVsa19tc2codWRldiwgcGlwZSwgZGF0YSwgbGVuLCBhY3R1YWxfbGVuZ3RoLAorCQkJCSAgICB0aW1lb3V0KTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgdXNiX2ludF9yZWdzX2xlbmd0aCh1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdXNiX2ludF9yZWdzKSArIGNvdW50ICogc2l6ZW9mKHN0cnVjdCByZWdfZGF0YSk7CkBAIC0xNjQ4LDE1ICsxNjczLDE0IEBACiAKIAl1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOwogCXByZXBhcmVfcmVhZF9yZWdzX2ludCh1c2IpOwotCXIgPSB1c2JfaW50ZXJydXB0X21zZyh1ZGV2LCB1c2Jfc25kaW50cGlwZSh1ZGV2LCBFUF9SRUdTX09VVCksCi0JCQkgICAgICByZXEsIHJlcV9sZW4sICZhY3R1YWxfcmVxX2xlbiwgNTAgLyogbXMgKi8pOworCXIgPSB6ZF9lcF9yZWdzX291dF9tc2codWRldiwgcmVxLCByZXFfbGVuLCAmYWN0dWFsX3JlcV9sZW4sIDUwIC8qbXMqLyk7CiAJaWYgKHIpIHsKIAkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKLQkJCSJlcnJvciBpbiB1c2JfaW50ZXJydXB0X21zZygpLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQkJImVycm9yIGluIHpkX2VwX3JlZ3Nfb3V0X21zZygpLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwogCQlnb3RvIGVycm9yOwogCX0KIAlpZiAocmVxX2xlbiAhPSBhY3R1YWxfcmVxX2xlbikgewotCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiZXJyb3IgaW4gdXNiX2ludGVycnVwdF9tc2coKVxuIgorCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiZXJyb3IgaW4gemRfZXBfcmVnc19vdXRfbXNnKClcbiIKIAkJCSIgcmVxX2xlbiAlZCAhPSBhY3R1YWxfcmVxX2xlbiAlZFxuIiwKIAkJCXJlcV9sZW4sIGFjdHVhbF9yZXFfbGVuKTsKIAkJciA9IC1FSU87CkBAIC0xODE4LDkgKzE4NDIsMTcgQEAKIAkJcnctPnZhbHVlID0gY3B1X3RvX2xlMTYoaW9yZXFzW2ldLnZhbHVlKTsKIAl9CiAKLQl1c2JfZmlsbF9pbnRfdXJiKHVyYiwgdWRldiwgdXNiX3NuZGludHBpcGUodWRldiwgRVBfUkVHU19PVVQpLAotCQkJIHJlcSwgcmVxX2xlbiwgaW93cml0ZTE2dl91cmJfY29tcGxldGUsIHVzYiwKLQkJCSBlcC0+ZGVzYy5iSW50ZXJ2YWwpOworCS8qIEluIFVTQiAyLjAgbW9kZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgdHlwZS4gSG93ZXZlciBpbiBVU0IgMS4xIG1vZGUKKwkgKiBlbmRwb2ludCBpcyBidWxrLiBTZWxlY3QgY29ycmVjdCB0eXBlIFVSQiBieSBlbmRwb2ludCBkZXNjcmlwdG9yLgorCSAqLworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoJmVwLT5kZXNjKSkKKwkJdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVkZXYsIHVzYl9zbmRpbnRwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKSwKKwkJCQkgcmVxLCByZXFfbGVuLCBpb3dyaXRlMTZ2X3VyYl9jb21wbGV0ZSwgdXNiLAorCQkJCSBlcC0+ZGVzYy5iSW50ZXJ2YWwpOworCWVsc2UKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1ZGV2LCB1c2Jfc25kYnVsa3BpcGUodWRldiwgRVBfUkVHU19PVVQpLAorCQkJCSAgcmVxLCByZXFfbGVuLCBpb3dyaXRlMTZ2X3VyYl9jb21wbGV0ZSwgdXNiKTsKKwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0ZSRUVfQlVGRkVSOwogCiAJLyogU3VibWl0IHByZXZpb3VzIFVSQiAqLwpAQCAtMTkyNCwxNSArMTk1NiwxNCBAQAogCX0KIAogCXVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7Ci0JciA9IHVzYl9pbnRlcnJ1cHRfbXNnKHVkZXYsIHVzYl9zbmRpbnRwaXBlKHVkZXYsIEVQX1JFR1NfT1VUKSwKLQkJCSAgICAgIHJlcSwgcmVxX2xlbiwgJmFjdHVhbF9yZXFfbGVuLCA1MCAvKiBtcyAqLyk7CisJciA9IHpkX2VwX3JlZ3Nfb3V0X21zZyh1ZGV2LCByZXEsIHJlcV9sZW4sICZhY3R1YWxfcmVxX2xlbiwgNTAgLyptcyovKTsKIAlpZiAocikgewogCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAotCQkJImVycm9yIGluIHVzYl9pbnRlcnJ1cHRfbXNnKCkuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCQkiZXJyb3IgaW4gemRfZXBfcmVnc19vdXRfbXNnKCkuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAocmVxX2xlbiAhPSBhY3R1YWxfcmVxX2xlbikgewotCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiZXJyb3IgaW4gdXNiX2ludGVycnVwdF9tc2coKSIKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgImVycm9yIGluIHpkX2VwX3JlZ3Nfb3V0X21zZygpIgogCQkJIiByZXFfbGVuICVkICE9IGFjdHVhbF9yZXFfbGVuICVkXG4iLAogCQkJcmVxX2xlbiwgYWN0dWFsX3JlcV9sZW4pOwogCQlyID0gLUVJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwppbmRleCBhMzk4NGY0Li5mMzRiNWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCkBAIC0xNDEsNiArMTQxLDEzIEBACiAJLm5vdGlmaWVyX2NhbGwgPSBtb2R1bGVfbG9hZF9ub3RpZnksCiB9OwogCitzdGF0aWMgdm9pZCBmcmVlX2FsbF90YXNrcyh2b2lkKQoreworCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIHRhc2sgc3RydWN0cyAqLworCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOworCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOworfQorCiBpbnQgc3luY19zdGFydCh2b2lkKQogewogCWludCBlcnI7CkBAIC0xNDgsOCArMTU1LDYgQEAKIAlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmbWFya2VkX2NwdXMsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7Ci0KIAllcnIgPSB0YXNrX2hhbmRvZmZfcmVnaXN0ZXIoJnRhc2tfZnJlZV9uYik7CiAJaWYgKGVycikKIAkJZ290byBvdXQxOwpAQCAtMTY2LDcgKzE3MSw2IEBACiAJc3RhcnRfY3B1X3dvcmsoKTsKIAogb3V0OgotCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIAlyZXR1cm4gZXJyOwogb3V0NDoKIAlwcm9maWxlX2V2ZW50X3VucmVnaXN0ZXIoUFJPRklMRV9NVU5NQVAsICZtdW5tYXBfbmIpOwpAQCAtMTc0LDYgKzE3OCw3IEBACiAJcHJvZmlsZV9ldmVudF91bnJlZ2lzdGVyKFBST0ZJTEVfVEFTS19FWElULCAmdGFza19leGl0X25iKTsKIG91dDI6CiAJdGFza19oYW5kb2ZmX3VucmVnaXN0ZXIoJnRhc2tfZnJlZV9uYik7CisJZnJlZV9hbGxfdGFza3MoKTsKIG91dDE6CiAJZnJlZV9jcHVtYXNrX3ZhcihtYXJrZWRfY3B1cyk7CiAJZ290byBvdXQ7CkBAIC0xODIsMjAgKzE4NywxNiBAQAogCiB2b2lkIHN5bmNfc3RvcCh2b2lkKQogewotCS8qIGZsdXNoIGJ1ZmZlcnMgKi8KLQltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwogCWVuZF9jcHVfd29yaygpOwogCXVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZtb2R1bGVfbG9hZF9uYik7CiAJcHJvZmlsZV9ldmVudF91bnJlZ2lzdGVyKFBST0ZJTEVfTVVOTUFQLCAmbXVubWFwX25iKTsKIAlwcm9maWxlX2V2ZW50X3VucmVnaXN0ZXIoUFJPRklMRV9UQVNLX0VYSVQsICZ0YXNrX2V4aXRfbmIpOwogCXRhc2tfaGFuZG9mZl91bnJlZ2lzdGVyKCZ0YXNrX2ZyZWVfbmIpOwotCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKKwliYXJyaWVyKCk7CQkJLyogZG8gYWxsIG9mIHRoZSBhYm92ZSBmaXJzdCAqLworCiAJZmx1c2hfY3B1X3dvcmsoKTsKIAotCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIHRhc2sgc3RydWN0cyAqLwotCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOwotCXByb2Nlc3NfdGFza19tb3J0dWFyeSgpOwotCisJZnJlZV9hbGxfdGFza3MoKTsKIAlmcmVlX2NwdW1hc2tfdmFyKG1hcmtlZF9jcHVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9zbG90LmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYwppbmRleCA4MGI0NjFjLi43NDlmZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYwpAQCAtMTU4LDYgKzE1OCw0NyBAQAogCSAqLwogfQogCisvKiBQcm9ncmFtIFBDSUUgTWF4UGF5bG9hZCBzZXR0aW5nIG9uIGRldmljZTogZW5zdXJlIHBhcmVudCBtYXhwYXlsb2FkIDw9IGRldmljZSAqLworc3RhdGljIGludCBwY2lfc2V0X3BheWxvYWQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKyAgICAgICBpbnQgcG9zLCBwcG9zOworICAgICAgIHUxNiBwY3RsLCBwc3o7CisgICAgICAgdTE2IGRjdGwsIGRzeiwgZGNhcCwgZG1heDsKKyAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGFyZW50OworCisgICAgICAgcGFyZW50ID0gZGV2LT5idXMtPnNlbGY7CisgICAgICAgcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKyAgICAgICBpZiAoIXBvcykKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgLyogUmVhZCBEZXZpY2UgTWF4UGF5bG9hZCBjYXBhYmlsaXR5IGFuZCBzZXR0aW5nICovCisgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwgJmRjdGwpOworICAgICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZDQVAsICZkY2FwKTsKKyAgICAgICBkc3ogPSAoZGN0bCAmIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQpID4+IDU7CisgICAgICAgZG1heCA9IChkY2FwICYgUENJX0VYUF9ERVZDQVBfUEFZTE9BRCk7CisKKyAgICAgICAvKiBSZWFkIFBhcmVudCBNYXhQYXlsb2FkIHNldHRpbmcgKi8KKyAgICAgICBwcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwYXJlbnQsIFBDSV9DQVBfSURfRVhQKTsKKyAgICAgICBpZiAoIXBwb3MpCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICBwY2lfcmVhZF9jb25maWdfd29yZChwYXJlbnQsIHBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwgJnBjdGwpOworICAgICAgIHBzeiA9IChwY3RsICYgIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQpID4+IDU7CisKKyAgICAgICAvKiBJZiBwYXJlbnQgcGF5bG9hZCA+IGRldmljZSBtYXggcGF5bG9hZCAtPiBlcnJvcgorICAgICAgICAqIElmIHBhcmVudCBwYXlsb2FkID4gZGV2aWNlIHBheWxvYWQgLT4gc2V0IHNwZWVkCisgICAgICAgICogSWYgcGFyZW50IHBheWxvYWQgPD0gZGV2aWNlIHBheWxvYWQgLT4gZG8gbm90aGluZworICAgICAgICAqLworICAgICAgIGlmIChwc3ogPiBkbWF4KQorICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIGVsc2UgaWYgKHBzeiA+IGRzeikgeworICAgICAgICAgICAgICAgZGV2X2luZm8oJmRldi0+ZGV2LCAiU2V0dGluZyBNYXhQYXlsb2FkIHRvICVkXG4iLCAxMjggPDwgcHN6KTsKKyAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfREVWQ1RMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkY3RsICYgflBDSV9FWFBfREVWQ1RMX1BBWUxPQUQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHN6IDw8IDUpKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIDA7Cit9CisKIHZvaWQgcGNpX2NvbmZpZ3VyZV9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmNkZXY7CkBAIC0xNjksNiArMjEwLDEwIEBACiAJCQkoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkpKQogCQlyZXR1cm47CiAKKyAgICAgICByZXQgPSBwY2lfc2V0X3BheWxvYWQoZGV2KTsKKyAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgZGV2X3dhcm4oJmRldi0+ZGV2LCAiY291bGQgbm90IHNldCBkZXZpY2UgbWF4IHBheWxvYWRcbiIpOworCiAJbWVtc2V0KCZocHAsIDAsIHNpemVvZihocHApKTsKIAlyZXQgPSBwY2lfZ2V0X2hwX3BhcmFtcyhkZXYsICZocHApOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCBkNTUyZDJjLi41ZGI3MGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTQ2LDYgKzQ2LDggQEAKICNkZWZpbmUgUk9PVF9TSVpFCQlWVERfUEFHRV9TSVpFCiAjZGVmaW5lIENPTlRFWFRfU0laRQkJVlREX1BBR0VfU0laRQogCisjZGVmaW5lIElTX0JSSURHRV9IT1NUX0RFVklDRShwZGV2KSBcCisJCQkgICAgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QpCiAjZGVmaW5lIElTX0dGWF9ERVZJQ0UocGRldikgKChwZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfRElTUExBWSkKICNkZWZpbmUgSVNfSVNBX0RFVklDRShwZGV2KSAoKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfSVNBKQogI2RlZmluZSBJU19BWkFMSUEocGRldikgKChwZGV2KS0+dmVuZG9yID09IDB4ODA4NiAmJiAocGRldiktPmRldmljZSA9PSAweDNhM2UpCkBAIC0xNDE2LDYgKzE0MTgsMTAgQEAKIAlpZiAoIWRvbWFpbikKIAkJcmV0dXJuOwogCisJLyogRmx1c2ggYW55IGxhenkgdW5tYXBzIHRoYXQgbWF5IHJlZmVyZW5jZSB0aGlzIGRvbWFpbiAqLworCWlmICghaW50ZWxfaW9tbXVfc3RyaWN0KQorCQlmbHVzaF91bm1hcHNfdGltZW91dCgwKTsKKwogCWRvbWFpbl9yZW1vdmVfZGV2X2luZm8oZG9tYWluKTsKIAkvKiBkZXN0cm95IGlvdmFzICovCiAJcHV0X2lvdmFfZG9tYWluKCZkb21haW4tPmlvdmFkKTsKQEAgLTIxMDUsMTAgKzIxMTEsMTAgQEAKIAlpZiAobGlrZWx5KCFpb21tdV9pZGVudGl0eV9tYXBwaW5nKSkKIAkJcmV0dXJuIDA7CiAKKwlpbmZvID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCWlmIChpbmZvICYmIGluZm8gIT0gRFVNTVlfREVWSUNFX0RPTUFJTl9JTkZPKQorCQlyZXR1cm4gKGluZm8tPmRvbWFpbiA9PSBzaV9kb21haW4pOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmc2lfZG9tYWluLT5kZXZpY2VzLCBsaW5rKQotCQlpZiAoaW5mby0+ZGV2ID09IHBkZXYpCi0JCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE4Niw4ICsyMTkyLDE5IEBACiAJICogQXNzdW1lIHRoYXQgdGhleSB3aWxsIC0tIGlmIHRoZXkgdHVybiBvdXQgbm90IHRvIGJlLCB0aGVuIHdlIGNhbiAKIAkgKiB0YWtlIHRoZW0gb3V0IG9mIHRoZSAxOjEgZG9tYWluIGxhdGVyLgogCSAqLwotCWlmICghc3RhcnR1cCkKLQkJcmV0dXJuIHBkZXYtPmRtYV9tYXNrID4gRE1BX0JJVF9NQVNLKDMyKTsKKwlpZiAoIXN0YXJ0dXApIHsKKwkJLyoKKwkJICogSWYgdGhlIGRldmljZSdzIGRtYV9tYXNrIGlzIGxlc3MgdGhhbiB0aGUgc3lzdGVtJ3MgbWVtb3J5CisJCSAqIHNpemUgdGhlbiB0aGlzIGlzIG5vdCBhIGNhbmRpZGF0ZSBmb3IgaWRlbnRpdHkgbWFwcGluZy4KKwkJICovCisJCXU2NCBkbWFfbWFzayA9IHBkZXYtPmRtYV9tYXNrOworCisJCWlmIChwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgJiYKKwkJICAgIHBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA8IGRtYV9tYXNrKQorCQkJZG1hX21hc2sgPSBwZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CisKKwkJcmV0dXJuIGRtYV9tYXNrID49IGRtYV9nZXRfcmVxdWlyZWRfbWFzaygmcGRldi0+ZGV2KTsKKwl9CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTIyMDIsNiArMjIxOSw5IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCS8qIFNraXAgSG9zdC9QQ0kgQnJpZGdlIGRldmljZXMgKi8KKwkJaWYgKElTX0JSSURHRV9IT1NUX0RFVklDRShwZGV2KSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoaW9tbXVfc2hvdWxkX2lkZW50aXR5X21hcChwZGV2LCAxKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9NTVU6ICVzIGlkZW50aXR5IG1hcHBpbmcgZm9yIGRldmljZSAlc1xuIiwKIAkJCSAgICAgICBodyA/ICJoYXJkd2FyZSIgOiAic29mdHdhcmUiLCBwY2lfbmFtZShwZGV2KSk7CkBAIC0yNTkxLDggKzI2MTEsNyBAQAogCWlvbW11ID0gZG9tYWluX2dldF9pb21tdShkb21haW4pOwogCXNpemUgPSBhbGlnbmVkX25ycGFnZXMocGFkZHIsIHNpemUpOwogCi0JaW92YSA9IGludGVsX2FsbG9jX2lvdmEoaHdkZXYsIGRvbWFpbiwgZG1hX3RvX21tX3BmbihzaXplKSwKLQkJCQlwZGV2LT5kbWFfbWFzayk7CisJaW92YSA9IGludGVsX2FsbG9jX2lvdmEoaHdkZXYsIGRvbWFpbiwgZG1hX3RvX21tX3BmbihzaXplKSwgZG1hX21hc2spOwogCWlmICghaW92YSkKIAkJZ290byBlcnJvcjsKIApAQCAtMzM3OSw4ICszMzk4LDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2RvbWFpbl9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZkb21haW4tPmRldmljZXMpIHsKIAkJaW5mbyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8sIGxpbmspOwotCQkvKiBObyBuZWVkIHRvIGNvbXBhcmUgUENJIGRvbWFpbjsgaXQgaGFzIHRvIGJlIHRoZSBzYW1lICovCi0JCWlmIChpbmZvLT5idXMgPT0gcGRldi0+YnVzLT5udW1iZXIgJiYKKwkJaWYgKGluZm8tPnNlZ21lbnQgPT0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpICYmCisJCSAgICBpbmZvLT5idXMgPT0gcGRldi0+YnVzLT5udW1iZXIgJiYKIAkJICAgIGluZm8tPmRldmZuID09IHBkZXYtPmRldmZuKSB7CiAJCQlsaXN0X2RlbCgmaW5mby0+bGluayk7CiAJCQlsaXN0X2RlbCgmaW5mby0+Z2xvYmFsKTsKQEAgLTM0MTgsMTAgKzM0MzcsMTMgQEAKIAkJZG9tYWluX3VwZGF0ZV9pb21tdV9jYXAoZG9tYWluKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5pb21tdV9sb2NrLCB0bXBfZmxhZ3MpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgdG1wX2ZsYWdzKTsKLQkJY2xlYXJfYml0KGRvbWFpbi0+aWQsIGlvbW11LT5kb21haW5faWRzKTsKLQkJaW9tbXUtPmRvbWFpbnNbZG9tYWluLT5pZF0gPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgdG1wX2ZsYWdzKTsKKwkJaWYgKCEoZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1ZJUlRVQUxfTUFDSElORSkgJiYKKwkJICAgICEoZG9tYWluLT5mbGFncyAmIERPTUFJTl9GTEFHX1NUQVRJQ19JREVOVElUWSkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgdG1wX2ZsYWdzKTsKKwkJCWNsZWFyX2JpdChkb21haW4tPmlkLCBpb21tdS0+ZG9tYWluX2lkcyk7CisJCQlpb21tdS0+ZG9tYWluc1tkb21haW4tPmlkXSA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgdG1wX2ZsYWdzKTsKKwkJfQogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9kb21haW5fbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaW92YS5jIGIvZHJpdmVycy9wY2kvaW92YS5jCmluZGV4IDk2MDZlNTkuLmM1YzI3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdmEuYworKysgYi9kcml2ZXJzL3BjaS9pb3ZhLmMKQEAgLTYzLDggKzYzLDE2IEBACiAJY3VyciA9IGlvdmFkLT5jYWNoZWQzMl9ub2RlOwogCWNhY2hlZF9pb3ZhID0gY29udGFpbmVyX29mKGN1cnIsIHN0cnVjdCBpb3ZhLCBub2RlKTsKIAotCWlmIChmcmVlLT5wZm5fbG8gPj0gY2FjaGVkX2lvdmEtPnBmbl9sbykKLQkJaW92YWQtPmNhY2hlZDMyX25vZGUgPSByYl9uZXh0KCZmcmVlLT5ub2RlKTsKKwlpZiAoZnJlZS0+cGZuX2xvID49IGNhY2hlZF9pb3ZhLT5wZm5fbG8pIHsKKwkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KCZmcmVlLT5ub2RlKTsKKwkJc3RydWN0IGlvdmEgKmlvdmEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOworCisJCS8qIG9ubHkgY2FjaGUgaWYgaXQncyBiZWxvdyAzMmJpdCBwZm4gKi8KKwkJaWYgKG5vZGUgJiYgaW92YS0+cGZuX2xvIDwgaW92YWQtPmRtYV8zMmJpdF9wZm4pCisJCQlpb3ZhZC0+Y2FjaGVkMzJfbm9kZSA9IG5vZGU7CisJCWVsc2UKKwkJCWlvdmFkLT5jYWNoZWQzMl9ub2RlID0gTlVMTDsKKwl9CiB9CiAKIC8qIENvbXB1dGVzIHRoZSBwYWRkaW5nIHNpemUgcmVxdWlyZWQsIHRvIG1ha2UgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggMTM1ZGYxNi4uNDY3NjdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNjI0LDcgKzYyNCw3IEBACiAJICogc3lzdGVtIGZyb20gdGhlIHNsZWVwIHN0YXRlLCB3ZSdsbCBoYXZlIHRvIHByZXZlbnQgaXQgZnJvbSBzaWduYWxpbmcKIAkgKiB3YWtlLXVwLgogCSAqLwotCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnByZXBhcmUpCiAJCWVycm9yID0gZHJ2LT5wbS0+cHJlcGFyZShkZXYpOwpAQCAtNjM4LDYgKzYzOCw4IEBACiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+Y29tcGxldGUpCiAJCWRydi0+cG0tPmNvbXBsZXRlKGRldik7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggNTEyOWVkNi4uMzYyZTNiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0yNzU1LDkgKzI3NTUsMzQgQEAKIAogCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAicHJvcHJpZXRhcnkgUmljb2ggTU1DIGNvbnRyb2xsZXIgZGlzYWJsZWQgKHZpYSBmaXJld2lyZSBmdW5jdGlvbilcbiIpOwogCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiTU1DIGNhcmRzIGFyZSBub3cgc3VwcG9ydGVkIGJ5IHN0YW5kYXJkIFNESENJIGNvbnRyb2xsZXJcbiIpOworCisJLyoKKwkgKiBSSUNPSCAweGU4MjMgU0QvTU1DIGNhcmQgcmVhZGVyIGZhaWxzIHRvIHJlY29nbml6ZQorCSAqIGNlcnRhaW4gdHlwZXMgb2YgU0QvTU1DIGNhcmRzLiBMb3dlcmluZyB0aGUgU0QgYmFzZQorCSAqIGNsb2NrIGZyZXF1ZW5jeSBmcm9tIDIwME1oeiB0byA1ME1oeiBmaXhlcyB0aGlzIGlzc3VlLgorCSAqCisJICogMHgxNTAgLSBTRDIuMCBtb2RlIGVuYWJsZSBmb3IgY2hhbmdpbmcgYmFzZSBjbG9jaworCSAqCSAgIGZyZXF1ZW5jeSB0byA1ME1oegorCSAqIDB4ZTEgIC0gQmFzZSBjbG9jayBmcmVxdWVuY3kKKwkgKiAweDMyICAtIDUwTWh6IG5ldyBjbG9jayBmcmVxdWVuY3kKKwkgKiAweGY5ICAtIEtleSByZWdpc3RlciBmb3IgMHgxNTAKKwkgKiAweGZjICAtIGtleSByZWdpc3RlciBmb3IgMHhlMQorCSAqLworCWlmIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1Q0U4MjMpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmOSwgMHhmYyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4MTUwLCAweDEwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmOSwgMHgwMCk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZmMsIDB4MDEpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGUxLCAweDMyKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmYywgMHgwMCk7CisKKwkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJNTUMgY29udHJvbGxlciBiYXNlIGZyZXF1ZW5jeSBjaGFuZ2VkIHRvIDUwTWh6LlxuIik7CisJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MzIsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODMyLCByaWNvaF9tbWNfZml4dXBfcjVjODMyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDRTgyMywgcmljb2hfbW1jX2ZpeHVwX3I1YzgzMik7CitERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9SNUNFODIzLCByaWNvaF9tbWNfZml4dXBfcjVjODMyKTsKICNlbmRpZiAvKkNPTkZJR19NTUNfUklDT0hfTU1DKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX0RNQVIpIHx8IGRlZmluZWQoQ09ORklHX0lOVFJfUkVNQVApCkBAIC0yNzg0LDYgKzI4MDksMTYgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4M2MyOCwgdnRkX21hc2tfc3BlY19lcnJvcnMpOwogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBmaXh1cF90aTgxNnhfY2xhc3Moc3RydWN0IHBjaV9kZXYqIGRldikKK3sKKwkvKiBUSSA4MTZ4IGRldmljZXMgZG8gbm90IGhhdmUgY2xhc3MgY29kZSBzZXQgd2hlbiBpbiBQQ0llIGJvb3QgbW9kZSAqLworCWlmIChkZXYtPmNsYXNzID09IFBDSV9DTEFTU19OT1RfREVGSU5FRCkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJTZXR0aW5nIFBDSSBjbGFzcyBmb3IgODE2eCBQQ0llIGRldmljZVxuIik7CisJCWRldi0+Y2xhc3MgPSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9WSURFTzsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1RJLCAweGI4MDAsIGZpeHVwX3RpODE2eF9jbGFzcyk7CisKIHN0YXRpYyB2b2lkIHBjaV9kb19maXh1cHMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9maXh1cCAqZiwKIAkJCSAgc3RydWN0IHBjaV9maXh1cCAqZW5kKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKaW5kZXggODMyYTNmZDcuLmM4Yzk4NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYwpAQCAtMTIyMyw3ICsxMjIzLDcgQEAKIC8qCiAgKiBQbGF0Zm9ybSBkZXZpY2UKICAqLwotc3RhdGljIGludCBfX2luaXQgYXN1c193bWlfcGxhdGZvcm1faW5pdChzdHJ1Y3QgYXN1c193bWkgKmFzdXMpCitzdGF0aWMgaW50IGFzdXNfd21pX3BsYXRmb3JtX2luaXQoc3RydWN0IGFzdXNfd21pICphc3VzKQogewogCWludCBydjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKaW5kZXggZGUzMDFhYTguLmZkZmI5ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYwpAQCAtMjkwLDEyICsyOTAsOSBAQAogCWRlbGxfc2VuZF9yZXF1ZXN0KGJ1ZmZlciwgMTcsIDExKTsKIAogCS8qIElmIHRoZSBoYXJkd2FyZSBzd2l0Y2ggY29udHJvbHMgdGhpcyByYWRpbywgYW5kIHRoZSBoYXJkd2FyZQotCSAgIHN3aXRjaCBpcyBkaXNhYmxlZCwgZG9uJ3QgYWxsb3cgY2hhbmdpbmcgdGhlIHNvZnR3YXJlIHN0YXRlLgotCSAgIElmIHRoZSBoYXJkd2FyZSBzd2l0Y2ggaXMgcmVwb3J0ZWQgYXMgbm90IHN1cHBvcnRlZCwgYWx3YXlzCi0JICAgZmlyZSB0aGUgU01JIHRvIHRvZ2dsZSB0aGUga2lsbHN3aXRjaC4gKi8KKwkgICBzd2l0Y2ggaXMgZGlzYWJsZWQsIGRvbid0IGFsbG93IGNoYW5naW5nIHRoZSBzb2Z0d2FyZSBzdGF0ZSAqLwogCWlmICgoaHdzd2l0Y2hfc3RhdGUgJiBCSVQoaHdzd2l0Y2hfYml0KSkgJiYKLQkgICAgIShidWZmZXItPm91dHB1dFsxXSAmIEJJVCgxNikpICYmCi0JICAgIChidWZmZXItPm91dHB1dFsxXSAmIEJJVCgwKSkpIHsKKwkgICAgIShidWZmZXItPm91dHB1dFsxXSAmIEJJVCgxNikpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQwMSwyMyArMzk4LDYgQEAKIAogc3RhdGljIHZvaWQgZGVsbF91cGRhdGVfcmZraWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKIHsKLQlpbnQgc3RhdHVzOwotCi0JZ2V0X2J1ZmZlcigpOwotCWRlbGxfc2VuZF9yZXF1ZXN0KGJ1ZmZlciwgMTcsIDExKTsKLQlzdGF0dXMgPSBidWZmZXItPm91dHB1dFsxXTsKLQlyZWxlYXNlX2J1ZmZlcigpOwotCi0JLyogaWYgaGFyZHdhcmUgcmZraWxsIGlzIG5vdCBzdXBwb3J0ZWQsIHNldCBpdCBleHBsaWNpdGx5ICovCi0JaWYgKCEoc3RhdHVzICYgQklUKDApKSkgewotCQlpZiAod2lmaV9yZmtpbGwpCi0JCQlkZWxsX3Jma2lsbF9zZXQoKHZvaWQgKikxLCAhKChzdGF0dXMgJiBCSVQoMTcpKSA+PiAxNykpOwotCQlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKLQkJCWRlbGxfcmZraWxsX3NldCgodm9pZCAqKTIsICEoKHN0YXR1cyAmIEJJVCgxOCkpID4+IDE4KSk7Ci0JCWlmICh3d2FuX3Jma2lsbCkKLQkJCWRlbGxfcmZraWxsX3NldCgodm9pZCAqKTMsICEoKHN0YXR1cyAmIEJJVCgxOSkpID4+IDE5KSk7Ci0JfQotCiAJaWYgKHdpZmlfcmZraWxsKQogCQlkZWxsX3Jma2lsbF9xdWVyeSh3aWZpX3Jma2lsbCwgKHZvaWQgKikxKTsKIAlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCAwZmFlNTFjLi42N2E2YjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC0xNzI4LDYgKzE3MjgsOCBAQAogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwogCWludCByZXQgPSAwOworCWludCBvbGRfbWluX3VWOworCWludCBvbGRfbWF4X3VWOwogCiAJbXV0ZXhfbG9jaygmcmRldi0+bXV0ZXgpOwogCkBAIC0xNzQ5LDYgKzE3NTEsOCBAQAogCXJldCA9IHJlZ3VsYXRvcl9jaGVja192b2x0YWdlKHJkZXYsICZtaW5fdVYsICZtYXhfdVYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKKwlvbGRfbWluX3VWID0gcmVndWxhdG9yLT5taW5fdVY7CisJb2xkX21heF91ViA9IHJlZ3VsYXRvci0+bWF4X3VWOwogCXJlZ3VsYXRvci0+bWluX3VWID0gbWluX3VWOwogCXJlZ3VsYXRvci0+bWF4X3VWID0gbWF4X3VWOwogCkBAIC0xNzU3LDYgKzE3NjEsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSBfcmVndWxhdG9yX2RvX3NldF92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZWd1bGF0b3ItPm1pbl91ViA9IG9sZF9taW5fdVY7CisJCXJlZ3VsYXRvci0+bWF4X3VWID0gb2xkX21heF91VjsKKwl9CiAKIG91dDoKIAltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYwppbmRleCAzMGViOWU1Li5kNDQ2NTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCkBAIC02OCwxNCArNjgsMTkgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGRhdGE7CiAJaW50IHJldDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsuYWRkciA9IGkyYy0+YWRkciwgLmZsYWdzID0gMCwgLmxlbiA9IDEsIC5idWYgPSAmZGF0YSB9LAorCQl7LmFkZHIgPSBpMmMtPmFkZHIsIC5mbGFncyA9IEkyQ19NX1JELCAubGVuID0gYnl0ZXMsIC5idWYgPSBkZXN0fSwKKwl9OwogCiAJZGF0YSA9ICh1bnNpZ25lZCBjaGFyKXJlZzsKLQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoaTJjLCAmZGF0YSwgMSk7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoaTJjLT5hZGFwdGVyLCBtc2dzLCAyKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoaTJjLCBkZXN0LCBieXRlcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJaWYgKHJldCA8IDIpCisJCXJldHVybiAtRUlPOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2FsYXJtLmMgYi9kcml2ZXJzL3J0Yy9hbGFybS5jCmluZGV4IGUwZTk4ZGQuLjI4YjBkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2FsYXJtLmMKKysrIGIvZHJpdmVycy9ydGMvYWxhcm0uYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAKIAlocnRpbWVyX2NhbmNlbCgmYWxhcm1zW0FORFJPSURfQUxBUk1fUlRDX1dBS0VVUF0udGltZXIpOwogCWhydGltZXJfY2FuY2VsKCZhbGFybXNbCi0JCQlBTkRST0lEX0FMQVJNX0VMQVBTRURfUkVBTFRJTUVfV0FLRVVQX01BU0tdLnRpbWVyKTsKKwkJCUFORFJPSURfQUxBUk1fRUxBUFNFRF9SRUFMVElNRV9XQUtFVVBdLnRpbWVyKTsKIAogCXRtcF9xdWV1ZSA9ICZhbGFybXNbQU5EUk9JRF9BTEFSTV9SVENfV0FLRVVQXTsKIAlpZiAodG1wX3F1ZXVlLT5maXJzdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwppbmRleCBmMGI4OTUxLi5hOGEyYjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCkBAIC0xMjc0LDYgKzEyNzQsNyBAQAogCWlzY3NpX2luaXQuZHVtbXlfYnVmZmVyX2FkZHJfaGkgPQogCQkodTMyKSAoKHU2NCkgaGJhLT5kdW1teV9idWZfZG1hID4+IDMyKTsKIAorCWhiYS0+bnVtX2NjZWxsID0gaGJhLT5tYXhfc3FlcyA+PiAxOwogCWhiYS0+Y3R4X2NjZWxsX3Rhc2tzID0KIAkJCSgoaGJhLT5udW1fY2NlbGwgJiAweEZGRkYpIHwgKGhiYS0+bWF4X3NxZXMgPDwgMTYpKTsKIAlpc2NzaV9pbml0Lm51bV9jY2VsbHNfcGVyX2Nvbm4gPSBoYmEtPm51bV9jY2VsbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaW5pdC5jCmluZGV4IDFkMjRhMjguLjZhZGJkYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2luaXQuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaGJhLT5laF93YWl0LAogCQkJCQkgKGxpc3RfZW1wdHkoJmhiYS0+ZXBfb2ZsZF9saXN0KSAmJgogCQkJCQkgbGlzdF9lbXB0eSgmaGJhLT5lcF9kZXN0cm95X2xpc3QpKSwKLQkJCQkJIDEwICogSFopOworCQkJCQkgMiAqIEhaKTsKIAkvKiBXYWl0IGZvciBhbGwgZW5kcG9pbnRzIHRvIGJlIHRvcm4gZG93biwgQ2hpcCB3aWxsIGJlIHJlc2V0IG9uY2UKIAkgKiAgY29udHJvbCByZXR1cm5zIHRvIG5ldHdvcmsgZHJpdmVyLiBTbyBpdCBpcyByZXF1aXJlZCB0byBjbGVhbnVwIGFuZAogCSAqIHJlbGVhc2UgYWxsIGNvbm5lY3Rpb24gcmVzb3VyY2VzIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGlzIHJvdXRpbmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCmluZGV4IDE4MDlmOWMuLjUxYTk3MGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYwpAQCAtODU4LDcgKzg1OCw3IEBACiAJbXV0ZXhfaW5pdCgmaGJhLT5uZXRfZGV2X2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhiYS0+ZWhfd2FpdCk7CiAJaWYgKHRlc3RfYml0KEJOWDJJX05YMl9ERVZfNTc3MTAsICZoYmEtPmNuaWNfZGV2X3R5cGUpKSB7Ci0JCWhiYS0+aGJhX3NodXRkb3duX3RtbyA9IDIwICogSFo7CisJCWhiYS0+aGJhX3NodXRkb3duX3RtbyA9IDMwICogSFo7CiAJCWhiYS0+Y29ubl90ZWFyZG93bl90bW8gPSAyMCAqIEhaOwogCQloYmEtPmNvbm5fY3R4X2Rlc3Ryb3lfdG1vID0gNiAqIEhaOwogCX0gZWxzZSB7CS8qIDU3MDYvNTcwOC81NzA5ICovCkBAIC0xMjA4LDYgKzEyMDgsOSBAQAogCXN0cnVjdCBibngyaV9jbWQgKmNtZCA9IHRhc2stPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX2NtZCAqaGRyID0gKHN0cnVjdCBpc2NzaV9jbWQgKikgdGFzay0+aGRyOwogCisJaWYgKGJueDJpX2Nvbm4tPmVwLT5udW1fYWN0aXZlX2NtZHMgKyAxID4gaGJhLT5tYXhfc3FlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKgogCSAqIElmIHRoZXJlIGlzIG5vIHNjc2lfY21uZCB0aGlzIG11c3QgYmUgYSBtZ210IHRhc2sKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYwppbmRleCBkMjA2NGEwLi45YWFiMjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCkBAIC0xMTMsNiArMTEzLDcgQEAKIH07CiAKIAorI2RlZmluZSBNUFQyU0FTX1RVUk5fT05fRkFVTFRfTEVEICgweEZGRkMpCiAjZGVmaW5lIE1QVDJTQVNfUkVTQ0FOX0FGVEVSX0hPU1RfUkVTRVQgKDB4RkZGRikKIAogLyoqCkBAIC0xMjEsNiArMTIyLDcgQEAKICAqIEB3b3JrOiB3b3JrIG9iamVjdCAoaW9jLT5mYXVsdF9yZXNldF93b3JrX3EpCiAgKiBAY2FuY2VsX3BlbmRpbmdfd29yazogZmxhZyBzZXQgZHVyaW5nIHJlc2V0IGhhbmRsaW5nCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBkZXZpY2VfaGFuZGxlOiBkZXZpY2UgaGFuZGxlCiAgKiBAVkZfSUQ6IHZpcnR1YWwgZnVuY3Rpb24gaWQKICAqIEBWUF9JRDogdmlydHVhbCBwb3J0IGlkCiAgKiBAaWdub3JlOiBmbGFnIG1lYW5pbmcgdGhpcyBldmVudCBoYXMgYmVlbiBtYXJrZWQgdG8gaWdub3JlCkBAIC0xMzQsNiArMTM2LDcgQEAKIAl1OAkJCWNhbmNlbF9wZW5kaW5nX3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yawlkZWxheWVkX3dvcms7CiAJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jOworCXUxNgkJCWRldmljZV9oYW5kbGU7CiAJdTgJCQlWRl9JRDsKIAl1OAkJCVZQX0lEOwogCXU4CQkJaWdub3JlOwpAQCAtMzcwOCwxNyArMzcxMSw3NSBAQAogI2VuZGlmCiAKIC8qKgotICogX3Njc2loX3NtYXJ0X3ByZWRpY3RlZF9mYXVsdCAtIGlsbHVtaW5hdGUgRmF1bHQgTEVECisgKiBfc2NzaWhfdHVybl9vbl9mYXVsdF9sZWQgLSBpbGx1bWluYXRlIEZhdWx0IExFRAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCisgKiBDb250ZXh0OiBwcm9jZXNzCisgKgorICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitfc2NzaWhfdHVybl9vbl9mYXVsdF9sZWQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgaGFuZGxlKQoreworCU1waTJTZXBSZXBseV90IG1waV9yZXBseTsKKwlNcGkyU2VwUmVxdWVzdF90IG1waV9yZXF1ZXN0OworCisJbWVtc2V0KCZtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJTZXBSZXF1ZXN0X3QpKTsKKwltcGlfcmVxdWVzdC5GdW5jdGlvbiA9IE1QSTJfRlVOQ1RJT05fU0NTSV9FTkNMT1NVUkVfUFJPQ0VTU09SOworCW1waV9yZXF1ZXN0LkFjdGlvbiA9IE1QSTJfU0VQX1JFUV9BQ1RJT05fV1JJVEVfU1RBVFVTOworCW1waV9yZXF1ZXN0LlNsb3RTdGF0dXMgPQorCSAgICBjcHVfdG9fbGUzMihNUEkyX1NFUF9SRVFfU0xPVFNUQVRVU19QUkVESUNURURfRkFVTFQpOworCW1waV9yZXF1ZXN0LkRldkhhbmRsZSA9IGNwdV90b19sZTE2KGhhbmRsZSk7CisJbXBpX3JlcXVlc3QuRmxhZ3MgPSBNUEkyX1NFUF9SRVFfRkxBR1NfREVWSEFORExFX0FERFJFU1M7CisJaWYgKChtcHQyc2FzX2Jhc2Vfc2NzaV9lbmNsb3N1cmVfcHJvY2Vzc29yKGlvYywgJm1waV9yZXBseSwKKwkgICAgJm1waV9yZXF1ZXN0KSkgIT0gMCkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBpb2MtPm5hbWUsCisJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKG1waV9yZXBseS5JT0NTdGF0dXMgfHwgbXBpX3JlcGx5LklPQ0xvZ0luZm8pIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJlbmNsb3N1cmVfcHJvY2Vzc29yOiAiCisJCSAgICAiaW9jX3N0YXR1cyAoMHglMDR4KSwgbG9naW5mbygweCUwOHgpXG4iLCBpb2MtPm5hbWUsCisJCSAgICBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSwKKwkJICAgIGxlMzJfdG9fY3B1KG1waV9yZXBseS5JT0NMb2dJbmZvKSkpOworCQlyZXR1cm47CisJfQorfQorCisvKioKKyAqIF9zY3NpaF9zZW5kX2V2ZW50X3RvX3R1cm5fb25fZmF1bHRfbGVkIC0gZmlyZSBkZWxheWVkIGV2ZW50CisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqIEBoYW5kbGU6IGRldmljZSBoYW5kbGUKKyAqIENvbnRleHQ6IGludGVycnVwdC4KKyAqCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQKK19zY3NpaF9zZW5kX2V2ZW50X3RvX3R1cm5fb25fZmF1bHRfbGVkKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQ7CisKKwlmd19ldmVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmd19ldmVudF93b3JrKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFmd19ldmVudCkKKwkJcmV0dXJuOworCWZ3X2V2ZW50LT5ldmVudCA9IE1QVDJTQVNfVFVSTl9PTl9GQVVMVF9MRUQ7CisJZndfZXZlbnQtPmRldmljZV9oYW5kbGUgPSBoYW5kbGU7CisJZndfZXZlbnQtPmlvYyA9IGlvYzsKKwlfc2NzaWhfZndfZXZlbnRfYWRkKGlvYywgZndfZXZlbnQpOworfQorCisvKioKKyAqIF9zY3NpaF9zbWFydF9wcmVkaWN0ZWRfZmF1bHQgLSBwcm9jZXNzIHNtYXJ0IGVycm9ycworICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAaGFuZGxlOiBkZXZpY2UgaGFuZGxlCisgKiBDb250ZXh0OiBpbnRlcnJ1cHQuCiAgKgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KIHN0YXRpYyB2b2lkCiBfc2NzaWhfc21hcnRfcHJlZGljdGVkX2ZhdWx0KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSkKIHsKLQlNcGkyU2VwUmVwbHlfdCBtcGlfcmVwbHk7Ci0JTXBpMlNlcFJlcXVlc3RfdCBtcGlfcmVxdWVzdDsKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CiAJc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKIAlNcGkyRXZlbnROb3RpZmljYXRpb25SZXBseV90ICpldmVudF9yZXBseTsKQEAgLTM3NDUsMzAgKzM4MDYsOCBAQAogCXN0YXJnZXRfcHJpbnRrKEtFUk5fV0FSTklORywgc3RhcmdldCwgInByZWRpY3RlZCBmYXVsdFxuIik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAotCWlmIChpb2MtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0pIHsKLQkJbWVtc2V0KCZtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJTZXBSZXF1ZXN0X3QpKTsKLQkJbXBpX3JlcXVlc3QuRnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1NDU0lfRU5DTE9TVVJFX1BST0NFU1NPUjsKLQkJbXBpX3JlcXVlc3QuQWN0aW9uID0gTVBJMl9TRVBfUkVRX0FDVElPTl9XUklURV9TVEFUVVM7Ci0JCW1waV9yZXF1ZXN0LlNsb3RTdGF0dXMgPQotCQkgICAgY3B1X3RvX2xlMzIoTVBJMl9TRVBfUkVRX1NMT1RTVEFUVVNfUFJFRElDVEVEX0ZBVUxUKTsKLQkJbXBpX3JlcXVlc3QuRGV2SGFuZGxlID0gY3B1X3RvX2xlMTYoaGFuZGxlKTsKLQkJbXBpX3JlcXVlc3QuRmxhZ3MgPSBNUEkyX1NFUF9SRVFfRkxBR1NfREVWSEFORExFX0FERFJFU1M7Ci0JCWlmICgobXB0MnNhc19iYXNlX3Njc2lfZW5jbG9zdXJlX3Byb2Nlc3Nvcihpb2MsICZtcGlfcmVwbHksCi0JCSAgICAmbXBpX3JlcXVlc3QpKSAhPSAwKSB7Ci0JCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobXBpX3JlcGx5LklPQ1N0YXR1cyB8fCBtcGlfcmVwbHkuSU9DTG9nSW5mbykgewotCQkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UCi0JCQkgICAgImVuY2xvc3VyZV9wcm9jZXNzb3I6IGlvY19zdGF0dXMgKDB4JTA0eCksICIKLQkJCSAgICAibG9naW5mbygweCUwOHgpXG4iLCBpb2MtPm5hbWUsCi0JCQkgICAgbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cyksCi0JCQkgICAgbGUzMl90b19jcHUobXBpX3JlcGx5LklPQ0xvZ0luZm8pKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CisJaWYgKGlvYy0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lCTSkKKwkJX3Njc2loX3NlbmRfZXZlbnRfdG9fdHVybl9vbl9mYXVsdF9sZWQoaW9jLCBoYW5kbGUpOwogCiAJLyogaW5zZXJ0IGludG8gZXZlbnQgbG9nICovCiAJc3ogPSBvZmZzZXRvZihNcGkyRXZlbnROb3RpZmljYXRpb25SZXBseV90LCBFdmVudERhdGEpICsKQEAgLTYzMzAsNiArNjM2OSw5IEBACiAJfQogCiAJc3dpdGNoIChmd19ldmVudC0+ZXZlbnQpIHsKKwljYXNlIE1QVDJTQVNfVFVSTl9PTl9GQVVMVF9MRUQ6CisJCV9zY3NpaF90dXJuX29uX2ZhdWx0X2xlZChpb2MsIGZ3X2V2ZW50LT5kZXZpY2VfaGFuZGxlKTsKKwkJYnJlYWs7CiAJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPTE9HWV9DSEFOR0VfTElTVDoKIAkJX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnQoaW9jLCBmd19ldmVudCk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggZDNlNThkNy4uYzUyYTBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC0xODc3LDE0ICsxODc3LDE1IEBACiAKIAlzY3NpX3JlbW92ZV9ob3N0KHZoYS0+aG9zdCk7CiAKKwkvKiBBbGxvdyB0aW1lciB0byBydW4gdG8gZHJhaW4gcXVldWVkIGl0ZW1zLCB3aGVuIHJlbW92aW5nIHZwICovCisJcWxhMjR4eF9kZWFsbG9jYXRlX3ZwX2lkKHZoYSk7CisKIAlpZiAodmhhLT50aW1lcl9hY3RpdmUpIHsKIAkJcWxhMngwMF92cF9zdG9wX3RpbWVyKHZoYSk7CiAJCURFQlVHMTUocHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGQpOiB0aW1lciBmb3IgdGhlIHZwb3J0WyVkXSIKIAkJIiA9ICVwIGhhcyBzdG9wcGVkXG4iLCB2aGEtPmhvc3Rfbm8sIHZoYS0+dnBfaWR4LCB2aGEpKTsKIAl9CiAKLQlxbGEyNHh4X2RlYWxsb2NhdGVfdnBfaWQodmhhKTsKLQogCS8qIE5vIHBlbmRpbmcgYWN0aXZpdGllcyBzaGFsbCBiZSB0aGVyZSBvbiB0aGUgdmhhIG5vdyAqLwogCURFQlVHKG1zbGVlcChyYW5kb20zMigpJTEwKSk7ICAvKiBKdXN0IHRvIHNlZSBpZiBzb21ldGhpbmcgZmFsbHMgb24KIAkJCQkJKiB0aGUgbmV0IHdlIGhhdmUgcGxhY2VkIGJlbG93ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCmluZGV4IGY1YmEwOWMuLjUyMjNjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCkBAIC00MTYsOCArNDE2LDcgQEAKIAl1aW50OF90IHZwX2luZGV4OwogCiAJdWludDMyX3QgZmNwX2RhdGFfZHNlZ19hZGRyZXNzWzJdOwkvKiBEYXRhIHNlZ21lbnQgYWRkcmVzcy4gKi8KLQl1aW50MTZfdCBmY3BfZGF0YV9kc2VnX2xlbjsJCS8qIERhdGEgc2VnbWVudCBsZW5ndGguICovCi0JdWludDE2X3QgcmVzZXJ2ZWRfMTsJCQkvKiBNVVNUIGJlIHNldCB0byAwLiAqLworCXVpbnQzMl90IGZjcF9kYXRhX2RzZWdfbGVuOwkJLyogRGF0YSBzZWdtZW50IGxlbmd0aC4gKi8KIH07CiAKICNkZWZpbmUgQ09NTUFORF9UWVBFXzcJMHgxOAkJLyogQ29tbWFuZCBUeXBlIDcgZW50cnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKaW5kZXggNDU1ZmUxMy4uZWIzMTIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKQEAgLTI1NDgsMTEgKzI1NDgsMTEgQEAKIAkJCWRzZF9zZWcgPSAodWludDMyX3QgKikmY21kX3BrdC0+ZmNwX2RhdGFfZHNlZ19hZGRyZXNzOwogCQkJKmRzZF9zZWcrKyA9IGNwdV90b19sZTMyKExTRChkc2RfcHRyLT5kc2RfbGlzdF9kbWEpKTsKIAkJCSpkc2Rfc2VnKysgPSBjcHVfdG9fbGUzMihNU0QoZHNkX3B0ci0+ZHNkX2xpc3RfZG1hKSk7Ci0JCQljbWRfcGt0LT5mY3BfZGF0YV9kc2VnX2xlbiA9IGRzZF9saXN0X2xlbjsKKwkJCSpkc2Rfc2VnKysgPSBjcHVfdG9fbGUzMihkc2RfbGlzdF9sZW4pOwogCQl9IGVsc2UgewogCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKExTRChkc2RfcHRyLT5kc2RfbGlzdF9kbWEpKTsKIAkJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihNU0QoZHNkX3B0ci0+ZHNkX2xpc3RfZG1hKSk7Ci0JCQkqY3VyX2RzZCsrID0gZHNkX2xpc3RfbGVuOworCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKGRzZF9saXN0X2xlbik7CiAJCX0KIAkJY3VyX2RzZCA9ICh1aW50MzJfdCAqKW5leHRfZHNkOwogCQl3aGlsZSAoYXZhaWxfZHNkcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCBhYTc3NDc1Li40YzNmNWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMjM2MCwyMSArMjM2MCwyNiBAQAogCWJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWhhID0gYmFzZV92aGEtPmh3OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT52cG9ydF9zbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodmhhLCAmaGEtPnZwX2xpc3QsIGxpc3QpIHsKLQkJYXRvbWljX2luYygmdmhhLT52cmVmX2NvdW50KTsKKwltdXRleF9sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisJd2hpbGUgKGhhLT5jdXJfdnBvcnRfY291bnQpIHsKKwkJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0OwogCi0JCWlmICh2aGEtPmZjX3Zwb3J0KSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+dnBvcnRfc2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT52cG9ydF9zbG9jaywgZmxhZ3MpOwogCi0JCQlmY192cG9ydF90ZXJtaW5hdGUodmhhLT5mY192cG9ydCk7CisJCUJVR19PTihiYXNlX3ZoYS0+bGlzdC5uZXh0ID09ICZoYS0+dnBfbGlzdCk7CisJCS8qIFRoaXMgYXNzdW1lcyBmaXJzdCBlbnRyeSBpbiBoYS0+dnBfbGlzdCBpcyBhbHdheXMgYmFzZSB2aGEgKi8KKwkJdmhhID0gbGlzdF9maXJzdF9lbnRyeSgmYmFzZV92aGEtPmxpc3QsIHNjc2lfcWxhX2hvc3RfdCwgbGlzdCk7CisJCXNjc2lfaG9zdCA9IHNjc2lfaG9zdF9nZXQodmhhLT5ob3N0KTsKIAotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT52cG9ydF9zbG9jaywgZmxhZ3MpOwotCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT52cG9ydF9zbG9jaywgZmxhZ3MpOworCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKIAotCQlhdG9taWNfZGVjKCZ2aGEtPnZyZWZfY291bnQpOworCQlmY192cG9ydF90ZXJtaW5hdGUodmhhLT5mY192cG9ydCk7CisJCXNjc2lfaG9zdF9wdXQodmhhLT5ob3N0KTsKKworCQltdXRleF9sb2NrKCZoYS0+dnBvcnRfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT52cG9ydF9zbG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwogCiAJc2V0X2JpdChVTkxPQURJTkcsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIApAQCAtMzYwNCw3ICszNjA5LDggQEAKIAlpZiAoIXBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKQogCQlwY2lfcmVhZF9jb25maWdfd29yZChoYS0+cGRldiwgUENJX1ZFTkRPUl9JRCwgJncpOwogCi0JaWYgKElTX1FMQTgyWFgoaGEpKSB7CisJLyogTWFrZSBzdXJlIHFsYTgyeHhfd2F0Y2hkb2cgaXMgcnVuIG9ubHkgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwlpZiAoIXZoYS0+dnBfaWR4ICYmIElTX1FMQTgyWFgoaGEpKSB7CiAJCWlmICh0ZXN0X2JpdChJU1BfUVVJRVNDRV9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCiAJCQlzdGFydF9kcGMrKzsKIAkJcWxhODJ4eF93YXRjaGRvZyh2aGEpOwpAQCAtMzY3NSw4ICszNjgxLDggQEAKIAkJICAgIGF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikpKTsKIAl9CiAKLQkvKiBDaGVjayBpZiBiZWFjb24gTEVEIG5lZWRzIHRvIGJlIGJsaW5rZWQgKi8KLQlpZiAoaGEtPmJlYWNvbl9ibGlua19sZWQgPT0gMSkgeworCS8qIENoZWNrIGlmIGJlYWNvbiBMRUQgbmVlZHMgdG8gYmUgYmxpbmtlZCBmb3IgcGh5c2ljYWwgaG9zdCBvbmx5ICovCisJaWYgKCF2aGEtPnZwX2lkeCAmJiAoaGEtPmJlYWNvbl9ibGlua19sZWQgPT0gMSkpIHsKIAkJc2V0X2JpdChCRUFDT05fQkxJTktfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlzdGFydF9kcGMrKzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggNTg1ODRkYy4uNDRlOGNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJCWtmcmVlKHNkZXYpOwogCQlnb3RvIG91dDsKIAl9Ci0KKwlibGtfZ2V0X3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOwogCXNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlZGF0YSA9IHNkZXY7CiAJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgMCwgc2Rldi0+aG9zdC0+Y21kX3Blcl9sdW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwppbmRleCBlNjM5MTI1Li5lMGJkM2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKQEAgLTMyMiw2ICszMjIsNyBAQAogCQlrZnJlZShldnQpOwogCX0KIAorCWJsa19wdXRfcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CiAJLyogTlVMTCBxdWV1ZSBtZWFucyB0aGUgZGV2aWNlIGNhbid0IGJlIHVzZWQgKi8KIAlzZGV2LT5yZXF1ZXN0X3F1ZXVlID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwppbmRleCA5NTAxOWM3Li40Nzc4ZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuYworKysgYi9kcml2ZXJzL3Njc2kvc3IuYwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJZGlzay0+Zmlyc3RfbWlub3IgPSBtaW5vcjsKIAlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgInNyJWQiLCBtaW5vcik7CiAJZGlzay0+Zm9wcyA9ICZzcl9iZG9wczsKLQlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0NEOworCWRpc2stPmZsYWdzID0gR0VOSERfRkxfQ0QgfCBHRU5IRF9GTF9CTE9DS19FVkVOVFNfT05fRVhDTF9XUklURTsKIAlkaXNrLT5ldmVudHMgPSBESVNLX0VWRU5UX01FRElBX0NIQU5HRSB8IERJU0tfRVZFTlRfRUpFQ1RfUkVRVUVTVDsKIAogCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkZXYtPnJlcXVlc3RfcXVldWUsIFNSX1RJTUVPVVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5jIGIvZHJpdmVycy9zY3NpL3VsdHJhc3Rvci5jCmluZGV4IDlmNGI1OGIuLjdlMjJiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuYworKysgYi9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCSIwOiBic2Z3ICUxLCV3MFxuXHQiCiAJImJ0ciAlMCwlMVxuXHQiCiAJImpuYyAwYiIKLQk6ICI9JnIiIChydiksICI9bSIgKCpmaWVsZCkgOik7CisJOiAiPSZyIiAocnYpLCAiK20iICgqZmllbGQpIDopOwogCiAgIHJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvY2xrL2NwZy5jIGIvZHJpdmVycy9zaC9jbGsvY3BnLmMKaW5kZXggNjE3MjMzNS4uODJkZDZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9jbGsvY3BnLmMKKysrIGIvZHJpdmVycy9zaC9jbGsvY3BnLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAJLyogUmVidWlsZCB0aGUgZnJlcXVlbmN5IHRhYmxlICovCiAJY2xrX3JhdGVfdGFibGVfYnVpbGQoY2xrLCBjbGstPmZyZXFfdGFibGUsIHRhYmxlLT5ucl9kaXZpc29ycywKLQkJCSAgICAgdGFibGUsICZjbGstPmFyY2hfZmxhZ3MpOworCQkJICAgICB0YWJsZSwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKaW5kZXggNTMxYmRiZS4uM2UwOWQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKQEAgLTU3LDYgKzU3LDggQEAKIAlzdHJ1Y3QgbG9nZ2VyX2xvZwkqbG9nOwkvKiBhc3NvY2lhdGVkIGxvZyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJLyogZW50cnkgaW4gbG9nZ2VyX2xvZydzIGxpc3QgKi8KIAlzaXplX3QJCQlyX29mZjsJLyogY3VycmVudCByZWFkIGhlYWQgb2Zmc2V0ICovCisJYm9vbAkJCXJfYWxsOwkvKiByZWFkZXIgY2FuIHJlYWQgYWxsIGVudHJpZXMgKi8KKwlpbnQJCQlyX3ZlcjsJLyogcmVhZGVyIEFCSSB2ZXJzaW9uICovCiB9OwogCiAvKiBsb2dnZXJfb2Zmc2V0IC0gcmV0dXJucyBpbmRleCAnbicgaW50byB0aGUgbG9nIHZpYSAob3B0aW1pemVkKSBtb2R1bHVzICovCkBAIC04NiwyNSArODgsNzEgQEAKIH0KIAogLyoKLSAqIGdldF9lbnRyeV9sZW4gLSBHcmFicyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkIG9mIHRoZSBuZXh0IGVudHJ5IHN0YXJ0aW5nCi0gKiBmcm9tICdvZmYnLgorICogZ2V0X2VudHJ5X2hlYWRlciAtIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsb2dnZXJfZW50cnkgaGVhZGVyIHdpdGhpbgorICogJ2xvZycgc3RhcnRpbmcgYXQgb2Zmc2V0ICdvZmYnLiBBIHRlbXBvcmFyeSBsb2dnZXJfZW50cnkgJ3NjcmF0Y2gnIG11c3QKKyAqIGJlIHByb3ZpZGVkLiBUeXBpY2FsbHkgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGEgcG9pbnRlciB3aXRoaW4KKyAqICdsb2dnZXItPmJ1ZicuICBIb3dldmVyLCBhIHBvaW50ZXIgdG8gJ3NjcmF0Y2gnIG1heSBiZSByZXR1cm5lZCBpZgorICogdGhlIGxvZyBlbnRyeSBzcGFucyB0aGUgZW5kIGFuZCBiZWdpbm5pbmcgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqLworc3RhdGljIHN0cnVjdCBsb2dnZXJfZW50cnkgKmdldF9lbnRyeV9oZWFkZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKKwkJc2l6ZV90IG9mZiwgc3RydWN0IGxvZ2dlcl9lbnRyeSAqc2NyYXRjaCkKK3sKKwlzaXplX3QgbGVuID0gbWluKHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSwgbG9nLT5zaXplIC0gb2ZmKTsKKwlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSkgeworCQltZW1jcHkoKCh2b2lkICopIHNjcmF0Y2gpLCBsb2ctPmJ1ZmZlciArIG9mZiwgbGVuKTsKKwkJbWVtY3B5KCgodm9pZCAqKSBzY3JhdGNoKSArIGxlbiwgbG9nLT5idWZmZXIsCisJCQlzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgLSBsZW4pOworCQlyZXR1cm4gc2NyYXRjaDsKKwl9CisKKwlyZXR1cm4gKHN0cnVjdCBsb2dnZXJfZW50cnkgKikgKGxvZy0+YnVmZmVyICsgb2ZmKTsKK30KKworLyoKKyAqIGdldF9lbnRyeV9tc2dfbGVuIC0gR3JhYnMgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBvZiB0aGUgZW50cnkKKyAqIHN0YXJ0aW5nIGZyb20gZnJvbSAnb2ZmJy4KICAqCiAgKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgogICovCi1zdGF0aWMgX191MzIgZ2V0X2VudHJ5X2xlbihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmKQorc3RhdGljIF9fdTMyIGdldF9lbnRyeV9tc2dfbGVuKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIHNpemVfdCBvZmYpCiB7Ci0JX191MTYgdmFsOworCXN0cnVjdCBsb2dnZXJfZW50cnkgc2NyYXRjaDsKKwlzdHJ1Y3QgbG9nZ2VyX2VudHJ5ICplbnRyeTsKIAotCXN3aXRjaCAobG9nLT5zaXplIC0gb2ZmKSB7Ci0JY2FzZSAxOgotCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDEpOwotCQltZW1jcHkoKChjaGFyICopICZ2YWwpICsgMSwgbG9nLT5idWZmZXIsIDEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDIpOworCWVudHJ5ID0gZ2V0X2VudHJ5X2hlYWRlcihsb2csIG9mZiwgJnNjcmF0Y2gpOworCXJldHVybiBlbnRyeS0+bGVuOworfQorCitzdGF0aWMgc2l6ZV90IGdldF91c2VyX2hkcl9sZW4oaW50IHZlcikKK3sKKwlpZiAodmVyIDwgMikKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdXNlcl9sb2dnZXJfZW50cnlfY29tcGF0KTsKKwllbHNlCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvcHlfaGVhZGVyX3RvX3VzZXIoaW50IHZlciwgc3RydWN0IGxvZ2dlcl9lbnRyeSAqZW50cnksCisJCQkJCSBjaGFyIF9fdXNlciAqYnVmKQoreworCXZvaWQgKmhkcjsKKwlzaXplX3QgaGRyX2xlbjsKKwlzdHJ1Y3QgdXNlcl9sb2dnZXJfZW50cnlfY29tcGF0IHYxOworCisJaWYgKHZlciA8IDIpIHsKKwkJdjEubGVuICAgICAgPSBlbnRyeS0+bGVuOworCQl2MS5fX3BhZCAgICA9IDA7CisJCXYxLnBpZCAgICAgID0gZW50cnktPnBpZDsKKwkJdjEudGlkICAgICAgPSBlbnRyeS0+dGlkOworCQl2MS5zZWMgICAgICA9IGVudHJ5LT5zZWM7CisJCXYxLm5zZWMgICAgID0gZW50cnktPm5zZWM7CisJCWhkciAgICAgICAgID0gJnYxOworCQloZHJfbGVuICAgICA9IHNpemVvZihzdHJ1Y3QgdXNlcl9sb2dnZXJfZW50cnlfY29tcGF0KTsKKwl9IGVsc2UgeworCQloZHIgICAgICAgICA9IGVudHJ5OworCQloZHJfbGVuICAgICA9IHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KTsKIAl9CiAKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpICsgdmFsOworCXJldHVybiBjb3B5X3RvX3VzZXIoYnVmLCBoZHIsIGhkcl9sZW4pOwogfQogCiAvKgpAQCAtMTE4LDE1ICsxNjYsMzAgQEAKIAkJCQkgICBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSAgIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgbG9nZ2VyX2VudHJ5IHNjcmF0Y2g7CisJc3RydWN0IGxvZ2dlcl9lbnRyeSAqZW50cnk7CiAJc2l6ZV90IGxlbjsKKwlzaXplX3QgbXNnX3N0YXJ0OwogCiAJLyoKLQkgKiBXZSByZWFkIGZyb20gdGhlIGxvZyBpbiB0d28gZGlzam9pbnQgb3BlcmF0aW9ucy4gRmlyc3QsIHdlIHJlYWQgZnJvbQotCSAqIHRoZSBjdXJyZW50IHJlYWQgaGVhZCBvZmZzZXQgdXAgdG8gJ2NvdW50JyBieXRlcyBvciB0byB0aGUgZW5kIG9mCisJICogRmlyc3QsIGNvcHkgdGhlIGhlYWRlciB0byB1c2Vyc3BhY2UsIHVzaW5nIHRoZSB2ZXJzaW9uIG9mCisJICogdGhlIGhlYWRlciByZXF1ZXN0ZWQKKwkgKi8KKwllbnRyeSA9IGdldF9lbnRyeV9oZWFkZXIobG9nLCByZWFkZXItPnJfb2ZmLCAmc2NyYXRjaCk7CisJaWYgKGNvcHlfaGVhZGVyX3RvX3VzZXIocmVhZGVyLT5yX3ZlciwgZW50cnksIGJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCisJY291bnQgLT0gZ2V0X3VzZXJfaGRyX2xlbihyZWFkZXItPnJfdmVyKTsKKwlidWYgKz0gZ2V0X3VzZXJfaGRyX2xlbihyZWFkZXItPnJfdmVyKTsKKwltc2dfc3RhcnQgPSBsb2dnZXJfb2Zmc2V0KHJlYWRlci0+cl9vZmYgKyBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpOworCisJLyoKKwkgKiBXZSByZWFkIGZyb20gdGhlIG1zZyBpbiB0d28gZGlzam9pbnQgb3BlcmF0aW9ucy4gRmlyc3QsIHdlIHJlYWQgZnJvbQorCSAqIHRoZSBjdXJyZW50IG1zZyBoZWFkIG9mZnNldCB1cCB0byAnY291bnQnIGJ5dGVzIG9yIHRvIHRoZSBlbmQgb2YKIAkgKiB0aGUgbG9nLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCiAJICovCi0JbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSByZWFkZXItPnJfb2ZmKTsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgbG9nLT5idWZmZXIgKyByZWFkZXItPnJfb2ZmLCBsZW4pKQorCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbXNnX3N0YXJ0KTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgbG9nLT5idWZmZXIgKyBtc2dfc3RhcnQsIGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJLyoKQEAgLTEzNyw5ICsyMDAsMzQgQEAKIAkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBsZW4sIGxvZy0+YnVmZmVyLCBjb3VudCAtIGxlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJlYWRlci0+cl9vZmYgPSBsb2dnZXJfb2Zmc2V0KHJlYWRlci0+cl9vZmYgKyBjb3VudCk7CisJcmVhZGVyLT5yX29mZiA9IGxvZ2dlcl9vZmZzZXQocmVhZGVyLT5yX29mZiArCisJCXNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSArIGNvdW50KTsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gY291bnQgKyBnZXRfdXNlcl9oZHJfbGVuKHJlYWRlci0+cl92ZXIpOworfQorCisvKgorICogZ2V0X25leHRfZW50cnlfYnlfdWlkIC0gU3RhcnRpbmcgYXQgJ29mZicsIHJldHVybnMgYW4gb2Zmc2V0IGludG8KKyAqICdsb2ctPmJ1ZmZlcicgd2hpY2ggY29udGFpbnMgdGhlIGZpcnN0IGVudHJ5IHJlYWRhYmxlIGJ5ICdldWlkJworICovCitzdGF0aWMgc2l6ZV90IGdldF9uZXh0X2VudHJ5X2J5X3VpZChzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAorCQlzaXplX3Qgb2ZmLCB1aWRfdCBldWlkKQoreworCXdoaWxlIChvZmYgIT0gbG9nLT53X29mZikgeworCQlzdHJ1Y3QgbG9nZ2VyX2VudHJ5ICplbnRyeTsKKwkJc3RydWN0IGxvZ2dlcl9lbnRyeSBzY3JhdGNoOworCQlzaXplX3QgbmV4dF9sZW47CisKKwkJZW50cnkgPSBnZXRfZW50cnlfaGVhZGVyKGxvZywgb2ZmLCAmc2NyYXRjaCk7CisKKwkJaWYgKGVudHJ5LT5ldWlkID09IGV1aWQpCisJCQlyZXR1cm4gb2ZmOworCisJCW5leHRfbGVuID0gc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpICsgZW50cnktPmxlbjsKKwkJb2ZmID0gbG9nZ2VyX29mZnNldChvZmYgKyBuZXh0X2xlbik7CisJfQorCisJcmV0dXJuIG9mZjsKIH0KIAogLyoKQEAgLTE1MSw3ICsyMzksNyBAQAogICogCS0gSWYgdGhlcmUgYXJlIG5vIGxvZyBlbnRyaWVzIHRvIHJlYWQsIGJsb2NrcyB1bnRpbCBsb2cgaXMgd3JpdHRlbiB0bwogICogCS0gQXRvbWljYWxseSByZWFkcyBleGFjdGx5IG9uZSBsb2cgZW50cnkKICAqCi0gKiBPcHRpbWFsIHJlYWQgc2l6ZSBpcyBMT0dHRVJfRU5UUllfTUFYX0xFTi4gV2lsbCBzZXQgZXJybm8gdG8gRUlOVkFMIGlmIHJlYWQKKyAqIFdpbGwgc2V0IGVycm5vIHRvIEVJTlZBTCBpZiByZWFkCiAgKiBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIGhvbGQgbmV4dCBlbnRyeS4KICAqLwogc3RhdGljIHNzaXplX3QgbG9nZ2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCkBAIC0xOTEsNiArMjc5LDEwIEBACiAKIAltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKIAorCWlmICghcmVhZGVyLT5yX2FsbCkKKwkJcmVhZGVyLT5yX29mZiA9IGdldF9uZXh0X2VudHJ5X2J5X3VpZChsb2csCisJCQlyZWFkZXItPnJfb2ZmLCBjdXJyZW50X2V1aWQoKSk7CisKIAkvKiBpcyB0aGVyZSBzdGlsbCBzb21ldGhpbmcgdG8gcmVhZCBvciBkaWQgd2UgcmFjZT8gKi8KIAlpZiAodW5saWtlbHkobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKSkgewogCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwpAQCAtMTk4LDcgKzI5MCw4IEBACiAJfQogCiAJLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBuZXh0IGVudHJ5ICovCi0JcmV0ID0gZ2V0X2VudHJ5X2xlbihsb2csIHJlYWRlci0+cl9vZmYpOworCXJldCA9IGdldF91c2VyX2hkcl9sZW4ocmVhZGVyLT5yX3ZlcikgKworCQlnZXRfZW50cnlfbXNnX2xlbihsb2csIHJlYWRlci0+cl9vZmYpOwogCWlmIChjb3VudCA8IHJldCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTIyNCw3ICszMTcsOCBAQAogCXNpemVfdCBjb3VudCA9IDA7CiAKIAlkbyB7Ci0JCXNpemVfdCBuciA9IGdldF9lbnRyeV9sZW4obG9nLCBvZmYpOworCQlzaXplX3QgbnIgPSBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKworCQkJZ2V0X2VudHJ5X21zZ19sZW4obG9nLCBvZmYpOwogCQlvZmYgPSBsb2dnZXJfb2Zmc2V0KG9mZiArIG5yKTsKIAkJY291bnQgKz0gbnI7CiAJfSB3aGlsZSAoY291bnQgPCBsZW4pOwpAQCAtMzM2LDcgKzQzMCw5IEBACiAJaGVhZGVyLnRpZCA9IGN1cnJlbnQtPnBpZDsKIAloZWFkZXIuc2VjID0gbm93LnR2X3NlYzsKIAloZWFkZXIubnNlYyA9IG5vdy50dl9uc2VjOworCWhlYWRlci5ldWlkID0gY3VycmVudF9ldWlkKCk7CiAJaGVhZGVyLmxlbiA9IG1pbl90KHNpemVfdCwgaW9jYi0+a2lfbGVmdCwgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FEKTsKKwloZWFkZXIuaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSk7CiAKIAkvKiBudWxsIHdyaXRlcyBzdWNjZWVkLCByZXR1cm4gemVybyAqLwogCWlmICh1bmxpa2VseSghaGVhZGVyLmxlbikpCkBAIC00MDksNiArNTA1LDEwIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQlyZWFkZXItPmxvZyA9IGxvZzsKKwkJcmVhZGVyLT5yX3ZlciA9IDE7CisJCXJlYWRlci0+cl9hbGwgPSBpbl9lZ3JvdXBfcChpbm9kZS0+aV9naWQpIHx8CisJCQljYXBhYmxlKENBUF9TWVNMT0cpOworCiAJCUlOSVRfTElTVF9IRUFEKCZyZWFkZXItPmxpc3QpOwogCiAJCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwpAQCAtNDYzLDYgKzU2MywxMCBAQAogCXBvbGxfd2FpdChmaWxlLCAmbG9nLT53cSwgd2FpdCk7CiAKIAltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKwlpZiAoIXJlYWRlci0+cl9hbGwpCisJCXJlYWRlci0+cl9vZmYgPSBnZXRfbmV4dF9lbnRyeV9ieV91aWQobG9nLAorCQkJcmVhZGVyLT5yX29mZiwgY3VycmVudF9ldWlkKCkpOworCiAJaWYgKGxvZy0+d19vZmYgIT0gcmVhZGVyLT5yX29mZikKIAkJcmV0IHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKQEAgLTQ3MCwxMSArNTc0LDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGxvbmcgbG9nZ2VyX3NldF92ZXJzaW9uKHN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZlcnNpb247CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZXJzaW9uLCBhcmcsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKHZlcnNpb24gPCAxKSB8fCAodmVyc2lvbiA+IDIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlYWRlci0+cl92ZXIgPSB2ZXJzaW9uOworCXJldHVybiAwOworfQorCiBzdGF0aWMgbG9uZyBsb2dnZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coZmlsZSk7CiAJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQlsb25nIHJldCA9IC1FTk9UVFk7CisJbG9uZyByZXQgPSAtRUlOVkFMOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopIGFyZzsKIAogCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwogCkBAIC00OTksOCArNjE3LDE0IEBACiAJCQlicmVhazsKIAkJfQogCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkJaWYgKCFyZWFkZXItPnJfYWxsKQorCQkJcmVhZGVyLT5yX29mZiA9IGdldF9uZXh0X2VudHJ5X2J5X3VpZChsb2csCisJCQkJcmVhZGVyLT5yX29mZiwgY3VycmVudF9ldWlkKCkpOworCiAJCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCi0JCQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7CisJCQlyZXQgPSBnZXRfdXNlcl9oZHJfbGVuKHJlYWRlci0+cl92ZXIpICsKKwkJCQlnZXRfZW50cnlfbXNnX2xlbihsb2csIHJlYWRlci0+cl9vZmYpOwogCQllbHNlCiAJCQlyZXQgPSAwOwogCQlicmVhazsKQEAgLTUxNCw2ICs2MzgsMjIgQEAKIAkJbG9nLT5oZWFkID0gbG9nLT53X29mZjsKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CisJY2FzZSBMT0dHRVJfR0VUX1ZFUlNJT046CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXJldCA9IHJlYWRlci0+cl92ZXI7CisJCWJyZWFrOworCWNhc2UgTE9HR0VSX1NFVF9WRVJTSU9OOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlyZXQgPSBsb2dnZXJfc2V0X3ZlcnNpb24ocmVhZGVyLCBhcmdwKTsKKwkJYnJlYWs7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKQEAgLTUzNCw4ICs2NzQsOCBAQAogCiAvKgogICogRGVmaW5lcyBhIGxvZyBzdHJ1Y3R1cmUgd2l0aCBuYW1lICdOQU1FJyBhbmQgYSBzaXplIG9mICdTSVpFJyBieXRlcywgd2hpY2gKLSAqIG11c3QgYmUgYSBwb3dlciBvZiB0d28sIGdyZWF0ZXIgdGhhbiBMT0dHRVJfRU5UUllfTUFYX0xFTiwgYW5kIGxlc3MgdGhhbgotICogTE9OR19NQVggbWludXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uCisgKiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLCBhbmQgZ3JlYXRlciB0aGFuCisgKiAoTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FEICsgc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpKS4KICAqLwogI2RlZmluZSBERUZJTkVfTE9HR0VSX0RFVklDRShWQVIsIE5BTUUsIFNJWkUpIFwKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIF9idWZfICMjIFZBUltTSVpFXTsgXApAQCAtNTU1LDEwICs2OTUsMTAgQEAKIAkuc2l6ZSA9IFNJWkUsIFwKIH07CiAKLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19tYWluLCBMT0dHRVJfTE9HX01BSU4sIDY0KjEwMjQpCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfbWFpbiwgTE9HR0VSX0xPR19NQUlOLCAyNTYqMTAyNCkKIERFRklORV9MT0dHRVJfREVWSUNFKGxvZ19ldmVudHMsIExPR0dFUl9MT0dfRVZFTlRTLCAyNTYqMTAyNCkKLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19yYWRpbywgTE9HR0VSX0xPR19SQURJTywgNjQqMTAyNCkKLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19zeXN0ZW0sIExPR0dFUl9MT0dfU1lTVEVNLCA2NCoxMDI0KQorREVGSU5FX0xPR0dFUl9ERVZJQ0UobG9nX3JhZGlvLCBMT0dHRVJfTE9HX1JBRElPLCAyNTYqMTAyNCkKK0RFRklORV9MT0dHRVJfREVWSUNFKGxvZ19zeXN0ZW0sIExPR0dFUl9MT0dfU1lTVEVNLCAyNTYqMTAyNCkKIAogc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nICpnZXRfbG9nX2Zyb21fbWlub3IoaW50IG1pbm9yKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaAppbmRleCAyY2IwNmU5Li4zZjYxMmEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKQEAgLTIwLDcgKzIwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCi1zdHJ1Y3QgbG9nZ2VyX2VudHJ5IHsKKy8qCisgKiBUaGUgdXNlcnNwYWNlIHN0cnVjdHVyZSBmb3IgdmVyc2lvbiAxIG9mIHRoZSBsb2dnZXJfZW50cnkgQUJJLgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgdG8gdXNlcnNwYWNlIHVubGVzcyB0aGUgY2FsbGVyIHJlcXVlc3RzCisgKiBhbiB1cGdyYWRlIHRvIGEgbmV3ZXIgQUJJIHZlcnNpb24uCisgKi8KK3N0cnVjdCB1c2VyX2xvZ2dlcl9lbnRyeV9jb21wYXQgewogCV9fdTE2CQlsZW47CS8qIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCAqLwogCV9fdTE2CQlfX3BhZDsJLyogbm8gbWF0dGVyIHdoYXQsIHdlIGdldCAyIGJ5dGVzIG9mIHBhZGRpbmcgKi8KIAlfX3MzMgkJcGlkOwkvKiBnZW5lcmF0aW5nIHByb2Nlc3MncyBwaWQgKi8KQEAgLTMwLDE0ICszNSwyOCBAQAogCWNoYXIJCW1zZ1swXTsJLyogdGhlIGVudHJ5J3MgcGF5bG9hZCAqLwogfTsKIAorLyoKKyAqIFRoZSBzdHJ1Y3R1cmUgZm9yIHZlcnNpb24gMiBvZiB0aGUgbG9nZ2VyX2VudHJ5IEFCSS4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkIHRvIHVzZXJzcGFjZSBpZiBpb2N0bChMT0dHRVJfU0VUX1ZFUlNJT04pCisgKiBpcyBjYWxsZWQgd2l0aCB2ZXJzaW9uID49IDIKKyAqLworc3RydWN0IGxvZ2dlcl9lbnRyeSB7CisJX191MTYJCWxlbjsJCS8qIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCAqLworCV9fdTE2CQloZHJfc2l6ZTsJLyogc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnlfdjIpICovCisJX19zMzIJCXBpZDsJCS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHBpZCAqLworCV9fczMyCQl0aWQ7CQkvKiBnZW5lcmF0aW5nIHByb2Nlc3MncyB0aWQgKi8KKwlfX3MzMgkJc2VjOwkJLyogc2Vjb25kcyBzaW5jZSBFcG9jaCAqLworCV9fczMyCQluc2VjOwkJLyogbmFub3NlY29uZHMgKi8KKwl1aWRfdAkJZXVpZDsJCS8qIGVmZmVjdGl2ZSBVSUQgb2YgbG9nZ2VyICovCisJY2hhcgkJbXNnWzBdOwkJLyogdGhlIGVudHJ5J3MgcGF5bG9hZCAqLworfTsKKwogI2RlZmluZSBMT0dHRVJfTE9HX1JBRElPCSJsb2dfcmFkaW8iCS8qIHJhZGlvLXJlbGF0ZWQgbWVzc2FnZXMgKi8KICNkZWZpbmUgTE9HR0VSX0xPR19FVkVOVFMJImxvZ19ldmVudHMiCS8qIHN5c3RlbS9oYXJkd2FyZSBldmVudHMgKi8KICNkZWZpbmUgTE9HR0VSX0xPR19TWVNURU0JImxvZ19zeXN0ZW0iCS8qIHN5c3RlbS9mcmFtZXdvcmsgbWVzc2FnZXMgKi8KICNkZWZpbmUgTE9HR0VSX0xPR19NQUlOCQkibG9nX21haW4iCS8qIGV2ZXJ5dGhpbmcgZWxzZSAqLwogCi0jZGVmaW5lIExPR0dFUl9FTlRSWV9NQVhfTEVOCQkoNCoxMDI0KQotI2RlZmluZSBMT0dHRVJfRU5UUllfTUFYX1BBWUxPQUQJXAotCShMT0dHRVJfRU5UUllfTUFYX0xFTiAtIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSkKKyNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FECTQwNzYKIAogI2RlZmluZSBfX0xPR0dFUklPCTB4QUUKIApAQCAtNDUsNSArNjQsNyBAQAogI2RlZmluZSBMT0dHRVJfR0VUX0xPR19MRU4JCV9JTyhfX0xPR0dFUklPLCAyKSAvKiB1c2VkIGxvZyBsZW4gKi8KICNkZWZpbmUgTE9HR0VSX0dFVF9ORVhUX0VOVFJZX0xFTglfSU8oX19MT0dHRVJJTywgMykgLyogbmV4dCBlbnRyeSBsZW4gKi8KICNkZWZpbmUgTE9HR0VSX0ZMVVNIX0xPRwkJX0lPKF9fTE9HR0VSSU8sIDQpIC8qIGZsdXNoIGxvZyAqLworI2RlZmluZSBMT0dHRVJfR0VUX1ZFUlNJT04JCV9JTyhfX0xPR0dFUklPLCA1KSAvKiBhYmkgdmVyc2lvbiAqLworI2RlZmluZSBMT0dHRVJfU0VUX1ZFUlNJT04JCV9JTyhfX0xPR0dFUklPLCA2KSAvKiBhYmkgdmVyc2lvbiAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0xPR0dFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvcmFtX2NvbnNvbGUuYwppbmRleCA1M2Y3MzZiLi5jYjQyZDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3JhbV9jb25zb2xlLmg+CiAKICNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCiAjaW5jbHVkZSA8bGludXgvcnNsaWIuaD4KQEAgLTE1NSwxNCArMTU2LDIwIEBACiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdAotcmFtX2NvbnNvbGVfc2F2ZV9vbGQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLCBjaGFyICpkZXN0KQorcmFtX2NvbnNvbGVfc2F2ZV9vbGQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpib290aW5mbywKKwljaGFyICpkZXN0KQogewogCXNpemVfdCBvbGRfbG9nX3NpemUgPSBidWZmZXItPnNpemU7CisJc2l6ZV90IGJvb3RpbmZvX3NpemUgPSAwOworCXNpemVfdCB0b3RhbF9zaXplID0gb2xkX2xvZ19zaXplOworCWNoYXIgKnB0cjsKKwljb25zdCBjaGFyICpib290aW5mb19sYWJlbCA9ICJCb290IGluZm86XG4iOworCiAjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgogCXVpbnQ4X3QgKmJsb2NrOwogCXVpbnQ4X3QgKnBhcjsKIAljaGFyIHN0cmJ1Zls4MF07Ci0JaW50IHN0cmJ1Zl9sZW47CisJaW50IHN0cmJ1Zl9sZW4gPSAwOwogCiAJYmxvY2sgPSBidWZmZXItPmRhdGE7CiAJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlcjsKQEAgLTE5NywxMSArMjA0LDE1IEBACiAJCQkJICAgICAgIlxuTm8gZXJyb3JzIGRldGVjdGVkXG4iKTsKIAlpZiAoc3RyYnVmX2xlbiA+PSBzaXplb2Yoc3RyYnVmKSkKIAkJc3RyYnVmX2xlbiA9IHNpemVvZihzdHJidWYpIC0gMTsKLQlvbGRfbG9nX3NpemUgKz0gc3RyYnVmX2xlbjsKKwl0b3RhbF9zaXplICs9IHN0cmJ1Zl9sZW47CiAjZW5kaWYKIAorCWlmIChib290aW5mbykKKwkJYm9vdGluZm9fc2l6ZSA9IHN0cmxlbihib290aW5mbykgKyBzdHJsZW4oYm9vdGluZm9fbGFiZWwpOworCXRvdGFsX3NpemUgKz0gYm9vdGluZm9fc2l6ZTsKKwogCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJZGVzdCA9IGttYWxsb2Mob2xkX2xvZ19zaXplLCBHRlBfS0VSTkVMKTsKKwkJZGVzdCA9IGttYWxsb2ModG90YWxfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChkZXN0ID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIik7CkBAIC0yMTAsMTkgKzIyMSwyNyBAQAogCX0KIAogCXJhbV9jb25zb2xlX29sZF9sb2cgPSBkZXN0OwotCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IG9sZF9sb2dfc2l6ZTsKKwlyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgPSB0b3RhbF9zaXplOwogCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nLAogCSAgICAgICAmYnVmZmVyLT5kYXRhW2J1ZmZlci0+c3RhcnRdLCBidWZmZXItPnNpemUgLSBidWZmZXItPnN0YXJ0KTsKIAltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZyArIGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+c3RhcnQsCiAJICAgICAgICZidWZmZXItPmRhdGFbMF0sIGJ1ZmZlci0+c3RhcnQpOworCXB0ciA9IHJhbV9jb25zb2xlX29sZF9sb2cgKyBvbGRfbG9nX3NpemU7CiAjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nICsgb2xkX2xvZ19zaXplIC0gc3RyYnVmX2xlbiwKLQkgICAgICAgc3RyYnVmLCBzdHJidWZfbGVuKTsKKwltZW1jcHkocHRyLCBzdHJidWYsIHN0cmJ1Zl9sZW4pOworCXB0ciArPSBzdHJidWZfbGVuOwogI2VuZGlmCisJaWYgKGJvb3RpbmZvKSB7CisJCW1lbWNweShwdHIsIGJvb3RpbmZvX2xhYmVsLCBzdHJsZW4oYm9vdGluZm9fbGFiZWwpKTsKKwkJcHRyICs9IHN0cmxlbihib290aW5mb19sYWJlbCk7CisJCW1lbWNweShwdHIsIGJvb3RpbmZvLCBib290aW5mb19zaXplKTsKKwkJcHRyICs9IGJvb3RpbmZvX3NpemU7CisJfQogfQogCiBzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9pbml0KHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciwKLQkJCQkgICBzaXplX3QgYnVmZmVyX3NpemUsIGNoYXIgKm9sZF9idWYpCisJCQkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCBjaGFyICpib290aW5mbywKKwkJCQkgICBjaGFyICpvbGRfYnVmKQogewogI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KIAlpbnQgbnVtZXJyOwpAQCAtMjg5LDcgKzMwOCw3IEBACiAJCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgYnVmZmVyLCAiCiAJCQkgICAgICAgInNpemUgJWQsIHN0YXJ0ICVkXG4iLAogCQkJICAgICAgIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5zdGFydCk7Ci0JCQlyYW1fY29uc29sZV9zYXZlX29sZChidWZmZXIsIG9sZF9idWYpOworCQkJcmFtX2NvbnNvbGVfc2F2ZV9vbGQoYnVmZmVyLCBib290aW5mbywgb2xkX2J1Zik7CiAJCX0KIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogbm8gdmFsaWQgZGF0YSBpbiBidWZmZXIgIgpAQCAtMzEzLDYgKzMzMiw3IEBACiAJcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKikKIAkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUiwKIAkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRSwKKwkJTlVMTCwKIAkJcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlcik7CiB9CiAjZWxzZQpAQCAtMzIyLDYgKzM0Miw4IEBACiAJc2l6ZV90IHN0YXJ0OwogCXNpemVfdCBidWZmZXJfc2l6ZTsKIAl2b2lkICpidWZmZXI7CisJY29uc3QgY2hhciAqYm9vdGluZm8gPSBOVUxMOworCXN0cnVjdCByYW1fY29uc29sZV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJaWYgKHJlcyA9PSBOVUxMIHx8IHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMSB8fAogCSAgICAhKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKQEAgLTMzOSw3ICszNjEsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgTlVMTC8qIGFsbG9jYXRlICovKTsKKwlpZiAocGRhdGEpCisJCWJvb3RpbmZvID0gcGRhdGEtPmJvb3RpbmZvOworCisJcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgYm9vdGluZm8sIE5VTEwvKiBhbGxvY2F0ZSAqLyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJhbV9jb25zb2xlX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvd2xjX2FtcGR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3dsY19hbXBkdS5jCmluZGV4IGYwMDg2NTkuLmY3YmZmNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvd2xjX2FtcGR1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy93bGNfYW1wZHUuYwpAQCAtMTEyMywyMSArMTEyMywxMiBAQAogCQkJCWluaS0+dHhyZXRyeVtpbmRleF0gPSAwOwogCiAJCQkJLyogYW1wZHVfYWNrX2xlbjogbnVtYmVyIG9mIGFja2VkIGFnZ3JlZ2F0ZWQgZnJhbWVzICovCi0JCQkJLyogYW1wZHVfYWNrX21hcDogYmxvY2sgYWNrIGJpdCBtYXAgZm9yIHRoZSBhZ2dyZWdhdGlvbiAqLwogCQkJCS8qIGFtcGR1X2xlbjogbnVtYmVyIG9mIGFnZ3JlZ2F0ZWQgZnJhbWVzICovCiAJCQkJcmF0ZV9zdGF0dXMod2xjLCB0eF9pbmZvLCB0eHMsIG1jcyk7CiAJCQkJdHhfaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwogCQkJCXR4X2luZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVOwotCi0JCQkJLyogWFhYIFRPRE86IE1ha2UgdGhlc2UgYWNjdXJhdGUuICovCiAJCQkJdHhfaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4gPQotCQkJCSAgICAodHhzLT4KLQkJCQkgICAgIHN0YXR1cyAmIFRYX1NUQVRVU19GUk1fUlRYX01BU0spID4+Ci0JCQkJICAgIFRYX1NUQVRVU19GUk1fUlRYX1NISUZUOwotCQkJCXR4X2luZm8tPnN0YXR1cy5hbXBkdV9sZW4gPQotCQkJCSAgICAodHhzLT4KLQkJCQkgICAgIHN0YXR1cyAmIFRYX1NUQVRVU19GUk1fUlRYX01BU0spID4+Ci0JCQkJICAgIFRYX1NUQVRVU19GUk1fUlRYX1NISUZUOworCQkJCQl0eF9pbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gMTsKIAogCQkJCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7CiAJCQkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOwpAQCAtMTE2Myw2ICsxMTU0LDggQEAKIAkJCQkvKiBSZXRyeSB0aW1lb3V0ICovCiAJCQkJaW5pLT50eF9pbl90cmFuc2l0LS07CiAJCQkJaWVlZTgwMjExX3R4X2luZm9fY2xlYXJfc3RhdHVzKHR4X2luZm8pOworCQkJCXR4X2luZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gMDsKKwkJCQl0eF9pbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gMTsKIAkJCQl0eF9pbmZvLT5mbGFncyB8PQogCQkJCSAgICBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVV9OT19CQUNLOwogCQkJCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZmIuYwppbmRleCBmNjdmNTNiLi4xYjk2MTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9mYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ZiLmMKQEAgLTQ4OSw2ICs0ODksMTYgQEAKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNpemU7CiAJbWVtc2V0KGluZm8tPnNjcmVlbl9iYXNlLCAwLCBzaXplKTsKIAorCWlmIChkZXZfcHJpdi0+cGctPnN0b2xlbl9zaXplKSB7CisJCWluZm8tPmFwZXJ0dXJlcyA9IGFsbG9jX2FwZXJ0dXJlcygxKTsKKwkJaWYgKCFpbmZvLT5hcGVydHVyZXMpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnIwOworCQl9CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2U7CisJCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLnNpemUgPSBkZXZfcHJpdi0+cGctPnN0b2xlbl9zaXplOworCX0KKwogCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOwogCWRybV9mYl9oZWxwZXJfZmlsbF92YXIoaW5mbywgJmZiZGV2LT5wc2JfZmJfaGVscGVyLAogCQkJCXNpemVzLT5mYl93aWR0aCwgc2l6ZXMtPmZiX2hlaWdodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMKaW5kZXggZGQ2YTU3Yy4uNGUwNTFmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY196aWxvZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYwpAQCAtNDc1LDE0ICs0NzUsMTQgQEAKIAlkcHJpbnRrKCJwb2xsIHRocmVhZCBzdGFydGVkXG4iKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKIAkJLyogaWYgZGV2aWNlIG5vdCBvcGVuZWQsIHdlIGNhbiBzbGVlcCBoYWxmIGEgc2Vjb25kICovCiAJCWlmIChhdG9taWNfcmVhZCgmaXItPm9wZW5fY291bnQpID09IDApIHsKIAkJCXNjaGVkdWxlX3RpbWVvdXQoSFovMik7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KIAkJLyoKIAkJICogVGhpcyBpcyB+MTEzKjIgKyAyNCArIGppdHRlciAoMipyZXBlYXQgZ2FwICsgY29kZSBsZW5ndGgpLgogCQkgKiBXZSB1c2UgdGhpcyBpbnRlcnZhbCBhcyB0aGUgY2hpcCByZXNldHMgZXZlcnkgdGltZSB5b3UgcG9sbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKaW5kZXggOGIxNDUxZC4uODQ4NmViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCkBAIC02OCw3ICs2OCwxMCBAQAogCXBtbG1lcHJpdi0+Zndfc3RhdGUgfD0gX0ZXX1VOREVSX0xJTktJTkc7CiAJcG1sbWVwcml2LT5wc2Nhbm5lZCA9IHBsaXN0OwogCXBtbG1lcHJpdi0+dG9fam9pbiA9IHRydWU7Ci0JaWYgKF9xdWV1ZV9lbXB0eShxdWV1ZSkgPT0gdHJ1ZSkgeworCisJLyogYWRob2MgbW9kZSB3aWxsIHN0YXJ0IHdpdGggYW4gZW1wdHkgcXVldWUsIGJ1dCBza2lwIGNoZWNraW5nICovCisJaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgJiYKKwkgICAgX3F1ZXVlX2VtcHR5KHF1ZXVlKSkgewogCQlpZiAocG1sbWVwcml2LT5md19zdGF0ZSAmIF9GV19VTkRFUl9MSU5LSU5HKQogCQkJcG1sbWVwcml2LT5md19zdGF0ZSBePSBfRldfVU5ERVJfTElOS0lORzsKIAkJLyogd2hlbiBzZXRfc3NpZC9zZXRfYnNzaWQgZm9yIGRvX2pvaW4oKSwgYnV0IHNjYW5uaW5nIHF1ZXVlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMKaW5kZXggN2IxZmU0NS4uMzdiNjUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYwpAQCAtNjA0LDcgKzYwNCw3IEBACiAJCWJlMzJfdG9fY3B1cygmcGR1LT5zdGF0dXMpOwogCQliZTMyX3RvX2NwdXMoJnBkdS0+YWN0dWFsX2xlbmd0aCk7CiAJCWJlMzJfdG9fY3B1cygmcGR1LT5zdGFydF9mcmFtZSk7Ci0JCWNwdV90b19iZTMycygmcGR1LT5udW1iZXJfb2ZfcGFja2V0cyk7CisJCWJlMzJfdG9fY3B1cygmcGR1LT5udW1iZXJfb2ZfcGFja2V0cyk7CiAJCWJlMzJfdG9fY3B1cygmcGR1LT5lcnJvcl9jb3VudCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwppbmRleCBkMjVlMjA4Li5mYzEwZWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwpAQCAtMTUwLDEzICsxNTAsMTMgQEAKIAogCXsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBzZV9sdW4tPmx1bl9zZV9kZXY7Ci0Jc3Bpbl9sb2NrKCZkZXYtPnN0YXRzX2xvY2spOworCXNwaW5fbG9ja19pcnEoJmRldi0+c3RhdHNfbG9jayk7CiAJZGV2LT5udW1fY21kcysrOwogCWlmIChzZV9jbWQtPmRhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCiAJCWRldi0+d3JpdGVfYnl0ZXMgKz0gc2VfY21kLT5kYXRhX2xlbmd0aDsKIAllbHNlIGlmIChzZV9jbWQtPmRhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKIAkJZGV2LT5yZWFkX2J5dGVzICs9IHNlX2NtZC0+ZGF0YV9sZW5ndGg7Ci0Jc3Bpbl91bmxvY2soJmRldi0+c3RhdHNfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnN0YXRzX2xvY2spOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCmluZGV4IDRhMTA5ODMuLjU5YjhiOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCkBAIC01NSw3ICs1NSw4IEBACiB7CiAJc3RydWN0IHNlX3Rtcl9yZXEgKnRtcjsKIAotCXRtciA9IGttZW1fY2FjaGVfemFsbG9jKHNlX3Rtcl9yZXFfY2FjaGUsIEdGUF9LRVJORUwpOworCXRtciA9IGttZW1fY2FjaGVfemFsbG9jKHNlX3Rtcl9yZXFfY2FjaGUsIChpbl9pbnRlcnJ1cHQoKSkgPworCQkJCQlHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7CiAJaWYgKCEodG1yKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3Qgc2VfdG1yX3JlcVxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwpAQCAtMzk4LDkgKzM5OSw5IEBACiAJCXByaW50ayhLRVJOX0lORk8gIkxVTl9SRVNFVDogU0NTSS0yIFJlbGVhc2VkIHJlc2VydmF0aW9uXG4iKTsKIAl9CiAKLQlzcGluX2xvY2soJmRldi0+c3RhdHNfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2LT5zdGF0c19sb2NrKTsKIAlkZXYtPm51bV9yZXNldHMrKzsKLQlzcGluX3VubG9jaygmZGV2LT5zdGF0c19sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+c3RhdHNfbG9jayk7CiAKIAlERUJVR19MUigiTFVOX1JFU0VUOiAlcyBmb3IgWyVzXSBDb21wbGV0ZVxuIiwKIAkJCShwcmVlbXB0X2FuZF9hYm9ydF9saXN0KSA/ICJQcmVlbXB0IiA6ICJUTVIiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCA5NTgzYjIzLi5iZWFmOGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtNzYyLDcgKzc2Miw2IEBACiAJdHJhbnNwb3J0X2FsbF90YXNrX2Rldl9yZW1vdmVfc3RhdGUoY21kKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZUX1RBU0soY21kKS0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQl0cmFuc3BvcnRfZnJlZV9kZXZfdGFza3MoY21kKTsKIAogY2hlY2tfbHVuOgogCXNwaW5fbG9ja19pcnFzYXZlKCZsdW4tPmx1bl9jbWRfbG9jaywgZmxhZ3MpOwpAQCAtMTE5NSw2ICsxMTk0LDcgQEAKIAkJYnJlYWs7CiAKIAlsaXN0X2RlbCgmdGFzay0+dF9leGVjdXRlX2xpc3QpOworCWF0b21pY19zZXQoJnRhc2stPnRhc2tfZXhlY3V0ZV9xdWV1ZSwgMCk7CiAJYXRvbWljX2RlYygmZGV2LT5leGVjdXRlX3Rhc2tzKTsKIAogCXJldHVybiB0YXNrOwpAQCAtMTIxMCw4ICsxMjEwLDE0IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChhdG9taWNfcmVhZCgmdGFzay0+dGFza19leGVjdXRlX3F1ZXVlKSA9PSAwKSB7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuOworCX0KKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJnRhc2stPnRfZXhlY3V0ZV9saXN0KTsKKwlhdG9taWNfc2V0KCZ0YXNrLT50YXNrX2V4ZWN1dGVfcXVldWUsIDApOwogCWF0b21pY19kZWMoJmRldi0+ZXhlY3V0ZV90YXNrcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5leGVjdXRlX3Rhc2tfbG9jaywgZmxhZ3MpOwogfQpAQCAtMjA1OCw2ICsyMDY0LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV90bXIpOwogCit2b2lkIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kX2ludHIoCisJc3RydWN0IHNlX2NtZCAqY21kKQoreworCXRyYW5zcG9ydF9hZGRfY21kX3RvX3F1ZXVlKGNtZCwgVFJBTlNQT1JUX0ZSRUVfQ01EX0lOVFIpOworfQorRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZF9pbnRyKTsKKwogc3RhdGljIGludCB0cmFuc3BvcnRfc3RvcF90YXNrc19mb3JfY21kKHN0cnVjdCBzZV9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3Qgc2VfdGFzayAqdGFzaywgKnRhc2tfdG1wOwpAQCAtNDc3NiwxOCArNDc4OSwyMCBAQAogCQkJCXNnX2VuZF9jdXItPnBhZ2VfbGluayAmPSB+MHgwMjsKIAogCQkJCXNnX2NoYWluKHNnX2hlYWQsIHRhc2tfc2dfbnVtLCBzZ19oZWFkX2N1cik7Ci0JCQkJc2dfY291bnQgKz0gKHRhc2stPnRhc2tfc2dfbnVtICsgMSk7Ci0JCQl9IGVsc2UKIAkJCQlzZ19jb3VudCArPSB0YXNrLT50YXNrX3NnX251bTsKKwkJCQl0YXNrX3NnX251bSA9ICh0YXNrLT50YXNrX3NnX251bSArIDEpOworCQkJfSBlbHNlIHsKKwkJCQlzZ19jaGFpbihzZ19oZWFkLCB0YXNrX3NnX251bSwgc2dfaGVhZF9jdXIpOworCQkJCXNnX2NvdW50ICs9IHRhc2stPnRhc2tfc2dfbnVtOworCQkJCXRhc2tfc2dfbnVtID0gdGFzay0+dGFza19zZ19udW07CisJCQl9CiAKIAkJCXNnX2hlYWQgPSBzZ19oZWFkX2N1cjsKIAkJCXNnX2xpbmsgPSBzZ19saW5rX2N1cjsKLQkJCXRhc2tfc2dfbnVtID0gdGFzay0+dGFza19zZ19udW07CiAJCQljb250aW51ZTsKIAkJfQogCQlzZ19oZWFkID0gc2dfZmlyc3QgPSAmdGFzay0+dGFza19zZ1swXTsKIAkJc2dfbGluayA9ICZ0YXNrLT50YXNrX3NnW3Rhc2stPnRhc2tfc2dfbnVtXTsKLQkJdGFza19zZ19udW0gPSB0YXNrLT50YXNrX3NnX251bTsKIAkJLyoKIAkJICogQ2hlY2sgZm9yIHNpbmdsZSB0YXNrLi4KIAkJICovCkBAIC00Nzk4LDkgKzQ4MTMsMTIgQEAKIAkJCSAqLwogCQkJc2dfZW5kID0gJnRhc2stPnRhc2tfc2dbdGFzay0+dGFza19zZ19udW0gLSAxXTsKIAkJCXNnX2VuZC0+cGFnZV9saW5rICY9IH4weDAyOwotCQkJc2dfY291bnQgKz0gKHRhc2stPnRhc2tfc2dfbnVtICsgMSk7Ci0JCX0gZWxzZQogCQkJc2dfY291bnQgKz0gdGFzay0+dGFza19zZ19udW07CisJCQl0YXNrX3NnX251bSA9ICh0YXNrLT50YXNrX3NnX251bSArIDEpOworCQl9IGVsc2UgeworCQkJc2dfY291bnQgKz0gdGFzay0+dGFza19zZ19udW07CisJCQl0YXNrX3NnX251bSA9IHRhc2stPnRhc2tfc2dfbnVtOworCQl9CiAJfQogCS8qCiAJICogU2V0dXAgdGhlIHN0YXJ0aW5nIHBvaW50ZXIgYW5kIHRvdGFsIHRfdGFza3Nfc2dfbGlua2VkX25vIGluY2x1ZGluZwpAQCAtNDgwOSwyMSArNDgyNywyMCBAQAogCVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NnX2NoYWluZWQgPSBzZ19maXJzdDsKIAlUX1RBU0soY21kKS0+dF90YXNrc19zZ19jaGFpbmVkX25vID0gc2dfY291bnQ7CiAKLQlERUJVR19DTURfTSgiU2V0dXAgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZDogJXAgYW5kIgotCQkiIHRfdGFza3Nfc2dfY2hhaW5lZF9ubzogJXVcbiIsIFRfVEFTSyhjbWQpLT50X3Rhc2tzX3NnX2NoYWluZWQsCisJREVCVUdfQ01EX00oIlNldHVwIGNtZDogJXAgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZDogJXAgYW5kIgorCQkiIHRfdGFza3Nfc2dfY2hhaW5lZF9ubzogJXVcbiIsIGNtZCwgVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZCwKIAkJVF9UQVNLKGNtZCktPnRfdGFza3Nfc2dfY2hhaW5lZF9ubyk7CiAKIAlmb3JfZWFjaF9zZyhUX1RBU0soY21kKS0+dF90YXNrc19zZ19jaGFpbmVkLCBzZywKIAkJCVRfVEFTSyhjbWQpLT50X3Rhc2tzX3NnX2NoYWluZWRfbm8sIGkpIHsKIAotCQlERUJVR19DTURfTSgiU0c6ICVwIHBhZ2U6ICVwIGxlbmd0aDogJWQgb2Zmc2V0OiAlZFxuIiwKLQkJCXNnLCBzZ19wYWdlKHNnKSwgc2ctPmxlbmd0aCwgc2ctPm9mZnNldCk7CisJCURFQlVHX0NNRF9NKCJTR1slZF06ICVwIHBhZ2U6ICVwIGxlbmd0aDogJWQgb2Zmc2V0OiAlZCwgbWFnaWM6IDB4JTA4eFxuIiwKKwkJCWksIHNnLCBzZ19wYWdlKHNnKSwgc2ctPmxlbmd0aCwgc2ctPm9mZnNldCwgc2ctPnNnX21hZ2ljKTsKIAkJaWYgKHNnX2lzX2NoYWluKHNnKSkKIAkJCURFQlVHX0NNRF9NKCJTRzogJXAgc2dfaXNfY2hhaW49MVxuIiwgc2cpOwogCQlpZiAoc2dfaXNfbGFzdChzZykpCiAJCQlERUJVR19DTURfTSgiU0c6ICVwIHNnX2lzX2xhc3Q9MVxuIiwgc2cpOwogCX0KLQogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZG9fdGFza19zZ19jaGFpbik7CiAKQEAgLTUyOTcsNiArNTMxNCw4IEBACiAJCWlmICh3YWl0X2Zvcl90YXNrcyAmJiBjbWQtPnRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcykKIAkJCWNtZC0+dHJhbnNwb3J0X3dhaXRfZm9yX3Rhc2tzKGNtZCwgMCwgMCk7CiAKKwkJdHJhbnNwb3J0X2ZyZWVfZGV2X3Rhc2tzKGNtZCk7CisKIAkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgcmVsZWFzZV90b19wb29sLAogCQkJCXNlc3Npb25fcmVpbnN0YXRlbWVudCk7CiAJfQpAQCAtNjEzMiw2ICs2MTUxLDkgQEAKIAkJY2FzZSBUUkFOU1BPUlRfUkVNT1ZFOgogCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVtb3ZlKGNtZCwgMSwgMCk7CiAJCQlicmVhazsKKwkJY2FzZSBUUkFOU1BPUlRfRlJFRV9DTURfSU5UUjoKKwkJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKGNtZCwgMCwgMSwgMCk7CisJCQlicmVhazsKIAkJY2FzZSBUUkFOU1BPUlRfUFJPQ0VTU19UTVI6CiAJCQl0cmFuc3BvcnRfZ2VuZXJpY19kb190bXIoY21kKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwppbmRleCAyNjQwM2I4Li5kYTkyNzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYwpAQCAtMTM5Miw2ICsxMzkyLDcgQEAKIAlpbnQgZmlmb3NpemUsIGJhc2VfYmF1ZDsKIAlpbnQgcG9ydF90eXBlOwogCXN0cnVjdCBwY2hfdWFydF9kcml2ZXJfZGF0YSAqYm9hcmQ7CisJY29uc3QgY2hhciAqYm9hcmRfbmFtZTsKIAogCWJvYXJkID0gJmRydl9kYXRbaWQtPmRyaXZlcl9kYXRhXTsKIAlwb3J0X3R5cGUgPSBib2FyZC0+cG9ydF90eXBlOwpAQCAtMTQwNyw3ICsxNDA4LDggQEAKIAliYXNlX2JhdWQgPSAxODQzMjAwOyAvKiAxLjg0MzJNSHogKi8KIAogCS8qIHF1aXJrIGZvciBDTS1pVEMgYm9hcmQgKi8KLQlpZiAoc3Ryc3RyKGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpLCAiQ00taVRDIikpCisJYm9hcmRfbmFtZSA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpOworCWlmIChib2FyZF9uYW1lICYmIHN0cnN0cihib2FyZF9uYW1lLCAiQ00taVRDIikpCiAJCWJhc2VfYmF1ZCA9IDE5MjAwMDAwMDsgLyogMTkyLjBNSHogKi8KIAogCXN3aXRjaCAocG9ydF90eXBlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3M1cHYyMTAuYwppbmRleCA2ZWJjY2Q3Li40NTNlNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvczVwdjIxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zNXB2MjEwLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcgPSBwb3J0LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJdW5zaWduZWQgbG9uZyB1Y29uID0gcmRfcmVnbChwb3J0LCBTM0MyNDEwX1VDT04pOwogCi0JaWYgKChjZmctPmNsb2Nrc19zaXplKSA9PSAxKQorCWlmIChjZmctPmZsYWdzICYgTk9fTkVFRF9DSEVDS19DTEtTUkMpCiAJCXJldHVybiAwOwogCiAJaWYgKHN0cmNtcChjbGstPm5hbWUsICJwY2xrIikgPT0gMCkKQEAgLTU2LDcgKzU2LDcgQEAKIAogCWNsay0+ZGl2aXNvciA9IDE7CiAKLQlpZiAoKGNmZy0+Y2xvY2tzX3NpemUpID09IDEpCisJaWYgKGNmZy0+ZmxhZ3MgJiBOT19ORUVEX0NIRUNLX0NMS1NSQykKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHVjb24gJiBTNVBWMjEwX1VDT05fQ0xLTUFTSykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCA0ZGRkNzQ2Li5hMDk0NTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMTc1LDEyICsxNzUsMTYgQEAKIAogCXJldHZhbCA9IHVwb3J0LT5vcHMtPnN0YXJ0dXAodXBvcnQpOwogCWlmIChyZXR2YWwgPT0gMCkgewotCQlpZiAoaW5pdF9odykgewotCQkJLyoKLQkJCSAqIEluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIHBvcnQgc2V0dGluZ3MuCi0JCQkgKi8KLQkJCXVhcnRfY2hhbmdlX3NwZWVkKHR0eSwgc3RhdGUsIE5VTEwpOworCQlpZiAodWFydF9jb25zb2xlKHVwb3J0KSAmJiB1cG9ydC0+Y29ucy0+Y2ZsYWcpIHsKKwkJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IHVwb3J0LT5jb25zLT5jZmxhZzsKKwkJCXVwb3J0LT5jb25zLT5jZmxhZyA9IDA7CisJCX0KKwkJLyoKKwkJICogSW5pdGlhbGlzZSB0aGUgaGFyZHdhcmUgcG9ydCBzZXR0aW5ncy4KKwkJICovCisJCXVhcnRfY2hhbmdlX3NwZWVkKHR0eSwgc3RhdGUsIE5VTEwpOwogCisJCWlmIChpbml0X2h3KSB7CiAJCQkvKgogCQkJICogU2V0dXAgdGhlIFJUUyBhbmQgRFRSIHNpZ25hbHMgb25jZSB0aGUKIAkJCSAqIHBvcnQgaXMgb3BlbiBhbmQgcmVhZHkgdG8gcmVzcG9uZC4KQEAgLTE0NjksNDUgKzE0NzMsNiBAQAogCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogfQogCi0vKioKLSAqCXVhcnRfdXBkYXRlX3Rlcm1pb3MJLQl1cGRhdGUgdGhlIHRlcm1pbmFsIGh3IHNldHRpbmdzCi0gKglAdHR5OiB0dHkgYXNzb2NpYXRlZCB3aXRoIFVBUlQKLSAqCUBzdGF0ZTogVUFSVCB0byB1cGRhdGUKLSAqCi0gKglDb3B5IGFjcm9zcyB0aGUgc2VyaWFsIGNvbnNvbGUgY2ZsYWcgc2V0dGluZyBpbnRvIHRoZSB0ZXJtaW9zIHNldHRpbmdzCi0gKglmb3IgdGhlIGluaXRpYWwgb3BlbiBvZiB0aGUgcG9ydC4gIFRoaXMgYWxsb3dzIGNvbnRpbnVpdHkgYmV0d2VlbiB0aGUKLSAqCWtlcm5lbCBzZXR0aW5ncywgYW5kIHRoZSBzZXR0aW5ncyBpbml0IGFkb3B0cyB3aGVuIGl0IG9wZW5zIHRoZSBwb3J0Ci0gKglmb3IgdGhlIGZpcnN0IHRpbWUuCi0gKi8KLXN0YXRpYyB2b2lkIHVhcnRfdXBkYXRlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCQkJCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gc3RhdGUtPnVhcnRfcG9ydDsKLQotCWlmICh1YXJ0X2NvbnNvbGUocG9ydCkgJiYgcG9ydC0+Y29ucy0+Y2ZsYWcpIHsKLQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gcG9ydC0+Y29ucy0+Y2ZsYWc7Ci0JCXBvcnQtPmNvbnMtPmNmbGFnID0gMDsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZSBkZXZpY2UgZmFpbGVkIHRvIGdyYWIgaXRzIGlycSByZXNvdXJjZXMsCi0JICogb3Igc29tZSBvdGhlciBlcnJvciBvY2N1cnJlZCwgZG9uJ3QgdHJ5IHRvIHRhbGsKLQkgKiB0byB0aGUgcG9ydCBoYXJkd2FyZS4KLQkgKi8KLQlpZiAoISh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKLQkJLyoKLQkJICogTWFrZSB0ZXJtaW9zIHNldHRpbmdzIHRha2UgZWZmZWN0LgotCQkgKi8KLQkJdWFydF9jaGFuZ2Vfc3BlZWQodHR5LCBzdGF0ZSwgTlVMTCk7Ci0KLQkJLyoKLQkJICogQW5kIGZpbmFsbHkgZW5hYmxlIHRoZSBSVFMgYW5kIERUUiBzaWduYWxzLgotCQkgKi8KLQkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKQotCQkJdWFydF9zZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdWFydF9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCB1YXJ0X3N0YXRlLCBwb3J0KTsKQEAgLTE1MjcsMTYgKzE0OTIsOCBAQAogCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgdWFydF9zdGF0ZSwgcG9ydCk7CiAJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSBzdGF0ZS0+dWFydF9wb3J0OwogCi0JaWYgKG9ub2ZmKSB7CisJaWYgKG9ub2ZmKQogCQl1YXJ0X3NldF9tY3RybCh1cG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBvcGVuIHRvIHN1Y2NlZWQsCi0JCSAqIGFkanVzdCB0aGluZ3MgdG8gc3VpdC4KLQkJICovCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChBU1lOQ0JfTk9STUFMX0FDVElWRSwgJnBvcnQtPmZsYWdzKSkKLQkJCXVhcnRfdXBkYXRlX3Rlcm1pb3MocG9ydC0+dHR5LCBzdGF0ZSk7Ci0JfQogCWVsc2UKIAkJdWFydF9jbGVhcl9tY3RybCh1cG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3R0eV9sZGlzYy5jIGIvZHJpdmVycy90dHkvdHR5X2xkaXNjLmMKaW5kZXggZTE5ZTEzNi4uMTEwNGM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvdHR5X2xkaXNjLmMKKysrIGIvZHJpdmVycy90dHkvdHR5X2xkaXNjLmMKQEAgLTU1NSw3ICs1NTUsNyBAQAogc3RhdGljIGludCB0dHlfbGRpc2Nfd2FpdF9pZGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaW50IHJldDsKLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0dHlfbGRpc2NfaWRsZSwKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHR5X2xkaXNjX2lkbGUsCiAJCQlhdG9taWNfcmVhZCgmdHR5LT5sZGlzYy0+dXNlcnMpID09IDEsIDUgKiBIWik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC03NjMsNiArNzYzLDggQEAKIAlpZiAoSVNfRVJSKGxkKSkKIAkJcmV0dXJuIC0xOwogCisJV0FSTl9PTl9PTkNFKHR0eV9sZGlzY193YWl0X2lkbGUodHR5KSk7CisKIAl0dHlfbGRpc2NfY2xvc2UodHR5LCB0dHktPmxkaXNjKTsKIAl0dHlfbGRpc2NfcHV0KHR0eS0+bGRpc2MpOwogCXR0eS0+bGRpc2MgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IGUwNTdlNTMuLmQwYjg0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTk0Niw3ICs5NDYsNyBAQAogCXU4IGFjX21hbmFnZW1lbnRfZnVuY3Rpb24gPSAwOwogCXU4IGNhbGxfbWFuYWdlbWVudF9mdW5jdGlvbiA9IDA7CiAJaW50IGNhbGxfaW50ZXJmYWNlX251bSA9IC0xOwotCWludCBkYXRhX2ludGVyZmFjZV9udW07CisJaW50IGRhdGFfaW50ZXJmYWNlX251bSA9IC0xOwogCXVuc2lnbmVkIGxvbmcgcXVpcmtzOwogCWludCBudW1fcnhfYnVmOwogCWludCBpOwpAQCAtMTAzMCw3ICsxMDMwLDExIEBACiAJaWYgKCF1bmlvbl9oZWFkZXIpIHsKIAkJaWYgKGNhbGxfaW50ZXJmYWNlX251bSA+IDApIHsKIAkJCWRldl9kYmcoJmludGYtPmRldiwgIk5vIHVuaW9uIGRlc2NyaXB0b3IsIHVzaW5nIGNhbGwgbWFuYWdlbWVudCBkZXNjcmlwdG9yXG4iKTsKLQkJCWRhdGFfaW50ZXJmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVzYl9kZXYsIChkYXRhX2ludGVyZmFjZV9udW0gPSBjYWxsX2ludGVyZmFjZV9udW0pKTsKKwkJCS8qIHF1aXJrcyBmb3IgRHJvaWRzIE11SW4gTENEICovCisJCQlpZiAocXVpcmtzICYgTk9fREFUQV9JTlRFUkZBQ0UpCisJCQkJZGF0YV9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgMCk7CisJCQllbHNlCisJCQkJZGF0YV9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgKGRhdGFfaW50ZXJmYWNlX251bSA9IGNhbGxfaW50ZXJmYWNlX251bSkpOwogCQkJY29udHJvbF9pbnRlcmZhY2UgPSBpbnRmOwogCQl9IGVsc2UgewogCQkJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMykgewpAQCAtMTYxMyw2ICsxNjE3LDggQEAKIAl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNGNlKSwgfSwgLyogTm9raWEgRTkwICovCiAJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDFkNCksIH0sIC8qIE5va2lhIEU1NSAqLwogCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAzMDIpLCB9LCAvKiBOb2tpYSBOOCAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAzMzUpLCB9LCAvKiBOb2tpYSBFNyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAzY2QpLCB9LCAvKiBOb2tpYSBDNyAqLwogCXsgU0FNU1VOR19QQ1NVSVRFX0FDTV9JTkZPKDB4NjY1MSksIH0sIC8qIFNhbXN1bmcgR1RpODUxMCAoSU5OT1Y4KSAqLwogCiAJLyogTk9URTogbm9uLU5va2lhIENPTU0vQUNNLzB4ZmYgaXMgbGlrZWx5IE1TRlQgUk5ESVMuLi4gTk9UIGEgbW9kZW0hICovCkBAIC0xNjIyLDYgKzE2MjgsMTEgQEAKIAkuZHJpdmVyX2luZm8gPSBOT1RfQV9NT0RFTSwKIAl9LAogCisJLyogU3VwcG9ydCBmb3IgRHJvaWRzIE11SW4gTENEICovCisJeyBVU0JfREVWSUNFKDB4MDRkOCwgMHgwMDBiKSwKKwkuZHJpdmVyX2luZm8gPSBOT19EQVRBX0lOVEVSRkFDRSwKKwl9LAorCiAJLyogY29udHJvbCBpbnRlcmZhY2VzIHdpdGhvdXQgYW55IHByb3RvY29sIHNldCAqLwogCXsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX0FDTSwKIAkJVVNCX0NEQ19QUk9UT19OT05FKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCmluZGV4IGI0ZWE1NGQuLjY4MzEwNGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCkBAIC0xMzcsMyArMTM3LDQgQEAKICNkZWZpbmUgU0lOR0xFX1JYX1VSQgkJCTIKICNkZWZpbmUgTk9fQ0FQX0xJTkUJCQk0CiAjZGVmaW5lIE5PVF9BX01PREVNCQkJOAorI2RlZmluZSBOT19EQVRBX0lOVEVSRkFDRQkJMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IGUzNWExNzYuLjM0ZTNkYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCSAqIEp1c3QgcmUtZW5hYmxlIGl0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBlbmRwb2ludCB0b2dnbGVzLgogCQkgKi8KIAkJdXNiX2VuYWJsZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgZmFsc2UpOwotCX0gZWxzZSBpZiAoIWVycm9yICYmICFpbnRmLT5kZXYucG93ZXIuaW5fc3VzcGVuZCkgeworCX0gZWxzZSBpZiAoIWVycm9yICYmICFpbnRmLT5kZXYucG93ZXIuaXNfcHJlcGFyZWQpIHsKIAkJciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uCiAJCQkJZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAkJaWYgKHIgPCAwKQpAQCAtOTYwLDcgKzk2MCw3IEBACiAJfQogCiAJLyogVHJ5IHRvIHJlYmluZCB0aGUgaW50ZXJmYWNlICovCi0JaWYgKCFpbnRmLT5kZXYucG93ZXIuaW5fc3VzcGVuZCkgeworCWlmICghaW50Zi0+ZGV2LnBvd2VyLmlzX3ByZXBhcmVkKSB7CiAJCWludGYtPm5lZWRzX2JpbmRpbmcgPSAwOwogCQlyYyA9IGRldmljZV9hdHRhY2goJmludGYtPmRldik7CiAJCWlmIChyYyA8IDApCkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKSB7CiAKIAkJLyogQ2Fycnkgb3V0IGEgZGVmZXJyZWQgc3dpdGNoIHRvIGFsdHNldHRpbmcgMCAqLwotCQlpZiAoaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgJiYgIWludGYtPmRldi5wb3dlci5pbl9zdXNwZW5kKSB7CisJCWlmIChpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCAmJiAhaW50Zi0+ZGV2LnBvd2VyLmlzX3ByZXBhcmVkKSB7CiAJCQl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCQlkZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOwogCQkJaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgPSAwOwpAQCAtMTE4NywxMyArMTE4NywyMiBAQAogCQlmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKIAkJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCBtc2cpOworCisJCQkvKiBJZ25vcmUgZXJyb3JzIGR1cmluZyBzeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbnMgKi8KKwkJCWlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQorCQkJCXN0YXR1cyA9IDA7CiAJCQlpZiAoc3RhdHVzICE9IDApCiAJCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKHN0YXR1cyA9PSAwKQorCWlmIChzdGF0dXMgPT0gMCkgewogCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9kZXZpY2UodWRldiwgbXNnKTsKIAorCQkvKiBBZ2FpbiwgaWdub3JlIGVycm9ycyBkdXJpbmcgc3lzdGVtIHNsZWVwIHRyYW5zaXRpb25zICovCisJCWlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQorCQkJc3RhdHVzID0gMDsKKwl9CisKIAkvKiBJZiB0aGUgc3VzcGVuZCBmYWlsZWQsIHJlc3VtZSBpbnRlcmZhY2VzIHRoYXQgZGlkIGdldCBzdXNwZW5kZWQgKi8KIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJbXNnLmV2ZW50IF49IChQTV9FVkVOVF9TVVNQRU5EIHwgUE1fRVZFTlRfUkVTVU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IDc3YTdmYWUuLmNkZGM1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwpAQCAtOTg2LDcgKzk4Niw3IEBACiAJCXNwaW5fdW5sb2NrX2lycSAoJmhjZF9yb290X2h1Yl9sb2NrKTsKIAogCQkvKiBEaWQgdGhlIEhDIGRpZSBiZWZvcmUgdGhlIHJvb3QgaHViIHdhcyByZWdpc3RlcmVkPyAqLwotCQlpZiAoSENEX0RFQUQoaGNkKSB8fCBoY2QtPnN0YXRlID09IEhDX1NUQVRFX0hBTFQpCisJCWlmIChIQ0RfREVBRChoY2QpKQogCQkJdXNiX2hjX2RpZWQgKGhjZCk7CS8qIFRoaXMgdGltZSBjbGVhbiB1cCAqLwogCX0KIApAQCAtMjEyOCw5ICsyMTI4LDYgQEAKIAkJc2V0X2JpdChIQ0RfRkxBR19TQVdfSVJRLCAmaGNkLT5mbGFncyk7CiAJCWlmIChoY2QtPnNoYXJlZF9oY2QpCiAJCQlzZXRfYml0KEhDRF9GTEFHX1NBV19JUlEsICZoY2QtPnNoYXJlZF9oY2QtPmZsYWdzKTsKLQotCQlpZiAodW5saWtlbHkoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkKLQkJCXVzYl9oY19kaWVkKGhjZCk7CiAJCXJjID0gSVJRX0hBTkRMRUQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA5MzcyMGJkYy4uNjRlZGIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC0zMzksNyArMzM5LDggQEAKIHsKIAlpbnQgaSwgc3RhdHVzID0gLUVUSU1FRE9VVDsKIAotCWZvciAoaSA9IDA7IGkgPCBVU0JfU1RTX1JFVFJJRVMgJiYgc3RhdHVzID09IC1FVElNRURPVVQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBVU0JfU1RTX1JFVFJJRVMgJiYKKwkJCShzdGF0dXMgPT0gLUVUSU1FRE9VVCB8fCBzdGF0dXMgPT0gLUVQSVBFKTsgaSsrKSB7CiAJCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhoZGV2LCB1c2JfcmN2Y3RybHBpcGUoaGRldiwgMCksCiAJCQlVU0JfUkVRX0dFVF9TVEFUVVMsIFVTQl9ESVJfSU4gfCBVU0JfUlRfSFVCLCAwLCAwLAogCQkJZGF0YSwgc2l6ZW9mKCpkYXRhKSwgVVNCX1NUU19USU1FT1VUKTsKQEAgLTM1NSw3ICszNTYsOCBAQAogewogCWludCBpLCBzdGF0dXMgPSAtRVRJTUVET1VUOwogCi0JZm9yIChpID0gMDsgaSA8IFVTQl9TVFNfUkVUUklFUyAmJiBzdGF0dXMgPT0gLUVUSU1FRE9VVDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFVTQl9TVFNfUkVUUklFUyAmJgorCQkJKHN0YXR1cyA9PSAtRVRJTUVET1VUIHx8IHN0YXR1cyA9PSAtRVBJUEUpOyBpKyspIHsKIAkJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKGhkZXYsIHVzYl9yY3ZjdHJscGlwZShoZGV2LCAwKSwKIAkJCVVTQl9SRVFfR0VUX1NUQVRVUywgVVNCX0RJUl9JTiB8IFVTQl9SVF9QT1JULCAwLCBwb3J0MSwKIAkJCWRhdGEsIHNpemVvZigqZGF0YSksIFVTQl9TVFNfVElNRU9VVCk7CkBAIC0xNjQxLDYgKzE2NDMsNyBAQAogewogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gKnBkZXY7CiAJaW50CQkJaTsKKwlzdHJ1Y3QgdXNiX2hjZAkJKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKIAogCWlmICghdWRldikgewogCQlwcl9kZWJ1ZyAoIiVzIG5vZGV2XG4iLCBfX2Z1bmNfXyk7CkBAIC0xNjY4LDcgKzE2NzEsOSBAQAogCSAqIHNvIHRoYXQgdGhlIGhhcmR3YXJlIGlzIG5vdyBmdWxseSBxdWllc2NlZC4KIAkgKi8KIAlkZXZfZGJnICgmdWRldi0+ZGV2LCAidW5yZWdpc3RlcmluZyBkZXZpY2VcbiIpOworCW11dGV4X2xvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCXVzYl9kaXNhYmxlX2RldmljZSh1ZGV2LCAwKTsKKwltdXRleF91bmxvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCXVzYl9oY2Rfc3luY2hyb25pemVfdW5saW5rcyh1ZGV2KTsKIAogCXVzYl9yZW1vdmVfZXBfZGV2cygmdWRldi0+ZXAwKTsKQEAgLTIzMDYsNiArMjMxMSwxMCBAQAogCQkJCVVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCwgMCwKIAkJCQlOVUxMLCAwLAogCQkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKworCQkvKiBTeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbnMgc2hvdWxkIG5ldmVyIGZhaWwgKi8KKwkJaWYgKCEobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpCisJCQlzdGF0dXMgPSAwOwogCX0gZWxzZSB7CiAJCS8qIGRldmljZSBoYXMgdXAgdG8gMTAgbXNlYyB0byBmdWxseSBzdXNwZW5kICovCiAJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3N1c3BlbmRcbiIsCkBAIC0yNTQ0LDE2ICsyNTUzLDE1IEBACiAJc3RydWN0IHVzYl9kZXZpY2UJKmhkZXYgPSBodWItPmhkZXY7CiAJdW5zaWduZWQJCXBvcnQxOwogCi0JLyogZmFpbCBpZiBjaGlsZHJlbiBhcmVuJ3QgYWxyZWFkeSBzdXNwZW5kZWQgKi8KKwkvKiBXYXJuIGlmIGNoaWxkcmVuIGFyZW4ndCBhbHJlYWR5IHN1c3BlbmRlZCAqLwogCWZvciAocG9ydDEgPSAxOyBwb3J0MSA8PSBoZGV2LT5tYXhjaGlsZDsgcG9ydDErKykgewogCQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAogCQl1ZGV2ID0gaGRldi0+Y2hpbGRyZW4gW3BvcnQxLTFdOwogCQlpZiAodWRldiAmJiB1ZGV2LT5jYW5fc3VibWl0KSB7Ci0JCQlpZiAoIShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSkKLQkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJwb3J0ICVkIG55ZXQgc3VzcGVuZGVkXG4iLAotCQkJCQkJcG9ydDEpOwotCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWRldl93YXJuKCZpbnRmLT5kZXYsICJwb3J0ICVkIG55ZXQgc3VzcGVuZGVkXG4iLCBwb3J0MSk7CisJCQlpZiAobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykKKwkJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDU3MDFlODUuLjBiNWVjMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0xMTM1LDE1ICsxMTM1LDI2IEBACiAgKiBEZWFsbG9jYXRlcyBoY2QvaGFyZHdhcmUgc3RhdGUgZm9yIHRoZSBlbmRwb2ludHMgKG51a2luZyBhbGwgb3IgbW9zdAogICogcGVuZGluZyB1cmJzKSBhbmQgdXNiY29yZSBzdGF0ZSBmb3IgdGhlIGludGVyZmFjZXMsIHNvIHRoYXQgdXNiY29yZQogICogbXVzdCB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oKSBiZWZvcmUgYW55IGludGVyZmFjZXMgY291bGQgYmUgdXNlZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGhjZC0+YmFuZHdpZHRoX211dGV4IGhlbGQuCiAgKi8KIHZvaWQgdXNiX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBza2lwX2VwMCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gYnVzX3RvX2hjZChkZXYtPmJ1cyk7CiAKIAkvKiBnZXR0aW5nIHJpZCBvZiBpbnRlcmZhY2VzIHdpbGwgZGlzY29ubmVjdAogCSAqIGFueSBkcml2ZXJzIGJvdW5kIHRvIHRoZW0gKGEga2V5IHNpZGUgZWZmZWN0KQogCSAqLwogCWlmIChkZXYtPmFjdGNvbmZpZykgeworCQkvKgorCQkgKiBGSVhNRTogSW4gb3JkZXIgdG8gYXZvaWQgc2VsZi1kZWFkbG9jayBpbnZvbHZpbmcgdGhlCisJCSAqIGJhbmR3aWR0aF9tdXRleCwgd2UgaGF2ZSB0byBtYXJrIGFsbCB0aGUgaW50ZXJmYWNlcworCQkgKiBiZWZvcmUgdW5yZWdpc3RlcmluZyBhbnkgb2YgdGhlbS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKQorCQkJZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXS0+dW5yZWdpc3RlcmluZyA9IDE7CisKIAkJZm9yIChpID0gMDsgaSA8IGRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKIAkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRlcmZhY2U7CiAKQEAgLTExNTMsNyArMTE2NCw2IEBACiAJCQkJY29udGludWU7CiAJCQlkZXZfZGJnKCZkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgaW50ZXJmYWNlICVzXG4iLAogCQkJCWRldl9uYW1lKCZpbnRlcmZhY2UtPmRldikpOwotCQkJaW50ZXJmYWNlLT51bnJlZ2lzdGVyaW5nID0gMTsKIAkJCXJlbW92ZV9pbnRmX2VwX2RldnMoaW50ZXJmYWNlKTsKIAkJCWRldmljZV9kZWwoJmludGVyZmFjZS0+ZGV2KTsKIAkJfQpAQCAtMTE3Miw2ICsxMTgyLDE2IEBACiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIG51a2luZyAlcyBVUkJzXG4iLCBfX2Z1bmNfXywKIAkJc2tpcF9lcDAgPyAibm9uLWVwMCIgOiAiYWxsIik7CisJaWYgKGhjZC0+ZHJpdmVyLT5jaGVja19iYW5kd2lkdGgpIHsKKwkJLyogRmlyc3QgcGFzczogQ2FuY2VsIFVSQnMsIGxlYXZlIGVuZHBvaW50IHBvaW50ZXJzIGludGFjdC4gKi8KKwkJZm9yIChpID0gc2tpcF9lcDA7IGkgPCAxNjsgKytpKSB7CisJCQl1c2JfZGlzYWJsZV9lbmRwb2ludChkZXYsIGksIGZhbHNlKTsKKwkJCXVzYl9kaXNhYmxlX2VuZHBvaW50KGRldiwgaSArIFVTQl9ESVJfSU4sIGZhbHNlKTsKKwkJfQorCQkvKiBSZW1vdmUgZW5kcG9pbnRzIGZyb20gdGhlIGhvc3QgY29udHJvbGxlciBpbnRlcm5hbCBzdGF0ZSAqLworCQl1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOworCQkvKiBTZWNvbmQgcGFzczogcmVtb3ZlIGVuZHBvaW50IHBvaW50ZXJzICovCisJfQogCWZvciAoaSA9IHNraXBfZXAwOyBpIDwgMTY7ICsraSkgewogCQl1c2JfZGlzYWJsZV9lbmRwb2ludChkZXYsIGksIHRydWUpOwogCQl1c2JfZGlzYWJsZV9lbmRwb2ludChkZXYsIGkgKyBVU0JfRElSX0lOLCB0cnVlKTsKQEAgLTEyNzMsNiArMTI5Myw4IEBACiAJCQlpbnRlcmZhY2UpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGlmYWNlLT51bnJlZ2lzdGVyaW5nKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpZmFjZSwgYWx0ZXJuYXRlKTsKIAlpZiAoIWFsdCkgewpAQCAtMTcyNyw2ICsxNzQ5LDcgQEAKIAkvKiBpZiBpdCdzIGFscmVhZHkgY29uZmlndXJlZCwgY2xlYXIgb3V0IG9sZCBzdGF0ZSBmaXJzdC4KIAkgKiBnZXR0aW5nIHJpZCBvZiBvbGQgaW50ZXJmYWNlcyBtZWFucyB1bmJpbmRpbmcgdGhlaXIgZHJpdmVycy4KIAkgKi8KKwltdXRleF9sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAlpZiAoZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfQUREUkVTUykKIAkJdXNiX2Rpc2FibGVfZGV2aWNlKGRldiwgMSk7CS8qIFNraXAgZXAwICovCiAKQEAgLTE3MzksNyArMTc2Miw2IEBACiAJICogaG9zdCBjb250cm9sbGVyIHdpbGwgbm90IGFsbG93IHN1Ym1pc3Npb25zIHRvIGRyb3BwZWQgZW5kcG9pbnRzLiAgSWYKIAkgKiB0aGlzIGNhbGwgZmFpbHMsIHRoZSBkZXZpY2Ugc3RhdGUgaXMgdW5jaGFuZ2VkLgogCSAqLwotCW11dGV4X2xvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCXJldCA9IHVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgY3AsIE5VTEwsIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7CiAJCW11dGV4X3VubG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IDliN2NkYjEuLjQxZGMwOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC0xNzY3LDcgKzE3NjcsNyBAQAogCX0KIAogCS8qIG5ld2VyIGNoaXBzIGhhdmUgbW9yZSBGSUZPIG1lbW9yeSB0aGFuIHJtOTIwMCAqLwotCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjAoKSkgeworCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjAoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMjAoKSkgewogCQl1ZGMtPmVwWzBdLm1heHBhY2tldCA9IDY0OwogCQl1ZGMtPmVwWzNdLm1heHBhY2tldCA9IDY0OwogCQl1ZGMtPmVwWzRdLm1heHBhY2tldCA9IDUxMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3JuZGlzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9ybmRpcy5jCmluZGV4IGFmNjA5MjJkLi42NGZhZjY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfcm5kaXMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9ybmRpcy5jCkBAIC00MzksOCArNDM5LDcgQEAKIAkgKi8KIAljYXNlICgoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UpIDw8IDgpCiAJCQl8IFVTQl9DRENfU0VORF9FTkNBUFNVTEFURURfQ09NTUFORDoKLQkJaWYgKHdfbGVuZ3RoID4gcmVxLT5sZW5ndGggfHwgd192YWx1ZQotCQkJCXx8IHdfaW5kZXggIT0gcm5kaXMtPmN0cmxfaWQpCisJCWlmICh3X3ZhbHVlIHx8IHdfaW5kZXggIT0gcm5kaXMtPmN0cmxfaWQpCiAJCQlnb3RvIGludmFsaWQ7CiAJCS8qIHJlYWQgdGhlIHJlcXVlc3Q7IHByb2Nlc3MgaXQgbGF0ZXIgKi8KIAkJdmFsdWUgPSB3X2xlbmd0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCA3ODU2MWQxMS4uYzYwNmIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtNzc3LDggKzc3Nyw5IEBACiAJCWdvdG8gZGVhZDsKIAl9CiAKKwkvKiBTaGFyZWQgSVJRPyAqLwogCW1hc2tlZF9zdGF0dXMgPSBzdGF0dXMgJiBJTlRSX01BU0s7Ci0JaWYgKCFtYXNrZWRfc3RhdHVzKSB7CQkvKiBpcnEgc2hhcmluZz8gKi8KKwlpZiAoIW1hc2tlZF9zdGF0dXMgfHwgdW5saWtlbHkoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkgewogCQlzcGluX3VubG9jaygmZWhjaS0+bG9jayk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CkBAIC04NzMsNiArODc0LDcgQEAKIGRlYWQ6CiAJCWVoY2lfcmVzZXQoZWhjaSk7CiAJCWVoY2lfd3JpdGVsKGVoY2ksIDAsICZlaGNpLT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOworCQl1c2JfaGNfZGllZChoY2QpOwogCQkvKiBnZW5lcmljIGxheWVyIGtpbGxzL3VubGlua3MgYWxsIHVyYnMsIHRoZW4KIAkJICogdXNlcyBlaGNpX3N0b3AgdG8gY2xlYW4gdXAgdGhlIHJlc3QKIAkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCmluZGV4IDE1NDNjODMuLmQxMjQyNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCkBAIC00NzEsOCArNDcxLDEwIEBACiAJICovCiAJc3RhdHVzID0gaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsCiAJCQkJCSAgICAgU1RTX1BTUywgMCwgOSAqIDEyNSk7Ci0JaWYgKHN0YXR1cykKKwlpZiAoc3RhdHVzKSB7CisJCXVzYl9oY19kaWVkKGVoY2lfdG9faGNkKGVoY2kpKTsKIAkJcmV0dXJuIHN0YXR1czsKKwl9CiAKIAljbWQgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb21tYW5kKSB8IENNRF9QU0U7CiAJZWhjaV93cml0ZWwoZWhjaSwgY21kLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CkBAIC01MTAsOCArNTEyLDEwIEBACiAJICovCiAJc3RhdHVzID0gaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KGVoY2ksICZlaGNpLT5yZWdzLT5zdGF0dXMsCiAJCQkJCSAgICAgU1RTX1BTUywgU1RTX1BTUywgOSAqIDEyNSk7Ci0JaWYgKHN0YXR1cykKKwlpZiAoc3RhdHVzKSB7CisJCXVzYl9oY19kaWVkKGVoY2lfdG9faGNkKGVoY2kpKTsKIAkJcmV0dXJuIHN0YXR1czsKKwl9CiAKIAljbWQgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5jb21tYW5kKSAmIH5DTURfUFNFOwogCWVoY2lfd3JpdGVsKGVoY2ksIGNtZCwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCmluZGV4IGMwZTIyZjIuLmJhYWU0Y2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCkBAIC02MTIsNiArNjEyLDcgQEAKIAkJCS8qIElSUSdzIGFyZSBvZmYsIHdlIGRvIG5vIERNQSwKIAkJCSAgIHBlcmZlY3RseSByZWFkeSB0byBkaWUgLi4uICovCiAJCQloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJCXVzYl9oY19kaWVkKGhjZCk7CiAJCQlyZXQgPSBJUlFfSEFORExFRDsKIAkJCWdvdG8gZG9uZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCmluZGV4IGQ1NTcyMzUuLmMwMDFmZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKQEAgLTc2NCw2ICs3NjQsNyBAQAogCWlmIChpbnRzID09IH4odTMyKTApIHsKIAkJZGlzYWJsZSAob2hjaSk7CiAJCW9oY2lfZGJnIChvaGNpLCAiZGV2aWNlIHJlbW92ZWQhXG4iKTsKKwkJdXNiX2hjX2RpZWQoaGNkKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtNzcxLDcgKzc3Miw3IEBACiAJaW50cyAmPSBvaGNpX3JlYWRsKG9oY2ksICZyZWdzLT5pbnRyZW5hYmxlKTsKIAogCS8qIGludGVycnVwdCBmb3Igc29tZSBvdGhlciBkZXZpY2U/ICovCi0JaWYgKGludHMgPT0gMCkKKwlpZiAoaW50cyA9PSAwIHx8IHVubGlrZWx5KGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfSEFMVCkpCiAJCXJldHVybiBJUlFfTk9UTUlORTsKIAogCWlmIChpbnRzICYgT0hDSV9JTlRSX1VFKSB7CkBAIC03ODgsNiArNzg5LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWRpc2FibGUgKG9oY2kpOwogCQkJb2hjaV9lcnIgKG9oY2ksICJPSENJIFVucmVjb3ZlcmFibGUgRXJyb3IsIGRpc2FibGVkXG4iKTsKKwkJCXVzYl9oY19kaWVkKGhjZCk7CiAJCX0KIAogCQlvaGNpX2R1bXAgKG9oY2ksIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCmluZGV4IGQ4NGQ2ZjAuLmFkODE2NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKQEAgLTE4MSwxMCArMTgxLDE4IEBACiAgKi8KIHN0YXRpYyBpbnQgb2hjaV9xdWlya19udmlkaWFfc2h1dGRvd24oc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCXN0cnVjdCBvaGNpX2hjZAkqb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAKLQlvaGNpLT5mbGFncyB8PSBPSENJX1FVSVJLX1NIVVRET1dOOwotCW9oY2lfZGJnKG9oY2ksICJlbmFibGVkIG5WaWRpYSBzaHV0ZG93biBxdWlya1xuIik7CisJLyogRXZpZGVudGx5IG5WaWRpYSBmaXhlZCB0aGVpciBsYXRlciBoYXJkd2FyZTsgdGhpcyBpcyBhIGd1ZXNzIGF0CisJICogdGhlIGNoYW5nZW92ZXIgcG9pbnQuCisJICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9VU0IJCTB4MDI2ZAorCisJaWYgKHBkZXYtPmRldmljZSA8IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9VU0IpIHsKKwkJb2hjaS0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19TSFVURE9XTjsKKwkJb2hjaV9kYmcob2hjaSwgImVuYWJsZWQgblZpZGlhIHNodXRkb3duIHF1aXJrXG4iKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLWhjZC5jCmluZGV4IDRhNzcxZjYuLjVmYmU5OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYwpAQCAtMTg4NCw2ICsxODg0LDcgQEAKIAlzdGF0dXMgPSBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsIFNUU19QU1MsIDAsIDkgKiAxMjUpOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJdXNiX2hjX2RpZWQob3h1X3RvX2hjZChveHUpKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTE5MDksNiArMTkxMCw3IEBACiAJc3RhdHVzID0gaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfUFNTLCBTVFNfUFNTLCA5ICogMTI1KTsKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJCXVzYl9oY19kaWVkKG94dV90b19oY2Qob3h1KSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0yNDQ5LDggKzI0NTEsOSBAQAogCQlnb3RvIGRlYWQ7CiAJfQogCisJLyogU2hhcmVkIElSUT8gKi8KIAlzdGF0dXMgJj0gSU5UUl9NQVNLOwotCWlmICghc3RhdHVzKSB7CQkJLyogaXJxIHNoYXJpbmc/ICovCisJaWYgKCFzdGF0dXMgfHwgdW5saWtlbHkoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkgewogCQlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KQEAgLTI1MTYsNiArMjUxOSw3IEBACiBkZWFkOgogCQkJZWhjaV9yZXNldChveHUpOwogCQkJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisJCQl1c2JfaGNfZGllZChoY2QpOwogCQkJLyogZ2VuZXJpYyBsYXllciBraWxscy91bmxpbmtzIGFsbCB1cmJzLCB0aGVuCiAJCQkgKiB1c2VzIG94dV9zdG9wIHRvIGNsZWFuIHVwIHRoZSByZXN0CiAJCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYwppbmRleCAwMjMxODE0Li5mZjAwYmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jCkBAIC00MzcsMTMgKzQzNywxMyBAQAogCXN0cnVjdCB4aGNpX3Nsb3RfY3R4ICpzbG90X2N0eCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIGN0eCk7CiAKIAlzd2l0Y2ggKEdFVF9TTE9UX1NUQVRFKHNsb3RfY3R4LT5kZXZfc3RhdGUpKSB7Ci0JY2FzZSAwOgorCWNhc2UgU0xPVF9TVEFURV9FTkFCTEVEOgogCQlyZXR1cm4gImVuYWJsZWQvZGlzYWJsZWQiOwotCWNhc2UgMToKKwljYXNlIFNMT1RfU1RBVEVfREVGQVVMVDoKIAkJcmV0dXJuICJkZWZhdWx0IjsKLQljYXNlIDI6CisJY2FzZSBTTE9UX1NUQVRFX0FERFJFU1NFRDoKIAkJcmV0dXJuICJhZGRyZXNzZWQiOwotCWNhc2UgMzoKKwljYXNlIFNMT1RfU1RBVEVfQ09ORklHVVJFRDoKIAkJcmV0dXJuICJjb25maWd1cmVkIjsKIAlkZWZhdWx0OgogCQlyZXR1cm4gInJlc2VydmVkIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwppbmRleCA2MjdmMzQzLi45NzY0MjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCkBAIC0yMDcsMTQgKzIwNywxMyBAQAogCiAJcmluZ3NfY2FjaGVkID0gdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQ7CiAJaWYgKHJpbmdzX2NhY2hlZCA8IFhIQ0lfTUFYX1JJTkdTX0NBQ0hFRCkgewotCQl2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCsrOwotCQlyaW5nc19jYWNoZWQgPSB2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZDsKIAkJdmlydF9kZXYtPnJpbmdfY2FjaGVbcmluZ3NfY2FjaGVkXSA9CiAJCQl2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5yaW5nOworCQl2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCsrOwogCQl4aGNpX2RiZyh4aGNpLCAiQ2FjaGVkIG9sZCByaW5nLCAiCiAJCQkJIiVkIHJpbmclcyBjYWNoZWRcbiIsCi0JCQkJcmluZ3NfY2FjaGVkLAotCQkJCShyaW5nc19jYWNoZWQgPiAxKSA/ICJzIiA6ICIiKTsKKwkJCQl2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCwKKwkJCQkodmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQgPiAxKSA/ICJzIiA6ICIiKTsKIAl9IGVsc2UgewogCQl4aGNpX3JpbmdfZnJlZSh4aGNpLCB2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5yaW5nKTsKIAkJeGhjaV9kYmcoeGhjaSwgIlJpbmcgY2FjaGUgZnVsbCAoJWQgcmluZ3MpLCAiCkBAIC05ODcsOSArOTg2LDE5IEBACiAJaW50ZXJ2YWwgPSBjbGFtcF92YWwoZXAtPmRlc2MuYkludGVydmFsLCAxLCAxNikgLSAxOwogCWlmIChpbnRlcnZhbCAhPSBlcC0+ZGVzYy5iSW50ZXJ2YWwgLSAxKQogCQlkZXZfd2FybigmdWRldi0+ZGV2LAotCQkJICJlcCAlI3ggLSByb3VuZGluZyBpbnRlcnZhbCB0byAlZCBtaWNyb2ZyYW1lc1xuIiwKKwkJCSAiZXAgJSN4IC0gcm91bmRpbmcgaW50ZXJ2YWwgdG8gJWQgJXNmcmFtZXNcbiIsCiAJCQkgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKLQkJCSAxIDw8IGludGVydmFsKTsKKwkJCSAxIDw8IGludGVydmFsLAorCQkJIHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMID8gIiIgOiAibWljcm8iKTsKKworCWlmICh1ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCkgeworCQkvKgorCQkgKiBGdWxsIHNwZWVkIGlzb2MgZW5kcG9pbnRzIHNwZWNpZnkgaW50ZXJ2YWwgaW4gZnJhbWVzLAorCQkgKiBub3QgbWljcm9mcmFtZXMuIFdlIGFyZSB1c2luZyBtaWNyb2ZyYW1lcyBldmVyeXdoZXJlLAorCQkgKiBzbyBhZGp1c3QgYWNjb3JkaW5nbHkuCisJCSAqLworCQlpbnRlcnZhbCArPSAzOwkvKiAxIGZyYW1lID0gMl4zIHVmcmFtZXMgKi8KKwl9CiAKIAlyZXR1cm4gaW50ZXJ2YWw7CiB9CkBAIC0xMDQ2LDEyICsxMDU1LDEyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludCgmZXAtPmRlc2MpKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZlcC0+ZGVzYykpIHsKIAkJCWludGVydmFsID0geGhjaV9wYXJzZV9leHBvbmVudF9pbnRlcnZhbCh1ZGV2LCBlcCk7CiAJCQlicmVhazsKIAkJfQogCQkvKgotCQkgKiBGYWxsIHRocm91Z2ggZm9yIGlzb2Nocm9ub3VzIGVuZHBvaW50IGludGVydmFsIGRlY29kaW5nCisJCSAqIEZhbGwgdGhyb3VnaCBmb3IgaW50ZXJydXB0IGVuZHBvaW50IGludGVydmFsIGRlY29kaW5nCiAJCSAqIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgcnVsZXMgYXMgbG93IHNwZWVkIGludGVycnVwdAogCQkgKiBlbmRwb2ludHMuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCmluZGV4IGExMDQ5NGMuLjZmY2UzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKQEAgLTI4LDYgKzI4LDkgQEAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9GUkVTQ09fTE9HSUMJMHgxYjczCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRlJFU0NPX0xPR0lDX1BESwkweDEwMDAKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VUUk9OCQkweDFiNmYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BU1JPQ0tfUDY3CTB4NzAyMworCiBzdGF0aWMgY29uc3QgY2hhciBoY2RfbmFtZVtdID0gInhoY2lfaGNkIjsKIAogLyogY2FsbGVkIGFmdGVyIHBvd2VydXAsIGJ5IHByb2JlIG9yIHN5c3RlbS1wbSAid2FrZXVwIiAqLwpAQCAtMTA1LDEyICsxMDgsMjcgQEAKIAogCS8qIExvb2sgZm9yIHZlbmRvci1zcGVjaWZpYyBxdWlya3MgKi8KIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRlJFU0NPX0xPR0lDICYmCi0JCQlwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9GUkVTQ09fTE9HSUNfUERLICYmCi0JCQlwZGV2LT5yZXZpc2lvbiA9PSAweDApIHsKKwkJCXBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0ZSRVNDT19MT0dJQ19QREspIHsKKwkJaWYgKHBkZXYtPnJldmlzaW9uID09IDB4MCkgewogCQkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfUkVTRVRfRVBfUVVJUks7CiAJCQl4aGNpX2RiZyh4aGNpLCAiUVVJUks6IEZyZXNjbyBMb2dpYyB4SEMgbmVlZHMgY29uZmlndXJlIgogCQkJCQkiIGVuZHBvaW50IGNtZCBhZnRlciByZXNldCBlbmRwb2ludFxuIik7CisJCX0KKwkJLyogRnJlc2NvIExvZ2ljIGNvbmZpcm1zOiBhbGwgcmV2aXNpb25zIG9mIHRoaXMgY2hpcCBkbyBub3QKKwkJICogc3VwcG9ydCBNU0ksIGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhlbSBjbGFpbSB0byBpbiB0aGVpciBQQ0kKKwkJICogY2FwYWJpbGl0aWVzLgorCQkgKi8KKwkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfQlJPS0VOX01TSTsKKwkJeGhjaV9kYmcoeGhjaSwgIlFVSVJLOiBGcmVzY28gTG9naWMgcmV2aXNpb24gJXUgIgorCQkJCSJoYXMgYnJva2VuIE1TSSBpbXBsZW1lbnRhdGlvblxuIiwKKwkJCQlwZGV2LT5yZXZpc2lvbik7CiAJfQorCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9FVFJPTiAmJgorCQkJcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVNST0NLX1A2NykgeworCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9SRVNFVF9PTl9SRVNVTUU7CisJCXhoY2lfZGJnKHhoY2ksICJRVUlSSzogUmVzZXR0aW5nIG9uIHJlc3VtZVxuIik7CisJfQorCiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05FQykKIAkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfTkVDX0hPU1Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IDc0MzczODYuLmE1ZTk2Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtMTYzMiw2ICsxNjMyLDkgQEAKIAkJZWxzZQogCQkJKnN0YXR1cyA9IDA7CiAJCWJyZWFrOworCWNhc2UgQ09NUF9TVE9QX0lOVkFMOgorCWNhc2UgQ09NUF9TVE9QOgorCQlyZXR1cm4gZmluaXNoX3RkKHhoY2ksIHRkLCBldmVudF90cmIsIGV2ZW50LCBlcCwgc3RhdHVzLCBmYWxzZSk7CiAJZGVmYXVsdDoKIAkJaWYgKCF4aGNpX3JlcXVpcmVzX21hbnVhbF9oYWx0X2NsZWFudXAoeGhjaSwKIAkJCQkJZXBfY3R4LCB0cmJfY29tcF9jb2RlKSkKQEAgLTE2NzYsMTUgKzE2NzksMTIgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJLyogTWF5YmUgdGhlIGV2ZW50IHdhcyBmb3IgdGhlIGRhdGEgc3RhZ2U/ICovCi0JCQlpZiAodHJiX2NvbXBfY29kZSAhPSBDT01QX1NUT1BfSU5WQUwpIHsKLQkJCQkvKiBXZSBkaWRuJ3Qgc3RvcCBvbiBhIGxpbmsgVFJCIGluIHRoZSBtaWRkbGUgKi8KLQkJCQl0ZC0+dXJiLT5hY3R1YWxfbGVuZ3RoID0KLQkJCQkJdGQtPnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtCi0JCQkJCVRSQl9MRU4oZXZlbnQtPnRyYW5zZmVyX2xlbik7Ci0JCQkJeGhjaV9kYmcoeGhjaSwgIldhaXRpbmcgZm9yIHN0YXR1cyAiCi0JCQkJCQkic3RhZ2UgZXZlbnRcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfQorCQkJdGQtPnVyYi0+YWN0dWFsX2xlbmd0aCA9CisJCQkJdGQtPnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtCisJCQkJVFJCX0xFTihsZTMyX3RvX2NwdShldmVudC0+dHJhbnNmZXJfbGVuKSk7CisJCQl4aGNpX2RiZyh4aGNpLCAiV2FpdGluZyBmb3Igc3RhdHVzICIKKwkJCQkJInN0YWdlIGV2ZW50XG4iKTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCkBAIC0xNzY4LDkgKzE3NjgsNiBAQAogCQl9CiAJfQogCi0JaWYgKChpZHggPT0gdXJiX3ByaXYtPmxlbmd0aCAtIDEpICYmICpzdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotCQkqc3RhdHVzID0gMDsKLQogCXJldHVybiBmaW5pc2hfdGQoeGhjaSwgdGQsIGV2ZW50X3RyYiwgZXZlbnQsIGVwLCBzdGF0dXMsIGZhbHNlKTsKIH0KIApAQCAtMTc4OCw4ICsxNzg1LDcgQEAKIAlpZHggPSB1cmJfcHJpdi0+dGRfY250OwogCWZyYW1lID0gJnRkLT51cmItPmlzb19mcmFtZV9kZXNjW2lkeF07CiAKLQkvKiBUaGUgdHJhbnNmZXIgaXMgcGFydGx5IGRvbmUgKi8KLQkqc3RhdHVzID0gLUVYREVWOworCS8qIFRoZSB0cmFuc2ZlciBpcyBwYXJ0bHkgZG9uZS4gKi8KIAlmcmFtZS0+c3RhdHVzID0gLUVYREVWOwogCiAJLyogY2FsYyBhY3R1YWwgbGVuZ3RoICovCkBAIC0yMTM5LDYgKzIxMzUsMTEgQEAKIAkJCQkJInN0YXR1cyA9ICVkXG4iLAogCQkJCQl1cmIsIHVyYi0+YWN0dWFsX2xlbmd0aCwgc3RhdHVzKTsKIAkJCXNwaW5fdW5sb2NrKCZ4aGNpLT5sb2NrKTsKKwkJCS8qIEVIQ0ksIFVIQ0ksIGFuZCBPSENJIGFsd2F5cyB1bmNvbmRpdGlvbmFsbHkgc2V0IHRoZQorCQkJICogdXJiLT5zdGF0dXMgb2YgYW4gaXNvY2hyb25vdXMgZW5kcG9pbnQgdG8gMC4KKwkJCSAqLworCQkJaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpCisJCQkJc3RhdHVzID0gMDsKIAkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGJ1c190b19oY2QodXJiLT5kZXYtPmJ1cyksIHVyYiwgc3RhdHVzKTsKIAkJCXNwaW5fbG9jaygmeGhjaS0+bG9jayk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKaW5kZXggODFiOTc2ZS4uNDIwOWIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKQEAgLTQzMCwxMiArNDMwLDE5IEBACiAJCWZyZWVfaXJxKGhjZC0+aXJxLCBoY2QpOwogCWhjZC0+aXJxID0gLTE7CiAKKwkvKiBTb21lIEZyZXNjbyBMb2dpYyBob3N0IGNvbnRyb2xsZXJzIGFkdmVydGlzZSBNU0ksIGJ1dCBmYWlsIHRvCisJICogZ2VuZXJhdGUgaW50ZXJydXB0cy4gIERvbid0IGV2ZW4gdHJ5IHRvIGVuYWJsZSBNU0kuCisJICovCisJaWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfQlJPS0VOX01TSSkKKwkJZ290byBsZWdhY3lfaXJxOworCiAJcmV0ID0geGhjaV9zZXR1cF9tc2l4KHhoY2kpOwogCWlmIChyZXQpCiAJCS8qIGZhbGwgYmFjayB0byBtc2kqLwogCQlyZXQgPSB4aGNpX3NldHVwX21zaSh4aGNpKTsKIAogCWlmIChyZXQpIHsKK2xlZ2FjeV9pcnE6CiAJCS8qIGZhbGwgYmFjayB0byBsZWdhY3kgaW50ZXJydXB0Ki8KIAkJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAmdXNiX2hjZF9pcnEsIElSUUZfU0hBUkVELAogCQkJCQloY2QtPmlycV9kZXNjciwgaGNkKTsKQEAgLTc1Miw2ICs3NTksOCBAQAogCQltc2xlZXAoMTAwKTsKIAogCXNwaW5fbG9ja19pcnEoJnhoY2ktPmxvY2spOworCWlmICh4aGNpLT5xdWlya3MgJiBYSENJX1JFU0VUX09OX1JFU1VNRSkKKwkJaGliZXJuYXRlZCA9IHRydWU7CiAKIAlpZiAoIWhpYmVybmF0ZWQpIHsKIAkJLyogc3RlcCAxOiByZXN0b3JlIHJlZ2lzdGVyICovCkBAIC0xMzg5LDYgKzEzOTgsNyBAQAogCXUzMiBhZGRlZF9jdHhzOwogCXVuc2lnbmVkIGludCBsYXN0X2N0eDsKIAl1MzIgbmV3X2FkZF9mbGFncywgbmV3X2Ryb3BfZmxhZ3MsIG5ld19zbG90X2luZm87CisJc3RydWN0IHhoY2lfdmlydF9kZXZpY2UgKnZpcnRfZGV2OwogCWludCByZXQgPSAwOwogCiAJcmV0ID0geGhjaV9jaGVja19hcmdzKGhjZCwgdWRldiwgZXAsIDEsIHRydWUsIF9fZnVuY19fKTsKQEAgLTE0MTEsMTEgKzE0MjEsMjUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaW5fY3R4ID0geGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXS0+aW5fY3R4OwotCW91dF9jdHggPSB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdLT5vdXRfY3R4OworCXZpcnRfZGV2ID0geGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXTsKKwlpbl9jdHggPSB2aXJ0X2Rldi0+aW5fY3R4OworCW91dF9jdHggPSB2aXJ0X2Rldi0+b3V0X2N0eDsKIAljdHJsX2N0eCA9IHhoY2lfZ2V0X2lucHV0X2NvbnRyb2xfY3R4KHhoY2ksIGluX2N0eCk7CiAJZXBfaW5kZXggPSB4aGNpX2dldF9lbmRwb2ludF9pbmRleCgmZXAtPmRlc2MpOwogCWVwX2N0eCA9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCBvdXRfY3R4LCBlcF9pbmRleCk7CisKKwkvKiBJZiB0aGlzIGVuZHBvaW50IGlzIGFscmVhZHkgaW4gdXNlLCBhbmQgdGhlIHVwcGVyIGxheWVycyBhcmUgdHJ5aW5nCisJICogdG8gYWRkIGl0IGFnYWluIHdpdGhvdXQgZHJvcHBpbmcgaXQsIHJlamVjdCB0aGUgYWRkaXRpb24uCisJICovCisJaWYgKHZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLnJpbmcgJiYKKwkJCSEobGUzMl90b19jcHUoY3RybF9jdHgtPmRyb3BfZmxhZ3MpICYKKwkJCQl4aGNpX2dldF9lbmRwb2ludF9mbGFnKCZlcC0+ZGVzYykpKSB7CisJCXhoY2lfd2Fybih4aGNpLCAiVHJ5aW5nIHRvIGFkZCBlbmRwb2ludCAweCV4ICIKKwkJCQkid2l0aG91dCBkcm9wcGluZyBpdC5cbiIsCisJCQkJKHVuc2lnbmVkIGludCkgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIElmIHRoZSBIQ0QgaGFzIGFscmVhZHkgbm90ZWQgdGhlIGVuZHBvaW50IGlzIGVuYWJsZWQsCiAJICogaWdub3JlIHRoaXMgcmVxdWVzdC4KIAkgKi8KQEAgLTE0MzAsOCArMTQ1NCw3IEBACiAJICogcHJvY2VzcyBjb250ZXh0LCBub3QgaW50ZXJydXB0IGNvbnRleHQgKG9yIHNvIGRvY3VtZW5hdGlvbgogCSAqIGZvciB1c2Jfc2V0X2ludGVyZmFjZSgpIGFuZCB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oKSBjbGFpbSkuCiAJICovCi0JaWYgKHhoY2lfZW5kcG9pbnRfaW5pdCh4aGNpLCB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdLAotCQkJCXVkZXYsIGVwLCBHRlBfTk9JTykgPCAwKSB7CisJaWYgKHhoY2lfZW5kcG9pbnRfaW5pdCh4aGNpLCB2aXJ0X2RldiwgdWRldiwgZXAsIEdGUF9OT0lPKSA8IDApIHsKIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAiJXMgLSBjb3VsZCBub3QgaW5pdGlhbGl6ZSBlcCAlI3hcbiIsCiAJCQkJX19mdW5jX18sIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE2OTIsOCArMTcxNSwxNyBAQAogCXhoY2lfZGJnX2N0eCh4aGNpLCB2aXJ0X2Rldi0+b3V0X2N0eCwKIAkJCUxBU1RfQ1RYX1RPX0VQX05VTShzbG90X2N0eC0+ZGV2X2luZm8pKTsKIAorCS8qIEZyZWUgYW55IHJpbmdzIHRoYXQgd2VyZSBkcm9wcGVkLCBidXQgbm90IGNoYW5nZWQuICovCisJZm9yIChpID0gMTsgaSA8IDMxOyArK2kpIHsKKwkJaWYgKChjdHJsX2N0eC0+ZHJvcF9mbGFncyAmICgxIDw8IChpICsgMSkpKSAmJgorCQkJCSEoY3RybF9jdHgtPmFkZF9mbGFncyAmICgxIDw8IChpICsgMSkpKSkKKwkJCXhoY2lfZnJlZV9vcl9jYWNoZV9lbmRwb2ludF9yaW5nKHhoY2ksIHZpcnRfZGV2LCBpKTsKKwl9CiAJeGhjaV96ZXJvX2luX2N0eCh4aGNpLCB2aXJ0X2Rldik7Ci0JLyogSW5zdGFsbCBuZXcgcmluZ3MgYW5kIGZyZWUgb3IgY2FjaGUgYW55IG9sZCByaW5ncyAqLworCS8qCisJICogSW5zdGFsbCBhbnkgcmluZ3MgZm9yIGNvbXBsZXRlbHkgbmV3IGVuZHBvaW50cyBvciBjaGFuZ2VkIGVuZHBvaW50cywKKwkgKiBhbmQgZnJlZSBvciBjYWNoZSBhbnkgb2xkIHJpbmdzIGZyb20gY2hhbmdlZCBlbmRwb2ludHMuCisJICovCiAJZm9yIChpID0gMTsgaSA8IDMxOyArK2kpIHsKIAkJaWYgKCF2aXJ0X2Rldi0+ZXBzW2ldLm5ld19yaW5nKQogCQkJY29udGludWU7CkBAIC0yMjc1LDYgKzIzMDcsNyBAQAogCXN0cnVjdCB4aGNpX2NvbW1hbmQgKnJlc2V0X2RldmljZV9jbWQ7CiAJaW50IHRpbWVsZWZ0OwogCWludCBsYXN0X2ZyZWVkX2VuZHBvaW50OworCXN0cnVjdCB4aGNpX3Nsb3RfY3R4ICpzbG90X2N0eDsKIAogCXJldCA9IHhoY2lfY2hlY2tfYXJncyhoY2QsIHVkZXYsIE5VTEwsIDAsIGZhbHNlLCBfX2Z1bmNfXyk7CiAJaWYgKHJldCA8PSAwKQpAQCAtMjMwNyw2ICsyMzQwLDEyIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBJZiBkZXZpY2UgaXMgbm90IHNldHVwLCB0aGVyZSBpcyBubyBwb2ludCBpbiByZXNldHRpbmcgaXQgKi8KKwlzbG90X2N0eCA9IHhoY2lfZ2V0X3Nsb3RfY3R4KHhoY2ksIHZpcnRfZGV2LT5vdXRfY3R4KTsKKwlpZiAoR0VUX1NMT1RfU1RBVEUobGUzMl90b19jcHUoc2xvdF9jdHgtPmRldl9zdGF0ZSkpID09CisJCQkJCQlTTE9UX1NUQVRFX0RJU0FCTEVEKQorCQlyZXR1cm4gMDsKKwogCXhoY2lfZGJnKHhoY2ksICJSZXNldHRpbmcgZGV2aWNlIHdpdGggc2xvdCBJRCAldVxuIiwgc2xvdF9pZCk7CiAJLyogQWxsb2NhdGUgdGhlIGNvbW1hbmQgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHN0cnVjdCBjb21wbGV0aW9uLgogCSAqIEFzc3VtZSB3ZSdyZSBpbiBwcm9jZXNzIGNvbnRleHQsIHNpbmNlIHRoZSBub3JtYWwgZGV2aWNlIHJlc2V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCmluZGV4IGJhMWJlNmIuLjFlNTJkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCkBAIC01NjAsNiArNTYwLDExIEBACiAjZGVmaW5lIFNMT1RfU1RBVEUJKDB4MWYgPDwgMjcpCiAjZGVmaW5lIEdFVF9TTE9UX1NUQVRFKHApCSgoKHApICYgKDB4MWYgPDwgMjcpKSA+PiAyNykKIAorI2RlZmluZSBTTE9UX1NUQVRFX0RJU0FCTEVECTAKKyNkZWZpbmUgU0xPVF9TVEFURV9FTkFCTEVECVNMT1RfU1RBVEVfRElTQUJMRUQKKyNkZWZpbmUgU0xPVF9TVEFURV9ERUZBVUxUCTEKKyNkZWZpbmUgU0xPVF9TVEFURV9BRERSRVNTRUQJMgorI2RlZmluZSBTTE9UX1NUQVRFX0NPTkZJR1VSRUQJMwogCiAvKioKICAqIHN0cnVjdCB4aGNpX2VwX2N0eApAQCAtMTI4MSw2ICsxMjg2LDggQEAKICNkZWZpbmUgWEhDSV9SRVNFVF9FUF9RVUlSSwkoMSA8PCAxKQogI2RlZmluZSBYSENJX05FQ19IT1NUCQkoMSA8PCAyKQogI2RlZmluZSBYSENJX0FNRF9QTExfRklYCSgxIDw8IDMpCisjZGVmaW5lIFhIQ0lfQlJPS0VOX01TSQkJKDEgPDwgNikKKyNkZWZpbmUgWEhDSV9SRVNFVF9PTl9SRVNVTUUJKDEgPDwgNykKIAkvKiBUaGVyZSBhcmUgdHdvIHJvb3RodWJzIHRvIGtlZXAgdHJhY2sgb2YgYnVzIHN1c3BlbmQgaW5mbyBmb3IgKi8KIAlzdHJ1Y3QgeGhjaV9idXNfc3RhdGUgICBidXNfc3RhdGVbMl07CiAJLyogSXMgZWFjaCB4SENJIHJvb3RodWIgcG9ydCBhIFVTQiAzLjAsIFVTQiAyLjAsIG9yIFVTQiAxLjEgcG9ydD8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYwppbmRleCAwZjExYWZkLi5lYmVjY2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCkBAIC0xMTIsNiArMTEyLDEwIEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDE4KSB9LCAvKiBJUlogQXV0b21hdGlvbiBUZWxlcG9ydCBTRy0xMCBHU00vR1BSUyBNb2RlbSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQ2RSkgfSwgLyogQkVJIFVTQiBTZW5zb3IgSW50ZXJmYWNlIChWQ1ApICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDc3KSB9LCAvKiBCYWxsdWZmIFJGSUQgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg1RUEpIH0sIC8qIEFDLVNlcnZpY2VzIElCVVMtSUYgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg1RUIpIH0sIC8qIEFDLVNlcnZpY2VzIENJUy1JQlVTICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NjY0KSB9LCAvKiBBQy1TZXJ2aWNlcyBDQU4tSUYgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg2NjUpIH0sIC8qIEFDLVNlcnZpY2VzIE9CRC1JRiAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE2MCkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE2MSkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE3MSkgfSwgLyogSW5maW5pdHkgR1BTLU1JQy0xIFJhZGlvIE1vbm9waG9uZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCA0ZGU2ZWYwLi4yZTA2YjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtMTc5LDYgKzE3OSw3IEBACiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzIzMlJMX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfOFUyMjMyQ19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzQyMzJIX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfMjMySF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01JQ1JPX0NIQU1FTEVPTl9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1JFTEFJU19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX09QRU5EQ0NfUElEKSB9LApAQCAtNTY2LDYgKzU2Nyw3IEBACiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lCU19BUFA3MF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lCU19QRURPX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSUJTX1BST0RfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UQVZJUl9TVEs1MDBfUElEKSB9LAogCS8qCiAJICogRUxWIGRldmljZXM6CiAJICovCkBAIC02NDYsNiArNjQ4LDcgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEVWRVJfRUNPX1BST19DRFMpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfM19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBYU0VOU19DT05WRVJURVJfMl9QSUQpIH0sCkBAIC04NDYsNyArODQ5LDggQEAKIAlbRlQyMjMyQ10gPSAiRlQyMjMyQyIsCiAJW0ZUMjMyUkxdID0gIkZUMjMyUkwiLAogCVtGVDIyMzJIXSA9ICJGVDIyMzJIIiwKLQlbRlQ0MjMySF0gPSAiRlQ0MjMySCIKKwlbRlQ0MjMySF0gPSAiRlQ0MjMySCIsCisJW0ZUMjMySF0gID0gIkZUMjMySCIKIH07CiAKIApAQCAtMTE2Niw2ICsxMTcwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBGVDIyMzJIOiAvKiBGVDIyMzJIIGNoaXAgKi8KIAljYXNlIEZUNDIzMkg6IC8qIEZUNDIzMkggY2hpcCAqLworCWNhc2UgRlQyMzJIOiAgLyogRlQyMzJIIGNoaXAgKi8KIAkJaWYgKChiYXVkIDw9IDEyMDAwMDAwKSAmIChiYXVkID49IDEyMDApKSB7CiAJCQlkaXZfdmFsdWUgPSBmdGRpXzIyMzJoX2JhdWRfdG9fZGl2aXNvcihiYXVkKTsKIAkJfSBlbHNlIGlmIChiYXVkIDwgMTIwMCkgewpAQCAtMTQyNyw5ICsxNDMyLDEyIEBACiAJfSBlbHNlIGlmICh2ZXJzaW9uIDwgMHg2MDApIHsKIAkJLyogQXNzdW1lIGl0J3MgYW4gRlQyMzJCTSAob3IgRlQyNDVCTSkgKi8KIAkJcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJCTTsKLQl9IGVsc2UgewotCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMlIgKi8KKwl9IGVsc2UgaWYgKHZlcnNpb24gPCAweDkwMCkgeworCQkvKiBBc3N1bWUgaXQncyBhbiBGVDIzMlJMICovCiAJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyUkw7CisJfSBlbHNlIHsKKwkJLyogQXNzdW1lIGl0J3MgYW4gRlQyMzJIICovCisJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMySDsKIAl9CiAJZGV2X2luZm8oJnVkZXYtPmRldiwgIkRldGVjdGVkICVzXG4iLCBmdGRpX2NoaXBfbmFtZVtwcml2LT5jaGlwX3R5cGVdKTsKIH0KQEAgLTE1NTcsNyArMTU2NSw4IEBACiAJCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMgfHwKIAkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJSTCB8fAogCQkgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIyMzJIIHx8Ci0JCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkgpKSB7CisJCSAgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkggfHwKKwkJICAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJIKSkgewogCQkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwb3J0LT5kZXYsCiAJCQkJCQkgICAgJmRldl9hdHRyX2xhdGVuY3lfdGltZXIpOwogCQl9CkBAIC0xNTc4LDcgKzE1ODcsOCBAQAogCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMgfHwKIAkJICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMlJMIHx8CiAJCSAgICBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMySCB8fAotCQkgICAgcHJpdi0+Y2hpcF90eXBlID09IEZUNDIzMkgpIHsKKwkJICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDQyMzJIIHx8CisgICAgICAgICAgICAgICAgICAgIHByaXYtPmNoaXBfdHlwZSA9PSBGVDIzMkgpIHsKIAkJCWRldmljZV9yZW1vdmVfZmlsZSgmcG9ydC0+ZGV2LCAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CiAJCX0KIAl9CkBAIC0yMjEwLDYgKzIyMjAsNyBAQAogCWNhc2UgRlQyMzJSTDoKIAljYXNlIEZUMjIzMkg6CiAJY2FzZSBGVDQyMzJIOgorCWNhc2UgRlQyMzJIOgogCQlsZW4gPSAyOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAppbmRleCAyMTNmZTNkLi4xOTU4NGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaApAQCAtMTU2LDcgKzE1Niw4IEBACiAJRlQyMjMyQyA9IDQsCiAJRlQyMzJSTCA9IDUsCiAJRlQyMjMySCA9IDYsCi0JRlQ0MjMySCA9IDcKKwlGVDQyMzJIID0gNywKKwlGVDIzMkggID0gOAogfTsKIAogZW51bSBmdGRpX3Npb19iYXVkcmF0ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKaW5kZXggZWZmZmMyMzcuLjE5MTU2ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNkZWZpbmUgRlRESV84VTIzMkFNX0FMVF9QSUQgMHg2MDA2IC8qIEZUREkncyBhbHRlcm5hdGUgUElEIGZvciBhYm92ZSAqLwogI2RlZmluZSBGVERJXzhVMjIzMkNfUElEIDB4NjAxMCAvKiBEdWFsIGNoYW5uZWwgZGV2aWNlICovCiAjZGVmaW5lIEZURElfNDIzMkhfUElEIDB4NjAxMSAvKiBRdWFkIGNoYW5uZWwgaGktc3BlZWQgZGV2aWNlICovCisjZGVmaW5lIEZURElfMjMySF9QSUQgIDB4NjAxNCAvKiBTaW5nbGUgY2hhbm5lbCBoaS1zcGVlZCBkZXZpY2UgKi8KICNkZWZpbmUgRlRESV9TSU9fUElECTB4ODM3MgkvKiBQcm9kdWN0IElkIFNJTyBhcHBsaWNhdGlvbiBvZiA4VTEwMEFYICovCiAjZGVmaW5lIEZURElfMjMyUkxfUElEICAweEZCRkEgIC8qIFByb2R1Y3QgSUQgZm9yIEZUMjMyUkwgKi8KIApAQCAtMzUxLDYgKzM1Miw3IEBACiAgKi8KICNkZWZpbmUgRlRESV80Tl9HQUxBWFlfREVfMV9QSUQJMHhGM0MwCiAjZGVmaW5lIEZURElfNE5fR0FMQVhZX0RFXzJfUElECTB4RjNDMQorI2RlZmluZSBGVERJXzROX0dBTEFYWV9ERV8zX1BJRAkweEYzQzIKIAogLyoKICAqIExpbnggVGVjaG5vbG9naWVzIHByb2R1Y3QgaWRzCkBAIC00OTEsNiArNDkzLDExIEBACiAvKiB3d3cuY2FudXNiLmNvbSBMYXdpY2VsIENBTlVTQiBkZXZpY2UgKEZURElfVklEKSAqLwogI2RlZmluZSBGVERJX0NBTlVTQl9QSUQgMHhGRkE4IC8qIFByb2R1Y3QgSWQgKi8KIAorLyoKKyAqIFRhdklSIEFWUiBwcm9kdWN0IGlkcyAoRlRESV9WSUQpCisgKi8KKyNkZWZpbmUgRlRESV9UQVZJUl9TVEs1MDBfUElECTB4RkEzMwkvKiBTVEs1MDAgQVZSIHByb2dyYW1tZXIgKi8KKwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCmluZGV4IDI2NzEwYjEuLjQ1NjQ0N2UwMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBHYXJtaW4gR1BTIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEhlcm1hbm4gS25laXNzZWwgaGVya25lQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgSGVybWFubiBLbmVpc3NlbCBoZXJrbmVAZ214LmRlCiAgKgogICogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgY2FuIGJlIGZvdW5kIGF0CiAgKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2dhcm1pbi1ncHMvCkBAIC01MSw3ICs1MSw3IEBACiAgKi8KIAogI2RlZmluZSBWRVJTSU9OX01BSk9SCTAKLSNkZWZpbmUgVkVSU0lPTl9NSU5PUgkzMworI2RlZmluZSBWRVJTSU9OX01JTk9SCTM2CiAKICNkZWZpbmUgX1NUUihzKSAjcwogI2RlZmluZSBfRFJJVkVSX1ZFUlNJT04oYSwgYikgInYiIF9TVFIoYSkgIi4iIF9TVFIoYikKQEAgLTQxMCw2ICs0MTAsNyBAQAogICovCiBzdGF0aWMgaW50IGdzcF9yZWNfcGFja2V0KHN0cnVjdCBnYXJtaW5fZGF0YSAqZ2FybWluX2RhdGFfcCwgaW50IGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY29uc3QgX191OCAqcmVjcGt0ID0gZ2FybWluX2RhdGFfcC0+aW5idWZmZXIrR1NQX0lOSVRJQUxfT0ZGU0VUOwogCV9fbGUzMiAqdXNiZGF0YSA9IChfX2xlMzIgKikgZ2FybWluX2RhdGFfcC0+aW5idWZmZXI7CiAKQEAgLTQ1OCw3ICs0NTksOSBAQAogCS8qIGlmIHRoaXMgd2FzIGFuIGFib3J0LXRyYW5zZmVyIGNvbW1hbmQsIGZsdXNoIGFsbAogCSAgIHF1ZXVlZCBkYXRhLiAqLwogCWlmIChpc0Fib3J0VHJmQ21uZChnYXJtaW5fZGF0YV9wLT5pbmJ1ZmZlcikpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgfD0gRkxBR1NfRFJPUF9EQVRBOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCXBrdF9jbGVhcihnYXJtaW5fZGF0YV9wKTsKIAl9CiAKQEAgLTk0Myw3ICs5NDYsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJZ2FybWluX2RhdGFfcC0+bW9kZSAgPSBpbml0aWFsX21vZGU7CiAJZ2FybWluX2RhdGFfcC0+Y291bnQgPSAwOwotCWdhcm1pbl9kYXRhX3AtPmZsYWdzID0gMDsKKwlnYXJtaW5fZGF0YV9wLT5mbGFncyAmPSBGTEFHU19TRVNTSU9OX1JFUExZMV9TRUVOOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAogCS8qIHNodXRkb3duIGFueSBidWxrIHJlYWRzIHRoYXQgbWlnaHQgYmUgZ29pbmcgb24gKi8KQEAgLTExNzgsNyArMTE4MSw4IEBACiAKIAogc3RhdGljIHZvaWQgZ2FybWluX3JlYWRfcHJvY2VzcyhzdHJ1Y3QgZ2FybWluX2RhdGEgKmdhcm1pbl9kYXRhX3AsCi0JCQkJIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGRhdGFfbGVuZ3RoKQorCQkJCSB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBkYXRhX2xlbmd0aCwKKwkJCQkgaW50IGJ1bGtfZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMTkzLDcgKzExOTcsOCBAQAogCQkgICBzZW5kIGl0IGRpcmVjdGx5IHRvIHRoZSB0dHkgcG9ydCAqLwogCQlpZiAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19RVUVVSU5HKSB7CiAJCQlwa3RfYWRkKGdhcm1pbl9kYXRhX3AsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKLQkJfSBlbHNlIGlmIChnZXRMYXllcklkKGRhdGEpID09IEdBUk1JTl9MQVlFUklEX0FQUEwpIHsKKwkJfSBlbHNlIGlmIChidWxrX2RhdGEgfHwKKwkJCSAgIGdldExheWVySWQoZGF0YSkgPT0gR0FSTUlOX0xBWUVSSURfQVBQTCkgewogCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQkJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgfD0gQVBQX1JFU1BfU0VFTjsKQEAgLTEyMzcsNyArMTI0Miw3IEBACiAJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LAogCQkJCV9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCi0JZ2FybWluX3JlYWRfcHJvY2VzcyhnYXJtaW5fZGF0YV9wLCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWdhcm1pbl9yZWFkX3Byb2Nlc3MoZ2FybWluX2RhdGFfcCwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoLCAxKTsKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0gMCAmJgogCQkJMCAhPSAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19CVUxLX0lOX1JFU1RBUlQpKSB7CkBAIC0xMzQ2LDcgKzEzNTEsNyBAQAogCQkJX19mdW5jX18sIGdhcm1pbl9kYXRhX3AtPnNlcmlhbF9udW0pOwogCX0KIAotCWdhcm1pbl9yZWFkX3Byb2Nlc3MoZ2FybWluX2RhdGFfcCwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlnYXJtaW5fcmVhZF9wcm9jZXNzKGdhcm1pbl9kYXRhX3AsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCwgMCk7CiAKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwpAQCAtMTQ2MSw2ICsxNDY2LDcgQEAKIAlnYXJtaW5fZGF0YV9wLT50aW1lci5mdW5jdGlvbiA9IHRpbWVvdXRfaGFuZGxlcjsKIAlnYXJtaW5fZGF0YV9wLT5wb3J0ID0gcG9ydDsKIAlnYXJtaW5fZGF0YV9wLT5zdGF0ZSA9IDA7CisJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgPSAwOwogCWdhcm1pbl9kYXRhX3AtPmNvdW50ID0gMDsKIAl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgZ2FybWluX2RhdGFfcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3RvX21vZGVtLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW90b19tb2RlbS5jCmluZGV4IDY1MzQ2NWYuLmUyYmZlY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3RvX21vZGVtLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vdG9fbW9kZW0uYwpAQCAtMjUsNiArMjUsNyBAQAogCXsgVVNCX0RFVklDRSgweDA1YzYsIDB4MzE5NykgfSwJLyogdW5rbm93biBNb3Rvcm9sYSBwaG9uZSAqLwogCXsgVVNCX0RFVklDRSgweDBjNDQsIDB4MDAyMikgfSwJLyogdW5rbm93biBNb3Jvcm9sYSBwaG9uZSAqLwogCXsgVVNCX0RFVklDRSgweDIyYjgsIDB4MmE2NCkgfSwJLyogTW90b3JvbGEgS1JaUiBLMW0gKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMmI4LCAweDJjODQpIH0sIC8qIE1vdG9yb2xhIFZFMjQwIHBob25lICovCiAJeyBVU0JfREVWSUNFKDB4MjJiOCwgMHgyYzY0KSB9LCAvKiBNb3Rvcm9sYSBWOTUwIHBob25lICovCiAJeyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCBkNzdmZjA0Li42MGIyNWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0xNDksNiArMTQ5LDcgQEAKICNkZWZpbmUgSFVBV0VJX1BST0RVQ1RfSzM3NjUJCQkweDE0NjUKICNkZWZpbmUgSFVBV0VJX1BST0RVQ1RfRTE0QUMJCQkweDE0QUMKICNkZWZpbmUgSFVBV0VJX1BST0RVQ1RfRVRTMTIyMAkJCTB4MTgwMworI2RlZmluZSBIVUFXRUlfUFJPRFVDVF9FMzUzCQkJMHgxNTA2CiAKICNkZWZpbmUgUVVBTlRBX1ZFTkRPUl9JRAkJCTB4MDQwOAogI2RlZmluZSBRVUFOVEFfUFJPRFVDVF9RMTAxCQkJMHhFQTAyCkBAIC0zMTAsMTAgKzMxMSw2IEBACiAjZGVmaW5lIFpURV9QUk9EVUNUX0FDMjcyNgkJCTB4ZmZmNQogI2RlZmluZSBaVEVfUFJPRFVDVF9BQzg3MTBUCQkJMHhmZmZmCiAKLS8qIFpURSBQUk9EVUNUUyAtLSBhbHRlcm5hdGUgdmVuZG9yIElEICovCi0jZGVmaW5lIFpURV9WRU5ET1JfSUQyCQkJCTB4MWQ2YgotI2RlZmluZSBaVEVfUFJPRFVDVF9NRl8zMzAJCQkweDAwMDIKLQogI2RlZmluZSBCRU5RX1ZFTkRPUl9JRAkJCQkweDA0YTUKICNkZWZpbmUgQkVOUV9QUk9EVUNUX0gxMAkJCTB4NDA2OAogCkBAIC0zMzksMTEgKzMzNiwxMiBAQAogI2RlZmluZSBUT1NISUJBX1BST0RVQ1RfRzQ1MAkJCTB4MGQ0NQogCiAjZGVmaW5lIEFMSU5LX1ZFTkRPUl9JRAkJCQkweDFlMGUKKyNkZWZpbmUgQUxJTktfUFJPRFVDVF9QSDMwMAkJCTB4OTEwMAogI2RlZmluZSBBTElOS19QUk9EVUNUXzNHVQkJCTB4OTIwMAogCiAvKiBBTENBVEVMIFBST0RVQ1RTICovCiAjZGVmaW5lIEFMQ0FURUxfVkVORE9SX0lECQkJMHgxYmJiCi0jZGVmaW5lIEFMQ0FURUxfUFJPRFVDVF9YMDYwUwkJCTB4MDAwMAorI2RlZmluZSBBTENBVEVMX1BST0RVQ1RfWDA2MFNfWDIwMAkJMHgwMDAwCiAKICNkZWZpbmUgUElSRUxMSV9WRU5ET1JfSUQJCQkweDEyNjYKICNkZWZpbmUgUElSRUxMSV9QUk9EVUNUX0MxMDBfMQkJCTB4MTAwMgpAQCAtMzc4LDYgKzM3Niw5IEBACiAgKiBJdCBzZWVtcyB0byBjb250YWluIGEgUXVhbGNvbW0gUVNDNjI0MC82MjkwIGNoaXBzZXQgICAgICAgICAgICAqLwogI2RlZmluZSBGT1VSX0dfU1lTVEVNU19QUk9EVUNUX1cxNAkJMHg5NjAzCiAKKy8qIFpvb20gKi8KKyNkZWZpbmUgWk9PTV9QUk9EVUNUXzQ1OTcJCQkweDk2MDcKKwogLyogSGFpZXIgcHJvZHVjdHMgKi8KICNkZWZpbmUgSEFJRVJfVkVORE9SX0lECQkJCTB4MjAxZQogI2RlZmluZSBIQUlFUl9QUk9EVUNUX0NFMTAwCQkJMHgyMDA5CkBAIC00MzEsNiArNDMyLDIwIEBACiAJLnJlYXNvbiA9IE9QVElPTl9CTEFDS0xJU1RfU0VORFNFVFVQCiB9OwogCitzdGF0aWMgY29uc3QgdTggYWxjYXRlbF94MjAwX25vX3NlbmRzZXR1cFtdID0geyAwLCAxIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbl9ibGFja2xpc3RfaW5mbyBhbGNhdGVsX3gyMDBfYmxhY2tsaXN0ID0geworCS5pbmZvbGVuID0gQVJSQVlfU0laRShhbGNhdGVsX3gyMDBfbm9fc2VuZHNldHVwKSwKKwkuaWZhY2VpbmZvID0gYWxjYXRlbF94MjAwX25vX3NlbmRzZXR1cCwKKwkucmVhc29uID0gT1BUSU9OX0JMQUNLTElTVF9TRU5EU0VUVVAKK307CisKK3N0YXRpYyBjb25zdCB1OCB6dGVfazM3NjVfel9ub19zZW5kc2V0dXBbXSA9IHsgMCwgMSwgMiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb25fYmxhY2tsaXN0X2luZm8genRlX2szNzY1X3pfYmxhY2tsaXN0ID0geworCS5pbmZvbGVuID0gQVJSQVlfU0laRSh6dGVfazM3NjVfel9ub19zZW5kc2V0dXApLAorCS5pZmFjZWluZm8gPSB6dGVfazM3NjVfel9ub19zZW5kc2V0dXAsCisJLnJlYXNvbiA9IE9QVElPTl9CTEFDS0xJU1RfU0VORFNFVFVQCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgb3B0aW9uX2lkc1tdID0gewogCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9DT0xUKSB9LAogCXsgVVNCX0RFVklDRShPUFRJT05fVkVORE9SX0lELCBPUFRJT05fUFJPRFVDVF9SSUNPTEEpIH0sCkBAIC01MzIsNiArNTQ3LDcgQEAKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0szNzY1LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oSFVBV0VJX1ZFTkRPUl9JRCwgSFVBV0VJX1BST0RVQ1RfRVRTMTIyMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0UxNEFDLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oSFVBV0VJX1ZFTkRPUl9JRCwgSFVBV0VJX1BST0RVQ1RfRTM1MywgMHhmZiwgMHgwMSwgMHgwMSkgfSwKIAl7IFVTQl9ERVZJQ0UoTk9WQVRFTFdJUkVMRVNTX1ZFTkRPUl9JRCwgTk9WQVRFTFdJUkVMRVNTX1BST0RVQ1RfVjY0MCkgfSwKIAl7IFVTQl9ERVZJQ0UoTk9WQVRFTFdJUkVMRVNTX1ZFTkRPUl9JRCwgTk9WQVRFTFdJUkVMRVNTX1BST0RVQ1RfVjYyMCkgfSwKIAl7IFVTQl9ERVZJQ0UoTk9WQVRFTFdJUkVMRVNTX1ZFTkRPUl9JRCwgTk9WQVRFTFdJUkVMRVNTX1BST0RVQ1RfVjc0MCkgfSwKQEAgLTkxNCwxMyArOTMwLDEzIEBACiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwNzMsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAxMzAsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAxNDEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDIsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDIwMDIsIDB4ZmYsCisJICAweGZmLCAweGZmKSwgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ6dGVfazM3NjVfel9ibGFja2xpc3QgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MjAwMywgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0NETUFfVEVDSCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDMjcyNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0FDODcxMFQsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFKFpURV9WRU5ET1JfSUQyLCBaVEVfUFJPRFVDVF9NRl8zMzApIH0sCiAJeyBVU0JfREVWSUNFKEJFTlFfVkVORE9SX0lELCBCRU5RX1BST0RVQ1RfSDEwKSB9LAogCXsgVVNCX0RFVklDRShETElOS19WRU5ET1JfSUQsIERMSU5LX1BST0RVQ1RfRFdNXzY1MikgfSwKIAl7IFVTQl9ERVZJQ0UoQUxJTktfVkVORE9SX0lELCBETElOS19QUk9EVUNUX0RXTV82NTJfVTUpIH0sIC8qIFllcywgQUxJTktfVkVORE9SX0lEICovCkBAIC05MzMsMTMgKzk0OSwxNyBAQAogCXsgVVNCX0RFVklDRShUT1NISUJBX1ZFTkRPUl9JRCwgVE9TSElCQV9QUk9EVUNUX0c0NTApIH0sCiAJeyBVU0JfREVWSUNFKFRPU0hJQkFfVkVORE9SX0lELCBUT1NISUJBX1BST0RVQ1RfSFNEUEFfTUlOSUNBUkQgKSB9LCAvKiBUb3NoaWJhIDNHIEhTRFBBID09IE5vdmF0ZWwgRXhwZWRpdGUgRVU4NzBEIE1pbmlDYXJkICovCiAJeyBVU0JfREVWSUNFKEFMSU5LX1ZFTkRPUl9JRCwgMHg5MDAwKSB9LAorCXsgVVNCX0RFVklDRShBTElOS19WRU5ET1JfSUQsIEFMSU5LX1BST0RVQ1RfUEgzMDApIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhBTElOS19WRU5ET1JfSUQsIEFMSU5LX1BST0RVQ1RfM0dVLCAweGZmLCAweGZmLCAweGZmKSB9LAotCXsgVVNCX0RFVklDRShBTENBVEVMX1ZFTkRPUl9JRCwgQUxDQVRFTF9QUk9EVUNUX1gwNjBTKSB9LAorCXsgVVNCX0RFVklDRShBTENBVEVMX1ZFTkRPUl9JRCwgQUxDQVRFTF9QUk9EVUNUX1gwNjBTX1gyMDApLAorCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZhbGNhdGVsX3gyMDBfYmxhY2tsaXN0CisJfSwKIAl7IFVTQl9ERVZJQ0UoQUlSUExVU19WRU5ET1JfSUQsIEFJUlBMVVNfUFJPRFVDVF9NQ0Q2NTApIH0sCiAJeyBVU0JfREVWSUNFKFRMQVlURUNIX1ZFTkRPUl9JRCwgVExBWVRFQ0hfUFJPRFVDVF9URVU4MDApIH0sCiAJeyBVU0JfREVWSUNFKExPTkdDSEVFUl9WRU5ET1JfSUQsIEZPVVJfR19TWVNURU1TX1BST0RVQ1RfVzE0KSwKICAgCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmb3VyX2dfdzE0X2JsYWNrbGlzdAogICAJfSwKKwl7IFVTQl9ERVZJQ0UoTE9OR0NIRUVSX1ZFTkRPUl9JRCwgWk9PTV9QUk9EVUNUXzQ1OTcpIH0sCiAJeyBVU0JfREVWSUNFKEhBSUVSX1ZFTkRPUl9JRCwgSEFJRVJfUFJPRFVDVF9DRTEwMCkgfSwKIAkvKiBQaXJlbGxpICAqLwogCXsgVVNCX0RFVklDRShQSVJFTExJX1ZFTkRPUl9JRCwgUElSRUxMSV9QUk9EVUNUX0MxMDBfMSl9LApAQCAtOTcyLDcgKzk5Miw3IEBACiAJeyBVU0JfREVWSUNFKE9MSVZFVFRJX1ZFTkRPUl9JRCwgT0xJVkVUVElfUFJPRFVDVF9PTElDQVJEMTAwKSB9LAogCXsgVVNCX0RFVklDRShDRUxPVF9WRU5ET1JfSUQsIENFTE9UX1BST0RVQ1RfQ1Q2ODBNKSB9LCAvKiBDVC02NTAgQ0RNQSA0NTAgMXhFVkRPIG1vZGVtICovCiAJeyBVU0JfREVWSUNFKE9OREFfVkVORE9SX0lELCBPTkRBX01UODI1VVApIH0sIC8qIE9OREEgTVQ4MjVVUCBtb2RlbSAqLwotCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oU0FNU1VOR19WRU5ET1JfSUQsIFNBTVNVTkdfUFJPRFVDVF9HVF9CMzczMCwgVVNCX0NMQVNTX0NEQ19EQVRBLCAweDAwLCAweDAwKSB9LCAvKiBTYW1zdW5nIEdULUIzNzMwL0dULUIzNzEwIExURSBVU0IgbW9kZW0uKi8KKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFNBTVNVTkdfVkVORE9SX0lELCBTQU1TVU5HX1BST0RVQ1RfR1RfQjM3MzAsIFVTQl9DTEFTU19DRENfREFUQSwgMHgwMCwgMHgwMCkgfSwgLyogU2Ftc3VuZyBHVC1CMzczMCBMVEUgVVNCIG1vZGVtLiovCiAJeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG9wdGlvbl9pZHMpOwpAQCAtMTEwOSw2ICsxMTI5LDEyIEBACiAJCXNlcmlhbC0+aW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyID09IDEpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogRG9uJ3QgYmluZCBuZXR3b3JrIGludGVyZmFjZSBvbiBTYW1zdW5nIEdULUIzNzMwLCBpdCBpcyBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgbW9kdWxlICovCisJaWYgKHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IFNBTVNVTkdfVkVORE9SX0lEICYmCisJCXNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBTQU1TVU5HX1BST0RVQ1RfR1RfQjM3MzAgJiYKKwkJc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VDbGFzcyAhPSBVU0JfQ0xBU1NfQ0RDX0RBVEEpCisJCXJldHVybiAtRU5PREVWOworCiAJZGF0YSA9IHNlcmlhbC0+cHJpdmF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfd3dhbl9pbnRmX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwppbmRleCAzMDQ2MWZjYy4uMGMyMDgzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwpAQCAtOTEsNiArOTEsNyBAQAogCXsgVVNCX0RFVklDRShTT05ZX1ZFTkRPUl9JRCwgU09OWV9RTjNVU0JfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoU0FOV0FfVkVORE9SX0lELCBTQU5XQV9QUk9EVUNUX0lEKSB9LAogCXsgVVNCX0RFVklDRShBRExJTktfVkVORE9SX0lELCBBRExJTktfTkQ2NTMwX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKFdJTkNISVBIRUFEX1ZFTkRPUl9JRCwgV0lOQ0hJUEhFQURfVVNCU0VSX1BST0RVQ1RfSUQpIH0sCiAJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5oCmluZGV4IDFiMDI1ZjcuLmNhMGQyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmgKQEAgLTE0NCwzICsxNDQsNyBAQAogLyogQURMSU5LIE5ELTY1MzAgUlMyMzIsUlM0ODUgYW5kIFJTNDIyIGFkYXB0ZXIgKi8KICNkZWZpbmUgQURMSU5LX1ZFTkRPUl9JRAkJMHgwYjYzCiAjZGVmaW5lIEFETElOS19ORDY1MzBfUFJPRFVDVF9JRAkweDY1MzAKKworLyogV2luQ2hpcEhlYWQgVVNCLT5SUyAyMzIgYWRhcHRlciAqLworI2RlZmluZSBXSU5DSElQSEVBRF9WRU5ET1JfSUQJCTB4NDM0OAorI2RlZmluZSBXSU5DSElQSEVBRF9VU0JTRVJfUFJPRFVDVF9JRAkweDU1MjMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IDAwNDE4OTkuLmU4YWUyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtODE5LDYgKzgxOSwzNSBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBTb21lIGRldmljZXMgZG9uJ3Qgd29yayBvciByZXR1cm4gaW5jb3JyZWN0IGRhdGEgdGhlIGZpcnN0CisJICogdGltZSB0aGV5IGdldCBhIFJFQUQoMTApIGNvbW1hbmQsIG9yIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkKKwkgKiBhZnRlciBhIG1lZGlhIGNoYW5nZS4gIElmIHRoZSBJTklUSUFMX1JFQUQxMCBmbGFnIGlzIHNldCwKKwkgKiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgUkVBRCgxMCkgY29tbWFuZHMgc3VjY2VlZC4gIElmIHRoZQorCSAqIHByZXZpb3VzIG9uZSBzdWNjZWVkZWQgYW5kIHRoaXMgb25lIGZhaWxlZCwgc2V0IHRoZSBSRURPX1JFQUQxMAorCSAqIGZsYWcgdG8gZm9yY2UgYSByZXRyeS4KKwkgKi8KKwlpZiAodW5saWtlbHkoKHVzLT5mZmxhZ3MgJiBVU19GTF9JTklUSUFMX1JFQUQxMCkgJiYKKwkJCXNyYi0+Y21uZFswXSA9PSBSRUFEXzEwKSkgeworCQlpZiAoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCkgeworCQkJc2V0X2JpdChVU19GTElEWF9SRUFEMTBfV09SS0VELCAmdXMtPmRmbGFncyk7CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoVVNfRkxJRFhfUkVBRDEwX1dPUktFRCwgJnVzLT5kZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQoVVNfRkxJRFhfUkVBRDEwX1dPUktFRCwgJnVzLT5kZmxhZ3MpOworCQkJc2V0X2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpOworCQl9CisKKwkJLyoKKwkJICogTmV4dCwgaWYgdGhlIFJFRE9fUkVBRDEwIGZsYWcgaXMgc2V0LCByZXR1cm4gYSByZXN1bHQKKwkJICogY29kZSB0aGF0IHdpbGwgY2F1c2UgdGhlIFNDU0kgY29yZSB0byByZXRyeSB0aGUgUkVBRCgxMCkKKwkJICogY29tbWFuZCBpbW1lZGlhdGVseS4KKwkJICovCisJCWlmICh0ZXN0X2JpdChVU19GTElEWF9SRURPX1JFQUQxMCwgJnVzLT5kZmxhZ3MpKSB7CisJCQljbGVhcl9iaXQoVVNfRkxJRFhfUkVET19SRUFEMTAsICZ1cy0+ZGZsYWdzKTsKKwkJCXNyYi0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKKwkJCXNyYi0+c2Vuc2VfYnVmZmVyWzBdID0gMDsKKwkJfQorCX0KKwogCS8qIERpZCB3ZSB0cmFuc2ZlciBsZXNzIHRoYW4gdGhlIG1pbmltdW0gYW1vdW50IHJlcXVpcmVkPyAqLwogCWlmICgoc3JiLT5yZXN1bHQgPT0gU0FNX1NUQVRfR09PRCB8fCBzcmItPnNlbnNlX2J1ZmZlclsyXSA9PSAwKSAmJgogCQkJc2NzaV9idWZmbGVuKHNyYikgLSBzY3NpX2dldF9yZXNpZChzcmIpIDwgc3JiLT51bmRlcmZsb3cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBjMTYwMmI4Li5jY2ZmMzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTExMTQsNiArMTExNCwxNiBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgUGF1bCBIYXJ0bWFuIDxwYXVsLmhhcnRtYW4rbGludXhAZ21haWwuY29tPgorICogVGhpcyBjYXJkIHJlYWRlciByZXR1cm5zICJJbGxlZ2FsIFJlcXVlc3QsIExvZ2ljYWwgQmxvY2sgQWRkcmVzcworICogT3V0IG9mIFJhbmdlIiBmb3IgdGhlIGZpcnN0IFJFQUQoMTApIGFmdGVyIGEgbmV3IGNhcmQgaXMgaW5zZXJ0ZWQuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgwOTBjLCAweDYwMDAsIDB4MDEwMCwgMHgwMTAwLAorCQkiRmVpeWEiLAorCQkiU0QvU0RIQyBDYXJkIFJlYWRlciIsCisJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0lOSVRJQUxfUkVBRDEwICksCisKIC8qIFRoaXMgUGVudGF4IHN0aWxsIGNhbWVyYSBpcyBub3QgY29uZm9ybWFudAogICogdG8gdGhlIFVTQiBzdG9yYWdlIHNwZWNpZmljYXRpb246IC0KICAqIC0gSXQgZG9lcyBub3QgbGlrZSB0aGUgSU5RVUlSWSBjb21tYW5kLiBTbyB3ZSBtdXN0IGhhbmRsZSB0aGlzIGNvbW1hbmQKQEAgLTE4ODgsNiArMTg5OCwxNSBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9OT19SRUFEX0RJU0NfSU5GTyApLAogCisvKiBSZXBvcnRlZCBieSBTdmVuIEdlZ2d1cyA8c3Zlbi11c2JzdEBnZWdndXMubmV0PgorICogVGhpcyBlbmNyeXB0ZWQgcGVuIGRyaXZlIHJldHVybnMgYm9ndXMgZGF0YSBmb3IgdGhlIGluaXRpYWwgUkVBRCgxMCkuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgxYjFjLCAweDFhYjUsIDB4MDIwMCwgMHgwMjAwLAorCQkiQ29yc2FpciIsCisJCSJQYWRsb2NrIHYyIiwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSU5JVElBTF9SRUFEMTAgKSwKKwogLyogUGF0Y2ggYnkgUmljaGFyZCBTY2j8dHogPHIuc2NodHpAdC1vbmxpbmUuZGU+CiAgKiBUaGlzIGV4dGVybmFsIGhhcmQgZHJpdmUgZW5jbG9zdXJlIHVzZXMgYSBKTWljcm9uIGNoaXAgd2hpY2gKICAqIG5lZWRzIHRoZSBVU19GTF9JR05PUkVfUkVTSURVRSBmbGFnIHRvIHdvcmsgcHJvcGVybHkuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfcmVhbHRlay5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX3JlYWx0ZWsuaAppbmRleCAzMjM2ZTAzLi5lNDFmNTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfcmVhbHRlay5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9yZWFsdGVrLmgKQEAgLTIzLDE5ICsyMywxOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9TVE9SQUdFX1JFQUxURUspIHx8IFwKIAkJZGVmaW5lZChDT05GSUdfVVNCX1NUT1JBR0VfUkVBTFRFS19NT0RVTEUpCiAKLVVOVVNVQUxfREVWKDB4MGJkYSwgMHgwMTU5LCAweDAwMDAsIDB4OTk5OSwKK1VOVVNVQUxfREVWKDB4MGJkYSwgMHgwMTM4LCAweDAwMDAsIDB4OTk5OSwKIAkJIlJlYWx0ZWsiLAogCQkiVVNCIENhcmQgUmVhZGVyIiwKLQkJVVNCX1NDX1NDU0ksIFVTQl9QUl9CVUxLLCBpbml0X3JlYWx0ZWtfY3IsIDApLAorCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBpbml0X3JlYWx0ZWtfY3IsIDApLAogCiBVTlVTVUFMX0RFVigweDBiZGEsIDB4MDE1OCwgMHgwMDAwLCAweDk5OTksCiAJCSJSZWFsdGVrIiwKIAkJIlVTQiBDYXJkIFJlYWRlciIsCi0JCVVTQl9TQ19TQ1NJLCBVU0JfUFJfQlVMSywgaW5pdF9yZWFsdGVrX2NyLCAwKSwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgaW5pdF9yZWFsdGVrX2NyLCAwKSwKIAotVU5VU1VBTF9ERVYoMHgwYmRhLCAweDAxMzgsIDB4MDAwMCwgMHg5OTk5LAorVU5VU1VBTF9ERVYoMHgwYmRhLCAweDAxNTksIDB4MDAwMCwgMHg5OTk5LAogCQkiUmVhbHRlayIsCiAJCSJVU0IgQ2FyZCBSZWFkZXIiLAotCQlVU0JfU0NfU0NTSSwgVVNCX1BSX0JVTEssIGluaXRfcmVhbHRla19jciwgMCksCisJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIGluaXRfcmVhbHRla19jciwgMCksCiAKICNlbmRpZiAgLyogZGVmaW5lZChDT05GSUdfVVNCX1NUT1JBR0VfUkVBTFRFSykgfHwgLi4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCA0MjE5YzE5Li4wN2Q2ZDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTQzOSw3ICs0MzksOCBAQAogCQkJVVNfRkxfQ0FQQUNJVFlfSEVVUklTVElDUyB8IFVTX0ZMX0lHTk9SRV9ERVZJQ0UgfAogCQkJVVNfRkxfTk9UX0xPQ0tBQkxFIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgfAogCQkJVVNfRkxfQ0FQQUNJVFlfT0sgfCBVU19GTF9JR05PUkVfUkVTSURVRSB8Ci0JCQlVU19GTF9TSU5HTEVfTFVOIHwgVVNfRkxfTk9fV1BfREVURUNUKTsKKwkJCVVTX0ZMX1NJTkdMRV9MVU4gfCBVU19GTF9OT19XUF9ERVRFQ1QgfAorCQkJVVNfRkxfSU5JVElBTF9SRUFEMTApOwogCiAJcCA9IHF1aXJrczsKIAl3aGlsZSAoKnApIHsKQEAgLTQ4Myw2ICs0ODQsOSBAQAogCQljYXNlICdtJzoKIAkJCWYgfD0gVVNfRkxfTUFYX1NFQ1RPUlNfNjQ7CiAJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlmIHw9IFVTX0ZMX0lOSVRJQUxfUkVBRDEwOworCQkJYnJlYWs7CiAJCWNhc2UgJ28nOgogCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9PSzsKIAkJCWJyZWFrOwpAQCAtOTQ2LDYgKzk1MCwxMyBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gQmFkRGV2aWNlOwogCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIHJldHVybnMgaW52YWxpZCBkYXRhIGZvciB0aGUgZmlyc3QgUkVBRCgxMCkKKwkgKiBjb21tYW5kLCBpbmRpY2F0ZSB0aGUgY29tbWFuZCBzaG91bGQgYmUgcmV0cmllZC4KKwkgKi8KKwlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX0lOSVRJQUxfUkVBRDEwKQorCQlzZXRfYml0KFVTX0ZMSURYX1JFRE9fUkVBRDEwLCAmdXMtPmRmbGFncyk7CisKIAkvKiBBY3F1aXJlIGFsbCB0aGUgb3RoZXIgcmVzb3VyY2VzIGFuZCBhZGQgdGhlIGhvc3QgKi8KIAlyZXN1bHQgPSB1c2Jfc3Rvcl9hY3F1aXJlX3Jlc291cmNlcyh1cyk7CiAJaWYgKHJlc3VsdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCmluZGV4IDg5ZDNiZmYuLjdiMGYyMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaApAQCAtNzMsNiArNzMsOCBAQAogI2RlZmluZSBVU19GTElEWF9SRVNFVFRJTkcJNAkvKiBkZXZpY2UgcmVzZXQgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVVNfRkxJRFhfVElNRURfT1VUCTUJLyogU0NTSSBtaWRsYXllciB0aW1lZCBvdXQgICovCiAjZGVmaW5lIFVTX0ZMSURYX0RPTlRfU0NBTgk2CS8qIGRvbid0IHNjYW4gKGRpc2Nvbm5lY3QpICAqLworI2RlZmluZSBVU19GTElEWF9SRURPX1JFQUQxMAk3CS8qIHJlZG8gUkVBRCgxMCkgY29tbWFuZCAgICAqLworI2RlZmluZSBVU19GTElEWF9SRUFEMTBfV09SS0VECTgJLyogcHJldmlvdXMgUkVBRCgxMCkgc3VjY2VlZGVkICovCiAKICNkZWZpbmUgVVNCX1NUT1JfU1RSSU5HX0xFTiAzMgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCmluZGV4IDUzYjJjNWEuLjMwNWM5NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCkBAIC0xMjY1LDkgKzEyNjUsMTEgQEAKIAogc3RhdGljIHZvaWQgdmdhMTZmYl9kZXN0cm95KHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihpbmZvLT5kZXZpY2UsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAkvKiBYWFggdW5zaGFyZSBWR0EgcmVnaW9ucyAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKaW5kZXggNWVjNWFjMS4uYmVmYmU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCkBAIC0yMTEsNiArMjExLDEyIEBACiAJaW50IHJldDsKIAogCW10eDFfd2R0X2RldmljZS5ncGlvID0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShtdHgxX3dkdF9kZXZpY2UuZ3BpbywKKwkJCQlHUElPRl9PVVRfSU5JVF9ISUdILCAibXR4MS13ZHQiKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBncGlvIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJc3Bpbl9sb2NrX2luaXQoJm10eDFfd2R0X2RldmljZS5sb2NrKTsKIAlpbml0X2NvbXBsZXRpb24oJm10eDFfd2R0X2RldmljZS5zdG9wKTsKQEAgLTIzNiw2ICsyNDIsOCBAQAogCQltdHgxX3dkdF9kZXZpY2UucXVldWUgPSAwOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtdHgxX3dkdF9kZXZpY2Uuc3RvcCk7CiAJfQorCisJZ3Bpb19mcmVlKG10eDFfd2R0X2RldmljZS5ncGlvKTsKIAltaXNjX2RlcmVnaXN0ZXIoJm10eDFfd2R0X21pc2MpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCAyNTdiMDBlLi42MTBlOGUwIDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtNzYyLDcgKzc2MiwxOSBAQAogCWlmICghZGlzaykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOWElPKTsKIAotCXdob2xlID0gYmRnZXRfZGlzayhkaXNrLCAwKTsKKwkvKgorCSAqIE5vcm1hbGx5LCBAYmRldiBzaG91bGQgZXF1YWwgd2hhdCdzIHJldHVybmVkIGZyb20gYmRnZXRfZGlzaygpCisJICogaWYgcGFydG5vIGlzIDA7IGhvd2V2ZXIsIHNvbWUgZHJpdmVycyAoZmxvcHB5KSB1c2UgbXVsdGlwbGUKKwkgKiBiZGV2J3MgZm9yIHRoZSBzYW1lIHBoeXNpY2FsIGRldmljZSBhbmQgQGJkZXYgbWF5IGJlIG9uZSBvZiB0aGUKKwkgKiBhbGlhc2VzLiAgS2VlcCBAYmRldiBpZiBwYXJ0bm8gaXMgMC4gIFRoaXMgbWVhbnMgY2xhaW1lcgorCSAqIHRyYWNraW5nIGlzIGJyb2tlbiBmb3IgdGhvc2UgZGV2aWNlcyBidXQgaXQgaGFzIGFsd2F5cyBiZWVuIHRoYXQKKwkgKiB3YXkuCisJICovCisJaWYgKHBhcnRubykKKwkJd2hvbGUgPSBiZGdldF9kaXNrKGRpc2ssIDApOworCWVsc2UKKwkJd2hvbGUgPSBiZGdyYWIoYmRldik7CisKIAltb2R1bGVfcHV0KGRpc2stPmZvcHMtPm93bmVyKTsKIAlwdXRfZGlzayhkaXNrKTsKIAlpZiAoIXdob2xlKQpAQCAtMTEyMCw2ICsxMTMyLDE1IEBACiAJCQkJCWdvdG8gcmVzdGFydDsKIAkJCQl9CiAJCQl9CisKKwkJCWlmICghcmV0ICYmICFiZGV2LT5iZF9vcGVuZXJzKSB7CisJCQkJYmRfc2V0X3NpemUoYmRldiwobG9mZl90KWdldF9jYXBhY2l0eShkaXNrKTw8OSk7CisJCQkJYmRpID0gYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKGJkZXYpOworCQkJCWlmIChiZGkgPT0gTlVMTCkKKwkJCQkJYmRpID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKwkJCQliZGV2X2lub2RlX3N3aXRjaF9iZGkoYmRldi0+YmRfaW5vZGUsIGJkaSk7CisJCQl9CisKIAkJCS8qCiAJCQkgKiBJZiB0aGUgZGV2aWNlIGlzIGludmFsaWRhdGVkLCByZXNjYW4gcGFydGl0aW9uCiAJCQkgKiBpZiBvcGVuIHN1Y2NlZWRlZCBvciBmYWlsZWQgd2l0aCAtRU5PTUVESVVNLgpAQCAtMTEzMCwxNCArMTE1MSw2IEBACiAJCQkJcmVzY2FuX3BhcnRpdGlvbnMoZGlzaywgYmRldik7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0X2NsZWFyOwotCi0JCQlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKLQkJCQliZF9zZXRfc2l6ZShiZGV2LChsb2ZmX3QpZ2V0X2NhcGFjaXR5KGRpc2spPDw5KTsKLQkJCQliZGkgPSBibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oYmRldik7Ci0JCQkJaWYgKGJkaSA9PSBOVUxMKQotCQkJCQliZGkgPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOwotCQkJCWJkZXZfaW5vZGVfc3dpdGNoX2JkaShiZGV2LT5iZF9pbm9kZSwgYmRpKTsKLQkJCX0KIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBibG9ja19kZXZpY2UgKndob2xlOwogCQkJd2hvbGUgPSBiZGdldF9kaXNrKGRpc2ssIDApOwpAQCAtMTIzNyw2ICsxMjUwLDggQEAKIAlyZXMgPSBfX2Jsa2Rldl9nZXQoYmRldiwgbW9kZSwgMCk7CiAKIAlpZiAod2hvbGUpIHsKKwkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSB3aG9sZS0+YmRfZGlzazsKKwogCQkvKiBmaW5pc2ggY2xhaW1pbmcgKi8KIAkJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCQlzcGluX2xvY2soJmJkZXZfbG9jayk7CkBAIC0xMjYzLDE1ICsxMjc4LDE2IEBACiAJCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOwogCiAJCS8qCi0JCSAqIEJsb2NrIGV2ZW50IHBvbGxpbmcgZm9yIHdyaXRlIGNsYWltcy4gIEFueSB3cml0ZQotCQkgKiBob2xkZXIgbWFrZXMgdGhlIHdyaXRlX2hvbGRlciBzdGF0ZSBzdGljayB1bnRpbCBhbGwKLQkJICogYXJlIHJlbGVhc2VkLiAgVGhpcyBpcyBnb29kIGVub3VnaCBhbmQgdHJhY2tpbmcKLQkJICogaW5kaXZpZHVhbCB3cml0ZWFibGUgcmVmZXJlbmNlIGlzIHRvbyBmcmFnaWxlIGdpdmVuCi0JCSAqIHRoZSB3YXkgQG1vZGUgaXMgdXNlZCBpbiBibGtkZXZfZ2V0L3B1dCgpLgorCQkgKiBCbG9jayBldmVudCBwb2xsaW5nIGZvciB3cml0ZSBjbGFpbXMgaWYgcmVxdWVzdGVkLiAgQW55CisJCSAqIHdyaXRlIGhvbGRlciBtYWtlcyB0aGUgd3JpdGVfaG9sZGVyIHN0YXRlIHN0aWNrIHVudGlsCisJCSAqIGFsbCBhcmUgcmVsZWFzZWQuICBUaGlzIGlzIGdvb2QgZW5vdWdoIGFuZCB0cmFja2luZworCQkgKiBpbmRpdmlkdWFsIHdyaXRlYWJsZSByZWZlcmVuY2UgaXMgdG9vIGZyYWdpbGUgZ2l2ZW4gdGhlCisJCSAqIHdheSBAbW9kZSBpcyB1c2VkIGluIGJsa2Rldl9nZXQvcHV0KCkuCiAJCSAqLwotCQlpZiAoIXJlcyAmJiAobW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAhYmRldi0+YmRfd3JpdGVfaG9sZGVyKSB7CisJCWlmICghcmVzICYmIChtb2RlICYgRk1PREVfV1JJVEUpICYmICFiZGV2LT5iZF93cml0ZV9ob2xkZXIgJiYKKwkJICAgIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFKSkgewogCQkJYmRldi0+YmRfd3JpdGVfaG9sZGVyID0gdHJ1ZTsKLQkJCWRpc2tfYmxvY2tfZXZlbnRzKGJkZXYtPmJkX2Rpc2spOworCQkJZGlza19ibG9ja19ldmVudHMoZGlzayk7CiAJCX0KIAogCQltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCBkMWEwMTZiLi5iYTNkOTViIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAlpZiAoY2lmc19wZHUgPT0gTlVMTCB8fCBzZXJ2ZXIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY2lmc19wZHUtPkNvbW1hbmQgPT0gU01CX0NPTV9ORUdPVElBVEUpCisJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpCiAJCXJldHVybiAwOwogCiAJaWYgKGNpZnNfcGR1LT5Db21tYW5kID09IFNNQl9DT01fTE9DS0lOR19BTkRYKSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDI3NzI2MmEuLjAxZGIxNGMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAotCXdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCWRvIHsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCiAJCS8qIHdlIHNob3VsZCB0cnkgb25seSB0aGUgcG9ydCB3ZSBjb25uZWN0ZWQgdG8gYmVmb3JlICovCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJCQlzZXJ2ZXItPnRjcFN0YXR1cyA9IENpZnNOZWVkTmVnb3RpYXRlOwogCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAkJfQotCX0KKwl9IHdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0yNDQ3LDcgKzI0NDcsNyBAQAogCiAJaWYgKCFDSUZTU01CUUZTVW5peEluZm8oeGlkLCB0Y29uKSkgewogCQlfX3U2NCBjYXAgPSBsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpOwotCisJCWNGWUkoMSwgInVuaXggY2FwcyB3aGljaCBzZXJ2ZXIgc3VwcG9ydHMgJWxsZCIsIGNhcCk7CiAJCS8qIGNoZWNrIGZvciByZWNvbm5lY3QgY2FzZSBpbiB3aGljaCB3ZSBkbyBub3QKIAkJICAgd2FudCB0byBjaGFuZ2UgdGhlIG1vdW50IGJlaGF2aW9yIGlmIHdlIGNhbiBhdm9pZCBpdCAqLwogCQlpZiAodm9sX2luZm8gPT0gTlVMTCkgewpAQCAtMjQ2NSw2ICsyNDY1LDkgQEAKIAkJCX0KIAkJfQogCisJCWlmIChjYXAgJiBDSUZTX1VOSVhfVFJBTlNQT1JUX0VOQ1JZUFRJT05fTUFOREFUT1JZX0NBUCkKKwkJCWNFUlJPUigxLCAicGVyLXNoYXJlIGVuY3J5cHRpb24gbm90IHN1cHBvcnRlZCB5ZXQiKTsKKwogCQljYXAgJj0gQ0lGU19VTklYX0NBUF9NQVNLOwogCQlpZiAodm9sX2luZm8gJiYgdm9sX2luZm8tPm5vX3BzeF9hY2wpCiAJCQljYXAgJj0gfkNJRlNfVU5JWF9QT1NJWF9BQ0xfQ0FQOwpAQCAtMjUxMyw2ICsyNTE2LDEwIEBACiAJCQljRllJKDEsICJ2ZXJ5IGxhcmdlIHJlYWQgY2FwIik7CiAJCWlmIChjYXAgJiBDSUZTX1VOSVhfTEFSR0VfV1JJVEVfQ0FQKQogCQkJY0ZZSSgxLCAidmVyeSBsYXJnZSB3cml0ZSBjYXAiKTsKKwkJaWYgKGNhcCAmIENJRlNfVU5JWF9UUkFOU1BPUlRfRU5DUllQVElPTl9DQVApCisJCQljRllJKDEsICJ0cmFuc3BvcnQgZW5jcnlwdGlvbiBjYXAiKTsKKwkJaWYgKGNhcCAmIENJRlNfVU5JWF9UUkFOU1BPUlRfRU5DUllQVElPTl9NQU5EQVRPUllfQ0FQKQorCQkJY0ZZSSgxLCAibWFuZGF0b3J5IHRyYW5zcG9ydCBlbmNyeXB0aW9uIGNhcCIpOwogI2VuZGlmIC8qIENJRlNfREVCVUcyICovCiAJCWlmIChDSUZTU01CU2V0RlNVbml4SW5mbyh4aWQsIHRjb24sIGNhcCkpIHsKIAkJCWlmICh2b2xfaW5mbyA9PSBOVUxMKSB7CkBAIC0yNTY0LDIzICsyNTcxLDYgQEAKIAllbHNlIC8qIGRlZmF1bHQgKi8KIAkJY2lmc19zYi0+cnNpemUgPSBDSUZTTWF4QnVmU2l6ZTsKIAotCWlmIChwdm9sdW1lX2luZm8tPndzaXplID4gUEFHRVZFQ19TSVpFICogUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCWNFUlJPUigxLCAid3NpemUgJWQgdG9vIGxhcmdlLCB1c2luZyA0MDk2IGluc3RlYWQiLAotCQkJICBwdm9sdW1lX2luZm8tPndzaXplKTsKLQkJY2lmc19zYi0+d3NpemUgPSA0MDk2OwotCX0gZWxzZSBpZiAocHZvbHVtZV9pbmZvLT53c2l6ZSkKLQkJY2lmc19zYi0+d3NpemUgPSBwdm9sdW1lX2luZm8tPndzaXplOwotCWVsc2UKLQkJY2lmc19zYi0+d3NpemUgPSBtaW5fdChjb25zdCBpbnQsCi0JCQkJCVBBR0VWRUNfU0laRSAqIFBBR0VfQ0FDSEVfU0laRSwKLQkJCQkJMTI3KjEwMjQpOwotCQkvKiBvbGQgZGVmYXVsdCBvZiBDSUZTTWF4QnVmU2l6ZSB3YXMgdG9vIHNtYWxsIG5vdwotCQkgICB0aGF0IFNNQiBXcml0ZTIgY2FuIHNlbmQgbXVsdGlwbGUgcGFnZXMgaW4ga3ZlYy4KLQkJICAgUkZDMTAwMSBkb2VzIG5vdCBkZXNjcmliZSB3aGF0IGhhcHBlbnMgd2hlbiBmcmFtZQotCQkgICBiaWdnZXIgdGhhbiAxMjhLIGlzIHNlbnQgc28gdXNlIHRoYXQgYXMgbWF4IGluCi0JCSAgIGNvbmp1bmN0aW9uIHdpdGggNTJLIGt2ZWMgY29uc3RyYWludCBvbiBhcmNoIHdpdGggNEsKLQkJICAgcGFnZSBzaXplICAqLwotCiAJaWYgKGNpZnNfc2ItPnJzaXplIDwgMjA0OCkgewogCQljaWZzX3NiLT5yc2l6ZSA9IDIwNDg7CiAJCS8qIFdpbmRvd3MgTUUgbWF5IHByZWZlciB0aGlzICovCkBAIC0yNjU4LDYgKzI2NDgsNDggQEAKIAkJCSAgICJtb3VudCBvcHRpb24gc3VwcG9ydGVkIik7CiB9CiAKKy8qIFByaW9yIHRvIDMuMCwgY2lmcyBjb3VsZG4ndCBoYW5kbGUgd3JpdGVzIGxhcmdlciB0aGFuIHRoaXMgKi8KKyNkZWZpbmUgQ0lGU19NQVhfV1NJWkUgKFBBR0VWRUNfU0laRSAqIFBBR0VfQ0FDSEVfU0laRSkKKworLyoKKyAqIFdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IGFsbG93IGxhcmdlIHBvc2l4IHdyaXRlcywgb25seSBhbGxvdyBhIHdzaXplIG9mCisgKiAxMjhrIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBXUklURV9BTkRfWCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHdyaXRlIHVwCisgKiB0byB0aGUgbWF4aW11bSBzaXplIGRlc2NyaWJlZCBieSBSRkMxMDAyLgorICovCisjZGVmaW5lIENJRlNfTUFYX1JGQzEwMDJfV1NJWkUgKDEyOCAqIDEwMjQgLSBzaXplb2YoV1JJVEVfUkVRKSArIDQpCisKKy8qIE1ha2UgdGhlIGRlZmF1bHQgdGhlIHNhbWUgYXMgdGhlIG1heCAqLworI2RlZmluZSBDSUZTX0RFRkFVTFRfV1NJWkUgQ0lGU19NQVhfV1NJWkUKKworc3RhdGljIHVuc2lnbmVkIGludAorY2lmc19uZWdvdGlhdGVfd3NpemUoc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwgc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbykKK3sKKwlfX3U2NCB1bml4X2NhcCA9IGxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSk7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gdGNvbi0+c2VzLT5zZXJ2ZXI7CisJdW5zaWduZWQgaW50IHdzaXplID0gcHZvbHVtZV9pbmZvLT53c2l6ZSA/IHB2b2x1bWVfaW5mby0+d3NpemUgOgorCQkJCUNJRlNfREVGQVVMVF9XU0laRTsKKworCS8qIGNhbiBzZXJ2ZXIgc3VwcG9ydCAyNC1iaXQgd3JpdGUgc2l6ZXM/ICh2aWEgVU5JWCBleHRlbnNpb25zKSAqLworCWlmICghdGNvbi0+dW5peF9leHQgfHwgISh1bml4X2NhcCAmIENJRlNfVU5JWF9MQVJHRV9XUklURV9DQVApKQorCQl3c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgd3NpemUsIENJRlNfTUFYX1JGQzEwMDJfV1NJWkUpOworCisJLyoKKwkgKiBubyBDQVBfTEFSR0VfV1JJVEVfWCBvciBpcyBzaWduaW5nIGVuYWJsZWQgd2l0aG91dCBDQVBfVU5JWCBzZXQ/CisJICogTGltaXQgaXQgdG8gbWF4IGJ1ZmZlciBvZmZlcmVkIGJ5IHRoZSBzZXJ2ZXIsIG1pbnVzIHRoZSBzaXplIG9mIHRoZQorCSAqIFdSSVRFWCBoZWFkZXIsIG5vdCBpbmNsdWRpbmcgdGhlIDQgYnl0ZSBSRkMxMDAxIGxlbmd0aC4KKwkgKi8KKwlpZiAoIShzZXJ2ZXItPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9XUklURV9YKSB8fAorCSAgICAoIShzZXJ2ZXItPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgorCSAgICAgKHNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fRU5BQkxFRHxTRUNNT0RFX1NJR05fUkVRVUlSRUQpKSkpCisJCXdzaXplID0gbWluX3QodW5zaWduZWQgaW50LCB3c2l6ZSwKKwkJCQlzZXJ2ZXItPm1heEJ1ZiAtIHNpemVvZihXUklURV9SRVEpICsgNCk7CisKKwkvKiBoYXJkIGxpbWl0IG9mIENJRlNfTUFYX1dTSVpFICovCisJd3NpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHdzaXplLCBDSUZTX01BWF9XU0laRSk7CisKKwlyZXR1cm4gd3NpemU7Cit9CisKIHN0YXRpYyBpbnQKIGlzX3BhdGhfYWNjZXNzaWJsZShpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAogCQkgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBjb25zdCBjaGFyICpmdWxsX3BhdGgpCkBAIC0yODMxLDIwICsyODYzLDI2IEBACiAJCWdvdG8gcmVtb3RlX3BhdGhfY2hlY2s7CiAJfQogCisJLyogdGVsbCBzZXJ2ZXIgd2hpY2ggVW5peCBjYXBzIHdlIHN1cHBvcnQgKi8KKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQkvKiByZXNldCBvZiBjYXBzIGNoZWNrcyBtb3VudCB0byBzZWUgaWYgdW5peCBleHRlbnNpb25zCisJCSAgIGRpc2FibGVkIGZvciBqdXN0IHRoaXMgbW91bnQgKi8KKwkJcmVzZXRfY2lmc191bml4X2NhcHMoeGlkLCB0Y29uLCBzYiwgdm9sdW1lX2luZm8pOworCQlpZiAoKHRjb24tPnNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpICYmCisJCSAgICAobGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KSAmCisJCSAgICAgQ0lGU19VTklYX1RSQU5TUE9SVF9FTkNSWVBUSU9OX01BTkRBVE9SWV9DQVApKSB7CisJCQlyYyA9IC1FQUNDRVM7CisJCQlnb3RvIG1vdW50X2ZhaWxfY2hlY2s7CisJCX0KKwl9IGVsc2UKKwkJdGNvbi0+dW5peF9leHQgPSAwOyAvKiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGVtICovCisKIAkvKiBkbyBub3QgY2FyZSBpZiBmb2xsb3dpbmcgdHdvIGNhbGxzIHN1Y2NlZWQgLSBpbmZvcm1hdGlvbmFsICovCiAJaWYgKCF0Y29uLT5pcGMpIHsKIAkJQ0lGU1NNQlFGU0RldmljZUluZm8oeGlkLCB0Y29uKTsKIAkJQ0lGU1NNQlFGU0F0dHJpYnV0ZUluZm8oeGlkLCB0Y29uKTsKIAl9CiAKLQkvKiB0ZWxsIHNlcnZlciB3aGljaCBVbml4IGNhcHMgd2Ugc3VwcG9ydCAqLwotCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKQotCQkvKiByZXNldCBvZiBjYXBzIGNoZWNrcyBtb3VudCB0byBzZWUgaWYgdW5peCBleHRlbnNpb25zCi0JCSAgIGRpc2FibGVkIGZvciBqdXN0IHRoaXMgbW91bnQgKi8KLQkJcmVzZXRfY2lmc191bml4X2NhcHMoeGlkLCB0Y29uLCBzYiwgdm9sdW1lX2luZm8pOwotCWVsc2UKLQkJdGNvbi0+dW5peF9leHQgPSAwOyAvKiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGVtICovCi0KIAkvKiBjb252ZXJ0IGZvcndhcmQgdG8gYmFjayBzbGFzaGVzIGluIHByZXBhdGggaGVyZSBpZiBuZWVkZWQgKi8KIAlpZiAoKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9QT1NJWF9QQVRIUykgPT0gMCkKIAkJY29udmVydF9kZWxpbWl0ZXIoY2lmc19zYi0+cHJlcGF0aCwgQ0lGU19ESVJfU0VQKGNpZnNfc2IpKTsKQEAgLTI4NTMsMTMgKzI4OTEsMTIgQEAKIAkJY2lmc19zYi0+cnNpemUgPSAxMDI0ICogMTI3OwogCQljRllJKERCRzIsICJubyB2ZXJ5IGxhcmdlIHJlYWQgc3VwcG9ydCwgcnNpemUgbm93IDEyN0siKTsKIAl9Ci0JaWYgKCEodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfV1JJVEVfWCkpCi0JCWNpZnNfc2ItPndzaXplID0gbWluKGNpZnNfc2ItPndzaXplLAotCQkJICAgICAgICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpKTsKIAlpZiAoISh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9SRUFEX1gpKQogCQljaWZzX3NiLT5yc2l6ZSA9IG1pbihjaWZzX3NiLT5yc2l6ZSwKIAkJCSAgICAgICAodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFKSk7CiAKKwljaWZzX3NiLT53c2l6ZSA9IGNpZnNfbmVnb3RpYXRlX3dzaXplKHRjb24sIHZvbHVtZV9pbmZvKTsKKwogcmVtb3RlX3BhdGhfY2hlY2s6CiAJLyogY2hlY2sgaWYgYSB3aG9sZSBwYXRoIChpbmNsdWRpbmcgcHJlcGF0aCkgaXMgbm90IHJlbW90ZSAqLwogCWlmICghcmMgJiYgdGNvbikgewpAQCAtMzE5NSw3ICszMjMyLDcgQEAKIAl9CiAJaWYgKHJjID09IDApIHsKIAkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0JCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykKKwkJaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkTmVnb3RpYXRlKQogCQkJc2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzR29vZDsKIAkJZWxzZQogCQkJcmMgPSAtRUhPU1RET1dOOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9mc2NhY2hlLmMgYi9mcy9jaWZzL2ZzY2FjaGUuYwppbmRleCAyOTdhNDNkLi4wNTI2OGNmMTdlIDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZzY2FjaGUuYworKysgYi9mcy9jaWZzL2ZzY2FjaGUuYwpAQCAtOTQsNiArOTQsNyBAQAogCWlmIChjaWZzaS0+ZnNjYWNoZSkgewogCQljRllJKDEsICJDSUZTIGRpc2FibGluZyBpbm9kZSBjb29raWUgKDB4JXApIiwKIAkJCQljaWZzaS0+ZnNjYWNoZSk7CisJCWZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoY2lmc2ktPmZzY2FjaGUsIGlub2RlKTsKIAkJZnNjYWNoZV9yZWxpbnF1aXNoX2Nvb2tpZShjaWZzaS0+ZnNjYWNoZSwgMSk7CiAJCWNpZnNpLT5mc2NhY2hlID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwppbmRleCBhMjFjYWJkLi5kZGEwZGM3IDEwMDY0NAotLS0gYS9mcy9kY29va2llcy5jCisrKyBiL2ZzL2Rjb29raWVzLmMKQEAgLTE3OCw2ICsxNzgsOCBAQAogCS8qIEZJWE1FOiAoZGVsZXRlZCkgPyAqLwogCXBhdGggPSBkX3BhdGgoJmRjcy0+cGF0aCwga2J1ZiwgUEFHRV9TSVpFKTsKIAorCW11dGV4X3VubG9jaygmZGNvb2tpZV9tdXRleCk7CisKIAlpZiAoSVNfRVJSKHBhdGgpKSB7CiAJCWVyciA9IFBUUl9FUlIocGF0aCk7CiAJCWdvdG8gb3V0X2ZyZWU7CkBAIC0xOTQsNiArMTk2LDcgQEAKIAogb3V0X2ZyZWU6CiAJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIGVycjsKIG91dDoKIAltdXRleF91bmxvY2soJmRjb29raWVfbXV0ZXgpOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9pbm9kZS5jIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwppbmRleCA0ZDRjYzZhLi45NGFiM2MwIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9pbm9kZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKQEAgLTUyNyw2ICs1MjcsOCBAQAogCWRnZXQobG93ZXJfZGVudHJ5KTsKIAlyYyA9IHZmc19ybWRpcihsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLCBsb3dlcl9kZW50cnkpOwogCWRwdXQobG93ZXJfZGVudHJ5KTsKKwlpZiAoIXJjICYmIGRlbnRyeS0+ZF9pbm9kZSkKKwkJY2xlYXJfbmxpbmsoZGVudHJ5LT5kX2lub2RlKTsKIAlmc3N0YWNrX2NvcHlfYXR0cl90aW1lcyhkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOwogCWRpci0+aV9ubGluayA9IGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUtPmlfbmxpbms7CiAJdW5sb2NrX2Rpcihsb3dlcl9kaXJfZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IDAzZTYwOWMuLjI3YTdmZWYgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtNTk5LDggKzU5OSw4IEBACiAJc3RydWN0IG11dGV4ICp0Zm1fbXV0ZXg7CiAJY2hhciAqYmxvY2tfYWxpZ25lZF9maWxlbmFtZTsKIAlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rOwotCXN0cnVjdCBzY2F0dGVybGlzdCBzcmNfc2c7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IGRzdF9zZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjX3NnWzJdOworCXN0cnVjdCBzY2F0dGVybGlzdCBkc3Rfc2dbMl07CiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CiAJY2hhciBpdltFQ1JZUFRGU19NQVhfSVZfQllURVNdOwogCWNoYXIgaGFzaFtFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkVdOwpAQCAtODE2LDIzICs4MTYsMjEgQEAKIAltZW1jcHkoJnMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+bnVtX3JhbmRfYnl0ZXNdLCBmaWxlbmFtZSwKIAkgICAgICAgZmlsZW5hbWVfc2l6ZSk7CiAJcmMgPSB2aXJ0X3RvX3NjYXR0ZXJsaXN0KHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUsCi0JCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPnNyY19zZywgMSk7Ci0JaWYgKHJjICE9IDEpIHsKKwkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLCBzLT5zcmNfc2csIDIpOworCWlmIChyYyA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgotCQkgICAgICAgImNvbnZlcnQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCi0JCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiY29udmVydCBmaWxlbmFtZSBtZW1vcnkgdG8gc2NhdHRlcmxpc3Q7IHJjID0gWyVkXS4gIgogCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCiAJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOwogCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOwogCX0KIAlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3QoJmRlc3Rbcy0+aV0sIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwKLQkJCQkgJnMtPmRzdF9zZywgMSk7Ci0JaWYgKHJjICE9IDEpIHsKKwkJCQkgcy0+ZHN0X3NnLCAyKTsKKwlpZiAocmMgPCAxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKIAkJICAgICAgICJjb252ZXJ0IGVuY3J5cHRlZCBmaWxlbmFtZSBtZW1vcnkgdG8gc2NhdHRlcmxpc3Q7ICIKLQkJICAgICAgICJleHBlY3RlZCByYyA9IDE7IGdvdCByYyA9IFslZF0uICIKLQkJICAgICAgICJibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSBbJXpkXVxuIiwgX19mdW5jX18sIHJjLAotCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJICAgICAgICJyYyA9IFslZF0uIGJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjLCBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOwogCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOwogCX0KIAkvKiBUaGUgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgYmxvY2sgZWZmZWN0aXZlbHkgZG8gdGhlIGpvYgpAQCAtODU1LDcgKzg1Myw3IEBACiAJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKIAkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKIAl9Ci0JcmMgPSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJnMtPmRlc2MsICZzLT5kc3Rfc2csICZzLT5zcmNfc2csCisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJnMtPmRlc2MsIHMtPmRzdF9zZywgcy0+c3JjX3NnLAogCQkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0IGZpbGVuYW1lOyAiCkBAIC04OTEsOCArODg5LDggQEAKIAlzdHJ1Y3QgbXV0ZXggKnRmbV9tdXRleDsKIAljaGFyICpkZWNyeXB0ZWRfZmlsZW5hbWU7CiAJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvazsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjX3NnOwotCXN0cnVjdCBzY2F0dGVybGlzdCBkc3Rfc2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyY19zZ1syXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgZHN0X3NnWzJdOwogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOwogCWNoYXIgZm5la19zaWdfaGV4W0VDUllQVEZTX1NJR19TSVpFX0hFWCArIDFdOwogCWNoYXIgaXZbRUNSWVBURlNfTUFYX0lWX0JZVEVTXTsKQEAgLTEwMDgsMTMgKzEwMDYsMTIgQEAKIAl9CiAJbXV0ZXhfbG9jayhzLT50Zm1fbXV0ZXgpOwogCXJjID0gdmlydF90b19zY2F0dGVybGlzdCgmZGF0YVsoKnBhY2tldF9zaXplKV0sCi0JCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPnNyY19zZywgMSk7Ci0JaWYgKHJjICE9IDEpIHsKKwkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLCBzLT5zcmNfc2csIDIpOworCWlmIChyYyA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgogCQkgICAgICAgImNvbnZlcnQgZW5jcnlwdGVkIGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgotCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgotCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCi0JCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQkgICAgICAgInJjID0gWyVkXS4gYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMsIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJKCpwYWNrZXRfc2l6ZSkgKz0gcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOwpAQCAtMTAyOCwxMyArMTAyNSwxMiBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCXJjID0gdmlydF90b19zY2F0dGVybGlzdChzLT5kZWNyeXB0ZWRfZmlsZW5hbWUsCi0JCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPmRzdF9zZywgMSk7Ci0JaWYgKHJjICE9IDEpIHsKKwkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLCBzLT5kc3Rfc2csIDIpOworCWlmIChyYyA8IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgogCQkgICAgICAgImNvbnZlcnQgZGVjcnlwdGVkIGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgotCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgotCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCi0JCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQkgICAgICAgInJjID0gWyVkXS4gYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMsIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CiAJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOwogCX0KIAkvKiBUaGUgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgYmxvY2sgZWZmZWN0aXZlbHkgZG8gdGhlIGpvYiBvZgpAQCAtMTA2NSw3ICsxMDYxLDcgQEAKIAkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOwogCQlnb3RvIG91dF9mcmVlX3VubG9jazsKIAl9Ci0JcmMgPSBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJnMtPmRlc2MsICZzLT5kc3Rfc2csICZzLT5zcmNfc2csCisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJnMtPmRlc2MsIHMtPmRzdF9zZywgcy0+c3JjX3NnLAogCQkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNyeXB0IGZpbGVuYW1lOyAiCmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggNWU2MmQyNi4uMGMzNjgyZCAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtMTA0Niw2ICsxMDQ2LDcgQEAKIAogCWJwcm0tPm1tID0gTlVMTDsJCS8qIFdlJ3JlIHVzaW5nIGl0IG5vdyAqLwogCisJc2V0X2ZzKFVTRVJfRFMpOwogCWN1cnJlbnQtPmZsYWdzICY9IH4oUEZfUkFORE9NSVpFIHwgUEZfS1RIUkVBRCk7CiAJZmx1c2hfdGhyZWFkKCk7CiAJY3VycmVudC0+cGVyc29uYWxpdHkgJj0gfmJwcm0tPnBlcl9jbGVhcjsKQEAgLTEzMTAsMTAgKzEzMTEsNiBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQkvKiBrZXJuZWwgbW9kdWxlIGxvYWRlciBmaXh1cCAqLwotCS8qIHNvIHdlIGRvbid0IHRyeSB0byBsb2FkIHJ1biBtb2Rwcm9iZSBpbiBrZXJuZWwgc3BhY2UuICovCi0Jc2V0X2ZzKFVTRVJfRFMpOwotCiAJcmV0dmFsID0gYXVkaXRfYnBybShicHJtKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IDMyZjNiODYuLjkzZjlmZDAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTE0MTYsMTAgKzE0MTYsMTkgQEAKIAlmcmFtZS0+YXQgPSBlbnRyaWVzOwogCWZyYW1lLT5iaCA9IGJoOwogCWJoID0gYmgyOworCS8qCisJICogTWFyayBidWZmZXJzIGRpcnR5IGhlcmUgc28gdGhhdCBpZiBkb19zcGxpdCgpIGZhaWxzIHdlIHdyaXRlIGEKKwkgKiBjb25zaXN0ZW50IHNldCBvZiBidWZmZXJzIHRvIGRpc2suCisJICovCisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWUtPmJoKTsKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CiAJZGUgPSBkb19zcGxpdChoYW5kbGUsZGlyLCAmYmgsIGZyYW1lLCAmaGluZm8sICZyZXR2YWwpOwotCWR4X3JlbGVhc2UgKGZyYW1lcyk7Ci0JaWYgKCEoZGUpKQorCWlmICghZGUpIHsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwkJZHhfcmVsZWFzZShmcmFtZXMpOwogCQlyZXR1cm4gcmV0dmFsOworCX0KKwlkeF9yZWxlYXNlKGZyYW1lcyk7CiAKIAlyZXR1cm4gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBkZSwgYmgpOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCA0ZGFhZjJiLi4xZTM3YzA5IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtMTU5MCwxMiArMTU5MCw4IEBACiAgKi8KIHN0cnVjdCBleHQ0X2xhenlfaW5pdCB7CiAJdW5zaWduZWQgbG9uZwkJbGlfc3RhdGU7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdAlsaV93YWl0X2RhZW1vbjsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlsaV93YWl0X3Rhc2s7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJbGlfdGltZXI7CiAJc3RydWN0IHRhc2tfc3RydWN0CSpsaV90YXNrOwotCiAJc3RydWN0IGxpc3RfaGVhZAlsaV9yZXF1ZXN0X2xpc3Q7CiAJc3RydWN0IG11dGV4CQlsaV9saXN0X210eDsKIH07CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggZjJmYTVlOC4uYWRkNWJjYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMjE0OCw3ICsyMTQ4LDEyIEBACiAJCQllbHNlIGlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTUJMS19JT19TVUJNSVQpKQogCQkJCWVyciA9IGV4dDRfYmlvX3dyaXRlX3BhZ2UoJmlvX3N1Ym1pdCwgcGFnZSwKIAkJCQkJCQkgIGxlbiwgbXBkLT53YmMpOwotCQkJZWxzZQorCQkJZWxzZSBpZiAoYnVmZmVyX3VuaW5pdChwYWdlX2J1ZnMpKSB7CisJCQkJZXh0NF9zZXRfYmhfZW5kaW8ocGFnZV9idWZzLCBpbm9kZSk7CisJCQkJZXJyID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlX2VuZGlvKHBhZ2UsCisJCQkJCW5vYWxsb2NfZ2V0X2Jsb2NrX3dyaXRlLAorCQkJCQltcGQtPndiYywgZXh0NF9lbmRfaW9fYnVmZmVyX3dyaXRlKTsKKwkJCX0gZWxzZQogCQkJCWVyciA9IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLAogCQkJCQlub2FsbG9jX2dldF9ibG9ja193cml0ZSwgbXBkLT53YmMpOwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuYyBiL2ZzL2V4dDQvbWJhbGxvYy5jCmluZGV4IGQ4YTE2ZWUuLjE1YmZhNDQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5jCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5jCkBAIC0xMjczLDYgKzEyNzMsOCBAQAogCXJldHVybiAwOwogCiBlcnI6CisJaWYgKHBhZ2UpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAlpZiAoZTRiLT5iZF9iaXRtYXBfcGFnZSkKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKGU0Yi0+YmRfYml0bWFwX3BhZ2UpOwogCWlmIChlNGItPmJkX2J1ZGR5X3BhZ2UpCmRpZmYgLS1naXQgYS9mcy9leHQ0L3BhZ2UtaW8uYyBiL2ZzL2V4dDQvcGFnZS1pby5jCmluZGV4IGI2ZGJkMDUuLjdiYjhmNzYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcGFnZS1pby5jCisrKyBiL2ZzL2V4dDQvcGFnZS1pby5jCkBAIC0yMDMsNDYgKzIwMywyOSBAQAogCWZvciAoaSA9IDA7IGkgPCBpb19lbmQtPm51bV9pb19wYWdlczsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gaW9fZW5kLT5wYWdlc1tpXS0+cF9wYWdlOwogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKLQkJaW50IHBhcnRpYWxfd3JpdGUgPSAwOworCQlsb2ZmX3Qgb2Zmc2V0OworCQlsb2ZmX3QgaW9fZW5kX29mZnNldDsKIAotCQloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwotCQlpZiAoZXJyb3IpCisJCWlmIChlcnJvcikgewogCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwotCQlCVUdfT04oIWhlYWQpOwotCQlpZiAoaGVhZC0+Yl9zaXplICE9IFBBR0VfQ0FDSEVfU0laRSkgewotCQkJbG9mZl90IG9mZnNldDsKLQkJCWxvZmZfdCBpb19lbmRfb2Zmc2V0ID0gaW9fZW5kLT5vZmZzZXQgKyBpb19lbmQtPnNpemU7CisJCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCQlCVUdfT04oIWhlYWQpOworCisJCQlpb19lbmRfb2Zmc2V0ID0gaW9fZW5kLT5vZmZzZXQgKyBpb19lbmQtPnNpemU7CiAKIAkJCW9mZnNldCA9IChzZWN0b3JfdCkgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKIAkJCWJoID0gaGVhZDsKIAkJCWRvIHsKIAkJCQlpZiAoKG9mZnNldCA+PSBpb19lbmQtPm9mZnNldCkgJiYKLQkJCQkgICAgKG9mZnNldCtiaC0+Yl9zaXplIDw9IGlvX2VuZF9vZmZzZXQpKSB7Ci0JCQkJCWlmIChlcnJvcikKLQkJCQkJCWJ1ZmZlcl9pb19lcnJvcihiaCk7CisJCQkJICAgIChvZmZzZXQrYmgtPmJfc2l6ZSA8PSBpb19lbmRfb2Zmc2V0KSkKKwkJCQkJYnVmZmVyX2lvX2Vycm9yKGJoKTsKIAotCQkJCX0KLQkJCQlpZiAoYnVmZmVyX2RlbGF5KGJoKSkKLQkJCQkJcGFydGlhbF93cml0ZSA9IDE7Ci0JCQkJZWxzZSBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKQotCQkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOwotCQkJCWVsc2UgaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpCi0JCQkJCXBhcnRpYWxfd3JpdGUgPSAxOwogCQkJCW9mZnNldCArPSBiaC0+Yl9zaXplOwogCQkJCWJoID0gYmgtPmJfdGhpc19wYWdlOwogCQkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CiAJCX0KIAotCQkvKgotCQkgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlCi0JCSAqIGFsbCBidWZmZXJzIHVwdG9kYXRlIHRoZW4gd2UgY2FuIG9wdGltaXplIGF3YXkgYQotCQkgKiBib2d1cyByZWFkcGFnZSgpIGZvciB0aGUgbmV4dCByZWFkKCkuIEhlcmUgd2UKLQkJICogJ2Rpc2NvdmVyJyB3aGV0aGVyIHRoZSBwYWdlIHdlbnQgdXB0b2RhdGUgYXMgYQotCQkgKiByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCi0JCSAqLwotCQlpZiAoIXBhcnRpYWxfd3JpdGUpCi0JCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0KIAkJcHV0X2lvX3BhZ2UoaW9fZW5kLT5wYWdlc1tpXSk7CiAJfQogCWlvX2VuZC0+bnVtX2lvX3BhZ2VzID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA4NTUzZGZiLi5lNmVhMzg0IDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC0yNjU5LDEyICsyNjU5LDYgQEAKIAltb2RfdGltZXIoJnNiaS0+c19lcnJfcmVwb3J0LCBqaWZmaWVzICsgMjQqNjAqNjAqSFopOyAgLyogT25jZSBhIGRheSAqLwogfQogCi1zdGF0aWMgdm9pZCBleHQ0X2xhenlpbm9kZV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSAoc3RydWN0IHRhc2tfc3RydWN0ICopZGF0YTsKLQl3YWtlX3VwX3Byb2Nlc3MocCk7Ci19Ci0KIC8qIEZpbmQgbmV4dCBzdWl0YWJsZSBncm91cCBhbmQgcnVuIGV4dDRfaW5pdF9pbm9kZV90YWJsZSAqLwogc3RhdGljIGludCBleHQ0X3J1bl9saV9yZXF1ZXN0KHN0cnVjdCBleHQ0X2xpX3JlcXVlc3QgKmVscikKIHsKQEAgLTI3MTIsNyArMjcwNiw3IEBACiAKIC8qCiAgKiBSZW1vdmUgbHJfcmVxdWVzdCBmcm9tIHRoZSBsaXN0X3JlcXVlc3QgYW5kIGZyZWUgdGhlCi0gKiByZXF1ZXN0IHRydWN0dXJlLiBTaG91bGQgYmUgY2FsbGVkIHdpdGggbGlfbGlzdF9tdHggaGVsZAorICogcmVxdWVzdCBzdHJ1Y3R1cmUuIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBsaV9saXN0X210eCBoZWxkCiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfcmVtb3ZlX2xpX3JlcXVlc3Qoc3RydWN0IGV4dDRfbGlfcmVxdWVzdCAqZWxyKQogewpAQCAtMjczMCwxNCArMjcyNCwxNiBAQAogCiBzdGF0aWMgdm9pZCBleHQ0X3VucmVnaXN0ZXJfbGlfcmVxdWVzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBleHQ0X2xpX3JlcXVlc3QgKmVsciA9IEVYVDRfU0Ioc2IpLT5zX2xpX3JlcXVlc3Q7Ci0KLQlpZiAoIWV4dDRfbGlfaW5mbykKKwltdXRleF9sb2NrKCZleHQ0X2xpX210eCk7CisJaWYgKCFleHQ0X2xpX2luZm8pIHsKKwkJbXV0ZXhfdW5sb2NrKCZleHQ0X2xpX210eCk7CiAJCXJldHVybjsKKwl9CiAKIAltdXRleF9sb2NrKCZleHQ0X2xpX2luZm8tPmxpX2xpc3RfbXR4KTsKLQlleHQ0X3JlbW92ZV9saV9yZXF1ZXN0KGVscik7CisJZXh0NF9yZW1vdmVfbGlfcmVxdWVzdChFWFQ0X1NCKHNiKS0+c19saV9yZXF1ZXN0KTsKIAltdXRleF91bmxvY2soJmV4dDRfbGlfaW5mby0+bGlfbGlzdF9tdHgpOworCW11dGV4X3VubG9jaygmZXh0NF9saV9tdHgpOwogfQogCiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpleHQ0X2xhenlpbml0X3Rhc2s7CkBAIC0yNzU2LDE0ICsyNzUyLDEwIEBACiAJc3RydWN0IGV4dDRfbGF6eV9pbml0ICplbGkgPSAoc3RydWN0IGV4dDRfbGF6eV9pbml0ICopYXJnOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm47CiAJc3RydWN0IGV4dDRfbGlfcmVxdWVzdCAqZWxyOwotCXVuc2lnbmVkIGxvbmcgbmV4dF93YWtldXA7Ci0JREVGSU5FX1dBSVQod2FpdCk7CisJdW5zaWduZWQgbG9uZyBuZXh0X3dha2V1cCwgY3VyOwogCiAJQlVHX09OKE5VTEwgPT0gZWxpKTsKIAotCWVsaS0+bGlfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnQ7Ci0JZWxpLT5saV90aW1lci5mdW5jdGlvbiA9IGV4dDRfbGF6eWlub2RlX3RpbWVvdXQ7Ci0KIAllbGktPmxpX3Rhc2sgPSBjdXJyZW50OwogCXdha2VfdXAoJmVsaS0+bGlfd2FpdF90YXNrKTsKIApAQCAtMjc5NywxOSArMjc4OSwxNSBAQAogCQlpZiAoZnJlZXppbmcoY3VycmVudCkpCiAJCQlyZWZyaWdlcmF0b3IoKTsKIAotCQlpZiAoKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbmV4dF93YWtldXApKSB8fAorCQljdXIgPSBqaWZmaWVzOworCQlpZiAoKHRpbWVfYWZ0ZXJfZXEoY3VyLCBuZXh0X3dha2V1cCkpIHx8CiAJCSAgICAoTUFYX0pJRkZZX09GRlNFVCA9PSBuZXh0X3dha2V1cCkpIHsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQkJY29udGludWU7CiAJCX0KIAotCQllbGktPmxpX3RpbWVyLmV4cGlyZXMgPSBuZXh0X3dha2V1cDsKLQkJYWRkX3RpbWVyKCZlbGktPmxpX3RpbWVyKTsKLQkJcHJlcGFyZV90b193YWl0KCZlbGktPmxpX3dhaXRfZGFlbW9uLCAmd2FpdCwKLQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgbmV4dF93YWtldXApKQotCQkJc2NoZWR1bGUoKTsKLQkJZmluaXNoX3dhaXQoJmVsaS0+bGlfd2FpdF9kYWVtb24sICZ3YWl0KTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG5leHRfd2FrZXVwIC0gY3VyKTsKKwogCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCQlleHQ0X2NsZWFyX3JlcXVlc3RfbGlzdCgpOwogCQkJZ290byBleGl0X3RocmVhZDsKQEAgLTI4MzMsMTIgKzI4MjEsMTAgQEAKIAkJZ290byBjb250X3RocmVhZDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZlbGktPmxpX2xpc3RfbXR4KTsKLQlkZWxfdGltZXJfc3luYygmZXh0NF9saV9pbmZvLT5saV90aW1lcik7CiAJZWxpLT5saV90YXNrID0gTlVMTDsKIAl3YWtlX3VwKCZlbGktPmxpX3dhaXRfdGFzayk7CiAKIAlrZnJlZShleHQ0X2xpX2luZm8pOwotCWV4dDRfbGF6eWluaXRfdGFzayA9IE5VTEw7CiAJZXh0NF9saV9pbmZvID0gTlVMTDsKIAltdXRleF91bmxvY2soJmV4dDRfbGlfbXR4KTsKIApAQCAtMjg2Niw3ICsyODUyLDYgQEAKIAlpZiAoSVNfRVJSKGV4dDRfbGF6eWluaXRfdGFzaykpIHsKIAkJaW50IGVyciA9IFBUUl9FUlIoZXh0NF9sYXp5aW5pdF90YXNrKTsKIAkJZXh0NF9jbGVhcl9yZXF1ZXN0X2xpc3QoKTsKLQkJZGVsX3RpbWVyX3N5bmMoJmV4dDRfbGlfaW5mby0+bGlfdGltZXIpOwogCQlrZnJlZShleHQ0X2xpX2luZm8pOwogCQlleHQ0X2xpX2luZm8gPSBOVUxMOwogCQlwcmludGsoS0VSTl9DUklUICJFWFQ0OiBlcnJvciAlZCBjcmVhdGluZyBpbm9kZSB0YWJsZSAiCkBAIC0yOTE1LDkgKzI5MDAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZlbGktPmxpX3JlcXVlc3RfbGlzdCk7CiAJbXV0ZXhfaW5pdCgmZWxpLT5saV9saXN0X210eCk7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlbGktPmxpX3dhaXRfZGFlbW9uKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlbGktPmxpX3dhaXRfdGFzayk7Ci0JaW5pdF90aW1lcigmZWxpLT5saV90aW1lcik7CiAJZWxpLT5saV9zdGF0ZSB8PSBFWFQ0X0xBWllJTklUX1FVSVQ7CiAKIAlleHQ0X2xpX2luZm8gPSBlbGk7CkBAIC00NjUyLDYgKzQ2MzUsOSBAQAogCWlmICh0ZXN0X29wdChzYiwgREVMQUxMT0MpKQogCQlzeW5jX2ZpbGVzeXN0ZW0oc2IpOwogCisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7CisKIAkvKiBVcGRhdGUgbW9kaWZpY2F0aW9uIHRpbWVzIG9mIHF1b3RhIGZpbGVzIHdoZW4gdXNlcnNwYWNlIGNhbgogCSAqIHN0YXJ0IGxvb2tpbmcgYXQgdGhlbSAqLwogCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMSk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCA3MjU3NzUyLi43MDE4ZTFkIDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQlpZiAoYXR0ciAmIEFUVFJfU1lTKQogCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJCWVsc2UKLQkJCWlub2RlLT5pX2ZsYWdzICY9IFNfSU1NVVRBQkxFOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOwogCX0KIAogCWZhdF9zYXZlX2F0dHJzKGlub2RlLCBhdHRyKTsKZGlmZiAtLWdpdCBhL2ZzL2ZzY2FjaGUvcGFnZS5jIGIvZnMvZnNjYWNoZS9wYWdlLmMKaW5kZXggNDFjNDQxYy4uZmQwM2IwZSAxMDA2NDQKLS0tIGEvZnMvZnNjYWNoZS9wYWdlLmMKKysrIGIvZnMvZnNjYWNoZS9wYWdlLmMKQEAgLTk2NywzICs5NjcsNDMgQEAKIAlwYWdldmVjX3JlaW5pdChwYWdldmVjKTsKIH0KIEVYUE9SVF9TWU1CT0woZnNjYWNoZV9tYXJrX3BhZ2VzX2NhY2hlZCk7CisKKy8qCisgKiBVbmNhY2hlIGFsbCB0aGUgcGFnZXMgaW4gYW4gaW5vZGUgdGhhdCBhcmUgbWFya2VkIFBHX2ZzY2FjaGUsIGFzc3VtaW5nIHRoZW0KKyAqIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29va2llLgorICovCit2b2lkIF9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmNvb2tpZSwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IG5leHQ7CisJaW50IGk7CisKKwlfZW50ZXIoIiVwLCVwIiwgY29va2llLCBpbm9kZSk7CisKKwlpZiAoIW1hcHBpbmcgfHwgbWFwcGluZy0+bnJwYWdlcyA9PSAwKSB7CisJCV9sZWF2ZSgiIFtubyBwYWdlc10iKTsKKwkJcmV0dXJuOworCX0KKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJbmV4dCA9IDA7CisJZG8geworCQlpZiAoIXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBuZXh0LCBQQUdFVkVDX1NJWkUpKQorCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisJCQluZXh0ID0gcGFnZS0+aW5kZXg7CisJCQlpZiAoUGFnZUZzQ2FjaGUocGFnZSkpIHsKKwkJCQlfX2ZzY2FjaGVfd2FpdF9vbl9wYWdlX3dyaXRlKGNvb2tpZSwgcGFnZSk7CisJCQkJX19mc2NhY2hlX3VuY2FjaGVfcGFnZShjb29raWUsIHBhZ2UpOworCQkJfQorCQl9CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUgKCsrbmV4dCk7CisKKwlfbGVhdmUoIiIpOworfQorRVhQT1JUX1NZTUJPTChfX2ZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9maWxlLmMgYi9mcy9nZnMyL2ZpbGUuYwppbmRleCBlNDgzMTA4Li40MTg3MjhmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2ZpbGUuYworKysgYi9mcy9nZnMyL2ZpbGUuYwpAQCAtODI2LDYgKzgyNiw3IEBACiAJbG9mZl90IGJ5dGVzLCBtYXhfYnl0ZXM7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsOwogCWludCBlcnJvcjsKKwlsb2ZmX3QgYnNpemVfbWFzayA9IH4oKGxvZmZfdClzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSk7CiAJbG9mZl90IG5leHQgPSAob2Zmc2V0ICsgbGVuIC0gMSkgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKIAluZXh0ID0gKG5leHQgKyAxKSA8PCBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCkBAIC04MzMsMTMgKzgzNCwxNSBAQAogCWlmIChtb2RlICYgfkZBTExPQ19GTF9LRUVQX1NJWkUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCW9mZnNldCA9IChvZmZzZXQgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCkgPDwKLQkJIHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7CisJb2Zmc2V0ICY9IGJzaXplX21hc2s7CiAKIAlsZW4gPSBuZXh0IC0gb2Zmc2V0OwogCWJ5dGVzID0gc2RwLT5zZF9tYXhfcmdfZGF0YSAqIHNkcC0+c2Rfc2Iuc2JfYnNpemUgLyAyOwogCWlmICghYnl0ZXMpCiAJCWJ5dGVzID0gVUlOVF9NQVg7CisJYnl0ZXMgJj0gYnNpemVfbWFzazsKKwlpZiAoYnl0ZXMgPT0gMCkKKwkJYnl0ZXMgPSBzZHAtPnNkX3NiLnNiX2JzaXplOwogCiAJZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmaXAtPmlfZ2gpOwogCWVycm9yID0gZ2ZzMl9nbG9ja19ucSgmaXAtPmlfZ2gpOwpAQCAtODcwLDYgKzg3Myw5IEBACiAJCWlmIChlcnJvcikgewogCQkJaWYgKGVycm9yID09IC1FTk9TUEMgJiYgYnl0ZXMgPiBzZHAtPnNkX3NiLnNiX2JzaXplKSB7CiAJCQkJYnl0ZXMgPj49IDE7CisJCQkJYnl0ZXMgJj0gYnNpemVfbWFzazsKKwkJCQlpZiAoYnl0ZXMgPT0gMCkKKwkJCQkJYnl0ZXMgPSBzZHAtPnNkX3NiLnNiX2JzaXplOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9CiAJCQlnb3RvIG91dF9xdW5sb2NrOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy93cmFwcGVyLmMgYi9mcy9oZnNwbHVzL3dyYXBwZXIuYwppbmRleCAzMDMxZDgxLi40YWM4OGZmIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3dyYXBwZXIuYworKysgYi9mcy9oZnNwbHVzL3dyYXBwZXIuYwpAQCAtMzYsNiArMzYsNyBAQAogewogCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdhaXQpOwogCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgcmV0ID0gMDsKIAogCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgMSk7CiAJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7CkBAIC01NCw4ICs1NSwxMCBAQAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCiAJaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkpCi0JCXJldHVybiAtRUlPOwotCXJldHVybiAwOworCQlyZXQgPSAtRUlPOworCisJYmlvX3B1dChiaW8pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaGZzcGx1c19yZWFkX21kYih2b2lkICpidWZwdHIsIHN0cnVjdCBoZnNwbHVzX3dkICp3ZCkKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCA2OWIxODA0Li5mNDg2ZmY2OSAxMDA2NDQKLS0tIGEvZnMvamJkL2NvbW1pdC5jCisrKyBiL2ZzL2piZC9jb21taXQuYwpAQCAtNzIyLDggKzcyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLiAqLwogCQlKQlVGRkVSX1RSQUNFKGpoLCAiZmlsZSBhcyBCSl9Gb3JnZXQiKTsKIAkJam91cm5hbF9maWxlX2J1ZmZlcihqaCwgY29tbWl0X3RyYW5zYWN0aW9uLCBCSl9Gb3JnZXQpOwotCQkvKiBXYWtlIHVwIGFueSB0cmFuc2FjdGlvbnMgd2hpY2ggd2VyZSB3YWl0aW5nIGZvciB0aGlzCi0JCSAgIElPIHRvIGNvbXBsZXRlICovCisJCS8qCisJCSAqIFdha2UgdXAgYW55IHRyYW5zYWN0aW9ucyB3aGljaCB3ZXJlIHdhaXRpbmcgZm9yIHRoaXMKKwkJICogSU8gdG8gY29tcGxldGUuIFRoZSBiYXJyaWVyIG11c3QgYmUgaGVyZSBzbyB0aGF0IGNoYW5nZXMKKwkJICogYnkgam91cm5hbF9maWxlX2J1ZmZlcigpIHRha2UgZWZmZWN0IGJlZm9yZSB3YWtlX3VwX2JpdCgpCisJCSAqIGRvZXMgdGhlIHdhaXRxdWV1ZSBjaGVjay4KKwkJICovCisJCXNtcF9tYigpOwogCQl3YWtlX3VwX2JpdCgmYmgtPmJfc3RhdGUsIEJIX1Vuc2hhZG93KTsKIAkJSkJVRkZFUl9UUkFDRShqaCwgImJyZWxzZSBzaGFkb3dlZCBidWZmZXIiKTsKIAkJX19icmVsc2UoYmgpOwpkaWZmIC0tZ2l0IGEvZnMvamJkL2pvdXJuYWwuYyBiL2ZzL2piZC9qb3VybmFsLmMKaW5kZXggYjM3MTNhZi4uZTJkNDI4NSAxMDA2NDQKLS0tIGEvZnMvamJkL2pvdXJuYWwuYworKysgYi9mcy9qYmQvam91cm5hbC5jCkBAIC00MzcsOSArNDM3LDEyIEBACiBpbnQgX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgdGFyZ2V0KQogewogCS8qCi0JICogQXJlIHdlIGFscmVhZHkgZG9pbmcgYSByZWNlbnQgZW5vdWdoIGNvbW1pdD8KKwkgKiBUaGUgb25seSB0cmFuc2FjdGlvbiB3ZSBjYW4gcG9zc2libHkgd2FpdCB1cG9uIGlzIHRoZQorCSAqIGN1cnJlbnRseSBydW5uaW5nIHRyYW5zYWN0aW9uIChpZiBpdCBleGlzdHMpLiAgT3RoZXJ3aXNlLAorCSAqIHRoZSB0YXJnZXQgdGlkIG11c3QgYmUgYW4gb2xkIG9uZS4KIAkgKi8KLQlpZiAoIXRpZF9nZXEoam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgdGFyZ2V0KSkgeworCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gJiYKKwkgICAgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uLT50X3RpZCA9PSB0YXJnZXQpIHsKIAkJLyoKIAkJICogV2Ugd2FudCBhIG5ldyBjb21taXQ6IE9LLCBtYXJrIHRoZSByZXF1ZXN0IGFuZCB3YWtldXAgdGhlCiAJCSAqIGNvbW1pdCB0aHJlYWQuICBXZSBkbyBfbm90XyBkbyB0aGUgY29tbWl0IG91cnNlbHZlcy4KQEAgLTQ1MSw3ICs0NTQsMTQgQEAKIAkJCSAgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOwogCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKIAkJcmV0dXJuIDE7Ci0JfQorCX0gZWxzZSBpZiAoIXRpZF9nZXEoam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgdGFyZ2V0KSkKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaWYgaXQgZG9lcywgcHJlc2VydmUKKwkJICAgdGhlIGV2aWRlbmNlIGJlZm9yZSBram91cm5hbGQgZ29lcyBpbnRvIGEgbG9vcCBhbmQKKwkJICAgaW5jcmVtZW50cyBqX2NvbW1pdF9zZXF1ZW5jZSBiZXlvbmQgYWxsIHJlY29nbml0aW9uLiAqLworCQlXQVJOX09OQ0UoMSwgImpiZDogYmFkIGxvZ19zdGFydF9jb21taXQ6ICV1ICV1ICV1ICV1XG4iLAorCQkgICAgam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsCisJCSAgICB0YXJnZXQsIGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA/CisJCSAgICBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24tPnRfdGlkIDogMCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMgYi9mcy9sb2NrZC9jbG50cHJvYy5jCmluZGV4IGFkYjQ1ZWMuLmUzNzQwNTAgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMKKysrIGIvZnMvbG9ja2QvY2xudHByb2MuYwpAQCAtNzA4LDcgKzcwOCwxMyBAQAogCiAJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKIAkJZHByaW50aygibG9ja2Q6IHVubG9jayBmYWlsZWQgKGVyciA9ICVkKVxuIiwgLXRhc2stPnRrX3N0YXR1cyk7Ci0JCWdvdG8gcmV0cnlfcmViaW5kOworCQlzd2l0Y2ggKHRhc2stPnRrX3N0YXR1cykgeworCQljYXNlIC1FQUNDRVM6CisJCWNhc2UgLUVJTzoKKwkJCWdvdG8gZGllOworCQlkZWZhdWx0OgorCQkJZ290byByZXRyeV9yZWJpbmQ7CisJCX0KIAl9CiAJaWYgKHN0YXR1cyA9PSBOTE1fTENLX0RFTklFRF9HUkFDRV9QRVJJT0QpIHsKIAkJcnBjX2RlbGF5KHRhc2ssIE5MTUNMTlRfR1JBQ0VfV0FJVCk7CmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCAwYTRmNTBkLi5iMjg2NTM5IDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTE2MCwxMCArMTYwLDI4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZmlsZWxvY2tfY2FjaGUgX19yZWFkX21vc3RseTsKIAorc3RhdGljIHZvaWQgbG9ja3NfaW5pdF9sb2NrX2Fsd2F5cyhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlmbC0+ZmxfbmV4dCA9IE5VTEw7CisJZmwtPmZsX2Zhc3luYyA9IE5VTEw7CisJZmwtPmZsX293bmVyID0gTlVMTDsKKwlmbC0+ZmxfcGlkID0gMDsKKwlmbC0+ZmxfbnNwaWQgPSBOVUxMOworCWZsLT5mbF9maWxlID0gTlVMTDsKKwlmbC0+ZmxfZmxhZ3MgPSAwOworCWZsLT5mbF90eXBlID0gMDsKKwlmbC0+Zmxfc3RhcnQgPSBmbC0+ZmxfZW5kID0gMDsKK30KKwogLyogQWxsb2NhdGUgYW4gZW1wdHkgbG9jayBzdHJ1Y3R1cmUuICovCiBzdHJ1Y3QgZmlsZV9sb2NrICpsb2Nrc19hbGxvY19sb2NrKHZvaWQpCiB7Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoZmlsZWxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlbG9ja19jYWNoZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoZmwpCisJCWxvY2tzX2luaXRfbG9ja19hbHdheXMoZmwpOworCisJcmV0dXJuIGZsOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobG9ja3NfYWxsb2NfbG9jayk7CiAKQEAgLTIwMCwxNyArMjE4LDkgQEAKIAlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2xpbmspOwogCUlOSVRfTElTVF9IRUFEKCZmbC0+ZmxfYmxvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZsLT5mbF93YWl0KTsKLQlmbC0+ZmxfbmV4dCA9IE5VTEw7Ci0JZmwtPmZsX2Zhc3luYyA9IE5VTEw7Ci0JZmwtPmZsX293bmVyID0gTlVMTDsKLQlmbC0+ZmxfcGlkID0gMDsKLQlmbC0+ZmxfbnNwaWQgPSBOVUxMOwotCWZsLT5mbF9maWxlID0gTlVMTDsKLQlmbC0+ZmxfZmxhZ3MgPSAwOwotCWZsLT5mbF90eXBlID0gMDsKLQlmbC0+Zmxfc3RhcnQgPSBmbC0+ZmxfZW5kID0gMDsKIAlmbC0+Zmxfb3BzID0gTlVMTDsKIAlmbC0+ZmxfbG1vcHMgPSBOVUxMOworCWxvY2tzX2luaXRfbG9ja19hbHdheXMoZmwpOwogfQogCiBFWFBPUlRfU1lNQk9MKGxvY2tzX2luaXRfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBlM2M0ZjExLi43MzJhNzU0IDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTEwMTMsNyArMTAxMyw2IEBACiAJCSAqIERvbid0IGZvcmdldCB3ZSBtaWdodCBoYXZlIGEgbm9uLW1vdW50cG9pbnQgbWFuYWdlZCBkZW50cnkKIAkJICogdGhhdCB3YW50cyB0byBibG9jayB0cmFuc2l0LgogCQkgKi8KLQkJKmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCQlpZiAoIXJldmVyc2VfdHJhbnNpdCAmJgogCQkgICAgIHVubGlrZWx5KG1hbmFnZWRfZGVudHJ5X21pZ2h0X2Jsb2NrKHBhdGgtPmRlbnRyeSkpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTAyNyw2ICsxMDI2LDEyIEBACiAJCXBhdGgtPm1udCA9IG1vdW50ZWQ7CiAJCXBhdGgtPmRlbnRyeSA9IG1vdW50ZWQtPm1udF9yb290OwogCQluZC0+c2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmcGF0aC0+ZGVudHJ5LT5kX3NlcSk7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgaW5vZGUgdG9vLiBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIHRoZQorCQkgKiBkZW50cnkgc2VxdWVuY2UgbnVtYmVyIGhlcmUgYWZ0ZXIgdGhpcyBkX2lub2RlIHJlYWQsCisJCSAqIGJlY2F1c2UgYSBtb3VudC1wb2ludCBpcyBhbHdheXMgcGlubmVkLgorCQkgKi8KKwkJKmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCX0KIAogCWlmICh1bmxpa2VseShwYXRoLT5kZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfTkVFRF9BVVRPTU9VTlQpKQpAQCAtMTM3OCwxMiArMTM4MywxMiBAQAogewogCWludCByZXM7CiAKLQlCVUdfT04obmQtPmRlcHRoID49IE1BWF9ORVNURURfTElOS1MpOwogCWlmICh1bmxpa2VseShjdXJyZW50LT5saW5rX2NvdW50ID49IE1BWF9ORVNURURfTElOS1MpKSB7CiAJCXBhdGhfcHV0X2NvbmRpdGlvbmFsKHBhdGgsIG5kKTsKIAkJcGF0aF9wdXQoJm5kLT5wYXRoKTsKIAkJcmV0dXJuIC1FTE9PUDsKIAl9CisJQlVHX09OKG5kLT5kZXB0aCA+PSBNQVhfTkVTVEVEX0xJTktTKTsKIAogCW5kLT5kZXB0aCsrOwogCWN1cnJlbnQtPmxpbmtfY291bnQrKzsKZGlmZiAtLWdpdCBhL2ZzL25mcy9mc2NhY2hlLmMgYi9mcy9uZnMvZnNjYWNoZS5jCmluZGV4IGNlMTUzYTYuLjQxOTExOWMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9mc2NhY2hlLmMKKysrIGIvZnMvbmZzL2ZzY2FjaGUuYwpAQCAtMjU5LDEyICsyNTksMTAgQEAKIAkJZGZwcmludGsoRlNDQUNIRSwKIAkJCSAiTkZTOiBuZnNpIDB4JXAgdHVybmluZyBjYWNoZSBvZmZcbiIsIE5GU19JKGlub2RlKSk7CiAKLQkJLyogTmVlZCB0byBpbnZhbGlkYXRlIGFueSBtYXBwZWQgcGFnZXMgdGhhdCB3ZXJlIHJlYWQgaW4gYmVmb3JlCi0JCSAqIHR1cm5pbmcgb2ZmIHRoZSBjYWNoZS4KKwkJLyogTmVlZCB0byB1bmNhY2hlIGFueSBwYWdlcyBhdHRhY2hlZCB0byB0aGlzIGlub2RlIHRoYXQKKwkJICogZnNjYWNoZSBrbm93cyBhYm91dCBiZWZvcmUgdHVybmluZyBvZmYgdGhlIGNhY2hlLgogCQkgKi8KLQkJaWYgKGlub2RlLT5pX21hcHBpbmcgJiYgaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcykKLQkJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyKGlub2RlLT5pX21hcHBpbmcpOwotCisJCWZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoTkZTX0koaW5vZGUpLT5mc2NhY2hlLCBpbm9kZSk7CiAJCW5mc19mc2NhY2hlX3phcF9pbm9kZV9jb29raWUoaW5vZGUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2ZzL25mcy9pbm9kZS5jIGIvZnMvbmZzL2lub2RlLmMKaW5kZXggNTdiYjMxYS4uMTk4NzdkYiAxMDA2NDQKLS0tIGEvZnMvbmZzL2lub2RlLmMKKysrIGIvZnMvbmZzL2lub2RlLmMKQEAgLTI1Niw3ICsyNTYsOCBAQAogCiAJbmZzX2F0dHJfY2hlY2tfbW91bnRwb2ludChzYiwgZmF0dHIpOwogCi0JaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9GSUxFSUQpID09IDAgJiYgKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX01PVU5UUE9JTlQpID09IDApCisJaWYgKCgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKSA9PSAwKSAmJgorCSAgICAhbmZzX2F0dHJfdXNlX21vdW50ZWRfb25fZmlsZWlkKGZhdHRyKSkKIAkJZ290byBvdXRfbm9faW5vZGU7CiAJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9UWVBFKSA9PSAwKQogCQlnb3RvIG91dF9ub19pbm9kZTsKQEAgLTEyOTQsNyArMTI5NSw4IEBACiAJCWlmIChuZXdfaXNpemUgIT0gY3VyX2lzaXplKSB7CiAJCQkvKiBEbyB3ZSBwZXJoYXBzIGhhdmUgYW55IG91dHN0YW5kaW5nIHdyaXRlcywgb3IgaGFzCiAJCQkgKiB0aGUgZmlsZSBncm93biBiZXlvbmQgb3VyIGxhc3Qgd3JpdGU/ICovCi0JCQlpZiAobmZzaS0+bnBhZ2VzID09IDAgfHwgbmV3X2lzaXplID4gY3VyX2lzaXplKSB7CisJCQlpZiAoKG5mc2ktPm5wYWdlcyA9PSAwICYmICF0ZXN0X2JpdChORlNfSU5PX0xBWU9VVENPTU1JVCwgJm5mc2ktPmZsYWdzKSkgfHwKKwkJCSAgICAgbmV3X2lzaXplID4gY3VyX2lzaXplKSB7CiAJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdfaXNpemUpOwogCQkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEE7CiAJCQl9CmRpZmYgLS1naXQgYS9mcy9uZnMvaW50ZXJuYWwuaCBiL2ZzL25mcy9pbnRlcm5hbC5oCmluZGV4IGNlMTE4Y2UuLmQxMGViN2UgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbnRlcm5hbC5oCisrKyBiL2ZzL25mcy9pbnRlcm5hbC5oCkBAIC00NSw2ICs0NSwxNyBAQAogCQlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfTU9VTlRQT0lOVDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmZzX2F0dHJfdXNlX21vdW50ZWRfb25fZmlsZWlkKHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWlmICgoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX01PVU5URURfT05fRklMRUlEKSA9PSAwKSB8fAorCSAgICAoKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9NT1VOVFBPSU5UKSA9PSAwKSAmJgorCSAgICAgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNF9SRUZFUlJBTCkgPT0gMCkpKQorCQlyZXR1cm4gMDsKKworCWZhdHRyLT5maWxlaWQgPSBmYXR0ci0+bW91bnRlZF9vbl9maWxlaWQ7CisJcmV0dXJuIDE7Cit9CisKIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgewogCWNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMgYi9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYwppbmRleCBiZTc5ZGM5Li41OTBjMDljIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYworKysgYi9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYwpAQCAtNTU0LDEzICs1NTQsMTggQEAKIAkJX19mdW5jX18sIG5mbF91dGlsLCBmbC0+bnVtX2ZoLCBmbC0+Zmlyc3Rfc3RyaXBlX2luZGV4LAogCQlmbC0+cGF0dGVybl9vZmZzZXQpOwogCi0JaWYgKCFmbC0+bnVtX2ZoKQorCS8qIE5vdGUgdGhhdCBhIHplcm8gdmFsdWUgZm9yIG51bV9maCBpcyBsZWdhbCBmb3IgU1RSSVBFX1NQQVJTRS4KKwkgKiBGdXRoZXIgY2hlY2tpbmcgaXMgZG9uZSBpbiBmaWxlbGF5b3V0X2NoZWNrX2xheW91dCAqLworCWlmIChmbC0+bnVtX2ZoIDwgMCB8fCBmbC0+bnVtX2ZoID4KKwkgICAgbWF4KE5GUzRfUE5GU19NQVhfU1RSSVBFX0NOVCwgTkZTNF9QTkZTX01BWF9NVUxUSV9DTlQpKQogCQlnb3RvIG91dF9lcnI7CiAKLQlmbC0+ZmhfYXJyYXkgPSBremFsbG9jKGZsLT5udW1fZmggKiBzaXplb2Yoc3RydWN0IG5mc19maCAqKSwKLQkJCSAgICAgICBnZnBfZmxhZ3MpOwotCWlmICghZmwtPmZoX2FycmF5KQotCQlnb3RvIG91dF9lcnI7CisJaWYgKGZsLT5udW1fZmggPiAwKSB7CisJCWZsLT5maF9hcnJheSA9IGt6YWxsb2MoZmwtPm51bV9maCAqIHNpemVvZihzdHJ1Y3QgbmZzX2ZoICopLAorCQkJCSAgICAgICBnZnBfZmxhZ3MpOworCQlpZiAoIWZsLT5maF9hcnJheSkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmwtPm51bV9maDsgaSsrKSB7CiAJCS8qIERvIHdlIHdhbnQgdG8gdXNlIGEgbWVtcG9vbCBoZXJlPyAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBjZjFiMzM5Li5kMzQ4MzI2YSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTI2Nyw5ICsyNjcsMTEgQEAKIAkJCQlicmVhazsKIAkJCW5mczRfc2NoZWR1bGVfc3RhdGVpZF9yZWNvdmVyeShzZXJ2ZXIsIHN0YXRlKTsKIAkJCWdvdG8gd2FpdF9vbl9yZWNvdmVyeTsKKwkJY2FzZSAtTkZTNEVSUl9FWFBJUkVEOgorCQkJaWYgKHN0YXRlICE9IE5VTEwpCisJCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZWlkX3JlY292ZXJ5KHNlcnZlciwgc3RhdGUpOwogCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CiAJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6Ci0JCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKIAkJCW5mczRfc2NoZWR1bGVfbGVhc2VfcmVjb3ZlcnkoY2xwKTsKIAkJCWdvdG8gd2FpdF9vbl9yZWNvdmVyeTsKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKQEAgLTIyNjMsMTIgKzIyNjUsMTQgQEAKIAlyZXR1cm4gbmZzNF9tYXBfZXJyb3JzKHN0YXR1cyk7CiB9CiAKK3N0YXRpYyB2b2lkIG5mc19maXh1cF9yZWZlcnJhbF9hdHRyaWJ1dGVzKHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKTsKIC8qCiAgKiBHZXQgbG9jYXRpb25zIGFuZCAobWF5YmUpIG90aGVyIGF0dHJpYnV0ZXMgb2YgYSByZWZlcnJhbC4KICAqIE5vdGUgdGhhdCB3ZSdsbCBhY3R1YWxseSBmb2xsb3cgdGhlIHJlZmVycmFsIGxhdGVyIHdoZW4KICAqIHdlIGRldGVjdCBmc2lkIG1pc21hdGNoIGluIGlub2RlIHJldmFsaWRhdGlvbgogICovCi1zdGF0aWMgaW50IG5mczRfZ2V0X3JlZmVycmFsKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCitzdGF0aWMgaW50IG5mczRfZ2V0X3JlZmVycmFsKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJCSAgICAgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJaW50IHN0YXR1cyA9IC1FTk9NRU07CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwpAQCAtMjI4NiwxNSArMjI5MCwxNiBAQAogCQlnb3RvIG91dDsKIAkvKiBNYWtlIHN1cmUgc2VydmVyIHJldHVybmVkIGEgZGlmZmVyZW50IGZzaWQgZm9yIHRoZSByZWZlcnJhbCAqLwogCWlmIChuZnNfZnNpZF9lcXVhbCgmTkZTX1NFUlZFUihkaXIpLT5mc2lkLCAmbG9jYXRpb25zLT5mYXR0ci5mc2lkKSkgewotCQlkcHJpbnRrKCIlczogc2VydmVyIGRpZCBub3QgcmV0dXJuIGEgZGlmZmVyZW50IGZzaWQgZm9yIGEgcmVmZXJyYWwgYXQgJXNcbiIsIF9fZnVuY19fLCBuYW1lLT5uYW1lKTsKKwkJZHByaW50aygiJXM6IHNlcnZlciBkaWQgbm90IHJldHVybiBhIGRpZmZlcmVudCBmc2lkIGZvciIKKwkJCSIgYSByZWZlcnJhbCBhdCAlc1xuIiwgX19mdW5jX18sIG5hbWUtPm5hbWUpOwogCQlzdGF0dXMgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9CisJLyogRml4dXAgYXR0cmlidXRlcyBmb3IgdGhlIG5mc19sb29rdXAoKSBjYWxsIHRvIG5mc19maGdldCgpICovCisJbmZzX2ZpeHVwX3JlZmVycmFsX2F0dHJpYnV0ZXMoJmxvY2F0aW9ucy0+ZmF0dHIpOwogCisJLyogcmVwbGFjZSB0aGUgbG9va3VwIG5mc19mYXR0ciB3aXRoIHRoZSBsb2NhdGlvbnMgbmZzX2ZhdHRyICovCiAJbWVtY3B5KGZhdHRyLCAmbG9jYXRpb25zLT5mYXR0ciwgc2l6ZW9mKHN0cnVjdCBuZnNfZmF0dHIpKTsKLQlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUw7Ci0JaWYgKCFmYXR0ci0+bW9kZSkKLQkJZmF0dHItPm1vZGUgPSBTX0lGRElSOwogCW1lbXNldChmaGFuZGxlLCAwLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOwogb3V0OgogCWlmIChwYWdlKQpAQCAtMzY3MCw5ICszNjc1LDExIEBACiAJCQkJYnJlYWs7CiAJCQluZnM0X3NjaGVkdWxlX3N0YXRlaWRfcmVjb3Zlcnkoc2VydmVyLCBzdGF0ZSk7CiAJCQlnb3RvIHdhaXRfb25fcmVjb3Zlcnk7CisJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCWlmIChzdGF0ZSAhPSBOVUxMKQorCQkJCW5mczRfc2NoZWR1bGVfc3RhdGVpZF9yZWNvdmVyeShzZXJ2ZXIsIHN0YXRlKTsKIAkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgogCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgotCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CiAJCQluZnM0X3NjaGVkdWxlX2xlYXNlX3JlY292ZXJ5KGNscCk7CiAJCQlnb3RvIHdhaXRfb25fcmVjb3Zlcnk7CiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCkBAIC00NTQzLDYgKzQ1NTAsNyBAQAogCQkJY2FzZSAtRVNUQUxFOgogCQkJCWdvdG8gb3V0OwogCQkJY2FzZSAtTkZTNEVSUl9FWFBJUkVEOgorCQkJCW5mczRfc2NoZWR1bGVfc3RhdGVpZF9yZWNvdmVyeShzZXJ2ZXIsIHN0YXRlKTsKIAkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CiAJCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CiAJCQkJbmZzNF9zY2hlZHVsZV9sZWFzZV9yZWNvdmVyeShzZXJ2ZXItPm5mc19jbGllbnQpOwpAQCAtNDY1MiwxMSArNDY2MCwxNSBAQAogCXJldHVybiBsZW47CiB9CiAKKy8qCisgKiBuZnNfZmhnZXQgd2lsbCB1c2UgZWl0aGVyIHRoZSBtb3VudGVkX29uX2ZpbGVpZCBvciB0aGUgZmlsZWlkCisgKi8KIHN0YXRpYyB2b2lkIG5mc19maXh1cF9yZWZlcnJhbF9hdHRyaWJ1dGVzKHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewotCWlmICghKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9GSUxFSUQpICYmCi0JCShmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9GU0lEKSAmJgotCQkoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpKSkKKwlpZiAoISgoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX01PVU5URURfT05fRklMRUlEKSB8fAorCSAgICAgICAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKSkgJiYKKwkgICAgICAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRlNJRCkgJiYKKwkgICAgICAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpKSkKIAkJcmV0dXJuOwogCiAJZmF0dHItPnZhbGlkIHw9IE5GU19BVFRSX0ZBVFRSX1RZUEUgfCBORlNfQVRUUl9GQVRUUl9NT0RFIHwKQEAgLTQ2NzEsNyArNDY4Myw2IEBACiAJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKIAl1MzIgYml0bWFza1syXSA9IHsKIAkJWzBdID0gRkFUVFI0X1dPUkQwX0ZTSUQgfCBGQVRUUjRfV09SRDBfRlNfTE9DQVRJT05TLAotCQlbMV0gPSBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQsCiAJfTsKIAlzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnNfYXJnIGFyZ3MgPSB7CiAJCS5kaXJfZmggPSBORlNfRkgoZGlyKSwKQEAgLTQ2OTAsMTEgKzQ3MDEsMTggQEAKIAlpbnQgc3RhdHVzOwogCiAJZHByaW50aygiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBBc2sgZm9yIHRoZSBmaWxlaWQgb2YgdGhlIGFic2VudCBmaWxlc3lzdGVtIGlmIG1vdW50ZWRfb25fZmlsZWlkCisJICogaXMgbm90IHN1cHBvcnRlZCAqLworCWlmIChORlNfU0VSVkVSKGRpciktPmF0dHJfYml0bWFza1sxXSAmIEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCkKKwkJYml0bWFza1sxXSB8PSBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQ7CisJZWxzZQorCQliaXRtYXNrWzBdIHw9IEZBVFRSNF9XT1JEMF9GSUxFSUQ7CisKIAluZnNfZmF0dHJfaW5pdCgmZnNfbG9jYXRpb25zLT5mYXR0cik7CiAJZnNfbG9jYXRpb25zLT5zZXJ2ZXIgPSBzZXJ2ZXI7CiAJZnNfbG9jYXRpb25zLT5ubG9jYXRpb25zID0gMDsKIAlzdGF0dXMgPSBuZnM0X2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgc2VydmVyLCAmbXNnLCAmYXJncy5zZXFfYXJncywgJnJlcy5zZXFfcmVzLCAwKTsKLQluZnNfZml4dXBfcmVmZXJyYWxfYXR0cmlidXRlcygmZnNfbG9jYXRpb25zLT5mYXR0cik7CiAJZHByaW50aygiJXM6IHJldHVybmVkIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRzdGF0ZS5jIGIvZnMvbmZzL25mczRzdGF0ZS5jCmluZGV4IDAzNmY1YWQuLmU5N2RkMjEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0c3RhdGUuYworKysgYi9mcy9uZnMvbmZzNHN0YXRlLmMKQEAgLTE0NjYsNyArMTQ2NiwxMCBAQAogI2lmZGVmIENPTkZJR19ORlNfVjRfMQogdm9pZCBuZnM0X3NjaGVkdWxlX3Nlc3Npb25fcmVjb3Zlcnkoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKLQluZnM0X3NjaGVkdWxlX2xlYXNlX3JlY292ZXJ5KHNlc3Npb24tPmNscCk7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlc3Npb24tPmNscDsKKworCXNldF9iaXQoTkZTNENMTlRfU0VTU0lPTl9SRVNFVCwgJmNscC0+Y2xfc3RhdGUpOworCW5mczRfc2NoZWR1bGVfbGVhc2VfcmVjb3ZlcnkoY2xwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mczRfc2NoZWR1bGVfc2Vzc2lvbl9yZWNvdmVyeSk7CiAKQEAgLTE1NDksNiArMTU1Miw3IEBACiAJCXN0YXR1cyA9IG5mczRfcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKGNscCwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQorCWNsZWFyX2JpdChORlM0Q0xOVF9TRVNTSU9OX1JFU0VULCAmY2xwLT5jbF9zdGF0ZSk7CiAJLyogY3JlYXRlX3Nlc3Npb24gbmVnb3RpYXRlZCBuZXcgc2xvdCB0YWJsZSAqLwogCWNsZWFyX2JpdChORlM0Q0xOVF9SRUNBTExfU0xPVCwgJmNscC0+Y2xfc3RhdGUpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCBjM2NjZDJjLi5hNThiZDU2IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTkxLDcgKzkxLDcgQEAKICNkZWZpbmUgZW5jb2RlX2dldGZoX21heHN6ICAgICAgKG9wX2VuY29kZV9oZHJfbWF4c3opCiAjZGVmaW5lIGRlY29kZV9nZXRmaF9tYXhzeiAgICAgIChvcF9kZWNvZGVfaGRyX21heHN6ICsgMSArIFwKIAkJCQkoKDMrTkZTNF9GSFNJWkUpID4+IDIpKQotI2RlZmluZSBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiAzCisjZGVmaW5lIG5mczRfZmF0dHJfYml0bWFwX21heHN6IDQKICNkZWZpbmUgZW5jb2RlX2dldGF0dHJfbWF4c3ogICAgKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeikKICNkZWZpbmUgbmZzNF9uYW1lX21heHN6CQkoMSArICgoMyArIE5GUzRfTUFYTkFNTEVOKSA+PiAyKSkKICNkZWZpbmUgbmZzNF9wYXRoX21heHN6CQkoMSArICgoMyArIE5GUzRfTUFYUEFUSExFTikgPj4gMikpCkBAIC0zMDMwLDcgKzMwMzAsNyBAQAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9hdHRyX2Vycm9yKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXApCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX2Vycm9yKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIGludDMyX3QgKnJlcykKIHsKIAlfX2JlMzIgKnA7CiAKQEAgLTMwNDEsNyArMzA0MSw3IEBACiAJCWlmICh1bmxpa2VseSghcCkpCiAJCQlnb3RvIG91dF9vdmVyZmxvdzsKIAkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfUkRBVFRSX0VSUk9SOwotCQlyZXR1cm4gLWJlMzJfdG9fY3B1cChwKTsKKwkJKnJlcyA9IC1iZTMyX3RvX2NwdXAocCk7CiAJfQogCXJldHVybiAwOwogb3V0X292ZXJmbG93OgpAQCAtNDAwMiw2ICs0MDAyLDcgQEAKIAlpbnQgc3RhdHVzOwogCXVtb2RlX3QgZm1vZGUgPSAwOwogCXVpbnQzMl90IHR5cGU7CisJaW50MzJfdCBlcnI7CiAKIAlzdGF0dXMgPSBkZWNvZGVfYXR0cl90eXBlKHhkciwgYml0bWFwLCAmdHlwZSk7CiAJaWYgKHN0YXR1cyA8IDApCkBAIC00MDI3LDEzICs0MDI4LDEyIEBACiAJCWdvdG8geGRyX2Vycm9yOwogCWZhdHRyLT52YWxpZCB8PSBzdGF0dXM7CiAKLQlzdGF0dXMgPSBkZWNvZGVfYXR0cl9lcnJvcih4ZHIsIGJpdG1hcCk7Ci0JaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9XUk9OR1NFQykgewotCQluZnNfZml4dXBfc2VjaW5mb19hdHRyaWJ1dGVzKGZhdHRyLCBmaCk7Ci0JCXN0YXR1cyA9IDA7Ci0JfQorCWVyciA9IDA7CisJc3RhdHVzID0gZGVjb2RlX2F0dHJfZXJyb3IoeGRyLCBiaXRtYXAsICZlcnIpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoZXJyID09IC1ORlM0RVJSX1dST05HU0VDKQorCQluZnNfZml4dXBfc2VjaW5mb19hdHRyaWJ1dGVzKGZhdHRyLCBmaCk7CiAKIAlzdGF0dXMgPSBkZWNvZGVfYXR0cl9maWxlaGFuZGxlKHhkciwgYml0bWFwLCBmaCk7CiAJaWYgKHN0YXR1cyA8IDApCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5jIGIvZnMvbmZzL3BuZnMuYwppbmRleCBmNTdmNTI4Li4xMDFjODVhIDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5jCisrKyBiL2ZzL25mcy9wbmZzLmMKQEAgLTEwMDksNyArMTAwOSw3IEBACiBwbmZzX3NldF9sYXlvdXRjb21taXQoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0kod2RhdGEtPmlub2RlKTsKLQlsb2ZmX3QgZW5kX3BvcyA9IHdkYXRhLT5hcmdzLm9mZnNldCArIHdkYXRhLT5yZXMuY291bnQ7CisJbG9mZl90IGVuZF9wb3MgPSB3ZGF0YS0+bWRzX29mZnNldCArIHdkYXRhLT5yZXMuY291bnQ7CiAJYm9vbCBtYXJrX2FzX2RpcnR5ID0gZmFsc2U7CiAKIAlzcGluX2xvY2soJm5mc2ktPnZmc19pbm9kZS5pX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9LY29uZmlnIGIvZnMvbmZzZC9LY29uZmlnCmluZGV4IDE4YjNlODkuLmZiYjJhNWUgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvS2NvbmZpZworKysgYi9mcy9uZnNkL0tjb25maWcKQEAgLTgyLDYgKzgyLDcgQEAKIAlzZWxlY3QgTkZTRF9WMwogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAlzZWxlY3QgU1VOUlBDX0dTUworCXNlbGVjdCBDUllQVE8KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4geW91ciBzeXN0ZW0ncyBORlMgc2VydmVyIGZvcgogCSAgdmVyc2lvbiA0IG9mIHRoZSBORlMgcHJvdG9jb2wgKFJGQyAzNTMwKS4KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDFmNWVhZTQuLjJiMTQ0OWQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oPgogCiAjaW5jbHVkZSAiaWRtYXAuaCIKICNpbmNsdWRlICJuZnNkLmgiCkBAIC0xODksMTggKzE5MCwxMCBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi0jaWZkZWYgQ09ORklHX1NVTlJQQ19HU1MKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTKSB8fCBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTX01PRFVMRSkKIHN0YXRpYyBpbnQgc3VwcG9ydGVkX2VuY3R5cGVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCBnc3NfYXBpX21lY2ggKms1bWVjaDsKLQotCWs1bWVjaCA9IGdzc19tZWNoX2dldF9ieV9uYW1lKCJrcmI1Iik7Ci0JaWYgKGs1bWVjaCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQlpZiAoazVtZWNoLT5nbV91cGNhbGxfZW5jdHlwZXMgIT0gTlVMTCkKLQkJc2VxX3ByaW50ZihtLCBrNW1lY2gtPmdtX3VwY2FsbF9lbmN0eXBlcyk7Ci0JZ3NzX21lY2hfcHV0KGs1bWVjaCk7Ci1vdXQ6CisJc2VxX3ByaW50ZihtLCBLUkI1X1NVUFBPUlRFRF9FTkNUWVBFUyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNSw3ICsyMDgsNyBAQAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwotI2VuZGlmIC8qIENPTkZJR19TVU5SUENfR1NTICovCisjZW5kaWYgLyogQ09ORklHX1NVTlJQQ19HU1Mgb3IgQ09ORklHX1NVTlJQQ19HU1NfTU9EVUxFICovCiAKIGV4dGVybiBpbnQgbmZzZF9wb29sX3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogZXh0ZXJuIGludCBuZnNkX3Bvb2xfc3RhdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0xNDI3LDkgKzE0MjAsOSBAQAogCQlbTkZTRF9WZXJzaW9uc10gPSB7InZlcnNpb25zIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKIAkJW05GU0RfUG9ydHNdID0geyJwb3J0bGlzdCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVHT30sCiAJCVtORlNEX01heEJsa1NpemVdID0geyJtYXhfYmxvY2tfc2l6ZSIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVHT30sCi0jaWZkZWYgQ09ORklHX1NVTlJQQ19HU1MKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTKSB8fCBkZWZpbmVkKENPTkZJR19TVU5SUENfR1NTX01PRFVMRSkKIAkJW05GU0RfU3VwcG9ydGVkRW5jdHlwZXNdID0geyJzdXBwb3J0ZWRfa3JiNV9lbmN0eXBlcyIsICZzdXBwb3J0ZWRfZW5jdHlwZXNfb3BzLCBTX0lSVUdPfSwKLSNlbmRpZiAvKiBDT05GSUdfU1VOUlBDX0dTUyAqLworI2VuZGlmIC8qIENPTkZJR19TVU5SUENfR1NTIG9yIENPTkZJR19TVU5SUENfR1NTX01PRFVMRSAqLwogI2lmZGVmIENPTkZJR19ORlNEX1Y0CiAJCVtORlNEX0xlYXNldGltZV0gPSB7Im5mc3Y0bGVhc2V0aW1lIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKIAkJW05GU0RfR3JhY2V0aW1lXSA9IHsibmZzdjRncmFjZXRpbWUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LApkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggMTI5ZjNjOS4uZDgwYjJkOCAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC02OTksNyArNjk5LDE1IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KIAorc3RhdGljIGludCBuZnNkX29wZW5fYnJlYWtfbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGFjY2VzcykKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZTsKIAorCWlmIChhY2Nlc3MgJiBORlNEX01BWV9OT1RfQlJFQUtfTEVBU0UpCisJCXJldHVybiAwOworCW1vZGUgPSAoYWNjZXNzICYgTkZTRF9NQVlfV1JJVEUpID8gT19XUk9OTFkgOiBPX1JET05MWTsKKwlyZXR1cm4gYnJlYWtfbGVhc2UoaW5vZGUsIG1vZGUgfCBPX05PTkJMT0NLKTsKK30KIAogLyoKICAqIE9wZW4gYW4gZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkuCkBAIC03NDcsMTIgKzc1NSw3IEBACiAJaWYgKCFpbm9kZS0+aV9mb3ApCiAJCWdvdG8gb3V0OwogCi0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWFzZXMgb24gdGhpcyBmaWxlLgotCSAqIFRoaXMgbWF5IGJsb2NrIHdoaWxlIGxlYXNlcyBhcmUgYnJva2VuLgotCSAqLwotCWlmICghKGFjY2VzcyAmIE5GU0RfTUFZX05PVF9CUkVBS19MRUFTRSkpCi0JCWhvc3RfZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIE9fTk9OQkxPQ0sgfCAoKGFjY2VzcyAmIE5GU0RfTUFZX1dSSVRFKSA/IE9fV1JPTkxZIDogMCkpOworCWhvc3RfZXJyID0gbmZzZF9vcGVuX2JyZWFrX2xlYXNlKGlub2RlLCBhY2Nlc3MpOwogCWlmIChob3N0X2VycikgLyogTk9NRU0gb3IgV09VTERCTE9DSyAqLwogCQlnb3RvIG91dF9uZnNlcnI7CiAKQEAgLTE2NTMsOCArMTY1NiwxMCBAQAogCWlmICghZG9sZC0+ZF9pbm9kZSkKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKIAlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2UoZG9sZC0+ZF9pbm9kZSk7Ci0JaWYgKGhvc3RfZXJyKQorCWlmIChob3N0X2VycikgeworCQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CisJfQogCWhvc3RfZXJyID0gdmZzX2xpbmsoZG9sZCwgZGlycCwgZG5ldyk7CiAJaWYgKCFob3N0X2VycikgewogCQllcnIgPSBuZnNlcnJubyhjb21taXRfbWV0YWRhdGEoZmZocCkpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9lZmkuYyBiL2ZzL3BhcnRpdGlvbnMvZWZpLmMKaW5kZXggMTlkNjc1MC4uNjI5NmI0MCAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9lZmkuYworKysgYi9mcy9wYXJ0aXRpb25zL2VmaS5jCkBAIC0zMTAsNiArMzEwLDE1IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwkvKiBDaGVjayB0aGUgR1VJRCBQYXJ0aXRpb24gVGFibGUgaGVhZGVyIHNpemUgKi8KKwlpZiAobGUzMl90b19jcHUoKCpncHQpLT5oZWFkZXJfc2l6ZSkgPgorCQkJYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc3RhdGUtPmJkZXYpKSB7CisJCXByX2RlYnVnKCJHVUlEIFBhcnRpdGlvbiBUYWJsZSBIZWFkZXIgc2l6ZSBpcyB3cm9uZzogJXUgPiAldVxuIiwKKwkJCWxlMzJfdG9fY3B1KCgqZ3B0KS0+aGVhZGVyX3NpemUpLAorCQkJYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc3RhdGUtPmJkZXYpKTsKKwkJZ290byBmYWlsOworCX0KKwogCS8qIENoZWNrIHRoZSBHVUlEIFBhcnRpdGlvbiBUYWJsZSBDUkMgKi8KIAlvcmlnY3JjID0gbGUzMl90b19jcHUoKCpncHQpLT5oZWFkZXJfY3JjMzIpOwogCSgqZ3B0KS0+aGVhZGVyX2NyYzMyID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCmluZGV4IGNlNGY2MjQuLmEyOWQ1Y2MgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtMTMzNSw2ICsxMzM1LDExIEBACiAKIAlsaXN0X2FkZF90YWlsICgmZi0+bGlzdCwgZnJhZ3MpOwogZm91bmQ6CisJaWYgKHJlYyA+PSBmLT5udW0pIHsKKwkJbGRtX2Vycm9yKCJSRUMgdmFsdWUgKCVkKSBleGNlZWRzIE5VTSB2YWx1ZSAoJWQpIiwgcmVjLCBmLT5udW0pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJaWYgKGYtPm1hcCAmICgxIDw8IHJlYykpIHsKIAkJbGRtX2Vycm9yICgiRHVwbGljYXRlIFZCTEssIHBhcnQgJWQuIiwgcmVjKTsKIAkJZi0+bWFwICY9IDB4N0Y7CQkJLyogTWFyayB0aGUgZ3JvdXAgYXMgYnJva2VuICovCmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IGZlOTMyMmYuLjU0ODczZjAgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC04ODgsNiArODg4LDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBtZW1fd3JpdGUgTlVMTAorCisjaWZuZGVmIG1lbV93cml0ZQorLyogVGhpcyBpcyBhIHNlY3VyaXR5IGhhemFyZCAqLwogc3RhdGljIHNzaXplX3QgbWVtX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTk0NCw2ICs5NDgsNyBAQAogb3V0X25vX3Rhc2s6CiAJcmV0dXJuIGNvcGllZDsKIH0KKyNlbmRpZgogCiBsb2ZmX3QgbWVtX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKIHsKQEAgLTI4MDIsNiArMjgwNyw5IEBACiAJc3RydWN0IHRhc2tfaW9fYWNjb3VudGluZyBhY2N0ID0gdGFzay0+aW9hYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKIAlpZiAod2hvbGUgJiYgbG9ja190YXNrX3NpZ2hhbmQodGFzaywgJmZsYWdzKSkgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQgPSB0YXNrOwogCkBAIC0yOTMyLDcgKzI5NDAsNyBAQAogCVJFRygiY29yZWR1bXBfZmlsdGVyIiwgU19JUlVHT3xTX0lXVVNSLCBwcm9jX2NvcmVkdW1wX2ZpbHRlcl9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkcKLQlJTkYoImlvIiwJU19JUlVHTywgcHJvY190Z2lkX2lvX2FjY291bnRpbmcpLAorCUlORigiaW8iLAlTX0lSVVNSLCBwcm9jX3RnaWRfaW9fYWNjb3VudGluZyksCiAjZW5kaWYKIH07CiAKQEAgLTMyNzAsNyArMzI3OCw3IEBACiAJUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfZmF1bHRfaW5qZWN0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RpZF9pb19hY2NvdW50aW5nKSwKKwlJTkYoImlvIiwJU19JUlVTUiwgcHJvY190aWRfaW9fYWNjb3VudGluZyksCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2pvdXJuYWwuYyBiL2ZzL3ViaWZzL2pvdXJuYWwuYwppbmRleCBhZWQyNWU4Li5lNWNiMmNlIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9qb3VybmFsLmMKKysrIGIvZnMvdWJpZnMvam91cm5hbC5jCkBAIC02NjYsNiArNjY2LDcgQEAKIAogb3V0X3JlbGVhc2U6CiAJcmVsZWFzZV9oZWFkKGMsIEJBU0VIRCk7CisJa2ZyZWUoZGVudCk7CiBvdXRfcm86CiAJdWJpZnNfcm9fbW9kZShjLCBlcnIpOwogCWlmIChsYXN0X3JlZmVyZW5jZSkKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3NiLmMgYi9mcy91Ymlmcy9zYi5jCmluZGV4IGJmMzFiNDcuLmNhZDYwYjUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3NiLmMKKysrIGIvZnMvdWJpZnMvc2IuYwpAQCAtNDc1LDcgKzQ3NSw4IEBACiAgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3VwZXJibG9jayBub2RlIG9yIGEgbmVnYXRpdmUgZXJyb3IKLSAqIGNvZGUuCisgKiBjb2RlLiBOb3RlLCB0aGUgdXNlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIG9mIGtmcmVlKCknaW5nIHRoZQorICogcmV0dXJuZWQgc3VwZXJibG9jayBidWZmZXIuCiAgKi8KIHN0cnVjdCB1Ymlmc19zYl9ub2RlICp1Ymlmc19yZWFkX3NiX25vZGUoc3RydWN0IHViaWZzX2luZm8gKmMpCiB7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zaHJpbmtlci5jIGIvZnMvdWJpZnMvc2hyaW5rZXIuYwppbmRleCA0Njk2MWMwLi5kOGY1ZDBmIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zaHJpbmtlci5jCisrKyBiL2ZzL3ViaWZzL3Nocmlua2VyLmMKQEAgLTI4Myw3ICsyODMsMTEgQEAKIAlsb25nIGNsZWFuX3puX2NudCA9IGF0b21pY19sb25nX3JlYWQoJnViaWZzX2NsZWFuX3puX2NudCk7CiAKIAlpZiAobnIgPT0gMCkKLQkJcmV0dXJuIGNsZWFuX3puX2NudDsKKwkJLyoKKwkJICogRHVlIHRvIHRoZSB3YXkgVUJJRlMgdXBkYXRlcyB0aGUgY2xlYW4gem5vZGUgY291bnRlciBpdCBtYXkKKwkJICogdGVtcG9yYXJpbHkgYmUgbmVnYXRpdmUuCisJCSAqLworCQlyZXR1cm4gY2xlYW5fem5fY250ID49IDAgPyBjbGVhbl96bl9jbnQgOiAxOwogCiAJaWYgKCFjbGVhbl96bl9jbnQpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IDA0YWQwN2YuLjMyOGU2ZmMgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtMTU4NCw2ICsxNTg0LDcgQEAKIAkJfQogCQlzdXAtPmxlYl9jbnQgPSBjcHVfdG9fbGUzMihjLT5sZWJfY250KTsKIAkJZXJyID0gdWJpZnNfd3JpdGVfc2Jfbm9kZShjLCBzdXApOworCQlrZnJlZShzdXApOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL3hmc19hbGxvYy5jCmluZGV4IDI3ZDY0ZDcuLmE4OTJlZDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2FsbG9jLmMKQEAgLTI2MTAsNiArMjYxMCwxMiBAQAogCQkJCQluZXctPmJubyArIG5ldy0+bGVuZ3RoKSAtCiAJCQkJbWluKGJ1c3lwLT5ibm8sIG5ldy0+Ym5vKTsKIAkJbmV3LT5ibm8gPSBtaW4oYnVzeXAtPmJubywgbmV3LT5ibm8pOworCQkvKgorCQkgKiBTdGFydCB0aGUgc2VhcmNoIG92ZXIgZnJvbSB0aGUgdHJlZSByb290LCBiZWNhdXNlCisJCSAqIGVyYXNpbmcgdGhlIG5vZGUgY2FuIHJlYXJyYW5nZSB0aGUgdHJlZSB0b3BvbG9neS4KKwkJICovCisJCXNwaW5fdW5sb2NrKCZwYWctPnBhZ2JfbG9jayk7CisJCWdvdG8gcmVzdGFydDsKIAl9IGVsc2UKIAkJYnVzeXAgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCBlNWEzZjU4Li5kZmIwZWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKQEAgLTE2Miw5ICsxNjIsNiBAQAogCXVubGlrZWx5KF9fcmV0X3dhcm5fb25jZSk7CQkJCVwKIH0pCiAKLSNkZWZpbmUgV0FSTl9PTl9SQVRFTElNSVQoY29uZGl0aW9uLCBzdGF0ZSkJCQlcCi0JCVdBUk5fT04oKGNvbmRpdGlvbikgJiYgX19yYXRlbGltaXQoc3RhdGUpKQotCiAvKgogICogV0FSTl9PTl9TTVAoKSBpcyBmb3IgY2FzZXMgdGhhdCB0aGUgd2FybmluZyBpcyBlaXRoZXIKICAqIG1lYW5pbmdsZXNzIGZvciAhU01QIG9yIG1heSBldmVuIGNhdXNlIGZhaWx1cmVzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oIGIvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCmluZGV4IGYwNGIyYTMuLjA2Y2Q1MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKQEAgLTE4Miw2ICsxODIsNyBAQAogCXsweDEwMDIsIDB4Njc1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzU5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc1RiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXApAQCAtMTkyLDYgKzE5Myw3IEBACiAJezB4MTAwMiwgMHg2NzY3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2Nzc4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njg4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DWVBSRVNTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ODgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ1lQUkVTU3xSQURFT05fTkVXX01FTU1BUH0sIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW5kcm9pZF9haWQuaCBiL2luY2x1ZGUvbGludXgvYW5kcm9pZF9haWQuaAppbmRleCA3ZjE2YTE0Yy4uMGY5MDRiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbmRyb2lkX2FpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW5kcm9pZF9haWQuaApAQCAtMjIsNSArMjIsNyBAQAogI2RlZmluZSBBSURfSU5FVCAgICAgICAgIDMwMDMKICNkZWZpbmUgQUlEX05FVF9SQVcgICAgICAzMDA0CiAjZGVmaW5lIEFJRF9ORVRfQURNSU4gICAgMzAwNQorI2RlZmluZSBBSURfTkVUX0JXX1NUQVRTIDMwMDYgIC8qIHJlYWQgYmFuZHdpZHRoIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgQUlEX05FVF9CV19BQ0NUICAzMDA3ICAvKiBjaGFuZ2UgYmFuZHdpZHRoIHN0YXRpc3RpY3MgYWNjb3VudGluZyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCmluZGV4IGJlNTBkOWUuLmFjZGIxNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaApAQCAtMTY4LDcgKzE2OCw3IEBACiAJKFJFUV9GQUlMRkFTVF9ERVYgfCBSRVFfRkFJTEZBU1RfVFJBTlNQT1JUIHwgUkVRX0ZBSUxGQVNUX0RSSVZFUikKICNkZWZpbmUgUkVRX0NPTU1PTl9NQVNLIFwKIAkoUkVRX1dSSVRFIHwgUkVRX0ZBSUxGQVNUX01BU0sgfCBSRVFfU1lOQyB8IFJFUV9NRVRBIHwgUkVRX0RJU0NBUkQgfCBcCi0JIFJFUV9OT0lETEUgfCBSRVFfRkxVU0ggfCBSRVFfRlVBKQorCSBSRVFfTk9JRExFIHwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSB8IFJFUV9TRUNVUkUpCiAjZGVmaW5lIFJFUV9DTE9ORV9NQVNLCQlSRVFfQ09NTU9OX01BU0sKIAogI2RlZmluZSBSRVFfUkFIRUFECQkoMSA8PCBfX1JFUV9SQUhFQUQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCAyYWQ5NWZhLi5hZTkwOTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCXVuc2lnbmVkIGNoYXIJCW1pc2FsaWduZWQ7CiAJdW5zaWduZWQgY2hhcgkJZGlzY2FyZF9taXNhbGlnbmVkOwogCXVuc2lnbmVkIGNoYXIJCWNsdXN0ZXI7Ci0Jc2lnbmVkIGNoYXIJCWRpc2NhcmRfemVyb2VzX2RhdGE7CisJdW5zaWduZWQgY2hhcgkJZGlzY2FyZF96ZXJvZXNfZGF0YTsKIH07CiAKIHN0cnVjdCByZXF1ZXN0X3F1ZXVlCkBAIC0zNjQsNiArMzY0LDggQEAKIAkgKiBmb3IgZmx1c2ggb3BlcmF0aW9ucwogCSAqLwogCXVuc2lnbmVkIGludAkJZmx1c2hfZmxhZ3M7CisJdW5zaWduZWQgaW50CQlmbHVzaF9ub3RfcXVldWVhYmxlOjE7CisJdW5zaWduZWQgaW50CQlmbHVzaF9xdWV1ZV9kZWxheWVkOjE7CiAJdW5zaWduZWQgaW50CQlmbHVzaF9wZW5kaW5nX2lkeDoxOwogCXVuc2lnbmVkIGludAkJZmx1c2hfcnVubmluZ19pZHg6MTsKIAl1bnNpZ25lZCBsb25nCQlmbHVzaF9wZW5kaW5nX3NpbmNlOwpAQCAtODQzLDYgKzg0NSw3IEBACiBleHRlcm4gdm9pZCBibGtfcXVldWVfcnFfdGltZWRfb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHJxX3RpbWVkX291dF9mbiAqKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9ycV90aW1lb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBmbHVzaCk7CitleHRlcm4gdm9pZCBibGtfcXVldWVfZmx1c2hfcXVldWVhYmxlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBib29sIHF1ZXVlYWJsZSk7CiBleHRlcm4gc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJsa19nZXRfYmFja2luZ19kZXZfaW5mbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKIAogZXh0ZXJuIGludCBibGtfcnFfbWFwX3NnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqKTsKQEAgLTEwNjYsMTMgKzEwNjksMTYgQEAKIHsKIAl1bnNpZ25lZCBpbnQgYWxpZ25tZW50ID0gKHNlY3RvciA8PCA5KSAmIChsaW0tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgLSAxKTsKIAorCWlmICghbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiAobGltLT5kaXNjYXJkX2dyYW51bGFyaXR5ICsgbGltLT5kaXNjYXJkX2FsaWdubWVudCAtIGFsaWdubWVudCkKIAkJJiAobGltLT5kaXNjYXJkX2dyYW51bGFyaXR5IC0gMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHF1ZXVlX2Rpc2NhcmRfemVyb2VzX2RhdGEoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7Ci0JaWYgKHEtPmxpbWl0cy5kaXNjYXJkX3plcm9lc19kYXRhID09IDEpCisJaWYgKHEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzICYmIHEtPmxpbWl0cy5kaXNjYXJkX3plcm9lc19kYXRhID09IDEpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CkBAIC0xMTExLDYgKzExMTcsMTEgQEAKIAlyZXR1cm4gYmRldi0+YmRfYmxvY2tfc2l6ZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHF1ZXVlX2ZsdXNoX3F1ZXVlYWJsZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gIXEtPmZsdXNoX25vdF9xdWV1ZWFibGU7Cit9CisKIHR5cGVkZWYgc3RydWN0IHtzdHJ1Y3QgcGFnZSAqdjt9IFNlY3RvcjsKIAogdW5zaWduZWQgY2hhciAqcmVhZF9kZXZfc2VjdG9yKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc2VjdG9yX3QsIFNlY3RvciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaCBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAppbmRleCBjMzdiMjFhLi4yNGUyOTMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCkBAIC0xOTIsNiArMTkyLDcgQEAKICNpZmRlZiBDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKIAkvKiBXYXRjaGRvZyByZWxhdGVkIGRhdGEsIHVzZWQgYnkgdGhlIGZyYW1ld29yayAqLwogCXN0cnVjdCBsaXN0X2hlYWQgd2RfbGlzdDsKKwljeWNsZV90IGNzX2xhc3Q7CiAJY3ljbGVfdCB3ZF9sYXN0OwogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaCBiL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKaW5kZXggN2M2MGQwOS4uZjY5NmJjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIENOX1ZBTF9EUkJECQkJMHgxCiAjZGVmaW5lIENOX0tWUF9JRFgJCQkweDkJLyogSHlwZXJWIEtWUCAqLwogCi0jZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTkKKyNkZWZpbmUgQ05fTkVUTElOS19VU0VSUwkJMTAJLyogSGlnaGVzdCBpbmRleCArIDEgKi8KIAogLyoKICAqIE1heGltdW0gY29ubmVjdG9yJ3MgbWVzc2FnZSBzaXplLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggNWYwOTMyMy4uOTdmMWNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC0xNzQsNCArMTc0LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX25vbmJvb3RfY3B1cyh2b2lkKSB7fQogI2VuZGlmIC8qICFDT05GSUdfUE1fU0xFRVBfU01QICovCiAKKyNkZWZpbmUgSURMRV9TVEFSVCAxCisjZGVmaW5lIElETEVfRU5EIDIKKwordm9pZCBpZGxlX25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbik7Cit2b2lkIGlkbGVfbm90aWZpZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pOwordm9pZCBpZGxlX25vdGlmaWVyX2NhbGxfY2hhaW4odW5zaWduZWQgbG9uZyB2YWwpOworCiAjZW5kaWYgLyogX0xJTlVYX0NQVV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggZDA4Mzk5ZC4uNzc5ZTg2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC01MDYsMTMgKzUwNiwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoIWRldi0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IHRydWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2VfZGlzYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKKwlpZiAoIWRldi0+cG93ZXIuaXNfcHJlcGFyZWQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oCmluZGV4IDdjNGQ3MmYuLjllYzIwZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS5oCkBAIC0yMDQsNiArMjA0LDggQEAKIGV4dGVybiB2b2lkIF9fZnNjYWNoZV93YWl0X29uX3BhZ2Vfd3JpdGUoc3RydWN0IGZzY2FjaGVfY29va2llICosIHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIGJvb2wgX19mc2NhY2hlX21heWJlX3JlbGVhc2VfcGFnZShzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKiwgc3RydWN0IHBhZ2UgKiwKIAkJCQkJIGdmcF90KTsKK2V4dGVybiB2b2lkIF9fZnNjYWNoZV91bmNhY2hlX2FsbF9pbm9kZV9wYWdlcyhzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKiwKKwkJCQkJICAgICAgc3RydWN0IGlub2RlICopOwogCiAvKioKICAqIGZzY2FjaGVfcmVnaXN0ZXJfbmV0ZnMgLSBSZWdpc3RlciBhIGZpbGVzeXN0ZW0gYXMgZGVzaXJpbmcgY2FjaGluZyBzZXJ2aWNlcwpAQCAtNjQzLDQgKzY0NSwyMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorLyoqCisgKiBmc2NhY2hlX3VuY2FjaGVfYWxsX2lub2RlX3BhZ2VzIC0gVW5jYWNoZSBhbGwgYW4gaW5vZGUncyBwYWdlcworICogQGNvb2tpZTogVGhlIGNvb2tpZSByZXByZXNlbnRpbmcgdGhlIGlub2RlJ3MgY2FjaGUgb2JqZWN0LgorICogQGlub2RlOiBUaGUgaW5vZGUgdG8gdW5jYWNoZSBwYWdlcyBmcm9tLgorICoKKyAqIFVuY2FjaGUgYWxsIHRoZSBwYWdlcyBpbiBhbiBpbm9kZSB0aGF0IGFyZSBtYXJrZWQgUEdfZnNjYWNoZSwgYXNzdW1pbmcgdGhlbQorICogdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb29raWUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuICBJdCB3aWxsIHdhaXQgZm9yIHBhZ2VzIHRoYXQgYXJlIGJlaW5nIHdyaXR0ZW4gb3V0CisgKiBhbmQgd2lsbCB3YWl0IHdoaWxzdCB0aGUgUEdfZnNjYWNoZSBtYXJrIGlzIHJlbW92ZWQgYnkgdGhlIGNhY2hlLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIGZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoc3RydWN0IGZzY2FjaGVfY29va2llICpjb29raWUsCisJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChmc2NhY2hlX2Nvb2tpZV92YWxpZChjb29raWUpKQorCQlfX2ZzY2FjaGVfdW5jYWNoZV9hbGxfaW5vZGVfcGFnZXMoY29va2llLCBpbm9kZSk7Cit9CisKICNlbmRpZiAvKiBfTElOVVhfRlNDQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggZDc2NGE0Mi4uMzAwZDc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtMTI3LDYgKzEyNyw3IEBACiAjZGVmaW5lIEdFTkhEX0ZMX1NVUFBSRVNTX1BBUlRJVElPTl9JTkZPCTMyCiAjZGVmaW5lIEdFTkhEX0ZMX0VYVF9ERVZUCQkJNjQgLyogYWxsb3cgZXh0ZW5kZWQgZGV2dCAqLwogI2RlZmluZSBHRU5IRF9GTF9OQVRJVkVfQ0FQQUNJVFkJCTEyOAorI2RlZmluZSBHRU5IRF9GTF9CTE9DS19FVkVOVFNfT05fRVhDTF9XUklURQkyNTYKIAogZW51bSB7CiAJRElTS19FVkVOVF9NRURJQV9DSEFOR0UJCQk9IDEgPDwgMCwgLyogbWVkaWEgY2hhbmdlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQuaCBiL2luY2x1ZGUvbGludXgvaGlkLmgKaW5kZXggNDJmN2UyZi4uNGJmYjRjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC01OTcsNiArNTk3LDggQEAKICAqIEBpbnB1dF9tYXBwaW5nOiBpbnZva2VkIG9uIGlucHV0IHJlZ2lzdGVyaW5nIGJlZm9yZSBtYXBwaW5nIGFuIHVzYWdlCiAgKiBAaW5wdXRfbWFwcGVkOiBpbnZva2VkIG9uIGlucHV0IHJlZ2lzdGVyaW5nIGFmdGVyIG1hcHBpbmcgYW4gdXNhZ2UKICAqIEBmZWF0dXJlX21hcHBpbmc6IGludm9rZWQgb24gZmVhdHVyZSByZWdpc3RlcmluZworICogQGlucHV0X3JlZ2lzdGVyOiBjYWxsZWQganVzdCBiZWZvcmUgaW5wdXQgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgYWZ0ZXIgcmVwb3J0cworICogCQkgICAgYXJlIHBhcnNlZC4KICAqIEBzdXNwZW5kOiBpbnZva2VkIG9uIHN1c3BlbmQgKE5VTEwgbWVhbnMgbm9wKQogICogQHJlc3VtZTogaW52b2tlZCBvbiByZXN1bWUgaWYgZGV2aWNlIHdhcyBub3QgcmVzZXQgKE5VTEwgbWVhbnMgbm9wKQogICogQHJlc2V0X3Jlc3VtZTogaW52b2tlZCBvbiByZXN1bWUgaWYgZGV2aWNlIHdhcyByZXNldCAoTlVMTCBtZWFucyBub3ApCkBAIC02NDMsNiArNjQ1LDggQEAKIAl2b2lkICgqZmVhdHVyZV9tYXBwaW5nKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKIAkJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UpOworCWludCAoKmlucHV0X3JlZ2lzdGVyKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dAorCQkJKmhpZGlucHV0KTsKICNpZmRlZiBDT05GSUdfUE0KIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaCBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKaW5kZXggNzJiZmE1YS4uOGUzN2ZiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCkBAIC02Miw2ICs2Miw3IEBACiAJX191MTYJCXRwX21hYzsKIAlfX3UxNgkJdHBfbmV0OwogCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKIH07CiAKIC8qIFJ4IHJpbmcgLSBoZWFkZXIgc3RhdHVzICovCkBAIC0xMDAsNiArMTAxLDcgQEAKIAlfX3UzMgkJdHBfc2VjOwogCV9fdTMyCQl0cF9uc2VjOwogCV9fdTE2CQl0cF92bGFuX3RjaTsKKwlfX3UxNgkJdHBfcGFkZGluZzsKIH07CiAKICNkZWZpbmUgVFBBQ0tFVDJfSERSTEVOCQkoVFBBQ0tFVF9BTElHTihzaXplb2Yoc3RydWN0IHRwYWNrZXQyX2hkcikpICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKaW5kZXggZmQ4MWYyYS4uYzA5ZWI4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaApAQCAtMzU0LDEwICszNTQsMTQgQEAKIAlyZXR1cm4gIShob3N0LT5jYXBzICYgTU1DX0NBUF9OT05SRU1PVkFCTEUpICYmIG1tY19hc3N1bWVfcmVtb3ZhYmxlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtbWNfY2FyZF9pc19wb3dlcmVkX3Jlc3VtZWQoc3RydWN0IG1tY19ob3N0ICpob3N0KQorc3RhdGljIGlubGluZSBpbnQgbW1jX2NhcmRfa2VlcF9wb3dlcihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CiAJcmV0dXJuIGhvc3QtPnBtX2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tY19jYXJkX3dha2Vfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXJldHVybiBob3N0LT5wbV9mbGFncyAmIE1NQ19QTV9XQUtFX1NESU9fSVJROworfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IDAyNDlmZTcuLjY2YjIyYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMTY4MCw5ICsxNjgwLDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgKnNrYl9ncm9faGVhZGVyX3Nsb3coc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhsZW4sCiAJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQpCiB7CisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGxlbikpCisJCXJldHVybiBOVUxMOworCiAJTkFQSV9HUk9fQ0Ioc2tiKS0+ZnJhZzAgPSBOVUxMOwogCU5BUElfR1JPX0NCKHNrYiktPmZyYWcwX2xlbiA9IDA7Ci0JcmV0dXJuIHBza2JfbWF5X3B1bGwoc2tiLCBobGVuKSA/IHNrYi0+ZGF0YSArIG9mZnNldCA6IE5VTEw7CisJcmV0dXJuIHNrYi0+ZGF0YSArIG9mZnNldDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpza2JfZ3JvX21hY19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2FoYXNoLmgKaW5kZXggYTAxOTZhYzcuLmFjM2M4MjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9haGFzaC5oCkBAIC04MzksNyArODM5LDcgQEAKIAlzdHJ1Y3QgaHRhYmxlICp0ID0gaC0+dGFibGU7CiAJY29uc3Qgc3RydWN0IHR5cGVfcGZfZWxlbSAqZCA9IHZhbHVlOwogCXN0cnVjdCBoYnVja2V0ICpuOwotCWludCBpLCByZXQgPSAwOworCWludCBpOwogCXN0cnVjdCB0eXBlX3BmX2VsZW0gKmRhdGE7CiAJdTMyIGtleTsKIApAQCAtODUwLDcgKzg1MCw3IEBACiAJCWlmICghdHlwZV9wZl9kYXRhX2VxdWFsKGRhdGEsIGQpKQogCQkJY29udGludWU7CiAJCWlmICh0eXBlX3BmX2RhdGFfZXhwaXJlZChkYXRhKSkKLQkJCXJldCA9IC1JUFNFVF9FUlJfRVhJU1Q7CisJCQlyZXR1cm4gLUlQU0VUX0VSUl9FWElTVDsKIAkJaWYgKGkgIT0gbi0+cG9zIC0gMSkKIAkJCS8qIE5vdCBsYXN0IG9uZSAqLwogCQkJdHlwZV9wZl9kYXRhX2NvcHkoZGF0YSwgYWhhc2hfdGRhdGEobiwgbi0+cG9zIC0gMSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X3RpbWVvdXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF90aW1lb3V0LmgKaW5kZXggOWYzMGM1Zi4uYmI3NzNjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X3RpbWVvdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXRfdGltZW91dC5oCkBAIC00NSw3ICs0NSw3IEBACiB7CiAJcmV0dXJuIHRpbWVvdXQgIT0gSVBTRVRfRUxFTV9VTlNFVCAmJgogCSAgICAgICAodGltZW91dCA9PSBJUFNFVF9FTEVNX1BFUk1BTkVOVCB8fAotCQl0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKwkJdGltZV9pc19hZnRlcl9qaWZmaWVzKHRpbWVvdXQpKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sCkBAIC01Myw3ICs1Myw3IEBACiB7CiAJcmV0dXJuIHRpbWVvdXQgIT0gSVBTRVRfRUxFTV9VTlNFVCAmJgogCSAgICAgICB0aW1lb3V0ICE9IElQU0VUX0VMRU1fUEVSTUFORU5UICYmCi0JICAgICAgIHRpbWVfYmVmb3JlKHRpbWVvdXQsIGppZmZpZXMpOworCSAgICAgICB0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKHRpbWVvdXQpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKQEAgLTY0LDcgKzY0LDcgQEAKIAlpZiAoIXRpbWVvdXQpCiAJCXJldHVybiBJUFNFVF9FTEVNX1BFUk1BTkVOVDsKIAotCXQgPSB0aW1lb3V0ICogSFogKyBqaWZmaWVzOworCXQgPSBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQgKiAxMDAwKSArIGppZmZpZXM7CiAJaWYgKHQgPT0gSVBTRVRfRUxFTV9VTlNFVCB8fCB0ID09IElQU0VUX0VMRU1fUEVSTUFORU5UKQogCQkvKiBCaW5nbyEgKi8KIAkJdCsrOwpAQCAtNzUsNyArNzUsOCBAQAogc3RhdGljIGlubGluZSB1MzIKIGlwX3NldF90aW1lb3V0X2dldCh1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JcmV0dXJuIHRpbWVvdXQgPT0gSVBTRVRfRUxFTV9QRVJNQU5FTlQgPyAwIDogKHRpbWVvdXQgLSBqaWZmaWVzKS9IWjsKKwlyZXR1cm4gdGltZW91dCA9PSBJUFNFVF9FTEVNX1BFUk1BTkVOVCA/IDAgOgorCQlqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQgLSBqaWZmaWVzKS8xMDAwOwogfQogCiAjZWxzZQpAQCAtODksMTQgKzkwLDE0IEBACiBpcF9zZXRfdGltZW91dF90ZXN0KHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKIAlyZXR1cm4gdGltZW91dCA9PSBJUFNFVF9FTEVNX1BFUk1BTkVOVCB8fAotCSAgICAgICB0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpOworCSAgICAgICB0aW1lX2lzX2FmdGVyX2ppZmZpZXModGltZW91dCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbAogaXBfc2V0X3RpbWVvdXRfZXhwaXJlZCh1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJcmV0dXJuIHRpbWVvdXQgIT0gSVBTRVRfRUxFTV9QRVJNQU5FTlQgJiYKLQkgICAgICAgdGltZV9iZWZvcmUodGltZW91dCwgamlmZmllcyk7CisJICAgICAgIHRpbWVfaXNfYmVmb3JlX2ppZmZpZXModGltZW91dCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwpAQCAtMTA3LDcgKzEwOCw3IEBACiAJaWYgKCF0aW1lb3V0KQogCQlyZXR1cm4gSVBTRVRfRUxFTV9QRVJNQU5FTlQ7CiAKLQl0ID0gdGltZW91dCAqIEhaICsgamlmZmllczsKKwl0ID0gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0ICogMTAwMCkgKyBqaWZmaWVzOwogCWlmICh0ID09IElQU0VUX0VMRU1fUEVSTUFORU5UKQogCQkvKiBCaW5nbyEgOi0pICovCiAJCXQrKzsKQEAgLTExOCw3ICsxMTksOCBAQAogc3RhdGljIGlubGluZSB1MzIKIGlwX3NldF90aW1lb3V0X2dldCh1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JcmV0dXJuIHRpbWVvdXQgPT0gSVBTRVRfRUxFTV9QRVJNQU5FTlQgPyAwIDogKHRpbWVvdXQgLSBqaWZmaWVzKS9IWjsKKwlyZXR1cm4gdGltZW91dCA9PSBJUFNFVF9FTEVNX1BFUk1BTkVOVCA/IDAgOgorCQlqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQgLSBqaWZmaWVzKS8xMDAwOwogfQogI2VuZGlmIC8qICEgSVBfU0VUX0JJVE1BUF9USU1FT1VUICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmgKaW5kZXggMjA4YWU5My4uZmFhYTI4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmgKQEAgLTQsNiArNCw3IEBACiAgKiBIZWFkZXIgZmlsZSBmb3IgWHRhYmxlcyB0aW1lciB0YXJnZXQgbW9kdWxlLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKICAqIFdyaXR0ZW4gYnkgVGltbyBUZXJhcyA8ZXh0LXRpbW8udGVyYXNAbm9raWEuY29tPgogICoKICAqIENvbnZlcnRlZCB0byB4X3RhYmxlcyBhbmQgZm9yd2FyZC1wb3J0ZWQgdG8gMi42LjM0CkBAIC0zMiwxMiArMzMsMTkgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjZGVmaW5lIE1BWF9JRExFVElNRVJfTEFCRUxfU0laRSAyOAorI2RlZmluZSBOTE1TR19NQVhfU0laRSA2NAorCisjZGVmaW5lIE5MX0VWRU5UX1RZUEVfSU5BQ1RJVkUgMAorI2RlZmluZSBOTF9FVkVOVF9UWVBFX0FDVElWRSAxCiAKIHN0cnVjdCBpZGxldGltZXJfdGdfaW5mbyB7CiAJX191MzIgdGltZW91dDsKIAogCWNoYXIgbGFiZWxbTUFYX0lETEVUSU1FUl9MQUJFTF9TSVpFXTsKIAorCS8qIFVzZSBuZXRsaW5rIG1lc3NhZ2VzIGZvciBub3RpZmljYXRpb24gaW4gYWRkaXRpb24gdG8gc3lzZnMgKi8KKwlfX3U4IHNlbmRfbmxfbXNnOworCiAJLyogZm9yIGtlcm5lbCBtb2R1bGUgaW50ZXJuYWwgdXNlIG9ubHkgKi8KIAlzdHJ1Y3QgaWRsZXRpbWVyX3RnICp0aW1lciBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXRhZ3VpZC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXRhZ3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjBmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdGFndWlkLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfWFRfUVRBR1VJRF9NQVRDSF9ICisjZGVmaW5lIF9YVF9RVEFHVUlEX01BVENIX0gKKworLyogRm9yIG5vdyB3ZSBqdXN0IHJlcGxhY2UgdGhlIHh0X293bmVyLgorICogRklYTUU6IG1ha2UgaXB0YWJsZXMgYXdhcmUgb2YgcXRhZ3VpZC4gKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfb3duZXIuaD4KKworI2RlZmluZSBYVF9RVEFHVUlEX1VJRCAgICBYVF9PV05FUl9VSUQKKyNkZWZpbmUgWFRfUVRBR1VJRF9HSUQgICAgWFRfT1dORVJfR0lECisjZGVmaW5lIFhUX1FUQUdVSURfU09DS0VUIFhUX09XTkVSX1NPQ0tFVAorI2RlZmluZSB4dF9xdGFndWlkX21hdGNoX2luZm8geHRfb3duZXJfbWF0Y2hfaW5mbworCisjZW5kaWYgLyogX1hUX1FUQUdVSURfTUFUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdW90YTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRjNjkwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdW90YTIuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9YVF9RVU9UQV9ICisjZGVmaW5lIF9YVF9RVU9UQV9ICisKK2VudW0geHRfcXVvdGFfZmxhZ3MgeworCVhUX1FVT1RBX0lOVkVSVCAgICA9IDEgPDwgMCwKKwlYVF9RVU9UQV9HUk9XICAgICAgPSAxIDw8IDEsCisJWFRfUVVPVEFfUEFDS0VUICAgID0gMSA8PCAyLAorCVhUX1FVT1RBX05PX0NIQU5HRSA9IDEgPDwgMywKKwlYVF9RVU9UQV9NQVNLICAgICAgPSAweDBGLAorfTsKKworc3RydWN0IHh0X3F1b3RhX2NvdW50ZXI7CisKK3N0cnVjdCB4dF9xdW90YV9tdGluZm8yIHsKKwljaGFyIG5hbWVbMTVdOworCXVfaW50OF90IGZsYWdzOworCisJLyogQ29tcGFyaXNvbi1pbnZhcmlhbnQgKi8KKwlhbGlnbmVkX3U2NCBxdW90YTsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJc3RydWN0IHh0X3F1b3RhX2NvdW50ZXIgKm1hc3RlciBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCisjZW5kaWYgLyogX1hUX1FVT1RBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc29ja2V0LmgKaW5kZXggMjZkNzIxNy4uNjM1OTQ1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc29ja2V0LmgKQEAgLTExLDQgKzExLDEwIEBACiAJX191OCBmbGFnczsKIH07CiAKK3ZvaWQgeHRfc29ja2V0X3B1dF9zayhzdHJ1Y3Qgc29jayAqc2spOworc3RydWN0IHNvY2sgKnh0X3NvY2tldF9nZXQ0X3NrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKTsKK3N0cnVjdCBzb2NrICp4dF9zb2NrZXRfZ2V0Nl9zayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcik7CisKICNlbmRpZiAvKiBfWFRfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggOGFiZThkNy4uZDA0MWE0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTYwOCw2ICs2MDgsOCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9HNTUwCTB4MjUyNwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9WSUEJMHg0NTM2CiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NT0JJTElUWV9FTEVDVFJPTklDUwkweDE0ZjIKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NUCQkweDEwMmMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9DVF82OTAwMAkJMHgwMGMwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1RfNjU1NDUJCTB4MDBkOApAQCAtMTUzNSw2ICsxNTM3LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDc2CTB4MDQ3NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1JMNUM0NzgJMHgwNDc4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODIyCTB4MDgyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1Q0U4MjMJMHhlODIzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODMyCTB4MDgzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JJQ09IX1I1Qzg0MwkweDA4NDMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3JhbV9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvcmFtX2NvbnNvbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjExMjVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3JhbV9jb25zb2xlLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9JTkNMVURFX0xJTlVYX1BMQVRGT1JNX0RBVEFfUkFNX0NPTlNPTEVfSF8KKyNkZWZpbmUgX0lOQ0xVREVfTElOVVhfUExBVEZPUk1fREFUQV9SQU1fQ09OU09MRV9IXworCitzdHJ1Y3QgcmFtX2NvbnNvbGVfcGxhdGZvcm1fZGF0YSB7CisJY29uc3QgY2hhciAqYm9vdGluZm87Cit9OworCisjZW5kaWYgLyogX0lOQ0xVREVfTElOVVhfUExBVEZPUk1fREFUQV9SQU1fQ09OU09MRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbS5oIGIvaW5jbHVkZS9saW51eC9wbS5oCmluZGV4IDUxMmUwOTEuLmZmZmIxMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtLmgKQEAgLTQyNSw3ICs0MjUsOCBAQAogCXBtX21lc3NhZ2VfdAkJcG93ZXJfc3RhdGU7CiAJdW5zaWduZWQgaW50CQljYW5fd2FrZXVwOjE7CiAJdW5zaWduZWQgaW50CQlhc3luY19zdXNwZW5kOjE7Ci0JdW5zaWduZWQgaW50CQlpbl9zdXNwZW5kOjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCisJYm9vbAkJCWlzX3ByZXBhcmVkOjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCisJYm9vbAkJCWlzX3N1c3BlbmRlZDoxOwkvKiBEaXR0byAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG1fcW9zX3BhcmFtcy5oIGIvaW5jbHVkZS9saW51eC9wbV9xb3NfcGFyYW1zLmgKaW5kZXggNzdjYmRkYi4uYTdkODdmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbV9xb3NfcGFyYW1zLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbV9xb3NfcGFyYW1zLmgKQEAgLTE2LDYgKzE2LDEwIEBACiAjZGVmaW5lIFBNX1FPU19OVU1fQ0xBU1NFUyA0CiAjZGVmaW5lIFBNX1FPU19ERUZBVUxUX1ZBTFVFIC0xCiAKKyNkZWZpbmUgUE1fUU9TX0NQVV9ETUFfTEFUX0RFRkFVTFRfVkFMVUUJKDIwMDAgKiBVU0VDX1BFUl9TRUMpCisjZGVmaW5lIFBNX1FPU19ORVRXT1JLX0xBVF9ERUZBVUxUX1ZBTFVFCSgyMDAwICogVVNFQ19QRVJfU0VDKQorI2RlZmluZSBQTV9RT1NfTkVUV09SS19USFJPVUdIUFVUX0RFRkFVTFRfVkFMVUUJMAorCiBzdHJ1Y3QgcG1fcW9zX3JlcXVlc3RfbGlzdCB7CiAJc3RydWN0IHBsaXN0X25vZGUgbGlzdDsKIAlpbnQgcG1fcW9zX2NsYXNzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYXRlbGltaXQuaCBiL2luY2x1ZGUvbGludXgvcmF0ZWxpbWl0LmgKaW5kZXggMDNmZjY3Yi4uMmYwMDcxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYXRlbGltaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhdGVsaW1pdC5oCkBAIC00MSw0ICs0MSw0NCBAQAogZXh0ZXJuIGludCBfX19yYXRlbGltaXQoc3RydWN0IHJhdGVsaW1pdF9zdGF0ZSAqcnMsIGNvbnN0IGNoYXIgKmZ1bmMpOwogI2RlZmluZSBfX3JhdGVsaW1pdChzdGF0ZSkgX19fcmF0ZWxpbWl0KHN0YXRlLCBfX2Z1bmNfXykKIAorI2lmZGVmIENPTkZJR19QUklOVEsKKworI2RlZmluZSBXQVJOX09OX1JBVEVMSU1JVChjb25kaXRpb24sIHN0YXRlKQkJCVwKKwkJV0FSTl9PTigoY29uZGl0aW9uKSAmJiBfX3JhdGVsaW1pdChzdGF0ZSkpCisKKyNkZWZpbmUgX19XQVJOX1JBVEVMSU1JVChjb25kaXRpb24sIHN0YXRlLCBmb3JtYXQuLi4pCQlcCisoewkJCQkJCQkJXAorCWludCBydG4gPSAwOwkJCQkJCVwKKwlpZiAodW5saWtlbHkoX19yYXRlbGltaXQoc3RhdGUpKSkJCQlcCisJCXJ0biA9IFdBUk4oY29uZGl0aW9uLCBmb3JtYXQpOwkJCVwKKwlydG47CQkJCQkJCVwKK30pCisKKyNkZWZpbmUgV0FSTl9SQVRFTElNSVQoY29uZGl0aW9uLCBmb3JtYXQuLi4pCQkJXAorKHsJCQkJCQkJCVwKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShfcnMsCQkJXAorCQkJCSAgICAgIERFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAlcCisJCQkJICAgICAgREVGQVVMVF9SQVRFTElNSVRfQlVSU1QpOwlcCisJX19XQVJOX1JBVEVMSU1JVChjb25kaXRpb24sICZfcnMsIGZvcm1hdCk7CQlcCit9KQorCisjZWxzZQorCisjZGVmaW5lIFdBUk5fT05fUkFURUxJTUlUKGNvbmRpdGlvbiwgc3RhdGUpCQkJXAorCVdBUk5fT04oY29uZGl0aW9uKQorCisjZGVmaW5lIF9fV0FSTl9SQVRFTElNSVQoY29uZGl0aW9uLCBzdGF0ZSwgZm9ybWF0Li4uKQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgcnRuID0gV0FSTihjb25kaXRpb24sIGZvcm1hdCk7CQkJXAorCXJ0bjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBXQVJOX1JBVEVMSU1JVChjb25kaXRpb24sIGZvcm1hdC4uLikJCQlcCisoewkJCQkJCQkJXAorCWludCBydG4gPSBXQVJOKGNvbmRpdGlvbiwgZm9ybWF0KTsJCQlcCisJcnRuOwkJCQkJCQlcCit9KQorCisjZW5kaWYKKwogI2VuZGlmIC8qIF9MSU5VWF9SQVRFTElNSVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAppbmRleCBlOThjZDJlLi4wNmQ2OTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaApAQCAtODgsMTIgKzg4LDEyIEBACiAJdW5zaWduZWQgcmV0OwogCiByZXBlYXQ6Ci0JcmV0ID0gc2wtPnNlcXVlbmNlOwotCXNtcF9ybWIoKTsKKwlyZXQgPSBBQ0NFU1NfT05DRShzbC0+c2VxdWVuY2UpOwogCWlmICh1bmxpa2VseShyZXQgJiAxKSkgewogCQljcHVfcmVsYXgoKTsKIAkJZ290byByZXBlYXQ7CiAJfQorCXNtcF9ybWIoKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfa3JiNV9lbmN0eXBlcy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzYyMzRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaApAQCAtMCwwICsxLDQgQEAKKy8qCisgKiBEdW1iIHdheSB0byBzaGFyZSB0aGlzIHN0YXRpYyBwaWVjZSBvZiBpbmZvcm1hdGlvbiB3aXRoIG5mc2QKKyAqLworI2RlZmluZSBLUkI1X1NVUFBPUlRFRF9FTkNUWVBFUyAiMTgsMTcsMTYsMjMsMywxLDIiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaAppbmRleCBmNzNjNDgyLi5mZTJkOGU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgKQEAgLTg0LDcgKzg0LDggQEAKICNlbmRpZgogCXVuc2lnbmVkIGNoYXIJCXRrX3ByaW9yaXR5IDogMiwvKiBUYXNrIHByaW9yaXR5ICovCiAJCQkJdGtfZ2FyYl9yZXRyeSA6IDIsCi0JCQkJdGtfY3JlZF9yZXRyeSA6IDI7CisJCQkJdGtfY3JlZF9yZXRyeSA6IDIsCisJCQkJdGtfcmViaW5kX3JldHJ5IDogMjsKIH07CiAjZGVmaW5lIHRrX3hwcnQJCQl0a19jbGllbnQtPmNsX3hwcnQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggNzE2OTNkNC4uMTdkZjM2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC02Miw3ICs2Miw5IEBACiAJVVNfRkxBRyhOT19SRUFEX0RJU0NfSU5GTywJMHgwMDA0MDAwMCkJCVwKIAkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0RJU0NfSU5GTyAqLwkJXAogCVVTX0ZMQUcoTk9fUkVBRF9DQVBBQ0lUWV8xNiwJMHgwMDA4MDAwMCkJCVwKLQkJLyogY2Fubm90IGhhbmRsZSBSRUFEX0NBUEFDSVRZXzE2ICovCisJCS8qIGNhbm5vdCBoYW5kbGUgUkVBRF9DQVBBQ0lUWV8xNiAqLwkJXAorCVVTX0ZMQUcoSU5JVElBTF9SRUFEMTAsCTB4MDAxMDAwMDApCQkJXAorCQkvKiBJbml0aWFsIFJFQUQoMTApIChhbmQgb3RoZXJzKSBtdXN0IGJlIHJldHJpZWQgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAppbmRleCAyMzcxMGFhLi5jNTA4NmZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oCisrKyBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKQEAgLTgsNyArOCw3IEBACiAKICNkZWZpbmUgVEVNUF9WQUxJRF9MSUZFVElNRQkJKDcqODY0MDApCiAjZGVmaW5lIFRFTVBfUFJFRkVSUkVEX0xJRkVUSU1FCQkoODY0MDApCi0jZGVmaW5lIFJFR0VOX01BWF9SRVRSWQkJCSg1KQorI2RlZmluZSBSRUdFTl9NQVhfUkVUUlkJCQkoMykKICNkZWZpbmUgTUFYX0RFU1lOQ19GQUNUT1IJCSg2MDApCiAKICNkZWZpbmUgQUREUl9DSEVDS19GUkVRVUVOQ1kJCSgxMjAqSFopCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKaW5kZXggNDM3NTA0My4uYWY5MzBhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaApAQCAtNjksNiArNjksMTMgQEAKICNkZWZpbmUgQlRfRkxVU0hBQkxFX09GRgkwCiAjZGVmaW5lIEJUX0ZMVVNIQUJMRV9PTgkJMQogCisjZGVmaW5lIEJUX1BPV0VSCTkKK3N0cnVjdCBidF9wb3dlciB7CisJX191OCBmb3JjZV9hY3RpdmU7Cit9OworI2RlZmluZSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT0ZGIDAKKyNkZWZpbmUgQlRfUE9XRVJfRk9SQ0VfQUNUSVZFX09OICAxCisKICNkZWZpbmUgQlRfSU5GTyhmbXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiQmx1ZXRvb3RoOiAiIGZtdCAiXG4iICwgIyMgYXJnKQogI2RlZmluZSBCVF9FUlIoZm10LCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZtdCAiXG4iICwgX19mdW5jX18gLCAjIyBhcmcpCiAjZGVmaW5lIEJUX0RCRyhmbXQsIGFyZy4uLikgIHByX2RlYnVnKCIlczogIiBmbXQgIlxuIiAsIF9fZnVuY19fICwgIyMgYXJnKQpAQCAtMTUwLDYgKzE1Nyw3IEBACiAJX191OCByZXRyaWVzOwogCV9fdTggc2FyOwogCXVuc2lnbmVkIHNob3J0IGNoYW5uZWw7CisJX191OCBmb3JjZV9hY3RpdmU7CiB9OwogI2RlZmluZSBidF9jYihza2IpICgoc3RydWN0IGJ0X3NrYl9jYiAqKSgoc2tiKS0+Y2IpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCmluZGV4IGJjZGFjYzc3Li4yMGU3NjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtNDE1LDcgKzQxNSw3IEBACiBpbnQgaGNpX2Nvbm5fY2hhbmdlX2xpbmtfa2V5KHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiBpbnQgaGNpX2Nvbm5fc3dpdGNoX3JvbGUoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHJvbGUpOwogCi12b2lkIGhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubik7Cit2b2lkIGhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBmb3JjZV9hY3RpdmUpOwogdm9pZCBoY2lfY29ubl9lbnRlcl9zbmlmZl9tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiAKIHZvaWQgaGNpX2Nvbm5faG9sZF9kZXZpY2Uoc3RydWN0IGhjaV9jb25uICpjb25uKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9sMmNhcC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKaW5kZXggNGY0YmZmMS4uYzExMzg4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmgKQEAgLTM0OSw2ICszNDksNyBAQAogCV9fdTgJCXJvbGVfc3dpdGNoOwogCV9fdTgJCWZvcmNlX3JlbGlhYmxlOwogCV9fdTgJCWZsdXNoYWJsZTsKKwlfX3U4CQlmb3JjZV9hY3RpdmU7CiAKIAlfX3U4CQljb25mX3JlcVs2NF07CiAJX191OAkJY29uZl9sZW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCBiMmI5ZDI4Li42MDUwM2VhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTQyMiw2ICs0MjIsOSBAQAogICogQFNUQVRJT05fSU5GT19SWF9EUk9QX01JU0M6IEByeF9kcm9wcGVkX21pc2MgZmlsbGVkCiAgKiBAU1RBVElPTl9JTkZPX1NJR05BTF9BVkc6IEBzaWduYWxfYXZnIGZpbGxlZAogICogQFNUQVRJT05fSU5GT19SWF9CSVRSQVRFOiBAcnhyYXRlIGZpZWxkcyBhcmUgZmlsbGVkCisgKiBAU1RBVElPTl9JTkZPX0JTU19QQVJBTTogQGJzc19wYXJhbSBmaWxsZWQKKyAqIEBTVEFUSU9OX0lORk9fQ09OTkVDVEVEX1RJTUU6IEBjb25uZWN0ZWRfdGltZSBmaWxsZWQKKyAqIEBTVEFUSU9OX0lORk9fQVNTT0NfUkVRX0lFUzogQGFzc29jX3JlcV9pZXMgZmlsbGVkCiAgKi8KIGVudW0gc3RhdGlvbl9pbmZvX2ZsYWdzIHsKIAlTVEFUSU9OX0lORk9fSU5BQ1RJVkVfVElNRQk9IDE8PDAsCkBAIC00MzksNiArNDQyLDkgQEAKIAlTVEFUSU9OX0lORk9fUlhfRFJPUF9NSVNDCT0gMTw8MTIsCiAJU1RBVElPTl9JTkZPX1NJR05BTF9BVkcJCT0gMTw8MTMsCiAJU1RBVElPTl9JTkZPX1JYX0JJVFJBVEUJCT0gMTw8MTQsCisJU1RBVElPTl9JTkZPX0JTU19QQVJBTSAgICAgICAgICA9IDE8PDE1LAorCVNUQVRJT05fSU5GT19DT05ORUNURURfVElNRQk9IDE8PDE2LAorCVNUQVRJT05fSU5GT19BU1NPQ19SRVFfSUVTCT0gMTw8MTcKIH07CiAKIC8qKgpAQCAtNDk3LDYgKzUwMywxMSBAQAogICoJVGhpcyBudW1iZXIgc2hvdWxkIGluY3JlYXNlIGV2ZXJ5IHRpbWUgdGhlIGxpc3Qgb2Ygc3RhdGlvbnMKICAqCWNoYW5nZXMsIGkuZS4gd2hlbiBhIHN0YXRpb24gaXMgYWRkZWQgb3IgcmVtb3ZlZCwgc28gdGhhdAogICoJdXNlcnNwYWNlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgZ290IGEgY29uc2lzdGVudCBzbmFwc2hvdC4KKyAqIEBhc3NvY19yZXFfaWVzOiBJRXMgZnJvbSAoUmUpQXNzb2NpYXRpb24gUmVxdWVzdC4KKyAqCVRoaXMgaXMgdXNlZCBvbmx5IHdoZW4gaW4gQVAgbW9kZSB3aXRoIGRyaXZlcnMgdGhhdCBkbyBub3QgdXNlCisgKgl1c2VyIHNwYWNlIE1MTUUvU01FIGltcGxlbWVudGF0aW9uLiBUaGUgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgZm9yCisgKgl0aGUgY2ZnODAyMTFfbmV3X3N0YSgpIGNhbGxzIHRvIG5vdGlmeSB1c2VyIHNwYWNlIG9mIHRoZSBJRXMuCisgKiBAYXNzb2NfcmVxX2llc19sZW46IExlbmd0aCBvZiBhc3NvY19yZXFfaWVzIGJ1ZmZlciBpbiBvY3RldHMuCiAgKi8KIHN0cnVjdCBzdGF0aW9uX2luZm8gewogCXUzMiBmaWxsZWQ7CkBAIC01MTcsNiArNTI4LDE0IEBACiAJdTMyIHJ4X2Ryb3BwZWRfbWlzYzsKIAogCWludCBnZW5lcmF0aW9uOworCisJY29uc3QgdTggKmFzc29jX3JlcV9pZXM7CisJc2l6ZV90IGFzc29jX3JlcV9pZXNfbGVuOworCisJLyoKKwkgKiBOb3RlOiBBZGQgYSBuZXcgZW51bSBzdGF0aW9uX2luZm9fZmxhZ3MgdmFsdWUgZm9yIGVhY2ggbmV3IGZpZWxkIGFuZAorCSAqIHVzZSBpdCB0byBjaGVjayB3aGljaCBmaWVsZHMgYXJlIGluaXRpYWxpemVkLgorCSAqLwogfTsKIAogLyoqCkBAIC0yNjY3LDYgKzI2ODYsMTUgQEAKIAkJICAgICAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8sIGdmcF90IGdmcCk7CiAKIC8qKgorICogY2ZnODAyMTFfZGVsX3N0YSAtIG5vdGlmeSB1c2Vyc3BhY2UgYWJvdXQgZGVsZXRpb24gb2YgYSBzdGF0aW9uCisgKgorICogQGRldjogdGhlIG5ldGRldgorICogQG1hY19hZGRyOiB0aGUgc3RhdGlvbidzIGFkZHJlc3MKKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqLwordm9pZCBjZmc4MDIxMV9kZWxfc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICptYWNfYWRkciwgZ2ZwX3QgZ2ZwKTsKKworLyoqCiAgKiBjZmc4MDIxMV9yeF9tZ210IC0gbm90aWZpY2F0aW9uIG9mIHJlY2VpdmVkLCB1bnByb2Nlc3NlZCBtYW5hZ2VtZW50IGZyYW1lCiAgKiBAZGV2OiBuZXR3b3JrIGRldmljZQogICogQGZyZXE6IEZyZXF1ZW5jeSBvbiB3aGljaCB0aGUgZnJhbWUgd2FzIHJlY2VpdmVkIGluIE1IegpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHN0LmggYi9pbmNsdWRlL25ldC9kc3QuaAppbmRleCA3NWI5NWRmLi5iM2FkMDIwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHN0LmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0LmgKQEAgLTEyMCw2ICsxMjAsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcCA9IGRzdC0+X21ldHJpY3M7CiAKKwlCVUdfT04oIXApOworCiAJaWYgKHAgJiBEU1RfTUVUUklDU19SRUFEX09OTFkpCiAJCXJldHVybiBkc3QtPm9wcy0+Y293X21ldHJpY3MoZHN0LCBwKTsKIAlyZXR1cm4gX19EU1RfTUVUUklDU19QVFIocCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oIGIvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaAppbmRleCBmY2NjMjE4Li5lMmY2NjU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKQEAgLTQzLDYgKzQzLDcgQEAKIAlzdHJ1Y3QgaW42X2FkZHIJCWFkZHI7CiAJX191MzIJCQlwcmVmaXhfbGVuOwogCQorCS8qIEluIHNlY29uZHMsIHJlbGF0aXZlIHRvIHRzdGFtcC4gRXhwaXJ5IGlzIGF0IHRzdGFtcCArIEhaICogbGZ0LiAqLwogCV9fdTMyCQkJdmFsaWRfbGZ0OwogCV9fdTMyCQkJcHJlZmVyZWRfbGZ0OwogCWF0b21pY190CQlyZWZjbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA4NmFlZmVkLi5lNWJmNGM4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfdnMuaAorKysgYi9pbmNsdWRlL25ldC9pcF92cy5oCkBAIC04MDIsNyArODAyLDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJzX3RhYmxlW0lQX1ZTX1JUQUJfU0laRV07CiAJLyogaXBfdnNfYXBwICovCiAJc3RydWN0IGxpc3RfaGVhZAlhcHBfbGlzdDsKLQorCS8qIGlwX3ZzX2Z0cCAqLworCXN0cnVjdCBpcF92c19hcHAJKmZ0cF9hcHA7CiAJLyogaXBfdnNfcHJvdG8gKi8KIAkjZGVmaW5lIElQX1ZTX1BST1RPX1RBQl9TSVpFCTMyCS8qIG11c3QgYmUgcG93ZXIgb2YgMiAqLwogCXN0cnVjdCBpcF92c19wcm90b19kYXRhICpwcm90b19kYXRhX3RhYmxlW0lQX1ZTX1BST1RPX1RBQl9TSVpFXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaAppbmRleCAxZDNiNWIyLi41NjFhYzk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCkBAIC05OCw2ICs5OCw3IEBACiAJVFJBTlNQT1JUX1JFTU9WRQk9IDE0LAogCVRSQU5TUE9SVF9GUkVFCQk9IDE1LAogCVRSQU5TUE9SVF9ORVdfQ01EX01BUAk9IDE2LAorCVRSQU5TUE9SVF9GUkVFX0NNRF9JTlRSID0gMTcsCiB9OwogCiAvKiBVc2VkIGZvciBzdHJ1Y3Qgc2VfY21kLT5zZV9jbWRfZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKaW5kZXggNTlhYTQ2NC4uMjRhMWM2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKQEAgLTE3Miw2ICsxNzIsNyBAQAogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfZGF0YShzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X25ld19jbWRfZmFpbHVyZShzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfdG1yKHN0cnVjdCBzZV9jbWQgKik7CitleHRlcm4gdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZF9pbnRyKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gdm9pZCBfX3RyYW5zcG9ydF9zdG9wX3Rhc2tfdGltZXIoc3RydWN0IHNlX3Rhc2sgKiwgdW5zaWduZWQgbG9uZyAqKTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHRyYW5zcG9ydF9hc2NpaWhleF90b19iaW5hcnloZXgodW5zaWduZWQgY2hhciB2YWxbMl0pOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19tYXBfbWVtX3RvX2NtZChzdHJ1Y3Qgc2VfY21kICpjbWQsIHN0cnVjdCBzY2F0dGVybGlzdCAqLCB1MzIsCmRpZmYgLS1naXQgYS9pbml0L2NhbGlicmF0ZS5jIGIvaW5pdC9jYWxpYnJhdGUuYwppbmRleCA3NmFjOTE5Li4zMGE0NGNkIDEwMDY0NAotLS0gYS9pbml0L2NhbGlicmF0ZS5jCisrKyBiL2luaXQvY2FsaWJyYXRlLmMKQEAgLTE4NSwzMCArMTg1LDMyIEBACiAKIHZvaWQgX19jcHVpbml0IGNhbGlicmF0ZV9kZWxheSh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbHBqOwogCXN0YXRpYyBib29sIHByaW50ZWQ7CiAKIAlpZiAocHJlc2V0X2xwaikgewotCQlsb29wc19wZXJfamlmZnkgPSBwcmVzZXRfbHBqOworCQlscGogPSBwcmVzZXRfbHBqOwogCQlpZiAoIXByaW50ZWQpCiAJCQlwcl9pbmZvKCJDYWxpYnJhdGluZyBkZWxheSBsb29wIChza2lwcGVkKSAiCiAJCQkJInByZXNldCB2YWx1ZS4uICIpOwogCX0gZWxzZSBpZiAoKCFwcmludGVkKSAmJiBscGpfZmluZSkgewotCQlsb29wc19wZXJfamlmZnkgPSBscGpfZmluZTsKKwkJbHBqID0gbHBqX2ZpbmU7CiAJCXByX2luZm8oIkNhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpLCAiCiAJCQkidmFsdWUgY2FsY3VsYXRlZCB1c2luZyB0aW1lciBmcmVxdWVuY3kuLiAiKTsKLQl9IGVsc2UgaWYgKChsb29wc19wZXJfamlmZnkgPSBjYWxpYnJhdGVfZGVsYXlfZGlyZWN0KCkpICE9IDApIHsKKwl9IGVsc2UgaWYgKChscGogPSBjYWxpYnJhdGVfZGVsYXlfZGlyZWN0KCkpICE9IDApIHsKIAkJaWYgKCFwcmludGVkKQogCQkJcHJfaW5mbygiQ2FsaWJyYXRpbmcgZGVsYXkgdXNpbmcgdGltZXIgIgogCQkJCSJzcGVjaWZpYyByb3V0aW5lLi4gIik7CiAJfSBlbHNlIHsKIAkJaWYgKCFwcmludGVkKQogCQkJcHJfaW5mbygiQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcC4uLiAiKTsKLQkJbG9vcHNfcGVyX2ppZmZ5ID0gY2FsaWJyYXRlX2RlbGF5X2NvbnZlcmdlKCk7CisJCWxwaiA9IGNhbGlicmF0ZV9kZWxheV9jb252ZXJnZSgpOwogCX0KIAlpZiAoIXByaW50ZWQpCiAJCXByX2NvbnQoIiVsdS4lMDJsdSBCb2dvTUlQUyAobHBqPSVsdSlcbiIsCi0JCQlsb29wc19wZXJfamlmZnkvKDUwMDAwMC9IWiksCi0JCQkobG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDAsIGxvb3BzX3Blcl9qaWZmeSk7CisJCQlscGovKDUwMDAwMC9IWiksCisJCQkobHBqLyg1MDAwL0haKSkgJSAxMDAsIGxwaik7CiAKKwlsb29wc19wZXJfamlmZnkgPSBscGo7CiAJcHJpbnRlZCA9IHRydWU7CiB9CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDRhOTQ3OWUuLjQ4ZGY4ODIgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC01ODAsOCArNTgwLDggQEAKICNlbmRpZgogCXBhZ2VfY2dyb3VwX2luaXQoKTsKIAllbmFibGVfZGVidWdfcGFnZWFsbG9jKCk7Ci0Ja21lbWxlYWtfaW5pdCgpOwogCWRlYnVnX29iamVjdHNfbWVtX2luaXQoKTsKKwlrbWVtbGVha19pbml0KCk7CiAJc2V0dXBfcGVyX2NwdV9wYWdlc2V0KCk7CiAJbnVtYV9wb2xpY3lfaW5pdCgpOwogCWlmIChsYXRlX3RpbWVfaW5pdCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCAxMmI3NDU4Li40MDQ3NzA3IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC01OTQsMyArNTk0LDIzIEBACiB7CiAJY3B1bWFza19jb3B5KHRvX2NwdW1hc2soY3B1X29ubGluZV9iaXRzKSwgc3JjKTsKIH0KKworc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGlkbGVfbm90aWZpZXIpOworCit2b2lkIGlkbGVfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKQoreworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmaWRsZV9ub3RpZmllciwgbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGxlX25vdGlmaWVyX3JlZ2lzdGVyKTsKKwordm9pZCBpZGxlX25vdGlmaWVyX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKQoreworCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZpZGxlX25vdGlmaWVyLCBuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkbGVfbm90aWZpZXJfdW5yZWdpc3Rlcik7CisKK3ZvaWQgaWRsZV9ub3RpZmllcl9jYWxsX2NoYWluKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZpZGxlX25vdGlmaWVyLCB2YWwsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRsZV9ub3RpZmllcl9jYWxsX2NoYWluKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZGVzYy5jIGIva2VybmVsL2lycS9pcnFkZXNjLmMKaW5kZXggMmMwMzljOS4uNTFlNDk0NCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pcnFkZXNjLmMKKysrIGIva2VybmVsL2lycS9pcnFkZXNjLmMKQEAgLTI1NywxMyArMjU3LDExIEBACiAJY291bnQgPSBBUlJBWV9TSVpFKGlycV9kZXNjKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWRlc2NbaV0uaXJxX2RhdGEuaXJxID0gaTsKLQkJZGVzY1tpXS5pcnFfZGF0YS5jaGlwID0gJm5vX2lycV9jaGlwOwogCQlkZXNjW2ldLmtzdGF0X2lycXMgPSBhbGxvY19wZXJjcHUodW5zaWduZWQgaW50KTsKLQkJaXJxX3NldHRpbmdzX2Nscl9hbmRfc2V0KGRlc2MsIH4wLCBfSVJRX0RFRkFVTFRfSU5JVF9GTEFHUyk7Ci0JCWFsbG9jX21hc2tzKGRlc2MgKyBpLCBHRlBfS0VSTkVMLCBub2RlKTsKLQkJZGVzY19zbXBfaW5pdChkZXNjICsgaSwgbm9kZSk7CisJCWFsbG9jX21hc2tzKCZkZXNjW2ldLCBHRlBfS0VSTkVMLCBub2RlKTsKKwkJcmF3X3NwaW5fbG9ja19pbml0KCZkZXNjW2ldLmxvY2spOwogCQlsb2NrZGVwX3NldF9jbGFzcygmZGVzY1tpXS5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7CisJCWRlc2Nfc2V0X2RlZmF1bHRzKGksICZkZXNjW2ldLCBub2RlKTsKIAl9CiAJcmV0dXJuIGFyY2hfZWFybHlfaXJxX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvcG0uYyBiL2tlcm5lbC9pcnEvcG0uYwppbmRleCA4NWMxMzA4Li5mMzIzYTRjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3BtLmMKKysrIGIva2VybmVsL2lycS9wbS5jCkBAIC03Miw3ICs3Miw5IEBACiAJCWlmIChpcnFkX2lzX3dha2V1cF9zZXQoJmRlc2MtPmlycV9kYXRhKSkgewogCQkJaWYgKGRlc2MtPmlzdGF0ZSAmIElSUVNfUEVORElORykgewogCQkJCXByX2luZm8oIldha2V1cCBJUlEgJWQgJXMgcGVuZGluZywgc3VzcGVuZCBhYm9ydGVkXG4iLAotCQkJCQlpcnEsIGRlc2MtPm5hbWUgPyBkZXNjLT5uYW1lIDogIiIpOworCQkJCQlpcnEsCisJCQkJCWRlc2MtPmFjdGlvbiAmJiBkZXNjLT5hY3Rpb24tPm5hbWUgPworCQkJCQlkZXNjLT5hY3Rpb24tPm5hbWUgOiAiIik7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggNTNhNjg5NS4uNDk0NTJhNyAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0zMjQyLDcgKzMyNDIsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uKSkKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIDE7IC8qIGF2b2lkIGZhbHNlIG5lZ2F0aXZlIGxvY2tkZXBfYXNzZXJ0X2hlbGQoKSAqLwogCiAJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAljaGVja19mbGFncyhmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG1fcW9zX3BhcmFtcy5jIGIva2VybmVsL3BtX3Fvc19wYXJhbXMuYwppbmRleCAwZGEwNThiLi5hOTU4MmVmIDEwMDY0NAotLS0gYS9rZXJuZWwvcG1fcW9zX3BhcmFtcy5jCisrKyBiL2tlcm5lbC9wbV9xb3NfcGFyYW1zLmMKQEAgLTUzLDExICs1MywxNyBAQAogCVBNX1FPU19NSU4JCS8qIHJldHVybiB0aGUgc21hbGxlc3QgdmFsdWUgKi8KIH07CiAKKy8qCisgKiBOb3RlOiBUaGUgbG9ja2xlc3MgcmVhZCBwYXRoIGRlcGVuZHMgb24gdGhlIENQVSBhY2Nlc3NpbmcKKyAqIHRhcmdldF92YWx1ZSBhdG9taWNhbGx5LiAgQXRvbWljIGFjY2VzcyBpcyBvbmx5IGd1YXJhbnRlZWQgb24gYWxsIENQVQorICogdHlwZXMgbGludXggc3VwcG9ydHMgZm9yIDMyIGJpdCBxdWFudGl0ZXMKKyAqLwogc3RydWN0IHBtX3Fvc19vYmplY3QgewogCXN0cnVjdCBwbGlzdF9oZWFkIHJlcXVlc3RzOwogCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkICpub3RpZmllcnM7CiAJc3RydWN0IG1pc2NkZXZpY2UgcG1fcW9zX3Bvd2VyX21pc2NkZXY7CiAJY2hhciAqbmFtZTsKKwlzMzIgdGFyZ2V0X3ZhbHVlOwkvKiBEbyBub3QgY2hhbmdlIHRvIDY0IGJpdCAqLwogCXMzMiBkZWZhdWx0X3ZhbHVlOwogCWVudW0gcG1fcW9zX3R5cGUgdHlwZTsKIH07CkBAIC03MCw3ICs3Niw4IEBACiAJLnJlcXVlc3RzID0gUExJU1RfSEVBRF9JTklUKGNwdV9kbWFfcG1fcW9zLnJlcXVlc3RzLCBwbV9xb3NfbG9jayksCiAJLm5vdGlmaWVycyA9ICZjcHVfZG1hX2xhdF9ub3RpZmllciwKIAkubmFtZSA9ICJjcHVfZG1hX2xhdGVuY3kiLAotCS5kZWZhdWx0X3ZhbHVlID0gMjAwMCAqIFVTRUNfUEVSX1NFQywKKwkudGFyZ2V0X3ZhbHVlID0gUE1fUU9TX0NQVV9ETUFfTEFUX0RFRkFVTFRfVkFMVUUsCisJLmRlZmF1bHRfdmFsdWUgPSBQTV9RT1NfQ1BVX0RNQV9MQVRfREVGQVVMVF9WQUxVRSwKIAkudHlwZSA9IFBNX1FPU19NSU4sCiB9OwogCkBAIC03OSw3ICs4Niw4IEBACiAJLnJlcXVlc3RzID0gUExJU1RfSEVBRF9JTklUKG5ldHdvcmtfbGF0X3BtX3Fvcy5yZXF1ZXN0cywgcG1fcW9zX2xvY2spLAogCS5ub3RpZmllcnMgPSAmbmV0d29ya19sYXRfbm90aWZpZXIsCiAJLm5hbWUgPSAibmV0d29ya19sYXRlbmN5IiwKLQkuZGVmYXVsdF92YWx1ZSA9IDIwMDAgKiBVU0VDX1BFUl9TRUMsCisJLnRhcmdldF92YWx1ZSA9IFBNX1FPU19ORVRXT1JLX0xBVF9ERUZBVUxUX1ZBTFVFLAorCS5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX05FVFdPUktfTEFUX0RFRkFVTFRfVkFMVUUsCiAJLnR5cGUgPSBQTV9RT1NfTUlOCiB9OwogCkBAIC04OSw3ICs5Nyw4IEBACiAJLnJlcXVlc3RzID0gUExJU1RfSEVBRF9JTklUKG5ldHdvcmtfdGhyb3VnaHB1dF9wbV9xb3MucmVxdWVzdHMsIHBtX3Fvc19sb2NrKSwKIAkubm90aWZpZXJzID0gJm5ldHdvcmtfdGhyb3VnaHB1dF9ub3RpZmllciwKIAkubmFtZSA9ICJuZXR3b3JrX3Rocm91Z2hwdXQiLAotCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkudGFyZ2V0X3ZhbHVlID0gUE1fUU9TX05FVFdPUktfVEhST1VHSFBVVF9ERUZBVUxUX1ZBTFVFLAorCS5kZWZhdWx0X3ZhbHVlID0gUE1fUU9TX05FVFdPUktfVEhST1VHSFBVVF9ERUZBVUxUX1ZBTFVFLAogCS50eXBlID0gUE1fUU9TX01BWCwKIH07CiAKQEAgLTEzNSw2ICsxNDQsMTYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgczMyIHBtX3Fvc19yZWFkX3ZhbHVlKHN0cnVjdCBwbV9xb3Nfb2JqZWN0ICpvKQoreworCXJldHVybiBvLT50YXJnZXRfdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9xb3Nfc2V0X3ZhbHVlKHN0cnVjdCBwbV9xb3Nfb2JqZWN0ICpvLCBzMzIgdmFsdWUpCit7CisJby0+dGFyZ2V0X3ZhbHVlID0gdmFsdWU7Cit9CisKIHN0YXRpYyB2b2lkIHVwZGF0ZV90YXJnZXQoc3RydWN0IHBtX3Fvc19vYmplY3QgKm8sIHN0cnVjdCBwbGlzdF9ub2RlICpub2RlLAogCQkJICBpbnQgZGVsLCBpbnQgdmFsdWUpCiB7CkBAIC0xNTksNiArMTc4LDcgQEAKIAkJcGxpc3RfYWRkKG5vZGUsICZvLT5yZXF1ZXN0cyk7CiAJfQogCWN1cnJfdmFsdWUgPSBwbV9xb3NfZ2V0X3ZhbHVlKG8pOworCXBtX3Fvc19zZXRfdmFsdWUobywgY3Vycl92YWx1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKIAogCWlmIChwcmV2X3ZhbHVlICE9IGN1cnJfdmFsdWUpCkBAIC0xOTMsMTggKzIxMywxMSBAQAogICogcG1fcW9zX3JlcXVlc3QgLSByZXR1cm5zIGN1cnJlbnQgc3lzdGVtIHdpZGUgcW9zIGV4cGVjdGF0aW9uCiAgKiBAcG1fcW9zX2NsYXNzOiBpZGVudGlmaWNhdGlvbiBvZiB3aGljaCBxb3MgdmFsdWUgaXMgcmVxdWVzdGVkCiAgKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHRhcmdldCB2YWx1ZSBpbiBhbiBhdG9taWMgbWFubmVyLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHRhcmdldCB2YWx1ZS4KICAqLwogaW50IHBtX3Fvc19yZXF1ZXN0KGludCBwbV9xb3NfY2xhc3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdmFsdWU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG1fcW9zX2xvY2ssIGZsYWdzKTsKLQl2YWx1ZSA9IHBtX3Fvc19nZXRfdmFsdWUocG1fcW9zX2FycmF5W3BtX3Fvc19jbGFzc10pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtX3Fvc19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gdmFsdWU7CisJcmV0dXJuIHBtX3Fvc19yZWFkX3ZhbHVlKHBtX3Fvc19hcnJheVtwbV9xb3NfY2xhc3NdKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc19yZXF1ZXN0KTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCBlM2FlZTU3Li43MzIxYTBiIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZworKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtMjk2LDMgKzI5NiwxMCBAQAogCSAgcmVwcmVzZW50aW5nIGluZGl2aWR1YWwgdm9sdGFnZSBkb21haW5zIGFuZCBwcm92aWRlcyBTT0MKIAkgIGltcGxlbWVudGF0aW9ucyBhIHJlYWR5IHRvIHVzZSBmcmFtZXdvcmsgdG8gbWFuYWdlIE9QUHMuCiAJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3Bvd2VyL29wcC50eHQ+CisKK2NvbmZpZyBTVVNQRU5EX1RJTUUKKwlib29sICJMb2cgdGltZSBzcGVudCBpbiBzdXNwZW5kIgorCS0tLWhlbHAtLS0KKwkgIFByaW50cyB0aGUgdGltZSBzcGVudCBpbiBzdXNwZW5kIGluIHRoZSBrZXJuZWwgbG9nLCBhbmQKKwkgIGtlZXBzIHN0YXRpc3RpY3Mgb24gdGhlIHRpbWUgc3BlbnQgaW4gc3VzcGVuZCBpbgorCSAgL3N5cy9rZXJuZWwvZGVidWcvc3VzcGVuZF90aW1lCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKaW5kZXggNDkzZjE5ZC4uOWIyMjRlMSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlCisrKyBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQpAQCAtMTMsNSArMTMsNiBAQAogb2JqLSQoQ09ORklHX0VBUkxZU1VTUEVORCkJKz0gZWFybHlzdXNwZW5kLm8KIG9iai0kKENPTkZJR19DT05TT0xFX0VBUkxZU1VTUEVORCkJKz0gY29uc29sZWVhcmx5c3VzcGVuZC5vCiBvYmotJChDT05GSUdfRkJfRUFSTFlTVVNQRU5EKQkrPSBmYmVhcmx5c3VzcGVuZC5vCitvYmotJChDT05GSUdfU1VTUEVORF9USU1FKQkrPSBzdXNwZW5kX3RpbWUubwogCiBvYmotJChDT05GSUdfTUFHSUNfU1lTUlEpCSs9IHBvd2Vyb2ZmLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKaW5kZXggY2EwYWFjYy4uMWE3OGMxYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKKysrIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKQEAgLTExOTksNyArMTE5OSwxMSBAQAogCQl0b19mcmVlX2hpZ2htZW0gPSBhbGxvY19oaWdobWVtIC0gc2F2ZTsKIAl9IGVsc2UgewogCQl0b19mcmVlX2hpZ2htZW0gPSAwOwotCQl0b19mcmVlX25vcm1hbCAtPSBzYXZlIC0gYWxsb2NfaGlnaG1lbTsKKwkJc2F2ZSAtPSBhbGxvY19oaWdobWVtOworCQlpZiAodG9fZnJlZV9ub3JtYWwgPiBzYXZlKQorCQkJdG9fZnJlZV9ub3JtYWwgLT0gc2F2ZTsKKwkJZWxzZQorCQkJdG9fZnJlZV9ub3JtYWwgPSAwOwogCX0KIAogCW1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldCgmY29weV9ibSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3VzcGVuZF90aW1lLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZF90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNjVkYQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kX3RpbWUuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIGRlYnVnZnMgZmlsZSB0byB0cmFjayB0aW1lIHNwZW50IGluIHN1c3BlbmQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHN1c3BlbmRfdGltZV9iZWZvcmU7CitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVfaW5fc3VzcGVuZF9iaW5zWzMyXTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGludCBzdXNwZW5kX3RpbWVfZGVidWdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCit7CisJaW50IGJpbjsKKwlzZXFfcHJpbnRmKHMsICJ0aW1lIChzZWNzKSAgY291bnRcbiIpOworCXNlcV9wcmludGYocywgIi0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yIChiaW4gPSAwOyBiaW4gPCAzMjsgYmluKyspIHsKKwkJaWYgKHRpbWVfaW5fc3VzcGVuZF9iaW5zW2Jpbl0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzZXFfcHJpbnRmKHMsICIlNGQgLSAlNGQgJTR1XG4iLAorCQkJYmluID8gMSA8PCAoYmluIC0gMSkgOiAwLCAxIDw8IGJpbiwKKwkJCQl0aW1lX2luX3N1c3BlbmRfYmluc1tiaW5dKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZF90aW1lX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHN1c3BlbmRfdGltZV9kZWJ1Z19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3VzcGVuZF90aW1lX2RlYnVnX2ZvcHMgPSB7CisJLm9wZW4JCT0gc3VzcGVuZF90aW1lX2RlYnVnX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN1c3BlbmRfdGltZV9kZWJ1Z19pbml0KHZvaWQpCit7CisJc3RydWN0IGRlbnRyeSAqZDsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdXNwZW5kX3RpbWUiLCAwNzU1LCBOVUxMLCBOVUxMLAorCQkmc3VzcGVuZF90aW1lX2RlYnVnX2ZvcHMpOworCWlmICghZCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgc3VzcGVuZF90aW1lIGRlYnVnIGZpbGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChzdXNwZW5kX3RpbWVfZGVidWdfaW5pdCk7CisjZW5kaWYKKworc3RhdGljIGludCBzdXNwZW5kX3RpbWVfc3lzY29yZV9zdXNwZW5kKHZvaWQpCit7CisJcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKCZzdXNwZW5kX3RpbWVfYmVmb3JlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdXNwZW5kX3RpbWVfc3lzY29yZV9yZXN1bWUodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgYWZ0ZXI7CisKKwlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJmFmdGVyKTsKKworCWFmdGVyID0gdGltZXNwZWNfc3ViKGFmdGVyLCBzdXNwZW5kX3RpbWVfYmVmb3JlKTsKKworCXRpbWVfaW5fc3VzcGVuZF9iaW5zW2ZscyhhZnRlci50dl9zZWMpXSsrOworCisJcHJfaW5mbygiU3VzcGVuZGVkIGZvciAlbHUuJTAzbHUgc2Vjb25kc1xuIiwgYWZ0ZXIudHZfc2VjLAorCQlhZnRlci50dl9uc2VjIC8gTlNFQ19QRVJfTVNFQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgc3VzcGVuZF90aW1lX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kID0gc3VzcGVuZF90aW1lX3N5c2NvcmVfc3VzcGVuZCwKKwkucmVzdW1lID0gc3VzcGVuZF90aW1lX3N5c2NvcmVfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBzdXNwZW5kX3RpbWVfc3lzY29yZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnN1c3BlbmRfdGltZV9zeXNjb3JlX29wcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3VzcGVuZF90aW1lX3N5c2NvcmVfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY29yZV9vcHMoJnN1c3BlbmRfdGltZV9zeXNjb3JlX29wcyk7Cit9Cittb2R1bGVfaW5pdChzdXNwZW5kX3RpbWVfc3lzY29yZV9pbml0KTsKK21vZHVsZV9leGl0KHN1c3BlbmRfdGltZV9zeXNjb3JlX2V4aXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmMKaW5kZXggN2QwMmQzMy4uNDJkZGJjNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3VzZXIuYworKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jCkBAIC0xMTMsOCArMTEzLDEwIEBACiAJCWlmIChlcnJvcikKIAkJCXBtX25vdGlmaWVyX2NhbGxfY2hhaW4oUE1fUE9TVF9SRVNUT1JFKTsKIAl9Ci0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKCk7CiAJCWF0b21pY19pbmMoJnNuYXBzaG90X2RldmljZV9hdmFpbGFibGUpOworCX0KIAlkYXRhLT5mcm96ZW4gPSAwOwogCWRhdGEtPnJlYWR5ID0gMDsKIAlkYXRhLT5wbGF0Zm9ybV9zdXBwb3J0ID0gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCA4NzI2MzgyLi5hY2YyMGY1IDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC0xMTcyLDcgKzExNzIsNiBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfT05MSU5FOgogCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfRFlJTkc6CiAJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CiAJCWNvbnNvbGVfbG9jaygpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX3J0LmMgYi9rZXJuZWwvc2NoZWRfcnQuYwppbmRleCBlN2NlYmRjLi5mOGZjZjgyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfcnQuYworKysgYi9rZXJuZWwvc2NoZWRfcnQuYwpAQCAtMTgzLDYgKzE4MywxNCBAQAogCXJldHVybiBrdGltZV90b19ucyhydF9ycS0+dGctPnJ0X2JhbmR3aWR0aC5ydF9wZXJpb2QpOwogfQogCit0eXBlZGVmIHN0cnVjdCB0YXNrX2dyb3VwICpydF9ycV9pdGVyX3Q7CisKKyNkZWZpbmUgZm9yX2VhY2hfcnRfcnEocnRfcnEsIGl0ZXIsIHJxKSBcCisJZm9yIChpdGVyID0gbGlzdF9lbnRyeV9yY3UodGFza19ncm91cHMubmV4dCwgdHlwZW9mKCppdGVyKSwgbGlzdCk7IFwKKwkgICAgICgmaXRlci0+bGlzdCAhPSAmdGFza19ncm91cHMpICYmIFwKKwkgICAgIChydF9ycSA9IGl0ZXItPnJ0X3JxW2NwdV9vZihycSldKTsgXAorCSAgICAgaXRlciA9IGxpc3RfZW50cnlfcmN1KGl0ZXItPmxpc3QubmV4dCwgdHlwZW9mKCppdGVyKSwgbGlzdCkpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZF9sZWFmX3J0X3JxKHN0cnVjdCBydF9ycSAqcnRfcnEpCiB7CiAJbGlzdF9hZGRfcmN1KCZydF9ycS0+bGVhZl9ydF9ycV9saXN0LApAQCAtMjg4LDYgKzI5NiwxMSBAQAogCXJldHVybiBrdGltZV90b19ucyhkZWZfcnRfYmFuZHdpZHRoLnJ0X3BlcmlvZCk7CiB9CiAKK3R5cGVkZWYgc3RydWN0IHJ0X3JxICpydF9ycV9pdGVyX3Q7CisKKyNkZWZpbmUgZm9yX2VhY2hfcnRfcnEocnRfcnEsIGl0ZXIsIHJxKSBcCisJZm9yICgodm9pZCkgaXRlciwgcnRfcnEgPSAmcnEtPnJ0OyBydF9ycTsgcnRfcnEgPSBOVUxMKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGRfbGVhZl9ydF9ycShzdHJ1Y3QgcnRfcnEgKnJ0X3JxKQogewogfQpAQCAtNDAyLDEyICs0MTUsMTMgQEAKIHN0YXRpYyB2b2lkIF9fZGlzYWJsZV9ydW50aW1lKHN0cnVjdCBycSAqcnEpCiB7CiAJc3RydWN0IHJvb3RfZG9tYWluICpyZCA9IHJxLT5yZDsKKwlydF9ycV9pdGVyX3QgaXRlcjsKIAlzdHJ1Y3QgcnRfcnEgKnJ0X3JxOwogCiAJaWYgKHVubGlrZWx5KCFzY2hlZHVsZXJfcnVubmluZykpCiAJCXJldHVybjsKIAotCWZvcl9lYWNoX2xlYWZfcnRfcnEocnRfcnEsIHJxKSB7CisJZm9yX2VhY2hfcnRfcnEocnRfcnEsIGl0ZXIsIHJxKSB7CiAJCXN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IgPSBzY2hlZF9ydF9iYW5kd2lkdGgocnRfcnEpOwogCQlzNjQgd2FudDsKIAkJaW50IGk7CkBAIC00ODcsNiArNTAxLDcgQEAKIAogc3RhdGljIHZvaWQgX19lbmFibGVfcnVudGltZShzdHJ1Y3QgcnEgKnJxKQogeworCXJ0X3JxX2l0ZXJfdCBpdGVyOwogCXN0cnVjdCBydF9ycSAqcnRfcnE7CiAKIAlpZiAodW5saWtlbHkoIXNjaGVkdWxlcl9ydW5uaW5nKSkKQEAgLTQ5NSw3ICs1MTAsNyBAQAogCS8qCiAJICogUmVzZXQgZWFjaCBydW5xdWV1ZSdzIGJhbmR3aWR0aCBzZXR0aW5ncwogCSAqLwotCWZvcl9lYWNoX2xlYWZfcnRfcnEocnRfcnEsIHJxKSB7CisJZm9yX2VhY2hfcnRfcnEocnRfcnEsIGl0ZXIsIHJxKSB7CiAJCXN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IgPSBzY2hlZF9ydF9iYW5kd2lkdGgocnRfcnEpOwogCiAJCXJhd19zcGluX2xvY2soJnJ0X2ItPnJ0X3J1bnRpbWVfbG9jayk7CkBAIC0xNzk2LDEwICsxODExLDExIEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3J0X3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGNwdSkKIHsKKwlydF9ycV9pdGVyX3QgaXRlcjsKIAlzdHJ1Y3QgcnRfcnEgKnJ0X3JxOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWZvcl9lYWNoX2xlYWZfcnRfcnEocnRfcnEsIGNwdV9ycShjcHUpKQorCWZvcl9lYWNoX3J0X3JxKHJ0X3JxLCBpdGVyLCBjcHVfcnEoY3B1KSkKIAkJcHJpbnRfcnRfcnEobSwgY3B1LCBydF9ycSk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGFza3N0YXRzLmMgYi9rZXJuZWwvdGFza3N0YXRzLmMKaW5kZXggOWZmZWEzNi4uZmMwZjIyMCAxMDA2NDQKLS0tIGEva2VybmVsL3Rhc2tzdGF0cy5jCisrKyBiL2tlcm5lbC90YXNrc3RhdHMuYwpAQCAtMjg1LDE2ICsyODUsMTggQEAKIHN0YXRpYyBpbnQgYWRkX2RlbF9saXN0ZW5lcihwaWRfdCBwaWQsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBpbnQgaXNhZGQpCiB7CiAJc3RydWN0IGxpc3RlbmVyX2xpc3QgKmxpc3RlbmVyczsKLQlzdHJ1Y3QgbGlzdGVuZXIgKnMsICp0bXA7CisJc3RydWN0IGxpc3RlbmVyICpzLCAqdG1wLCAqczI7CiAJdW5zaWduZWQgaW50IGNwdTsKIAogCWlmICghY3B1bWFza19zdWJzZXQobWFzaywgY3B1X3Bvc3NpYmxlX21hc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXMgPSBOVUxMOwogCWlmIChpc2FkZCA9PSBSRUdJU1RFUikgewogCQlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7Ci0JCQlzID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbGlzdGVuZXIpLCBHRlBfS0VSTkVMLAotCQkJCQkgY3B1X3RvX25vZGUoY3B1KSk7CisJCQlpZiAoIXMpCisJCQkJcyA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGxpc3RlbmVyKSwKKwkJCQkJCSBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjcHUpKTsKIAkJCWlmICghcykKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQlzLT5waWQgPSBwaWQ7CkBAIC0zMDMsOSArMzA1LDE2IEBACiAKIAkJCWxpc3RlbmVycyA9ICZwZXJfY3B1KGxpc3RlbmVyX2FycmF5LCBjcHUpOwogCQkJZG93bl93cml0ZSgmbGlzdGVuZXJzLT5zZW0pOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMyLCB0bXAsICZsaXN0ZW5lcnMtPmxpc3QsIGxpc3QpIHsKKwkJCQlpZiAoczItPnBpZCA9PSBwaWQpCisJCQkJCWdvdG8gbmV4dF9jcHU7CisJCQl9CiAJCQlsaXN0X2FkZCgmcy0+bGlzdCwgJmxpc3RlbmVycy0+bGlzdCk7CisJCQlzID0gTlVMTDsKK25leHRfY3B1OgogCQkJdXBfd3JpdGUoJmxpc3RlbmVycy0+c2VtKTsKIAkJfQorCQlrZnJlZShzKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCAwZTE3YzEwLi43MjdkYTkyIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTE4NSw3ICsxODUsNiBAQAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOwogc3RhdGljIERFQ0xBUkVfV09SSyh3YXRjaGRvZ193b3JrLCBjbG9ja3NvdXJjZV93YXRjaGRvZ193b3JrKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2F0Y2hkb2dfbG9jayk7Ci1zdGF0aWMgY3ljbGVfdCB3YXRjaGRvZ19sYXN0Owogc3RhdGljIGludCB3YXRjaGRvZ19ydW5uaW5nOwogCiBzdGF0aWMgaW50IGNsb2Nrc291cmNlX3dhdGNoZG9nX2t0aHJlYWQodm9pZCAqZGF0YSk7CkBAIC0yNTQsMTEgKzI1Myw2IEBACiAJaWYgKCF3YXRjaGRvZ19ydW5uaW5nKQogCQlnb3RvIG91dDsKIAotCXdkbm93ID0gd2F0Y2hkb2ctPnJlYWQod2F0Y2hkb2cpOwotCXdkX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKHdkbm93IC0gd2F0Y2hkb2dfbGFzdCkgJiB3YXRjaGRvZy0+bWFzaywKLQkJCQkgICAgIHdhdGNoZG9nLT5tdWx0LCB3YXRjaGRvZy0+c2hpZnQpOwotCXdhdGNoZG9nX2xhc3QgPSB3ZG5vdzsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3MsICZ3YXRjaGRvZ19saXN0LCB3ZF9saXN0KSB7CiAKIAkJLyogQ2xvY2tzb3VyY2UgYWxyZWFkeSBtYXJrZWQgdW5zdGFibGU/ICovCkBAIC0yNjgsMTkgKzI2MiwyOCBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQljc25vdyA9IGNzLT5yZWFkKGNzKTsKKwkJd2Rub3cgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCQkvKiBDbG9ja3NvdXJjZSBpbml0aWFsaXplZCA/ICovCiAJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9XQVRDSERPRykpIHsKIAkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfV0FUQ0hET0c7Ci0JCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQkJY3MtPndkX2xhc3QgPSB3ZG5vdzsKKwkJCWNzLT5jc19sYXN0ID0gY3Nub3c7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCi0JCWNzX25zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoKGNzbm93IC0gY3MtPndkX2xhc3QpICYKKwkJd2RfbnNlYyA9IGNsb2Nrc291cmNlX2N5YzJucygod2Rub3cgLSBjcy0+d2RfbGFzdCkgJiB3YXRjaGRvZy0+bWFzaywKKwkJCQkJICAgICB3YXRjaGRvZy0+bXVsdCwgd2F0Y2hkb2ctPnNoaWZ0KTsKKworCQljc19uc2VjID0gY2xvY2tzb3VyY2VfY3ljMm5zKChjc25vdyAtIGNzLT5jc19sYXN0KSAmCiAJCQkJCSAgICAgY3MtPm1hc2ssIGNzLT5tdWx0LCBjcy0+c2hpZnQpOwotCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQljcy0+Y3NfbGFzdCA9IGNzbm93OworCQljcy0+d2RfbGFzdCA9IHdkbm93OworCisJCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCiAJCWlmIChhYnMoY3NfbnNlYyAtIHdkX25zZWMpID4gV0FUQ0hET0dfVEhSRVNIT0xEKSB7CiAJCQljbG9ja3NvdXJjZV91bnN0YWJsZShjcywgY3NfbnNlYyAtIHdkX25zZWMpOwogCQkJY29udGludWU7CkBAIC0zMTgsNyArMzIxLDYgQEAKIAkJcmV0dXJuOwogCWluaXRfdGltZXIoJndhdGNoZG9nX3RpbWVyKTsKIAl3YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGNsb2Nrc291cmNlX3dhdGNoZG9nOwotCXdhdGNoZG9nX2xhc3QgPSB3YXRjaGRvZy0+cmVhZCh3YXRjaGRvZyk7CiAJd2F0Y2hkb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBXQVRDSERPR19JTlRFUlZBTDsKIAlhZGRfdGltZXJfb24oJndhdGNoZG9nX3RpbWVyLCBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzaykpOwogCXdhdGNoZG9nX3J1bm5pbmcgPSAxOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCmluZGV4IGVlMjRmYTEuLjY2Njg4MGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKQEAgLTI0MTMsMTQgKzI0MTMsMTYgQEAKIAkJZnRyYWNlX21hdGNoX3JlY29yZHMocGFyc2VyLT5idWZmZXIsIHBhcnNlci0+aWR4LCBlbmFibGUpOwogCX0KIAotCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKLQlpZiAoZnRyYWNlX3N0YXJ0X3VwICYmIGZ0cmFjZV9lbmFibGVkKQotCQlmdHJhY2VfcnVuX3VwZGF0ZV9jb2RlKEZUUkFDRV9FTkFCTEVfQ0FMTFMpOwotCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOwotCiAJdHJhY2VfcGFyc2VyX3B1dChwYXJzZXIpOwogCWtmcmVlKGl0ZXIpOwogCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKKwkJaWYgKGZ0cmFjZV9zdGFydF91cCAmJiBmdHJhY2VfZW5hYmxlZCkKKwkJCWZ0cmFjZV9ydW5fdXBkYXRlX2NvZGUoRlRSQUNFX0VOQUJMRV9DQUxMUyk7CisJCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOworCX0KKwogCW11dGV4X3VubG9jaygmZnRyYWNlX3JlZ2V4X2xvY2spOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliL2RlYnVnb2JqZWN0cy5jIGIvbGliL2RlYnVnb2JqZWN0cy5jCmluZGV4IDlkODZlNDUuLmE3OGI3YzYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWJ1Z29iamVjdHMuYworKysgYi9saWIvZGVidWdvYmplY3RzLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCSAqIGluaXRpYWxpemVkOgogCSAqLwogCWlmIChvYmpfcG9vbF9mcmVlID4gT0RFQlVHX1BPT0xfU0laRSAmJiBvYmpfY2FjaGUpCi0JCXNjaGVkID0gIXdvcmtfcGVuZGluZygmZGVidWdfb2JqX3dvcmspOworCQlzY2hlZCA9IGtldmVudGRfdXAoKSAmJiAhd29ya19wZW5kaW5nKCZkZWJ1Z19vYmpfd29yayk7CiAJaGxpc3RfYWRkX2hlYWQoJm9iai0+bm9kZSwgJm9ial9wb29sKTsKIAlvYmpfcG9vbF9mcmVlKys7CiAJb2JqX3Bvb2xfdXNlZC0tOwpkaWZmIC0tZ2l0IGEvbGliL2xvY2tpbmctc2VsZnRlc3QuYyBiL2xpYi9sb2NraW5nLXNlbGZ0ZXN0LmMKaW5kZXggNjE5MzEzZS4uNTA3YTIyZiAxMDA2NDQKLS0tIGEvbGliL2xvY2tpbmctc2VsZnRlc3QuYworKysgYi9saWIvbG9ja2luZy1zZWxmdGVzdC5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogI2RlZmluZSBIQVJESVJRX0VOVEVSKCkJCQkJXAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CQkJXAotCWlycV9lbnRlcigpOwkJCQlcCisJX19pcnFfZW50ZXIoKTsJCQkJXAogCVdBUk5fT04oIWluX2lycSgpKTsKIAogI2RlZmluZSBIQVJESVJRX0VYSVQoKQkJCQlcCmRpZmYgLS1naXQgYS9tbS9jb21wYWN0aW9uLmMgYi9tbS9jb21wYWN0aW9uLmMKaW5kZXggMDIxYTI5Ni4uZTRlMDE2NiAxMDA2NDQKLS0tIGEvbW0vY29tcGFjdGlvbi5jCisrKyBiL21tL2NvbXBhY3Rpb24uYwpAQCAtMTQ0LDkgKzE0NCwyMCBAQAogCWludCBucl9mcmVlcGFnZXMgPSBjYy0+bnJfZnJlZXBhZ2VzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmZyZWVsaXN0ID0gJmNjLT5mcmVlcGFnZXM7CiAKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIGZyZWUgc2Nhbm5lci4gVGhlIHN0YXJ0aW5nIHBvaW50IGlzIHdoZXJlIHdlIGxhc3QKKwkgKiBzY2FubmVkIGZyb20gKG9yIHRoZSBlbmQgb2YgdGhlIHpvbmUgaWYgc3RhcnRpbmcpLiBUaGUgbG93IHBvaW50CisJICogaXMgdGhlIGVuZCBvZiB0aGUgcGFnZWJsb2NrIHRoZSBtaWdyYXRpb24gc2Nhbm5lciBpcyB1c2luZy4KKwkgKi8KIAlwZm4gPSBjYy0+ZnJlZV9wZm47CiAJbG93X3BmbiA9IGNjLT5taWdyYXRlX3BmbiArIHBhZ2VibG9ja19ucl9wYWdlczsKLQloaWdoX3BmbiA9IGxvd19wZm47CisKKwkvKgorCSAqIFRha2UgY2FyZSB0aGF0IGlmIHRoZSBtaWdyYXRpb24gc2Nhbm5lciBpcyBhdCB0aGUgZW5kIG9mIHRoZSB6b25lCisJICogdGhhdCB0aGUgZnJlZSBzY2FubmVyIGRvZXMgbm90IGFjY2lkZW50YWxseSBtb3ZlIHRvIHRoZSBuZXh0IHpvbmUKKwkgKiBpbiB0aGUgbmV4dCBpc29sYXRpb24gY3ljbGUuCisJICovCisJaGlnaF9wZm4gPSBtaW4obG93X3BmbiwgcGZuKTsKIAogCS8qCiAJICogSXNvbGF0ZSBmcmVlIHBhZ2VzIHVudGlsIGVub3VnaCBhcmUgYXZhaWxhYmxlIHRvIG1pZ3JhdGUgdGhlCkBAIC0yNDAsMTEgKzI1MSwxOCBAQAogCXJldHVybiBpc29sYXRlZCA+IChpbmFjdGl2ZSArIGFjdGl2ZSkgLyAyOwogfQogCisvKiBwb3NzaWJsZSBvdXRjb21lIG9mIGlzb2xhdGVfbWlncmF0ZXBhZ2VzICovCit0eXBlZGVmIGVudW0geworCUlTT0xBVEVfQUJPUlQsCQkvKiBBYm9ydCBjb21wYWN0aW9uIG5vdyAqLworCUlTT0xBVEVfTk9ORSwJCS8qIE5vIHBhZ2VzIGlzb2xhdGVkLCBjb250aW51ZSBzY2FubmluZyAqLworCUlTT0xBVEVfU1VDQ0VTUywJLyogUGFnZXMgaXNvbGF0ZWQsIG1pZ3JhdGUgKi8KK30gaXNvbGF0ZV9taWdyYXRlX3Q7CisKIC8qCiAgKiBJc29sYXRlIGFsbCBwYWdlcyB0aGF0IGNhbiBiZSBtaWdyYXRlZCBmcm9tIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5CiAgKiB0aGUgbWlncmF0ZSBzY2FubmVyIHdpdGhpbiBjb21wYWN0X2NvbnRyb2wuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCB6b25lICp6b25lLAorc3RhdGljIGlzb2xhdGVfbWlncmF0ZV90IGlzb2xhdGVfbWlncmF0ZXBhZ2VzKHN0cnVjdCB6b25lICp6b25lLAogCQkJCQlzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKIHsKIAl1bnNpZ25lZCBsb25nIGxvd19wZm4sIGVuZF9wZm47CkBAIC0yNjEsNyArMjc5LDcgQEAKIAkvKiBEbyBub3QgY3Jvc3MgdGhlIGZyZWUgc2Nhbm5lciBvciBzY2FuIHdpdGhpbiBhIG1lbW9yeSBob2xlICovCiAJaWYgKGVuZF9wZm4gPiBjYy0+ZnJlZV9wZm4gfHwgIXBmbl92YWxpZChsb3dfcGZuKSkgewogCQljYy0+bWlncmF0ZV9wZm4gPSBlbmRfcGZuOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIElTT0xBVEVfTk9ORTsKIAl9CiAKIAkvKgpAQCAtMjcwLDEwICsyODgsMTQgQEAKIAkgKiBkZWxheSBmb3Igc29tZSB0aW1lIHVudGlsIGZld2VyIHBhZ2VzIGFyZSBpc29sYXRlZAogCSAqLwogCXdoaWxlICh1bmxpa2VseSh0b29fbWFueV9pc29sYXRlZCh6b25lKSkpIHsKKwkJLyogYXN5bmMgbWlncmF0aW9uIHNob3VsZCBqdXN0IGFib3J0ICovCisJCWlmICghY2MtPnN5bmMpCisJCQlyZXR1cm4gSVNPTEFURV9BQk9SVDsKKwogCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi8xMCk7CiAKIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gSVNPTEFURV9BQk9SVDsKIAl9CiAKIAkvKiBUaW1lIHRvIGlzb2xhdGUgc29tZSBwYWdlcyBmb3IgbWlncmF0aW9uICovCkBAIC0zNTgsNyArMzgwLDcgQEAKIAogCXRyYWNlX21tX2NvbXBhY3Rpb25faXNvbGF0ZV9taWdyYXRlcGFnZXMobnJfc2Nhbm5lZCwgbnJfaXNvbGF0ZWQpOwogCi0JcmV0dXJuIGNjLT5ucl9taWdyYXRlcGFnZXM7CisJcmV0dXJuIElTT0xBVEVfU1VDQ0VTUzsKIH0KIAogLyoKQEAgLTUyMiw4ICs1NDQsMTUgQEAKIAkJdW5zaWduZWQgbG9uZyBucl9taWdyYXRlLCBucl9yZW1haW5pbmc7CiAJCWludCBlcnI7CiAKLQkJaWYgKCFpc29sYXRlX21pZ3JhdGVwYWdlcyh6b25lLCBjYykpCisJCXN3aXRjaCAoaXNvbGF0ZV9taWdyYXRlcGFnZXMoem9uZSwgY2MpKSB7CisJCWNhc2UgSVNPTEFURV9BQk9SVDoKKwkJCXJldCA9IENPTVBBQ1RfUEFSVElBTDsKKwkJCWdvdG8gb3V0OworCQljYXNlIElTT0xBVEVfTk9ORToKIAkJCWNvbnRpbnVlOworCQljYXNlIElTT0xBVEVfU1VDQ0VTUzoKKwkJCTsKKwkJfQogCiAJCW5yX21pZ3JhdGUgPSBjYy0+bnJfbWlncmF0ZXBhZ2VzOwogCQllcnIgPSBtaWdyYXRlX3BhZ2VzKCZjYy0+bWlncmF0ZXBhZ2VzLCBjb21wYWN0aW9uX2FsbG9jLApAQCAtNTQ3LDYgKzU3Niw3IEBACiAKIAl9CiAKK291dDoKIAkvKiBSZWxlYXNlIGZyZWUgcGFnZXMgYW5kIGNoZWNrIGFjY291bnRpbmcgKi8KIAljYy0+bnJfZnJlZXBhZ2VzIC09IHJlbGVhc2VfZnJlZXBhZ2VzKCZjYy0+ZnJlZXBhZ2VzKTsKIAlWTV9CVUdfT04oY2MtPm5yX2ZyZWVwYWdlcyAhPSAwKTsKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCA4ZWUzYmQ4Li5mN2MzMmZiNyAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMTAzMywxMCArMTAzMywxMCBAQAogCSAqLwogCWNoZyA9IHZtYV9uZWVkc19yZXNlcnZhdGlvbihoLCB2bWEsIGFkZHIpOwogCWlmIChjaGcgPCAwKQotCQlyZXR1cm4gRVJSX1BUUihjaGcpOworCQlyZXR1cm4gRVJSX1BUUigtVk1fRkFVTFRfT09NKTsKIAlpZiAoY2hnKQogCQlpZiAoaHVnZXRsYl9nZXRfcXVvdGEoaW5vZGUtPmlfbWFwcGluZywgY2hnKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCQkJcmV0dXJuIEVSUl9QVFIoLVZNX0ZBVUxUX1NJR0JVUyk7CiAKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CiAJcGFnZSA9IGRlcXVldWVfaHVnZV9wYWdlX3ZtYShoLCB2bWEsIGFkZHIsIGF2b2lkX3Jlc2VydmUpOwpAQCAtMTExMSw2ICsxMTExLDE0IEBACiAJCVdBUk5fT04ocGFnZV9jb3VudChwYWdlKSAhPSAxKTsKIAkJcHJlcF9jb21wb3VuZF9odWdlX3BhZ2UocGFnZSwgaC0+b3JkZXIpOwogCQlwcmVwX25ld19odWdlX3BhZ2UoaCwgcGFnZSwgcGFnZV90b19uaWQocGFnZSkpOworCQkvKgorCQkgKiBJZiB3ZSBoYWQgZ2lnYW50aWMgaHVnZXBhZ2VzIGFsbG9jYXRlZCBhdCBib290IHRpbWUsIHdlIG5lZWQKKwkJICogdG8gcmVzdG9yZSB0aGUgJ3N0b2xlbicgcGFnZXMgdG8gdG90YWxyYW1fcGFnZXMgaW4gb3JkZXIgdG8KKwkJICogZml4IGNvbmZ1c2luZyBtZW1vcnkgcmVwb3J0cyBmcm9tIGZyZWUoMSkgYW5kIGFub3RoZXIKKwkJICogc2lkZS1lZmZlY3RzLCBsaWtlIENvbW1pdExpbWl0IGdvaW5nIG5lZ2F0aXZlLgorCQkgKi8KKwkJaWYgKGgtPm9yZGVyID4gKE1BWF9PUkRFUiAtIDEpKQorCQkJdG90YWxyYW1fcGFnZXMgKz0gMSA8PCBoLT5vcmRlcjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL21tL2ttZW1sZWFrLmMgYi9tbS9rbWVtbGVhay5jCmluZGV4IGMxZDU4Njc1Li5hYWNlZTQ1IDEwMDY0NAotLS0gYS9tbS9rbWVtbGVhay5jCisrKyBiL21tL2ttZW1sZWFrLmMKQEAgLTE0MTQsOSArMTQxNCwxMiBAQAogCSsrKCpwb3MpOwogCiAJbGlzdF9mb3JfZWFjaF9jb250aW51ZV9yY3UobiwgJm9iamVjdF9saXN0KSB7Ci0JCW5leHRfb2JqID0gbGlzdF9lbnRyeShuLCBzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0LCBvYmplY3RfbGlzdCk7Ci0JCWlmIChnZXRfb2JqZWN0KG5leHRfb2JqKSkKKwkJc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqID0KKwkJCWxpc3RfZW50cnkobiwgc3RydWN0IGttZW1sZWFrX29iamVjdCwgb2JqZWN0X2xpc3QpOworCQlpZiAoZ2V0X29iamVjdChvYmopKSB7CisJCQluZXh0X29iaiA9IG9iajsKIAkJCWJyZWFrOworCQl9CiAJfQogCiAJcHV0X29iamVjdChwcmV2X29iaik7CmRpZmYgLS1naXQgYS9tbS9rc20uYyBiL21tL2tzbS5jCmluZGV4IDk0MmRmYzcuLmU0OGM4NmUgMTAwNjQ0Ci0tLSBhL21tL2tzbS5jCisrKyBiL21tL2tzbS5jCkBAIC0xMzAxLDYgKzEzMDEsMTIgQEAKIAkJc2xvdCA9IGxpc3RfZW50cnkoc2xvdC0+bW1fbGlzdC5uZXh0LCBzdHJ1Y3QgbW1fc2xvdCwgbW1fbGlzdCk7CiAJCWtzbV9zY2FuLm1tX3Nsb3QgPSBzbG90OwogCQlzcGluX3VubG9jaygma3NtX21tbGlzdF9sb2NrKTsKKwkJLyoKKwkJICogQWx0aG91Z2ggd2UgdGVzdGVkIGxpc3RfZW1wdHkoKSBhYm92ZSwgYSByYWNpbmcgX19rc21fZXhpdAorCQkgKiBvZiB0aGUgbGFzdCBtbSBvbiB0aGUgbGlzdCBtYXkgaGF2ZSByZW1vdmVkIGl0IHNpbmNlIHRoZW4uCisJCSAqLworCQlpZiAoc2xvdCA9PSAma3NtX21tX2hlYWQpCisJCQlyZXR1cm4gTlVMTDsKIG5leHRfbW06CiAJCWtzbV9zY2FuLmFkZHJlc3MgPSAwOwogCQlrc21fc2Nhbi5ybWFwX2xpc3QgPSAmc2xvdC0+cm1hcF9saXN0OwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggMmI5YTVlZS4uOTU2OGUwYiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L21tX2lubGluZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbCBfX3JlYWRfbW9zdGx5ID0gMDsKQEAgLTE0NjMsNyArMTQ2NCw4IEBACiAJcmV0ID0gaXNvbGF0ZV9scnVfcGFnZShwYWdlKTsKIAlpZiAoIXJldCkgewogCQlMSVNUX0hFQUQocGFnZWxpc3QpOwotCisJCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfSVNPTEFURURfQU5PTiArCisJCQkJCSAgICBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpOwogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmcGFnZWxpc3QpOwogCQlyZXQgPSBtaWdyYXRlX3BhZ2VzKCZwYWdlbGlzdCwgbmV3X3BhZ2UsIE1QT0xfTUZfTU9WRV9BTEwsCiAJCQkJCQkJCTAsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmMKaW5kZXggOWNhMWQ2MC4uZmM1ZTBiYSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuYworKysgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCkBAIC01MTgsNyArNTE4LDcgQEAKIAogCWxvY2tfbWVtb3J5X2hvdHBsdWcoKTsKIAlwZ2RhdCA9IGhvdGFkZF9uZXdfcGdkYXQobmlkLCAwKTsKLQlpZiAocGdkYXQpIHsKKwlpZiAoIXBnZGF0KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCAzNDEzMmY4Li4zMTc5ODkxIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0yODgsNyArMjg4LDcgQEAKIAkgKi8KIAlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7CiAJX19pbmNfem9uZV9wYWdlX3N0YXRlKG5ld3BhZ2UsIE5SX0ZJTEVfUEFHRVMpOwotCWlmIChQYWdlU3dhcEJhY2tlZChwYWdlKSkgeworCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSAmJiBQYWdlU3dhcEJhY2tlZChwYWdlKSkgewogCQlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfU0hNRU0pOwogCQlfX2luY196b25lX3BhZ2Vfc3RhdGUobmV3cGFnZSwgTlJfU0hNRU0pOwogCX0KZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IGM0YzU0MmMuLjAzNzZhNGMgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMTgxOSwxMCArMTgxOSwxMyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgcmVtYXBfcGZuX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGZyb20sCi0JCXVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKK2ludCByZW1hcF9wZm5fcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCkKIHsKLQl2bWEtPnZtX3N0YXJ0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWlmIChhZGRyICE9IChwZm4gPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChyZW1hcF9wZm5fcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggZjUyZTg1Yy4uNTI5OWNiOCAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0yODUsNyArMjg1LDcgQEAKIAlkb19lYWNoX3RocmVhZChnLCBwKSB7CiAJCXVuc2lnbmVkIGludCBwb2ludHM7CiAKLQkJaWYgKCFwLT5tbSkKKwkJaWYgKHAtPmV4aXRfc3RhdGUpCiAJCQljb250aW51ZTsKIAkJaWYgKG9vbV91bmtpbGxhYmxlX3Rhc2socCwgbWVtLCBub2RlbWFzaykpCiAJCQljb250aW51ZTsKQEAgLTMwMSw2ICszMDEsOCBAQAogCQkgKi8KIAkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9NRU1ESUUpKQogCQkJcmV0dXJuIEVSUl9QVFIoLTFVTCk7CisJCWlmICghcC0+bW0pCisJCQljb250aW51ZTsKIAogCQlpZiAocC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDkzM2M4MzYuLjViM2U4ZGUgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTIwNjUsNiArMjA2NSw3IEBACiAJCWZpcnN0X3pvbmVzX3pvbmVsaXN0KHpvbmVsaXN0LCBoaWdoX3pvbmVpZHgsIE5VTEwsCiAJCQkJCSZwcmVmZXJyZWRfem9uZSk7CiAKK3JlYmFsYW5jZToKIAkvKiBUaGlzIGlzIHRoZSBsYXN0IGNoYW5jZSwgaW4gZ2VuZXJhbCwgYmVmb3JlIHRoZSBnb3RvIG5vcGFnZS4gKi8KIAlwYWdlID0gZ2V0X3BhZ2VfZnJvbV9mcmVlbGlzdChnZnBfbWFzaywgbm9kZW1hc2ssIG9yZGVyLCB6b25lbGlzdCwKIAkJCWhpZ2hfem9uZWlkeCwgYWxsb2NfZmxhZ3MgJiB+QUxMT0NfTk9fV0FURVJNQVJLUywKQEAgLTIwNzIsNyArMjA3Myw2IEBACiAJaWYgKHBhZ2UpCiAJCWdvdG8gZ290X3BnOwogCi1yZWJhbGFuY2U6CiAJLyogQWxsb2NhdGUgd2l0aG91dCB3YXRlcm1hcmtzIGlmIHRoZSBjb250ZXh0IGFsbG93cyAqLwogCWlmIChhbGxvY19mbGFncyAmIEFMTE9DX05PX1dBVEVSTUFSS1MpIHsKIAkJcGFnZSA9IF9fYWxsb2NfcGFnZXNfaGlnaF9wcmlvcml0eShnZnBfbWFzaywgb3JkZXIsCmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCA4ZDcwZGQ4Li42Y2EyNWNkOCAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC05MTYsMTEgKzkxNiwxMiBAQAogCQkJaWYgKHNpemUgPiBFTlRSSUVTX1BFUl9QQUdFKQogCQkJCXNpemUgPSBFTlRSSUVTX1BFUl9QQUdFOwogCQkJb2Zmc2V0ID0gc2htZW1fZmluZF9zd3AoZW50cnksIHB0ciwgcHRyK3NpemUpOworCQkJc2htZW1fc3dwX3VubWFwKHB0cik7CiAJCQlpZiAob2Zmc2V0ID49IDApIHsKIAkJCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKKwkJCQlwdHIgPSBzaG1lbV9zd3BfbWFwKHN1YmRpcik7CiAJCQkJZ290byBmb3VuZDsKIAkJCX0KLQkJCXNobWVtX3N3cF91bm1hcChwdHIpOwogCQl9CiAJfQogbG9zdDE6CkBAIC0xMTAwLDggKzExMDEsOCBAQAogCQlkZWxldGVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOwogCQlzaG1lbV9zd3Bfc2V0KGluZm8sIGVudHJ5LCBzd2FwLnZhbCk7CiAJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAkJc3dhcF9zaG1lbV9hbGxvYyhzd2FwKTsKKwkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCQlCVUdfT04ocGFnZV9tYXBwZWQocGFnZSkpOwogCQlzd2FwX3dyaXRlcGFnZShwYWdlLCB3YmMpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA5ZDJlNWU0Li5mNmNiNmNkNiAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMjYxLDYgKzI2MSwxOCBAQAogCXJldHVybiAqKHZvaWQgKiopKG9iamVjdCArIHMtPm9mZnNldCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2ZyZWVwb2ludGVyX3NhZmUoc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKm9iamVjdCkKK3sKKwl2b2lkICpwOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCXByb2JlX2tlcm5lbF9yZWFkKCZwLCAodm9pZCAqKikob2JqZWN0ICsgcy0+b2Zmc2V0KSwgc2l6ZW9mKHApKTsKKyNlbHNlCisJcCA9IGdldF9mcmVlcG9pbnRlcihzLCBvYmplY3QpOworI2VuZGlmCisJcmV0dXJuIHA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXBvaW50ZXIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKm9iamVjdCwgdm9pZCAqZnApCiB7CiAJKih2b2lkICoqKShvYmplY3QgKyBzLT5vZmZzZXQpID0gZnA7CkBAIC0xOTQzLDcgKzE5NTUsNyBAQAogCQlpZiAodW5saWtlbHkoIWlycXNhZmVfY3B1X2NtcHhjaGdfZG91YmxlKAogCQkJCXMtPmNwdV9zbGFiLT5mcmVlbGlzdCwgcy0+Y3B1X3NsYWItPnRpZCwKIAkJCQlvYmplY3QsIHRpZCwKLQkJCQlnZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0KSwgbmV4dF90aWQodGlkKSkpKSB7CisJCQkJZ2V0X2ZyZWVwb2ludGVyX3NhZmUocywgb2JqZWN0KSwgbmV4dF90aWQodGlkKSkpKSB7CiAKIAkJCW5vdGVfY21weGNoZ19mYWlsdXJlKCJzbGFiX2FsbG9jIiwgcywgdGlkKTsKIAkJCWdvdG8gcmVkbzsKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggOGJmZDQ1MC4uN2YzMjcwZiAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTIzMCw4ICsyMzAsMTEgQEAKIAlpZiAoc2Nhbm5lZCA9PSAwKQogCQlzY2FubmVkID0gU1dBUF9DTFVTVEVSX01BWDsKIAotCWlmICghZG93bl9yZWFkX3RyeWxvY2soJnNocmlua2VyX3J3c2VtKSkKLQkJcmV0dXJuIDE7CS8qIEFzc3VtZSB3ZSdsbCBiZSBhYmxlIHRvIHNocmluayBuZXh0IHRpbWUgKi8KKwlpZiAoIWRvd25fcmVhZF90cnlsb2NrKCZzaHJpbmtlcl9yd3NlbSkpIHsKKwkJLyogQXNzdW1lIHdlJ2xsIGJlIGFibGUgdG8gc2hyaW5rIG5leHQgdGltZSAqLworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNocmlua2VyLCAmc2hyaW5rZXJfbGlzdCwgbGlzdCkgewogCQl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGE7CkBAIC0yODIsNiArMjg1LDggQEAKIAkJc2hyaW5rZXItPm5yICs9IHRvdGFsX3NjYW47CiAJfQogCXVwX3JlYWQoJnNocmlua2VyX3J3c2VtKTsKK291dDoKKwljb25kX3Jlc2NoZWQoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTA5LDggKzExMTQsMjAgQEAKIAkJCQkJbnJfbHVtcHlfZGlydHkrKzsKIAkJCQlzY2FuKys7CiAJCQl9IGVsc2UgewotCQkJCS8qIHRoZSBwYWdlIGlzIGZyZWVkIGFscmVhZHkuICovCi0JCQkJaWYgKCFwYWdlX2NvdW50KGN1cnNvcl9wYWdlKSkKKwkJCQkvKgorCQkJCSAqIENoZWNrIGlmIHRoZSBwYWdlIGlzIGZyZWVkIGFscmVhZHkuCisJCQkJICoKKwkJCQkgKiBXZSBjYW4ndCB1c2UgcGFnZV9jb3VudCgpIGFzIHRoYXQKKwkJCQkgKiByZXF1aXJlcyBjb21wb3VuZF9oZWFkIGFuZCB3ZSBkb24ndAorCQkJCSAqIGhhdmUgYSBwaW4gb24gdGhlIHBhZ2UgaGVyZS4gSWYgYQorCQkJCSAqIHBhZ2UgaXMgdGFpbCwgd2UgbWF5IG9yIG1heSBub3QKKwkJCQkgKiBoYXZlIGlzb2xhdGVkIHRoZSBoZWFkLCBzbyBhc3N1bWUKKwkJCQkgKiBpdCdzIG5vdCBmcmVlLCBpdCdkIGJlIHRyaWNreSB0bworCQkJCSAqIHRyYWNrIHRoZSBoZWFkIHN0YXR1cyB3aXRob3V0IGEKKwkJCQkgKiBwYWdlIHBpbi4KKwkJCQkgKi8KKwkJCQlpZiAoIVBhZ2VUYWlsKGN1cnNvcl9wYWdlKSAmJgorCQkJCSAgICAhYXRvbWljX3JlYWQoJmN1cnNvcl9wYWdlLT5fY291bnQpKQogCQkJCQljb250aW51ZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTIyNDAsNyArMjI1Nyw4IEBACiAJZm9yIChpID0gMDsgaSA8PSBjbGFzc3pvbmVfaWR4OyBpKyspCiAJCXByZXNlbnRfcGFnZXMgKz0gcGdkYXQtPm5vZGVfem9uZXNbaV0ucHJlc2VudF9wYWdlczsKIAotCXJldHVybiBiYWxhbmNlZF9wYWdlcyA+IChwcmVzZW50X3BhZ2VzID4+IDIpOworCS8qIEEgc3BlY2lhbCBjYXNlIGhlcmU6IGlmIHpvbmUgaGFzIG5vIHBhZ2UsIHdlIHRoaW5rIGl0J3MgYmFsYW5jZWQgKi8KKwlyZXR1cm4gYmFsYW5jZWRfcGFnZXMgPj0gKHByZXNlbnRfcGFnZXMgPj4gMik7CiB9CiAKIC8qIGlzIGtzd2FwZCBzbGVlcGluZyBwcmVtYXR1cmVseT8gKi8KQEAgLTIyNTYsNyArMjI3NCw3IEBACiAJCXJldHVybiB0cnVlOwogCiAJLyogQ2hlY2sgdGhlIHdhdGVybWFyayBsZXZlbHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5yX3pvbmVzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IGNsYXNzem9uZV9pZHg7IGkrKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKIAogCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQpAQCAtMjI3NCw3ICsyMjkyLDcgQEAKIAkJfQogCiAJCWlmICghem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwgaGlnaF93bWFya19wYWdlcyh6b25lKSwKLQkJCQkJCQljbGFzc3pvbmVfaWR4LCAwKSkKKwkJCQkJCQlpLCAwKSkKIAkJCWFsbF96b25lc19vayA9IGZhbHNlOwogCQllbHNlCiAJCQliYWxhbmNlZCArPSB6b25lLT5wcmVzZW50X3BhZ2VzOwpAQCAtMjI4Niw3ICsyMzA0LDcgQEAKIAkgKiBtdXN0IGJlIGJhbGFuY2VkCiAJICovCiAJaWYgKG9yZGVyKQotCQlyZXR1cm4gcGdkYXRfYmFsYW5jZWQocGdkYXQsIGJhbGFuY2VkLCBjbGFzc3pvbmVfaWR4KTsKKwkJcmV0dXJuICFwZ2RhdF9iYWxhbmNlZChwZ2RhdCwgYmFsYW5jZWQsIGNsYXNzem9uZV9pZHgpOwogCWVsc2UKIAkJcmV0dXJuICFhbGxfem9uZXNfb2s7CiB9CkBAIC0yMzc2LDcgKzIzOTQsNiBAQAogCQkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLAogCQkJCQloaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLCAwLCAwKSkgewogCQkJCWVuZF96b25lID0gaTsKLQkJCQkqY2xhc3N6b25lX2lkeCA9IGk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTI0MzEsMTkgKzI0NDgsMTkgQEAKIAkJCQlLU1dBUERfWk9ORV9CQUxBTkNFX0dBUF9SQVRJTyk7CiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsCiAJCQkJCWhpZ2hfd21hcmtfcGFnZXMoem9uZSkgKyBiYWxhbmNlX2dhcCwKLQkJCQkJZW5kX3pvbmUsIDApKQorCQkJCQllbmRfem9uZSwgMCkpIHsKIAkJCQlzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgJnNjKTsKLQkJCXJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiID0gMDsKLQkJCW5yX3NsYWIgPSBzaHJpbmtfc2xhYihzYy5ucl9zY2FubmVkLCBHRlBfS0VSTkVMLAotCQkJCQkJbHJ1X3BhZ2VzKTsKLQkJCXNjLm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKLQkJCXRvdGFsX3NjYW5uZWQgKz0gc2MubnJfc2Nhbm5lZDsKIAotCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5yX3NsYWIgPT0gMCAmJgotCQkJICAgICF6b25lX3JlY2xhaW1hYmxlKHpvbmUpKQotCQkJCXpvbmUtPmFsbF91bnJlY2xhaW1hYmxlID0gMTsKKwkJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CisJCQkJbnJfc2xhYiA9IHNocmlua19zbGFiKHNjLm5yX3NjYW5uZWQsIEdGUF9LRVJORUwsCisJCQkJCQkJbHJ1X3BhZ2VzKTsKKwkJCQlzYy5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CisJCQkJdG90YWxfc2Nhbm5lZCArPSBzYy5ucl9zY2FubmVkOworCisJCQkJaWYgKG5yX3NsYWIgPT0gMCAmJiAhem9uZV9yZWNsYWltYWJsZSh6b25lKSkKKwkJCQkJem9uZS0+YWxsX3VucmVjbGFpbWFibGUgPSAxOworCQkJfQorCiAJCQkvKgogCQkJICogSWYgd2UndmUgZG9uZSBhIGRlY2VudCBhbW91bnQgb2Ygc2Nhbm5pbmcgYW5kCiAJCQkgKiB0aGUgcmVjbGFpbSByYXRpbyBpcyBsb3csIHN0YXJ0IGRvaW5nIHdyaXRlcGFnZQpAQCAtMjQ1Myw2ICsyNDcwLDEyIEBACiAJCQkgICAgdG90YWxfc2Nhbm5lZCA+IHNjLm5yX3JlY2xhaW1lZCArIHNjLm5yX3JlY2xhaW1lZCAvIDIpCiAJCQkJc2MubWF5X3dyaXRlcGFnZSA9IDE7CiAKKwkJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSkgeworCQkJCWlmIChlbmRfem9uZSAmJiBlbmRfem9uZSA9PSBpKQorCQkJCQllbmRfem9uZS0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsCiAJCQkJCWhpZ2hfd21hcmtfcGFnZXMoem9uZSksIGVuZF96b25lLCAwKSkgewogCQkJCWFsbF96b25lc19vayA9IDA7CkBAIC0yNjMxLDggKzI2NTQsOCBAQAogICovCiBzdGF0aWMgaW50IGtzd2FwZCh2b2lkICpwKQogewotCXVuc2lnbmVkIGxvbmcgb3JkZXI7Ci0JaW50IGNsYXNzem9uZV9pZHg7CisJdW5zaWduZWQgbG9uZyBvcmRlciwgbmV3X29yZGVyOworCWludCBjbGFzc3pvbmVfaWR4LCBuZXdfY2xhc3N6b25lX2lkeDsKIAlwZ19kYXRhX3QgKnBnZGF0ID0gKHBnX2RhdGFfdCopcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKQEAgLTI2NjIsMTcgKzI2ODUsMjMgQEAKIAl0c2stPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfU1dBUFdSSVRFIHwgUEZfS1NXQVBEOwogCXNldF9mcmVlemFibGUoKTsKIAotCW9yZGVyID0gMDsKLQljbGFzc3pvbmVfaWR4ID0gTUFYX05SX1pPTkVTIC0gMTsKKwlvcmRlciA9IG5ld19vcmRlciA9IDA7CisJY2xhc3N6b25lX2lkeCA9IG5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKIAlmb3IgKCA7IDsgKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbmV3X29yZGVyOwotCQlpbnQgbmV3X2NsYXNzem9uZV9pZHg7CiAJCWludCByZXQ7CiAKLQkJbmV3X29yZGVyID0gcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXI7Ci0JCW5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7Ci0JCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gMDsKLQkJcGdkYXQtPmNsYXNzem9uZV9pZHggPSBNQVhfTlJfWk9ORVMgLSAxOworCQkvKgorCQkgKiBJZiB0aGUgbGFzdCBiYWxhbmNlX3BnZGF0IHdhcyB1bnN1Y2Nlc3NmdWwgaXQncyB1bmxpa2VseSBhCisJCSAqIG5ldyByZXF1ZXN0IG9mIGEgc2ltaWxhciBvciBoYXJkZXIgdHlwZSB3aWxsIHN1Y2NlZWQgc29vbgorCQkgKiBzbyBjb25zaWRlciBnb2luZyB0byBzbGVlcCBvbiB0aGUgYmFzaXMgd2UgcmVjbGFpbWVkIGF0CisJCSAqLworCQlpZiAoY2xhc3N6b25lX2lkeCA+PSBuZXdfY2xhc3N6b25lX2lkeCAmJiBvcmRlciA9PSBuZXdfb3JkZXIpIHsKKwkJCW5ld19vcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOworCQkJbmV3X2NsYXNzem9uZV9pZHggPSBwZ2RhdC0+Y2xhc3N6b25lX2lkeDsKKwkJCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gIDA7CisJCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IHBnZGF0LT5ucl96b25lcyAtIDE7CisJCX0KKwogCQlpZiAob3JkZXIgPCBuZXdfb3JkZXIgfHwgY2xhc3N6b25lX2lkeCA+IG5ld19jbGFzc3pvbmVfaWR4KSB7CiAJCQkvKgogCQkJICogRG9uJ3Qgc2xlZXAgaWYgc29tZW9uZSB3YW50cyBhIGxhcmdlciAnb3JkZXInCkBAIC0yNjg1LDcgKzI3MTQsNyBAQAogCQkJb3JkZXIgPSBwZ2RhdC0+a3N3YXBkX21heF9vcmRlcjsKIAkJCWNsYXNzem9uZV9pZHggPSBwZ2RhdC0+Y2xhc3N6b25lX2lkeDsKIAkJCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gMDsKLQkJCXBnZGF0LT5jbGFzc3pvbmVfaWR4ID0gTUFYX05SX1pPTkVTIC0gMTsKKwkJCXBnZGF0LT5jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKIAkJfQogCiAJCXJldCA9IHRyeV90b19mcmVlemUoKTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2Rldi5jIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKaW5kZXggYjJmZjZjOC4uZjExZTYxZSAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luY3ApOwogCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCQlzdGF0cy0+dHhfYnl0ZXMgKz0gbGVuOwotCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luY3ApOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmNwKTsKIAl9IGVsc2UgewogCQl0aGlzX2NwdV9pbmModmxhbl9kZXZfaW5mbyhkZXYpLT52bGFuX3BjcHVfc3RhdHMtPnR4X2Ryb3BwZWQpOwogCX0KZGlmZiAtLWdpdCBhL25ldC9hdG0vYXRtX3N5c2ZzLmMgYi9uZXQvYXRtL2F0bV9zeXNmcy5jCmluZGV4IGY3ZmE2N2MuLmY0OWRhNTggMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYXRtX3N5c2ZzLmMKKysrIGIvbmV0L2F0bS9hdG1fc3lzZnMuYwpAQCAtNTksNiArNTksMTQgQEAKIAlyZXR1cm4gcG9zIC0gYnVmOwogfQogCitzdGF0aWMgc3NpemVfdCBzaG93X2F0bWluZGV4KHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGF0bV9kZXYgKmFkZXYgPSB0b19hdG1fZGV2KGNkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGFkZXYtPm51bWJlcik7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfY2FycmllcihzdHJ1Y3QgZGV2aWNlICpjZGV2LAogCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC05OSw2ICsxMDcsNyBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoYWRkcmVzcywgU19JUlVHTywgc2hvd19hZGRyZXNzLCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihhdG1hZGRyZXNzLCBTX0lSVUdPLCBzaG93X2F0bWFkZHJlc3MsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGF0bWluZGV4LCBTX0lSVUdPLCBzaG93X2F0bWluZGV4LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihjYXJyaWVyLCBTX0lSVUdPLCBzaG93X2NhcnJpZXIsIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHR5cGUsIFNfSVJVR08sIHNob3dfdHlwZSwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobGlua19yYXRlLCBTX0lSVUdPLCBzaG93X2xpbmtfcmF0ZSwgTlVMTCk7CkBAIC0xMDYsNiArMTE1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXRtX2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX2F0bWFkZHJlc3MsCiAJJmRldl9hdHRyX2FkZHJlc3MsCisJJmRldl9hdHRyX2F0bWluZGV4LAogCSZkZXZfYXR0cl9jYXJyaWVyLAogCSZkZXZfYXR0cl90eXBlLAogCSZkZXZfYXR0cl9saW5rX3JhdGUsCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKaW5kZXggMzhjNjkyZC4uODQ0NzNhYiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJaWYgKGFjbC0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEICYmCiAJCQkoc2NvLT5zdGF0ZSA9PSBCVF9PUEVOIHx8IHNjby0+c3RhdGUgPT0gQlRfQ0xPU0VEKSkgewogCQlhY2wtPnBvd2VyX3NhdmUgPSAxOwotCQloY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShhY2wpOworCQloY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShhY2wsIEJUX1BPV0VSX0ZPUkNFX0FDVElWRV9PTik7CiAKIAkJaWYgKHRlc3RfYml0KEhDSV9DT05OX01PREVfQ0hBTkdFX1BFTkQsICZhY2wtPnBlbmQpKSB7CiAJCQkvKiBkZWZlciBTQ08gc2V0dXAgdW50aWwgbW9kZSBjaGFuZ2UgY29tcGxldGVkICovCkBAIC02MTIsNyArNjEyLDcgQEAKIEVYUE9SVF9TWU1CT0woaGNpX2Nvbm5fc3dpdGNoX3JvbGUpOwogCiAvKiBFbnRlciBhY3RpdmUgbW9kZSAqLwotdm9pZCBoY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCit2b2lkIGhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBmb3JjZV9hY3RpdmUpCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwogCkBAIC02MjEsNyArNjIxLDEwIEBACiAJaWYgKHRlc3RfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAotCWlmIChjb25uLT5tb2RlICE9IEhDSV9DTV9TTklGRiB8fCAhY29ubi0+cG93ZXJfc2F2ZSkKKwlpZiAoY29ubi0+bW9kZSAhPSBIQ0lfQ01fU05JRkYpCisJCWdvdG8gdGltZXI7CisKKwlpZiAoIWNvbm4tPnBvd2VyX3NhdmUgJiYgIWZvcmNlX2FjdGl2ZSkKIAkJZ290byB0aW1lcjsKIAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9NT0RFX0NIQU5HRV9QRU5ELCAmY29ubi0+cGVuZCkpIHsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwppbmRleCBiNWE4YWZjLi45MzRhNTU1MSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwpAQCAtMTc2OSw3ICsxNzY5LDcgQEAKIAkJd2hpbGUgKHF1b3RlLS0gJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5kYXRhX3EpKSkgewogCQkJQlRfREJHKCJza2IgJXAgbGVuICVkIiwgc2tiLCBza2ItPmxlbik7CiAKLQkJCWhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKGNvbm4pOworCQkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoY29ubiwgYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlKTsKIAogCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKIAkJCWhkZXYtPmFjbF9sYXN0X3R4ID0gamlmZmllczsKQEAgLTE5MDgsNyArMTkwOCw3IEBACiAJaWYgKGNvbm4pIHsKIAkJcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7CiAKLQkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoY29ubik7CisJCWhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKGNvbm4sIGJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSk7CiAKIAkJLyogU2VuZCB0byB1cHBlciBwcm90b2NvbCAqLwogCQlocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fTDJDQVBdOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYwppbmRleCA2NDNhN2RmLi4yZjdiNjdhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYwpAQCAtMzM4LDYgKzMzOCw4IEBACiAJZWxzZQogCQlmbGFncyA9IEFDTF9TVEFSVDsKIAorCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IEJUX1BPV0VSX0ZPUkNFX0FDVElWRV9PTjsKKwogCWhjaV9zZW5kX2FjbChjb25uLT5oY29uLCBza2IsIGZsYWdzKTsKIH0KIApAQCAtMzkwLDYgKzM5Miw3IEBACiAJZWxzZQogCQlmbGFncyA9IEFDTF9TVEFSVDsKIAorCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IHBpLT5mb3JjZV9hY3RpdmU7CiAJaGNpX3NlbmRfYWNsKHBpLT5jb25uLT5oY29uLCBza2IsIGZsYWdzKTsKIH0KIApAQCAtOTk5LDYgKzEwMDIsNyBAQAogCWVsc2UKIAkJZmxhZ3MgPSBBQ0xfU1RBUlQ7CiAKKwlidF9jYihza2IpLT5mb3JjZV9hY3RpdmUgPSBwaS0+Zm9yY2VfYWN0aXZlOwogCWhjaV9zZW5kX2FjbChoY29uLCBza2IsIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwppbmRleCAyOTlmZTU2Li5lNWE0YjA4ZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTQ2OCw2ICs0NjgsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBidF9zZWN1cml0eSBzZWM7CisJc3RydWN0IGJ0X3Bvd2VyIHB3cjsKIAlpbnQgbGVuLCBlcnIgPSAwOwogCiAJQlRfREJHKCJzayAlcCIsIHNrKTsKQEAgLTUxNiw2ICs1MTcsMjEgQEAKIAogCQlicmVhazsKIAorCWNhc2UgQlRfUE9XRVI6CisJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJiBzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTQorCQkJCSYmIHNrLT5za190eXBlICE9IFNPQ0tfUkFXKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlwd3IuZm9yY2VfYWN0aXZlID0gbDJjYXBfcGkoc2spLT5mb3JjZV9hY3RpdmU7CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihwd3IpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIChjaGFyICopICZwd3IsIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKQEAgLTYxNCw2ICs2MzAsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBidF9zZWN1cml0eSBzZWM7CisJc3RydWN0IGJ0X3Bvd2VyIHB3cjsKIAlpbnQgbGVuLCBlcnIgPSAwOwogCXUzMiBvcHQ7CiAKQEAgLTY5MCw2ICs3MDcsMjMgQEAKIAkJbDJjYXBfcGkoc2spLT5mbHVzaGFibGUgPSBvcHQ7CiAJCWJyZWFrOwogCisJY2FzZSBCVF9QT1dFUjoKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUICYmIHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNCisJCQkJJiYgc2stPnNrX3R5cGUgIT0gU09DS19SQVcpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXB3ci5mb3JjZV9hY3RpdmUgPSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT047CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YocHdyKSwgb3B0bGVuKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopICZwd3IsIG9wdHZhbCwgbGVuKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWwyY2FwX3BpKHNrKS0+Zm9yY2VfYWN0aXZlID0gcHdyLmZvcmNlX2FjdGl2ZTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwpAQCAtMTAxNiw2ICsxMDUwLDcgQEAKIAkJcGktPnJvbGVfc3dpdGNoID0gbDJjYXBfcGkocGFyZW50KS0+cm9sZV9zd2l0Y2g7CiAJCXBpLT5mb3JjZV9yZWxpYWJsZSA9IGwyY2FwX3BpKHBhcmVudCktPmZvcmNlX3JlbGlhYmxlOwogCQlwaS0+Zmx1c2hhYmxlID0gbDJjYXBfcGkocGFyZW50KS0+Zmx1c2hhYmxlOworCQlwaS0+Zm9yY2VfYWN0aXZlID0gbDJjYXBfcGkocGFyZW50KS0+Zm9yY2VfYWN0aXZlOwogCX0gZWxzZSB7CiAJCXBpLT5pbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CiAJCXBpLT5vbXR1ID0gMDsKQEAgLTEwMzIsNiArMTA2Nyw3IEBACiAJCXBpLT5yb2xlX3N3aXRjaCA9IDA7CiAJCXBpLT5mb3JjZV9yZWxpYWJsZSA9IDA7CiAJCXBpLT5mbHVzaGFibGUgPSBCVF9GTFVTSEFCTEVfT0ZGOworCQlwaS0+Zm9yY2VfYWN0aXZlID0gQlRfUE9XRVJfRk9SQ0VfQUNUSVZFX09OOwogCX0KIAogCS8qIERlZmF1bHQgY29uZmlnIG9wdGlvbnMgKi8KQEAgLTEwNjEsNyArMTA5Nyw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmJ0X3NrKHNrKS0+YWNjZXB0X3EpOwogCiAJc2stPnNrX2Rlc3RydWN0ID0gbDJjYXBfc29ja19kZXN0cnVjdDsKLQlzay0+c2tfc25kdGltZW8gPSBtc2Vjc190b19qaWZmaWVzKEwyQ0FQX0NPTk5fVElNRU9VVCk7CisJc2stPnNrX3NuZHRpbWVvID0gTDJDQVBfQ09OTl9USU1FT1VUOwogCiAJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwppbmRleCAwMDNhYmU2Li5jYTMzYzU1IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCkBAIC02NjcsNiArNjY3LDkgQEAKIAogCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgZXJyICVkIiwgcywgcy0+c3RhdGUsIGVycik7CiAKKwlpZiAocy0+c3RhdGUgPT0gQlRfQ0xPU0VEKQorCQlyZXR1cm47CisKIAlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOwogCiAJcy0+c3RhdGUgPSBCVF9DTE9TRUQ7CkBAIC02NzksNiArNjgyLDEyIEBACiAJfQogCiAJcmZjb21tX3Nlc3Npb25fY2xlYXJfdGltZXIocyk7CisKKwkvKiBEcm9wIHJlZmVyZW5jZSBmb3IgaW5jb21pbmcgc2Vzc2lvbnMgKi8KKwlpZiAoIXMtPmluaXRpYXRvcikKKwkJaWYgKGxpc3RfZW1wdHkoJnMtPmRsY3MpKQorCQkJcmZjb21tX3Nlc3Npb25fcHV0KHMpOworCiAJcmZjb21tX3Nlc3Npb25fcHV0KHMpOwogfQogCkBAIC0xMTU5LDEyICsxMTY4LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgQlRfRElTQ09OTjoKLQkJCS8qIFdoZW4gc29ja2V0IGlzIGNsb3NlZCBhbmQgd2UgYXJlIG5vdCBSRkNPTU0KLQkJCSAqIGluaXRpYXRvciByZmNvbW1fcHJvY2Vzc19yeCBhbHJlYWR5IGNhbGxzCi0JCQkgKiByZmNvbW1fc2Vzc2lvbl9wdXQoKSAqLwotCQkJaWYgKHMtPnNvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DTE9TRUQpCi0JCQkJaWYgKGxpc3RfZW1wdHkoJnMtPmRsY3MpKQotCQkJCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisJCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCAwKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTE5NSw3ICsxMTk5LDYgQEAKIAkJZWxzZQogCQkJZXJyID0gRUNPTk5SRVNFVDsKIAotCQlzLT5zdGF0ZSA9IEJUX0NMT1NFRDsKIAkJcmZjb21tX3Nlc3Npb25fY2xvc2UocywgZXJyKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMjMwLDcgKzEyMzMsNiBAQAogCQllbHNlCiAJCQllcnIgPSBFQ09OTlJFU0VUOwogCi0JCXMtPnN0YXRlID0gQlRfQ0xPU0VEOwogCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCBlcnIpOwogCX0KIApAQCAtMTg1NSwxMiArMTg1Nyw4IEBACiAJCXJmY29tbV9yZWN2X2ZyYW1lKHMsIHNrYik7CiAJfQogCi0JaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKLQkJaWYgKCFzLT5pbml0aWF0b3IpCi0JCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7Ci0KKwlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCkKIAkJcmZjb21tX3Nlc3Npb25fY2xvc2Uocywgc2stPnNrX2Vycik7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX2FjY2VwdF9jb25uZWN0aW9uKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKQEAgLTE5MTQsNyArMTkxMiw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCVF9DTE9TRUQ6Ci0JCXMtPnN0YXRlID0gQlRfQ0xPU0VEOwogCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCBzay0+c2tfZXJyKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggMjFlNTkwMS4uMjk4ZGU1ZCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC0zOCwxNiArMzgsMTcgQEAKIAl9CiAjZW5kaWYKIAotCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmJyc3RhdHMtPnN5bmNwKTsKLQlicnN0YXRzLT50eF9wYWNrZXRzKys7Ci0JYnJzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmJyc3RhdHMtPnN5bmNwKTsKLQogCUJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldiA9IGRldjsKIAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZicnN0YXRzLT5zeW5jcCk7CisJYnJzdGF0cy0+dHhfcGFja2V0cysrOworCS8qIEV4Y2x1ZGUgRVRIX0hMRU4gZnJvbSBieXRlIHN0YXRzIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJ4IGNoYWluICovCisJYnJzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmJyc3RhdHMtPnN5bmNwKTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKIAkJaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyhkZXYpKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKaW5kZXggNzRlZjRkNC4uZWNhYWEwMCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCkBAIC0xMDQsMTAgKzEwNCwxNiBAQAogewogfQogCitzdGF0aWMgdTMyICpmYWtlX2Nvd19tZXRyaWNzKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdW5zaWduZWQgbG9uZyBvbGQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyBmYWtlX2RzdF9vcHMgPSB7CiAJLmZhbWlseSA9CQlBRl9JTkVULAogCS5wcm90b2NvbCA9CQljcHVfdG9fYmUxNihFVEhfUF9JUCksCiAJLnVwZGF0ZV9wbXR1ID0JCWZha2VfdXBkYXRlX3BtdHUsCisJLmNvd19tZXRyaWNzID0JCWZha2VfY293X21ldHJpY3MsCiB9OwogCiAvKgpAQCAtMTE3LDYgKzEyMywxMCBAQAogICogaXB0X1JFSkVDVCBuZWVkcyBpdC4gIEZ1dHVyZSBuZXRmaWx0ZXIgbW9kdWxlcyBtaWdodAogICogcmVxdWlyZSB1cyB0byBmaWxsIGFkZGl0aW9uYWwgZmllbGRzLgogICovCitzdGF0aWMgY29uc3QgdTMyIGJyX2RzdF9kZWZhdWx0X21ldHJpY3NbUlRBWF9NQVhdID0geworCVtSVEFYX01UVSAtIDFdID0gMTUwMCwKK307CisKIHZvaWQgYnJfbmV0ZmlsdGVyX3J0YWJsZV9pbml0KHN0cnVjdCBuZXRfYnJpZGdlICpicikKIHsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9ICZici0+ZmFrZV9ydGFibGU7CkBAIC0xMjQsNyArMTM0LDcgQEAKIAlhdG9taWNfc2V0KCZydC0+ZHN0Ll9fcmVmY250LCAxKTsKIAlydC0+ZHN0LmRldiA9IGJyLT5kZXY7CiAJcnQtPmRzdC5wYXRoID0gJnJ0LT5kc3Q7Ci0JZHN0X21ldHJpY19zZXQoJnJ0LT5kc3QsIFJUQVhfTVRVLCAxNTAwKTsKKwlkc3RfaW5pdF9tZXRyaWNzKCZydC0+ZHN0LCBicl9kc3RfZGVmYXVsdF9tZXRyaWNzLCB0cnVlKTsKIAlydC0+ZHN0LmZsYWdzCT0gRFNUX05PWEZSTTsKIAlydC0+ZHN0Lm9wcyA9ICZmYWtlX2RzdF9vcHM7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCmluZGV4IDM4NzAxM2QuLjVlOWFlNTcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCisrKyBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCkBAIC0xMjMsNiArMTIzLDcgQEAKIAlicmlkZ2VfaWQJCQlkZXNpZ25hdGVkX2JyaWRnZTsKIAl1MzIJCQkJcGF0aF9jb3N0OwogCXUzMgkJCQlkZXNpZ25hdGVkX2Nvc3Q7CisJdW5zaWduZWQgbG9uZwkJCWRlc2lnbmF0ZWRfYWdlOwogCiAJc3RydWN0IHRpbWVyX2xpc3QJCWZvcndhcmRfZGVsYXlfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QJCWhvbGRfdGltZXI7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cC5jIGIvbmV0L2JyaWRnZS9icl9zdHAuYwppbmRleCA3MzcwZDE0Li5jMjRhZTBkOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHAuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cC5jCkBAIC0xNjQsOCArMTY0LDcgQEAKIAllbHNlIHsKIAkJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcm9vdAogCQkJPSBicl9nZXRfcG9ydChiciwgYnItPnJvb3RfcG9ydCk7Ci0JCWJwZHUubWVzc2FnZV9hZ2UgPSBici0+bWF4X2FnZQotCQkJLSAocm9vdC0+bWVzc2FnZV9hZ2VfdGltZXIuZXhwaXJlcyAtIGppZmZpZXMpCisJCWJwZHUubWVzc2FnZV9hZ2UgPSAoamlmZmllcyAtIHJvb3QtPmRlc2lnbmF0ZWRfYWdlKQogCQkJKyBNRVNTQUdFX0FHRV9JTkNSOwogCX0KIAlicGR1Lm1heF9hZ2UgPSBici0+bWF4X2FnZTsKQEAgLTE4OSw2ICsxODgsNyBAQAogCXAtPmRlc2lnbmF0ZWRfY29zdCA9IGJwZHUtPnJvb3RfcGF0aF9jb3N0OwogCXAtPmRlc2lnbmF0ZWRfYnJpZGdlID0gYnBkdS0+YnJpZGdlX2lkOwogCXAtPmRlc2lnbmF0ZWRfcG9ydCA9IGJwZHUtPnBvcnRfaWQ7CisJcC0+ZGVzaWduYXRlZF9hZ2UgPSBqaWZmaWVzICsgYnBkdS0+bWVzc2FnZV9hZ2U7CiAKIAltb2RfdGltZXIoJnAtPm1lc3NhZ2VfYWdlX3RpbWVyLCBqaWZmaWVzCiAJCSAgKyAocC0+YnItPm1heF9hZ2UgLSBicGR1LT5tZXNzYWdlX2FnZSkpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCBiNjI0ZmU0Li5hY2Q3NDIzIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAl9CiAKIAl3cml0ZV9sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKLQlobGlzdF9kZWwoJmRldi0+bmFtZV9obGlzdCk7CisJaGxpc3RfZGVsX3JjdSgmZGV2LT5uYW1lX2hsaXN0KTsKIAl3cml0ZV91bmxvY2tfYmgoJmRldl9iYXNlX2xvY2spOwogCiAJc3luY2hyb25pemVfcmN1KCk7CkBAIC01MjU4LDcgKzUyNTgsNyBAQAogCWlmIChkZXYtPmZlYXR1cmVzID09IGZlYXR1cmVzKQogCQlyZXR1cm47CiAKLQluZXRkZXZfaW5mbyhkZXYsICJGZWF0dXJlcyBjaGFuZ2VkOiAweCUwOHggLT4gMHglMDh4XG4iLAorCW5ldGRldl9kYmcoZGV2LCAiRmVhdHVyZXMgY2hhbmdlZDogMHglMDh4IC0+IDB4JTA4eFxuIiwKIAkJZGV2LT5mZWF0dXJlcywgZmVhdHVyZXMpOwogCiAJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX3NldF9mZWF0dXJlcykKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKaW5kZXggOTExMDRkMy4uYjcxYjdhMyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHN0LmMKKysrIGIvbmV0L2NvcmUvZHN0LmMKQEAgLTMxNCw3ICszMTQsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcHJldiwgbmV3OwogCi0JbmV3ID0gKHVuc2lnbmVkIGxvbmcpIGRzdF9kZWZhdWx0X21ldHJpY3M7CisJbmV3ID0gKCh1bnNpZ25lZCBsb25nKSBkc3RfZGVmYXVsdF9tZXRyaWNzKSB8IERTVF9NRVRSSUNTX1JFQURfT05MWTsKIAlwcmV2ID0gY21weGNoZygmZHN0LT5fbWV0cmljcywgb2xkLCBuZXcpOwogCWlmIChwcmV2ID09IG9sZCkKIAkJa2ZyZWUoX19EU1RfTUVUUklDU19QVFIob2xkKSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ldGh0b29sLmMgYi9uZXQvY29yZS9ldGh0b29sLmMKaW5kZXggNzRlYWQ5ZS4uNzZlZDY0NSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZXRodG9vbC5jCisrKyBiL25ldC9jb3JlL2V0aHRvb2wuYwpAQCAtMjMxLDYgKzIzMSwyOSBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IGV0aHRvb2xfc2V0X2ZsYWdzX2NvbXBhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCWludCAoKmxlZ2FjeV9zZXQpKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMiksCisJc3RydWN0IGV0aHRvb2xfc2V0X2ZlYXR1cmVzX2Jsb2NrICpmZWF0dXJlcywgdTMyIG1hc2spCit7CisJdTMyIHZhbHVlOworCisJaWYgKCFsZWdhY3lfc2V0KQorCQlyZXR1cm4gMDsKKworCWlmICghKGZlYXR1cmVzWzBdLnZhbGlkICYgbWFzaykpCisJCXJldHVybiAwOworCisJdmFsdWUgPSBkZXYtPmZlYXR1cmVzICYgfmZlYXR1cmVzWzBdLnZhbGlkOworCXZhbHVlIHw9IGZlYXR1cmVzWzBdLnJlcXVlc3RlZDsKKworCWZlYXR1cmVzWzBdLnZhbGlkICY9IH5tYXNrOworCisJaWYgKGxlZ2FjeV9zZXQoZGV2LCB2YWx1ZSAmIG1hc2spIDwgMCkKKwkJbmV0ZGV2X2luZm8oZGV2LCAiTGVnYWN5IGZsYWdzIGNoYW5nZSBmYWlsZWRcbiIpOworCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgZXRodG9vbF9zZXRfZmVhdHVyZXNfY29tcGF0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJc3RydWN0IGV0aHRvb2xfc2V0X2ZlYXR1cmVzX2Jsb2NrICpmZWF0dXJlcykKIHsKQEAgLTI0Nyw3ICsyNzAsNyBAQAogCQlmZWF0dXJlcywgTkVUSUZfRl9BTExfVFNPKTsKIAljb21wYXQgfD0gZXRodG9vbF9zZXRfZmVhdHVyZV9jb21wYXQoZGV2LCBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfcnhfY3N1bSwKIAkJZmVhdHVyZXMsIE5FVElGX0ZfUlhDU1VNKTsKLQljb21wYXQgfD0gZXRodG9vbF9zZXRfZmVhdHVyZV9jb21wYXQoZGV2LCBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfZmxhZ3MsCisJY29tcGF0IHw9IGV0aHRvb2xfc2V0X2ZsYWdzX2NvbXBhdChkZXYsIGRldi0+ZXRodG9vbF9vcHMtPnNldF9mbGFncywKIAkJZmVhdHVyZXMsIGZsYWdzX2R1cF9mZWF0dXJlcyk7CiAKIAlyZXR1cm4gY29tcGF0OwpAQCAtMzMwLDcgKzM1Myw3IEBACiAJLyogTkVUSUZfRl9JUF9DU1VNICovICAgICAgICAgInR4LWNoZWNrc3VtLWlwdjQiLAogCS8qIE5FVElGX0ZfTk9fQ1NVTSAqLyAgICAgICAgICJ0eC1jaGVja3N1bS11bm5lZWRlZCIsCiAJLyogTkVUSUZfRl9IV19DU1VNICovICAgICAgICAgInR4LWNoZWNrc3VtLWlwLWdlbmVyaWMiLAotCS8qIE5FVElGX0ZfSVBWNl9DU1VNICovICAgICAgICJ0eF9jaGVja3N1bS1pcHY2IiwKKwkvKiBORVRJRl9GX0lQVjZfQ1NVTSAqLyAgICAgICAidHgtY2hlY2tzdW0taXB2NiIsCiAJLyogTkVUSUZfRl9ISUdIRE1BICovICAgICAgICAgImhpZ2hkbWEiLAogCS8qIE5FVElGX0ZfRlJBR0xJU1QgKi8gICAgICAgICJ0eC1zY2F0dGVyLWdhdGhlci1mcmFnbGlzdCIsCiAJLyogTkVUSUZfRl9IV19WTEFOX1RYICovICAgICAgInR4LXZsYW4taHctaW5zZXJ0IiwKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggYWZiOGFmYi4uMTIzOGNiZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVjaXByb2NhbF9kaXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogZW51bSB7CiAJQlBGX1NfUkVUX0sgPSAxLApAQCAtNDA5LDcgKzQxMCw5IEBACiAJCQljb250aW51ZTsKIAkJfQogCQlkZWZhdWx0OgotCQkJV0FSTl9PTigxKTsKKwkJCVdBUk5fUkFURUxJTUlUKDEsICJVbmtub3duIGNvZGU6JXUganQ6JXUgdGY6JXUgazoldVxuIiwKKwkJCQkgICAgICAgZmVudHJ5LT5jb2RlLCBmZW50cnktPmp0LAorCQkJCSAgICAgICBmZW50cnktPmpmLCBmZW50cnktPmspOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDdlYmVlZDAuLjNlOTM0ZmU5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMjk5Myw2ICsyOTkzLDkgQEAKIAlza2ItPmRlc3RydWN0b3IgPSBzb2NrX3JtZW1fZnJlZTsKIAlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZzay0+c2tfcm1lbV9hbGxvYyk7CiAKKwkvKiBiZWZvcmUgZXhpdGluZyByY3Ugc2VjdGlvbiwgbWFrZSBzdXJlIGRzdCBpcyByZWZjb3VudGVkICovCisJc2tiX2RzdF9mb3JjZShza2IpOworCiAJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19lcnJvcl9xdWV1ZSwgc2tiKTsKIAlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKIAkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCA5NTY1YWQ2Li4xMmU3NmQxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC00ODEsNiArNDgxLDkgQEAKIAlpZiAoYWRkcl9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkKIAkJZ290byBvdXQ7CiAKKwlpZiAoYWRkci0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlnb3RvIG91dDsKKwogCWNoa19hZGRyX3JldCA9IGluZXRfYWRkcl90eXBlKHNvY2tfbmV0KHNrKSwgYWRkci0+c2luX2FkZHIuc19hZGRyKTsKIAogCS8qIE5vdCBzcGVjaWZpZWQgYnkgYW55IHN0YW5kYXJkIHBlci1zZSwgaG93ZXZlciBpdCBicmVha3MgdG9vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pZ21wLmMgYi9uZXQvaXB2NC9pZ21wLmMKaW5kZXggMWZkM2Q5Yy4uNTdjYTkzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWdtcC5jCisrKyBiL25ldC9pcHY0L2lnbXAuYwpAQCAtMTE2OSwyMCArMTE2OSwxOCBAQAogCiAJaWYgKCFpbl9kZXYtPmRlYWQpIHsKIAkJaWYgKElHTVBfVjFfU0VFTihpbl9kZXYpKQotCQkJZ290byBkb25lOworCQkJcmV0dXJuOwogCQlpZiAoSUdNUF9WMl9TRUVOKGluX2RldikpIHsKIAkJCWlmIChyZXBvcnRlcikKIAkJCQlpZ21wX3NlbmRfcmVwb3J0KGluX2RldiwgaW0sIElHTVBfSE9TVF9MRUFWRV9NRVNTQUdFKTsKLQkJCWdvdG8gZG9uZTsKKwkJCXJldHVybjsKIAkJfQogCQkvKiBJR01QdjMgKi8KIAkJaWdtcHYzX2FkZF9kZWxyZWMoaW5fZGV2LCBpbSk7CiAKIAkJaWdtcF9pZmNfZXZlbnQoaW5fZGV2KTsKIAl9Ci1kb25lOgogI2VuZGlmCi0JaXBfbWNfY2xlYXJfc3JjKGltKTsKIH0KIAogc3RhdGljIHZvaWQgaWdtcF9ncm91cF9hZGRlZChzdHJ1Y3QgaXBfbWNfbGlzdCAqaW0pCkBAIC0xMzE5LDYgKzEzMTcsNyBAQAogCQkJCSppcCA9IGktPm5leHRfcmN1OwogCQkJCWluX2Rldi0+bWNfY291bnQtLTsKIAkJCQlpZ21wX2dyb3VwX2Ryb3BwZWQoaSk7CisJCQkJaXBfbWNfY2xlYXJfc3JjKGkpOwogCiAJCQkJaWYgKCFpbl9kZXYtPmRlYWQpCiAJCQkJCWlwX3J0X211bHRpY2FzdF9ldmVudChpbl9kZXYpOwpAQCAtMTQyOCw3ICsxNDI3LDggQEAKIAkJaW5fZGV2LT5tY19saXN0ID0gaS0+bmV4dF9yY3U7CiAJCWluX2Rldi0+bWNfY291bnQtLTsKIAotCQlpZ21wX2dyb3VwX2Ryb3BwZWQoaSk7CisJCS8qIFdlJ3ZlIGRyb3BwZWQgdGhlIGdyb3VwcyBpbiBpcF9tY19kb3duIGFscmVhZHkgKi8KKwkJaXBfbWNfY2xlYXJfc3JjKGkpOwogCQlpcF9tYV9wdXQoaSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCAyYWRhMTcxLi42NWMyM2Q5NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKQEAgLTQzNyw3ICs0MzcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWlmIChjYyA9PSBsZW4pCiAJCQlyZXR1cm4gMTsKLQkJaWYgKG9wLT55ZXMgPCA0KQorCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyAmIDMpCiAJCQlyZXR1cm4gMDsKIAkJbGVuIC09IG9wLT55ZXM7CiAJCWJjICArPSBvcC0+eWVzOwpAQCAtNDQ3LDExICs0NDcsMTEgQEAKIAogc3RhdGljIGludCBpbmV0X2RpYWdfYmNfYXVkaXQoY29uc3Qgdm9pZCAqYnl0ZWNvZGUsIGludCBieXRlY29kZV9sZW4pCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYmMgPSBieXRlY29kZTsKKwljb25zdCB2b2lkICpiYyA9IGJ5dGVjb2RlOwogCWludCAgbGVuID0gYnl0ZWNvZGVfbGVuOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AgPSAoc3RydWN0IGluZXRfZGlhZ19iY19vcCAqKWJjOworCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCA9IGJjOwogCiAvL3ByaW50aygiQkM6ICVkICVkICVkIHslZH0gLyAlZFxuIiwgb3AtPmNvZGUsIG9wLT55ZXMsIG9wLT5ubywgb3BbMV0ubm8sIGxlbik7CiAJCXN3aXRjaCAob3AtPmNvZGUpIHsKQEAgLTQ2MiwyMiArNDYyLDIwIEBACiAJCWNhc2UgSU5FVF9ESUFHX0JDX1NfTEU6CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0RfR0U6CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0RfTEU6Ci0JCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyA+IGxlbiArIDQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0pNUDoKLQkJCWlmIChvcC0+bm8gPCA0IHx8IG9wLT5ubyA+IGxlbiArIDQpCisJCQlpZiAob3AtPm5vIDwgNCB8fCBvcC0+bm8gPiBsZW4gKyA0IHx8IG9wLT5ubyAmIDMpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAob3AtPm5vIDwgbGVuICYmCiAJCQkgICAgIXZhbGlkX2NjKGJ5dGVjb2RlLCBieXRlY29kZV9sZW4sIGxlbiAtIG9wLT5ubykpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKIAkJY2FzZSBJTkVUX0RJQUdfQkNfTk9QOgotCQkJaWYgKG9wLT55ZXMgPCA0IHx8IG9wLT55ZXMgPiBsZW4gKyA0KQotCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQlpZiAob3AtPnllcyA8IDQgfHwgb3AtPnllcyA+IGxlbiArIDQgfHwgb3AtPnllcyAmIDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYmMgICs9IG9wLT55ZXM7CiAJCWxlbiAtPSBvcC0+eWVzOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRwZWVyLmMgYi9uZXQvaXB2NC9pbmV0cGVlci5jCmluZGV4IDlkZjRlNjMuLmNlNjE2ZDkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRwZWVyLmMKKysrIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwpAQCAtMTU0LDExICsxNTQsOSBAQAogLyogQ2FsbGVkIHdpdGggb3Igd2l0aG91dCBsb2NhbCBCSCBiZWluZyBkaXNhYmxlZC4gKi8KIHN0YXRpYyB2b2lkIHVubGlua19mcm9tX3VudXNlZChzdHJ1Y3QgaW5ldF9wZWVyICpwKQogewotCWlmICghbGlzdF9lbXB0eSgmcC0+dW51c2VkKSkgewotCQlzcGluX2xvY2tfYmgoJnVudXNlZF9wZWVycy5sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmcC0+dW51c2VkKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnVudXNlZF9wZWVycy5sb2NrKTsKLQl9CisJc3Bpbl9sb2NrX2JoKCZ1bnVzZWRfcGVlcnMubG9jayk7CisJbGlzdF9kZWxfaW5pdCgmcC0+dW51c2VkKTsKKwlzcGluX3VubG9ja19iaCgmdW51c2VkX3BlZXJzLmxvY2spOwogfQogCiBzdGF0aWMgaW50IGFkZHJfY29tcGFyZShjb25zdCBzdHJ1Y3QgaW5ldHBlZXJfYWRkciAqYSwKQEAgLTIwNSw2ICsyMDMsMjAgQEAKIAl1OwkJCQkJCQlcCiB9KQogCitzdGF0aWMgYm9vbCBhdG9taWNfYWRkX3VubGVzc19yZXR1cm4oYXRvbWljX3QgKnB0ciwgaW50IGEsIGludCB1LCBpbnQgKm5ld3YpCit7CisJaW50IGN1ciwgb2xkID0gYXRvbWljX3JlYWQocHRyKTsKKworCXdoaWxlIChvbGQgIT0gdSkgeworCQkqbmV3diA9IG9sZCArIGE7CisJCWN1ciA9IGF0b21pY19jbXB4Y2hnKHB0ciwgb2xkLCAqbmV3dik7CisJCWlmIChjdXIgPT0gb2xkKQorCQkJcmV0dXJuIHRydWU7CisJCW9sZCA9IGN1cjsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogQ2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jaygpCiAgKiBCZWNhdXNlIHdlIGhvbGQgbm8gbG9jayBhZ2FpbnN0IGEgd3JpdGVyLCBpdHMgcXVpdGUgcG9zc2libGUgd2UgZmFsbApAQCAtMjEzLDcgKzIyNSw4IEBACiAgKiBXZSBleGl0IGZyb20gdGhpcyBmdW5jdGlvbiBpZiBudW1iZXIgb2YgbGlua3MgZXhjZWVkcyBQRUVSX01BWERFUFRICiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyICpsb29rdXBfcmN1KGNvbnN0IHN0cnVjdCBpbmV0cGVlcl9hZGRyICpkYWRkciwKLQkJCQkgICAgc3RydWN0IGluZXRfcGVlcl9iYXNlICpiYXNlKQorCQkJCSAgICBzdHJ1Y3QgaW5ldF9wZWVyX2Jhc2UgKmJhc2UsCisJCQkJICAgIGludCAqbmV3cmVmY250KQogewogCXN0cnVjdCBpbmV0X3BlZXIgKnUgPSByY3VfZGVyZWZlcmVuY2UoYmFzZS0+cm9vdCk7CiAJaW50IGNvdW50ID0gMDsKQEAgLTIyNiw3ICsyMzksNyBAQAogCQkJICogZGlzdGluY3Rpb24gYmV0d2VlbiBhbiB1bnVzZWQgZW50cnkgKHJlZmNudD0wKSBhbmQKIAkJCSAqIGEgZnJlZWQgb25lLgogCQkJICovCi0JCQlpZiAodW5saWtlbHkoIWF0b21pY19hZGRfdW5sZXNzKCZ1LT5yZWZjbnQsIDEsIC0xKSkpCisJCQlpZiAoIWF0b21pY19hZGRfdW5sZXNzX3JldHVybigmdS0+cmVmY250LCAxLCAtMSwgbmV3cmVmY250KSkKIAkJCQl1ID0gTlVMTDsKIAkJCXJldHVybiB1OwogCQl9CkBAIC00NjUsMjIgKzQ3OCwyMyBAQAogCXN0cnVjdCBpbmV0X3BlZXJfYmFzZSAqYmFzZSA9IGZhbWlseV90b19iYXNlKGRhZGRyLT5mYW1pbHkpOwogCXN0cnVjdCBpbmV0X3BlZXIgKnA7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwotCWludCBpbnZhbGlkYXRlZDsKKwlpbnQgaW52YWxpZGF0ZWQsIG5ld3JlZmNudCA9IDA7CiAKIAkvKiBMb29rIHVwIGZvciB0aGUgYWRkcmVzcyBxdWlja2x5LCBsb2NrbGVzcy4KIAkgKiBCZWNhdXNlIG9mIGEgY29uY3VycmVudCB3cml0ZXIsIHdlIG1pZ2h0IG5vdCBmaW5kIGFuIGV4aXN0aW5nIGVudHJ5LgogCSAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlzZXF1ZW5jZSA9IHJlYWRfc2VxYmVnaW4oJmJhc2UtPmxvY2spOwotCXAgPSBsb29rdXBfcmN1KGRhZGRyLCBiYXNlKTsKKwlwID0gbG9va3VwX3JjdShkYWRkciwgYmFzZSwgJm5ld3JlZmNudCk7CiAJaW52YWxpZGF0ZWQgPSByZWFkX3NlcXJldHJ5KCZiYXNlLT5sb2NrLCBzZXF1ZW5jZSk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAocCkgewotCQkvKiBUaGUgZXhpc3Rpbmcgbm9kZSBoYXMgYmVlbiBmb3VuZC4KK2ZvdW5kOgkJLyogVGhlIGV4aXN0aW5nIG5vZGUgaGFzIGJlZW4gZm91bmQuCiAJCSAqIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB1bnVzZWQgbGlzdCBpZiBpdCB3YXMgdGhlcmUuCiAJCSAqLwotCQl1bmxpbmtfZnJvbV91bnVzZWQocCk7CisJCWlmIChuZXdyZWZjbnQgPT0gMSkKKwkJCXVubGlua19mcm9tX3VudXNlZChwKTsKIAkJcmV0dXJuIHA7CiAJfQogCkBAIC00OTQsMTEgKzUwOCw5IEBACiAJd3JpdGVfc2VxbG9ja19iaCgmYmFzZS0+bG9jayk7CiAJcCA9IGxvb2t1cChkYWRkciwgc3RhY2ssIGJhc2UpOwogCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KSB7Ci0JCWF0b21pY19pbmMoJnAtPnJlZmNudCk7CisJCW5ld3JlZmNudCA9IGF0b21pY19pbmNfcmV0dXJuKCZwLT5yZWZjbnQpOwogCQl3cml0ZV9zZXF1bmxvY2tfYmgoJmJhc2UtPmxvY2spOwotCQkvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdW51c2VkIGxpc3QgaWYgaXQgd2FzIHRoZXJlLiAqLwotCQl1bmxpbmtfZnJvbV91bnVzZWQocCk7Ci0JCXJldHVybiBwOworCQlnb3RvIGZvdW5kOwogCX0KIAlwID0gY3JlYXRlID8ga21lbV9jYWNoZV9hbGxvYyhwZWVyX2NhY2hlcCwgR0ZQX0FUT01JQykgOiBOVUxMOwogCWlmIChwKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDQ2MTRiYWIuLjJlOTdlM2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0xNyw1MSArMTcsMzUgQEAKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCXN0cnVjdCBmbG93aTQgZmw0ID0ge307Ci0JdW5zaWduZWQgbG9uZyBvcmVmZHN0OworCV9fYmUzMiBzYWRkciA9IGlwaC0+c2FkZHI7CisJX191OCBmbGFncyA9IDA7CiAJdW5zaWduZWQgaW50IGhoX2xlbjsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKIAotCXR5cGUgPSBpbmV0X2FkZHJfdHlwZShuZXQsIGlwaC0+c2FkZHIpOwotCWlmIChza2ItPnNrICYmIGluZXRfc2soc2tiLT5zayktPnRyYW5zcGFyZW50KQotCQl0eXBlID0gUlROX0xPQ0FMOwotCWlmIChhZGRyX3R5cGUgPT0gUlROX1VOU1BFQykKLQkJYWRkcl90eXBlID0gdHlwZTsKKwlpZiAoIXNrYi0+c2sgJiYgYWRkcl90eXBlICE9IFJUTl9MT0NBTCkgeworCQlpZiAoYWRkcl90eXBlID09IFJUTl9VTlNQRUMpCisJCQlhZGRyX3R5cGUgPSBpbmV0X2FkZHJfdHlwZShuZXQsIHNhZGRyKTsKKwkJaWYgKGFkZHJfdHlwZSA9PSBSVE5fTE9DQUwgfHwgYWRkcl90eXBlID09IFJUTl9VTklDQVNUKQorCQkJZmxhZ3MgfD0gRkxPV0lfRkxBR19BTllTUkM7CisJCWVsc2UKKwkJCXNhZGRyID0gMDsKKwl9CiAKIAkvKiBzb21lIG5vbi1zdGFuZGFyZCBoYWNrcyBsaWtlIGlwdF9SRUpFQ1QuYzpzZW5kX3Jlc2V0KCkgY2FuIGNhdXNlCiAJICogcGFja2V0cyB3aXRoIGZvcmVpZ24gc2FkZHIgdG8gYXBwZWFyIG9uIHRoZSBORl9JTkVUX0xPQ0FMX09VVCBob29rLgogCSAqLwotCWlmIChhZGRyX3R5cGUgPT0gUlROX0xPQ0FMKSB7Ci0JCWZsNC5kYWRkciA9IGlwaC0+ZGFkZHI7Ci0JCWlmICh0eXBlID09IFJUTl9MT0NBTCkKLQkJCWZsNC5zYWRkciA9IGlwaC0+c2FkZHI7Ci0JCWZsNC5mbG93aTRfdG9zID0gUlRfVE9TKGlwaC0+dG9zKTsKLQkJZmw0LmZsb3dpNF9vaWYgPSBza2ItPnNrID8gc2tiLT5zay0+c2tfYm91bmRfZGV2X2lmIDogMDsKLQkJZmw0LmZsb3dpNF9tYXJrID0gc2tiLT5tYXJrOwotCQlmbDQuZmxvd2k0X2ZsYWdzID0gc2tiLT5zayA/IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2tiLT5zaykgOiAwOwotCQlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0KTsKLQkJaWYgKElTX0VSUihydCkpCi0JCQlyZXR1cm4gLTE7CisJZmw0LmRhZGRyID0gaXBoLT5kYWRkcjsKKwlmbDQuc2FkZHIgPSBzYWRkcjsKKwlmbDQuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CisJZmw0LmZsb3dpNF9vaWYgPSBza2ItPnNrID8gc2tiLT5zay0+c2tfYm91bmRfZGV2X2lmIDogMDsKKwlmbDQuZmxvd2k0X21hcmsgPSBza2ItPm1hcms7CisJZmw0LmZsb3dpNF9mbGFncyA9IHNrYi0+c2sgPyBpbmV0X3NrX2Zsb3dpX2ZsYWdzKHNrYi0+c2spIDogZmxhZ3M7CisJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJmZsNCk7CisJaWYgKElTX0VSUihydCkpCisJCXJldHVybiAtMTsKIAotCQkvKiBEcm9wIG9sZCByb3V0ZS4gKi8KLQkJc2tiX2RzdF9kcm9wKHNrYik7Ci0JCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwotCX0gZWxzZSB7Ci0JCS8qIG5vbi1sb2NhbCBzcmMsIGZpbmQgdmFsaWQgaWlmIHRvIHNhdGlzZnkKLQkJICogcnAtZmlsdGVyIHdoZW4gY2FsbGluZyBpcF9yb3V0ZV9pbnB1dC4gKi8KLQkJZmw0LmRhZGRyID0gaXBoLT5zYWRkcjsKLQkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgJmZsNCk7Ci0JCWlmIChJU19FUlIocnQpKQotCQkJcmV0dXJuIC0xOwotCi0JCW9yZWZkc3QgPSBza2ItPl9za2JfcmVmZHN0OwotCQlpZiAoaXBfcm91dGVfaW5wdXQoc2tiLCBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLAotCQkJCSAgIFJUX1RPUyhpcGgtPnRvcyksIHJ0LT5kc3QuZGV2KSAhPSAwKSB7Ci0JCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwotCQlyZWZkc3RfZHJvcChvcmVmZHN0KTsKLQl9CisJLyogRHJvcCBvbGQgcm91dGUuICovCisJc2tiX2RzdF9kcm9wKHNrYik7CisJc2tiX2RzdF9zZXQoc2tiLCAmcnQtPmRzdCk7CiAKIAlpZiAoc2tiX2RzdChza2IpLT5lcnJvcikKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCAxZGZjMThhLi43M2I0ZTkxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMTEzLDYgKzExMywxOCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQX05GX1RBUkdFVF9SRUpFQ1RfU0tFUlIKKwlib29sICJGb3JjZSBzb2NrZXQgZXJyb3Igd2hlbiByZWplY3Rpbmcgd2l0aCBpY21wKiIKKwlkZXBlbmRzIG9uIElQX05GX1RBUkdFVF9SRUpFQ1QKKwlkZWZhdWx0IG4KKwloZWxwCisgICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyB0dXJuaW5nIGEgIi0tcmVqZWN0LXdpdGggaWNtcCoiIGludG8gYSBtYXRjaGluZworICAgICAgICAgIHNvY2tldCBlcnJvciBhbHNvLgorCSAgVGhlIFJFSkVDVCB0YXJnZXQgbm9ybWFsbHkgYWxsb3dzIHNlbmRpbmcgYW4gSUNNUCBtZXNzYWdlLiBCdXQgaXQKKyAgICAgICAgICBsZWF2ZXMgdGhlIGxvY2FsIHNvY2tldCB1bmF3YXJlIG9mIGFueSBpbmdyZXNzIHJlamVjdHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJUF9ORl9UQVJHRVRfTE9HCiAJdHJpc3RhdGUgIkxPRyB0YXJnZXQgc3VwcG9ydCIKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCmluZGV4IDFmZjc5ZTUuLjlkZDc1NGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwpAQCAtNDAsNyArNDAsNiBAQAogCXN0cnVjdCBpcGhkciAqbmlwaDsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICpvdGg7CiAJc3RydWN0IHRjcGhkciBfb3RjcGgsICp0Y3BoOwotCXVuc2lnbmVkIGludCBhZGRyX3R5cGU7CiAKIAkvKiBJUCBoZWFkZXIgY2hlY2tzOiBmcmFnbWVudC4gKi8KIAlpZiAoaXBfaGRyKG9sZHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkKQEAgLTU1LDYgKzU0LDkgQEAKIAlpZiAob3RoLT5yc3QpCiAJCXJldHVybjsKIAorCWlmIChza2JfcnRhYmxlKG9sZHNrYiktPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKQorCQlyZXR1cm47CisKIAkvKiBDaGVjayBjaGVja3N1bSAqLwogCWlmIChuZl9pcF9jaGVja3N1bShvbGRza2IsIGhvb2ssIGlwX2hkcmxlbihvbGRza2IpLCBJUFBST1RPX1RDUCkpCiAJCXJldHVybjsKQEAgLTEwMSwxOSArMTAzLDExIEBACiAJbnNrYi0+Y3N1bV9zdGFydCA9ICh1bnNpZ25lZCBjaGFyICopdGNwaCAtIG5za2ItPmhlYWQ7CiAJbnNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAKLQlhZGRyX3R5cGUgPSBSVE5fVU5TUEVDOwotCWlmIChob29rICE9IE5GX0lORVRfRk9SV0FSRAotI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCi0JICAgIHx8IChuc2tiLT5uZl9icmlkZ2UgJiYgbnNrYi0+bmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKQotI2VuZGlmCi0JICAgKQotCQlhZGRyX3R5cGUgPSBSVE5fTE9DQUw7Ci0KIAkvKiBpcF9yb3V0ZV9tZV9oYXJkZXIgZXhwZWN0cyBza2ItPmRzdCB0byBiZSBzZXQgKi8KIAlza2JfZHN0X3NldF9ub3JlZihuc2tiLCBza2JfZHN0KG9sZHNrYikpOwogCiAJbnNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7Ci0JaWYgKGlwX3JvdXRlX21lX2hhcmRlcihuc2tiLCBhZGRyX3R5cGUpKQorCWlmIChpcF9yb3V0ZV9tZV9oYXJkZXIobnNrYiwgUlROX1VOU1BFQykpCiAJCWdvdG8gZnJlZV9uc2tiOwogCiAJbmlwaC0+dHRsCT0gaXA0X2RzdF9ob3BsaW1pdChza2JfZHN0KG5za2IpKTsKQEAgLTEzNCw2ICsxMjgsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX3VucmVhY2goc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwgaW50IGNvZGUpCiB7CiAJaWNtcF9zZW5kKHNrYl9pbiwgSUNNUF9ERVNUX1VOUkVBQ0gsIGNvZGUsIDApOworI2lmZGVmIENPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUX1NLRVJSCisJaWYgKHNrYl9pbi0+c2spIHsKKwkJc2tiX2luLT5zay0+c2tfZXJyID0gaWNtcF9lcnJfY29udmVydFtjb2RlXS5lcnJubzsKKwkJc2tiX2luLT5zay0+c2tfZXJyb3JfcmVwb3J0KHNrYl9pbi0+c2spOworCQlwcl9kZWJ1ZygiaXB0X1JFSkVDVDogc2tfZXJyPSVkIGZvciBza2I9JXAgc2s9JXBcbiIsCisJCQlza2JfaW4tPnNrLT5za19lcnIsIHNrYl9pbiwgc2tiX2luLT5zayk7CisJfQorI2VuZGlmCiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDk5ZTZlNGIuLmI4YjVjM2YgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMTkxNCw5ICsxOTE0LDcgQEAKIAogCWhhc2ggPSBydF9oYXNoKGRhZGRyLCBzYWRkciwgZGV2LT5pZmluZGV4LCBydF9nZW5pZChkZXZfbmV0KGRldikpKTsKIAlydGggPSBydF9pbnRlcm5faGFzaChoYXNoLCBydGgsIHNrYiwgZGV2LT5pZmluZGV4KTsKLQllcnIgPSAwOwotCWlmIChJU19FUlIocnRoKSkKLQkJZXJyID0gUFRSX0VSUihydGgpOworCXJldHVybiBJU19FUlIocnRoKSA/IFBUUl9FUlIocnRoKSA6IDA7CiAKIGVfbm9idWZzOgogCXJldHVybiAtRU5PQlVGUzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggMDJiNGQyZC4uNTRkNDFlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTMzMzMsNyArMzMzMyw3IEBACiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJc3RydWN0IGZsb3dpNCBmbDQgPSB7IC5kYWRkciA9IGFkZHIgfTsKIAlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkobmV0LCAmZmw0KTsKLQlpZiAoIXJ0KQorCWlmIChJU19FUlJfT1JfTlVMTChydCkpCiAJCXJldHVybiAwOwogCXJldHVybiBydC0+ZHN0LmRldiAmJiAocnQtPmRzdC5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggZjg3YThlYi4uMGUzM2UzNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTEyNDEsNiArMTI0MSw5IEBACiAKIAlpZiAobm9ibG9jaykKIAkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzdGFydGluZyBvdmVyIGZvciBhIG5ldyBwYWNrZXQgKi8KKwltc2ctPm1zZ19mbGFncyAmPSB+TVNHX1RSVU5DOwogCWdvdG8gdHJ5X2FnYWluOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCBhN2JkYTA3Li5jNDQzZjQ5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTgzNCwxMiArODM0LDEzIEBACiB7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlmcC0+aWRldjsKIAlzdHJ1Y3QgaW42X2FkZHIgYWRkciwgKnRtcGFkZHI7Ci0JdW5zaWduZWQgbG9uZyB0bXBfcHJlZmVyZWRfbGZ0LCB0bXBfdmFsaWRfbGZ0LCB0bXBfY3N0YW1wLCB0bXBfdHN0YW1wLCBhZ2U7CisJdW5zaWduZWQgbG9uZyB0bXBfcHJlZmVyZWRfbGZ0LCB0bXBfdmFsaWRfbGZ0LCB0bXBfdHN0YW1wLCBhZ2U7CiAJdW5zaWduZWQgbG9uZyByZWdlbl9hZHZhbmNlOwogCWludCB0bXBfcGxlbjsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgbWF4X2FkZHJlc3NlczsKIAl1MzIgYWRkcl9mbGFnczsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAKIAl3cml0ZV9sb2NrKCZpZGV2LT5sb2NrKTsKIAlpZiAoaWZ0KSB7CkBAIC04ODQsNyArODg1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCW1lbWNweSgmYWRkci5zNl9hZGRyWzhdLCBpZGV2LT5ybmRpZCwgOCk7Ci0JYWdlID0gKGppZmZpZXMgLSBpZnAtPnRzdGFtcCkgLyBIWjsKKwlhZ2UgPSAobm93IC0gaWZwLT50c3RhbXApIC8gSFo7CiAJdG1wX3ZhbGlkX2xmdCA9IG1pbl90KF9fdTMyLAogCQkJICAgICAgaWZwLT52YWxpZF9sZnQsCiAJCQkgICAgICBpZGV2LT5jbmYudGVtcF92YWxpZF9sZnQgKyBhZ2UpOwpAQCAtODk0LDcgKzg5NSw2IEBACiAJCQkJIGlkZXYtPmNuZi5tYXhfZGVzeW5jX2ZhY3Rvcik7CiAJdG1wX3BsZW4gPSBpZnAtPnByZWZpeF9sZW47CiAJbWF4X2FkZHJlc3NlcyA9IGlkZXYtPmNuZi5tYXhfYWRkcmVzc2VzOwotCXRtcF9jc3RhbXAgPSBpZnAtPmNzdGFtcDsKIAl0bXBfdHN0YW1wID0gaWZwLT50c3RhbXA7CiAJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAKQEAgLTkzOSw3ICs5MzksNyBAQAogCWlmdC0+aWZwdWIgPSBpZnA7CiAJaWZ0LT52YWxpZF9sZnQgPSB0bXBfdmFsaWRfbGZ0OwogCWlmdC0+cHJlZmVyZWRfbGZ0ID0gdG1wX3ByZWZlcmVkX2xmdDsKLQlpZnQtPmNzdGFtcCA9IHRtcF9jc3RhbXA7CisJaWZ0LT5jc3RhbXAgPSBub3c7CiAJaWZ0LT50c3RhbXAgPSB0bXBfdHN0YW1wOwogCXNwaW5fdW5sb2NrX2JoKCZpZnQtPmxvY2spOwogCkBAIC0xOTk4LDI1ICsxOTk4LDUwIEBACiAjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQogCQkJcmVhZF9sb2NrX2JoKCZpbjZfZGV2LT5sb2NrKTsKIAkJCS8qIHVwZGF0ZSBhbGwgdGVtcG9yYXJ5IGFkZHJlc3NlcyBpbiB0aGUgbGlzdCAqLwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShpZnQsICZpbjZfZGV2LT50ZW1wYWRkcl9saXN0LCB0bXBfbGlzdCkgewotCQkJCS8qCi0JCQkJICogV2hlbiBhZGp1c3RpbmcgdGhlIGxpZmV0aW1lcyBvZiBhbiBleGlzdGluZwotCQkJCSAqIHRlbXBvcmFyeSBhZGRyZXNzLCBvbmx5IGxvd2VyIHRoZSBsaWZldGltZXMuCi0JCQkJICogSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IGluY3JlYXNlIHRoZQotCQkJCSAqIGxpZmV0aW1lcyBvZiBhbiBleGlzdGluZyB0ZW1wb3JhcnkgYWRkcmVzcwotCQkJCSAqIHdoZW4gcHJvY2Vzc2luZyBhIFByZWZpeCBJbmZvcm1hdGlvbiBPcHRpb24uCi0JCQkJICovCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlmdCwgJmluNl9kZXYtPnRlbXBhZGRyX2xpc3QsCisJCQkJCSAgICB0bXBfbGlzdCkgeworCQkJCWludCBhZ2UsIG1heF92YWxpZCwgbWF4X3ByZWZlcmVkOworCiAJCQkJaWYgKGlmcCAhPSBpZnQtPmlmcHViKQogCQkJCQljb250aW51ZTsKIAorCQkJCS8qCisJCQkJICogUkZDIDQ5NDEgc2VjdGlvbiAzLjM6CisJCQkJICogSWYgYSByZWNlaXZlZCBvcHRpb24gd2lsbCBleHRlbmQgdGhlIGxpZmV0aW1lCisJCQkJICogb2YgYSBwdWJsaWMgYWRkcmVzcywgdGhlIGxpZmV0aW1lcyBvZgorCQkJCSAqIHRlbXBvcmFyeSBhZGRyZXNzZXMgc2hvdWxkIGJlIGV4dGVuZGVkLAorCQkJCSAqIHN1YmplY3QgdG8gdGhlIG92ZXJhbGwgY29uc3RyYWludCB0aGF0IG5vCisJCQkJICogdGVtcG9yYXJ5IGFkZHJlc3NlcyBzaG91bGQgZXZlciByZW1haW4KKwkJCQkgKiAidmFsaWQiIG9yICJwcmVmZXJyZWQiIGZvciBhIHRpbWUgbG9uZ2VyIHRoYW4KKwkJCQkgKiAoVEVNUF9WQUxJRF9MSUZFVElNRSkgb3IKKwkJCQkgKiAoVEVNUF9QUkVGRVJSRURfTElGRVRJTUUgLSBERVNZTkNfRkFDVE9SKSwKKwkJCQkgKiByZXNwZWN0aXZlbHkuCisJCQkJICovCisJCQkJYWdlID0gKG5vdyAtIGlmdC0+Y3N0YW1wKSAvIEhaOworCQkJCW1heF92YWxpZCA9IGluNl9kZXYtPmNuZi50ZW1wX3ZhbGlkX2xmdCAtIGFnZTsKKwkJCQlpZiAobWF4X3ZhbGlkIDwgMCkKKwkJCQkJbWF4X3ZhbGlkID0gMDsKKworCQkJCW1heF9wcmVmZXJlZCA9IGluNl9kZXYtPmNuZi50ZW1wX3ByZWZlcmVkX2xmdCAtCisJCQkJCSAgICAgICBpbjZfZGV2LT5jbmYubWF4X2Rlc3luY19mYWN0b3IgLQorCQkJCQkgICAgICAgYWdlOworCQkJCWlmIChtYXhfcHJlZmVyZWQgPCAwKQorCQkJCQltYXhfcHJlZmVyZWQgPSAwOworCisJCQkJaWYgKHZhbGlkX2xmdCA+IG1heF92YWxpZCkKKwkJCQkJdmFsaWRfbGZ0ID0gbWF4X3ZhbGlkOworCisJCQkJaWYgKHByZWZlcmVkX2xmdCA+IG1heF9wcmVmZXJlZCkKKwkJCQkJcHJlZmVyZWRfbGZ0ID0gbWF4X3ByZWZlcmVkOworCiAJCQkJc3Bpbl9sb2NrKCZpZnQtPmxvY2spOwogCQkJCWZsYWdzID0gaWZ0LT5mbGFnczsKLQkJCQlpZiAoaWZ0LT52YWxpZF9sZnQgPiB2YWxpZF9sZnQgJiYKLQkJCQkgICAgaWZ0LT52YWxpZF9sZnQgLSB2YWxpZF9sZnQgPiAoamlmZmllcyAtIGlmdC0+dHN0YW1wKSAvIEhaKQotCQkJCQlpZnQtPnZhbGlkX2xmdCA9IHZhbGlkX2xmdCArIChqaWZmaWVzIC0gaWZ0LT50c3RhbXApIC8gSFo7Ci0JCQkJaWYgKGlmdC0+cHJlZmVyZWRfbGZ0ID4gcHJlZmVyZWRfbGZ0ICYmCi0JCQkJICAgIGlmdC0+cHJlZmVyZWRfbGZ0IC0gcHJlZmVyZWRfbGZ0ID4gKGppZmZpZXMgLSBpZnQtPnRzdGFtcCkgLyBIWikKLQkJCQkJaWZ0LT5wcmVmZXJlZF9sZnQgPSBwcmVmZXJlZF9sZnQgKyAoamlmZmllcyAtIGlmdC0+dHN0YW1wKSAvIEhaOworCQkJCWlmdC0+dmFsaWRfbGZ0ID0gdmFsaWRfbGZ0OworCQkJCWlmdC0+cHJlZmVyZWRfbGZ0ID0gcHJlZmVyZWRfbGZ0OworCQkJCWlmdC0+dHN0YW1wID0gbm93OworCQkJCWlmIChwcmVmZXJlZF9sZnQgPiAwKQorCQkJCQlpZnQtPmZsYWdzICY9IH5JRkFfRl9ERVBSRUNBVEVEOworCiAJCQkJc3Bpbl91bmxvY2soJmlmdC0+bG9jayk7CiAJCQkJaWYgKCEoZmxhZ3MmSUZBX0ZfVEVOVEFUSVZFKSkKIAkJCQkJaXB2Nl9pZmFfbm90aWZ5KDAsIGlmdCk7CkBAIC0yMDI0LDkgKzIwNDksMTEgQEAKIAogCQkJaWYgKChjcmVhdGUgfHwgbGlzdF9lbXB0eSgmaW42X2Rldi0+dGVtcGFkZHJfbGlzdCkpICYmIGluNl9kZXYtPmNuZi51c2VfdGVtcGFkZHIgPiAwKSB7CiAJCQkJLyoKLQkJCQkgKiBXaGVuIGEgbmV3IHB1YmxpYyBhZGRyZXNzIGlzIGNyZWF0ZWQgYXMgZGVzY3JpYmVkIGluIFtBRERSQ09ORl0sCi0JCQkJICogYWxzbyBjcmVhdGUgYSBuZXcgdGVtcG9yYXJ5IGFkZHJlc3MuIEFsc28gY3JlYXRlIGEgdGVtcG9yYXJ5Ci0JCQkJICogYWRkcmVzcyBpZiBpdCdzIGVuYWJsZWQgYnV0IG5vIHRlbXBvcmFyeSBhZGRyZXNzIGN1cnJlbnRseSBleGlzdHMuCisJCQkJICogV2hlbiBhIG5ldyBwdWJsaWMgYWRkcmVzcyBpcyBjcmVhdGVkIGFzCisJCQkJICogZGVzY3JpYmVkIGluIFtBRERSQ09ORl0sIGFsc28gY3JlYXRlIGEgbmV3CisJCQkJICogdGVtcG9yYXJ5IGFkZHJlc3MuIEFsc28gY3JlYXRlIGEgdGVtcG9yYXJ5CisJCQkJICogYWRkcmVzcyBpZiBpdCdzIGVuYWJsZWQgYnV0IG5vIHRlbXBvcmFyeQorCQkJCSAqIGFkZHJlc3MgY3VycmVudGx5IGV4aXN0cy4KIAkJCQkgKi8KIAkJCQlyZWFkX3VubG9ja19iaCgmaW42X2Rldi0+bG9jayk7CiAJCQkJaXB2Nl9jcmVhdGVfdGVtcGFkZHIoaWZwLCBOVUxMKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggNDQ4NDY0OC4uNWJiZjUzMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTE3NCw2ICsxNzQsMTggQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBJUDZfTkZfVEFSR0VUX1JFSkVDVF9TS0VSUgorCWJvb2wgIkZvcmNlIHNvY2tldCBlcnJvciB3aGVuIHJlamVjdGluZyB3aXRoIGljbXAqIgorCWRlcGVuZHMgb24gSVA2X05GX1RBUkdFVF9SRUpFQ1QKKwlkZWZhdWx0IG4KKwloZWxwCisgICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyB0dXJuaW5nIGEgIi0tcmVqZWN0LXdpdGggaWNtcCoiIGludG8gYSBtYXRjaGluZworICAgICAgICAgIHNvY2tldCBlcnJvciBhbHNvLgorCSAgVGhlIFJFSkVDVCB0YXJnZXQgbm9ybWFsbHkgYWxsb3dzIHNlbmRpbmcgYW4gSUNNUCBtZXNzYWdlLiBCdXQgaXQKKyAgICAgICAgICBsZWF2ZXMgdGhlIGxvY2FsIHNvY2tldCB1bmF3YXJlIG9mIGFueSBpbmdyZXNzIHJlamVjdHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJUDZfTkZfTUFOR0xFCiAJdHJpc3RhdGUgIlBhY2tldCBtYW5nbGluZyIKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDVhMWM2ZjIuLjc3YjBmMmNmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKQEAgLTIyODksMTYgKzIyODksMTUgQEAKICAqICJObyBuZXh0IGhlYWRlciIuCiAgKgogICogSWYgdGFyZ2V0IGhlYWRlciBpcyBmb3VuZCwgaXRzIG9mZnNldCBpcyBzZXQgaW4gKm9mZnNldCBhbmQgcmV0dXJuIHByb3RvY29sCi0gKiBudW1iZXIuIE90aGVyd2lzZSwgcmV0dXJuIC0xLgorICogbnVtYmVyLiBPdGhlcndpc2UsIHJldHVybiAtRU5PRU5UIG9yIC1FQkFETVNHLgogICoKICAqIElmIHRoZSBmaXJzdCBmcmFnbWVudCBkb2Vzbid0IGNvbnRhaW4gdGhlIGZpbmFsIHByb3RvY29sIGhlYWRlciBvcgogICogTkVYVEhEUl9OT05FIGl0IGlzIGNvbnNpZGVyZWQgaW52YWxpZC4KICAqCiAgKiBOb3RlIHRoYXQgbm9uLTFzdCBmcmFnbWVudCBpcyBzcGVjaWFsIGNhc2UgdGhhdCAidGhlIHByb3RvY29sIG51bWJlcgogICogb2YgbGFzdCBoZWFkZXIiIGlzICJuZXh0IGhlYWRlciIgZmllbGQgaW4gRnJhZ21lbnQgaGVhZGVyLiBJbiB0aGlzIGNhc2UsCi0gKiAqb2Zmc2V0IGlzIG1lYW5pbmdsZXNzIGFuZCBmcmFnbWVudCBvZmZzZXQgaXMgc3RvcmVkIGluICpmcmFnb2ZmIGlmIGZyYWdvZmYKLSAqIGlzbid0IE5VTEwuCi0gKgorICogKm9mZnNldCBpcyBtZWFuaW5nbGVzcy4gSWYgZnJhZ29mZiBpcyBub3QgTlVMTCwgdGhlIGZyYWdtZW50IG9mZnNldCBpcworICogc3RvcmVkIGluICpmcmFnb2ZmOyBpZiBpdCBpcyBOVUxMLCByZXR1cm4gLUVJTlZBTC4KICAqLwogaW50IGlwdjZfZmluZF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50ICpvZmZzZXQsCiAJCSAgaW50IHRhcmdldCwgdW5zaWduZWQgc2hvcnQgKmZyYWdvZmYpCkBAIC0yMzM5LDkgKzIzMzgsMTIgQEAKIAkJCQlpZiAodGFyZ2V0IDwgMCAmJgogCQkJCSAgICAoKCFpcHY2X2V4dF9oZHIoaHAtPm5leHRoZHIpKSB8fAogCQkJCSAgICAgaHAtPm5leHRoZHIgPT0gTkVYVEhEUl9OT05FKSkgewotCQkJCQlpZiAoZnJhZ29mZikKKwkJCQkJaWYgKGZyYWdvZmYpIHsKIAkJCQkJCSpmcmFnb2ZmID0gX2ZyYWdfb2ZmOwotCQkJCQlyZXR1cm4gaHAtPm5leHRoZHI7CisJCQkJCQlyZXR1cm4gaHAtPm5leHRoZHI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJfQogCQkJCX0KIAkJCQlyZXR1cm4gLUVOT0VOVDsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKaW5kZXggYTVhNGM1ZC4uMDlkMzA0OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKQEAgLTE3Nyw2ICsxNzcsMTUgQEAKIAkJc2tiX2luLT5kZXYgPSBuZXQtPmxvb3BiYWNrX2RldjsKIAogCWljbXB2Nl9zZW5kKHNrYl9pbiwgSUNNUFY2X0RFU1RfVU5SRUFDSCwgY29kZSwgMCk7CisjaWZkZWYgQ09ORklHX0lQNl9ORl9UQVJHRVRfUkVKRUNUX1NLRVJSCisJaWYgKHNrYl9pbi0+c2spIHsKKwkJaWNtcHY2X2Vycl9jb252ZXJ0KElDTVBWNl9ERVNUX1VOUkVBQ0gsIGNvZGUsCisJCQkJICAgJnNrYl9pbi0+c2stPnNrX2Vycik7CisJCXNrYl9pbi0+c2stPnNrX2Vycm9yX3JlcG9ydChza2JfaW4tPnNrKTsKKwkJcHJfZGVidWcoImlwNnRfUkVKRUNUOiBza19lcnI9JWQgZm9yIHNrYj0lcCBzaz0lcFxuIiwKKwkJCXNrYl9pbi0+c2stPnNrX2Vyciwgc2tiX2luLCBza2JfaW4tPnNrKTsKKwl9CisjZW5kaWYKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCA5ZTMwNWQ3NC4uYjMxYTJmMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTQ1Myw4ICs0NTMsMTEgQEAKIAl9CiAJdW5sb2NrX3NvY2tfZmFzdChzaywgc2xvdyk7CiAKLQlpZiAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpCisJaWYgKG5vYmxvY2spCiAJCXJldHVybiAtRUFHQUlOOworCisJLyogc3RhcnRpbmcgb3ZlciBmb3IgYSBuZXcgcGFja2V0ICovCisJbXNnLT5tc2dfZmxhZ3MgJj0gfk1TR19UUlVOQzsKIAlnb3RvIHRyeV9hZ2FpbjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2NmZy5jIGIvbmV0L21hYzgwMjExL2NmZy5jCmluZGV4IDQ0MDQ5NzMuLjM3NDA0MDMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTIyOCwxMSArMjI4LDExIEBACiAJCQlnb3RvIG91dDsKIAogCQlpZiAocGFpcndpc2UpCi0JCQlrZXkgPSBzdGEtPnB0azsKKwkJCWtleSA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPnB0ayk7CiAJCWVsc2UgaWYgKGtleV9pZHggPCBOVU1fREVGQVVMVF9LRVlTKQotCQkJa2V5ID0gc3RhLT5ndGtba2V5X2lkeF07CisJCQlrZXkgPSByY3VfZGVyZWZlcmVuY2Uoc3RhLT5ndGtba2V5X2lkeF0pOwogCX0gZWxzZQotCQlrZXkgPSBzZGF0YS0+a2V5c1trZXlfaWR4XTsKKwkJa2V5ID0gcmN1X2RlcmVmZXJlbmNlKHNkYXRhLT5rZXlzW2tleV9pZHhdKTsKIAogCWlmICgha2V5KQogCQlnb3RvIG91dDsKQEAgLTkyMSw4ICs5MjEsMTAgQEAKIHN0YXRpYyB2b2lkIG1wYXRoX3NldF9waW5mbyhzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aCwgdTggKm5leHRfaG9wLAogCQkJICAgIHN0cnVjdCBtcGF0aF9pbmZvICpwaW5mbykKIHsKLQlpZiAobXBhdGgtPm5leHRfaG9wKQotCQltZW1jcHkobmV4dF9ob3AsIG1wYXRoLT5uZXh0X2hvcC0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKm5leHRfaG9wX3N0YSA9IHJjdV9kZXJlZmVyZW5jZShtcGF0aC0+bmV4dF9ob3ApOworCisJaWYgKG5leHRfaG9wX3N0YSkKKwkJbWVtY3B5KG5leHRfaG9wLCBuZXh0X2hvcF9zdGEtPnN0YS5hZGRyLCBFVEhfQUxFTik7CiAJZWxzZQogCQltZW1zZXQobmV4dF9ob3AsIDAsIEVUSF9BTEVOKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lic3MuYyBiL25ldC9tYWM4MDIxMS9pYnNzLmMKaW5kZXggM2U4MWFmMWYuLjgyMTU5MGQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtOTY3LDYgKzk2NywxMCBAQAogCiAJbXV0ZXhfbG9jaygmc2RhdGEtPnUuaWJzcy5tdHgpOwogCisJc2RhdGEtPnUuaWJzcy5zdGF0ZSA9IElFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNIOworCW1lbXNldChzZGF0YS0+dS5pYnNzLmJzc2lkLCAwLCBFVEhfQUxFTik7CisJc2RhdGEtPnUuaWJzcy5zc2lkX2xlbiA9IDA7CisKIAlhY3RpdmVfaWJzcyA9IGllZWU4MDIxMV9zdGFfYWN0aXZlX2lic3Moc2RhdGEpOwogCiAJaWYgKCFhY3RpdmVfaWJzcyAmJiAhaXNfemVyb19ldGhlcl9hZGRyKGlmaWJzcy0+YnNzaWQpKSB7CkBAIC0xMDAwLDggKzEwMDQsNiBAQAogCWtmcmVlX3NrYihza2IpOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZzZGF0YS0+c2tiX3F1ZXVlKTsKLQltZW1zZXQoc2RhdGEtPnUuaWJzcy5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCXNkYXRhLT51Lmlic3Muc3NpZF9sZW4gPSAwOwogCiAJZGVsX3RpbWVyX3N5bmMoJnNkYXRhLT51Lmlic3MudGltZXIpOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWxtZS5jIGIvbmV0L21hYzgwMjExL21sbWUuYwppbmRleCA2NGQ5MmQ1YS4uN2ZmY2I1NSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC03ODksNyArNzg5LDcgQEAKIAkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKTsKIAl9CiAKLQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHNkYXRhLT5kZXYpOworCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhzZGF0YS0+ZGV2KTsKIH0KIAogdm9pZCBpZWVlODAyMTFfZHluYW1pY19wc190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCmluZGV4IDEzZThjMzAuLjc0ZjU1MDIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCkBAIC0zMjgsNiArMzI4LDcgQEAKIAlpZWVlODAyMTFfc3RhX2RlYnVnZnNfYWRkKHN0YSk7CiAJcmF0ZV9jb250cm9sX2FkZF9zdGFfZGVidWdmcyhzdGEpOwogCisJbWVtc2V0KCZzaW5mbywgMCwgc2l6ZW9mKHNpbmZvKSk7CiAJc2luZm8uZmlsbGVkID0gMDsKIAlzaW5mby5nZW5lcmF0aW9uID0gbG9jYWwtPnN0YV9nZW5lcmF0aW9uOwogCWNmZzgwMjExX25ld19zdGEoc2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKQEAgLTY5OCw2ICs2OTksOCBAQAogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHICovCiAJY2FuY2VsX3dvcmtfc3luYygmc3RhLT5kcnZfdW5ibG9ja193ayk7CiAKKwljZmc4MDIxMV9kZWxfc3RhKHNkYXRhLT5kZXYsIHN0YS0+c3RhLmFkZHIsIEdGUF9LRVJORUwpOworCiAJcmF0ZV9jb250cm9sX3JlbW92ZV9zdGFfZGVidWdmcyhzdGEpOwogCWllZWU4MDIxMV9zdGFfZGVidWdmc19yZW1vdmUoc3RhKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dwYS5jIGIvbmV0L21hYzgwMjExL3dwYS5jCmluZGV4IGYxNzY1ZGUuLjM4MTRiODEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93cGEuYworKysgYi9uZXQvbWFjODAyMTEvd3BhLmMKQEAgLTg2LDYgKzg2LDExIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4LT5za2I7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJaW50IHF1ZXVlID0gcngtPnF1ZXVlOworCisJLyogb3RoZXJ3aXNlLCBUS0lQIGlzIHZ1bG5lcmFibGUgdG8gVElEIDAgdnMuIG5vbi1Rb1MgcmVwbGF5cyAqLworCWlmIChyeC0+cXVldWUgPT0gTlVNX1JYX0RBVEFfUVVFVUVTIC0gMSkKKwkJcXVldWUgPSAwOwogCiAJLyogTm8gd2F5IHRvIHZlcmlmeSB0aGUgTUlDIGlmIHRoZSBoYXJkd2FyZSBzdHJpcHBlZCBpdCAqLwogCWlmIChzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX01NSUNfU1RSSVBQRUQpCkBAIC0xMTksOCArMTI0LDggQEAKIAlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gTUlDSEFFTF9NSUNfTEVOKTsKIAogCS8qIHVwZGF0ZSBJViBpbiBrZXkgaW5mb3JtYXRpb24gdG8gYmUgYWJsZSB0byBkZXRlY3QgcmVwbGF5cyAqLwotCXJ4LT5rZXktPnUudGtpcC5yeFtyeC0+cXVldWVdLml2MzIgPSByeC0+dGtpcF9pdjMyOwotCXJ4LT5rZXktPnUudGtpcC5yeFtyeC0+cXVldWVdLml2MTYgPSByeC0+dGtpcF9pdjE2OworCXJ4LT5rZXktPnUudGtpcC5yeFtxdWV1ZV0uaXYzMiA9IHJ4LT50a2lwX2l2MzI7CisJcngtPmtleS0+dS50a2lwLnJ4W3F1ZXVlXS5pdjE2ID0gcngtPnRraXBfaXYxNjsKIAogCXJldHVybiBSWF9DT05USU5VRTsKIH0KQEAgLTIwMSw2ICsyMDYsMTEgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5ID0gcngtPmtleTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcngtPnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CisJaW50IHF1ZXVlID0gcngtPnF1ZXVlOworCisJLyogb3RoZXJ3aXNlLCBUS0lQIGlzIHZ1bG5lcmFibGUgdG8gVElEIDAgdnMuIG5vbi1Rb1MgcmVwbGF5cyAqLworCWlmIChyeC0+cXVldWUgPT0gTlVNX1JYX0RBVEFfUVVFVUVTIC0gMSkKKwkJcXVldWUgPSAwOwogCiAJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwogCkBAIC0yMjEsNyArMjMxLDcgQEAKIAlyZXMgPSBpZWVlODAyMTFfdGtpcF9kZWNyeXB0X2RhdGEocngtPmxvY2FsLT53ZXBfcnhfdGZtLAogCQkJCQkgIGtleSwgc2tiLT5kYXRhICsgaGRybGVuLAogCQkJCQkgIHNrYi0+bGVuIC0gaGRybGVuLCByeC0+c3RhLT5zdGEuYWRkciwKLQkJCQkJICBoZHItPmFkZHIxLCBod2FjY2VsLCByeC0+cXVldWUsCisJCQkJCSAgaGRyLT5hZGRyMSwgaHdhY2NlbCwgcXVldWUsCiAJCQkJCSAgJnJ4LT50a2lwX2l2MzIsCiAJCQkJCSAgJnJ4LT50a2lwX2l2MTYpOwogCWlmIChyZXMgIT0gVEtJUF9ERUNSWVBUX09LKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDMyYmZmNmQuLjViZDVjNjEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTkwMiw2ICs5MDIsOCBAQAogCWJhc2VkIG9uIHdobyBjcmVhdGVkIHRoZSBzb2NrZXQ6IHRoZSB1c2VyIG9yIGdyb3VwLiBJdCBpcyBhbHNvCiAJcG9zc2libGUgdG8gY2hlY2sgd2hldGhlciBhIHNvY2tldCBhY3R1YWxseSBleGlzdHMuCiAKKwlDb25mbGljdHMgd2l0aCAnInF1b3RhLCB0YWcsIHVpZCIgbWF0Y2gnCisKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZCiAJdHJpc3RhdGUgJ0lQc2VjICJwb2xpY3kiIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBYRlJNCkBAIC05MzUsNiArOTM3LDIyIEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1FUQUdVSUQKKwlib29sICcicXVvdGEsIHRhZywgb3duZXIiIG1hdGNoIGFuZCBzdGF0cyBzdXBwb3J0JworICAgICAgICBkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVF9NQVRDSF9TT0NLRVQKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj1uCisJaGVscAorCSAgVGhpcyBvcHRpb24gcmVwbGFjZXMgdGhlIGBvd25lcicgbWF0Y2guIEluIGFkZGl0aW9uIHRvIG1hdGNoaW5nCisJICBvbiB1aWQsIGl0IGtlZXBzIHN0YXRzIGJhc2VkIG9uIGEgdGFnIGFzc2lnbmVkIHRvIGEgc29ja2V0LgorCSAgVGhlIGZ1bGwgdGFnIGlzIGNvbXByaXNlZCBvZiBhIFVJRCBhbmQgYW4gYWNjb3VudGluZyB0YWcuCisJICBUaGUgdGFncyBhcmUgYXNzaWduYWJsZSB0byBzb2NrZXRzIGZyb20gdXNlciBzcGFjZSAoZS5nLiBhIGRvd25sb2FkCisJICBtYW5hZ2VyIGNhbiBhc3NpZ24gdGhlIHNvY2tldCB0byBhbm90aGVyIFVJRCBmb3IgYWNjb3VudGluZykuCisJICBTdGF0cyBhbmQgY29udHJvbCBhcmUgZG9uZSB2aWEgL3Byb2MvbmV0L3h0X3F0YWd1aWQvLgorCSAgSXQgcmVwbGFjZXMgb3duZXIgYXMgaXQgdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzLCBidXQgc2hvdWxkCisJICByZWFsbHkgYmUgcmVjb2duaXplZCBieSB0aGUgaXB0YWJsZXMgdG9vbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX1FVT1RBCiAJdHJpc3RhdGUgJyJxdW90YSIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRApAQCAtOTQ1LDYgKzk2MywzMCBAQAogCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1FVT1RBMgorCXRyaXN0YXRlICcicXVvdGEyIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBxdW90YTInIG1hdGNoLCB3aGljaCBhbGxvd3MgdG8gbWF0Y2ggb24gYQorCSAgYnl0ZSBjb3VudGVyIGNvcnJlY3RseSBhbmQgbm90IHBlciBDUFUuCisJICBJdCBhbGxvd3MgbmFtaW5nIHRoZSBxdW90YXMuCisJICBUaGlzIGlzIGJhc2VkIG9uIGh0dHA6Ly94dGFibGVzLWFkZG9ucy5naXQuc291cmNlZm9yZ2UubmV0CisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQTJfTE9HCisJYm9vbCAnInF1b3RhMiIgTmV0ZmlsdGVyIExPRyBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUX01BVENIX1FVT1RBMgorCWRlcGVuZHMgb24gSVBfTkZfVEFSR0VUX1VMT0c9biAgICAjIG5vdCB5ZXMsIG5vdCBtb2R1bGUsIGp1c3Qgbm8KKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgYHF1b3RhMicgdG8gbG9nIE9OQ0Ugd2hlbiBhIHF1b3RhIGxpbWl0CisJICBpcyBwYXNzZWQuIEl0IGxvZ3MgdmlhIE5FVExJTksgdXNpbmcgdGhlIE5FVExJTktfTkZMT0cgZmFtaWx5LgorCSAgSXQgbG9ncyBzaW1pbGFybHkgdG8gaG93IGlwdF9VTE9HIHdvdWxkIHdpdGhvdXQgZGF0YS4KKworCSAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1QKIAl0cmlzdGF0ZSAnInJhdGVlc3QiIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDFhMDI4NTMuLjZkOTE3MTcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtOTUsNyArOTUsOSBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlTREVWKSArPSB4dF9waHlzZGV2Lm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRSkgKz0geHRfcGt0dHlwZS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWSkgKz0geHRfcG9saWN5Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVRBR1VJRCkgKz0geHRfcXRhZ3VpZF9wcmludC5vIHh0X3F0YWd1aWQubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQSkgKz0geHRfcXVvdGEubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQTIpICs9IHh0X3F1b3RhMi5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1QpICs9IHh0X3JhdGVlc3Qubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTSkgKz0geHRfcmVhbG0ubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQpICs9IHh0X3JlY2VudC5vCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKaW5kZXggNzJkMWFjNjEuLjgwNDFiZWYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKQEAgLTgxNSw3ICs4MTUsNyBAQAogCWlwX3NldF9pZF90IGk7CiAKIAlpZiAodW5saWtlbHkocHJvdG9jb2xfZmFpbGVkKGF0dHIpKSkKLQkJcmV0dXJuIC1FUFJPVE87CisJCXJldHVybiAtSVBTRVRfRVJSX1BST1RPQ09MOwogCiAJaWYgKCFhdHRyW0lQU0VUX0FUVFJfU0VUTkFNRV0pIHsKIAkJZm9yIChpID0gMDsgaSA8IGlwX3NldF9tYXg7IGkrKykKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCmluZGV4IGJmMjhhYzIuLjc4MmRiMjc1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKQEAgLTc3Niw4ICs3NzYsMTYgQEAKIAkJaWYgKGNwLT5jb250cm9sKQogCQkJaXBfdnNfY29udHJvbF9kZWwoY3ApOwogCi0JCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTkZDVCkKKwkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9ORkNUKSB7CiAJCQlpcF92c19jb25uX2Ryb3BfY29ubnRyYWNrKGNwKTsKKwkJCS8qIERvIG5vdCBhY2Nlc3MgY29ubnRyYWNrcyBkdXJpbmcgc3Vic3lzIGNsZWFudXAKKwkJCSAqIGJlY2F1c2UgbmZfY29ubnRyYWNrX2ZpbmRfZ2V0IGNhbiBub3QgYmUgdXNlZCBhZnRlcgorCQkJICogY29ubnRyYWNrIGNsZWFudXAgZm9yIHRoZSBuZXQuCisJCQkgKi8KKwkJCXNtcF9ybWIoKTsKKwkJCWlmIChpcHZzLT5lbmFibGUpCisJCQkJaXBfdnNfY29ubl9kcm9wX2Nvbm50cmFjayhjcCk7CisJCX0KIAogCQlpcF92c19wZV9wdXQoY3AtPnBlKTsKIAkJa2ZyZWUoY3AtPnBlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKaW5kZXggYTc0ZGFlNi4uNzcyOWVhZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCkBAIC0xOTY1LDYgKzE5NjUsNyBAQAogewogCUVudGVyRnVuY3Rpb24oMik7CiAJbmV0X2lwdnMobmV0KS0+ZW5hYmxlID0gMDsJLyogRGlzYWJsZSBwYWNrZXQgcmVjZXB0aW9uICovCisJc21wX3dtYigpOwogCV9faXBfdnNfc3luY19jbGVhbnVwKG5ldCk7CiAJTGVhdmVGdW5jdGlvbigyKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYwppbmRleCA2YjVkZDZkLi5hZjYzNTUzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jCkBAIC00MTEsMjUgKzQxMSwzNSBAQAogc3RhdGljIGludCBfX25ldF9pbml0IF9faXBfdnNfZnRwX2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCWludCBpLCByZXQ7Ci0Jc3RydWN0IGlwX3ZzX2FwcCAqYXBwID0gJmlwX3ZzX2Z0cDsKKwlzdHJ1Y3QgaXBfdnNfYXBwICphcHA7CisJc3RydWN0IG5ldG5zX2lwdnMgKmlwdnMgPSBuZXRfaXB2cyhuZXQpOworCisJYXBwID0ga21lbWR1cCgmaXBfdnNfZnRwLCBzaXplb2Yoc3RydWN0IGlwX3ZzX2FwcCksIEdGUF9LRVJORUwpOworCWlmICghYXBwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX0xJU1RfSEVBRCgmYXBwLT5hX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZhcHAtPmluY3NfbGlzdCk7CisJaXB2cy0+ZnRwX2FwcCA9IGFwcDsKIAogCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX2FwcChuZXQsIGFwcCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZXhpdDsKIAogCWZvciAoaT0wOyBpPElQX1ZTX0FQUF9NQVhfUE9SVFM7IGkrKykgewogCQlpZiAoIXBvcnRzW2ldKQogCQkJY29udGludWU7CiAJCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX2FwcF9pbmMobmV0LCBhcHAsIGFwcC0+cHJvdG9jb2wsIHBvcnRzW2ldKTsKIAkJaWYgKHJldCkKLQkJCWJyZWFrOworCQkJZ290byBlcnJfdW5yZWc7CiAJCXByX2luZm8oIiVzOiBsb2FkZWQgc3VwcG9ydCBvbiBwb3J0WyVkXSA9ICVkXG4iLAogCQkJYXBwLT5uYW1lLCBpLCBwb3J0c1tpXSk7CiAJfQorCXJldHVybiAwOwogCi0JaWYgKHJldCkKLQkJdW5yZWdpc3Rlcl9pcF92c19hcHAobmV0LCBhcHApOwotCitlcnJfdW5yZWc6CisJdW5yZWdpc3Rlcl9pcF92c19hcHAobmV0LCBhcHApOworZXJyX2V4aXQ6CisJa2ZyZWUoaXB2cy0+ZnRwX2FwcCk7CiAJcmV0dXJuIHJldDsKIH0KIC8qCkBAIC00MzcsOSArNDQ3LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faXBfdnNfZnRwX2V4aXQoc3RydWN0IG5ldCAqbmV0KQogewotCXN0cnVjdCBpcF92c19hcHAgKmFwcCA9ICZpcF92c19mdHA7CisJc3RydWN0IG5ldG5zX2lwdnMgKmlwdnMgPSBuZXRfaXB2cyhuZXQpOwogCi0JdW5yZWdpc3Rlcl9pcF92c19hcHAobmV0LCBhcHApOworCXVucmVnaXN0ZXJfaXBfdnNfYXBwKG5ldCwgaXB2cy0+ZnRwX2FwcCk7CisJa2ZyZWUoaXB2cy0+ZnRwX2FwcCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgaXBfdnNfZnRwX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKaW5kZXggMjM3Y2MxOS4uY2I1YTI4NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKQEAgLTE0MTksNiArMTQxOSw3IEBACiAJY29uc3QgY2hhciAqZHB0ciwgKmVuZDsKIAlzMTYgZGlmZiwgdGRpZmYgPSAwOwogCWludCByZXQgPSBORl9BQ0NFUFQ7CisJYm9vbCB0ZXJtOwogCXR5cGVvZihuZl9uYXRfc2lwX3NlcV9hZGp1c3RfaG9vaykgbmZfbmF0X3NpcF9zZXFfYWRqdXN0OwogCiAJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgpAQCAtMTQ1MywxNCArMTQ1NCwyMSBAQAogCQlpZiAoZHB0ciArIG1hdGNob2ZmID09IGVuZCkKIAkJCWJyZWFrOwogCi0JCWlmIChlbmQgKyBzdHJsZW4oIlxyXG5cclxuIikgPiBkcHRyICsgZGF0YWxlbikKLQkJCWJyZWFrOwotCQlpZiAoZW5kWzBdICE9ICdccicgfHwgZW5kWzFdICE9ICdcbicgfHwKLQkJICAgIGVuZFsyXSAhPSAnXHInIHx8IGVuZFszXSAhPSAnXG4nKQorCQl0ZXJtID0gZmFsc2U7CisJCWZvciAoOyBlbmQgKyBzdHJsZW4oIlxyXG5cclxuIikgPD0gZHB0ciArIGRhdGFsZW47IGVuZCsrKSB7CisJCQlpZiAoZW5kWzBdID09ICdccicgJiYgZW5kWzFdID09ICdcbicgJiYKKwkJCSAgICBlbmRbMl0gPT0gJ1xyJyAmJiBlbmRbM10gPT0gJ1xuJykgeworCQkJCXRlcm0gPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghdGVybSkKIAkJCWJyZWFrOwogCQllbmQgKz0gc3RybGVuKCJcclxuXHJcbiIpICsgY2xlbjsKIAogCQltc2dsZW4gPSBvcmlnbGVuID0gZW5kIC0gZHB0cjsKKwkJaWYgKG1zZ2xlbiA+IGRhdGFsZW4pCisJCQlyZXR1cm4gTkZfRFJPUDsKIAogCQlyZXQgPSBwcm9jZXNzX3NpcF9tc2coc2tiLCBjdCwgZGF0YW9mZiwgJmRwdHIsICZtc2dsZW4pOwogCQlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jCmluZGV4IDNiZGQ0NDMuLjQzYTE2ZDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9JRExFVElNRVIuYwpAQCAtNSw2ICs1LDcgQEAKICAqIEFmdGVyIHRpbWVyIGV4cGlyZXMgYSBrZXZlbnQgd2lsbCBiZSBzZW50LgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKICAqIFdyaXR0ZW4gYnkgVGltbyBUZXJhcyA8ZXh0LXRpbW8udGVyYXNAbm9raWEuY29tPgogICoKICAqIENvbnZlcnRlZCB0byB4X3RhYmxlcyBhbmQgcmV3b3JrZWQgZm9yIHVwc3RyZWFtIGluY2x1c2lvbgpAQCAtMzgsOCArMzksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfSURMRVRJTUVSLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogc3RydWN0IGlkbGV0aW1lcl90Z19hdHRyIHsKIAlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CkBAIC01Niw2ICs1OSw4IEBACiAJc3RydWN0IGlkbGV0aW1lcl90Z19hdHRyIGF0dHI7CiAKIAl1bnNpZ25lZCBpbnQgcmVmY250OworCWJvb2wgc2VuZF9ubF9tc2c7CisJYm9vbCBhY3RpdmU7CiB9OwogCiBzdGF0aWMgTElTVF9IRUFEKGlkbGV0aW1lcl90Z19saXN0KTsKQEAgLTYzLDYgKzY4LDMyIEBACiAKIHN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqaWRsZXRpbWVyX3RnX2tvYmo7CiAKK3N0YXRpYyB2b2lkIG5vdGlmeV9uZXRsaW5rX3VldmVudChjb25zdCBjaGFyICppZmFjZSwgc3RydWN0IGlkbGV0aW1lcl90ZyAqdGltZXIpCit7CisJY2hhciBpZmFjZV9tc2dbTkxNU0dfTUFYX1NJWkVdOworCWNoYXIgc3RhdGVfbXNnW05MTVNHX01BWF9TSVpFXTsKKwljaGFyICplbnZwW10gPSB7IGlmYWNlX21zZywgc3RhdGVfbXNnLCBOVUxMIH07CisJaW50IHJlczsKKworCXJlcyA9IHNucHJpbnRmKGlmYWNlX21zZywgTkxNU0dfTUFYX1NJWkUsICJJTlRFUkZBQ0U9JXMiLAorCQkgICAgICAgaWZhY2UpOworCWlmIChOTE1TR19NQVhfU0laRSA8PSByZXMpIHsKKwkJcHJfZXJyKCJtZXNzYWdlIHRvbyBsb25nICglZCkiLCByZXMpOworCQlyZXR1cm47CisJfQorCXJlcyA9IHNucHJpbnRmKHN0YXRlX21zZywgTkxNU0dfTUFYX1NJWkUsICJTVEFURT0lcyIsCisJCSAgICAgICB0aW1lci0+YWN0aXZlID8gImFjdGl2ZSIgOiAiaW5hY3RpdmUiKTsKKwlpZiAoTkxNU0dfTUFYX1NJWkUgPD0gcmVzKSB7CisJCXByX2VycigibWVzc2FnZSB0b28gbG9uZyAoJWQpIiwgcmVzKTsKKwkJcmV0dXJuOworCX0KKwlwcl9kZWJ1ZygicHV0dGluZyBubG1zZzogPCVzPiA8JXM+XG4iLCBpZmFjZV9tc2csIHN0YXRlX21zZyk7CisJa29iamVjdF91ZXZlbnRfZW52KGlkbGV0aW1lcl90Z19rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7CisJcmV0dXJuOworCisKK30KKwogc3RhdGljCiBzdHJ1Y3QgaWRsZXRpbWVyX3RnICpfX2lkbGV0aW1lcl90Z19maW5kX2J5X2xhYmVsKGNvbnN0IGNoYXIgKmxhYmVsKQogewpAQCAtODMsNiArMTE0LDcgQEAKIHsKIAlzdHJ1Y3QgaWRsZXRpbWVyX3RnICp0aW1lcjsKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCW11dGV4X2xvY2soJmxpc3RfbXV0ZXgpOwogCkBAIC05MiwxMSArMTI0LDE1IEBACiAKIAltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOwogCi0JaWYgKHRpbWVfYWZ0ZXIoZXhwaXJlcywgamlmZmllcykpCisJaWYgKHRpbWVfYWZ0ZXIoZXhwaXJlcywgbm93KSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsCi0JCQkgICAgICAgamlmZmllc190b19tc2VjcyhleHBpcmVzIC0gamlmZmllcykgLyAxMDAwKTsKKwkJCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGV4cGlyZXMgLSBub3cpIC8gMTAwMCk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKKwlpZiAodGltZXItPnNlbmRfbmxfbXNnKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwICVkXG4iLAorCQkJamlmZmllc190b19tc2Vjcyhub3cgLSBleHBpcmVzKSAvIDEwMDApOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGlkbGV0aW1lcl90Z193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTEwNSw2ICsxNDEsOSBAQAogCQkJCQkJICB3b3JrKTsKIAogCXN5c2ZzX25vdGlmeShpZGxldGltZXJfdGdfa29iaiwgTlVMTCwgdGltZXItPmF0dHIuYXR0ci5uYW1lKTsKKworCWlmICh0aW1lci0+c2VuZF9ubF9tc2cpCisJCW5vdGlmeV9uZXRsaW5rX3VldmVudCh0aW1lci0+YXR0ci5hdHRyLm5hbWUsIHRpbWVyKTsKIH0KIAogc3RhdGljIHZvaWQgaWRsZXRpbWVyX3RnX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtMTEzLDYgKzE1Miw3IEBACiAKIAlwcl9kZWJ1ZygidGltZXIgJXMgZXhwaXJlZFxuIiwgdGltZXItPmF0dHIuYXR0ci5uYW1lKTsKIAorCXRpbWVyLT5hY3RpdmUgPSBmYWxzZTsKIAlzY2hlZHVsZV93b3JrKCZ0aW1lci0+d29yayk7CiB9CiAKQEAgLTE0Nyw2ICsxODcsOCBAQAogCXNldHVwX3RpbWVyKCZpbmZvLT50aW1lci0+dGltZXIsIGlkbGV0aW1lcl90Z19leHBpcmVkLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpIGluZm8tPnRpbWVyKTsKIAlpbmZvLT50aW1lci0+cmVmY250ID0gMTsKKwlpbmZvLT50aW1lci0+c2VuZF9ubF9tc2cgPSAoaW5mby0+c2VuZF9ubF9tc2cgPT0gMCkgPyBmYWxzZSA6IHRydWU7CisJaW5mby0+dGltZXItPmFjdGl2ZSA9IHRydWU7CiAKIAltb2RfdGltZXIoJmluZm8tPnRpbWVyLT50aW1lciwKIAkJICBtc2Vjc190b19qaWZmaWVzKGluZm8tPnRpbWVvdXQgKiAxMDAwKSArIGppZmZpZXMpOwpAQCAtMTcwLDE0ICsyMTIsMjQgQEAKIAkJCQkJIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKIHsKIAljb25zdCBzdHJ1Y3QgaWRsZXRpbWVyX3RnX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCXByX2RlYnVnKCJyZXNldHRpbmcgdGltZXIgJXMsIHRpbWVvdXQgcGVyaW9kICV1XG4iLAogCQkgaW5mby0+bGFiZWwsIGluZm8tPnRpbWVvdXQpOwogCiAJQlVHX09OKCFpbmZvLT50aW1lcik7CiAKKwlpbmZvLT50aW1lci0+YWN0aXZlID0gdHJ1ZTsKKworCWlmICh0aW1lX2JlZm9yZShpbmZvLT50aW1lci0+dGltZXIuZXhwaXJlcywgbm93KSkgeworCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50aW1lci0+d29yayk7CisJCXByX2RlYnVnKCJTdGFydGluZyB0aW1lciAlcyAoRXhwaXJlZCwgSmlmZmllcyk6ICVsdSwgJWx1XG4iLAorCQkJIGluZm8tPmxhYmVsLCBpbmZvLT50aW1lci0+dGltZXIuZXhwaXJlcywgbm93KTsKKwl9CisKKwkvKiBUT0RPOiBBdm9pZCBtb2RpZnlpbmcgdGltZXJzIG9uIGVhY2ggcGFja2V0ICovCiAJbW9kX3RpbWVyKCZpbmZvLT50aW1lci0+dGltZXIsCi0JCSAgbXNlY3NfdG9famlmZmllcyhpbmZvLT50aW1lb3V0ICogMTAwMCkgKyBqaWZmaWVzKTsKKwkJICBtc2Vjc190b19qaWZmaWVzKGluZm8tPnRpbWVvdXQgKiAxMDAwKSArIG5vdyk7CiAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CkBAIC0xODYsOCArMjM4LDkgQEAKIHsKIAlzdHJ1Y3QgaWRsZXRpbWVyX3RnX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCi0JcHJfZGVidWcoImNoZWNrZW50cnkgdGFyZ2luZm8lc1xuIiwgaW5mby0+bGFiZWwpOworCXByX2RlYnVnKCJjaGVja2VudHJ5IHRhcmdpbmZvICVzXG4iLCBpbmZvLT5sYWJlbCk7CiAKIAlpZiAoaW5mby0+dGltZW91dCA9PSAwKSB7CiAJCXByX2RlYnVnKCJ0aW1lb3V0IHZhbHVlIGlzIHplcm9cbiIpOwpAQCAtMjA2LDggKzI1OSwxNyBAQAogCWluZm8tPnRpbWVyID0gX19pZGxldGltZXJfdGdfZmluZF9ieV9sYWJlbChpbmZvLT5sYWJlbCk7CiAJaWYgKGluZm8tPnRpbWVyKSB7CiAJCWluZm8tPnRpbWVyLT5yZWZjbnQrKzsKKwkJaW5mby0+dGltZXItPmFjdGl2ZSA9IHRydWU7CisKKwkJaWYgKHRpbWVfYmVmb3JlKGluZm8tPnRpbWVyLT50aW1lci5leHBpcmVzLCBub3cpKSB7CisJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50aW1lci0+d29yayk7CisJCQlwcl9kZWJ1ZygiU3RhcnRpbmcgQ2hlY2tlbnRyeSB0aW1lciIKKwkJCQkiKEV4cGlyZWQsIEppZmZpZXMpOiAlbHUsICVsdVxuIiwKKwkJCQlpbmZvLT50aW1lci0+dGltZXIuZXhwaXJlcywgbm93KTsKKwkJfQorCiAJCW1vZF90aW1lcigmaW5mby0+dGltZXItPnRpbWVyLAotCQkJICBtc2Vjc190b19qaWZmaWVzKGluZm8tPnRpbWVvdXQgKiAxMDAwKSArIGppZmZpZXMpOworCQkJICBtc2Vjc190b19qaWZmaWVzKGluZm8tPnRpbWVvdXQgKiAxMDAwKSArIG5vdyk7CiAKIAkJcHJfZGVidWcoImluY3JlYXNlZCByZWZjbnQgb2YgdGltZXIgJXMgdG8gJXVcbiIsCiAJCQkgaW5mby0+bGFiZWwsIGluZm8tPnRpbWVyLT5yZWZjbnQpOwpAQCAtMjIxLDYgKzI4Myw3IEBACiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNDIsNyArMzA1LDcgQEAKIAkJa2ZyZWUoaW5mby0+dGltZXIpOwogCX0gZWxzZSB7CiAJCXByX2RlYnVnKCJkZWNyZWFzZWQgcmVmY250IG9mIHRpbWVyICVzIHRvICV1XG4iLAotCQkJIGluZm8tPmxhYmVsLCBpbmZvLT50aW1lci0+cmVmY250KTsKKwkJaW5mby0+bGFiZWwsIGluZm8tPnRpbWVyLT5yZWZjbnQpOwogCX0KIAogCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CkBAIC0yNTAsNiArMzEzLDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaWRsZXRpbWVyX3RnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gIklETEVUSU1FUiIsCisJLnJldmlzaW9uCT0gMSwKIAkuZmFtaWx5CQk9IE5GUFJPVE9fVU5TUEVDLAogCS50YXJnZXQJCT0gaWRsZXRpbWVyX3RnX3RhcmdldCwKIAkudGFyZ2V0c2l6ZSAgICAgPSBzaXplb2Yoc3RydWN0IGlkbGV0aW1lcl90Z19pbmZvKSwKQEAgLTMxNSwzICszNzksNCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0FMSUFTKCJpcHRfSURMRVRJTUVSIik7CiBNT0RVTEVfQUxJQVMoImlwNnRfSURMRVRJTUVSIik7CitNT0RVTEVfQUxJQVMoImFycHRfSURMRVRJTUVSIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWQuYyBiL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDRjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWQuYwpAQCAtMCwwICsxLDI5NzYgQEAKKy8qCisgKiBLZXJuZWwgaXB0YWJsZXMgbW9kdWxlIHRvIHRyYWNrIHN0YXRzIGZvciBwYWNrZXRzIGJhc2VkIG9uIHVzZXIgdGFncy4KKyAqCisgKiAoQykgMjAxMSBHb29nbGUsIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoZXJlIGFyZSBydW4tdGltZSBkZWJ1ZyBmbGFncyBlbmFibGVkIHZpYSB0aGUgZGVidWdfbWFzayBtb2R1bGUgcGFyYW0sIG9yCisgKiB2aWEgdGhlIERFRkFVTFRfREVCVUdfTUFTSy4gU2VlIHh0X3F0YWd1aWRfaW50ZXJuYWwuaC4KKyAqLworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcXRhZ3VpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zb2NrZXQuaD4KKyNpbmNsdWRlICJ4dF9xdGFndWlkX2ludGVybmFsLmgiCisjaW5jbHVkZSAieHRfcXRhZ3VpZF9wcmludC5oIgorCisvKgorICogV2Ugb25seSB1c2UgdGhlIHh0X3NvY2tldCBmdW5jcyB3aXRoaW4gYSBzaW1pbGFyIGNvbnRleHQgdG8gYXZvaWQgdW5leHBlY3RlZAorICogcmV0dXJuIHZhbHVlcy4KKyAqLworI2RlZmluZSBYVF9TT0NLRVRfU1VQUE9SVEVEX0hPT0tTIFwKKwkoKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSkKKworCitzdGF0aWMgY29uc3QgY2hhciAqbW9kdWxlX3Byb2NkaXJuYW1lID0gInh0X3F0YWd1aWQiOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqeHRfcXRhZ3VpZF9wcm9jZGlyOworCitzdGF0aWMgdW5zaWduZWQgaW50IHByb2NfaWZhY2VfcGVybXMgPSBTX0lSVUdPOworbW9kdWxlX3BhcmFtX25hbWVkKGlmYWNlX3Blcm1zLCBwcm9jX2lmYWNlX3Blcm1zLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnh0X3F0YWd1aWRfc3RhdHNfZmlsZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvY19zdGF0c19wZXJtcyA9IFNfSVJVR087Cittb2R1bGVfcGFyYW1fbmFtZWQoc3RhdHNfcGVybXMsIHByb2Nfc3RhdHNfcGVybXMsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqeHRfcXRhZ3VpZF9jdHJsX2ZpbGU7CisjaWZkZWYgQ09ORklHX0FORFJPSURfUEFSQU5PSURfTkVUV09SSworc3RhdGljIHVuc2lnbmVkIGludCBwcm9jX2N0cmxfcGVybXMgPSBTX0lSVUdPIHwgU19JV1VHTzsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgaW50IHByb2NfY3RybF9wZXJtcyA9IFNfSVJVR08gfCBTX0lXVVNSOworI2VuZGlmCittb2R1bGVfcGFyYW1fbmFtZWQoY3RybF9wZXJtcywgcHJvY19jdHJsX3Blcm1zLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9QQVJBTk9JRF9ORVRXT1JLCisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9haWQuaD4KK3N0YXRpYyBnaWRfdCBwcm9jX3N0YXRzX3JlYWRhbGxfZ2lkID0gQUlEX05FVF9CV19TVEFUUzsKK3N0YXRpYyBnaWRfdCBwcm9jX2N0cmxfd3JpdGVfZ2lkID0gQUlEX05FVF9CV19BQ0NUOworI2Vsc2UKKy8qIDAgbWVhbnMsIGRvbid0IGxpbWl0IGFueWJvZHkgKi8KK3N0YXRpYyBnaWRfdCBwcm9jX3N0YXRzX3JlYWRhbGxfZ2lkOworc3RhdGljIGdpZF90IHByb2NfY3RybF93cml0ZV9naWQ7CisjZW5kaWYKK21vZHVsZV9wYXJhbV9uYW1lZChzdGF0c19yZWFkYWxsX2dpZCwgcHJvY19zdGF0c19yZWFkYWxsX2dpZCwgdWludCwKKwkJICAgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKGN0cmxfd3JpdGVfZ2lkLCBwcm9jX2N0cmxfd3JpdGVfZ2lkLCB1aW50LAorCQkgICBTX0lSVUdPIHwgU19JV1VTUik7CisKKy8qCisgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB0YWdzICh2aWEgc29ja2V0IHRhZ3MpIGZvciBhIGdpdmVuIFVJRC4KKyAqIE11bHRpcGxlIHByb2Nlc3NlcyBjb3VsZCBzaGFyZSB0aGUgVUlELgorICovCitzdGF0aWMgaW50IG1heF9zb2NrX3RhZ3MgPSBERUZBVUxUX01BWF9TT0NLX1RBR1M7Cittb2R1bGVfcGFyYW0obWF4X3NvY2tfdGFncywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKKy8qCisgKiBBZnRlciB0aGUga2VybmVsIGhhcyBpbml0aWFsbGl6ZWQgdGhpcyBtb2R1bGUsIGl0IGlzIHN0aWxsIHBvc3NpYmxlCisgKiB0byBtYWtlIGl0IHBhc3NpdmUuCisgKiBTZXR0aW5nIHBhc3NpdmUgdG8gWToKKyAqICAtIHRoZSBpZmFjZSBzdGF0cyBoYW5kbGluZyB3aWxsIG5vdCBhY3Qgb24gbm90aWZpY2F0aW9ucy4KKyAqICAtIGlwdGFibGVzIG1hdGNoZXMgd2lsbCBuZXZlciBtYXRjaC4KKyAqICAtIGN0cmwgY29tbWFuZHMgc2lsZW50bHkgc3VjY2VlZC4KKyAqICAtIHN0YXRzIGFyZSBhbHdheXMgZW1wdHkuCisgKiBUaGlzIGlzIG1vc3RseSB1c2VmdWxsIHdoZW4gYSBidWcgaXMgc3VzcGVjdGVkLgorICovCitzdGF0aWMgYm9vbCBtb2R1bGVfcGFzc2l2ZTsKK21vZHVsZV9wYXJhbV9uYW1lZChwYXNzaXZlLCBtb2R1bGVfcGFzc2l2ZSwgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworCisvKgorICogQ29udHJvbCBob3cgcXRhZ3VpZCBkYXRhIGlzIHRyYWNrZWQgcGVyIHByb2MvdWlkLgorICogU2V0dGluZyB0YWdfdHJhY2tpbmdfcGFzc2l2ZSB0byBZOgorICogIC0gZG9uJ3QgY3JlYXRlIHByb2Mgc3BlY2lmaWMgc3RydWN0cyB0byB0cmFjayB0YWdzCisgKiAgLSBkb24ndCBjaGVjayB0aGF0IGFjdGl2ZSB0YWcgc3RhdHMgZXhjZWVkIHNvbWUgbGltaXRzLgorICogIC0gZG9uJ3QgY2xlYW4gdXAgc29ja2V0IHRhZ3Mgb24gcHJvY2VzcyBleGl0cy4KKyAqIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bGwgd2hlbiBhIGJ1ZyBpcyBzdXNwZWN0ZWQuCisgKi8KK3N0YXRpYyBib29sIHF0dV9wcm9jX2hhbmRsaW5nX3Bhc3NpdmU7Cittb2R1bGVfcGFyYW1fbmFtZWQodGFnX3RyYWNraW5nX3Bhc3NpdmUsIHF0dV9wcm9jX2hhbmRsaW5nX3Bhc3NpdmUsIGJvb2wsCisJCSAgIFNfSVJVR08gfCBTX0lXVVNSKTsKKworI2RlZmluZSBRVFVfREVWX05BTUUgInh0X3F0YWd1aWQiCisKK3VpbnQgcXRhZ3VpZF9kZWJ1Z19tYXNrID0gREVGQVVMVF9ERUJVR19NQVNLOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX21hc2ssIHF0YWd1aWRfZGVidWdfbWFzaywgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgY29uc3QgY2hhciAqaWZhY2Vfc3RhdF9wcm9jZGlybmFtZSA9ICJpZmFjZV9zdGF0IjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmlmYWNlX3N0YXRfcHJvY2RpcjsKKy8qCisgKiBUaGUgaWZhY2Vfc3RhdF9hbGwqIHdpbGwgZ28gYXdheSBvbmNlIHVzZXJzcGFjZSBnZXRzIHVzZSB0byB0aGUgbmV3IGZpZWxkcworICogdGhhdCBoYXZlIGEgZm9ybWF0IGxpbmUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppZmFjZV9zdGF0X2FsbF9wcm9jZmlsZW5hbWUgPSAiaWZhY2Vfc3RhdF9hbGwiOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaWZhY2Vfc3RhdF9hbGxfcHJvY2ZpbGU7CitzdGF0aWMgY29uc3QgY2hhciAqaWZhY2Vfc3RhdF9mbXRfcHJvY2ZpbGVuYW1lID0gImlmYWNlX3N0YXRfZm10IjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmlmYWNlX3N0YXRfZm10X3Byb2NmaWxlOworCisKKy8qCisgKiBPcmRlcmluZyBvZiBsb2NrczoKKyAqICBvdXRlciBsb2NrczoKKyAqICAgIGlmYWNlX3N0YXRfbGlzdF9sb2NrCisgKiAgICBzb2NrX3RhZ19saXN0X2xvY2sKKyAqICBpbm5lciBsb2NrczoKKyAqICAgIHVpZF90YWdfZGF0YV90cmVlX2xvY2sKKyAqICAgIHRhZ19jb3VudGVyX3NldF9saXN0X2xvY2sKKyAqIE5vdGljZSBob3cgc29ja190YWdfbGlzdF9sb2NrIGlzIGhlbGQgc29tZXRpbWVzIHdoZW4gdWlkX3RhZ19kYXRhX3RyZWVfbG9jaworICogaXMgYWNxdWlyZWQuCisgKgorICogQ2FsbCB0cmVlIHdpdGggYWxsIGxvY2sgaG9sZGVycyBhcyBvZiAyMDEyLTA0LTI3OgorICoKKyAqIGlmYWNlX3N0YXRfZm10X3Byb2NfcmVhZCgpCisgKiAgIGlmYWNlX3N0YXRfbGlzdF9sb2NrCisgKiAgICAgKHN0cnVjdCBpZmFjZV9zdGF0KQorICoKKyAqIHF0YWd1aWRfY3RybF9wcm9jX3JlYWQoKQorICogICBzb2NrX3RhZ19saXN0X2xvY2sKKyAqICAgICAoc29ja190YWdfdHJlZSkKKyAqICAgICAoc3RydWN0IHByb2NfcXR1X2RhdGEtPnNvY2tfdGFnX2xpc3QpCisgKiAgIHByZGVidWdfZnVsbF9zdGF0ZSgpCisgKiAgICAgc29ja190YWdfbGlzdF9sb2NrCisgKiAgICAgICAoc29ja190YWdfdHJlZSkKKyAqICAgICB1aWRfdGFnX2RhdGFfdHJlZV9sb2NrCisgKiAgICAgICAodWlkX3RhZ19kYXRhX3RyZWUpCisgKiAgICAgICAocHJvY19xdHVfZGF0YV90cmVlKQorICogICAgIGlmYWNlX3N0YXRfbGlzdF9sb2NrCisgKgorICogcXRhZ3VpZF9zdGF0c19wcm9jX3JlYWQoKQorICogICBpZmFjZV9zdGF0X2xpc3RfbG9jaworICogICAgIHN0cnVjdCBpZmFjZV9zdGF0LT50YWdfc3RhdF9saXN0X2xvY2sKKyAqCisgKiBxdHVkZXZfb3BlbigpCisgKiAgIHVpZF90YWdfZGF0YV90cmVlX2xvY2sKKyAqCisgKiBxdHVkZXZfcmVsZWFzZSgpCisgKiAgIHNvY2tfdGFnX2RhdGFfbGlzdF9sb2NrCisgKiAgICAgdWlkX3RhZ19kYXRhX3RyZWVfbG9jaworICogICBwcmRlYnVnX2Z1bGxfc3RhdGUoKQorICogICAgIHNvY2tfdGFnX2xpc3RfbG9jaworICogICAgIHVpZF90YWdfZGF0YV90cmVlX2xvY2sKKyAqICAgICBpZmFjZV9zdGF0X2xpc3RfbG9jaworICoKKyAqIGlmYWNlX25ldGRldl9ldmVudF9oYW5kbGVyKCkKKyAqICAgaWZhY2Vfc3RhdF9jcmVhdGUoKQorICogICAgIGlmYWNlX3N0YXRfbGlzdF9sb2NrCisgKiAgIGlmYWNlX3N0YXRfdXBkYXRlKCkKKyAqICAgICBpZmFjZV9zdGF0X2xpc3RfbG9jaworICoKKyAqIGlmYWNlX2luZXRhZGRyX2V2ZW50X2hhbmRsZXIoKQorICogICBpZmFjZV9zdGF0X2NyZWF0ZSgpCisgKiAgICAgaWZhY2Vfc3RhdF9saXN0X2xvY2sKKyAqICAgaWZhY2Vfc3RhdF91cGRhdGUoKQorICogICAgIGlmYWNlX3N0YXRfbGlzdF9sb2NrCisgKgorICogaWZhY2VfaW5ldDZhZGRyX2V2ZW50X2hhbmRsZXIoKQorICogICBpZmFjZV9zdGF0X2NyZWF0ZV9pcHY2KCkKKyAqICAgICBpZmFjZV9zdGF0X2xpc3RfbG9jaworICogICBpZmFjZV9zdGF0X3VwZGF0ZSgpCisgKiAgICAgaWZhY2Vfc3RhdF9saXN0X2xvY2sKKyAqCisgKiBxdGFndWlkX210KCkKKyAqICAgYWNjb3VudF9mb3JfdWlkKCkKKyAqICAgICBpZl90YWdfc3RhdF91cGRhdGUoKQorICogICAgICAgZ2V0X3NvY2tfc3RhdCgpCisgKiAgICAgICAgIHNvY2tfdGFnX2xpc3RfbG9jaworICogICAgICAgc3RydWN0IGlmYWNlX3N0YXQtPnRhZ19zdGF0X2xpc3RfbG9jaworICogICAgICAgICB0YWdfc3RhdF91cGRhdGUoKQorICogICAgICAgICAgIGdldF9hY3RpdmVfY291bnRlcl9zZXQoKQorICogICAgICAgICAgICAgdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jaworICogICAgICAgICB0YWdfc3RhdF91cGRhdGUoKQorICogICAgICAgICAgIGdldF9hY3RpdmVfY291bnRlcl9zZXQoKQorICogICAgICAgICAgICAgdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jaworICoKKyAqCisgKiBxdGFndWlkX2N0cmxfcGFyc2UoKQorICogICBjdHJsX2NtZF9kZWxldGUoKQorICogICAgIHNvY2tfdGFnX2xpc3RfbG9jaworICogICAgIHRhZ19jb3VudGVyX3NldF9saXN0X2xvY2sKKyAqICAgICBpZmFjZV9zdGF0X2xpc3RfbG9jaworICogICAgICAgc3RydWN0IGlmYWNlX3N0YXQtPnRhZ19zdGF0X2xpc3RfbG9jaworICogICAgIHVpZF90YWdfZGF0YV90cmVlX2xvY2sKKyAqICAgY3RybF9jbWRfY291bnRlcl9zZXQoKQorICogICAgIHRhZ19jb3VudGVyX3NldF9saXN0X2xvY2sKKyAqICAgY3RybF9jbWRfdGFnKCkKKyAqICAgICBzb2NrX3RhZ19saXN0X2xvY2sKKyAqICAgICAgIChzb2NrX3RhZ190cmVlKQorICogICAgICAgZ2V0X3RhZ19yZWYoKQorICogICAgICAgICB1aWRfdGFnX2RhdGFfdHJlZV9sb2NrCisgKiAgICAgICAgICAgKHVpZF90YWdfZGF0YV90cmVlKQorICogICAgICAgdWlkX3RhZ19kYXRhX3RyZWVfbG9jaworICogICAgICAgICAocHJvY19xdHVfZGF0YV90cmVlKQorICogICBjdHJsX2NtZF91bnRhZygpCisgKiAgICAgc29ja190YWdfbGlzdF9sb2NrCisgKiAgICAgdWlkX3RhZ19kYXRhX3RyZWVfbG9jaworICoKKyAqLworc3RhdGljIExJU1RfSEVBRChpZmFjZV9zdGF0X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhpZmFjZV9zdGF0X2xpc3RfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCBzb2NrX3RhZ190cmVlID0gUkJfUk9PVDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc29ja190YWdfbGlzdF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCByYl9yb290IHRhZ19jb3VudGVyX3NldF90cmVlID0gUkJfUk9PVDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCB1aWRfdGFnX2RhdGFfdHJlZSA9IFJCX1JPT1Q7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCitzdGF0aWMgc3RydWN0IHJiX3Jvb3QgcHJvY19xdHVfZGF0YV90cmVlID0gUkJfUk9PVDsKKy8qIE5vIHByb2NfcXR1X2RhdGFfdHJlZV9sb2NrOyB1c2UgdWlkX3RhZ19kYXRhX3RyZWVfbG9jayAqLworCitzdGF0aWMgc3RydWN0IHF0YWd1aWRfZXZlbnRfY291bnRzIHF0dV9ldmVudHM7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGJvb2wgY2FuX21hbmlwdWxhdGVfdWlkcyh2b2lkKQoreworCS8qIHJvb3QgcHduZCAqLworCXJldHVybiB1bmxpa2VseSghY3VycmVudF9mc3VpZCgpKSB8fCB1bmxpa2VseSghcHJvY19jdHJsX3dyaXRlX2dpZCkKKwkJfHwgaW5fZWdyb3VwX3AocHJvY19jdHJsX3dyaXRlX2dpZCk7Cit9CisKK3N0YXRpYyBib29sIGNhbl9pbXBlcnNvbmF0ZV91aWQodWlkX3QgdWlkKQoreworCXJldHVybiB1aWQgPT0gY3VycmVudF9mc3VpZCgpIHx8IGNhbl9tYW5pcHVsYXRlX3VpZHMoKTsKK30KKworc3RhdGljIGJvb2wgY2FuX3JlYWRfb3RoZXJfdWlkX3N0YXRzKHVpZF90IHVpZCkKK3sKKwkvKiByb290IHB3bmQgKi8KKwlyZXR1cm4gdW5saWtlbHkoIWN1cnJlbnRfZnN1aWQoKSkgfHwgdWlkID09IGN1cnJlbnRfZnN1aWQoKQorCQl8fCB1bmxpa2VseSghcHJvY19zdGF0c19yZWFkYWxsX2dpZCkKKwkJfHwgaW5fZWdyb3VwX3AocHJvY19zdGF0c19yZWFkYWxsX2dpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY19hZGRfYnl0ZV9wYWNrZXRzKHN0cnVjdCBkYXRhX2NvdW50ZXJzICpjb3VudGVycywgaW50IHNldCwKKwkJCQkgIGVudW0gaWZzX3R4X3J4IGRpcmVjdGlvbiwKKwkJCQkgIGVudW0gaWZzX3Byb3RvIGlmc19wcm90bywKKwkJCQkgIGludCBieXRlcywKKwkJCQkgIGludCBwYWNrZXRzKQoreworCWNvdW50ZXJzLT5icGNbc2V0XVtkaXJlY3Rpb25dW2lmc19wcm90b10uYnl0ZXMgKz0gYnl0ZXM7CisJY291bnRlcnMtPmJwY1tzZXRdW2RpcmVjdGlvbl1baWZzX3Byb3RvXS5wYWNrZXRzICs9IHBhY2tldHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZGNfc3VtX2J5dGVzKHN0cnVjdCBkYXRhX2NvdW50ZXJzICpjb3VudGVycywKKwkJCQkgICAgaW50IHNldCwKKwkJCQkgICAgZW51bSBpZnNfdHhfcnggZGlyZWN0aW9uKQoreworCXJldHVybiBjb3VudGVycy0+YnBjW3NldF1bZGlyZWN0aW9uXVtJRlNfVENQXS5ieXRlcworCQkrIGNvdW50ZXJzLT5icGNbc2V0XVtkaXJlY3Rpb25dW0lGU19VRFBdLmJ5dGVzCisJCSsgY291bnRlcnMtPmJwY1tzZXRdW2RpcmVjdGlvbl1bSUZTX1BST1RPX09USEVSXS5ieXRlczsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBkY19zdW1fcGFja2V0cyhzdHJ1Y3QgZGF0YV9jb3VudGVycyAqY291bnRlcnMsCisJCQkJICAgICAgaW50IHNldCwKKwkJCQkgICAgICBlbnVtIGlmc190eF9yeCBkaXJlY3Rpb24pCit7CisJcmV0dXJuIGNvdW50ZXJzLT5icGNbc2V0XVtkaXJlY3Rpb25dW0lGU19UQ1BdLnBhY2tldHMKKwkJKyBjb3VudGVycy0+YnBjW3NldF1bZGlyZWN0aW9uXVtJRlNfVURQXS5wYWNrZXRzCisJCSsgY291bnRlcnMtPmJwY1tzZXRdW2RpcmVjdGlvbl1bSUZTX1BST1RPX09USEVSXS5wYWNrZXRzOworfQorCitzdGF0aWMgc3RydWN0IHRhZ19ub2RlICp0YWdfbm9kZV90cmVlX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdGFnX3QgdGFnKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcm9vdC0+cmJfbm9kZTsKKworCXdoaWxlIChub2RlKSB7CisJCXN0cnVjdCB0YWdfbm9kZSAqZGF0YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCB0YWdfbm9kZSwgbm9kZSk7CisJCWludCByZXN1bHQ7CisJCVJCX0RFQlVHKCJxdGFndWlkOiB0YWdfbm9kZV90cmVlX3NlYXJjaCgweCVsbHgpOiAiCisJCQkgIiBub2RlPSVwIGRhdGE9JXBcbiIsIHRhZywgbm9kZSwgZGF0YSk7CisJCXJlc3VsdCA9IHRhZ19jb21wYXJlKHRhZywgZGF0YS0+dGFnKTsKKwkJUkJfREVCVUcoInF0YWd1aWQ6IHRhZ19ub2RlX3RyZWVfc2VhcmNoKDB4JWxseCk6ICIKKwkJCSAiIGRhdGEudGFnPTB4JWxseCAodWlkPSV1KSByZXM9JWRcbiIsCisJCQkgdGFnLCBkYXRhLT50YWcsIGdldF91aWRfZnJvbV90YWcoZGF0YS0+dGFnKSwgcmVzdWx0KTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocmVzdWx0ID4gMCkKKwkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGRhdGE7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB0YWdfbm9kZV90cmVlX2luc2VydChzdHJ1Y3QgdGFnX25vZGUgKmRhdGEsIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICoqbmV3ID0gJihyb290LT5yYl9ub2RlKSwgKnBhcmVudCA9IE5VTEw7CisKKwkvKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCBuZXcgbm9kZSAqLworCXdoaWxlICgqbmV3KSB7CisJCXN0cnVjdCB0YWdfbm9kZSAqdGhpcyA9IHJiX2VudHJ5KCpuZXcsIHN0cnVjdCB0YWdfbm9kZSwKKwkJCQkJCSBub2RlKTsKKwkJaW50IHJlc3VsdCA9IHRhZ19jb21wYXJlKGRhdGEtPnRhZywgdGhpcy0+dGFnKTsKKwkJUkJfREVCVUcoInF0YWd1aWQ6ICVzKCk6IHRhZz0weCVsbHgiCisJCQkgIiAodWlkPSV1KVxuIiwgX19mdW5jX18sCisJCQkgdGhpcy0+dGFnLAorCQkJIGdldF91aWRfZnJvbV90YWcodGhpcy0+dGFnKSk7CisJCXBhcmVudCA9ICpuZXc7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlIGlmIChyZXN1bHQgPiAwKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCisJLyogQWRkIG5ldyBub2RlIGFuZCByZWJhbGFuY2UgdHJlZS4gKi8KKwlyYl9saW5rX25vZGUoJmRhdGEtPm5vZGUsIHBhcmVudCwgbmV3KTsKKwlyYl9pbnNlcnRfY29sb3IoJmRhdGEtPm5vZGUsIHJvb3QpOworfQorCitzdGF0aWMgdm9pZCB0YWdfc3RhdF90cmVlX2luc2VydChzdHJ1Y3QgdGFnX3N0YXQgKmRhdGEsIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXRhZ19ub2RlX3RyZWVfaW5zZXJ0KCZkYXRhLT50biwgcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFnX3N0YXQgKnRhZ19zdGF0X3RyZWVfc2VhcmNoKHN0cnVjdCByYl9yb290ICpyb290LCB0YWdfdCB0YWcpCit7CisJc3RydWN0IHRhZ19ub2RlICpub2RlID0gdGFnX25vZGVfdHJlZV9zZWFyY2gocm9vdCwgdGFnKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiByYl9lbnRyeSgmbm9kZS0+bm9kZSwgc3RydWN0IHRhZ19zdGF0LCB0bi5ub2RlKTsKK30KKworc3RhdGljIHZvaWQgdGFnX2NvdW50ZXJfc2V0X3RyZWVfaW5zZXJ0KHN0cnVjdCB0YWdfY291bnRlcl9zZXQgKmRhdGEsCisJCQkJCXN0cnVjdCByYl9yb290ICpyb290KQoreworCXRhZ19ub2RlX3RyZWVfaW5zZXJ0KCZkYXRhLT50biwgcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFnX2NvdW50ZXJfc2V0ICp0YWdfY291bnRlcl9zZXRfdHJlZV9zZWFyY2goc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCQkJICAgdGFnX3QgdGFnKQoreworCXN0cnVjdCB0YWdfbm9kZSAqbm9kZSA9IHRhZ19ub2RlX3RyZWVfc2VhcmNoKHJvb3QsIHRhZyk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmJfZW50cnkoJm5vZGUtPm5vZGUsIHN0cnVjdCB0YWdfY291bnRlcl9zZXQsIHRuLm5vZGUpOworCit9CisKK3N0YXRpYyB2b2lkIHRhZ19yZWZfdHJlZV9pbnNlcnQoc3RydWN0IHRhZ19yZWYgKmRhdGEsIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXRhZ19ub2RlX3RyZWVfaW5zZXJ0KCZkYXRhLT50biwgcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFnX3JlZiAqdGFnX3JlZl90cmVlX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdGFnX3QgdGFnKQoreworCXN0cnVjdCB0YWdfbm9kZSAqbm9kZSA9IHRhZ19ub2RlX3RyZWVfc2VhcmNoKHJvb3QsIHRhZyk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmJfZW50cnkoJm5vZGUtPm5vZGUsIHN0cnVjdCB0YWdfcmVmLCB0bi5ub2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrX3RhZyAqc29ja190YWdfdHJlZV9zZWFyY2goc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcm9vdC0+cmJfbm9kZTsKKworCXdoaWxlIChub2RlKSB7CisJCXN0cnVjdCBzb2NrX3RhZyAqZGF0YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzb2NrX3RhZywKKwkJCQkJCSBzb2NrX25vZGUpOworCQlpZiAoc2sgPCBkYXRhLT5zaykKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChzayA+IGRhdGEtPnNrKQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZGF0YTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNvY2tfdGFnX3RyZWVfaW5zZXJ0KHN0cnVjdCBzb2NrX3RhZyAqZGF0YSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmKHJvb3QtPnJiX25vZGUpLCAqcGFyZW50ID0gTlVMTDsKKworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IG5ldyBub2RlICovCisJd2hpbGUgKCpuZXcpIHsKKwkJc3RydWN0IHNvY2tfdGFnICp0aGlzID0gcmJfZW50cnkoKm5ldywgc3RydWN0IHNvY2tfdGFnLAorCQkJCQkJIHNvY2tfbm9kZSk7CisJCXBhcmVudCA9ICpuZXc7CisJCWlmIChkYXRhLT5zayA8IHRoaXMtPnNrKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlIGlmIChkYXRhLT5zayA+IHRoaXMtPnNrKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCisJLyogQWRkIG5ldyBub2RlIGFuZCByZWJhbGFuY2UgdHJlZS4gKi8KKwlyYl9saW5rX25vZGUoJmRhdGEtPnNvY2tfbm9kZSwgcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9jb2xvcigmZGF0YS0+c29ja19ub2RlLCByb290KTsKK30KKworc3RhdGljIHZvaWQgc29ja190YWdfdHJlZV9lcmFzZShzdHJ1Y3QgcmJfcm9vdCAqc3RfdG9fZnJlZV90cmVlKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCBzb2NrX3RhZyAqc3RfZW50cnk7CisKKwlub2RlID0gcmJfZmlyc3Qoc3RfdG9fZnJlZV90cmVlKTsKKwl3aGlsZSAobm9kZSkgeworCQlzdF9lbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzb2NrX3RhZywgc29ja19ub2RlKTsKKwkJbm9kZSA9IHJiX25leHQobm9kZSk7CisJCUNUX0RFQlVHKCJxdGFndWlkOiAlcygpOiAiCisJCQkgImVyYXNlIHN0OiBzaz0lcCB0YWc9MHglbGx4ICh1aWQ9JXUpXG4iLCBfX2Z1bmNfXywKKwkJCSBzdF9lbnRyeS0+c2ssCisJCQkgc3RfZW50cnktPnRhZywKKwkJCSBnZXRfdWlkX2Zyb21fdGFnKHN0X2VudHJ5LT50YWcpKTsKKwkJcmJfZXJhc2UoJnN0X2VudHJ5LT5zb2NrX25vZGUsIHN0X3RvX2ZyZWVfdHJlZSk7CisJCXNvY2tmZF9wdXQoc3RfZW50cnktPnNvY2tldCk7CisJCWtmcmVlKHN0X2VudHJ5KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19xdHVfZGF0YSAqcHJvY19xdHVfZGF0YV90cmVlX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwKKwkJCQkJCSAgICAgICBjb25zdCBwaWRfdCBwaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOworCisJd2hpbGUgKG5vZGUpIHsKKwkJc3RydWN0IHByb2NfcXR1X2RhdGEgKmRhdGEgPSByYl9lbnRyeShub2RlLAorCQkJCQkJICAgICAgc3RydWN0IHByb2NfcXR1X2RhdGEsCisJCQkJCQkgICAgICBub2RlKTsKKwkJaWYgKHBpZCA8IGRhdGEtPnBpZCkKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChwaWQgPiBkYXRhLT5waWQpCisJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBkYXRhOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcHJvY19xdHVfZGF0YV90cmVlX2luc2VydChzdHJ1Y3QgcHJvY19xdHVfZGF0YSAqZGF0YSwKKwkJCQkgICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ldyA9ICYocm9vdC0+cmJfbm9kZSksICpwYXJlbnQgPSBOVUxMOworCisJLyogRmlndXJlIG91dCB3aGVyZSB0byBwdXQgbmV3IG5vZGUgKi8KKwl3aGlsZSAoKm5ldykgeworCQlzdHJ1Y3QgcHJvY19xdHVfZGF0YSAqdGhpcyA9IHJiX2VudHJ5KCpuZXcsCisJCQkJCQkgICAgICBzdHJ1Y3QgcHJvY19xdHVfZGF0YSwKKwkJCQkJCSAgICAgIG5vZGUpOworCQlwYXJlbnQgPSAqbmV3OworCQlpZiAoZGF0YS0+cGlkIDwgdGhpcy0+cGlkKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlIGlmIChkYXRhLT5waWQgPiB0aGlzLT5waWQpCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfcmlnaHQpOworCQllbHNlCisJCQlCVUcoKTsKKwl9CisKKwkvKiBBZGQgbmV3IG5vZGUgYW5kIHJlYmFsYW5jZSB0cmVlLiAqLworCXJiX2xpbmtfbm9kZSgmZGF0YS0+bm9kZSwgcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9jb2xvcigmZGF0YS0+bm9kZSwgcm9vdCk7Cit9CisKK3N0YXRpYyB2b2lkIHVpZF90YWdfZGF0YV90cmVlX2luc2VydChzdHJ1Y3QgdWlkX3RhZ19kYXRhICpkYXRhLAorCQkJCSAgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmKHJvb3QtPnJiX25vZGUpLCAqcGFyZW50ID0gTlVMTDsKKworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IG5ldyBub2RlICovCisJd2hpbGUgKCpuZXcpIHsKKwkJc3RydWN0IHVpZF90YWdfZGF0YSAqdGhpcyA9IHJiX2VudHJ5KCpuZXcsCisJCQkJCQkgICAgIHN0cnVjdCB1aWRfdGFnX2RhdGEsCisJCQkJCQkgICAgIG5vZGUpOworCQlwYXJlbnQgPSAqbmV3OworCQlpZiAoZGF0YS0+dWlkIDwgdGhpcy0+dWlkKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlIGlmIChkYXRhLT51aWQgPiB0aGlzLT51aWQpCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfcmlnaHQpOworCQllbHNlCisJCQlCVUcoKTsKKwl9CisKKwkvKiBBZGQgbmV3IG5vZGUgYW5kIHJlYmFsYW5jZSB0cmVlLiAqLworCXJiX2xpbmtfbm9kZSgmZGF0YS0+bm9kZSwgcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9jb2xvcigmZGF0YS0+bm9kZSwgcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWlkX3RhZ19kYXRhICp1aWRfdGFnX2RhdGFfdHJlZV9zZWFyY2goc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCQkgICAgIHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJvb3QtPnJiX25vZGU7CisKKwl3aGlsZSAobm9kZSkgeworCQlzdHJ1Y3QgdWlkX3RhZ19kYXRhICpkYXRhID0gcmJfZW50cnkobm9kZSwKKwkJCQkJCSAgICAgc3RydWN0IHVpZF90YWdfZGF0YSwKKwkJCQkJCSAgICAgbm9kZSk7CisJCWlmICh1aWQgPCBkYXRhLT51aWQpCisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodWlkID4gZGF0YS0+dWlkKQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZGF0YTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBbGxvY2F0ZXMgYSBuZXcgdWlkX3RhZ19kYXRhIHN0cnVjdCBpZiBuZWVkZWQuCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZm91bmQgb3IgYWxsb2NhdGVkIHVpZF90YWdfZGF0YS4KKyAqIFJldHVybnMgYSBQVFJfRVJSIG9uIGZhaWx1cmVzLCBhbmQgbG9jayBpcyBub3QgaGVsZC4KKyAqIElmIGZvdW5kIGlzIG5vdCBOVUxMOgorICogICBzZXRzICpmb3VuZCB0byB0cnVlIGlmIG5vdCBhbGxvY2F0ZWQuCisgKiAgIHNldHMgKmZvdW5kIHRvIGZhbHNlIGlmIGFsbG9jYXRlZC4KKyAqLworc3RydWN0IHVpZF90YWdfZGF0YSAqZ2V0X3VpZF9kYXRhKHVpZF90IHVpZCwgYm9vbCAqZm91bmRfcmVzKQoreworCXN0cnVjdCB1aWRfdGFnX2RhdGEgKnV0ZF9lbnRyeTsKKworCS8qIExvb2sgZm9yIHRvcCBsZXZlbCB1aWRfdGFnX2RhdGEgZm9yIHRoZSBVSUQgKi8KKwl1dGRfZW50cnkgPSB1aWRfdGFnX2RhdGFfdHJlZV9zZWFyY2goJnVpZF90YWdfZGF0YV90cmVlLCB1aWQpOworCURSX0RFQlVHKCJxdGFndWlkOiBnZXRfdWlkX2RhdGEoJXUpIHV0ZD0lcFxuIiwgdWlkLCB1dGRfZW50cnkpOworCisJaWYgKGZvdW5kX3JlcykKKwkJKmZvdW5kX3JlcyA9IHV0ZF9lbnRyeTsKKwlpZiAodXRkX2VudHJ5KQorCQlyZXR1cm4gdXRkX2VudHJ5OworCisJdXRkX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKnV0ZF9lbnRyeSksIEdGUF9BVE9NSUMpOworCWlmICghdXRkX2VudHJ5KSB7CisJCXByX2VycigicXRhZ3VpZDogZ2V0X3VpZF9kYXRhKCV1KTogIgorCQkgICAgICAgInRhZyBkYXRhIGFsbG9jIGZhaWxlZFxuIiwgdWlkKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJdXRkX2VudHJ5LT51aWQgPSB1aWQ7CisJdXRkX2VudHJ5LT50YWdfcmVmX3RyZWUgPSBSQl9ST09UOworCXVpZF90YWdfZGF0YV90cmVlX2luc2VydCh1dGRfZW50cnksICZ1aWRfdGFnX2RhdGFfdHJlZSk7CisJRFJfREVCVUcoInF0YWd1aWQ6IGdldF91aWRfZGF0YSgldSkgbmV3IHV0ZD0lcFxuIiwgdWlkLCB1dGRfZW50cnkpOworCXJldHVybiB1dGRfZW50cnk7Cit9CisKKy8qIE5ldmVyIHJldHVybnMgTlVMTC4gRWl0aGVyIFBUUl9FUlIgb3IgYSB2YWxpZCBwdHIuICovCitzdGF0aWMgc3RydWN0IHRhZ19yZWYgKm5ld190YWdfcmVmKHRhZ190IG5ld190YWcsCisJCQkJICAgc3RydWN0IHVpZF90YWdfZGF0YSAqdXRkX2VudHJ5KQoreworCXN0cnVjdCB0YWdfcmVmICp0cl9lbnRyeTsKKwlpbnQgcmVzOworCisJaWYgKHV0ZF9lbnRyeS0+bnVtX2FjdGl2ZV90YWdzICsgMSA+IG1heF9zb2NrX3RhZ3MpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogbmV3X3RhZ19yZWYoMHglbGx4KTogIgorCQkJInRhZyByZWYgYWxsb2MgcXVvdGEgZXhjZWVkZWQuIG1heD0lZFxuIiwKKwkJCW5ld190YWcsIG1heF9zb2NrX3RhZ3MpOworCQlyZXMgPSAtRU1GSUxFOworCQlnb3RvIGVycl9yZXM7CisKKwl9CisKKwl0cl9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCp0cl9lbnRyeSksIEdGUF9BVE9NSUMpOworCWlmICghdHJfZW50cnkpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBuZXdfdGFnX3JlZigweCVsbHgpOiAiCisJCSAgICAgICAidGFnIHJlZiBhbGxvYyBmYWlsZWRcbiIsCisJCSAgICAgICBuZXdfdGFnKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVzOworCX0KKwl0cl9lbnRyeS0+dG4udGFnID0gbmV3X3RhZzsKKwkvKiB0cl9lbnRyeS0+bnVtX3NvY2tfdGFncyAgaGFuZGxlZCBieSBjYWxsZXIgKi8KKwl1dGRfZW50cnktPm51bV9hY3RpdmVfdGFncysrOworCXRhZ19yZWZfdHJlZV9pbnNlcnQodHJfZW50cnksICZ1dGRfZW50cnktPnRhZ19yZWZfdHJlZSk7CisJRFJfREVCVUcoInF0YWd1aWQ6IG5ld190YWdfcmVmKDB4JWxseCk6ICIKKwkJICIgaW5zZXJ0ZWQgbmV3IHRhZyByZWYgJXBcbiIsCisJCSBuZXdfdGFnLCB0cl9lbnRyeSk7CisJcmV0dXJuIHRyX2VudHJ5OworCitlcnJfcmVzOgorCXJldHVybiBFUlJfUFRSKHJlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFnX3JlZiAqbG9va3VwX3RhZ19yZWYodGFnX3QgZnVsbF90YWcsCisJCQkJICAgICAgc3RydWN0IHVpZF90YWdfZGF0YSAqKnV0ZF9yZXMpCit7CisJc3RydWN0IHVpZF90YWdfZGF0YSAqdXRkX2VudHJ5OworCXN0cnVjdCB0YWdfcmVmICp0cl9lbnRyeTsKKwlib29sIGZvdW5kX3V0ZDsKKwl1aWRfdCB1aWQgPSBnZXRfdWlkX2Zyb21fdGFnKGZ1bGxfdGFnKTsKKworCURSX0RFQlVHKCJxdGFndWlkOiBsb29rdXBfdGFnX3JlZih0YWc9MHglbGx4ICh1aWQ9JXUpKVxuIiwKKwkJIGZ1bGxfdGFnLCB1aWQpOworCisJdXRkX2VudHJ5ID0gZ2V0X3VpZF9kYXRhKHVpZCwgJmZvdW5kX3V0ZCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHV0ZF9lbnRyeSkpIHsKKwkJaWYgKHV0ZF9yZXMpCisJCQkqdXRkX3JlcyA9IHV0ZF9lbnRyeTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdHJfZW50cnkgPSB0YWdfcmVmX3RyZWVfc2VhcmNoKCZ1dGRfZW50cnktPnRhZ19yZWZfdHJlZSwgZnVsbF90YWcpOworCWlmICh1dGRfcmVzKQorCQkqdXRkX3JlcyA9IHV0ZF9lbnRyeTsKKwlEUl9ERUJVRygicXRhZ3VpZDogbG9va3VwX3RhZ19yZWYoMHglbGx4KSB1dGRfZW50cnk9JXAgdHJfZW50cnk9JXBcbiIsCisJCSBmdWxsX3RhZywgdXRkX2VudHJ5LCB0cl9lbnRyeSk7CisJcmV0dXJuIHRyX2VudHJ5OworfQorCisvKiBOZXZlciByZXR1cm5zIE5VTEwuIEVpdGhlciBQVFJfRVJSIG9yIGEgdmFsaWQgcHRyLiAqLworc3RhdGljIHN0cnVjdCB0YWdfcmVmICpnZXRfdGFnX3JlZih0YWdfdCBmdWxsX3RhZywKKwkJCQkgICBzdHJ1Y3QgdWlkX3RhZ19kYXRhICoqdXRkX3JlcykKK3sKKwlzdHJ1Y3QgdWlkX3RhZ19kYXRhICp1dGRfZW50cnk7CisJc3RydWN0IHRhZ19yZWYgKnRyX2VudHJ5OworCisJRFJfREVCVUcoInF0YWd1aWQ6IGdldF90YWdfcmVmKDB4JWxseClcbiIsCisJCSBmdWxsX3RhZyk7CisJc3Bpbl9sb2NrX2JoKCZ1aWRfdGFnX2RhdGFfdHJlZV9sb2NrKTsKKwl0cl9lbnRyeSA9IGxvb2t1cF90YWdfcmVmKGZ1bGxfdGFnLCAmdXRkX2VudHJ5KTsKKwlCVUdfT04oSVNfRVJSX09SX05VTEwodXRkX2VudHJ5KSk7CisJaWYgKCF0cl9lbnRyeSkKKwkJdHJfZW50cnkgPSBuZXdfdGFnX3JlZihmdWxsX3RhZywgdXRkX2VudHJ5KTsKKworCXNwaW5fdW5sb2NrX2JoKCZ1aWRfdGFnX2RhdGFfdHJlZV9sb2NrKTsKKwlpZiAodXRkX3JlcykKKwkJKnV0ZF9yZXMgPSB1dGRfZW50cnk7CisJRFJfREVCVUcoInF0YWd1aWQ6IGdldF90YWdfcmVmKDB4JWxseCkgdXRkPSVwIHRyPSVwXG4iLAorCQkgZnVsbF90YWcsIHV0ZF9lbnRyeSwgdHJfZW50cnkpOworCXJldHVybiB0cl9lbnRyeTsKK30KKworLyogQ2hlY2tzIGFuZCBtYXliZSBmcmVlcyB0aGUgVUlEIFRhZyBEYXRhIGVudHJ5ICovCitzdGF0aWMgdm9pZCBwdXRfdXRkX2VudHJ5KHN0cnVjdCB1aWRfdGFnX2RhdGEgKnV0ZF9lbnRyeSkKK3sKKwkvKiBBcmUgd2UgZG9uZSB3aXRoIHRoZSBVSUQgdGFnIGRhdGEgZW50cnk/ICovCisJaWYgKFJCX0VNUFRZX1JPT1QoJnV0ZF9lbnRyeS0+dGFnX3JlZl90cmVlKSAmJgorCQkhdXRkX2VudHJ5LT5udW1fcHFkKSB7CisJCURSX0RFQlVHKCJxdGFndWlkOiAlcygpOiAiCisJCQkgImVyYXNlIHV0ZF9lbnRyeT0lcCB1aWQ9JXUgIgorCQkJICJieSBwaWQ9JXUgdGdpZD0ldSB1aWQ9JXVcbiIsIF9fZnVuY19fLAorCQkJIHV0ZF9lbnRyeSwgdXRkX2VudHJ5LT51aWQsCisJCQkgY3VycmVudC0+cGlkLCBjdXJyZW50LT50Z2lkLCBjdXJyZW50X2ZzdWlkKCkpOworCQlCVUdfT04odXRkX2VudHJ5LT5udW1fYWN0aXZlX3RhZ3MpOworCQlyYl9lcmFzZSgmdXRkX2VudHJ5LT5ub2RlLCAmdWlkX3RhZ19kYXRhX3RyZWUpOworCQlrZnJlZSh1dGRfZW50cnkpOworCX0gZWxzZSB7CisJCURSX0RFQlVHKCJxdGFndWlkOiAlcygpOiAiCisJCQkgInV0ZF9lbnRyeT0lcCBzdGlsbCBoYXMgJWQgdGFncyAlZCBwcm9jX3F0dV9kYXRhXG4iLAorCQkJIF9fZnVuY19fLCB1dGRfZW50cnksIHV0ZF9lbnRyeS0+bnVtX2FjdGl2ZV90YWdzLAorCQkJIHV0ZF9lbnRyeS0+bnVtX3BxZCk7CisJCUJVR19PTighKHV0ZF9lbnRyeS0+bnVtX2FjdGl2ZV90YWdzIHx8CisJCQkgdXRkX2VudHJ5LT5udW1fcHFkKSk7CisJfQorfQorCisvKgorICogSWYgbm8gc29ja190YWdzIGFyZSB1c2luZyB0aGlzIHRhZ19yZWYsCisgKiBkZWNyZW1lbnRzIHJlZmNvdW50IG9mIHV0ZF9lbnRyeSwgcmVtb3ZlcyB0cl9lbnRyeQorICogZnJvbSB1dGRfZW50cnktPnRhZ19yZWZfdHJlZSBhbmQgZnJlZXMuCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfdGFnX3JlZl9mcm9tX3V0ZF9lbnRyeShzdHJ1Y3QgdGFnX3JlZiAqdHJfZW50cnksCisJCQkJCXN0cnVjdCB1aWRfdGFnX2RhdGEgKnV0ZF9lbnRyeSkKK3sKKwlEUl9ERUJVRygicXRhZ3VpZDogJXMoKTogJXAgdGFnPTB4JWxseCAodWlkPSV1KVxuIiwgX19mdW5jX18sCisJCSB0cl9lbnRyeSwgdHJfZW50cnktPnRuLnRhZywKKwkJIGdldF91aWRfZnJvbV90YWcodHJfZW50cnktPnRuLnRhZykpOworCWlmICghdHJfZW50cnktPm51bV9zb2NrX3RhZ3MpIHsKKwkJQlVHX09OKCF1dGRfZW50cnktPm51bV9hY3RpdmVfdGFncyk7CisJCXV0ZF9lbnRyeS0+bnVtX2FjdGl2ZV90YWdzLS07CisJCXJiX2VyYXNlKCZ0cl9lbnRyeS0+dG4ubm9kZSwgJnV0ZF9lbnRyeS0+dGFnX3JlZl90cmVlKTsKKwkJRFJfREVCVUcoInF0YWd1aWQ6ICVzKCk6IGVyYXNlZCAlcFxuIiwgX19mdW5jX18sIHRyX2VudHJ5KTsKKwkJa2ZyZWUodHJfZW50cnkpOworCX0KK30KKworc3RhdGljIHZvaWQgcHV0X3RhZ19yZWZfdHJlZSh0YWdfdCBmdWxsX3RhZywgc3RydWN0IHVpZF90YWdfZGF0YSAqdXRkX2VudHJ5KQoreworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCB0YWdfcmVmICp0cl9lbnRyeTsKKwl0YWdfdCBhY2N0X3RhZzsKKworCURSX0RFQlVHKCJxdGFndWlkOiAlcyh0YWc9MHglbGx4ICh1aWQ9JXUpKVxuIiwgX19mdW5jX18sCisJCSBmdWxsX3RhZywgZ2V0X3VpZF9mcm9tX3RhZyhmdWxsX3RhZykpOworCWFjY3RfdGFnID0gZ2V0X2F0YWdfZnJvbV90YWcoZnVsbF90YWcpOworCW5vZGUgPSByYl9maXJzdCgmdXRkX2VudHJ5LT50YWdfcmVmX3RyZWUpOworCXdoaWxlIChub2RlKSB7CisJCXRyX2VudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRhZ19yZWYsIHRuLm5vZGUpOworCQlub2RlID0gcmJfbmV4dChub2RlKTsKKwkJaWYgKCFhY2N0X3RhZyB8fCB0cl9lbnRyeS0+dG4udGFnID09IGZ1bGxfdGFnKQorCQkJZnJlZV90YWdfcmVmX2Zyb21fdXRkX2VudHJ5KHRyX2VudHJ5LCB1dGRfZW50cnkpOworCX0KK30KKworc3RhdGljIGludCByZWFkX3Byb2NfdTY0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCXVpbnQ2NF90IHZhbHVlOworCWNoYXIgKnAgPSBwYWdlOworCXVpbnQ2NF90ICppZmFjZV9lbnRyeSA9IGRhdGE7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJdmFsdWUgPSAqaWZhY2VfZW50cnk7CisJcCArPSBzcHJpbnRmKHAsICIlbGx1XG4iLCB2YWx1ZSk7CisJbGVuID0gKHAgLSBwYWdlKSAtIG9mZjsKKwkqZW9mID0gKGxlbiA8PSBjb3VudCkgPyAxIDogMDsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wcm9jX2Jvb2woY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW47CisJYm9vbCB2YWx1ZTsKKwljaGFyICpwID0gcGFnZTsKKwlib29sICpib29sX2VudHJ5ID0gZGF0YTsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuIDA7CisKKwl2YWx1ZSA9ICpib29sX2VudHJ5OworCXAgKz0gc3ByaW50ZihwLCAiJXVcbiIsIHZhbHVlKTsKKwlsZW4gPSAocCAtIHBhZ2UpIC0gb2ZmOworCSplb2YgPSAobGVuIDw9IGNvdW50KSA/IDEgOiAwOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBnZXRfYWN0aXZlX2NvdW50ZXJfc2V0KHRhZ190IHRhZykKK3sKKwlpbnQgYWN0aXZlX3NldCA9IDA7CisJc3RydWN0IHRhZ19jb3VudGVyX3NldCAqdGNzOworCisJTVRfREVCVUcoInF0YWd1aWQ6IGdldF9hY3RpdmVfY291bnRlcl9zZXQodGFnPTB4JWxseCkiCisJCSAiICh1aWQ9JXUpXG4iLAorCQkgdGFnLCBnZXRfdWlkX2Zyb21fdGFnKHRhZykpOworCS8qIEZvciBub3cgd2Ugb25seSBoYW5kbGUgVUlEIHRhZ3MgZm9yIGFjdGl2ZSBzZXRzICovCisJdGFnID0gZ2V0X3V0YWdfZnJvbV90YWcodGFnKTsKKwlzcGluX2xvY2tfYmgoJnRhZ19jb3VudGVyX3NldF9saXN0X2xvY2spOworCXRjcyA9IHRhZ19jb3VudGVyX3NldF90cmVlX3NlYXJjaCgmdGFnX2NvdW50ZXJfc2V0X3RyZWUsIHRhZyk7CisJaWYgKHRjcykKKwkJYWN0aXZlX3NldCA9IHRjcy0+YWN0aXZlX3NldDsKKwlzcGluX3VubG9ja19iaCgmdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jayk7CisJcmV0dXJuIGFjdGl2ZV9zZXQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBlbnRyeSBmb3IgdHJhY2tpbmcgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCisgKiBDYWxsZXIgbXVzdCBob2xkIGlmYWNlX3N0YXRfbGlzdF9sb2NrCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZhY2Vfc3RhdCAqZ2V0X2lmYWNlX2VudHJ5KGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfZW50cnk7CisKKwkvKiBGaW5kIHRoZSBlbnRyeSBmb3IgdHJhY2tpbmcgdGhlIHNwZWNpZmllZCB0YWcgd2l0aGluIHRoZSBpbnRlcmZhY2UgKi8KKwlpZiAoaWZuYW1lID09IE5VTEwpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogaWZhY2Vfc3RhdDogZ2V0KCkgTlVMTCBkZXZpY2UgbmFtZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEl0ZXJhdGUgb3ZlciBpbnRlcmZhY2VzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZmFjZV9lbnRyeSwgJmlmYWNlX3N0YXRfbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cmNtcChpZm5hbWUsIGlmYWNlX2VudHJ5LT5pZm5hbWUpKQorCQkJZ290byBkb25lOworCX0KKwlpZmFjZV9lbnRyeSA9IE5VTEw7Citkb25lOgorCXJldHVybiBpZmFjZV9lbnRyeTsKK30KKworc3RhdGljIGludCBpZmFjZV9zdGF0X2ZtdF9wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKm51bV9pdGVtc19yZXR1cm5lZCwKKwkJCQkgICAgb2ZmX3QgaXRlbXNfdG9fc2tpcCwgaW50IGNoYXJfY291bnQsCisJCQkJICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWNoYXIgKm91dHAgPSBwYWdlOworCWludCBpdGVtX2luZGV4ID0gMDsKKwlpbnQgbGVuOworCWludCBmbXQgPSAoaW50KWRhdGE7IC8qIFRoZSBkYXRhIGlzIGp1c3QgMSAob2xkKSBvciAyICh1c2VzIGZtdCkgKi8KKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfZW50cnk7CisJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IGRldl9zdGF0cywgKnN0YXRzOworCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCBub19kZXZfc3RhdHMgPSB7MH07CisKKwlpZiAodW5saWtlbHkobW9kdWxlX3Bhc3NpdmUpKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlDVF9ERUJVRygicXRhZ3VpZDpwcm9jIGlmYWNlX3N0YXRfZm10ICIKKwkJICJwaWQ9JXUgdGdpZD0ldSB1aWQ9JXUgIgorCQkgInBhZ2U9JXAgKm51bV9pdGVtc19yZXR1cm5lZD0lcCBvZmY9JWxkICIKKwkJICJjaGFyX2NvdW50PSVkICplb2Y9JWRcbiIsCisJCSBjdXJyZW50LT5waWQsIGN1cnJlbnQtPnRnaWQsIGN1cnJlbnRfZnN1aWQoKSwKKwkJIHBhZ2UsICpudW1faXRlbXNfcmV0dXJuZWQsCisJCSBpdGVtc190b19za2lwLCBjaGFyX2NvdW50LCAqZW9mKTsKKworCWlmICgqZW9mKQorCQlyZXR1cm4gMDsKKworCWlmIChmbXQgPT0gMiAmJiBpdGVtX2luZGV4KysgPj0gaXRlbXNfdG9fc2tpcCkgeworCQlsZW4gPSBzbnByaW50ZihvdXRwLCBjaGFyX2NvdW50LAorCQkJICAgICAgICJpZm5hbWUgIgorCQkJICAgICAgICJ0b3RhbF9za2JfcnhfYnl0ZXMgdG90YWxfc2tiX3J4X3BhY2tldHMgIgorCQkJICAgICAgICJ0b3RhbF9za2JfdHhfYnl0ZXMgdG90YWxfc2tiX3R4X3BhY2tldHNcbiIKKwkJCSk7CisJCWlmIChsZW4gPj0gY2hhcl9jb3VudCkgeworCQkJKm91dHAgPSAnXDAnOworCQkJcmV0dXJuIG91dHAgLSBwYWdlOworCQl9CisJCW91dHAgKz0gbGVuOworCQljaGFyX2NvdW50IC09IGxlbjsKKwkJKCpudW1faXRlbXNfcmV0dXJuZWQpKys7CisJfQorCisJLyoKKwkgKiBUaGlzIGxvY2sgd2lsbCBwcmV2ZW50IGlmYWNlX3N0YXRfdXBkYXRlKCkgZnJvbSBjaGFuZ2luZyBhY3RpdmUsCisJICogYW5kIGluIHR1cm4gcHJldmVudCBhbiBpbnRlcmZhY2UgZnJvbSB1bnJlZ2lzdGVyaW5nIGl0c2VsZi4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlmYWNlX2VudHJ5LCAmaWZhY2Vfc3RhdF9saXN0LCBsaXN0KSB7CisJCWlmIChpdGVtX2luZGV4KysgPCBpdGVtc190b19za2lwKQorCQkJY29udGludWU7CisKKwkJaWYgKGlmYWNlX2VudHJ5LT5hY3RpdmUpIHsKKwkJCXN0YXRzID0gZGV2X2dldF9zdGF0cyhpZmFjZV9lbnRyeS0+bmV0X2RldiwKKwkJCQkJICAgICAgJmRldl9zdGF0cyk7CisJCX0gZWxzZSB7CisJCQlzdGF0cyA9ICZub19kZXZfc3RhdHM7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlIGRhdGEgY2hhbmdlcywgdGhlbiB1cGRhdGUgdGhlIGZtdFgKKwkJICogc3RyaW5nLgorCQkgKi8KKwkJaWYgKGZtdCA9PSAxKSB7CisJCQlsZW4gPSBzbnByaW50ZigKKwkJCQlvdXRwLCBjaGFyX2NvdW50LAorCQkJCSIlcyAlZCAiCisJCQkJIiVsbHUgJWxsdSAlbGx1ICVsbHUgIgorCQkJCSIlbGx1ICVsbHUgJWxsdSAlbGx1XG4iLAorCQkJCWlmYWNlX2VudHJ5LT5pZm5hbWUsCisJCQkJaWZhY2VfZW50cnktPmFjdGl2ZSwKKwkJCQlpZmFjZV9lbnRyeS0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5ieXRlcywKKwkJCQlpZmFjZV9lbnRyeS0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5wYWNrZXRzLAorCQkJCWlmYWNlX2VudHJ5LT50b3RhbHNfdmlhX2RldltJRlNfVFhdLmJ5dGVzLAorCQkJCWlmYWNlX2VudHJ5LT50b3RhbHNfdmlhX2RldltJRlNfVFhdLnBhY2tldHMsCisJCQkJc3RhdHMtPnJ4X2J5dGVzLCBzdGF0cy0+cnhfcGFja2V0cywKKwkJCQlzdGF0cy0+dHhfYnl0ZXMsIHN0YXRzLT50eF9wYWNrZXRzCisJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IHNucHJpbnRmKAorCQkJCW91dHAsIGNoYXJfY291bnQsCisJCQkJIiVzICIKKwkJCQkiJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJCQlpZmFjZV9lbnRyeS0+aWZuYW1lLAorCQkJCWlmYWNlX2VudHJ5LT50b3RhbHNfdmlhX3NrYltJRlNfUlhdLmJ5dGVzLAorCQkJCWlmYWNlX2VudHJ5LT50b3RhbHNfdmlhX3NrYltJRlNfUlhdLnBhY2tldHMsCisJCQkJaWZhY2VfZW50cnktPnRvdGFsc192aWFfc2tiW0lGU19UWF0uYnl0ZXMsCisJCQkJaWZhY2VfZW50cnktPnRvdGFsc192aWFfc2tiW0lGU19UWF0ucGFja2V0cworCQkJCSk7CisJCX0KKwkJaWYgKGxlbiA+PSBjaGFyX2NvdW50KSB7CisJCQlzcGluX3VubG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCQkJKm91dHAgPSAnXDAnOworCQkJcmV0dXJuIG91dHAgLSBwYWdlOworCQl9CisJCW91dHAgKz0gbGVuOworCQljaGFyX2NvdW50IC09IGxlbjsKKwkJKCpudW1faXRlbXNfcmV0dXJuZWQpKys7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpZmFjZV9zdGF0X2xpc3RfbG9jayk7CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gb3V0cCAtIHBhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIGlmYWNlX2NyZWF0ZV9wcm9jX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5OworCXN0cnVjdCBpZmFjZV9zdGF0X3dvcmsgKmlzdyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWZhY2Vfc3RhdF93b3JrLAorCQkJCQkJICAgaWZhY2Vfd29yayk7CisJc3RydWN0IGlmYWNlX3N0YXQgKm5ld19pZmFjZSAgPSBpc3ctPmlmYWNlX2VudHJ5OworCisJLyogaWZhY2VfZW50cmllcyBhcmUgbm90IGRlbGV0ZWQsIHNvIHNhZmUgdG8gbWFuaXB1bGF0ZS4gKi8KKwlwcm9jX2VudHJ5ID0gcHJvY19ta2RpcihuZXdfaWZhY2UtPmlmbmFtZSwgaWZhY2Vfc3RhdF9wcm9jZGlyKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocHJvY19lbnRyeSkpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBjcmVhdGVfcHJvYygpOiBhbGxvYyBmYWlsZWQuXG4iKTsKKwkJa2ZyZWUoaXN3KTsKKwkJcmV0dXJuOworCX0KKworCW5ld19pZmFjZS0+cHJvY19wdHIgPSBwcm9jX2VudHJ5OworCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHhfYnl0ZXMiLCBwcm9jX2lmYWNlX3Blcm1zLCBwcm9jX2VudHJ5LAorCQkJICAgICAgIHJlYWRfcHJvY191NjQsCisJCQkgICAgICAgJm5ld19pZmFjZS0+dG90YWxzX3ZpYV9kZXZbSUZTX1RYXS5ieXRlcyk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicnhfYnl0ZXMiLCBwcm9jX2lmYWNlX3Blcm1zLCBwcm9jX2VudHJ5LAorCQkJICAgICAgIHJlYWRfcHJvY191NjQsCisJCQkgICAgICAgJm5ld19pZmFjZS0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5ieXRlcyk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHhfcGFja2V0cyIsIHByb2NfaWZhY2VfcGVybXMsIHByb2NfZW50cnksCisJCQkgICAgICAgcmVhZF9wcm9jX3U2NCwKKwkJCSAgICAgICAmbmV3X2lmYWNlLT50b3RhbHNfdmlhX2RldltJRlNfVFhdLnBhY2tldHMpOworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJ4X3BhY2tldHMiLCBwcm9jX2lmYWNlX3Blcm1zLCBwcm9jX2VudHJ5LAorCQkJICAgICAgIHJlYWRfcHJvY191NjQsCisJCQkgICAgICAgJm5ld19pZmFjZS0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5wYWNrZXRzKTsKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhY3RpdmUiLCBwcm9jX2lmYWNlX3Blcm1zLCBwcm9jX2VudHJ5LAorCQkJcmVhZF9wcm9jX2Jvb2wsICZuZXdfaWZhY2UtPmFjdGl2ZSk7CisKKwlJRl9ERUJVRygicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlX3Byb2MoKTogZG9uZSAiCisJCSAiZW50cnk9JXAgZGV2PSVzXG4iLCBuZXdfaWZhY2UsIG5ld19pZmFjZS0+aWZuYW1lKTsKKwlrZnJlZShpc3cpOworfQorCisvKgorICogV2lsbCBzZXQgdGhlIGVudHJ5J3MgYWN0aXZlIHN0YXRlLCBhbmQKKyAqIHVwZGF0ZSB0aGUgbmV0X2RldiBhY2NvcmRpbmdseSBhbHNvLgorICovCitzdGF0aWMgdm9pZCBfaWZhY2Vfc3RhdF9zZXRfYWN0aXZlKHN0cnVjdCBpZmFjZV9zdGF0ICplbnRyeSwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQkgICBib29sIGFjdGl2YXRlKQoreworCWlmIChhY3RpdmF0ZSkgeworCQllbnRyeS0+bmV0X2RldiA9IG5ldF9kZXY7CisJCWVudHJ5LT5hY3RpdmUgPSB0cnVlOworCQlJRl9ERUJVRygicXRhZ3VpZDogJXMoJXMpOiAiCisJCQkgImVuYWJsZSB0cmFja2luZy4gcmZjbnQ9JWRcbiIsIF9fZnVuY19fLAorCQkJIGVudHJ5LT5pZm5hbWUsCisJCQkgcGVyY3B1X3JlYWQoKm5ldF9kZXYtPnBjcHVfcmVmY250KSk7CisJfSBlbHNlIHsKKwkJZW50cnktPmFjdGl2ZSA9IGZhbHNlOworCQllbnRyeS0+bmV0X2RldiA9IE5VTEw7CisJCUlGX0RFQlVHKCJxdGFndWlkOiAlcyglcyk6ICIKKwkJCSAiZGlzYWJsZSB0cmFja2luZy4gcmZjbnQ9JWRcbiIsIF9fZnVuY19fLAorCQkJIGVudHJ5LT5pZm5hbWUsCisJCQkgcGVyY3B1X3JlYWQoKm5ldF9kZXYtPnBjcHVfcmVmY250KSk7CisKKwl9Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgaWZhY2Vfc3RhdF9saXN0X2xvY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IGlmYWNlX3N0YXQgKm5ld19pZmFjZTsKKwlzdHJ1Y3QgaWZhY2Vfc3RhdF93b3JrICppc3c7CisKKwluZXdfaWZhY2UgPSBremFsbG9jKHNpemVvZigqbmV3X2lmYWNlKSwgR0ZQX0FUT01JQyk7CisJaWYgKG5ld19pZmFjZSA9PSBOVUxMKSB7CisJCXByX2VycigicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlKCVzKTogIgorCQkgICAgICAgImlmYWNlX3N0YXQgYWxsb2MgZmFpbGVkXG4iLCBuZXRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW5ld19pZmFjZS0+aWZuYW1lID0ga3N0cmR1cChuZXRfZGV2LT5uYW1lLCBHRlBfQVRPTUlDKTsKKwlpZiAobmV3X2lmYWNlLT5pZm5hbWUgPT0gTlVMTCkgeworCQlwcl9lcnIoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZSglcyk6ICIKKwkJICAgICAgICJpZm5hbWUgYWxsb2MgZmFpbGVkXG4iLCBuZXRfZGV2LT5uYW1lKTsKKwkJa2ZyZWUobmV3X2lmYWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNwaW5fbG9ja19pbml0KCZuZXdfaWZhY2UtPnRhZ19zdGF0X2xpc3RfbG9jayk7CisJbmV3X2lmYWNlLT50YWdfc3RhdF90cmVlID0gUkJfUk9PVDsKKwlfaWZhY2Vfc3RhdF9zZXRfYWN0aXZlKG5ld19pZmFjZSwgbmV0X2RldiwgdHJ1ZSk7CisKKwkvKgorCSAqIGlwdjYgbm90aWZpZXIgY2hhaW5zIGFyZSBhdG9taWMgOigKKwkgKiBObyBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCkgZm9yIHlvdSEKKwkgKi8KKwlpc3cgPSBrbWFsbG9jKHNpemVvZigqaXN3KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFpc3cpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBjcmVhdGUoJXMpOiAiCisJCSAgICAgICAid29yayBhbGxvYyBmYWlsZWRcbiIsIG5ld19pZmFjZS0+aWZuYW1lKTsKKwkJX2lmYWNlX3N0YXRfc2V0X2FjdGl2ZShuZXdfaWZhY2UsIG5ldF9kZXYsIGZhbHNlKTsKKwkJa2ZyZWUobmV3X2lmYWNlLT5pZm5hbWUpOworCQlrZnJlZShuZXdfaWZhY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaXN3LT5pZmFjZV9lbnRyeSA9IG5ld19pZmFjZTsKKwlJTklUX1dPUksoJmlzdy0+aWZhY2Vfd29yaywgaWZhY2VfY3JlYXRlX3Byb2Nfd29ya2VyKTsKKwlzY2hlZHVsZV93b3JrKCZpc3ctPmlmYWNlX3dvcmspOworCWxpc3RfYWRkKCZuZXdfaWZhY2UtPmxpc3QsICZpZmFjZV9zdGF0X2xpc3QpOworCXJldHVybiBuZXdfaWZhY2U7Cit9CisKK3N0YXRpYyB2b2lkIGlmYWNlX2NoZWNrX3N0YXRzX3Jlc2V0X2FuZF9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2UpCit7CisJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IGRldl9zdGF0cywgKnN0YXRzOworCWJvb2wgc3RhdHNfcmV3b3VuZDsKKworCXN0YXRzID0gZGV2X2dldF9zdGF0cyhuZXRfZGV2LCAmZGV2X3N0YXRzKTsKKwkvKiBObyBlbXB0eSBwYWNrZXRzICovCisJc3RhdHNfcmV3b3VuZCA9CisJCShzdGF0cy0+cnhfYnl0ZXMgPCBpZmFjZS0+bGFzdF9rbm93bltJRlNfUlhdLmJ5dGVzKQorCQl8fCAoc3RhdHMtPnR4X2J5dGVzIDwgaWZhY2UtPmxhc3Rfa25vd25bSUZTX1RYXS5ieXRlcyk7CisKKwlJRl9ERUJVRygicXRhZ3VpZDogJXMoJXMpOiBpZmFjZT0lcCBuZXRkZXY9JXAgIgorCQkgImJ5dGVzIHJ4L3R4PSVsbHUvJWxsdSAiCisJCSAiYWN0aXZlPSVkIGxhc3Rfa25vd249JWQgIgorCQkgInN0YXRzX3Jld291bmQ9JWRcbiIsIF9fZnVuY19fLAorCQkgbmV0X2RldiA/IG5ldF9kZXYtPm5hbWUgOiAiPyIsCisJCSBpZmFjZSwgbmV0X2RldiwKKwkJIHN0YXRzLT5yeF9ieXRlcywgc3RhdHMtPnR4X2J5dGVzLAorCQkgaWZhY2UtPmFjdGl2ZSwgaWZhY2UtPmxhc3Rfa25vd25fdmFsaWQsIHN0YXRzX3Jld291bmQpOworCisJaWYgKGlmYWNlLT5hY3RpdmUgJiYgaWZhY2UtPmxhc3Rfa25vd25fdmFsaWQgJiYgc3RhdHNfcmV3b3VuZCkgeworCQlwcl93YXJuX29uY2UoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6ICVzKCVzKTogIgorCQkJICAgICAiaWZhY2UgcmVzZXQgaXRzIHN0YXRzIHVuZXhwZWN0ZWRseVxuIiwgX19mdW5jX18sCisJCQkgICAgIG5ldF9kZXYtPm5hbWUpOworCisJCWlmYWNlLT50b3RhbHNfdmlhX2RldltJRlNfVFhdLmJ5dGVzICs9CisJCQlpZmFjZS0+bGFzdF9rbm93bltJRlNfVFhdLmJ5dGVzOworCQlpZmFjZS0+dG90YWxzX3ZpYV9kZXZbSUZTX1RYXS5wYWNrZXRzICs9CisJCQlpZmFjZS0+bGFzdF9rbm93bltJRlNfVFhdLnBhY2tldHM7CisJCWlmYWNlLT50b3RhbHNfdmlhX2RldltJRlNfUlhdLmJ5dGVzICs9CisJCQlpZmFjZS0+bGFzdF9rbm93bltJRlNfUlhdLmJ5dGVzOworCQlpZmFjZS0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5wYWNrZXRzICs9CisJCQlpZmFjZS0+bGFzdF9rbm93bltJRlNfUlhdLnBhY2tldHM7CisJCWlmYWNlLT5sYXN0X2tub3duX3ZhbGlkID0gZmFsc2U7CisJCUlGX0RFQlVHKCJxdGFndWlkOiAlcyglcyk6IGlmYWNlPSVwICIKKwkJCSAidXNlZCBsYXN0IGtub3duIGJ5dGVzIHJ4L3R4PSVsbHUvJWxsdVxuIiwgX19mdW5jX18sCisJCQkgaWZhY2UtPmlmbmFtZSwgaWZhY2UsIGlmYWNlLT5sYXN0X2tub3duW0lGU19SWF0uYnl0ZXMsCisJCQkgaWZhY2UtPmxhc3Rfa25vd25bSUZTX1RYXS5ieXRlcyk7CisJfQorfQorCisvKgorICogQ3JlYXRlIGEgbmV3IGVudHJ5IGZvciB0cmFja2luZyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KKyAqIERvIG5vdGhpbmcgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzLgorICogQ2FsbGVkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIGNvbmZpZ3VyZWQgd2l0aCBhIHZhbGlkIElQIGFkZHJlc3MuCisgKi8KK3N0YXRpYyB2b2lkIGlmYWNlX3N0YXRfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IE5VTEw7CisJY29uc3QgY2hhciAqaWZuYW1lOworCXN0cnVjdCBpZmFjZV9zdGF0ICplbnRyeTsKKwlfX2JlMzIgaXBhZGRyID0gMDsKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqbmV3X2lmYWNlOworCisJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZSglcyk6IGlmYT0lcCBuZXRkZXY9JXBcbiIsCisJCSBuZXRfZGV2ID8gbmV0X2Rldi0+bmFtZSA6ICI/IiwKKwkJIGlmYSwgbmV0X2Rldik7CisJaWYgKCFuZXRfZGV2KSB7CisJCXByX2VycigicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlKCk6IG5vIG5ldCBkZXZcbiIpOworCQlyZXR1cm47CisJfQorCisJaWZuYW1lID0gbmV0X2Rldi0+bmFtZTsKKwlpZiAoIWlmYSkgeworCQlpbl9kZXYgPSBpbl9kZXZfZ2V0KG5ldF9kZXYpOworCQlpZiAoIWluX2RldikgeworCQkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBjcmVhdGUoJXMpOiBubyBpbmV0IGRldlxuIiwKKwkJCSAgICAgICBpZm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCUlGX0RFQlVHKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBjcmVhdGUoJXMpOiBpbl9kZXY9JXBcbiIsCisJCQkgaWZuYW1lLCBpbl9kZXYpOworCQlmb3IgKGlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCkgeworCQkJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZSglcyk6ICIKKwkJCQkgImlmYT0lcCBpZmFfbGFiZWw9JXNcbiIsCisJCQkJIGlmbmFtZSwgaWZhLAorCQkJCSBpZmEtPmlmYV9sYWJlbCA/IGlmYS0+aWZhX2xhYmVsIDogIihudWxsKSIpOworCQkJaWYgKGlmYS0+aWZhX2xhYmVsICYmICFzdHJjbXAoaWZuYW1lLCBpZmEtPmlmYV9sYWJlbCkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWlmYSkgeworCQlJRl9ERUJVRygicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlKCVzKTogbm8gbWF0Y2hpbmcgSVBcbiIsCisJCQkgaWZuYW1lKTsKKwkJZ290byBkb25lX3B1dDsKKwl9CisJaXBhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisKKwlzcGluX2xvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKKwllbnRyeSA9IGdldF9pZmFjZV9lbnRyeShpZm5hbWUpOworCWlmIChlbnRyeSAhPSBOVUxMKSB7CisJCWJvb2wgYWN0aXZhdGUgPSAhaXB2NF9pc19sb29wYmFjayhpcGFkZHIpOworCQlJRl9ERUJVRygicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlKCVzKTogZW50cnk9JXBcbiIsCisJCQkgaWZuYW1lLCBlbnRyeSk7CisJCWlmYWNlX2NoZWNrX3N0YXRzX3Jlc2V0X2FuZF9hZGp1c3QobmV0X2RldiwgZW50cnkpOworCQlfaWZhY2Vfc3RhdF9zZXRfYWN0aXZlKGVudHJ5LCBuZXRfZGV2LCBhY3RpdmF0ZSk7CisJCUlGX0RFQlVHKCJxdGFndWlkOiAlcyglcyk6ICIKKwkJCSAidHJhY2tpbmcgbm93ICVkIG9uIGlwPSVwSTRcbiIsIF9fZnVuY19fLAorCQkJIGVudHJ5LT5pZm5hbWUsIGFjdGl2YXRlLCAmaXBhZGRyKTsKKwkJZ290byBkb25lX3VubG9ja19wdXQ7CisJfSBlbHNlIGlmIChpcHY0X2lzX2xvb3BiYWNrKGlwYWRkcikpIHsKKwkJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZSglcyk6ICIKKwkJCSAiaWdub3JlIGxvb3BiYWNrIGRldi4gaXA9JXBJNFxuIiwgaWZuYW1lLCAmaXBhZGRyKTsKKwkJZ290byBkb25lX3VubG9ja19wdXQ7CisJfQorCisJbmV3X2lmYWNlID0gaWZhY2VfYWxsb2MobmV0X2Rldik7CisJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZSglcyk6IGRvbmUgIgorCQkgImVudHJ5PSVwIGlwPSVwSTRcbiIsIGlmbmFtZSwgbmV3X2lmYWNlLCAmaXBhZGRyKTsKK2RvbmVfdW5sb2NrX3B1dDoKKwlzcGluX3VubG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworZG9uZV9wdXQ6CisJaWYgKGluX2RldikKKwkJaW5fZGV2X3B1dChpbl9kZXYpOworfQorCitzdGF0aWMgdm9pZCBpZmFjZV9zdGF0X2NyZWF0ZV9pcHY2KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCSAgIHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYSkKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJY29uc3QgY2hhciAqaWZuYW1lOworCXN0cnVjdCBpZmFjZV9zdGF0ICplbnRyeTsKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqbmV3X2lmYWNlOworCWludCBhZGRyX3R5cGU7CisKKwlJRl9ERUJVRygicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlNigpOiBpZmE9JXAgbmV0ZGV2PSVwLT5uYW1lPSVzXG4iLAorCQkgaWZhLCBuZXRfZGV2LCBuZXRfZGV2ID8gbmV0X2Rldi0+bmFtZSA6ICIiKTsKKwlpZiAoIW5ldF9kZXYpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBjcmVhdGU2KCk6IG5vIG5ldCBkZXYhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZm5hbWUgPSBuZXRfZGV2LT5uYW1lOworCisJaW5fZGV2ID0gaW5fZGV2X2dldChuZXRfZGV2KTsKKwlpZiAoIWluX2RldikgeworCQlwcl9lcnIoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZTYoJXMpOiBubyBpbmV0IGRldlxuIiwKKwkJICAgICAgIGlmbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlJRl9ERUJVRygicXRhZ3VpZDogaWZhY2Vfc3RhdDogY3JlYXRlNiglcyk6IGluX2Rldj0lcFxuIiwKKwkJIGlmbmFtZSwgaW5fZGV2KTsKKworCWlmICghaWZhKSB7CisJCUlGX0RFQlVHKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBjcmVhdGU2KCVzKTogbm8gbWF0Y2hpbmcgSVBcbiIsCisJCQkgaWZuYW1lKTsKKwkJZ290byBkb25lX3B1dDsKKwl9CisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlmYS0+YWRkcik7CisKKwlzcGluX2xvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKKwllbnRyeSA9IGdldF9pZmFjZV9lbnRyeShpZm5hbWUpOworCWlmIChlbnRyeSAhPSBOVUxMKSB7CisJCWJvb2wgYWN0aXZhdGUgPSAhKGFkZHJfdHlwZSAmIElQVjZfQUREUl9MT09QQkFDSyk7CisJCUlGX0RFQlVHKCJxdGFndWlkOiAlcyglcyk6IGVudHJ5PSVwXG4iLCBfX2Z1bmNfXywKKwkJCSBpZm5hbWUsIGVudHJ5KTsKKwkJaWZhY2VfY2hlY2tfc3RhdHNfcmVzZXRfYW5kX2FkanVzdChuZXRfZGV2LCBlbnRyeSk7CisJCV9pZmFjZV9zdGF0X3NldF9hY3RpdmUoZW50cnksIG5ldF9kZXYsIGFjdGl2YXRlKTsKKwkJSUZfREVCVUcoInF0YWd1aWQ6ICVzKCVzKTogIgorCQkJICJ0cmFja2luZyBub3cgJWQgb24gaXA9JXBJNmNcbiIsIF9fZnVuY19fLAorCQkJIGVudHJ5LT5pZm5hbWUsIGFjdGl2YXRlLCAmaWZhLT5hZGRyKTsKKwkJZ290byBkb25lX3VubG9ja19wdXQ7CisJfSBlbHNlIGlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTE9PUEJBQ0spIHsKKwkJSUZfREVCVUcoInF0YWd1aWQ6ICVzKCVzKTogIgorCQkJICJpZ25vcmUgbG9vcGJhY2sgZGV2LiBpcD0lcEk2Y1xuIiwgX19mdW5jX18sCisJCQkgaWZuYW1lLCAmaWZhLT5hZGRyKTsKKwkJZ290byBkb25lX3VubG9ja19wdXQ7CisJfQorCisJbmV3X2lmYWNlID0gaWZhY2VfYWxsb2MobmV0X2Rldik7CisJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGNyZWF0ZTYoJXMpOiBkb25lICIKKwkJICJlbnRyeT0lcCBpcD0lcEk2Y1xuIiwgaWZuYW1lLCBuZXdfaWZhY2UsICZpZmEtPmFkZHIpOworCitkb25lX3VubG9ja19wdXQ6CisJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKK2RvbmVfcHV0OgorCWluX2Rldl9wdXQoaW5fZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrX3RhZyAqZ2V0X3NvY2tfc3RhdF9ubChjb25zdCBzdHJ1Y3Qgc29jayAqc2spCit7CisJTVRfREVCVUcoInF0YWd1aWQ6IGdldF9zb2NrX3N0YXRfbmwoc2s9JXApXG4iLCBzayk7CisJcmV0dXJuIHNvY2tfdGFnX3RyZWVfc2VhcmNoKCZzb2NrX3RhZ190cmVlLCBzayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja190YWcgKmdldF9zb2NrX3N0YXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBzb2NrX3RhZyAqc29ja190YWdfZW50cnk7CisJTVRfREVCVUcoInF0YWd1aWQ6IGdldF9zb2NrX3N0YXQoc2s9JXApXG4iLCBzayk7CisJaWYgKCFzaykKKwkJcmV0dXJuIE5VTEw7CisJc3Bpbl9sb2NrX2JoKCZzb2NrX3RhZ19saXN0X2xvY2spOworCXNvY2tfdGFnX2VudHJ5ID0gZ2V0X3NvY2tfc3RhdF9ubChzayk7CisJc3Bpbl91bmxvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJcmV0dXJuIHNvY2tfdGFnX2VudHJ5OworfQorCitzdGF0aWMgaW50IGlweF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwlpbnQgdGhvZmYsIHRwcm90bzsKKworCXN3aXRjaCAocGFyLT5mYW1pbHkpIHsKKwljYXNlIE5GUFJPVE9fSVBWNjoKKwkJdHByb3RvID0gaXB2Nl9maW5kX2hkcihza2IsICZ0aG9mZiwgLTEsIE5VTEwpOworCQlpZiAodHByb3RvIDwgMCkKKwkJCU1UX0RFQlVHKCIlcygpOiB0cmFuc3BvcnQgaGVhZGVyIG5vdCBmb3VuZCBpbiBpcHY2IgorCQkJCSAiIHNrYj0lcFxuIiwgX19mdW5jX18sIHNrYik7CisJCWJyZWFrOworCWNhc2UgTkZQUk9UT19JUFY0OgorCQl0cHJvdG8gPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRwcm90byA9IElQUFJPVE9fUkFXOworCX0KKwlyZXR1cm4gdHByb3RvOworfQorCitzdGF0aWMgdm9pZAorZGF0YV9jb3VudGVyc191cGRhdGUoc3RydWN0IGRhdGFfY291bnRlcnMgKmRjLCBpbnQgc2V0LAorCQkgICAgIGVudW0gaWZzX3R4X3J4IGRpcmVjdGlvbiwgaW50IHByb3RvLCBpbnQgYnl0ZXMpCit7CisJc3dpdGNoIChwcm90bykgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWRjX2FkZF9ieXRlX3BhY2tldHMoZGMsIHNldCwgZGlyZWN0aW9uLCBJRlNfVENQLCBieXRlcywgMSk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19VRFA6CisJCWRjX2FkZF9ieXRlX3BhY2tldHMoZGMsIHNldCwgZGlyZWN0aW9uLCBJRlNfVURQLCBieXRlcywgMSk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19JUDoKKwlkZWZhdWx0OgorCQlkY19hZGRfYnl0ZV9wYWNrZXRzKGRjLCBzZXQsIGRpcmVjdGlvbiwgSUZTX1BST1RPX09USEVSLCBieXRlcywKKwkJCQkgICAgMSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFVwZGF0ZSBzdGF0cyBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuIERvIG5vdGhpbmcgaWYgdGhlIGVudHJ5CisgKiBkb2VzIG5vdCBleGlzdCAod2hlbiBhIGRldmljZSB3YXMgbmV2ZXIgY29uZmlndXJlZCB3aXRoIGFuIElQIGFkZHJlc3MpLgorICogQ2FsbGVkIHdoZW4gYW4gZGV2aWNlIGlzIGJlaW5nIHVucmVnaXN0ZXJlZC4KKyAqLworc3RhdGljIHZvaWQgaWZhY2Vfc3RhdF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGJvb2wgc3Rhc2hfb25seSkKK3sKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgZGV2X3N0YXRzLCAqc3RhdHM7CisJc3RydWN0IGlmYWNlX3N0YXQgKmVudHJ5OworCisJc3RhdHMgPSBkZXZfZ2V0X3N0YXRzKG5ldF9kZXYsICZkZXZfc3RhdHMpOworCXNwaW5fbG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCWVudHJ5ID0gZ2V0X2lmYWNlX2VudHJ5KG5ldF9kZXYtPm5hbWUpOworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCUlGX0RFQlVHKCJxdGFndWlkOiBpZmFjZV9zdGF0OiB1cGRhdGUoJXMpOiBub3QgdHJhY2tlZFxuIiwKKwkJCSBuZXRfZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCUlGX0RFQlVHKCJxdGFndWlkOiAlcyglcyk6IGVudHJ5PSVwXG4iLCBfX2Z1bmNfXywKKwkJIG5ldF9kZXYtPm5hbWUsIGVudHJ5KTsKKwlpZiAoIWVudHJ5LT5hY3RpdmUpIHsKKwkJSUZfREVCVUcoInF0YWd1aWQ6ICVzKCVzKTogYWxyZWFkeSBkaXNhYmxlZFxuIiwgX19mdW5jX18sCisJCQkgbmV0X2Rldi0+bmFtZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZpZmFjZV9zdGF0X2xpc3RfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3Rhc2hfb25seSkgeworCQllbnRyeS0+bGFzdF9rbm93bltJRlNfVFhdLmJ5dGVzID0gc3RhdHMtPnR4X2J5dGVzOworCQllbnRyeS0+bGFzdF9rbm93bltJRlNfVFhdLnBhY2tldHMgPSBzdGF0cy0+dHhfcGFja2V0czsKKwkJZW50cnktPmxhc3Rfa25vd25bSUZTX1JYXS5ieXRlcyA9IHN0YXRzLT5yeF9ieXRlczsKKwkJZW50cnktPmxhc3Rfa25vd25bSUZTX1JYXS5wYWNrZXRzID0gc3RhdHMtPnJ4X3BhY2tldHM7CisJCWVudHJ5LT5sYXN0X2tub3duX3ZhbGlkID0gdHJ1ZTsKKwkJSUZfREVCVUcoInF0YWd1aWQ6ICVzKCVzKTogIgorCQkJICJkZXYgc3RhdHMgc3Rhc2hlZCByeC90eD0lbGx1LyVsbHVcbiIsIF9fZnVuY19fLAorCQkJIG5ldF9kZXYtPm5hbWUsIHN0YXRzLT5yeF9ieXRlcywgc3RhdHMtPnR4X2J5dGVzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbnRyeS0+dG90YWxzX3ZpYV9kZXZbSUZTX1RYXS5ieXRlcyArPSBzdGF0cy0+dHhfYnl0ZXM7CisJZW50cnktPnRvdGFsc192aWFfZGV2W0lGU19UWF0ucGFja2V0cyArPSBzdGF0cy0+dHhfcGFja2V0czsKKwllbnRyeS0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5ieXRlcyArPSBzdGF0cy0+cnhfYnl0ZXM7CisJZW50cnktPnRvdGFsc192aWFfZGV2W0lGU19SWF0ucGFja2V0cyArPSBzdGF0cy0+cnhfcGFja2V0czsKKwkvKiBXZSBkb24ndCBuZWVkIHRoZSBsYXN0X2tub3duW10gYW55bW9yZSAqLworCWVudHJ5LT5sYXN0X2tub3duX3ZhbGlkID0gZmFsc2U7CisJX2lmYWNlX3N0YXRfc2V0X2FjdGl2ZShlbnRyeSwgbmV0X2RldiwgZmFsc2UpOworCUlGX0RFQlVHKCJxdGFndWlkOiAlcyglcyk6ICIKKwkJICJkaXNhYmxlIHRyYWNraW5nLiByeC90eD0lbGx1LyVsbHVcbiIsIF9fZnVuY19fLAorCQkgbmV0X2Rldi0+bmFtZSwgc3RhdHMtPnJ4X2J5dGVzLCBzdGF0cy0+dHhfYnl0ZXMpOworCXNwaW5fdW5sb2NrX2JoKCZpZmFjZV9zdGF0X2xpc3RfbG9jayk7Cit9CisKKy8qCisgKiBVcGRhdGUgc3RhdHMgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIGZyb20gdGhlIHNrYi4KKyAqIERvIG5vdGhpbmcgaWYgdGhlIGVudHJ5CisgKiBkb2VzIG5vdCBleGlzdCAod2hlbiBhIGRldmljZSB3YXMgbmV2ZXIgY29uZmlndXJlZCB3aXRoIGFuIElQIGFkZHJlc3MpLgorICogQ2FsbGVkIG9uIGVhY2ggc2suCisgKi8KK3N0YXRpYyB2b2lkIGlmYWNlX3N0YXRfdXBkYXRlX2Zyb21fc2tiKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqZW50cnk7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmVsX2RldjsKKwllbnVtIGlmc190eF9yeCBkaXJlY3Rpb24gPSBwYXItPmluID8gSUZTX1JYIDogSUZTX1RYOworCWludCBieXRlcyA9IHNrYi0+bGVuOworCisJaWYgKCFza2ItPmRldikgeworCQlNVF9ERUJVRygicXRhZ3VpZFslZF06IG5vIHNrYi0+ZGV2XG4iLCBwYXItPmhvb2tudW0pOworCQllbF9kZXYgPSBwYXItPmluID8gOiBwYXItPm91dDsKKwl9IGVsc2UgeworCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3RoZXJfZGV2OworCQllbF9kZXYgPSBza2ItPmRldjsKKwkJb3RoZXJfZGV2ID0gcGFyLT5pbiA/IDogcGFyLT5vdXQ7CisJCWlmIChlbF9kZXYgIT0gb3RoZXJfZGV2KSB7CisJCQlNVF9ERUJVRygicXRhZ3VpZFslZF06IHNrYi0+ZGV2PSVwICVzIHZzICIKKwkJCQkgInBhci0+KGluL291dCk9JXAgJXNcbiIsCisJCQkJIHBhci0+aG9va251bSwgZWxfZGV2LCBlbF9kZXYtPm5hbWUsIG90aGVyX2RldiwKKwkJCQkgb3RoZXJfZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCWlmICh1bmxpa2VseSghZWxfZGV2KSkgeworCQlwcl9lcnIoInF0YWd1aWRbJWRdOiAlcygpOiBubyBwYXItPmluL291dD8hIVxuIiwKKwkJICAgICAgIHBhci0+aG9va251bSwgX19mdW5jX18pOworCQlCVUcoKTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KCFlbF9kZXYtPm5hbWUpKSB7CisJCXByX2VycigicXRhZ3VpZFslZF06ICVzKCk6IG5vIGRldi0+bmFtZT8hIVxuIiwKKwkJICAgICAgIHBhci0+aG9va251bSwgX19mdW5jX18pOworCQlCVUcoKTsKKwl9IGVsc2UgeworCQlpbnQgcHJvdG8gPSBpcHhfcHJvdG8oc2tiLCBwYXIpOworCQlNVF9ERUJVRygicXRhZ3VpZFslZF06IGRldiBuYW1lPSVzIHR5cGU9JWQgZmFtPSVkIHByb3RvPSVkXG4iLAorCQkJIHBhci0+aG9va251bSwgZWxfZGV2LT5uYW1lLCBlbF9kZXYtPnR5cGUsCisJCQkgcGFyLT5mYW1pbHksIHByb3RvKTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKKwllbnRyeSA9IGdldF9pZmFjZV9lbnRyeShlbF9kZXYtPm5hbWUpOworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCUlGX0RFQlVHKCJxdGFndWlkOiBpZmFjZV9zdGF0OiAlcyglcyk6IG5vdCB0cmFja2VkXG4iLAorCQkJIF9fZnVuY19fLCBlbF9kZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCQlyZXR1cm47CisJfQorCisJSUZfREVCVUcoInF0YWd1aWQ6ICVzKCVzKTogZW50cnk9JXBcbiIsIF9fZnVuY19fLAorCQkgZWxfZGV2LT5uYW1lLCBlbnRyeSk7CisKKwllbnRyeS0+dG90YWxzX3ZpYV9za2JbZGlyZWN0aW9uXS5ieXRlcyArPSBieXRlczsKKwllbnRyeS0+dG90YWxzX3ZpYV9za2JbZGlyZWN0aW9uXS5wYWNrZXRzKys7CisJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX3N0YXRfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdGFnX3N0YXRfdXBkYXRlKHN0cnVjdCB0YWdfc3RhdCAqdGFnX2VudHJ5LAorCQkJZW51bSBpZnNfdHhfcnggZGlyZWN0aW9uLCBpbnQgcHJvdG8sIGludCBieXRlcykKK3sKKwlpbnQgYWN0aXZlX3NldDsKKwlhY3RpdmVfc2V0ID0gZ2V0X2FjdGl2ZV9jb3VudGVyX3NldCh0YWdfZW50cnktPnRuLnRhZyk7CisJTVRfREVCVUcoInF0YWd1aWQ6IHRhZ19zdGF0X3VwZGF0ZSh0YWc9MHglbGx4ICh1aWQ9JXUpIHNldD0lZCAiCisJCSAiZGlyPSVkIHByb3RvPSVkIGJ5dGVzPSVkKVxuIiwKKwkJIHRhZ19lbnRyeS0+dG4udGFnLCBnZXRfdWlkX2Zyb21fdGFnKHRhZ19lbnRyeS0+dG4udGFnKSwKKwkJIGFjdGl2ZV9zZXQsIGRpcmVjdGlvbiwgcHJvdG8sIGJ5dGVzKTsKKwlkYXRhX2NvdW50ZXJzX3VwZGF0ZSgmdGFnX2VudHJ5LT5jb3VudGVycywgYWN0aXZlX3NldCwgZGlyZWN0aW9uLAorCQkJICAgICBwcm90bywgYnl0ZXMpOworCWlmICh0YWdfZW50cnktPnBhcmVudF9jb3VudGVycykKKwkJZGF0YV9jb3VudGVyc191cGRhdGUodGFnX2VudHJ5LT5wYXJlbnRfY291bnRlcnMsIGFjdGl2ZV9zZXQsCisJCQkJICAgICBkaXJlY3Rpb24sIHByb3RvLCBieXRlcyk7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBuZXcgZW50cnkgZm9yIHRyYWNraW5nIHRoZSBzcGVjaWZpZWQge2FjY3RfdGFnLHVpZF90YWd9IHdpdGhpbgorICogdGhlIGludGVyZmFjZS4KKyAqIGlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2sgc2hvdWxkIGJlIGhlbGQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFnX3N0YXQgKmNyZWF0ZV9pZl90YWdfc3RhdChzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfZW50cnksCisJCQkJCSAgIHRhZ190IHRhZykKK3sKKwlzdHJ1Y3QgdGFnX3N0YXQgKm5ld190YWdfc3RhdF9lbnRyeSA9IE5VTEw7CisJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6ICVzKCk6IGlmZT0lcCB0YWc9MHglbGx4IgorCQkgIiAodWlkPSV1KVxuIiwgX19mdW5jX18sCisJCSBpZmFjZV9lbnRyeSwgdGFnLCBnZXRfdWlkX2Zyb21fdGFnKHRhZykpOworCW5ld190YWdfc3RhdF9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfdGFnX3N0YXRfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ld190YWdfc3RhdF9lbnRyeSkgeworCQlwcl9lcnIoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IHRhZyBzdGF0IGFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJbmV3X3RhZ19zdGF0X2VudHJ5LT50bi50YWcgPSB0YWc7CisJdGFnX3N0YXRfdHJlZV9pbnNlcnQobmV3X3RhZ19zdGF0X2VudHJ5LCAmaWZhY2VfZW50cnktPnRhZ19zdGF0X3RyZWUpOworZG9uZToKKwlyZXR1cm4gbmV3X3RhZ19zdGF0X2VudHJ5OworfQorCitzdGF0aWMgdm9pZCBpZl90YWdfc3RhdF91cGRhdGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aWRfdCB1aWQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBlbnVtIGlmc190eF9yeCBkaXJlY3Rpb24sCisJCQkgICAgICAgaW50IHByb3RvLCBpbnQgYnl0ZXMpCit7CisJc3RydWN0IHRhZ19zdGF0ICp0YWdfc3RhdF9lbnRyeTsKKwl0YWdfdCB0YWcsIGFjY3RfdGFnOworCXRhZ190IHVpZF90YWc7CisJc3RydWN0IGRhdGFfY291bnRlcnMgKnVpZF90YWdfY291bnRlcnM7CisJc3RydWN0IHNvY2tfdGFnICpzb2NrX3RhZ19lbnRyeTsKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfZW50cnk7CisJc3RydWN0IHRhZ19zdGF0ICpuZXdfdGFnX3N0YXQgPSBOVUxMOworCU1UX0RFQlVHKCJxdGFndWlkOiBpZl90YWdfc3RhdF91cGRhdGUoaWZuYW1lPSVzICIKKwkJInVpZD0ldSBzaz0lcCBkaXI9JWQgcHJvdG89JWQgYnl0ZXM9JWQpXG4iLAorCQkgaWZuYW1lLCB1aWQsIHNrLCBkaXJlY3Rpb24sIHByb3RvLCBieXRlcyk7CisKKworCWlmYWNlX2VudHJ5ID0gZ2V0X2lmYWNlX2VudHJ5KGlmbmFtZSk7CisJaWYgKCFpZmFjZV9lbnRyeSkgeworCQlwcl9lcnIoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IHN0YXRfdXBkYXRlKCkgJXMgbm90IGZvdW5kXG4iLAorCQkgICAgICAgaWZuYW1lKTsKKwkJcmV0dXJuOworCX0KKwkvKiBJdCBpcyBvayB0byBwcm9jZXNzIGRhdGEgd2hlbiBhbiBpZmFjZV9lbnRyeSBpcyBpbmFjdGl2ZSAqLworCisJTVRfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IHN0YXRfdXBkYXRlKCkgZGV2PSVzIGVudHJ5PSVwXG4iLAorCQkgaWZuYW1lLCBpZmFjZV9lbnRyeSk7CisKKwkvKgorCSAqIExvb2sgZm9yIGEgdGFnZ2VkIHNvY2suCisJICogSXQgd2lsbCBoYXZlIGFuIGFjY3RfdWlkLgorCSAqLworCXNvY2tfdGFnX2VudHJ5ID0gZ2V0X3NvY2tfc3RhdChzayk7CisJaWYgKHNvY2tfdGFnX2VudHJ5KSB7CisJCXRhZyA9IHNvY2tfdGFnX2VudHJ5LT50YWc7CisJCWFjY3RfdGFnID0gZ2V0X2F0YWdfZnJvbV90YWcodGFnKTsKKwkJdWlkX3RhZyA9IGdldF91dGFnX2Zyb21fdGFnKHRhZyk7CisJfSBlbHNlIHsKKwkJYWNjdF90YWcgPSBtYWtlX2F0YWdfZnJvbV92YWx1ZSgwKTsKKwkJdGFnID0gY29tYmluZV9hdGFnX3dpdGhfdWlkKGFjY3RfdGFnLCB1aWQpOworCQl1aWRfdGFnID0gbWFrZV90YWdfZnJvbV91aWQodWlkKTsKKwl9CisJTVRfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IHN0YXRfdXBkYXRlKCk6ICIKKwkJICIgbG9va2luZyBmb3IgdGFnPTB4JWxseCAodWlkPSV1KSBpbiBpZmU9JXBcbiIsCisJCSB0YWcsIGdldF91aWRfZnJvbV90YWcodGFnKSwgaWZhY2VfZW50cnkpOworCS8qIExvb3Agb3ZlciB0YWcgbGlzdCB1bmRlciB0aGlzIGludGVyZmFjZSBmb3Ige2FjY3RfdGFnLHVpZF90YWd9ICovCisJc3Bpbl9sb2NrX2JoKCZpZmFjZV9lbnRyeS0+dGFnX3N0YXRfbGlzdF9sb2NrKTsKKworCXRhZ19zdGF0X2VudHJ5ID0gdGFnX3N0YXRfdHJlZV9zZWFyY2goJmlmYWNlX2VudHJ5LT50YWdfc3RhdF90cmVlLAorCQkJCQkgICAgICB0YWcpOworCWlmICh0YWdfc3RhdF9lbnRyeSkgeworCQkvKgorCQkgKiBVcGRhdGluZyB0aGUge2FjY3RfdGFnLCB1aWRfdGFnfSBlbnRyeSBoYW5kbGVzIGJvdGggc3RhdHM6CisJCSAqIHswLCB1aWRfdGFnfSB3aWxsIGFsc28gZ2V0IHVwZGF0ZWQuCisJCSAqLworCQl0YWdfc3RhdF91cGRhdGUodGFnX3N0YXRfZW50cnksIGRpcmVjdGlvbiwgcHJvdG8sIGJ5dGVzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2spOworCQlyZXR1cm47CisJfQorCisJLyogTG9vcCBvdmVyIHRhZyBsaXN0IHVuZGVyIHRoaXMgaW50ZXJmYWNlIGZvciB7MCx1aWRfdGFnfSAqLworCXRhZ19zdGF0X2VudHJ5ID0gdGFnX3N0YXRfdHJlZV9zZWFyY2goJmlmYWNlX2VudHJ5LT50YWdfc3RhdF90cmVlLAorCQkJCQkgICAgICB1aWRfdGFnKTsKKwlpZiAoIXRhZ19zdGF0X2VudHJ5KSB7CisJCS8qIEhlcmU6IHRoZSBiYXNlIHVpZF90YWcgZGlkIG5vdCBleGlzdCAqLworCQkvKgorCQkgKiBObyBwYXJlbnQgY291bnRlcnMuIFNvCisJCSAqICAtIE5vIHswLCB1aWRfdGFnfSBzdGF0cyBhbmQgbm8ge2FjY190YWcsIHVpZF90YWd9IHN0YXRzLgorCQkgKi8KKwkJbmV3X3RhZ19zdGF0ID0gY3JlYXRlX2lmX3RhZ19zdGF0KGlmYWNlX2VudHJ5LCB1aWRfdGFnKTsKKwkJdWlkX3RhZ19jb3VudGVycyA9ICZuZXdfdGFnX3N0YXQtPmNvdW50ZXJzOworCX0gZWxzZSB7CisJCXVpZF90YWdfY291bnRlcnMgPSAmdGFnX3N0YXRfZW50cnktPmNvdW50ZXJzOworCX0KKworCWlmIChhY2N0X3RhZykgeworCQkvKiBDcmVhdGUgdGhlIGNoaWxkIHthY2N0X3RhZywgdWlkX3RhZ30gYW5kIGhvb2sgdXAgcGFyZW50LiAqLworCQluZXdfdGFnX3N0YXQgPSBjcmVhdGVfaWZfdGFnX3N0YXQoaWZhY2VfZW50cnksIHRhZyk7CisJCW5ld190YWdfc3RhdC0+cGFyZW50X2NvdW50ZXJzID0gdWlkX3RhZ19jb3VudGVyczsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgbmV3X3RhZ19zdGF0IHRvIGJlIHN0aWxsIE5VTEwgaGVyZSB3b3VsZCByZXF1aXJlOgorCQkgKiAgezAsIHVpZF90YWd9IGV4aXN0cworCQkgKiAgYW5kIHthY2N0X3RhZywgdWlkX3RhZ30gZG9lc24ndCBleGlzdAorCQkgKiAgQU5EIGFjY3RfdGFnID09IDAuCisJCSAqIEltcG9zc2libGUuIFRoaXMgcmVhc3N1cmVzIHVzIHRoYXQgbmV3X3RhZ19zdGF0CisJCSAqIGJlbG93IHdpbGwgYWx3YXlzIGJlIGFzc2lnbmVkLgorCQkgKi8KKwkJQlVHX09OKCFuZXdfdGFnX3N0YXQpOworCX0KKwl0YWdfc3RhdF91cGRhdGUobmV3X3RhZ19zdGF0LCBkaXJlY3Rpb24sIHByb3RvLCBieXRlcyk7CisJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IGlmYWNlX25ldGRldl9ldmVudF9oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKworCWlmICh1bmxpa2VseShtb2R1bGVfcGFzc2l2ZSkpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCUlGX0RFQlVHKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBuZXRkZXZfZXZlbnQoKTogIgorCQkgImV2PTB4JWx4LyVzIG5ldGRldj0lcC0+bmFtZT0lc1xuIiwKKwkJIGV2ZW50LCBuZXRkZXZfZXZ0X3N0cihldmVudCksIGRldiwgZGV2ID8gZGV2LT5uYW1lIDogIiIpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQlpZmFjZV9zdGF0X2NyZWF0ZShkZXYsIE5VTEwpOworCQlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMuaWZhY2VfZXZlbnRzKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQlpZmFjZV9zdGF0X3VwZGF0ZShkZXYsIGV2ZW50ID09IE5FVERFVl9ET1dOKTsKKwkJYXRvbWljNjRfaW5jKCZxdHVfZXZlbnRzLmlmYWNlX2V2ZW50cyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgaWZhY2VfaW5ldDZhZGRyX2V2ZW50X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEgPSBwdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWlmICh1bmxpa2VseShtb2R1bGVfcGFzc2l2ZSkpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCUlGX0RFQlVHKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBpbmV0NmFkZHJfZXZlbnQoKTogIgorCQkgImV2PTB4JWx4LyVzIGlmYT0lcFxuIiwKKwkJIGV2ZW50LCBuZXRkZXZfZXZ0X3N0cihldmVudCksIGlmYSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfVVA6CisJCUJVR19PTighaWZhIHx8ICFpZmEtPmlkZXYpOworCQlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpZmEtPmlkZXYtPmRldjsKKwkJaWZhY2Vfc3RhdF9jcmVhdGVfaXB2NihkZXYsIGlmYSk7CisJCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5pZmFjZV9ldmVudHMpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9ET1dOOgorCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCUJVR19PTighaWZhIHx8ICFpZmEtPmlkZXYpOworCQlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpZmEtPmlkZXYtPmRldjsKKwkJaWZhY2Vfc3RhdF91cGRhdGUoZGV2LCBldmVudCA9PSBORVRERVZfRE9XTik7CisJCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5pZmFjZV9ldmVudHMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgaW50IGlmYWNlX2luZXRhZGRyX2V2ZW50X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IHB0cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJaWYgKHVubGlrZWx5KG1vZHVsZV9wYXNzaXZlKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJSUZfREVCVUcoInF0YWd1aWQ6IGlmYWNlX3N0YXQ6IGluZXRhZGRyX2V2ZW50KCk6ICIKKwkJICJldj0weCVseC8lcyBpZmE9JXBcbiIsCisJCSBldmVudCwgbmV0ZGV2X2V2dF9zdHIoZXZlbnQpLCBpZmEpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQlCVUdfT04oIWlmYSB8fCAhaWZhLT5pZmFfZGV2KTsKKwkJZGV2ID0gaWZhLT5pZmFfZGV2LT5kZXY7CisJCWlmYWNlX3N0YXRfY3JlYXRlKGRldiwgaWZhKTsKKwkJYXRvbWljNjRfaW5jKCZxdHVfZXZlbnRzLmlmYWNlX2V2ZW50cyk7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0RPV046CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJQlVHX09OKCFpZmEgfHwgIWlmYS0+aWZhX2Rldik7CisJCWRldiA9IGlmYS0+aWZhX2Rldi0+ZGV2OworCQlpZmFjZV9zdGF0X3VwZGF0ZShkZXYsIGV2ZW50ID09IE5FVERFVl9ET1dOKTsKKwkJYXRvbWljNjRfaW5jKCZxdHVfZXZlbnRzLmlmYWNlX2V2ZW50cyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaWZhY2VfbmV0ZGV2X25vdGlmaWVyX2JsayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGlmYWNlX25ldGRldl9ldmVudF9oYW5kbGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpZmFjZV9pbmV0YWRkcl9ub3RpZmllcl9ibGsgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpZmFjZV9pbmV0YWRkcl9ldmVudF9oYW5kbGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpZmFjZV9pbmV0NmFkZHJfbm90aWZpZXJfYmxrID0geworCS5ub3RpZmllcl9jYWxsID0gaWZhY2VfaW5ldDZhZGRyX2V2ZW50X2hhbmRsZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpZmFjZV9zdGF0X2luaXQoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnRfcHJvY2RpcikKK3sKKwlpbnQgZXJyOworCisJaWZhY2Vfc3RhdF9wcm9jZGlyID0gcHJvY19ta2RpcihpZmFjZV9zdGF0X3Byb2NkaXJuYW1lLCBwYXJlbnRfcHJvY2Rpcik7CisJaWYgKCFpZmFjZV9zdGF0X3Byb2NkaXIpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBpbml0IGZhaWxlZCB0byBjcmVhdGUgcHJvYyBlbnRyeVxuIik7CisJCWVyciA9IC0xOworCQlnb3RvIGVycjsKKwl9CisKKwlpZmFjZV9zdGF0X2FsbF9wcm9jZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGlmYWNlX3N0YXRfYWxsX3Byb2NmaWxlbmFtZSwKKwkJCQkJCSAgICBwcm9jX2lmYWNlX3Blcm1zLAorCQkJCQkJICAgIHBhcmVudF9wcm9jZGlyKTsKKwlpZiAoIWlmYWNlX3N0YXRfYWxsX3Byb2NmaWxlKSB7CisJCXByX2VycigicXRhZ3VpZDogaWZhY2Vfc3RhdDogaW5pdCAiCisJCSAgICAgICAiIGZhaWxlZCB0byBjcmVhdGUgc3RhdF9vbGQgcHJvYyBlbnRyeVxuIik7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl96YXBfZW50cnk7CisJfQorCWlmYWNlX3N0YXRfYWxsX3Byb2NmaWxlLT5yZWFkX3Byb2MgPSBpZmFjZV9zdGF0X2ZtdF9wcm9jX3JlYWQ7CisJaWZhY2Vfc3RhdF9hbGxfcHJvY2ZpbGUtPmRhdGEgPSAodm9pZCAqKTE7IC8qIGZtdDEgKi8KKworCWlmYWNlX3N0YXRfZm10X3Byb2NmaWxlID0gY3JlYXRlX3Byb2NfZW50cnkoaWZhY2Vfc3RhdF9mbXRfcHJvY2ZpbGVuYW1lLAorCQkJCQkJICAgIHByb2NfaWZhY2VfcGVybXMsCisJCQkJCQkgICAgcGFyZW50X3Byb2NkaXIpOworCWlmICghaWZhY2Vfc3RhdF9mbXRfcHJvY2ZpbGUpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBpbml0ICIKKwkJICAgICAgICIgZmFpbGVkIHRvIGNyZWF0ZSBzdGF0X2FsbCBwcm9jIGVudHJ5XG4iKTsKKwkJZXJyID0gLTE7CisJCWdvdG8gZXJyX3phcF9hbGxfc3RhdHNfZW50cnk7CisJfQorCWlmYWNlX3N0YXRfZm10X3Byb2NmaWxlLT5yZWFkX3Byb2MgPSBpZmFjZV9zdGF0X2ZtdF9wcm9jX3JlYWQ7CisJaWZhY2Vfc3RhdF9mbXRfcHJvY2ZpbGUtPmRhdGEgPSAodm9pZCAqKTI7IC8qIGZtdDIgKi8KKworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpZmFjZV9uZXRkZXZfbm90aWZpZXJfYmxrKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigicXRhZ3VpZDogaWZhY2Vfc3RhdDogaW5pdCAiCisJCSAgICAgICAiZmFpbGVkIHRvIHJlZ2lzdGVyIGRldiBldmVudCBoYW5kbGVyXG4iKTsKKwkJZ290byBlcnJfemFwX2FsbF9zdGF0c19lbnRyaWVzOworCX0KKwllcnIgPSByZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmaWZhY2VfaW5ldGFkZHJfbm90aWZpZXJfYmxrKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigicXRhZ3VpZDogaWZhY2Vfc3RhdDogaW5pdCAiCisJCSAgICAgICAiZmFpbGVkIHRvIHJlZ2lzdGVyIGlwdjQgZGV2IGV2ZW50IGhhbmRsZXJcbiIpOworCQlnb3RvIGVycl91bnJlZ19uZDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoJmlmYWNlX2luZXQ2YWRkcl9ub3RpZmllcl9ibGspOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBpZmFjZV9zdGF0OiBpbml0ICIKKwkJICAgICAgICJmYWlsZWQgdG8gcmVnaXN0ZXIgaXB2NiBkZXYgZXZlbnQgaGFuZGxlclxuIik7CisJCWdvdG8gZXJyX3VucmVnX2lwNF9hZGRyOworCX0KKwlyZXR1cm4gMDsKKworZXJyX3VucmVnX2lwNF9hZGRyOgorCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmlmYWNlX2luZXRhZGRyX25vdGlmaWVyX2Jsayk7CitlcnJfdW5yZWdfbmQ6CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlmYWNlX25ldGRldl9ub3RpZmllcl9ibGspOworZXJyX3phcF9hbGxfc3RhdHNfZW50cmllczoKKwlyZW1vdmVfcHJvY19lbnRyeShpZmFjZV9zdGF0X2ZtdF9wcm9jZmlsZW5hbWUsIHBhcmVudF9wcm9jZGlyKTsKK2Vycl96YXBfYWxsX3N0YXRzX2VudHJ5OgorCXJlbW92ZV9wcm9jX2VudHJ5KGlmYWNlX3N0YXRfYWxsX3Byb2NmaWxlbmFtZSwgcGFyZW50X3Byb2NkaXIpOworZXJyX3phcF9lbnRyeToKKwlyZW1vdmVfcHJvY19lbnRyeShpZmFjZV9zdGF0X3Byb2NkaXJuYW1lLCBwYXJlbnRfcHJvY2Rpcik7CitlcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICpxdGFndWlkX2ZpbmRfc2soY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCXN0cnVjdCBzb2NrICpzazsKKwl1bnNpZ25lZCBpbnQgaG9va19tYXNrID0gKDEgPDwgcGFyLT5ob29rbnVtKTsKKworCU1UX0RFQlVHKCJxdGFndWlkOiBmaW5kX3NrKHNrYj0lcCkgaG9va251bT0lZCBmYW1pbHk9JWRcbiIsIHNrYiwKKwkJIHBhci0+aG9va251bSwgcGFyLT5mYW1pbHkpOworCisJLyoKKwkgKiBMZXQncyBub3QgYWJ1c2UgdGhlIHRoZSB4dF9zb2NrZXRfZ2V0Kl9zaygpLCBvciBlbHNlIGl0IHdpbGwKKwkgKiByZXR1cm4gZ2FyYmFnZSBTS3MuCisJICovCisJaWYgKCEoaG9va19tYXNrICYgWFRfU09DS0VUX1NVUFBPUlRFRF9IT09LUykpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoIChwYXItPmZhbWlseSkgeworCWNhc2UgTkZQUk9UT19JUFY2OgorCQlzayA9IHh0X3NvY2tldF9nZXQ2X3NrKHNrYiwgcGFyKTsKKwkJYnJlYWs7CisJY2FzZSBORlBST1RPX0lQVjQ6CisJCXNrID0geHRfc29ja2V0X2dldDRfc2soc2tiLCBwYXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIFNlZW1zIHRvIGJlIGlzc3VlcyBvbiB0aGUgZmlsZSBwdHIgZm9yIFRDUF9USU1FX1dBSVQgU0tzLgorCSAqIGh0dHA6Ly9rZXJuZWx0cmFwLm9yZy9tYWlsYXJjaGl2ZS9saW51eC1uZXRkZXYvMjAxMC8xMC8yMS82Mjg3OTU5CisJICogTm90IGZpeGVkIGluIDMuMC1yMyA6KAorCSAqLworCWlmIChzaykgeworCQlNVF9ERUJVRygicXRhZ3VpZDogJXAtPnNrX3Byb3RvPSV1ICIKKwkJCSAiLT5za19zdGF0ZT0lZFxuIiwgc2ssIHNrLT5za19wcm90b2NvbCwgc2stPnNrX3N0YXRlKTsKKwkJaWYgKHNrLT5za19zdGF0ZSAgPT0gVENQX1RJTUVfV0FJVCkgeworCQkJeHRfc29ja2V0X3B1dF9zayhzayk7CisJCQlzayA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgdm9pZCBhY2NvdW50X2Zvcl91aWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc29jayAqYWx0ZXJuYXRlX3NrLCB1aWRfdCB1aWQsCisJCQkgICAgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICplbF9kZXY7CisKKwlpZiAoIXNrYi0+ZGV2KSB7CisJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogbm8gc2tiLT5kZXZcbiIsIHBhci0+aG9va251bSk7CisJCWVsX2RldiA9IHBhci0+aW4gPyA6IHBhci0+b3V0OworCX0gZWxzZSB7CisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdGhlcl9kZXY7CisJCWVsX2RldiA9IHNrYi0+ZGV2OworCQlvdGhlcl9kZXYgPSBwYXItPmluID8gOiBwYXItPm91dDsKKwkJaWYgKGVsX2RldiAhPSBvdGhlcl9kZXYpIHsKKwkJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogc2tiLT5kZXY9JXAgJXMgdnMgIgorCQkJCSJwYXItPihpbi9vdXQpPSVwICVzXG4iLAorCQkJCXBhci0+aG9va251bSwgZWxfZGV2LCBlbF9kZXYtPm5hbWUsIG90aGVyX2RldiwKKwkJCQlvdGhlcl9kZXYtPm5hbWUpOworCQl9CisJfQorCisJaWYgKHVubGlrZWx5KCFlbF9kZXYpKSB7CisJCXByX2luZm8oInF0YWd1aWRbJWRdOiBubyBwYXItPmluL291dD8hIVxuIiwgcGFyLT5ob29rbnVtKTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KCFlbF9kZXYtPm5hbWUpKSB7CisJCXByX2luZm8oInF0YWd1aWRbJWRdOiBubyBkZXYtPm5hbWU/ISFcbiIsIHBhci0+aG9va251bSk7CisJfSBlbHNlIHsKKwkJaW50IHByb3RvID0gaXB4X3Byb3RvKHNrYiwgcGFyKTsKKwkJTVRfREVCVUcoInF0YWd1aWRbJWRdOiBkZXYgbmFtZT0lcyB0eXBlPSVkIGZhbT0lZCBwcm90bz0lZFxuIiwKKwkJCSBwYXItPmhvb2tudW0sIGVsX2Rldi0+bmFtZSwgZWxfZGV2LT50eXBlLAorCQkJIHBhci0+ZmFtaWx5LCBwcm90byk7CisKKwkJaWZfdGFnX3N0YXRfdXBkYXRlKGVsX2Rldi0+bmFtZSwgdWlkLAorCQkJCXNrYi0+c2sgPyBza2ItPnNrIDogYWx0ZXJuYXRlX3NrLAorCQkJCXBhci0+aW4gPyBJRlNfUlggOiBJRlNfVFgsCisJCQkJcHJvdG8sIHNrYi0+bGVuKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHF0YWd1aWRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9xdGFndWlkX21hdGNoX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgZmlsZSAqZmlscDsKKwlib29sIGdvdF9zb2NrID0gZmFsc2U7CisJc3RydWN0IHNvY2sgKnNrOworCXVpZF90IHNvY2tfdWlkOworCWJvb2wgcmVzOworCisJaWYgKHVubGlrZWx5KG1vZHVsZV9wYXNzaXZlKSkKKwkJcmV0dXJuIChpbmZvLT5tYXRjaCBeIGluZm8tPmludmVydCkgPT0gMDsKKworCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogZW50ZXJlZCBza2I9JXAgcGFyLT5pbj0lcC9vdXQ9JXAgZmFtPSVkXG4iLAorCQkgcGFyLT5ob29rbnVtLCBza2IsIHBhci0+aW4sIHBhci0+b3V0LCBwYXItPmZhbWlseSk7CisKKwlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMubWF0Y2hfY2FsbHMpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlyZXMgPSAoaW5mby0+bWF0Y2ggXiBpbmZvLT5pbnZlcnQpID09IDA7CisJCWdvdG8gcmV0X3JlczsKKwl9CisKKwlzd2l0Y2ggKHBhci0+aG9va251bSkgeworCWNhc2UgTkZfSU5FVF9QUkVfUk9VVElORzoKKwljYXNlIE5GX0lORVRfUE9TVF9ST1VUSU5HOgorCQlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMubWF0Y2hfY2FsbHNfcHJlcG9zdCk7CisJCWlmYWNlX3N0YXRfdXBkYXRlX2Zyb21fc2tiKHNrYiwgcGFyKTsKKwkJLyoKKwkJICogV2UgYXJlIGRvbmUgaW4gcHJlL3Bvc3QuIFRoZSBza2Igd2lsbCBnZXQgcHJvY2Vzc2VkCisJCSAqIGZ1cnRoZXIgYWx0ZXIuCisJCSAqLworCQlyZXMgPSAoaW5mby0+bWF0Y2ggXiBpbmZvLT5pbnZlcnQpOworCQlnb3RvIHJldF9yZXM7CisJCWJyZWFrOworCS8qIGRlZmF1bHQ6IEZhbGwgdGhyb3VnaCBhbmQgZG8gVUlEIHJlbGVhdGVkIHdvcmsgKi8KKwl9CisKKwlzayA9IHNrYi0+c2s7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJLyoKKwkJICogQSBtaXNzaW5nIHNrLT5za19zb2NrZXQgaGFwcGVucyB3aGVuIHBhY2tldHMgYXJlIGluLWZsaWdodAorCQkgKiBhbmQgdGhlIG1hdGNoaW5nIHNvY2tldCBpcyBhbHJlYWR5IGNsb3NlZCBhbmQgZ29uZS4KKwkJICovCisJCXNrID0gcXRhZ3VpZF9maW5kX3NrKHNrYiwgcGFyKTsKKwkJLyoKKwkJICogSWYgd2UgZ290IHRoZSBzb2NrZXQgZnJvbSB0aGUgZmluZF9zaygpLCB3ZSB3aWxsIG5lZWQgdG8gcHV0CisJCSAqIGl0IGJhY2ssIGFzIG5mX3Rwcm94eV9nZXRfc29ja192NCgpIGdvdCBpdC4KKwkJICovCisJCWdvdF9zb2NrID0gc2s7CisJCWlmIChzaykKKwkJCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5tYXRjaF9mb3VuZF9za19pbl9jdCk7CisJCWVsc2UKKwkJCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5tYXRjaF9mb3VuZF9ub19za19pbl9jdCk7CisJfSBlbHNlIHsKKwkJYXRvbWljNjRfaW5jKCZxdHVfZXZlbnRzLm1hdGNoX2ZvdW5kX3NrKTsKKwl9CisJTVRfREVCVUcoInF0YWd1aWRbJWRdOiBzaz0lcCBnb3Rfc29jaz0lZCBmYW09JWQgcHJvdG89JWRcbiIsCisJCSBwYXItPmhvb2tudW0sIHNrLCBnb3Rfc29jaywgcGFyLT5mYW1pbHksIGlweF9wcm90byhza2IsIHBhcikpOworCWlmIChzayAhPSBOVUxMKSB7CisJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogc2s9JXAtPnNrX3NvY2tldD0lcC0+ZmlsZT0lcFxuIiwKKwkJCXBhci0+aG9va251bSwgc2ssIHNrLT5za19zb2NrZXQsCisJCQlzay0+c2tfc29ja2V0ID8gc2stPnNrX3NvY2tldC0+ZmlsZSA6ICh2b2lkICopLTFMTCk7CisJCWZpbHAgPSBzay0+c2tfc29ja2V0ID8gc2stPnNrX3NvY2tldC0+ZmlsZSA6IE5VTEw7CisJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogZmlscC4uLnVpZD0ldVxuIiwKKwkJCXBhci0+aG9va251bSwgZmlscCA/IGZpbHAtPmZfY3JlZC0+ZnN1aWQgOiAtMSk7CisJfQorCisJaWYgKHNrID09IE5VTEwgfHwgc2stPnNrX3NvY2tldCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIEhlcmUsIHRoZSBxdGFndWlkX2ZpbmRfc2soKSB1c2luZyBjb25uZWN0aW9uIHRyYWNraW5nCisJCSAqIGNvdWxkbid0IGZpbmQgdGhlIG93bmVyLCBzbyBmb3Igbm93IHdlIGp1c3QgY291bnQgdGhlbQorCQkgKiBhZ2FpbnN0IHRoZSBzeXN0ZW0uCisJCSAqLworCQkvKgorCQkgKiBUT0RPOiB1bmhhY2sgaG93IHRvIGZvcmNlIGp1c3QgYWNjb3VudGluZy4KKwkJICogRm9yIG5vdyB3ZSBvbmx5IGRvIGlmYWNlIHN0YXRzIHdoZW4gdGhlIHVpZC1vd25lciBpcyBub3QKKwkJICogcmVxdWVzdGVkLgorCQkgKi8KKwkJaWYgKCEoaW5mby0+bWF0Y2ggJiBYVF9RVEFHVUlEX1VJRCkpCisJCQlhY2NvdW50X2Zvcl91aWQoc2tiLCBzaywgMCwgcGFyKTsKKwkJTVRfREVCVUcoInF0YWd1aWRbJWRdOiBsZWF2aW5nIChzaz9zay0+c2tfc29ja2V0KT0lcFxuIiwKKwkJCXBhci0+aG9va251bSwKKwkJCXNrID8gc2stPnNrX3NvY2tldCA6IE5VTEwpOworCQlyZXMgPSAoaW5mby0+bWF0Y2ggXiBpbmZvLT5pbnZlcnQpID09IDA7CisJCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5tYXRjaF9ub19zayk7CisJCWdvdG8gcHV0X3NvY2tfcmV0X3JlczsKKwl9IGVsc2UgaWYgKGluZm8tPm1hdGNoICYgaW5mby0+aW52ZXJ0ICYgWFRfUVRBR1VJRF9TT0NLRVQpIHsKKwkJcmVzID0gZmFsc2U7CisJCWdvdG8gcHV0X3NvY2tfcmV0X3JlczsKKwl9CisJZmlscCA9IHNrLT5za19zb2NrZXQtPmZpbGU7CisJaWYgKGZpbHAgPT0gTlVMTCkgeworCQlNVF9ERUJVRygicXRhZ3VpZFslZF06IGxlYXZpbmcgZmlscD1OVUxMXG4iLCBwYXItPmhvb2tudW0pOworCQlhY2NvdW50X2Zvcl91aWQoc2tiLCBzaywgMCwgcGFyKTsKKwkJcmVzID0gKChpbmZvLT5tYXRjaCBeIGluZm8tPmludmVydCkgJgorCQkJKFhUX1FUQUdVSURfVUlEIHwgWFRfUVRBR1VJRF9HSUQpKSA9PSAwOworCQlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMubWF0Y2hfbm9fc2tfZmlsZSk7CisJCWdvdG8gcHV0X3NvY2tfcmV0X3JlczsKKwl9CisJc29ja191aWQgPSBmaWxwLT5mX2NyZWQtPmZzdWlkOworCS8qCisJICogVE9ETzogdW5oYWNrIGhvdyB0byBmb3JjZSBqdXN0IGFjY291bnRpbmcuCisJICogRm9yIG5vdyB3ZSBvbmx5IGRvIGlmYWNlIHN0YXRzIHdoZW4gdGhlIHVpZC1vd25lciBpcyBub3QgcmVxdWVzdGVkCisJICovCisJaWYgKCEoaW5mby0+bWF0Y2ggJiBYVF9RVEFHVUlEX1VJRCkpCisJCWFjY291bnRfZm9yX3VpZChza2IsIHNrLCBzb2NrX3VpZCwgcGFyKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgZmFpbCB0aGUgbWF0Y2ggd2hlbjoKKwkgKiAgICBpZCBub3QgaW4gcmFuZ2UgQU5EIG5vIGludmVydGVkIGNvbmRpdGlvbiByZXF1ZXN0ZWQKKwkgKiBvciBpZCAgICAgaW4gcmFuZ2UgQU5EICAgIGludmVydGVkIGNvbmRpdGlvbiByZXF1ZXN0ZWQKKwkgKiBUaHVzICghYSAmJiBiKSB8fCAoYSAmJiAhYikgPT0gYSBeIGIKKwkgKi8KKwlpZiAoaW5mby0+bWF0Y2ggJiBYVF9RVEFHVUlEX1VJRCkKKwkJaWYgKChmaWxwLT5mX2NyZWQtPmZzdWlkID49IGluZm8tPnVpZF9taW4gJiYKKwkJICAgICBmaWxwLT5mX2NyZWQtPmZzdWlkIDw9IGluZm8tPnVpZF9tYXgpIF4KKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUVRBR1VJRF9VSUQpKSB7CisJCQlNVF9ERUJVRygicXRhZ3VpZFslZF06IGxlYXZpbmcgdWlkIG5vdCBtYXRjaGluZ1xuIiwKKwkJCQkgcGFyLT5ob29rbnVtKTsKKwkJCXJlcyA9IGZhbHNlOworCQkJZ290byBwdXRfc29ja19yZXRfcmVzOworCQl9CisJaWYgKGluZm8tPm1hdGNoICYgWFRfUVRBR1VJRF9HSUQpCisJCWlmICgoZmlscC0+Zl9jcmVkLT5mc2dpZCA+PSBpbmZvLT5naWRfbWluICYmCisJCQkJZmlscC0+Zl9jcmVkLT5mc2dpZCA8PSBpbmZvLT5naWRfbWF4KSBeCisJCQkhKGluZm8tPmludmVydCAmIFhUX1FUQUdVSURfR0lEKSkgeworCQkJTVRfREVCVUcoInF0YWd1aWRbJWRdOiBsZWF2aW5nIGdpZCBub3QgbWF0Y2hpbmdcbiIsCisJCQkJcGFyLT5ob29rbnVtKTsKKwkJCXJlcyA9IGZhbHNlOworCQkJZ290byBwdXRfc29ja19yZXRfcmVzOworCQl9CisKKwlNVF9ERUJVRygicXRhZ3VpZFslZF06IGxlYXZpbmcgbWF0Y2hlZFxuIiwgcGFyLT5ob29rbnVtKTsKKwlyZXMgPSB0cnVlOworCitwdXRfc29ja19yZXRfcmVzOgorCWlmIChnb3Rfc29jaykKKwkJeHRfc29ja2V0X3B1dF9zayhzayk7CityZXRfcmVzOgorCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogbGVmdCAlZFxuIiwgcGFyLT5ob29rbnVtLCByZXMpOworCXJldHVybiByZXM7Cit9CisKKyNpZmRlZiBEREVCVUcKKy8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IGluIHh0X3F0YWd1aWRfcHJpbnQuYyBiZWNhdXNlIG9mIGxvY2tzIHZpc2liaWxpdHkgKi8KK3N0YXRpYyB2b2lkIHByZGVidWdfZnVsbF9zdGF0ZShpbnQgaW5kZW50X2xldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqZm10X2J1ZmY7CisJY2hhciAqYnVmZjsKKworCWlmICghdW5saWtlbHkocXRhZ3VpZF9kZWJ1Z19tYXNrICYgRERFQlVHX01BU0spKQorCQlyZXR1cm47CisKKwlmbXRfYnVmZiA9IGthc3ByaW50ZihHRlBfQVRPTUlDLAorCQkJICAgICAicXRhZ3VpZDogJXMoKTogJXMge1xuIiwgX19mdW5jX18sIGZtdCk7CisJQlVHX09OKCFmbXRfYnVmZik7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlidWZmID0ga3Zhc3ByaW50ZihHRlBfQVRPTUlDLAorCQkJICBmbXRfYnVmZiwgYXJncyk7CisJQlVHX09OKCFidWZmKTsKKwlwcl9kZWJ1ZygiJXMiLCBidWZmKTsKKwlrZnJlZShmbXRfYnVmZik7CisJa2ZyZWUoYnVmZik7CisJdmFfZW5kKGFyZ3MpOworCisJc3Bpbl9sb2NrX2JoKCZzb2NrX3RhZ19saXN0X2xvY2spOworCXByZGVidWdfc29ja190YWdfdHJlZShpbmRlbnRfbGV2ZWwsICZzb2NrX3RhZ190cmVlKTsKKwlzcGluX3VubG9ja19iaCgmc29ja190YWdfbGlzdF9sb2NrKTsKKworCXNwaW5fbG9ja19iaCgmc29ja190YWdfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCXByZGVidWdfdWlkX3RhZ19kYXRhX3RyZWUoaW5kZW50X2xldmVsLCAmdWlkX3RhZ19kYXRhX3RyZWUpOworCXByZGVidWdfcHJvY19xdHVfZGF0YV90cmVlKGluZGVudF9sZXZlbCwgJnByb2NfcXR1X2RhdGFfdHJlZSk7CisJc3Bpbl91bmxvY2tfYmgoJnVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzb2NrX3RhZ19saXN0X2xvY2spOworCisJc3Bpbl9sb2NrX2JoKCZpZmFjZV9zdGF0X2xpc3RfbG9jayk7CisJcHJkZWJ1Z19pZmFjZV9zdGF0X2xpc3QoaW5kZW50X2xldmVsLCAmaWZhY2Vfc3RhdF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCisJcHJfZGVidWcoInF0YWd1aWQ6ICVzKCk6IH1cbiIsIF9fZnVuY19fKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBwcmRlYnVnX2Z1bGxfc3RhdGUoaW50IGluZGVudF9sZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pIHt9CisjZW5kaWYKKworLyoKKyAqIFByb2NmcyByZWFkZXIgdG8gZ2V0IGFsbCBhY3RpdmUgc29ja2V0IHRhZ3MgdXNpbmcgc3R5bGUgIjEpIiBhcyBkZXNjcmliZWQgaW4KKyAqIGZzL3Byb2MvZ2VuZXJpYy5jCisgKi8KK3N0YXRpYyBpbnQgcXRhZ3VpZF9jdHJsX3Byb2NfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqbnVtX2l0ZW1zX3JldHVybmVkLAorCQkJCSAgb2ZmX3QgaXRlbXNfdG9fc2tpcCwgaW50IGNoYXJfY291bnQsIGludCAqZW9mLAorCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpvdXRwID0gcGFnZTsKKwlpbnQgbGVuOworCXVpZF90IHVpZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29ja190YWcgKnNvY2tfdGFnX2VudHJ5OworCWludCBpdGVtX2luZGV4ID0gMDsKKwlpbnQgaW5kZW50X2xldmVsID0gMDsKKwlsb25nIGZfY291bnQ7CisKKwlpZiAodW5saWtlbHkobW9kdWxlX3Bhc3NpdmUpKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKmVvZikKKwkJcmV0dXJuIDA7CisKKwlDVF9ERUJVRygicXRhZ3VpZDogcHJvYyBjdHJsIHBpZD0ldSB0Z2lkPSV1IHVpZD0ldSAiCisJCSAicGFnZT0lcCBvZmY9JWxkIGNoYXJfY291bnQ9JWQgKmVvZj0lZFxuIiwKKwkJIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpLAorCQkgcGFnZSwgaXRlbXNfdG9fc2tpcCwgY2hhcl9jb3VudCwgKmVvZik7CisKKwlzcGluX2xvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJZm9yIChub2RlID0gcmJfZmlyc3QoJnNvY2tfdGFnX3RyZWUpOworCSAgICAgbm9kZTsKKwkgICAgIG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CisJCWlmIChpdGVtX2luZGV4KysgPCBpdGVtc190b19za2lwKQorCQkJY29udGludWU7CisJCXNvY2tfdGFnX2VudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHNvY2tfdGFnLCBzb2NrX25vZGUpOworCQl1aWQgPSBnZXRfdWlkX2Zyb21fdGFnKHNvY2tfdGFnX2VudHJ5LT50YWcpOworCQlDVF9ERUJVRygicXRhZ3VpZDogcHJvY19yZWFkKCk6IHNrPSVwIHRhZz0weCVsbHggKHVpZD0ldSkgIgorCQkJICJwaWQ9JXVcbiIsCisJCQkgc29ja190YWdfZW50cnktPnNrLAorCQkJIHNvY2tfdGFnX2VudHJ5LT50YWcsCisJCQkgdWlkLAorCQkJIHNvY2tfdGFnX2VudHJ5LT5waWQKKwkJCSk7CisJCWZfY291bnQgPSBhdG9taWNfbG9uZ19yZWFkKAorCQkJJnNvY2tfdGFnX2VudHJ5LT5zb2NrZXQtPmZpbGUtPmZfY291bnQpOworCQlsZW4gPSBzbnByaW50ZihvdXRwLCBjaGFyX2NvdW50LAorCQkJICAgICAgICJzb2NrPSVwIHRhZz0weCVsbHggKHVpZD0ldSkgcGlkPSV1ICIKKwkJCSAgICAgICAiZl9jb3VudD0lbHVcbiIsCisJCQkgICAgICAgc29ja190YWdfZW50cnktPnNrLAorCQkJICAgICAgIHNvY2tfdGFnX2VudHJ5LT50YWcsIHVpZCwKKwkJCSAgICAgICBzb2NrX3RhZ19lbnRyeS0+cGlkLCBmX2NvdW50KTsKKwkJaWYgKGxlbiA+PSBjaGFyX2NvdW50KSB7CisJCQlzcGluX3VubG9ja19iaCgmc29ja190YWdfbGlzdF9sb2NrKTsKKwkJCSpvdXRwID0gJ1wwJzsKKwkJCXJldHVybiBvdXRwIC0gcGFnZTsKKwkJfQorCQlvdXRwICs9IGxlbjsKKwkJY2hhcl9jb3VudCAtPSBsZW47CisJCSgqbnVtX2l0ZW1zX3JldHVybmVkKSsrOworCX0KKwlzcGluX3VubG9ja19iaCgmc29ja190YWdfbGlzdF9sb2NrKTsKKworCWlmIChpdGVtX2luZGV4KysgPj0gaXRlbXNfdG9fc2tpcCkgeworCQlsZW4gPSBzbnByaW50ZihvdXRwLCBjaGFyX2NvdW50LAorCQkJICAgICAgICJldmVudHM6IHNvY2tldHNfdGFnZ2VkPSVsbHUgIgorCQkJICAgICAgICJzb2NrZXRzX3VudGFnZ2VkPSVsbHUgIgorCQkJICAgICAgICJjb3VudGVyX3NldF9jaGFuZ2VzPSVsbHUgIgorCQkJICAgICAgICJkZWxldGVfY21kcz0lbGx1ICIKKwkJCSAgICAgICAiaWZhY2VfZXZlbnRzPSVsbHUgIgorCQkJICAgICAgICJtYXRjaF9jYWxscz0lbGx1ICIKKwkJCSAgICAgICAibWF0Y2hfY2FsbHNfcHJlcG9zdD0lbGx1ICIKKwkJCSAgICAgICAibWF0Y2hfZm91bmRfc2s9JWxsdSAiCisJCQkgICAgICAgIm1hdGNoX2ZvdW5kX3NrX2luX2N0PSVsbHUgIgorCQkJICAgICAgICJtYXRjaF9mb3VuZF9ub19za19pbl9jdD0lbGx1ICIKKwkJCSAgICAgICAibWF0Y2hfbm9fc2s9JWxsdSAiCisJCQkgICAgICAgIm1hdGNoX25vX3NrX2ZpbGU9JWxsdVxuIiwKKwkJCSAgICAgICBhdG9taWM2NF9yZWFkKCZxdHVfZXZlbnRzLnNvY2tldHNfdGFnZ2VkKSwKKwkJCSAgICAgICBhdG9taWM2NF9yZWFkKCZxdHVfZXZlbnRzLnNvY2tldHNfdW50YWdnZWQpLAorCQkJICAgICAgIGF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMuY291bnRlcl9zZXRfY2hhbmdlcyksCisJCQkgICAgICAgYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5kZWxldGVfY21kcyksCisJCQkgICAgICAgYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5pZmFjZV9ldmVudHMpLAorCQkJICAgICAgIGF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMubWF0Y2hfY2FsbHMpLAorCQkJICAgICAgIGF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMubWF0Y2hfY2FsbHNfcHJlcG9zdCksCisJCQkgICAgICAgYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5tYXRjaF9mb3VuZF9zayksCisJCQkgICAgICAgYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5tYXRjaF9mb3VuZF9za19pbl9jdCksCisJCQkgICAgICAgYXRvbWljNjRfcmVhZCgKKwkJCQkgICAgICAgJnF0dV9ldmVudHMubWF0Y2hfZm91bmRfbm9fc2tfaW5fY3QpLAorCQkJICAgICAgIGF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMubWF0Y2hfbm9fc2spLAorCQkJICAgICAgIGF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMubWF0Y2hfbm9fc2tfZmlsZSkpOworCQlpZiAobGVuID49IGNoYXJfY291bnQpIHsKKwkJCSpvdXRwID0gJ1wwJzsKKwkJCXJldHVybiBvdXRwIC0gcGFnZTsKKwkJfQorCQlvdXRwICs9IGxlbjsKKwkJY2hhcl9jb3VudCAtPSBsZW47CisJCSgqbnVtX2l0ZW1zX3JldHVybmVkKSsrOworCX0KKworCS8qIENvdW50IHRoZSBmb2xsb3dpbmcgYXMgcGFydCBvZiB0aGUgbGFzdCBpdGVtX2luZGV4ICovCisJaWYgKGl0ZW1faW5kZXggPiBpdGVtc190b19za2lwKSB7CisJCXByZGVidWdfZnVsbF9zdGF0ZShpbmRlbnRfbGV2ZWwsICJwcm9jIGN0cmwiKTsKKwl9CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gb3V0cCAtIHBhZ2U7Cit9CisKKy8qCisgKiBEZWxldGUgc29ja2V0IHRhZ3MsIGFuZCBzdGF0IHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKyAqIGFjY291dGluZyB0YWcgYW5kIHVpZC4KKyAqLworc3RhdGljIGludCBjdHJsX2NtZF9kZWxldGUoY29uc3QgY2hhciAqaW5wdXQpCit7CisJY2hhciBjbWQ7CisJdWlkX3QgdWlkOworCXVpZF90IGVudHJ5X3VpZDsKKwl0YWdfdCBhY2N0X3RhZzsKKwl0YWdfdCB0YWc7CisJaW50IHJlcywgYXJnYzsKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfZW50cnk7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2tfdGFnICpzdF9lbnRyeTsKKwlzdHJ1Y3QgcmJfcm9vdCBzdF90b19mcmVlX3RyZWUgPSBSQl9ST09UOworCXN0cnVjdCB0YWdfc3RhdCAqdHNfZW50cnk7CisJc3RydWN0IHRhZ19jb3VudGVyX3NldCAqdGNzX2VudHJ5OworCXN0cnVjdCB0YWdfcmVmICp0cl9lbnRyeTsKKwlzdHJ1Y3QgdWlkX3RhZ19kYXRhICp1dGRfZW50cnk7CisKKwlhcmdjID0gc3NjYW5mKGlucHV0LCAiJWMgJWxsdSAldSIsICZjbWQsICZhY2N0X3RhZywgJnVpZCk7CisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfZGVsZXRlKCVzKTogYXJnYz0lZCBjbWQ9JWMgIgorCQkgInVzZXJfdGFnPTB4JWxseCB1aWQ9JXVcbiIsIGlucHV0LCBhcmdjLCBjbWQsCisJCSBhY2N0X3RhZywgdWlkKTsKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcmVzID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCWlmICghdmFsaWRfYXRhZyhhY2N0X3RhZykpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogY3RybF9kZWxldGUoJXMpOiBpbnZhbGlkIHRhZ1xuIiwgaW5wdXQpOworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJaWYgKGFyZ2MgPCAzKSB7CisJCXVpZCA9IGN1cnJlbnRfZnN1aWQoKTsKKwl9IGVsc2UgaWYgKCFjYW5faW1wZXJzb25hdGVfdWlkKHVpZCkpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogY3RybF9kZWxldGUoJXMpOiAiCisJCQkiaW5zdWZmaWNpZW50IHByaXYgZnJvbSBwaWQ9JXUgdGdpZD0ldSB1aWQ9JXVcbiIsCisJCQlpbnB1dCwgY3VycmVudC0+cGlkLCBjdXJyZW50LT50Z2lkLCBjdXJyZW50X2ZzdWlkKCkpOworCQlyZXMgPSAtRVBFUk07CisJCWdvdG8gZXJyOworCX0KKworCXRhZyA9IGNvbWJpbmVfYXRhZ193aXRoX3VpZChhY2N0X3RhZywgdWlkKTsKKwlDVF9ERUJVRygicXRhZ3VpZDogY3RybF9kZWxldGUoJXMpOiAiCisJCSAibG9va2luZyBmb3IgdGFnPTB4JWxseCAodWlkPSV1KVxuIiwKKwkJIGlucHV0LCB0YWcsIHVpZCk7CisKKwkvKiBEZWxldGUgc29ja2V0IHRhZ3MgKi8KKwlzcGluX2xvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJbm9kZSA9IHJiX2ZpcnN0KCZzb2NrX3RhZ190cmVlKTsKKwl3aGlsZSAobm9kZSkgeworCQlzdF9lbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzb2NrX3RhZywgc29ja19ub2RlKTsKKwkJZW50cnlfdWlkID0gZ2V0X3VpZF9mcm9tX3RhZyhzdF9lbnRyeS0+dGFnKTsKKwkJbm9kZSA9IHJiX25leHQobm9kZSk7CisJCWlmIChlbnRyeV91aWQgIT0gdWlkKQorCQkJY29udGludWU7CisKKwkJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfZGVsZXRlKCVzKTogc3QgdGFnPTB4JWxseCAodWlkPSV1KVxuIiwKKwkJCSBpbnB1dCwgc3RfZW50cnktPnRhZywgZW50cnlfdWlkKTsKKworCQlpZiAoIWFjY3RfdGFnIHx8IHN0X2VudHJ5LT50YWcgPT0gdGFnKSB7CisJCQlyYl9lcmFzZSgmc3RfZW50cnktPnNvY2tfbm9kZSwgJnNvY2tfdGFnX3RyZWUpOworCQkJLyogQ2FuJ3Qgc29ja2ZkX3B1dCgpIHdpdGhpbiBzcGlubG9jaywgZG8gaXQgbGF0ZXIuICovCisJCQlzb2NrX3RhZ190cmVlX2luc2VydChzdF9lbnRyeSwgJnN0X3RvX2ZyZWVfdHJlZSk7CisJCQl0cl9lbnRyeSA9IGxvb2t1cF90YWdfcmVmKHN0X2VudHJ5LT50YWcsIE5VTEwpOworCQkJQlVHX09OKHRyX2VudHJ5LT5udW1fc29ja190YWdzIDw9IDApOworCQkJdHJfZW50cnktPm51bV9zb2NrX3RhZ3MtLTsKKwkJCS8qCisJCQkgKiBUT0RPOiByZW1vdmUgaWYsIGFuZCBzdGFydCBmYWlsaW5nLgorCQkJICogVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBpbiBzb21lCisJCQkgKiBwbGFjZXMgd2UgaGF2ZSAiaWYgKElTX0VSUl9PUl9OVUxMKHBxZF9lbnRyeSkpIgorCQkJICogYW5kIGFyZSB0cnlpbmcgdG8gd29yayBhcm91bmQgYXBwcworCQkJICogdGhhdCBkaWRuJ3Qgb3BlbiB0aGUgL2Rldi94dF9xdGFndWlkLgorCQkJICovCisJCQlpZiAoc3RfZW50cnktPmxpc3QubmV4dCAmJiBzdF9lbnRyeS0+bGlzdC5wcmV2KQorCQkJCWxpc3RfZGVsKCZzdF9lbnRyeS0+bGlzdCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisKKwlzb2NrX3RhZ190cmVlX2VyYXNlKCZzdF90b19mcmVlX3RyZWUpOworCisJLyogRGVsZXRlIHRhZyBjb3VudGVyLXNldHMgKi8KKwlzcGluX2xvY2tfYmgoJnRhZ19jb3VudGVyX3NldF9saXN0X2xvY2spOworCS8qIENvdW50ZXIgc2V0cyBhcmUgb25seSBvbiB0aGUgdWlkIHRhZywgbm90IGZ1bGwgdGFnICovCisJdGNzX2VudHJ5ID0gdGFnX2NvdW50ZXJfc2V0X3RyZWVfc2VhcmNoKCZ0YWdfY291bnRlcl9zZXRfdHJlZSwgdGFnKTsKKwlpZiAodGNzX2VudHJ5KSB7CisJCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX2RlbGV0ZSglcyk6ICIKKwkJCSAiZXJhc2UgdGNzOiB0YWc9MHglbGx4ICh1aWQ9JXUpIHNldD0lZFxuIiwKKwkJCSBpbnB1dCwKKwkJCSB0Y3NfZW50cnktPnRuLnRhZywKKwkJCSBnZXRfdWlkX2Zyb21fdGFnKHRjc19lbnRyeS0+dG4udGFnKSwKKwkJCSB0Y3NfZW50cnktPmFjdGl2ZV9zZXQpOworCQlyYl9lcmFzZSgmdGNzX2VudHJ5LT50bi5ub2RlLCAmdGFnX2NvdW50ZXJfc2V0X3RyZWUpOworCQlrZnJlZSh0Y3NfZW50cnkpOworCX0KKwlzcGluX3VubG9ja19iaCgmdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jayk7CisKKwkvKgorCSAqIElmIGFjY3RfdGFnIGlzIDAsIHRoZW4gYWxsIGVudHJpZXMgYmVsb25naW5nIHRvIHVpZCBhcmUKKwkgKiBlcmFzZWQuCisJICovCisJc3Bpbl9sb2NrX2JoKCZpZmFjZV9zdGF0X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZmFjZV9lbnRyeSwgJmlmYWNlX3N0YXRfbGlzdCwgbGlzdCkgeworCQlzcGluX2xvY2tfYmgoJmlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2spOworCQlub2RlID0gcmJfZmlyc3QoJmlmYWNlX2VudHJ5LT50YWdfc3RhdF90cmVlKTsKKwkJd2hpbGUgKG5vZGUpIHsKKwkJCXRzX2VudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRhZ19zdGF0LCB0bi5ub2RlKTsKKwkJCWVudHJ5X3VpZCA9IGdldF91aWRfZnJvbV90YWcodHNfZW50cnktPnRuLnRhZyk7CisJCQlub2RlID0gcmJfbmV4dChub2RlKTsKKworCQkJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfZGVsZXRlKCVzKTogIgorCQkJCSAidHMgdGFnPTB4JWxseCAodWlkPSV1KVxuIiwKKwkJCQkgaW5wdXQsIHRzX2VudHJ5LT50bi50YWcsIGVudHJ5X3VpZCk7CisKKwkJCWlmIChlbnRyeV91aWQgIT0gdWlkKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFhY2N0X3RhZyB8fCB0c19lbnRyeS0+dG4udGFnID09IHRhZykgeworCQkJCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX2RlbGV0ZSglcyk6ICIKKwkJCQkJICJlcmFzZSB0czogJXMgMHglbGx4ICV1XG4iLAorCQkJCQkgaW5wdXQsIGlmYWNlX2VudHJ5LT5pZm5hbWUsCisJCQkJCSBnZXRfYXRhZ19mcm9tX3RhZyh0c19lbnRyeS0+dG4udGFnKSwKKwkJCQkJIGVudHJ5X3VpZCk7CisJCQkJcmJfZXJhc2UoJnRzX2VudHJ5LT50bi5ub2RlLAorCQkJCQkgJmlmYWNlX2VudHJ5LT50YWdfc3RhdF90cmVlKTsKKwkJCQlrZnJlZSh0c19lbnRyeSk7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCisJLyogQ2xlYW51cCB0aGUgdWlkX3RhZ19kYXRhICovCisJc3Bpbl9sb2NrX2JoKCZ1aWRfdGFnX2RhdGFfdHJlZV9sb2NrKTsKKwlub2RlID0gcmJfZmlyc3QoJnVpZF90YWdfZGF0YV90cmVlKTsKKwl3aGlsZSAobm9kZSkgeworCQl1dGRfZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgdWlkX3RhZ19kYXRhLCBub2RlKTsKKwkJZW50cnlfdWlkID0gdXRkX2VudHJ5LT51aWQ7CisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCisJCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX2RlbGV0ZSglcyk6ICIKKwkJCSAidXRkIHVpZD0ldVxuIiwKKwkJCSBpbnB1dCwgZW50cnlfdWlkKTsKKworCQlpZiAoZW50cnlfdWlkICE9IHVpZCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBHbyBvdmVyIHRoZSB0YWdfcmVmcywgYW5kIHRob3NlIHRoYXQgZG9uJ3QgaGF2ZQorCQkgKiBzb2NrX3RhZ3MgdXNpbmcgdGhlbSBhcmUgZnJlZWQuCisJCSAqLworCQlwdXRfdGFnX3JlZl90cmVlKHRhZywgdXRkX2VudHJ5KTsKKwkJcHV0X3V0ZF9lbnRyeSh1dGRfZW50cnkpOworCX0KKwlzcGluX3VubG9ja19iaCgmdWlkX3RhZ19kYXRhX3RyZWVfbG9jayk7CisKKwlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMuZGVsZXRlX2NtZHMpOworCXJlcyA9IDA7CisKK2VycjoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGN0cmxfY21kX2NvdW50ZXJfc2V0KGNvbnN0IGNoYXIgKmlucHV0KQoreworCWNoYXIgY21kOworCXVpZF90IHVpZCA9IDA7CisJdGFnX3QgdGFnOworCWludCByZXMsIGFyZ2M7CisJc3RydWN0IHRhZ19jb3VudGVyX3NldCAqdGNzOworCWludCBjb3VudGVyX3NldDsKKworCWFyZ2MgPSBzc2NhbmYoaW5wdXQsICIlYyAlZCAldSIsICZjbWQsICZjb3VudGVyX3NldCwgJnVpZCk7CisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfY291bnRlcnNldCglcyk6IGFyZ2M9JWQgY21kPSVjICIKKwkJICJzZXQ9JWQgdWlkPSV1XG4iLCBpbnB1dCwgYXJnYywgY21kLAorCQkgY291bnRlcl9zZXQsIHVpZCk7CisJaWYgKGFyZ2MgIT0gMykgeworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJaWYgKGNvdW50ZXJfc2V0IDwgMCB8fCBjb3VudGVyX3NldCA+PSBJRlNfTUFYX0NPVU5URVJfU0VUUykgeworCQlwcl9pbmZvKCJxdGFndWlkOiBjdHJsX2NvdW50ZXJzZXQoJXMpOiBpbnZhbGlkIGNvdW50ZXJfc2V0IHJhbmdlXG4iLAorCQkJaW5wdXQpOworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCFjYW5fbWFuaXB1bGF0ZV91aWRzKCkpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogY3RybF9jb3VudGVyc2V0KCVzKTogIgorCQkJImluc3VmZmljaWVudCBwcml2IGZyb20gcGlkPSV1IHRnaWQ9JXUgdWlkPSV1XG4iLAorCQkJaW5wdXQsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpKTsKKwkJcmVzID0gLUVQRVJNOworCQlnb3RvIGVycjsKKwl9CisKKwl0YWcgPSBtYWtlX3RhZ19mcm9tX3VpZCh1aWQpOworCXNwaW5fbG9ja19iaCgmdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jayk7CisJdGNzID0gdGFnX2NvdW50ZXJfc2V0X3RyZWVfc2VhcmNoKCZ0YWdfY291bnRlcl9zZXRfdHJlZSwgdGFnKTsKKwlpZiAoIXRjcykgeworCQl0Y3MgPSBremFsbG9jKHNpemVvZigqdGNzKSwgR0ZQX0FUT01JQyk7CisJCWlmICghdGNzKSB7CisJCQlzcGluX3VubG9ja19iaCgmdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jayk7CisJCQlwcl9lcnIoInF0YWd1aWQ6IGN0cmxfY291bnRlcnNldCglcyk6ICIKKwkJCSAgICAgICAiZmFpbGVkIHRvIGFsbG9jIGNvdW50ZXIgc2V0XG4iLAorCQkJICAgICAgIGlucHV0KTsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCQl0Y3MtPnRuLnRhZyA9IHRhZzsKKwkJdGFnX2NvdW50ZXJfc2V0X3RyZWVfaW5zZXJ0KHRjcywgJnRhZ19jb3VudGVyX3NldF90cmVlKTsKKwkJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfY291bnRlcnNldCglcyk6IGFkZGVkIHRjcyB0YWc9MHglbGx4ICIKKwkJCSAiKHVpZD0ldSkgc2V0PSVkXG4iLAorCQkJIGlucHV0LCB0YWcsIGdldF91aWRfZnJvbV90YWcodGFnKSwgY291bnRlcl9zZXQpOworCX0KKwl0Y3MtPmFjdGl2ZV9zZXQgPSBjb3VudGVyX3NldDsKKwlzcGluX3VubG9ja19iaCgmdGFnX2NvdW50ZXJfc2V0X2xpc3RfbG9jayk7CisJYXRvbWljNjRfaW5jKCZxdHVfZXZlbnRzLmNvdW50ZXJfc2V0X2NoYW5nZXMpOworCXJlcyA9IDA7CisKK2VycjoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGN0cmxfY21kX3RhZyhjb25zdCBjaGFyICppbnB1dCkKK3sKKwljaGFyIGNtZDsKKwlpbnQgc29ja19mZCA9IDA7CisJdWlkX3QgdWlkID0gMDsKKwl0YWdfdCBhY2N0X3RhZyA9IG1ha2VfYXRhZ19mcm9tX3ZhbHVlKDApOworCXRhZ190IGZ1bGxfdGFnOworCXN0cnVjdCBzb2NrZXQgKmVsX3NvY2tldDsKKwlpbnQgcmVzLCBhcmdjOworCXN0cnVjdCBzb2NrX3RhZyAqc29ja190YWdfZW50cnk7CisJc3RydWN0IHRhZ19yZWYgKnRhZ19yZWZfZW50cnk7CisJc3RydWN0IHVpZF90YWdfZGF0YSAqdWlkX3RhZ19kYXRhX2VudHJ5OworCXN0cnVjdCBwcm9jX3F0dV9kYXRhICpwcWRfZW50cnk7CisKKwkvKiBVbmFzc2lnbmVkIGFyZ3Mgd2lsbCBnZXQgZGVmYXVsdGVkIGxhdGVyLiAqLworCWFyZ2MgPSBzc2NhbmYoaW5wdXQsICIlYyAlZCAlbGx1ICV1IiwgJmNtZCwgJnNvY2tfZmQsICZhY2N0X3RhZywgJnVpZCk7CisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfdGFnKCVzKTogYXJnYz0lZCBjbWQ9JWMgc29ja19mZD0lZCAiCisJCSAiYWNjdF90YWc9MHglbGx4IHVpZD0ldVxuIiwgaW5wdXQsIGFyZ2MsIGNtZCwgc29ja19mZCwKKwkJIGFjY3RfdGFnLCB1aWQpOworCWlmIChhcmdjIDwgMikgeworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJZWxfc29ja2V0ID0gc29ja2ZkX2xvb2t1cChzb2NrX2ZkLCAmcmVzKTsgIC8qIFRoaXMgbG9ja3MgdGhlIGZpbGUgKi8KKwlpZiAoIWVsX3NvY2tldCkgeworCQlwcl9pbmZvKCJxdGFndWlkOiBjdHJsX3RhZyglcyk6IGZhaWxlZCB0byBsb29rdXAiCisJCQkiIHNvY2tfZmQ9JWQgZXJyPSVkIHBpZD0ldSB0Z2lkPSV1IHVpZD0ldVxuIiwKKwkJCWlucHV0LCBzb2NrX2ZkLCByZXMsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwKKwkJCWN1cnJlbnRfZnN1aWQoKSk7CisJCWdvdG8gZXJyOworCX0KKwlDVF9ERUJVRygicXRhZ3VpZDogY3RybF90YWcoJXMpOiBzb2NrZXQtPi4uLi0+Zl9jb3VudD0lbGQgLT5zaz0lcFxuIiwKKwkJIGlucHV0LCBhdG9taWNfbG9uZ19yZWFkKCZlbF9zb2NrZXQtPmZpbGUtPmZfY291bnQpLAorCQkgZWxfc29ja2V0LT5zayk7CisJaWYgKGFyZ2MgPCAzKSB7CisJCWFjY3RfdGFnID0gbWFrZV9hdGFnX2Zyb21fdmFsdWUoMCk7CisJfSBlbHNlIGlmICghdmFsaWRfYXRhZyhhY2N0X3RhZykpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogY3RybF90YWcoJXMpOiBpbnZhbGlkIHRhZ1xuIiwgaW5wdXQpOworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXQ7CisJfQorCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX3RhZyglcyk6ICIKKwkJICJwaWQ9JXUgdGdpZD0ldSB1aWQ9JXUgZXVpZD0ldSBmc3VpZD0ldSAiCisJCSAiaW5fZ3JvdXA9JWQgaW5fZWdyb3VwPSVkXG4iLAorCQkgaW5wdXQsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF91aWQoKSwKKwkJIGN1cnJlbnRfZXVpZCgpLCBjdXJyZW50X2ZzdWlkKCksCisJCSBpbl9ncm91cF9wKHByb2NfY3RybF93cml0ZV9naWQpLAorCQkgaW5fZWdyb3VwX3AocHJvY19jdHJsX3dyaXRlX2dpZCkpOworCWlmIChhcmdjIDwgNCkgeworCQl1aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJfSBlbHNlIGlmICghY2FuX2ltcGVyc29uYXRlX3VpZCh1aWQpKSB7CisJCXByX2luZm8oInF0YWd1aWQ6IGN0cmxfdGFnKCVzKTogIgorCQkJImluc3VmZmljaWVudCBwcml2IGZyb20gcGlkPSV1IHRnaWQ9JXUgdWlkPSV1XG4iLAorCQkJaW5wdXQsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpKTsKKwkJcmVzID0gLUVQRVJNOworCQlnb3RvIGVycl9wdXQ7CisJfQorCWZ1bGxfdGFnID0gY29tYmluZV9hdGFnX3dpdGhfdWlkKGFjY3RfdGFnLCB1aWQpOworCisJc3Bpbl9sb2NrX2JoKCZzb2NrX3RhZ19saXN0X2xvY2spOworCXNvY2tfdGFnX2VudHJ5ID0gZ2V0X3NvY2tfc3RhdF9ubChlbF9zb2NrZXQtPnNrKTsKKwl0YWdfcmVmX2VudHJ5ID0gZ2V0X3RhZ19yZWYoZnVsbF90YWcsICZ1aWRfdGFnX2RhdGFfZW50cnkpOworCWlmIChJU19FUlIodGFnX3JlZl9lbnRyeSkpIHsKKwkJcmVzID0gUFRSX0VSUih0YWdfcmVmX2VudHJ5KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJCWdvdG8gZXJyX3B1dDsKKwl9CisJdGFnX3JlZl9lbnRyeS0+bnVtX3NvY2tfdGFncysrOworCWlmIChzb2NrX3RhZ19lbnRyeSkgeworCQlzdHJ1Y3QgdGFnX3JlZiAqcHJldl90YWdfcmVmX2VudHJ5OworCisJCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX3RhZyglcyk6IHJldGFnIGZvciBzaz0lcCAiCisJCQkgInN0QCVwIC4uLi0+Zl9jb3VudD0lbGRcbiIsCisJCQkgaW5wdXQsIGVsX3NvY2tldC0+c2ssIHNvY2tfdGFnX2VudHJ5LAorCQkJIGF0b21pY19sb25nX3JlYWQoJmVsX3NvY2tldC0+ZmlsZS0+Zl9jb3VudCkpOworCQkvKgorCQkgKiBUaGlzIGlzIGEgcmUtdGFnZ2luZywgc28gcmVsZWFzZSB0aGUgc29ja19mZCB0aGF0IHdhcworCQkgKiBsb2NrZWQgYXQgdGhlIHRpbWUgb2YgdGhlIDFzdCB0YWdnaW5nLgorCQkgKiBUaGVyZSBpcyBzdGlsbCB0aGUgcmVmIGZyb20gdGhpcyBjYWxsJ3Mgc29ja2ZkX2xvb2t1cCgpIHNvCisJCSAqIGl0IGNhbiBiZSBkb25lIHdpdGhpbiB0aGUgc3BpbmxvY2suCisJCSAqLworCQlzb2NrZmRfcHV0KHNvY2tfdGFnX2VudHJ5LT5zb2NrZXQpOworCQlwcmV2X3RhZ19yZWZfZW50cnkgPSBsb29rdXBfdGFnX3JlZihzb2NrX3RhZ19lbnRyeS0+dGFnLAorCQkJCQkJICAgICZ1aWRfdGFnX2RhdGFfZW50cnkpOworCQlCVUdfT04oSVNfRVJSX09SX05VTEwocHJldl90YWdfcmVmX2VudHJ5KSk7CisJCUJVR19PTihwcmV2X3RhZ19yZWZfZW50cnktPm51bV9zb2NrX3RhZ3MgPD0gMCk7CisJCXByZXZfdGFnX3JlZl9lbnRyeS0+bnVtX3NvY2tfdGFncy0tOworCQlzb2NrX3RhZ19lbnRyeS0+dGFnID0gZnVsbF90YWc7CisJfSBlbHNlIHsKKwkJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfdGFnKCVzKTogbmV3dGFnIGZvciBzaz0lcFxuIiwKKwkJCSBpbnB1dCwgZWxfc29ja2V0LT5zayk7CisJCXNvY2tfdGFnX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKnNvY2tfdGFnX2VudHJ5KSwKKwkJCQkJIEdGUF9BVE9NSUMpOworCQlpZiAoIXNvY2tfdGFnX2VudHJ5KSB7CisJCQlwcl9lcnIoInF0YWd1aWQ6IGN0cmxfdGFnKCVzKTogIgorCQkJICAgICAgICJzb2NrZXQgdGFnIGFsbG9jIGZhaWxlZFxuIiwKKwkJCSAgICAgICBpbnB1dCk7CisJCQlzcGluX3VubG9ja19iaCgmc29ja190YWdfbGlzdF9sb2NrKTsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIGVycl90YWdfdW5yZWZfcHV0OworCQl9CisJCXNvY2tfdGFnX2VudHJ5LT5zayA9IGVsX3NvY2tldC0+c2s7CisJCXNvY2tfdGFnX2VudHJ5LT5zb2NrZXQgPSBlbF9zb2NrZXQ7CisJCXNvY2tfdGFnX2VudHJ5LT5waWQgPSBjdXJyZW50LT50Z2lkOworCQlzb2NrX3RhZ19lbnRyeS0+dGFnID0gY29tYmluZV9hdGFnX3dpdGhfdWlkKGFjY3RfdGFnLAorCQkJCQkJCSAgICB1aWQpOworCQlzcGluX2xvY2tfYmgoJnVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCQlwcWRfZW50cnkgPSBwcm9jX3F0dV9kYXRhX3RyZWVfc2VhcmNoKAorCQkJJnByb2NfcXR1X2RhdGFfdHJlZSwgY3VycmVudC0+dGdpZCk7CisJCS8qCisJCSAqIFRPRE86IHJlbW92ZSBpZiwgYW5kIHN0YXJ0IGZhaWxpbmcuCisJCSAqIEF0IGZpcnN0LCB3ZSB3YW50IHRvIGNhdGNoIHVzZXItc3BhY2UgY29kZSB0aGF0IGlzIG5vdAorCQkgKiBvcGVuaW5nIHRoZSAvZGV2L3h0X3F0YWd1aWQuCisJCSAqLworCQlpZiAoSVNfRVJSX09SX05VTEwocHFkX2VudHJ5KSkKKwkJCXByX3dhcm5fb25jZSgKKwkJCQkicXRhZ3VpZDogJXMoKTogIgorCQkJCSJVc2VyIHNwYWNlIGZvcmdvdCB0byBvcGVuIC9kZXYveHRfcXRhZ3VpZD8gIgorCQkJCSJwaWQ9JXUgdGdpZD0ldSB1aWQ9JXVcbiIsIF9fZnVuY19fLAorCQkJCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwKKwkJCQljdXJyZW50X2ZzdWlkKCkpOworCQllbHNlCisJCQlsaXN0X2FkZCgmc29ja190YWdfZW50cnktPmxpc3QsCisJCQkJICZwcWRfZW50cnktPnNvY2tfdGFnX2xpc3QpOworCQlzcGluX3VubG9ja19iaCgmdWlkX3RhZ19kYXRhX3RyZWVfbG9jayk7CisKKwkJc29ja190YWdfdHJlZV9pbnNlcnQoc29ja190YWdfZW50cnksICZzb2NrX3RhZ190cmVlKTsKKwkJYXRvbWljNjRfaW5jKCZxdHVfZXZlbnRzLnNvY2tldHNfdGFnZ2VkKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJLyogV2Uga2VlcCB0aGUgcmVmIHRvIHRoZSBzb2NrZXQgKGZpbGUpIHVudGlsIGl0IGlzIHVudGFnZ2VkICovCisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfdGFnKCVzKTogZG9uZSBzdEAlcCAuLi4tPmZfY291bnQ9JWxkXG4iLAorCQkgaW5wdXQsIHNvY2tfdGFnX2VudHJ5LAorCQkgYXRvbWljX2xvbmdfcmVhZCgmZWxfc29ja2V0LT5maWxlLT5mX2NvdW50KSk7CisJcmV0dXJuIDA7CisKK2Vycl90YWdfdW5yZWZfcHV0OgorCUJVR19PTih0YWdfcmVmX2VudHJ5LT5udW1fc29ja190YWdzIDw9IDApOworCXRhZ19yZWZfZW50cnktPm51bV9zb2NrX3RhZ3MtLTsKKwlmcmVlX3RhZ19yZWZfZnJvbV91dGRfZW50cnkodGFnX3JlZl9lbnRyeSwgdWlkX3RhZ19kYXRhX2VudHJ5KTsKK2Vycl9wdXQ6CisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfdGFnKCVzKTogZG9uZS4gLi4uLT5mX2NvdW50PSVsZFxuIiwKKwkJIGlucHV0LCBhdG9taWNfbG9uZ19yZWFkKCZlbF9zb2NrZXQtPmZpbGUtPmZfY291bnQpIC0gMSk7CisJLyogUmVsZWFzZSB0aGUgc29ja19mZCB0aGF0IHdhcyBncmFiYmVkIGJ5IHNvY2tmZF9sb29rdXAoKS4gKi8KKwlzb2NrZmRfcHV0KGVsX3NvY2tldCk7CisJcmV0dXJuIHJlczsKKworZXJyOgorCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX3RhZyglcyk6IGRvbmUuXG4iLCBpbnB1dCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBjdHJsX2NtZF91bnRhZyhjb25zdCBjaGFyICppbnB1dCkKK3sKKwljaGFyIGNtZDsKKwlpbnQgc29ja19mZCA9IDA7CisJc3RydWN0IHNvY2tldCAqZWxfc29ja2V0OworCWludCByZXMsIGFyZ2M7CisJc3RydWN0IHNvY2tfdGFnICpzb2NrX3RhZ19lbnRyeTsKKwlzdHJ1Y3QgdGFnX3JlZiAqdGFnX3JlZl9lbnRyeTsKKwlzdHJ1Y3QgdWlkX3RhZ19kYXRhICp1dGRfZW50cnk7CisJc3RydWN0IHByb2NfcXR1X2RhdGEgKnBxZF9lbnRyeTsKKworCWFyZ2MgPSBzc2NhbmYoaW5wdXQsICIlYyAlZCIsICZjbWQsICZzb2NrX2ZkKTsKKwlDVF9ERUJVRygicXRhZ3VpZDogY3RybF91bnRhZyglcyk6IGFyZ2M9JWQgY21kPSVjIHNvY2tfZmQ9JWRcbiIsCisJCSBpbnB1dCwgYXJnYywgY21kLCBzb2NrX2ZkKTsKKwlpZiAoYXJnYyA8IDIpIHsKKwkJcmVzID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCWVsX3NvY2tldCA9IHNvY2tmZF9sb29rdXAoc29ja19mZCwgJnJlcyk7ICAvKiBUaGlzIGxvY2tzIHRoZSBmaWxlICovCisJaWYgKCFlbF9zb2NrZXQpIHsKKwkJcHJfaW5mbygicXRhZ3VpZDogY3RybF91bnRhZyglcyk6IGZhaWxlZCB0byBsb29rdXAiCisJCQkiIHNvY2tfZmQ9JWQgZXJyPSVkIHBpZD0ldSB0Z2lkPSV1IHVpZD0ldVxuIiwKKwkJCWlucHV0LCBzb2NrX2ZkLCByZXMsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwKKwkJCWN1cnJlbnRfZnN1aWQoKSk7CisJCWdvdG8gZXJyOworCX0KKwlDVF9ERUJVRygicXRhZ3VpZDogY3RybF91bnRhZyglcyk6IHNvY2tldC0+Li4uLT5mX2NvdW50PSVsZCAtPnNrPSVwXG4iLAorCQkgaW5wdXQsIGF0b21pY19sb25nX3JlYWQoJmVsX3NvY2tldC0+ZmlsZS0+Zl9jb3VudCksCisJCSBlbF9zb2NrZXQtPnNrKTsKKwlzcGluX2xvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJc29ja190YWdfZW50cnkgPSBnZXRfc29ja19zdGF0X25sKGVsX3NvY2tldC0+c2spOworCWlmICghc29ja190YWdfZW50cnkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisJCXJlcyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dDsKKwl9CisJLyoKKwkgKiBUaGUgc29ja2V0IGFscmVhZHkgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzCisJICogc28gaXQgY2FuIGRvIHdoYXRldmVyIGl0IHdhbnRzIHRvIGl0LgorCSAqLworCXJiX2VyYXNlKCZzb2NrX3RhZ19lbnRyeS0+c29ja19ub2RlLCAmc29ja190YWdfdHJlZSk7CisKKwl0YWdfcmVmX2VudHJ5ID0gbG9va3VwX3RhZ19yZWYoc29ja190YWdfZW50cnktPnRhZywgJnV0ZF9lbnRyeSk7CisJQlVHX09OKCF0YWdfcmVmX2VudHJ5KTsKKwlCVUdfT04odGFnX3JlZl9lbnRyeS0+bnVtX3NvY2tfdGFncyA8PSAwKTsKKwlzcGluX2xvY2tfYmgoJnVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCXBxZF9lbnRyeSA9IHByb2NfcXR1X2RhdGFfdHJlZV9zZWFyY2goCisJCSZwcm9jX3F0dV9kYXRhX3RyZWUsIGN1cnJlbnQtPnRnaWQpOworCS8qCisJICogVE9ETzogcmVtb3ZlIGlmLCBhbmQgc3RhcnQgZmFpbGluZy4KKwkgKiBBdCBmaXJzdCwgd2Ugd2FudCB0byBjYXRjaCB1c2VyLXNwYWNlIGNvZGUgdGhhdCBpcyBub3QKKwkgKiBvcGVuaW5nIHRoZSAvZGV2L3h0X3F0YWd1aWQuCisJICovCisJaWYgKElTX0VSUl9PUl9OVUxMKHBxZF9lbnRyeSkpCisJCXByX3dhcm5fb25jZSgicXRhZ3VpZDogJXMoKTogIgorCQkJICAgICAiVXNlciBzcGFjZSBmb3Jnb3QgdG8gb3BlbiAvZGV2L3h0X3F0YWd1aWQ/ICIKKwkJCSAgICAgInBpZD0ldSB0Z2lkPSV1IHVpZD0ldVxuIiwgX19mdW5jX18sCisJCQkgICAgIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpKTsKKwllbHNlCisJCWxpc3RfZGVsKCZzb2NrX3RhZ19lbnRyeS0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCS8qCisJICogV2UgZG9uJ3QgZnJlZSB0YWdfcmVmIGZyb20gdGhlIHV0ZF9lbnRyeSBoZXJlLAorCSAqIG9ubHkgZHVyaW5nIGEgY21kX2RlbGV0ZSgpLgorCSAqLworCXRhZ19yZWZfZW50cnktPm51bV9zb2NrX3RhZ3MtLTsKKwlzcGluX3VubG9ja19iaCgmc29ja190YWdfbGlzdF9sb2NrKTsKKwkvKgorCSAqIFJlbGVhc2UgdGhlIHNvY2tfZmQgdGhhdCB3YXMgZ3JhYmJlZCBhdCB0YWcgdGltZSwKKwkgKiBhbmQgb25jZSBtb3JlIGZvciB0aGUgc29ja2ZkX2xvb2t1cCgpIGhlcmUuCisJICovCisJc29ja2ZkX3B1dChzb2NrX3RhZ19lbnRyeS0+c29ja2V0KTsKKwlDVF9ERUJVRygicXRhZ3VpZDogY3RybF91bnRhZyglcyk6IGRvbmUuIHN0QCVwIC4uLi0+Zl9jb3VudD0lbGRcbiIsCisJCSBpbnB1dCwgc29ja190YWdfZW50cnksCisJCSBhdG9taWNfbG9uZ19yZWFkKCZlbF9zb2NrZXQtPmZpbGUtPmZfY291bnQpIC0gMSk7CisJc29ja2ZkX3B1dChlbF9zb2NrZXQpOworCisJa2ZyZWUoc29ja190YWdfZW50cnkpOworCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5zb2NrZXRzX3VudGFnZ2VkKTsKKworCXJldHVybiAwOworCitlcnJfcHV0OgorCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsX3VudGFnKCVzKTogZG9uZS4gc29ja2V0LT4uLi4tPmZfY291bnQ9JWxkXG4iLAorCQkgaW5wdXQsIGF0b21pY19sb25nX3JlYWQoJmVsX3NvY2tldC0+ZmlsZS0+Zl9jb3VudCkgLSAxKTsKKwkvKiBSZWxlYXNlIHRoZSBzb2NrX2ZkIHRoYXQgd2FzIGdyYWJiZWQgYnkgc29ja2ZkX2xvb2t1cCgpLiAqLworCXNvY2tmZF9wdXQoZWxfc29ja2V0KTsKKwlyZXR1cm4gcmVzOworCitlcnI6CisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmxfdW50YWcoJXMpOiBkb25lLlxuIiwgaW5wdXQpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgcXRhZ3VpZF9jdHJsX3BhcnNlKGNvbnN0IGNoYXIgKmlucHV0LCBpbnQgY291bnQpCit7CisJY2hhciBjbWQ7CisJaW50IHJlczsKKworCUNUX0RFQlVHKCJxdGFndWlkOiBjdHJsKCVzKTogcGlkPSV1IHRnaWQ9JXUgdWlkPSV1XG4iLAorCQkgaW5wdXQsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpKTsKKworCWNtZCA9IGlucHV0WzBdOworCS8qIENvbGxlY3QgcGFyYW1zIGZvciBjb21tYW5kcyAqLworCXN3aXRjaCAoY21kKSB7CisJY2FzZSAnZCc6CisJCXJlcyA9IGN0cmxfY21kX2RlbGV0ZShpbnB1dCk7CisJCWJyZWFrOworCisJY2FzZSAncyc6CisJCXJlcyA9IGN0cmxfY21kX2NvdW50ZXJfc2V0KGlucHV0KTsKKwkJYnJlYWs7CisKKwljYXNlICd0JzoKKwkJcmVzID0gY3RybF9jbWRfdGFnKGlucHV0KTsKKwkJYnJlYWs7CisKKwljYXNlICd1JzoKKwkJcmVzID0gY3RybF9jbWRfdW50YWcoaW5wdXQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlcyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIXJlcykKKwkJcmVzID0gY291bnQ7CitlcnI6CisJQ1RfREVCVUcoInF0YWd1aWQ6IGN0cmwoJXMpOiByZXM9JWRcbiIsIGlucHV0LCByZXMpOworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgTUFYX1FUQUdVSURfQ1RSTF9JTlBVVF9MRU4gMjU1CitzdGF0aWMgaW50IHF0YWd1aWRfY3RybF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGlucHV0X2J1ZltNQVhfUVRBR1VJRF9DVFJMX0lOUFVUX0xFTl07CisKKwlpZiAodW5saWtlbHkobW9kdWxlX3Bhc3NpdmUpKQorCQlyZXR1cm4gY291bnQ7CisKKwlpZiAoY291bnQgPj0gTUFYX1FUQUdVSURfQ1RSTF9JTlBVVF9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGlucHV0X2J1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5wdXRfYnVmW2NvdW50XSA9ICdcMCc7CisJcmV0dXJuIHF0YWd1aWRfY3RybF9wYXJzZShpbnB1dF9idWYsIGNvdW50KTsKK30KKworc3RydWN0IHByb2NfcHJpbnRfaW5mbyB7CisJY2hhciAqb3V0cDsKKwljaGFyICoqbnVtX2l0ZW1zX3JldHVybmVkOworCXN0cnVjdCBpZmFjZV9zdGF0ICppZmFjZV9lbnRyeTsKKwlzdHJ1Y3QgdGFnX3N0YXQgKnRzX2VudHJ5OworCWludCBpdGVtX2luZGV4OworCWludCBpdGVtc190b19za2lwOworCWludCBjaGFyX2NvdW50OworfTsKKworc3RhdGljIGludCBwcF9zdGF0c19saW5lKHN0cnVjdCBwcm9jX3ByaW50X2luZm8gKnBwaSwgaW50IGNudF9zZXQpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgZGF0YV9jb3VudGVycyAqY250czsKKworCWlmICghcHBpLT5pdGVtX2luZGV4KSB7CisJCWlmIChwcGktPml0ZW1faW5kZXgrKyA8IHBwaS0+aXRlbXNfdG9fc2tpcCkKKwkJCXJldHVybiAwOworCQlsZW4gPSBzbnByaW50ZihwcGktPm91dHAsIHBwaS0+Y2hhcl9jb3VudCwKKwkJCSAgICAgICAiaWR4IGlmYWNlIGFjY3RfdGFnX2hleCB1aWRfdGFnX2ludCBjbnRfc2V0ICIKKwkJCSAgICAgICAicnhfYnl0ZXMgcnhfcGFja2V0cyAiCisJCQkgICAgICAgInR4X2J5dGVzIHR4X3BhY2tldHMgIgorCQkJICAgICAgICJyeF90Y3BfYnl0ZXMgcnhfdGNwX3BhY2tldHMgIgorCQkJICAgICAgICJyeF91ZHBfYnl0ZXMgcnhfdWRwX3BhY2tldHMgIgorCQkJICAgICAgICJyeF9vdGhlcl9ieXRlcyByeF9vdGhlcl9wYWNrZXRzICIKKwkJCSAgICAgICAidHhfdGNwX2J5dGVzIHR4X3RjcF9wYWNrZXRzICIKKwkJCSAgICAgICAidHhfdWRwX2J5dGVzIHR4X3VkcF9wYWNrZXRzICIKKwkJCSAgICAgICAidHhfb3RoZXJfYnl0ZXMgdHhfb3RoZXJfcGFja2V0c1xuIik7CisJfSBlbHNlIHsKKwkJdGFnX3QgdGFnID0gcHBpLT50c19lbnRyeS0+dG4udGFnOworCQl1aWRfdCBzdGF0X3VpZCA9IGdldF91aWRfZnJvbV90YWcodGFnKTsKKworCQlpZiAoIWNhbl9yZWFkX290aGVyX3VpZF9zdGF0cyhzdGF0X3VpZCkpIHsKKwkJCUNUX0RFQlVHKCJxdGFndWlkOiBzdGF0cyBsaW5lOiAiCisJCQkJICIlcyAweCVsbHggJXU6IGluc3VmZmljaWVudCBwcml2ICIKKwkJCQkgImZyb20gcGlkPSV1IHRnaWQ9JXUgdWlkPSV1XG4iLAorCQkJCSBwcGktPmlmYWNlX2VudHJ5LT5pZm5hbWUsCisJCQkJIGdldF9hdGFnX2Zyb21fdGFnKHRhZyksIHN0YXRfdWlkLAorCQkJCSBjdXJyZW50LT5waWQsIGN1cnJlbnQtPnRnaWQsIGN1cnJlbnRfZnN1aWQoKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAocHBpLT5pdGVtX2luZGV4KysgPCBwcGktPml0ZW1zX3RvX3NraXApCisJCQlyZXR1cm4gMDsKKwkJY250cyA9ICZwcGktPnRzX2VudHJ5LT5jb3VudGVyczsKKwkJbGVuID0gc25wcmludGYoCisJCQlwcGktPm91dHAsIHBwaS0+Y2hhcl9jb3VudCwKKwkJCSIlZCAlcyAweCVsbHggJXUgJXUgIgorCQkJIiVsbHUgJWxsdSAiCisJCQkiJWxsdSAlbGx1ICIKKwkJCSIlbGx1ICVsbHUgIgorCQkJIiVsbHUgJWxsdSAiCisJCQkiJWxsdSAlbGx1ICIKKwkJCSIlbGx1ICVsbHUgIgorCQkJIiVsbHUgJWxsdSAiCisJCQkiJWxsdSAlbGx1XG4iLAorCQkJcHBpLT5pdGVtX2luZGV4LAorCQkJcHBpLT5pZmFjZV9lbnRyeS0+aWZuYW1lLAorCQkJZ2V0X2F0YWdfZnJvbV90YWcodGFnKSwKKwkJCXN0YXRfdWlkLAorCQkJY250X3NldCwKKwkJCWRjX3N1bV9ieXRlcyhjbnRzLCBjbnRfc2V0LCBJRlNfUlgpLAorCQkJZGNfc3VtX3BhY2tldHMoY250cywgY250X3NldCwgSUZTX1JYKSwKKwkJCWRjX3N1bV9ieXRlcyhjbnRzLCBjbnRfc2V0LCBJRlNfVFgpLAorCQkJZGNfc3VtX3BhY2tldHMoY250cywgY250X3NldCwgSUZTX1RYKSwKKwkJCWNudHMtPmJwY1tjbnRfc2V0XVtJRlNfUlhdW0lGU19UQ1BdLmJ5dGVzLAorCQkJY250cy0+YnBjW2NudF9zZXRdW0lGU19SWF1bSUZTX1RDUF0ucGFja2V0cywKKwkJCWNudHMtPmJwY1tjbnRfc2V0XVtJRlNfUlhdW0lGU19VRFBdLmJ5dGVzLAorCQkJY250cy0+YnBjW2NudF9zZXRdW0lGU19SWF1bSUZTX1VEUF0ucGFja2V0cywKKwkJCWNudHMtPmJwY1tjbnRfc2V0XVtJRlNfUlhdW0lGU19QUk9UT19PVEhFUl0uYnl0ZXMsCisJCQljbnRzLT5icGNbY250X3NldF1bSUZTX1JYXVtJRlNfUFJPVE9fT1RIRVJdLnBhY2tldHMsCisJCQljbnRzLT5icGNbY250X3NldF1bSUZTX1RYXVtJRlNfVENQXS5ieXRlcywKKwkJCWNudHMtPmJwY1tjbnRfc2V0XVtJRlNfVFhdW0lGU19UQ1BdLnBhY2tldHMsCisJCQljbnRzLT5icGNbY250X3NldF1bSUZTX1RYXVtJRlNfVURQXS5ieXRlcywKKwkJCWNudHMtPmJwY1tjbnRfc2V0XVtJRlNfVFhdW0lGU19VRFBdLnBhY2tldHMsCisJCQljbnRzLT5icGNbY250X3NldF1bSUZTX1RYXVtJRlNfUFJPVE9fT1RIRVJdLmJ5dGVzLAorCQkJY250cy0+YnBjW2NudF9zZXRdW0lGU19UWF1bSUZTX1BST1RPX09USEVSXS5wYWNrZXRzKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGJvb2wgcHBfc2V0cyhzdHJ1Y3QgcHJvY19wcmludF9pbmZvICpwcGkpCit7CisJaW50IGxlbjsKKwlpbnQgY291bnRlcl9zZXQ7CisJZm9yIChjb3VudGVyX3NldCA9IDA7IGNvdW50ZXJfc2V0IDwgSUZTX01BWF9DT1VOVEVSX1NFVFM7CisJICAgICBjb3VudGVyX3NldCsrKSB7CisJCWxlbiA9IHBwX3N0YXRzX2xpbmUocHBpLCBjb3VudGVyX3NldCk7CisJCWlmIChsZW4gPj0gcHBpLT5jaGFyX2NvdW50KSB7CisJCQkqcHBpLT5vdXRwID0gJ1wwJzsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAobGVuKSB7CisJCQlwcGktPm91dHAgKz0gbGVuOworCQkJcHBpLT5jaGFyX2NvdW50IC09IGxlbjsKKwkJCSgqcHBpLT5udW1faXRlbXNfcmV0dXJuZWQpKys7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQcm9jZnMgcmVhZGVyIHRvIGdldCBhbGwgdGFnIHN0YXRzIHVzaW5nIHN0eWxlICIxKSIgYXMgZGVzY3JpYmVkIGluCisgKiBmcy9wcm9jL2dlbmVyaWMuYworICogR3JvdXBzIGFsbCBwcm90b2NvbHMgdHgvcnggYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQgcXRhZ3VpZF9zdGF0c19wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKm51bV9pdGVtc19yZXR1cm5lZCwKKwkJCQlvZmZfdCBpdGVtc190b19za2lwLCBpbnQgY2hhcl9jb3VudCwgaW50ICplb2YsCisJCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19wcmludF9pbmZvIHBwaTsKKwlpbnQgbGVuOworCisJcHBpLm91dHAgPSBwYWdlOworCXBwaS5pdGVtX2luZGV4ID0gMDsKKwlwcGkuY2hhcl9jb3VudCA9IGNoYXJfY291bnQ7CisJcHBpLm51bV9pdGVtc19yZXR1cm5lZCA9IG51bV9pdGVtc19yZXR1cm5lZDsKKwlwcGkuaXRlbXNfdG9fc2tpcCA9IGl0ZW1zX3RvX3NraXA7CisKKwlpZiAodW5saWtlbHkobW9kdWxlX3Bhc3NpdmUpKSB7CisJCWxlbiA9IHBwX3N0YXRzX2xpbmUoJnBwaSwgMCk7CisJCS8qIFRoZSBoZWFkZXIgc2hvdWxkIGFsd2F5cyBiZSBzaG9ydGVyIHRoYW4gdGhlIGJ1ZmZlci4gKi8KKwkJQlVHX09OKGxlbiA+PSBwcGkuY2hhcl9jb3VudCk7CisJCSgqbnVtX2l0ZW1zX3JldHVybmVkKSsrOworCQkqZW9mID0gMTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlDVF9ERUJVRygicXRhZ3VpZDpwcm9jIHN0YXRzIHBpZD0ldSB0Z2lkPSV1IHVpZD0ldSAiCisJCSAicGFnZT0lcCAqbnVtX2l0ZW1zX3JldHVybmVkPSVwIG9mZj0lbGQgIgorCQkgImNoYXJfY291bnQ9JWQgKmVvZj0lZFxuIiwKKwkJIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpLAorCQkgcGFnZSwgKm51bV9pdGVtc19yZXR1cm5lZCwKKwkJIGl0ZW1zX3RvX3NraXAsIGNoYXJfY291bnQsICplb2YpOworCisJaWYgKCplb2YpCisJCXJldHVybiAwOworCisJLyogVGhlIGlkeCBpcyB0aGVyZSB0byBoZWxwIGRlYnVnIHdoZW4gdGhpbmdzIGdvIGJlbGx5IHVwLiAqLworCWxlbiA9IHBwX3N0YXRzX2xpbmUoJnBwaSwgMCk7CisJLyogRG9uJ3QgYWR2YW5jZSB0aGUgb3V0cCB1bmxlc3MgdGhlIHdob2xlIGxpbmUgd2FzIHByaW50ZWQgKi8KKwlpZiAobGVuID49IHBwaS5jaGFyX2NvdW50KSB7CisJCSpwcGkub3V0cCA9ICdcMCc7CisJCXJldHVybiBwcGkub3V0cCAtIHBhZ2U7CisJfQorCWlmIChsZW4pIHsKKwkJcHBpLm91dHAgKz0gbGVuOworCQlwcGkuY2hhcl9jb3VudCAtPSBsZW47CisJCSgqbnVtX2l0ZW1zX3JldHVybmVkKSsrOworCX0KKworCXNwaW5fbG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHBpLmlmYWNlX2VudHJ5LCAmaWZhY2Vfc3RhdF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCByYl9ub2RlICpub2RlOworCQlzcGluX2xvY2tfYmgoJnBwaS5pZmFjZV9lbnRyeS0+dGFnX3N0YXRfbGlzdF9sb2NrKTsKKwkJZm9yIChub2RlID0gcmJfZmlyc3QoJnBwaS5pZmFjZV9lbnRyeS0+dGFnX3N0YXRfdHJlZSk7CisJCSAgICAgbm9kZTsKKwkJICAgICBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQkJcHBpLnRzX2VudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRhZ19zdGF0LCB0bi5ub2RlKTsKKwkJCWlmICghcHBfc2V0cygmcHBpKSkgeworCQkJCXNwaW5fdW5sb2NrX2JoKAorCQkJCQkmcHBpLmlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2spOworCQkJCXNwaW5fdW5sb2NrX2JoKCZpZmFjZV9zdGF0X2xpc3RfbG9jayk7CisJCQkJcmV0dXJuIHBwaS5vdXRwIC0gcGFnZTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19iaCgmcHBpLmlmYWNlX2VudHJ5LT50YWdfc3RhdF9saXN0X2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmaWZhY2Vfc3RhdF9saXN0X2xvY2spOworCisJKmVvZiA9IDE7CisJcmV0dXJuIHBwaS5vdXRwIC0gcGFnZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBxdHVkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdWlkX3RhZ19kYXRhICp1dGRfZW50cnk7CisJc3RydWN0IHByb2NfcXR1X2RhdGEgICpwcWRfZW50cnk7CisJc3RydWN0IHByb2NfcXR1X2RhdGEgICpuZXdfcHFkX2VudHJ5OworCWludCByZXM7CisJYm9vbCB1dGRfZW50cnlfZm91bmQ7CisKKwlpZiAodW5saWtlbHkocXR1X3Byb2NfaGFuZGxpbmdfcGFzc2l2ZSkpCisJCXJldHVybiAwOworCisJRFJfREVCVUcoInF0YWd1aWQ6IHF0dWRldl9vcGVuKCk6IHBpZD0ldSB0Z2lkPSV1IHVpZD0ldVxuIiwKKwkJIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpKTsKKworCXNwaW5fbG9ja19iaCgmdWlkX3RhZ19kYXRhX3RyZWVfbG9jayk7CisKKwkvKiBMb29rIGZvciBleGlzdGluZyB1aWQgZGF0YSwgb3IgYWxsb2Mgb25lLiAqLworCXV0ZF9lbnRyeSA9IGdldF91aWRfZGF0YShjdXJyZW50X2ZzdWlkKCksICZ1dGRfZW50cnlfZm91bmQpOworCWlmIChJU19FUlJfT1JfTlVMTCh1dGRfZW50cnkpKSB7CisJCXJlcyA9IFBUUl9FUlIodXRkX2VudHJ5KTsKKwkJZ290byBlcnI7CisJfQorCisJLyogTG9vayBmb3IgZXhpc3RpbmcgUElEIGJhc2VkIHByb2NfZGF0YSAqLworCXBxZF9lbnRyeSA9IHByb2NfcXR1X2RhdGFfdHJlZV9zZWFyY2goJnByb2NfcXR1X2RhdGFfdHJlZSwKKwkJCQkJICAgICAgY3VycmVudC0+dGdpZCk7CisJaWYgKHBxZF9lbnRyeSkgeworCQlwcl9lcnIoInF0YWd1aWQ6IHF0dWRldl9vcGVuKCk6ICV1LyV1ICV1ICIKKwkJICAgICAgICIlcyBhbHJlYWR5IG9wZW5lZFxuIiwKKwkJICAgICAgIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dGdpZCwgY3VycmVudF9mc3VpZCgpLAorCQkgICAgICAgUVRVX0RFVl9OQU1FKTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGVycl91bmxvY2tfZnJlZV91dGQ7CisJfQorCisJbmV3X3BxZF9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfcHFkX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFuZXdfcHFkX2VudHJ5KSB7CisJCXByX2VycigicXRhZ3VpZDogcXR1ZGV2X29wZW4oKTogJXUvJXUgJXU6ICIKKwkJICAgICAgICJwcm9jIGRhdGEgYWxsb2MgZmFpbGVkXG4iLAorCQkgICAgICAgY3VycmVudC0+cGlkLCBjdXJyZW50LT50Z2lkLCBjdXJyZW50X2ZzdWlkKCkpOworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmxvY2tfZnJlZV91dGQ7CisJfQorCW5ld19wcWRfZW50cnktPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJSU5JVF9MSVNUX0hFQUQoJm5ld19wcWRfZW50cnktPnNvY2tfdGFnX2xpc3QpOworCW5ld19wcWRfZW50cnktPnBhcmVudF90YWdfZGF0YSA9IHV0ZF9lbnRyeTsKKwl1dGRfZW50cnktPm51bV9wcWQrKzsKKworCXByb2NfcXR1X2RhdGFfdHJlZV9pbnNlcnQobmV3X3BxZF9lbnRyeSwKKwkJCQkgICZwcm9jX3F0dV9kYXRhX3RyZWUpOworCisJc3Bpbl91bmxvY2tfYmgoJnVpZF90YWdfZGF0YV90cmVlX2xvY2spOworCURSX0RFQlVHKCJxdGFndWlkOiB0cmFja2luZyBkYXRhIGZvciB1aWQ9JXUgaW4gcHFkPSVwXG4iLAorCQkgY3VycmVudF9mc3VpZCgpLCBuZXdfcHFkX2VudHJ5KTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBuZXdfcHFkX2VudHJ5OworCXJldHVybiAwOworCitlcnJfdW5sb2NrX2ZyZWVfdXRkOgorCWlmICghdXRkX2VudHJ5X2ZvdW5kKSB7CisJCXJiX2VyYXNlKCZ1dGRfZW50cnktPm5vZGUsICZ1aWRfdGFnX2RhdGFfdHJlZSk7CisJCWtmcmVlKHV0ZF9lbnRyeSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ1aWRfdGFnX2RhdGFfdHJlZV9sb2NrKTsKK2VycjoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHF0dWRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcm9jX3F0dV9kYXRhICAqcHFkX2VudHJ5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1aWRfdGFnX2RhdGEgICp1dGRfZW50cnkgPSBwcWRfZW50cnktPnBhcmVudF90YWdfZGF0YTsKKwlzdHJ1Y3Qgc29ja190YWcgKnN0X2VudHJ5OworCXN0cnVjdCByYl9yb290IHN0X3RvX2ZyZWVfdHJlZSA9IFJCX1JPT1Q7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpuZXh0OworCXN0cnVjdCB0YWdfcmVmICp0cjsKKworCWlmICh1bmxpa2VseShxdHVfcHJvY19oYW5kbGluZ19wYXNzaXZlKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERvIG5vdCB0cnVzdCB0aGUgY3VycmVudC0+cGlkLCBpdCBtaWdodCBqdXN0IGJlIGEga3dvcmtlciBjbGVhbmluZworCSAqIHVwIGFmdGVyIGEgZGVhZCBwcm9jLgorCSAqLworCURSX0RFQlVHKCJxdGFndWlkOiBxdHVkZXZfcmVsZWFzZSgpOiAiCisJCSAicGlkPSV1IHRnaWQ9JXUgdWlkPSV1ICIKKwkJICJwcWRfZW50cnk9JXAtPnBpZD0ldSB1dGRfZW50cnk9JXAtPmFjdGl2ZV90YWdzPSVkXG4iLAorCQkgY3VycmVudC0+cGlkLCBjdXJyZW50LT50Z2lkLCBwcWRfZW50cnktPnBhcmVudF90YWdfZGF0YS0+dWlkLAorCQkgcHFkX2VudHJ5LCBwcWRfZW50cnktPnBpZCwgdXRkX2VudHJ5LAorCQkgdXRkX2VudHJ5LT5udW1fYWN0aXZlX3RhZ3MpOworCisJc3Bpbl9sb2NrX2JoKCZzb2NrX3RhZ19saXN0X2xvY2spOworCXNwaW5fbG9ja19iaCgmdWlkX3RhZ19kYXRhX3RyZWVfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIG5leHQsICZwcWRfZW50cnktPnNvY2tfdGFnX2xpc3QpIHsKKwkJc3RfZW50cnkgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgc29ja190YWcsIGxpc3QpOworCQlEUl9ERUJVRygicXRhZ3VpZDogJXMoKTogIgorCQkJICJlcmFzZSBzb2NrX3RhZz0lcC0+c2s9JXAgcGlkPSV1IHRnaWQ9JXUgdWlkPSV1XG4iLAorCQkJIF9fZnVuY19fLAorCQkJIHN0X2VudHJ5LCBzdF9lbnRyeS0+c2ssCisJCQkgY3VycmVudC0+cGlkLCBjdXJyZW50LT50Z2lkLAorCQkJIHBxZF9lbnRyeS0+cGFyZW50X3RhZ19kYXRhLT51aWQpOworCisJCXV0ZF9lbnRyeSA9IHVpZF90YWdfZGF0YV90cmVlX3NlYXJjaCgKKwkJCSZ1aWRfdGFnX2RhdGFfdHJlZSwKKwkJCWdldF91aWRfZnJvbV90YWcoc3RfZW50cnktPnRhZykpOworCQlCVUdfT04oSVNfRVJSX09SX05VTEwodXRkX2VudHJ5KSk7CisJCURSX0RFQlVHKCJxdGFndWlkOiAlcygpOiAiCisJCQkgImxvb2tpbmcgZm9yIHRhZz0weCVsbHggaW4gdXRkX2VudHJ5PSVwXG4iLCBfX2Z1bmNfXywKKwkJCSBzdF9lbnRyeS0+dGFnLCB1dGRfZW50cnkpOworCQl0ciA9IHRhZ19yZWZfdHJlZV9zZWFyY2goJnV0ZF9lbnRyeS0+dGFnX3JlZl90cmVlLAorCQkJCQkgc3RfZW50cnktPnRhZyk7CisJCUJVR19PTighdHIpOworCQlCVUdfT04odHItPm51bV9zb2NrX3RhZ3MgPD0gMCk7CisJCXRyLT5udW1fc29ja190YWdzLS07CisJCWZyZWVfdGFnX3JlZl9mcm9tX3V0ZF9lbnRyeSh0ciwgdXRkX2VudHJ5KTsKKworCQlyYl9lcmFzZSgmc3RfZW50cnktPnNvY2tfbm9kZSwgJnNvY2tfdGFnX3RyZWUpOworCQlsaXN0X2RlbCgmc3RfZW50cnktPmxpc3QpOworCQkvKiBDYW4ndCBzb2NrZmRfcHV0KCkgd2l0aGluIHNwaW5sb2NrLCBkbyBpdCBsYXRlci4gKi8KKwkJc29ja190YWdfdHJlZV9pbnNlcnQoc3RfZW50cnksICZzdF90b19mcmVlX3RyZWUpOworCisJCS8qCisJCSAqIFRyeSB0byBmcmVlIHRoZSB1dGRfZW50cnkgaWYgbm8gb3RoZXIgcHJvY19xdHVfZGF0YSBpcworCQkgKiB1c2luZyBpdCAobnVtX3BxZCBpcyAwKSBhbmQgaXQgZG9lc24ndCBoYXZlIGFjdGl2ZSB0YWdzCisJCSAqIChudW1fYWN0aXZlX3RhZ3MgaXMgMCkuCisJCSAqLworCQlwdXRfdXRkX2VudHJ5KHV0ZF9lbnRyeSk7CisJfQorCisJcmJfZXJhc2UoJnBxZF9lbnRyeS0+bm9kZSwgJnByb2NfcXR1X2RhdGFfdHJlZSk7CisJQlVHX09OKHBxZF9lbnRyeS0+cGFyZW50X3RhZ19kYXRhLT5udW1fcHFkIDwgMSk7CisJcHFkX2VudHJ5LT5wYXJlbnRfdGFnX2RhdGEtPm51bV9wcWQtLTsKKwlwdXRfdXRkX2VudHJ5KHBxZF9lbnRyeS0+cGFyZW50X3RhZ19kYXRhKTsKKwlrZnJlZShwcWRfZW50cnkpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlzcGluX3VubG9ja19iaCgmdWlkX3RhZ19kYXRhX3RyZWVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnNvY2tfdGFnX2xpc3RfbG9jayk7CisKKworCXNvY2tfdGFnX3RyZWVfZXJhc2UoJnN0X3RvX2ZyZWVfdHJlZSk7CisKKwlwcmRlYnVnX2Z1bGxfc3RhdGUoMCwgIiVzKCk6IHBpZD0ldSB0Z2lkPSV1IiwgX19mdW5jX18sCisJCQkgICBjdXJyZW50LT5waWQsIGN1cnJlbnQtPnRnaWQpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxdHVkZXZfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHF0dWRldl9vcGVuLAorCS5yZWxlYXNlID0gcXR1ZGV2X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgcXR1X2RldmljZSA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSBRVFVfREVWX05BTUUsCisJLmZvcHMgPSAmcXR1ZGV2X2ZvcHMsCisJLyogSG93IHNhZCBpdCBkb2Vzbid0IGFsbG93IGZvciBkZWZhdWx0czogLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiAqLworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBfX2luaXQgcXRhZ3VpZF9wcm9jX3JlZ2lzdGVyKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnJlc19wcm9jZGlyKQoreworCWludCByZXQ7CisJKnJlc19wcm9jZGlyID0gcHJvY19ta2Rpcihtb2R1bGVfcHJvY2Rpcm5hbWUsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlpZiAoISpyZXNfcHJvY2RpcikgeworCQlwcl9lcnIoInF0YWd1aWQ6IGZhaWxlZCB0byBjcmVhdGUgcHJvYy8uLi4veHRfcXRhZ3VpZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gbm9fZGlyOworCX0KKworCXh0X3F0YWd1aWRfY3RybF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoImN0cmwiLCBwcm9jX2N0cmxfcGVybXMsCisJCQkJCQkqcmVzX3Byb2NkaXIpOworCWlmICgheHRfcXRhZ3VpZF9jdHJsX2ZpbGUpIHsKKwkJcHJfZXJyKCJxdGFndWlkOiBmYWlsZWQgdG8gY3JlYXRlIHh0X3F0YWd1aWQvY3RybCAiCisJCQkiIGZpbGVcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG5vX2N0cmxfZW50cnk7CisJfQorCXh0X3F0YWd1aWRfY3RybF9maWxlLT5yZWFkX3Byb2MgPSBxdGFndWlkX2N0cmxfcHJvY19yZWFkOworCXh0X3F0YWd1aWRfY3RybF9maWxlLT53cml0ZV9wcm9jID0gcXRhZ3VpZF9jdHJsX3Byb2Nfd3JpdGU7CisKKwl4dF9xdGFndWlkX3N0YXRzX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeSgic3RhdHMiLCBwcm9jX3N0YXRzX3Blcm1zLAorCQkJCQkJKnJlc19wcm9jZGlyKTsKKwlpZiAoIXh0X3F0YWd1aWRfc3RhdHNfZmlsZSkgeworCQlwcl9lcnIoInF0YWd1aWQ6IGZhaWxlZCB0byBjcmVhdGUgeHRfcXRhZ3VpZC9zdGF0cyAiCisJCQkiZmlsZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gbm9fc3RhdHNfZW50cnk7CisJfQorCXh0X3F0YWd1aWRfc3RhdHNfZmlsZS0+cmVhZF9wcm9jID0gcXRhZ3VpZF9zdGF0c19wcm9jX3JlYWQ7CisJLyoKKwkgKiBUT0RPOiBhZGQgc3VwcG9ydCBjb3VudGVyIGhhY2tpbmcKKwkgKiB4dF9xdGFndWlkX3N0YXRzX2ZpbGUtPndyaXRlX3Byb2MgPSBxdGFndWlkX3N0YXRzX3Byb2Nfd3JpdGU7CisJICovCisJcmV0dXJuIDA7CisKK25vX3N0YXRzX2VudHJ5OgorCXJlbW92ZV9wcm9jX2VudHJ5KCJjdHJsIiwgKnJlc19wcm9jZGlyKTsKK25vX2N0cmxfZW50cnk6CisJcmVtb3ZlX3Byb2NfZW50cnkoInh0X3F0YWd1aWQiLCBOVUxMKTsKK25vX2RpcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHF0YWd1aWRfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLyoKKwkgKiBUaGlzIG1vZHVsZSBtYXNxdWVyYWRlcyBhcyB0aGUgIm93bmVyIiBtb2R1bGUgc28gdGhhdCBpcHRhYmxlcworCSAqIHRvb2xzIGNhbiBkZWFsIHdpdGggaXQuCisJICovCisJLm5hbWUgICAgICAgPSAib3duZXIiLAorCS5yZXZpc2lvbiAgID0gMSwKKwkuZmFtaWx5ICAgICA9IE5GUFJPVE9fVU5TUEVDLAorCS5tYXRjaCAgICAgID0gcXRhZ3VpZF9tdCwKKwkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfcXRhZ3VpZF9tYXRjaF9pbmZvKSwKKwkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcXRhZ3VpZF9tdF9pbml0KHZvaWQpCit7CisJaWYgKHF0YWd1aWRfcHJvY19yZWdpc3RlcigmeHRfcXRhZ3VpZF9wcm9jZGlyKQorCSAgICB8fCBpZmFjZV9zdGF0X2luaXQoeHRfcXRhZ3VpZF9wcm9jZGlyKQorCSAgICB8fCB4dF9yZWdpc3Rlcl9tYXRjaCgmcXRhZ3VpZF9tdF9yZWcpCisJICAgIHx8IG1pc2NfcmVnaXN0ZXIoJnF0dV9kZXZpY2UpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUT0RPOiBhbGxvdyB1bmxvYWRpbmcgb2YgdGhlIG1vZHVsZS4KKyAqIEZvciBub3cgc3RhdHMgYXJlIHBlcm1hbmVudC4KKyAqIEtjb25maWcgZm9yY2VzJ3kvbicgYW5kIG5ldmVyIGFuICdtJy4KKyAqLworCittb2R1bGVfaW5pdChxdGFndWlkX210X2luaXQpOworTU9EVUxFX0FVVEhPUigianBhIDxqcGFAZ29vZ2xlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWHRhYmxlczogc29ja2V0IG93bmVyK3RhZyBtYXRjaGluZyBhbmQgYXNzb2NpYXRlZCBzdGF0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfb3duZXIiKTsKK01PRFVMRV9BTElBUygiaXA2dF9vd25lciIpOworTU9EVUxFX0FMSUFTKCJpcHRfcXRhZ3VpZCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3F0YWd1aWQiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9pbnRlcm5hbC5oIGIvbmV0L25ldGZpbHRlci94dF9xdGFndWlkX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5ZjgzOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogS2VybmVsIGlwdGFibGVzIG1vZHVsZSB0byB0cmFjayBzdGF0cyBmb3IgcGFja2V0cyBiYXNlZCBvbiB1c2VyIHRhZ3MuCisgKgorICogKEMpIDIwMTEgR29vZ2xlLCBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9fWFRfUVRBR1VJRF9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19YVF9RVEFHVUlEX0lOVEVSTkFMX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9ja190eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisvKiBJZmFjZSBoYW5kbGluZyAqLworI2RlZmluZSBJREVCVUdfTUFTSyAoMTw8MCkKKy8qIElwdGFibGUgTWF0Y2hpbmcuIFBlciBwYWNrZXQuICovCisjZGVmaW5lIE1ERUJVR19NQVNLICgxPDwxKQorLyogUmVkLWJsYWNrIHRyZWUgaGFuZGxpbmcuIFBlciBwYWNrZXQuICovCisjZGVmaW5lIFJERUJVR19NQVNLICgxPDwyKQorLyogcHJvY2ZzIGN0cmwvc3RhdHMgaGFuZGxpbmcgKi8KKyNkZWZpbmUgQ0RFQlVHX01BU0sgKDE8PDMpCisvKiBkZXYgYW5kIHJlc291cmNlIHRyYWNraW5nICovCisjZGVmaW5lIERERUJVR19NQVNLICgxPDw0KQorCisvKiBFLmcgKElERUJVR19NQVNLIHwgQ0RFQlVHX01BU0sgfCBEREVCVUdfTUFTSykgKi8KKyNkZWZpbmUgREVGQVVMVF9ERUJVR19NQVNLIDAKKworLyoKKyAqIChVbilEZWZpbmUgdGhlc2UgKkRFQlVHIHRvIGNvbXBpbGUgb3V0L2luIHRoZSBwcl9kZWJ1ZyBjYWxscy4KKyAqIEFsbCB1bmRlZjogdGV4dCBzaXplIH4gMHgzMDMwOyBhbGwgZGVmOiB+IDB4NDQwNC4KKyAqLworI2RlZmluZSBJREVCVUcKKyNkZWZpbmUgTURFQlVHCisjZGVmaW5lIFJERUJVRworI2RlZmluZSBDREVCVUcKKyNkZWZpbmUgRERFQlVHCisKKyNkZWZpbmUgTVNLX0RFQlVHKG1hc2ssIC4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKHVubGlrZWx5KHF0YWd1aWRfZGVidWdfbWFzayAmIChtYXNrKSkpICBcCisJCQlwcl9kZWJ1ZyhfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICBcCisJfSB3aGlsZSAoMCkKKyNpZmRlZiBJREVCVUcKKyNkZWZpbmUgSUZfREVCVUcoLi4uKSBNU0tfREVCVUcoSURFQlVHX01BU0ssIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgSUZfREVCVUcoLi4uKSBub19wcmludGsoX19WQV9BUkdTX18pCisjZW5kaWYKKyNpZmRlZiBNREVCVUcKKyNkZWZpbmUgTVRfREVCVUcoLi4uKSBNU0tfREVCVUcoTURFQlVHX01BU0ssIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgTVRfREVCVUcoLi4uKSBub19wcmludGsoX19WQV9BUkdTX18pCisjZW5kaWYKKyNpZmRlZiBSREVCVUcKKyNkZWZpbmUgUkJfREVCVUcoLi4uKSBNU0tfREVCVUcoUkRFQlVHX01BU0ssIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgUkJfREVCVUcoLi4uKSBub19wcmludGsoX19WQV9BUkdTX18pCisjZW5kaWYKKyNpZmRlZiBDREVCVUcKKyNkZWZpbmUgQ1RfREVCVUcoLi4uKSBNU0tfREVCVUcoQ0RFQlVHX01BU0ssIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQ1RfREVCVUcoLi4uKSBub19wcmludGsoX19WQV9BUkdTX18pCisjZW5kaWYKKyNpZmRlZiBEREVCVUcKKyNkZWZpbmUgRFJfREVCVUcoLi4uKSBNU0tfREVCVUcoRERFQlVHX01BU0ssIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgRFJfREVCVUcoLi4uKSBub19wcmludGsoX19WQV9BUkdTX18pCisjZW5kaWYKKworZXh0ZXJuIHVpbnQgcXRhZ3VpZF9kZWJ1Z19tYXNrOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGFnczoKKyAqCisgKiBUaGV5IHJlcHJlc2VudCB3aGF0IHRoZSBkYXRhIHVzYWdlIGNvdW50ZXJzIHdpbGwgYmUgdHJhY2tlZCBhZ2FpbnN0LgorICogQnkgZGVmYXVsdCBhIHRhZyBpcyBqdXN0IGJhc2VkIG9uIHRoZSBVSUQuCisgKiBUaGUgVUlEIGlzIHVzZWQgYXMgdGhlIGJhc2UgZm9yIHBvbGljaW5nLCBhbmQgY2FuIG5vdCBiZSBpZ25vcmVkLgorICogU28gYSB0YWcgd2lsbCBhbHdheXMgYXQgbGVhc3QgcmVwcmVzZW50IGEgVUlEICh1aWRfdGFnKS4KKyAqCisgKiBBIHRhZyBjYW4gYmUgYXVnbWVudGVkIHdpdGggYW4gImFjY291bnRpbmcgdGFnIiB3aGljaCBpcyBhc3NvY2lhdGVkCisgKiB3aXRoIGEgVUlELgorICogVXNlciBzcGFjZSBjYW4gc2V0IHRoZSBhY2N0X3RhZyBwb3J0aW9uIG9mIHRoZSB0YWcgd2hpY2ggaXMgdGhlbiB1c2VkCisgKiB3aXRoIHNvY2tldHM6IGFsbCBkYXRhIGJlbG9uZ2luZyB0byB0aGF0IHNvY2tldCB3aWxsIGJlIGNvdW50ZWQgYWdhaW5zdCB0aGUKKyAqIHRhZy4gVGhlIHBvbGljaW5nIGlzIHRoZW4gYmFzZWQgb24gdGhlIHRhZydzIHVpZF90YWcgcG9ydGlvbiwKKyAqIGFuZCBzdGF0cyBhcmUgY29sbGVjdGVkIGZvciB0aGUgYWNjdF90YWcgcG9ydGlvbiBzZXBhcmF0ZWx5LgorICoKKyAqIFRoZXJlIGNvdWxkIGJlCisgKiBhOiAge2FjY3RfdGFnPTEsIHVpZF90YWc9MTAwMDN9CisgKiBiOiAge2FjY3RfdGFnPTIsIHVpZF90YWc9MTAwMDN9CisgKiBjOiAge2FjY3RfdGFnPTMsIHVpZF90YWc9MTAwMDN9CisgKiBkOiAge2FjY3RfdGFnPTAsIHVpZF90YWc9MTAwMDN9CisgKiBhLCBiLCBhbmQgYyByZXByZXNlbnQgdGFncyBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWMgc29ja2V0cy4KKyAqIGQgaXMgZm9yIHRoZSB0b3RhbHMgZm9yIHRoYXQgdWlkLCBpbmNsdWRpbmcgYWxsIHVudGFnZ2VkIHRyYWZmaWMuCisgKiBUeXBpY2FsbHkgZCBpcyB1c2VkIHdpdGggcG9saWNpbmcvcXVvdGEgcnVsZXMuCisgKgorICogV2Ugd2FudCB0YWdfdCBiaWcgZW5vdWdoIHRvIGRpc3Rpbmd1aXNoIHVpZF90IGFuZCBhY2N0X3RhZy4KKyAqIEl0IG1pZ2h0IGJlY29tZSBhIHN0cnVjdCBpZiBuZWVkZWQuCisgKiBOb3RoaW5nIHNob3VsZCBiZSB1c2luZyBpdCBhcyBhbiBpbnQuCisgKi8KK3R5cGVkZWYgdWludDY0X3QgdGFnX3Q7ICAvKiBPbmx5IHVzZWQgdmlhIGFjY2Vzc29ycyAqLworCisjZGVmaW5lIFRBR19VSURfTUFTSyAweEZGRkZGRkZGVUxMCisjZGVmaW5lIFRBR19BQ0NUX01BU0sgKH4weEZGRkZGRkZGVUxMKQorCitzdGF0aWMgaW5saW5lIGludCB0YWdfY29tcGFyZSh0YWdfdCB0MSwgdGFnX3QgdDIpCit7CisJcmV0dXJuIHQxIDwgdDIgPyAtMSA6IHQxID09IHQyID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdGFnX3QgY29tYmluZV9hdGFnX3dpdGhfdWlkKHRhZ190IGFjY3RfdGFnLCB1aWRfdCB1aWQpCit7CisJcmV0dXJuIGFjY3RfdGFnIHwgdWlkOworfQorc3RhdGljIGlubGluZSB0YWdfdCBtYWtlX3RhZ19mcm9tX3VpZCh1aWRfdCB1aWQpCit7CisJcmV0dXJuIHVpZDsKK30KK3N0YXRpYyBpbmxpbmUgdWlkX3QgZ2V0X3VpZF9mcm9tX3RhZyh0YWdfdCB0YWcpCit7CisJcmV0dXJuIHRhZyAmIFRBR19VSURfTUFTSzsKK30KK3N0YXRpYyBpbmxpbmUgdGFnX3QgZ2V0X3V0YWdfZnJvbV90YWcodGFnX3QgdGFnKQoreworCXJldHVybiB0YWcgJiBUQUdfVUlEX01BU0s7Cit9CitzdGF0aWMgaW5saW5lIHRhZ190IGdldF9hdGFnX2Zyb21fdGFnKHRhZ190IHRhZykKK3sKKwlyZXR1cm4gdGFnICYgVEFHX0FDQ1RfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBib29sIHZhbGlkX2F0YWcodGFnX3QgdGFnKQoreworCXJldHVybiAhKHRhZyAmIFRBR19VSURfTUFTSyk7Cit9CitzdGF0aWMgaW5saW5lIHRhZ190IG1ha2VfYXRhZ19mcm9tX3ZhbHVlKHVpbnQzMl90IHZhbHVlKQoreworCXJldHVybiAodWludDY0X3QpdmFsdWUgPDwgMzI7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBzb2NrZXQgdGFncyB0aGF0IGEgVUlEIGlzIGFsbG93ZWQgdG8gaGF2ZSBhY3RpdmUuCisgKiBNdWx0aXBsZSBwcm9jZXNzZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIFVJRCBjb250cmlidXRlIHRvd2FyZHMgdGhpcyBsaW1pdC4KKyAqIFNwZWNpYWwgVUlEcyB0aGF0IGNhbiBpbXBlcnNvbmF0ZSBhIFVJRCBhbHNvIGNvbnRyaWJ1dGUgKGUuZy4gZG93bmxvYWQKKyAqIG1hbmFnZXIsIC4uLikKKyAqLworI2RlZmluZSBERUZBVUxUX01BWF9TT0NLX1RBR1MgMTAyNAorCisvKgorICogRm9yIG5vdyB3ZSBvbmx5IHRyYWNrIDIgc2V0cyBvZiBjb3VudGVycy4KKyAqIFRoZSBkZWZhdWx0IHNldCBpcyAwLgorICogVXNlcnNwYWNlIGNhbiBhY3RpdmF0ZSBhbm90aGVyIHNldCBmb3IgYSBnaXZlbiB1aWQgYmVpbmcgdHJhY2tlZC4KKyAqLworI2RlZmluZSBJRlNfTUFYX0NPVU5URVJfU0VUUyAyCisKK2VudW0gaWZzX3R4X3J4IHsKKwlJRlNfVFgsCisJSUZTX1JYLAorCUlGU19NQVhfRElSRUNUSU9OUworfTsKKworLyogRm9yIG5vdywgVENQLCBVRFAsIHRoZSByZXN0ICovCitlbnVtIGlmc19wcm90byB7CisJSUZTX1RDUCwKKwlJRlNfVURQLAorCUlGU19QUk9UT19PVEhFUiwKKwlJRlNfTUFYX1BST1RPUworfTsKKworc3RydWN0IGJ5dGVfcGFja2V0X2NvdW50ZXJzIHsKKwl1aW50NjRfdCBieXRlczsKKwl1aW50NjRfdCBwYWNrZXRzOworfTsKKworc3RydWN0IGRhdGFfY291bnRlcnMgeworCXN0cnVjdCBieXRlX3BhY2tldF9jb3VudGVycyBicGNbSUZTX01BWF9DT1VOVEVSX1NFVFNdW0lGU19NQVhfRElSRUNUSU9OU11bSUZTX01BWF9QUk9UT1NdOworfTsKKworLyogR2VuZXJpYyBYIGJhc2VkIG5vZGVzIHVzZWQgYXMgYSBiYXNlIGZvciByYl90cmVlIG9wcyAqLworc3RydWN0IHRhZ19ub2RlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCXRhZ190IHRhZzsKK307CisKK3N0cnVjdCB0YWdfc3RhdCB7CisJc3RydWN0IHRhZ19ub2RlIHRuOworCXN0cnVjdCBkYXRhX2NvdW50ZXJzIGNvdW50ZXJzOworCS8qCisJICogSWYgdGhpcyB0YWcgaXMgYWNjdF90YWcgYmFzZWQsIHdlIG5lZWQgdG8gY291bnQgYWdhaW5zdCB0aGUKKwkgKiBtYXRjaGluZyBwYXJlbnQgdWlkX3RhZy4KKwkgKi8KKwlzdHJ1Y3QgZGF0YV9jb3VudGVycyAqcGFyZW50X2NvdW50ZXJzOworfTsKKworc3RydWN0IGlmYWNlX3N0YXQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgIC8qIGluIGlmYWNlX3N0YXRfbGlzdCAqLworCWNoYXIgKmlmbmFtZTsKKwlib29sIGFjdGl2ZTsKKwkvKiBuZXRfZGV2IGlzIG9ubHkgdmFsaWQgZm9yIGFjdGl2ZSBpZmFjZV9zdGF0ICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisKKwlzdHJ1Y3QgYnl0ZV9wYWNrZXRfY291bnRlcnMgdG90YWxzX3ZpYV9kZXZbSUZTX01BWF9ESVJFQ1RJT05TXTsKKwlzdHJ1Y3QgYnl0ZV9wYWNrZXRfY291bnRlcnMgdG90YWxzX3ZpYV9za2JbSUZTX01BWF9ESVJFQ1RJT05TXTsKKwkvKgorCSAqIFdlIGtlZXAgdGhlIGxhc3Rfa25vd24sIGJlY2F1c2Ugc29tZSBkZXZpY2VzIHJlc2V0IHRoZWlyIGNvdW50ZXJzCisJICoganVzdCBiZWZvcmUgTkVUREVWX1VQLCB3aGlsZSBzb21lIHdpbGwgcmVzZXQganVzdCBiZWZvcmUKKwkgKiBORVRERVZfUkVHSVNURVIgKHdoaWNoIGlzIG1vcmUgbm9ybWFsKS4KKwkgKiBTbyBub3csIGlmIHRoZSBkZXZpY2UgZGlkbid0IGRvIGEgTkVUREVWX1VOUkVHSVNURVIgYW5kIHdlIHNlZQorCSAqIGl0cyBjdXJyZW50IGRldiBzdGF0cyBzbWFsbGVyIHRoYXQgd2hhdCB3YXMgcHJldmlvdXNseSBrbm93biwgd2UKKwkgKiBhc3N1bWUgYW4gVU5SRUdJU1RFUiBhbmQganVzdCB1c2UgdGhlIGxhc3Rfa25vd24uCisJICovCisJc3RydWN0IGJ5dGVfcGFja2V0X2NvdW50ZXJzIGxhc3Rfa25vd25bSUZTX01BWF9ESVJFQ1RJT05TXTsKKwkvKiBsYXN0X2tub3duIGlzIHVzYWJsZSB3aGVuIGxhc3Rfa25vd25fdmFsaWQgaXMgdHJ1ZSAqLworCWJvb2wgbGFzdF9rbm93bl92YWxpZDsKKworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19wdHI7CisKKwlzdHJ1Y3QgcmJfcm9vdCB0YWdfc3RhdF90cmVlOworCXNwaW5sb2NrX3QgdGFnX3N0YXRfbGlzdF9sb2NrOworfTsKKworLyogVGhpcyBpcyBuZWVkZWQgdG8gY3JlYXRlIHByb2NfZGlyX2VudHJpZXMgZnJvbSBhdG9taWMgY29udGV4dC4gKi8KK3N0cnVjdCBpZmFjZV9zdGF0X3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCBpZmFjZV93b3JrOworCXN0cnVjdCBpZmFjZV9zdGF0ICppZmFjZV9lbnRyeTsKK307CisKKy8qCisgKiBUcmFjayB0YWcgdGhhdCB0aGlzIHNvY2tldCBpcyB0cmFuc2ZlcnJpbmcgZGF0YSBmb3IsIGFuZCBub3QgbmVjZXNzYXJpbHkKKyAqIHRoZSB1aWQgdGhhdCBvd25zIHRoZSBzb2NrZXQuCisgKiBUaGlzIGlzIHRoZSB0YWcgYWdhaW5zdCB3aGljaCB0YWdfc3RhdC5jb3VudGVycyB3aWxsIGJlIGJpbGxlZC4KKyAqIFRoZXNlIHN0cnVjdHMgbmVlZCB0byBiZSBsb29rZWQgdXAgYnkgc29jayBhbmQgcGlkLgorICovCitzdHJ1Y3Qgc29ja190YWcgeworCXN0cnVjdCByYl9ub2RlIHNvY2tfbm9kZTsKKwlzdHJ1Y3Qgc29jayAqc2s7ICAvKiBPbmx5IHVzZWQgYXMgYSBudW1iZXIsIG5ldmVyIGRlcmVmZXJlbmNlZCAqLworCS8qIFRoZSBzb2NrZXQgaXMgbmVlZGVkIGZvciBzb2NrZmRfcHV0KCkgKi8KKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQ7CisJLyogVXNlZCB0byBhc3NvY2lhdGUgd2l0aCBhIGdpdmVuIHBpZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAvKiBpbiBwcm9jX3F0dV9kYXRhLnNvY2tfdGFnX2xpc3QgKi8KKwlwaWRfdCBwaWQ7CisKKwl0YWdfdCB0YWc7Cit9OworCitzdHJ1Y3QgcXRhZ3VpZF9ldmVudF9jb3VudHMgeworCS8qIFZhcmlvdXMgc3VjY2Vzc2Z1bCBldmVudHMgKi8KKwlhdG9taWM2NF90IHNvY2tldHNfdGFnZ2VkOworCWF0b21pYzY0X3Qgc29ja2V0c191bnRhZ2dlZDsKKwlhdG9taWM2NF90IGNvdW50ZXJfc2V0X2NoYW5nZXM7CisJYXRvbWljNjRfdCBkZWxldGVfY21kczsKKwlhdG9taWM2NF90IGlmYWNlX2V2ZW50czsgIC8qIE51bWJlciBvZiBORVRERVZfKiBldmVudHMgaGFuZGxlZCAqLworCisJYXRvbWljNjRfdCBtYXRjaF9jYWxsczsgICAvKiBOdW1iZXIgb2YgdGltZXMgaXB0YWJsZXMgY2FsbGVkIG10ICovCisJLyogTnVtYmVyIG9mIHRpbWVzIGlwdGFibGVzIGNhbGxlZCBtdCBmcm9tIHByZSBvciBwb3N0IHJvdXRpbmcgaG9va3MgKi8KKwlhdG9taWM2NF90IG1hdGNoX2NhbGxzX3ByZXBvc3Q7CisJLyoKKwkgKiBtYXRjaF9mb3VuZF9za18qOiBudW1iZXJzIHJlbGF0ZWQgdG8gdGhlIG5ldGZpbHRlciBtYXRjaGluZworCSAqIGZ1bmN0aW9uIGZpbmRpbmcgYSBzb2NrIGZvciB0aGUgc2tfYnVmZi4KKwkgKiBUb3RhbCBza2JzIHByb2Nlc3NlZCBpcyBzdW0obWF0Y2hfZm91bmQqKS4KKwkgKi8KKwlhdG9taWM2NF90IG1hdGNoX2ZvdW5kX3NrOyAgIC8qIEFuIHNrIHdhcyBhbHJlYWR5IGluIHRoZSBza19idWZmLiAqLworCS8qIFRoZSBjb25uZWN0aW9uIHRyYWNrZXIgaGFkIG9yIGRpZG4ndCBoYXZlIHRoZSBzay4gKi8KKwlhdG9taWM2NF90IG1hdGNoX2ZvdW5kX3NrX2luX2N0OworCWF0b21pYzY0X3QgbWF0Y2hfZm91bmRfbm9fc2tfaW5fY3Q7CisJLyoKKwkgKiBObyBzayBjb3VsZCBiZSBmb3VuZC4gTm8gYXBwYXJlbnQgb3duZXIuIENvdWxkIGhhcHBlbiB3aXRoCisJICogdW5zb2xpY2l0ZWQgdHJhZmZpYy4KKwkgKi8KKwlhdG9taWM2NF90IG1hdGNoX25vX3NrOworCS8qCisJICogVGhlIGZpbGUgcHRyIGluIHRoZSBza19zb2NrZXQgd2Fzbid0IHRoZXJlLgorCSAqIFRoaXMgbWlnaHQgaGFwcGVuIGZvciB0cmFmZmljIHdoaWxlIHRoZSBzb2NrZXQgaXMgYmVpbmcgY2xvc2VkLgorCSAqLworCWF0b21pYzY0X3QgbWF0Y2hfbm9fc2tfZmlsZTsKK307CisKKy8qIFRyYWNrIHRoZSBzZXQgYWN0aXZlX3NldCBmb3IgdGhlIGdpdmVuIHRhZy4gKi8KK3N0cnVjdCB0YWdfY291bnRlcl9zZXQgeworCXN0cnVjdCB0YWdfbm9kZSB0bjsKKwlpbnQgYWN0aXZlX3NldDsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhlIHF0dSB1aWQgZGF0YSBpcyB1c2VkIHRvIHRyYWNrIHJlc291cmNlcyB0aGF0IGFyZSBjcmVhdGVkIGRpcmVjdGx5IG9yCisgKiBpbmRpcmVjdGx5IGJ5IHByb2Nlc3NlcyAodWlkIHRyYWNrZWQpLgorICogSXQgaXMgc2hhcmVkIGJ5IHRoZSBwcm9jZXNzZXMgd2l0aCB0aGUgc2FtZSB1aWQuCisgKiBTb21lIG9mIHRoZSByZXNvdXJjZSB3aWxsIGJlIGNvdW50ZWQgdG8gcHJldmVudCBmdXJ0aGVyIHJvZ3VlIGFsbG9jYXRpb25zLAorICogc29tZSB3aWxsIG5lZWQgZnJlZWluZyBvbmNlIHRoZSBvd25lciBwcm9jZXNzICh1aWQpIGV4aXRzLgorICovCitzdHJ1Y3QgdWlkX3RhZ19kYXRhIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCXVpZF90IHVpZDsKKworCS8qCisJICogRm9yIHRoZSB1aWQsIGhvdyBtYW55IGFjY291bnRpbmcgdGFncyBoYXZlIGJlZW4gc2V0LgorCSAqLworCWludCBudW1fYWN0aXZlX3RhZ3M7CisJLyogVHJhY2sgdGhlIG51bWJlciBvZiBwcm9jX3F0dV9kYXRhIHRoYXQgcmVmZXJlbmNlIGl0ICovCisJaW50IG51bV9wcWQ7CisJc3RydWN0IHJiX3Jvb3QgdGFnX3JlZl90cmVlOworCS8qIE5vIHRhZ19ub2RlX3RyZWVfbG9jazsgdXNlIHVpZF90YWdfZGF0YV90cmVlX2xvY2sgKi8KK307CisKK3N0cnVjdCB0YWdfcmVmIHsKKwlzdHJ1Y3QgdGFnX25vZGUgdG47CisKKwkvKgorCSAqIFRoaXMgdHJhY2tzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHNvY2tldHMgdGhhdCBoYXZlIGEgdGFnIG9uIHRoZW0KKwkgKiB3aGljaCBtYXRjaGVzIHRoaXMgdGFnX3JlZi50bi50YWcuCisJICogQSB0YWcgcmVmIGNhbiBsaXZlIG9uIGFmdGVyIHRoZSBzb2NrZXRzIGFyZSB1bnRhZ2dlZC4KKwkgKiBBIHRhZyByZWYgY2FuIG9ubHkgYmUgcmVtb3ZlZCBkdXJpbmcgYSB0YWcgZGVsZXRlIGNvbW1hbmQuCisJICovCisJaW50IG51bV9zb2NrX3RhZ3M7Cit9OworCitzdHJ1Y3QgcHJvY19xdHVfZGF0YSB7CisJc3RydWN0IHJiX25vZGUgbm9kZTsKKwlwaWRfdCBwaWQ7CisKKwlzdHJ1Y3QgdWlkX3RhZ19kYXRhICpwYXJlbnRfdGFnX2RhdGE7CisKKwkvKiBUcmFja3MgdGhlIHNvY2tfdGFncyB0aGF0IG5lZWQgZnJlZWluZyB1cG9uIHRoaXMgcHJvYydzIGRlYXRoICovCisJc3RydWN0IGxpc3RfaGVhZCBzb2NrX3RhZ19saXN0OworCS8qIE5vIHNwaW5sb2NrX3Qgc29ja190YWdfbGlzdF9sb2NrOyB1c2UgdGhlIGdsb2JhbCBvbmUuICovCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2VuZGlmICAvKiBpZm5kZWYgX19YVF9RVEFHVUlEX0lOVEVSTkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9xdGFndWlkX3ByaW50LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWRfcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JkOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9xdGFndWlkX3ByaW50LmMKQEAgLTAsMCArMSw1NjQgQEAKKy8qCisgKiBQcmV0dHkgcHJpbnRpbmcgU3VwcG9ydCBmb3IgaXB0YWJsZXMgeHRfcXRhZ3VpZCBtb2R1bGUuCisgKgorICogKEMpIDIwMTEgR29vZ2xlLCBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBNb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGp1c3Qgd2FzdGUgdGltZSBpZiBERUJVRyBpcyBub3QgZGVmaW5lZC4KKyAqIFRoZSBtYXRjaGluZyB4dF9xdGFndWlkX3ByaW50Lmggd2lsbCBzdGF0aWMgaW5saW5lIGVtcHR5IGZ1bmNzIGlmIHRoZSBuZWVkZWQKKyAqIGRlYnVnIGZsYWdzIG9yZSBub3QgZGVmaW5lZC4KKyAqIFRob3NlIGZ1bmNzIHRoYXQgZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkgd2lsbCBwYW5pYyBhcyB0aGVyZSBpcyBubyBuZWVkIHRvCisgKiBob2JibGUgYWxsb25nIGp1c3QgcHJldGVuZGluZyB0byBkbyB0aGUgcmVxdWVzdGVkIHdvcmsuCisgKi8KKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KKworCisjaW5jbHVkZSAieHRfcXRhZ3VpZF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInh0X3F0YWd1aWRfcHJpbnQuaCIKKworI2lmZGVmIERERUJVRworCitzdGF0aWMgdm9pZCBfYnVnX29uX2Vycl9vcl9udWxsKHZvaWQgKnB0cikKK3sKKwlpZiAoSVNfRVJSX09SX05VTEwocHRyKSkgeworCQlwcl9lcnIoInF0YWd1aWQ6IGttYWxsb2MgZmFpbGVkXG4iKTsKKwkJQlVHKCk7CisJfQorfQorCitjaGFyICpwcF90YWdfdCh0YWdfdCAqdGFnKQoreworCWNoYXIgKnJlczsKKworCWlmICghdGFnKQorCQlyZXMgPSBrYXNwcmludGYoR0ZQX0FUT01JQywgInRhZ190QG51bGx7fSIpOworCWVsc2UKKwkJcmVzID0ga2FzcHJpbnRmKEdGUF9BVE9NSUMsCisJCQkJInRhZ190QCVwe3RhZz0weCVsbHgsIHVpZD0ldX0iLAorCQkJCXRhZywgKnRhZywgZ2V0X3VpZF9mcm9tX3RhZygqdGFnKSk7CisJX2J1Z19vbl9lcnJfb3JfbnVsbChyZXMpOworCXJldHVybiByZXM7Cit9CisKK2NoYXIgKnBwX2RhdGFfY291bnRlcnMoc3RydWN0IGRhdGFfY291bnRlcnMgKmRjLCBib29sIHNob3dWYWx1ZXMpCit7CisJY2hhciAqcmVzOworCisJaWYgKCFkYykKKwkJcmVzID0ga2FzcHJpbnRmKEdGUF9BVE9NSUMsICJkYXRhX2NvdW50ZXJzQG51bGx7fSIpOworCWVsc2UgaWYgKHNob3dWYWx1ZXMpCisJCXJlcyA9IGthc3ByaW50ZigKKwkJCUdGUF9BVE9NSUMsICJkYXRhX2NvdW50ZXJzQCVweyIKKwkJCSJzZXQweyIKKwkJCSJyeHsiCisJCQkidGNwe2I9JWxsdSwgcD0lbGx1fSwgIgorCQkJInVkcHtiPSVsbHUsIHA9JWxsdX0sIgorCQkJIm90aGVye2I9JWxsdSwgcD0lbGx1fX0sICIKKwkJCSJ0eHsiCisJCQkidGNwe2I9JWxsdSwgcD0lbGx1fSwgIgorCQkJInVkcHtiPSVsbHUsIHA9JWxsdX0sIgorCQkJIm90aGVye2I9JWxsdSwgcD0lbGx1fX19LCAiCisJCQkic2V0MXsiCisJCQkicnh7IgorCQkJInRjcHtiPSVsbHUsIHA9JWxsdX0sICIKKwkJCSJ1ZHB7Yj0lbGx1LCBwPSVsbHV9LCIKKwkJCSJvdGhlcntiPSVsbHUsIHA9JWxsdX19LCAiCisJCQkidHh7IgorCQkJInRjcHtiPSVsbHUsIHA9JWxsdX0sICIKKwkJCSJ1ZHB7Yj0lbGx1LCBwPSVsbHV9LCIKKwkJCSJvdGhlcntiPSVsbHUsIHA9JWxsdX19fX0iLAorCQkJZGMsCisJCQlkYy0+YnBjWzBdW0lGU19SWF1bSUZTX1RDUF0uYnl0ZXMsCisJCQlkYy0+YnBjWzBdW0lGU19SWF1bSUZTX1RDUF0ucGFja2V0cywKKwkJCWRjLT5icGNbMF1bSUZTX1JYXVtJRlNfVURQXS5ieXRlcywKKwkJCWRjLT5icGNbMF1bSUZTX1JYXVtJRlNfVURQXS5wYWNrZXRzLAorCQkJZGMtPmJwY1swXVtJRlNfUlhdW0lGU19QUk9UT19PVEhFUl0uYnl0ZXMsCisJCQlkYy0+YnBjWzBdW0lGU19SWF1bSUZTX1BST1RPX09USEVSXS5wYWNrZXRzLAorCQkJZGMtPmJwY1swXVtJRlNfVFhdW0lGU19UQ1BdLmJ5dGVzLAorCQkJZGMtPmJwY1swXVtJRlNfVFhdW0lGU19UQ1BdLnBhY2tldHMsCisJCQlkYy0+YnBjWzBdW0lGU19UWF1bSUZTX1VEUF0uYnl0ZXMsCisJCQlkYy0+YnBjWzBdW0lGU19UWF1bSUZTX1VEUF0ucGFja2V0cywKKwkJCWRjLT5icGNbMF1bSUZTX1RYXVtJRlNfUFJPVE9fT1RIRVJdLmJ5dGVzLAorCQkJZGMtPmJwY1swXVtJRlNfVFhdW0lGU19QUk9UT19PVEhFUl0ucGFja2V0cywKKwkJCWRjLT5icGNbMV1bSUZTX1JYXVtJRlNfVENQXS5ieXRlcywKKwkJCWRjLT5icGNbMV1bSUZTX1JYXVtJRlNfVENQXS5wYWNrZXRzLAorCQkJZGMtPmJwY1sxXVtJRlNfUlhdW0lGU19VRFBdLmJ5dGVzLAorCQkJZGMtPmJwY1sxXVtJRlNfUlhdW0lGU19VRFBdLnBhY2tldHMsCisJCQlkYy0+YnBjWzFdW0lGU19SWF1bSUZTX1BST1RPX09USEVSXS5ieXRlcywKKwkJCWRjLT5icGNbMV1bSUZTX1JYXVtJRlNfUFJPVE9fT1RIRVJdLnBhY2tldHMsCisJCQlkYy0+YnBjWzFdW0lGU19UWF1bSUZTX1RDUF0uYnl0ZXMsCisJCQlkYy0+YnBjWzFdW0lGU19UWF1bSUZTX1RDUF0ucGFja2V0cywKKwkJCWRjLT5icGNbMV1bSUZTX1RYXVtJRlNfVURQXS5ieXRlcywKKwkJCWRjLT5icGNbMV1bSUZTX1RYXVtJRlNfVURQXS5wYWNrZXRzLAorCQkJZGMtPmJwY1sxXVtJRlNfVFhdW0lGU19QUk9UT19PVEhFUl0uYnl0ZXMsCisJCQlkYy0+YnBjWzFdW0lGU19UWF1bSUZTX1BST1RPX09USEVSXS5wYWNrZXRzKTsKKwllbHNlCisJCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLCAiZGF0YV9jb3VudGVyc0AlcHsuLi59IiwgZGMpOworCV9idWdfb25fZXJyX29yX251bGwocmVzKTsKKwlyZXR1cm4gcmVzOworfQorCitjaGFyICpwcF90YWdfbm9kZShzdHJ1Y3QgdGFnX25vZGUgKnRuKQoreworCWNoYXIgKnRhZ19zdHI7CisJY2hhciAqcmVzOworCisJaWYgKCF0bikgeworCQlyZXMgPSBrYXNwcmludGYoR0ZQX0FUT01JQywgInRhZ19ub2RlQG51bGx7fSIpOworCQlfYnVnX29uX2Vycl9vcl9udWxsKHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCXRhZ19zdHIgPSBwcF90YWdfdCgmdG4tPnRhZyk7CisJcmVzID0ga2FzcHJpbnRmKEdGUF9BVE9NSUMsCisJCQkidGFnX25vZGVAJXB7dGFnPSVzfSIsCisJCQl0biwgdGFnX3N0cik7CisJX2J1Z19vbl9lcnJfb3JfbnVsbChyZXMpOworCWtmcmVlKHRhZ19zdHIpOworCXJldHVybiByZXM7Cit9CisKK2NoYXIgKnBwX3RhZ19yZWYoc3RydWN0IHRhZ19yZWYgKnRyKQoreworCWNoYXIgKnRuX3N0cjsKKwljaGFyICpyZXM7CisKKwlpZiAoIXRyKSB7CisJCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLCAidGFnX3JlZkBudWxse30iKTsKKwkJX2J1Z19vbl9lcnJfb3JfbnVsbChyZXMpOworCQlyZXR1cm4gcmVzOworCX0KKwl0bl9zdHIgPSBwcF90YWdfbm9kZSgmdHItPnRuKTsKKwlyZXMgPSBrYXNwcmludGYoR0ZQX0FUT01JQywKKwkJCSJ0YWdfcmVmQCVweyVzLCBudW1fc29ja190YWdzPSVkfSIsCisJCQl0ciwgdG5fc3RyLCB0ci0+bnVtX3NvY2tfdGFncyk7CisJX2J1Z19vbl9lcnJfb3JfbnVsbChyZXMpOworCWtmcmVlKHRuX3N0cik7CisJcmV0dXJuIHJlczsKK30KKworY2hhciAqcHBfdGFnX3N0YXQoc3RydWN0IHRhZ19zdGF0ICp0cykKK3sKKwljaGFyICp0bl9zdHI7CisJY2hhciAqY291bnRlcnNfc3RyOworCWNoYXIgKnBhcmVudF9jb3VudGVyc19zdHI7CisJY2hhciAqcmVzOworCisJaWYgKCF0cykgeworCQlyZXMgPSBrYXNwcmludGYoR0ZQX0FUT01JQywgInRhZ19zdGF0QG51bGx7fSIpOworCQlfYnVnX29uX2Vycl9vcl9udWxsKHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCXRuX3N0ciA9IHBwX3RhZ19ub2RlKCZ0cy0+dG4pOworCWNvdW50ZXJzX3N0ciA9IHBwX2RhdGFfY291bnRlcnMoJnRzLT5jb3VudGVycywgdHJ1ZSk7CisJcGFyZW50X2NvdW50ZXJzX3N0ciA9IHBwX2RhdGFfY291bnRlcnModHMtPnBhcmVudF9jb3VudGVycywgZmFsc2UpOworCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLAorCQkJInRhZ19zdGF0QCVweyVzLCBjb3VudGVycz0lcywgcGFyZW50X2NvdW50ZXJzPSVzfSIsCisJCQl0cywgdG5fc3RyLCBjb3VudGVyc19zdHIsIHBhcmVudF9jb3VudGVyc19zdHIpOworCV9idWdfb25fZXJyX29yX251bGwocmVzKTsKKwlrZnJlZSh0bl9zdHIpOworCWtmcmVlKGNvdW50ZXJzX3N0cik7CisJa2ZyZWUocGFyZW50X2NvdW50ZXJzX3N0cik7CisJcmV0dXJuIHJlczsKK30KKworY2hhciAqcHBfaWZhY2Vfc3RhdChzdHJ1Y3QgaWZhY2Vfc3RhdCAqaXMpCit7CisJY2hhciAqcmVzOworCWlmICghaXMpCisJCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLCAiaWZhY2Vfc3RhdEBudWxse30iKTsKKwllbHNlCisJCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLCAiaWZhY2Vfc3RhdEAlcHsiCisJCQkJImxpc3Q9bGlzdF9oZWFkey4uLn0sICIKKwkJCQkiaWZuYW1lPSVzLCAiCisJCQkJInRvdGFsX2Rldj17cng9e2J5dGVzPSVsbHUsICIKKwkJCQkicGFja2V0cz0lbGx1fSwgIgorCQkJCSJ0eD17Ynl0ZXM9JWxsdSwgIgorCQkJCSJwYWNrZXRzPSVsbHV9fSwgIgorCQkJCSJ0b3RhbF9za2I9e3J4PXtieXRlcz0lbGx1LCAiCisJCQkJInBhY2tldHM9JWxsdX0sICIKKwkJCQkidHg9e2J5dGVzPSVsbHUsICIKKwkJCQkicGFja2V0cz0lbGx1fX0sICIKKwkJCQkibGFzdF9rbm93bl92YWxpZD0lZCwgIgorCQkJCSJsYXN0X2tub3duPXtyeD17Ynl0ZXM9JWxsdSwgIgorCQkJCSJwYWNrZXRzPSVsbHV9LCAiCisJCQkJInR4PXtieXRlcz0lbGx1LCAiCisJCQkJInBhY2tldHM9JWxsdX19LCAiCisJCQkJImFjdGl2ZT0lZCwgIgorCQkJCSJuZXRfZGV2PSVwLCAiCisJCQkJInByb2NfcHRyPSVwLCAiCisJCQkJInRhZ19zdGF0X3RyZWU9cmJfcm9vdHsuLi59fSIsCisJCQkJaXMsCisJCQkJaXMtPmlmbmFtZSwKKwkJCQlpcy0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5ieXRlcywKKwkJCQlpcy0+dG90YWxzX3ZpYV9kZXZbSUZTX1JYXS5wYWNrZXRzLAorCQkJCWlzLT50b3RhbHNfdmlhX2RldltJRlNfVFhdLmJ5dGVzLAorCQkJCWlzLT50b3RhbHNfdmlhX2RldltJRlNfVFhdLnBhY2tldHMsCisJCQkJaXMtPnRvdGFsc192aWFfc2tiW0lGU19SWF0uYnl0ZXMsCisJCQkJaXMtPnRvdGFsc192aWFfc2tiW0lGU19SWF0ucGFja2V0cywKKwkJCQlpcy0+dG90YWxzX3ZpYV9za2JbSUZTX1RYXS5ieXRlcywKKwkJCQlpcy0+dG90YWxzX3ZpYV9za2JbSUZTX1RYXS5wYWNrZXRzLAorCQkJCWlzLT5sYXN0X2tub3duX3ZhbGlkLAorCQkJCWlzLT5sYXN0X2tub3duW0lGU19SWF0uYnl0ZXMsCisJCQkJaXMtPmxhc3Rfa25vd25bSUZTX1JYXS5wYWNrZXRzLAorCQkJCWlzLT5sYXN0X2tub3duW0lGU19UWF0uYnl0ZXMsCisJCQkJaXMtPmxhc3Rfa25vd25bSUZTX1RYXS5wYWNrZXRzLAorCQkJCWlzLT5hY3RpdmUsCisJCQkJaXMtPm5ldF9kZXYsCisJCQkJaXMtPnByb2NfcHRyKTsKKwlfYnVnX29uX2Vycl9vcl9udWxsKHJlcyk7CisJcmV0dXJuIHJlczsKK30KKworY2hhciAqcHBfc29ja190YWcoc3RydWN0IHNvY2tfdGFnICpzdCkKK3sKKwljaGFyICp0YWdfc3RyOworCWNoYXIgKnJlczsKKworCWlmICghc3QpIHsKKwkJcmVzID0ga2FzcHJpbnRmKEdGUF9BVE9NSUMsICJzb2NrX3RhZ0BudWxse30iKTsKKwkJX2J1Z19vbl9lcnJfb3JfbnVsbChyZXMpOworCQlyZXR1cm4gcmVzOworCX0KKwl0YWdfc3RyID0gcHBfdGFnX3QoJnN0LT50YWcpOworCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLCAic29ja190YWdAJXB7IgorCQkJInNvY2tfbm9kZT1yYl9ub2Rley4uLn0sICIKKwkJCSJzaz0lcCBzb2NrZXQ9JXAgKGZfY291bnQ9JWx1KSwgbGlzdD1saXN0X2hlYWR7Li4ufSwgIgorCQkJInBpZD0ldSwgdGFnPSVzfSIsCisJCQlzdCwgc3QtPnNrLCBzdC0+c29ja2V0LCBhdG9taWNfbG9uZ19yZWFkKAorCQkJCSZzdC0+c29ja2V0LT5maWxlLT5mX2NvdW50KSwKKwkJCXN0LT5waWQsIHRhZ19zdHIpOworCV9idWdfb25fZXJyX29yX251bGwocmVzKTsKKwlrZnJlZSh0YWdfc3RyKTsKKwlyZXR1cm4gcmVzOworfQorCitjaGFyICpwcF91aWRfdGFnX2RhdGEoc3RydWN0IHVpZF90YWdfZGF0YSAqdXRkKQoreworCWNoYXIgKnJlczsKKworCWlmICghdXRkKQorCQlyZXMgPSBrYXNwcmludGYoR0ZQX0FUT01JQywgInVpZF90YWdfZGF0YUBudWxse30iKTsKKwllbHNlCisJCXJlcyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLCAidWlkX3RhZ19kYXRhQCVweyIKKwkJCQkidWlkPSV1LCBudW1fYWN0aXZlX2FjY3RfdGFncz0lZCwgIgorCQkJCSJudW1fcHFkPSVkLCAiCisJCQkJInRhZ19ub2RlX3RyZWU9cmJfcm9vdHsuLi59LCAiCisJCQkJInByb2NfcXR1X2RhdGFfdHJlZT1yYl9yb290ey4uLn19IiwKKwkJCQl1dGQsIHV0ZC0+dWlkLAorCQkJCXV0ZC0+bnVtX2FjdGl2ZV90YWdzLCB1dGQtPm51bV9wcWQpOworCV9idWdfb25fZXJyX29yX251bGwocmVzKTsKKwlyZXR1cm4gcmVzOworfQorCitjaGFyICpwcF9wcm9jX3F0dV9kYXRhKHN0cnVjdCBwcm9jX3F0dV9kYXRhICpwcWQpCit7CisJY2hhciAqcGFyZW50X3RhZ19kYXRhX3N0cjsKKwljaGFyICpyZXM7CisKKwlpZiAoIXBxZCkgeworCQlyZXMgPSBrYXNwcmludGYoR0ZQX0FUT01JQywgInByb2NfcXR1X2RhdGFAbnVsbHt9Iik7CisJCV9idWdfb25fZXJyX29yX251bGwocmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJcGFyZW50X3RhZ19kYXRhX3N0ciA9IHBwX3VpZF90YWdfZGF0YShwcWQtPnBhcmVudF90YWdfZGF0YSk7CisJcmVzID0ga2FzcHJpbnRmKEdGUF9BVE9NSUMsICJwcm9jX3F0dV9kYXRhQCVweyIKKwkJCSJub2RlPXJiX25vZGV7Li4ufSwgcGlkPSV1LCAiCisJCQkicGFyZW50X3RhZ19kYXRhPSVzLCAiCisJCQkic29ja190YWdfbGlzdD1saXN0X2hlYWR7Li4ufX0iLAorCQkJcHFkLCBwcWQtPnBpZCwgcGFyZW50X3RhZ19kYXRhX3N0cgorCQkpOworCV9idWdfb25fZXJyX29yX251bGwocmVzKTsKKwlrZnJlZShwYXJlbnRfdGFnX2RhdGFfc3RyKTsKKwlyZXR1cm4gcmVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHByZGVidWdfc29ja190YWdfdHJlZShpbnQgaW5kZW50X2xldmVsLAorCQkJICAgc3RydWN0IHJiX3Jvb3QgKnNvY2tfdGFnX3RyZWUpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2tfdGFnICpzb2NrX3RhZ19lbnRyeTsKKwljaGFyICpzdHI7CisKKwlpZiAoIXVubGlrZWx5KHF0YWd1aWRfZGVidWdfbWFzayAmIERERUJVR19NQVNLKSkKKwkJcmV0dXJuOworCisJaWYgKFJCX0VNUFRZX1JPT1Qoc29ja190YWdfdHJlZSkpIHsKKwkJc3RyID0gInNvY2tfdGFnX3RyZWU9cmJfcm9vdHt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAic29ja190YWdfdHJlZT1yYl9yb290eyI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJaW5kZW50X2xldmVsKys7CisJZm9yIChub2RlID0gcmJfZmlyc3Qoc29ja190YWdfdHJlZSk7CisJICAgICBub2RlOworCSAgICAgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKKwkJc29ja190YWdfZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc29ja190YWcsIHNvY2tfbm9kZSk7CisJCXN0ciA9IHBwX3NvY2tfdGFnKHNvY2tfdGFnX2VudHJ5KTsKKwkJcHJfZGVidWcoIiUqZDogJXMsXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworCQlrZnJlZShzdHIpOworCX0KKwlpbmRlbnRfbGV2ZWwtLTsKKwlzdHIgPSAifSI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7Cit9CisKK3ZvaWQgcHJkZWJ1Z19zb2NrX3RhZ19saXN0KGludCBpbmRlbnRfbGV2ZWwsCisJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpzb2NrX3RhZ19saXN0KQoreworCXN0cnVjdCBzb2NrX3RhZyAqc29ja190YWdfZW50cnk7CisJY2hhciAqc3RyOworCisJaWYgKCF1bmxpa2VseShxdGFndWlkX2RlYnVnX21hc2sgJiBEREVCVUdfTUFTSykpCisJCXJldHVybjsKKworCWlmIChsaXN0X2VtcHR5KHNvY2tfdGFnX2xpc3QpKSB7CisJCXN0ciA9ICJzb2NrX3RhZ19saXN0PWxpc3RfaGVhZHt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAic29ja190YWdfbGlzdD1saXN0X2hlYWR7IjsKKwlwcl9kZWJ1ZygiJSpkOiAlc1xuIiwgaW5kZW50X2xldmVsKjIsIGluZGVudF9sZXZlbCwgc3RyKTsKKwlpbmRlbnRfbGV2ZWwrKzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNvY2tfdGFnX2VudHJ5LCBzb2NrX3RhZ19saXN0LCBsaXN0KSB7CisJCXN0ciA9IHBwX3NvY2tfdGFnKHNvY2tfdGFnX2VudHJ5KTsKKwkJcHJfZGVidWcoIiUqZDogJXMsXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworCQlrZnJlZShzdHIpOworCX0KKwlpbmRlbnRfbGV2ZWwtLTsKKwlzdHIgPSAifSI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7Cit9CisKK3ZvaWQgcHJkZWJ1Z19wcm9jX3F0dV9kYXRhX3RyZWUoaW50IGluZGVudF9sZXZlbCwKKwkJCQlzdHJ1Y3QgcmJfcm9vdCAqcHJvY19xdHVfZGF0YV90cmVlKQoreworCWNoYXIgKnN0cjsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcHJvY19xdHVfZGF0YSAqcHJvY19xdHVfZGF0YV9lbnRyeTsKKworCWlmICghdW5saWtlbHkocXRhZ3VpZF9kZWJ1Z19tYXNrICYgRERFQlVHX01BU0spKQorCQlyZXR1cm47CisKKwlpZiAoUkJfRU1QVFlfUk9PVChwcm9jX3F0dV9kYXRhX3RyZWUpKSB7CisJCXN0ciA9ICJwcm9jX3F0dV9kYXRhX3RyZWU9cmJfcm9vdHt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAicHJvY19xdHVfZGF0YV90cmVlPXJiX3Jvb3R7IjsKKwlwcl9kZWJ1ZygiJSpkOiAlc1xuIiwgaW5kZW50X2xldmVsKjIsIGluZGVudF9sZXZlbCwgc3RyKTsKKwlpbmRlbnRfbGV2ZWwrKzsKKwlmb3IgKG5vZGUgPSByYl9maXJzdChwcm9jX3F0dV9kYXRhX3RyZWUpOworCSAgICAgbm9kZTsKKwkgICAgIG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CisJCXByb2NfcXR1X2RhdGFfZW50cnkgPSByYl9lbnRyeShub2RlLAorCQkJCQkgICAgICAgc3RydWN0IHByb2NfcXR1X2RhdGEsCisJCQkJCSAgICAgICBub2RlKTsKKwkJc3RyID0gcHBfcHJvY19xdHVfZGF0YShwcm9jX3F0dV9kYXRhX2VudHJ5KTsKKwkJcHJfZGVidWcoIiUqZDogJXMsXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLAorCQkJIHN0cik7CisJCWtmcmVlKHN0cik7CisJCWluZGVudF9sZXZlbCsrOworCQlwcmRlYnVnX3NvY2tfdGFnX2xpc3QoaW5kZW50X2xldmVsLAorCQkJCSAgICAgICZwcm9jX3F0dV9kYXRhX2VudHJ5LT5zb2NrX3RhZ19saXN0KTsKKwkJaW5kZW50X2xldmVsLS07CisKKwl9CisJaW5kZW50X2xldmVsLS07CisJc3RyID0gIn0iOworCXByX2RlYnVnKCIlKmQ6ICVzXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworfQorCit2b2lkIHByZGVidWdfdGFnX3JlZl90cmVlKGludCBpbmRlbnRfbGV2ZWwsIHN0cnVjdCByYl9yb290ICp0YWdfcmVmX3RyZWUpCit7CisJY2hhciAqc3RyOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCB0YWdfcmVmICp0YWdfcmVmX2VudHJ5OworCisJaWYgKCF1bmxpa2VseShxdGFndWlkX2RlYnVnX21hc2sgJiBEREVCVUdfTUFTSykpCisJCXJldHVybjsKKworCWlmIChSQl9FTVBUWV9ST09UKHRhZ19yZWZfdHJlZSkpIHsKKwkJc3RyID0gInRhZ19yZWZfdHJlZXt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAidGFnX3JlZl90cmVleyI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJaW5kZW50X2xldmVsKys7CisJZm9yIChub2RlID0gcmJfZmlyc3QodGFnX3JlZl90cmVlKTsKKwkgICAgIG5vZGU7CisJICAgICBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQl0YWdfcmVmX2VudHJ5ID0gcmJfZW50cnkobm9kZSwKKwkJCQkJIHN0cnVjdCB0YWdfcmVmLAorCQkJCQkgdG4ubm9kZSk7CisJCXN0ciA9IHBwX3RhZ19yZWYodGFnX3JlZl9lbnRyeSk7CisJCXByX2RlYnVnKCIlKmQ6ICVzLFxuIiwgaW5kZW50X2xldmVsKjIsIGluZGVudF9sZXZlbCwKKwkJCSBzdHIpOworCQlrZnJlZShzdHIpOworCX0KKwlpbmRlbnRfbGV2ZWwtLTsKKwlzdHIgPSAifSI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7Cit9CisKK3ZvaWQgcHJkZWJ1Z191aWRfdGFnX2RhdGFfdHJlZShpbnQgaW5kZW50X2xldmVsLAorCQkJICAgICAgIHN0cnVjdCByYl9yb290ICp1aWRfdGFnX2RhdGFfdHJlZSkKK3sKKwljaGFyICpzdHI7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHVpZF90YWdfZGF0YSAqdWlkX3RhZ19kYXRhX2VudHJ5OworCisJaWYgKCF1bmxpa2VseShxdGFndWlkX2RlYnVnX21hc2sgJiBEREVCVUdfTUFTSykpCisJCXJldHVybjsKKworCWlmIChSQl9FTVBUWV9ST09UKHVpZF90YWdfZGF0YV90cmVlKSkgeworCQlzdHIgPSAidWlkX3RhZ19kYXRhX3RyZWU9cmJfcm9vdHt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAidWlkX3RhZ19kYXRhX3RyZWU9cmJfcm9vdHsiOworCXByX2RlYnVnKCIlKmQ6ICVzXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworCWluZGVudF9sZXZlbCsrOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KHVpZF90YWdfZGF0YV90cmVlKTsKKwkgICAgIG5vZGU7CisJICAgICBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQl1aWRfdGFnX2RhdGFfZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgdWlkX3RhZ19kYXRhLAorCQkJCQkgICAgICBub2RlKTsKKwkJc3RyID0gcHBfdWlkX3RhZ19kYXRhKHVpZF90YWdfZGF0YV9lbnRyeSk7CisJCXByX2RlYnVnKCIlKmQ6ICVzLFxuIiwgaW5kZW50X2xldmVsKjIsIGluZGVudF9sZXZlbCwgc3RyKTsKKwkJa2ZyZWUoc3RyKTsKKwkJaWYgKCFSQl9FTVBUWV9ST09UKCZ1aWRfdGFnX2RhdGFfZW50cnktPnRhZ19yZWZfdHJlZSkpIHsKKwkJCWluZGVudF9sZXZlbCsrOworCQkJcHJkZWJ1Z190YWdfcmVmX3RyZWUoaW5kZW50X2xldmVsLAorCQkJCQkgICAgICZ1aWRfdGFnX2RhdGFfZW50cnktPnRhZ19yZWZfdHJlZSk7CisJCQlpbmRlbnRfbGV2ZWwtLTsKKwkJfQorCX0KKwlpbmRlbnRfbGV2ZWwtLTsKKwlzdHIgPSAifSI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7Cit9CisKK3ZvaWQgcHJkZWJ1Z190YWdfc3RhdF90cmVlKGludCBpbmRlbnRfbGV2ZWwsCisJCQkJICBzdHJ1Y3QgcmJfcm9vdCAqdGFnX3N0YXRfdHJlZSkKK3sKKwljaGFyICpzdHI7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHRhZ19zdGF0ICp0c19lbnRyeTsKKworCWlmICghdW5saWtlbHkocXRhZ3VpZF9kZWJ1Z19tYXNrICYgRERFQlVHX01BU0spKQorCQlyZXR1cm47CisKKwlpZiAoUkJfRU1QVFlfUk9PVCh0YWdfc3RhdF90cmVlKSkgeworCQlzdHIgPSAidGFnX3N0YXRfdHJlZXt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAidGFnX3N0YXRfdHJlZXsiOworCXByX2RlYnVnKCIlKmQ6ICVzXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworCWluZGVudF9sZXZlbCsrOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KHRhZ19zdGF0X3RyZWUpOworCSAgICAgbm9kZTsKKwkgICAgIG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CisJCXRzX2VudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRhZ19zdGF0LCB0bi5ub2RlKTsKKwkJc3RyID0gcHBfdGFnX3N0YXQodHNfZW50cnkpOworCQlwcl9kZWJ1ZygiJSpkOiAlc1xuIiwgaW5kZW50X2xldmVsKjIsIGluZGVudF9sZXZlbCwKKwkJCSBzdHIpOworCQlrZnJlZShzdHIpOworCX0KKwlpbmRlbnRfbGV2ZWwtLTsKKwlzdHIgPSAifSI7CisJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7Cit9CisKK3ZvaWQgcHJkZWJ1Z19pZmFjZV9zdGF0X2xpc3QoaW50IGluZGVudF9sZXZlbCwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaWZhY2Vfc3RhdF9saXN0KQoreworCWNoYXIgKnN0cjsKKwlzdHJ1Y3QgaWZhY2Vfc3RhdCAqaWZhY2VfZW50cnk7CisKKwlpZiAoIXVubGlrZWx5KHF0YWd1aWRfZGVidWdfbWFzayAmIERERUJVR19NQVNLKSkKKwkJcmV0dXJuOworCisJaWYgKGxpc3RfZW1wdHkoaWZhY2Vfc3RhdF9saXN0KSkgeworCQlzdHIgPSAiaWZhY2Vfc3RhdF9saXN0PWxpc3RfaGVhZHt9IjsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCXJldHVybjsKKwl9CisKKwlzdHIgPSAiaWZhY2Vfc3RhdF9saXN0PWxpc3RfaGVhZHsiOworCXByX2RlYnVnKCIlKmQ6ICVzXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworCWluZGVudF9sZXZlbCsrOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaWZhY2VfZW50cnksIGlmYWNlX3N0YXRfbGlzdCwgbGlzdCkgeworCQlzdHIgPSBwcF9pZmFjZV9zdGF0KGlmYWNlX2VudHJ5KTsKKwkJcHJfZGVidWcoIiUqZDogJXNcbiIsIGluZGVudF9sZXZlbCoyLCBpbmRlbnRfbGV2ZWwsIHN0cik7CisJCWtmcmVlKHN0cik7CisKKwkJc3Bpbl9sb2NrX2JoKCZpZmFjZV9lbnRyeS0+dGFnX3N0YXRfbGlzdF9sb2NrKTsKKwkJaWYgKCFSQl9FTVBUWV9ST09UKCZpZmFjZV9lbnRyeS0+dGFnX3N0YXRfdHJlZSkpIHsKKwkJCWluZGVudF9sZXZlbCsrOworCQkJcHJkZWJ1Z190YWdfc3RhdF90cmVlKGluZGVudF9sZXZlbCwKKwkJCQkJICAgICAgJmlmYWNlX2VudHJ5LT50YWdfc3RhdF90cmVlKTsKKwkJCWluZGVudF9sZXZlbC0tOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZpZmFjZV9lbnRyeS0+dGFnX3N0YXRfbGlzdF9sb2NrKTsKKwl9CisJaW5kZW50X2xldmVsLS07CisJc3RyID0gIn0iOworCXByX2RlYnVnKCIlKmQ6ICVzXG4iLCBpbmRlbnRfbGV2ZWwqMiwgaW5kZW50X2xldmVsLCBzdHIpOworfQorCisjZW5kaWYgIC8qIGlmZGVmIERERUJVRyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuZXRkZXZfZXZlbnRfc3RyaW5nc1tdID0geworCSJuZXRkZXZfdW5rbm93biIsCisJIk5FVERFVl9VUCIsCisJIk5FVERFVl9ET1dOIiwKKwkiTkVUREVWX1JFQk9PVCIsCisJIk5FVERFVl9DSEFOR0UiLAorCSJORVRERVZfUkVHSVNURVIiLAorCSJORVRERVZfVU5SRUdJU1RFUiIsCisJIk5FVERFVl9DSEFOR0VNVFUiLAorCSJORVRERVZfQ0hBTkdFQUREUiIsCisJIk5FVERFVl9HT0lOR19ET1dOIiwKKwkiTkVUREVWX0NIQU5HRU5BTUUiLAorCSJORVRERVZfRkVBVF9DSEFOR0UiLAorCSJORVRERVZfQk9ORElOR19GQUlMT1ZFUiIsCisJIk5FVERFVl9QUkVfVVAiLAorCSJORVRERVZfUFJFX1RZUEVfQ0hBTkdFIiwKKwkiTkVUREVWX1BPU1RfVFlQRV9DSEFOR0UiLAorCSJORVRERVZfUE9TVF9JTklUIiwKKwkiTkVUREVWX1VOUkVHSVNURVJfQkFUQ0giLAorCSJORVRERVZfUkVMRUFTRSIsCisJIk5FVERFVl9OT1RJRllfUEVFUlMiLAorCSJORVRERVZfSk9JTiIsCit9OworCitjb25zdCBjaGFyICpuZXRkZXZfZXZ0X3N0cihpbnQgbmV0ZGV2X2V2ZW50KQoreworCWlmIChuZXRkZXZfZXZlbnQgPCAwCisJICAgIHx8IG5ldGRldl9ldmVudCA+PSBBUlJBWV9TSVpFKG5ldGRldl9ldmVudF9zdHJpbmdzKSkKKwkJcmV0dXJuICJiYWQgZXZlbnQgbnVtIjsKKwlyZXR1cm4gbmV0ZGV2X2V2ZW50X3N0cmluZ3NbbmV0ZGV2X2V2ZW50XTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9wcmludC5oIGIvbmV0L25ldGZpbHRlci94dF9xdGFndWlkX3ByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzODcxYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9wcmludC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogUHJldHR5IHByaW50aW5nIFN1cHBvcnQgZm9yIGlwdGFibGVzIHh0X3F0YWd1aWQgbW9kdWxlLgorICoKKyAqIChDKSAyMDExIEdvb2dsZSwgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX1hUX1FUQUdVSURfUFJJTlRfSF9fCisjZGVmaW5lIF9fWFRfUVRBR1VJRF9QUklOVF9IX18KKworI2luY2x1ZGUgInh0X3F0YWd1aWRfaW50ZXJuYWwuaCIKKworI2lmZGVmIERERUJVRworCitjaGFyICpwcF90YWdfdCh0YWdfdCAqdGFnKTsKK2NoYXIgKnBwX2RhdGFfY291bnRlcnMoc3RydWN0IGRhdGFfY291bnRlcnMgKmRjLCBib29sIHNob3dWYWx1ZXMpOworY2hhciAqcHBfdGFnX25vZGUoc3RydWN0IHRhZ19ub2RlICp0bik7CitjaGFyICpwcF90YWdfcmVmKHN0cnVjdCB0YWdfcmVmICp0cik7CitjaGFyICpwcF90YWdfc3RhdChzdHJ1Y3QgdGFnX3N0YXQgKnRzKTsKK2NoYXIgKnBwX2lmYWNlX3N0YXQoc3RydWN0IGlmYWNlX3N0YXQgKmlzKTsKK2NoYXIgKnBwX3NvY2tfdGFnKHN0cnVjdCBzb2NrX3RhZyAqc3QpOworY2hhciAqcHBfdWlkX3RhZ19kYXRhKHN0cnVjdCB1aWRfdGFnX2RhdGEgKnF0ZCk7CitjaGFyICpwcF9wcm9jX3F0dV9kYXRhKHN0cnVjdCBwcm9jX3F0dV9kYXRhICpwcWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHByZGVidWdfc29ja190YWdfbGlzdChpbnQgaW5kZW50X2xldmVsLAorCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqc29ja190YWdfbGlzdCk7Cit2b2lkIHByZGVidWdfc29ja190YWdfdHJlZShpbnQgaW5kZW50X2xldmVsLAorCQkJICAgc3RydWN0IHJiX3Jvb3QgKnNvY2tfdGFnX3RyZWUpOwordm9pZCBwcmRlYnVnX3Byb2NfcXR1X2RhdGFfdHJlZShpbnQgaW5kZW50X2xldmVsLAorCQkJCXN0cnVjdCByYl9yb290ICpwcm9jX3F0dV9kYXRhX3RyZWUpOwordm9pZCBwcmRlYnVnX3RhZ19yZWZfdHJlZShpbnQgaW5kZW50X2xldmVsLCBzdHJ1Y3QgcmJfcm9vdCAqdGFnX3JlZl90cmVlKTsKK3ZvaWQgcHJkZWJ1Z191aWRfdGFnX2RhdGFfdHJlZShpbnQgaW5kZW50X2xldmVsLAorCQkJICAgICAgIHN0cnVjdCByYl9yb290ICp1aWRfdGFnX2RhdGFfdHJlZSk7Cit2b2lkIHByZGVidWdfdGFnX3N0YXRfdHJlZShpbnQgaW5kZW50X2xldmVsLAorCQkJICAgc3RydWN0IHJiX3Jvb3QgKnRhZ19zdGF0X3RyZWUpOwordm9pZCBwcmRlYnVnX2lmYWNlX3N0YXRfbGlzdChpbnQgaW5kZW50X2xldmVsLAorCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICppZmFjZV9zdGF0X2xpc3QpOworCisjZWxzZQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW5saW5lIGNoYXIgKnBwX3RhZ190KHRhZ190ICp0YWcpCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIGNoYXIgKnBwX2RhdGFfY291bnRlcnMoc3RydWN0IGRhdGFfY291bnRlcnMgKmRjLCBib29sIHNob3dWYWx1ZXMpCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIGNoYXIgKnBwX3RhZ19ub2RlKHN0cnVjdCB0YWdfbm9kZSAqdG4pCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIGNoYXIgKnBwX3RhZ19yZWYoc3RydWN0IHRhZ19yZWYgKnRyKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBjaGFyICpwcF90YWdfc3RhdChzdHJ1Y3QgdGFnX3N0YXQgKnRzKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBjaGFyICpwcF9pZmFjZV9zdGF0KHN0cnVjdCBpZmFjZV9zdGF0ICppcykKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgY2hhciAqcHBfc29ja190YWcoc3RydWN0IHNvY2tfdGFnICpzdCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgY2hhciAqcHBfdWlkX3RhZ19kYXRhKHN0cnVjdCB1aWRfdGFnX2RhdGEgKnF0ZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgY2hhciAqcHBfcHJvY19xdHVfZGF0YShzdHJ1Y3QgcHJvY19xdHVfZGF0YSAqcHFkKQoreworCXJldHVybiBOVUxMOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW5saW5lCit2b2lkIHByZGVidWdfc29ja190YWdfbGlzdChpbnQgaW5kZW50X2xldmVsLAorCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqc29ja190YWdfbGlzdCkKK3sKK30KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcHJkZWJ1Z19zb2NrX3RhZ190cmVlKGludCBpbmRlbnRfbGV2ZWwsCisJCQkgICBzdHJ1Y3QgcmJfcm9vdCAqc29ja190YWdfdHJlZSkKK3sKK30KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcHJkZWJ1Z19wcm9jX3F0dV9kYXRhX3RyZWUoaW50IGluZGVudF9sZXZlbCwKKwkJCQlzdHJ1Y3QgcmJfcm9vdCAqcHJvY19xdHVfZGF0YV90cmVlKQoreworfQorc3RhdGljIGlubGluZQordm9pZCBwcmRlYnVnX3RhZ19yZWZfdHJlZShpbnQgaW5kZW50X2xldmVsLCBzdHJ1Y3QgcmJfcm9vdCAqdGFnX3JlZl90cmVlKQoreworfQorc3RhdGljIGlubGluZQordm9pZCBwcmRlYnVnX3VpZF90YWdfZGF0YV90cmVlKGludCBpbmRlbnRfbGV2ZWwsCisJCQkgICAgICAgc3RydWN0IHJiX3Jvb3QgKnVpZF90YWdfZGF0YV90cmVlKQoreworfQorc3RhdGljIGlubGluZQordm9pZCBwcmRlYnVnX3RhZ19zdGF0X3RyZWUoaW50IGluZGVudF9sZXZlbCwKKwkJCSAgIHN0cnVjdCByYl9yb290ICp0YWdfc3RhdF90cmVlKQoreworfQorc3RhdGljIGlubGluZQordm9pZCBwcmRlYnVnX2lmYWNlX3N0YXRfbGlzdChpbnQgaW5kZW50X2xldmVsLAorCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICppZmFjZV9zdGF0X2xpc3QpCit7Cit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IGNoYXIgKm5ldGRldl9ldnRfc3RyKGludCBuZXRkZXZfZXZlbnQpOworI2VuZGlmICAvKiBpZm5kZWYgX19YVF9RVEFHVUlEX1BSSU5UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9xdW90YTIuYyBiL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3MmJlYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEyLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiB4dF9xdW90YTIgLSBlbmhhbmNlZCB4dF9xdW90YSB0aGF0IGNhbiBjb3VudCB1cHdhcmRzIGFuZCBpbiBwYWNrZXRzCisgKiBhcyBhIG1pbmltYWwgYWNjb3VudGluZyBtYXRjaC4KKyAqIGJ5IEphbiBFbmdlbGhhcmR0IDxqZW5nZWxoQG1lZG96YXMuZGU+LCAyMDA4CisgKgorICogT3JpZ2luYWxseSBiYXNlZCBvbiB4dF9xdW90YS5jOgorICogCW5ldGZpbHRlciBtb2R1bGUgdG8gZW5mb3JjZSBuZXR3b3JrIHF1b3RhcworICogCVNhbSBKb2huc3RvbiA8c2FtakBzYW1qLm5ldD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTsgZWl0aGVyCisgKgl2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9xdW90YTIuaD4KKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBMl9MT0cKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVUxPRy5oPgorI2VuZGlmCisKKy8qKgorICogQGxvY2s6CWxvY2sgdG8gcHJvdGVjdCBxdW90YSB3cml0ZXJzIGZyb20gZWFjaCBvdGhlcgorICovCitzdHJ1Y3QgeHRfcXVvdGFfY291bnRlciB7CisJdV9pbnQ2NF90IHF1b3RhOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJYXRvbWljX3QgcmVmOworCWNoYXIgbmFtZVtzaXplb2YoKChzdHJ1Y3QgeHRfcXVvdGFfbXRpbmZvMiAqKU5VTEwpLT5uYW1lKV07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jZnNfZW50cnk7Cit9OworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQTJfTE9HCisvKiBIYXJhbGQncyBmYXZvcml0ZSBudW1iZXIgKzEgOkQgRnJvbSBpcHRfVUxPRy5DICovCitzdGF0aWMgaW50IHFsb2dfbmxfZXZlbnQgPSAxMTI7Cittb2R1bGVfcGFyYW1fbmFtZWQoZXZlbnRfbnVtLCBxbG9nX25sX2V2ZW50LCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGV2ZW50X251bSwKKwkJICJFdmVudCBudW1iZXIgZm9yIE5FVExJTktfTkZMT0cgbWVzc2FnZS4gMCBkaXNhYmxlcyBsb2cuIgorCQkgIjExMSBpcyB3aGF0IGlwdF9VTE9HIHVzZXMuIik7CitzdGF0aWMgc3RydWN0IHNvY2sgKm5mbG9nbmw7CisjZW5kaWYKKworc3RhdGljIExJU1RfSEVBRChjb3VudGVyX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhjb3VudGVyX2xpc3RfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfeHRfcXVvdGE7CitzdGF0aWMgdW5zaWduZWQgaW50IHF1b3RhX2xpc3RfcGVybXMgPSBTX0lSVUdPIHwgU19JV1VTUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXVvdGFfbGlzdF91aWQgICA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHF1b3RhX2xpc3RfZ2lkICAgPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKHBlcm1zLCBxdW90YV9saXN0X3Blcm1zLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fbmFtZWQodWlkLCBxdW90YV9saXN0X3VpZCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKGdpZCwgcXVvdGFfbGlzdF9naWQsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQTJfTE9HCitzdGF0aWMgdm9pZCBxdW90YTJfbG9nKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgICAgICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJdWxvZ19wYWNrZXRfbXNnX3QgKnBtOworCXN0cnVjdCBza19idWZmICpsb2dfc2tiOworCXNpemVfdCBzaXplOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCisJaWYgKCFxbG9nX25sX2V2ZW50KQorCQlyZXR1cm47CisKKwlzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpwbSkpOworCXNpemUgPSBtYXgoc2l6ZSwgKHNpemVfdClOTE1TR19HT09EU0laRSk7CisJbG9nX3NrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWxvZ19za2IpIHsKKwkJcHJfZXJyKCJ4dF9xdW90YTI6IGNhbm5vdCBhbGxvYyBza2IgZm9yIGxvZ2dpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogTkxNU0dfUFVUKCkgdXNlcyAiZ290byBubG1zZ19mYWlsdXJlIiAqLworCW5saCA9IE5MTVNHX1BVVChsb2dfc2tiLCAvKnBpZCovMCwgLypzZXEqLzAsIHFsb2dfbmxfZXZlbnQsCisJCQlzaXplb2YoKnBtKSk7CisJcG0gPSBOTE1TR19EQVRBKG5saCk7CisJaWYgKHNrYi0+dHN0YW1wLnR2NjQgPT0gMCkKKwkJX19uZXRfdGltZXN0YW1wKChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYik7CisJcG0tPmRhdGFfbGVuID0gMDsKKwlwbS0+aG9vayA9IGhvb2tudW07CisJaWYgKHByZWZpeCAhPSBOVUxMKQorCQlzdHJsY3B5KHBtLT5wcmVmaXgsIHByZWZpeCwgc2l6ZW9mKHBtLT5wcmVmaXgpKTsKKwllbHNlCisJCSoocG0tPnByZWZpeCkgPSAnXDAnOworCWlmIChpbikKKwkJc3RybGNweShwbS0+aW5kZXZfbmFtZSwgaW4tPm5hbWUsIHNpemVvZihwbS0+aW5kZXZfbmFtZSkpOworCWVsc2UKKwkJcG0tPmluZGV2X25hbWVbMF0gPSAnXDAnOworCisJaWYgKG91dCkKKwkJc3RybGNweShwbS0+b3V0ZGV2X25hbWUsIG91dC0+bmFtZSwgc2l6ZW9mKHBtLT5vdXRkZXZfbmFtZSkpOworCWVsc2UKKwkJcG0tPm91dGRldl9uYW1lWzBdID0gJ1wwJzsKKworCU5FVExJTktfQ0IobG9nX3NrYikuZHN0X2dyb3VwID0gMTsKKwlwcl9kZWJ1ZygidGhyb3dpbmcgMSBwYWNrZXRzIHRvIG5ldGxpbmsgZ3JvdXAgMVxuIik7CisJbmV0bGlua19icm9hZGNhc3QobmZsb2dubCwgbG9nX3NrYiwgMCwgMSwgR0ZQX0FUT01JQyk7CisKK25sbXNnX2ZhaWx1cmU6ICAvKiBVc2VkIHdpdGhpbiBOTE1TR19QVVQoKSAqLworCXByX2RlYnVnKCJ4dF9xdW90YTI6IGVycm9yIGR1cmluZyBOTE1TR19QVVRcbiIpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHF1b3RhMl9sb2codW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKK30KKyNlbmRpZiAgLyogaWYrZWxzZSBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBMl9MT0cgKi8KKworc3RhdGljIGludCBxdW90YV9wcm9jX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB4dF9xdW90YV9jb3VudGVyICplID0gZGF0YTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2JoKCZlLT5sb2NrKTsKKwlyZXQgPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlbGx1XG4iLCBlLT5xdW90YSk7CisJc3Bpbl91bmxvY2tfYmgoJmUtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXVvdGFfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgeHRfcXVvdGFfY291bnRlciAqZSA9IGRhdGE7CisJY2hhciBidWZbc2l6ZW9mKCIxODQ0Njc0NDA3MzcwOTU1MTYxNiIpXTsKKworCWlmIChzaXplID4gc2l6ZW9mKGJ1ZikpCisJCXNpemUgPSBzaXplb2YoYnVmKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBpbnB1dCwgc2l6ZSkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW3NpemVvZihidWYpLTFdID0gJ1wwJzsKKworCXNwaW5fbG9ja19iaCgmZS0+bG9jayk7CisJZS0+cXVvdGEgPSBzaW1wbGVfc3RydG91bGwoYnVmLCBOVUxMLCAwKTsKKwlzcGluX3VubG9ja19iaCgmZS0+bG9jayk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfcXVvdGFfY291bnRlciAqCitxMl9uZXdfY291bnRlcihjb25zdCBzdHJ1Y3QgeHRfcXVvdGFfbXRpbmZvMiAqcSwgYm9vbCBhbm9uKQoreworCXN0cnVjdCB4dF9xdW90YV9jb3VudGVyICplOworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogRG8gbm90IG5lZWQgYWxsIHRoZSBwcm9jZnMgdGhpbmdzIGZvciBhbm9ueW1vdXMgY291bnRlcnMuICovCisJc2l6ZSA9IGFub24gPyBvZmZzZXRvZih0eXBlb2YoKmUpLCBsaXN0KSA6IHNpemVvZigqZSk7CisJZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwllLT5xdW90YSA9IHEtPnF1b3RhOworCXNwaW5fbG9ja19pbml0KCZlLT5sb2NrKTsKKwlpZiAoIWFub24pIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmUtPmxpc3QpOworCQlhdG9taWNfc2V0KCZlLT5yZWYsIDEpOworCQlzdHJsY3B5KGUtPm5hbWUsIHEtPm5hbWUsIHNpemVvZihlLT5uYW1lKSk7CisJfQorCXJldHVybiBlOworfQorCisvKioKKyAqIHEyX2dldF9jb3VudGVyIC0gZ2V0IHJlZiB0byBjb3VudGVyIG9yIGNyZWF0ZSBuZXcKKyAqIEBuYW1lOgluYW1lIG9mIGNvdW50ZXIKKyAqLworc3RhdGljIHN0cnVjdCB4dF9xdW90YV9jb3VudGVyICoKK3EyX2dldF9jb3VudGVyKGNvbnN0IHN0cnVjdCB4dF9xdW90YV9tdGluZm8yICpxKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKwlzdHJ1Y3QgeHRfcXVvdGFfY291bnRlciAqZSA9IE5VTEw7CisJc3RydWN0IHh0X3F1b3RhX2NvdW50ZXIgKm5ld19lOworCisJaWYgKCpxLT5uYW1lID09ICdcMCcpCisJCXJldHVybiBxMl9uZXdfY291bnRlcihxLCB0cnVlKTsKKworCS8qIE5vIG5lZWQgdG8gaG9sZCBhIGxvY2sgd2hpbGUgZ2V0dGluZyBhIG5ldyBjb3VudGVyICovCisJbmV3X2UgPSBxMl9uZXdfY291bnRlcihxLCBmYWxzZSk7CisJaWYgKG5ld19lID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2JoKCZjb3VudGVyX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmY291bnRlcl9saXN0LCBsaXN0KQorCQlpZiAoc3RyY21wKGUtPm5hbWUsIHEtPm5hbWUpID09IDApIHsKKwkJCWF0b21pY19pbmMoJmUtPnJlZik7CisJCQlzcGluX3VubG9ja19iaCgmY291bnRlcl9saXN0X2xvY2spOworCQkJa2ZyZWUobmV3X2UpOworCQkJcHJfZGVidWcoInh0X3F1b3RhMjogb2xkIGNvdW50ZXIgbmFtZT0lcyIsIGUtPm5hbWUpOworCQkJcmV0dXJuIGU7CisJCX0KKwllID0gbmV3X2U7CisJcHJfZGVidWcoInh0X3F1b3RhMjogbmV3X2NvdW50ZXIgbmFtZT0lcyIsIGUtPm5hbWUpOworCWxpc3RfYWRkX3RhaWwoJmUtPmxpc3QsICZjb3VudGVyX2xpc3QpOworCS8qIFRoZSBlbnRyeSBoYXZpbmcgYSByZWZjb3VudCBvZiAxIGlzIG5vdCBkaXJlY3RseSBkZXN0cnVjdGlibGUuCisJICogVGhpcyBmdW5jIGhhcyBub3QgeWV0IHJldHVybmVkIHRoZSBuZXcgZW50cnksIHRodXMgaXB0YWJsZXMKKwkgKiBoYXMgbm90IHJlZmVyZW5jZXMgZm9yIGRlc3Ryb3lpbmcgdGhpcyBlbnRyeS4KKwkgKiBGb3IgYW5vdGhlciBydWxlIHRvIHRyeSB0byBkZXN0cm95IGl0LCBpdCB3b3VsZCAxc3QgbmVlZCBmb3IgdGhpcworCSAqIGZ1bmMqIHRvIGJlIHJlLWludm9rZWQsIGFjcXVpcmUgYSBuZXcgcmVmIGZvciB0aGUgc2FtZSBuYW1lZCBxdW90YS4KKwkgKiBOb2JvZHkgd2lsbCBhY2Nlc3MgdGhlIGUtPnByb2Nmc19lbnRyeSBlaXRoZXIuCisJICogU28gcmVsZWFzZSB0aGUgbG9jay4gKi8KKwlzcGluX3VubG9ja19iaCgmY291bnRlcl9saXN0X2xvY2spOworCisJLyogY3JlYXRlX3Byb2NfZW50cnkoKSBpcyBub3Qgc3Bpbl9sb2NrIGhhcHB5ICovCisJcCA9IGUtPnByb2Nmc19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGUtPm5hbWUsIHF1b3RhX2xpc3RfcGVybXMsCisJICAgICAgICAgICAgICAgICAgICAgIHByb2NfeHRfcXVvdGEpOworCisJaWYgKElTX0VSUl9PUl9OVUxMKHApKSB7CisJCXNwaW5fbG9ja19iaCgmY291bnRlcl9saXN0X2xvY2spOworCQlsaXN0X2RlbCgmZS0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2JoKCZjb3VudGVyX2xpc3RfbG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlwLT5kYXRhICAgICAgICAgPSBlOworCXAtPnJlYWRfcHJvYyAgICA9IHF1b3RhX3Byb2NfcmVhZDsKKwlwLT53cml0ZV9wcm9jICAgPSBxdW90YV9wcm9jX3dyaXRlOworCXAtPnVpZCAgICAgICAgICA9IHF1b3RhX2xpc3RfdWlkOworCXAtPmdpZCAgICAgICAgICA9IHF1b3RhX2xpc3RfZ2lkOworCXJldHVybiBlOworCisgb3V0OgorCWtmcmVlKGUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHF1b3RhX210Ml9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgeHRfcXVvdGFfbXRpbmZvMiAqcSA9IHBhci0+bWF0Y2hpbmZvOworCisJcHJfZGVidWcoInh0X3F1b3RhMjogY2hlY2soKSBmbGFncz0weCUwNHgiLCBxLT5mbGFncyk7CisKKwlpZiAocS0+ZmxhZ3MgJiB+WFRfUVVPVEFfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlxLT5uYW1lW3NpemVvZihxLT5uYW1lKS0xXSA9ICdcMCc7CisJaWYgKCpxLT5uYW1lID09ICcuJyB8fCBzdHJjaHIocS0+bmFtZSwgJy8nKSAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAieHRfcXVvdGEuMzogaWxsZWdhbCBuYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcS0+bWFzdGVyID0gcTJfZ2V0X2NvdW50ZXIocSk7CisJaWYgKHEtPm1hc3RlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAieHRfcXVvdGEuMzogbWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcXVvdGFfbXQyX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQoreworCXN0cnVjdCB4dF9xdW90YV9tdGluZm8yICpxID0gcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHh0X3F1b3RhX2NvdW50ZXIgKmUgPSBxLT5tYXN0ZXI7CisKKwlpZiAoKnEtPm5hbWUgPT0gJ1wwJykgeworCQlrZnJlZShlKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19iaCgmY291bnRlcl9saXN0X2xvY2spOworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZS0+cmVmKSkgeworCQlzcGluX3VubG9ja19iaCgmY291bnRlcl9saXN0X2xvY2spOworCQlyZXR1cm47CisJfQorCisJbGlzdF9kZWwoJmUtPmxpc3QpOworCXJlbW92ZV9wcm9jX2VudHJ5KGUtPm5hbWUsIHByb2NfeHRfcXVvdGEpOworCXNwaW5fdW5sb2NrX2JoKCZjb3VudGVyX2xpc3RfbG9jayk7CisJa2ZyZWUoZSk7Cit9CisKK3N0YXRpYyBib29sCitxdW90YV9tdDIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCXN0cnVjdCB4dF9xdW90YV9tdGluZm8yICpxID0gKHZvaWQgKilwYXItPm1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfcXVvdGFfY291bnRlciAqZSA9IHEtPm1hc3RlcjsKKwlib29sIHJldCA9IHEtPmZsYWdzICYgWFRfUVVPVEFfSU5WRVJUOworCisJc3Bpbl9sb2NrX2JoKCZlLT5sb2NrKTsKKwlpZiAocS0+ZmxhZ3MgJiBYVF9RVU9UQV9HUk9XKSB7CisJCS8qCisJCSAqIFdoaWxlIG5vX2NoYW5nZSBpcyBwb2ludGxlc3MgaW4gImdyb3ciIG1vZGUsIHdlIHdpbGwKKwkJICogaW1wbGVtZW50IGl0IGhlcmUgc2ltcGx5IHRvIGhhdmUgYSBjb25zaXN0ZW50IGJlaGF2aW9yLgorCQkgKi8KKwkJaWYgKCEocS0+ZmxhZ3MgJiBYVF9RVU9UQV9OT19DSEFOR0UpKSB7CisJCQllLT5xdW90YSArPSAocS0+ZmxhZ3MgJiBYVF9RVU9UQV9QQUNLRVQpID8gMSA6IHNrYi0+bGVuOworCQl9CisJCXJldCA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKGUtPnF1b3RhID49IHNrYi0+bGVuKSB7CisJCQlpZiAoIShxLT5mbGFncyAmIFhUX1FVT1RBX05PX0NIQU5HRSkpCisJCQkJZS0+cXVvdGEgLT0gKHEtPmZsYWdzICYgWFRfUVVPVEFfUEFDS0VUKSA/IDEgOiBza2ItPmxlbjsKKwkJCXJldCA9ICFyZXQ7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBhcmUgdHJhbnNpdGlvbmluZywgbG9nIHRoYXQgZmFjdC4gKi8KKwkJCWlmIChlLT5xdW90YSkgeworCQkJCXF1b3RhMl9sb2cocGFyLT5ob29rbnVtLAorCQkJCQkgICBza2IsCisJCQkJCSAgIHBhci0+aW4sCisJCQkJCSAgIHBhci0+b3V0LAorCQkJCQkgICBxLT5uYW1lKTsKKwkJCX0KKwkJCS8qIHdlIGRvIG5vdCBhbGxvdyBldmVuIHNtYWxsIHBhY2tldHMgZnJvbSBub3cgb24gKi8KKwkJCWUtPnF1b3RhID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmZS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBxdW90YV9tdDJfcmVnW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gInF1b3RhMiIsCisJCS5yZXZpc2lvbiAgID0gMywKKwkJLmZhbWlseSAgICAgPSBORlBST1RPX0lQVjQsCisJCS5jaGVja2VudHJ5ID0gcXVvdGFfbXQyX2NoZWNrLAorCQkubWF0Y2ggICAgICA9IHF1b3RhX210MiwKKwkJLmRlc3Ryb3kgICAgPSBxdW90YV9tdDJfZGVzdHJveSwKKwkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X3F1b3RhX210aW5mbzIpLAorCQkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJxdW90YTIiLAorCQkucmV2aXNpb24gICA9IDMsCisJCS5mYW1pbHkgICAgID0gTkZQUk9UT19JUFY2LAorCQkuY2hlY2tlbnRyeSA9IHF1b3RhX210Ml9jaGVjaywKKwkJLm1hdGNoICAgICAgPSBxdW90YV9tdDIsCisJCS5kZXN0cm95ICAgID0gcXVvdGFfbXQyX2Rlc3Ryb3ksCisJCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF9xdW90YV9tdGluZm8yKSwKKwkJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcXVvdGFfbXQyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXByX2RlYnVnKCJ4dF9xdW90YTI6IGluaXQoKSIpOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQTJfTE9HCisJbmZsb2dubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZSgmaW5pdF9uZXQsCisJCQkJCU5FVExJTktfTkZMT0csIDEsIE5VTEwsCisJCQkJCU5VTEwsIFRISVNfTU9EVUxFKTsKKwlpZiAoIW5mbG9nbmwpCisJCXJldHVybiAtRU5PTUVNOworI2VuZGlmCisKKwlwcm9jX3h0X3F1b3RhID0gcHJvY19ta2RpcigieHRfcXVvdGEiLCBpbml0X25ldC5wcm9jX25ldCk7CisJaWYgKHByb2NfeHRfcXVvdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaGVzKHF1b3RhX210Ml9yZWcsIEFSUkFZX1NJWkUocXVvdGFfbXQyX3JlZykpOworCWlmIChyZXQgPCAwKQorCQlyZW1vdmVfcHJvY19lbnRyeSgieHRfcXVvdGEiLCBpbml0X25ldC5wcm9jX25ldCk7CisJcHJfZGVidWcoInh0X3F1b3RhMjogaW5pdCgpICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcXVvdGFfbXQyX2V4aXQodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoZXMocXVvdGFfbXQyX3JlZywgQVJSQVlfU0laRShxdW90YV9tdDJfcmVnKSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoInh0X3F1b3RhIiwgaW5pdF9uZXQucHJvY19uZXQpOworfQorCittb2R1bGVfaW5pdChxdW90YV9tdDJfaW5pdCk7Cittb2R1bGVfZXhpdChxdW90YV9tdDJfZXhpdCk7CitNT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IGNvdW50ZG93biBxdW90YSBtYXRjaDsgdXAgY291bnRlciIpOworTU9EVUxFX0FVVEhPUigiU2FtIEpvaG5zdG9uIDxzYW1qQHNhbWoubmV0PiIpOworTU9EVUxFX0FVVEhPUigiSmFuIEVuZ2VsaGFyZHQgPGplbmdlbGhAbWVkb3phcy5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X3F1b3RhMiIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3F1b3RhMiIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKaW5kZXggOWNjNDYzNS4uMzI3ODZkOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNlbmRpZgogCi1zdGF0aWMgdm9pZAordm9pZAogeHRfc29ja2V0X3B1dF9zayhzdHJ1Y3Qgc29jayAqc2spCiB7CiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQpAQCAtNDMsNiArNDMsNyBAQAogCWVsc2UKIAkJc29ja19wdXQoc2spOwogfQorRVhQT1JUX1NZTUJPTCh4dF9zb2NrZXRfcHV0X3NrKTsKIAogc3RhdGljIGludAogZXh0cmFjdF9pY21wNF9maWVsZHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTEwMSw5ICsxMDIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbAotc29ja2V0X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKLQkgICAgIGNvbnN0IHN0cnVjdCB4dF9zb2NrZXRfbXRpbmZvMSAqaW5mbykKK3N0cnVjdCBzb2NrKgoreHRfc29ja2V0X2dldDRfc2soY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IHVkcGhkciBfaGRyLCAqaHAgPSBOVUxMOwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksCiAJCQkJCXNpemVvZihfaGRyKSwgJl9oZHIpOwogCQlpZiAoaHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBOVUxMOwogCiAJCXByb3RvY29sID0gaXBoLT5wcm90b2NvbDsKIAkJc2FkZHIgPSBpcGgtPnNhZGRyOwpAQCAtMTMxLDkgKzEzMSw5IEBACiAJfSBlbHNlIGlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkgewogCQlpZiAoZXh0cmFjdF9pY21wNF9maWVsZHMoc2tiLCAmcHJvdG9jb2wsICZzYWRkciwgJmRhZGRyLAogCQkJCQkmc3BvcnQsICZkcG9ydCkpCi0JCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgewotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBOVUxMOwogCX0KIAogI2lmZGVmIFhUX1NPQ0tFVF9IQVZFX0NPTk5UUkFDSwpAQCAtMTU3LDYgKzE1NywyMyBAQAogCiAJc2sgPSBuZl90cHJveHlfZ2V0X3NvY2tfdjQoZGV2X25ldChza2ItPmRldiksIHByb3RvY29sLAogCQkJCSAgIHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0LCBwYXItPmluLCBORlRfTE9PS1VQX0FOWSk7CisKKwlwcl9kZWJ1ZygicHJvdG8gJWhodSAlcEk0OiVodSAtPiAlcEk0OiVodSAob3JpZyAlcEk0OiVodSkgc29jayAlcFxuIiwKKwkJIHByb3RvY29sLCAmc2FkZHIsIG50b2hzKHNwb3J0KSwKKwkJICZkYWRkciwgbnRvaHMoZHBvcnQpLAorCQkgJmlwaC0+ZGFkZHIsIGhwID8gbnRvaHMoaHAtPmRlc3QpIDogMCwgc2spOworCisJcmV0dXJuIHNrOworfQorRVhQT1JUX1NZTUJPTCh4dF9zb2NrZXRfZ2V0NF9zayk7CisKK3N0YXRpYyBib29sCitzb2NrZXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCSAgICAgY29uc3Qgc3RydWN0IHh0X3NvY2tldF9tdGluZm8xICppbmZvKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXNrID0geHRfc29ja2V0X2dldDRfc2soc2tiLCBwYXIpOwogCWlmIChzayAhPSBOVUxMKSB7CiAJCWJvb2wgd2lsZGNhcmQ7CiAJCWJvb2wgdHJhbnNwYXJlbnQgPSB0cnVlOwpAQCAtMTc5LDExICsxOTYsNiBAQAogCQkJc2sgPSBOVUxMOwogCX0KIAotCXByX2RlYnVnKCJwcm90byAlaGh1ICVwSTQ6JWh1IC0+ICVwSTQ6JWh1IChvcmlnICVwSTQ6JWh1KSBzb2NrICVwXG4iLAotCQkgcHJvdG9jb2wsICZzYWRkciwgbnRvaHMoc3BvcnQpLAotCQkgJmRhZGRyLCBudG9ocyhkcG9ydCksCi0JCSAmaXBoLT5kYWRkciwgaHAgPyBudG9ocyhocC0+ZGVzdCkgOiAwLCBzayk7Ci0KIAlyZXR1cm4gKHNrICE9IE5VTEwpOwogfQogCkBAIC0yNTMsOCArMjY1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wKLXNvY2tldF9tdDZfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQorc3RydWN0IHNvY2sqCit4dF9zb2NrZXRfZ2V0Nl9zayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IHVkcGhkciBfaGRyLCAqaHAgPSBOVUxMOwpAQCAtMjYyLDcgKzI3NCw2IEBACiAJc3RydWN0IGluNl9hZGRyICpkYWRkciwgKnNhZGRyOwogCV9fYmUxNiBkcG9ydCwgc3BvcnQ7CiAJaW50IHRob2ZmLCB0cHJvdG87Ci0JY29uc3Qgc3RydWN0IHh0X3NvY2tldF9tdGluZm8xICppbmZvID0gKHN0cnVjdCB4dF9zb2NrZXRfbXRpbmZvMSAqKSBwYXItPm1hdGNoaW5mbzsKIAogCXRwcm90byA9IGlwdjZfZmluZF9oZHIoc2tiLCAmdGhvZmYsIC0xLCBOVUxMKTsKIAlpZiAodHByb3RvIDwgMCkgewpAQCAtMjc0LDcgKzI4NSw3IEBACiAJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgdGhvZmYsCiAJCQkJCXNpemVvZihfaGRyKSwgJl9oZHIpOwogCQlpZiAoaHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBOVUxMOwogCiAJCXNhZGRyID0gJmlwaC0+c2FkZHI7CiAJCXNwb3J0ID0gaHAtPnNvdXJjZTsKQEAgLTI4NCwxMyArMjk1LDMwIEBACiAJfSBlbHNlIGlmICh0cHJvdG8gPT0gSVBQUk9UT19JQ01QVjYpIHsKIAkJaWYgKGV4dHJhY3RfaWNtcDZfZmllbGRzKHNrYiwgdGhvZmYsICZ0cHJvdG8sICZzYWRkciwgJmRhZGRyLAogCQkJCQkgJnNwb3J0LCAmZHBvcnQpKQotCQkJcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlzayA9IG5mX3Rwcm94eV9nZXRfc29ja192NihkZXZfbmV0KHNrYi0+ZGV2KSwgdHByb3RvLAogCQkJCSAgIHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0LCBwYXItPmluLCBORlRfTE9PS1VQX0FOWSk7CisJcHJfZGVidWcoInByb3RvICVoaGQgJXBJNjolaHUgLT4gJXBJNjolaHUgIgorCQkgIihvcmlnICVwSTY6JWh1KSBzb2NrICVwXG4iLAorCQkgdHByb3RvLCBzYWRkciwgbnRvaHMoc3BvcnQpLAorCQkgZGFkZHIsIG50b2hzKGRwb3J0KSwKKwkJICZpcGgtPmRhZGRyLCBocCA/IG50b2hzKGhwLT5kZXN0KSA6IDAsIHNrKTsKKwlyZXR1cm4gc2s7Cit9CitFWFBPUlRfU1lNQk9MKHh0X3NvY2tldF9nZXQ2X3NrKTsKKworc3RhdGljIGJvb2wKK3NvY2tldF9tdDZfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCXN0cnVjdCBzb2NrICpzazsKKwljb25zdCBzdHJ1Y3QgeHRfc29ja2V0X210aW5mbzEgKmluZm87CisKKwlpbmZvID0gKHN0cnVjdCB4dF9zb2NrZXRfbXRpbmZvMSAqKSBwYXItPm1hdGNoaW5mbzsKKwlzayA9IHh0X3NvY2tldF9nZXQ2X3NrKHNrYiwgcGFyKTsKIAlpZiAoc2sgIT0gTlVMTCkgewogCQlib29sIHdpbGRjYXJkOwogCQlib29sIHRyYW5zcGFyZW50ID0gdHJ1ZTsKQEAgLTMxMywxMiArMzQxLDYgQEAKIAkJCXNrID0gTlVMTDsKIAl9CiAKLQlwcl9kZWJ1ZygicHJvdG8gJWhoZCAlcEk2OiVodSAtPiAlcEk2OiVodSAiCi0JCSAiKG9yaWcgJXBJNjolaHUpIHNvY2sgJXBcbiIsCi0JCSB0cHJvdG8sIHNhZGRyLCBudG9ocyhzcG9ydCksCi0JCSBkYWRkciwgbnRvaHMoZHBvcnQpLAotCQkgJmlwaC0+ZGFkZHIsIGhwID8gbnRvaHMoaHAtPmRlc3QpIDogMCwgc2spOwotCiAJcmV0dXJuIChzayAhPSBOVUxMKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggYjUzNjJlOS4uMDQwOThjMiAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC03OTksNiArNzk5LDcgQEAKIAkJaC5oMi0+dHBfc2VjID0gdHMudHZfc2VjOwogCQloLmgyLT50cF9uc2VjID0gdHMudHZfbnNlYzsKIAkJaC5oMi0+dHBfdmxhbl90Y2kgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwkJaC5oMi0+dHBfcGFkZGluZyA9IDA7CiAJCWhkcmxlbiA9IHNpemVvZigqaC5oMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzI3LDYgKzE3MjgsNyBAQAogCQlhdXgudHBfbmV0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCWF1eC50cF92bGFuX3RjaSA9IHZsYW5fdHhfdGFnX2dldChza2IpOwogCisJCWF1eC50cF9wYWRkaW5nID0gMDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfUEFDS0VULCBQQUNLRVRfQVVYREFUQSwgc2l6ZW9mKGF1eCksICZhdXgpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKaW5kZXggYzJlNjI4ZC4uNmQ5NjI3NSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCkBAIC0zNjEsNyArMzYxLDcgQEAKIHsKIAlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAJdW5zaWduZWQgaW50IGhhc2g7Ci0Jc2ZxX2luZGV4IHg7CisJc2ZxX2luZGV4IHgsIHFsZW47CiAJc3RydWN0IHNmcV9zbG90ICpzbG90OwogCWludCB1bmluaXRpYWxpemVkX3ZhcihyZXQpOwogCkBAIC00MDUsMjAgKzQwNSwxMiBAQAogCWlmICgrK3NjaC0+cS5xbGVuIDw9IHEtPmxpbWl0KQogCQlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKIAorCXFsZW4gPSBzbG90LT5xbGVuOwogCXNmcV9kcm9wKHNjaCk7Ci0JcmV0dXJuIE5FVF9YTUlUX0NOOwotfQotCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgotc2ZxX3BlZWsoc3RydWN0IFFkaXNjICpzY2gpCi17Ci0Jc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCi0JLyogTm8gYWN0aXZlIHNsb3RzICovCi0JaWYgKHEtPnRhaWwgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gcS0+c2xvdHNbcS0+dGFpbC0+bmV4dF0uc2tibGlzdF9uZXh0OworCS8qIFJldHVybiBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiBvbmx5IGlmIHdlIGRyb3BwZWQgYSBwYWNrZXQKKwkgKiBmcm9tIHRoaXMgZmxvdy4KKwkgKi8KKwlyZXR1cm4gKHFsZW4gIT0gc2xvdC0+cWxlbikgPyBORVRfWE1JVF9DTiA6IE5FVF9YTUlUX1NVQ0NFU1M7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCkBAIC03MDIsNyArNjk0LDcgQEAKIAkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBzZnFfc2NoZWRfZGF0YSksCiAJLmVucXVldWUJPQlzZnFfZW5xdWV1ZSwKIAkuZGVxdWV1ZQk9CXNmcV9kZXF1ZXVlLAotCS5wZWVrCQk9CXNmcV9wZWVrLAorCS5wZWVrCQk9CXFkaXNjX3BlZWtfZGVxdWV1ZWQsCiAJLmRyb3AJCT0Jc2ZxX2Ryb3AsCiAJLmluaXQJCT0Jc2ZxX2luaXQsCiAJLnJlc2V0CQk9CXNmcV9yZXNldCwKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggMWEyMWM1Ny4uNTI1Zjk3YyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTY0LDYgKzY0LDcgQEAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuICovCiBzdGF0aWMgdm9pZCBzY3RwX2Fzc29jX2JoX3JjdihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgc2N0cF9hc3NvY19mcmVlX2FzY29uZl9hY2tzKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKTsKK3N0YXRpYyB2b2lkIHNjdHBfYXNzb2NfZnJlZV9hc2NvbmZfcXVldWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpOwogCiAvKiBLZWVwIHRyYWNrIG9mIHRoZSBuZXcgaWRyIGxvdyBzbyB0aGF0IHdlIGRvbid0IHJlLXVzZSBhc3NvY2lhdGlvbiBpZAogICogbnVtYmVycyB0b28gZmFzdC4gIEl0IGlzIHByb3RlY3RlZCBieSB0aGV5IGlkciBzcGluIGxvY2sgaXMgaW4gdGhlCkBAIC00NDYsNiArNDQ3LDkgQEAKIAkvKiBGcmVlIGFueSBjYWNoZWQgQVNDT05GX0FDSyBjaHVuay4gKi8KIAlzY3RwX2Fzc29jX2ZyZWVfYXNjb25mX2Fja3MoYXNvYyk7CiAKKwkvKiBGcmVlIHRoZSBBU0NPTkYgcXVldWUuICovCisJc2N0cF9hc3NvY19mcmVlX2FzY29uZl9xdWV1ZShhc29jKTsKKwogCS8qIEZyZWUgYW55IGNhY2hlZCBBU0NPTkYgY2h1bmsuICovCiAJaWYgKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mKQogCQlzY3RwX2NodW5rX2ZyZWUoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpOwpAQCAtMTU3OCw2ICsxNTgyLDE4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisvKiBGcmVlIHRoZSBBU0NPTkYgcXVldWUgKi8KK3N0YXRpYyB2b2lkIHNjdHBfYXNzb2NfZnJlZV9hc2NvbmZfcXVldWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmFzY29uZjsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFzY29uZiwgdG1wLCAmYXNvYy0+YWRkaXBfY2h1bmtfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZhc2NvbmYtPmxpc3QpOworCQlzY3RwX2NodW5rX2ZyZWUoYXNjb25mKTsKKwl9Cit9CisKIC8qIEZyZWUgYXNjb25mX2FjayBjYWNoZSAqLwogc3RhdGljIHZvaWQgc2N0cF9hc3NvY19mcmVlX2FzY29uZl9hY2tzKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQogewpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvYmluZF9hZGRyLmMgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwppbmRleCBmYWY3MWQxLi42MTUwYWM1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9iaW5kX2FkZHIuYworKysgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwpAQCAtMTQwLDE0ICsxNDAsMTIgQEAKIC8qIERpc3Bvc2Ugb2YgdGhlIGFkZHJlc3MgbGlzdC4gKi8KIHN0YXRpYyB2b2lkIHNjdHBfYmluZF9hZGRyX2NsZWFuKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnApCiB7Ci0Jc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkciwgKnRlbXA7CiAKIAkvKiBFbXB0eSB0aGUgYmluZCBhZGRyZXNzIGxpc3QuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmJwLT5hZGRyZXNzX2xpc3QpIHsKLQkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7Ci0JCWxpc3RfZGVsKHBvcyk7Ci0JCWtmcmVlKGFkZHIpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhZGRyLCB0ZW1wLCAmYnAtPmFkZHJlc3NfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9yY3UoJmFkZHItPmxpc3QpOworCQljYWxsX3JjdSgmYWRkci0+cmN1LCBzY3RwX2xvY2FsX2FkZHJfZnJlZSk7CiAJCVNDVFBfREJHX09CSkNOVF9ERUMoYWRkcik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDg0MmQ2NGMuLjhjNTE5M2UgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTIxMjUsMTQgKzIxMjUsMTYgQEAKIAkJICovCiAJCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgewogCQkJZXJyID0gX19zeXNfcmVjdm1zZyhzb2NrLCAoc3RydWN0IG1zZ2hkciBfX3VzZXIgKiljb21wYXRfZW50cnksCi0JCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MsIGRhdGFncmFtcyk7CisJCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MgJiB+TVNHX1dBSVRGT1JPTkUsCisJCQkJCSAgICBkYXRhZ3JhbXMpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJYnJlYWs7CiAJCQllcnIgPSBfX3B1dF91c2VyKGVyciwgJmNvbXBhdF9lbnRyeS0+bXNnX2xlbik7CiAJCQkrK2NvbXBhdF9lbnRyeTsKIAkJfSBlbHNlIHsKIAkJCWVyciA9IF9fc3lzX3JlY3Ztc2coc29jaywgKHN0cnVjdCBtc2doZHIgX191c2VyICopZW50cnksCi0JCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MsIGRhdGFncmFtcyk7CisJCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MgJiB+TVNHX1dBSVRGT1JPTkUsCisJCQkJCSAgICBkYXRhZ3JhbXMpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJYnJlYWs7CiAJCQllcnIgPSBwdXRfdXNlcihlcnIsICZlbnRyeS0+bXNnX2xlbik7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggMzM5YmE2NC4uNWRhZjZjYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpAQCAtNTc3LDEzICs1NzcsMTMgQEAKIAl9CiAJaW5vZGUgPSAmZ3NzX21zZy0+aW5vZGUtPnZmc19pbm9kZTsKIAlmb3IgKDs7KSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmZ3NzX21zZy0+d2FpdHF1ZXVlLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJcHJlcGFyZV90b193YWl0KCZnc3NfbXNnLT53YWl0cXVldWUsICZ3YWl0LCBUQVNLX0tJTExBQkxFKTsKIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJaWYgKGdzc19tc2ctPmN0eCAhPSBOVUxMIHx8IGdzc19tc2ctPm1zZy5lcnJubyA8IDApIHsKIAkJCWJyZWFrOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJaWYgKHNpZ25hbGxlZCgpKSB7CisJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJZXJyID0gLUVSRVNUQVJUU1lTOwogCQkJZ290byBvdXRfaW50cjsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwppbmRleCAwYTlhMmVjLi5jM2I3NTMzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaD4KIAogI2lmZGVmIFJQQ19ERUJVRwogIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19BVVRICkBAIC03NTAsNyArNzUxLDcgQEAKIAkuZ21fb3BzCQk9ICZnc3Nfa2VyYmVyb3Nfb3BzLAogCS5nbV9wZl9udW0JPSBBUlJBWV9TSVpFKGdzc19rZXJiZXJvc19wZnMpLAogCS5nbV9wZnMJCT0gZ3NzX2tlcmJlcm9zX3BmcywKLQkuZ21fdXBjYWxsX2VuY3R5cGVzID0gIjE4LDE3LDE2LDIzLDMsMSwyIiwKKwkuZ21fdXBjYWxsX2VuY3R5cGVzID0gS1JCNV9TVVBQT1JURURfRU5DVFlQRVMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2tlcmJlcm9zX21vZHVsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCA4ZDgzZjlkLi4wMGRmMDliIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtMTA1OCw3ICsxMDU4LDcgQEAKIAogCWRwcmludGsoIlJQQzogJTV1IHJwY19idWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIHRhc2stPnRrX3BpZCk7CiAKLQlpZiAoUlBDX0lTX0FTWU5DKHRhc2spIHx8ICFzaWduYWxsZWQoKSkgeworCWlmIChSUENfSVNfQVNZTkModGFzaykgfHwgIWZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfYWxsb2NhdGU7CiAJCXJwY19kZWxheSh0YXNrLCBIWj4+NCk7CiAJCXJldHVybjsKQEAgLTExNzIsNiArMTE3Miw5IEBACiAJCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKIAkJCWJyZWFrOwogCQl9CisJCWlmICh0YXNrLT50a19yZWJpbmRfcmV0cnkgPT0gMCkKKwkJCWJyZWFrOworCQl0YXNrLT50a19yZWJpbmRfcmV0cnktLTsKIAkJcnBjX2RlbGF5KHRhc2ssIDMqSFopOwogCQlnb3RvIHJldHJ5X3RpbWVvdXQ7CiAJY2FzZSAtRVRJTUVET1VUOgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKaW5kZXggYzY1MmU0Y2MuLjk1NzRiYzRlIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTUyOCw3ICs1MjgsNyBAQAogCXUzMiBiaW5kX3ZlcnNpb247CiAJc3RydWN0IHJwY194cHJ0ICp4cHJ0OwogCXN0cnVjdCBycGNfY2xudAkqcnBjYl9jbG50OwotCXN0YXRpYyBzdHJ1Y3QgcnBjYmluZF9hcmdzICptYXA7CisJc3RydWN0IHJwY2JpbmRfYXJncyAqbWFwOwogCXN0cnVjdCBycGNfdGFzawkqY2hpbGQ7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc2NoZWQuYyBiL25ldC9zdW5ycGMvc2NoZWQuYwppbmRleCA2YjQzZWU3Li40ODE0ZTI0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3NjaGVkLmMKKysrIGIvbmV0L3N1bnJwYy9zY2hlZC5jCkBAIC02MTYsMzAgKzYxNiwyNSBAQAogCUJVR19PTihSUENfSVNfUVVFVUVEKHRhc2spKTsKIAogCWZvciAoOzspIHsKKwkJdm9pZCAoKmRvX2FjdGlvbikoc3RydWN0IHJwY190YXNrICopOwogCiAJCS8qCi0JCSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgY2FsbGJhY2suCisJCSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgY2FsbGJhY2sgZmlyc3QuCiAJCSAqLwotCQlpZiAodGFzay0+dGtfY2FsbGJhY2spIHsKLQkJCXZvaWQgKCpzYXZlX2NhbGxiYWNrKShzdHJ1Y3QgcnBjX3Rhc2sgKik7Ci0KLQkJCS8qCi0JCQkgKiBXZSBzZXQgdGtfY2FsbGJhY2sgdG8gTlVMTCBiZWZvcmUgY2FsbGluZyBpdCwKLQkJCSAqIGluIGNhc2UgaXQgc2V0cyB0aGUgdGtfY2FsbGJhY2sgZmllbGQgaXRzZWxmOgotCQkJICovCi0JCQlzYXZlX2NhbGxiYWNrID0gdGFzay0+dGtfY2FsbGJhY2s7Ci0JCQl0YXNrLT50a19jYWxsYmFjayA9IE5VTEw7Ci0JCQlzYXZlX2NhbGxiYWNrKHRhc2spOwotCQl9IGVsc2UgeworCQlkb19hY3Rpb24gPSB0YXNrLT50a19jYWxsYmFjazsKKwkJdGFzay0+dGtfY2FsbGJhY2sgPSBOVUxMOworCQlpZiAoZG9fYWN0aW9uID09IE5VTEwpIHsKIAkJCS8qCiAJCQkgKiBQZXJmb3JtIHRoZSBuZXh0IEZTTSBzdGVwLgotCQkJICogdGtfYWN0aW9uIG1heSBiZSBOVUxMIHdoZW4gdGhlIHRhc2sgaGFzIGJlZW4ga2lsbGVkCi0JCQkgKiBieSBzb21lb25lIGVsc2UuCisJCQkgKiB0a19hY3Rpb24gbWF5IGJlIE5VTEwgaWYgdGhlIHRhc2sgaGFzIGJlZW4ga2lsbGVkLgorCQkJICogSW4gcGFydGljdWxhciwgbm90ZSB0aGF0IHJwY19raWxsYWxsX3Rhc2tzIG1heQorCQkJICogZG8gdGhpcyBhdCBhbnkgdGltZSwgc28gYmV3YXJlIHdoZW4gZGVyZWZlcmVuY2luZy4KIAkJCSAqLwotCQkJaWYgKHRhc2stPnRrX2FjdGlvbiA9PSBOVUxMKQorCQkJZG9fYWN0aW9uID0gdGFzay0+dGtfYWN0aW9uOworCQkJaWYgKGRvX2FjdGlvbiA9PSBOVUxMKQogCQkJCWJyZWFrOwotCQkJdGFzay0+dGtfYWN0aW9uKHRhc2spOwogCQl9CisJCWRvX2FjdGlvbih0YXNrKTsKIAogCQkvKgogCQkgKiBMb2NrbGVzcyBjaGVjayBmb3Igd2hldGhlciB0YXNrIGlzIHNsZWVwaW5nIG9yIG5vdC4KQEAgLTc5Miw2ICs3ODcsNyBAQAogCS8qIEluaXRpYWxpemUgcmV0cnkgY291bnRlcnMgKi8KIAl0YXNrLT50a19nYXJiX3JldHJ5ID0gMjsKIAl0YXNrLT50a19jcmVkX3JldHJ5ID0gMjsKKwl0YXNrLT50a19yZWJpbmRfcmV0cnkgPSAyOwogCiAJdGFzay0+dGtfcHJpb3JpdHkgPSB0YXNrX3NldHVwX2RhdGEtPnByaW9yaXR5IC0gUlBDX1BSSU9SSVRZX0xPVzsKIAl0YXNrLT50a19vd25lciA9IGN1cnJlbnQtPnRnaWQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKaW5kZXggYmYwMDVkMy4uZjM0ZjVhYiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0c29jay5jCisrKyBiL25ldC9zdW5ycGMveHBydHNvY2suYwpAQCAtMTM0NCw3ICsxMzQ0LDYgQEAKIAljYXNlIFRDUF9DTE9TRV9XQUlUOgogCQkvKiBUaGUgc2VydmVyIGluaXRpYXRlZCBhIHNodXRkb3duIG9mIHRoZSBzb2NrZXQgKi8KIAkJeHBydF9mb3JjZV9kaXNjb25uZWN0KHhwcnQpOwotCWNhc2UgVENQX1NZTl9TRU5UOgogCQl4cHJ0LT5jb25uZWN0X2Nvb2tpZSsrOwogCWNhc2UgVENQX0NMT1NJTkc6CiAJCS8qCkBAIC0xNzU4LDYgKzE3NTcsNyBAQAogc3RhdGljIGludCB4c190Y3BfZmluaXNoX2Nvbm5lY3Rpbmcoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCXN0cnVjdCBzb2NrX3hwcnQgKnRyYW5zcG9ydCA9IGNvbnRhaW5lcl9vZih4cHJ0LCBzdHJ1Y3Qgc29ja194cHJ0LCB4cHJ0KTsKKwlpbnQgcmV0ID0gLUVOT1RDT05OOwogCiAJaWYgKCF0cmFuc3BvcnQtPmluZXQpIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC0xNzg5LDEyICsxNzg5LDIyIEBACiAJfQogCiAJaWYgKCF4cHJ0X2JvdW5kKHhwcnQpKQotCQlyZXR1cm4gLUVOT1RDT05OOworCQlnb3RvIG91dDsKIAogCS8qIFRlbGwgdGhlIHNvY2tldCBsYXllciB0byBzdGFydCBjb25uZWN0aW5nLi4uICovCiAJeHBydC0+c3RhdC5jb25uZWN0X2NvdW50Kys7CiAJeHBydC0+c3RhdC5jb25uZWN0X3N0YXJ0ID0gamlmZmllczsKLQlyZXR1cm4ga2VybmVsX2Nvbm5lY3Qoc29jaywgeHNfYWRkcih4cHJ0KSwgeHBydC0+YWRkcmxlbiwgT19OT05CTE9DSyk7CisJcmV0ID0ga2VybmVsX2Nvbm5lY3Qoc29jaywgeHNfYWRkcih4cHJ0KSwgeHBydC0+YWRkcmxlbiwgT19OT05CTE9DSyk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJY2FzZSAtRUlOUFJPR1JFU1M6CisJCS8qIFNZTl9TRU5UISAqLworCQl4cHJ0LT5jb25uZWN0X2Nvb2tpZSsrOworCQlpZiAoeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCA8IFhTX1RDUF9JTklUX1JFRVNUX1RPKQorCQkJeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCA9IFhTX1RDUF9JTklUX1JFRVNUX1RPOworCX0KK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9LY29uZmlnIGIvbmV0L3dpcmVsZXNzL0tjb25maWcKaW5kZXggMWYxZWY3MC4uOGUyYTY2OCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL0tjb25maWcKKysrIGIvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTE1OSwzICsxNTksMTQgQEAKIAkgIGZyb20gbGliODAyMTEuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDRkc4MDIxMV9BTExPV19SRUNPTk5FQ1QKKwlib29sICJBbGxvdyByZWNvbm5lY3Qgd2hpbGUgYWxyZWFkeSBjb25uZWN0ZWQiCisJZGVwZW5kcyBvbiBDRkc4MDIxMQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIGNmZzgwMjExIHN0YWNrIGRvZXNuJ3QgYWxsb3cgdG8gY29ubmVjdCBpZiB5b3UgYXJlIGFscmVhZHkKKwkgIGNvbm5lY3RlZC4gVGhpcyBvcHRpb24gYWxsb3dzIHRvIG1ha2UgYSBjb25uZWN0aW9uIGluIHRoaXMgY2FzZS4KKworCSAgU2VsZWN0IHRoaXMgb3B0aW9uIE9OTFkgZm9yIHdsYW4gZHJpdmVycyB0aGF0IGFyZSBzcGVjaWZpY2FsbHkKKwkgIGJ1aWx0IGZvciBzdWNoIHB1cnBvc2VzLgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21sbWUuYyBiL25ldC93aXJlbGVzcy9tbG1lLmMKaW5kZXggYWE1ZGY4OC4uMTY4ODFmZSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21sbWUuYworKysgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCkBAIC03NzAsNiArNzcwLDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX25ld19zdGEpOwogCit2b2lkIGNmZzgwMjExX2RlbF9zdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hY19hZGRyLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGRldi0+aWVlZTgwMjExX3B0ci0+d2lwaHk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKworCW5sODAyMTFfc2VuZF9zdGFfZGVsX2V2ZW50KHJkZXYsIGRldiwgbWFjX2FkZHIsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2RlbF9zdGEpOworCiBzdHJ1Y3QgY2ZnODAyMTFfbWdtdF9yZWdpc3RyYXRpb24gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKaW5kZXggNGViY2U0MjguLmU5YjliNTYgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtMTY3OSwxNCArMTY3OSw2IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoIShyZGV2LT53aXBoeS5mbGFncyAmCi0JCQkJV0lQSFlfRkxBR19TVVBQT1JUU19TRVBBUkFURV9ERUZBVUxUX0tFWVMpKSB7Ci0JCQlpZiAoIWtleS5kZWZfdW5pIHx8ICFrZXkuZGVmX211bHRpKSB7Ci0JCQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQogCQllcnIgPSByZGV2LT5vcHMtPnNldF9kZWZhdWx0X2tleSgmcmRldi0+d2lwaHksIGRldiwga2V5LmlkeCwKIAkJCQkJCSBrZXkuZGVmX3VuaSwga2V5LmRlZl9tdWx0aSk7CiAKQEAgLTIwNjQsNiArMjA1NiwxMCBAQAogCQkJICAgIHNpbmZvLT50eF9mYWlsZWQpOwogCW5sYV9uZXN0X2VuZChtc2csIHNpbmZvYXR0cik7CiAKKwlpZiAoc2luZm8tPmZpbGxlZCAmIFNUQVRJT05fSU5GT19BU1NPQ19SRVFfSUVTKQorCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0lFLCBzaW5mby0+YXNzb2NfcmVxX2llc19sZW4sCisJCQlzaW5mby0+YXNzb2NfcmVxX2llcyk7CisKIAlyZXR1cm4gZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAgbmxhX3B1dF9mYWlsdXJlOgpAQCAtMjA5MSw2ICsyMDg3LDcgQEAKIAl9CiAKIAl3aGlsZSAoMSkgeworCQltZW1zZXQoJnNpbmZvLCAwLCBzaXplb2Yoc2luZm8pKTsKIAkJZXJyID0gZGV2LT5vcHMtPmR1bXBfc3RhdGlvbigmZGV2LT53aXBoeSwgbmV0ZGV2LCBzdGFfaWR4LAogCQkJCQkgICAgIG1hY19hZGRyLCAmc2luZm8pOwogCQlpZiAoZXJyID09IC1FTk9FTlQpCkBAIC0zMjQ3LDEyICszMjQ0LDEyIEBACiAJaSA9IDA7CiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSkgewogCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TQ0FOX1NTSURTXSwgdG1wKSB7CisJCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbiA9IG5sYV9sZW4oYXR0cik7CiAJCQlpZiAocmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dF9mcmVlOwogCQkJfQogCQkJbWVtY3B5KHJlcXVlc3QtPnNzaWRzW2ldLnNzaWQsIG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpKTsKLQkJCXJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuID0gbmxhX2xlbihhdHRyKTsKIAkJCWkrKzsKIAkJfQogCX0KQEAgLTU5NjYsNiArNTk2Myw0MCBAQAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKIH0KIAordm9pZCBubDgwMjExX3NlbmRfc3RhX2RlbF9ldmVudChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hY19hZGRyLAorCQkJCWdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgZ2ZwKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuOworCisJaGRyID0gbmw4MDIxMWhkcl9wdXQobXNnLCAwLCAwLCAwLCBOTDgwMjExX0NNRF9ERUxfU1RBVElPTik7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZGV2LT5pZmluZGV4KTsKKwlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIG1hY19hZGRyKTsKKworCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuOworCX0KKworCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCisJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOworCXJldHVybjsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJbmxtc2dfZnJlZShtc2cpOworfQorCiBpbnQgbmw4MDIxMV9zZW5kX21nbXQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgbmxwaWQsCiAJCSAgICAgIGludCBmcmVxLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBnZnBfdCBnZnApCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCBlM2Y3ZmE4Li5kY2FjNWNkIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTc5LDYgKzc5LDkgQEAKIHZvaWQgbmw4MDIxMV9zZW5kX3N0YV9ldmVudChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hY19hZGRyLAogCQkJICAgIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvLCBnZnBfdCBnZnApOwordm9pZCBubDgwMjExX3NlbmRfc3RhX2RlbF9ldmVudChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hY19hZGRyLAorCQkJCWdmcF90IGdmcCk7CiAKIGludCBubDgwMjExX3NlbmRfbWdtdChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBubHBpZCwgaW50IGZyZXEsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmVnLmMgYi9uZXQvd2lyZWxlc3MvcmVnLmMKaW5kZXggYWI4MDFhMS4uMzhkZGJjZSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5jCisrKyBiL25ldC93aXJlbGVzcy9yZWcuYwpAQCAtMTc0Myw2ICsxNzQzLDcgQEAKIHN0YXRpYyB2b2lkIHJlc3RvcmVfcmVndWxhdG9yeV9zZXR0aW5ncyhib29sIHJlc2V0X3VzZXIpCiB7CiAJY2hhciBhbHBoYTJbMl07CisJY2hhciB3b3JsZF9hbHBoYTJbMl07CiAJc3RydWN0IHJlZ19iZWFjb24gKnJlZ19iZWFjb24sICpidG1wOwogCiAJbXV0ZXhfbG9jaygmY2ZnODAyMTFfbXV0ZXgpOwpAQCAtMTc3MiwxMSArMTc3MywxMyBAQAogCiAJLyogRmlyc3QgcmVzdG9yZSB0byB0aGUgYmFzaWMgcmVndWxhdG9yeSBzZXR0aW5ncyAqLwogCWNmZzgwMjExX3JlZ2RvbWFpbiA9IGNmZzgwMjExX3dvcmxkX3JlZ2RvbTsKKwl3b3JsZF9hbHBoYTJbMF0gPSBjZmc4MDIxMV9yZWdkb21haW4tPmFscGhhMlswXTsKKwl3b3JsZF9hbHBoYTJbMV0gPSBjZmc4MDIxMV9yZWdkb21haW4tPmFscGhhMlsxXTsKIAogCW11dGV4X3VubG9jaygmcmVnX211dGV4KTsKIAltdXRleF91bmxvY2soJmNmZzgwMjExX211dGV4KTsKIAotCXJlZ3VsYXRvcnlfaGludF9jb3JlKGNmZzgwMjExX3JlZ2RvbWFpbi0+YWxwaGEyKTsKKwlyZWd1bGF0b3J5X2hpbnRfY29yZSh3b3JsZF9hbHBoYTIpOwogCiAJLyoKIAkgKiBUaGlzIHJlc3RvcmVzIHRoZSBpZWVlODAyMTFfcmVnZG9tIG1vZHVsZSBwYXJhbWV0ZXIKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zY2FuLmMgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCmluZGV4IGZiZjZmMzMuLmE4YWQ2NmEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zY2FuLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgIm5sODAyMTEuaCIKICNpbmNsdWRlICJ3ZXh0LWNvbXBhdC5oIgogCi0jZGVmaW5lIElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUJKDE1ICogSFopCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUJKDMgKiBIWikKIAogdm9pZCBfX19jZmc4MDIxMV9zY2FuX2RvbmUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LCBib29sIGxlYWspCiB7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc21lLmMgYi9uZXQvd2lyZWxlc3Mvc21lLmMKaW5kZXggZTE3YjBiZS4uZGE4YmNiNiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NtZS5jCisrKyBiL25ldC93aXJlbGVzcy9zbWUuYwpAQCAtNjUwLDggKzY1MCwxMCBAQAogCQkgICAgd2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpKQogCQlyZXR1cm47CiAKKyNpZm5kZWYgQ09ORklHX0NGRzgwMjExX0FMTE9XX1JFQ09OTkVDVAogCWlmICh3ZGV2LT5zbWVfc3RhdGUgIT0gQ0ZHODAyMTFfU01FX0NPTk5FQ1RFRCkKIAkJcmV0dXJuOworI2VuZGlmCiAKIAlpZiAod2Rldi0+Y3VycmVudF9ic3MpIHsKIAkJY2ZnODAyMTFfdW5ob2xkX2Jzcyh3ZGV2LT5jdXJyZW50X2Jzcyk7CkBAIC03NDksMTAgKzc1MSwxNCBAQAogCiAJQVNTRVJUX1dERVZfTE9DSyh3ZGV2KTsKIAorI2lmbmRlZiBDT05GSUdfQ0ZHODAyMTFfQUxMT1dfUkVDT05ORUNUCiAJaWYgKHdkZXYtPnNtZV9zdGF0ZSAhPSBDRkc4MDIxMV9TTUVfSURMRSkKIAkJcmV0dXJuIC1FQUxSRUFEWTsKIAogCWlmIChXQVJOX09OKHdkZXYtPmNvbm5lY3Rfa2V5cykpIHsKKyNlbHNlCisJaWYgKHdkZXYtPmNvbm5lY3Rfa2V5cykgeworI2VuZGlmCiAJCWtmcmVlKHdkZXYtPmNvbm5lY3Rfa2V5cyk7CiAJCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9yZXBsYXkuYyBiL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKaW5kZXggNDdmMWI4Ni4uYjExZWE2OSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9yZXBsYXkuYworKysgYi9uZXQveGZybS94ZnJtX3JlcGxheS5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJCWJpdG5yID0gYml0bnIgJiAweDFGOwogCQkJcmVwbGF5X2Vzbi0+Ym1wW25yXSB8PSAoMVUgPDwgYml0bnIpOwogCQl9IGVsc2UgewotCQkJbnIgPSByZXBsYXlfZXNuLT5yZXBsYXlfd2luZG93ID4+IDU7CisJCQluciA9IChyZXBsYXlfZXNuLT5yZXBsYXlfd2luZG93IC0gMSkgPj4gNTsKIAkJCWZvciAoaSA9IDA7IGkgPD0gbnI7IGkrKykKIAkJCQlyZXBsYXlfZXNuLT5ibXBbaV0gPSAwOwogCkBAIC00NzEsNyArNDcxLDcgQEAKIAkJCWJpdG5yID0gYml0bnIgJiAweDFGOwogCQkJcmVwbGF5X2Vzbi0+Ym1wW25yXSB8PSAoMVUgPDwgYml0bnIpOwogCQl9IGVsc2UgewotCQkJbnIgPSByZXBsYXlfZXNuLT5yZXBsYXlfd2luZG93ID4+IDU7CisJCQluciA9IChyZXBsYXlfZXNuLT5yZXBsYXlfd2luZG93IC0gMSkgPj4gNTsKIAkJCWZvciAoaSA9IDA7IGkgPD0gbnI7IGkrKykKIAkJCQlyZXBsYXlfZXNuLT5ibXBbaV0gPSAwOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9sc20uYyBiL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCmluZGV4IGFlM2E2OTguLjNkMmZkMTQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2xzbS5jCkBAIC01OTMsNyArNTkzLDggQEAKIAkJCXNhLmFhZC5vcCA9IE9QX1NFVFBST0NBVFRSOwogCQkJc2EuYWFkLmluZm8gPSBuYW1lOwogCQkJc2EuYWFkLmVycm9yID0gLUVJTlZBTDsKLQkJCXJldHVybiBhYV9hdWRpdChBVURJVF9BUFBBUk1PUl9ERU5JRUQsIE5VTEwsIEdGUF9LRVJORUwsCisJCQlyZXR1cm4gYWFfYXVkaXQoQVVESVRfQVBQQVJNT1JfREVOSUVELAorCQkJCQlfX2FhX2N1cnJlbnRfcHJvZmlsZSgpLCBHRlBfS0VSTkVMLAogCQkJCQkmc2EsIE5VTEwpOwogCQl9CiAJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImV4ZWMiKSA9PSAwKSB7CkBAIC02MTEsNyArNjEyLDcgQEAKIHN0YXRpYyBpbnQgYXBwYXJtb3JfdGFza19zZXRybGltaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAogCQl1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKm5ld19ybGltKQogewotCXN0cnVjdCBhYV9wcm9maWxlICpwcm9maWxlID0gYWFfY3VycmVudF9wcm9maWxlKCk7CisJc3RydWN0IGFhX3Byb2ZpbGUgKnByb2ZpbGUgPSBfX2FhX2N1cnJlbnRfcHJvZmlsZSgpOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXVuY29uZmluZWQocHJvZmlsZSkpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwppbmRleCA5MzA2MzRlLi43YTBjNTg2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCisrKyBiL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKQEAgLTg0NSw2ICs4NDUsNyBAQAogCW5ldy0+IHNnaWQJPSBvbGQtPiBzZ2lkOwogCW5ldy0+ZnNnaWQJPSBvbGQtPmZzZ2lkOwogCW5ldy0+dXNlcgk9IGdldF91aWQob2xkLT51c2VyKTsKKwluZXctPnVzZXJfbnMJPSBuZXctPnVzZXItPnVzZXJfbnM7CiAJbmV3LT5ncm91cF9pbmZvCT0gZ2V0X2dyb3VwX2luZm8ob2xkLT5ncm91cF9pbmZvKTsKIAogCW5ldy0+c2VjdXJlYml0cwk9IG9sZC0+c2VjdXJlYml0czsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwppbmRleCBkZjNjMDQxLi42MTk3YTI2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKKysrIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCkBAIC00NzAsNyArNDcwLDcgQEAKIAl9IGVsc2UgaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MpIHsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewotCQlrZXkgPSBFUlJfUFRSKHJldCk7CisJCWdvdG8gY291bGRudF9hbGxvY19rZXk7CiAJfQogCiAJa2V5X3B1dChkZXN0X2tleXJpbmcpOwpAQCAtNDgwLDYgKzQ4MCw3IEBACiBjb25zdHJ1Y3Rpb25fZmFpbGVkOgogCWtleV9uZWdhdGVfYW5kX2xpbmsoa2V5LCBrZXlfbmVnYXRpdmVfdGltZW91dCwgTlVMTCwgTlVMTCk7CiAJa2V5X3B1dChrZXkpOworY291bGRudF9hbGxvY19rZXk6CiAJa2V5X3B1dChkZXN0X2tleXJpbmcpOwogCWtsZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vbW91bnQuYyBiL3NlY3VyaXR5L3RvbW95by9tb3VudC5jCmluZGV4IDgyYmY4YzIzLi5hZmEwN2NmIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vbW91bnQuYworKysgYi9zZWN1cml0eS90b21veW8vbW91bnQuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJfQogCWlmIChuZWVkX2RldikgewogCQkvKiBHZXQgbW91bnQgcG9pbnQgb3IgZGV2aWNlIGZpbGUuICovCi0JCWlmIChrZXJuX3BhdGgoZGV2X25hbWUsIExPT0tVUF9GT0xMT1csICZwYXRoKSkgeworCQlpZiAoIWRldl9uYW1lIHx8IGtlcm5fcGF0aChkZXZfbmFtZSwgTE9PS1VQX0ZPTExPVywgJnBhdGgpKSB7CiAJCQllcnJvciA9IC1FTk9FTlQ7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggNzBhOWQzMi4uZjVjYWQ3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC0yMzQ5LDkgKzIzNDksMTYgQEAKIAkvKiBDaGVjayBWSUEvQVRJIEhEIEF1ZGlvIENvbnRyb2xsZXIgZXhpc3QgKi8KIAlzd2l0Y2ggKGNoaXAtPmRyaXZlcl90eXBlKSB7CiAJY2FzZSBBWlhfRFJJVkVSX1ZJQToKLQljYXNlIEFaWF9EUklWRVJfQVRJOgogCQkvKiBVc2UgbGluayBwb3NpdGlvbiBkaXJlY3RseSwgYXZvaWQgYW55IHRyYW5zZmVyIHByb2JsZW0uICovCiAJCXJldHVybiBQT1NfRklYX1ZJQUNPTUJPOworCWNhc2UgQVpYX0RSSVZFUl9BVEk6CisJCS8qIEFUSSBjaGlwc2V0cyBkb24ndCB3b3JrIHdlbGwgd2l0aCBwb3NpdGlvbi1idWZmZXIgKi8KKwkJcmV0dXJuIFBPU19GSVhfTFBJQjsKKwljYXNlIEFaWF9EUklWRVJfR0VORVJJQzoKKwkJLyogQU1EIGNoaXBzZXRzIGFsc28gZG9uJ3Qgd29yayB3aXRoIHBvc2l0aW9uLWJ1ZmZlciAqLworCQlpZiAoY2hpcC0+cGNpLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTUQpCisJCQlyZXR1cm4gUE9TX0ZJWF9MUElCOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gUE9TX0ZJWF9BVVRPOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggMjk0MmQyYS4uOWY4ODZiZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0zMDcwLDYgKzMwNzAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2lucHV0czsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmlucHV0c1tpXS5waW47CisJCWludCB0eXBlID0gY2ZnLT5pbnB1dHNbaV0udHlwZTsKIAkJc3dpdGNoIChuaWQpIHsKIAkJY2FzZSAweDE1OiAvKiBwb3J0LUMgKi8KIAkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MzMsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDApOwpAQCAtMzA3OSw3ICszMDgwLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAotCQkJCSAgICBpID09IEFVVE9fUElOX01JQyA/IFBJTl9WUkVGODAgOiBQSU5fSU4pOworCQkJCSAgICB0eXBlID09IEFVVE9fUElOX01JQyA/IFBJTl9WUkVGODAgOiBQSU5fSU4pOwogCQlpZiAobmlkICE9IEFEMTk4OF9QSU5fQ0RfTklEKQogCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAogCQkJCQkgICAgQU1QX09VVF9NVVRFKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwppbmRleCBhZDk3ZDkzLi5lNDdmMjJjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC0zMDM2LDYgKzMwMzYsNyBAQAogIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiTGVub3ZvIFRoaW5rcGFkIiwgQ1hUNTA2Nl9USElOS1BBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjFkYSwgIkxlbm92byBYMjIwIiwgQ1hUNTA2Nl9USElOS1BBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjFkYiwgIkxlbm92byBYMjIwLXRhYmxldCIsIENYVDUwNjZfVEhJTktQQUQpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNhMGQsICJMZW5vdm8gVTM1MCIsIENYVDUwNjZfQVNVUyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzhhZiwgIkxlbm92byBHNTYwIiwgQ1hUNTA2Nl9BU1VTKSwKIAlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3YWEsICJMZW5vdm8iLCBDWFQ1MDY2X0lERUFQQUQpLCAvKiBGYWxsYmFjayBmb3IgTGVub3ZvcyB3aXRob3V0IGRvY2sgbWljICovCiAJe30KQEAgLTM4NDUsNiArMzg0Niw4IEBACiAJICAucGF0Y2ggPSBwYXRjaF9jeHQ1MDY2IH0sCiAJeyAuaWQgPSAweDE0ZjE1MDY5LCAubmFtZSA9ICJDWDIwNTg1IiwKIAkgIC5wYXRjaCA9IHBhdGNoX2N4dDUwNjYgfSwKKwl7IC5pZCA9IDB4MTRmMTUwNmMsIC5uYW1lID0gIkNYMjA1ODgiLAorCSAgLnBhdGNoID0gcGF0Y2hfY3h0NTA2NiB9LAogCXsgLmlkID0gMHgxNGYxNTA2ZSwgLm5hbWUgPSAiQ1gyMDU5MCIsCiAJICAucGF0Y2ggPSBwYXRjaF9jeHQ1MDY2IH0sCiAJeyAuaWQgPSAweDE0ZjE1MDk3LCAubmFtZSA9ICJDWDIwNjMxIiwKQEAgLTM4NzMsNiArMzg3Niw3IEBACiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNjciKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2OCIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDY5Iik7CitNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwNmMiKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxNGYxNTA2ZSIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjE0ZjE1MDk3Iik7CiBNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTRmMTUwOTgiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggYzgyOTc5YS4uNDE0NWMzYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTQ2MDcsNyArNDYwNyw2IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4ZTMwOSwgIlVMSSIsIEFMQzg4MF8zU1RfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHhlMzEwLCAiVUxJIiwgQUxDODgwXzNTVCksCiAJU05EX1BDSV9RVUlSSygweDEwMzksIDB4MTIzNCwgTlVMTCwgQUxDODgwXzZTVF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhMDksICJIUCIsIEFMQzg4MF81U1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYjMsICJBU1VTIFcxViIsIEFMQzg4MF9BU1VTX1cxViksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBjMiwgIkFTVVMgVzZBIiwgQUxDODgwX0FTVVNfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGMzLCAiQVNVUyBXeHgiLCBBTEM4ODBfQVNVU19ESUcpLApAQCAtMTM4MDQsNiArMTM4MDMsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNWIsICJBY2VyIEFzcGlyZSBPbmUiLAogCQkJCQkJQUxDMjY4X0FDRVJfQVNQSVJFX09ORSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDI1MywgIkRlbGwgT0VNIiwgQUxDMjY4X0RFTEwpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyYjAsICJEZWxsIEluc3Bpcm9uIDkxMCIsIEFMQzI2OF9BVVRPKSwKIAlTTkRfUENJX1FVSVJLX01BU0soMHgxMDI4LCAweGZmZjAsIDB4MDJiMCwKIAkJCSJEZWxsIEluc3Bpcm9uIE1pbmk5L1Zvc3RybyBBOTAiLCBBTEMyNjhfREVMTCksCiAJLyogYWxtb3N0IGNvbXBhdGlibGUgd2l0aCB0b3NoaWJhIGJ1dCB3aXRoIG9wdGlvbmFsIGRpZ2l0YWwgb3V0czsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwppbmRleCA5NGQxOWMwLi4xZTMyMjM1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCkBAIC0xNjAwLDcgKzE2MDAsNyBAQAogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAyZmUsCiAJCQkJIkRlbGwgU3R1ZGlvIFhQUyAxNjQ1IiwgU1RBQ19ERUxMX002X0JPVEgpLAogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDA0MTMsCi0JCQkJIkRlbGwgU3R1ZGlvIDE1NTgiLCBTVEFDX0RFTExfTTZfQk9USCksCisJCQkJIkRlbGwgU3R1ZGlvIDE1NTgiLCBTVEFDX0RFTExfTTZfRE1JQyksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKaW5kZXggODkwYTBkYy4uYmQxMWUzMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLXBjbS5jCkBAIC0xMzgsMTEgKzEzOCwyMCBAQAogCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOwogCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCWRpZmYgPSBzcG9ydF9jdXJyX29mZnNldF90eChzcG9ydCk7Ci0JCWZyYW1lcyA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRpZmYpOwogCX0gZWxzZSB7CiAJCWRpZmYgPSBzcG9ydF9jdXJyX29mZnNldF9yeChzcG9ydCk7Ci0JCWZyYW1lcyA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRpZmYpOwogCX0KKworCS8qCisJICogVFggYXQgbGVhc3QgY2FuIHJlcG9ydCBvbmUgZnJhbWUgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisJICogYnVmZmVyIGlmIHdlIGhpdCB0aGUgd3JhcGFyb3VuZCBjYXNlIC0gY2xhbXAgdG8gd2l0aGluIHRoZQorCSAqIGJ1ZmZlciBhcyB0aGUgQUxTQSBBUElzIHJlcXVpcmUuCisJICovCisJaWYgKGRpZmYgPT0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpCisJCWRpZmYgPSAwOworCisJZnJhbWVzID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgZGlmZik7CisKIAlyZXR1cm4gZnJhbWVzOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCBhYjYzZDUyLi43NTRjNDk2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTE0NSwyMiArMTQ1LDIyIEBACiAJLyogYml0IHNpemUgKi8KIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXdvcmRfbGVuID0gMzsKKwkJd29yZF9sZW4gPSBBRDE4MzZfV09SRF9MRU5fMTY7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgotCQl3b3JkX2xlbiA9IDE7CisJCXdvcmRfbGVuID0gQUQxODM2X1dPUkRfTEVOXzIwOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXdvcmRfbGVuID0gMDsKKwkJd29yZF9sZW4gPSBBRDE4MzZfV09SRF9MRU5fMjQ7CiAJCWJyZWFrOwogCX0KIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTgzNl9EQUNfQ1RSTDEsCi0JCUFEMTgzNl9EQUNfV09SRF9MRU5fTUFTSywgd29yZF9sZW4pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTgzNl9EQUNfQ1RSTDEsIEFEMTgzNl9EQUNfV09SRF9MRU5fTUFTSywKKwkJd29yZF9sZW4gPDwgQUQxODM2X0RBQ19XT1JEX0xFTl9PRkZTRVQpOwogCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwKLQkJQUQxODM2X0FEQ19XT1JEX0xFTl9NQVNLLCB3b3JkX2xlbik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxODM2X0FEQ19DVFJMMiwgQUQxODM2X0FEQ19XT1JEX0xFTl9NQVNLLAorCQl3b3JkX2xlbiA8PCBBRDE4MzZfQURDX1dPUkRfT0ZGU0VUKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmgKaW5kZXggODQ1NTk2Ny4uOWQ2YTNmOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIEFEMTgzNl9EQUNfU0VSRk1UX1BDSzI1NiAgICAgICAoMHg0IDw8IDUpCiAjZGVmaW5lIEFEMTgzNl9EQUNfU0VSRk1UX1BDSzEyOCAgICAgICAoMHg1IDw8IDUpCiAjZGVmaW5lIEFEMTgzNl9EQUNfV09SRF9MRU5fTUFTSyAgICAgICAweDE4CisjZGVmaW5lIEFEMTgzNl9EQUNfV09SRF9MRU5fT0ZGU0VUICAgICAzCiAKICNkZWZpbmUgQUQxODM2X0RBQ19DVFJMMiAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQUQxODM2X0RBQ0wxX01VVEUgICAgICAgICAgICAgIDAKQEAgLTUxLDYgKzUyLDcgQEAKICNkZWZpbmUgQUQxODM2X0FEQ0wyX01VVEUgCQkyCiAjZGVmaW5lIEFEMTgzNl9BRENSMl9NVVRFIAkJMwogI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfTEVOX01BU0sgICAgICAgMHgzMAorI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfT0ZGU0VUICAgICAgICAgNQogI2RlZmluZSBBRDE4MzZfQURDX1NFUkZNVF9NQVNLCSAgICAgICAoNyA8PCA2KQogI2RlZmluZSBBRDE4MzZfQURDX1NFUkZNVF9QQ0syNTYgICAgICAgKDB4NCA8PCA2KQogI2RlZmluZSBBRDE4MzZfQURDX1NFUkZNVF9QQ0sxMjggICAgICAgKDB4NSA8PCA2KQpAQCAtNjAsNCArNjIsOCBAQAogCiAjZGVmaW5lIEFEMTgzNl9OVU1fUkVHUyAgICAgICAgICAgICAgICAxNgogCisjZGVmaW5lIEFEMTgzNl9XT1JEX0xFTl8yNCAweDAKKyNkZWZpbmUgQUQxODM2X1dPUkRfTEVOXzIwIDB4MQorI2RlZmluZSBBRDE4MzZfV09SRF9MRU5fMTYgMHgyCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggNGJlMDU3MC4uNjVmNDYwNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDIsIE1TLCBkYXRhKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBQV19NR01UMiwgTVMgfCBNQ0tPIHwgUE1QTEwsIGRhdGEpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1EX0NUTDEsIEJDS09fTUFTSywgYmNrbyk7CiAKIAkvKiBmb3JtYXQgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggNjc4NTY4OC4uOWE1ZTY3YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC02ODAsMjAgKzY4MCwyNSBAQAogI2RlZmluZSBXTTg4MDRfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBcCiAJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKIAorI2RlZmluZSBXTTg4MDRfUkFURVMgKFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfNjQwMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfCBcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMCkKKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgd204ODA0X2RhaSA9IHsKIAkubmFtZSA9ICJ3bTg4MDQtc3BkaWYiLAogCS5wbGF5YmFjayA9IHsKIAkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKIAkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJLnJhdGVzID0gV004ODA0X1JBVEVTLAogCQkuZm9ybWF0cyA9IFdNODgwNF9GT1JNQVRTLAogCX0sCiAJLmNhcHR1cmUgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKIAkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJLnJhdGVzID0gV004ODA0X1JBVEVTLAogCQkuZm9ybWF0cyA9IFdNODgwNF9GT1JNQVRTLAogCX0sCiAJLm9wcyA9ICZ3bTg4MDRfZGFpX29wcywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCmluZGV4IDUwMDAxMWUuLmMyMjY1OWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwpAQCAtMTk5OCwxMiArMTk5OCwxMiBAQAogCQlyZXR1cm4gMDsKIAogCS8qIElmIHRoZSBsZWZ0IFBHQSBpcyBlbmFibGVkIGhpdCB0aGF0IFZVIGJpdC4uLiAqLwotCWlmIChyZWdfY2FjaGVbV004OTYyX1BXUl9NR01UXzJdICYgV004OTYyX0hQT1VUTF9QR0FfRU5BKQorCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9QV1JfTUdNVF8yKSAmIFdNODk2Ml9IUE9VVExfUEdBX0VOQSkKIAkJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9IUE9VVExfVk9MVU1FLAogCQkJCSAgICAgcmVnX2NhY2hlW1dNODk2Ml9IUE9VVExfVk9MVU1FXSk7CiAKIAkvKiAuLi5vdGhlcndpc2UgdGhlIHJpZ2h0LiAgVGhlIFZVIGlzIHN0ZXJlby4gKi8KLQlpZiAocmVnX2NhY2hlW1dNODk2Ml9QV1JfTUdNVF8yXSAmIFdNODk2Ml9IUE9VVFJfUEdBX0VOQSkKKwlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjJfUFdSX01HTVRfMikgJiBXTTg5NjJfSFBPVVRSX1BHQV9FTkEpCiAJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfSFBPVVRSX1ZPTFVNRSwKIAkJCQkgICAgIHJlZ19jYWNoZVtXTTg5NjJfSFBPVVRSX1ZPTFVNRV0pOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCA4NGUxYmQxLi44OWFjYjBmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKQEAgLTE0NDYsNyArMTQ0Niw2IEBACiBTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMyREFUIiksCiBTTkRfU09DX0RBUE1fSU5QVVQoIkNsb2NrIiksCiAKLVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUNCSUFTIiwgV004OTk0X01JQ0JJQVMsIDIsIDApLAogU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJNSUNCSUFTIFN1cHBseSIsIDEsIFNORF9TT0NfTk9QTSwgMCwgMCwgbWljYmlhc19ldiwKIAkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAogCkBAIC0xNzY1LDggKzE3NjQsMTAgQEAKIAl7ICJBSUYyREFDREFUIiwgTlVMTCwgIkFJRjFEQUNEQVQiIH0sCiAJeyAiQUlGMUFEQ0RBVCIsIE5VTEwsICJBSUYyQURDREFUIiB9LAogCXsgIkFJRjJBRENEQVQiLCBOVUxMLCAiQUlGMUFEQ0RBVCIgfSwKLQl7ICJNSUNCSUFTIiwgTlVMTCwgIkNMS19TWVMiIH0sCi0JeyAiTUlDQklBUyIsIE5VTEwsICJNSUNCSUFTIFN1cHBseSIgfSwKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJDTEtfU1lTIiB9LAorCXsgIk1JQ0JJQVMxIiwgTlVMTCwgIk1JQ0JJQVMgU3VwcGx5IiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIkNMS19TWVMiIH0sCisJeyAiTUlDQklBUzIiLCBOVUxMLCAiTUlDQklBUyBTdXBwbHkiIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5OTRfaW50ZXJjb25bXSA9IHsKQEAgLTE5NjksNiArMTk3MCw4IEBACiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9GTEwxX0NPTlRST0xfMSArIHJlZ19vZmZzZXQsCiAJCQkJICAgIFdNODk5NF9GTEwxX0VOQSB8IFdNODk5NF9GTEwxX0ZSQUMsCiAJCQkJICAgIHJlZyk7CisKKwkJbXNsZWVwKDUpOwogCX0KIAogCXdtODk5NC0+ZmxsW2lkXS5pbiA9IGZyZXFfaW47CkBAIC0zMDE4LDcgKzMwMjEsNyBAQAogCXJlcG9ydCA9IFNORF9KQUNLX01JQ1JPUEhPTkU7CiAKIAkvKiBFdmVyeXRoaW5nIGVsc2UgaXMgYnV0dG9uczsganVzdCBhc3NpZ24gc2xvdHMgKi8KLQlpZiAoc3RhdHVzICYgMHgxYzApCisJaWYgKHN0YXR1cyAmIDB4MWMpCiAJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMDsKIAogZG9uZToKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKaW5kZXggNDAwNWU5YS4uZTU1YjI5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKQEAgLTc4NywxNyArNzg3LDE3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBsaW5lb3V0MV9kaWZmX3JvdXRlc1tdID0gewogCXsgIkxJTkVPVVQxIE1peGVyIiwgIklOMUwgU3dpdGNoIiwgIklOMUwgUEdBIiB9LAogCXsgIkxJTkVPVVQxIE1peGVyIiwgIklOMVIgU3dpdGNoIiwgIklOMVIgUEdBIiB9LAotCXsgIkxJTkVPVVQxIE1peGVyIiwgIk91dHB1dCBTd2l0Y2giLCAiTGVmdCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiTElORU9VVDEgTWl4ZXIiLCAiT3V0cHV0IFN3aXRjaCIsICJMZWZ0IE91dHB1dCBQR0EiIH0sCiAKIAl7ICJMSU5FT1VUMU4gRHJpdmVyIiwgTlVMTCwgIkxJTkVPVVQxIE1peGVyIiB9LAogCXsgIkxJTkVPVVQxUCBEcml2ZXIiLCBOVUxMLCAiTElORU9VVDEgTWl4ZXIiIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBsaW5lb3V0MV9zZV9yb3V0ZXNbXSA9IHsKLQl7ICJMSU5FT1VUMU4gTWl4ZXIiLCAiTGVmdCBPdXRwdXQgU3dpdGNoIiwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAotCXsgIkxJTkVPVVQxTiBNaXhlciIsICJSaWdodCBPdXRwdXQgU3dpdGNoIiwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAorCXsgIkxJTkVPVVQxTiBNaXhlciIsICJMZWZ0IE91dHB1dCBTd2l0Y2giLCAiTGVmdCBPdXRwdXQgUEdBIiB9LAorCXsgIkxJTkVPVVQxTiBNaXhlciIsICJSaWdodCBPdXRwdXQgU3dpdGNoIiwgIlJpZ2h0IE91dHB1dCBQR0EiIH0sCiAKLQl7ICJMSU5FT1VUMVAgTWl4ZXIiLCAiTGVmdCBPdXRwdXQgU3dpdGNoIiwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAorCXsgIkxJTkVPVVQxUCBNaXhlciIsICJMZWZ0IE91dHB1dCBTd2l0Y2giLCAiTGVmdCBPdXRwdXQgUEdBIiB9LAogCiAJeyAiTElORU9VVDFOIERyaXZlciIsIE5VTEwsICJMSU5FT1VUMU4gTWl4ZXIiIH0sCiAJeyAiTElORU9VVDFQIERyaXZlciIsIE5VTEwsICJMSU5FT1VUMVAgTWl4ZXIiIH0sCkBAIC04MDYsMTcgKzgwNiwxNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgbGluZW91dDJfZGlmZl9yb3V0ZXNbXSA9IHsKIAl7ICJMSU5FT1VUMiBNaXhlciIsICJJTjJMIFN3aXRjaCIsICJJTjJMIFBHQSIgfSwKIAl7ICJMSU5FT1VUMiBNaXhlciIsICJJTjJSIFN3aXRjaCIsICJJTjJSIFBHQSIgfSwKLQl7ICJMSU5FT1VUMiBNaXhlciIsICJPdXRwdXQgU3dpdGNoIiwgIlJpZ2h0IE91dHB1dCBNaXhlciIgfSwKKwl7ICJMSU5FT1VUMiBNaXhlciIsICJPdXRwdXQgU3dpdGNoIiwgIlJpZ2h0IE91dHB1dCBQR0EiIH0sCiAKIAl7ICJMSU5FT1VUMk4gRHJpdmVyIiwgTlVMTCwgIkxJTkVPVVQyIE1peGVyIiB9LAogCXsgIkxJTkVPVVQyUCBEcml2ZXIiLCBOVUxMLCAiTElORU9VVDIgTWl4ZXIiIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBsaW5lb3V0Ml9zZV9yb3V0ZXNbXSA9IHsKLQl7ICJMSU5FT1VUMk4gTWl4ZXIiLCAiTGVmdCBPdXRwdXQgU3dpdGNoIiwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAotCXsgIkxJTkVPVVQyTiBNaXhlciIsICJSaWdodCBPdXRwdXQgU3dpdGNoIiwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAorCXsgIkxJTkVPVVQyTiBNaXhlciIsICJMZWZ0IE91dHB1dCBTd2l0Y2giLCAiTGVmdCBPdXRwdXQgUEdBIiB9LAorCXsgIkxJTkVPVVQyTiBNaXhlciIsICJSaWdodCBPdXRwdXQgU3dpdGNoIiwgIlJpZ2h0IE91dHB1dCBQR0EiIH0sCiAKLQl7ICJMSU5FT1VUMlAgTWl4ZXIiLCAiUmlnaHQgT3V0cHV0IFN3aXRjaCIsICJSaWdodCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiTElORU9VVDJQIE1peGVyIiwgIlJpZ2h0IE91dHB1dCBTd2l0Y2giLCAiUmlnaHQgT3V0cHV0IFBHQSIgfSwKIAogCXsgIkxJTkVPVVQyTiBEcml2ZXIiLCBOVUxMLCAiTElORU9VVDJOIE1peGVyIiB9LAogCXsgIkxJTkVPVVQyUCBEcml2ZXIiLCBOVUxMLCAiTElORU9VVDJQIE1peGVyIiB9LApAQCAtODM2LDE3ICs4MzYsMjEgQEAKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTNfUklHSFRfTElORV9JTlBVVF8zXzRfVk9MVU1FLAogCQkJICAgIFdNODk5M19JTjJfVlUsIFdNODk5M19JTjJfVlUpOwogCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX1NQRUFLRVJfVk9MVU1FX0xFRlQsCisJCQkgICAgV004OTkzX1NQS09VVF9WVSwgV004OTkzX1NQS09VVF9WVSk7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX1NQRUFLRVJfVk9MVU1FX1JJR0hULAogCQkJICAgIFdNODk5M19TUEtPVVRfVlUsIFdNODk5M19TUEtPVVRfVlUpOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX0xFRlRfT1VUUFVUX1ZPTFVNRSwKLQkJCSAgICBXTTg5OTNfSFBPVVQxTF9aQywgV004OTkzX0hQT1VUMUxfWkMpOworCQkJICAgIFdNODk5M19IUE9VVDFfVlUgfCBXTTg5OTNfSFBPVVQxTF9aQywKKwkJCSAgICBXTTg5OTNfSFBPVVQxX1ZVIHwgV004OTkzX0hQT1VUMUxfWkMpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5M19SSUdIVF9PVVRQVVRfVk9MVU1FLAogCQkJICAgIFdNODk5M19IUE9VVDFfVlUgfCBXTTg5OTNfSFBPVVQxUl9aQywKIAkJCSAgICBXTTg5OTNfSFBPVVQxX1ZVIHwgV004OTkzX0hQT1VUMVJfWkMpOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX0xFRlRfT1BHQV9WT0xVTUUsCi0JCQkgICAgV004OTkzX01JWE9VVExfWkMsIFdNODk5M19NSVhPVVRMX1pDKTsKKwkJCSAgICBXTTg5OTNfTUlYT1VUTF9aQyB8IFdNODk5M19NSVhPVVRfVlUsCisJCQkgICAgV004OTkzX01JWE9VVExfWkMgfCBXTTg5OTNfTUlYT1VUX1ZVKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTNfUklHSFRfT1BHQV9WT0xVTUUsCiAJCQkgICAgV004OTkzX01JWE9VVFJfWkMgfCBXTTg5OTNfTUlYT1VUX1ZVLAogCQkJICAgIFdNODk5M19NSVhPVVRSX1pDIHwgV004OTkzX01JWE9VVF9WVSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jCmluZGV4IDJjZTBiMmQuLmZhYjIwYTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jCisrKyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jCkBAIC05NSwxNCArOTUsMTQgQEAKIAlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCiAJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi0JaWYgKGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSkgewogCQlyZXQgPSBweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAogCQkJU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgewogCQlyZXQgPSBweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAogCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIAkJaWYgKHJldCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYyBiL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYwppbmRleCAyYWZhYmFmLi4xYTU5MWYxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3JhdW1mZWxkLmMKKysrIGIvc291bmQvc29jL3B4YS9yYXVtZmVsZC5jCkBAIC0xNTEsMTMgKzE1MSwxMyBAQAogCS5od19wYXJhbXMgPSByYXVtZmVsZF9jczQyNzBfaHdfcGFyYW1zLAogfTsKIAotc3RhdGljIGludCByYXVtZmVsZF9saW5lX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3N0YXRpYyBpbnQgcmF1bWZlbGRfYW5hbG9nX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKIHsKIAlyYXVtZmVsZF9lbmFibGVfYXVkaW8oZmFsc2UpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhdW1mZWxkX2xpbmVfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCitzdGF0aWMgaW50IHJhdW1mZWxkX2FuYWxvZ19yZXN1bWUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKIHsKIAlyYXVtZmVsZF9lbmFibGVfYXVkaW8odHJ1ZSk7CiAJcmV0dXJuIDA7CkBAIC0yMjUsMzIgKzIyNSw1MyBAQAogCS5od19wYXJhbXMgPSByYXVtZmVsZF9hazQxMDRfaHdfcGFyYW1zLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHJhdW1mZWxkX2RhaVtdID0gewotewotCS5uYW1lCQk9ICJhazQxMDQiLAotCS5zdHJlYW1fbmFtZQk9ICJQbGF5YmFjayIsCi0JLmNwdV9kYWlfbmFtZQk9ICJweGEtc3NwLWRhaS4xIiwKLQkuY29kZWNfZGFpX25hbWUJPSAiYWs0MTA0LWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lCT0gInB4YS1wY20tYXVkaW8iLAotCS5vcHMJCT0gJnJhdW1mZWxkX2FrNDEwNF9vcHMsCi0JLmNvZGVjX25hbWUJPSAiYWs0MTA0LWNvZGVjLjAiLAotfSwKLXsKLQkubmFtZQkJPSAiQ1M0MjcwIiwKLQkuc3RyZWFtX25hbWUJPSAiQ1M0MjcwIiwKLQkuY3B1X2RhaV9uYW1lCT0gInB4YS1zc3AtZGFpLjAiLAotCS5wbGF0Zm9ybV9uYW1lCT0gInB4YS1wY20tYXVkaW8iLAotCS5jb2RlY19kYWlfbmFtZQk9ICJjczQyNzAtaGlmaSIsCi0JLmNvZGVjX25hbWUJPSAiY3M0MjcwLWNvZGVjLjAtMDA0OCIsCi0JLm9wcwkJPSAmcmF1bWZlbGRfY3M0MjcwX29wcywKLX0sfTsKKyNkZWZpbmUgREFJX0xJTktfQ1M0MjcwCQlcCit7CQkJCQkJCVwKKwkubmFtZQkJPSAiQ1M0MjcwIiwJCQlcCisJLnN0cmVhbV9uYW1lCT0gIkNTNDI3MCIsCQkJXAorCS5jcHVfZGFpX25hbWUJPSAicHhhLXNzcC1kYWkuMCIsCQlcCisJLnBsYXRmb3JtX25hbWUJPSAicHhhLXBjbS1hdWRpbyIsCQlcCisJLmNvZGVjX2RhaV9uYW1lCT0gImNzNDI3MC1oaWZpIiwJCVwKKwkuY29kZWNfbmFtZQk9ICJjczQyNzAtY29kZWMuMC0wMDQ4IiwJXAorCS5vcHMJCT0gJnJhdW1mZWxkX2NzNDI3MF9vcHMsCQlcCit9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfcmF1bWZlbGQgPSB7Ci0JLm5hbWUJCT0gIlJhdW1mZWxkIiwKLQkuZGFpX2xpbmsJPSByYXVtZmVsZF9kYWksCi0JLnN1c3BlbmRfcG9zdAk9IHJhdW1mZWxkX2xpbmVfc3VzcGVuZCwKLQkucmVzdW1lX3ByZQk9IHJhdW1mZWxkX2xpbmVfcmVzdW1lLAotCS5udW1fbGlua3MJPSBBUlJBWV9TSVpFKHJhdW1mZWxkX2RhaSksCisjZGVmaW5lIERBSV9MSU5LX0FLNDEwNAkJXAorewkJCQkJCQlcCisJLm5hbWUJCT0gImFrNDEwNCIsCQkJXAorCS5zdHJlYW1fbmFtZQk9ICJQbGF5YmFjayIsCQkJXAorCS5jcHVfZGFpX25hbWUJPSAicHhhLXNzcC1kYWkuMSIsCQlcCisJLmNvZGVjX2RhaV9uYW1lCT0gImFrNDEwNC1oaWZpIiwJCVwKKwkucGxhdGZvcm1fbmFtZQk9ICJweGEtcGNtLWF1ZGlvIiwJCVwKKwkub3BzCQk9ICZyYXVtZmVsZF9hazQxMDRfb3BzLAkJXAorCS5jb2RlY19uYW1lCT0gInNwaTAuMCIsCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgc25kX3NvY19yYXVtZmVsZF9jb25uZWN0b3JfZGFpW10gPQoreworCURBSV9MSU5LX0NTNDI3MCwKKwlEQUlfTElOS19BSzQxMDQsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgc25kX3NvY19yYXVtZmVsZF9zcGVha2VyX2RhaVtdID0KK3sKKwlEQUlfTElOS19DUzQyNzAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX3JhdW1mZWxkX2Nvbm5lY3RvciA9IHsKKwkubmFtZQkJPSAiUmF1bWZlbGQgQ29ubmVjdG9yIiwKKwkuZGFpX2xpbmsJPSBzbmRfc29jX3JhdW1mZWxkX2Nvbm5lY3Rvcl9kYWksCisJLm51bV9saW5rcwk9IEFSUkFZX1NJWkUoc25kX3NvY19yYXVtZmVsZF9jb25uZWN0b3JfZGFpKSwKKwkuc3VzcGVuZF9wb3N0CT0gcmF1bWZlbGRfYW5hbG9nX3N1c3BlbmQsCisJLnJlc3VtZV9wcmUJPSByYXVtZmVsZF9hbmFsb2dfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19yYXVtZmVsZF9zcGVha2VyID0geworCS5uYW1lCQk9ICJSYXVtZmVsZCBTcGVha2VyIiwKKwkuZGFpX2xpbmsJPSBzbmRfc29jX3JhdW1mZWxkX3NwZWFrZXJfZGFpLAorCS5udW1fbGlua3MJPSBBUlJBWV9TSVpFKHNuZF9zb2NfcmF1bWZlbGRfc3BlYWtlcl9kYWkpLAorCS5zdXNwZW5kX3Bvc3QJPSByYXVtZmVsZF9hbmFsb2dfc3VzcGVuZCwKKwkucmVzdW1lX3ByZQk9IHJhdW1mZWxkX2FuYWxvZ19yZXN1bWUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcmF1bWZlbGRfYXVkaW9fZGV2aWNlOwpAQCAtMjcxLDIyICsyOTIsMjUgQEAKIAogCXNldF9tYXg5NDg1X2NsayhNQVg5NDg1X01DTEtfRlJFUV8xMjI4ODApOwogCi0JLyogUmVnaXN0ZXIgTElORSBhbmQgU1BESUYgKi8KKwkvKiBSZWdpc3RlciBhbmFsb2cgZGV2aWNlICovCiAJcmF1bWZlbGRfYXVkaW9fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAwKTsKIAlpZiAoIXJhdW1mZWxkX2F1ZGlvX2RldmljZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShyYXVtZmVsZF9hdWRpb19kZXZpY2UsCi0JCQkgICAgICZzbmRfc29jX3JhdW1mZWxkKTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHJhdW1mZWxkX2F1ZGlvX2RldmljZSk7Ci0KLQkvKiBubyBTL1BESUYgb24gU3BlYWtlcnMgKi8KIAlpZiAobWFjaGluZV9pc19yYXVtZmVsZF9zcGVha2VyKCkpCisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHJhdW1mZWxkX2F1ZGlvX2RldmljZSwKKwkJCQkgICAgICZzbmRfc29jX3JhdW1mZWxkX3NwZWFrZXIpOworCisJaWYgKG1hY2hpbmVfaXNfcmF1bWZlbGRfY29ubmVjdG9yKCkpCisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHJhdW1mZWxkX2F1ZGlvX2RldmljZSwKKwkJCQkgICAgICZzbmRfc29jX3JhdW1mZWxkX2Nvbm5lY3Rvcik7CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHJhdW1mZWxkX2F1ZGlvX2RldmljZSk7CisJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlyYXVtZmVsZF9lbmFibGVfYXVkaW8odHJ1ZSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcmF1bWZlbGRfYXVkaW9fZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYwppbmRleCBmZmEwOWIzYjIuLjk5MmE3MzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlpZiAoIWkycykKIAkJcmV0dXJuIGZhbHNlOwogCi0JYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKTsKKwlhY3RpdmUgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNDT04pOwogCiAJaWYgKGlzX3NlY29uZGFyeShpMnMpKQogCQlhY3RpdmUgJj0gQ09OX1RYU0RNQV9BQ1RJVkU7CkBAIC0yMjMsNyArMjIzLDcgQEAKIAlpZiAoIWkycykKIAkJcmV0dXJuIGZhbHNlOwogCi0JYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKSAmIENPTl9SWERNQV9BQ1RJVkU7CisJYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTQ09OKSAmIENPTl9SWERNQV9BQ1RJVkU7CiAKIAlyZXR1cm4gYWN0aXZlID8gdHJ1ZSA6IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCA4MWM0MDUyLi41ODZkMTBiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtMzYyLDkgKzM2Miw5IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtaXhlciBjb250cm9sICovCi1zdGF0aWMgaW50IGRhcG1fbmV3X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3N0YXRpYyBpbnQgZGFwbV9uZXdfbWl4ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKIAlpbnQgaSwgcmV0ID0gMDsKIAlzaXplX3QgbmFtZV9sZW4sIHByZWZpeF9sZW47CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwpAQCAtNDQzLDkgKzQ0Myw5IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtdXggY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQorc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQtPnNuZF9jYXJkOwpAQCAtNDkwLDggKzQ5MCw3IEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSB2b2x1bWUgY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQorc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CiAJaWYgKHctPm51bV9rY29udHJvbHMpCiAJCWRldl9lcnIody0+ZGFwbS0+ZGV2LApAQCAtMTczNSwxMyArMTczNCwxMyBAQAogCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgogCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7Ci0JCQlkYXBtX25ld19taXhlcihkYXBtLCB3KTsKKwkJCWRhcG1fbmV3X21peGVyKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX211eDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfbXV4KGRhcG0sIHcpOworCQkJZGFwbV9uZXdfbXV4KHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKIAkJY2FzZSBzbmRfc29jX2RhcG1fYWlmX291dDoKQEAgLTE3NTQsNyArMTc1Myw3IEBACiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKIAkJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfcGdhKGRhcG0sIHcpOworCQkJZGFwbV9uZXdfcGdhKHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgogCQljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYyBiL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCmluZGV4IGFlNzJhZTYwLi5lM2YxMjM1IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYworKysgYi92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYwpAQCAtMTk3LDggKzE5Nyw3IEBACiB7CiAJa3ZtX2ZyZWVfYXNzaWduZWRfaXJxKGt2bSwgYXNzaWduZWRfZGV2KTsKIAotCV9fcGNpX3Jlc2V0X2Z1bmN0aW9uKGFzc2lnbmVkX2Rldi0+ZGV2KTsKLQlwY2lfcmVzdG9yZV9zdGF0ZShhc3NpZ25lZF9kZXYtPmRldik7CisJcGNpX3Jlc2V0X2Z1bmN0aW9uKGFzc2lnbmVkX2Rldi0+ZGV2KTsKIAogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoYXNzaWduZWRfZGV2LT5kZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShhc3NpZ25lZF9kZXYtPmRldik7CkBAIC01MTUsNyArNTE0LDYgQEAKIAl9CiAKIAlwY2lfcmVzZXRfZnVuY3Rpb24oZGV2KTsKLQlwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCiAJbWF0Y2gtPmFzc2lnbmVkX2Rldl9pZCA9IGFzc2lnbmVkX2Rldi0+YXNzaWduZWRfZGV2X2lkOwogCW1hdGNoLT5ob3N0X3NlZ25yID0gYXNzaWduZWRfZGV2LT5zZWducjsKQEAgLTU0Niw3ICs1NDQsNiBAQAogCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKIAlyZXR1cm4gcjsKIG91dF9saXN0X2RlbDoKLQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOwogCWxpc3RfZGVsKCZtYXRjaC0+bGlzdCk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOwogb3V0X2Rpc2FibGU6Cg==