ZGlmZiAtLWdpdCBhL3NyYy9ndWlfcGhvdG9uLmMgYi9zcmMvZ3VpX3Bob3Rvbi5jCmluZGV4IGFhOTlkZDcuLjY3ZGRjNjIgMTAwNjQ0Ci0tLSBhL3NyYy9ndWlfcGhvdG9uLmMKKysrIGIvc3JjL2d1aV9waG90b24uYwpAQCAtMTExMSw5ICsxMTExLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgdm9pZAotZ3VpX21jaF9wcmVwYXJlKGFyZ2MsIGFyZ3YpCi0gICAgaW50CSAgICAqYXJnYzsKLSAgICBjaGFyICAgICoqYXJndjsKK2d1aV9tY2hfcHJlcGFyZShpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIFB0SW5pdChOVUxMKTsKIH0KQEAgLTE3MjAsNyArMTcxOCw3IEBACiAgKiBCcmluZyB0aGUgVmltIHdpbmRvdyB0byB0aGUgZm9yZWdyb3VuZC4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfc2V0X2ZvcmVncm91bmQoKQorZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCh2b2lkKQogewogICAgIFBoV2luZG93RXZlbnRfdCBldmVudDsKIApAQCAtMTg2MCw4ICsxODU4LDcgQEAKIH07CiAKICAgICB2b2lkCi1tY2hfc2V0X21vdXNlX3NoYXBlKHNoYXBlKQotICAgIGludAlzaGFwZTsKK21jaF9zZXRfbW91c2Vfc2hhcGUoaW50IHNoYXBlKQogewogICAgIGludAkgICAgaWQ7CiAKQEAgLTIxODQsNyArMjE4MSw3IEBACiB9CiAKICAgICB2b2lkCi1ndWlfbWNoX2NsZWFyX2FsbCgpCitndWlfbWNoX2NsZWFyX2FsbCh2b2lkKQogewogICAgIFBoUmVjdF90IHRleHRfcmVjdCA9IHsKIAl7IGd1aS5ib3JkZXJfd2lkdGgsIGd1aS5ib3JkZXJfd2lkdGggfSwKQEAgLTMwNzgsOSArMzA3NSw3IEBACiAgKiBEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGFjdHVhbCBuYW1lLCB0aHVzIHVzZSB0aGUgcHJvdmlkZWQgbmFtZS4KICAqLwogICAgIGNoYXJfdSAqCi1ndWlfbWNoX2dldF9mb250bmFtZShmb250LCBuYW1lKQotICAgIEd1aUZvbnQgZm9udDsKLSAgICBjaGFyX3UgICpuYW1lOworZ3VpX21jaF9nZXRfZm9udG5hbWUoR3VpRm9udCBmb250LCBjaGFyX3UgKm5hbWUpCiB7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL3NyYy9ndWlfdzMyLmMgYi9zcmMvZ3VpX3czMi5jCmluZGV4IDVmY2U2ZTAuLjZhMGUwYTMgMTAwNjQ0Ci0tLSBhL3NyYy9ndWlfdzMyLmMKKysrIGIvc3JjL2d1aV93MzIuYwpAQCAtMjI0Niw3ICsyMjQ2LDcgQEAKICAqIEdldCBJTSBzdGF0dXMuICBXaGVuIElNIGlzIG9uLCByZXR1cm4gbm90IDAuICBFbHNlIHJldHVybiAwLgogICovCiAgICAgaW50Ci1pbV9nZXRfc3RhdHVzKCkKK2ltX2dldF9zdGF0dXModm9pZCkKIHsKICAgICBpbnQJCXN0YXR1cyA9IDA7CiAgICAgSElNQwloSW1jOwpAQCAtNDUyNSwxMCArNDUyNSw3IEBACiB9IHNpZ25pY29uX3Q7CiAKICAgICB2b2lkCi1ndWlfbWNoX2RyYXdzaWduKHJvdywgY29sLCB0eXBlbnIpCi0gICAgaW50CQlyb3c7Ci0gICAgaW50CQljb2w7Ci0gICAgaW50CQl0eXBlbnI7CitndWlfbWNoX2RyYXdzaWduKGludCByb3csIGludCBjb2wsIGludCB0eXBlbnIpCiB7CiAgICAgc2lnbmljb25fdCAqc2lnbjsKICAgICBpbnQgeCwgeSwgdywgaDsKQEAgLTQ2MDUsOCArNDYwMiw3IEBACiB9CiAKICAgICB2b2lkICoKLWd1aV9tY2hfcmVnaXN0ZXJfc2lnbihzaWduZmlsZSkKLSAgICBjaGFyX3UJKnNpZ25maWxlOworZ3VpX21jaF9yZWdpc3Rlcl9zaWduKGNoYXJfdSAqc2lnbmZpbGUpCiB7CiAgICAgc2lnbmljb25fdAlzaWduLCAqcHNpZ247CiAgICAgY2hhcl91CSpleHQ7CkBAIC00NjYxLDggKzQ2NTcsNyBAQAogfQogCiAgICAgdm9pZAotZ3VpX21jaF9kZXN0cm95X3NpZ24oc2lnbikKLSAgICB2b2lkICpzaWduOworZ3VpX21jaF9kZXN0cm95X3NpZ24odm9pZCAqc2lnbikKIHsKICAgICBpZiAoc2lnbikKICAgICB7CkBAIC00NzY2LDEwICs0NzYxLDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1tYWtlX3Rvb2x0aXAoYmV2YWwsIHRleHQsIHB0KQotICAgIEJhbGxvb25FdmFsICpiZXZhbDsKLSAgICBjaGFyICp0ZXh0OwotICAgIFBPSU5UIHB0OworbWFrZV90b29sdGlwKEJhbGxvb25FdmFsICpiZXZhbCwgY2hhciAqdGV4dCwgUE9JTlQgcHQpCiB7CiAgICAgVE9PTElORk8JKnB0aTsKICAgICBpbnQJCVRvb2xJbmZvU2l6ZTsKQEAgLTQ4MzMsMTkgKzQ4MjUsMTggQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1kZWxldGVfdG9vbHRpcChiZXZhbCkKLSAgICBCYWxsb29uRXZhbAkqYmV2YWw7CitkZWxldGVfdG9vbHRpcChCYWxsb29uRXZhbCAqYmV2YWwpCiB7CiAgICAgUG9zdE1lc3NhZ2UoYmV2YWwtPmJhbGxvb24sIFdNX0NMT1NFLCAwLCAwKTsKIH0KIAogLypBUkdTVVNFRCovCiAgICAgc3RhdGljIFZPSUQgQ0FMTEJBQ0sKLUJldmFsVGltZXJQcm9jKGh3bmQsIHVNc2csIGlkRXZlbnQsIGR3VGltZSkKLSAgICBIV05EICAgIGh3bmQ7Ci0gICAgVUlOVCAgICB1TXNnOwotICAgIFVJTlRfUFRSICAgIGlkRXZlbnQ7Ci0gICAgRFdPUkQgICBkd1RpbWU7CitCZXZhbFRpbWVyUHJvYygKKyAgICBIV05EICAgIGh3bmQsCisgICAgVUlOVCAgICB1TXNnLAorICAgIFVJTlRfUFRSICAgIGlkRXZlbnQsCisgICAgRFdPUkQgICBkd1RpbWUpCiB7CiAgICAgUE9JTlQJcHQ7CiAgICAgUkVDVAlyZWN0OwpAQCAtNDg4Myw4ICs0ODc0LDcgQEAKIAogLypBUkdTVVNFRCovCiAgICAgdm9pZAotZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEoYmV2YWwpCi0gICAgQmFsbG9vbkV2YWwJKmJldmFsOworZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEoQmFsbG9vbkV2YWwgKmJldmFsKQogewogICAgIC8vIFRSQUNFMCgiZ3VpX21jaF9kaXNhYmxlX2JldmFsX2FyZWEge3t7Iik7CiAgICAgS2lsbFRpbWVyKHNfdGV4dEFyZWEsIEJldmFsVGltZXJJZCk7CkBAIC00ODkzLDggKzQ4ODMsNyBAQAogCiAvKkFSR1NVU0VEKi8KICAgICB2b2lkCi1ndWlfbWNoX2VuYWJsZV9iZXZhbF9hcmVhKGJldmFsKQotICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKK2d1aV9tY2hfZW5hYmxlX2JldmFsX2FyZWEoQmFsbG9vbkV2YWwgKmJldmFsKQogewogICAgIC8vIFRSQUNFMCgiZ3VpX21jaF9lbmFibGVfYmV2YWxfYXJlYSB8fHwiKTsKICAgICBpZiAoYmV2YWwgPT0gTlVMTCkKQEAgLTQ5MDUsOSArNDg5NCw3IEBACiB9CiAKICAgICB2b2lkCi1ndWlfbWNoX3Bvc3RfYmFsbG9vbihiZXZhbCwgbWVzZykKLSAgICBCYWxsb29uRXZhbAkqYmV2YWw7Ci0gICAgY2hhcl91CSptZXNnOworZ3VpX21jaF9wb3N0X2JhbGxvb24oQmFsbG9vbkV2YWwgKmJldmFsLCBjaGFyX3UgKm1lc2cpCiB7CiAgICAgUE9JTlQgICBwdDsKICAgICAvLyBUUkFDRTAoImd1aV9tY2hfcG9zdF9iYWxsb29uIHt7eyIpOwpAQCAtNDkyOCwxMSArNDkxNSwxMSBAQAogCiAvKkFSR1NVU0VEKi8KICAgICBCYWxsb29uRXZhbCAqCi1ndWlfbWNoX2NyZWF0ZV9iZXZhbF9hcmVhKHRhcmdldCwgbWVzZywgbWVzZ0NCLCBjbGllbnREYXRhKQotICAgIHZvaWQJKnRhcmdldDsJLyogaWdub3JlZCwgYWx3YXlzIHVzZSBzX3RleHRBcmVhICovCi0gICAgY2hhcl91CSptZXNnOwotICAgIHZvaWQJKCptZXNnQ0IpKEJhbGxvb25FdmFsICosIGludCk7Ci0gICAgdm9pZAkqY2xpZW50RGF0YTsKK2d1aV9tY2hfY3JlYXRlX2JldmFsX2FyZWEoCisgICAgdm9pZAkqdGFyZ2V0LAkvKiBpZ25vcmVkLCBhbHdheXMgdXNlIHNfdGV4dEFyZWEgKi8KKyAgICBjaGFyX3UJKm1lc2csCisgICAgdm9pZAkoKm1lc2dDQikoQmFsbG9vbkV2YWwgKiwgaW50KSwKKyAgICB2b2lkCSpjbGllbnREYXRhKQogewogICAgIC8qIHBhcnRpYWxseSBzdG9sZW4gZnJvbSBndWlfYmV2YWwuYyAqLwogICAgIEJhbGxvb25FdmFsCSpiZXZhbDsKQEAgLTUwMTAsOCArNDk5Nyw3IEBACiB9CiAKICAgICB2b2lkCi1ndWlfbWNoX2Rlc3Ryb3lfYmV2YWxfYXJlYShiZXZhbCkKLSAgICBCYWxsb29uRXZhbAkqYmV2YWw7CitndWlfbWNoX2Rlc3Ryb3lfYmV2YWxfYXJlYShCYWxsb29uRXZhbCAqYmV2YWwpCiB7CiAgICAgdmltX2ZyZWUoYmV2YWwpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2d1aV93NDguYyBiL3NyYy9ndWlfdzQ4LmMKaW5kZXggZGZjYzI4OC4uNzc4OWVmMiAxMDA2NDQKLS0tIGEvc3JjL2d1aV93NDguYworKysgYi9zcmMvZ3VpX3c0OC5jCkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogICogU2V0IHRoZSBjb2xvcnMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX2RlZl9jb2xvcnMoKQorZ3VpX21jaF9kZWZfY29sb3JzKHZvaWQpCiB7CiAgICAgZ3VpLm5vcm1fcGl4ZWwgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dURVhUKTsKICAgICBndWkuYmFja19waXhlbCA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPVyk7CkBAIC0xMzkwLDkgKzEzOTAsNyBAQAogICovCiAvKkFSR1NVU0VEKi8KICAgICBjaGFyX3UgKgotZ3VpX21jaF9nZXRfZm9udG5hbWUoZm9udCwgbmFtZSkKLSAgICBHdWlGb250IGZvbnQ7Ci0gICAgY2hhcl91ICAqbmFtZTsKK2d1aV9tY2hfZ2V0X2ZvbnRuYW1lKEd1aUZvbnQgZm9udCwgY2hhcl91ICpuYW1lKQogewogICAgIGlmIChuYW1lID09IE5VTEwpCiAJcmV0dXJuIE5VTEw7CkBAIC0yNjIzLDggKzI2MjEsNyBAQAogICogU2V0IHRoZSBjdXJyZW50IHRhYiB0byAibnIiLiAgRmlyc3QgdGFiIGlzIDEuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3NldF9jdXJ0YWIobnIpCi0gICAgaW50CQlucjsKK2d1aV9tY2hfc2V0X2N1cnRhYihpbnQgbnIpCiB7CiAgICAgaWYgKHNfdGFiaHduZCA9PSBOVUxMKQogCXJldHVybjsKQEAgLTMyNTgsNyArMzI1NSw3IEBACiAgKiBIYW5kbGVyIG9mIGd1aS53aWRlX2ZvbnQgKHBfZ3VpZm9udHdpZGUpIGNoYW5nZWQgbm90aWZpY2F0aW9uLgogICovCiAgICAgdm9pZAotZ3VpX21jaF93aWRlX2ZvbnRfY2hhbmdlZCgpCitndWlfbWNoX3dpZGVfZm9udF9jaGFuZ2VkKHZvaWQpCiB7CiAjIGlmbmRlZiBNU1dJTjE2X0ZBU1RURVhUCiAgICAgTE9HRk9OVCBsZjsKQEAgLTMzODUsNyArMzM4Miw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB0aGUgR1VJIHdpbmRvdyBpcyBtYXhpbWl6ZWQsIGZpbGxpbmcgdGhlIHdob2xlIHNjcmVlbi4KICAqLwogICAgIGludAotZ3VpX21jaF9tYXhpbWl6ZWQoKQorZ3VpX21jaF9tYXhpbWl6ZWQodm9pZCkKIHsKICAgICBXSU5ET1dQTEFDRU1FTlQgd3A7CiAKQEAgLTM0MDMsNyArMzQwMCw3IEBACiAgKiBuZXcgUm93cyBhbmQgQ29sdW1ucy4gIFRoaXMgaXMgbGlrZSByZXNpemluZyB0aGUgd2luZG93LgogICovCiAgICAgdm9pZAotZ3VpX21jaF9uZXdmb250KCkKK2d1aV9tY2hfbmV3Zm9udCh2b2lkKQogewogICAgIFJFQ1QJcmVjdDsKIApkaWZmIC0tZ2l0IGEvc3JjL2d1aV94MTEuYyBiL3NyYy9ndWlfeDExLmMKaW5kZXggMDFlOTM5NC4uYWYzYzNhOSAxMDA2NDQKLS0tIGEvc3JjL2d1aV94MTEuYworKysgYi9zcmMvZ3VpX3gxMS5jCkBAIC01NzEsMTkgKzU3MSwxOSBAQAogICovCiAKICAgICBzdGF0aWMgdm9pZAotZ3VpX3gxMV90aW1lcl9jYih0aW1lZF9vdXQsIGludGVydmFsX2lkKQotICAgIFh0UG9pbnRlcgkgICAgdGltZWRfb3V0OwotICAgIFh0SW50ZXJ2YWxJZCAgICAqaW50ZXJ2YWxfaWQgVU5VU0VEOworZ3VpX3gxMV90aW1lcl9jYigKKyAgICBYdFBvaW50ZXIJICAgIHRpbWVkX291dCwKKyAgICBYdEludGVydmFsSWQgICAgKmludGVydmFsX2lkIFVOVVNFRCkKIHsKICAgICAqKChpbnQgKil0aW1lZF9vdXQpID0gVFJVRTsKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1ndWlfeDExX3Zpc2liaWxpdHlfY2IodywgZHVkLCBldmVudCwgZHVtKQotICAgIFdpZGdldAl3IFVOVVNFRDsKLSAgICBYdFBvaW50ZXIJZHVkIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50OwotICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQ7CitndWlfeDExX3Zpc2liaWxpdHlfY2IoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcglkdWQgVU5VU0VELAorICAgIFhFdmVudAkqZXZlbnQsCisgICAgQm9vbGVhbgkqZHVtIFVOVVNFRCkKIHsKICAgICBpZiAoZXZlbnQtPnR5cGUgIT0gVmlzaWJpbGl0eU5vdGlmeSkKIAlyZXR1cm47CkBAIC02MDIsMTEgKzYwMiwxMSBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLWd1aV94MTFfZXhwb3NlX2NiKHcsIGR1ZCwgZXZlbnQsIGR1bSkKLSAgICBXaWRnZXQJdyBVTlVTRUQ7Ci0gICAgWHRQb2ludGVyCWR1ZCBVTlVTRUQ7Ci0gICAgWEV2ZW50CSpldmVudDsKLSAgICBCb29sZWFuCSpkdW0gVU5VU0VEOworZ3VpX3gxMV9leHBvc2VfY2IoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcglkdWQgVU5VU0VELAorICAgIFhFdmVudAkqZXZlbnQsCisgICAgQm9vbGVhbgkqZHVtIFVOVVNFRCkKIHsKICAgICBYRXhwb3NlRXZlbnQJKmdldmVudDsKICAgICBpbnQJCQluZXdfeDsKQEAgLTY3OCwxMSArNjc4LDExIEBACiAjZW5kaWYKIAogICAgIHN0YXRpYyB2b2lkCi1ndWlfeDExX3Jlc2l6ZV93aW5kb3dfY2IodywgZHVkLCBldmVudCwgZHVtKQotICAgIFdpZGdldAl3IFVOVVNFRDsKLSAgICBYdFBvaW50ZXIJZHVkIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50OwotICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQ7CitndWlfeDExX3Jlc2l6ZV93aW5kb3dfY2IoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcglkdWQgVU5VU0VELAorICAgIFhFdmVudAkqZXZlbnQsCisgICAgQm9vbGVhbgkqZHVtIFVOVVNFRCkKIHsKICAgICBzdGF0aWMgaW50IGxhc3RXaWR0aCwgbGFzdEhlaWdodDsKIApAQCAtNzI0LDMxICs3MjQsMzEgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1ndWlfeDExX2ZvY3VzX2NoYW5nZV9jYih3LCBkYXRhLCBldmVudCwgZHVtKQotICAgIFdpZGdldAl3IFVOVVNFRDsKLSAgICBYdFBvaW50ZXIJZGF0YSBVTlVTRUQ7Ci0gICAgWEV2ZW50CSpldmVudDsKLSAgICBCb29sZWFuCSpkdW0gVU5VU0VEOworZ3VpX3gxMV9mb2N1c19jaGFuZ2VfY2IoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcglkYXRhIFVOVVNFRCwKKyAgICBYRXZlbnQJKmV2ZW50LAorICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQpCiB7CiAgICAgZ3VpX2ZvY3VzX2NoYW5nZShldmVudC0+dHlwZSA9PSBGb2N1c0luKTsKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1ndWlfeDExX2VudGVyX2NiKHcsIGRhdGEsIGV2ZW50LCBkdW0pCi0gICAgV2lkZ2V0CXcgVU5VU0VEOwotICAgIFh0UG9pbnRlcglkYXRhIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50IFVOVVNFRDsKLSAgICBCb29sZWFuCSpkdW0gVU5VU0VEOworZ3VpX3gxMV9lbnRlcl9jYigKKyAgICBXaWRnZXQJdyBVTlVTRUQsCisgICAgWHRQb2ludGVyCWRhdGEgVU5VU0VELAorICAgIFhFdmVudAkqZXZlbnQgVU5VU0VELAorICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQpCiB7CiAgICAgZ3VpX2ZvY3VzX2NoYW5nZShUUlVFKTsKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1ndWlfeDExX2xlYXZlX2NiKHcsIGRhdGEsIGV2ZW50LCBkdW0pCi0gICAgV2lkZ2V0CXcgVU5VU0VEOwotICAgIFh0UG9pbnRlcglkYXRhIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50IFVOVVNFRDsKLSAgICBCb29sZWFuCSpkdW0gVU5VU0VEOworZ3VpX3gxMV9sZWF2ZV9jYigKKyAgICBXaWRnZXQJdyBVTlVTRUQsCisgICAgWHRQb2ludGVyCWRhdGEgVU5VU0VELAorICAgIFhFdmVudAkqZXZlbnQgVU5VU0VELAorICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQpCiB7CiAgICAgZ3VpX2ZvY3VzX2NoYW5nZShGQUxTRSk7CiB9CkBAIC03NjAsMTEgKzc2MCwxMSBAQAogI2VuZGlmCiAKICAgICB2b2lkCi1ndWlfeDExX2tleV9oaXRfY2IodywgZHVkLCBldmVudCwgZHVtKQotICAgIFdpZGdldAl3IFVOVVNFRDsKLSAgICBYdFBvaW50ZXIJZHVkIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50OwotICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQ7CitndWlfeDExX2tleV9oaXRfY2IoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcglkdWQgVU5VU0VELAorICAgIFhFdmVudAkqZXZlbnQsCisgICAgQm9vbGVhbgkqZHVtIFVOVVNFRCkKIHsKICAgICBYS2V5UHJlc3NlZEV2ZW50CSpldl9wcmVzczsKICNpZmRlZiBGRUFUX1hJTQpAQCAtMTA3MSwxMSArMTA3MSwxMSBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLWd1aV94MTFfbW91c2VfY2IodywgZHVkLCBldmVudCwgZHVtKQotICAgIFdpZGdldAl3IFVOVVNFRDsKLSAgICBYdFBvaW50ZXIJZHVkIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50OwotICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQ7CitndWlfeDExX21vdXNlX2NiKAorICAgIFdpZGdldAl3IFVOVVNFRCwKKyAgICBYdFBvaW50ZXIJZHVkIFVOVVNFRCwKKyAgICBYRXZlbnQJKmV2ZW50LAorICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQpCiB7CiAgICAgc3RhdGljIFh0SW50ZXJ2YWxJZCB0aW1lciA9IChYdEludGVydmFsSWQpMDsKICAgICBzdGF0aWMgaW50CXRpbWVkX291dCA9IFRSVUU7CkBAIC0xMTY2LDEwICsxMTY2LDEwIEBACiAjaWZkZWYgRkVBVF9TTklGRgogLyogQVJHU1VTRUQgKi8KICAgICBzdGF0aWMgdm9pZAotZ3VpX3gxMV9zbmlmZl9yZXF1ZXN0X2NiKGNsb3N1cmUsIHNvdXJjZSwgaWQpCi0gICAgWHRQb2ludGVyCWNsb3N1cmUgVU5VU0VEOwotICAgIGludAkJKnNvdXJjZSBVTlVTRUQ7Ci0gICAgWHRJbnB1dElkCSppZCBVTlVTRUQ7CitndWlfeDExX3NuaWZmX3JlcXVlc3RfY2IoCisgICAgWHRQb2ludGVyCWNsb3N1cmUgVU5VU0VELAorICAgIGludAkJKnNvdXJjZSBVTlVTRUQsCisgICAgWHRJbnB1dElkCSppZCBVTlVTRUQpCiB7CiAgICAgc3RhdGljIGNoYXJfdSBieXRlc1szXSA9IHtDU0ksIChpbnQpS1NfRVhUUkEsIChpbnQpS0VfU05JRkZ9OwogCkBAIC0xMTg3LDkgKzExODcsNyBAQAogICogd2hlbiB2aW0gaXMgc3RhcnRlZCwgd2hldGhlciBvciBub3QgdGhlIEdVSSBoYXMgYmVlbiBzdGFydGVkLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9wcmVwYXJlKGFyZ2MsIGFyZ3YpCi0gICAgaW50CSAgICAqYXJnYzsKLSAgICBjaGFyICAgICoqYXJndjsKK2d1aV9tY2hfcHJlcGFyZShpbnQgKmFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIGludAkgICAgYXJnOwogICAgIGludAkgICAgaTsKQEAgLTEyODUsNyArMTI4Myw3IEBACiAgKiBSZXR1cm4gT0sgb3IgRkFJTC4KICAqLwogICAgIGludAotZ3VpX21jaF9pbml0X2NoZWNrKCkKK2d1aV9tY2hfaW5pdF9jaGVjayh2b2lkKQogewogI2lmZGVmIEZFQVRfWElNCiAgICAgWHRTZXRMYW5ndWFnZVByb2MoTlVMTCwgTlVMTCwgTlVMTCk7CkBAIC0xMzE1LDEwICsxMzEzLDEwIEBACiBzdGF0aWMgdm9pZCBsb2NhbF94c21wX2hhbmRsZV9yZXF1ZXN0cyhYdFBvaW50ZXIgYywgaW50ICpzLCBYdElucHV0SWQgKmkpOwogCiAgICAgc3RhdGljIHZvaWQKLWxvY2FsX3hzbXBfaGFuZGxlX3JlcXVlc3RzKGMsIHMsIGkpCi0gICAgWHRQb2ludGVyCWMgVU5VU0VEOwotICAgIGludAkJKnMgVU5VU0VEOwotICAgIFh0SW5wdXRJZAkqaSBVTlVTRUQ7Citsb2NhbF94c21wX2hhbmRsZV9yZXF1ZXN0cygKKyAgICBYdFBvaW50ZXIJYyBVTlVTRUQsCisgICAgaW50CQkqcyBVTlVTRUQsCisgICAgWHRJbnB1dElkCSppIFVOVVNFRCkKIHsKICAgICBpZiAoeHNtcF9oYW5kbGVfcmVxdWVzdHMoKSA9PSBGQUlMKQogCVh0UmVtb3ZlSW5wdXQoX3hzbXBfeHRpbnB1dGlkKTsKQEAgLTEzMzEsNyArMTMyOSw3IEBACiAgKiBSZXR1cm5zIE9LIGZvciBzdWNjZXNzLCBGQUlMIHdoZW4gdGhlIEdVSSBjYW4ndCBiZSBzdGFydGVkLgogICovCiAgICAgaW50Ci1ndWlfbWNoX2luaXQoKQorZ3VpX21jaF9pbml0KHZvaWQpCiB7CiAgICAgWHRHQ01hc2sJZ2NfbWFzazsKICAgICBYR0NWYWx1ZXMJZ2NfdmFsczsKQEAgLTE1NzUsNyArMTU3Myw3IEBACiAgKiBDYWxsZWQgd2hlbiBzdGFydGluZyB0aGUgR1VJIGZhaWxzIGFmdGVyIGNhbGxpbmcgZ3VpX21jaF9pbml0KCkuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3VuaW5pdCgpCitndWlfbWNoX3VuaW5pdCh2b2lkKQogewogICAgIGd1aV94MTFfZGVzdHJveV93aWRnZXRzKCk7CiAgICAgWHRDbG9zZURpc3BsYXkoZ3VpLmRweSk7CkBAIC0xNTg5LDcgKzE1ODcsNyBAQAogICogQ2FsbGVkIHdoZW4gdGhlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCBjb2xvciBoYXMgYmVlbiBjaGFuZ2VkLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9uZXdfY29sb3JzKCkKK2d1aV9tY2hfbmV3X2NvbG9ycyh2b2lkKQogewogICAgIGxvbmdfdQlnY19tYXNrOwogICAgIFhHQ1ZhbHVlcwlnY192YWxzOwpAQCAtMTYxOSw3ICsxNjE3LDcgQEAKICAqIE9wZW4gdGhlIEdVSSB3aW5kb3cgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGd1aV9tY2hfaW5pdCgpLgogICovCiAgICAgaW50Ci1ndWlfbWNoX29wZW4oKQorZ3VpX21jaF9vcGVuKHZvaWQpCiB7CiAgICAgLyogQWN0dWFsbHkgb3BlbiB0aGUgd2luZG93ICovCiAgICAgWHRSZWFsaXplV2lkZ2V0KHZpbVNoZWxsKTsKQEAgLTE3MDAsNyArMTY5OCw3IEBACiAgKiBDb252ZXJ0IHRoZSB0b29sdGlwIGZvbnRzZXQgbmFtZSB0byBhbiBYRm9udFNldC4KICAqLwogICAgIHZvaWQKLWd1aV9pbml0X3Rvb2x0aXBfZm9udCgpCitndWlfaW5pdF90b29sdGlwX2ZvbnQodm9pZCkKIHsKICAgICBYcm1WYWx1ZSBmcm9tLCB0bzsKIApAQCAtMTcxOSw3ICsxNzE3LDcgQEAKICNpZiBkZWZpbmVkKEZFQVRfTUVOVSkgfHwgZGVmaW5lZChQUk9UTykKIC8qIENvbnZlcnQgdGhlIG1lbnUgZm9udC9mb250c2V0IG5hbWUgdG8gYW4gWEZvbnRTdHJ1Y3QvWEZvbnRzZXQgKi8KICAgICB2b2lkCi1ndWlfaW5pdF9tZW51X2ZvbnQoKQorZ3VpX2luaXRfbWVudV9mb250KHZvaWQpCiB7CiAgICAgWHJtVmFsdWUgZnJvbSwgdG87CiAKQEAgLTE3NDgsOCArMTc0Niw3IEBACiAjZW5kaWYKIAogICAgIHZvaWQKLWd1aV9tY2hfZXhpdChyYykKLSAgICBpbnQJCXJjIFVOVVNFRDsKK2d1aV9tY2hfZXhpdChpbnQgcmMgVU5VU0VEKQogewogI2lmIDAKICAgICAvKiBMZXNzdGlmIGdpdmVzIGFuIGVycm9yIG1lc3NhZ2UgaGVyZSwgYW5kIHNvIGRvZXMgU29sYXJpcy4gIFRoZSBtYW4gcGFnZQpAQCAtMTc2NCw4ICsxNzYxLDcgQEAKICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93LgogICovCiAgICAgaW50Ci1ndWlfbWNoX2dldF93aW5wb3MoeCwgeSkKLSAgICBpbnQJCSp4LCAqeTsKK2d1aV9tY2hfZ2V0X3dpbnBvcyhpbnQgKngsICp5KQogewogICAgIERpbWVuc2lvbgl4cG9zLCB5cG9zOwogCkBAIC0xNzgzLDggKzE3NzksNyBAQAogICogY29vcmRpbmF0ZXMuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3NldF93aW5wb3MoeCwgeSkKLSAgICBpbnQJCXgsIHk7CitndWlfbWNoX3NldF93aW5wb3MoaW50IHgsIHkpCiB7CiAgICAgWHRWYVNldFZhbHVlcyh2aW1TaGVsbCwKIAlYdE54LAl4LApAQCAtMTc5MywxNSArMTc4OCwxNCBAQAogfQogCiAgICAgdm9pZAotZ3VpX21jaF9zZXRfc2hlbGxzaXplKHdpZHRoLCBoZWlnaHQsIG1pbl93aWR0aCwgbWluX2hlaWdodCwKLQkJICAgIGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0LCBkaXJlY3Rpb24pCi0gICAgaW50CQl3aWR0aDsKLSAgICBpbnQJCWhlaWdodDsKLSAgICBpbnQJCW1pbl93aWR0aDsKLSAgICBpbnQJCW1pbl9oZWlnaHQ7Ci0gICAgaW50CQliYXNlX3dpZHRoOwotICAgIGludAkJYmFzZV9oZWlnaHQ7Ci0gICAgaW50CQlkaXJlY3Rpb24gVU5VU0VEOworZ3VpX21jaF9zZXRfc2hlbGxzaXplKAorICAgIGludAkJd2lkdGgsCisgICAgaW50CQloZWlnaHQsCisgICAgaW50CQltaW5fd2lkdGgsCisgICAgaW50CQltaW5faGVpZ2h0LAorICAgIGludAkJYmFzZV93aWR0aCwKKyAgICBpbnQJCWJhc2VfaGVpZ2h0LAorICAgIGludAkJZGlyZWN0aW9uIFVOVVNFRCkKIHsKICNpZmRlZiBGRUFUX1hJTQogICAgIGhlaWdodCArPSB4aW1fZ2V0X3N0YXR1c19hcmVhX2hlaWdodCgpLApAQCAtMTgyNSw5ICsxODE5LDkgQEAKICAqIElzIHRoZXJlIG5vIHdheSBpbiBYIHRvIGZpbmQgb3V0IGhvdyB3aWRlIHRoZSBib3JkZXJzIHJlYWxseSBhcmU/CiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucyhzY3JlZW5fdywgc2NyZWVuX2gpCi0gICAgaW50CSAgICAqc2NyZWVuX3c7Ci0gICAgaW50CSAgICAqc2NyZWVuX2g7CitndWlfbWNoX2dldF9zY3JlZW5fZGltZW5zaW9ucygKKyAgICBpbnQJICAgICpzY3JlZW5fdywKKyAgICBpbnQJICAgICpzY3JlZW5faCkKIHsKICAgICAqc2NyZWVuX3cgPSBEaXNwbGF5V2lkdGgoZ3VpLmRweSwgRGVmYXVsdFNjcmVlbihndWkuZHB5KSkgLSAxMDsKICAgICAqc2NyZWVuX2ggPSBEaXNwbGF5SGVpZ2h0KGd1aS5kcHksIERlZmF1bHRTY3JlZW4oZ3VpLmRweSkpIC0gcF9naHI7CkBAIC0xODQwLDkgKzE4MzQsOSBAQAogICogUmV0dXJuIEZBSUwgaWYgdGhlIGZvbnQgY291bGQgbm90IGJlIGxvYWRlZCwgT0sgb3RoZXJ3aXNlLgogICovCiAgICAgaW50Ci1ndWlfbWNoX2luaXRfZm9udChmb250X25hbWUsIGRvX2ZvbnRzZXQpCi0gICAgY2hhcl91CSpmb250X25hbWU7Ci0gICAgaW50CQlkb19mb250c2V0IFVOVVNFRDsKK2d1aV9tY2hfaW5pdF9mb250KAorICAgIGNoYXJfdQkqZm9udF9uYW1lLAorICAgIGludAkJZG9fZm9udHNldCBVTlVTRUQpCiB7CiAgICAgWEZvbnRTdHJ1Y3QJKmZvbnQgPSBOVUxMOwogCkBAIC0xOTcwLDkgKzE5NjQsNyBAQAogICogR2V0IGEgZm9udCBzdHJ1Y3R1cmUgZm9yIGhpZ2hsaWdodGluZy4KICAqLwogICAgIEd1aUZvbnQKLWd1aV9tY2hfZ2V0X2ZvbnQobmFtZSwgZ2l2ZUVycm9ySWZNaXNzaW5nKQotICAgIGNoYXJfdQkqbmFtZTsKLSAgICBpbnQJCWdpdmVFcnJvcklmTWlzc2luZzsKK2d1aV9tY2hfZ2V0X2ZvbnQoY2hhcl91ICpuYW1lLCBpbnQgZ2l2ZUVycm9ySWZNaXNzaW5nKQogewogICAgIFhGb250U3RydWN0CSpmb250OwogCkBAIC0yMDIxLDkgKzIwMTMsNyBAQAogICogRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBhY3R1YWwgbmFtZSwgdGh1cyB1c2UgdGhlIHByb3ZpZGVkIG5hbWUuCiAgKi8KICAgICBjaGFyX3UgKgotZ3VpX21jaF9nZXRfZm9udG5hbWUoZm9udCwgbmFtZSkKLSAgICBHdWlGb250IGZvbnQgVU5VU0VEOwotICAgIGNoYXJfdSAgKm5hbWU7CitndWlfbWNoX2dldF9mb250bmFtZShHdWlGb250IGZvbnQgVU5VU0VELCBjaGFyX3UgKm5hbWUpCiB7CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKQEAgLTIwMzUsNyArMjAyNSw3IEBACiAgKiBBZGp1c3QgZ3VpLmNoYXJfaGVpZ2h0IChhZnRlciAnbGluZXNwYWNlJyB3YXMgY2hhbmdlZCkuCiAgKi8KICAgICBpbnQKLWd1aV9tY2hfYWRqdXN0X2NoYXJoZWlnaHQoKQorZ3VpX21jaF9hZGp1c3RfY2hhcmhlaWdodCh2b2lkKQogewogI2lmZGVmIEZFQVRfWEZPTlRTRVQKICAgICBpZiAoZ3VpLmZvbnRzZXQgIT0gTk9GT05UU0VUKQpAQCAtMjA1OSw4ICsyMDQ5LDcgQEAKICAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvbnQuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3NldF9mb250KGZvbnQpCi0gICAgR3VpRm9udAlmb250OworZ3VpX21jaF9zZXRfZm9udChHdWlGb250IGZvbnQpCiB7CiAgICAgc3RhdGljIEZvbnQJcHJldl9mb250ID0gKEZvbnQpLTE7CiAgICAgRm9udAlmaWQgPSAoKFhGb250U3RydWN0ICopZm9udCktPmZpZDsKQEAgLTIwODMsOCArMjA3Miw3IEBACiAgKiBBZGp1c3QgdGhlIGFzY2VudCwgaW4gY2FzZSBpdCdzIGRpZmZlcmVudC4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfc2V0X2ZvbnRzZXQoZm9udHNldCkKLSAgICBHdWlGb250c2V0CWZvbnRzZXQ7CitndWlfbWNoX3NldF9mb250c2V0KEd1aUZvbnRzZXQgZm9udHNldCkKIHsKICAgICBjdXJyZW50X2ZvbnRzZXQgPSAoWEZvbnRTZXQpZm9udHNldDsKICAgICBndWkuY2hhcl9hc2NlbnQgPSBmb250c2V0X2FzY2VudChjdXJyZW50X2ZvbnRzZXQpICsgcF9saW5lc3BhY2UgLyAyOwpAQCAtMjA5NSw4ICsyMDgzLDcgQEAKICAqIElmIGEgZm9udCBpcyBub3QgZ29pbmcgdG8gYmUgdXNlZCwgZnJlZSBpdHMgc3RydWN0dXJlLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9mcmVlX2ZvbnQoZm9udCkKLSAgICBHdWlGb250CWZvbnQ7CitndWlfbWNoX2ZyZWVfZm9udChHdWlGb250IGZvbnQpCiB7CiAgICAgaWYgKGZvbnQgIT0gTk9GT05UKQogCVhGcmVlRm9udChndWkuZHB5LCAoWEZvbnRTdHJ1Y3QgKilmb250KTsKQEAgLTIxMDcsOCArMjA5NCw3IEBACiAgKiBJZiBhIGZvbnRzZXQgaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQsIGZyZWUgaXRzIHN0cnVjdHVyZS4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfZnJlZV9mb250c2V0KGZvbnRzZXQpCi0gICAgR3VpRm9udHNldAlmb250c2V0OworZ3VpX21jaF9mcmVlX2ZvbnRzZXQoR3VpRm9udHNldCBmb250c2V0KQogewogICAgIGlmIChmb250c2V0ICE9IE5PRk9OVFNFVCkKIAlYRnJlZUZvbnRTZXQoZ3VpLmRweSwgKFhGb250U2V0KWZvbnRzZXQpOwpAQCAtMjExOSwxMCArMjEwNSwxMCBAQAogICogUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBmb250c2V0LCBvciBOT0ZPTlRTRVQgd2hlbiBmYWlsaW5nLgogICovCiAgICAgR3VpRm9udHNldAotZ3VpX21jaF9nZXRfZm9udHNldChuYW1lLCBnaXZlRXJyb3JJZk1pc3NpbmcsIGZpeGVkX3dpZHRoKQotICAgIGNoYXJfdQkqbmFtZTsKLSAgICBpbnQJCWdpdmVFcnJvcklmTWlzc2luZzsKLSAgICBpbnQJCWZpeGVkX3dpZHRoOworZ3VpX21jaF9nZXRfZm9udHNldCgKKyAgICBjaGFyX3UJKm5hbWUsCisgICAgaW50CQlnaXZlRXJyb3JJZk1pc3NpbmcsCisgICAgaW50CQlmaXhlZF93aWR0aCkKIHsKICAgICBYRm9udFNldAlmb250c2V0OwogICAgIGNoYXIJKiptaXNzaW5nLCAqZGVmX3N0cjsKQEAgLTIxNjUsOCArMjE1MSw3IEBACiAgKiBDaGVjayBpZiBmb250c2V0ICJmcyIgaXMgZml4ZWQgd2lkdGguCiAgKi8KICAgICBzdGF0aWMgaW50Ci1jaGVja19mb250c2V0X3Nhbml0eShmcykKLSAgICBYRm9udFNldCBmczsKK2NoZWNrX2ZvbnRzZXRfc2FuaXR5KFhGb250U2V0IGZzKQogewogICAgIFhGb250U3RydWN0CSoqeGZzOwogICAgIGNoYXIJKipmb250X25hbWU7CkBAIC0yMjE2LDE1ICsyMjAxLDE0IEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1mb250c2V0X3dpZHRoKGZzKQotICAgIFhGb250U2V0IGZzOworZm9udHNldF93aWR0aChYRm9udFNldCBmcykKIHsKLSAgICByZXR1cm4gWG1iVGV4dEVzY2FwZW1lbnQoZnMsICJWaW0iLCAzKSAvIDM7CisgcmV0dXJuIFhtYlRleHRFc2NhcGVtZW50KGZzLCAiVmltIiwgMykgLyAzOwogfQogCiAgICAgaW50Ci1mb250c2V0X2hlaWdodChmcykKLSAgICBYRm9udFNldCBmczsKK2ZvbnRzZXRfaGVpZ2h0KAorICAgIFhGb250U2V0IGZzKQogewogICAgIFhGb250U2V0RXh0ZW50cyAqZXh0ZW50czsKIApAQCAtMjIzOSw4ICsyMjIzLDcgQEAKICAqIGNoYXJhY3RlcnMgaW4gYWxsIGZvbnRzIG9mIHRoZSBmb250c2V0LgogICovCiAgICAgaW50Ci1mb250c2V0X2hlaWdodDIoZnMpCi0gICAgWEZvbnRTZXQgZnM7Citmb250c2V0X2hlaWdodDIoWEZvbnRTZXQgZnMpCiB7CiAgICAgWEZvbnRTZXRFeHRlbnRzICpleHRlbnRzOwogCkBAIC0yMjYyLDggKzIyNDUsNyBAQAogKi8KIAogICAgIHN0YXRpYyBpbnQKLWZvbnRzZXRfYXNjZW50KGZzKQotICAgIFhGb250U2V0IGZzOworZm9udHNldF9hc2NlbnQoWEZvbnRTZXQgZnMpCiB7CiAgICAgWEZvbnRTZXRFeHRlbnRzICpleHRlbnRzOwogCkBAIC0yMjc4LDggKzIyNjAsNyBAQAogICogUmV0dXJuIElOVkFMQ09MT1IgZm9yIGVycm9yLgogICovCiAgICAgZ3VpY29sb3JfVAotZ3VpX21jaF9nZXRfY29sb3IocmVxbmFtZSkKLSAgICBjaGFyX3UgKnJlcW5hbWU7CitndWlfbWNoX2dldF9jb2xvcihjaGFyX3UgKnJlcW5hbWUpCiB7CiAgICAgaW50CQlpOwogICAgIGNoYXJfdQkqbmFtZSA9IHJlcW5hbWU7CkBAIC0yMzgyLDkgKzIzNjMsNyBAQAogICogUmV0dXJuIEZBSUwgaWYgbm90IGFibGUgdG8gZmluZCBvciBhbGxvY2F0ZSBhIGNvbG9yLgogICovCiAgICAgc3RhdGljIGludAotZmluZF9jbG9zZXN0X2NvbG9yKGNvbG9ybWFwLCBjb2xvclB0cikKLSAgICBDb2xvcm1hcAljb2xvcm1hcDsKLSAgICBYQ29sb3IJKmNvbG9yUHRyOworZmluZF9jbG9zZXN0X2NvbG9yKENvbG9ybWFwIGNvbG9ybWFwLCBYQ29sb3IgKmNvbG9yUHRyKQogewogICAgIGRvdWJsZQl0bXAsIGRpc3RhbmNlLCBjbG9zZXN0RGlzdGFuY2U7CiAgICAgaW50CQlpLCBjbG9zZXN0LCBudW1Gb3VuZCwgY21hcF9zaXplOwpAQCAtMjQ1Miw4ICsyNDMxLDcgQEAKICAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGZvcmVncm91bmQgY29sb3IuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3NldF9mZ19jb2xvcihjb2xvcikKLSAgICBndWljb2xvcl9UCWNvbG9yOworZ3VpX21jaF9zZXRfZmdfY29sb3IoZ3VpY29sb3JfVCBjb2xvcikKIHsKICAgICBpZiAoY29sb3IgIT0gcHJldl9mZ19jb2xvcikKICAgICB7CkBAIC0yNDY2LDggKzI0NDQsNyBAQAogICogU2V0IHRoZSBjdXJyZW50IHRleHQgYmFja2dyb3VuZCBjb2xvci4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfc2V0X2JnX2NvbG9yKGNvbG9yKQotICAgIGd1aWNvbG9yX1QJY29sb3I7CitndWlfbWNoX3NldF9iZ19jb2xvcihndWljb2xvcl9UIGNvbG9yKQogewogICAgIGlmIChjb2xvciAhPSBwcmV2X2JnX2NvbG9yKQogICAgIHsKQEAgLTI0ODAsOCArMjQ1Nyw3IEBACiAgKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBzcGVjaWFsIGNvbG9yLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9zZXRfc3BfY29sb3IoY29sb3IpCi0gICAgZ3VpY29sb3JfVAljb2xvcjsKK2d1aV9tY2hfc2V0X3NwX2NvbG9yKGd1aWNvbG9yX1QgY29sb3IpCiB7CiAgICAgcHJldl9zcF9jb2xvciA9IGNvbG9yOwogfQpAQCAtMjQ5MCw3ICsyNDY2LDcgQEAKICAqIGNyZWF0ZSBhIG1vdXNlIHBvaW50ZXIgdGhhdCBpcyBibGFuawogICovCiAgICAgc3RhdGljIEN1cnNvcgotZ3VpX3gxMV9jcmVhdGVfYmxhbmtfbW91c2UoKQorZ3VpX3gxMV9jcmVhdGVfYmxhbmtfbW91c2Uodm9pZCkKIHsKICAgICBQaXhtYXAgYmxhbmtfcGl4bWFwID0gWENyZWF0ZVBpeG1hcChndWkuZHB5LCBndWkud2lkLCAxLCAxLCAxKTsKICAgICBHQyBnYyA9IFhDcmVhdGVHQyhndWkuZHB5LCBibGFua19waXhtYXAsICh1bnNpZ25lZCBsb25nKTAsIChYR0NWYWx1ZXMqKTApOwpAQCAtMjUwNCwxMCArMjQ4MCw3IEBACiAgKiBEcmF3IGEgY3VybGVkIGxpbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2hhcmFjdGVyIGNlbGwuCiAgKi8KICAgICBzdGF0aWMgdm9pZAotZHJhd19jdXJsKHJvdywgY29sLCBjZWxscykKLSAgICBpbnQgcm93OwotICAgIGludCBjb2w7Ci0gICAgaW50IGNlbGxzOworZHJhd19jdXJsKGludCByb3csIGludCBjb2wsIGludCBjZWxscykKIHsKICAgICBpbnQJCQlpOwogICAgIGludAkJCW9mZnNldDsKQEAgLTI1MjQsMTIgKzI0OTcsMTIgQEAKIH0KIAogICAgIHZvaWQKLWd1aV9tY2hfZHJhd19zdHJpbmcocm93LCBjb2wsIHMsIGxlbiwgZmxhZ3MpCi0gICAgaW50CQlyb3c7Ci0gICAgaW50CQljb2w7Ci0gICAgY2hhcl91CSpzOwotICAgIGludAkJbGVuOwotICAgIGludAkJZmxhZ3M7CitndWlfbWNoX2RyYXdfc3RyaW5nKAorICAgIGludAkJcm93LAorICAgIGludAkJY29sLAorICAgIGNoYXJfdQkqcywKKyAgICBpbnQJCWxlbiwKKyAgICBpbnQJCWZsYWdzKQogewogICAgIGludAkJCWNlbGxzID0gbGVuOwogI2lmZGVmIEZFQVRfTUJZVEUKQEAgLTI2OTEsOCArMjY2NCw3IEBACiAgKiBSZXR1cm4gT0sgaWYgdGhlIGtleSB3aXRoIHRoZSB0ZXJtY2FwIG5hbWUgIm5hbWUiIGlzIHN1cHBvcnRlZC4KICAqLwogICAgIGludAotZ3VpX21jaF9oYXNrZXkobmFtZSkKLSAgICBjaGFyX3UgICpuYW1lOworZ3VpX21jaF9oYXNrZXkoY2hhcl91ICpuYW1lKQogewogICAgIGludCBpOwogCkBAIC0yNzA3LDkgKzI2NzksNyBAQAogICogUmV0dXJuIHRoZSB0ZXh0IHdpbmRvdy1pZCBhbmQgZGlzcGxheS4gIE9ubHkgcmVxdWlyZWQgZm9yIFgtYmFzZWQgR1VJJ3MKICAqLwogICAgIGludAotZ3VpX2dldF94MTFfd2luZGlzKHdpbiwgZGlzKQotICAgIFdpbmRvdyAgKndpbjsKLSAgICBEaXNwbGF5ICoqZGlzOworZ3VpX2dldF94MTFfd2luZGlzKFdpbmRvdyAqd2luLCBEaXNwbGF5ICoqZGlzKQogewogICAgICp3aW4gPSBYdFdpbmRvdyh2aW1TaGVsbCk7CiAgICAgKmRpcyA9IGd1aS5kcHk7CkBAIC0yNzE3LDE0ICsyNjg3LDEzIEBACiB9CiAKICAgICB2b2lkCi1ndWlfbWNoX2JlZXAoKQorZ3VpX21jaF9iZWVwKHZvaWQpCiB7CiAgICAgWEJlbGwoZ3VpLmRweSwgMCk7CiB9CiAKICAgICB2b2lkCi1ndWlfbWNoX2ZsYXNoKG1zZWMpCi0gICAgaW50CQltc2VjOworZ3VpX21jaF9mbGFzaChpbnQgbXNlYykKIHsKICAgICAvKiBEbyBhIHZpc3VhbCBiZWVwIGJ5IHJldmVyc2luZyB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgKi8KICAgICBYRmlsbFJlY3RhbmdsZShndWkuZHB5LCBndWkud2lkLCBndWkuaW52ZXJ0X2djLCAwLCAwLApAQCAtMjc0MSwxMSArMjcxMCwxMSBAQAogICogSW52ZXJ0IGEgcmVjdGFuZ2xlIGZyb20gcm93IHIsIGNvbHVtbiBjLCBmb3IgbnIgcm93cyBhbmQgbmMgY29sdW1ucy4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfaW52ZXJ0X3JlY3RhbmdsZShyLCBjLCBuciwgbmMpCi0gICAgaW50CSAgICByOwotICAgIGludAkgICAgYzsKLSAgICBpbnQJICAgIG5yOwotICAgIGludAkgICAgbmM7CitndWlfbWNoX2ludmVydF9yZWN0YW5nbGUoCisgICAgaW50CSAgICByLAorICAgIGludAkgICAgYywKKyAgICBpbnQJICAgIG5yLAorICAgIGludAkgICAgbmMpCiB7CiAgICAgWEZpbGxSZWN0YW5nbGUoZ3VpLmRweSwgZ3VpLndpZCwgZ3VpLmludmVydF9nYywKIAlGSUxMX1goYyksIEZJTExfWShyKSwgKG5jKSAqIGd1aS5jaGFyX3dpZHRoLCAobnIpICogZ3VpLmNoYXJfaGVpZ2h0KTsKQEAgLTI3NTUsNyArMjcyNCw3IEBACiAgKiBJY29uaWZ5IHRoZSBHVUkgd2luZG93LgogICovCiAgICAgdm9pZAotZ3VpX21jaF9pY29uaWZ5KCkKK2d1aV9tY2hfaWNvbmlmeSh2b2lkKQogewogICAgIFhJY29uaWZ5V2luZG93KGd1aS5kcHksIFh0V2luZG93KHZpbVNoZWxsKSwgRGVmYXVsdFNjcmVlbihndWkuZHB5KSk7CiB9CkBAIC0yNzY1LDcgKzI3MzQsNyBAQAogICogQnJpbmcgdGhlIFZpbSB3aW5kb3cgdG8gdGhlIGZvcmVncm91bmQuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3NldF9mb3JlZ3JvdW5kKCkKK2d1aV9tY2hfc2V0X2ZvcmVncm91bmQodm9pZCkKIHsKICAgICBYTWFwUmFpc2VkKGd1aS5kcHksIFh0V2luZG93KHZpbVNoZWxsKSk7CiB9CkBAIC0yNzc1LDggKzI3NDQsNyBAQAogICogRHJhdyBhIGN1cnNvciB3aXRob3V0IGZvY3VzLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9kcmF3X2hvbGxvd19jdXJzb3IoY29sb3IpCi0gICAgZ3VpY29sb3JfVCBjb2xvcjsKK2d1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGd1aWNvbG9yX1QgY29sb3IpCiB7CiAgICAgaW50CQl3ID0gMTsKIApAQCAtMjc5NCwxMCArMjc2Miw3IEBACiAgKiBjb2xvciAiY29sb3IiLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9kcmF3X3BhcnRfY3Vyc29yKHcsIGgsIGNvbG9yKQotICAgIGludAkJdzsKLSAgICBpbnQJCWg7Ci0gICAgZ3VpY29sb3JfVAljb2xvcjsKK2d1aV9tY2hfZHJhd19wYXJ0X2N1cnNvcihpbnQgdywgaW50IGgsIGd1aWNvbG9yX1QgY29sb3IpCiB7CiAgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOwogCkBAIC0yODE4LDcgKzI3ODMsNyBAQAogICogaW1tZWRpYXRlbHkuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3VwZGF0ZSgpCitndWlfbWNoX3VwZGF0ZSh2b2lkKQogewogICAgIFh0SW5wdXRNYXNrIG1hc2ssIGRlc2lyZWQ7CiAKQEAgLTI4NDMsOCArMjgwOCw3IEBACiAgKiBvciBGQUlMIG90aGVyd2lzZS4KICAqLwogICAgIGludAotZ3VpX21jaF93YWl0X2Zvcl9jaGFycyh3dGltZSkKLSAgICBsb25nICAgIHd0aW1lOworZ3VpX21jaF93YWl0X2Zvcl9jaGFycyhsb25nIHd0aW1lKQogewogICAgIGludAkJICAgIGZvY3VzOwogCkBAIC0yOTMwLDcgKzI4OTQsNyBAQAogCiAvKiBGbHVzaCBhbnkgb3V0cHV0IHRvIHRoZSBzY3JlZW4gKi8KICAgICB2b2lkCi1ndWlfbWNoX2ZsdXNoKCkKK2d1aV9tY2hfZmx1c2godm9pZCkKIHsKICAgICBYRmx1c2goZ3VpLmRweSk7CiB9CkBAIC0yOTQwLDExICsyOTA0LDExIEBACiAgKiAocm93MiwgY29sMikgaW5jbHVzaXZlLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9jbGVhcl9ibG9jayhyb3cxLCBjb2wxLCByb3cyLCBjb2wyKQotICAgIGludAkJcm93MTsKLSAgICBpbnQJCWNvbDE7Ci0gICAgaW50CQlyb3cyOwotICAgIGludAkJY29sMjsKK2d1aV9tY2hfY2xlYXJfYmxvY2soCisgICAgaW50CQlyb3cxLAorICAgIGludAkJY29sMSwKKyAgICBpbnQJCXJvdzIsCisgICAgaW50CQljb2wyKQogewogICAgIGludAkJeDsKIApAQCAtMjk1OCw3ICsyOTIyLDcgQEAKIH0KIAogICAgIHZvaWQKLWd1aV9tY2hfY2xlYXJfYWxsKCkKK2d1aV9tY2hfY2xlYXJfYWxsKHZvaWQpCiB7CiAgICAgWENsZWFyQXJlYShndWkuZHB5LCBndWkud2lkLCAwLCAwLCAwLCAwLCBGYWxzZSk7CiB9CkBAIC0yOTY4LDkgKzI5MzIsNyBAQAogICogdGV4dCBmdXJ0aGVyIGRvd24gd2l0aGluIHRoZSBzY3JvbGwgcmVnaW9uLgogICovCiAgICAgdm9pZAotZ3VpX21jaF9kZWxldGVfbGluZXMocm93LCBudW1fbGluZXMpCi0gICAgaW50CSAgICByb3c7Ci0gICAgaW50CSAgICBudW1fbGluZXM7CitndWlfbWNoX2RlbGV0ZV9saW5lcyhpbnQgcm93LCBpbnQgbnVtX2xpbmVzKQogewogICAgIGlmIChndWkudmlzaWJpbGl0eSA9PSBWaXNpYmlsaXR5RnVsbHlPYnNjdXJlZCkKIAlyZXR1cm47CSAgICAvKiBDYW4ndCBzZWUgdGhlIHdpbmRvdyAqLwpAQCAtMjk5NSw5ICsyOTU3LDcgQEAKICAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfaW5zZXJ0X2xpbmVzKHJvdywgbnVtX2xpbmVzKQotICAgIGludAkgICAgcm93OwotICAgIGludAkgICAgbnVtX2xpbmVzOworZ3VpX21jaF9pbnNlcnRfbGluZXMoaW50IHJvdywgaW50IG51bV9saW5lcykKIHsKICAgICBpZiAoZ3VpLnZpc2liaWxpdHkgPT0gVmlzaWJpbGl0eUZ1bGx5T2JzY3VyZWQpCiAJcmV0dXJuOwkgICAgLyogQ2FuJ3Qgc2VlIHRoZSB3aW5kb3cgKi8KQEAgLTMwMjAsNyArMjk4MCw3IEBACiAgKiBVcGRhdGUgdGhlIHJlZ2lvbiByZXZlYWxlZCBieSBzY3JvbGxpbmcgdXAvZG93bi4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1ndWlfeDExX2NoZWNrX2NvcHlfYXJlYSgpCitndWlfeDExX2NoZWNrX2NvcHlfYXJlYSh2b2lkKQogewogICAgIFhFdmVudAkJICAgIGV2ZW50OwogICAgIFhHcmFwaGljc0V4cG9zZUV2ZW50ICAgICpnZXZlbnQ7CkBAIC0zMDUyLDI5ICszMDEyLDI2IEBACiAgKi8KIAogICAgIHZvaWQKLWNsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKGNiZCkKLSAgICBWaW1DbGlwYm9hcmQJKmNiZDsKK2NsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQogewogICAgIGNsaXBfeDExX2xvc2Vfc2VsZWN0aW9uKHZpbVNoZWxsLCBjYmQpOwogfQogCiAgICAgaW50Ci1jbGlwX21jaF9vd25fc2VsZWN0aW9uKGNiZCkKLSAgICBWaW1DbGlwYm9hcmQJKmNiZDsKK2NsaXBfbWNoX293bl9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCiB7CiAgICAgcmV0dXJuIGNsaXBfeDExX293bl9zZWxlY3Rpb24odmltU2hlbGwsIGNiZCk7CiB9CiAKICAgICB2b2lkCi1jbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihjYmQpCi0gICAgVmltQ2xpcGJvYXJkCSpjYmQ7CitjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKIHsKLSAgICBjbGlwX3gxMV9yZXF1ZXN0X3NlbGVjdGlvbih2aW1TaGVsbCwgZ3VpLmRweSwgY2JkKTsKKyBjbGlwX3gxMV9yZXF1ZXN0X3NlbGVjdGlvbih2aW1TaGVsbCwgZ3VpLmRweSwgY2JkKTsKIH0KIAogICAgIHZvaWQKLWNsaXBfbWNoX3NldF9zZWxlY3Rpb24oY2JkKQotICAgIFZpbUNsaXBib2FyZAkqY2JkOworY2xpcF9tY2hfc2V0X3NlbGVjdGlvbigKKyAgICBWaW1DbGlwYm9hcmQJKmNiZCkKIHsKICAgICBjbGlwX3gxMV9zZXRfc2VsZWN0aW9uKGNiZCk7CiB9CkBAIC0zMDg4LDkgKzMwNDUsNyBAQAogICogTWFrZSBhIG1lbnUgZWl0aGVyIGdyZXkgb3Igbm90IGdyZXkuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX21lbnVfZ3JleShtZW51LCBncmV5KQotICAgIHZpbW1lbnVfVAkqbWVudTsKLSAgICBpbnQJCWdyZXk7CitndWlfbWNoX21lbnVfZ3JleSh2aW1tZW51X1QgKm1lbnUsIGludCBncmV5KQogewogICAgIGlmIChtZW51LT5pZCAhPSAoV2lkZ2V0KTApCiAgICAgewpAQCAtMzExMCw5ICszMDY1LDcgQEAKICAqIE1ha2UgbWVudSBpdGVtIGhpZGRlbiBvciBub3QgaGlkZGVuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX21lbnVfaGlkZGVuKG1lbnUsIGhpZGRlbikKLSAgICB2aW1tZW51X1QJKm1lbnU7Ci0gICAgaW50CQloaWRkZW47CitndWlfbWNoX21lbnVfaGlkZGVuKHZpbW1lbnVfVCAqbWVudSwgaW50IGhpZGRlbikKIHsKICAgICBpZiAobWVudS0+aWQgIT0gKFdpZGdldCkwKQogICAgIHsKQEAgLTMxMjcsMTYgKzMwODAsMTYgQEAKICAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNldHRpbmcgYWxsIHRoZSBtZW51cyB0byBncmV5L2hpZGRlbiBvciBub3QuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX2RyYXdfbWVudWJhcigpCitndWlfbWNoX2RyYXdfbWVudWJhcih2b2lkKQogewogICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gWCAqLwogfQogCiAgICAgdm9pZAotZ3VpX3gxMV9tZW51X2NiKHcsIGNsaWVudF9kYXRhLCBjYWxsX2RhdGEpCi0gICAgV2lkZ2V0CXcgVU5VU0VEOwotICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YTsKLSAgICBYdFBvaW50ZXIJY2FsbF9kYXRhIFVOVVNFRDsKK2d1aV94MTFfbWVudV9jYigKKyAgICBXaWRnZXQJdyBVTlVTRUQsCisgICAgWHRQb2ludGVyCWNsaWVudF9kYXRhLAorICAgIFh0UG9pbnRlcgljYWxsX2RhdGEgVU5VU0VEKQogewogICAgIGd1aV9tZW51X2NiKCh2aW1tZW51X1QgKiljbGllbnRfZGF0YSk7CiB9CkBAIC0zMTUwLDExICszMTAzLDExIEBACiAgKiBTaG91bGQgcHV0IHVwIGEgcmVxdWVzdGVyIQogICovCiAgICAgc3RhdGljIHZvaWQKLWd1aV94MTFfd21fcHJvdG9jb2xfaGFuZGxlcih3LCBjbGllbnRfZGF0YSwgZXZlbnQsIGR1bSkKLSAgICBXaWRnZXQJdyBVTlVTRUQ7Ci0gICAgWHRQb2ludGVyCWNsaWVudF9kYXRhIFVOVVNFRDsKLSAgICBYRXZlbnQJKmV2ZW50OwotICAgIEJvb2xlYW4JKmR1bSBVTlVTRUQ7CitndWlfeDExX3dtX3Byb3RvY29sX2hhbmRsZXIoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YSBVTlVTRUQsCisgICAgWEV2ZW50CSpldmVudCwKKyAgICBCb29sZWFuCSpkdW0gVU5VU0VEKQogewogICAgIC8qCiAgICAgICogT25seSBkZWFsIHdpdGggQ2xpZW50IG1lc3NhZ2VzLgpAQCAtMzE5MiwxMSArMzE0NSwxMSBAQAogICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcHJvcGVydHkgY2hhbmdlZC4gQ2hlY2sgZm9yIGluY29taW5nIGNvbW1hbmRzCiAgKi8KICAgICBzdGF0aWMgdm9pZAotZ3VpX3gxMV9zZW5kX2V2ZW50X2hhbmRsZXIodywgY2xpZW50X2RhdGEsIGV2ZW50LCBkdW0pCi0gICAgV2lkZ2V0CXcgVU5VU0VEOwotICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YSBVTlVTRUQ7Ci0gICAgWEV2ZW50CSpldmVudDsKLSAgICBCb29sZWFuCSpkdW0gVU5VU0VEOworZ3VpX3gxMV9zZW5kX2V2ZW50X2hhbmRsZXIoCisgICAgV2lkZ2V0CXcgVU5VU0VELAorICAgIFh0UG9pbnRlcgljbGllbnRfZGF0YSBVTlVTRUQsCisgICAgWEV2ZW50CSpldmVudCwKKyAgICBCb29sZWFuCSpkdW0gVU5VU0VEKQogewogICAgIFhQcm9wZXJ0eUV2ZW50ICplID0gKFhQcm9wZXJ0eUV2ZW50ICopIGV2ZW50OwogCkBAIC0zMjI4LDggKzMxODEsNyBAQAogc3RhdGljIFh0SW50ZXJ2YWxJZAlibGlua190aW1lciA9IChYdEludGVydmFsSWQpMDsKIAogICAgIHZvaWQKLWd1aV9tY2hfc2V0X2JsaW5raW5nKHdhaXR0aW1lLCBvbiwgb2ZmKQotICAgIGxvbmcgICAgd2FpdHRpbWUsIG9uLCBvZmY7CitndWlfbWNoX3NldF9ibGlua2luZyhsb25nIHdhaXR0aW1lLCBvbiwgb2ZmKQogewogICAgIGJsaW5rX3dhaXR0aW1lID0gd2FpdHRpbWU7CiAgICAgYmxpbmtfb250aW1lID0gb247CkBAIC0zMjQwLDcgKzMxOTIsNyBAQAogICogU3RvcCB0aGUgY3Vyc29yIGJsaW5raW5nLiAgU2hvdyB0aGUgY3Vyc29yIGlmIGl0IHdhc24ndCBzaG93bi4KICAqLwogICAgIHZvaWQKLWd1aV9tY2hfc3RvcF9ibGluaygpCitndWlfbWNoX3N0b3BfYmxpbmsodm9pZCkKIHsKICAgICBpZiAoYmxpbmtfdGltZXIgIT0gKFh0SW50ZXJ2YWxJZCkwKQogICAgIHsKQEAgLTMyNTcsNyArMzIwOSw3IEBACiAgKiB3YWl0aW5nIHRpbWUgYW5kIHNob3dzIHRoZSBjdXJzb3IuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX3N0YXJ0X2JsaW5rKCkKK2d1aV9tY2hfc3RhcnRfYmxpbmsodm9pZCkKIHsKICAgICBpZiAoYmxpbmtfdGltZXIgIT0gKFh0SW50ZXJ2YWxJZCkwKQogCVh0UmVtb3ZlVGltZU91dChibGlua190aW1lcik7CkBAIC0zMjcyLDkgKzMyMjQsOSBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLWd1aV94MTFfYmxpbmtfY2IodGltZWRfb3V0LCBpbnRlcnZhbF9pZCkKLSAgICBYdFBvaW50ZXIJICAgIHRpbWVkX291dCBVTlVTRUQ7Ci0gICAgWHRJbnRlcnZhbElkICAgICppbnRlcnZhbF9pZCBVTlVTRUQ7CitndWlfeDExX2JsaW5rX2NiKAorICAgIFh0UG9pbnRlcgkgICAgdGltZWRfb3V0IFVOVVNFRCwKKyAgICBYdEludGVydmFsSWQgICAgKmludGVydmFsX2lkIFVOVVNFRCkKIHsKICAgICBpZiAoYmxpbmtfc3RhdGUgPT0gQkxJTktfT04pCiAgICAgewpAQCAtMzI5Niw4ICszMjQ4LDcgQEAKICAqIFJldHVybiB0aGUgUkdCIHZhbHVlIG9mIGEgcGl4ZWwgYXMgYSBsb25nLgogICovCiAgICAgbG9uZ191Ci1ndWlfbWNoX2dldF9yZ2IocGl4ZWwpCi0gICAgZ3VpY29sb3JfVAlwaXhlbDsKK2d1aV9tY2hfZ2V0X3JnYihndWljb2xvcl9UIHBpeGVsKQogewogICAgIFhDb2xvcgl4YzsKICAgICBDb2xvcm1hcAljb2xvcm1hcDsKQEAgLTMzMTQsOSArMzI2NSw3IEBACiAgKiBBZGQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAqLwogICAgIHZvaWQKLWd1aV94MTFfY2FsbGJhY2tzKHRleHRBcmVhLCB2aW1Gb3JtKQotICAgIFdpZGdldCB0ZXh0QXJlYTsKLSAgICBXaWRnZXQgdmltRm9ybTsKK2d1aV94MTFfY2FsbGJhY2tzKFdpZGdldCB0ZXh0QXJlYSwgV2lkZ2V0IHZpbUZvcm0pCiB7CiAgICAgWHRBZGRFdmVudEhhbmRsZXIodGV4dEFyZWEsIFZpc2liaWxpdHlDaGFuZ2VNYXNrLCBGQUxTRSwKIAlndWlfeDExX3Zpc2liaWxpdHlfY2IsIChYdFBvaW50ZXIpMCk7CkBAIC0zMzc5LDkgKzMzMjgsNyBAQAogfQogCiAgICAgdm9pZAotZ3VpX21jaF9zZXRtb3VzZSh4LCB5KQotICAgIGludAkJeDsKLSAgICBpbnQJCXk7CitndWlfbWNoX3NldG1vdXNlKGludCB4LCBpbnQgeSkKIHsKICAgICBpZiAoZ3VpLndpZCkKIAlYV2FycFBvaW50ZXIoZ3VpLmRweSwgKFdpbmRvdykwLCBndWkud2lkLCAwLCAwLCAwLCAwLCB4LCB5KTsKQEAgLTMzODksNyArMzMzNiw3IEBACiAKICNpZiAoZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgJiYgZGVmaW5lZChGRUFUX01FTlUpKSB8fCBkZWZpbmVkKFBST1RPKQogICAgIFhCdXR0b25QcmVzc2VkRXZlbnQgKgotZ3VpX3gxMV9nZXRfbGFzdF9tb3VzZV9ldmVudCgpCitndWlfeDExX2dldF9sYXN0X21vdXNlX2V2ZW50KHZvaWQpCiB7CiAgICAgcmV0dXJuICZsYXN0X21vdXNlX2V2ZW50OwogfQpAQCAtMzQwMiwxMCArMzM0OSw3IEBACiAjIGRlZmluZSBTSUdOX1dJRFRIIChndWkuY2hhcl93aWR0aCAqIDIpCiAKICAgICB2b2lkCi1ndWlfbWNoX2RyYXdzaWduKHJvdywgY29sLCB0eXBlbnIpCi0gICAgaW50CQlyb3c7Ci0gICAgaW50CQljb2w7Ci0gICAgaW50CQl0eXBlbnI7CitndWlfbWNoX2RyYXdzaWduKGludCByb3csIGludCBjb2wsIGludCB0eXBlbnIpCiB7CiAgICAgWEltYWdlCSpzaWduOwogCkBAIC0zNDIxLDggKzMzNjUsNyBAQAogfQogCiAgICAgdm9pZCAqCi1ndWlfbWNoX3JlZ2lzdGVyX3NpZ24oc2lnbmZpbGUpCi0gICAgY2hhcl91CSAgICAqc2lnbmZpbGU7CitndWlfbWNoX3JlZ2lzdGVyX3NpZ24oY2hhcl91ICpzaWduZmlsZSkKIHsKICAgICBYcG1BdHRyaWJ1dGVzICAgYXR0cnM7CiAgICAgWEltYWdlCSAgICAqc2lnbiA9IE5VTEw7CkBAIC0zNDYyLDggKzM0MDUsNyBAQAogfQogCiAgICAgdm9pZAotZ3VpX21jaF9kZXN0cm95X3NpZ24oc2lnbikKLSAgICB2b2lkICpzaWduOworZ3VpX21jaF9kZXN0cm95X3NpZ24odm9pZCAqc2lnbikKIHsKICAgICBYRGVzdHJveUltYWdlKChYSW1hZ2UqKXNpZ24pOwogfQpAQCAtMzQ4MCw4ICszNDIyLDggQEAKICAqIFVzZSB0aGUgYmxhbmsgbW91c2UgcG9pbnRlciBvciBub3QuCiAgKi8KICAgICB2b2lkCi1ndWlfbWNoX21vdXNlaGlkZShoaWRlKQotICAgIGludAkJaGlkZTsJLyogVFJVRSA9IHVzZSBibGFuayBwdHIsIEZBTFNFID0gdXNlIHBhcmVudCBwdHIgKi8KK2d1aV9tY2hfbW91c2VoaWRlKAorICAgIGludAkJaGlkZSkJLyogVFJVRSA9IHVzZSBibGFuayBwdHIsIEZBTFNFID0gdXNlIHBhcmVudCBwdHIgKi8KIHsKICAgICBpZiAoZ3VpLnBvaW50ZXJfaGlkZGVuICE9IGhpZGUpCiAgICAgewpAQCAtMzUyMyw4ICszNDY1LDcgQEAKIH07CiAKICAgICB2b2lkCi1tY2hfc2V0X21vdXNlX3NoYXBlKHNoYXBlKQotICAgIGludAlzaGFwZTsKK21jaF9zZXRfbW91c2Vfc2hhcGUoaW50IHNoYXBlKQogewogICAgIGludAkgICAgaWQ7CiAKQEAgLTM1NjAsOCArMzUwMSw3IEBACiAgKiBwYXNzaW5nIGEgbm9ybWFsIG1lbnUgaXRlbSBoZXJlLiAgQ2FuJ3QgZXhwbGFpbiB0aGF0LCBidXQgYmV0dGVyIGF2b2lkIGl0LgogICovCiAgICAgdm9pZAotZ3VpX21jaF9tZW51X3NldF90aXAobWVudSkKLSAgICB2aW1tZW51X1QJKm1lbnU7CitndWlfbWNoX21lbnVfc2V0X3RpcCh2aW1tZW51X1QgKm1lbnUpCiB7CiAgICAgaWYgKG1lbnUtPmlkICE9IE5VTEwgJiYgbWVudS0+cGFyZW50ICE9IE5VTEwKIAkJCQkgICAgICAgJiYgbWVudV9pc190b29sYmFyKG1lbnUtPnBhcmVudC0+bmFtZSkpCmRpZmYgLS1naXQgYS9zcmMvaGFuZ3VsaW4uYyBiL3NyYy9oYW5ndWxpbi5jCmluZGV4IDU0MDE2MWEuLmQ3OTkzMDUgMTAwNjQ0Ci0tLSBhL3NyYy9oYW5ndWxpbi5jCisrKyBiL3NyYy9oYW5ndWxpbi5jCkBAIC05Niw5ICs5Niw3IEBACiAgKi8KIAogICAgIHN0YXRpYyBpbnQKLWNvbWZjb24zKHYsIGMpCi0gICAgaW50CXY7Ci0gICAgaW50IGM7Citjb21mY29uMyhpbnQgdiwgaW50IGMpCiB7CiAgICAgaWYgKHYgPT0gMiAmJiBjID09IDIpCiAJcmV0dXJuIDM7CkBAIC0xMTgsOSArMTE2LDcgQEAKICAqLwogCiAgICAgc3RhdGljIGludAotY29tdm93Myh2LCBjKQotICAgIGludCB2OwotICAgIGludCBjOworY29tdm93MyhpbnQgdiwgaW50IGMpCiB7CiAgICAgc3dpdGNoICh2KQogICAgIHsKQEAgLTE1OSw5ICsxNTUsNyBAQAogICovCiAKICAgICBzdGF0aWMgaW50Ci1jb21jb24zKGssIGMpCi0gICAgaW50IGs7Ci0gICAgaW50IGM7Citjb21jb24zKGludCBrLCBpbnQgYykKIHsKICAgICBzd2l0Y2ggKGspCiAgICAgewpAQCAtMjE3LDggKzIxMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAgIHN0YXRpYyBpbnQKLWtpbmRfdGFibGVfZm9yXzIoYykKLSAgICBpbnQgYzsKK2tpbmRfdGFibGVfZm9yXzIoaW50IGMpCiB7CiAgICAgc3RhdGljIGNoYXJfdSB0YWJsZVtdID0KICAgICB7CkBAIC0yNDEsOCArMjM0LDcgQEAKICAqILDhsPo6IMPKvLrAzCC+xrTPuOkgMCAoSWYgaXQgaXMgbm90IGluaXRpYWwgc291bmQsIHJldHVybiAwKS4KICAqLwogICAgIHN0YXRpYyBpbnQKLWZjb24oYykKLSAgICBpbnQgYzsKK2Zjb24oaW50IGMpCiB7CiAgICAgc3RhdGljIGNoYXJfdSB0YWJsZVtdID0KICAgICB7CkBAIC0yNjYsOCArMjU4LDcgQEAKICAqILDhsPo6IMHfvLrAzCC+xrTPuOkgMCAoSWYgaXQgaXMgbm90IG1lZGlhbCB2b3dlbCwgcmV0dXJuIDApLgogICovCiAgICAgc3RhdGljIGludAotdm93KGMpCi0gICAgaW50IGM7Cit2b3coaW50IGMpCiB7CiAgICAgc3RhdGljIGNoYXJfdSB0YWJsZVtdID0KICAgICB7CkBAIC0yODksOCArMjgwLDcgQEAKICAqILDhsPo6ILnexKfAzCC+xrTPuOkgMCAoSWYgbm90IHByb3AsIHJldHVybiAwKQogICovCiAgICAgc3RhdGljIGludAotbGNvbihjKQotICAgIGludCBjOworbGNvbihpbnQgYykKIHsKICAgICBzdGF0aWMgY2hhcl91IHRhYmxlW10gPQogICAgIHsKQEAgLTMxMiw5ICszMDIsNyBAQAogICovCiAKICAgICBzdGF0aWMgaW50Ci1jb21jb24yKGssIGMpCi0gICAgaW50IGs7Ci0gICAgaW50IGM7Citjb21jb24yKGludCBrLCBpbnQgYykKIHsKICAgICBzd2l0Y2ggKGspCiAgICAgewpAQCAtMzY5LDkgKzM1Nyw3IEBACiAgKi8KIAogICAgIHN0YXRpYyBpbnQKLWNvbXZvdzIodiwgYykKLSAgICBpbnQgdjsKLSAgICBpbnQgYzsKK2NvbXZvdzIoaW50IHYsIGludCBjKQogewogICAgIHN3aXRjaCAodikKICAgICB7CkBAIC00MDgsMjcgKzM5NCwyNiBAQAogfQogCiAgICAgaW50Ci1oYW5ndWxfaW5wdXRfc3RhdGVfZ2V0KCkKK2hhbmd1bF9pbnB1dF9zdGF0ZV9nZXQodm9pZCkKIHsKICAgICByZXR1cm4gaGFuZ3VsX2lucHV0X3N0YXRlOwogfQogCiAgICAgdm9pZAotaGFuZ3VsX2lucHV0X3N0YXRlX3NldChzdGF0ZSkKLSAgICBpbnQgc3RhdGU7CitoYW5ndWxfaW5wdXRfc3RhdGVfc2V0KGludCBzdGF0ZSkKIHsKICAgICBoYW5ndWxfaW5wdXRfc3RhdGUgPSBzdGF0ZTsKICAgICBoYW5ndWxfaW5wdXRfY2xlYXIoKTsKIH0KIAogICAgIGludAotaW1fZ2V0X3N0YXR1cygpCitpbV9nZXRfc3RhdHVzKHZvaWQpCiB7CiAgICAgcmV0dXJuIGhhbmd1bF9pbnB1dF9zdGF0ZV9nZXQoKTsKIH0KIAogICAgIHZvaWQKLWhhbmd1bF9pbnB1dF9zdGF0ZV90b2dnbGUoKQoraGFuZ3VsX2lucHV0X3N0YXRlX3RvZ2dsZSh2b2lkKQogewogICAgIGlmIChoYW5ndWxfaW5wdXRfc3RhdGVfZ2V0KCkpCiAgICAgewpAQCAtNDUyLDkgKzQzNyw3IEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1oYW5ndWxfYXV0b21hdGEyKGJ1ZiwgYykKLSAgICBjaGFyX3UgICpidWY7Ci0gICAgaW50X3UgICAqYzsKK2hhbmd1bF9hdXRvbWF0YTIoY2hhcl91ICpidWYsIGludF91ICpjKQogewogICAgIGludCB0LHQyOwogCkBAIC02MTQsOSArNTk3LDcgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLWhhbmd1bF9hdXRvbWF0YTMoYnVmLCBjKQotICAgIGNoYXJfdSAgKmJ1ZjsKLSAgICBpbnRfdSAgICpjOworaGFuZ3VsX2F1dG9tYXRhMyhjaGFyX3UgKmJ1ZiwgaW50X3UgKmMpCiB7CiAgICAgaW50IHQsIHQyOwogCkBAIC03MjUsNyArNzA2LDcgQEAKIH0KIAogICAgIHZvaWQKLWhhbmd1bF9rZXlib2FyZF9zZXQoKQoraGFuZ3VsX2tleWJvYXJkX3NldCh2b2lkKQogewogICAgIGludAkgICAga2V5Ym9hcmQ7CiAgICAgY2hhciAgICAqczsKQEAgLTc0Niw5ICs3MjcsNyBAQAogfQogCiAgICAgaW50Ci1oYW5ndWxfaW5wdXRfcHJvY2VzcyhzLCBsZW4pCi0gICAgY2hhcl91ICAqczsKLSAgICBpbnQJICAgIGxlbjsKK2hhbmd1bF9pbnB1dF9wcm9jZXNzKGNoYXJfdSAqcywgaW50IGxlbikKIHsKICAgICBpbnQgbjsKICAgICB1bnNpZ25lZCBpbnQgYzsKQEAgLTgzMSw3ICs4MTAsNyBAQAogfQogCiAgICAgdm9pZAotaGFuZ3VsX2lucHV0X2NsZWFyKCkKK2hhbmd1bF9pbnB1dF9jbGVhcih2b2lkKQogewogICAgIHNwID0gMDsKICAgICBmID0gRl9OVUxMOwpAQCAtMTUwMywxMSArMTQ4MiwxMSBAQAogfTsKIAogICAgIHN0YXRpYyB2b2lkCi1jb252ZXJ0X2tzX3RvXzMoc3JjLCBmcCwgbXAsIGxwKQotICAgIGNvbnN0IGNoYXJfdSAgICAqc3JjOwotICAgIGludAkJICAgICpmcDsKLSAgICBpbnQJCSAgICAqbXA7Ci0gICAgaW50CQkgICAgKmxwOworY29udmVydF9rc190b18zKAorICAgIGNvbnN0IGNoYXJfdSAgICAqc3JjLAorICAgIGludAkJICAgICpmcCwKKyAgICBpbnQJCSAgICAqbXAsCisgICAgaW50CQkgICAgKmxwKQogewogICAgIGludCBoID0gKnNyYzsKICAgICBpbnQgbG93ID0gKihzcmMgKyAxKTsKQEAgLTE1MzksMTEgKzE1MTgsMTEgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLWNvbnZlcnRfM190b19rcyhmdiwgbXYsIGx2LCBkZXMpCi0gICAgaW50CSAgICBmdjsKLSAgICBpbnQJICAgIG12OwotICAgIGludAkgICAgbHY7Ci0gICAgY2hhcl91ICAqZGVzOworY29udmVydF8zX3RvX2tzKAorICAgIGludAkgICAgZnYsCisgICAgaW50CSAgICBtdiwKKyAgICBpbnQJICAgIGx2LAorICAgIGNoYXJfdSAgKmRlcykKIHsKICAgICBjaGFyX3Uga2V5WzNdOwogICAgIHJlZ2lzdGVyIGludCBoaSwgbG8sIG1pID0gMCwgcmVzdWx0LCBmb3VuZDsKQEAgLTE2MjEsOSArMTYwMCw3IEBACiB9CiAKICAgICBjaGFyX3UgKgotaGFuZ3VsX3N0cmluZ19jb252ZXJ0KGJ1ZiwgcF9sZW4pCi0gICAgY2hhcl91ICAqYnVmOwotICAgIGludAkgICAgKnBfbGVuOworaGFuZ3VsX3N0cmluZ19jb252ZXJ0KGNoYXJfdSAqYnVmLCBpbnQgKnBfbGVuKQogewogICAgIGNoYXJfdSAqdG1wYnVmID0gTlVMTDsKICAgICB2aW1jb252X1QgdmM7CkBAIC0xNjQyLDggKzE2MTksNyBAQAogfQogCiAgICAgY2hhcl91ICoKLWhhbmd1bF9jb21wb3NpbmdfYnVmZmVyX2dldChwX2xlbikKLSAgICBpbnQJICAgICpwX2xlbjsKK2hhbmd1bF9jb21wb3NpbmdfYnVmZmVyX2dldChpbnQgKnBfbGVuKQogewogICAgIGNoYXJfdSAqdG1wYnVmID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvc3JjL2hhcmRjb3B5LmMgYi9zcmMvaGFyZGNvcHkuYwppbmRleCAyMzViNDZiLi5iNmZhOTViIDEwMDY0NAotLS0gYS9zcmMvaGFyZGNvcHkuYworKysgYi9zcmMvaGFyZGNvcHkuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgKiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTDsKICAqLwogICAgIGNoYXJfdSAqCi1wYXJzZV9wcmludG9wdGlvbnMoKQorcGFyc2VfcHJpbnRvcHRpb25zKHZvaWQpCiB7CiAgICAgcmV0dXJuIHBhcnNlX2xpc3Rfb3B0aW9ucyhwX3BvcHQsIHByaW50ZXJfb3B0cywgT1BUX1BSSU5UX05VTV9PUFRJT05TKTsKIH0KQEAgLTE2OCw3ICsxNjgsNyBAQAogICogUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEw7CiAgKi8KICAgICBjaGFyX3UgKgotcGFyc2VfcHJpbnRtYmZvbnQoKQorcGFyc2VfcHJpbnRtYmZvbnQodm9pZCkKIHsKICAgICByZXR1cm4gcGFyc2VfbGlzdF9vcHRpb25zKHBfcG1mbiwgbWJmb250X29wdHMsIE9QVF9NQkZPTlRfTlVNX09QVElPTlMpOwogfQpAQCAtMTg0LDEwICsxODQsMTAgQEAKICAqIE9ubHkgdXNlZCBmb3IgdGhlIHByaW50ZXIgYXQgdGhlIG1vbWVudC4uLgogICovCiAgICAgc3RhdGljIGNoYXJfdSAqCi1wYXJzZV9saXN0X29wdGlvbnMob3B0aW9uX3N0ciwgdGFibGUsIHRhYmxlX3NpemUpCi0gICAgY2hhcl91CQkqb3B0aW9uX3N0cjsKLSAgICBvcHRpb25fdGFibGVfVAkqdGFibGU7Ci0gICAgaW50CQkJdGFibGVfc2l6ZTsKK3BhcnNlX2xpc3Rfb3B0aW9ucygKKyAgICBjaGFyX3UJCSpvcHRpb25fc3RyLAorICAgIG9wdGlvbl90YWJsZV9UCSp0YWJsZSwKKyAgICBpbnQJCQl0YWJsZV9zaXplKQogewogICAgIGNoYXJfdQkqc3RyaW5ncDsKICAgICBjaGFyX3UJKmNvbG9ucDsKQEAgLTI1MCw4ICsyNTAsNyBAQAogICogdXAgd2VsbCBvbiB3aGl0ZSBwYXBlciwgc28gcmVkdWNlIHRoZWlyIGJyaWdodG5lc3MuCiAgKi8KICAgICBzdGF0aWMgbG9uZ191Ci1kYXJrZW5fcmdiKHJnYikKLSAgICBsb25nX3UJcmdiOworZGFya2VuX3JnYihsb25nX3UgcmdiKQogewogICAgIHJldHVybgkoKHJnYiA+PiAxNykgPDwgMTYpCiAJICAgICsJKCgocmdiICYgMHhmZjAwKSA+PiA5KSA8PCA4KQpAQCAtMjU5LDggKzI1OCw3IEBACiB9CiAKICAgICBzdGF0aWMgbG9uZ191Ci1wcnRfZ2V0X3Rlcm1fY29sb3IoY29sb3JpbmRleCkKLSAgICBpbnQJICAgIGNvbG9yaW5kZXg7CitwcnRfZ2V0X3Rlcm1fY29sb3IoaW50IGNvbG9yaW5kZXgpCiB7CiAgICAgLyogVE9ETzogU2hvdWxkIGNoZWNrIGZvciB4dGVybSB3aXRoIDg4IG9yIDI1NiBjb2xvcnMuICovCiAgICAgaWYgKHRfY29sb3JzID4gOCkKQEAgLTI2OSwxMCArMjY3LDEwIEBACiB9CiAKICAgICBzdGF0aWMgdm9pZAotcHJ0X2dldF9hdHRyKGhsX2lkLCBwYXR0ciwgbW9kZWMpCi0gICAgaW50CQkJaGxfaWQ7Ci0gICAgcHJ0X3RleHRfYXR0cl9UCSpwYXR0cjsKLSAgICBpbnQJCQltb2RlYzsKK3BydF9nZXRfYXR0cigKKyAgICBpbnQJCQlobF9pZCwKKyAgICBwcnRfdGV4dF9hdHRyX1QJKnBhdHRyLAorICAgIGludAkJCW1vZGVjKQogewogICAgIGludCAgICAgY29sb3JpbmRleDsKICAgICBsb25nX3UgIGZnX2NvbG9yOwpAQCAtMzIxLDggKzMxOSw3IEBACiAjZW5kaWYgLyogRkVBVF9TWU5fSEwgKi8KIAogICAgIHN0YXRpYyB2b2lkCi1wcnRfc2V0X2ZnKGZnKQotICAgIGxvbmdfdSBmZzsKK3BydF9zZXRfZmcobG9uZ191IGZnKQogewogICAgIGlmIChmZyAhPSBjdXJyX2ZnKQogICAgIHsKQEAgLTMzMiw4ICszMjksNyBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9zZXRfYmcoYmcpCi0gICAgbG9uZ191IGJnOworcHJ0X3NldF9iZyhsb25nX3UgYmcpCiB7CiAgICAgaWYgKGJnICE9IGN1cnJfYmcpCiAgICAgewpAQCAtMzQzLDEwICszMzksNyBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9zZXRfZm9udChib2xkLCBpdGFsaWMsIHVuZGVybGluZSkKLSAgICBpbnQJCWJvbGQ7Ci0gICAgaW50CQlpdGFsaWM7Ci0gICAgaW50CQl1bmRlcmxpbmU7CitwcnRfc2V0X2ZvbnQoaW50IGJvbGQsIGludCBpdGFsaWMsIGludCB1bmRlcmxpbmUpCiB7CiAgICAgaWYgKGN1cnJfYm9sZCAhPSBib2xkCiAJICAgIHx8IGN1cnJfaXRhbGljICE9IGl0YWxpYwpAQCAtMzYzLDEwICszNTYsMTAgQEAKICAqIFByaW50IHRoZSBsaW5lIG51bWJlciBpbiB0aGUgbGVmdCBtYXJnaW4uCiAgKi8KICAgICBzdGF0aWMgdm9pZAotcHJ0X2xpbmVfbnVtYmVyKHBzZXR0aW5ncywgcGFnZV9saW5lLCBsbnVtKQotICAgIHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3M7Ci0gICAgaW50CQlwYWdlX2xpbmU7Ci0gICAgbGluZW5yX1QJbG51bTsKK3BydF9saW5lX251bWJlcigKKyAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzLAorICAgIGludAkJcGFnZV9saW5lLAorICAgIGxpbmVucl9UCWxudW0pCiB7CiAgICAgaW50CQlpOwogICAgIGNoYXJfdQl0YnVmWzIwXTsKQEAgLTQwMCw3ICszOTMsNyBAQAogICogR2V0IHRoZSBjdXJyZW50bHkgZWZmZWN0aXZlIGhlYWRlciBoZWlnaHQuCiAgKi8KICAgICBpbnQKLXBydF9oZWFkZXJfaGVpZ2h0KCkKK3BydF9oZWFkZXJfaGVpZ2h0KHZvaWQpCiB7CiAgICAgaWYgKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfSEVBREVSSEVJR0hUXS5wcmVzZW50KQogCXJldHVybiBwcmludGVyX29wdHNbT1BUX1BSSU5UX0hFQURFUkhFSUdIVF0ubnVtYmVyOwpAQCAtNDExLDcgKzQwNCw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB1c2luZyBhIGxpbmUgbnVtYmVyIGZvciBwcmludGluZy4KICAqLwogICAgIGludAotcHJ0X3VzZV9udW1iZXIoKQorcHJ0X3VzZV9udW1iZXIodm9pZCkKIHsKICAgICByZXR1cm4gKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfTlVNQkVSXS5wcmVzZW50CiAJICAgICYmIFRPTE9XRVJfQVNDKHByaW50ZXJfb3B0c1tPUFRfUFJJTlRfTlVNQkVSXS5zdHJpbmdbMF0pID09ICd5Jyk7CkBAIC00MjIsOCArNDE1LDcgQEAKICAqIFJldHVybnMgUFJUX1VOSVRfTk9ORSBpZiBub3QgcmVjb2duaXplZC4KICAqLwogICAgIGludAotcHJ0X2dldF91bml0KGlkeCkKLSAgICBpbnQJCWlkeDsKK3BydF9nZXRfdW5pdChpbnQgaWR4KQogewogICAgIGludAkJdSA9IFBSVF9VTklUX05PTkU7CiAgICAgaW50CQlpOwpAQCAtNDQzLDEwICs0MzUsMTAgQEAKICAqIFByaW50IHRoZSBwYWdlIGhlYWRlci4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1wcnRfaGVhZGVyKHBzZXR0aW5ncywgcGFnZW51bSwgbG51bSkKLSAgICBwcnRfc2V0dGluZ3NfVCAgKnBzZXR0aW5nczsKLSAgICBpbnQJCXBhZ2VudW07Ci0gICAgbGluZW5yX1QJbG51bSBVTlVTRUQ7CitwcnRfaGVhZGVyKAorICAgIHBydF9zZXR0aW5nc19UICAqcHNldHRpbmdzLAorICAgIGludAkJcGFnZW51bSwKKyAgICBsaW5lbnJfVAlsbnVtIFVOVVNFRCkKIHsKICAgICBpbnQJCXdpZHRoID0gcHNldHRpbmdzLT5jaGFyc19wZXJfbGluZTsKICAgICBpbnQJCXBhZ2VfbGluZTsKQEAgLTU0OSw4ICs1NDEsNyBAQAogICogRGlzcGxheSBhIHByaW50IHN0YXR1cyBtZXNzYWdlLgogICovCiAgICAgc3RhdGljIHZvaWQKLXBydF9tZXNzYWdlKHMpCi0gICAgY2hhcl91CSpzOworcHJ0X21lc3NhZ2UoY2hhcl91ICpzKQogewogICAgIHNjcmVlbl9maWxsKChpbnQpUm93cyAtIDEsIChpbnQpUm93cywgMCwgKGludClDb2x1bW5zLCAnICcsICcgJywgMCk7CiAgICAgc2NyZWVuX3B1dHMocywgKGludClSb3dzIC0gMSwgMCwgaGxfYXR0cihITEZfUikpOwpAQCAtNTU4LDggKzU0OSw3IEBACiB9CiAKICAgICB2b2lkCi1leF9oYXJkY29weShlYXApCi0gICAgZXhhcmdfVAkqZWFwOworZXhfaGFyZGNvcHkoZXhhcmdfVCAqZWFwKQogewogICAgIGxpbmVucl9UCQlsbnVtOwogICAgIGludAkJCWNvbGxhdGVkX2NvcGllcywgdW5jb2xsYXRlZF9jb3BpZXM7CkBAIC04MjUsMTAgKzgxNSwxMCBAQAogICogUmV0dXJuIHRoZSBuZXh0IGNvbHVtbiB0byBwcmludCwgb3IgemVybyBpZiB0aGUgbGluZSBpcyBmaW5pc2hlZC4KICAqLwogICAgIHN0YXRpYyBjb2xucl9UCi1oYXJkY29weV9saW5lKHBzZXR0aW5ncywgcGFnZV9saW5lLCBwcG9zKQotICAgIHBydF9zZXR0aW5nc19UCSpwc2V0dGluZ3M7Ci0gICAgaW50CQkJcGFnZV9saW5lOwotICAgIHBydF9wb3NfVAkJKnBwb3M7CitoYXJkY29weV9saW5lKAorICAgIHBydF9zZXR0aW5nc19UCSpwc2V0dGluZ3MsCisgICAgaW50CQkJcGFnZV9saW5lLAorICAgIHBydF9wb3NfVAkJKnBwb3MpCiB7CiAgICAgY29sbnJfVAljb2w7CiAgICAgY2hhcl91CSpsaW5lOwpAQCAtMTQ1OCw5ICsxNDQ4LDcgQEAKICMgZW5kaWYKIAogICAgIHN0YXRpYyB2b2lkCi1wcnRfd3JpdGVfZmlsZV9yYXdfbGVuKGJ1ZmZlciwgYnl0ZXMpCi0gICAgY2hhcl91CSpidWZmZXI7Ci0gICAgaW50CQlieXRlczsKK3BydF93cml0ZV9maWxlX3Jhd19sZW4oY2hhcl91ICpidWZmZXIsIGludCBieXRlcykKIHsKICAgICBpZiAoIXBydF9maWxlX2Vycm9yCiAJICAgICYmIGZ3cml0ZShidWZmZXIsIHNpemVvZihjaGFyX3UpLCBieXRlcywgcHJ0X3BzX2ZkKQpAQCAtMTQ3MiwxNiArMTQ2MCwxMyBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF93cml0ZV9maWxlKGJ1ZmZlcikKLSAgICBjaGFyX3UJKmJ1ZmZlcjsKK3BydF93cml0ZV9maWxlKGNoYXJfdSAqYnVmZmVyKQogewogICAgIHBydF93cml0ZV9maWxlX2xlbihidWZmZXIsIChpbnQpU1RSTEVOKGJ1ZmZlcikpOwogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF93cml0ZV9maWxlX2xlbihidWZmZXIsIGJ5dGVzKQotICAgIGNoYXJfdQkqYnVmZmVyOwotICAgIGludAkJYnl0ZXM7CitwcnRfd3JpdGVfZmlsZV9sZW4oY2hhcl91ICpidWZmZXIsIGludCBieXRlcykKIHsKICNpZmRlZiBFQkNESUMKICAgICBlYmNkaWMyYXNjaWkoYnVmZmVyLCBieXRlcyk7CkBAIC0xNDkzLDggKzE0NzgsNyBAQAogICogV3JpdGUgYSBzdHJpbmcuCiAgKi8KICAgICBzdGF0aWMgdm9pZAotcHJ0X3dyaXRlX3N0cmluZyhzKQotICAgIGNoYXIJKnM7CitwcnRfd3JpdGVfc3RyaW5nKGNoYXIgKnMpCiB7CiAgICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwgIiVzIiwgcyk7CiAgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKQEAgLTE1MDQsOCArMTQ4OCw3IEBACiAgKiBXcml0ZSBhbiBpbnQgYW5kIGEgc3BhY2UuCiAgKi8KICAgICBzdGF0aWMgdm9pZAotcHJ0X3dyaXRlX2ludChpKQotICAgIGludAkJaTsKK3BydF93cml0ZV9pbnQoaW50IGkpCiB7CiAgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVkICIsIGkpOwogICAgIHBydF93cml0ZV9maWxlKHBydF9saW5lX2J1ZmZlcik7CkBAIC0xNTE1LDggKzE0OTgsNyBAQAogICogV3JpdGUgYSBib29sZWFuIGFuZCBhIHNwYWNlLgogICovCiAgICAgc3RhdGljIHZvaWQKLXBydF93cml0ZV9ib29sZWFuKGIpCi0gICAgaW50CQliOworcHJ0X3dyaXRlX2Jvb2xlYW4oaW50IGIpCiB7CiAgICAgc3ByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgIiVzICIsIChiID8gIlQiIDogIkYiKSk7CiAgICAgcHJ0X3dyaXRlX2ZpbGUocHJ0X2xpbmVfYnVmZmVyKTsKQEAgLTE1MjYsMTEgKzE1MDgsMTEgQEAKICAqIFdyaXRlIFBvc3RTY3JpcHQgdG8gcmUtZW5jb2RlIGFuZCBkZWZpbmUgdGhlIGZvbnQuCiAgKi8KICAgICBzdGF0aWMgdm9pZAotcHJ0X2RlZl9mb250KG5ld19uYW1lLCBlbmNvZGluZywgaGVpZ2h0LCBmb250KQotICAgIGNoYXIJKm5ld19uYW1lOwotICAgIGNoYXIJKmVuY29kaW5nOwotICAgIGludAkJaGVpZ2h0OwotICAgIGNoYXIJKmZvbnQ7CitwcnRfZGVmX2ZvbnQoCisgICAgY2hhcgkqbmV3X25hbWUsCisgICAgY2hhcgkqZW5jb2RpbmcsCisgICAgaW50CQloZWlnaHQsCisgICAgY2hhcgkqZm9udCkKIHsKICAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAogCQkJICAiL18lcyAvVklNLSVzIC8lcyByZWZcbiIsIG5ld19uYW1lLCBlbmNvZGluZywgZm9udCk7CkBAIC0xNTUxLDEwICsxNTMzLDcgQEAKICAqIFdyaXRlIGEgbGluZSB0byBkZWZpbmUgdGhlIENJRCBmb250LgogICovCiAgICAgc3RhdGljIHZvaWQKLXBydF9kZWZfY2lkZm9udChuZXdfbmFtZSwgaGVpZ2h0LCBjaWRmb250KQotICAgIGNoYXIJKm5ld19uYW1lOwotICAgIGludAkJaGVpZ2h0OwotICAgIGNoYXIJKmNpZGZvbnQ7CitwcnRfZGVmX2NpZGZvbnQoY2hhciAqbmV3X25hbWUsIGludCBoZWlnaHQsIGNoYXIgKmNpZGZvbnQpCiB7CiAgICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKIAkgICAgICAiL18lcyAvJXNbLyVzXSB2aW1fY29tcG9zZWZvbnRcbiIsIG5ld19uYW1lLCBwcnRfY21hcCwgY2lkZm9udCk7CkBAIC0xNTY4LDkgKzE1NDcsNyBAQAogICogV3JpdGUgYSBsaW5lIHRvIGRlZmluZSBhIGR1cGxpY2F0ZSBvZiBhIENJRCBmb250CiAgKi8KICAgICBzdGF0aWMgdm9pZAotcHJ0X2R1cF9jaWRmb250KG9yaWdpbmFsX25hbWUsIG5ld19uYW1lKQotICAgIGNoYXIJKm9yaWdpbmFsX25hbWU7Ci0gICAgY2hhcgkqbmV3X25hbWU7CitwcnRfZHVwX2NpZGZvbnQoY2hhciAqb3JpZ2luYWxfbmFtZSwgY2hhciAqbmV3X25hbWUpCiB7CiAgICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKIAkJCQkgICAgICAgIi8lcyAlcyBkXG4iLCBuZXdfbmFtZSwgb3JpZ2luYWxfbmFtZSk7CkBAIC0xNTg0LDExICsxNTYxLDExIEBACiAgKiBpcyBhbHNvIHJvdW5kZWQgYmFzZWQgb24gdGhlIHByZWNpc2lvbiArIDEndGggZnJhY3Rpb25hbCBkaWdpdC4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1wcnRfcmVhbF9iaXRzKHJlYWwsIHByZWNpc2lvbiwgcGludGVnZXIsIHBmcmFjdGlvbikKLSAgICBkb3VibGUgICAgICByZWFsOwotICAgIGludAkJcHJlY2lzaW9uOwotICAgIGludAkJKnBpbnRlZ2VyOwotICAgIGludAkJKnBmcmFjdGlvbjsKK3BydF9yZWFsX2JpdHMoCisgICAgZG91YmxlICAgICAgcmVhbCwKKyAgICBpbnQJCXByZWNpc2lvbiwKKyAgICBpbnQJCSpwaW50ZWdlciwKKyAgICBpbnQJCSpwZnJhY3Rpb24pCiB7CiAgICAgaW50ICAgICBpOwogICAgIGludCAgICAgaW50ZWdlcjsKQEAgLTE2MTEsOSArMTU4OCw3IEBACiAgKiB3aGF0IGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyIHRvIHVzZSwgYnV0IFBTIGFsd2F5cyByZXF1aXJlcyBhICcuJy4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1wcnRfd3JpdGVfcmVhbCh2YWwsIHByZWMpCi0gICAgZG91YmxlCXZhbDsKLSAgICBpbnQJCXByZWM7CitwcnRfd3JpdGVfcmVhbChkb3VibGUgdmFsLCBpbnQgcHJlYykKIHsKICAgICBpbnQgICAgIGludGVnZXI7CiAgICAgaW50ICAgICBmcmFjdGlvbjsKQEAgLTE2NDMsMTAgKzE2MTgsNyBAQAogICogV3JpdGUgYSBsaW5lIHRvIGRlZmluZSBhIG51bWVyaWMgdmFyaWFibGUuCiAgKi8KICAgICBzdGF0aWMgdm9pZAotcHJ0X2RlZl92YXIobmFtZSwgdmFsdWUsIHByZWMpCi0gICAgY2hhcgkqbmFtZTsKLSAgICBkb3VibGUJdmFsdWU7Ci0gICAgaW50CQlwcmVjOworcHJ0X2RlZl92YXIoY2hhciAqbmFtZSwgZG91YmxlIHZhbHVlLCBpbnQgcHJlYykKIHsKICAgICB2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLAogCQkJCQkJCQkiLyVzICIsIG5hbWUpOwpAQCAtMTY2MCw3ICsxNjMyLDcgQEAKICNkZWZpbmUgUFJUX1BTX0ZPTlRfVE9fVVNFUihzY2FsZSwgc2l6ZSkgICAgKChzaXplKSAqICgoc2NhbGUpLzEwMDAuMCkpCiAKICAgICBzdGF0aWMgdm9pZAotcHJ0X2ZsdXNoX2J1ZmZlcigpCitwcnRfZmx1c2hfYnVmZmVyKHZvaWQpCiB7CiAgICAgaWYgKHBydF9wc19idWZmZXIuZ2FfbGVuID4gMCkKICAgICB7CkBAIC0xNzQyLDkgKzE3MTQsNyBAQAogCiAKICAgICBzdGF0aWMgdm9pZAotcHJ0X3Jlc291cmNlX25hbWUoZmlsZW5hbWUsIGNvb2tpZSkKLSAgICBjaGFyX3UgICpmaWxlbmFtZTsKLSAgICB2b2lkICAgICpjb29raWU7CitwcnRfcmVzb3VyY2VfbmFtZShjaGFyX3UgKmZpbGVuYW1lLCB2b2lkICpjb29raWUpCiB7CiAgICAgY2hhcl91ICpyZXNvdXJjZV9maWxlbmFtZSA9IGNvb2tpZTsKIApAQCAtMTc1NSw5ICsxNzI1LDcgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLXBydF9maW5kX3Jlc291cmNlKG5hbWUsIHJlc291cmNlKQotICAgIGNoYXIJKm5hbWU7Ci0gICAgc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZTsKK3BydF9maW5kX3Jlc291cmNlKGNoYXIgKm5hbWUsIHN0cnVjdCBwcnRfcHNfcmVzb3VyY2VfUyAqcmVzb3VyY2UpCiB7CiAgICAgY2hhcl91CSpidWZmZXI7CiAgICAgaW50CQlyZXR2YWw7CkBAIC0xNzk4LDcgKzE3NjYsNyBAQAogc3RhdGljIHN0cnVjdCBwcnRfcmVzZmlsZV9idWZmZXJfUyBwcnRfcmVzZmlsZTsKIAogICAgIHN0YXRpYyBpbnQKLXBydF9yZXNmaWxlX25leHRfbGluZSgpCitwcnRfcmVzZmlsZV9uZXh0X2xpbmUodm9pZCkKIHsKICAgICBpbnQgICAgIGlkeDsKIApAQCAtMTgyNCwxMCArMTc5Miw3IEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1wcnRfcmVzZmlsZV9zdHJuY21wKG9mZnNldCwgc3RyaW5nLCBsZW4pCi0gICAgaW50ICAgICBvZmZzZXQ7Ci0gICAgY2hhciAgICAqc3RyaW5nOwotICAgIGludCAgICAgbGVuOworcHJ0X3Jlc2ZpbGVfc3RybmNtcChpbnQgb2Zmc2V0LCBjaGFyICpzdHJpbmcsIGludCBsZW4pCiB7CiAgICAgLyogRm9yY2Ugbm90IGVxdWFsIGlmIHN0cmluZyBpcyBsb25nZXIgdGhhbiByZW1haW5kZXIgb2YgbGluZSAqLwogICAgIGlmIChsZW4gPiAocHJ0X3Jlc2ZpbGUubGluZV9lbmQgLSAocHJ0X3Jlc2ZpbGUubGluZV9zdGFydCArIG9mZnNldCkpKQpAQCAtMTgzOCw4ICsxODAzLDcgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLXBydF9yZXNmaWxlX3NraXBfbm9ud3Mob2Zmc2V0KQotICAgIGludCAgICAgb2Zmc2V0OworcHJ0X3Jlc2ZpbGVfc2tpcF9ub253cyhpbnQgb2Zmc2V0KQogewogICAgIGludCAgICAgaWR4OwogCkBAIC0xODU0LDggKzE4MTgsNyBAQAogfQogCiAgICAgc3RhdGljIGludAotcHJ0X3Jlc2ZpbGVfc2tpcF93cyhvZmZzZXQpCi0gICAgaW50ICAgICBvZmZzZXQ7CitwcnRfcmVzZmlsZV9za2lwX3dzKGludCBvZmZzZXQpCiB7CiAgICAgaW50ICAgICBpZHg7CiAKQEAgLTE4NzIsOCArMTgzNSw3IEBACiAvKiBwcnRfbmV4dF9kc2MoKSAtIHJldHVybnMgZGV0YWlsIG9uIG5leHQgRFNDIGNvbW1lbnQgbGluZSBmb3VuZC4gIFJldHVybnMgdHJ1ZQogICogaWYgYSBEU0MgY29tbWVudCBpcyBmb3VuZCwgZWxzZSBmYWxzZSAqLwogICAgIHN0YXRpYyBpbnQKLXBydF9uZXh0X2RzYyhwX2RzY19saW5lKQotICAgIHN0cnVjdCBwcnRfZHNjX2xpbmVfUyAqcF9kc2NfbGluZTsKK3BydF9uZXh0X2RzYyhzdHJ1Y3QgcHJ0X2RzY19saW5lX1MgKnBfZHNjX2xpbmUpCiB7CiAgICAgaW50ICAgICBjb21tZW50OwogICAgIGludCAgICAgb2Zmc2V0OwpAQCAtMTkyMiw4ICsxODg0LDcgQEAKICAqIFBTIHJlc291cmNlIGZpbGUgc28gdGhlIGZpbGUgZGV0YWlscyBjYW4gYmUgYWRkZWQgdG8gdGhlIERTQyBoZWFkZXIgY29tbWVudHMuCiAgKi8KICAgICBzdGF0aWMgaW50Ci1wcnRfb3Blbl9yZXNvdXJjZShyZXNvdXJjZSkKLSAgICBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlOworcHJ0X29wZW5fcmVzb3VyY2Uoc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZSkKIHsKICAgICBpbnQJCW9mZnNldDsKICAgICBpbnQJCXNlZW5fYWxsOwpAQCAtMjA0OCw5ICsyMDA5LDcgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLXBydF9jaGVja19yZXNvdXJjZShyZXNvdXJjZSwgdmVyc2lvbikKLSAgICBzdHJ1Y3QgcHJ0X3BzX3Jlc291cmNlX1MgKnJlc291cmNlOwotICAgIGNoYXJfdSAgKnZlcnNpb247CitwcnRfY2hlY2tfcmVzb3VyY2Uoc3RydWN0IHBydF9wc19yZXNvdXJjZV9TICpyZXNvdXJjZSwgY2hhcl91ICp2ZXJzaW9uKQogewogICAgIC8qIFZlcnNpb24gbnVtYmVyIG0ubiBzaG91bGQgbWF0Y2gsIHRoZSByZXZpc2lvbiBudW1iZXIgZG9lcyBub3QgbWF0dGVyICovCiAgICAgaWYgKFNUUk5DTVAocmVzb3VyY2UtPnZlcnNpb24sIHZlcnNpb24sIFNUUkxFTih2ZXJzaW9uKSkpCkBAIC0yMDY1LDE0ICsyMDI0LDEzIEBACiB9CiAKICAgICBzdGF0aWMgdm9pZAotcHJ0X2RzY19zdGFydCgpCitwcnRfZHNjX3N0YXJ0KHZvaWQpCiB7CiAgICAgcHJ0X3dyaXRlX3N0cmluZygiJSFQUy1BZG9iZS0zLjBcbiIpOwogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9kc2Nfbm9hcmcoY29tbWVudCkKLSAgICBjaGFyCSpjb21tZW50OworcHJ0X2RzY19ub2FyZyhjaGFyICpjb21tZW50KQogewogICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgc2l6ZW9mKHBydF9saW5lX2J1ZmZlciksCiAJCQkJCQkJICIlJSUlJXNcbiIsIGNvbW1lbnQpOwpAQCAtMjA4MCw5ICsyMDM4LDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1wcnRfZHNjX3RleHRsaW5lKGNvbW1lbnQsIHRleHQpCi0gICAgY2hhcgkqY29tbWVudDsKLSAgICBjaGFyCSp0ZXh0OworcHJ0X2RzY190ZXh0bGluZShjaGFyICpjb21tZW50LCBjaGFyICp0ZXh0KQogewogICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgc2l6ZW9mKHBydF9saW5lX2J1ZmZlciksCiAJCQkJCSAgICAgICAiJSUlJSVzOiAlc1xuIiwgY29tbWVudCwgdGV4dCk7CkBAIC0yMDkwLDkgKzIwNDYsNyBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9kc2NfdGV4dChjb21tZW50LCB0ZXh0KQotICAgIGNoYXIJKmNvbW1lbnQ7Ci0gICAgY2hhcgkqdGV4dDsKK3BydF9kc2NfdGV4dChjaGFyICpjb21tZW50LCBjaGFyICp0ZXh0KQogewogICAgIC8qIFRPRE8gLSBzaG91bGQgc2NhbiAndGV4dCcgZm9yIGFueSBjaGFycyBuZWVkaW5nIGVzY2FwaW5nISAqLwogICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXBydF9saW5lX2J1ZmZlciwgc2l6ZW9mKHBydF9saW5lX2J1ZmZlciksCkBAIC0yMTAzLDEwICsyMDU3LDcgQEAKICNkZWZpbmUgcHJ0X2RzY19hdGVuZChjKQlwcnRfZHNjX3RleHQoKGMpLCAiYXRlbmQiKQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9kc2NfaW50cyhjb21tZW50LCBjb3VudCwgaW50cykKLSAgICBjaGFyCSpjb21tZW50OwotICAgIGludAkJY291bnQ7Ci0gICAgaW50CQkqaW50czsKK3BydF9kc2NfaW50cyhjaGFyICpjb21tZW50LCBpbnQgY291bnQsIGludCAqaW50cykKIHsKICAgICBpbnQJCWk7CiAKQEAgLTIxMjQsMTAgKzIwNzUsMTAgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1wcnRfZHNjX3Jlc291cmNlcyhjb21tZW50LCB0eXBlLCBzdHJpbmcpCi0gICAgY2hhcgkqY29tbWVudDsJLyogaWYgTlVMTCBhZGQgdG8gcHJldmlvdXMgKi8KLSAgICBjaGFyCSp0eXBlOwotICAgIGNoYXIJKnN0cmluZzsKK3BydF9kc2NfcmVzb3VyY2VzKAorICAgIGNoYXIJKmNvbW1lbnQsCS8qIGlmIE5VTEwgYWRkIHRvIHByZXZpb3VzICovCisgICAgY2hhcgkqdHlwZSwKKyAgICBjaGFyCSpzdHJpbmcpCiB7CiAgICAgaWYgKGNvbW1lbnQgIT0gTlVMTCkKIAl2aW1fc25wcmludGYoKGNoYXIgKilwcnRfbGluZV9idWZmZXIsIHNpemVvZihwcnRfbGluZV9idWZmZXIpLApAQCAtMjE0Myw5ICsyMDk0LDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi1wcnRfZHNjX2ZvbnRfcmVzb3VyY2UocmVzb3VyY2UsIHBzX2ZvbnQpCi0gICAgY2hhcgkqcmVzb3VyY2U7Ci0gICAgc3RydWN0IHBydF9wc19mb250X1MgKnBzX2ZvbnQ7CitwcnRfZHNjX2ZvbnRfcmVzb3VyY2UoY2hhciAqcmVzb3VyY2UsIHN0cnVjdCBwcnRfcHNfZm9udF9TICpwc19mb250KQogewogICAgIGludCAgICAgaTsKIApAQCAtMjE1NywxMiArMjEwNiwxMiBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9kc2NfcmVxdWlyZW1lbnRzKGR1cGxleCwgdHVtYmxlLCBjb2xsYXRlLCBjb2xvciwgbnVtX2NvcGllcykKLSAgICBpbnQJCWR1cGxleDsKLSAgICBpbnQJCXR1bWJsZTsKLSAgICBpbnQJCWNvbGxhdGU7Ci0gICAgaW50CQljb2xvcjsKLSAgICBpbnQJCW51bV9jb3BpZXM7CitwcnRfZHNjX3JlcXVpcmVtZW50cygKKyAgICBpbnQJCWR1cGxleCwKKyAgICBpbnQJCXR1bWJsZSwKKyAgICBpbnQJCWNvbGxhdGUsCisgICAgaW50CQljb2xvciwKKyAgICBpbnQJCW51bV9jb3BpZXMpCiB7CiAgICAgLyogT25seSBvdXRwdXQgdGhlIGNvbW1lbnQgaWYgd2UgbmVlZCB0by4KICAgICAgKiBOb3RlOiB0dW1ibGUgaXMgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGR1cGxleGluZwpAQCAtMjE5NSwxMyArMjE0NCwxMyBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXBydF9kc2NfZG9jbWVkaWEocGFwZXJfbmFtZSwgd2lkdGgsIGhlaWdodCwgd2VpZ2h0LCBjb2xvdXIsIHR5cGUpCi0gICAgY2hhcgkqcGFwZXJfbmFtZTsKLSAgICBkb3VibGUJd2lkdGg7Ci0gICAgZG91YmxlCWhlaWdodDsKLSAgICBkb3VibGUJd2VpZ2h0OwotICAgIGNoYXIJKmNvbG91cjsKLSAgICBjaGFyCSp0eXBlOworcHJ0X2RzY19kb2NtZWRpYSgKKyAgICBjaGFyCSpwYXBlcl9uYW1lLAorICAgIGRvdWJsZQl3aWR0aCwKKyAgICBkb3VibGUJaGVpZ2h0LAorICAgIGRvdWJsZQl3ZWlnaHQsCisgICAgY2hhcgkqY29sb3VyLAorICAgIGNoYXIJKnR5cGUpCiB7CiAgICAgdmltX3NucHJpbnRmKChjaGFyICopcHJ0X2xpbmVfYnVmZmVyLCBzaXplb2YocHJ0X2xpbmVfYnVmZmVyKSwKIAkJCQkJIiUlJSVEb2N1bWVudE1lZGlhOiAlcyAiLCBwYXBlcl9uYW1lKTsKQEAgLTIyMjIsNyArMjE3MSw3IEBACiB9CiAKICAgICB2b2lkCi1tY2hfcHJpbnRfY2xlYW51cCgpCittY2hfcHJpbnRfY2xlYW51cCh2b2lkKQogewogI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAocHJ0X291dF9tYnl0ZSkKQEAgLTIyNjEsMTAgKzIyMTAsNyBAQAogfQogCiAgICAgc3RhdGljIGZsb2F0Ci10b19kZXZpY2VfdW5pdHMoaWR4LCBwaHlzc2l6ZSwgZGVmX251bWJlcikKLSAgICBpbnQJCWlkeDsKLSAgICBkb3VibGUJcGh5c3NpemU7Ci0gICAgaW50CQlkZWZfbnVtYmVyOwordG9fZGV2aWNlX3VuaXRzKGludCBpZHgsIGRvdWJsZSBwaHlzc2l6ZSwgaW50IGRlZl9udW1iZXIpCiB7CiAgICAgZmxvYXQJcmV0OwogICAgIGludAkJdTsKQEAgLTIzMDMsMTMgKzIyNDksMTMgQEAKICAqIENhbGN1bGF0ZSBtYXJnaW5zIGZvciBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gcHJpbnRvcHRpb25zIHNldHRpbmdzLgogICovCiAgICAgc3RhdGljIHZvaWQKLXBydF9wYWdlX21hcmdpbnMod2lkdGgsIGhlaWdodCwgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKQotICAgIGRvdWJsZQl3aWR0aDsKLSAgICBkb3VibGUJaGVpZ2h0OwotICAgIGRvdWJsZQkqbGVmdDsKLSAgICBkb3VibGUJKnJpZ2h0OwotICAgIGRvdWJsZQkqdG9wOwotICAgIGRvdWJsZQkqYm90dG9tOworcHJ0X3BhZ2VfbWFyZ2lucygKKyAgICBkb3VibGUJd2lkdGgsCisgICAgZG91YmxlCWhlaWdodCwKKyAgICBkb3VibGUJKmxlZnQsCisgICAgZG91YmxlCSpyaWdodCwKKyAgICBkb3VibGUJKnRvcCwKKyAgICBkb3VibGUJKmJvdHRvbSkKIHsKICAgICAqbGVmdCAgID0gdG9fZGV2aWNlX3VuaXRzKE9QVF9QUklOVF9MRUZULCB3aWR0aCwgMTApOwogICAgICpyaWdodCAgPSB3aWR0aCAtIHRvX2RldmljZV91bml0cyhPUFRfUFJJTlRfUklHSFQsIHdpZHRoLCA1KTsKQEAgLTIzMTgsOCArMjI2NCw3IEBACiB9CiAKICAgICBzdGF0aWMgdm9pZAotcHJ0X2ZvbnRfbWV0cmljcyhmb250X3NjYWxlKQotICAgIGludAkJZm9udF9zY2FsZTsKK3BydF9mb250X21ldHJpY3MoaW50IGZvbnRfc2NhbGUpCiB7CiAgICAgcHJ0X2xpbmVfaGVpZ2h0ID0gKGZsb2F0KWZvbnRfc2NhbGU7CiAgICAgcHJ0X2NoYXJfd2lkdGggPSAoZmxvYXQpUFJUX1BTX0ZPTlRfVE9fVVNFUihmb250X3NjYWxlLCBwcnRfcHNfZm9udC0+d3gpOwpAQCAtMjMyNyw3ICsyMjcyLDcgQEAKIAogCiAgICAgc3RhdGljIGludAotcHJ0X2dldF9jcGwoKQorcHJ0X2dldF9jcGwodm9pZCkKIHsKICAgICBpZiAocHJ0X3VzZV9udW1iZXIoKSkKICAgICB7CkBAIC0yMzQ5LDEwICsyMjk0LDcgQEAKIAogI2lmZGVmIEZFQVRfTUJZVEUKICAgICBzdGF0aWMgaW50Ci1wcnRfYnVpbGRfY2lkX2ZvbnRuYW1lKGZvbnQsIG5hbWUsIG5hbWVfbGVuKQotICAgIGludCAgICAgZm9udDsKLSAgICBjaGFyX3UgICpuYW1lOwotICAgIGludCAgICAgbmFtZV9sZW47CitwcnRfYnVpbGRfY2lkX2ZvbnRuYW1lKGludCBmb250LCBjaGFyX3UgKm5hbWUsIGludCBuYW1lX2xlbikKIHsKICAgICBjaGFyICAgICpmb250bmFtZTsKIApAQCAtMjM3MCw3ICsyMzEyLDcgQEAKICAqIEdldCBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCB0aGF0IGZpdCBvbiBhIHBhZ2UgKGV4Y2x1ZGluZyB0aGUgaGVhZGVyKS4KICAqLwogICAgIHN0YXRpYyBpbnQKLXBydF9nZXRfbHBwKCkKK3BydF9nZXRfbHBwKHZvaWQpCiB7CiAgICAgaW50IGxwcDsKIApAQCAtMjQwMiwxMCArMjM0NCwxMCBAQAogCiAjaWZkZWYgRkVBVF9NQllURQogICAgIHN0YXRpYyBpbnQKLXBydF9tYXRjaF9lbmNvZGluZyhwX2VuY29kaW5nLCBwX2NtYXAsIHBwX21iZW5jKQotICAgIGNoYXIJCQkqcF9lbmNvZGluZzsKLSAgICBzdHJ1Y3QgcHJ0X3BzX21iZm9udF9TCSpwX2NtYXA7Ci0gICAgc3RydWN0IHBydF9wc19lbmNvZGluZ19TCSoqcHBfbWJlbmM7CitwcnRfbWF0Y2hfZW5jb2RpbmcoCisgICAgY2hhcgkJCSpwX2VuY29kaW5nLAorICAgIHN0cnVjdCBwcnRfcHNfbWJmb250X1MJKnBfY21hcCwKKyAgICBzdHJ1Y3QgcHJ0X3BzX2VuY29kaW5nX1MJKipwcF9tYmVuYykKIHsKICAgICBpbnQJCQkJbWJlbmM7CiAgICAgaW50CQkJCWVuY19sZW47CkBAIC0yNDI4LDEwICsyMzcwLDEwIEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1wcnRfbWF0Y2hfY2hhcnNldChwX2NoYXJzZXQsIHBfY21hcCwgcHBfbWJjaGFyKQotICAgIGNoYXIJCSAgICAqcF9jaGFyc2V0OwotICAgIHN0cnVjdCBwcnRfcHNfbWJmb250X1MgICpwX2NtYXA7Ci0gICAgc3RydWN0IHBydF9wc19jaGFyc2V0X1MgKipwcF9tYmNoYXI7CitwcnRfbWF0Y2hfY2hhcnNldCgKKyAgICBjaGFyCQkgICAgKnBfY2hhcnNldCwKKyAgICBzdHJ1Y3QgcHJ0X3BzX21iZm9udF9TICAqcF9jbWFwLAorICAgIHN0cnVjdCBwcnRfcHNfY2hhcnNldF9TICoqcHBfbWJjaGFyKQogewogICAgIGludAkJCSAgICBtYmNoYXI7CiAgICAgaW50CQkJICAgIGNoYXJfbGVuOwpAQCAtMjQ1NiwxMCArMjM5OCwxMCBAQAogI2VuZGlmCiAKICAgICBpbnQKLW1jaF9wcmludF9pbml0KHBzZXR0aW5ncywgam9ibmFtZSwgZm9yY2VpdCkKLSAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzOwotICAgIGNoYXJfdQkqam9ibmFtZTsKLSAgICBpbnQJCWZvcmNlaXQgVU5VU0VEOworbWNoX3ByaW50X2luaXQoCisgICAgcHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncywKKyAgICBjaGFyX3UJKmpvYm5hbWUsCisgICAgaW50CQlmb3JjZWl0IFVOVVNFRCkKIHsKICAgICBpbnQJCWk7CiAgICAgY2hhcgkqcGFwZXJfbmFtZTsKQEAgLTI4MDUsOCArMjc0Nyw3IEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1wcnRfYWRkX3Jlc291cmNlKHJlc291cmNlKQotICAgIHN0cnVjdCBwcnRfcHNfcmVzb3VyY2VfUyAqcmVzb3VyY2U7CitwcnRfYWRkX3Jlc291cmNlKHN0cnVjdCBwcnRfcHNfcmVzb3VyY2VfUyAqcmVzb3VyY2UpCiB7CiAgICAgRklMRSoJZmRfcmVzb3VyY2U7CiAgICAgY2hhcl91CXJlc291cmNlX2J1ZmZlcls1MTJdOwpAQCAtMjg1Myw4ICsyNzk0LDcgQEAKIH0KIAogICAgIGludAotbWNoX3ByaW50X2JlZ2luKHBzZXR0aW5ncykKLSAgICBwcnRfc2V0dGluZ3NfVCAqcHNldHRpbmdzOworbWNoX3ByaW50X2JlZ2luKHBydF9zZXR0aW5nc19UICpwc2V0dGluZ3MpCiB7CiAgICAgdGltZV90CW5vdzsKICAgICBpbnQJCWJib3hbNF07CkBAIC0zMjk1LDggKzMyMzUsNyBAQAogfQogCiAgICAgdm9pZAotbWNoX3ByaW50X2VuZChwc2V0dGluZ3MpCi0gICAgcHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5nczsKK21jaF9wcmludF9lbmQocHJ0X3NldHRpbmdzX1QgKnBzZXR0aW5ncykKIHsKICAgICBwcnRfZHNjX25vYXJnKCJUcmFpbGVyIik7CiAKQEAgLTMzMzMsNyArMzI3Miw3IEBACiB9CiAKICAgICBpbnQKLW1jaF9wcmludF9lbmRfcGFnZSgpCittY2hfcHJpbnRfZW5kX3BhZ2Uodm9pZCkKIHsKICAgICBwcnRfZmx1c2hfYnVmZmVyKCk7CiAKQEAgLTMzNDUsOCArMzI4NCw3IEBACiB9CiAKICAgICBpbnQKLW1jaF9wcmludF9iZWdpbl9wYWdlKHN0cikKLSAgICBjaGFyX3UJKnN0ciBVTlVTRUQ7CittY2hfcHJpbnRfYmVnaW5fcGFnZShjaGFyX3UgKnN0ciBVTlVTRUQpCiB7CiAgICAgaW50CQlwYWdlX251bVsyXTsKIApAQCAtMzM4Nyw3ICszMzI1LDcgQEAKIH0KIAogICAgIGludAotbWNoX3ByaW50X2JsYW5rX3BhZ2UoKQorbWNoX3ByaW50X2JsYW5rX3BhZ2Uodm9pZCkKIHsKICAgICByZXR1cm4gKG1jaF9wcmludF9iZWdpbl9wYWdlKE5VTEwpID8gKG1jaF9wcmludF9lbmRfcGFnZSgpKSA6IEZBTFNFKTsKIH0KQEAgLTMzOTYsOSArMzMzNCw3IEBACiBzdGF0aWMgZmxvYXQgcHJ0X3Bvc195ID0gMDsKIAogICAgIHZvaWQKLW1jaF9wcmludF9zdGFydF9saW5lKG1hcmdpbiwgcGFnZV9saW5lKQotICAgIGludAkJbWFyZ2luOwotICAgIGludAkJcGFnZV9saW5lOworbWNoX3ByaW50X3N0YXJ0X2xpbmUoaW50IG1hcmdpbiwgaW50IHBhZ2VfbGluZSkKIHsKICAgICBwcnRfcG9zX3ggPSBwcnRfbGVmdF9tYXJnaW47CiAgICAgaWYgKG1hcmdpbikKQEAgLTM0MTUsOSArMzM1MSw3IEBACiB9CiAKICAgICBpbnQKLW1jaF9wcmludF90ZXh0X291dChwLCBsZW4pCi0gICAgY2hhcl91CSpwOwotICAgIGludAkJbGVuIFVOVVNFRDsKK21jaF9wcmludF90ZXh0X291dChjaGFyX3UgKnAsIGludCBsZW4gVU5VU0VEKQogewogICAgIGludAkJbmVlZF9icmVhazsKICAgICBjaGFyX3UJY2g7CkBAIC0zNjM4LDEwICszNTcyLDcgQEAKIH0KIAogICAgIHZvaWQKLW1jaF9wcmludF9zZXRfZm9udChpQm9sZCwgaUl0YWxpYywgaVVuZGVybGluZSkKLSAgICBpbnQJCWlCb2xkOwotICAgIGludAkJaUl0YWxpYzsKLSAgICBpbnQJCWlVbmRlcmxpbmU7CittY2hfcHJpbnRfc2V0X2ZvbnQoaW50IGlCb2xkLCBpbnQgaUl0YWxpYywgaW50IGlVbmRlcmxpbmUpCiB7CiAgICAgaW50CQlmb250ID0gMDsKIApAQCAtMzY2NSw4ICszNTk2LDcgQEAKIH0KIAogICAgIHZvaWQKLW1jaF9wcmludF9zZXRfYmcoYmdjb2wpCi0gICAgbG9uZ191CWJnY29sOworbWNoX3ByaW50X3NldF9iZyhsb25nX3UgYmdjb2wpCiB7CiAgICAgcHJ0X2JnY29sID0gKGludCliZ2NvbDsKICAgICBwcnRfYXR0cmlidXRlX2NoYW5nZSA9IFRSVUU7CkBAIC0zNjc0LDggKzM2MDQsNyBAQAogfQogCiAgICAgdm9pZAotbWNoX3ByaW50X3NldF9mZyhmZ2NvbCkKLSAgICBsb25nX3UJZmdjb2w7CittY2hfcHJpbnRfc2V0X2ZnKGxvbmdfdSBmZ2NvbCkKIHsKICAgICBpZiAoZmdjb2wgIT0gKGxvbmdfdSlwcnRfZmdjb2wpCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2hhc2h0YWIuYyBiL3NyYy9oYXNodGFiLmMKaW5kZXggYTRiY2U2NS4uZDFiYTJjOSAxMDA2NDQKLS0tIGEvc3JjL2hhc2h0YWIuYworKysgYi9zcmMvaGFzaHRhYi5jCkBAIC00OSw3ICs0OSw3IEBACiAgKiBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgogICovCiAgICAgaGFzaHRhYl9UICoKLWhhc2hfY3JlYXRlKCkKK2hhc2hfY3JlYXRlKHZvaWQpCiB7CiAgICAgaGFzaHRhYl9UICpodDsKIApAQCAtNjQsOCArNjQsNyBAQAogICogSW5pdGlhbGl6ZSBhbiBlbXB0eSBoYXNoIHRhYmxlLgogICovCiAgICAgdm9pZAotaGFzaF9pbml0KGh0KQotICAgIGhhc2h0YWJfVCAqaHQ7CitoYXNoX2luaXQoaGFzaHRhYl9UICpodCkKIHsKICAgICAvKiBUaGlzIHplcm9lcyBhbGwgImh0XyIgZW50cmllcyBhbmQgYWxsIHRoZSAiaGlfa2V5IiBpbiAiaHRfc21hbGxhcnJheSIuICovCiAgICAgdmltX21lbXNldChodCwgMCwgc2l6ZW9mKGhhc2h0YWJfVCkpOwpAQCAtNzgsOCArNzcsNyBAQAogICogSWYgImh0IiBpcyBub3QgZnJlZWQgdGhlbiB5b3Ugc2hvdWxkIGNhbGwgaGFzaF9pbml0KCkgbmV4dCEKICAqLwogICAgIHZvaWQKLWhhc2hfY2xlYXIoaHQpCi0gICAgaGFzaHRhYl9UICpodDsKK2hhc2hfY2xlYXIoaGFzaHRhYl9UICpodCkKIHsKICAgICBpZiAoaHQtPmh0X2FycmF5ICE9IGh0LT5odF9zbWFsbGFycmF5KQogCXZpbV9mcmVlKGh0LT5odF9hcnJheSk7CkBAIC05MSw5ICs4OSw3IEBACiAgKiBtZW1vcnkgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBrZXkgKGl0J3MgYWx3YXlzIHBvc2l0aXZlKS4KICAqLwogICAgIHZvaWQKLWhhc2hfY2xlYXJfYWxsKGh0LCBvZmYpCi0gICAgaGFzaHRhYl9UCSpodDsKLSAgICBpbnQJCW9mZjsKK2hhc2hfY2xlYXJfYWxsKGhhc2h0YWJfVCAqaHQsIGludCBvZmYpCiB7CiAgICAgbG9uZwl0b2RvOwogICAgIGhhc2hpdGVtX1QJKmhpOwpAQCAtMTE5LDkgKzExNSw3IEBACiAgKiAoYWRkaW5nLCBzZXR0aW5nIG9yIHJlbW92aW5nIGFuIGl0ZW0pIQogICovCiAgICAgaGFzaGl0ZW1fVCAqCi1oYXNoX2ZpbmQoaHQsIGtleSkKLSAgICBoYXNodGFiX1QJKmh0OwotICAgIGNoYXJfdQkqa2V5OworaGFzaF9maW5kKGhhc2h0YWJfVCAqaHQsIGNoYXJfdSAqa2V5KQogewogICAgIHJldHVybiBoYXNoX2xvb2t1cChodCwga2V5LCBoYXNoX2hhc2goa2V5KSk7CiB9CkBAIC0xMzAsMTAgKzEyNCw3IEBACiAgKiBMaWtlIGhhc2hfZmluZCgpLCBidXQgY2FsbGVyIGNvbXB1dGVzICJoYXNoIi4KICAqLwogICAgIGhhc2hpdGVtX1QgKgotaGFzaF9sb29rdXAoaHQsIGtleSwgaGFzaCkKLSAgICBoYXNodGFiX1QJKmh0OwotICAgIGNoYXJfdQkqa2V5OwotICAgIGhhc2hfVAloYXNoOworaGFzaF9sb29rdXAoaGFzaHRhYl9UICpodCwgY2hhcl91ICprZXksIGhhc2hfVCBoYXNoKQogewogICAgIGhhc2hfVAlwZXJ0dXJiOwogICAgIGhhc2hpdGVtX1QJKmZyZWVpdGVtOwpAQCAtMTk1LDcgKzE4Niw3IEBACiAgKiBDYWxsZWQgd2hlbiBleGl0aW5nLgogICovCiAgICAgdm9pZAotaGFzaF9kZWJ1Z19yZXN1bHRzKCkKK2hhc2hfZGVidWdfcmVzdWx0cyh2b2lkKQogewogI2lmZGVmIEhUX0RFQlVHCiAgICAgZnByaW50ZihzdGRlcnIsICJcclxuXHJcblxyXG5cclxuIik7CkBAIC0yMTEsOSArMjAyLDcgQEAKICAqIFJldHVybnMgRkFJTCB3aGVuIG91dCBvZiBtZW1vcnkgb3IgdGhlIGtleSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgKi8KICAgICBpbnQKLWhhc2hfYWRkKGh0LCBrZXkpCi0gICAgaGFzaHRhYl9UCSpodDsKLSAgICBjaGFyX3UJKmtleTsKK2hhc2hfYWRkKGhhc2h0YWJfVCAqaHQsIGNoYXJfdSAqa2V5KQogewogICAgIGhhc2hfVAloYXNoID0gaGFzaF9oYXNoKGtleSk7CiAgICAgaGFzaGl0ZW1fVAkqaGk7CkBAIC0yMzQsMTEgKzIyMywxMSBAQAogICogUmV0dXJucyBPSyBvciBGQUlMIChvdXQgb2YgbWVtb3J5KS4KICAqLwogICAgIGludAotaGFzaF9hZGRfaXRlbShodCwgaGksIGtleSwgaGFzaCkKLSAgICBoYXNodGFiX1QJKmh0OwotICAgIGhhc2hpdGVtX1QJKmhpOwotICAgIGNoYXJfdQkqa2V5OwotICAgIGhhc2hfVAloYXNoOworaGFzaF9hZGRfaXRlbSgKKyAgICBoYXNodGFiX1QJKmh0LAorICAgIGhhc2hpdGVtX1QJKmhpLAorICAgIGNoYXJfdQkqa2V5LAorICAgIGhhc2hfVAloYXNoKQogewogICAgIC8qIElmIHJlc2l6aW5nIGZhaWxlZCBiZWZvcmUgYW5kIGl0IGZhaWxzIGFnYWluIHdlIGNhbid0IGFkZCBhbiBpdGVtLiAqLwogICAgIGlmIChodC0+aHRfZXJyb3IgJiYgaGFzaF9tYXlfcmVzaXplKGh0LCAwKSA9PSBGQUlMKQpAQCAtMjY1LDkgKzI1NCw3IEBACiAgKiAiaGkiIGlzIGludmFsaWQgYWZ0ZXIgdGhpcyEKICAqLwogICAgIHZvaWQKLWhhc2hfc2V0KGhpLCBrZXkpCi0gICAgaGFzaGl0ZW1fVAkqaGk7Ci0gICAgY2hhcl91CSprZXk7CitoYXNoX3NldChoYXNoaXRlbV9UICpoaSwgY2hhcl91ICprZXkpCiB7CiAgICAgaGktPmhpX2tleSA9IGtleTsKIH0KQEAgLTI3OSw5ICsyNjYsNyBAQAogICogVGhlIGNhbGxlciBtdXN0IHRha2UgY2FyZSBvZiBmcmVlaW5nIHRoZSBpdGVtIGl0c2VsZi4KICAqLwogICAgIHZvaWQKLWhhc2hfcmVtb3ZlKGh0LCBoaSkKLSAgICBoYXNodGFiX1QJKmh0OwotICAgIGhhc2hpdGVtX1QJKmhpOworaGFzaF9yZW1vdmUoaGFzaHRhYl9UICpodCwgaGFzaGl0ZW1fVCAqaGkpCiB7CiAgICAgLS1odC0+aHRfdXNlZDsKICAgICBoaS0+aGlfa2V5ID0gSElfS0VZX1JFTU9WRUQ7CkBAIC0yOTQsOCArMjc5LDcgQEAKICAqIE11c3QgY2FsbCBoYXNoX3VubG9jaygpIGxhdGVyLgogICovCiAgICAgdm9pZAotaGFzaF9sb2NrKGh0KQotICAgIGhhc2h0YWJfVAkqaHQ7CitoYXNoX2xvY2soaGFzaHRhYl9UICpodCkKIHsKICAgICArK2h0LT5odF9sb2NrZWQ7CiB9CkBAIC0zMDcsOSArMjkxLDcgQEAKICAqIE11c3QgY2FsbCBoYXNoX3VubG9jaygpIGxhdGVyLgogICovCiAgICAgdm9pZAotaGFzaF9sb2NrX3NpemUoaHQsIHNpemUpCi0gICAgaGFzaHRhYl9UCSpodDsKLSAgICBpbnQJCXNpemU7CitoYXNoX2xvY2tfc2l6ZShoYXNodGFiX1QgKmh0LCBpbnQgc2l6ZSkKIHsKICAgICAodm9pZCloYXNoX21heV9yZXNpemUoaHQsIHNpemUpOwogICAgICsraHQtPmh0X2xvY2tlZDsKQEAgLTMyMiw4ICszMDQsNyBAQAogICogVGhpcyBtdXN0IGJhbGFuY2UgYSBjYWxsIHRvIGhhc2hfbG9jaygpLgogICovCiAgICAgdm9pZAotaGFzaF91bmxvY2soaHQpCi0gICAgaGFzaHRhYl9UCSpodDsKK2hhc2hfdW5sb2NrKGhhc2h0YWJfVCAqaHQpCiB7CiAgICAgLS1odC0+aHRfbG9ja2VkOwogICAgICh2b2lkKWhhc2hfbWF5X3Jlc2l6ZShodCwgMCk7CkBAIC0zMzUsOSArMzE2LDkgQEAKICAqIFJldHVybnMgT0sgb3IgRkFJTCAob3V0IG9mIG1lbW9yeSkuCiAgKi8KICAgICBzdGF0aWMgaW50Ci1oYXNoX21heV9yZXNpemUoaHQsIG1pbml0ZW1zKQotICAgIGhhc2h0YWJfVAkqaHQ7Ci0gICAgaW50CQltaW5pdGVtczsJCS8qIG1pbmltYWwgbnVtYmVyIG9mIGl0ZW1zICovCitoYXNoX21heV9yZXNpemUoCisgICAgaGFzaHRhYl9UCSpodCwKKyAgICBpbnQJCW1pbml0ZW1zKQkJLyogbWluaW1hbCBudW1iZXIgb2YgaXRlbXMgKi8KIHsKICAgICBoYXNoaXRlbV9UCXRlbXBhcnJheVtIVF9JTklUX1NJWkVdOwogICAgIGhhc2hpdGVtX1QJKm9sZGFycmF5LCAqbmV3YXJyYXk7CkBAIC00ODEsOCArNDYyLDcgQEAKICAqIGxvd2VyIHRoZSBwZXJjZW50YWdlIHRoZSBiZXR0ZXIuCiAgKi8KICAgICBoYXNoX1QKLWhhc2hfaGFzaChrZXkpCi0gICAgY2hhcl91CSprZXk7CitoYXNoX2hhc2goY2hhcl91ICprZXkpCiB7CiAgICAgaGFzaF9UCWhhc2g7CiAgICAgY2hhcl91CSpwOwpkaWZmIC0tZ2l0IGEvc3JjL2lmX2NzY29wZS5jIGIvc3JjL2lmX2NzY29wZS5jCmluZGV4IGM2YWNkMTcuLjRhNzI5MDcgMTAwNjQ0Ci0tLSBhL3NyYy9pZl9jc2NvcGUuYworKysgYi9zcmMvaWZfY3Njb3BlLmMKQEAgLTgzLDggKzgzLDcgQEAKIH07CiAKICAgICBzdGF0aWMgdm9pZAotY3NfdXNhZ2VfbXNnKHgpCi0gICAgY3NpZF9lIHg7Citjc191c2FnZV9tc2coY3NpZF9lIHgpCiB7CiAgICAgKHZvaWQpRU1TRzIoXygiRTU2MDogVXNhZ2U6IGNzW2NvcGVdICVzIiksIGNzX2NtZHNbKGludCl4XS51c2FnZSk7CiB9CkBAIC0xMDQsOSArMTAzLDcgQEAKICAqIGV4cGFuc2lvbi4KICAqLwogICAgIGNoYXJfdSAqCi1nZXRfY3Njb3BlX25hbWUoeHAsIGlkeCkKLSAgICBleHBhbmRfVAkqeHAgVU5VU0VEOwotICAgIGludAkJaWR4OworZ2V0X2NzY29wZV9uYW1lKGV4cGFuZF9UICp4cCBVTlVTRUQsIGludCBpZHgpCiB7CiAgICAgaW50CQljdXJyZW50X2lkeDsKICAgICBpbnQJCWk7CkBAIC0xNjcsMTAgKzE2NCwxMCBAQAogICogSGFuZGxlIGNvbW1hbmQgbGluZSBjb21wbGV0aW9uIGZvciA6Y3Njb3BlIGNvbW1hbmQuCiAgKi8KICAgICB2b2lkCi1zZXRfY29udGV4dF9pbl9jc2NvcGVfY21kKHhwLCBhcmcsIGNtZGlkeCkKLSAgICBleHBhbmRfVAkqeHA7Ci0gICAgY2hhcl91CSphcmc7Ci0gICAgY21kaWR4X1QJY21kaWR4Oworc2V0X2NvbnRleHRfaW5fY3Njb3BlX2NtZCgKKyAgICBleHBhbmRfVAkqeHAsCisgICAgY2hhcl91CSphcmcsCisgICAgY21kaWR4X1QJY21kaWR4KQogewogICAgIGNoYXJfdQkqcDsKIApAQCAtMjEwLDkgKzIwNyw5IEBACiAgKiBjb21tYW5kIGZ1bmN0aW9uLgogICovCiAgICAgc3RhdGljIHZvaWQKLWRvX2NzY29wZV9nZW5lcmFsKGVhcCwgbWFrZV9zcGxpdCkKLSAgICBleGFyZ19UCSplYXA7Ci0gICAgaW50CQltYWtlX3NwbGl0OyAvKiB3aGV0aGVyIHRvIHNwbGl0IHdpbmRvdyAqLworZG9fY3Njb3BlX2dlbmVyYWwoCisgICAgZXhhcmdfVAkqZWFwLAorICAgIGludAkJbWFrZV9zcGxpdCkgLyogd2hldGhlciB0byBzcGxpdCB3aW5kb3cgKi8KIHsKICAgICBjc2NtZF9UICpjbWRwOwogCkBAIC0yNDgsOCArMjQ1LDcgQEAKICAqIFBVQkxJQzogZG9fY3Njb3BlCiAgKi8KICAgICB2b2lkCi1kb19jc2NvcGUoZWFwKQotICAgIGV4YXJnX1QgKmVhcDsKK2RvX2NzY29wZShleGFyZ19UICplYXApCiB7CiAgICAgZG9fY3Njb3BlX2dlbmVyYWwoZWFwLCBGQUxTRSk7CiB9CkBAIC0yNjAsOCArMjU2LDcgQEAKICAqIHNhbWUgYXMgZG9fY3Njb3BlLCBidXQgc3BsaXRzIHdpbmRvdywgdG9vLgogICovCiAgICAgdm9pZAotZG9fc2NzY29wZShlYXApCi0gICAgZXhhcmdfVCAqZWFwOworZG9fc2NzY29wZShleGFyZ19UICplYXApCiB7CiAgICAgZG9fY3Njb3BlX2dlbmVyYWwoZWFwLCBUUlVFKTsKIH0KQEAgLTI3MSw4ICsyNjYsNyBAQAogICoKICAqLwogICAgIHZvaWQKLWRvX2NzdGFnKGVhcCkKLSAgICBleGFyZ19UICplYXA7Citkb19jc3RhZyhleGFyZ19UICplYXApCiB7CiAgICAgaW50IHJldCA9IEZBTFNFOwogCkBAIC0zNTQsOSArMzQ4LDcgQEAKICAqIHJldHVybnMgVFJVRSBpZiBlb2YsIEZBTFNFIG90aGVyd2lzZQogICovCiAgICAgaW50Ci1jc19mZ2V0cyhidWYsIHNpemUpCi0gICAgY2hhcl91CSpidWY7Ci0gICAgaW50CQlzaXplOworY3NfZmdldHMoY2hhcl91ICpidWYsIGludCBzaXplKQogewogICAgIGNoYXIgKnA7CiAKQEAgLTM3NCw3ICszNjYsNyBAQAogICogY2FsbGVkIG9ubHkgZnJvbSBkb190YWcoKSwgd2hlbiBwb3BwaW5nIHRoZSB0YWcgc3RhY2sKICAqLwogICAgIHZvaWQKLWNzX2ZyZWVfdGFncygpCitjc19mcmVlX3RhZ3Modm9pZCkKIHsKICAgICBjc19tYW5hZ2VfbWF0Y2hlcyhOVUxMLCBOVUxMLCAtMSwgRnJlZSk7CiB9CkBAIC0zODYsNyArMzc4LDcgQEAKICAqIGNhbGxlZCBmcm9tIGRvX3RhZygpCiAgKi8KICAgICB2b2lkCi1jc19wcmludF90YWdzKCkKK2NzX3ByaW50X3RhZ3Modm9pZCkKIHsKICAgICBjc19tYW5hZ2VfbWF0Y2hlcyhOVUxMLCBOVUxMLCAtMSwgUHJpbnQpOwogfQpAQCAtNDIxLDEwICs0MTMsNyBAQAogICovCiAjaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCiAgICAgaW50Ci1jc19jb25uZWN0aW9uKG51bSwgZGJwYXRoLCBwcGF0aCkKLSAgICBpbnQgbnVtOwotICAgIGNoYXJfdSAqZGJwYXRoOwotICAgIGNoYXJfdSAqcHBhdGg7Citjc19jb25uZWN0aW9uKGludCBudW0sIGNoYXJfdSAqZGJwYXRoLCBjaGFyX3UgKnBwYXRoKQogewogICAgIGludCBpOwogCkBAIC00ODYsOCArNDc1LDcgQEAKICAqIE1BWFBBVEhMIDI1NgogICovCiAgICAgc3RhdGljIGludAotY3NfYWRkKGVhcCkKLSAgICBleGFyZ19UICplYXAgVU5VU0VEOworY3NfYWRkKGV4YXJnX1QgKmVhcCBVTlVTRUQpCiB7CiAgICAgY2hhciAqZm5hbWUsICpwcGF0aCwgKmZsYWdzID0gTlVMTDsKIApAQCAtNTAzLDggKzQ5MSw3IEBACiB9CiAKICAgICBzdGF0aWMgdm9pZAotY3Nfc3RhdF9lbXNnKGZuYW1lKQotICAgIGNoYXIgKmZuYW1lOworY3Nfc3RhdF9lbXNnKGNoYXIgKmZuYW1lKQogewogICAgIGNoYXIgKnN0YXRfZW1zZyA9IF8oIkU1NjM6IHN0YXQoJXMpIGVycm9yOiAlZCIpOwogICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopYWxsb2MoKHVuc2lnbmVkKXN0cmxlbihzdGF0X2Vtc2cpICsgTUFYUEFUSEwgKyAxMCk7CkBAIC01MjgsMTAgKzUxNSwxMCBAQAogICogcm91dGluZSB1c2VzIGEgbnVtYmVyIG9mIGdvdG8gc3RhdGVtZW50cy4KICAqLwogICAgIHN0YXRpYyBpbnQKLWNzX2FkZF9jb21tb24oYXJnMSwgYXJnMiwgZmxhZ3MpCi0gICAgY2hhciAqYXJnMTsJICAgIC8qIGZpbGVuYW1lIC0gbWF5IGNvbnRhaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzICovCi0gICAgY2hhciAqYXJnMjsJICAgIC8qIHByZXBlbmQgcGF0aCAtIG1heSBjb250YWluIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotICAgIGNoYXIgKmZsYWdzOworY3NfYWRkX2NvbW1vbigKKyAgICBjaGFyICphcmcxLAkgICAgLyogZmlsZW5hbWUgLSBtYXkgY29udGFpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyAgICBjaGFyICphcmcyLAkgICAgLyogcHJlcGVuZCBwYXRoIC0gbWF5IGNvbnRhaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisgICAgY2hhciAqZmxhZ3MpCiB7CiAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKICAgICBpbnQJCXJldDsKQEAgLTY2NSwxNCArNjUyLDE0IEBACiAKIAogICAgIHN0YXRpYyBpbnQKLWNzX2NoZWNrX2Zvcl9jb25uZWN0aW9ucygpCitjc19jaGVja19mb3JfY29ubmVjdGlvbnModm9pZCkKIHsKICAgICByZXR1cm4gKGNzX2NudF9jb25uZWN0aW9ucygpID4gMCk7CiB9IC8qIGNzX2NoZWNrX2Zvcl9jb25uZWN0aW9ucyAqLwogCiAKICAgICBzdGF0aWMgaW50Ci1jc19jaGVja19mb3JfdGFncygpCitjc19jaGVja19mb3JfdGFncyh2b2lkKQogewogICAgIHJldHVybiAocF90YWdzWzBdICE9IE5VTCAmJiBjdXJidWYtPmJfcF90YWdzICE9IE5VTEwpOwogfSAvKiBjc19jaGVja19mb3JfdGFncyAqLwpAQCAtNjg0LDcgKzY3MSw3IEBACiAgKiBjb3VudCB0aGUgbnVtYmVyIG9mIGNzY29wZSBjb25uZWN0aW9ucwogICovCiAgICAgc3RhdGljIGludAotY3NfY250X2Nvbm5lY3Rpb25zKCkKK2NzX2NudF9jb25uZWN0aW9ucyh2b2lkKQogewogICAgIHNob3J0IGk7CiAgICAgc2hvcnQgY250ID0gMDsKQEAgLTY5OCw4ICs2ODUsOCBAQAogfSAvKiBjc19jbnRfY29ubmVjdGlvbnMgKi8KIAogICAgIHN0YXRpYyB2b2lkCi1jc19yZWFkaW5nX2Vtc2coaWR4KQotICAgIGludCBpZHg7CS8qIGNvbm5lY3Rpb24gaW5kZXggKi8KK2NzX3JlYWRpbmdfZW1zZygKKyAgICBpbnQgaWR4KQkvKiBjb25uZWN0aW9uIGluZGV4ICovCiB7CiAgICAgRU1TR04oXygiRTI2MjogZXJyb3IgcmVhZGluZyBjc2NvcGUgY29ubmVjdGlvbiAlbGQiKSwgaWR4KTsKIH0KQEAgLTcxMSw4ICs2OTgsNyBAQAogICogY291bnQgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvciBhIGdpdmVuIGNzY29wZSBjb25uZWN0aW9uLgogICovCiAgICAgc3RhdGljIGludAotY3NfY250X21hdGNoZXMoaWR4KQotICAgIGludCBpZHg7Citjc19jbnRfbWF0Y2hlcyhpbnQgaWR4KQogewogICAgIGNoYXIgKnN0b2s7CiAgICAgY2hhciAqYnVmOwpAQCAtNzczLDkgKzc1OSw3IEBACiAgKiBDcmVhdGVzIHRoZSBhY3R1YWwgY3Njb3BlIGNvbW1hbmQgcXVlcnkgZnJvbSB3aGF0IHRoZSB1c2VyIGVudGVyZWQuCiAgKi8KICAgICBzdGF0aWMgY2hhciAqCi1jc19jcmVhdGVfY21kKGNzb3B0aW9uLCBwYXR0ZXJuKQotICAgIGNoYXIgKmNzb3B0aW9uOwotICAgIGNoYXIgKnBhdHRlcm47Citjc19jcmVhdGVfY21kKGNoYXIgKmNzb3B0aW9uLCBjaGFyICpwYXR0ZXJuKQogewogICAgIGNoYXIgKmNtZDsKICAgICBzaG9ydCBzZWFyY2g7CkBAIC04MzYsOCArODIwLDcgQEAKICAqIHRoZSBCU0QgbGljZW5zZSBub3RpY2U/CiAgKi8KICAgICBzdGF0aWMgaW50Ci1jc19jcmVhdGVfY29ubmVjdGlvbihpKQotICAgIGludCBpOworY3NfY3JlYXRlX2Nvbm5lY3Rpb24oaW50IGkpCiB7CiAjaWZkZWYgVU5JWAogICAgIGludAkJdG9fY3NbMl0sIGZyb21fY3NbMl07CkBAIC0xMDgyLDggKzEwNjUsNyBAQAogICogcmV0dXJucyBUUlVFIGlmIHdlIGp1bXAgdG8gYSB0YWcgb3IgYWJvcnQsIEZBTFNFIGlmIG5vdC4KICAqLwogICAgIHN0YXRpYyBpbnQKLWNzX2ZpbmQoZWFwKQotICAgIGV4YXJnX1QgKmVhcDsKK2NzX2ZpbmQoZXhhcmdfVCAqZWFwKQogewogICAgIGNoYXIgKm9wdCwgKnBhdDsKICAgICBpbnQgaTsKQEAgLTExMjYsMTMgKzExMDgsMTMgQEAKICAqIGNvbW1vbiBjb2RlIGZvciBjc2NvcGUgZmluZCwgc2hhcmVkIGJ5IGNzX2ZpbmQoKSBhbmQgZG9fY3N0YWcoKQogICovCiAgICAgc3RhdGljIGludAotY3NfZmluZF9jb21tb24ob3B0LCBwYXQsIGZvcmNlaXQsIHZlcmJvc2UsIHVzZV9sbCwgY21kbGluZSkKLSAgICBjaGFyICpvcHQ7Ci0gICAgY2hhciAqcGF0OwotICAgIGludCBmb3JjZWl0OwotICAgIGludCB2ZXJib3NlOwotICAgIGludAl1c2VfbGwgVU5VU0VEOwotICAgIGNoYXJfdSAqY21kbGluZSBVTlVTRUQ7Citjc19maW5kX2NvbW1vbigKKyAgICBjaGFyICpvcHQsCisgICAgY2hhciAqcGF0LAorICAgIGludCBmb3JjZWl0LAorICAgIGludCB2ZXJib3NlLAorICAgIGludAl1c2VfbGwgVU5VU0VELAorICAgIGNoYXJfdSAqY21kbGluZSBVTlVTRUQpCiB7CiAgICAgaW50IGk7CiAgICAgY2hhciAqY21kOwpAQCAtMTM0NCw4ICsxMzI2LDcgQEAKICAqIHByaW50IGhlbHAKICAqLwogICAgIHN0YXRpYyBpbnQKLWNzX2hlbHAoZWFwKQotICAgIGV4YXJnX1QgKmVhcCBVTlVTRUQ7Citjc19oZWxwKGV4YXJnX1QgKmVhcCBVTlVTRUQpCiB7CiAgICAgY3NjbWRfVCAqY21kcCA9IGNzX2NtZHM7CiAKQEAgLTEzODIsOCArMTM2Myw3IEBACiAKIAogICAgIHN0YXRpYyB2b2lkCi1jbGVhcl9jc2luZm8oaSkKLSAgICBpbnQJICAgIGk7CitjbGVhcl9jc2luZm8oaW50IGkpCiB7CiAgICAgY3NpbmZvW2ldLmZuYW1lICA9IE5VTEw7CiAgICAgY3NpbmZvW2ldLnBwYXRoICA9IE5VTEw7CkBAIC0xNDA4LDcgKzEzODgsNyBAQAogc3RhdGljIGNoYXIgKkdldFdpbjMyRXJyb3Iodm9pZCk7CiAKICAgICBzdGF0aWMgY2hhciAqCi1HZXRXaW4zMkVycm9yKCkKK0dldFdpbjMyRXJyb3Iodm9pZCkKIHsKICAgICBjaGFyICptc2cgPSBOVUxMOwogICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSfEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLApAQCAtMTQzMCwxMSArMTQxMCwxMSBAQAogICogaW5zZXJ0IGEgbmV3IGNzY29wZSBkYXRhYmFzZSBmaWxlbmFtZSBpbnRvIHRoZSBmaWxlbGlzdAogICovCiAgICAgc3RhdGljIGludAotY3NfaW5zZXJ0X2ZpbGVsaXN0KGZuYW1lLCBwcGF0aCwgZmxhZ3MsIHNiKQotICAgIGNoYXIgKmZuYW1lOwotICAgIGNoYXIgKnBwYXRoOwotICAgIGNoYXIgKmZsYWdzOwotICAgIHN0cnVjdCBzdGF0ICpzYiBVTlVTRUQ7Citjc19pbnNlcnRfZmlsZWxpc3QoCisgICAgY2hhciAqZm5hbWUsCisgICAgY2hhciAqcHBhdGgsCisgICAgY2hhciAqZmxhZ3MsCisgICAgc3RydWN0IHN0YXQgKnNiIFVOVVNFRCkKIHsKICAgICBzaG9ydAlpLCBqOwogI2lmbmRlZiBVTklYCkBAIC0xNTc3LDggKzE1NTcsNyBAQAogICogZmluZCBjc2NvcGUgY29tbWFuZCBpbiBjb21tYW5kIHRhYmxlCiAgKi8KICAgICBzdGF0aWMgY3NjbWRfVCAqCi1jc19sb29rdXBfY21kKGVhcCkKLSAgICBleGFyZ19UICplYXA7Citjc19sb29rdXBfY21kKGV4YXJnX1QgKmVhcCkKIHsKICAgICBjc2NtZF9UICpjbWRwOwogICAgIGNoYXIgKnN0b2s7CkBAIC0xNjA5LDggKzE1ODgsNyBAQAogICogbnVrZSBlbQogICovCiAgICAgc3RhdGljIGludAotY3Nfa2lsbChlYXApCi0gICAgZXhhcmdfVCAqZWFwIFVOVVNFRDsKK2NzX2tpbGwoZXhhcmdfVCAqZWFwIFVOVVNFRCkKIHsKICAgICBjaGFyICpzdG9rOwogICAgIHNob3J0IGk7CkBAIC0xNjY3LDkgKzE2NDUsOSBAQAogICogQWN0dWFsbHkga2lsbHMgYSBzcGVjaWZpYyBjc2NvcGUgY29ubmVjdGlvbi4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1jc19raWxsX2V4ZWN1dGUoaSwgY25hbWUpCi0gICAgaW50IGk7CSAgICAvKiBjc2NvcGUgdGFibGUgaW5kZXggKi8KLSAgICBjaGFyICpjbmFtZTsgICAgLyogY3Njb3BlIGRhdGFiYXNlIG5hbWUgKi8KK2NzX2tpbGxfZXhlY3V0ZSgKKyAgICBpbnQgaSwJICAgIC8qIGNzY29wZSB0YWJsZSBpbmRleCAqLworICAgIGNoYXIgKmNuYW1lKSAgICAvKiBjc2NvcGUgZGF0YWJhc2UgbmFtZSAqLwogewogICAgIGlmIChwX2NzdmVyYm9zZSkKICAgICB7CkBAIC0xNzAyLDExICsxNjgwLDExIEBACiAgKiBjaGFyYWN0ZXJzIHRvIGNvbXBseSB3aXRoIGN0YWdzIGZvcm1hdHRpbmcuCiAgKi8KICAgICBzdGF0aWMgY2hhciAqCi1jc19tYWtlX3ZpbV9zdHlsZV9tYXRjaGVzKGZuYW1lLCBzbG5vLCBzZWFyY2gsIHRhZ3N0cikKLSAgICBjaGFyICpmbmFtZTsKLSAgICBjaGFyICpzbG5vOwotICAgIGNoYXIgKnNlYXJjaDsKLSAgICBjaGFyICp0YWdzdHI7Citjc19tYWtlX3ZpbV9zdHlsZV9tYXRjaGVzKAorICAgIGNoYXIgKmZuYW1lLAorICAgIGNoYXIgKnNsbm8sCisgICAgY2hhciAqc2VhcmNoLAorICAgIGNoYXIgKnRhZ3N0cikKIHsKICAgICAvKiB2aW0gc3R5bGUgaXMgY3RhZ3M6CiAgICAgICoKQEAgLTE3NjIsMTEgKzE3NDAsMTEgQEAKICAqIFByaW50OiBwcmludHMgdGhlIHRhZ3MKICAqLwogICAgIHN0YXRpYyBjaGFyICoKLWNzX21hbmFnZV9tYXRjaGVzKG1hdGNoZXMsIGNvbnRleHRzLCB0b3RtYXRjaGVzLCBjbWQpCi0gICAgY2hhciAqKm1hdGNoZXM7Ci0gICAgY2hhciAqKmNvbnRleHRzOwotICAgIGludCB0b3RtYXRjaGVzOwotICAgIG1jbWRfZSBjbWQ7Citjc19tYW5hZ2VfbWF0Y2hlcygKKyAgICBjaGFyICoqbWF0Y2hlcywKKyAgICBjaGFyICoqY29udGV4dHMsCisgICAgaW50IHRvdG1hdGNoZXMsCisgICAgbWNtZF9lIGNtZCkKIHsKICAgICBzdGF0aWMgY2hhciAqKm1wID0gTlVMTDsKICAgICBzdGF0aWMgY2hhciAqKmNwID0gTlVMTDsKQEAgLTE4MjksMTMgKzE4MDcsMTMgQEAKICAqIHBhcnNlIGNzY29wZSBvdXRwdXQKICAqLwogICAgIHN0YXRpYyBjaGFyICoKLWNzX3BhcnNlX3Jlc3VsdHMoY251bWJlciwgYnVmLCBidWZzaXplLCBjb250ZXh0LCBsaW5lbnVtYmVyLCBzZWFyY2gpCi0gICAgaW50IGNudW1iZXI7Ci0gICAgY2hhciAqYnVmOwotICAgIGludCBidWZzaXplOwotICAgIGNoYXIgKipjb250ZXh0OwotICAgIGNoYXIgKipsaW5lbnVtYmVyOwotICAgIGNoYXIgKipzZWFyY2g7Citjc19wYXJzZV9yZXN1bHRzKAorICAgIGludCBjbnVtYmVyLAorICAgIGNoYXIgKmJ1ZiwKKyAgICBpbnQgYnVmc2l6ZSwKKyAgICBjaGFyICoqY29udGV4dCwKKyAgICBjaGFyICoqbGluZW51bWJlciwKKyAgICBjaGFyICoqc2VhcmNoKQogewogICAgIGludCBjaDsKICAgICBjaGFyICpwOwpAQCAtMTg5Miw5ICsxODcwLDcgQEAKICAqIHdyaXRlIGNzY29wZSBmaW5kIHJlc3VsdHMgdG8gZmlsZQogICovCiAgICAgc3RhdGljIHZvaWQKLWNzX2ZpbGVfcmVzdWx0cyhmLCBudW1tYXRjaGVzX2EpCi0gICAgRklMRSAqZjsKLSAgICBpbnQgKm51bW1hdGNoZXNfYTsKK2NzX2ZpbGVfcmVzdWx0cyhGSUxFICpmLCBpbnQgKm51bW1hdGNoZXNfYSkKIHsKICAgICBpbnQgaSwgajsKICAgICBjaGFyICpidWY7CkBAIC0xOTUxLDEzICsxOTI3LDEzIEBACiAgKiBXaGVuIHRoZXJlIGFyZSBubyBtYXRjaGVzIHNldHMgIiptYXRjaGVzX3AiIHRvIE5VTEwuCiAgKi8KICAgICBzdGF0aWMgdm9pZAotY3NfZmlsbF9yZXN1bHRzKHRhZ3N0ciwgdG90bWF0Y2hlcywgbnVtbWF0Y2hlc19hLCBtYXRjaGVzX3AsIGNudHh0c19wLCBtYXRjaGVkKQotICAgIGNoYXIgKnRhZ3N0cjsKLSAgICBpbnQgdG90bWF0Y2hlczsKLSAgICBpbnQgKm51bW1hdGNoZXNfYTsKLSAgICBjaGFyICoqKm1hdGNoZXNfcDsKLSAgICBjaGFyICoqKmNudHh0c19wOwotICAgIGludCAqbWF0Y2hlZDsKK2NzX2ZpbGxfcmVzdWx0cygKKyAgICBjaGFyICp0YWdzdHIsCisgICAgaW50IHRvdG1hdGNoZXMsCisgICAgaW50ICpudW1tYXRjaGVzX2EsCisgICAgY2hhciAqKiptYXRjaGVzX3AsCisgICAgY2hhciAqKipjbnR4dHNfcCwKKyAgICBpbnQgKm1hdGNoZWQpCiB7CiAgICAgaW50IGksIGo7CiAgICAgY2hhciAqYnVmOwpAQCAtMjAzMSw4ICsyMDA3LDcgQEAKIAogLyogZ2V0IHRoZSByZXF1ZXN0ZWQgcGF0aCBjb21wb25lbnRzICovCiAgICAgc3RhdGljIGNoYXIgKgotY3NfcGF0aGNvbXBvbmVudHMocGF0aCkKLSAgICBjaGFyCSpwYXRoOworY3NfcGF0aGNvbXBvbmVudHMoY2hhciAqcGF0aCkKIHsKICAgICBpbnQJCWk7CiAgICAgY2hhcgkqczsKQEAgLTIwNjMsMTAgKzIwMzgsNyBAQAogICogY2FsbGVkIGZyb20gY3NfbWFuYWdlX21hdGNoZXMoKQogICovCiAgICAgc3RhdGljIHZvaWQKLWNzX3ByaW50X3RhZ3NfcHJpdihtYXRjaGVzLCBjbnR4dHMsIG51bV9tYXRjaGVzKQotICAgIGNoYXIgKiptYXRjaGVzOwotICAgIGNoYXIgKipjbnR4dHM7Ci0gICAgaW50IG51bV9tYXRjaGVzOworY3NfcHJpbnRfdGFnc19wcml2KGNoYXIgKiptYXRjaGVzLCBjaGFyICoqY250eHRzLCBpbnQgbnVtX21hdGNoZXMpCiB7CiAgICAgY2hhcgkqYnVmID0gTlVMTDsKICAgICBjaGFyCSp0X2J1ZjsKQEAgLTIyMTIsOCArMjE4NCw3IEBACiAgKiByZWFkIGEgY3Njb3BlIHByb21wdCAoYmFzaWNhbGx5LCBza2lwIG92ZXIgdGhlICI+PiAiKQogICovCiAgICAgc3RhdGljIGludAotY3NfcmVhZF9wcm9tcHQoaSkKLSAgICBpbnQgaTsKK2NzX3JlYWRfcHJvbXB0KGludCBpKQogewogICAgIGludAkJY2g7CiAgICAgY2hhcgkqYnVmID0gTlVMTDsgLyogYnVmZmVyIGZvciBwb3NzaWJsZSBlcnJvciBtZXNzYWdlIGZyb20gY3Njb3BlICovCkBAIC0yMzEyLDkgKzIyODMsNyBAQAogICogb3Igbm90IHRvIGZyZWUgdGhlIGZpbGVuYW1lLiAgQ2FsbGVkIGJ5IGNzX2tpbGwgYW5kIGNzX3Jlc2V0LgogICovCiAgICAgc3RhdGljIHZvaWQKLWNzX3JlbGVhc2VfY3NwKGksIGZyZWVmbnBwKQotICAgIGludCBpOwotICAgIGludCBmcmVlZm5wcDsKK2NzX3JlbGVhc2VfY3NwKGludCBpLCBpbnQgZnJlZWZucHApCiB7CiAgICAgLyoKICAgICAgKiBUcnlpbmcgdG8gZXhpdCBub3JtYWxseSAobm90IHN1cmUgd2hldGhlciBpdCBpcyBmaXQgdG8gVU5JWCBjc2NvcGUKQEAgLTI0NDEsOCArMjQxMCw3IEBACiAgKiBjYWxscyBjc19raWxsIG9uIGFsbCBjc2NvcGUgY29ubmVjdGlvbnMgdGhlbiByZWluaXRzCiAgKi8KICAgICBzdGF0aWMgaW50Ci1jc19yZXNldChlYXApCi0gICAgZXhhcmdfVCAqZWFwIFVOVVNFRDsKK2NzX3Jlc2V0KGV4YXJnX1QgKmVhcCBVTlVTRUQpCiB7CiAgICAgY2hhcgkqKmRibGlzdCA9IE5VTEwsICoqcHBsaXN0ID0gTlVMTCwgKipmbGxpc3QgPSBOVUxMOwogICAgIGludAlpOwpAQCAtMjUxNCw5ICsyNDgyLDcgQEAKICAqIENvbnRyYXN0IHRoaXMgd2l0aCBteSBkZXZlbG9wbWVudCBzeXN0ZW0gKERpZ2l0YWwgVW5peCksIHdoaWNoIGRvZXMuCiAgKi8KICAgICBzdGF0aWMgY2hhciAqCi1jc19yZXNvbHZlX2ZpbGUoaSwgbmFtZSkKLSAgICBpbnQgIGk7Ci0gICAgY2hhciAqbmFtZTsKK2NzX3Jlc29sdmVfZmlsZShpbnQgaSwgY2hhciAqbmFtZSkKIHsKICAgICBjaGFyCSpmdWxsbmFtZTsKICAgICBpbnQJCWxlbjsKQEAgLTI1ODAsOCArMjU0Niw3IEBACiAgKiBzaG93IGFsbCBjc2NvcGUgY29ubmVjdGlvbnMKICAqLwogICAgIHN0YXRpYyBpbnQKLWNzX3Nob3coZWFwKQotICAgIGV4YXJnX1QgKmVhcCBVTlVTRUQ7Citjc19zaG93KGV4YXJnX1QgKmVhcCBVTlVTRUQpCiB7CiAgICAgc2hvcnQgaTsKICAgICBpZiAoY3NfY250X2Nvbm5lY3Rpb25zKCkgPT0gMCkKQEAgLTI2MTYsNyArMjU4MSw3IEBACiAgKiBPbmx5IGNhbGxlZCB3aGVuIFZJTSBleGl0cyB0byBxdWl0IGFueSBjc2NvcGUgc2Vzc2lvbnMuCiAgKi8KICAgICB2b2lkCi1jc19lbmQoKQorY3NfZW5kKHZvaWQpCiB7CiAgICAgaW50IGk7CiAKZGlmZiAtLWdpdCBhL3NyYy9pZl9tenNjaC5jIGIvc3JjL2lmX216c2NoLmMKaW5kZXggNGYwODU3Ny4uZjI5MWRhNyAxMDA2NDQKLS0tIGEvc3JjL2lmX216c2NoLmMKKysrIGIvc3JjL2lmX216c2NoLmMKQEAgLTM3NDksNyArMzc0OSw3IEBACiB9CiAKICAgICBzdGF0aWMgdm9pZAotbWFrZV9tb2R1bGVzKCkKK21ha2VfbW9kdWxlcyh2b2lkKQogewogICAgIGludAkJICAgIGk7CiAgICAgU2NoZW1lX0VudgkgICAgKm1vZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvaWZfcGVybHNmaW8uYyBiL3NyYy9pZl9wZXJsc2Zpby5jCmluZGV4IDBhZTFiOTUuLmQyOWU2ZDcgMTAwNjQ0Ci0tLSBhL3NyYy9pZl9wZXJsc2Zpby5jCisrKyBiL3NyYy9pZl9wZXJsc2Zpby5jCkBAIC0yNSwxMSArMjUsMTEgQEAKICNkZWZpbmUgTklMKHR5cGUpCSgodHlwZSkwKQogCiAgICAgc3RhdGljIGludAotc2Z2aW13cml0ZShmLCBidWYsIG4sIGRpc2MpCi0gICAgU2Zpb190CSAgICAqZjsJCS8qIHN0cmVhbSBpbnZvbHZlZCAqLwotICAgIGNoYXIJICAgICpidWY7CS8qIGJ1ZmZlciB0byByZWFkIGZyb20gKi8KLSAgICBpbnQJCSAgICBuOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCi0gICAgU2ZkaXNjX3QJICAgICpkaXNjOwkvKiBkaXNjaXBsaW5lICovCitzZnZpbXdyaXRlKAorICAgIFNmaW9fdAkgICAgKmYsCQkvKiBzdHJlYW0gaW52b2x2ZWQgKi8KKyAgICBjaGFyCSAgICAqYnVmLAkvKiBidWZmZXIgdG8gcmVhZCBmcm9tICovCisgICAgaW50CQkgICAgbiwJCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworICAgIFNmZGlzY190CSAgICAqZGlzYykJLyogZGlzY2lwbGluZSAqLwogewogICAgIGNoYXJfdSAqc3RyOwogCkBAIC00Nyw3ICs0Nyw3IEBACiAgKiAgQ3JlYXRlIFZpbSBkaXNjaXBsaW5lCiAgKi8KICAgICBTZmRpc2NfdCAqCi1zZmRjbmV3dmltKCkKK3NmZGNuZXd2aW0odm9pZCkKIHsKICAgICBTZmRpc2NfdAkqZGlzYzsKIApkaWZmIC0tZ2l0IGEvc3JjL2lmX3B5dGhvbi5jIGIvc3JjL2lmX3B5dGhvbi5jCmluZGV4IDRmMDI4ZTUuLjQzYzg5OTIgMTAwNjQ0Ci0tLSBhL3NyYy9pZl9weXRob24uYworKysgYi9zcmMvaWZfcHl0aG9uLmMKQEAgLTg2MSw3ICs4NjEsNyBAQAogI2VuZGlmCiAKICAgICB2b2lkCi1weXRob25fZW5kKCkKK3B5dGhvbl9lbmQodm9pZCkKIHsKICAgICBzdGF0aWMgaW50IHJlY3Vyc2UgPSAwOwogCkBAIC04OTksNyArODk5LDcgQEAKIAogI2lmIChkZWZpbmVkKERZTkFNSUNfUFlUSE9OKSAmJiBkZWZpbmVkKEZFQVRfUFlUSE9OMykpIHx8IGRlZmluZWQoUFJPVE8pCiAgICAgaW50Ci1weXRob25fbG9hZGVkKCkKK3B5dGhvbl9sb2FkZWQodm9pZCkKIHsKICAgICByZXR1cm4gKGhpbnN0UHl0aG9uICE9IDApOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2lmX3B5dGhvbjMuYyBiL3NyYy9pZl9weXRob24zLmMKaW5kZXggZWMxNzU0Ny4uNTY5YWNhOCAxMDA2NDQKLS0tIGEvc3JjL2lmX3B5dGhvbjMuYworKysgYi9zcmMvaWZfcHl0aG9uMy5jCkBAIC02OTUsNyArNjk1LDcgQEAKIHN0YXRpYyB2b2lkIGdldF9weTNfZXhjZXB0aW9ucyh2b2lkKTsKIAogICAgIHN0YXRpYyB2b2lkCi1nZXRfcHkzX2V4Y2VwdGlvbnMoKQorZ2V0X3B5M19leGNlcHRpb25zKHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKmV4bW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJidWlsdGlucyIpOwogICAgIFB5T2JqZWN0ICpleGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KGV4bW9kKTsKQEAgLTgwMCw3ICs4MDAsNyBAQAogICovCiAKICAgICB2b2lkCi1weXRob24zX2VuZCgpCitweXRob24zX2VuZCh2b2lkKQogewogICAgIHN0YXRpYyBpbnQgcmVjdXJzZSA9IDA7CiAKQEAgLTgzMCw3ICs4MzAsNyBAQAogCiAjaWYgKGRlZmluZWQoRFlOQU1JQ19QWVRIT04zKSAmJiBkZWZpbmVkKERZTkFNSUNfUFlUSE9OKSAmJiBkZWZpbmVkKEZFQVRfUFlUSE9OKSAmJiBkZWZpbmVkKFVOSVgpKSB8fCBkZWZpbmVkKFBST1RPKQogICAgIGludAotcHl0aG9uM19sb2FkZWQoKQorcHl0aG9uM19sb2FkZWQodm9pZCkKIHsKICAgICByZXR1cm4gKGhpbnN0UHkzICE9IDApOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2lmX3J1YnkuYyBiL3NyYy9pZl9ydWJ5LmMKaW5kZXggYmIzNGRlMS4uY2FkNmZkMSAxMDA2NDQKLS0tIGEvc3JjL2lmX3J1YnkuYworKysgYi9zcmMvaWZfcnVieS5jCkBAIC02MjUsNyArNjI1LDcgQEAKICAqIEZyZWUgcnVieS5kbGwKICAqLwogICAgIHN0YXRpYyB2b2lkCi1lbmRfZHluYW1pY19ydWJ5KCkKK2VuZF9keW5hbWljX3J1Ynkodm9pZCkKIHsKICAgICBpZiAoaGluc3RSdWJ5KQogICAgIHsKQEAgLTY3NCwxNSArNjc0LDE0IEBACiAgKiBlbHNlIEZBTFNFLgogICovCiAgICAgaW50Ci1ydWJ5X2VuYWJsZWQodmVyYm9zZSkKLSAgICBpbnQJCXZlcmJvc2U7CitydWJ5X2VuYWJsZWQoaW50IHZlcmJvc2UpCiB7CiAgICAgcmV0dXJuIHJ1YnlfcnVudGltZV9saW5rX2luaXQoKGNoYXIgKilwX3J1YnlkbGwsIHZlcmJvc2UpID09IE9LOwogfQogI2VuZGlmIC8qIGRlZmluZWQoRFlOQU1JQ19SVUJZKSB8fCBkZWZpbmVkKFBST1RPKSAqLwogCiAgICAgdm9pZAotcnVieV9lbmQoKQorcnVieV9lbmQodm9pZCkKIHsKICNpZmRlZiBEWU5BTUlDX1JVQlkKICAgICBlbmRfZHluYW1pY19ydWJ5KCk7CkBAIC0xMTE1LDEyICsxMTE0LDEyIEBACiAgICAgcmV0dXJuIGJ1ZjsKIH0KIAotc3RhdGljIFZBTFVFIGJ1ZmZlcl9zX2N1cnJlbnQoKQorc3RhdGljIFZBTFVFIGJ1ZmZlcl9zX2N1cnJlbnQodm9pZCkKIHsKICAgICByZXR1cm4gYnVmZmVyX25ldyhjdXJidWYpOwogfQogCi1zdGF0aWMgVkFMVUUgYnVmZmVyX3NfY291bnQoKQorc3RhdGljIFZBTFVFIGJ1ZmZlcl9zX2NvdW50KHZvaWQpCiB7CiAgICAgYnVmX1QgKmI7CiAgICAgaW50IG4gPSAwOwpAQCAtMTM1Nyw3ICsxMzU2LDcgQEAKICAgICByZXR1cm4gd2luOwogfQogCi1zdGF0aWMgVkFMVUUgd2luZG93X3NfY3VycmVudCgpCitzdGF0aWMgVkFMVUUgd2luZG93X3NfY3VycmVudCh2b2lkKQogewogICAgIHJldHVybiB3aW5kb3dfbmV3KGN1cndpbik7CiB9CkBAIC0xMzY2LDcgKzEzNjUsNyBAQAogICogQWRkZWQgbGluZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zCiAgKiAgICBTZWdQaGF1bHQgLSAwMy8wNy8wNQogICovCi1zdGF0aWMgVkFMVUUgbGluZV9zX2N1cnJlbnQoKQorc3RhdGljIFZBTFVFIGxpbmVfc19jdXJyZW50KHZvaWQpCiB7CiAgICAgcmV0dXJuIGdldF9idWZmZXJfbGluZShjdXJidWYsIGN1cndpbi0+d19jdXJzb3IubG51bSk7CiB9CkBAIC0xMzc2LDE0ICsxMzc1LDE0IEBACiAgICAgcmV0dXJuIHNldF9idWZmZXJfbGluZShjdXJidWYsIGN1cndpbi0+d19jdXJzb3IubG51bSwgc3RyKTsKIH0KIAotc3RhdGljIFZBTFVFIGN1cnJlbnRfbGluZV9udW1iZXIoKQorc3RhdGljIFZBTFVFIGN1cnJlbnRfbGluZV9udW1iZXIodm9pZCkKIHsKICAgICByZXR1cm4gSU5UMkZJWCgoaW50KWN1cndpbi0+d19jdXJzb3IubG51bSk7CiB9CiAKIAogCi1zdGF0aWMgVkFMVUUgd2luZG93X3NfY291bnQoKQorc3RhdGljIFZBTFVFIHdpbmRvd19zX2NvdW50KHZvaWQpCiB7CiAjaWZkZWYgRkVBVF9XSU5ET1dTCiAgICAgd2luX1QJKnc7CmRpZmYgLS1naXQgYS9zcmMvaWZfc25pZmYuYyBiL3NyYy9pZl9zbmlmZi5jCmluZGV4IDE0MzUzZjIuLjg1YzQ3NTUgMTAwNjQ0Ci0tLSBhL3NyYy9pZl9zbmlmZi5jCisrKyBiL3NyYy9pZl9zbmlmZi5jCkBAIC00MDQsNyArNDA0LDcgQEAKICAqIHRvIHByb2Nlc3MgdGhlIHdhaXRpbmcgc25pZmYgcmVxdWVzdHMKICAqLwogICAgIHZvaWQKLVByb2Nlc3NTbmlmZlJlcXVlc3RzKCkKK1Byb2Nlc3NTbmlmZlJlcXVlc3RzKHZvaWQpCiB7CiAgICAgc3RhdGljIGNoYXIgYnVmW01BWF9SRVFVRVNUX0xFTl07CiAgICAgaW50IGxlbjsKQEAgLTQzMyw4ICs0MzMsNyBAQAogfQogCiAgICAgc3RhdGljIHN0cnVjdCBzbl9jbWQgKgotZmluZF9zbmlmZl9jbWQoY21kKQotICAgIGNoYXIgKmNtZDsKK2ZpbmRfc25pZmZfY21kKGNoYXIgKmNtZCkKIHsKICAgICBzdHJ1Y3Qgc25fY21kICpzbmlmZl9jbWQgPSBOVUxMOwogICAgIGludCBpOwpAQCAtNDYzLDEwICs0NjIsNyBAQAogfQogCiAgICAgc3RhdGljIGludAotYWRkX3NuaWZmX2NtZChjbWQsIGRlZiwgbXNnKQotICAgIGNoYXIgKmNtZDsKLSAgICBjaGFyICpkZWY7Ci0gICAgY2hhciAqbXNnOworYWRkX3NuaWZmX2NtZChjaGFyICpjbWQsIGNoYXIgKmRlZiwgY2hhciAqbXNnKQogewogICAgIGludCByYyA9IDA7CiAgICAgaWYgKGRlZiAhPSBOVUxMICYmIGRlZlswXSAhPSBOVUwgJiYgZmluZF9zbmlmZl9jbWQoY21kKSA9PSBOVUxMKQpAQCAtNTI2LDggKzUyMiw3IEBACiAgKiBIYW5kbGUgIjpzbmlmZiIgY29tbWFuZAogICovCiAgICAgdm9pZAotZXhfc25pZmYoZWFwKQotICAgIGV4YXJnX1QJKmVhcDsKK2V4X3NuaWZmKGV4YXJnX1QgKmVhcCkKIHsKICAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnOwogICAgIGNoYXJfdSAqc3ltYm9sID0gTlVMTDsKQEAgLTU5Myw3ICs1ODgsNyBAQAogCiAKICAgICBzdGF0aWMgdm9pZAotc25pZmZfY29ubmVjdCgpCitzbmlmZl9jb25uZWN0KHZvaWQpCiB7CiAgICAgaWYgKHNuaWZmX2Nvbm5lY3RlZCkKIAlyZXR1cm47CkBAIC02MDksOCArNjA0LDcgQEAKIH0KIAogICAgIHZvaWQKLXNuaWZmX2Rpc2Nvbm5lY3QoaW1tZWRpYXRlbHkpCi0gICAgaW50IGltbWVkaWF0ZWx5Oworc25pZmZfZGlzY29ubmVjdChpbnQgaW1tZWRpYXRlbHkpCiB7CiAgICAgaWYgKCFzbmlmZl9jb25uZWN0ZWQpCiAJcmV0dXJuOwpAQCAtNjc0LDcgKzY2OCw3IEBACiAgKiBDb25uZWN0IHRvIFNuaWZmOiByZXR1cm5zIDEgb24gZXJyb3IKICAqLwogICAgIHN0YXRpYyBpbnQKLUNvbm5lY3RUb1NuaWZmRW1hY3MoKQorQ29ubmVjdFRvU25pZmZFbWFjcyh2b2lkKQogewogI2lmZGVmIFdJTjMyCQkvKiBXaW5kb3dzIFZlcnNpb24gb2YgdGhlIENvZGUgKi8KICAgICBIQU5ETEUgVG9TbmlmZkVtYWNzWzJdLCBGcm9tU25pZmZFbWFjc1syXTsKQEAgLTc3Myw4ICs3NjcsNyBAQAogICogSGFuZGxlIG9uZSByZXF1ZXN0IGZyb20gU05pRkYrCiAgKi8KICAgICBzdGF0aWMgdm9pZAotSGFuZGxlU25pZmZSZXF1ZXN0KGJ1ZmZlcikKLSAgICBjaGFyICpidWZmZXI7CitIYW5kbGVTbmlmZlJlcXVlc3QoY2hhciAqYnVmZmVyKQogewogICAgIGNoYXIgVklDb21tYW5kW01BWF9SRVFVRVNUX0xFTl07CiAgICAgY2hhciBjb21tYW5kOwpAQCAtOTQyLDEwICs5MzUsNyBAQAogICoJICAgPDAgb24gZXJyb3IKICAqLwogICAgIHN0YXRpYyBpbnQKLWdldF9yZXF1ZXN0KGZkLCBidWYsIG1heGxlbikKLSAgICBpbnQJCWZkOwotICAgIGNoYXIJKmJ1ZjsKLSAgICBpbnQJCW1heGxlbjsKK2dldF9yZXF1ZXN0KGludCBmZCwgY2hhciAqYnVmLCBpbnQgbWF4bGVuKQogewogICAgIHN0YXRpYyBjaGFyCWluYnVmWzEwMjRdOwogICAgIHN0YXRpYyBpbnQJcG9zID0gMCwgYnl0ZXMgPSAwOwpAQCAtOTk3LDkgKzk4Nyw3IEBACiAKIAogICAgIHN0YXRpYyB2b2lkCi1TZW5kUmVxdWVzdChjb21tYW5kLCBzeW1ib2wpCi0gICAgc3RydWN0IHNuX2NtZCAqY29tbWFuZDsKLSAgICBjaGFyICpzeW1ib2w7CitTZW5kUmVxdWVzdChzdHJ1Y3Qgc25fY21kICpjb21tYW5kLCBjaGFyICpzeW1ib2wpCiB7CiAgICAgaW50CQljbWRfdHlwZSA9IGNvbW1hbmQtPmNtZF90eXBlOwogICAgIHN0YXRpYyBjaGFyIGNtZHN0cltNQVhfUkVRVUVTVF9MRU5dOwpAQCAtMTA3NCw4ICsxMDYyLDcgQEAKIAogCiAgICAgc3RhdGljIHZvaWQKLVdyaXRlVG9TbmlmZihzdHIpCi0gICAgY2hhciAqc3RyOworV3JpdGVUb1NuaWZmKGNoYXIgKnN0cikKIHsKICAgICBpbnQgYnl0ZXM7CiAjaWZkZWYgV0lOMzIKQEAgLTEwOTcsMjQgKzEwODQsMjEgQEAKIC8qLS0tLS0tLS0gdmltIGhlbHBpbmcgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogICAgIHN0YXRpYyB2b2lkCi12aV9tc2coc3RyKQotICAgIGNoYXIgKnN0cjsKK3ZpX21zZyhjaGFyICpzdHIpCiB7CiAgICAgaWYgKHN0ciAhPSBOVUxMICYmICpzdHIgIT0gTlVMKQogCU1TRygoY2hhcl91ICopc3RyKTsKIH0KIAogICAgIHN0YXRpYyB2b2lkCi12aV9lcnJvcl9tc2coc3RyKQotICAgIGNoYXIgKnN0cjsKK3ZpX2Vycm9yX21zZyhjaGFyICpzdHIpCiB7CiAgICAgaWYgKHN0ciAhPSBOVUxMICYmICpzdHIgIT0gTlVMKQogCUVNU0coKGNoYXJfdSAqKXN0cik7CiB9CiAKICAgICBzdGF0aWMgdm9pZAotdmlfb3Blbl9maWxlKGZuYW1lKQotICAgIGNoYXIgKmZuYW1lOwordmlfb3Blbl9maWxlKGNoYXIgKmZuYW1lKQogewogICAgICsrbm9fd2FpdF9yZXR1cm47CiAgICAgZG9fZWNtZCgwLCAoY2hhcl91ICopZm5hbWUsIE5VTEwsIE5VTEwsIEVDTURfT05FLCBFQ01EX0hJREUrRUNNRF9PTERCVUYsCkBAIC0xMTI0LDggKzExMDgsNyBAQAogfQogCiAgICAgc3RhdGljIGJ1Zl9UICoKLXZpX2ZpbmRfYnVmZmVyKGZuYW1lKQotICAgIGNoYXIgKmZuYW1lOwordmlfZmluZF9idWZmZXIoY2hhciAqZm5hbWUpCiB7CQkJICAgIC8qIGRlcml2ZWQgZnJvbSBidWZsaXN0X2ZpbmRuYW1lKCkgW2J1ZmZlci5jXSAqLwogICAgIGJ1Zl9UCSpidWY7CiAKQEAgLTExMzcsNyArMTEyMCw3IEBACiAKIAogICAgIHN0YXRpYyBjaGFyICoKLXZpX3N5bWJvbF91bmRlcl9jdXJzb3IoKQordmlfc3ltYm9sX3VuZGVyX2N1cnNvcih2b2lkKQogewogICAgIGludAkJbGVuOwogICAgIGNoYXIJKnN5bWJvbHA7CkBAIC0xMTU2LDE0ICsxMTM5LDEzIEBACiAKIAogICAgIHN0YXRpYyBjaGFyICoKLXZpX2J1ZmZlcl9uYW1lKCkKK3ZpX2J1ZmZlcl9uYW1lKHZvaWQpCiB7CiAgICAgcmV0dXJuIChjaGFyICopY3VyYnVmLT5iX3NmbmFtZTsKIH0KIAogICAgIHN0YXRpYyB2b2lkCi12aV9leGVjX2NtZCh2aWNtZCkKLSAgICBjaGFyICp2aWNtZDsKK3ZpX2V4ZWNfY21kKGNoYXIgKnZpY21kKQogewogICAgIGRvX2NtZGxpbmVfY21kKChjaGFyX3UgKil2aWNtZCk7ICAvKiBbZXhfZG9jbWQuY10gKi8KIH0KQEAgLTExNzMsOCArMTE1NSw3IEBACiAgKiBkZXJpdmVkIGZyb20gY3Vyc29yX3Bvc19pbmZvKCkgW2J1ZmZlci5jXQogICovCiAgICAgc3RhdGljIHZvaWQKLXZpX3NldF9jdXJzb3JfcG9zKGNoYXJfcG9zKQotICAgIGxvbmcgY2hhcl9wb3M7Cit2aV9zZXRfY3Vyc29yX3Bvcyhsb25nIGNoYXJfcG9zKQogewogICAgIGxpbmVucl9UCWxudW07CiAgICAgbG9uZwljaGFyX2NvdW50ID0gMTsgIC8qIGZpcnN0IHBvc2l0aW9uID0gMSAqLwpAQCAtMTIwMCw3ICsxMTgxLDcgQEAKIH0KIAogICAgIHN0YXRpYyBsb25nCi12aV9jdXJzb3JfcG9zKCkKK3ZpX2N1cnNvcl9wb3Modm9pZCkKIHsKICAgICBsaW5lbnJfVAlsbnVtOwogICAgIGxvbmcJY2hhcl9jb3VudD0xOyAgLyogc25pZmYgc3RhcnRzIHdpdGggcG9zIDEgKi8KZGlmZiAtLWdpdCBhL3NyYy9pZl90Y2wuYyBiL3NyYy9pZl90Y2wuYwppbmRleCA5ZmI1YzM0Li4zZWYxNTQ0IDEwMDY0NAotLS0gYS9zcmMvaWZfdGNsLmMKKysrIGIvc3JjL2lmX3RjbC5jCkBAIC0yMzcsOCArMjM3LDcgQEAKICNlbmRpZgogCiAgICAgdm9pZAotdmltX3RjbF9pbml0KGFyZykKLSAgICBjaGFyCSphcmc7Cit2aW1fdGNsX2luaXQoY2hhciAqYXJnKQogewogI2lmbmRlZiBEWU5BTUlDX1RDTAogICAgIFRjbF9GaW5kRXhlY3V0YWJsZShhcmcpOwpAQCAtMjU1LDggKzI1NCw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB0aGUgVENMIGludGVyZmFjZSBjYW4gYmUgdXNlZC4KICAqLwogICAgIGludAotdGNsX2VuYWJsZWQodmVyYm9zZSkKLSAgICBpbnQJCXZlcmJvc2U7Cit0Y2xfZW5hYmxlZChpbnQgdmVyYm9zZSkKIHsKICAgICBpZiAoIXN0dWJzX2luaXRpYWxpemVkICYmIGZpbmRfZXhlY3V0YWJsZV9hcmcgIT0gTlVMTAogCSAgICAmJiB0Y2xfcnVudGltZV9saW5rX2luaXQoKGNoYXIgKilwX3RjbGRsbCwgdmVyYm9zZSkgPT0gT0spCkBAIC0yODAsNyArMjc4LDcgQEAKICNlbmRpZgogCiAgICAgdm9pZAotdGNsX2VuZCgpCit0Y2xfZW5kKHZvaWQpCiB7CiAjaWZkZWYgRFlOQU1JQ19UQ0wKICAgICBpZiAoaFRjbExpYikKQEAgLTMxMCwxMSArMzA4LDExIEBACiAgKiB1c2VsZXNzIGZvciB0aGlzIHJvdXRpbmUgdG8gcmV0dXJuIHRoZSBleGl0IGNvZGUgdmlhIFRjbF9TZXRSZXN1bHQoKS4KICAqLwogICAgIHN0YXRpYyBpbnQKLWV4aXRjbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKLSAgICBDbGllbnREYXRhIGR1bW15IFVOVVNFRDsKLSAgICBUY2xfSW50ZXJwICppbnRlcnA7Ci0gICAgaW50IG9iamM7Ci0gICAgVGNsX09iaiAqQ09OU1Qgb2JqdltdOworZXhpdGNtZCgKKyAgICBDbGllbnREYXRhIGR1bW15IFVOVVNFRCwKKyAgICBUY2xfSW50ZXJwICppbnRlcnAsCisgICAgaW50IG9iamMsCisgICAgVGNsX09iaiAqQ09OU1Qgb2JqdltdKQogewogICAgIGludCB2YWx1ZSA9IDA7CiAKQEAgLTMzOSwxMSArMzM3LDExIEBACiAgKiAgIjo6dmltOjpiZWVwIiAtIHdoYXQgVmlbbV0gZG9lcyBiZXN0IDotKQogICovCiAgICAgc3RhdGljIGludAotYmVlcGNtZChkdW1teSwgaW50ZXJwLCBvYmpjLCBvYmp2KQotICAgIENsaWVudERhdGEgZHVtbXkgVU5VU0VEOwotICAgIFRjbF9JbnRlcnAgKmludGVycDsKLSAgICBpbnQgb2JqYzsKLSAgICBUY2xfT2JqICpDT05TVCBvYmp2W107CitiZWVwY21kKAorICAgIENsaWVudERhdGEgZHVtbXkgVU5VU0VELAorICAgIFRjbF9JbnRlcnAgKmludGVycCwKKyAgICBpbnQgb2JqYywKKyAgICBUY2xfT2JqICpDT05TVCBvYmp2W10pCiB7CiAgICAgaWYgKG9iamMgIT0gMSkKICAgICB7CkBAIC0zNjEsMTEgKzM1OSwxMSBAQAogICogICI6OnZpbTo6YnVmZmVyIG5ldyIgLSBjcmVhdGUgYSBuZXcgYnVmZmVyIChub3QgaW1wbGVtZW50ZWQpCiAgKi8KICAgICBzdGF0aWMgaW50Ci1idWZmZXJjbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKLSAgICBDbGllbnREYXRhIGR1bW15IFVOVVNFRDsKLSAgICBUY2xfSW50ZXJwICppbnRlcnA7Ci0gICAgaW50IG9iamM7Ci0gICAgVGNsX09iaiAqQ09OU1Qgb2JqdltdOworYnVmZmVyY21kKAorICAgIENsaWVudERhdGEgZHVtbXkgVU5VU0VELAorICAgIFRjbF9JbnRlcnAgKmludGVycCwKKyAgICBpbnQgb2JqYywKKyAgICBUY2xfT2JqICpDT05TVCBvYmp2W10pCiB7CiAgICAgY2hhcgkqbmFtZTsKICAgICBidWZfVAkqYnVmOwpAQCAtNDU3LDExICs0NTUsMTEgQEAKICAqICI6OnZpbTo6d2luZG93IGxpc3QiIC0gY3JlYXRlIGxpc3Qgb2Ygd2luZG93IGNvbW1hbmRzLgogICovCiAgICAgc3RhdGljIGludAotd2luZG93Y21kKGR1bW15LCBpbnRlcnAsIG9iamMsIG9ianYpCi0gICAgQ2xpZW50RGF0YQlkdW1teSBVTlVTRUQ7Ci0gICAgVGNsX0ludGVycAkqaW50ZXJwOwotICAgIGludAkJb2JqYzsKLSAgICBUY2xfT2JqCSpDT05TVCBvYmp2W107Cit3aW5kb3djbWQoCisgICAgQ2xpZW50RGF0YQlkdW1teSBVTlVTRUQsCisgICAgVGNsX0ludGVycAkqaW50ZXJwLAorICAgIGludAkJb2JqYywKKyAgICBUY2xfT2JqCSpDT05TVCBvYmp2W10pCiB7CiAgICAgY2hhcgkqd2hhdCwgKnN0cmluZzsKICAgICB3aW5fVAkqd2luOwpAQCAtNDk4LDExICs0OTYsMTEgQEAKICAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgYnVmZmVyIGNvbW1hbmRzLgogICovCiAgICAgc3RhdGljIGludAotYnVmc2VsZmNtZChyZWYsIGludGVycCwgb2JqYywgb2JqdikKLSAgICBDbGllbnREYXRhCXJlZjsKLSAgICBUY2xfSW50ZXJwCSppbnRlcnA7Ci0gICAgaW50CQlvYmpjOwotICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXTsKK2J1ZnNlbGZjbWQoCisgICAgQ2xpZW50RGF0YQlyZWYsCisgICAgVGNsX0ludGVycAkqaW50ZXJwLAorICAgIGludAkJb2JqYywKKyAgICBUY2xfT2JqCSpDT05TVCBvYmp2W10pCiB7CiAgICAgaW50CQlvcHQsIGVyciwgaWR4LCBmbGFnczsKICAgICBpbnQJCXZhbDEsIHZhbDIsIG4sIGk7CkBAIC05MzcsMTEgKzkzNSwxMSBAQAogICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB3aW5kb3cgY29tbWFuZHMuCiAgKi8KICAgICBzdGF0aWMgaW50Ci13aW5zZWxmY21kKHJlZiwgaW50ZXJwLCBvYmpjLCBvYmp2KQotICAgIENsaWVudERhdGEJcmVmOwotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICBpbnQJCW9iamM7Ci0gICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOword2luc2VsZmNtZCgKKyAgICBDbGllbnREYXRhCXJlZiwKKyAgICBUY2xfSW50ZXJwCSppbnRlcnAsCisgICAgaW50CQlvYmpjLAorICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXSkKIHsKICAgICBpbnQJCWVyciwgaWR4LCBmbGFnczsKICAgICBpbnQJCXZhbDEsIHZhbDI7CkBAIC0xMTExLDExICsxMTA5LDExIEBACiAKIAogICAgIHN0YXRpYyBpbnQKLWNvbW1hbmRjbWQoZHVtbXksIGludGVycCwgb2JqYywgb2JqdikKLSAgICBDbGllbnREYXRhCWR1bW15IFVOVVNFRDsKLSAgICBUY2xfSW50ZXJwCSppbnRlcnA7Ci0gICAgaW50CQlvYmpjOwotICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXTsKK2NvbW1hbmRjbWQoCisgICAgQ2xpZW50RGF0YQlkdW1teSBVTlVTRUQsCisgICAgVGNsX0ludGVycAkqaW50ZXJwLAorICAgIGludAkJb2JqYywKKyAgICBUY2xfT2JqCSpDT05TVCBvYmp2W10pCiB7CiAgICAgaW50CQllcnI7CiAKQEAgLTExMjUsMTEgKzExMjMsMTEgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLW9wdGlvbmNtZChkdW1teSwgaW50ZXJwLCBvYmpjLCBvYmp2KQotICAgIENsaWVudERhdGEJZHVtbXkgVU5VU0VEOwotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICBpbnQJCW9iamM7Ci0gICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOworb3B0aW9uY21kKAorICAgIENsaWVudERhdGEJZHVtbXkgVU5VU0VELAorICAgIFRjbF9JbnRlcnAJKmludGVycCwKKyAgICBpbnQJCW9iamMsCisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdKQogewogICAgIGludAkJZXJyOwogCkBAIC0xMTM5LDExICsxMTM3LDExIEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1leHByY21kKGR1bW15LCBpbnRlcnAsIG9iamMsIG9ianYpCi0gICAgQ2xpZW50RGF0YQlkdW1teSBVTlVTRUQ7Ci0gICAgVGNsX0ludGVycAkqaW50ZXJwOwotICAgIGludAkJb2JqYzsKLSAgICBUY2xfT2JqCSpDT05TVCBvYmp2W107CitleHByY21kKAorICAgIENsaWVudERhdGEJZHVtbXkgVU5VU0VELAorICAgIFRjbF9JbnRlcnAJKmludGVycCwKKyAgICBpbnQJCW9iamMsCisgICAgVGNsX09iagkqQ09OU1Qgb2JqdltdKQogewogICAgIHJldHVybiB0Y2x2aW1leHByKGludGVycCwgb2JqYywgb2JqdiwgMSk7CiB9CkBAIC0xMTU2LDExICsxMTU0LDExIEBACiAgKiBHZXQgYSBsaW5lIG51bWJlciBmcm9tICdvYmonIGFuZCBjb252ZXJ0IGl0IHRvIHZpbSdzIHJhbmdlLgogICovCiAgICAgc3RhdGljIGludAotdGNsZ2V0bGluZW51bShpbnRlcnAsIG9iaiwgdmFsdWVQLCBidWYpCi0gICAgVGNsX0ludGVycAkqaW50ZXJwOwotICAgIFRjbF9PYmoJKm9iajsKLSAgICBpbnQJCSp2YWx1ZVA7Ci0gICAgYnVmX1QJKmJ1ZjsKK3RjbGdldGxpbmVudW0oCisgICAgVGNsX0ludGVycAkqaW50ZXJwLAorICAgIFRjbF9PYmoJKm9iaiwKKyAgICBpbnQJCSp2YWx1ZVAsCisgICAgYnVmX1QJKmJ1ZikKIHsKICAgICBpbnQgZXJyLCBpOwogCkBAIC0xMjA5LDggKzEyMDcsNyBAQAogICogRmluZCB0aGUgZmlyc3Qgd2luZG93IGluIHRoZSB3aW5kb3cgbGlzdCB0aGF0IGRpc3BsYXlzIHRoZSBidWZmZXIuCiAgKi8KICAgICBzdGF0aWMgd2luX1QgKgotdGNsZmluZHdpbihidWYpCi0gICAgYnVmX1QgKmJ1ZjsKK3RjbGZpbmR3aW4oYnVmX1QgKmJ1ZikKIHsKICAgICB3aW5fVCAqd2luOwogCkBAIC0xMjI2LDExICsxMjIzLDExIEBACiAgKiBEby1pdC1hbGwgZnVuY3Rpb24gZm9yICI6OnZpbTo6Y29tbWFuZCIsICIkYnVmIGNvbW1hbmQiIGFuZCAiJHdpbiBjb21tYW5kIi4KICAqLwogICAgIHN0YXRpYyBpbnQKLXRjbGRvZXhjb21tYW5kKGludGVycCwgb2JqYywgb2Jqdiwgb2JqbikKLSAgICBUY2xfSW50ZXJwCSppbnRlcnA7Ci0gICAgaW50CQlvYmpjOwotICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXTsKLSAgICBpbnQJCW9iam47Cit0Y2xkb2V4Y29tbWFuZCgKKyAgICBUY2xfSW50ZXJwCSppbnRlcnAsCisgICAgaW50CQlvYmpjLAorICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXSwKKyAgICBpbnQJCW9iam4pCiB7CiAgICAgdGNsX2luZm8Jc2F2ZWluZm87CiAgICAgaW50CQllcnIsIGZsYWcsIG5vYmpzOwpAQCAtMTI4NCwxMSArMTI4MSwxMSBAQAogICogRG8taXQtYWxsIGZ1bmN0aW9uIGZvciAiOjp2aW06Om9wdGlvbiIsICIkYnVmIG9wdGlvbiIgYW5kICIkd2luIG9wdGlvbiIuCiAgKi8KICAgICBzdGF0aWMgaW50Ci10Y2xzZXRvcHRpb24oaW50ZXJwLCBvYmpjLCBvYmp2LCBvYmpuKQotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICBpbnQJCW9iamM7Ci0gICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOwotICAgIGludAkJb2JqbjsKK3RjbHNldG9wdGlvbigKKyAgICBUY2xfSW50ZXJwCSppbnRlcnAsCisgICAgaW50CQlvYmpjLAorICAgIFRjbF9PYmoJKkNPTlNUIG9ianZbXSwKKyAgICBpbnQJCW9iam4pCiB7CiAgICAgaW50CQllcnIsIG5vYmpzLCBpZHg7CiAgICAgY2hhcl91CSpvcHRpb247CkBAIC0xMzY1LDExICsxMzYyLDExIEBACiAgKiBEby1pdC1hbGwgZnVuY3Rpb24gZm9yICI6OnZpbTo6ZXhwciIsICIkYnVmIGV4cHIiIGFuZCAiJHdpbiBleHByIi4KICAqLwogICAgIHN0YXRpYyBpbnQKLXRjbHZpbWV4cHIoaW50ZXJwLCBvYmpjLCBvYmp2LCBvYmpuKQotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICBpbnQJCW9iamM7Ci0gICAgVGNsX09iagkqQ09OU1Qgb2JqdltdOwotICAgIGludAkJb2JqbjsKK3RjbHZpbWV4cHIoCisgICAgVGNsX0ludGVycAkqaW50ZXJwLAorICAgIGludAkJb2JqYywKKyAgICBUY2xfT2JqCSpDT05TVCBvYmp2W10sCisgICAgaW50CQlvYmpuKQogewogI2lmZGVmIEZFQVRfRVZBTAogICAgIGNoYXIJKmV4cHIsICpzdHI7CkBAIC0xNDAyLDggKzEzOTksNyBAQAogICogQ2hlY2sgZm9yIGludGVybmFsIHZpbSBlcnJvcnMuCiAgKi8KICAgICBzdGF0aWMgaW50Ci12aW1lcnJvcihpbnRlcnApCi0gICAgVGNsX0ludGVycCAqaW50ZXJwOwordmltZXJyb3IoVGNsX0ludGVycCAqaW50ZXJwKQogewogICAgIGlmIChnb3RfaW50KQogICAgIHsKQEAgLTE0MjcsOCArMTQyMyw3IEBACiAgKiAgIHRjbHNldGRlbGNtZCgpIC0gYWRkIFRjbCBjYWxsYmFjayBjb21tYW5kIHRvIGEgdmltIG9iamVjdAogICovCiAgICAgc3RhdGljIHZvaWQKLWRlbHJlZihjcmVmKQotICAgIENsaWVudERhdGEgY3JlZjsKK2RlbHJlZihDbGllbnREYXRhIGNyZWYpCiB7CiAgICAgc3RydWN0IHJlZiAqcmVmID0gKHN0cnVjdCByZWYgKiljcmVmOwogCkBAIC0xNDQxLDEzICsxNDM2LDEzIEBACiB9CiAKICAgICBzdGF0aWMgY2hhciAqCi10Y2xnZXRyZWYoaW50ZXJwLCByZWZzdGFydFAsIHByZWZpeCwgdmltb2JqLCBwcm9jKQotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICB2b2lkCSoqcmVmc3RhcnRQOwkvKiBwdHIgdG8gd190Y2xfcmVmL2JfdGNsLXJlZiBtZW1iZXIgb2YKK3RjbGdldHJlZigKKyAgICBUY2xfSW50ZXJwCSppbnRlcnAsCisgICAgdm9pZAkqKnJlZnN0YXJ0UCwJLyogcHRyIHRvIHdfdGNsX3JlZi9iX3RjbC1yZWYgbWVtYmVyIG9mCiAJCQkJICAgd2luX1QvYnVmX1Qgc3RydWN0ICovCi0gICAgY2hhcgkqcHJlZml4OwkvKiAid2luIiBvciAiYnVmIiAqLwotICAgIHZvaWQJKnZpbW9iajsJLyogd2luX1QqIG9yIGJ1Zl9UKiAqLwotICAgIFRjbF9PYmpDbWRQcm9jICpwcm9jOwkvKiB3aW5zZWxmY21kIG9yIGJ1ZnNlbGZjbWQgKi8KKyAgICBjaGFyCSpwcmVmaXgsCS8qICJ3aW4iIG9yICJidWYiICovCisgICAgdm9pZAkqdmltb2JqLAkvKiB3aW5fVCogb3IgYnVmX1QqICovCisgICAgVGNsX09iakNtZFByb2MgKnByb2MpCS8qIHdpbnNlbGZjbWQgb3IgYnVmc2VsZmNtZCAqLwogewogICAgIHN0cnVjdCByZWYgKnJlZiwgKnVudXNlZCA9IE5VTEw7CiAgICAgc3RhdGljIGNoYXIgbmFtZVtWQVJOQU1FX1NJWkVdOwpAQCAtMTUwMSwyNyArMTQ5NiwyMyBAQAogfQogCiAgICAgc3RhdGljIGNoYXIgKgotdGNsZ2V0d2luZG93KGludGVycCwgd2luKQotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICB3aW5fVAkqd2luOwordGNsZ2V0d2luZG93KFRjbF9JbnRlcnAgKmludGVycCwgd2luX1QgKndpbikKIHsKICAgICByZXR1cm4gdGNsZ2V0cmVmKGludGVycCwgJih3aW4tPndfdGNsX3JlZiksICJ3aW4iLCAodm9pZCAqKXdpbiwgd2luc2VsZmNtZCk7CiB9CiAKICAgICBzdGF0aWMgY2hhciAqCi10Y2xnZXRidWZmZXIoaW50ZXJwLCBidWYpCi0gICAgVGNsX0ludGVycAkqaW50ZXJwOwotICAgIGJ1Zl9UCSpidWY7Cit0Y2xnZXRidWZmZXIoVGNsX0ludGVycCAqaW50ZXJwLCBidWZfVCAqYnVmKQogewogICAgIHJldHVybiB0Y2xnZXRyZWYoaW50ZXJwLCAmKGJ1Zi0+Yl90Y2xfcmVmKSwgImJ1ZiIsICh2b2lkICopYnVmLCBidWZzZWxmY21kKTsKIH0KIAogICAgIHN0YXRpYyBpbnQKLXRjbHNldGRlbGNtZChpbnRlcnAsIHJlZmxpc3QsIHZpbW9iaiwgZGVsY21kKQotICAgIFRjbF9JbnRlcnAJKmludGVycDsKLSAgICBzdHJ1Y3QgcmVmCSpyZWZsaXN0OwotICAgIHZvaWQJKnZpbW9iajsKLSAgICBUY2xfT2JqCSpkZWxjbWQ7Cit0Y2xzZXRkZWxjbWQoCisgICAgVGNsX0ludGVycAkqaW50ZXJwLAorICAgIHN0cnVjdCByZWYJKnJlZmxpc3QsCisgICAgdm9pZAkqdmltb2JqLAorICAgIFRjbF9PYmoJKmRlbGNtZCkKIHsKICAgICBpZiAocmVmbGlzdCA9PSAmcmVmc2RlbGV0ZWQpCiAgICAgewpAQCAtMTU1NSw5ICsxNTQ2LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgc3RhdGljIGludAotdGNsX2NoYW5uZWxfY2xvc2UoaW5zdGFuY2UsIGludGVycCkKLSAgICBDbGllbnREYXRhCWluc3RhbmNlOwotICAgIFRjbF9JbnRlcnAJKmludGVycCBVTlVTRUQ7Cit0Y2xfY2hhbm5lbF9jbG9zZShDbGllbnREYXRhIGluc3RhbmNlLCBUY2xfSW50ZXJwICppbnRlcnAgVU5VU0VEKQogewogICAgIGludAkJZXJyID0gMDsKIApAQCAtMTU3MiwxMSArMTU2MSwxMSBAQAogfQogCiAgICAgc3RhdGljIGludAotdGNsX2NoYW5uZWxfaW5wdXQoaW5zdGFuY2UsIGJ1ZiwgYnVmc2l6LCBlcnJwdHIpCi0gICAgQ2xpZW50RGF0YQlpbnN0YW5jZSBVTlVTRUQ7Ci0gICAgY2hhcgkqYnVmIFVOVVNFRDsKLSAgICBpbnQJCWJ1ZnNpeiBVTlVTRUQ7Ci0gICAgaW50CQkqZXJycHRyOwordGNsX2NoYW5uZWxfaW5wdXQoCisgICAgQ2xpZW50RGF0YQlpbnN0YW5jZSBVTlVTRUQsCisgICAgY2hhcgkqYnVmIFVOVVNFRCwKKyAgICBpbnQJCWJ1ZnNpeiBVTlVTRUQsCisgICAgaW50CQkqZXJycHRyKQogewogCiAgICAgLyogaW5wdXQgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgKi8KQEAgLTE1ODgsMTEgKzE1NzcsMTEgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLXRjbF9jaGFubmVsX291dHB1dChpbnN0YW5jZSwgYnVmLCBidWZzaXosIGVycnB0cikKLSAgICBDbGllbnREYXRhCWluc3RhbmNlOwotICAgIGNoYXIJKmJ1ZjsKLSAgICBpbnQJCWJ1ZnNpejsKLSAgICBpbnQJCSplcnJwdHI7Cit0Y2xfY2hhbm5lbF9vdXRwdXQoCisgICAgQ2xpZW50RGF0YQlpbnN0YW5jZSwKKyAgICBjb25zdCBjaGFyCSpidWYsCisgICAgaW50CQlidWZzaXosCisgICAgaW50CQkqZXJycHRyKQogewogICAgIGNoYXJfdQkqc3RyOwogICAgIGludAkJcmVzdWx0OwpAQCAtMTYyOCwxOCArMTYxNywxNiBAQAogfQogCiAgICAgc3RhdGljIHZvaWQKLXRjbF9jaGFubmVsX3dhdGNoKGluc3RhbmNlLCBtYXNrKQotICAgIENsaWVudERhdGEJaW5zdGFuY2UgVU5VU0VEOwotICAgIGludAkJbWFzayBVTlVTRUQ7Cit0Y2xfY2hhbm5lbF93YXRjaChDbGllbnREYXRhIGluc3RhbmNlIFVOVVNFRCwgaW50IG1hc2sgVU5VU0VEKQogewogICAgIFRjbF9TZXRFcnJubyhFSU5WQUwpOwogfQogCiAgICAgc3RhdGljIGludAotdGNsX2NoYW5uZWxfZ2V0aGFuZGxlKGluc3RhbmNlLCBkaXJlY3Rpb24sIGhhbmRsZXB0cikKLSAgICBDbGllbnREYXRhCWluc3RhbmNlIFVOVVNFRDsKLSAgICBpbnQJCWRpcmVjdGlvbiBVTlVTRUQ7Ci0gICAgQ2xpZW50RGF0YQkqaGFuZGxlcHRyIFVOVVNFRDsKK3RjbF9jaGFubmVsX2dldGhhbmRsZSgKKyAgICBDbGllbnREYXRhCWluc3RhbmNlIFVOVVNFRCwKKyAgICBpbnQJCWRpcmVjdGlvbiBVTlVTRUQsCisgICAgQ2xpZW50RGF0YQkqaGFuZGxlcHRyIFVOVVNFRCkKIHsKICAgICBUY2xfU2V0RXJybm8oRUlOVkFMKTsKICAgICByZXR1cm4gRUlOVkFMOwpAQCAtMTY4Miw3ICsxNjY5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgc3RhdGljIHZvaWQKLXRjbHVwZGF0ZXZhcnMoKQordGNsdXBkYXRldmFycyh2b2lkKQogewogICAgIGNoYXIgdmFybmFtZVtWQVJOQU1FX1NJWkVdOwkvKiBtdXN0IGJlIHdyaXRlYWJsZSAqLwogICAgIGNoYXIgKm5hbWU7CkBAIC0xNzEwLDggKzE2OTcsNyBAQAogCiAKICAgICBzdGF0aWMgaW50Ci10Y2xpbml0KGVhcCkKLSAgICBleGFyZ19UICplYXA7Cit0Y2xpbml0KGV4YXJnX1QgKmVhcCkKIHsKICAgICBjaGFyIHZhcm5hbWVbVkFSTkFNRV9TSVpFXTsJLyogVGNsX0xpbmtWYXIgcmVxdWlyZXMgd3JpdGVhYmxlIHZhcm5hbWUgKi8KICAgICBjaGFyICpuYW1lOwpAQCAtMTgyMCw4ICsxODA2LDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi10Y2xlcnJtc2codGV4dCkKLSAgICBjaGFyICp0ZXh0OwordGNsZXJybXNnKGNoYXIgKnRleHQpCiB7CiAgICAgY2hhciAqbmV4dDsKIApAQCAtMTgzNiw4ICsxODIxLDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi10Y2xtc2codGV4dCkKLSAgICBjaGFyICp0ZXh0OwordGNsbXNnKGNoYXIgKnRleHQpCiB7CiAgICAgY2hhciAqbmV4dDsKIApAQCAtMTg1Miw3ICsxODM2LDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi10Y2xkZWx0aGlzaW50ZXJwKCkKK3RjbGRlbHRoaXNpbnRlcnAodm9pZCkKIHsKICAgICBpZiAoIVRjbF9JbnRlcnBEZWxldGVkKHRjbGluZm8uaW50ZXJwKSkKIAlUY2xfRGVsZXRlSW50ZXJwKHRjbGluZm8uaW50ZXJwKTsKQEAgLTE4NzQsOCArMTg1OCw3IEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci10Y2xleGl0KGVycm9yKQotICAgIGludCBlcnJvcjsKK3RjbGV4aXQoaW50IGVycm9yKQogewogICAgIGludCBuZXdlcnIgPSBPSzsKIApAQCAtMTkyMyw4ICsxOTA2LDcgQEAKICAqICI6dGNsIgogICovCiAgICAgdm9pZAotZXhfdGNsKGVhcCkKLSAgICBleGFyZ19UICplYXA7CitleF90Y2woZXhhcmdfVCAqZWFwKQogewogICAgIGNoYXJfdQkqc2NyaXB0OwogICAgIGludAkJZXJyOwpAQCAtMTk1MCw4ICsxOTMyLDcgQEAKICAqICI6dGNsZmlsZSIKICAqLwogICAgIHZvaWQKLWV4X3RjbGZpbGUoZWFwKQotICAgIGV4YXJnX1QgKmVhcDsKK2V4X3RjbGZpbGUoZXhhcmdfVCAqZWFwKQogewogICAgIGNoYXIgKmZpbGUgPSAoY2hhciAqKWVhcC0+YXJnOwogICAgIGludCBlcnI7CkBAIC0xOTY5LDggKzE5NTAsNyBAQAogICogIjp0Y2xkbyIKICAqLwogICAgIHZvaWQKLWV4X3RjbGRvKGVhcCkKLSAgICBleGFyZ19UICplYXA7CitleF90Y2xkbyhleGFyZ19UICplYXApCiB7CiAgICAgY2hhcgkqc2NyaXB0LCAqbGluZTsKICAgICBpbnQJCWVyciwgcnMsIHJlLCBsbnVtOwpAQCAtMjA0NSw4ICsyMDI1LDcgQEAKIH0KIAogICAgIHN0YXRpYyB2b2lkCi10Y2xkZWxhbGxyZWZzKHJlZikKLSAgICBzdHJ1Y3QgcmVmICpyZWY7Cit0Y2xkZWxhbGxyZWZzKHN0cnVjdCByZWYgKnJlZikKIHsKICAgICBzdHJ1Y3QgcmVmCSpuZXh0OwogICAgIGludAkJZXJyOwpAQCAtMjA4Myw4ICsyMDYyLDcgQEAKIH0KIAogICAgIHZvaWQKLXRjbF9idWZmZXJfZnJlZShidWYpCi0gICAgYnVmX1QgKmJ1ZjsKK3RjbF9idWZmZXJfZnJlZShidWZfVCAqYnVmKQogewogICAgIHN0cnVjdCByZWYgKnJlZmxpc3Q7CiAKQEAgLTIxMDQsOCArMjA4Miw3IEBACiAKICNpZiBkZWZpbmVkKEZFQVRfV0lORE9XUykgfHwgZGVmaW5lZChQUk9UTykKICAgICB2b2lkCi10Y2xfd2luZG93X2ZyZWUod2luKQotICAgIHdpbl9UICp3aW47Cit0Y2xfd2luZG93X2ZyZWUod2luX1QgKndpbikKIHsKICAgICBzdHJ1Y3QgcmVmICpyZWZsaXN0OwogCmRpZmYgLS1naXQgYS9zcmMvaWZfeGNtZHNydi5jIGIvc3JjL2lmX3hjbWRzcnYuYwppbmRleCBhNzU4ZjJiLi4wYjliMWE4IDEwMDY0NAotLS0gYS9zcmMvaWZfeGNtZHNydi5jCisrKyBiL3NyYy9pZl94Y21kc3J2LmMKQEAgLTIxNCw5ICsyMTQsOSBAQAogICogUmV0dXJucyBGQUlMIG9yIE9LLgogICovCiAgICAgaW50Ci1zZXJ2ZXJSZWdpc3Rlck5hbWUoZHB5LCBuYW1lKQotICAgIERpc3BsYXkJKmRweTsJCS8qIGRpc3BsYXkgdG8gcmVnaXN0ZXIgd2l0aCAqLwotICAgIGNoYXJfdQkqbmFtZTsJCS8qIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSAqLworc2VydmVyUmVnaXN0ZXJOYW1lKAorICAgIERpc3BsYXkJKmRweSwJCS8qIGRpc3BsYXkgdG8gcmVnaXN0ZXIgd2l0aCAqLworICAgIGNoYXJfdQkqbmFtZSkJCS8qIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSAqLwogewogICAgIGludAkJaTsKICAgICBpbnQJCXJlczsKQEAgLTI1Miw5ICsyNTIsNyBAQAogfQogCiAgICAgc3RhdGljIGludAotRG9SZWdpc3Rlck5hbWUoZHB5LCBuYW1lKQotICAgIERpc3BsYXkJKmRweTsKLSAgICBjaGFyX3UJKm5hbWU7CitEb1JlZ2lzdGVyTmFtZShEaXNwbGF5ICpkcHksIGNoYXJfdSAqbmFtZSkKIHsKICAgICBXaW5kb3cJdzsKICAgICBYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwpAQCAtMzMyLDkgKzMzMCw5IEBACiAgKiBDaGFuZ2UgYW55IHJlZ2lzdGVyZWQgd2luZG93IElELgogICovCiAgICAgdm9pZAotc2VydmVyQ2hhbmdlUmVnaXN0ZXJlZFdpbmRvdyhkcHksIG5ld3dpbikKLSAgICBEaXNwbGF5CSpkcHk7CQkvKiBEaXNwbGF5IHRvIHJlZ2lzdGVyIHdpdGggKi8KLSAgICBXaW5kb3cJbmV3d2luOwkJLyogUmUtcmVnaXN0ZXIgdG8gdGhpcyBJRCAqLworc2VydmVyQ2hhbmdlUmVnaXN0ZXJlZFdpbmRvdygKKyAgICBEaXNwbGF5CSpkcHksCQkvKiBEaXNwbGF5IHRvIHJlZ2lzdGVyIHdpdGggKi8KKyAgICBXaW5kb3cJbmV3d2luKQkJLyogUmUtcmVnaXN0ZXIgdG8gdGhpcyBJRCAqLwogewogICAgIGNoYXJfdQlwcm9wSW5mb1tNQVhfTkFNRV9MRU5HVEggKyAyMF07CiAKQEAgLTM2OCwxNSArMzY2LDE1IEBACiAgKiBSZXR1cm5zIDAgZm9yIE9LLCBuZWdhdGl2ZSBmb3IgYW4gZXJyb3IuCiAgKi8KICAgICBpbnQKLXNlcnZlclNlbmRUb1ZpbShkcHksIG5hbWUsIGNtZCwgIHJlc3VsdCwgc2VydmVyLCBhc0V4cHIsIGxvY2FsTG9vcCwgc2lsZW50KQotICAgIERpc3BsYXkJKmRweTsJCQkvKiBXaGVyZSB0byBzZW5kLiAqLwotICAgIGNoYXJfdQkqbmFtZTsJCQkvKiBXaGVyZSB0byBzZW5kLiAqLwotICAgIGNoYXJfdQkqY21kOwkJCS8qIFdoYXQgdG8gc2VuZC4gKi8KLSAgICBjaGFyX3UJKipyZXN1bHQ7CQkvKiBSZXN1bHQgb2YgZXZhbCdlZCBleHByZXNzaW9uICovCi0gICAgV2luZG93CSpzZXJ2ZXI7CQkvKiBBY3R1YWwgSUQgb2YgcmVjZWl2aW5nIGFwcCAqLwotICAgIEJvb2wJYXNFeHByOwkJCS8qIEludGVycHJldCBhcyBrZXlzdHJva2VzIG9yIGV4cHIgPyAqLwotICAgIEJvb2wJbG9jYWxMb29wOwkJLyogVGhyb3cgYXdheSBldmVyeXRoaW5nIGJ1dCByZXN1bHQgKi8KLSAgICBpbnQJCXNpbGVudDsJCQkvKiBkb24ndCBjb21wbGFpbiBhYm91dCBubyBzZXJ2ZXIgKi8KK3NlcnZlclNlbmRUb1ZpbSgKKyAgICBEaXNwbGF5CSpkcHksCQkJLyogV2hlcmUgdG8gc2VuZC4gKi8KKyAgICBjaGFyX3UJKm5hbWUsCQkJLyogV2hlcmUgdG8gc2VuZC4gKi8KKyAgICBjaGFyX3UJKmNtZCwJCQkvKiBXaGF0IHRvIHNlbmQuICovCisgICAgY2hhcl91CSoqcmVzdWx0LAkJLyogUmVzdWx0IG9mIGV2YWwnZWQgZXhwcmVzc2lvbiAqLworICAgIFdpbmRvdwkqc2VydmVyLAkJLyogQWN0dWFsIElEIG9mIHJlY2VpdmluZyBhcHAgKi8KKyAgICBCb29sCWFzRXhwciwJCQkvKiBJbnRlcnByZXQgYXMga2V5c3Ryb2tlcyBvciBleHByID8gKi8KKyAgICBCb29sCWxvY2FsTG9vcCwJCS8qIFRocm93IGF3YXkgZXZlcnl0aGluZyBidXQgcmVzdWx0ICovCisgICAgaW50CQlzaWxlbnQpCQkJLyogZG9uJ3QgY29tcGxhaW4gYWJvdXQgbm8gc2VydmVyICovCiB7CiAgICAgV2luZG93CSAgICB3OwogICAgIGNoYXJfdQkgICAgKnByb3BlcnR5OwpAQCAtNTM1LDggKzUzMyw3IEBACiB9CiAKICAgICBzdGF0aWMgaW50Ci1XYWl0Rm9yUGVuZChwKQotICAgIHZvaWQgICAgKnA7CitXYWl0Rm9yUGVuZCh2b2lkICpwKQogewogICAgIFBlbmRpbmdDb21tYW5kICpwZW5kaW5nID0gKFBlbmRpbmdDb21tYW5kICopIHA7CiAgICAgcmV0dXJuIHBlbmRpbmctPnJlc3VsdCAhPSBOVUxMOwpAQCAtNTQ2LDkgKzU0Myw3IEBACiAgKiBSZXR1cm4gVFJVRSBpZiB3aW5kb3cgInciIGV4aXN0cyBhbmQgaGFzIGEgIlZpbSIgcHJvcGVydHkgb24gaXQuCiAgKi8KICAgICBzdGF0aWMgaW50Ci1XaW5kb3dWYWxpZChkcHksIHcpCi0gICAgRGlzcGxheSAgICAgKmRweTsKLSAgICBXaW5kb3cJdzsKK1dpbmRvd1ZhbGlkKERpc3BsYXkgKmRweSwgV2luZG93IHcpCiB7CiAgICAgWEVycm9ySGFuZGxlciAgIG9sZF9oYW5kbGVyOwogICAgIEF0b20JICAgICpwbGlzdDsKQEAgLTU3NywxMyArNTcyLDEzIEBACiAgKiBFbnRlciBhIGxvb3AgcHJvY2Vzc2luZyBYIGV2ZW50cyAmIHBvbGxpbmcgY2hhcnMgdW50aWwgd2Ugc2VlIGEgcmVzdWx0CiAgKi8KICAgICBzdGF0aWMgdm9pZAotU2VydmVyV2FpdChkcHksIHcsIGVuZENvbmQsIGVuZERhdGEsIGxvY2FsTG9vcCwgc2Vjb25kcykKLSAgICBEaXNwbGF5CSpkcHk7Ci0gICAgV2luZG93CXc7Ci0gICAgRW5kQ29uZAllbmRDb25kOwotICAgIHZvaWQJKmVuZERhdGE7Ci0gICAgaW50CQlsb2NhbExvb3A7Ci0gICAgaW50CQlzZWNvbmRzOworU2VydmVyV2FpdCgKKyAgICBEaXNwbGF5CSpkcHksCisgICAgV2luZG93CXcsCisgICAgRW5kQ29uZAllbmRDb25kLAorICAgIHZvaWQJKmVuZERhdGEsCisgICAgaW50CQlsb2NhbExvb3AsCisgICAgaW50CQlzZWNvbmRzKQogewogICAgIHRpbWVfdAkgICAgc3RhcnQ7CiAgICAgdGltZV90CSAgICBub3c7CkBAIC02NDksOCArNjQ0LDcgQEAKICAqIFJldHVybnMgYSBuZXdsaW5lIHNlcGFyYXRlZCBsaXN0IGluIGFsbG9jYXRlZCBtZW1vcnkgb3IgTlVMTC4KICAqLwogICAgIGNoYXJfdSAqCi1zZXJ2ZXJHZXRWaW1OYW1lcyhkcHkpCi0gICAgRGlzcGxheQkqZHB5Oworc2VydmVyR2V0VmltTmFtZXMoRGlzcGxheSAqZHB5KQogewogICAgIGNoYXJfdQkqcmVnUHJvcDsKICAgICBjaGFyX3UJKmVudHJ5OwpAQCAtNzA0LDkgKzY5OCw3IEBACiAgKi8KIAogICAgIHN0YXRpYyBzdHJ1Y3QgU2VydmVyUmVwbHkgKgotU2VydmVyUmVwbHlGaW5kKHcsIG9wKQotICAgIFdpbmRvdyAgdzsKLSAgICBlbnVtIFNlcnZlclJlcGx5T3Agb3A7CitTZXJ2ZXJSZXBseUZpbmQoV2luZG93IHcsIGVudW0gU2VydmVyUmVwbHlPcCBvcCkKIHsKICAgICBzdHJ1Y3QgU2VydmVyUmVwbHkgKnA7CiAgICAgc3RydWN0IFNlcnZlclJlcGx5IGU7CkBAIC03NDgsOCArNzQwLDcgQEAKICAqIElzc3VlIGFuIGVycm9yIGlmIHRoZSBpZCBpcyBpbnZhbGlkLgogICovCiAgICAgV2luZG93Ci1zZXJ2ZXJTdHJUb1dpbihzdHIpCi0gICAgY2hhcl91ICAqc3RyOworc2VydmVyU3RyVG9XaW4oY2hhcl91ICpzdHIpCiB7CiAgICAgdW5zaWduZWQgIGlkID0gTm9uZTsKIApAQCAtNzY1LDkgKzc1Niw3IEBACiAgKiBSZXR1cm4gLTEgaWYgdGhlIHdpbmRvdyBpcyBpbnZhbGlkLgogICovCiAgICAgaW50Ci1zZXJ2ZXJTZW5kUmVwbHkobmFtZSwgc3RyKQotICAgIGNoYXJfdQkqbmFtZTsKLSAgICBjaGFyX3UJKnN0cjsKK3NlcnZlclNlbmRSZXBseShjaGFyX3UgKm5hbWUsIGNoYXJfdSAqc3RyKQogewogICAgIGNoYXJfdQkqcHJvcGVydHk7CiAgICAgaW50CQlsZW5ndGg7CkBAIC04MDcsOCArNzk2LDcgQEAKIH0KIAogICAgIHN0YXRpYyBpbnQKLVdhaXRGb3JSZXBseShwKQotICAgIHZvaWQgICAgKnA7CitXYWl0Rm9yUmVwbHkodm9pZCAqcCkKIHsKICAgICBXaW5kb3cgICp3ID0gKFdpbmRvdyAqKSBwOwogICAgIHJldHVybiBTZXJ2ZXJSZXBseUZpbmQoKncsIFNST1BfRmluZCkgIT0gTlVMTDsKQEAgLTgyMCwxMSArODA4LDExIEBACiAgKiBSZXR1cm4gLTEgaWYgdGhlIHdpbmRvdyBiZWNvbWVzIGludmFsaWQgd2hpbGUgd2FpdGluZy4KICAqLwogICAgIGludAotc2VydmVyUmVhZFJlcGx5KGRweSwgd2luLCBzdHIsIGxvY2FsTG9vcCkKLSAgICBEaXNwbGF5CSpkcHk7Ci0gICAgV2luZG93CXdpbjsKLSAgICBjaGFyX3UJKipzdHI7Ci0gICAgaW50CQlsb2NhbExvb3A7CitzZXJ2ZXJSZWFkUmVwbHkoCisgICAgRGlzcGxheQkqZHB5LAorICAgIFdpbmRvdwl3aW4sCisgICAgY2hhcl91CSoqc3RyLAorICAgIGludAkJbG9jYWxMb29wKQogewogICAgIGludAkJbGVuOwogICAgIGNoYXJfdQkqczsKQEAgLTg1OCwxMCArODQ2LDcgQEAKICAqIFJldHVybiBUUlVFIGFuZCBhIG5vbi1tYWxsb2MnZWQgc3RyaW5nIGlmIHRoZXJlIGlzLiAgRWxzZSByZXR1cm4gRkFMU0UuCiAgKi8KICAgICBpbnQKLXNlcnZlclBlZWtSZXBseShkcHksIHdpbiwgc3RyKQotICAgIERpc3BsYXkgKmRweTsKLSAgICBXaW5kb3cgd2luOwotICAgIGNoYXJfdSAqKnN0cjsKK3NlcnZlclBlZWtSZXBseShEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4sIGNoYXJfdSAqKnN0cikKIHsKICAgICBzdHJ1Y3QgU2VydmVyUmVwbHkgKnA7CiAKQEAgLTg4Miw4ICs4NjcsNyBAQAogICogcmVzdWx0cy4KICAqLwogICAgIHN0YXRpYyBpbnQKLVNlbmRJbml0KGRweSkKLSAgICBEaXNwbGF5ICpkcHk7CitTZW5kSW5pdChEaXNwbGF5ICpkcHkpCiB7CiAgICAgWEVycm9ySGFuZGxlciBvbGRfaGFuZGxlcjsKIApAQCAtOTM5LDExICs5MjMsMTEgQEAKICAqCXJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cnkgcHJvcGVydHkuCiAgKi8KICAgICBzdGF0aWMgV2luZG93Ci1Mb29rdXBOYW1lKGRweSwgbmFtZSwgZGVsZXRlLCBsb29zZSkKLSAgICBEaXNwbGF5CSpkcHk7CSAgICAvKiBEaXNwbGF5IHdob3NlIHJlZ2lzdHJ5IHRvIGNoZWNrLiAqLwotICAgIGNoYXJfdQkqbmFtZTsJICAgIC8qIE5hbWUgb2YgYSBzZXJ2ZXIuICovCi0gICAgaW50CQlkZWxldGU7CSAgICAvKiBJZiBub24temVybywgZGVsZXRlIGluZm8gYWJvdXQgbmFtZS4gKi8KLSAgICBjaGFyX3UJKipsb29zZTsgICAgLyogRG8gYW5vdGhlciBzZWFyY2ggbWF0Y2hpbmcgLTk5OSBpZiBub3QgZm91bmQKK0xvb2t1cE5hbWUoCisgICAgRGlzcGxheQkqZHB5LAkgICAgLyogRGlzcGxheSB3aG9zZSByZWdpc3RyeSB0byBjaGVjay4gKi8KKyAgICBjaGFyX3UJKm5hbWUsCSAgICAvKiBOYW1lIG9mIGEgc2VydmVyLiAqLworICAgIGludAkJZGVsZXRlLAkgICAgLyogSWYgbm9uLXplcm8sIGRlbGV0ZSBpbmZvIGFib3V0IG5hbWUuICovCisgICAgY2hhcl91CSoqbG9vc2UpICAgIC8qIERvIGFub3RoZXIgc2VhcmNoIG1hdGNoaW5nIC05OTkgaWYgbm90IGZvdW5kCiAJCQkgICAgICAgUmV0dXJuIHJlc3VsdCBoZXJlIGlmIGEgbWF0Y2ggaXMgZm91bmQgKi8KIHsKICAgICBjaGFyX3UJKnJlZ1Byb3AsICplbnRyeTsKQEAgLTEwMzMsOSArMTAxNyw5IEBACiAgKiAzLiBUaGUgd2luZG93IHdpbGwgbWlzdGFrZW5seSBiZSByZWdhcmRlZCB2YWxpZCBiZWNhdXNlIG9mIG93biBjb21tV2luZG93CiAgKi8KICAgICBzdGF0aWMgdm9pZAotRGVsZXRlQW55TGluZ2VyZXIoZHB5LCB3aW4pCi0gICAgRGlzcGxheQkqZHB5OwkvKiBEaXNwbGF5IHdob3NlIHJlZ2lzdHJ5IHRvIGNoZWNrLiAqLwotICAgIFdpbmRvdwl3aW47CS8qIFdpbmRvdyB0byByZW1vdmUgKi8KK0RlbGV0ZUFueUxpbmdlcmVyKAorICAgIERpc3BsYXkJKmRweSwJLyogRGlzcGxheSB3aG9zZSByZWdpc3RyeSB0byBjaGVjay4gKi8KKyAgICBXaW5kb3cJd2luKQkvKiBXaW5kb3cgdG8gcmVtb3ZlICovCiB7CiAgICAgY2hhcl91CSpyZWdQcm9wLCAqZW50cnkgPSBOVUxMOwogICAgIGNoYXJfdQkqcDsKQEAgLTEwOTUsMTEgKzEwNzksMTEgQEAKICAqIFJldHVybiBPSyB3aGVuIHN1Y2Nlc3NmdWwuCiAgKi8KICAgICBzdGF0aWMgaW50Ci1HZXRSZWdQcm9wKGRweSwgcmVnUHJvcHAsIG51bUl0ZW1zcCwgZG9tc2cpCi0gICAgRGlzcGxheQkqZHB5OwotICAgIGNoYXJfdQkqKnJlZ1Byb3BwOwotICAgIGxvbmdfdQkqbnVtSXRlbXNwOwotICAgIGludAkJZG9tc2c7CQkvKiBXaGVuIFRSVUUgZ2l2ZSBlcnJvciBtZXNzYWdlLiAqLworR2V0UmVnUHJvcCgKKyAgICBEaXNwbGF5CSpkcHksCisgICAgY2hhcl91CSoqcmVnUHJvcHAsCisgICAgbG9uZ191CSpudW1JdGVtc3AsCisgICAgaW50CQlkb21zZykJCS8qIFdoZW4gVFJVRSBnaXZlIGVycm9yIG1lc3NhZ2UuICovCiB7CiAgICAgaW50CQlyZXN1bHQsIGFjdHVhbEZvcm1hdDsKICAgICBsb25nX3UJYnl0ZXNBZnRlcjsKQEAgLTExNTIsMTAgKzExMzYsMTAgQEAKICAqIHJlc3BvbnNlLgogICovCiAgICAgdm9pZAotc2VydmVyRXZlbnRQcm9jKGRweSwgZXZlbnRQdHIsIGltbWVkaWF0ZSkKLSAgICBEaXNwbGF5CSpkcHk7Ci0gICAgWEV2ZW50CSpldmVudFB0cjsJLyogSW5mb3JtYXRpb24gYWJvdXQgZXZlbnQuICovCi0gICAgaW50CQlpbW1lZGlhdGU7CS8qIFJ1biBldmVudCBpbW1lZGlhdGVseS4gU2hvdWxkIG1vc3RseSBiZSAwLiAqLworc2VydmVyRXZlbnRQcm9jKAorICAgIERpc3BsYXkJKmRweSwKKyAgICBYRXZlbnQJKmV2ZW50UHRyLAkvKiBJbmZvcm1hdGlvbiBhYm91dCBldmVudC4gKi8KKyAgICBpbnQJCWltbWVkaWF0ZSkJLyogUnVuIGV2ZW50IGltbWVkaWF0ZWx5LiBTaG91bGQgbW9zdGx5IGJlIDAuICovCiB7CiAgICAgY2hhcl91CSpwcm9wSW5mbzsKICAgICBpbnQJCXJlc3VsdCwgYWN0dWFsRm9ybWF0OwpAQCAtMTE5Nyw5ICsxMTgxLDcgQEAKICAqIHZpbSBpcyBpZGxlLgogICovCiAgICAgc3RhdGljIHZvaWQKLXNhdmVfaW5fcXVldWUocHJvcEluZm8sIGxlbikKLSAgICBjaGFyX3UJKnByb3BJbmZvOwotICAgIGxvbmdfdQlsZW47CitzYXZlX2luX3F1ZXVlKGNoYXJfdSAqcHJvcEluZm8sIGxvbmdfdSBsZW4pCiB7CiAgICAgeF9xdWV1ZV9UICpub2RlOwogCkBAIC0xMjI2LDcgKzEyMDgsNyBAQAogICogUGFyc2VzIHF1ZXVlZCBjbGllbnRzZXJ2ZXIgbWVzc2FnZXMuCiAgKi8KICAgICB2b2lkCi1zZXJ2ZXJfcGFyc2VfbWVzc2FnZXMoKQorc2VydmVyX3BhcnNlX21lc3NhZ2VzKHZvaWQpCiB7CiAgICAgeF9xdWV1ZV9UCSpub2RlOwogCkBAIC0xMjQ3LDcgKzEyMjksNyBAQAogICogaW50IHRoZSBxdWV1ZS4KICAqLwogICAgIGludAotc2VydmVyX3dhaXRpbmcoKQorc2VydmVyX3dhaXRpbmcodm9pZCkKIHsKICAgICByZXR1cm4gaGVhZC5uZXh0ICE9IE5VTEwgJiYgaGVhZC5uZXh0ICE9ICZoZWFkOwogfQpAQCAtMTI1OCwxMCArMTI0MCwxMCBAQAogICogInByb3BJbmZvIiB3aWxsIGJlIGZyZWVkLgogICovCiAgICAgc3RhdGljIHZvaWQKLXNlcnZlcl9wYXJzZV9tZXNzYWdlKGRweSwgcHJvcEluZm8sIG51bUl0ZW1zKQotICAgIERpc3BsYXkJKmRweTsKLSAgICBjaGFyX3UJKnByb3BJbmZvOyAvKiBBIHN0cmluZyBjb250YWluaW5nIDAgb3IgbW9yZSBYIGNvbW1hbmRzICovCi0gICAgbG9uZ191CW51bUl0ZW1zOyAgLyogVGhlIHNpemUgb2YgcHJvcEluZm8gaW4gYnl0ZXMuICovCitzZXJ2ZXJfcGFyc2VfbWVzc2FnZSgKKyAgICBEaXNwbGF5CSpkcHksCisgICAgY2hhcl91CSpwcm9wSW5mbywgLyogQSBzdHJpbmcgY29udGFpbmluZyAwIG9yIG1vcmUgWCBjb21tYW5kcyAqLworICAgIGxvbmdfdQludW1JdGVtcykgIC8qIFRoZSBzaXplIG9mIHByb3BJbmZvIGluIGJ5dGVzLiAqLwogewogICAgIGNoYXJfdQkqcDsKICAgICBpbnQJCWNvZGU7CkBAIC0xNTM5LDEyICsxNTIxLDEyIEBACiAgKiBSZXR1cm46IDAgZm9yIE9LLCAtMSBmb3IgZXJyb3IKICAqLwogICAgIHN0YXRpYyBpbnQKLUFwcGVuZFByb3BDYXJlZnVsbHkoZHB5LCB3aW5kb3csIHByb3BlcnR5LCB2YWx1ZSwgbGVuZ3RoKQotICAgIERpc3BsYXkJKmRweTsJCS8qIERpc3BsYXkgb24gd2hpY2ggdG8gb3BlcmF0ZS4gKi8KLSAgICBXaW5kb3cJd2luZG93OwkJLyogV2luZG93IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIG1vZGlmaWVkLiAqLwotICAgIEF0b20JcHJvcGVydHk7CS8qIE5hbWUgb2YgcHJvcGVydHkuICovCi0gICAgY2hhcl91CSp2YWx1ZTsJCS8qIENoYXJhY3RlcnMgIHRvIGFwcGVuZCB0byBwcm9wZXJ0eS4gKi8KLSAgICBpbnQJCWxlbmd0aDsJCS8qIEhvdyBtdWNoIHRvIGFwcGVuZCAqLworQXBwZW5kUHJvcENhcmVmdWxseSgKKyAgICBEaXNwbGF5CSpkcHksCQkvKiBEaXNwbGF5IG9uIHdoaWNoIHRvIG9wZXJhdGUuICovCisgICAgV2luZG93CXdpbmRvdywJCS8qIFdpbmRvdyB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBtb2RpZmllZC4gKi8KKyAgICBBdG9tCXByb3BlcnR5LAkvKiBOYW1lIG9mIHByb3BlcnR5LiAqLworICAgIGNoYXJfdQkqdmFsdWUsCQkvKiBDaGFyYWN0ZXJzICB0byBhcHBlbmQgdG8gcHJvcGVydHkuICovCisgICAgaW50CQlsZW5ndGgpCQkvKiBIb3cgbXVjaCB0byBhcHBlbmQgKi8KIHsKICAgICBYRXJyb3JIYW5kbGVyIG9sZF9oYW5kbGVyOwogCkBAIC0xNTYyLDkgKzE1NDQsNyBAQAogICogQW5vdGhlciBYIEVycm9yIGhhbmRsZXIsIGp1c3QgdXNlZCB0byBjaGVjayBmb3IgZXJyb3JzLgogICovCiAgICAgc3RhdGljIGludAoteF9lcnJvcl9jaGVjayhkcHksIGVycm9yX2V2ZW50KQotICAgIERpc3BsYXkJKmRweSBVTlVTRUQ7Ci0gICAgWEVycm9yRXZlbnQJKmVycm9yX2V2ZW50IFVOVVNFRDsKK3hfZXJyb3JfY2hlY2soRGlzcGxheSAqZHB5IFVOVVNFRCwgWEVycm9yRXZlbnQgKmVycm9yX2V2ZW50IFVOVVNFRCkKIHsKICAgICBnb3RfeF9lcnJvciA9IFRSVUU7CiAgICAgcmV0dXJuIDA7CkBAIC0xNTc1LDggKzE1NTUsNyBAQAogICogQWN0dWFsbHkganVzdCBjaGVja3MgaWYgdGhlIG5hbWUgZW5kcyBpbiBhIGRpZ2l0LgogICovCiAgICAgc3RhdGljIGludAotSXNTZXJpYWxOYW1lKHN0cikKLSAgICBjaGFyX3UJKnN0cjsKK0lzU2VyaWFsTmFtZShjaGFyX3UgKnN0cikKIHsKICAgICBpbnQgbGVuID0gU1RSTEVOKHN0cik7CiAKZGlmZiAtLWdpdCBhL3NyYy9pbnRlZ3JhdGlvbi5jIGIvc3JjL2ludGVncmF0aW9uLmMKaW5kZXggM2YzOGM1NS4uNTg3OWEwYiAxMDA2NDQKLS0tIGEvc3JjL2ludGVncmF0aW9uLmMKKysrIGIvc3JjL2ludGVncmF0aW9uLmMKQEAgLTYyMCw4ICs2MjAsOCBAQAogICAgaWYgeW91IHdhbnQgdG8gZG8gdGhpbmdzIGRpZmZlcmVudGx5IGlmIHRoZSBlZGl0b3IgaXMgc3RhcnRlZCBzdGFuZGFsb25lCiAgICBvciBpbiBXb3JrU2hvcCBtb2RlLiBGb3IgZXhhbXBsZSwgaW4gc3RhbmRhbG9uZSBtb2RlIHlvdSBtYXkgbm90IHdhbnQgdG8KICAgIGFkZCBhIGZvb3Rlci9tZXNzYWdlIGFyZWEgb3IgYSBzaWduIGd1dHRlci4gKi8KLWludAotd29ya3Nob3BfaW52b2tlZCgpCisJaW50Cit3b3Jrc2hvcF9pbnZva2VkKHZvaWQpCiB7CiAJc3RhdGljIGludCByZXN1bHQgPSAtMTsKIAlpZiAocmVzdWx0ID09IC0xKSB7CkBAIC03MzUsNyArNzM1LDcgQEAKIAlkdW1teSA9IHdyaXRlKHNkLCBidWYsIHN0cmxlbihidWYpKTsKIH0KIAotdm9pZAl3b3Jrc2hvcF9kaXNjb25uZWN0KCkKK3ZvaWQJd29ya3Nob3BfZGlzY29ubmVjdCh2b2lkKQogewogCS8qIFByb2JhYmx5IG5lZWQgdG8gc2VuZCBzb21lIG1lc3NhZ2UgaGVyZSAqLwogCmRpZmYgLS1naXQgYS9zcmMvdmVyc2lvbi5jIGIvc3JjL3ZlcnNpb24uYwppbmRleCBmODUwODg3Li41Y2MzMWQ1IDEwMDY0NAotLS0gYS9zcmMvdmVyc2lvbi5jCisrKyBiL3NyYy92ZXJzaW9uLmMKQEAgLTc0Nyw2ICs3NDcsOCBAQAogc3RhdGljIGludCBpbmNsdWRlZF9wYXRjaGVzW10gPQogeyAgIC8qIEFkZCBuZXcgcGF0Y2ggbnVtYmVyIGJlbG93IHRoaXMgbGluZSAqLwogLyoqLworICAgIDEyMDgsCisvKiovCiAgICAgMTIwNywKIC8qKi8KICAgICAxMjA2LAo=