ZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTNkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldi5oCkBAIC0wLDAgKzEsNzI1IEBACisvKiAkSWQ6IGF1ZGlvZGV2LmggNDI0MyAyMDEyLTA4LTMxIDExOjQyOjE3WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0FVRElPREVWX0FVRElPREVWX0hfXworI2RlZmluZSBfX1BKTUVESUFfQVVESU9ERVZfQVVESU9ERVZfSF9fCisKKy8qKgorICogQGZpbGUgYXVkaW9kZXYuaAorICogQGJyaWVmIEF1ZGlvIGRldmljZSBBUEkuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2NvbmZpZy5oPgorI2luY2x1ZGUgPHBqbWVkaWEtYXVkaW9kZXYvZXJybm8uaD4KKyNpbmNsdWRlIDxwam1lZGlhL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZnJhbWUuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBAZGVmZ3JvdXAgczJfYXVkaW9fZGV2aWNlX3JlZmVyZW5jZSBBdWRpbyBEZXZpY2UgQVBJIFJlZmVyZW5jZQorICogQGluZ3JvdXAgYXVkaW9fZGV2aWNlX2FwaQorICogQGJyaWVmIEFQSSBSZWZlcmVuY2UKKyAqIEB7CisgKi8KKworLyoqCisgKiBUeXBlIGZvciBkZXZpY2UgaW5kZXguCisgKi8KK3R5cGVkZWYgcGpfaW50MzJfdCBwam1lZGlhX2F1ZF9kZXZfaW5kZXg7CisKKy8qKgorICogRGV2aWNlIGluZGV4IGNvbnN0YW50cy4KKyAqLworZW51bQoreworICAgIC8qKiAKKyAgICAgKiBDb25zdGFudCB0byBkZW5vdGUgZGVmYXVsdCBjYXB0dXJlIGRldmljZSAKKyAgICAgKi8KKyAgICBQSk1FRElBX0FVRF9ERUZBVUxUX0NBUFRVUkVfREVWID0gLTEsCisKKyAgICAvKiogCisgICAgICogQ29uc3RhbnQgdG8gZGVub3RlIGRlZmF1bHQgcGxheWJhY2sgZGV2aWNlIAorICAgICAqLworICAgIFBKTUVESUFfQVVEX0RFRkFVTFRfUExBWUJBQ0tfREVWID0gLTIsCisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0byBkZW5vdGUgaW52YWxpZCBkZXZpY2UgaW5kZXguCisgICAgICovCisgICAgUEpNRURJQV9BVURfSU5WQUxJRF9ERVYgPSAtMworfTsKKworCisvKioKKyAqIFRoaXMgZW51bWVyYXRpb24gaWRlbnRpZmllcyB2YXJpb3VzIGF1ZGlvIGRldmljZSBjYXBhYmlsaXRpZXMuIFRoZXNlIGF1ZGlvCisgKiBjYXBhYmlsaXRpZXMgaW5kaWNhdGVzIHdoYXQgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZworICogYXVkaW8gZGV2aWNlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEFwcGxpY2F0aW9ucyBnZXQgdGhlc2UgY2FwYWJpbGl0aWVzIGluIHRoZSAjcGptZWRpYV9hdWRfZGV2X2luZm8gc3RydWN0dXJlLgorICoKKyAqIEFwcGxpY2F0aW9uIGNhbiBhbHNvIHNldCB0aGUgc3BlY2lmaWMgZmVhdHVyZXMvY2FwYWJpbGl0aWVzIHdoZW4gb3BlbmluZworICogdGhlIGF1ZGlvIHN0cmVhbSBieSBzZXR0aW5nIHRoZSBcYSBmbGFncyBtZW1iZXIgb2YgI3BqbWVkaWFfYXVkX3BhcmFtCisgKiBzdHJ1Y3R1cmUuCisgKgorICogT25jZSBhdWRpbyBzdHJlYW0gaXMgcnVubmluZywgYXBwbGljYXRpb24gY2FuIGFsc28gcmV0cmlldmUgb3Igc2V0IHNvbWUKKyAqIHNwZWNpZmljIGF1ZGlvIGNhcGFiaWxpdHksIGJ5IHVzaW5nICNwam1lZGlhX2F1ZF9zdHJlYW1fZ2V0X2NhcCgpIGFuZAorICogI3BqbWVkaWFfYXVkX3N0cmVhbV9zZXRfY2FwKCkgYW5kIHNwZWNpZnlpbmcgdGhlIGRlc2lyZWQgY2FwYWJpbGl0eS4gVGhlCisgKiB2YWx1ZSBvZiB0aGUgY2FwYWJpbGl0eSBpcyBzcGVjaWZpZWQgYXMgcG9pbnRlciwgYW5kIGFwcGxpY2F0aW9uIG5lZWRzIHRvCisgKiBzdXBwbHkgdGhlIHBvaW50ZXIgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZSwgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uCisgKiBvZiBlYWNoIG9mIHRoZSBjYXBhYmlsaXR5LgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV9hdWRfZGV2X2NhcAoreworICAgIC8qKiAKKyAgICAgKiBTdXBwb3J0IGZvciBhdWRpbyBmb3JtYXRzIG90aGVyIHRoYW4gUENNLiBUaGUgdmFsdWUgb2YgdGhpcyBjYXBhYmlsaXR5CisgICAgICogaXMgcmVwcmVzZW50ZWQgYnkgI3BqbWVkaWFfZm9ybWF0IHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX0VYVF9GT1JNQVQgPSAxLAorCisgICAgLyoqIAorICAgICAqIFN1cHBvcnQgZm9yIGF1ZGlvIGlucHV0IGxhdGVuY3kgY29udHJvbCBvciBxdWVyeS4gVGhlIHZhbHVlIG9mIHRoaXMgCisgICAgICogY2FwYWJpbGl0eSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnRhaW5pbmcgbWlsbGlzZWNvbmRzIHZhbHVlIG9mCisgICAgICogdGhlIGxhdGVuY3kuCisgICAgICovCisgICAgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9MQVRFTkNZID0gMiwKKworICAgIC8qKiAKKyAgICAgKiBTdXBwb3J0IGZvciBhdWRpbyBvdXRwdXQgbGF0ZW5jeSBjb250cm9sIG9yIHF1ZXJ5LiBUaGUgdmFsdWUgb2YgdGhpcyAKKyAgICAgKiBjYXBhYmlsaXR5IGlzIGFuIHVuc2lnbmVkIGludGVnZXIgY29udGFpbmluZyBtaWxsaXNlY29uZHMgdmFsdWUgb2YKKyAgICAgKiB0aGUgbGF0ZW5jeS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9MQVRFTkNZID0gNCwKKworICAgIC8qKiAKKyAgICAgKiBTdXBwb3J0IGZvciBzZXR0aW5nL3JldHJpZXZpbmcgdGhlIGF1ZGlvIGlucHV0IGRldmljZSB2b2x1bWUgbGV2ZWwuCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY2FwYWJpbGl0eSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyAKKyAgICAgKiB0aGUgaW5wdXQgYXVkaW8gdm9sdW1lIHNldHRpbmcgaW4gcGVyY2VudC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX1ZPTFVNRV9TRVRUSU5HID0gOCwKKworICAgIC8qKiAKKyAgICAgKiBTdXBwb3J0IGZvciBzZXR0aW5nL3JldHJpZXZpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2Ugdm9sdW1lIGxldmVsLgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGNhcGFiaWxpdHkgaXMgYW4gdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgCisgICAgICogdGhlIG91dHB1dCBhdWRpbyB2b2x1bWUgc2V0dGluZyBpbiBwZXJjZW50LgorICAgICAqLworICAgIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1ZPTFVNRV9TRVRUSU5HID0gMTYsCisKKyAgICAvKiogCisgICAgICogU3VwcG9ydCBmb3IgbW9uaXRvcmluZyB0aGUgY3VycmVudCBhdWRpbyBpbnB1dCBzaWduYWwgdm9sdW1lLiAKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBjYXBhYmlsaXR5IGlzIGFuIHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIAorICAgICAqIHRoZSBhdWRpbyB2b2x1bWUgaW4gcGVyY2VudC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX1NJR05BTF9NRVRFUiA9IDMyLAorCisgICAgLyoqIAorICAgICAqIFN1cHBvcnQgZm9yIG1vbml0b3JpbmcgdGhlIGN1cnJlbnQgYXVkaW8gb3V0cHV0IHNpZ25hbCB2b2x1bWUuIAorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGNhcGFiaWxpdHkgaXMgYW4gdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgCisgICAgICogdGhlIGF1ZGlvIHZvbHVtZSBpbiBwZXJjZW50LgorICAgICAqLworICAgIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1NJR05BTF9NRVRFUiA9IDY0LAorCisgICAgLyoqIAorICAgICAqIFN1cHBvcnQgZm9yIGF1ZGlvIGlucHV0IHJvdXRpbmcuIFRoZSB2YWx1ZSBvZiB0aGlzIGNhcGFiaWxpdHkgaXMgYW4gCisgICAgICogaW50ZWdlciBjb250YWluaW5nICNwam1lZGlhX2F1ZF9kZXZfcm91dGUgZW51bWVyYXRpb24uCisgICAgICovCisgICAgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9ST1VURSA9IDEyOCwKKworICAgIC8qKiAKKyAgICAgKiBTdXBwb3J0IGZvciBhdWRpbyBvdXRwdXQgcm91dGluZyAoZS5nLiBsb3Vkc3BlYWtlciB2cyBlYXJwaWVjZSkuIFRoZQorICAgICAqIHZhbHVlIG9mIHRoaXMgY2FwYWJpbGl0eSBpcyBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgI3BqbWVkaWFfYXVkX2Rldl9yb3V0ZQorICAgICAqIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIFBKTUVESUFfQVVEX0RFVl9DQVBfT1VUUFVUX1JPVVRFID0gMjU2LAorCisgICAgLyoqIAorICAgICAqIFRoZSBhdWRpbyBkZXZpY2UgaGFzIGVjaG8gY2FuY2VsbGF0aW9uIGZlYXR1cmUuIFRoZSB2YWx1ZSBvZiB0aGlzCisgICAgICogY2FwYWJpbGl0eSBpcyBhIHBqX2Jvb2xfdCBjb250YWluaW5nIGJvb2xlYW4gUEpfVFJVRSBvciBQSl9GQUxTRS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfQ0FQX0VDID0gNTEyLAorCisgICAgLyoqIAorICAgICAqIFRoZSBhdWRpbyBkZXZpY2Ugc3VwcG9ydHMgc2V0dGluZyBlY2hvIGNhbmNlbGxhdGlvbiBmYWlsIGxlbmd0aC4gVGhlCisgICAgICogdmFsdWUgb2YgdGhpcyBjYXBhYmlsaXR5IGlzIGFuIHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZQorICAgICAqIGVjaG8gdGFpbCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgUEpNRURJQV9BVURfREVWX0NBUF9FQ19UQUlMID0gMTAyNCwKKworICAgIC8qKiAKKyAgICAgKiBUaGUgYXVkaW8gZGV2aWNlIGhhcyB2b2ljZSBhY3Rpdml0eSBkZXRlY3Rpb24gZmVhdHVyZS4gVGhlIHZhbHVlCisgICAgICogb2YgdGhpcyBjYXBhYmlsaXR5IGlzIGEgcGpfYm9vbF90IGNvbnRhaW5pbmcgYm9vbGVhbiBQSl9UUlVFIG9yIAorICAgICAqIFBKX0ZBTFNFLgorICAgICAqLworICAgIFBKTUVESUFfQVVEX0RFVl9DQVBfVkFEID0gMjA0OCwKKworICAgIC8qKiAKKyAgICAgKiBUaGUgYXVkaW8gZGV2aWNlIGhhcyBjb21mb3J0IG5vaXNlIGdlbmVyYXRpb24gZmVhdHVyZS4gVGhlIHZhbHVlCisgICAgICogb2YgdGhpcyBjYXBhYmlsaXR5IGlzIGEgcGpfYm9vbF90IGNvbnRhaW5pbmcgYm9vbGVhbiBQSl9UUlVFIG9yIAorICAgICAqIFBKX0ZBTFNFLgorICAgICAqLworICAgIFBKTUVESUFfQVVEX0RFVl9DQVBfQ05HID0gNDA5NiwKKworICAgIC8qKiAKKyAgICAgKiBUaGUgYXVkaW8gZGV2aWNlIGhhcyBwYWNrZXQgbG9zcyBjb25jZWFsbWVudCBmZWF0dXJlLiBUaGUgdmFsdWUKKyAgICAgKiBvZiB0aGlzIGNhcGFiaWxpdHkgaXMgYSBwal9ib29sX3QgY29udGFpbmluZyBib29sZWFuIFBKX1RSVUUgb3IgCisgICAgICogUEpfRkFMU0UuCisgICAgICovCisgICAgUEpNRURJQV9BVURfREVWX0NBUF9QTEMgPSA4MTkyLAorICAgIAorICAgIC8qKgorICAgICAqIEVuZCBvZiBjYXBhYmlsaXR5CisgICAgICovCisgICAgUEpNRURJQV9BVURfREVWX0NBUF9NQVggPSAxNjM4NAorCit9IHBqbWVkaWFfYXVkX2Rldl9jYXA7CisKKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIGRlc2NyaWJlcyBhdWRpbyByb3V0aW5nIHNldHRpbmcuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX2F1ZF9kZXZfcm91dGUKK3sKKyAgICAvKiogRGVmYXVsdCByb3V0ZS4gKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfUk9VVEVfREVGQVVMVCA9IDAsCisKKyAgICAvKiogUm91dGUgdG8gbG91ZHNwZWFrZXIgKi8KKyAgICBQSk1FRElBX0FVRF9ERVZfUk9VVEVfTE9VRFNQRUFLRVIgPSAxLAorCisgICAgLyoqIFJvdXRlIHRvIGVhcnBpZWNlICovCisgICAgUEpNRURJQV9BVURfREVWX1JPVVRFX0VBUlBJRUNFID0gMiwKKworICAgIC8qKiBSb3V0ZSB0byBwYWlyZWQgQmx1ZXRvb3RoIGRldmljZSAqLworICAgIFBKTUVESUFfQVVEX0RFVl9ST1VURV9CTFVFVE9PVEggPSA0CisKK30gcGptZWRpYV9hdWRfZGV2X3JvdXRlOworCisKKy8qKgorICogRGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSByZXR1cm5lZCBieSAjcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfYXVkX2Rldl9pbmZvCit7CisgICAgLyoqIAorICAgICAqIFRoZSBkZXZpY2UgbmFtZSAKKyAgICAgKi8KKyAgICBjaGFyIG5hbWVbNjRdOworCisgICAgLyoqIAorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZS4gSWYgdGhlCisgICAgICogdmFsdWUgaXMgemVybywgdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGlucHV0IG9wZXJhdGlvbiAoaS5lLgorICAgICAqIGl0IGlzIGEgcGxheWJhY2sgb25seSBkZXZpY2UpLiAKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnB1dF9jb3VudDsKKworICAgIC8qKiAKKyAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlLiBJZiB0aGUKKyAgICAgKiB2YWx1ZSBpcyB6ZXJvLCB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IG9wZXJhdGlvbiAoaS5lLiAKKyAgICAgKiBpdCBpcyBhbiBpbnB1dCBvbmx5IGRldmljZSkuCisgICAgICovCisgICAgdW5zaWduZWQgb3V0cHV0X2NvdW50OworCisgICAgLyoqIAorICAgICAqIERlZmF1bHQgc2FtcGxpbmcgcmF0ZS4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBkZWZhdWx0X3NhbXBsZXNfcGVyX3NlYzsKKworICAgIC8qKiAKKyAgICAgKiBUaGUgdW5kZXJseWluZyBkcml2ZXIgbmFtZSAKKyAgICAgKi8KKyAgICBjaGFyIGRyaXZlclszMl07CisKKyAgICAvKiogCisgICAgICogRGV2aWNlIGNhcGFiaWxpdGllcywgYXMgYml0bWFzayBjb21iaW5hdGlvbiBvZiAjcGptZWRpYV9hdWRfZGV2X2NhcC4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjYXBzOworCisgICAgLyoqIAorICAgICAqIFN1cHBvcnRlZCBhdWRpbyBkZXZpY2Ugcm91dGVzLCBhcyBiaXRtYXNrIGNvbWJpbmF0aW9uIG9mIAorICAgICAqICNwam1lZGlhX2F1ZF9kZXZfcm91dGUuIFRoZSB2YWx1ZSBtYXkgYmUgemVybyBpZiB0aGUgZGV2aWNlCisgICAgICogZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyByb3V0aW5nLgorICAgICAqLworICAgIHVuc2lnbmVkIHJvdXRlczsKKworICAgIC8qKiAKKyAgICAgKiBOdW1iZXIgb2YgYXVkaW8gZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuIFRoZSB2YWx1ZSBtYXkgYmUKKyAgICAgKiB6ZXJvIGlmIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBub24tUENNIGZvcm1hdC4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBleHRfZm10X2NudDsKKworICAgIC8qKiAKKyAgICAgKiBBcnJheSBvZiBzdXBwb3J0ZWQgZXh0ZW5kZWQgYXVkaW8gZm9ybWF0cyAKKyAgICAgKi8KKyAgICBwam1lZGlhX2Zvcm1hdCBleHRfZm10WzhdOworCisKK30gcGptZWRpYV9hdWRfZGV2X2luZm87CisKKworLyoqIAorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgcGxheWVyIHN0cmVhbSB3aGVuIGl0IG5lZWRzIGFkZGl0aW9uYWwgZGF0YQorICogdG8gYmUgcGxheWVkIGJ5IHRoZSBkZXZpY2UuIEFwcGxpY2F0aW9uIG11c3QgZmlsbCBpbiB0aGUgd2hvbGUgb2Ygb3V0cHV0IAorICogYnVmZmVyIHdpdGggYXVkaW8gc2FtcGxlcy4KKyAqCisgKiBUaGUgZnJhbWUgYXJndW1lbnQgY29udGFpbnMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgLSB0aW1lc3RhbXAJICAgIFBsYXliYWNrIHRpbWVzdGFtcCwgaW4gc2FtcGxlcy4KKyAqICAtIGJ1ZgkgICAgQnVmZmVyIHRvIGJlIGZpbGxlZCBvdXQgYnkgYXBwbGljYXRpb24uCisgKiAgLSBzaXplCSAgICBUaGUgc2l6ZSByZXF1ZXN0ZWQgaW4gYnl0ZXMsIHdoaWNoIHdpbGwgYmUgZXF1YWwgdG8KKyAqCQkgICAgdGhlIHNpemUgb2Ygb25lIHdob2xlIHBhY2tldC4KKyAqCisgKiBAcGFyYW0gdXNlcl9kYXRhIFVzZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4KKyAqIEBwYXJhbSBmcmFtZQkgICAgQXVkaW8gZnJhbWUsIHdoaWNoIGJ1ZmZlciBpcyB0byBiZSBmaWxsZWQgaW4gYnkKKyAqCQkgICAgdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIEByZXR1cm4JICAgIFJldHVybmluZyBub24tUEpfU1VDQ0VTUyB3aWxsIGNhdXNlIHRoZSBhdWRpbyBzdHJlYW0KKyAqCQkgICAgdG8gc3RvcAorICovCit0eXBlZGVmIHBqX3N0YXR1c190ICgqcGptZWRpYV9hdWRfcGxheV9jYikodm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgICBwam1lZGlhX2ZyYW1lICpmcmFtZSk7CisKKy8qKgorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgcmVjb3JkZXIgc3RyZWFtIHdoZW4gaXQgaGFzIGNhcHR1cmVkIHRoZSB3aG9sZQorICogcGFja2V0IHdvcnRoIG9mIGF1ZGlvIHNhbXBsZXMuCisgKgorICogQHBhcmFtIHVzZXJfZGF0YSBVc2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0gZnJhbWUJICAgIENhcHR1cmVkIGZyYW1lLgorICoKKyAqIEByZXR1cm4JICAgIFJldHVybmluZyBub24tUEpfU1VDQ0VTUyB3aWxsIGNhdXNlIHRoZSBhdWRpbyBzdHJlYW0KKyAqCQkgICAgdG8gc3RvcAorICovCit0eXBlZGVmIHBqX3N0YXR1c190ICgqcGptZWRpYV9hdWRfcmVjX2NiKSh2b2lkICp1c2VyX2RhdGEsCisJCQkJCSAgcGptZWRpYV9mcmFtZSAqZnJhbWUpOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHNwZWNpZmllcyB0aGUgcGFyYW1ldGVycyB0byBvcGVuIHRoZSBhdWRpbyBzdHJlYW0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfYXVkX3BhcmFtCit7CisgICAgLyoqCisgICAgICogVGhlIGF1ZGlvIGRpcmVjdGlvbi4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeS4KKyAgICAgKi8KKyAgICBwam1lZGlhX2RpciBkaXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXVkaW8gcmVjb3JkZXIgZGV2aWNlIElELiBUaGlzIHNldHRpbmcgaXMgbWFuZGF0b3J5IGlmIHRoZSBhdWRpbworICAgICAqIGRpcmVjdGlvbiBpbmNsdWRlcyBpbnB1dC9jYXB0dXJlIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5kZXggcmVjX2lkOworCisgICAgLyoqCisgICAgICogVGhlIGF1ZGlvIHBsYXliYWNrIGRldmljZSBJRC4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeSBpZiB0aGUgYXVkaW8KKyAgICAgKiBkaXJlY3Rpb24gaW5jbHVkZXMgb3V0cHV0L3BsYXliYWNrIGRpcmVjdGlvbi4KKyAgICAgKi8KKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5kZXggcGxheV9pZDsKKworICAgIC8qKiAKKyAgICAgKiBDbG9jayByYXRlL3NhbXBsaW5nIHJhdGUuIFRoaXMgc2V0dGluZyBpcyBtYW5kYXRvcnkuIAorICAgICAqLworICAgIHVuc2lnbmVkIGNsb2NrX3JhdGU7CisKKyAgICAvKiogCisgICAgICogTnVtYmVyIG9mIGNoYW5uZWxzLiBUaGlzIHNldHRpbmcgaXMgbWFuZGF0b3J5LiAKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50OworCisgICAgLyoqIAorICAgICAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeS4gCisgICAgICovCisgICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWU7CisKKyAgICAvKiogCisgICAgICogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZS4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeS4gCisgICAgICovCisgICAgdW5zaWduZWQgYml0c19wZXJfc2FtcGxlOworCisgICAgLyoqIAorICAgICAqIFRoaXMgZmxhZ3Mgc3BlY2lmaWVzIHdoaWNoIG9mIHRoZSBvcHRpb25hbCBzZXR0aW5ncyBhcmUgdmFsaWQgaW4gdGhpcworICAgICAqIHN0cnVjdHVyZS4gVGhlIGZsYWdzIGlzIGJpdG1hc2sgY29tYmluYXRpb24gb2YgcGptZWRpYV9hdWRfZGV2X2NhcC4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBmbGFnczsKKworICAgIC8qKiAKKyAgICAgKiBTZXQgdGhlIGF1ZGlvIGZvcm1hdC4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQKKyAgICAgKiBpZiBQSk1FRElBX0FVRF9ERVZfQ0FQX0VYVF9GT1JNQVQgaXMgc2V0IGluIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICBwam1lZGlhX2Zvcm1hdCBleHRfZm10OworCisgICAgLyoqCisgICAgICogSW5wdXQgbGF0ZW5jeSwgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNldHRpbmcgaXMgb3B0aW9uYWwsIGFuZCB3aWxsIAorICAgICAqIG9ubHkgYmUgdXNlZCBpZiBQSk1FRElBX0FVRF9ERVZfQ0FQX0lOUFVUX0xBVEVOQ1kgaXMgc2V0IGluIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnB1dF9sYXRlbmN5X21zOworCisgICAgLyoqCisgICAgICogSW5wdXQgbGF0ZW5jeSwgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNldHRpbmcgaXMgb3B0aW9uYWwsIGFuZCB3aWxsIAorICAgICAqIG9ubHkgYmUgdXNlZCBpZiBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9MQVRFTkNZIGlzIHNldCBpbiB0aGUgZmxhZ3MuCisgICAgICovCisgICAgdW5zaWduZWQgb3V0cHV0X2xhdGVuY3lfbXM7CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCB2b2x1bWUgc2V0dGluZywgaW4gcGVyY2VudC4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCAKKyAgICAgKiBvbmx5IGJlIHVzZWQgaWYgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9WT0xVTUVfU0VUVElORyBpcyBzZXQgaW4gCisgICAgICogdGhlIGZsYWdzLgorICAgICAqLworICAgIHVuc2lnbmVkIGlucHV0X3ZvbDsKKworICAgIC8qKgorICAgICAqIE91dHB1dCB2b2x1bWUgc2V0dGluZywgaW4gcGVyY2VudC4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCAKKyAgICAgKiBvbmx5IGJlIHVzZWQgaWYgUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkcgaXMgc2V0IGluIAorICAgICAqIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBvdXRwdXRfdm9sOworCisgICAgLyoqIAorICAgICAqIFNldCB0aGUgYXVkaW8gaW5wdXQgcm91dGUuIFRoaXMgc2V0dGluZyBpcyBvcHRpb25hbCwgYW5kIHdpbGwgb25seSBiZQorICAgICAqIHVzZWQgaWYgUEpNRURJQV9BVURfREVWX0NBUF9JTlBVVF9ST1VURSBpcyBzZXQgaW4gdGhlIGZsYWdzLgorICAgICAqLworICAgIHBqbWVkaWFfYXVkX2Rldl9yb3V0ZSBpbnB1dF9yb3V0ZTsKKworICAgIC8qKiAKKyAgICAgKiBTZXQgdGhlIGF1ZGlvIG91dHB1dCByb3V0ZS4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlCisgICAgICogdXNlZCBpZiBQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9ST1VURSBpcyBzZXQgaW4gdGhlIGZsYWdzLgorICAgICAqLworICAgIHBqbWVkaWFfYXVkX2Rldl9yb3V0ZSBvdXRwdXRfcm91dGU7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUvZGlzYWJsZSBlY2hvIGNhbmNlbGxlciwgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBpdC4gVGhpcyBzZXR0aW5nCisgICAgICogaXMgb3B0aW9uYWwsIGFuZCB3aWxsIG9ubHkgYmUgdXNlZCBpZiBQSk1FRElBX0FVRF9ERVZfQ0FQX0VDIGlzIHNldCBpbgorICAgICAqIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICBwal9ib29sX3QgZWNfZW5hYmxlZDsKKworICAgIC8qKgorICAgICAqIFNldCBlY2hvIGNhbmNlbGxlciB0YWlsIGxlbmd0aCBpbiBtaWxsaXNlY29uZHMsIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiBpdC4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgaWYKKyAgICAgKiBQSk1FRElBX0FVRF9ERVZfQ0FQX0VDX1RBSUwgaXMgc2V0IGluIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBlY190YWlsX21zOworCisgICAgLyoqIAorICAgICAqIEVuYWJsZS9kaXNhYmxlIFBMQy4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQKKyAgICAgKiBpZiBQSk1FRElBX0FVRF9ERVZfQ0FQX1BMQyBpcyBzZXQgaW4gdGhlIGZsYWdzLgorICAgICAqLworICAgIHBqX2Jvb2xfdCBwbGNfZW5hYmxlZDsKKworICAgIC8qKiAKKyAgICAgKiBFbmFibGUvZGlzYWJsZSBDTkcuIFRoaXMgc2V0dGluZyBpcyBvcHRpb25hbCwgYW5kIHdpbGwgb25seSBiZSB1c2VkCisgICAgICogaWYgUEpNRURJQV9BVURfREVWX0NBUF9DTkcgaXMgc2V0IGluIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICBwal9ib29sX3QgY25nX2VuYWJsZWQ7CisKKyAgICAvKiogCisgICAgICogRW5hYmxlL2Rpc2FibGUgVkFELiBUaGlzIHNldHRpbmcgaXMgb3B0aW9uYWwsIGFuZCB3aWxsIG9ubHkgYmUgdXNlZAorICAgICAqIGlmIFBKTUVESUFfQVVEX0RFVl9DQVBfVkFEIGlzIHNldCBpbiB0aGUgZmxhZ3MuCisgICAgICovCisgICAgcGpfYm9vbF90IHZhZF9lbmFibGVkOworCit9IHBqbWVkaWFfYXVkX3BhcmFtOworCisKKy8qKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBwam1lZGlhX2F1ZF9zdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfYXVkX3N0cmVhbSBwam1lZGlhX2F1ZF9zdHJlYW07CisKKy8qKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhdWRpbyBkZXZpY2UgZmFjdG9yeSAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgcGptZWRpYV9hdWRfZGV2X2ZhY3Rvcnk7CisKKy8qIHR5cGVkZWYgZm9yIGZhY3RvcnkgY3JlYXRpb24gZnVuY3Rpb24gKi8KK3R5cGVkZWYgcGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkqCisoKnBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5X2NyZWF0ZV9mdW5jX3B0cikocGpfcG9vbF9mYWN0b3J5Kik7CisKKworLyoqCisgKiBHZXQgc3RyaW5nIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgY2FwYWJpbGl0eS4KKyAqCisgKiBAcGFyYW0gY2FwCQlUaGUgY2FwYWJpbGl0eSBJRC4KKyAqIEBwYXJhbSBwX2Rlc2MJT3B0aW9uYWwgcG9pbnRlciB3aGljaCB3aWxsIGJlIGZpbGxlZCB3aXRoIGxvbmdlciAKKyAqCQkJZGVzY3JpcHRpb24gYWJvdXQgdGhlIGNhcGFiaWxpdHkuCisgKgorICogQHJldHVybgkJQ2FwYWJpbGl0eSBuYW1lLgorICovCitQSl9ERUNMKGNvbnN0IGNoYXIqKSBwam1lZGlhX2F1ZF9kZXZfY2FwX25hbWUocGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKipwX2Rlc2MpOworCisKKy8qKgorICogU2V0IGEgY2FwYWJpbGl0eSBmaWVsZCB2YWx1ZSBpbiAjcGptZWRpYV9hdWRfcGFyYW0gc3RydWN0dXJlLiBUaGlzIHdpbGwKKyAqIGFsc28gc2V0IHRoZSBmbGFncyBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjYXBhYmlsaXR5IGluIHRoZSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHBhcmFtCQlUaGUgc3RydWN0dXJlLgorICogQHBhcmFtIGNhcAkJVGhlIGF1ZGlvIGNhcGFiaWxpdHkgd2hpY2ggdmFsdWUgaXMgdG8gYmUgc2V0LgorICogQHBhcmFtIHB2YWwJCVBvaW50ZXIgdG8gdmFsdWUuIFBsZWFzZSBzZWUgdGhlIHR5cGUgb2YgdmFsdWUgdG8KKyAqCQkJYmUgc3VwcGxpZWQgaW4gdGhlIHBqbWVkaWFfYXVkX2Rldl9jYXAgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F1ZF9wYXJhbV9zZXRfY2FwKHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSwKKwkJCQkJICAgICAgIHBqbWVkaWFfYXVkX2Rldl9jYXAgY2FwLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqcHZhbCk7CisKKworLyoqCisgKiBHZXQgYSBjYXBhYmlsaXR5IGZpZWxkIHZhbHVlIGZyb20gI3BqbWVkaWFfYXVkX3BhcmFtIHN0cnVjdHVyZS4gVGhpcworICogZnVuY3Rpb24gd2lsbCByZXR1cm4gUEpNRURJQV9FQVVEX0lOVkNBUCBlcnJvciBpZiB0aGUgZmxhZyBmb3IgdGhhdAorICogY2FwYWJpbGl0eSBpcyBub3Qgc2V0IGluIHRoZSBmbGFncyBmaWVsZCBpbiB0aGUgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBwYXJhbQkJVGhlIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBjYXAJCVRoZSBhdWRpbyBjYXBhYmlsaXR5IHdoaWNoIHZhbHVlIGlzIHRvIGJlIHJldHJpZXZlZC4KKyAqIEBwYXJhbSBwdmFsCQlQb2ludGVyIHRvIHZhbHVlLiBQbGVhc2Ugc2VlIHRoZSB0eXBlIG9mIHZhbHVlIHRvCisgKgkJCWJlIHN1cHBsaWVkIGluIHRoZSBwam1lZGlhX2F1ZF9kZXZfY2FwIGRvY3VtZW50YXRpb24uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdWRfcGFyYW1fZ2V0X2NhcChjb25zdCBwam1lZGlhX2F1ZF9wYXJhbSAqcGFyYW0sCisJCQkJCSAgICAgICBwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKwkJCQkJICAgICAgIHZvaWQgKnB2YWwpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhpcyB3aWxsIHJlZ2lzdGVyIGFsbCBzdXBwb3J0ZWQgYXVkaW8gCisgKiBkZXZpY2UgZmFjdG9yaWVzIHRvIHRoZSBhdWRpbyBzdWJzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZAorICogbW9yZSB0aGFuIG9uY2UsIGJ1dCBlYWNoIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgdGhlCisgKiBjb3JyZXNwb25kaW5nICNwam1lZGlhX2F1ZF9zdWJzeXNfc2h1dGRvd24oKSBjYWxsLgorICoKKyAqIEBwYXJhbSBwZgkJVGhlIHBvb2wgZmFjdG9yeS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F1ZF9zdWJzeXNfaW5pdChwal9wb29sX2ZhY3RvcnkgKnBmKTsKKworCisvKioKKyAqIEdldCB0aGUgcG9vbCBmYWN0b3J5IHJlZ2lzdGVyZWQgdG8gdGhlIGF1ZGlvIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuCQlUaGUgcG9vbCBmYWN0b3J5LgorICovCitQSl9ERUNMKHBqX3Bvb2xfZmFjdG9yeSopIHBqbWVkaWFfYXVkX3N1YnN5c19nZXRfcG9vbF9mYWN0b3J5KHZvaWQpOworCisKKy8qKgorICogU2h1dGRvd24gdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhpcyB3aWxsIGRlc3Ryb3kgYWxsIGF1ZGlvIGRldmljZSBmYWN0b3JpZXMKKyAqIHJlZ2lzdGVyZWQgaW4gdGhlIGF1ZGlvIHN1YnN5c3RlbS4gTm90ZSB0aGF0IGN1cnJlbnRseSBvcGVuZWQgYXVkaW8gc3RyZWFtcworICogbWF5IG9yIG1heSBub3QgYmUgY2xvc2VkLCBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhdWRpbworICogZGV2aWNlIGZhY3Rvcmllcy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F1ZF9zdWJzeXNfc2h1dGRvd24odm9pZCk7CisKKworLyoqCisgKiBSZWdpc3RlciBhIHN1cHBvcnRlZCBhdWRpbyBkZXZpY2UgZmFjdG9yeSB0byB0aGUgYXVkaW8gc3Vic3lzdGVtLiBUaGlzCisgKiBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgY2FsbGluZyAjcGptZWRpYV9hdWRfc3Vic3lzX2luaXQoKS4KKyAqCisgKiBAcGFyYW0gYWRmCQlUaGUgYXVkaW8gZGV2aWNlIGZhY3RvcnkuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfYXVkX3JlZ2lzdGVyX2ZhY3RvcnkocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnlfY3JlYXRlX2Z1bmNfcHRyIGFkZik7CisKKworLyoqCisgKiBVbnJlZ2lzdGVyIGFuIGF1ZGlvIGRldmljZSBmYWN0b3J5IGZyb20gdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhpcworICogZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgI3BqbWVkaWFfYXVkX3N1YnN5c19pbml0KCkuCisgKiBEZXZpY2VzIGZyb20gdGhpcyBmYWN0b3J5IHdpbGwgYmUgdW5saXN0ZWQuIElmIGEgZGV2aWNlIGZyb20gdGhpcyBmYWN0b3J5CisgKiBpcyBjdXJyZW50bHkgaW4gdXNlLCB0aGVuIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgKgorICogQHBhcmFtIGFkZgkJVGhlIGF1ZGlvIGRldmljZSBmYWN0b3J5LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKgkJCWVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX2F1ZF91bnJlZ2lzdGVyX2ZhY3RvcnkocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnlfY3JlYXRlX2Z1bmNfcHRyIGFkZik7CisKKworLyoqCisgKiBSZWZyZXNoIHRoZSBsaXN0IG9mIHNvdW5kIGRldmljZXMgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24KKyAqIHdpbGwgb25seSByZWZyZXNoIHRoZSBsaXN0IG9mIGF1ZGlvIGRldmljZSBzbyBhbGwgYWN0aXZlIGF1ZGlvIHN0cmVhbXMgd2lsbAorICogYmUgdW5hZmZlY3RlZC4gQWZ0ZXIgcmVmcmVzaGluZyB0aGUgZGV2aWNlIGxpc3QsIGFwcGxpY2F0aW9uIE1VU1QgbWFrZSBzdXJlCisgKiB0byB1cGRhdGUgYWxsIGluZGV4IHJlZmVyZW5jZXMgdG8gYXVkaW8gZGV2aWNlcyAoaS5lLiBhbGwgdmFyaWFibGVzIG9mIHR5cGUKKyAqIHBqbWVkaWFfYXVkX2Rldl9pbmRleCkgYmVmb3JlIGNhbGxpbmcgYW55IGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhdWRpbyBkZXZpY2UKKyAqIGluZGV4IGFzIGl0cyBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdWRfZGV2X3JlZnJlc2godm9pZCk7CisKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBzb3VuZCBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorICoKKyAqIEByZXR1cm4JCVRoZSBudW1iZXIgb2Ygc291bmQgZGV2aWNlcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KKyAqLworUEpfREVDTCh1bnNpZ25lZCkgcGptZWRpYV9hdWRfZGV2X2NvdW50KHZvaWQpOworCisKKy8qKgorICogR2V0IGRldmljZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gaWQJCVRoZSBhdWRpbyBkZXZpY2UgSUQuCisgKiBAcGFyYW0gaW5mbwkJVGhlIGRldmljZSBpbmZvcm1hdGlvbiB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGlzCisgKgkJCWZ1bmN0aW9uIG9uY2UgaXQgcmV0dXJucyBzdWNjZXNzZnVsbHkuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKHBqbWVkaWFfYXVkX2Rldl9pbmRleCBpZCwKKwkJCQkJICAgICAgcGptZWRpYV9hdWRfZGV2X2luZm8gKmluZm8pOworCisKKy8qKgorICogTG9va3VwIGRldmljZSBpbmRleCBiYXNlZCBvbiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gZHJ2X25hbWUJVGhlIGRyaXZlciBuYW1lLgorICogQHBhcmFtIGRldl9uYW1lCVRoZSBkZXZpY2UgbmFtZS4KKyAqIEBwYXJhbSBpZAkJUG9pbnRlciB0byBzdG9yZSB0aGUgcmV0dXJuZWQgZGV2aWNlIElELgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgdGhlIGRldmljZSBjYW4gYmUgZm91bmQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfYXVkX2Rldl9sb29rdXAoY29uc3QgY2hhciAqZHJ2X25hbWUsCisJCQkJCSAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgIHBqbWVkaWFfYXVkX2Rldl9pbmRleCAqaWQpOworCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYXVkaW8gZGV2aWNlIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlCisgKiBzcGVjaWZpZWQgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBpZAkJVGhlIGF1ZGlvIGRldmljZSBJRC4KKyAqIEBwYXJhbSBwYXJhbQkJVGhlIGF1ZGlvIGRldmljZSBwYXJhbWV0ZXJzIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAqCQkJYnkgdGhpcyBmdW5jdGlvbiBvbmNlIGl0IHJldHVybnMgc3VjY2Vzc2Z1bGx5LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKgkJCWVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfYXVkX2Rldl9kZWZhdWx0X3BhcmFtKHBqbWVkaWFfYXVkX2Rldl9pbmRleCBpZCwKKwkJCQkJCSAgIHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSk7CisKKworLyoqCisgKiBPcGVuIGF1ZGlvIHN0cmVhbSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBwYXJhbQkJU291bmQgZGV2aWNlIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBmb3IgdGhlIHN0cmVhbS4KKyAqIEBwYXJhbSByZWNfY2IJQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGlucHV0IGZyYW1lIGNhcHR1cmVkLgorICogQHBhcmFtIHBsYXlfY2IJQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGV2ZXJ5dGltZSB0aGUgc291bmQgZGV2aWNlIG5lZWRzCisgKgkJCWF1ZGlvIGZyYW1lcyB0byBiZSBwbGF5ZWQgYmFjay4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJQXJiaXRyYXJ5IHVzZXIgZGF0YSwgd2hpY2ggd2lsbCBiZSBnaXZlbiBiYWNrIGluIHRoZQorICoJCQljYWxsYmFja3MuCisgKiBAcGFyYW0gcF9zdHJtCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYXVkaW8gc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKgkJCWVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfYXVkX3N0cmVhbV9jcmVhdGUoY29uc3QgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtLAorCQkJCQkgICAgICAgcGptZWRpYV9hdWRfcmVjX2NiIHJlY19jYiwKKwkJCQkJICAgICAgIHBqbWVkaWFfYXVkX3BsYXlfY2IgcGxheV9jYiwKKwkJCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgIHBqbWVkaWFfYXVkX3N0cmVhbSAqKnBfc3RybSk7CisKKy8qKgorICogR2V0IHRoZSBydW5uaW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBzcGVjaWZpZWQgYXVkaW8gc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJtCQlUaGUgYXVkaW8gc3RyZWFtLgorICogQHBhcmFtIHBhcmFtCQlBdWRpbyBzdHJlYW0gcGFyYW1ldGVycyB0byBiZSBmaWxsZWQgaW4gYnkgdGhpcyAKKyAqCQkJZnVuY3Rpb24gb25jZSBpdCByZXR1cm5zIHN1Y2Nlc3NmdWxseS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F1ZF9zdHJlYW1fZ2V0X3BhcmFtKHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSwKKwkJCQkJCSAgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtKTsKKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgY2FwYWJpbGl0eSBvZiB0aGUgYXVkaW8gc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJtCQlUaGUgYXVkaW8gc3RyZWFtLgorICogQHBhcmFtIGNhcAkJVGhlIGF1ZGlvIGNhcGFiaWxpdHkgd2hpY2ggdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLgorICogQHBhcmFtIHZhbHVlCQlQb2ludGVyIHRvIHZhbHVlIHRvIGJlIGZpbGxlZCBpbiBieSB0aGlzIGZ1bmN0aW9uIAorICoJCQlvbmNlIGl0IHJldHVybnMgc3VjY2Vzc2Z1bGx5LiAgUGxlYXNlIHNlZSB0aGUgdHlwZSAKKyAqCQkJb2YgdmFsdWUgdG8gYmUgc3VwcGxpZWQgaW4gdGhlIHBqbWVkaWFfYXVkX2Rldl9jYXAKKyAqCQkJZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F1ZF9zdHJlYW1fZ2V0X2NhcChwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0sCisJCQkJCQlwam1lZGlhX2F1ZF9kZXZfY2FwIGNhcCwKKwkJCQkJCXZvaWQgKnZhbHVlKTsKKworLyoqCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgY2FwYWJpbGl0eSBvZiB0aGUgYXVkaW8gc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJtCQlUaGUgYXVkaW8gc3RyZWFtLgorICogQHBhcmFtIGNhcAkJVGhlIGF1ZGlvIGNhcGFiaWxpdHkgd2hpY2ggdmFsdWUgaXMgdG8gYmUgc2V0LgorICogQHBhcmFtIHZhbHVlCQlQb2ludGVyIHRvIHZhbHVlLiBQbGVhc2Ugc2VlIHRoZSB0eXBlIG9mIHZhbHVlIHRvCisgKgkJCWJlIHN1cHBsaWVkIGluIHRoZSBwam1lZGlhX2F1ZF9kZXZfY2FwIGRvY3VtZW50YXRpb24uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdWRfc3RyZWFtX3NldF9jYXAocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtLAorCQkJCQkJcGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsCisJCQkJCQljb25zdCB2b2lkICp2YWx1ZSk7CisKKy8qKgorICogU3RhcnQgdGhlIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RybQkJVGhlIGF1ZGlvIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F1ZF9zdHJlYW1fc3RhcnQocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKTsKKworLyoqCisgKiBTdG9wIHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cm0JCVRoZSBhdWRpbyBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdWRfc3RyZWFtX3N0b3AocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKTsKKworLyoqCisgKiBEZXN0cm95IHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cm0JCVRoZSBhdWRpbyBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdWRfc3RyZWFtX2Rlc3Ryb3kocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKTsKKworCisvKioKKyAqIEB9CisgKi8KKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX0FVRElPREVWX0FVRElPREVWX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldl9pbXAuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2X2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDg4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldl9pbXAuaApAQCAtMCwwICsxLDE4OCBAQAorLyogJElkOiBhdWRpb2Rldl9pbXAuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX0FVRElPREVWX0lNUF9IX18KKyNkZWZpbmUgX19BVURJT0RFVl9JTVBfSF9fCisKKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2Lmg+CisKKy8qKgorICogQGRlZmdyb3VwIHM4X2F1ZGlvX2RldmljZV9pbXBsZW1lbnRvcnNfYXBpIEF1ZGlvIERldmljZSBJbXBsZW1lbnRvcnMgQVBJCisgKiBAaW5ncm91cCBhdWRpb19kZXZpY2VfYXBpCisgKiBAYnJpZWYgQVBJIGZvciBhdWRpbyBkZXZpY2UgaW1wbGVtZW50b3JzCisgKiBAeworICovCisKKy8qKgorICogU291bmQgZGV2aWNlIGZhY3Rvcnkgb3BlcmF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9hdWRfZGV2X2ZhY3Rvcnlfb3AKK3sKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBhdWRpbyBkZXZpY2UgZmFjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCQlUaGUgYXVkaW8gZGV2aWNlIGZhY3RvcnkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCppbml0KShwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeSAqZik7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGlzIGF1ZGlvIGRldmljZSBmYWN0b3J5IGFuZCByZWxlYXNlIGFsbCByZXNvdXJjZXMgYmFjayB0byB0aGUKKyAgICAgKiBvcGVyYXRpbmcgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCVRoZSBhdWRpbyBkZXZpY2UgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmRlc3Ryb3kpKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGRldmljZXMgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZgkJVGhlIGF1ZGlvIGRldmljZSBmYWN0b3J5LgorICAgICAqLworICAgIHVuc2lnbmVkICgqZ2V0X2Rldl9jb3VudCkocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhdWRpbyBkZXZpY2UgaW5mb3JtYXRpb24gYW5kIGNhcGFiaWxpdGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCQlUaGUgYXVkaW8gZGV2aWNlIGZhY3RvcnkuCisgICAgICogQHBhcmFtIGluZGV4CURldmljZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gaW5mbwlUaGUgYXVkaW8gZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlCisgICAgICoJCQlpbml0aWFsaXplZCBieSB0aGlzIGZ1bmN0aW9uIG9uY2UgaXQgcmV0dXJucyAKKyAgICAgKgkJCXN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdAkoKmdldF9kZXZfaW5mbykocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsIAorCQkJCXVuc2lnbmVkIGluZGV4LAorCQkJCXBqbWVkaWFfYXVkX2Rldl9pbmZvICppbmZvKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBhdWRpbyBkZXZpY2UgcGFyYW1ldGVyIHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCVRoZSBhdWRpbyBkZXZpY2UgZmFjdG9yeS4KKyAgICAgKiBAcGFyYW0gaW5kZXgJRGV2aWNlIGluZGV4LgorICAgICAqIEBwYXJhbSBwYXJhbQlUaGUgYXVkaW8gZGV2aWNlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmRlZmF1bHRfcGFyYW0pKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmLAorCQkJCSB1bnNpZ25lZCBpbmRleCwKKwkJCQkgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGF1ZGlvIGRldmljZSBhbmQgY3JlYXRlIGF1ZGlvIHN0cmVhbS4gU2VlCisgICAgICogI3BqbWVkaWFfYXVkX3N0cmVhbV9jcmVhdGUoKQorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqY3JlYXRlX3N0cmVhbSkocGptZWRpYV9hdWRfZGV2X2ZhY3RvcnkgKmYsCisJCQkJIGNvbnN0IHBqbWVkaWFfYXVkX3BhcmFtICpwYXJhbSwKKwkJCQkgcGptZWRpYV9hdWRfcmVjX2NiIHJlY19jYiwKKwkJCQkgcGptZWRpYV9hdWRfcGxheV9jYiBwbGF5X2NiLAorCQkJCSB2b2lkICp1c2VyX2RhdGEsCisJCQkJIHBqbWVkaWFfYXVkX3N0cmVhbSAqKnBfYXVkX3N0cm0pOworCisgICAgLyoqCisgICAgICogUmVmcmVzaCB0aGUgbGlzdCBvZiBhdWRpbyBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCVRoZSBhdWRpbyBkZXZpY2UgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnJlZnJlc2gpKHBqbWVkaWFfYXVkX2Rldl9mYWN0b3J5ICpmKTsKKworfSBwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeV9vcDsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhbiBhdWRpbyBkZXZpY2UgZmFjdG9yeS4gCisgKi8KK3N0cnVjdCBwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeQoreworICAgIC8qKiBJbnRlcm5hbCBkYXRhIHRvIGJlIGluaXRpYWxpemVkIGJ5IGF1ZGlvIHN1YnN5c3RlbS4gKi8KKyAgICBzdHJ1Y3QgeworCS8qKiBEcml2ZXIgaW5kZXggKi8KKwl1bnNpZ25lZCBkcnZfaWR4OworICAgIH0gc3lzOworCisgICAgLyoqIE9wZXJhdGlvbnMgKi8KKyAgICBwam1lZGlhX2F1ZF9kZXZfZmFjdG9yeV9vcCAqb3A7Cit9OworCisKKy8qKgorICogU291bmQgc3RyZWFtIG9wZXJhdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfYXVkX3N0cmVhbV9vcAoreworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV9hdWRfc3RyZWFtX2dldF9wYXJhbSgpCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpnZXRfcGFyYW0pKHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSwKKwkJCSAgICAgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV9hdWRfc3RyZWFtX2dldF9jYXAoKQorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZ2V0X2NhcCkocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtLAorCQkJICAgcGptZWRpYV9hdWRfZGV2X2NhcCBjYXAsCisJCQkgICB2b2lkICp2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBTZWUgI3BqbWVkaWFfYXVkX3N0cmVhbV9zZXRfY2FwKCkKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnNldF9jYXApKHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSwKKwkJCSAgIHBqbWVkaWFfYXVkX2Rldl9jYXAgY2FwLAorCQkJICAgY29uc3Qgdm9pZCAqdmFsdWUpOworCisgICAgLyoqCisgICAgICogU2VlICNwam1lZGlhX2F1ZF9zdHJlYW1fc3RhcnQoKQorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqc3RhcnQpKHBqbWVkaWFfYXVkX3N0cmVhbSAqc3RybSk7CisKKyAgICAvKioKKyAgICAgKiBTZWUgI3BqbWVkaWFfYXVkX3N0cmVhbV9zdG9wKCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpzdG9wKShwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cm0pOworCisgICAgLyoqCisgICAgICogU2VlICNwam1lZGlhX2F1ZF9zdHJlYW1fZGVzdHJveSgpLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZGVzdHJveSkocGptZWRpYV9hdWRfc3RyZWFtICpzdHJtKTsKKworfSBwam1lZGlhX2F1ZF9zdHJlYW1fb3A7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGF1ZGlvIGRldmljZSBzdHJlYW0uCisgKi8KK3N0cnVjdCBwam1lZGlhX2F1ZF9zdHJlYW0KK3sKKyAgICAvKiogSW50ZXJuYWwgZGF0YSB0byBiZSBpbml0aWFsaXplZCBieSBhdWRpbyBzdWJzeXN0ZW0gKi8KKyAgICBzdHJ1Y3QgeworCS8qKiBEcml2ZXIgaW5kZXggKi8KKwl1bnNpZ25lZCBkcnZfaWR4OworICAgIH0gc3lzOworCisgICAgLyoqIE9wZXJhdGlvbnMgKi8KKyAgICBwam1lZGlhX2F1ZF9zdHJlYW1fb3AgKm9wOworfTsKKworCisKKworLyoqCisgKiBAfQorICovCisKKworCisjZW5kaWYgLyogX19BVURJT0RFVl9JTVBfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb3Rlc3QuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2F1ZGlvdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjU3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9hdWRpb3Rlc3QuaApAQCAtMCwwICsxLDExNiBAQAorLyogJElkOiBhdWRpb3Rlc3QuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQVVESU9ERVZfQVVESU9URVNUX0hfXworI2RlZmluZSBfX1BKTUVESUFfQVVESU9ERVZfQVVESU9URVNUX0hfXworCisvKioKKyAqIEBmaWxlIGF1ZGlvdGVzdC5oCisgKiBAYnJpZWYgQXVkaW8gdGVzdCB1dGlsaXR5LgorICovCisjaW5jbHVkZSA8cGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldi5oPgorCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBAZGVmZ3JvdXAgczMwX2F1ZGlvX3Rlc3RfdXRpbGl0eSBBdWRpbyB0ZXN0cyB1dGlsaXR5LgorICogQGluZ3JvdXAgYXVkaW9fZGV2aWNlX2FwaQorICogQGJyaWVmIEF1ZGlvIHRlc3QgdXRpbGl0eS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBTdGF0aXN0aWMgZm9yIGVhY2ggZGlyZWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2F1ZF90ZXN0X3N0YXQKK3sKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZnJhbWVzIHByb2Nlc3NlZCBkdXJpbmcgdGhlIHRlc3QuCisgICAgICovCisgICAgdW5zaWduZWQgZnJhbWVfY250OworCisgICAgLyoqIAorICAgICAqIE1pbmltdW0gaW50ZXItZnJhbWUgYXJyaXZhbCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgCisgICAgICovCisgICAgdW5zaWduZWQgbWluX2ludGVydmFsOworCisgICAgLyoqIAorICAgICAqIE1heGltdW0gaW50ZXItZnJhbWUgYXJyaXZhbCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgCisgICAgICovCisgICAgdW5zaWduZWQgbWF4X2ludGVydmFsOworCisgICAgLyoqIAorICAgICAqIEF2ZXJhZ2UgaW50ZXItZnJhbWUgYXJyaXZhbCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgCisgICAgICovCisgICAgdW5zaWduZWQgYXZnX2ludGVydmFsOworCisgICAgLyoqIAorICAgICAqIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBpbnRlci1mcmFtZSBhcnJpdmFsIHRpbWUsIGluIG1pbGxpc2Vjb25kcyAKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBkZXZfaW50ZXJ2YWw7CisKKyAgICAvKiogCisgICAgICogTWF4aW11bSBudW1iZXIgb2YgZnJhbWUgYnVyc3QgCisgICAgICovCisgICAgdW5zaWduZWQgbWF4X2J1cnN0OworCit9IHBqbWVkaWFfYXVkX3Rlc3Rfc3RhdDsKKworCisvKioKKyAqIFRlc3QgcmVzdWx0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9hdWRfdGVzdF9yZXN1bHRzCit7CisgICAgLyoqCisgICAgICogUmVjb3JkaW5nIHN0YXRpc3RpYy4KKyAgICAgKi8KKyAgICBwam1lZGlhX2F1ZF90ZXN0X3N0YXQgcmVjOworCisgICAgLyoqCisgICAgICogUGxheWJhY2sgc3RhdGlzdGljLgorICAgICAqLworICAgIHBqbWVkaWFfYXVkX3Rlc3Rfc3RhdCBwbGF5OworCisgICAgLyoqIAorICAgICAqIENsb2NrIGRyaWZ0cyBwZXIgc2Vjb25kLCBpbiBzYW1wbGVzLiBQb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGVzIHJlYworICAgICAqIGRldmljZSBpcyBydW5uaW5nIGZhc3RlciB0aGFuIHBsYXliYWNrIGRldmljZS4KKyAgICAgKi8KKyAgICBwal9pbnQzMl90IHJlY19kcmlmdF9wZXJfc2VjOworCit9IHBqbWVkaWFfYXVkX3Rlc3RfcmVzdWx0czsKKworCisvKioKKyAqIFBlcmZvcm0gYXVkaW8gZGV2aWNlIHRlc3RpbmcuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfYXVkX3Rlc3QoY29uc3QgcGptZWRpYV9hdWRfcGFyYW0gKnBhcmFtLAorCQkJCSAgICAgIHBqbWVkaWFfYXVkX3Rlc3RfcmVzdWx0cyAqcmVzdWx0KTsKKworLyoqCisgKiBAfQorICovCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9BVURJT0RFVl9BVURJT1RFU1RfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvY29uZmlnLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1hdWRpb2Rldi9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmIzM2EyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvY29uZmlnLmgKQEAgLTAsMCArMSw0ODQgQEAKKy8qICRJZDogY29uZmlnLmggNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9BVURJT0RFVl9DT05GSUdfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9BVURJT0RFVl9DT05GSUdfSF9fCisKKy8qKgorICogQGZpbGUgY29uZmlnLmgKKyAqIEBicmllZiBBdWRpbyBjb25maWcuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBAZGVmZ3JvdXAgYXVkaW9fZGV2aWNlX2FwaSBBdWRpbyBEZXZpY2UgQVBJCisgKiBAYnJpZWYgUEpNRURJQSBhdWRpbyBkZXZpY2UgYWJzdHJhY3Rpb24gQVBJLgorICovCisKKy8qKgorICogQGRlZmdyb3VwIHMxX2F1ZGlvX2RldmljZV9jb25maWcgQ29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb25zCisgKiBAaW5ncm91cCBhdWRpb19kZXZpY2VfYXBpCisgKiBAYnJpZWYgQ29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb25zCisgKiBAeworICovCisKKy8qKgorICogVGhpcyBzZXR0aW5nIGNvbnRyb2xzIHdoZXRoZXIgUG9ydEF1ZGlvIHN1cHBvcnQgc2hvdWxkIGJlIGluY2x1ZGVkLgorICoKKyAqIEJ5IGRlZmF1bHQgaXQgaXMgZW5hYmxlZCBleGNlcHQgb24gV2luZG93cyBwbGF0Zm9ybXMgKGluY2x1ZGluZworICogV2luZG93cyBNb2JpbGUpIGFuZCBTeW1iaWFuLgorICovCisjaWZuZGVmIFBKTUVESUFfQVVESU9fREVWX0hBU19QT1JUQVVESU8KKyMgICBpZiAoZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTApIHx8IFwKKyAgICAgICAoZGVmaW5lZChQSl9XSU42NCkgJiYgUEpfV0lONjQhPTApIHx8IFwKKyAgICAgICAoZGVmaW5lZChQSl9TWU1CSUFOKSAmJiBQSl9TWU1CSUFOIT0wKQorIwlkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX1BPUlRBVURJTwkwCisjICAgZWxzZQorIwlkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX1BPUlRBVURJTwkxCisjICAgZW5kaWYKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIEFuZHJvaWQgT3BlblNMIGF1ZGlvIHN1cHBvcnQgc2hvdWxkIGJlCisgKiBpbmNsdWRlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9IQVNfT1BFTlNMCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX0hBU19PUEVOU0wJCTAKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIEFuZHJvaWQgSk5JIGF1ZGlvIHN1cHBvcnQgc2hvdWxkIGJlCisgKiBpbmNsdWRlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9IQVNfQU5EUk9JRF9KTkkKKyMgICBkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX0FORFJPSURfSk5JICAgIDAKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIEJsYWNrQmVycnkgMTAgKEJCMTApIGF1ZGlvIHN1cHBvcnQKKyAqIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9IQVNfQkIxMAorIyAgIGRlZmluZSBQSk1FRElBX0FVRElPX0RFVl9IQVNfQkIxMAkJMAorI2VuZGlmCisKKy8qKgorICogVGhpcyBzZXR0aW5nIGNvbnRyb2xzIHdoZXRoZXIgbmF0aXZlIEFMU0Egc3VwcG9ydCBzaG91bGQgYmUgaW5jbHVkZWQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9BVURJT19ERVZfSEFTX0FMU0EKKyMgICBkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX0FMU0EJCTAKKyNlbmRpZgorCisKKy8qKgorICogVGhpcyBzZXR0aW5nIGNvbnRyb2xzIHdoZXRoZXIgbnVsbCBhdWRpbyBzdXBwb3J0IHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9IQVNfTlVMTF9BVURJTworIyAgIGRlZmluZSBQSk1FRElBX0FVRElPX0RFVl9IQVNfTlVMTF9BVURJTwkwCisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIGNvcmVhdWRpbyBzdXBwb3J0IHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9IQVNfQ09SRUFVRElPCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX0hBU19DT1JFQVVESU8JMAorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBXTU1FIHN1cHBvcnQgc2hvdWxkIGJlIGluY2x1ZGVkLgorICovCisjaWZuZGVmIFBKTUVESUFfQVVESU9fREVWX0hBU19XTU1FCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX0hBU19XTU1FCQkxCisjZW5kaWYKKworIAorLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBCRElNQUQgc3VwcG9ydCBzaG91bGQgYmUgaW5jbHVkZWQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9BVURJT19ERVZfSEFTX0JESU1BRAorIwlkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX0JESU1BRAkwCisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIFN5bWJpYW4gQVBTIHN1cHBvcnQgc2hvdWxkIGJlIGluY2x1ZGVkLgorICovCisjaWZuZGVmIFBKTUVESUFfQVVESU9fREVWX0hBU19TWU1CX0FQUworIyAgIGRlZmluZSBQSk1FRElBX0FVRElPX0RFVl9IQVNfU1lNQl9BUFMJMAorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBTeW1iaWFuIEFQUyBzaG91bGQgcGVyZm9ybSBjb2RlYworICogZGV0ZWN0aW9uIGluIGl0cyBmYWN0b3J5IGluaXRhbGl6YXRpb24uIE5vdGUgdGhhdCBjb2RlYyBkZXRlY3Rpb24gCisgKiBtYXkgdGFrZSBmZXcgc2Vjb25kcyBhbmQgZGV0ZWN0aW5nIG1vcmUgY29kZWNzIHdpbGwgdGFrZSBtb3JlIHRpbWUuCisgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICogLSAwOiBubyBjb2RlYyBkZXRlY3Rpb24sIGFsbCBBUFMgY29kZWMgKEFNUi1OQiwgRy43MTEsIEcuNzI5LCBhbmQKKyAqICAgICAgaUxCQykgd2lsbCBiZSBhc3N1bWVkIGFzIHN1cHBvcnRlZC4KKyAqIC0gMTogbWluaW1hbCBjb2RlYyBkZXRlY3Rpb24sIGkuZTogb25seSBkZXRlY3QgZm9yIEFNUi1OQiBhbmQgRy43MTEsCisgKiAgICAgIChHLjcyOSBhbmQgaUxCQyBhcmUgY29uc2lkZXJlZCB0byBiZSBzdXBwb3J0ZWQvdW5zdXBwb3J0ZWQgd2hlbgorICogICAgICBHLjcxMSBpcyBzdXBwb3J0ZWQvdW5zdXBwb3J0ZWQpLgorICogLSAyOiBmdWxsIGNvZGVjIGRldGVjdGlvbiwgaS5lOiBkZXRlY3QgQU1SLU5CLCBHLjcxMSwgRy43MjksIGFuZCBpTEJDLgorICogCisgKiBEZWZhdWx0OiAxIChtaW5pbWFsIGNvZGVjIGRldGVjdGlvbikKKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9TWU1CX0FQU19ERVRFQ1RTX0NPREVDCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX1NZTUJfQVBTX0RFVEVDVFNfQ09ERUMgMQorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBTeW1iaWFuIFZBUyBzdXBwb3J0IHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVRElPX0RFVl9IQVNfU1lNQl9WQVMKKyMgICBkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX1NZTUJfVkFTCTAKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyBTeW1iaWFuIFZBUyB2ZXJzaW9uIHRvIGJlIHVzZWQuIEN1cnJlbnRseSwgdmFsaWQKKyAqIHZhbHVlcyBhcmUgb25seSAxIChmb3IgVkFTIDEuMCkgYW5kIDIgKGZvciBWQVMgMi4wKS4KKyAqCisgKiBEZWZhdWx0OiAxIChWQVMgdmVyc2lvbiAxLjApCisgKi8KKyNpZm5kZWYgUEpNRURJQV9BVURJT19ERVZfU1lNQl9WQVNfVkVSU0lPTgorIyAgIGRlZmluZSBQSk1FRElBX0FVRElPX0RFVl9TWU1CX1ZBU19WRVJTSU9OCTEKKyNlbmRpZgorCisKKy8qKgorICogVGhpcyBzZXR0aW5nIGNvbnRyb2xzIHdoZXRoZXIgU3ltYmlhbiBhdWRpbyAodXNpbmcgYnVpbHQtaW4gbXVsdGltZWRpYSAKKyAqIGZyYW1ld29yaykgc3VwcG9ydCBzaG91bGQgYmUgaW5jbHVkZWQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9BVURJT19ERVZfSEFTX1NZTUJfTURBCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX0hBU19TWU1CX01EQQlQSl9TWU1CSUFOCisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIHRoZSBTeW1iaWFuIGF1ZGlvIHdpdGggYnVpbHQtaW4gbXVsdGltZWRpYQorICogZnJhbWV3b3JrIGJhY2tlbmQgc2hvdWxkIGJlIHN0YXJ0ZWQgc3luY2hyb25vdXNseS4gTm90ZSB0aGF0IHN5bmNocm9ub3VzCisgKiBzdGFydCB3aWxsIGJsb2NrIHRoZSBhcHBsaWNhdGlvbi9VSSwgZS5nOiBhYm91dCA0MG1zIGZvciBlYWNoIGRpcmVjdGlvbgorICogb24gTjk1LiBXaGlsZSBhc3luY2hyb25vdXMgc3RhcnQgbWF5IGNhdXNlIGludmFsaWQgdmFsdWUgKGFsd2F5cyB6ZXJvKQorICogcmV0dXJuZWQgaW4gaW5wdXQvb3V0cHV0IHZvbHVtZSBxdWVyeSwgaWYgdGhlIHF1ZXJ5IGlzIHBlcmZvcm1lZCB3aGVuCisgKiB0aGUgaW50ZXJuYWwgc3RhcnQgcHJvY2VkdXJlIGlzIG5vdCBjb21wbGV0ZWx5IGZpbmlzaGVkLgorICogCisgKiBEZWZhdWx0OiAxICh5ZXMpCisgKi8KKyNpZm5kZWYgUEpNRURJQV9BVURJT19ERVZfTURBX1VTRV9TWU5DX1NUQVJUCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX01EQV9VU0VfU1lOQ19TVEFSVAkxCisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB3aGV0aGVyIHRoZSBBdWRpbyBEZXZpY2UgQVBJIHNob3VsZCBzdXBwb3J0CisgKiBkZXZpY2UgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBiYXNlZCBvbiB0aGUgb2xkIHNvdW5kIGRldmljZSBBUEkKKyAqIChzb3VuZC5oKS4gCisgKgorICogRW5hYmxlIHRoaXMgQVBJIGlmOgorICogIC0geW91IGhhdmUgaW1wbGVtZW50ZWQgeW91ciBvd24gc291bmQgZGV2aWNlIHVzaW5nIHRoZSBvbGQgc291bmQKKyAqICAgIGRldmljZSBBUEkgKHNvdW5kLmgpLCBhbmQKKyAqICAtIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gdXNlIHlvdXIgc291bmQgZGV2aWNlIGltcGxlbWVudGF0aW9uCisgKiAgICB1c2luZyB0aGUgbmV3IEF1ZGlvIERldmljZSBBUEkuCisgKgorICogUGxlYXNlIHNlZSBodHRwOi8vdHJhYy5wanNpcC5vcmcvcmVwb3Mvd2lraS9BdWRpb19EZXZfQVBJIGZvciBtb3JlCisgKiBpbmZvLgorICovCisjaWZuZGVmIFBKTUVESUFfQVVESU9fREVWX0hBU19MRUdBQ1lfREVWSUNFCisjICAgZGVmaW5lIFBKTUVESUFfQVVESU9fREVWX0hBU19MRUdBQ1lfREVWSUNFCTAKKyNlbmRpZgorCisKKy8qKgorICogQH0KKyAqLworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQVVESU9ERVZfQ09ORklHX0hfXyAqLworCisvKgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBET0NVTUVOVEFUSU9OIEZPTExPV1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBhdWRpb19kZXZpY2VfYXBpIEF1ZGlvIERldmljZSBBUEkKKyAqIEB7CisKK1BKTUVESUEgQXVkaW8gRGV2aWNlIEFQSSBpcyBhIGNyb3NzLXBsYXRmb3JtIGF1ZGlvIEFQSSBhcHByb3ByaWF0ZSBmb3IgdXNlIHdpdGgKK1ZvSVAgYXBwbGljYXRpb25zIGFuZCBtYW55IG90aGVyIHR5cGVzIG9mIGF1ZGlvIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMuIAorCitUaGUgQVBJIGFic3RyYWN0cyBtYW55IGRpZmZlcmVudCBhdWRpbyBBUEkncyBvbiB2YXJpb3VzIHBsYXRmb3Jtcywgc3VjaCBhczoKKyAtIFBvcnRBdWRpbyBiYWNrLWVuZCBmb3IgV2luMzIsIFdpbmRvd3MgTW9iaWxlLCBMaW51eCwgVW5peCwgZGFuIE1hY09TIFguCisgLSBuYXRpdmUgV01NRSBhdWRpbyBmb3IgV2luMzIgYW5kIFdpbmRvd3MgTW9iaWxlIGRldmljZXMKKyAtIG5hdGl2ZSBTeW1iaWFuIGF1ZGlvIHN0cmVhbWluZy9tdWx0aW1lZGlhIGZyYW1ld29yayAoTU1GKSBpbXBsZW1lbnRhdGlvbgorIC0gbmF0aXZlIE5va2lhIEF1ZGlvIFByb3h5IFNlcnZlciAoQVBTKSBpbXBsZW1lbnRhdGlvbgorIC0gbnVsbC1hdWRpbyBpbXBsZW1lbnRhdGlvbgorIC0gYW5kIG1vcmUgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGZ1dHVyZQorCitUaGUgQXVkaW8gRGV2aWNlIEFQSS9saWJyYXJ5IGlzIGFuIGV2b2x1dGlvbiBmcm9tIFBKTUVESUEgQHJlZiBQSk1FRF9TTkQgYW5kIAorY29udGFpbnMgbWFueSBlbmhhbmNlbWVudHM6CisKKyAtIEZvcndhcmQgY29tcGF0aWJpbGl0eToKK1xuCisgICBUaGUgbmV3IEFQSSBoYXMgYmVlbiBkZXNpZ25lZCB0byBiZSBleHRlbnNpYmxlLCBpdCB3aWxsIHN1cHBvcnQgbmV3IEFQSSdzIGFzIAorICAgd2VsbCBhcyBuZXcgZmVhdHVyZXMgdGhhdCBtYXkgYmUgaW50cm9kdWNlZCBpbiB0aGUgZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcgCisgICBjb21wYXRpYmlsaXR5IHdpdGggYXBwbGljYXRpb25zIHRoYXQgdXNlIHRoaXMgQVBJIGFzIHdlbGwgYXMgY29tcGF0aWJpbGl0eSAKKyAgIHdpdGggZXhpc3RpbmcgZGV2aWNlIGltcGxlbWVudGF0aW9ucy4gCisKKyAtIERldmljZSBjYXBhYmlsaXRpZXM6CitcbgorICAgQXQgdGhlIGhlYXJ0IG9mIHRoZSBBUEkgaXMgZGV2aWNlIGNhcGFiaWxpdGllcyBtYW5hZ2VtZW50LCB3aGVyZSBhbGwgcG9zc2libGUKKyAgIGF1ZGlvIGNhcGFiaWxpdGllcyBvZiBhdWRpbyBkZXZpY2VzIHNob3VsZCBiZSBhYmxlIHRvIGJlIGhhbmRsZWQgaW4gYSBnZW5lcmljCisgICBtYW5uZXIuIFdpdGggdGhpcyBmcmFtZXdvcmssIG5ldyBjYXBhYmlsaXRpZXMgdGhhdCBtYXkgYmUgZGlzY292ZXJlZCBpbiB0aGUgCisgICBmdXR1cmUgY2FuIGJlIGhhbmRsZWQgaW4gbWFubmVyIHdpdGhvdXQgYnJlYWtpbmcgZXhpc3RpbmcgYXBwbGljYXRpb25zLiAKKworIC0gQnVpbHQtaW4gZmVhdHVyZXM6CitcbgorICAgVGhlIGRldmljZSBjYXBhYmlsaXRpZXMgZnJhbWV3b3JrIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHVzZSBhbmQgY29udHJvbCAKKyAgIGF1ZGlvIGZlYXR1cmVzIGJ1aWx0LWluIGluIHRoZSBkZXZpY2UsIHN1Y2ggYXM6CisgICAgLSBlY2hvIGNhbmNlbGxhdGlvbiwgCisgICAgLSBidWlsdC1pbiBjb2RlY3MsIAorICAgIC0gYXVkaW8gcm91dGluZyAoZS5nLiB0byBlYXJwaWVjZSBvciBsb3Vkc3BlYWtlciksCisgICAgLSB2b2x1bWUgY29udHJvbCwKKyAgICAtIGV0Yy4KKworIC0gQ29kZWMgc3VwcG9ydDoKK1xuCisgICBTb21lIGF1ZGlvIGRldmljZXMgc3VjaCBhcyBOb2tpYS9TeW1iaWFuIEF1ZGlvIFByb3h5IFNlcnZlciAoQVBTKSBhbmQgTm9raWEgCisgICBWb0lQIEF1ZGlvIFNlcnZpY2VzIChWQVMpIHN1cHBvcnQgYnVpbHQtaW4gaGFyZHdhcmUgYXVkaW8gY29kZWNzIChlLmcuIEcuNzI5LAorICAgaUxCQywgYW5kIEFNUiksIGFuZCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBzb3VuZCBkZXZpY2UgaW4gZW5jb2RlZCBtb2RlIHRvCisgICBtYWtlIHVzZSBvZiB0aGVzZSBoYXJkd2FyZSBjb2RlY3MuIAorCisgLSBNdWx0aXBsZSBiYWNrZW5kczoKK1xuCisgICBUaGUgbmV3IEFQSSBzdXBwb3J0cyBtdWx0aXBsZSBhdWRpbyBiYWNrZW5kcyAoY2FsbGVkIGZhY3RvcmllcyBvciBkcml2ZXJzIGluIAorICAgdGhlIGNvZGUpIHRvIGJlIGFjdGl2ZSBzaW11bHRhbmVvdXNseSwgYW5kIGF1ZGlvIGJhY2tlbmRzIG1heSBiZSBhZGRlZCBvciAKKyAgIHJlbW92ZWQgZHVyaW5nIHJ1bi10aW1lLiAKKworCitAc2VjdGlvbiB1c2luZyBPdmVydmlldyBvbiB1c2luZyB0aGUgQVBJCisKK0BzdWJzZWN0aW9uIGdldHRpbmdfc3RhcnRlZCBHZXR0aW5nIHN0YXJ0ZWQKKworIC0jIDxiPkNvbmZpZ3VyZSB0aGUgYXBwbGljYXRpb24ncyBwcm9qZWN0IHNldHRpbmdzPC9iPi5cbgorICAgIEFkZCB0aGUgZm9sbG93aW5nIAorICAgIGluY2x1ZGU6CisgICAgXGNvZGUKKyAgICAjaW5jbHVkZSA8cGptZWRpYV9hdWRpb2Rldi5oPlxlbmRjb2RlXG4KKyAgICBBbmQgYWRkIDxiPnBqbWVkaWEtYXVkaW9kZXY8L2I+IGxpYnJhcnkgdG8geW91ciBhcHBsaWNhdGlvbiBsaW5rIAorICAgIHNwZWNpZmljYXRpb25zLlxuCisgLSMgPGI+Q29tcGlsZSB0aW1lIHNldHRpbmdzPC9iPi5cbgorICAgIFVzZSB0aGUgY29tcGlsZSB0aW1lIHNldHRpbmdzIHRvIGVuYWJsZSBvcgorICAgIGRpc2FibGUgc3BlY2lmaWMgYXVkaW8gZHJpdmVycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUKKyAgICBccmVmIHMxX2F1ZGlvX2RldmljZV9jb25maWcuCisgLSMgPGI+QVBJIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbmluZyB1cDwvYj4uXG4KKyAgICBCZWZvcmUgYW55dGhpbmcgZWxzZSwgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHRoZSBBUEkgYnkgY2FsbGluZzoKKyAgICBcY29kZQorICAgIHBqbWVkaWFfYXVkX3N1YnN5c19pbml0KHBmKTtcZW5kY29kZVxuCisgICAgQW5kIGFkZCB0aGlzIGluIHRoZSBhcHBsaWNhdGlvbiBjbGVhbnVwIHNlcXVlbmNlCisgICAgXGNvZGUKKyAgICBwam1lZGlhX2F1ZF9zdWJzeXNfc2h1dGRvd24oKTtcZW5kY29kZQorCitAc3Vic2VjdGlvbiBkZXZpY2VzIFdvcmtpbmcgd2l0aCBkZXZpY2VzCisKKyAtIyBUaGUgZm9sbG93aW5nIGNvZGUgcHJpbnRzIHRoZSBsaXN0IG9mIGF1ZGlvIGRldmljZXMgZGV0ZWN0ZWQKKyAgICBpbiB0aGUgc3lzdGVtLgorICAgIFxjb2RlCisgICAgaW50IGRldl9jb3VudDsKKyAgICBwam1lZGlhX2F1ZF9kZXZfaW5kZXggZGV2X2lkeDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBkZXZfY291bnQgPSBwam1lZGlhX2F1ZF9kZXZfY291bnQoKTsKKyAgICBwcmludGYoIkdvdCAlZCBhdWRpbyBkZXZpY2VzXG4iLCBkZXZfY291bnQpOworCisgICAgZm9yIChkZXZfaWR4PTA7IGRldl9pZHg8ZGV2X2NvdW50OyArK2kpIHsKKwlwam1lZGlhX2F1ZF9kZXZfaW5mbyBpbmZvOworCisJc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKGRldl9pZHgsICZpbmZvKTsKKwlwcmludGYoIiVkLiAlcyAoaW49JWQsIG91dD0lZClcbiIsCisJICAgICAgIGRldl9pZHgsIGluZm8ubmFtZSwgCisJICAgICAgIGluZm8uaW5wdXRfY291bnQsIGluZm8ub3V0cHV0X2NvdW50KTsKKyAgICB9CisgICAgXGVuZGNvZGVcbgorIC0jIEluZm86IFRoZSAjUEpNRURJQV9BVURfREVGQVVMVF9DQVBUVVJFX0RFViBhbmQgI1BKTUVESUFfQVVEX0RFRkFVTFRfUExBWUJBQ0tfREVWCisgICAgY29uc3RhbnRzIGFyZSB1c2VkIHRvIGRlbm90ZSBkZWZhdWx0IGNhcHR1cmUgYW5kIHBsYXliYWNrIGRldmljZXMKKyAgICByZXNwZWN0aXZlbHkuCisgLSMgSW5mbzogWW91IG1heSBzYXZlIHRoZSBkZXZpY2UgYW5kIGRyaXZlcidzIG5hbWUgaW4geW91ciBhcHBsaWNhdGlvbgorICAgIHNldHRpbmcsIGZvciBleGFtcGxlIHRvIHNwZWNpZnkgdGhlIHByZWZlcmVkIGRldmljZXMgdG8gYmUKKyAgICB1c2VkIGJ5IHlvdXIgYXBwbGljYXRpb24uIFlvdSBjYW4gdGhlbiByZXRyaWV2ZSB0aGUgZGV2aWNlIGluZGV4CisgICAgZm9yIHRoZSBkZXZpY2UgYnkgY2FsbGluZzoKKyAgICBcY29kZQorCWNvbnN0IGNoYXIgKmRydl9uYW1lID0gIldNTUUiOworCWNvbnN0IGNoYXIgKmRldl9uYW1lID0gIldhdmUgbWFwcGVyIjsKKwlwam1lZGlhX2F1ZF9kZXZfaW5kZXggZGV2X2lkeDsKKworICAgICAgICBzdGF0dXMgPSBwam1lZGlhX2F1ZF9kZXZfbG9va3VwKGRydl9uYW1lLCBkZXZfbmFtZSwgJmRldl9pZHgpOworCWlmIChzdGF0dXM9PVBKX1NVQ0NFU1MpCisJICAgIHByaW50ZigiRGV2aWNlIGluZGV4IGlzICVkXG4iLCBkZXZfaWR4KTsKKyAgICBcZW5kY29kZQorCitAc3Vic2VjdGlvbiBjYXBzIERldmljZSBjYXBhYmlsaXRpZXMKKworQ2FwYWJpbGl0aWVzIGFyZSBlbmNvZGVkIGFzICNwam1lZGlhX2F1ZF9kZXZfY2FwIGVudW1lcmF0aW9uLiBQbGVhc2Ugc2VlCisjcGptZWRpYV9hdWRfZGV2X2NhcCBlbnVtZXJhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIC0jIFRoZSBmb2xsb3dpbmcgc25pcHBldCBwcmludHMgdGhlIGNhcGFiaWxpdGllcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZToKKyAgICBcY29kZQorICAgIHBqbWVkaWFfYXVkX2Rldl9pbmZvIGluZm87CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfZGV2X2dldF9pbmZvKFBKTUVESUFfQVVEX0RFRkFVTFRfQ0FQVFVSRV9ERVYsICZpbmZvKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwl1bnNpZ25lZCBpOworCS8vIEVudW1lcmF0ZSBjYXBhYmlsaXR5IGJpdHMKKwlwcmludGYoIkRldmljZSBjYXBhYmlsaXRpZXM6ICIpOworCWZvciAoaT0wOyBpPDMyOyArK2kpIHsKKwkgICAgaWYgKGluZm8uY2FwcyAmICgxIDw8IGkpKQorCQlwcmludGYoIiVzICIsIHBqbWVkaWFfYXVkX2Rldl9jYXBfbmFtZSgxIDw8IGksIE5VTEwpKTsKKwl9CisgICAgfQorICAgIFxlbmRjb2RlXG4KKyAtIyBJbmZvOiBZb3UgY2FuIHNldCB0aGUgZGV2aWNlIHNldHRpbmdzIHdoZW4gb3BlbmluZyBhdWRpbyBzdHJlYW0gYnkgc2V0dGluZworICAgIHRoZSBmbGFncyBhbmQgdGhlIGFwcHJvcHJpYXRlIHNldHRpbmcgaW4gI3BqbWVkaWFfYXVkX3BhcmFtIHdoZW4gY2FsbGluZworICAgICNwam1lZGlhX2F1ZF9zdHJlYW1fY3JlYXRlKClcbgorIC0jIEluZm86IE9uY2UgdGhlIGF1ZGlvIHN0cmVhbSBpcyBydW5uaW5nLCB5b3UgY2FuIHJldHJpZXZlIG9yIGNoYW5nZSB0aGUgc3RyZWFtIAorICAgIHNldHRpbmcgYnkgc3BlY2lmeWluZyB0aGUgY2FwYWJpbGl0eSBpbiAjcGptZWRpYV9hdWRfc3RyZWFtX2dldF9jYXAoKQorICAgIGFuZCAjcGptZWRpYV9hdWRfc3RyZWFtX3NldF9jYXAoKSByZXNwZWN0aXZlbHkuCisKKworQHN1YnNlY3Rpb24gY3JlYXRpbmdfc3RyZWFtIENyZWF0aW5nIGF1ZGlvIHN0cmVhbXMKKworVGhlIGF1ZGlvIHN0cmVhbSBlbmFibGVzIGF1ZGlvIHN0cmVhbWluZyB0byBjYXB0dXJlIGRldmljZSwgcGxheWJhY2sgZGV2aWNlLAorb3IgYm90aC4KKworIC0jIEl0IGlzIHJlY29tbWVuZGVkIHRvIGluaXRpYWxpemUgdGhlICNwam1lZGlhX2F1ZF9wYXJhbSB3aXRoIGl0cyBkZWZhdWx0CisgICAgdmFsdWVzIGJlZm9yZSB1c2luZyBpdDoKKyAgICBcY29kZQorICAgIHBqbWVkaWFfYXVkX3BhcmFtIHBhcmFtOworICAgIHBqbWVkaWFfYXVkX2Rldl9pbmRleCBkZXZfaWR4OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGRldl9pZHggPSBQSk1FRElBX0FVRF9ERUZBVUxUX0NBUFRVUkVfREVWOworICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX2Rldl9kZWZhdWx0X3BhcmFtKGRldl9pZHgsICZwYXJhbSk7CisgICAgXGVuZGNvZGVcbgorIC0jIENvbmZpZ3VyZSB0aGUgbWFuZGF0b3J5IHBhcmFtZXRlcnM6CisgICAgXGNvZGUKKyAgICBwYXJhbS5kaXIgPSBQSk1FRElBX0RJUl9DQVBUVVJFX1BMQVlCQUNLOworICAgIHBhcmFtLnJlY19pZCA9IFBKTUVESUFfQVVEX0RFRkFVTFRfQ0FQVFVSRV9ERVY7CisgICAgcGFyYW0ucGxheV9pZCA9IFBKTUVESUFfQVVEX0RFRkFVTFRfUExBWUJBQ0tfREVWOworICAgIHBhcmFtLmNsb2NrX3JhdGUgPSA4MDAwOworICAgIHBhcmFtLmNoYW5uZWxfY291bnQgPSAxOworICAgIHBhcmFtLnNhbXBsZXNfcGVyX2ZyYW1lID0gMTYwOworICAgIHBhcmFtLmJpdHNfcGVyX3NhbXBsZSA9IDE2OworICAgIFxlbmRjb2RlXG4KKyAtIyBJZiB5b3Ugd2FudCB0aGUgYXVkaW8gc3RyZWFtIHRvIHVzZSB0aGUgZGV2aWNlJ3MgYnVpbHQtaW4gY29kZWMsIHNwZWNpZnkKKyAgICB0aGUgY29kZWMgaW4gdGhlICNwam1lZGlhX2F1ZF9wYXJhbS4gWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGVjCisgICAgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIGJ5IGxvb2tpbmcgYXQgaXRzIHN1cHBvcnRlZCBmb3JtYXQgbGlzdCBpbgorICAgIHRoZSAjcGptZWRpYV9hdWRfZGV2X2luZm8uXG4KKyAgICBUaGUgc25pcHBldCBiZWxvdyBzZXRzIHRoZSBhdWRpbyBzdHJlYW0gdG8gdXNlIEcuNzExIFVMQVcgZW5jb2Rpbmc6CisgICAgXGNvZGUKKyAgICB1bnNpZ25lZCBpOworCisgICAgLy8gTWFrZSBzdXJlIFVsYXcgaXMgc3VwcG9ydGVkCisgICAgaWYgKChpbmZvLmNhcHMgJiBQSk1FRElBX0FVRF9ERVZfQ0FQX0VYVF9GT1JNQVQpID09IDApCisJZXJyb3IoIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuZGVkIGZvcm1hdHMiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby5leHRfZm10X2NudDsgKytpKSB7CisJaWYgKGluZm8uZXh0X2ZtdFtpXS5pZCA9PSBQSk1FRElBX0ZPUk1BVF9VTEFXKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gaW5mby5leHRfZm10X2NudCkKKwllcnJvcigiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgVWxhdyBmb3JtYXQiKTsKKworICAgIC8vIFNldCBVbGF3IGZvcm1hdAorICAgIHBhcmFtLmZsYWdzIHw9IFBKTUVESUFfQVVEX0RFVl9DQVBfRVhUX0ZPUk1BVDsKKyAgICBwYXJhbS5leHRfZm10LmlkID0gUEpNRURJQV9GT1JNQVRfVUxBVzsKKyAgICBwYXJhbS5leHRfZm10LmJpdHJhdGUgPSA2NDAwMDsKKyAgICBwYXJhbS5leHRfZm10LnZhZCA9IFBKX0ZBTFNFOworICAgIFxlbmRjb2RlXG4KKyAtIyBOb3RlIHRoYXQgaWYgbm9uLVBDTSBmb3JtYXQgaXMgY29uZmlndXJlZCBvbiB0aGUgYXVkaW8gc3RyZWFtLCB0aGUKKyAgICBjYXB0dXJlIGFuZC9vciBwbGF5YmFjayBmdW5jdGlvbnMgKCNwam1lZGlhX2F1ZF9yZWNfY2IgYW5kIAorICAgICNwam1lZGlhX2F1ZF9wbGF5X2NiIHJlc3BlY3RpdmVseSkgd2lsbCByZXBvcnQgdGhlIGF1ZGlvIGZyYW1lIGFzCisgICAgI3BqbWVkaWFfZnJhbWVfZXh0IHN0cnVjdHVyZSBpbnN0ZWFkIG9mIHRoZSAjcGptZWRpYV9mcmFtZS4KKyAtIyBPcHRpb25hbGx5IGNvbmZpZ3VyZSBvdGhlciBkZXZpY2UncyBjYXBhYmlsaXRpZXMuIFRoZSBmb2xsb3dpbmcgc25pcHBldAorICAgIHNob3dzIGhvdyB0byBlbmFibGUgZWNobyBjYW5jZWxsYXRpb24gb24gdGhlIGRldmljZSAobm90ZSB0aGF0IHRoaXMKKyAgICBzbmlwcGV0IG1heSBub3QgYmUgbmVjZXNzYXJ5IHNpbmNlIHRoZSBzZXR0aW5nIG1heSBoYXZlIGJlZW4gZW5hYmxlZCAKKyAgICB3aGVuIGNhbGxpbmcgI3BqbWVkaWFfYXVkX2Rldl9kZWZhdWx0X3BhcmFtKCkgYWJvdmUpOgorICAgIFxjb2RlCisgICAgaWYgKGluZm8uY2FwcyAmIFBKTUVESUFfQVVEX0RFVl9DQVBfRUMpIHsKKwlwYXJhbS5mbGFncyB8PSBQSk1FRElBX0FVRF9ERVZfQ0FQX0VDOworCXBhcmFtLmVjX2VuYWJsZWQgPSBQSl9UUlVFOworICAgIH0KKyAgICBcZW5kY29kZQorIC0jIE9wZW4gdGhlIGF1ZGlvIHN0cmVhbSwgc3BlY2lmeWluZyB0aGUgY2FwdHVyZSBhbmQvb3IgcGxheWJhY2sgY2FsbGJhY2sKKyAgICBmdW5jdGlvbnM6CisgICAgXGNvZGUKKyAgICAgICBwam1lZGlhX2F1ZF9zdHJlYW0gKnN0cmVhbTsKKworICAgICAgIHN0YXR1cyA9IHBqbWVkaWFfYXVkX3N0cmVhbV9jcmVhdGUoJnBhcmFtLCAmcmVjX2NiLCAmcGxheV9jYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEsICZzdHJlYW0pOworICAgIFxlbmRjb2RlCisKK0BzdWJzZWN0aW9uIHdvcmtpbmdfd2l0aF9zdHJlYW0gV29ya2luZyB3aXRoIGF1ZGlvIHN0cmVhbXMKKworIC0jIFRvIHN0YXJ0IHRoZSBhdWRpbyBzdHJlYW06CisgICAgXGNvZGUKKwlzdGF0dXMgPSBwam1lZGlhX2F1ZF9zdHJlYW1fc3RhcnQoc3RyZWFtKTsKKyAgICBcZW5kY29kZVxuCisgICAgVG8gc3RvcCB0aGUgc3RyZWFtOgorICAgIFxjb2RlCisJc3RhdHVzID0gcGptZWRpYV9hdWRfc3RyZWFtX3N0b3Aoc3RyZWFtKTsKKyAgICBcZW5kY29kZVxuCisgICAgQW5kIHRvIGRlc3Ryb3kgdGhlIHN0cmVhbToKKyAgICBcY29kZQorCXN0YXR1cyA9IHBqbWVkaWFfYXVkX3N0cmVhbV9kZXN0cm95KHN0cmVhbSk7CisgICAgXGVuZGNvZGVcbgorIC0jIEluZm86IFRoZSBmb2xsb3dpbmcgc2hvd3MgaG93IHRvIHJldHJpZXZlIHRoZSBjYXBhYmlsaXR5IHZhbHVlIG9mIHRoZQorICAgIHN0cmVhbSAoaW4gdGhpcyBjYXNlLCB0aGUgY3VycmVudCBvdXRwdXQgdm9sdW1lIHNldHRpbmcpLgorICAgIFxjb2RlCisgICAgLy8gVm9sdW1lIHNldHRpbmcgaXMgYW4gdW5zaWduZWQgaW50ZWdlciBzaG93aW5nIHRoZSBsZXZlbCBpbiBwZXJjZW50LgorICAgIHVuc2lnbmVkIHZvbDsKKyAgICBzdGF0dXMgPSBwam1lZGlhX2F1ZF9zdHJlYW1fZ2V0X2NhcChzdHJlYW0sIAorCQkJCQlQSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9WT0xVTUVfU0VUVElORywKKwkJCQkJJnZvbCk7CisgICAgXGVuZGNvZGUKKyAtIyBJbmZvOiBBbmQgZm9sbG93aW5nIHNob3dzIGhvdyB0byBtb2RpZnkgdGhlIGNhcGFiaWxpdHkgdmFsdWUgb2YgdGhlCisgICAgc3RyZWFtIChpbiB0aGlzIGNhc2UsIHRoZSBjdXJyZW50IG91dHB1dCB2b2x1bWUgc2V0dGluZykuCisgICAgXGNvZGUKKyAgICAvLyBWb2x1bWUgc2V0dGluZyBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHNob3dpbmcgdGhlIGxldmVsIGluIHBlcmNlbnQuCisgICAgdW5zaWduZWQgdm9sID0gNTA7CisgICAgc3RhdHVzID0gcGptZWRpYV9hdWRfc3RyZWFtX3NldF9jYXAoc3RyZWFtLCAKKwkJCQkJUEpNRURJQV9BVURfREVWX0NBUF9PVVRQVVRfVk9MVU1FX1NFVFRJTkcsCisJCQkJCSZ2b2wpOworICAgIFxlbmRjb2RlCisKKworKi8KKworCisvKioKKyAqIEB9CisgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtYXVkaW9kZXYvZXJybm8uaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiZTliMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWF1ZGlvZGV2L2Vycm5vLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qICRJZDogZXJybm8uaCA0NDMyIDIwMTMtMDMtMDggMDg6MDI6NDhaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9BVURJT0RFVl9BVURJT0RFVl9FUlJOT19IX18KKyNkZWZpbmUgX19QSk1FRElBX0FVRElPREVWX0FVRElPREVWX0VSUk5PX0hfXworCisvKioKKyAqIEBmaWxlIGVycm5vLmggRXJyb3IgQ29kZXMKKyAqIEBicmllZiBBdWRpb2RldiBzcGVjaWZpYyBlcnJvciBjb2Rlcy4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS1hdWRpb2Rldi9jb25maWcuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCisvKioKKyAqIEBkZWZncm91cCBlcnJvcl9jb2RlcyBFcnJvciBDb2RlcworICogQGluZ3JvdXAgYXVkaW9fZGV2aWNlX2FwaQorICogQGJyaWVmIEF1ZGlvIGRldml2ZSBsaWJyYXJ5IHNwZWNpZmljIGVycm9yIGNvZGVzLgorICogQHsKKyAqLworCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIFN0YXJ0IG9mIGVycm9yIGNvZGUgcmVsYXRpdmUgdG8gUEpfRVJSTk9fU1RBUlRfVVNFUi4KKyAqIFRoaXMgdmFsdWUgaXMgNDIwMDAwLgorICovCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQgXAorCSAgICAoUEpfRVJSTk9fU1RBUlRfVVNFUiArIFBKX0VSUk5PX1NQQUNFX1NJWkUqNSkKKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9FUlJOT19FTkQgICBcCisJICAgIChQSk1FRElBX0FVRElPREVWX0VSUk5PX1NUQVJUICsgUEpfRVJSTk9fU1BBQ0VfU0laRSAtIDEpCisKKworLyoqCisgKiBNYXBwaW5nIGZyb20gUG9ydEF1ZGlvIGVycm9yIGNvZGVzIHRvIHBqbWVkaWEgZXJyb3Igc3BhY2UuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9QT1JUQVVESU9fRVJSTk9fU1RBUlQgXAorCSAgICAoUEpNRURJQV9BVURJT0RFVl9FUlJOT19FTkQtMTAwMDApCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfUE9SVEFVRElPX0VSUk5PX0VORCAgIFwKKwkgICAgKFBKTUVESUFfQVVESU9ERVZfUE9SVEFVRElPX0VSUk5PX1NUQVJUICsgMTAwMDAgLTEpCisvKioKKyAqIENvbnZlcnQgUG9ydEF1ZGlvIGVycm9yIGNvZGUgdG8gUEpMSUIgZXJyb3IgY29kZS4KKyAqIFBvcnRBdWRpbyBlcnJvciBjb2RlIHJhbmdlOiAwID49IGVyciA+PSAtMTAwMDAKKyAqLworI2RlZmluZSBQSk1FRElBX0FVRElPREVWX0VSUk5PX0ZST01fUE9SVEFVRElPKGVycikgXAorCSAgICAoKGludClQSk1FRElBX0FVRElPREVWX1BPUlRBVURJT19FUlJOT19TVEFSVC1lcnIpCisKKy8qKgorICogTWFwcGluZyBmcm9tIFdpbmRvd3MgbXVsdGltZWRpYSBXYXZlSW4gZXJyb3IgY29kZXMuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9XTU1FX0lOX0VSUk9SX1NUQVJUCVwKKwkgICAgKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQgKyAzMDAwMCkKKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9XTU1FX0lOX0VSUk9SX0VORAlcCisJICAgIChQSk1FRElBX0FVRElPREVWX1dNTUVfSU5fRVJST1JfU1RBUlQgKyAxMDAwIC0gMSkKKy8qKgorICogQ29udmVydCBXYXZlSW4gb3BlcmF0aW9uIGVycm9yIGNvZGVzIHRvIFBKTElCIGVycm9yIHNwYWNlLgorICovCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfRVJSTk9fRlJPTV9XTU1FX0lOKGVycikgXAorCSAgICAoKGludClQSk1FRElBX0FVRElPREVWX1dNTUVfSU5fRVJST1JfU1RBUlQrZXJyKQorCisKKy8qKgorICogTWFwcGluZyBmcm9tIFdpbmRvd3MgbXVsdGltZWRpYSBXYXZlT3V0IGVycm9yIGNvZGVzLgorICovCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfV01NRV9PVVRfRVJST1JfU1RBUlQJXAorCSAgICAoUEpNRURJQV9BVURJT0RFVl9XTU1FX0lOX0VSUk9SX0VORCArIDEwMDApCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfV01NRV9PVVRfRVJST1JfRU5ECVwKKwkgICAgKFBKTUVESUFfQVVESU9ERVZfV01NRV9PVVRfRVJST1JfU1RBUlQgKyAxMDAwKQorLyoqCisgKiBDb252ZXJ0IFdhdmVPdXQgb3BlcmF0aW9uIGVycm9yIGNvZGVzIHRvIFBKTElCIGVycm9yIHNwYWNlLgorICovCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfRVJSTk9fRlJPTV9XTU1FX09VVChlcnIpIFwKKwkgICAgKChpbnQpUEpNRURJQV9BVURJT0RFVl9XTU1FX09VVF9FUlJPUl9TVEFSVCtlcnIpCisKKworLyoqCisgKiBNYXBwaW5nIGZyb20gQ29yZUF1ZGlvIGVycm9yIGNvZGVzIHRvIHBqbWVkaWEgZXJyb3Igc3BhY2UuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9DT1JFQVVESU9fRVJSTk9fU1RBUlQgXAorCSAgICAoUEpNRURJQV9BVURJT0RFVl9FUlJOT19TVEFSVCsyMDAwMCkKKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9DT1JFQVVESU9fRVJSTk9fRU5EICAgXAorCSAgICAoUEpNRURJQV9BVURJT0RFVl9DT1JFQVVESU9fRVJSTk9fU1RBUlQgKyAyMDAwMCAtMSkKKy8qKgorICogQ29udmVydCBDb3JlQXVkaW8gZXJyb3IgY29kZSB0byBQSkxJQiBlcnJvciBjb2RlLgorICogQ29yZUF1ZGlvIGVycm9yIGNvZGUgcmFuZ2U6IDAgPj0gZXJyID49IC0xMDAwMAorICovCisjZGVmaW5lIFBKTUVESUFfQVVESU9ERVZfRVJSTk9fRlJPTV9DT1JFQVVESU8oZXJyKSBcCisJICAgICgoaW50KVBKTUVESUFfQVVESU9ERVZfQ09SRUFVRElPX0VSUk5PX1NUQVJULWVycikKKworLyoqCisgKiBNYXBwaW5nIGZyb20gQkRJTUFEIGVycm9yIGNvZGVzIHRvIHBqbWVkaWEgZXJyb3Igc3BhY2UuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9CRElNQURfRVJST1JfU1RBUlQJXAorCSAgICAoUEpNRURJQV9BVURJT0RFVl9FUlJOT19TVEFSVCArIDQwMDAwKQorI2RlZmluZSBQSk1FRElBX0FVRElPREVWX0JESU1BRF9FUlJPUl9FTkQJXAorCSAgICAoUEpNRURJQV9BVURJT0RFVl9CRElNQURfRVJST1JfU1RBUlQgKyAyMDAwIC0gMSkKKy8qKgorICogQ29udmVydCBCRElNQUQgZXJyb3IgY29kZXMgdG8gUEpMSUIgZXJyb3Igc3BhY2UuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9BVURJT0RFVl9FUlJOT19GUk9NX0JESU1BRChlcnIpIFwKKwkgICAgKChpbnQpUEpNRURJQV9BVURJT0RFVl9CRElNQURfRVJST1JfU1RBUlQrZXJyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBdWRpbyBEZXZpY2UgQVBJIGVycm9yIGNvZGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEdlbmVyYWwvdW5rbm93biBlcnJvci4KKyAqLworI2RlZmluZSBQSk1FRElBX0VBVURfRVJSCShQSk1FRElBX0FVRElPREVWX0VSUk5PX1NUQVJUKzEpIC8qIDQyMDAwMSAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFVua25vd24gZXJyb3IgZnJvbSBhdWRpbyBkcml2ZXIKKyAqLworI2RlZmluZSBQSk1FRElBX0VBVURfU1lTRVJSCShQSk1FRElBX0FVRElPREVWX0VSUk5PX1NUQVJUKzIpIC8qIDQyMDAwMiAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEF1ZGlvIHN1YnN5c3RlbSBub3QgaW5pdGlhbGl6ZWQKKyAqLworI2RlZmluZSBQSk1FRElBX0VBVURfSU5JVAkoUEpNRURJQV9BVURJT0RFVl9FUlJOT19TVEFSVCszKSAvKiA0MjAwMDMgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIGF1ZGlvIGRldmljZQorICovCisjZGVmaW5lIFBKTUVESUFfRUFVRF9JTlZERVYJKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQrNCkgLyogNDIwMDA0ICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogRm91bmQgbm8gZGV2aWNlcworICovCisjZGVmaW5lIFBKTUVESUFfRUFVRF9OT0RFVgkoUEpNRURJQV9BVURJT0RFVl9FUlJOT19TVEFSVCs1KSAvKiA0MjAwMDUgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBVbmFibGUgdG8gZmluZCBkZWZhdWx0IGRldmljZQorICovCisjZGVmaW5lIFBKTUVESUFfRUFVRF9OT0RFRkRFVgkoUEpNRURJQV9BVURJT0RFVl9FUlJOT19TVEFSVCs2KSAvKiA0MjAwMDYgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBEZXZpY2Ugbm90IHJlYWR5CisgKi8KKyNkZWZpbmUgUEpNRURJQV9FQVVEX05PVFJFQURZCShQSk1FRElBX0FVRElPREVWX0VSUk5PX1NUQVJUKzcpIC8qIDQyMDAwNyAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFRoZSBhdWRpbyBjYXBhYmlsaXR5IGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZAorICovCisjZGVmaW5lIFBKTUVESUFfRUFVRF9JTlZDQVAJKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQrOCkgLyogNDIwMDA4ICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogVGhlIG9wZXJhdGlvbiBpcyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBQSk1FRElBX0VBVURfSU5WT1AJKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQrOSkgLyogNDIwMDA5ICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQmFkIG9yIGludmFsaWQgYXVkaW8gZGV2aWNlIGZvcm1hdAorICovCisjZGVmaW5lIFBKTUVESUFfRUFVRF9CQURGT1JNQVQJKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQrMTApIC8qIDQyMDAwMTAgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIGF1ZGlvIGRldmljZSBzYW1wbGUgZm9ybWF0CisgKi8KKyNkZWZpbmUgUEpNRURJQV9FQVVEX1NBTVBGT1JNQVQJKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQrMTEpIC8qIDQyMDAwMTEgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBCYWQgbGF0ZW5jeSBzZXR0aW5nCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FQVVEX0JBRExBVEVOQ1kJKFBKTUVESUFfQVVESU9ERVZfRVJSTk9fU1RBUlQrMTIpIC8qIDQyMDAwMTIgKi8KKworCisKKworCisvKioKKyAqIEdldCBlcnJvciBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUuIE5vdGUgdGhhdCB0aGlzCisgKiBmdW5jdGlvbiBpcyBvbmx5IGFibGUgdG8gZGVjb2RlIFBKTUVESUEgQXVkaW9kZXYgc3BlY2lmaWMgZXJyb3IgY29kZS4KKyAqIEFwcGxpY2F0aW9uIHNob3VsZCB1c2UgcGpfc3RyZXJyb3IoKSwgd2hpY2ggc2hvdWxkIGJlIGFibGUgdG8KKyAqIGRlY29kZSBhbGwgZXJyb3IgY29kZXMgYmVsb25naW5nIHRvIGFsbCBzdWJzeXN0ZW1zIChlLmcuIHBqbGliLAorICogcGptZWRpYSwgcGpzaXAsIGV0YykuCisgKgorICogQHBhcmFtIHN0YXR1cyAgICBUaGUgZXJyb3IgY29kZS4KKyAqIEBwYXJhbSBidWZmZXIgICAgVGhlIGJ1ZmZlciB3aGVyZSB0byBwdXQgdGhlIGVycm9yIG1lc3NhZ2UuCisgKiBAcGFyYW0gYnVmc2l6ZSAgIFNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuCSAgICBUaGUgZXJyb3IgbWVzc2FnZSBhcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLAorICogICAgICAgICAgICAgICAgICB3cmFwcGVkIHdpdGggcGpfc3RyX3QuCisgKi8KK1BKX0RFQ0wocGpfc3RyX3QpIHBqbWVkaWFfYXVkaW9kZXZfc3RyZXJyb3IocGpfc3RhdHVzX3Qgc3RhdHVzLCBjaGFyICpidWZmZXIsCisJCQkJCSAgICBwal9zaXplX3QgYnVmc2l6ZSk7CisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9BVURJT0RFVl9BVURJT0RFVl9FUlJOT19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzZTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjLmgKQEAgLTAsMCArMSw0MyBAQAorLyogJElkOiBwam1lZGlhLWNvZGVjLmggNDMzMSAyMDEzLTAxLTIzIDA2OjE4OjE4WiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ19QSk1FRElBX0NPREVDX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfUEpNRURJQV9DT0RFQ19IX18KKworLyoqCisgKiBAZmlsZSBwam1lZGlhLWNvZGVjLmgKKyAqIEBicmllZiBJbmNsdWRlIGFsbCBjb2RlY3MgQVBJIGluIFBKTUVESUEtQ09ERUMKKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy9hdWRpb19jb2RlY3MuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL2wxNi5oPgorI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvZmZtcGVnX3ZpZF9jb2RlY3MuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL2dzbS5oPgorI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvc3BlZXguaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL2lsYmMuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL2c3MjIuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL2c3MjIxLmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy9pcHBfY29kZWNzLmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy9vcGVuY29yZV9hbXIuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3Bhc3N0aHJvdWdoLmg+CisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy9zaWxrLmg+CisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ19QSk1FRElBX0NPREVDX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hbXJfaGVscGVyLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hbXJfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxZjZlNwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2Ftcl9oZWxwZXIuaApAQCAtMCwwICsxLDEyMjggQEAKKy8qICRJZDogYW1yX2hlbHBlci5oIDM4NDEgMjAxMS0xMC0yNCAwOToyODoxM1ogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ1NfQU1SX0hFTFBFUl9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDU19BTVJfSEVMUEVSX0hfXworCisvKioKKyAqIEBmaWxlIHBqbWVkaWEtY29kZWMvYW1yX2hlbHBlci5oCisgKiBAYnJpZWYgQ29tbW9uIHRhYmxlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyBmb3IgQU1SIGNvZGVjIChOQiAmIFdCKS4KKyAqLworCisKKyNpZmRlZiBfTVNDX1ZFUgorIyAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDIxNCkgICAgLy8gYml0IGZpZWxkIHR5cGVzIG90aGVyIHRoYW4gaW50CisjZW5kaWYKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfQU1SX0NPREVDX0hFTFBFUiBBTVIgQ29kZWMgSGVscGVyCisgKiBAaW5ncm91cCBQSk1FRElBX0NPREVDX0NPREVDUworICogQGJyaWVmIEFNUiBjb21tb24gdGFibGVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLgorICogQHsKKyAqCisgKiBUaGlzIHNlY3Rpb25zIGRlc2NyaWJlcyBjb21tb24gQU1SIGNvbnN0YW50cyB0YWJsZXMgKGUuZzogYml0cyBzZW5zaXRpdml0eSAKKyAqIG9yZGVyIG1hcCwgZnJhbWUgbGVuZ3RocywgYml0cmF0ZXMpIGFuZCBoZWxwZXIgZnVuY3Rpb25zIChlLmc6IHBhY2sgQU1SCisgKiBwYXlsb2FkIGluIG9jdGV0LWFsaWduZWQgbW9kZSBvciBiYW5kd2lkdGgtZWZmaWNpZW50IG1vZGUsIHBheWxvYWQgcGFyc2VyLAorICogcmVvcmRlciBBTVIgYml0c3RyZWFtKS4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKworLyogQU1SIGJpdHMgc2Vuc2l0aXZpdHkgb3JkZXIgbWFwcyAqLworCitjb25zdCBwal9pbnQxNl90IHBqbWVkaWFfY29kZWNfYW1ybmJfb3JkZXJtYXAxMjJbMjQ0XSA9Cit7CisgICAgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgIDksCisgICAgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAyMywgIDE1LCAgMTYsICAxNywgIDE4LAorICAgICAxOSwgIDIwLCAgMjEsICAyMiwgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAzOCwKKyAgICAxNDEsICAzOSwgMTQyLCAgNDAsIDE0MywgIDQxLCAxNDQsICA0MiwgMTQ1LCAgNDMsCisgICAgMTQ2LCAgNDQsIDE0NywgIDQ1LCAxNDgsICA0NiwgMTQ5LCAgNDcsICA5NywgMTUwLAorICAgIDIwMCwgIDQ4LCAgOTgsIDE1MSwgMjAxLCAgNDksICA5OSwgMTUyLCAyMDIsICA4NiwKKyAgICAxMzYsIDE4OSwgMjM5LCAgODcsIDEzNywgMTkwLCAyNDAsICA4OCwgMTM4LCAxOTEsCisgICAgMjQxLCAgOTEsIDE5NCwgIDkyLCAxOTUsICA5MywgMTk2LCAgOTQsIDE5NywgIDk1LAorICAgIDE5OCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgNTAsIDEwMCwKKyAgICAxNTMsIDIwMywgIDg5LCAxMzksIDE5MiwgMjQyLCAgNTEsIDEwMSwgMTU0LCAyMDQsCisgICAgIDU1LCAxMDUsIDE1OCwgMjA4LCAgOTAsIDE0MCwgMTkzLCAyNDMsICA1OSwgMTA5LAorICAgIDE2MiwgMjEyLCAgNjMsIDExMywgMTY2LCAyMTYsICA2NywgMTE3LCAxNzAsIDIyMCwKKyAgICAgMzYsICAzNywgIDU0LCAgNTMsICA1MiwgIDU4LCAgNTcsICA1NiwgIDYyLCAgNjEsCisgICAgIDYwLCAgNjYsICA2NSwgIDY0LCAgNzAsICA2OSwgIDY4LCAxMDQsIDEwMywgMTAyLAorICAgIDEwOCwgMTA3LCAxMDYsIDExMiwgMTExLCAxMTAsIDExNiwgMTE1LCAxMTQsIDEyMCwKKyAgICAxMTksIDExOCwgMTU3LCAxNTYsIDE1NSwgMTYxLCAxNjAsIDE1OSwgMTY1LCAxNjQsCisgICAgMTYzLCAxNjksIDE2OCwgMTY3LCAxNzMsIDE3MiwgMTcxLCAyMDcsIDIwNiwgMjA1LAorICAgIDIxMSwgMjEwLCAyMDksIDIxNSwgMjE0LCAyMTMsIDIxOSwgMjE4LCAyMTcsIDIyMywKKyAgICAyMjIsIDIyMSwgIDczLCAgNzIsICA3MSwgIDc2LCAgNzUsICA3NCwgIDc5LCAgNzgsCisgICAgIDc3LCAgODIsICA4MSwgIDgwLCAgODUsICA4NCwgIDgzLCAxMjMsIDEyMiwgMTIxLAorICAgIDEyNiwgMTI1LCAxMjQsIDEyOSwgMTI4LCAxMjcsIDEzMiwgMTMxLCAxMzAsIDEzNSwKKyAgICAxMzQsIDEzMywgMTc2LCAxNzUsIDE3NCwgMTc5LCAxNzgsIDE3NywgMTgyLCAxODEsCisgICAgMTgwLCAxODUsIDE4NCwgMTgzLCAxODgsIDE4NywgMTg2LCAyMjYsIDIyNSwgMjI0LAorICAgIDIyOSwgMjI4LCAyMjcsIDIzMiwgMjMxLCAyMzAsIDIzNSwgMjM0LCAyMzMsIDIzOCwKKyAgICAyMzcsIDIzNiwgIDk2LCAxOTkKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDEwMlsyMDRdID0KK3sKKyAgICAgIDcsICAgNiwgICA1LCAgIDQsICAgMywgICAyLCAgIDEsICAgMCwgIDE2LCAgMTUsCisgICAgIDE0LCAgMTMsICAxMiwgIDExLCAgMTAsICAgOSwgICA4LCAgMjYsICAyNywgIDI4LAorICAgICAyOSwgIDMwLCAgMzEsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsICA3MiwKKyAgICAgNzMsIDE2MSwgMTYyLCAgNjUsICA2OCwgIDY5LCAxMDgsIDExMSwgMTEyLCAxNTQsCisgICAgMTU3LCAxNTgsIDE5NywgMjAwLCAyMDEsICAzMiwgIDMzLCAxMjEsIDEyMiwgIDc0LAorICAgICA3NSwgMTYzLCAxNjQsICA2NiwgMTA5LCAxNTUsIDE5OCwgIDE5LCAgMjMsICAyMSwKKyAgICAgMjIsICAxOCwgIDE3LCAgMjAsICAyNCwgIDI1LCAgMzcsICAzNiwgIDM1LCAgMzQsCisgICAgIDgwLCAgNzksICA3OCwgIDc3LCAxMjYsIDEyNSwgMTI0LCAxMjMsIDE2OSwgMTY4LAorICAgIDE2NywgMTY2LCAgNzAsICA2NywgIDcxLCAxMTMsIDExMCwgMTE0LCAxNTksIDE1NiwKKyAgICAxNjAsIDIwMiwgMTk5LCAyMDMsICA3NiwgMTY1LCAgODEsICA4MiwgIDkyLCAgOTEsCisgICAgIDkzLCAgODMsICA5NSwgIDg1LCAgODQsICA5NCwgMTAxLCAxMDIsICA5NiwgMTA0LAorICAgICA4NiwgMTAzLCAgODcsICA5NywgMTI3LCAxMjgsIDEzOCwgMTM3LCAxMzksIDEyOSwKKyAgICAxNDEsIDEzMSwgMTMwLCAxNDAsIDE0NywgMTQ4LCAxNDIsIDE1MCwgMTMyLCAxNDksCisgICAgMTMzLCAxNDMsIDE3MCwgMTcxLCAxODEsIDE4MCwgMTgyLCAxNzIsIDE4NCwgMTc0LAorICAgIDE3MywgMTgzLCAxOTAsIDE5MSwgMTg1LCAxOTMsIDE3NSwgMTkyLCAxNzYsIDE4NiwKKyAgICAgMzgsICAzOSwgIDQ5LCAgNDgsICA1MCwgIDQwLCAgNTIsICA0MiwgIDQxLCAgNTEsCisgICAgIDU4LCAgNTksICA1MywgIDYxLCAgNDMsICA2MCwgIDQ0LCAgNTQsIDE5NCwgMTc5LAorICAgIDE4OSwgMTk2LCAxNzcsIDE5NSwgMTc4LCAxODcsIDE4OCwgMTUxLCAxMzYsIDE0NiwKKyAgICAxNTMsIDEzNCwgMTUyLCAxMzUsIDE0NCwgMTQ1LCAxMDUsICA5MCwgMTAwLCAxMDcsCisgICAgIDg4LCAxMDYsICA4OSwgIDk4LCAgOTksICA2MiwgIDQ3LCAgNTcsICA2NCwgIDQ1LAorICAgICA2MywgIDQ2LCAgNTUsICA1NgorfTsKKworY29uc3QgcGpfaW50MTZfdCBwam1lZGlhX2NvZGVjX2Ftcm5iX29yZGVybWFwNzk1WzE1OV0gPQoreworICAgICAgOCwgICA3LCAgIDYsICAgNSwgICA0LCAgIDMsICAgMiwgIDE0LCAgMTYsICAgOSwKKyAgICAgMTAsICAxMiwgIDEzLCAgMTUsICAxMSwgIDE3LCAgMjAsICAyMiwgIDI0LCAgMjMsCisgICAgIDE5LCAgMTgsICAyMSwgIDU2LCAgODgsIDEyMiwgMTU0LCAgNTcsICA4OSwgMTIzLAorICAgIDE1NSwgIDU4LCAgOTAsIDEyNCwgMTU2LCAgNTIsICA4NCwgMTE4LCAxNTAsICA1MywKKyAgICAgODUsIDExOSwgMTUxLCAgMjcsICA5MywgIDI4LCAgOTQsICAyOSwgIDk1LCAgMzAsCisgICAgIDk2LCAgMzEsICA5NywgIDYxLCAxMjcsICA2MiwgMTI4LCAgNjMsIDEyOSwgIDU5LAorICAgICA5MSwgMTI1LCAxNTcsICAzMiwgIDk4LCAgNjQsIDEzMCwgICAxLCAgIDAsICAyNSwKKyAgICAgMjYsICAzMywgIDk5LCAgMzQsIDEwMCwgIDY1LCAxMzEsICA2NiwgMTMyLCAgNTQsCisgICAgIDg2LCAxMjAsIDE1MiwgIDYwLCAgOTIsIDEyNiwgMTU4LCAgNTUsICA4NywgMTIxLAorICAgIDE1MywgMTE3LCAxMTYsIDExNSwgIDQ2LCAgNzgsIDExMiwgMTQ0LCAgNDMsICA3NSwKKyAgICAxMDksIDE0MSwgIDQwLCAgNzIsIDEwNiwgMTM4LCAgMzYsICA2OCwgMTAyLCAxMzQsCisgICAgMTE0LCAxNDksIDE0OCwgMTQ3LCAxNDYsICA4MywgIDgyLCAgODEsICA4MCwgIDUxLAorICAgICA1MCwgIDQ5LCAgNDgsICA0NywgIDQ1LCAgNDQsICA0MiwgIDM5LCAgMzUsICA3OSwKKyAgICA3NywgICA3NiwgIDc0LCAgNzEsICA2NywgMTEzLCAxMTEsIDExMCwgMTA4LCAxMDUsCisgICAgMTAxLCAxNDUsIDE0MywgMTQyLCAxNDAsIDEzNywgMTMzLCAgNDEsICA3MywgMTA3LAorICAgIDEzOSwgIDM3LCAgNjksIDEwMywgMTM1LCAgMzgsICA3MCwgMTA0LCAxMzYKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDc0WzE0OF0gPQoreworICAgICAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwKKyAgICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAyNiwgIDg3LCAgMjcsCisgICAgIDg4LCAgMjgsICA4OSwgIDI5LCAgOTAsICAzMCwgIDkxLCAgNTEsICA4MCwgMTEyLAorICAgIDE0MSwgIDUyLCAgODEsIDExMywgMTQyLCAgNTQsICA4MywgMTE1LCAxNDQsICA1NSwKKyAgICAgODQsIDExNiwgMTQ1LCAgNTgsIDExOSwgIDU5LCAxMjAsICAyMSwgIDIyLCAgMjMsCisgICAgIDE3LCAgMTgsICAxOSwgIDMxLCAgNjAsICA5MiwgMTIxLCAgNTYsICA4NSwgMTE3LAorICAgIDE0NiwgIDIwLCAgMjQsICAyNSwgIDUwLCAgNzksIDExMSwgMTQwLCAgNTcsICA4NiwKKyAgICAxMTgsIDE0NywgIDQ5LCAgNzgsIDExMCwgMTM5LCAgNDgsICA3NywgIDUzLCAgODIsCisgICAgMTE0LCAxNDMsIDEwOSwgMTM4LCAgNDcsICA3NiwgMTA4LCAxMzcsICAzMiwgIDMzLAorICAgICA2MSwgIDYyLCAgOTMsICA5NCwgMTIyLCAxMjMsICA0MSwgIDQyLCAgNDMsICA0NCwKKyAgICAgNDUsICA0NiwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgMTAyLCAxMDMsCisgICAgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LAorICAgICAzNCwgIDYzLCAgOTUsIDEyNCwgIDM1LCAgNjQsICA5NiwgMTI1LCAgMzYsICA2NSwKKyAgICAgOTcsIDEyNiwgIDM3LCAgNjYsICA5OCwgMTI3LCAgMzgsICA2NywgIDk5LCAxMjgsCisgICAgIDM5LCAgNjgsIDEwMCwgMTI5LCAgNDAsICA2OSwgMTAxLCAxMzAKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDY3WzEzNF0gPQoreworICAgICAgMCwgICAxLCAgIDQsICAgMywgICA1LCAgIDYsICAxMywgICA3LCAgIDIsICAgOCwKKyAgICAgIDksICAxMSwgIDE1LCAgMTIsICAxNCwgIDEwLCAgMjgsICA4MiwgIDI5LCAgODMsCisgICAgIDI3LCAgODEsICAyNiwgIDgwLCAgMzAsICA4NCwgIDE2LCAgNTUsIDEwOSwgIDU2LAorICAgIDExMCwgIDMxLCAgODUsICA1NywgMTExLCAgNDgsICA3MywgMTAyLCAxMjcsICAzMiwKKyAgICAgODYsICA1MSwgIDc2LCAxMDUsIDEzMCwgIDUyLCAgNzcsIDEwNiwgMTMxLCAgNTgsCisgICAgMTEyLCAgMzMsICA4NywgIDE5LCAgMjMsICA1MywgIDc4LCAxMDcsIDEzMiwgIDIxLAorICAgICAyMiwgIDE4LCAgMTcsICAyMCwgIDI0LCAgMjUsICA1MCwgIDc1LCAxMDQsIDEyOSwKKyAgICAgNDcsICA3MiwgMTAxLCAxMjYsICA1NCwgIDc5LCAxMDgsIDEzMywgIDQ2LCAgNzEsCisgICAgMTAwLCAxMjUsIDEyOCwgMTAzLCAgNzQsICA0OSwgIDQ1LCAgNzAsICA5OSwgMTI0LAorICAgICA0MiwgIDY3LCAgOTYsIDEyMSwgIDM5LCAgNjQsICA5MywgMTE4LCAgMzgsICA2MywKKyAgICAgOTIsIDExNywgIDM1LCAgNjAsICA4OSwgMTE0LCAgMzQsICA1OSwgIDg4LCAxMTMsCisgICAgIDQ0LCAgNjksICA5OCwgMTIzLCAgNDMsICA2OCwgIDk3LCAxMjIsICA0MSwgIDY2LAorICAgICA5NSwgMTIwLCAgNDAsICA2NSwgIDk0LCAxMTksICAzNywgIDYyLCAgOTEsIDExNiwKKyAgICAgMzYsICA2MSwgIDkwLCAxMTUKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDU5WzExOF0gPQoreworICAgICAgMCwgICAxLCAgIDQsICAgNSwgICAzLCAgIDYsICAgNywgICAyLCAgMTMsICAxNSwKKyAgICAgIDgsICAgOSwgIDExLCAgMTIsICAxNCwgIDEwLCAgMTYsICAyOCwgIDc0LCAgMjksCisgICAgIDc1LCAgMjcsICA3MywgIDI2LCAgNzIsICAzMCwgIDc2LCAgNTEsICA5NywgIDUwLAorICAgICA3MSwgIDk2LCAxMTcsICAzMSwgIDc3LCAgNTIsICA5OCwgIDQ5LCAgNzAsICA5NSwKKyAgICAxMTYsICA1MywgIDk5LCAgMzIsICA3OCwgIDMzLCAgNzksICA0OCwgIDY5LCAgOTQsCisgICAgMTE1LCAgNDcsICA2OCwgIDkzLCAxMTQsICA0NiwgIDY3LCAgOTIsIDExMywgIDE5LAorICAgICAyMSwgIDIzLCAgMjIsICAxOCwgIDE3LCAgMjAsICAyNCwgMTExLCAgNDMsICA4OSwKKyAgICAxMTAsICA2NCwgIDY1LCAgNDQsICA5MCwgIDI1LCAgNDUsICA2NiwgIDkxLCAxMTIsCisgICAgIDU0LCAxMDAsICA0MCwgIDYxLCAgODYsIDEwNywgIDM5LCAgNjAsICA4NSwgMTA2LAorICAgICAzNiwgIDU3LCAgODIsIDEwMywgIDM1LCAgNTYsICA4MSwgMTAyLCAgMzQsICA1NSwKKyAgICAgODAsIDEwMSwgIDQyLCAgNjMsICA4OCwgMTA5LCAgNDEsICA2MiwgIDg3LCAxMDgsCisgICAgIDM4LCAgNTksICA4NCwgMTA1LCAgMzcsICA1OCwgIDgzLCAxMDQKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDUxNVsxMDNdID0KK3sKKyAgICAgNywgICA2LCAgIDUsICAgNCwgICAzLCAgIDIsICAgMSwgICAwLCAgMTUsICAxNCwKKyAgICAxMywgIDEyLCAgMTEsICAxMCwgICA5LCAgIDgsICAyMywgIDI0LCAgMjUsICAyNiwKKyAgICAyNywgIDQ2LCAgNjUsICA4NCwgIDQ1LCAgNDQsICA0MywgIDY0LCAgNjMsICA2MiwKKyAgICA4MywgIDgyLCAgODEsIDEwMiwgMTAxLCAxMDAsICA0MiwgIDYxLCAgODAsICA5OSwKKyAgICAyOCwgIDQ3LCAgNjYsICA4NSwgIDE4LCAgNDEsICA2MCwgIDc5LCAgOTgsICAyOSwKKyAgICA0OCwgIDY3LCAgMTcsICAyMCwgIDIyLCAgNDAsICA1OSwgIDc4LCAgOTcsICAyMSwKKyAgICAzMCwgIDQ5LCAgNjgsICA4NiwgIDE5LCAgMTYsICA4NywgIDM5LCAgMzgsICA1OCwKKyAgICA1NywgIDc3LCAgMzUsICA1NCwgIDczLCAgOTIsICA3NiwgIDk2LCAgOTUsICAzNiwKKyAgICA1NSwgIDc0LCAgOTMsICAzMiwgIDUxLCAgMzMsICA1MiwgIDcwLCAgNzEsICA4OSwKKyAgICA5MCwgIDMxLCAgNTAsICA2OSwgIDg4LCAgMzcsICA1NiwgIDc1LCAgOTQsICAzNCwKKyAgICA1MywgIDcyLCAgOTEKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDQ3NVs5NV0gPQoreworICAgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LAorICAgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDIzLCAgMjQsICAyNSwgIDI2LAorICAgIDI3LCAgMjgsICA0OCwgIDQ5LCAgNjEsICA2MiwgIDgyLCAgODMsICA0NywgIDQ2LAorICAgIDQ1LCAgNDQsICA4MSwgIDgwLCAgNzksICA3OCwgIDE3LCAgMTgsICAyMCwgIDIyLAorICAgIDc3LCAgNzYsICA3NSwgIDc0LCAgMjksICAzMCwgIDQzLCAgNDIsICA0MSwgIDQwLAorICAgIDM4LCAgMzksICAxNiwgIDE5LCAgMjEsICA1MCwgIDUxLCAgNTksICA2MCwgIDYzLAorICAgIDY0LCAgNzIsICA3MywgIDg0LCAgODUsICA5MywgIDk0LCAgMzIsICAzMywgIDM1LAorICAgIDM2LCAgNTMsICA1NCwgIDU2LCAgNTcsICA2NiwgIDY3LCAgNjksICA3MCwgIDg3LAorICAgIDg4LCAgOTAsICA5MSwgIDM0LCAgNTUsICA2OCwgIDg5LCAgMzcsICA1OCwgIDcxLAorICAgIDkyLCAgMzEsICA1MiwgIDY1LCAgODYKK307CisKKworY29uc3QgcGpfaW50MTZfdCBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwXzY2MFtdID0KK3sKKyAgICAgIDAsICAgNSwgICA2LCAgIDcsICA2MSwgIDg0LCAxMDcsIDEzMCwgIDYyLCAgODUsCisgICAgICA4LCAgIDQsICAzNywgIDM4LCAgMzksICA0MCwgIDU4LCAgODEsIDEwNCwgMTI3LAorICAgICA2MCwgIDgzLCAxMDYsIDEyOSwgMTA4LCAxMzEsIDEyOCwgIDQxLCAgNDIsICA4MCwKKyAgICAxMjYsICAgMSwgICAzLCAgNTcsIDEwMywgIDgyLCAxMDUsICA1OSwgICAyLCAgNjMsCisgICAgMTA5LCAxMTAsICA4NiwgIDE5LCAgMjIsICAyMywgIDY0LCAgODcsICAxOCwgIDIwLAorICAgICAyMSwgIDE3LCAgMTMsICA4OCwgIDQzLCAgODksICA2NSwgMTExLCAgMTQsICAyNCwKKyAgICAgMjUsICAyNiwgIDI3LCAgMjgsICAxNSwgIDE2LCAgNDQsICA5MCwgIDY2LCAxMTIsCisgICAgICA5LCAgMTEsICAxMCwgIDEyLCAgNjcsIDExMywgIDI5LCAgMzAsICAzMSwgIDMyLAorICAgICAzNCwgIDMzLCAgMzUsICAzNiwgIDQ1LCAgNTEsICA2OCwgIDc0LCAgOTEsICA5NywKKyAgICAxMTQsIDEyMCwgIDQ2LCAgNjksICA5MiwgMTE1LCAgNTIsICA3NSwgIDk4LCAxMjEsCisgICAgIDQ3LCAgNzAsICA5MywgMTE2LCAgNTMsICA3NiwgIDk5LCAxMjIsICA0OCwgIDcxLAorICAgICA5NCwgMTE3LCAgNTQsICA3NywgMTAwLCAxMjMsICA0OSwgIDcyLCAgOTUsIDExOCwKKyAgICAgNTUsICA3OCwgMTAxLCAxMjQsICA1MCwgIDczLCAgOTYsIDExOSwgIDU2LCAgNzksCisgICAgMTAyLCAxMjUKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF84ODVbXSA9Cit7CisgICAgICAwLCAgIDQsICAgNiwgICA3LCAgIDUsICAgMywgIDQ3LCAgNDgsICA0OSwgMTEyLAorICAgIDExMywgMTE0LCAgNzUsIDEwNiwgMTQwLCAxNzEsICA4MCwgMTExLCAxNDUsIDE3NiwKKyAgICAgNzcsIDEwOCwgMTQyLCAxNzMsICA3OCwgMTA5LCAxNDMsIDE3NCwgIDc5LCAxMTAsCisgICAgMTQ0LCAxNzUsICA3NiwgMTA3LCAxNDEsIDE3MiwgIDUwLCAxMTUsICA1MSwgICAyLAorICAgICAgMSwgIDgxLCAxMTYsIDE0NiwgIDE5LCAgMjEsICAxMiwgIDE3LCAgMTgsICAyMCwKKyAgICAgMTYsICAyNSwgIDEzLCAgMTAsICAxNCwgIDI0LCAgMjMsICAyMiwgIDI2LCAgIDgsCisgICAgIDE1LCAgNTIsIDExNywgIDMxLCAgODIsIDE0NywgICA5LCAgMzMsICAxMSwgIDgzLAorICAgIDE0OCwgIDUzLCAxMTgsICAyOCwgIDI3LCAgODQsIDE0OSwgIDM0LCAgMzUsICAyOSwKKyAgICAgNDYsICAzMiwgIDMwLCAgNTQsIDExOSwgIDM3LCAgMzYsICAzOSwgIDM4LCAgNDAsCisgICAgIDg1LCAxNTAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNTUsICA2MCwgIDY1LAorICAgICA3MCwgIDg2LCAgOTEsICA5NiwgMTAxLCAxMjAsIDEyNSwgMTMwLCAxMzUsIDE1MSwKKyAgICAxNTYsIDE2MSwgMTY2LCAgNTYsICA4NywgMTIxLCAxNTIsICA2MSwgIDkyLCAxMjYsCisgICAgMTU3LCAgNjYsICA5NywgMTMxLCAxNjIsICA3MSwgMTAyLCAxMzYsIDE2NywgIDU3LAorICAgICA4OCwgMTIyLCAxNTMsICA2MiwgIDkzLCAxMjcsIDE1OCwgIDY3LCAgOTgsIDEzMiwKKyAgICAxNjMsICA3MiwgMTAzLCAxMzcsIDE2OCwgIDU4LCAgODksIDEyMywgMTU0LCAgNjMsCisgICAgIDk0LCAxMjgsIDE1OSwgIDY4LCAgOTksIDEzMywgMTY0LCAgNzMsIDEwNCwgMTM4LAorICAgIDE2OSwgIDU5LCAgOTAsIDEyNCwgMTU1LCAgNjQsICA5NSwgMTI5LCAxNjAsICA2OSwKKyAgICAxMDAsIDEzNCwgMTY1LCAgNzQsIDEwNSwgMTM5LCAxNzAKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8xMjY1W10gPQoreworICAgICAgMCwgICA0LCAgIDYsICA5MywgMTQzLCAxOTYsIDI0NiwgICA3LCAgIDUsICAgMywKKyAgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsCisgICAgIDk0LCAxNDQsIDE5NywgMjQ3LCAgOTksIDE0OSwgMjAyLCAyNTIsICA5NiwgMTQ2LAorICAgIDE5OSwgMjQ5LCAgOTcsIDE0NywgMjAwLCAyNTAsIDEwMCwgMjAzLCAgOTgsIDE0OCwKKyAgICAyMDEsIDI1MSwgIDk1LCAxNDUsIDE5OCwgMjQ4LCAgNTIsICAgMiwgICAxLCAxMDEsCisgICAgMjA0LCAxNTUsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LAorICAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywKKyAgICAxNTYsICAzMSwgMTAyLCAyMDUsICAgOSwgIDMzLCAgMTEsIDEwMywgMjA2LCAgNTQsCisgICAgMTU3LCAgMjgsICAyNywgMTA0LCAyMDcsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLAorICAgICAzMCwgIDU1LCAxNTgsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxMDUsIDIwOCwKKyAgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxMDYsIDE1OSwgMjA5LCAgNTcsCisgICAgIDY2LCAgNzUsICA4NCwgMTA3LCAxMTYsIDEyNSwgMTM0LCAxNjAsIDE2OSwgMTc4LAorICAgIDE4NywgMjEwLCAyMTksIDIyOCwgMjM3LCAgNTgsIDEwOCwgMTYxLCAyMTEsICA2MiwKKyAgICAxMTIsIDE2NSwgMjE1LCAgNjcsIDExNywgMTcwLCAyMjAsICA3MSwgMTIxLCAxNzQsCisgICAgMjI0LCAgNzYsIDEyNiwgMTc5LCAyMjksICA4MCwgMTMwLCAxODMsIDIzMywgIDg1LAorICAgIDEzNSwgMTg4LCAyMzgsICA4OSwgMTM5LCAxOTIsIDI0MiwgIDU5LCAxMDksIDE2MiwKKyAgICAyMTIsICA2MywgMTEzLCAxNjYsIDIxNiwgIDY4LCAxMTgsIDE3MSwgMjIxLCAgNzIsCisgICAgMTIyLCAxNzUsIDIyNSwgIDc3LCAxMjcsIDE4MCwgMjMwLCAgODEsIDEzMSwgMTg0LAorICAgIDIzNCwgIDg2LCAxMzYsIDE4OSwgMjM5LCAgOTAsIDE0MCwgMTkzLCAyNDMsICA2MCwKKyAgICAxMTAsIDE2MywgMjEzLCAgNjQsIDExNCwgMTY3LCAyMTcsICA2OSwgMTE5LCAxNzIsCisgICAgMjIyLCAgNzMsIDEyMywgMTc2LCAyMjYsICA3OCwgMTI4LCAxODEsIDIzMSwgIDgyLAorICAgIDEzMiwgMTg1LCAyMzUsICA4NywgMTM3LCAxOTAsIDI0MCwgIDkxLCAxNDEsIDE5NCwKKyAgICAyNDQsICA2MSwgMTExLCAxNjQsIDIxNCwgIDY1LCAxMTUsIDE2OCwgMjE4LCAgNzAsCisgICAgMTIwLCAxNzMsIDIyMywgIDc0LCAxMjQsIDE3NywgMjI3LCAgNzksIDEyOSwgMTgyLAorICAgIDIzMiwgIDgzLCAxMzMsIDE4NiwgMjM2LCAgODgsIDEzOCwgMTkxLCAyNDEsICA5MiwKKyAgICAxNDIsIDE5NSwgMjQ1Cit9OworCitjb25zdCBwal9pbnQxNl90IHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBfMTQyNVtdID0KK3sKKyAgICAgIDAsICAgNCwgICA2LCAxMDEsIDE1OSwgMjIwLCAyNzgsICAgNywgICA1LCAgIDMsCisgICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLAorICAgIDEwMiwgMTYwLCAyMjEsIDI3OSwgMTA3LCAxNjUsIDIyNiwgMjg0LCAxMDQsIDE2MiwKKyAgICAyMjMsIDI4MSwgMTA1LCAxNjMsIDIyNCwgMjgyLCAxMDgsIDIyNywgMTA2LCAxNjQsCisgICAgMjI1LCAyODMsIDEwMywgMTYxLCAyMjIsIDI4MCwgIDUyLCAgIDIsICAgMSwgMTA5LAorICAgIDIyOCwgMTcxLCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwKKyAgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsCisgICAgMTcyLCAgMzEsIDExMCwgMjI5LCAgIDksICAzMywgIDExLCAxMTEsIDIzMCwgIDU0LAorICAgIDE3MywgIDI4LCAgMjcsIDExMiwgMjMxLCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwKKyAgICAgMzAsICA1NSwgMTc0LCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTEzLCAyMzIsCisgICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTE0LCAxNzUsIDIzMywgIDYyLAorICAgIDEyMCwgMTgxLCAyMzksICA3NSwgMTMzLCAxOTQsIDI1MiwgIDU3LCAxMTUsIDE3NiwKKyAgICAyMzQsICA2MywgMTIxLCAxODIsIDI0MCwgIDcwLCAxMjgsIDE4OSwgMjQ3LCAgNzYsCisgICAgMTM0LCAxOTUsIDI1MywgIDgzLCAxNDEsIDIwMiwgMjYwLCAgOTIsIDE1MCwgMjExLAorICAgIDI2OSwgIDg0LCAxNDIsIDIwMywgMjYxLCAgOTMsIDE1MSwgMjEyLCAyNzAsICA4NSwKKyAgICAxNDMsIDIwNCwgMjYyLCAgOTQsIDE1MiwgMjEzLCAyNzEsICA4NiwgMTQ0LCAyMDUsCisgICAgMjYzLCAgOTUsIDE1MywgMjE0LCAyNzIsICA2NCwgMTIyLCAxODMsIDI0MSwgIDc3LAorICAgIDEzNSwgMTk2LCAyNTQsICA2NSwgMTIzLCAxODQsIDI0MiwgIDc4LCAxMzYsIDE5NywKKyAgICAyNTUsICA4NywgMTQ1LCAyMDYsIDI2NCwgIDk2LCAxNTQsIDIxNSwgMjczLCAgNTgsCisgICAgMTE2LCAxNzcsIDIzNSwgIDY2LCAxMjQsIDE4NSwgMjQzLCAgNzEsIDEyOSwgMTkwLAorICAgIDI0OCwgIDc5LCAxMzcsIDE5OCwgMjU2LCAgODgsIDE0NiwgMjA3LCAyNjUsICA5NywKKyAgICAxNTUsIDIxNiwgMjc0LCAgNTksIDExNywgMTc4LCAyMzYsICA2NywgMTI1LCAxODYsCisgICAgMjQ0LCAgNzIsIDEzMCwgMTkxLCAyNDksICA4MCwgMTM4LCAxOTksIDI1NywgIDg5LAorICAgIDE0NywgMjA4LCAyNjYsICA5OCwgMTU2LCAyMTcsIDI3NSwgIDYwLCAxMTgsIDE3OSwKKyAgICAyMzcsICA2OCwgMTI2LCAxODcsIDI0NSwgIDczLCAxMzEsIDE5MiwgMjUwLCAgODEsCisgICAgMTM5LCAyMDAsIDI1OCwgIDkwLCAxNDgsIDIwOSwgMjY3LCAgOTksIDE1NywgMjE4LAorICAgIDI3NiwgIDYxLCAxMTksIDE4MCwgMjM4LCAgNjksIDEyNywgMTg4LCAyNDYsICA3NCwKKyAgICAxMzIsIDE5MywgMjUxLCAgODIsIDE0MCwgMjAxLCAyNTksICA5MSwgMTQ5LCAyMTAsCisgICAgMjY4LCAxMDAsIDE1OCwgMjE5LCAyNzcKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8xNTg1W10gPQoreworICAgICAgMCwgICA0LCAgIDYsIDEwOSwgMTc1LCAyNDQsIDMxMCwgICA3LCAgIDUsICAgMywKKyAgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsCisgICAgMTEwLCAxNzYsIDI0NSwgMzExLCAxMTUsIDE4MSwgMjUwLCAzMTYsIDExMiwgMTc4LAorICAgIDI0NywgMzEzLCAxMTMsIDE3OSwgMjQ4LCAzMTQsIDExNiwgMjUxLCAxMTQsIDE4MCwKKyAgICAyNDksIDMxNSwgMTExLCAxNzcsIDI0NiwgMzEyLCAgNTIsICAgMiwgICAxLCAxMTcsCisgICAgMjUyLCAxODcsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LAorICAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywKKyAgICAxODgsICAzMSwgMTE4LCAyNTMsICAgOSwgIDMzLCAgMTEsIDExOSwgMjU0LCAgNTQsCisgICAgMTg5LCAgMjgsICAyNywgMTIwLCAyNTUsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLAorICAgICAzMCwgIDU1LCAxOTAsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxMjEsIDI1NiwKKyAgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxMjIsIDE5MSwgMjU3LCAgNjMsCisgICAgMTI5LCAxOTgsIDI2NCwgIDc2LCAxNDIsIDIxMSwgMjc3LCAgODksIDE1NSwgMjI0LAorICAgIDI5MCwgMTAyLCAxNjgsIDIzNywgMzAzLCAgNTcsIDEyMywgMTkyLCAyNTgsICA3MCwKKyAgICAxMzYsIDIwNSwgMjcxLCAgODMsIDE0OSwgMjE4LCAyODQsICA5NiwgMTYyLCAyMzEsCisgICAgMjk3LCAgNjIsIDEyOCwgMTk3LCAyNjMsICA3NSwgMTQxLCAyMTAsIDI3NiwgIDg4LAorICAgIDE1NCwgMjIzLCAyODksIDEwMSwgMTY3LCAyMzYsIDMwMiwgIDU4LCAxMjQsIDE5MywKKyAgICAyNTksICA3MSwgMTM3LCAyMDYsIDI3MiwgIDg0LCAxNTAsIDIxOSwgMjg1LCAgOTcsCisgICAgMTYzLCAyMzIsIDI5OCwgIDU5LCAxMjUsIDE5NCwgMjYwLCAgNjQsIDEzMCwgMTk5LAorICAgIDI2NSwgIDY3LCAxMzMsIDIwMiwgMjY4LCAgNzIsIDEzOCwgMjA3LCAyNzMsICA3NywKKyAgICAxNDMsIDIxMiwgMjc4LCAgODAsIDE0NiwgMjE1LCAyODEsICA4NSwgMTUxLCAyMjAsCisgICAgMjg2LCAgOTAsIDE1NiwgMjI1LCAyOTEsICA5MywgMTU5LCAyMjgsIDI5NCwgIDk4LAorICAgIDE2NCwgMjMzLCAyOTksIDEwMywgMTY5LCAyMzgsIDMwNCwgMTA2LCAxNzIsIDI0MSwKKyAgICAzMDcsICA2MCwgMTI2LCAxOTUsIDI2MSwgIDY1LCAxMzEsIDIwMCwgMjY2LCAgNjgsCisgICAgMTM0LCAyMDMsIDI2OSwgIDczLCAxMzksIDIwOCwgMjc0LCAgNzgsIDE0NCwgMjEzLAorICAgIDI3OSwgIDgxLCAxNDcsIDIxNiwgMjgyLCAgODYsIDE1MiwgMjIxLCAyODcsICA5MSwKKyAgICAxNTcsIDIyNiwgMjkyLCAgOTQsIDE2MCwgMjI5LCAyOTUsICA5OSwgMTY1LCAyMzQsCisgICAgMzAwLCAxMDQsIDE3MCwgMjM5LCAzMDUsIDEwNywgMTczLCAyNDIsIDMwOCwgIDYxLAorICAgIDEyNywgMTk2LCAyNjIsICA2NiwgMTMyLCAyMDEsIDI2NywgIDY5LCAxMzUsIDIwNCwKKyAgICAyNzAsICA3NCwgMTQwLCAyMDksIDI3NSwgIDc5LCAxNDUsIDIxNCwgMjgwLCAgODIsCisgICAgMTQ4LCAyMTcsIDI4MywgIDg3LCAxNTMsIDIyMiwgMjg4LCAgOTIsIDE1OCwgMjI3LAorICAgIDI5MywgIDk1LCAxNjEsIDIzMCwgMjk2LCAxMDAsIDE2NiwgMjM1LCAzMDEsIDEwNSwKKyAgICAxNzEsIDI0MCwgMzA2LCAxMDgsIDE3NCwgMjQzLCAzMDkKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8xODI1W10gPQoreworICAgICAgMCwgICA0LCAgIDYsIDEyMSwgMTk5LCAyODAsIDM1OCwgICA3LCAgIDUsICAgMywKKyAgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsCisgICAgMTIyLCAyMDAsIDI4MSwgMzU5LCAxMjcsIDIwNSwgMjg2LCAzNjQsIDEyNCwgMjAyLAorICAgIDI4MywgMzYxLCAxMjUsIDIwMywgMjg0LCAzNjIsIDEyOCwgMjg3LCAxMjYsIDIwNCwKKyAgICAyODUsIDM2MywgMTIzLCAyMDEsIDI4MiwgMzYwLCAgNTIsICAgMiwgICAxLCAxMjksCisgICAgMjg4LCAyMTEsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LAorICAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywKKyAgICAyMTIsICAzMSwgMTMwLCAyODksICAgOSwgIDMzLCAgMTEsIDEzMSwgMjkwLCAgNTQsCisgICAgMjEzLCAgMjgsICAyNywgMTMyLCAyOTEsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLAorICAgICAzMCwgIDU1LCAyMTQsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxMzMsIDI5MiwKKyAgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxMzQsIDIxNSwgMjkzLCAxOTgsCisgICAgMjk5LCAxMzYsIDEyMCwgMTM4LCAgNjAsIDI3OSwgIDU4LCAgNjIsIDM1NywgMTM5LAorICAgIDE0MCwgMjk1LCAxNTYsICA1NywgMjE5LCAyOTcsICA2MywgMjE3LCAxMzcsIDE3MCwKKyAgICAzMDAsIDIyMiwgIDY0LCAxMDYsICA2MSwgIDc4LCAyOTQsICA5MiwgMTQyLCAxNDEsCisgICAgMTM1LCAyMjEsIDI5NiwgMzAxLCAzNDMsICA1OSwgMjk4LCAxODQsIDMyOSwgMzE1LAorICAgIDIyMCwgMjE2LCAyNjUsIDI1MSwgMjE4LCAyMzcsIDM1MiwgMjIzLCAxNTcsICA4NiwKKyAgICAxNzEsICA4NywgMTY0LCAzNTEsIDExMSwgMzAyLCAgNjUsIDE3OCwgMTE1LCAzMjMsCisgICAgIDcyLCAxOTIsIDEwMSwgMTc5LCAgOTMsICA3MywgMTkzLCAxNTEsIDMzNywgMzA5LAorICAgIDE0MywgMjc0LCAgNjksIDMyNCwgMTY1LCAxNTAsICA5NywgMzM4LCAxMTAsIDMxMCwKKyAgICAzMzAsIDI3MywgIDY4LCAxMDcsIDE3NSwgMjQ1LCAxMTQsICA3OSwgMTEzLCAxODksCisgICAgMjQ2LCAyNTksIDE3NCwgIDcxLCAxODUsICA5NiwgMzQ0LCAxMDAsIDMyMiwgIDgzLAorICAgIDMzNCwgMzE2LCAzMzMsIDI1MiwgMTYxLCAzNDgsIDE0NywgIDgyLCAyNjksIDIzMiwKKyAgICAyNjAsIDMwOCwgMzUzLCAzNDcsIDE2MywgMjMxLCAzMDYsIDMyMCwgMTg4LCAyNzAsCisgICAgMTQ2LCAxNzcsIDI2NiwgMzUwLCAyNTYsICA4NSwgMTQ5LCAxMTYsIDE5MSwgMTYwLAorICAgIDIzOCwgMjU4LCAzMzYsIDMwNSwgMjU1LCAgODgsIDIyNCwgIDk5LCAzMzksIDIzMCwKKyAgICAyMjgsIDIyNywgMjcyLCAyNDIsIDI0MSwgMzE5LCAyMzMsIDMxMSwgMTAyLCAgNzQsCisgICAgMTgwLCAyNzUsICA2NiwgMTk0LCAxNTIsIDMyNSwgMTcyLCAyNDcsIDI0NCwgMjYxLAorICAgIDExNywgMTU4LCAxNjYsIDM1NCwgIDc1LCAxNDQsIDEwOCwgMzEyLCAgOTQsIDE4NiwKKyAgICAzMDMsICA4MCwgMjM0LCAgODksIDE5NSwgMTEyLCAzNDAsIDE4MSwgMzQ1LCAzMTcsCisgICAgMzI2LCAyNzYsIDIzOSwgMTY3LCAxMTgsIDMxMywgIDcwLCAzNTUsIDMyNywgMjUzLAorICAgIDE5MCwgMTc2LCAyNzEsIDEwNCwgIDk4LCAxNTMsIDEwMywgIDkwLCAgNzYsIDI2NywKKyAgICAyNzcsIDI0OCwgMjI1LCAyNjIsIDE4MiwgIDg0LCAxNTQsIDIzNSwgMzM1LCAxNjgsCisgICAgMzMxLCAxOTYsIDM0MSwgMjQ5LCAxNjIsIDMwNywgMTQ4LCAzNDksIDI2MywgMzIxLAorICAgIDI1NywgMjQzLCAyMjksIDM1NiwgMTU5LCAxMTksICA2NywgMTg3LCAxNzMsIDE0NSwKKyAgICAyNDAsICA3NywgMzA0LCAzMzIsIDMxNCwgMzQyLCAxMDksIDI1NCwgIDgxLCAyNzgsCisgICAgMTA1LCAgOTEsIDM0NiwgMzE4LCAxODMsIDI1MCwgMTk3LCAzMjgsICA5NSwgMTU1LAorICAgIDE2OSwgMjY4LCAyMjYsIDIzNiwgMjY0Cit9OworCitjb25zdCBwal9pbnQxNl90IHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBfMTk4NVtdID0KK3sKKyAgICAgIDAsICAgNCwgICA2LCAxMjksIDIxNSwgMzA0LCAzOTAsICAgNywgICA1LCAgIDMsCisgICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LAorICAgIDEzMCwgMjE2LCAzMDUsIDM5MSwgMTM1LCAyMjEsIDMxMCwgMzk2LCAxMzIsIDIxOCwKKyAgICAzMDcsIDM5MywgMTMzLCAyMTksIDMwOCwgMzk0LCAxMzYsIDMxMSwgMTM0LCAyMjAsCisgICAgMzA5LCAzOTUsIDEzMSwgMjE3LCAzMDYsIDM5MiwgIDUyLCAgIDIsICAgMSwgMTM3LAorICAgIDMxMiwgMjI3LCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwKKyAgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsCisgICAgMjI4LCAgMzEsIDEzOCwgMzEzLCAgIDksICAzMywgIDExLCAxMzksIDMxNCwgIDU0LAorICAgIDIyOSwgIDI4LCAgMjcsIDE0MCwgMzE1LCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwKKyAgICAgMzAsICA1NSwgMjMwLCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTQxLCAzMTYsCisgICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTQyLCAyMzEsIDMxNywgIDYzLAorICAgICA3MywgIDkyLCAzNDAsICA4MiwgMzI0LCAxNDksIDM1MywgMTU5LCAzMzQsIDE2NSwKKyAgICAzMzgsIDE3OCwgMTYzLCAyNTQsICA3NywgMTY4LCAyNTcsIDE1MywgMzQzLCAgNTcsCisgICAgMjQ4LCAyMzgsICA3OSwgMjUyLCAxNjYsICA2NywgIDgwLCAyMDEsIDEwMSwgMjY3LAorICAgIDE0MywgMTY0LCAzNDEsIDI1NSwgMzM5LCAxODcsIDM3NiwgMzE4LCAgNzgsIDMyOCwKKyAgICAzNjIsIDExNSwgMjMyLCAyNDIsIDI1MywgMjkwLCAyNzYsICA2MiwgIDU4LCAxNTgsCisgICAgIDY4LCAgOTMsIDE3OSwgMzE5LCAxNDgsIDE2OSwgMTU0LCAgNzIsIDM4NSwgMzI5LAorICAgIDMzMywgMzQ0LCAxMDIsICA4MywgMTQ0LCAyMzMsIDMyMywgMTI0LCAyNDMsIDE5MiwKKyAgICAzNTQsIDIzNywgIDY0LCAyNDcsIDIwMiwgMjA5LCAxNTAsIDExNiwgMzM1LCAyNjgsCisgICAgMjM5LCAyOTksIDE4OCwgMTk2LCAyOTgsICA5NCwgMTk1LCAyNTgsIDEyMywgMzYzLAorICAgIDM4NCwgMTA5LCAzMjUsIDM3MSwgMTcwLCAzNzAsICA4NCwgMTEwLCAyOTUsIDE4MCwKKyAgICAgNzQsIDIxMCwgMTkxLCAxMDYsIDI5MSwgMjA1LCAzNjcsIDM4MSwgMzc3LCAyMDYsCisgICAgMzU1LCAxMjIsIDExOSwgMTIwLCAzODMsIDE2MCwgMTA1LCAxMDgsIDI3NywgMzgwLAorICAgIDI5NCwgMjg0LCAyODUsIDM0NSwgMjA4LCAyNjksIDI0OSwgMzY2LCAzODYsIDMwMCwKKyAgICAyOTcsIDI1OSwgMTI1LCAzNjksIDE5NywgIDk3LCAxOTQsIDI4NiwgMjExLCAyODEsCisgICAgMjgwLCAxODMsIDM3MiwgIDg3LCAxNTUsIDI4MywgIDU5LCAzNDgsIDMyNywgMTg0LAorICAgICA3NiwgMTExLCAzMzAsIDIwMywgMzQ5LCAgNjksICA5OCwgMTUyLCAxNDUsIDE4OSwKKyAgICAgNjYsIDMyMCwgMzM3LCAxNzMsIDM1OCwgMjUxLCAxOTgsIDE3NCwgMjYzLCAyNjIsCisgICAgMTI2LCAyNDEsIDE5MywgIDg4LCAzODgsIDExNywgIDk1LCAzODcsIDExMiwgMzU5LAorICAgIDI4NywgMjQ0LCAxMDMsIDI3MiwgMzAxLCAxNzEsIDE2MiwgMjM0LCAyNzMsIDEyNywKKyAgICAzNzMsIDE4MSwgMjkyLCAgODUsIDM3OCwgMzAyLCAxMjEsIDEwNywgMzY0LCAzNDYsCisgICAgMzU2LCAyMTIsIDI3OCwgMjEzLCAgNjUsIDM4MiwgMjg4LCAyMDcsIDExMywgMTc1LAorICAgICA5OSwgMjk2LCAzNzQsIDM2OCwgMTk5LCAyNjAsIDE4NSwgMzM2LCAzMzEsIDE2MSwKKyAgICAyNzAsIDI2NCwgMjUwLCAyNDAsICA3NSwgMzUwLCAxNTEsICA2MCwgIDg5LCAzMjEsCisgICAgMTU2LCAyNzQsIDM2MCwgMzI2LCAgNzAsIDI4MiwgMTY3LCAxNDYsIDM1MiwgIDgxLAorICAgICA5MSwgMzg5LCAyNjYsIDI0NSwgMTc3LCAyMzUsIDE5MCwgMjU2LCAyMDQsIDM0MiwKKyAgICAxMjgsIDExOCwgMzAzLCAxMDQsIDM3OSwgMTgyLCAxMTQsIDM3NSwgMjAwLCAgOTYsCisgICAgMjkzLCAxNzIsIDIxNCwgMzY1LCAyNzksICA4NiwgMjg5LCAzNTEsIDM0NywgMzU3LAorICAgIDI2MSwgMTg2LCAxNzYsIDI3MSwgIDkwLCAxMDAsIDE0NywgMzIyLCAyNzUsIDM2MSwKKyAgICAgNzEsIDMzMiwgIDYxLCAyNjUsIDE1NywgMjQ2LCAyMzYKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8yMzA1W10gPQoreworICAgICAgMCwgICA0LCAgIDYsIDE0NSwgMjQ3LCAzNTIsIDQ1NCwgICA3LCAgIDUsICAgMywKKyAgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsCisgICAgMTQ2LCAyNDgsIDM1MywgNDU1LCAxNTEsIDI1MywgMzU4LCA0NjAsIDE0OCwgMjUwLAorICAgIDM1NSwgNDU3LCAxNDksIDI1MSwgMzU2LCA0NTgsIDE1MiwgMzU5LCAxNTAsIDI1MiwKKyAgICAzNTcsIDQ1OSwgMTQ3LCAyNDksIDM1NCwgNDU2LCAgNTIsICAgMiwgICAxLCAxNTMsCisgICAgMzYwLCAyNTksICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LAorICAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywKKyAgICAyNjAsICAzMSwgMTU0LCAzNjEsICAgOSwgIDMzLCAgMTEsIDE1NSwgMzYyLCAgNTQsCisgICAgMjYxLCAgMjgsICAyNywgMTU2LCAzNjMsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLAorICAgICAzMCwgIDU1LCAyNjIsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxNTcsIDM2NCwKKyAgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxNTgsIDI2MywgMzY1LCAxODEsCisgICAgMTkyLCAxNzAsICA3OSwgIDU3LCAzOTksICA5MCwgMTU5LCAyOTcsIDM3NywgMzY2LAorICAgIDI3NSwgIDY4LCAxODMsIDM4OCwgMjg2LCAxOTQsIDI5OSwgIDkyLCAgNzAsIDE4MiwKKyAgICA0MDEsIDE3MiwgIDU5LCAgOTEsICA1OCwgNDAwLCAzNjgsIDE2MSwgIDgxLCAxNjAsCisgICAgMjY0LCAxNzEsICA4MCwgMzg5LCAzOTAsIDM3OCwgMzc5LCAxOTMsIDI5OCwgIDY5LAorICAgIDI2NiwgMjY1LCAzNjcsIDI3NywgMjg4LCAyNzYsIDI4NywgMTg0LCAgNjAsIDE5NSwKKyAgICAgODIsICA5MywgIDcxLCAzNjksIDQwMiwgMTczLCAxNjIsIDQ0NCwgMzAwLCAzOTEsCisgICAgIDk4LCAgNzYsIDI3OCwgIDYxLCAyNjcsIDM3NCwgMTM1LCA0MTEsIDE2NywgMTAyLAorICAgIDM4MCwgMjAwLCAgODcsIDE3OCwgIDY1LCAgOTQsIDIwNCwgMTI0LCAgNzIsIDM0MiwKKyAgICAxODksIDMwNSwgMzgxLCAzOTYsIDQzMywgMzAxLCAyMjYsIDQwNywgMjg5LCAyMzcsCisgICAgMTEzLCAyMTUsIDE4NSwgMTI4LCAzMDksIDQwMywgMTE2LCAzMjAsIDE5NiwgMzMxLAorICAgIDM3MCwgNDIyLCAxNzQsICA2NCwgMzkyLCAgODMsIDQyNSwgMjE5LCAxMzQsIDE4OCwKKyAgICA0MzIsIDExMiwgNDI3LCAxMzksIDI3OSwgMTYzLCA0MzYsIDIwOCwgNDQ3LCAyMTgsCisgICAgMjM2LCAyMjksICA5NywgMjk0LCAzODUsIDIzMCwgMTY2LCAyNjgsIDE3NywgNDQzLAorICAgIDIyNSwgNDI2LCAxMDEsIDI3MiwgMTM4LCAxMjcsIDI5MCwgMTE3LCAzNDcsIDE5OSwKKyAgICA0MTQsICA5NSwgMTQwLCAyNDAsIDQxMCwgMzk1LCAyMDksIDEyOSwgMjgzLCAzNDYsCisgICAgMTA1LCAyNDEsIDQzNywgIDg2LCAzMDgsIDQ0OCwgMjAzLCAzNDUsIDE4NiwgMTA3LAorICAgIDIyMCwgNDE1LCAzMzQsIDMxOSwgMTA2LCAzMTMsIDExOCwgMTIzLCAgNzMsIDIwNywKKyAgICA0MjEsIDIxNCwgMzg0LCAzNzMsIDQzOCwgIDYyLCAzNzEsIDM0MSwgIDc1LCA0NDksCisgICAgMTY4LCAzMjMsIDE2NCwgMjQyLCA0MTYsIDMyNCwgMzA0LCAxOTcsIDMzNSwgNDA0LAorICAgIDI3MSwgIDYzLCAxOTEsIDMyNSwgIDk2LCAxNjksIDIzMSwgMjgwLCAzMTIsIDE4NywKKyAgICA0MDYsICA4NCwgMjAxLCAxMDAsICA2NywgMzgyLCAxNzUsIDMzNiwgMjAyLCAzMzAsCisgICAgMjY5LCAzOTMsIDM3NiwgMzgzLCAyOTMsIDMwNywgNDA5LCAxNzksIDI4NSwgMzE0LAorICAgIDMwMiwgMzcyLCAzOTgsIDE5MCwgMTgwLCAgODksICA5OSwgMTAzLCAyMzIsICA3OCwKKyAgICAgODgsICA3NywgMTM2LCAzODcsIDE2NSwgMTk4LCAzOTQsIDEyNSwgMTc2LCA0MjgsCisgICAgIDc0LCAzNzUsIDIzOCwgMjI3LCAgNjYsIDI3MywgMjgyLCAxNDEsIDMwNiwgNDEyLAorICAgIDExNCwgIDg1LCAxMzAsIDM0OCwgMTE5LCAyOTEsIDI5NiwgMzg2LCAyMzMsIDM5NywKKyAgICAzMDMsIDQwNSwgMjg0LCA0NDUsIDQyMywgMjIxLCAyMTAsIDIwNSwgNDUwLCAxMDgsCisgICAgMjc0LCA0MzQsIDIxNiwgMzQzLCAzMzcsIDE0MiwgMjQzLCAzMjEsIDQwOCwgNDUxLAorICAgIDMxMCwgMjkyLCAxMjAsIDEwOSwgMjgxLCA0MzksIDI3MCwgNDI5LCAzMzIsIDI5NSwKKyAgICA0MTgsIDIxMSwgMzE1LCAyMjIsIDMyNiwgMTMxLCA0MzAsIDI0NCwgMzI3LCAzNDksCisgICAgNDE3LCAzMTYsIDE0MywgMzM4LCA0NDAsIDIzNCwgMTEwLCAyMTIsIDQ1MiwgMjQ1LAorICAgIDEyMSwgNDE5LCAzNTAsIDIyMywgMTMyLCA0NDEsIDMyOCwgNDEzLCAzMTcsIDMzOSwKKyAgICAxMjYsIDEwNCwgMTM3LCA0NDYsIDM0NCwgMjM5LCA0MzUsIDExNSwgMzMzLCAyMDYsCisgICAgMzIyLCAyMTcsIDIyOCwgNDI0LCA0NTMsIDMxMSwgMzUxLCAxMTEsIDQ0MiwgMjI0LAorICAgIDIxMywgMTIyLCA0MzEsIDM0MCwgMjM1LCAyNDYsIDEzMywgMTQ0LCA0MjAsIDMyOSwKKyAgICAzMTgKK307CisKK2NvbnN0IHBqX2ludDE2X3QgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8yMzg1W10gPQoreworICAgICAgMCwgICA0LCAgIDYsIDE0NSwgMjUxLCAzNjAsIDQ2NiwgICA3LCAgIDUsICAgMywKKyAgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsCisgICAgMTQ2LCAyNTIsIDM2MSwgNDY3LCAxNTEsIDI1NywgMzY2LCA0NzIsIDE0OCwgMjU0LAorICAgIDM2MywgNDY5LCAxNDksIDI1NSwgMzY0LCA0NzAsIDE1NiwgMzcxLCAxNTAsIDI1NiwKKyAgICAzNjUsIDQ3MSwgMTQ3LCAyNTMsIDM2MiwgNDY4LCAgNTIsICAgMiwgICAxLCAxNTcsCisgICAgMzcyLCAyNjcsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LAorICAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywKKyAgICAyNjgsICAzMSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAyNTgsIDI1OSwgMjYwLCAyNjEsCisgICAgMzY3LCAzNjgsIDM2OSwgMzcwLCA0NzMsIDQ3NCwgNDc1LCA0NzYsIDE1OCwgMzczLAorICAgICAgOSwgIDMzLCAgMTEsIDE1OSwgMzc0LCAgNTQsIDI2OSwgIDI4LCAgMjcsIDE2MCwKKyAgICAzNzUsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLCAgMzAsICA1NSwgMjcwLCAgMzcsCisgICAgIDM2LCAgMzksICAzOCwgIDQwLCAxNjEsIDM3NiwgIDQxLCAgNDIsICA0MywgIDQ0LAorICAgICA0NSwgIDU2LCAxNjIsIDI3MSwgMzc3LCAxODUsIDE5NiwgMTc0LCAgNzksICA1NywKKyAgICA0MTEsICA5MCwgMTYzLCAzMDUsIDM4OSwgMzc4LCAyODMsICA2OCwgMTg3LCA0MDAsCisgICAgMjk0LCAxOTgsIDMwNywgIDkyLCAgNzAsIDE4NiwgNDEzLCAxNzYsICA1OSwgIDkxLAorICAgICA1OCwgNDEyLCAzODAsIDE2NSwgIDgxLCAxNjQsIDI3MiwgMTc1LCAgODAsIDQwMSwKKyAgICA0MDIsIDM5MCwgMzkxLCAxOTcsIDMwNiwgIDY5LCAyNzQsIDI3MywgMzc5LCAyODUsCisgICAgMjk2LCAyODQsIDI5NSwgMTg4LCAgNjAsIDE5OSwgIDgyLCAgOTMsICA3MSwgMzgxLAorICAgIDQxNCwgMTc3LCAxNjYsIDQ1NiwgMzA4LCA0MDMsICA5OCwgIDc2LCAyODYsICA2MSwKKyAgICAyNzUsIDM4NiwgMTM1LCA0MjMsIDE3MSwgMTAyLCAzOTIsIDIwNCwgIDg3LCAxODIsCisgICAgIDY1LCAgOTQsIDIwOCwgMTI0LCAgNzIsIDM1MCwgMTkzLCAzMTMsIDM5MywgNDA4LAorICAgIDQ0NSwgMzA5LCAyMzAsIDQxOSwgMjk3LCAyNDEsIDExMywgMjE5LCAxODksIDEyOCwKKyAgICAzMTcsIDQxNSwgMTE2LCAzMjgsIDIwMCwgMzM5LCAzODIsIDQzNCwgMTc4LCAgNjQsCisgICAgNDA0LCAgODMsIDQzNywgMjIzLCAxMzQsIDE5MiwgNDQ0LCAxMTIsIDQzOSwgMTM5LAorICAgIDI4NywgMTY3LCA0NDgsIDIxMiwgNDU5LCAyMjIsIDI0MCwgMjMzLCAgOTcsIDMwMiwKKyAgICAzOTcsIDIzNCwgMTcwLCAyNzYsIDE4MSwgNDU1LCAyMjksIDQzOCwgMTAxLCAyODAsCisgICAgMTM4LCAxMjcsIDI5OCwgMTE3LCAzNTUsIDIwMywgNDI2LCAgOTUsIDE0MCwgMjQ0LAorICAgIDQyMiwgNDA3LCAyMTMsIDEyOSwgMjkxLCAzNTQsIDEwNSwgMjQ1LCA0NDksICA4NiwKKyAgICAzMTYsIDQ2MCwgMjA3LCAzNTMsIDE5MCwgMTA3LCAyMjQsIDQyNywgMzQyLCAzMjcsCisgICAgMTA2LCAzMjEsIDExOCwgMTIzLCAgNzMsIDIxMSwgNDMzLCAyMTgsIDM5NiwgMzg1LAorICAgIDQ1MCwgIDYyLCAzODMsIDM0OSwgIDc1LCA0NjEsIDE3MiwgMzMxLCAxNjgsIDI0NiwKKyAgICA0MjgsIDMzMiwgMzEyLCAyMDEsIDM0MywgNDE2LCAyNzksICA2MywgMTk1LCAzMzMsCisgICAgIDk2LCAxNzMsIDIzNSwgMjg4LCAzMjAsIDE5MSwgNDE4LCAgODQsIDIwNSwgMTAwLAorICAgICA2NywgMzk0LCAxNzksIDM0NCwgMjA2LCAzMzgsIDI3NywgNDA1LCAzODgsIDM5NSwKKyAgICAzMDEsIDMxNSwgNDIxLCAxODMsIDI5MywgMzIyLCAzMTAsIDM4NCwgNDEwLCAxOTQsCisgICAgMTg0LCAgODksICA5OSwgMTAzLCAyMzYsICA3OCwgIDg4LCAgNzcsIDEzNiwgMzk5LAorICAgIDE2OSwgMjAyLCA0MDYsIDEyNSwgMTgwLCA0NDAsICA3NCwgMzg3LCAyNDIsIDIzMSwKKyAgICAgNjYsIDI4MSwgMjkwLCAxNDEsIDMxNCwgNDI0LCAxMTQsICA4NSwgMTMwLCAzNTYsCisgICAgMTE5LCAyOTksIDMwNCwgMzk4LCAyMzcsIDQwOSwgMzExLCA0MTcsIDI5MiwgNDU3LAorICAgIDQzNSwgMjI1LCAyMTQsIDIwOSwgNDYyLCAxMDgsIDI4MiwgNDQ2LCAyMjAsIDM1MSwKKyAgICAzNDUsIDE0MiwgMjQ3LCAzMjksIDQyMCwgNDYzLCAzMTgsIDMwMCwgMTIwLCAxMDksCisgICAgMjg5LCA0NTEsIDI3OCwgNDQxLCAzNDAsIDMwMywgNDMwLCAyMTUsIDMyMywgMjI2LAorICAgIDMzNCwgMTMxLCA0NDIsIDI0OCwgMzM1LCAzNTcsIDQyOSwgMzI0LCAxNDMsIDM0NiwKKyAgICA0NTIsIDIzOCwgMTEwLCAyMTYsIDQ2NCwgMjQ5LCAxMjEsIDQzMSwgMzU4LCAyMjcsCisgICAgMTMyLCA0NTMsIDMzNiwgNDI1LCAzMjUsIDM0NywgMTI2LCAxMDQsIDEzNywgNDU4LAorICAgIDM1MiwgMjQzLCA0NDcsIDExNSwgMzQxLCAyMTAsIDMzMCwgMjIxLCAyMzIsIDQzNiwKKyAgICA0NjUsIDMxOSwgMzU5LCAxMTEsIDQ1NCwgMjI4LCAyMTcsIDEyMiwgNDQzLCAzNDgsCisgICAgMjM5LCAyNTAsIDEzMywgMTQ0LCA0MzIsIDMzNywgMzI2Cit9OworCisvKioKKyAqIEFNUi1OQiBiaXRzdHJlYW0gc2Vuc2l0aXZpdHkgb3JkZXIgbWFwcy4KKyAqLworY29uc3QgcGpfaW50MTZfdCogY29uc3QgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcHNbOF0gPQoreworICAgIHBqbWVkaWFfY29kZWNfYW1ybmJfb3JkZXJtYXA0NzUsCisgICAgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDUxNSwKKyAgICBwam1lZGlhX2NvZGVjX2Ftcm5iX29yZGVybWFwNTksCisgICAgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDY3LAorICAgIHBqbWVkaWFfY29kZWNfYW1ybmJfb3JkZXJtYXA3NCwKKyAgICBwam1lZGlhX2NvZGVjX2Ftcm5iX29yZGVybWFwNzk1LAorICAgIHBqbWVkaWFfY29kZWNfYW1ybmJfb3JkZXJtYXAxMDIsCisgICAgcGptZWRpYV9jb2RlY19hbXJuYl9vcmRlcm1hcDEyMgorfTsKKworLyoqCisgKiBBTVItV0IgYml0c3RyZWFtIHNlbnNpdGl2aXR5IG9yZGVyIG1hcHMuCisgKi8KK2NvbnN0IHBqX2ludDE2X3QqIGNvbnN0IHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBzWzldID0KK3sKKyAgICBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwXzY2MCwKKyAgICBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwXzg4NSwKKyAgICBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwXzEyNjUsCisgICAgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8xNDI1LAorICAgIHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBfMTU4NSwKKyAgICBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwXzE4MjUsCisgICAgcGptZWRpYV9jb2RlY19hbXJ3Yl9vcmRlcm1hcF8xOTg1LAorICAgIHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBfMjMwNSwKKyAgICBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwXzIzODUKK307CisKKy8qKgorICogQ29uc3RhbnQgb2YgQU1SLU5CIGZyYW1lIGxlbmd0aHMgaW4gYnl0ZXMuCisgKi8KK2NvbnN0IHBqX3VpbnQ4X3QgIHBqbWVkaWFfY29kZWNfYW1ybmJfZnJhbWVsZW5bMTZdID0gCisgICAgezEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwgNSwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisvKioKKyAqIENvbnN0YW50IG9mIEFNUi1OQiBmcmFtZSBsZW5ndGhzIGluIGJpdHMuCisgKi8KK2NvbnN0IHBqX3VpbnQxNl90IHBqbWVkaWFfY29kZWNfYW1ybmJfZnJhbWVsZW5iaXRzWzldID0gCisgICAgezk1LCAxMDMsIDExOCwgMTM0LCAxNDgsIDE1OSwgMjA0LCAyNDQsIDM5fTsKKy8qKgorICogQ29uc3RhbnQgb2YgQU1SLU5CIGJpdHJhdGVzLgorICovCitjb25zdCBwal91aW50MTZfdCBwam1lZGlhX2NvZGVjX2Ftcm5iX2JpdHJhdGVzWzhdID0gCisgICAgezQ3NTAsIDUxNTAsIDU5MDAsIDY3MDAsIDc0MDAsIDc5NTAsIDEwMjAwLCAxMjIwMH07CisKKy8qKgorICogQ29uc3RhbnQgb2YgQU1SLVdCIGZyYW1lIGxlbmd0aHMgaW4gYnl0ZXMuCisgKi8KK2NvbnN0IHBqX3VpbnQ4X3QgIHBqbWVkaWFfY29kZWNfYW1yd2JfZnJhbWVsZW5bMTZdID0gCisgICAgezE3LCAyMywgMzIsIDM3LCA0MCwgNDYsIDUwLCA1OCwgNjAsIDUsIDAsIDAsIDAsIDAsIDAsIDB9OworLyoqCisgKiBDb25zdGFudCBvZiBBTVItV0IgZnJhbWUgbGVuZ3RocyBpbiBiaXRzLgorICovCitjb25zdCBwal91aW50MTZfdCBwam1lZGlhX2NvZGVjX2FtcndiX2ZyYW1lbGVuYml0c1sxMF0gPSAKKyAgICB7MTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NywgNDB9OworLyoqCisgKiBDb25zdGFudCBvZiBBTVItV0IgYml0cmF0ZXMuCisgKi8KK2NvbnN0IHBqX3VpbnQxNl90IHBqbWVkaWFfY29kZWNfYW1yd2JfYml0cmF0ZXNbOV0gPSAKKyAgICB7NjYwMCwgODg1MCwgMTI2NTAsIDE0MjUwLCAxNTg1MCwgMTgyNTAsIDE5ODUwLCAyMzA1MCwgMjM4NTB9OworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIEFNUiBmcmFtZSBpbmZvLCB0byBiZSBmaXR0ZWQgaW50byAjcGptZWRpYV9mcmFtZQorICogYml0IGluZm8uCisgKi8KKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19hbXJfYml0X2luZm8geworICAgIHBqX3VpbnQ4X3QgZnJhbWVfdHlwZTsJLyoqPCBBTVIgZnJhbWUgdHlwZS4JCQkqLworICAgIHBqX2ludDhfdCAgbW9kZTsJCS8qKjwgQU1SIG1vZGUuCQkJCSovCisgICAgcGpfdWludDhfdCBzdGFydF9iaXQ7CS8qKjwgRnJhbWUgc3RhcnQgYml0LgkJCSovCisgICAgcGpfdWludDhfdCBnb29kX3F1YWxpdHk6MTsJLyoqPCBGbGFnIGlmIGZyYW1lIGlzIGdvb2QvZGVncmFkZWQuCSovCisgICAgcGpfdWludDhfdCBTVEk6MTsJCS8qKjwgU1RJIG1vZGUgKGZpcnN0L3VwZGF0ZSkuCQkqLworfSBwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbzsKKyNwcmFnbWEgcGFjaygpCisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgQU1SIHNldHRpbmdzLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2NvZGVjX2Ftcl9wYWNrX3NldHRpbmcgeworICAgIHBqX3VpbnQ4X3QgYW1yX25iOjE7CS8qKjwgU2V0IDEgZm9yIEFNUi1OQiwgMCBmb3IgQU1SLVdCLgkqLworICAgIHBqX3VpbnQ4X3QgcmVvcmRlcjoxOwkvKio8IFJlb3JkZXIgYml0c3RyZWFtIGludG8gZGVzY2VuZGluZyAKKwkJCQkgICAgIHNlbnNpdGl2aXR5IG9yZGVyIG9yIHZpY2UgdmVyc2EuCSovCisgICAgcGpfdWludDhfdCBvY3RldF9hbGlnbmVkOjE7CS8qKjwgVFJVRSBpZiBwYXlsb2FkIGlzIGluIG9jdGV0LWFsaWduZWQgbW9kZSwKKwkJCQkgICAgIEZBTFNFIGlmIHBheWxvYWQgaXMgaW4gYmFuZHdpZHRoIAorCQkJCSAgICAgZWZmaWNpZW50IG1vZGUuCQkJKi8KKyAgICBwal91aW50OF90IGNtcjo0OwkJLyoqPCBDaGFuZ2UgTW9kZSBSZXF1ZXN0IGZvciByZW1vdGUKKwkJCQkgICAgIGVuY29kZXIuCQkJCSovCit9IHBqbWVkaWFfY29kZWNfYW1yX3BhY2tfc2V0dGluZzsKKworCisvKioKKyAqIEdldCBBTVIgbW9kZSBiYXNlZCBvbiBiaXRyYXRlLgorICoKKyAqIEBwYXJhbSBiaXRyYXRlICAgQU1SIGJpdHJhdGUuCisgKgorICogQHJldHVybgkgICAgQU1SIG1vZGUuCisgKi8KK1BKX0lOTElORShwal9pbnQ4X3QpIHBqbWVkaWFfY29kZWNfYW1yX2dldF9tb2RlKHVuc2lnbmVkIGJpdHJhdGUpCit7CisgICAgcGpfaW50OF90IG1vZGUgPSAtMTsKKworICAgIGlmKGJpdHJhdGU9PTQ3NTApeworCW1vZGUgPSAwOworICAgIH0gZWxzZSBpZihiaXRyYXRlPT01MTUwKXsKKwltb2RlID0gMTsKKyAgICB9IGVsc2UgaWYoYml0cmF0ZT09NTkwMCl7CisJbW9kZSA9IDI7CisgICAgfSBlbHNlIGlmKGJpdHJhdGU9PTY3MDApeworCW1vZGUgPSAzOworICAgIH0gZWxzZSBpZihiaXRyYXRlPT03NDAwKXsKKwltb2RlID0gNDsKKyAgICB9IGVsc2UgaWYoYml0cmF0ZT09Nzk1MCl7CisJbW9kZSA9IDU7CisgICAgfSBlbHNlIGlmKGJpdHJhdGU9PTEwMjAwKXsKKwltb2RlID0gNjsKKyAgICB9IGVsc2UgaWYoYml0cmF0ZT09MTIyMDApeworCW1vZGUgPSA3OworCisgICAgLyogQU1SV0IgKi8KKyAgICB9IGVsc2UgaWYoYml0cmF0ZT09NjYwMCl7CisJbW9kZSA9IDA7CisgICAgfSBlbHNlIGlmKGJpdHJhdGU9PTg4NTApeworCW1vZGUgPSAxOworICAgIH0gZWxzZSBpZihiaXRyYXRlPT0xMjY1MCl7CisJbW9kZSA9IDI7CisgICAgfSBlbHNlIGlmKGJpdHJhdGU9PTE0MjUwKXsKKwltb2RlID0gMzsKKyAgICB9IGVsc2UgaWYoYml0cmF0ZT09MTU4NTApeworCW1vZGUgPSA0OworICAgIH0gZWxzZSBpZihiaXRyYXRlPT0xODI1MCl7CisJbW9kZSA9IDU7CisgICAgfSBlbHNlIGlmKGJpdHJhdGU9PTE5ODUwKXsKKwltb2RlID0gNjsKKyAgICB9IGVsc2UgaWYoYml0cmF0ZT09MjMwNTApeworCW1vZGUgPSA3OworICAgIH0gZWxzZSBpZihiaXRyYXRlPT0yMzg1MCl7CisJbW9kZSA9IDg7CisgICAgfQorICAgIHJldHVybiBtb2RlOworfQorCisvKioKKyAqIEdldCBBTVIgbW9kZSBiYXNlZCBvbiBmcmFtZSBsZW5ndGguCisgKgorICogQHBhcmFtIGFtcm5iCSAgICBTZXQgdG8gUEpfVFJVRSBmb3IgQU1SLU5CIGRvbWFpbiBvciBQSl9GQUxTRSBmb3IgQU1SLVdCLgorICogQHBhcmFtIGZyYW1lX2xlbiBUaGUgZnJhbWUgbGVuZ3RoLgorICoKKyAqIEByZXR1cm4JICAgIEFNUiBtb2RlLgorICovCisKK1BKX0lOTElORShwal9pbnQ4X3QpIHBqbWVkaWFfY29kZWNfYW1yX2dldF9tb2RlMihwal9ib29sX3QgYW1ybmIsCisJCQkJCQkgdW5zaWduZWQgZnJhbWVfbGVuKQoreworICAgIGludCBpOworCisgICAgaWYgKGFtcm5iKSB7CisJZm9yIChpID0gMDsgaSA8IDk7ICsraSkKKwkgICAgaWYgKGZyYW1lX2xlbiA9PSBwam1lZGlhX2NvZGVjX2Ftcm5iX2ZyYW1lbGVuW2ldKQorCQlyZXR1cm4gKHBqX2ludDhfdClpOworICAgIH0gZWxzZSB7CisJZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKwkgICAgaWYgKGZyYW1lX2xlbiA9PSBwam1lZGlhX2NvZGVjX2FtcndiX2ZyYW1lbGVuW2ldKQorCQlyZXR1cm4gKHBqX2ludDhfdClpOworCX0KKyAgICB9CisgICAgCisgICAgcGpfYXNzZXJ0KCEiSW52YWxpZCBBTVIgZnJhbWUgbGVuZ3RoIik7CisgICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIFByZXBhcmUgYSBmcmFtZSBiZWZvcmUgcGFzcyBpdCB0byBkZWNvZGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZG86CisgKiAtIHJlb3JkZXIgQU1SIGJpdHN0cmVhbSBmcm9tIGRlc2NlbmRpbmcgc2Vuc2l0aXZpdHkgb3JkZXIgaW50byAKKyAqICAgZW5jb2RlciBiaXRzIG9yZGVyLiBUaGlzIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHZpYSBwYXJhbSAKKyAqICAgJ3NldHRpbmcnIGJ5IHNldHRpbmcvcmVzZXR0aW5nIGZpZWxkICdyZW9yZGVyJy4KKyAqIC0gYWxpZ24gbGVmdCB0aGUgc3RhcnQgYml0IChtYWtlIHRoZSBzdGFydF9iaXQgdG8gYmUgMCkuCisgKgorICogQHBhcmFtIGluCSAgICBJbnB1dCBmcmFtZS4KKyAqIEBwYXJhbSBzZXR0aW5nICAgU2V0dGluZ3MsIHNlZSAjcGptZWRpYV9jb2RlY19hbXJfcGFja19zZXR0aW5nLgorICogQHBhcmFtIG91dAkgICAgT3V0cHV0IGZyYW1lLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX2Ftcl9wcmVkZWNvZGUoCisJCQkgICAgY29uc3QgcGptZWRpYV9mcmFtZSAqaW4sCisJCQkgICAgY29uc3QgcGptZWRpYV9jb2RlY19hbXJfcGFja19zZXR0aW5nICpzZXR0aW5nLAorCQkJICAgIHBqbWVkaWFfZnJhbWUgKm91dCkKK3sKKyAgICBwal9pbnQ4X3QgICAgYW1yX2JpdHNbNDc3ICsgN10gPSB7MH07CisgICAgcGpfaW50OF90ICAgKnBfYW1yX2JpdHMgPSAmYW1yX2JpdHNbMF07CisKKyAgICBwal91aW50OF90ICAqciA9IChwal91aW50OF90KikgaW4tPmJ1ZjsgIC8qIHJlYWQgY3Vyc29yICovCisgICAgcGpfdWludDhfdCAgKncgPSAocGpfdWludDhfdCopIG91dC0+YnVmOyAvKiB3cml0ZSBjdXJzb3IgKi8KKworICAgIC8qIGVudiB2YXJzIGZvciBBTVIgb3IgQU1SV0IgKi8KKyAgICBwal91aW50OF90CQkgICAgIFNJRF9GVDsKKyAgICBjb25zdCBwal91aW50OF90CSAgICAqZnJhbWVsZW5fdGJsOworICAgIGNvbnN0IHBqX3VpbnQxNl90CSAgICAqZnJhbWVsZW5iaXRfdGJsOworICAgIGNvbnN0IHBqX3VpbnQxNl90CSAgICAqYml0cmF0ZV90Ymw7CisgICAgY29uc3QgcGpfaW50MTZfdCogY29uc3QgKm9yZGVyX21hcHM7CisKKyAgICBwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbyAqaW5faW5mbyA9CisJCQkgICAgKHBqbWVkaWFfY29kZWNfYW1yX2JpdF9pbmZvKikgJmluLT5iaXRfaW5mbzsKKyAgICBwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbyAqb3V0X2luZm8gPQorCQkJICAgIChwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbyopICZvdXQtPmJpdF9pbmZvOworCisgICAgdW5zaWduZWQgaTsKKworICAgICpvdXRfaW5mbyA9ICppbl9pbmZvOworCisgICAgaWYgKHNldHRpbmctPmFtcl9uYikgeworCVNJRF9GVAkJPSA4OworCWZyYW1lbGVuX3RibAk9IHBqbWVkaWFfY29kZWNfYW1ybmJfZnJhbWVsZW47CisJZnJhbWVsZW5iaXRfdGJsID0gcGptZWRpYV9jb2RlY19hbXJuYl9mcmFtZWxlbmJpdHM7CisJYml0cmF0ZV90YmwJPSBwam1lZGlhX2NvZGVjX2Ftcm5iX2JpdHJhdGVzOworCW9yZGVyX21hcHMJPSBwam1lZGlhX2NvZGVjX2Ftcm5iX29yZGVybWFwczsKKyAgICB9IGVsc2UgeworCVNJRF9GVAkJPSA5OworCWZyYW1lbGVuX3RibAk9IHBqbWVkaWFfY29kZWNfYW1yd2JfZnJhbWVsZW47CisJZnJhbWVsZW5iaXRfdGJsID0gcGptZWRpYV9jb2RlY19hbXJ3Yl9mcmFtZWxlbmJpdHM7CisJYml0cmF0ZV90YmwJPSBwam1lZGlhX2NvZGVjX2FtcndiX2JpdHJhdGVzOworCW9yZGVyX21hcHMJPSBwam1lZGlhX2NvZGVjX2FtcndiX29yZGVybWFwczsKKyAgICB9CisKKyAgICAvKiB1bnBhY2sgQU1SIGJpdHN0cmVhbSBpZiB0aGVyZSBpcyBhbnkgZGF0YSAqLworICAgIGlmIChpbl9pbmZvLT5mcmFtZV90eXBlIDw9IFNJRF9GVCkgeworCWkgPSAwOworCWlmIChpbl9pbmZvLT5zdGFydF9iaXQpIHsKKwkgICAgZm9yICg7IGkgPCAodW5zaWduZWQpKDgtaW5faW5mby0+c3RhcnRfYml0KTsgKytpKQorCQkqcF9hbXJfYml0cysrID0gKHBqX3VpbnQ4X3QpCisJCQkJKCgqciA+PiAoNy1pbl9pbmZvLT5zdGFydF9iaXQtaSkpICYgMSk7CisJICAgICsrcjsKKwl9CisJZm9yKDsgaSA8IGZyYW1lbGVuYml0X3RibFtpbl9pbmZvLT5mcmFtZV90eXBlXTsgaSArPSA4LCArK3IpIHsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNykgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNikgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNSkgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNCkgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gMykgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gMikgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gMSkgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgKSAmIDEpOworCX0KKyAgICB9CisKKyAgICBpZiAoaW5faW5mby0+ZnJhbWVfdHlwZSA8IFNJRF9GVCkgeworCisJLyogU3BlZWNoICovCisJb3V0X2luZm8tPm1vZGUgPSBpbl9pbmZvLT5mcmFtZV90eXBlOworCW91dC0+c2l6ZSA9IGZyYW1lbGVuX3RibFtvdXRfaW5mby0+bW9kZV07CisKKwlwal9iemVybyhvdXQtPmJ1Ziwgb3V0LT5zaXplKTsKKworCWlmIChzZXR0aW5nLT5yZW9yZGVyKSB7CisJICAgIGNvbnN0IHBqX2ludDE2X3QgKm9yZGVyX21hcDsKKworCSAgICBvcmRlcl9tYXAgPSBvcmRlcl9tYXBzW291dF9pbmZvLT5tb2RlXTsKKwkgICAgZm9yKGkgPSAwOyBpIDwgZnJhbWVsZW5iaXRfdGJsW291dF9pbmZvLT5tb2RlXTsgKytpKSB7CisJCWlmIChhbXJfYml0c1tpXSkgeworCQkgICAgcGpfdWludDE2X3QgYml0cG9zOworCQkgICAgYml0cG9zID0gb3JkZXJfbWFwW2ldOworCQkgICAgd1tiaXRwb3M+PjNdIHw9IDEgPDwgKDcgLSAoYml0cG9zICUgOCkpOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBmb3IoaSA9IDA7IGkgPCBmcmFtZWxlbmJpdF90Ymxbb3V0X2luZm8tPm1vZGVdOyArK2kpIHsKKwkJaWYgKGFtcl9iaXRzW2ldKQorCQkgICAgd1tpID4+IDNdIHw9IDEgPDwgKDcgLSAoaSAlIDgpKTsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSBpZiAoaW5faW5mby0+ZnJhbWVfdHlwZSA9PSBTSURfRlQpIHsKKworCS8qIFNJRCAqLworCXBqX3VpbnQ4X3Qgd19iaXRwdHIgPSAwOworCXBqX3VpbnQ4X3QgRlRfOworCisJaWYgKHNldHRpbmctPmFtcl9uYikKKwkgICAgRlRfID0gKHBqX3VpbnQ4X3QpKChhbXJfYml0c1szNl0gPDwgMikgfCAoYW1yX2JpdHNbMzddIDw8IDEpIHwgCisJICAgICAgICAgICAgICAgICAgICAgICBhbXJfYml0c1szOF0pOworCWVsc2UKKwkgICAgRlRfID0gKHBqX3VpbnQ4X3QpKChhbXJfYml0c1szNl0gPDwgMykgfCAoYW1yX2JpdHNbMzddIDw8IDIpIHwKKwkJICAgICAgICAgICAgICAgKGFtcl9iaXRzWzM4XSA8PCAxKSB8IGFtcl9iaXRzWzM5XSk7CisKKwlvdXRfaW5mby0+bW9kZSA9IEZUXzsKKwlvdXQtPnNpemUgPSA1OworCisJcGpfYnplcm8ob3V0LT5idWYsIG91dC0+c2l6ZSk7CisJZm9yKGkgPSAwOyBpIDwgZnJhbWVsZW5iaXRfdGJsW1NJRF9GVF07ICsraSkgeworCSAgICBpZiAoYW1yX2JpdHNbaV0pCisJCSp3IHw9ICgxIDw8ICg3LXdfYml0cHRyKSk7CisKKwkgICAgaWYgKCsrd19iaXRwdHIgPT0gOCkgeworCQkrK3c7CisJCXdfYml0cHRyID0gMDsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSB7CisKKwkvKiBOTyBEQVRBICovCisJb3V0LT5zaXplID0gMDsKKwlvdXRfaW5mby0+bW9kZSA9IC0xOworICAgIH0KKworICAgIG91dF9pbmZvLT5zdGFydF9iaXQgPSAwOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqCisgKiBQYWNrIGVuY29kZWQgQU1SIGZyYW1lKHMpIGludG8gYW4gUlRQIHBheWxvYWQuCisgKgorICogQHBhcmFtIGZyYW1lcyAgICBBTVIgZnJhbWVzIHRvIGJlIHBhY2tlZC4KKyAqIEBwYXJhbSBuZnJhbWVzICAgTnVtYmVyIG9mIGZyYW1lcyB0byBiZSBwYWNrZWQuCisgKiBAcGFyYW0gc2V0dGluZyAgIFNldHRpbmdzLCBzZWUgI3BqbWVkaWFfY29kZWNfYW1yX3BhY2tfc2V0dGluZy4KKyAqIEBwYXJhbSBwa3QJICAgIFBheWxvYWQuCisgKiBAcGFyYW0gcGt0X3NpemUgIFBheWxvYWQgc2l6ZSwgYXMgaW5wdXQgdGhpcyBzcGVjaWZpZXMgcGF5bG9hZCBtYXhpbXVtIHNpemUsCisgKgkJICAgIGFzIG91dHB1dCB0aGlzIHNwZWNpZmllcyBwYXlsb2FkIHBhY2tlZCBzaXplLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfSU5MSU5FIChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19hbXJfcGFjaygKKwkJCSAgICBjb25zdCBwam1lZGlhX2ZyYW1lIGZyYW1lc1tdLAorCQkJICAgIHVuc2lnbmVkIG5mcmFtZXMsCisJCQkgICAgY29uc3QgcGptZWRpYV9jb2RlY19hbXJfcGFja19zZXR0aW5nICpzZXR0aW5nLAorCQkJICAgIHZvaWQgKnBrdCwgCisJCQkgICAgcGpfc2l6ZV90ICpwa3Rfc2l6ZSkKK3sKKyAgICAvKiBXcml0ZSBjdXJzb3IgKi8KKyAgICBwal91aW50OF90ICp3ID0gKHBqX3VpbnQ4X3QqKXBrdDsKKyAgICBwal91aW50OF90IHdfYml0cHRyID0gMDsKKworICAgIC8qIFJlYWQgY3Vyc29yICovCisgICAgcGpfdWludDhfdCAqcjsKKworICAgIC8qIGVudiB2YXJzIGZvciBBTVIgb3IgQU1SV0IgKi8KKyAgICBwal91aW50OF90CQkgICAgIFNJRF9GVDsKKyAgICBjb25zdCBwal91aW50OF90CSAgICAqZnJhbWVsZW5fdGJsOworICAgIGNvbnN0IHBqX3VpbnQxNl90CSAgICAqZnJhbWVsZW5iaXRfdGJsOworICAgIGNvbnN0IHBqX3VpbnQxNl90CSAgICAqYml0cmF0ZV90Ymw7CisgICAgY29uc3QgcGpfaW50MTZfdCogY29uc3QgKm9yZGVyX21hcHM7CisKKyAgICAvKiBmcmFtZSBpbmZvICovCisgICAgcGptZWRpYV9jb2RlY19hbXJfYml0X2luZm8gKmluZm87CisKKyAgICB1bnNpZ25lZCBpLCBtYXhfcGt0X3NpemU7CisKKyAgICBtYXhfcGt0X3NpemUgPSAqcGt0X3NpemU7CisKKyAgICBpZiAoc2V0dGluZy0+YW1yX25iKSB7CisJU0lEX0ZUCQk9IDg7CisJZnJhbWVsZW5fdGJsCT0gcGptZWRpYV9jb2RlY19hbXJuYl9mcmFtZWxlbjsKKwlmcmFtZWxlbmJpdF90YmwgPSBwam1lZGlhX2NvZGVjX2Ftcm5iX2ZyYW1lbGVuYml0czsKKwliaXRyYXRlX3RibAk9IHBqbWVkaWFfY29kZWNfYW1ybmJfYml0cmF0ZXM7CisJb3JkZXJfbWFwcwk9IHBqbWVkaWFfY29kZWNfYW1ybmJfb3JkZXJtYXBzOworICAgIH0gZWxzZSB7CisJU0lEX0ZUCQk9IDk7CisJZnJhbWVsZW5fdGJsCT0gcGptZWRpYV9jb2RlY19hbXJ3Yl9mcmFtZWxlbjsKKwlmcmFtZWxlbmJpdF90YmwgPSBwam1lZGlhX2NvZGVjX2FtcndiX2ZyYW1lbGVuYml0czsKKwliaXRyYXRlX3RibAk9IHBqbWVkaWFfY29kZWNfYW1yd2JfYml0cmF0ZXM7CisJb3JkZXJfbWFwcwk9IHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBzOworICAgIH0KKworICAgIC8qIENvZGUgTW9kZSBSZXF1ZXN0LCA0IGJpdHMgKi8KKyAgICAqdyA9IChwal91aW50OF90KShzZXR0aW5nLT5jbXIgPDwgNCk7CisgICAgd19iaXRwdHIgPSA0OworICAgIGlmIChzZXR0aW5nLT5vY3RldF9hbGlnbmVkKSB7CisJKyt3OworCXdfYml0cHRyID0gMDsKKyAgICB9CisKKyAgICAvKiBUYWJsZSBPZiBDb250ZW50cywgNiBiaXRzIGVhY2ggKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmZyYW1lczsgKytpKSB7CisJcGpfdWludDhfdCBUT0MsIEZULCBROworCXBqX2Jvb2xfdCBGOworCisJaW5mbyA9IChwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbyopJmZyYW1lc1tpXS5iaXRfaW5mbzsKKworCUYgPSAoaSAhPSBuZnJhbWVzLTEpOworCUZUID0gaW5mby0+ZnJhbWVfdHlwZTsKKwlRICA9IChwal91aW50OF90KShpbmZvLT5nb29kX3F1YWxpdHkgPT0gMSk7CisJcGpfYXNzZXJ0KEZUIDw9IFNJRF9GVCB8fCBGVCA9PSAxNCB8fCBGVCA9PSAxNSk7CisKKwkvKiBDaGVjayBidWZmZXIgYXZhaWxhYmlsaXR5ICovCisJKnBrdF9zaXplID0gdyAtIChwal91aW50OF90Kilwa3QgKyAxOworCVBKX0FTU0VSVF9SRVRVUk4oKnBrdF9zaXplIDw9IG1heF9wa3Rfc2l6ZSwgUEpfRVRPT1NNQUxMKTsKKworCVRPQyA9IChwal91aW50OF90KSgoRjw8NSkgfCAoRlQ8PDEpIHwgUSk7CisJaWYgKHdfYml0cHRyID09IDApIHsKKwkgICAgKncgPSAocGpfdWludDhfdCkoVE9DPDwyKTsKKwkgICAgd19iaXRwdHIgPSA2OworCX0gZWxzZSBpZiAod19iaXRwdHIgPT0gMikgeworCSAgICAqdysrIHw9IFRPQzsKKwkgICAgd19iaXRwdHIgPSAwOworCX0gZWxzZSBpZiAod19iaXRwdHIgPT0gNCkgeworCSAgICAqdysrIHw9IFRPQz4+MjsKKwkgICAgKncgPSAocGpfdWludDhfdCkoVE9DPDw2KTsKKwkgICAgd19iaXRwdHIgPSAyOworCX0gZWxzZSBpZiAod19iaXRwdHIgPT0gNikgeworCSAgICAqdysrIHw9IFRPQz4+NDsKKwkgICAgKncgPSAocGpfdWludDhfdCkoVE9DPDw0KTsKKwkgICAgd19iaXRwdHIgPSA0OworCX0KKwlpZiAoc2V0dGluZy0+b2N0ZXRfYWxpZ25lZCkgeworCSAgICArK3c7CisJICAgIHdfYml0cHRyID0gMDsKKwl9CisgICAgfQorCisgICAgLyogRW5jb2RlZCBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7ICsraSkgeworCXBqX2ludDhfdCBhbXJfYml0c1s0NzcgKyA3XSA9IHswfTsKKwlwal9pbnQ4X3QgKnBfYW1yX2JpdHMgPSAmYW1yX2JpdHNbMF07CisJdW5zaWduZWQgajsKKworCWluZm8gPSAocGptZWRpYV9jb2RlY19hbXJfYml0X2luZm8qKSZmcmFtZXNbaV0uYml0X2luZm87CisKKwkvKiBDaGVjayBidWZmZXIgYXZhaWxhYmlsaXR5ICovCisJKnBrdF9zaXplID0gdyAtIChwal91aW50OF90Kilwa3Q7CisJaWYgKGluZm8tPmZyYW1lX3R5cGUgPD0gU0lEX0ZUKQorCSAgICAqcGt0X3NpemUgKz0gZnJhbWVsZW5fdGJsW2luZm8tPmZyYW1lX3R5cGVdICsgMTsKKwlQSl9BU1NFUlRfUkVUVVJOKCpwa3Rfc2l6ZSA8PSBtYXhfcGt0X3NpemUsIFBKX0VUT09TTUFMTCk7CisKKwkvKiBTa2lwIGlmIHRoZXJlIGlzIG5vIGRhdGEgKi8KKwlpZiAoaW5mby0+ZnJhbWVfdHlwZSA+IFNJRF9GVCkKKwkgICAgY29udGludWU7CisKKwkvKiBVbnBhY2sgYml0cyAqLworCXIgPSAocGpfdWludDhfdCopIGZyYW1lc1tpXS5idWY7CisJaiA9IDA7CisJaWYgKGluZm8tPnN0YXJ0X2JpdCkgeworCSAgICBmb3IgKDsgaiA8ICh1bnNpZ25lZCkoOC1pbmZvLT5zdGFydF9iaXQpOyArK2opCisJCSpwX2Ftcl9iaXRzKysgPSAocGpfdWludDhfdCkKKwkJCQkoKCpyID4+ICg3LWluZm8tPnN0YXJ0X2JpdC1qKSkgJiAxKTsKKwkgICAgKytyOworCX0KKwlmb3IoOyBqIDwgZnJhbWVsZW5iaXRfdGJsW2luZm8tPmZyYW1lX3R5cGVdOyBqKz04LCArK3IpIHsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNykgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNikgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNSkgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gNCkgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gMykgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gMikgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgPj4gMSkgJiAxKTsKKwkgICAgKnBfYW1yX2JpdHMrKyA9IChwal91aW50OF90KSgoKnIgKSAmIDEpOworCX0KKworCWlmIChpbmZvLT5mcmFtZV90eXBlIDwgU0lEX0ZUKSB7CisKKwkgICAgLyogU3BlZWNoICovCisJICAgIGlmICh3X2JpdHB0ciA9PSAwKSAqdyA9IDA7CisKKwkgICAgaWYgKHNldHRpbmctPnJlb3JkZXIpIHsKKwkJY29uc3QgcGpfaW50MTZfdCAqb3JkZXJfbWFwOworCisJCS8qIFB1dCBiaXRzIGluIHRoZSBwYWNrZXQsIHNlbnNpdGl2aXR5IGRlc2NlbmRpbmcgb3JkZXJlZCAqLworCQlvcmRlcl9tYXAgPSBvcmRlcl9tYXBzW2luZm8tPmZyYW1lX3R5cGVdOworCQlmb3IoaiA9IDA7IGogPCBmcmFtZWxlbmJpdF90YmxbaW5mby0+ZnJhbWVfdHlwZV07ICsraikgeworCQkgICAgaWYgKGFtcl9iaXRzW29yZGVyX21hcFtqXV0pCisJCQkqdyB8PSAoMSA8PCAoNy13X2JpdHB0cikpOworCisJCSAgICBpZiAoKyt3X2JpdHB0ciA9PSA4KSB7CisJCQl3X2JpdHB0ciA9IDA7CisJCQkrK3c7CisJCQkqdyA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJZm9yKGogPSAwOyBqIDwgZnJhbWVsZW5iaXRfdGJsW2luZm8tPmZyYW1lX3R5cGVdOyArK2opIHsKKwkJICAgIGlmIChhbXJfYml0c1tqXSkKKwkJCSp3IHw9ICgxIDw8ICg3LXdfYml0cHRyKSk7CisKKwkJICAgIGlmICgrK3dfYml0cHRyID09IDgpIHsKKwkJCXdfYml0cHRyID0gMDsKKwkJCSsrdzsKKwkJCSp3ID0gMDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwl9IGVsc2UgaWYgKGluZm8tPmZyYW1lX3R5cGUgPT0gU0lEX0ZUKSB7CisKKwkgICAgLyogU0lEICovCisJICAgIGFtcl9iaXRzWzM1XSB8PSBpbmZvLT5TVEk7CisKKwkgICAgaWYgKHNldHRpbmctPmFtcl9uYikgeworCQlhbXJfYml0c1szNl0gPSAocGpfdWludDhfdCkoKGluZm8tPm1vZGUgPj4gMikgJiAxKTsKKwkJYW1yX2JpdHNbMzddID0gKHBqX3VpbnQ4X3QpKChpbmZvLT5tb2RlID4+IDEpICYgMSk7CisJCWFtcl9iaXRzWzM4XSA9IChwal91aW50OF90KSgoaW5mby0+bW9kZSkgJiAxKTsKKwkgICAgfSBlbHNlIHsKKwkJYW1yX2JpdHNbMzZdID0gKHBqX3VpbnQ4X3QpKChpbmZvLT5tb2RlID4+IDMpICYgMSk7CisJCWFtcl9iaXRzWzM3XSA9IChwal91aW50OF90KSgoaW5mby0+bW9kZSA+PiAyKSAmIDEpOworCQlhbXJfYml0c1szOF0gPSAocGpfdWludDhfdCkoKGluZm8tPm1vZGUgPj4gMSkgJiAxKTsKKwkJYW1yX2JpdHNbMzldID0gKHBqX3VpbnQ4X3QpKChpbmZvLT5tb2RlKSAmIDEpOworCSAgICB9CisKKwkgICAgaWYgKHdfYml0cHRyID09IDApICp3ID0gMDsKKwkgICAgZm9yKGogPSAwOyBqIDwgZnJhbWVsZW5iaXRfdGJsW2luZm8tPmZyYW1lX3R5cGVdOyArK2opIHsKKwkJaWYgKGFtcl9iaXRzW2pdKQorCQkgICAgKncgfD0gKDEgPDwgKDctd19iaXRwdHIpKTsKKworCQlpZiAoKyt3X2JpdHB0ciA9PSA4KSB7CisJCSAgICB3X2JpdHB0ciA9IDA7CisJCSAgICArK3c7CisJCSAgICAqdyA9IDA7CisJCX0KKwkgICAgfQorCX0KKworCWlmIChzZXR0aW5nLT5vY3RldF9hbGlnbmVkKSB7CisJICAgICsrdzsKKwkgICAgd19iaXRwdHIgPSAwOworCX0KKyAgICB9CisKKyAgICAqcGt0X3NpemUgPSB3IC0gKHBqX3VpbnQ4X3QqKXBrdDsKKyAgICBpZiAod19iaXRwdHIpCisJKnBrdF9zaXplICs9IDE7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKioKKyAqIFBhcnNlIEFNUiBwYXlsb2FkIGludG8gZnJhbWVzLgorICoKKyAqIEBwYXJhbSBwa3QJICAgIFBheWxvYWQuCisgKiBAcGFyYW0gcGt0X3NpemUgIFBheWxvYWQgc2l6ZS4KKyAqIEBwYXJhbSB0cwkgICAgQmFzZSB0aW1lc3RhbXAuCisgKiBAcGFyYW0gc2V0dGluZyAgIFNldHRpbmdzLCBzZWUgI3BqbWVkaWFfY29kZWNfYW1yX3BhY2tfc2V0dGluZy4KKyAqIEBwYXJhbSBmcmFtZXMgICAgRnJhbWVzIHBhcnNlZC4KKyAqIEBwYXJhbSBuZnJhbWVzICAgTnVtYmVyIG9mIGZyYW1lcyBwYXJzZWQuCisgKiBAcGFyYW0gY21yCSAgICBDaGFuZ2UgTW9kZSBSZXF1ZXN0IG1lc3NhZ2UgZm9yIGxvY2FsIGVuY29kZXIuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfYW1yX3BhcnNlKAorCQkJICAgICB2b2lkICpwa3QsIAorCQkJICAgICBwal9zaXplX3QgcGt0X3NpemUsIAorCQkJICAgICBjb25zdCBwal90aW1lc3RhbXAgKnRzLAorCQkJICAgICBjb25zdCBwam1lZGlhX2NvZGVjX2Ftcl9wYWNrX3NldHRpbmcqIHNldHRpbmcsCisJCQkgICAgIHBqbWVkaWFfZnJhbWUgZnJhbWVzW10sIAorCQkJICAgICB1bnNpZ25lZCAqbmZyYW1lcywKKwkJCSAgICAgcGpfdWludDhfdCAqY21yKQoreworICAgIHVuc2lnbmVkIGNudCA9IDA7CisgICAgcGpfdGltZXN0YW1wIHRzXyA9ICp0czsKKworICAgIC8qIFJlYWQgY3Vyc29yICovCisgICAgcGpfdWludDhfdCByX2JpdHB0ciA9IDA7CisgICAgcGpfdWludDhfdCAqciA9IChwal91aW50OF90Kilwa3Q7CisKKyAgICAvKiBlbnYgdmFycyBmb3IgQU1SIG9yIEFNUldCICovCisgICAgcGpfdWludDhfdAkJICAgICBTSURfRlQ7CisgICAgY29uc3QgcGpfdWludDhfdAkgICAgKmZyYW1lbGVuX3RibDsKKyAgICBjb25zdCBwal91aW50MTZfdAkgICAgKmZyYW1lbGVuYml0X3RibDsKKyAgICBjb25zdCBwal9pbnQxNl90KiBjb25zdCAqb3JkZXJfbWFwczsKKworICAgIC8qIGZyYW1lIGluZm8gKi8KKyAgICBwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbyAqaW5mbzsKKworICAgIGlmIChzZXR0aW5nLT5hbXJfbmIpIHsKKwlTSURfRlQJCT0gODsKKwlmcmFtZWxlbl90YmwJPSBwam1lZGlhX2NvZGVjX2Ftcm5iX2ZyYW1lbGVuOworCWZyYW1lbGVuYml0X3RibCA9IHBqbWVkaWFfY29kZWNfYW1ybmJfZnJhbWVsZW5iaXRzOworCW9yZGVyX21hcHMJPSBwam1lZGlhX2NvZGVjX2Ftcm5iX29yZGVybWFwczsKKyAgICB9IGVsc2UgeworCVNJRF9GVAkJPSA5OworCWZyYW1lbGVuX3RibAk9IHBqbWVkaWFfY29kZWNfYW1yd2JfZnJhbWVsZW47CisJZnJhbWVsZW5iaXRfdGJsID0gcGptZWRpYV9jb2RlY19hbXJ3Yl9mcmFtZWxlbmJpdHM7CisJb3JkZXJfbWFwcwk9IHBqbWVkaWFfY29kZWNfYW1yd2Jfb3JkZXJtYXBzOworICAgIH0KKworICAgIFBKX1VOVVNFRF9BUkcocGt0X3NpemUpOworCisgICAgLyogQ29kZSBNb2RlIFJlcXVlc3QsIDQgYml0cyAqLworICAgICpjbXIgPSAocGpfdWludDhfdCkoKCpyID4+IDQpICYgMHgwRik7CisgICAgcl9iaXRwdHIgPSA0OworICAgIGlmIChzZXR0aW5nLT5vY3RldF9hbGlnbmVkKSB7CisJKytyOworCXJfYml0cHRyID0gMDsKKyAgICB9CisKKyAgICAvKiBUYWJsZSBPZiBDb250ZW50cywgNiBiaXRzIGVhY2ggKi8KKyAgICBmb3IgKDs7KSB7CisJcGpfdWludDhfdCBUT0MgPSAwOworCXBqX3VpbnQ4X3QgRiwgRlQsIFE7CisKKwlpZiAocl9iaXRwdHIgPT0gMCkgeworCSAgICBUT0MgPSAocGpfdWludDhfdCkoKnIgPj4gMik7CisJICAgIHJfYml0cHRyID0gNjsKKwl9IGVsc2UgaWYgKHJfYml0cHRyID09IDIpIHsKKwkgICAgVE9DID0gKHBqX3VpbnQ4X3QpKCpyKysgJiAweDNGKTsKKwkgICAgcl9iaXRwdHIgPSAwOworCX0gZWxzZSBpZiAocl9iaXRwdHIgPT0gNCkgeworCSAgICBUT0MgPSAocGpfdWludDhfdCkoKCpyKysgJiAweDBmKSA8PCAyKTsKKwkgICAgVE9DIHw9ICpyID4+IDY7CisJICAgIHJfYml0cHRyID0gMjsKKwl9IGVsc2UgaWYgKHJfYml0cHRyID09IDYpIHsKKwkgICAgVE9DID0gKHBqX3VpbnQ4X3QpKCgqcisrICYgMHgwMykgPDwgNCk7CisJICAgIFRPQyB8PSAqciA+PiA0OworCSAgICByX2JpdHB0ciA9IDQ7CisJfQorCisJRiA9IChwal91aW50OF90KShUT0MgPj4gNSk7CisJRlQgPSAocGpfdWludDhfdCkoKFRPQyA+PiAxKSAmIDB4MEYpOworCVEgPSAocGpfdWludDhfdCkoVE9DICYgMSk7CisKKwlpZiAoRlQgPiBTSURfRlQgJiYgRlQgPCAxNCkgeworCSAgICBwal9hc3NlcnQoISJJbnZhbGlkIEFNUiBmcmFtZXR5cGUsIHN0cmVhbSBtYXkgYmUgY29ycnVwdGVkISIpOworCSAgICBicmVhazsKKwl9CisKKwlpZiAoc2V0dGluZy0+b2N0ZXRfYWxpZ25lZCkgeworCSAgICArK3I7CisJICAgIHJfYml0cHRyID0gMDsKKwl9CisKKwkvKiBTZXQgZnJhbWUgYXR0cmlidXRlcyAqLworCWluZm8gPSAocGptZWRpYV9jb2RlY19hbXJfYml0X2luZm8qKSAmZnJhbWVzW2NudF0uYml0X2luZm87CisJaW5mby0+ZnJhbWVfdHlwZSA9IEZUOworCWluZm8tPm1vZGUgPSAocGpfaW50OF90KSgoRlQgPCBTSURfRlQpPyBGVCA6IC0xKTsKKwlpbmZvLT5nb29kX3F1YWxpdHkgPSAocGpfdWludDhfdCkoUSA9PSAxKTsKKwlpbmZvLT5zdGFydF9iaXQgPSAwOworCWluZm8tPlNUSSA9IDA7CisJZnJhbWVzW2NudF0udGltZXN0YW1wID0gdHNfOworCWZyYW1lc1tjbnRdLnR5cGUgPSBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU87CisKKwkvKiBBTVIgZnJhbWUgbGVuZ3RoIGlzIDIwbXMgKi8KKwl0c18udTY0ICs9IHNldHRpbmctPmFtcl9uYj8gMTYwIDogMzIwOworCQorCWlmICgrK2NudCA9PSAqbmZyYW1lcyB8fCAhRikKKwkgICAgYnJlYWs7CisgICAgfQorICAgICpuZnJhbWVzID0gY250OworCisgICAgY250ID0gMDsKKworICAgIC8qIFNwZWVjaCBmcmFtZXMgKi8KKyAgICB3aGlsZSAoY250IDwgKm5mcmFtZXMpIHsKKwlwal91aW50OF90IEZUOworCisJaW5mbyA9IChwam1lZGlhX2NvZGVjX2Ftcl9iaXRfaW5mbyopICZmcmFtZXNbY250XS5iaXRfaW5mbzsKKwlGVCA9IGluZm8tPmZyYW1lX3R5cGU7CisKKwlmcmFtZXNbY250XS5idWYgPSByOworCWluZm8tPnN0YXJ0X2JpdCA9IHJfYml0cHRyOworCisJaWYgKEZUID09IFNJRF9GVCkgeworCSAgICB1bnNpZ25lZCBzdGlfYml0cHRyOworCSAgICBzdGlfYml0cHRyID0gcl9iaXRwdHIgKyAzNTsKKwkgICAgaW5mby0+U1RJID0gKHBqX3VpbnQ4X3QpCisJCQkocltzdGlfYml0cHRyID4+IDNdID4+ICg3IC0gKHN0aV9iaXRwdHIgJSA4KSkpICYgMTsKKwl9CisKKwlpZiAoc2V0dGluZy0+b2N0ZXRfYWxpZ25lZCkgeworCSAgICByICs9IGZyYW1lbGVuX3RibFtGVF07CisJICAgIGZyYW1lc1tjbnRdLnNpemUgPSBmcmFtZWxlbl90YmxbRlRdOworCX0gZWxzZSB7CisJICAgIGlmIChGVCA9PSAxNCB8fCBGVCA9PSAxNSkgeworCQkvKiBOTyBEQVRBICovCisJCWZyYW1lc1tjbnRdLnNpemUgPSAwOworCSAgICB9IGVsc2UgeworCQl1bnNpZ25lZCBhZHZfYml0OworCisJCWFkdl9iaXQgPSBmcmFtZWxlbmJpdF90YmxbRlRdICsgcl9iaXRwdHI7CisJCXIgKz0gYWR2X2JpdCA+PiAzOworCQlyX2JpdHB0ciA9IChwal91aW50OF90KShhZHZfYml0ICUgOCk7CisKKwkJZnJhbWVzW2NudF0uc2l6ZSA9IGFkdl9iaXQgPj4gMzsKKwkJaWYgKHJfYml0cHRyKQorCQkgICAgKytmcmFtZXNbY250XS5zaXplOworCSAgICB9CisJfQorCSsrY250OworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogX19QSk1FRElBX0NPREVDU19BTVJfSEVMUEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvYW1yX3NkcF9tYXRjaC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvYW1yX3NkcF9tYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzc5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hbXJfc2RwX21hdGNoLmgKQEAgLTAsMCArMSw2MSBAQAorLyogJElkOiBhbXJfc2RwX21hdGNoLmggMzkxMSAyMDExLTEyLTE1IDA2OjQ1OjIzWiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX0FNUl9TRFBfTUFUQ0hfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9DT0RFQ19BTVJfU0RQX01BVENIX0hfXworCisKKy8qKgorICogQGZpbGUgZzcyMjFfc2RwX21hdGNoLmgKKyAqIEBicmllZiBTcGVjaWFsIFNEUCBmb3JtYXQgbWF0Y2ggZm9yIEFNUi1OQiBhbmQgQU1SLVdCLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3NkcF9uZWcuaD4KKworUEpfQkVHSU5fREVDTAorCisKKy8qIE1hdGNoIEFNUi1OQiBhbmQgQU1SLVdCIGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIG9mZmVyIGFuZCBhbnN3ZXIuIFRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgbWF0Y2ggc29tZSBBTVIgc2V0dGluZ3MgaW4gdGhlIFNEUCBmb3JtYXQgcGFyYW1ldGVycywgaS5lOgorICogb2N0ZXQtYWxpZ24sIGNyYywgcm9idXN0LXNvcnRpbmcsIGludGVybGVhdmluZy4gTm90ZSB0aGF0LCBmb3IgYW5zd2VyZXIsCisgKiBpZiBvY3RldC1hbGlnbiBtb2RlIG5lZWRzIHRvIGJlIGFkYXB0YWJsZSB0byBvZmZlcmVyIHNldHRpbmcsIGFwcGxpY2F0aW9uCisgKiBzaG91bGQgc2V0ICNQSk1FRElBX1NEUF9ORUdfRk1UX01BVENIX0FMTE9XX01PRElGWV9BTlNXRVIgaW4gdGhlIG9wdGlvbi4KKyAqCisgKiBAcGFyYW0gcG9vbAkJVGhlIG1lbW9yeSBwb29sLgorICogQHBhcmFtIG9mZmVyCQlUaGUgU0RQIG1lZGlhIG9mZmVyLgorICogQHBhcmFtIG9fZm10X2lkeAlJbmRleCBvZiB0aGUgQU1SIGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIG9mZmVyLgorICogQHBhcmFtIGFuc3dlcglUaGUgU0RQIG1lZGlhIGFuc3dlci4KKyAqIEBwYXJhbSBhX2ZtdF9pZHgJSW5kZXggb2YgdGhlIEFNUiBmb3JtYXQgaW4gdGhlIFNEUCBtZWRpYSBhbnN3ZXIuCisgKiBAcGFyYW0gb3B0aW9uCVRoZSBmb3JtYXQgbWF0Y2hpbmcgb3B0aW9uLCBzZWUKKyAqCQkJI3BqbWVkaWFfc2RwX25lZ19mbXRfbWF0Y2hfZmxhZy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIHdoZW4gdGhlIGZvcm1hdHMgaW4gb2ZmZXIgYW5kIGFuc3dlciBtYXRjaC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19hbXJfbWF0Y2hfc2RwKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgIHBqbWVkaWFfc2RwX21lZGlhICpvZmZlciwKKwkJCQkJCSAgdW5zaWduZWQgb19mbXRfaWR4LAorCQkJCQkJICBwam1lZGlhX3NkcF9tZWRpYSAqYW5zd2VyLAorCQkJCQkJICB1bnNpZ25lZCBhX2ZtdF9pZHgsCisJCQkJCQkgIHVuc2lnbmVkIG9wdGlvbik7CisKKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX0FNUl9TRFBfTUFUQ0hfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hdWRpb19jb2RlY3MuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2F1ZGlvX2NvZGVjcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDVjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9hdWRpb19jb2RlY3MuaApAQCAtMCwwICsxLDk4IEBACisvKiAkSWQ6IGF1ZGlvX2NvZGVjcy5oIDM2NjYgMjAxMS0wNy0xOSAwODo0MDoyMFogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNfQUxMX0NPREVDU19IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDX0FMTF9DT0RFQ1NfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS1jb2RlYy9hbGxfY29kZWNzLmgKKyAqIEBicmllZiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYWxsIGNvZGVjcworICovCisjaW5jbHVkZSA8cGptZWRpYS9lbmRwb2ludC5oPgorI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvcGFzc3Rocm91Z2guaD4KKworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfQ09ERUNfUkVHSVNURVJfQUxMIENvZGVjIHJlZ2lzdHJhdGlvbiBoZWxwZXIKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTCisgKiBAYnJpZWYgSGVscGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGFsbCBjb2RlY3MKKyAqIEB7CisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGFsbCBjb2RlY3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4KKyAqIFBKTUVESUEtQ09ERUMgbGlicmFyeS4KKyAqLworCisvKioKKyAqIENvZGVjIGNvbmZpZ3VyYXRpb24uIENhbGwgI3BqbWVkaWFfYXVkaW9fY29kZWNfY29uZmlnX2RlZmF1bHQoKSB0byBpbml0aWFsaXplCisgKiB0aGlzIHN0cnVjdHVyZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9hdWRpb19jb2RlY19jb25maWcKK3sKKyAgICAvKiogU3BlZXggY29kZWMgc2V0dGluZ3MuIFNlZSAjcGptZWRpYV9jb2RlY19zcGVleF9pbml0KCkgZm9yIG1vcmUgaW5mbyAqLworICAgIHN0cnVjdCB7CisJdW5zaWduZWQJb3B0aW9uOwkJLyoqPCBCaXRtYXNrIG9mIG9wdGlvbnMuCSovCisJaW50CQlxdWFsaXR5OwkvKio8IENvZGVjIHF1YWxpdHkuCQkqLworCWludAkJY29tcGxleGl0eTsJLyoqPCBDb2RlYyBjb21wbGV4aXR5LgkJKi8KKyAgICB9IHNwZWV4OworCisgICAgLyoqIGlMQkMgc2V0dGluZ3MgKi8KKyAgICBzdHJ1Y3QgeworCXVuc2lnbmVkCW1vZGU7CQkvKio8IGlMQkMgbW9kZS4JCQkqLworICAgIH0gaWxiYzsKKworICAgIC8qKiBQYXNzdGhyb3VnaCAqLworICAgIHN0cnVjdCB7CisJcGptZWRpYV9jb2RlY19wYXNzdGhyb3VnaF9zZXR0aW5nIHNldHRpbmc7IC8qKjwgUGFzc3Rocm91Z2gJKi8KKyAgICB9IHBhc3N0aHJvdWdoOworCit9IHBqbWVkaWFfYXVkaW9fY29kZWNfY29uZmlnOworCisKKy8qKgorICogSW5pdGlhbGl6ZSBwam1lZGlhX2F1ZGlvX2NvZGVjX2NvbmZpZyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gY2ZnCQlUaGUgY29kZWMgY29uZmlnIHRvIGJlIGluaXRpYWxpemVkLgorICovCitQSl9ERUNMKHZvaWQpCitwam1lZGlhX2F1ZGlvX2NvZGVjX2NvbmZpZ19kZWZhdWx0KHBqbWVkaWFfYXVkaW9fY29kZWNfY29uZmlnICpjZmcpOworCisvKioKKyAqIFJlZ2lzdGVyIGFsbCBrbm93biBhdWRpbyBjb2RlY3MgaW1wbGVtZW50ZWQgaW4gUEpNRURBLUNPREVDIGxpYnJhcnkgdG8gdGhlCisgKiBzcGVjaWZpZWQgbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gYwkJT3B0aW9uYWwgY29kZWMgY29uZmlndXJhdGlvbiwgb3IgTlVMTCB0byB1c2UgZGVmYXVsdAorICogCQkJdmFsdWVzLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfY29kZWNfcmVnaXN0ZXJfYXVkaW9fY29kZWNzKHBqbWVkaWFfZW5kcHQgKmVuZHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9hdWRpb19jb2RlY19jb25maWcgKmMpOworCisKKy8qKgorICogQH0gIFBKTUVESUFfQ09ERUNfUkVHSVNURVJfQUxMCisgKi8KKworCitQSl9FTkRfREVDTAorCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX0FMTF9DT0RFQ1NfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9jb25maWcuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzUwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9jb25maWcuaApAQCAtMCwwICsxLDQ2NSBAQAorLyogJElkOiBjb25maWcuaCA0MzMxIDIwMTMtMDEtMjMgMDY6MTg6MThaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX0NPTkZJR19IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDX0NPTkZJR19IX18KKworLyoqCisgKiBAZmlsZSBjb25maWcuaAorICogQGJyaWVmIFBKTUVESUEtQ09ERUMgY29tcGlsZSB0aW1lIHNldHRpbmdzCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcGptZWRpYV9jb2RlY19jb25maWcgUEpNRURJQS1DT0RFQyBDb21waWxlIFRpbWUgU2V0dGluZ3MKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUMKKyAqIEBicmllZiBWYXJpb3VzIGNvbXBpbGUgdGltZSBzZXR0aW5ncyBzdWNoIGFzIHRvIGVuYWJsZS9kaXNhYmxlIGNvZGVjcworICogQHsKKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS90eXBlcy5oPgorCisvKgorICogSW5jbHVkZSBjb25maWdfYXV0by5oIGlmIGF1dG9jb25mIGlzIHVzZWQgKFBKX0FVVE9DT05GIGlzIHNldCkKKyAqLworI2lmIGRlZmluZWQoUEpfQVVUT0NPTkYpCisjICAgaW5jbHVkZSA8cGptZWRpYS1jb2RlYy9jb25maWdfYXV0by5oPgorI2VuZGlmCisKKworLyoqCisgKiBVbmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZSwgTDE2IGNvZGVjIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfTDE2X0NPREVDCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0wxNl9DT0RFQyAgICAxCisjZW5kaWYKKworCisvKioKKyAqIFVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLCBHU00gY29kZWMgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19HU01fQ09ERUMKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfR1NNX0NPREVDICAgIDEKKyNlbmRpZgorCisKKy8qKgorICogVW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UsIFNwZWV4IGNvZGVjIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfU1BFRVhfQ09ERUMKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfU1BFRVhfQ09ERUMgICAgMQorI2VuZGlmCisKKy8qKgorICogU3BlZXggY29kZWMgZGVmYXVsdCBjb21wbGV4aXR5IHNldHRpbmcuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9DT0RFQ19TUEVFWF9ERUZBVUxUX0NPTVBMRVhJVFkKKyMgICBkZWZpbmUgUEpNRURJQV9DT0RFQ19TUEVFWF9ERUZBVUxUX0NPTVBMRVhJVFkgICAyCisjZW5kaWYKKworLyoqCisgKiBTcGVleCBjb2RlYyBkZWZhdWx0IHF1YWxpdHkgc2V0dGluZy4gUGxlYXNlIG5vdGUgdGhhdCBwanN1YS1saWIgbWF5IG92ZXJyaWRlCisgKiB0aGlzIHNldHRpbmcgdmlhIGl0cyBjb2RlYyBxdWFsaXR5IHNldHRpbmcgKGkuZSBQSlNVQV9ERUZBVUxUX0NPREVDX1FVQUxJVFkpLgorICovCisjaWZuZGVmIFBKTUVESUFfQ09ERUNfU1BFRVhfREVGQVVMVF9RVUFMSVRZCisjICAgZGVmaW5lIFBKTUVESUFfQ09ERUNfU1BFRVhfREVGQVVMVF9RVUFMSVRZCSAgICA4CisjZW5kaWYKKworCisvKioKKyAqIFVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLCBpTEJDIGNvZGVjIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfSUxCQ19DT0RFQworIyAgIGRlZmluZSBQSk1FRElBX0hBU19JTEJDX0NPREVDICAgIDEKKyNlbmRpZgorCisKKy8qKgorICogVW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UsIEcuNzIyIGNvZGVjIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfRzcyMl9DT0RFQworIyAgIGRlZmluZSBQSk1FRElBX0hBU19HNzIyX0NPREVDICAgIDEKKyNlbmRpZgorCisKKy8qKgorICogRGVmYXVsdCBHLjcyMiBjb2RlYyBlbmNvZGVyIGFuZCBkZWNvZGVyIGxldmVsIGFkanVzdG1lbnQuIFRoZSBHLjcyMgorICogc3BlY2lmaWVzIHRoYXQgaXQgdXNlcyAxNCBiaXQgUENNIGZvciBpbnB1dCBhbmQgb3V0cHV0LCB3aGlsZSBQSk1FRElBCisgKiBub3JtYWxseSB1c2VzIDE2IGJpdCBQQ00sIHNvIHRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYnkgYXBwbHlpbmcKKyAqIGxldmVsIGFkanVzdG1lbnQuIElmIHRoZSB2YWx1ZSBpcyBub24temVybywgdGhlbiBQQ00gaW5wdXQgc2FtcGxlcyB0bworICogdGhlIGVuY29kZXIgd2lsbCBiZSBzaGlmdGVkIHJpZ2h0IGJ5IHRoaXMgdmFsdWUsIGFuZCBzaW1pbGFybHkgUENNCisgKiBvdXRwdXQgc2FtcGxlcyBmcm9tIHRoZSBkZWNvZGVyIHdpbGwgYmUgc2hpZnRlZCBsZWZ0IGJ5IHRoaXMgdmFsdWUuCisgKgorICogVGhpcyBjYW4gYmUgY2hhbmdlZCBhdCBydW4tdGltZSBhZnRlciBpbml0aWFsaXphdGlvbiBieSBjYWxsaW5nCisgKiAjcGptZWRpYV9jb2RlY19nNzIyX3NldF9wY21fc2hpZnQoKS4KKyAqCisgKiBEZWZhdWx0OiAyLgorICovCisjaWZuZGVmIFBKTUVESUFfRzcyMl9ERUZBVUxUX1BDTV9TSElGVAorIyAgIGRlZmluZSBQSk1FRElBX0c3MjJfREVGQVVMVF9QQ01fU0hJRlQJICAgIDIKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmaWVzIHdoZXRoZXIgRy43MjIgUENNIHNoaWZ0aW5nIHNob3VsZCBiZSBzdG9wcGVkIHdoZW4gY2xpcHBpbmcKKyAqIGRldGVjdGVkIGluIHRoZSBkZWNvZGVyLiBFbmFibGluZyB0aGlzIGZlYXR1cmUgY2FuIGJlIHVzZWZ1bCB3aGVuCisgKiB0YWxraW5nIHRvIEcuNzIyIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyAxNiBiaXQgUENNIGZvciBHLjcyMiBpbnB1dC8KKyAqIG91dHB1dCAoZm9yIGFueSByZWFzb24gaXQgc2VlbXMgdG8gd29yaykgYW5kIHRoZSBQQ00gc2hpZnRpbmcgY2F1c2VzCisgKiBhdWRpbyBjbGlwcGluZy4KKyAqCisgKiBTZWUgYWxzbyAjUEpNRURJQV9HNzIyX0RFRkFVTFRfUENNX1NISUZULgorICoKKyAqIERlZmF1bHQ6IGVuYWJsZWQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9HNzIyX1NUT1BfUENNX1NISUZUX09OX0NMSVBQSU5HCisjICAgZGVmaW5lIFBKTUVESUFfRzcyMl9TVE9QX1BDTV9TSElGVF9PTl9DTElQUElORyAgMQorI2VuZGlmCisKKworLyoqCisgKiBFbmFibGUgdGhlIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IEludGVsIElQUCBsaWJyYXJpZXMsIGZvciBleGFtcGxlCisgKiBjb2RlY3Mgc3VjaCBhcyBHLjcyOSwgRy43MjMuMSwgRy43MjYsIEcuNzI4LCBHLjcyMi4xLCBhbmQgQU1SLgorICoKKyAqIEJ5IGRlZmF1bHQgdGhpcyBpcyBkaXNhYmxlZC4gUGxlYXNlIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluCisgKiBodHRwOi8vdHJhYy5wanNpcC5vcmcvcmVwb3Mvd2lraS9JbnRlbF9JUFBfQ29kZWNzIG9uIGhvdyB0byBzZXR1cAorICogSW50ZWwgSVBQIHdpdGggUEpNRURJQS4KKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTlRFTF9JUFAKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfSU5URUxfSVBQCQkwCisjZW5kaWYKKworCisvKioKKyAqIFZpc3VhbCBTdHVkaW8gb25seTogd2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSBJbnRlbCBJUFAgbGlicmFyaWVzCisgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbGlua2VkIHRvIGFwcGxpY2F0aW9uIHVzaW5nIHByYWdtYShjb21tZW50KQorICogY29uc3RydWN0cy4gVGhpcyBpcyBjb252ZW5pZW50LCBob3dldmVyIGl0IHdpbGwgb25seSBsaW5rIHdpdGgKKyAqIHRoZSBzdHViIGxpYnJhcmllcyBhbmQgdGhlIEludGVsIElQUCBETEwncyB3aWxsIGJlIHJlcXVpcmVkIHdoZW4KKyAqIGRpc3RyaWJ1dGluZyB0aGUgYXBwbGljYXRpb24uCisgKgorICogSWYgYXBwbGljYXRpb24gd2FudHMgdG8gbGluayB3aXRoIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgdGhlIEludGVsIElQUAorICogbGlicmFyaWVzIChmb3IgZXhhbXBsZSwgdGhlIHN0YXRpYyBsaWJyYXJpZXMpLCBpdCBtdXN0IHNldCB0aGlzIG9wdGlvbgorICogdG8gemVybyBhbmQgc3BlY2lmeSB0aGUgSW50ZWwgSVBQIGxpYnJhcmllcyBpbiB0aGUgYXBwbGljYXRpb24ncyBpbnB1dAorICogbGlicmFyeSBzcGVjaWZpY2F0aW9uIG1hbnVhbGx5LgorICoKKyAqIERlZmF1bHQgMS4KKyAqLworI2lmbmRlZiBQSk1FRElBX0FVVE9fTElOS19JUFBfTElCUworIyAgIGRlZmluZSBQSk1FRElBX0FVVE9fTElOS19JUFBfTElCUwkJMQorI2VuZGlmCisKKworLyoqCisgKiBFbmFibGUgSW50ZWwgSVBQIEFNUiBjb2RlYy4gVGhpcyBhbHNvIG5lZWRzIHRvIGJlIGVuYWJsZWQgd2hlbiBBTVIgV0IKKyAqIGNvZGVjIGlzIGVuYWJsZWQuIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIFBKTUVESUFfSEFTX0lOVEVMX0lQUCAKKyAqIGlzIGVuYWJsZWQuCisgKgorICogRGVmYXVsdDogMQorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19BTVIKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfSU5URUxfSVBQX0NPREVDX0FNUgkxCisjZW5kaWYKKworCisvKioKKyAqIEVuYWJsZSBJbnRlbCBJUFAgQU1SIHdpZGViYW5kIGNvZGVjLiBUaGUgUEpNRURJQV9IQVNfSU5URUxfSVBQX0NPREVDX0FNUgorICogb3B0aW9uIG11c3QgYWxzbyBiZSBlbmFibGVkIHRvIHVzZSB0aGlzIGNvZGVjLiBUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgCisgKiB3aGVuIFBKTUVESUFfSEFTX0lOVEVMX0lQUCBpcyBlbmFibGVkLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfQU1SV0IKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfSU5URUxfSVBQX0NPREVDX0FNUldCCTEKKyNlbmRpZgorCisKKy8qKgorICogRW5hYmxlIEludGVsIElQUCBHLjcyOSBjb2RlYy4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIHdoZW4KKyAqIFBKTUVESUFfSEFTX0lOVEVMX0lQUCBpcyBlbmFibGVkLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfRzcyOQorIyAgIGRlZmluZSBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfRzcyOQkxCisjZW5kaWYKKworCisvKioKKyAqIEVuYWJsZSBJbnRlbCBJUFAgRy43MjMuMSBjb2RlYy4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIHdoZW4KKyAqIFBKTUVESUFfSEFTX0lOVEVMX0lQUCBpcyBlbmFibGVkLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfRzcyM18xCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzIzXzEJMQorI2VuZGlmCisKKworLyoqCisgKiBFbmFibGUgSW50ZWwgSVBQIEcuNzI2IGNvZGVjLiBUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgd2hlbgorICogUEpNRURJQV9IQVNfSU5URUxfSVBQIGlzIGVuYWJsZWQuCisgKgorICogRGVmYXVsdDogMQorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzI2CisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzI2CTEKKyNlbmRpZgorCisKKy8qKgorICogRW5hYmxlIEludGVsIElQUCBHLjcyOCBjb2RlYy4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIHdoZW4KKyAqIFBKTUVESUFfSEFTX0lOVEVMX0lQUCBpcyBlbmFibGVkLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfRzcyOAorIyAgIGRlZmluZSBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfRzcyOAkxCisjZW5kaWYKKworCisvKioKKyAqIEVuYWJsZSBJbnRlbCBJUFAgRy43MjIuMSBjb2RlYy4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIHdoZW4KKyAqIFBKTUVESUFfSEFTX0lOVEVMX0lQUCBpcyBlbmFibGVkLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTlRFTF9JUFBfQ09ERUNfRzcyMl8xCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzIyXzEJMQorI2VuZGlmCisKKy8qKgorICogRW5hYmxlIFBhc3N0aHJvdWdoIGNvZGVjcy4KKyAqCisgKiBEZWZhdWx0OiAwCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfUEFTU1RIUk9VR0hfQ09ERUNTCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX1BBU1NUSFJPVUdIX0NPREVDUwkwCisjZW5kaWYKKworLyoqCisgKiBFbmFibGUgQU1SIHBhc3N0aHJvdWdoIGNvZGVjLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19QQVNTVEhST1VHSF9DT0RFQ19BTVIKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfUEFTU1RIUk9VR0hfQ09ERUNfQU1SCTEKKyNlbmRpZgorCisvKioKKyAqIEVuYWJsZSBHLjcyOSBwYXNzdGhyb3VnaCBjb2RlYy4KKyAqCisgKiBEZWZhdWx0OiAxCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfUEFTU1RIUk9VR0hfQ09ERUNfRzcyOQorIyAgIGRlZmluZSBQSk1FRElBX0hBU19QQVNTVEhST1VHSF9DT0RFQ19HNzI5CTEKKyNlbmRpZgorCisvKioKKyAqIEVuYWJsZSBpTEJDIHBhc3N0aHJvdWdoIGNvZGVjLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19QQVNTVEhST1VHSF9DT0RFQ19JTEJDCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX1BBU1NUSFJPVUdIX0NPREVDX0lMQkMJMQorI2VuZGlmCisKKy8qKgorICogRW5hYmxlIFBDTVUgcGFzc3Rocm91Z2ggY29kZWMuCisgKgorICogRGVmYXVsdDogMQorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX1BBU1NUSFJPVUdIX0NPREVDX1BDTVUKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfUEFTU1RIUk9VR0hfQ09ERUNfUENNVQkxCisjZW5kaWYKKworLyoqCisgKiBFbmFibGUgUENNQSBwYXNzdGhyb3VnaCBjb2RlYy4KKyAqCisgKiBEZWZhdWx0OiAxCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfUEFTU1RIUk9VR0hfQ09ERUNfUENNQQorIyAgIGRlZmluZSBQSk1FRElBX0hBU19QQVNTVEhST1VHSF9DT0RFQ19QQ01BCTEKKyNlbmRpZgorCisvKiBJZiBwYXNzdGhyb3VnaCBhbmQgUENNVS9QQ01BIGFyZSBlbmFibGVkLCBkaXNhYmxlIHRoZSBzb2Z0d2FyZQorICogRy43MTEgY29kZWMKKyAqLworI2lmIFBKTUVESUFfSEFTX1BBU1NUSFJPVUdIX0NPREVDUyAmJiBcCisgICAgKFBKTUVESUFfSEFTX1BBU1NUSFJPVUdIX0NPREVDX1BDTVUgfHwgUEpNRURJQV9IQVNfUEFTU1RIUk9VR0hfQ09ERUNfUENNQSkKKyMgICB1bmRlZiBQSk1FRElBX0hBU19HNzExX0NPREVDCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0c3MTFfQ09ERUMJCTAKKyNlbmRpZgorCisKKy8qKgorICogRy43MjIuMSBjb2RlYyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0c3MjIxX0NPREVDCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0c3MjIxX0NPREVDCQkwCisjZW5kaWYKKworLyoqCisgKiBFbmFibGUgT3BlbkNPUkUgQU1SLU5CIGNvZGVjLgorICogU2VlIGh0dHBzOi8vdHJhYy5wanNpcC5vcmcvcmVwb3MvdGlja2V0LzEzODggZm9yIHNvbWUgaW5mby4KKyAqCisgKiBEZWZhdWx0OiAwCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1STkJfQ09ERUMKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1STkJfQ09ERUMJMAorI2VuZGlmCisKKy8qKgorICogRW5hYmxlIE9wZW5DT1JFIEFNUi1XQiBjb2RlYy4KKyAqIFNlZSBodHRwczovL3RyYWMucGpzaXAub3JnL3JlcG9zL3RpY2tldC8xNjA4IGZvciBzb21lIGluZm8uCisgKgorICogRGVmYXVsdDogMAorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX09QRU5DT1JFX0FNUldCX0NPREVDCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX09QRU5DT1JFX0FNUldCX0NPREVDCTAKKyNlbmRpZgorCisvKioKKyAqIExpbmsgd2l0aCBsaWJvcGVuY29yZS1hbXJYWCB2aWEgcHJhZ21hIGNvbW1lbnQgb24gVmlzdWFsIFN0dWRpby4KKyAqIFRoaXMgb3B0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgaWYgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1STkIvV0JfQ09ERUMKKyAqIGlzIGVuYWJsZWQuCisgKgorICogRGVmYXVsdDogMQorICovCisjaWZuZGVmIFBKTUVESUFfQVVUT19MSU5LX09QRU5DT1JFX0FNUl9MSUJTCisjICBkZWZpbmUgUEpNRURJQV9BVVRPX0xJTktfT1BFTkNPUkVfQU1SX0xJQlMJMQorI2VuZGlmCisKKy8qKgorICogTGluayB3aXRoIGxpYm9wZW5jb3JlLWFtclhYLmEgdGhhdCBoYXMgYmVlbiBwcm9kdWNlZCB3aXRoIGdjYy4KKyAqIFRoaXMgb3B0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgaWYgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1STkIvV0JfQ09ERUMKKyAqIGFuZCBQSk1FRElBX0FVVE9fTElOS19PUEVOQ09SRV9BTVJfTElCUyBhcmUgZW5hYmxlZC4KKyAqCisgKiBEZWZhdWx0OiAxCisgKi8KKyNpZm5kZWYgUEpNRURJQV9PUEVOQ09SRV9BTVJfQlVJTFRfV0lUSF9HQ0MKKyMgICBkZWZpbmUgUEpNRURJQV9PUEVOQ09SRV9BTVJfQlVJTFRfV0lUSF9HQ0MJMQorI2VuZGlmCisKKworLyoqCisgKiBEZWZhdWx0IEcuNzIyLjEgY29kZWMgZW5jb2RlciBhbmQgZGVjb2RlciBsZXZlbCBhZGp1c3RtZW50LiAKKyAqIElmIHRoZSB2YWx1ZSBpcyBub24temVybywgdGhlbiBQQ00gaW5wdXQgc2FtcGxlcyB0byB0aGUgZW5jb2RlciB3aWxsIAorICogYmUgc2hpZnRlZCByaWdodCBieSB0aGlzIHZhbHVlLCBhbmQgc2ltaWxhcmx5IFBDTSBvdXRwdXQgc2FtcGxlcyBmcm9tCisgKiB0aGUgZGVjb2RlciB3aWxsIGJlIHNoaWZ0ZWQgbGVmdCBieSB0aGlzIHZhbHVlLgorICoKKyAqIFRoaXMgY2FuIGJlIGNoYW5nZWQgYXQgcnVuLXRpbWUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gYnkgY2FsbGluZworICogI3BqbWVkaWFfY29kZWNfZzcyMjFfc2V0X3BjbV9zaGlmdCgpLgorICovCisjaWZuZGVmIFBKTUVESUFfRzcyMjFfREVGQVVMVF9QQ01fU0hJRlQKKyMgICBkZWZpbmUgUEpNRURJQV9HNzIyMV9ERUZBVUxUX1BDTV9TSElGVAkxCisjZW5kaWYKKworCisvKioKKyAqIEVuYWJsaW5nIGJvdGggRy43MjIuMSBjb2RlYyBpbXBsZW1lbnRhdGlvbnMsIGludGVybmFsIFBKTUVESUEgYW5kIElQUCwKKyAqIG1heSBjYXVzZSBwcm9ibGVtIGluIFNEUCwgaS5lOiBwYXlsb2FkIHR5cGVzIGR1cGxpY2F0aW9ucy4gU28sIGxldCdzIAorICoganVzdCB0cmFwIHN1Y2ggY2FzZSBoZXJlIGF0IGNvbXBpbGUgdGltZS4KKyAqCisgKiBBcHBsaWNhdGlvbiBjYW4gY29udHJvbCB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGJ5IG1hbmlwdWxhdGluZworICogUEpNRURJQV9IQVNfRzcyMjFfQ09ERUMgYW5kIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzIyXzEgaW4KKyAqIGNvbmZpZ19zaXRlLmguCisgKi8KKyNpZiAoUEpNRURJQV9IQVNfRzcyMjFfQ09ERUMgIT0gMCkgJiYgKFBKTUVESUFfSEFTX0lOVEVMX0lQUCAhPSAwKSAmJiBcCisgICAgKFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzIyXzEgIT0gMCkKKyMgICBlcnJvciBPbmx5IG9uZSBHLjcyMi4xIGltcGxlbWVudGF0aW9uIGNhbiBiZSBlbmFibGVkIGF0IHRoZSBzYW1lIHRpbWUuIFwKKwkgIFBsZWFzZSB1c2UgUEpNRURJQV9IQVNfRzcyMjFfQ09ERUMgYW5kIFwKKwkgIFBKTUVESUFfSEFTX0lOVEVMX0lQUF9DT0RFQ19HNzIyXzEgaW4geW91ciBjb25maWdfc2l0ZS5oIFwKKwkgIHRvIGNvbnRyb2wgd2hpY2ggaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZC4KKyNlbmRpZgorCisKKy8qKgorICogRW5hYmxlIFNJTEsgY29kZWMuCisgKgorICogRGVmYXVsdDogMAorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX1NJTEtfQ09ERUMKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfU0lMS19DT0RFQwkJMAorI2VuZGlmCisKKworLyoqCisgKiBTSUxLIGNvZGVjIGRlZmF1bHQgY29tcGxleGl0eSBzZXR0aW5nLCB2YWxpZCB2YWx1ZXMgYXJlIDAgKGxvd2VzdCksIDEsCisgKiBhbmQgMi4KKyAqCisgKiBEZWZhdWx0OiAyCisgKi8KKyNpZm5kZWYgUEpNRURJQV9DT0RFQ19TSUxLX0RFRkFVTFRfQ09NUExFWElUWQorIyAgIGRlZmluZSBQSk1FRElBX0NPREVDX1NJTEtfREVGQVVMVF9DT01QTEVYSVRZICAgMgorI2VuZGlmCisKKy8qKgorICogU0lMSyBjb2RlYyBkZWZhdWx0IHF1YWxpdHkgc2V0dGluZywgdmFsaWQgdmFsdWVzIGFyZSByYW5naW5nIGZyb20KKyAqIDAgKGxvd2VzdCkgdG8gMTAuIFBsZWFzZSBub3RlIHRoYXQgcGpzdWEtbGliIG1heSBvdmVycmlkZSB0aGlzIHNldHRpbmcKKyAqIHZpYSBpdHMgY29kZWMgcXVhbGl0eSBzZXR0aW5nIChpLmUgUEpTVUFfREVGQVVMVF9DT0RFQ19RVUFMSVRZKS4KKyAqCisgKiBEZWZhdWx0OiAxMAorICovCisjaWZuZGVmIFBKTUVESUFfQ09ERUNfU0lMS19ERUZBVUxUX1FVQUxJVFkKKyMgICBkZWZpbmUgUEpNRURJQV9DT0RFQ19TSUxLX0RFRkFVTFRfUVVBTElUWQkgICAgMTAKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSBpZiBGRk1QRUcgY29kZWNzIGFyZSBhdmFpbGFibGUuCisgKgorICogRGVmYXVsdDogUEpNRURJQV9IQVNfTElCQVZDT0RFQworICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0ZGTVBFR19DT0RFQworIyAgIGRlZmluZSBQSk1FRElBX0hBU19GRk1QRUdfQ09ERUMJCVBKTUVESUFfSEFTX0xJQkFWQ09ERUMKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSBpZiBGRk1QRUcgdmlkZW8gY29kZWNzIGFyZSBhdmFpbGFibGUuCisgKgorICogRGVmYXVsdDogUEpNRURJQV9IQVNfRkZNUEVHX0NPREVDCisgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfRkZNUEVHX1ZJRF9DT0RFQworIyAgIGRlZmluZSBQSk1FRElBX0hBU19GRk1QRUdfVklEX0NPREVDCQlQSk1FRElBX0hBU19GRk1QRUdfQ09ERUMKKyNlbmRpZgorCisvKioKKyAqIEVuYWJsZSBGRk1QRUcgSDI2MysvSDI2My0xOTk4IGNvZGVjLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19GRk1QRUdfQ09ERUNfSDI2M1AKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfRkZNUEVHX0NPREVDX0gyNjNQCVBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMKKyNlbmRpZgorCisvKioKKyAqIEVuYWJsZSBGRk1QRUcgSDI2NCBjb2RlYyAocmVxdWlyZXMgbGlieDI2NCkuCisgKgorICogRGVmYXVsdDogMAorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0ZGTVBFR19DT0RFQ19IMjY0CisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0ZGTVBFR19DT0RFQ19IMjY0CVBKTUVESUFfSEFTX0ZGTVBFR19WSURfQ09ERUMKKyNlbmRpZgorCisvKioKKyAqIEB9CisgKi8KKworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ERUNfQ09ORklHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZ19hdXRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxYjc0OQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZ19hdXRvLmgKQEAgLTAsMCArMSw5MCBAQAorLyogcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ19hdXRvLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qICRJZDogY29uZmlnX2F1dG8uaC5pbiA0MzMxIDIwMTMtMDEtMjMgMDY6MTg6MThaIG1pbmcgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ19DT05GSUdfQVVUT19IXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfQ09ORklHX0FVVE9fSF8KKworLyoqCisgKiBAZmlsZSBjb25maWdfYXV0by5oCisgKiBAYnJpZWYgUEpNRURJQS1DT0RFQyBjb25maWd1cmF0aW9uIGFzIHNldCBieSBhdXRvY29uZiBzY3JpcHQKKyAqLworCisvKgorICogTm90ZToKKyAqCVRoZSBjb25maWd1cmF0aW9uIGluIGNvbmZpZ19zaXRlLmggb3ZlcnJpZGVzIGFueSBvdGhlciBzZXR0aW5ncywKKyAqCWluY2x1ZGluZyB0aGUgc2V0dGluZyBhcyBkZXRlY3RlZCBieSBhdXRvY29uZi4gCisgKi8KKyAKKy8qIEwxNiBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19MMTZfQ09ERUMKKyNkZWZpbmUgUEpNRURJQV9IQVNfTDE2X0NPREVDIDAKKyNlbmRpZgorCisKKy8qIEdTTSBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19HU01fQ09ERUMKKyNkZWZpbmUgUEpNRURJQV9IQVNfR1NNX0NPREVDIDAKKyNlbmRpZgorCisvKiAjdW5kZWYgUEpNRURJQV9FWFRFUk5BTF9HU01fQ09ERUMgKi8KKy8qICN1bmRlZiBQSk1FRElBX0VYVEVSTkFMX0dTTV9HU01fSCAqLworLyogI3VuZGVmIFBKTUVESUFfRVhURVJOQUxfR1NNX0ggKi8KKworLyogU3BlZXggY29kZWMgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfU1BFRVhfQ09ERUMKKyNkZWZpbmUgUEpNRURJQV9IQVNfU1BFRVhfQ09ERUMgMAorI2VuZGlmCisKKy8qICN1bmRlZiBQSk1FRElBX0VYVEVSTkFMX1NQRUVYX0NPREVDICovCisKKy8qIGlMQkMgY29kZWMgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfSUxCQ19DT0RFQworI2RlZmluZSBQSk1FRElBX0hBU19JTEJDX0NPREVDIDAKKyNlbmRpZgorCisKKy8qIEc3MjIgY29kZWMgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfRzcyMl9DT0RFQworI2RlZmluZSBQSk1FRElBX0hBU19HNzIyX0NPREVDIDAKKyNlbmRpZgorCisvKiBHNzIyMSBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19HNzIyMV9DT0RFQworI2RlZmluZSBQSk1FRElBX0hBU19HNzIyMV9DT0RFQyAwCisjZW5kaWYKKworLyogT3BlbkNPUkUgQU1SLU5CIGNvZGVjICovCisjaWZuZGVmIFBKTUVESUFfSEFTX09QRU5DT1JFX0FNUk5CX0NPREVDCisjZGVmaW5lIFBKTUVESUFfSEFTX09QRU5DT1JFX0FNUk5CX0NPREVDIDAKKyNlbmRpZgorCisvKiBPcGVuQ09SRSBBTVItV0IgY29kZWMgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1SV0JfQ09ERUMKKyNkZWZpbmUgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1SV0JfQ09ERUMgMAorI2VuZGlmCisKKy8qIFNJTEsgY29kZWMgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfU0lMS19DT0RFQworI2RlZmluZSBQSk1FRElBX0hBU19TSUxLX0NPREVDIDAKKyNlbmRpZgorCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX0NPTkZJR19BVVRPX0hfICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvY29uZmlnX2F1dG8uaC5pbiBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZ19hdXRvLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkYTExMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2NvbmZpZ19hdXRvLmguaW4KQEAgLTAsMCArMSw4OSBAQAorLyogJElkOiBjb25maWdfYXV0by5oLmluIDQzMzEgMjAxMy0wMS0yMyAwNjoxODoxOFogbWluZyAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX0NPTkZJR19BVVRPX0hfCisjZGVmaW5lIF9fUEpNRURJQV9DT0RFQ19DT05GSUdfQVVUT19IXworCisvKioKKyAqIEBmaWxlIGNvbmZpZ19hdXRvLmgKKyAqIEBicmllZiBQSk1FRElBLUNPREVDIGNvbmZpZ3VyYXRpb24gYXMgc2V0IGJ5IGF1dG9jb25mIHNjcmlwdAorICovCisKKy8qCisgKiBOb3RlOgorICoJVGhlIGNvbmZpZ3VyYXRpb24gaW4gY29uZmlnX3NpdGUuaCBvdmVycmlkZXMgYW55IG90aGVyIHNldHRpbmdzLAorICoJaW5jbHVkaW5nIHRoZSBzZXR0aW5nIGFzIGRldGVjdGVkIGJ5IGF1dG9jb25mLiAKKyAqLworIAorLyogTDE2IGNvZGVjICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0wxNl9DT0RFQworI3VuZGVmIFBKTUVESUFfSEFTX0wxNl9DT0RFQworI2VuZGlmCisKKworLyogR1NNIGNvZGVjICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0dTTV9DT0RFQworI3VuZGVmIFBKTUVESUFfSEFTX0dTTV9DT0RFQworI2VuZGlmCisKKyN1bmRlZiBQSk1FRElBX0VYVEVSTkFMX0dTTV9DT0RFQworI3VuZGVmIFBKTUVESUFfRVhURVJOQUxfR1NNX0dTTV9ICisjdW5kZWYgUEpNRURJQV9FWFRFUk5BTF9HU01fSAorCisvKiBTcGVleCBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19TUEVFWF9DT0RFQworI3VuZGVmIFBKTUVESUFfSEFTX1NQRUVYX0NPREVDCisjZW5kaWYKKworI3VuZGVmIFBKTUVESUFfRVhURVJOQUxfU1BFRVhfQ09ERUMKKworLyogaUxCQyBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19JTEJDX0NPREVDCisjdW5kZWYgUEpNRURJQV9IQVNfSUxCQ19DT0RFQworI2VuZGlmCisKKworLyogRzcyMiBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19HNzIyX0NPREVDCisjdW5kZWYgUEpNRURJQV9IQVNfRzcyMl9DT0RFQworI2VuZGlmCisKKy8qIEc3MjIxIGNvZGVjICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0c3MjIxX0NPREVDCisjdW5kZWYgUEpNRURJQV9IQVNfRzcyMjFfQ09ERUMKKyNlbmRpZgorCisvKiBPcGVuQ09SRSBBTVItTkIgY29kZWMgKi8KKyNpZm5kZWYgUEpNRURJQV9IQVNfT1BFTkNPUkVfQU1STkJfQ09ERUMKKyN1bmRlZiBQSk1FRElBX0hBU19PUEVOQ09SRV9BTVJOQl9DT0RFQworI2VuZGlmCisKKy8qIE9wZW5DT1JFIEFNUi1XQiBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19PUEVOQ09SRV9BTVJXQl9DT0RFQworI3VuZGVmIFBKTUVESUFfSEFTX09QRU5DT1JFX0FNUldCX0NPREVDCisjZW5kaWYKKworLyogU0lMSyBjb2RlYyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19TSUxLX0NPREVDCisjdW5kZWYgUEpNRURJQV9IQVNfU0lMS19DT0RFQworI2VuZGlmCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ERUNfQ09ORklHX0FVVE9fSF8gKi8KKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9mZm1wZWdfdmlkX2NvZGVjcy5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZmZtcGVnX3ZpZF9jb2RlY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM4YWYyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZmZtcGVnX3ZpZF9jb2RlY3MuaApAQCAtMCwwICsxLDY3IEBACisvKiAkSWQ6IGZmbXBlZ192aWRfY29kZWNzLmggNDA0OSAyMDEyLTA0LTEzIDA2OjI0OjIzWiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ1NfRkZNUEVHX1ZJRF9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDU19GRk1QRUdfVklEX0hfXworCisKKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3R5cGVzLmg+CisjaW5jbHVkZSA8cGptZWRpYS92aWRfY29kZWMuaD4KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX0NPREVDX1ZJRF9GRk1QRUcgRkZtcGVnIENvZGVjcworICogQGluZ3JvdXAgUEpNRURJQV9DT0RFQ19WSURfQ09ERUNTCisgKiBAeworICovCisKKy8qKgorICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgRkZNUEVHIHZpZGVvIGNvZGVjcyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIG1ncgkgICAgVGhlIHZpZGVvIGNvZGVjIG1hbmFnZXIgaW5zdGFuY2Ugd2hlcmUgdGhpcyBjb2RlYyB3aWxsCisgKiAJCSAgICBiZSByZWdpc3RlcmVkIHRvLiBTcGVjaWZ5IE5VTEwgdG8gdXNlIGRlZmF1bHQgaW5zdGFuY2UKKyAqIAkJICAgIChpbiB0aGF0IGNhc2UsIGFuIGluc3RhbmNlIG9mIHZpZGVvIGNvZGVjIG1hbmFnZXIgbXVzdAorICogCQkgICAgaGF2ZSBiZWVuIGNyZWF0ZWQgYmVmb3JlaGFuZCkuCisgKiBAcGFyYW0gcGYJICAgIFBvb2wgZmFjdG9yeS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZmZtcGVnX3ZpZF9pbml0KHBqbWVkaWFfdmlkX2NvZGVjX21nciAqbWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfcG9vbF9mYWN0b3J5ICpwZik7CisKKworLyoqCisgKiBVbnJlZ2lzdGVyIEZGTVBFRyB2aWRlbyBjb2RlY3MgZmFjdG9yeSBmcm9tIHRoZSB2aWRlbyBjb2RlYyBtYW5hZ2VyIGFuZAorICogZGVpbml0aWFsaXplIHRoZSBjb2RlY3MgbGlicmFyeS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZmZtcGVnX3ZpZF9kZWluaXQodm9pZCk7CisKKworUEpfRU5EX0RFQ0wKKworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ1NfRkZNUEVHX1ZJRF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMi5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWI3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qICRJZDogZzcyMi5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ19HNzIyX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfRzcyMl9IX18KKworLyoqCisgKiBAZmlsZSBwam1lZGlhLWNvZGVjL2c3MjIuaAorICogQGJyaWVmIEcuNzIyIGNvZGVjLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3R5cGVzLmg+CisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX0c3MjIgRy43MjIgQ29kZWMKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRy43MjIgQ29kZWMKKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgRy43MjIgY29kZWMKKyAqIGZhY3RvcnkgdG8gdGhlIGNvZGVjIG1hbmFnZXIuIEFmdGVyIHRoZSBjb2RlYyBmYWN0b3J5IGhhcyBiZWVuIHJlZ2lzdGVyZWQsCisgKiBhcHBsaWNhdGlvbiBjYW4gdXNlIEByZWYgUEpNRURJQV9DT0RFQyBBUEkgdG8gbWFuaXB1bGF0ZSB0aGUgY29kZWMuCisgKgorICogVGhlIEcuNzIyIGltcGxlbWVudGF0aW9uIHVzZXMgMTYtYml0IFBDTSB3aXRoIHNhbXBsaW5nIHJhdGUgMTYwMDBIeiBhbmQgCisgKiAyMG1zIGZyYW1lIGxlbmd0aCByZXN1bHRpbmcgaW4gNjRrYnBzIGJpdHJhdGUuCisgKgorICogVGhlIEcuNzIyIGNvZGVjIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcGptZWRpYS1jb2RlYworICogbGlicmFyeSwgYW5kIGRvZXMgbm90IGRlcGVuZCBvbiBleHRlcm5hbCBHLjcyMiBjb2RlYyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBcc2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogXHN1YnNlY3Rpb24gZ2VuZXJhbF9zZXR0aW5nIEdlbmVyYWwgU2V0dGluZ3MKKyAqCisgKiBHZW5lcmFsIGNvZGVjIHNldHRpbmdzIGZvciB0aGlzIGNvZGVjIHN1Y2ggYXMgVkFEIGFuZCBQTEMgY2FuIGJlIAorICogbWFuaXB1bGF0ZWQgdGhyb3VnaCB0aGUgPHR0PnNldHRpbmc8L3R0PiBmaWVsZCBpbiAjcGptZWRpYV9jb2RlY19wYXJhbS4gCisgKiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICNwam1lZGlhX2NvZGVjX3BhcmFtIGZvciBtb3JlIGluZm8uCisgKgorICogXHN1YnNlY3Rpb24gc3BlY2lmaWNfc2V0dGluZyBDb2RlYyBTcGVjaWZpYyBTZXR0aW5ncworICoKKyAqIEN1cnJlbnRseSBub25lLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEcuNzIyIGNvZGVjIGZhY3RvcnkgdG8gcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcGFyYW0gZW5kcHQJICAgIFRoZSBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyX2luaXQocGptZWRpYV9lbmRwdCAqZW5kcHQpOworCisKKy8qKgorICogVW5yZWdpc3RlciBHLjcyMiBjb2RlYyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludCBhbmQgY2xlYW51cAorICogcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgZmFjdG9yeS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZzcyMl9kZWluaXQodm9pZCk7CisKKworLyoqCisgKiBTZXQgdGhlIEcuNzIyIGNvZGVjIGVuY29kZXIgYW5kIGRlY29kZXIgbGV2ZWwgYWRqdXN0bWVudC4KKyAqIElmIHRoZSB2YWx1ZSBpcyBub24temVybywgdGhlbiBQQ00gaW5wdXQgc2FtcGxlcyB0byB0aGUgZW5jb2RlciB3aWxsIAorICogYmUgc2hpZnRlZCByaWdodCBieSB0aGlzIHZhbHVlLCBhbmQgc2ltaWxhcmx5IFBDTSBvdXRwdXQgc2FtcGxlcyBmcm9tCisgKiB0aGUgZGVjb2RlciB3aWxsIGJlIHNoaWZ0ZWQgbGVmdCBieSB0aGlzIHZhbHVlLgorICoKKyAqIERlZmF1bHQgdmFsdWUgaXMgUEpNRURJQV9HNzIyX0RFRkFVTFRfUENNX1NISUZULgorICoKKyAqIEBwYXJhbSB2YWwJCVRoZSB2YWx1ZQorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyX3NldF9wY21fc2hpZnQodW5zaWduZWQgdmFsKTsKKworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogX19QSk1FRElBX0NPREVDX0c3MjJfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIxLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NmVlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nNzIyMS5oCkBAIC0wLDAgKzEsMTYyIEBACisvKiAkSWQ6IGc3MjIxLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDU19HNzIyMV9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDU19HNzIyMV9IX18KKworLyoqCisgKiBAZmlsZSBwam1lZGlhLWNvZGVjL2c3MjIxLmgKKyAqIEBicmllZiBHNzIyLjEgY29kZWMuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfRzcyMjFfQ09ERUMgRy43MjIuMSBDb2RlYyAoU2lyZW43L1NpcmVuMTQpCisgKiBAaW5ncm91cCBQSk1FRElBX0NPREVDX0NPREVDUworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIEcuNzIyLjEgY29kZWMKKyAqIEB7CisgKgorICogPGI+Ry43MjIuMSBsaWNlbnNlZCBmcm9tIFBvbHljb22uPC9iPjxiciAvPgorICogPGI+Ry43MjIuMSBBbm5leCBDIGxpY2Vuc2VkIGZyb20gUG9seWNvba48L2I+CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgRy43MjIuMSBjb2RlYworICogZmFjdG9yeSB0byB0aGUgY29kZWMgbWFuYWdlci4gQWZ0ZXIgdGhlIGNvZGVjIGZhY3RvcnkgaGFzIGJlZW4gcmVnaXN0ZXJlZCwKKyAqIGFwcGxpY2F0aW9uIGNhbiB1c2UgQHJlZiBQSk1FRElBX0NPREVDIEFQSSB0byBtYW5pcHVsYXRlIHRoZSBjb2RlYy4KKyAqCisgKiBQSk1FRElBIEc3MjIuMSBjb2RlYyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBJVFUtVCBSZWNvbW1lbmRhdGlvbiAKKyAqIEcuNzIyLjEgKDA1LzIwMDUpIEMgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gaW5jbHVkaW5nIGl0cyBBbm5leCBDLgorICoKKyAqIEcuNzIyLjEgaXMgYSBsb3cgY29tcGxleGl0eSBjb2RlYyB0aGF0IHN1cHBvcnRzIDdrSHogYW5kIDE0a0h6IGF1ZGlvIAorICogYmFuZHdpZHRoIHdvcmtpbmcgYXQgYml0cmF0ZXMgcmFuZ2luZyBmcm9tIDE2a2JwcyB0byA0OGticHMuIEl0IG1heSBiZQorICogdXNlZCB3aXRoIHNwZWVjaCBvciBtdXNpYyBpbnB1dHMuCisgKgorICoKKyAqIFxzZWN0aW9uIGNvZGVjX3NldHRpbmcgQ29kZWMgU2V0dGluZ3MKKyAqCisgKiBcc3Vic2VjdGlvbiBnZW5lcmFsX3NldHRpbmcgR2VuZXJhbCBTZXR0aW5ncworICoKKyAqIEdlbmVyYWwgY29kZWMgc2V0dGluZ3MgZm9yIHRoaXMgY29kZWMgc3VjaCBhcyBWQUQgYW5kIFBMQyBjYW4gYmUgCisgKiBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSA8dHQ+c2V0dGluZzwvdHQ+IGZpZWxkIGluICNwam1lZGlhX2NvZGVjX3BhcmFtLiAKKyAqIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgI3BqbWVkaWFfY29kZWNfcGFyYW0gZm9yIG1vcmUgaW5mby4KKyAqCisgKiBcc3Vic2VjdGlvbiBzcGVjaWZpY19zZXR0aW5nIENvZGVjIFNwZWNpZmljIFNldHRpbmdzCisgKgorICogVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgYXBwbGljYWJsZSBmb3IgdGhpcyBjb2RlYy4KKyAqCisgKiBcc3Vic3Vic2VjdGlvbiBiaXRyYXRlIEJpdHJhdGUKKyAqCisgKiBUaGUgY29kZWMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgc3RhbmRhcmQgYW5kIG5vbi1zdGFuZGFyZCBiaXRyYXRlcy4KKyAqIFVzZSAjcGptZWRpYV9jb2RlY19nNzIyMV9zZXRfbW9kZSgpIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBiaXRyYXRlcy4KKyAqCisgKiBCeSBkZWZhdWx0LCBvbmx5IHN0YW5kYXJkIGJpdHJhdGVzIGFyZSBlbmFibGVkIHVwb24gaW5pdGlhbGl6YXRpb246CisgKiAtIGZvciA3a0h6IGF1ZGlvIGJhbmR3aWR0aCAoMTZrSHogc2FtcGxpbmcgcmF0ZSk6IDI0a2JwcyBhbmQgMzJrYnBzLAorICogLSBmb3IgMTRrSHogYXVkaW8gYmFuZHdpZHRoICgzMmtIeiBzYW1wbGluZyByYXRlKTogMjRrYnBzLCAzMmticHMsIGFuZAorICogICA0OGticHMuCisgKgorICogVGhlIHVzYWdlIG9mIG5vbi1zdGFuZGFyZCBiaXRyYXRlcyBtdXN0IGZvbGxvdyB0aGVzZSByZXF1aXJlbWVudHM6CisgKiAtIGZvciA3a0h6IGF1ZGlvIGJhbmR3aWR0aCAoMTZrSHogc2FtcGxpbmcgcmF0ZSk6IDE2MDAwIHRvIDMyMDAwIGJwcywgCisgKiAgIG11bHRpcGxpY2F0aW9uIG9mIDQwMAorICogLSBmb3IgMTRrSHogYXVkaW8gYmFuZHdpZHRoICgzMmtIeiBzYW1wbGluZyByYXRlKTogMjQwMDAgdG8gNDgwMDAgYnBzLAorICogICBtdWx0aXBsaWNhdGlvbiBvZiA0MDAKKyAqCisgKiBcbm90ZQorICogQ3VycmVudGx5IG9ubHkgdXAgdG8gdHdvIG5vbi1zdGFuZGFyZCBtb2RlcyBjYW4gYmUgZW5hYmxlZC4KKyAqCisgKiBccmVtYXJrCisgKiBUaGVyZSBpcyBhIGZsYXcgaW4gdGhlIGNvZGVjIG1hbmFnZXIgYXMgY3VycmVudGx5IGl0IGNvdWxkIG5vdAorICogZGlmZmVyZW50aWF0ZSBHLjcyMi4xIGNvZGVjcyBieSBiaXRyYXRlcywgaGVuY2UgaW52b2tpbmcgCisgKiAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKSBtYXkgb25seSBhZmZlY3QgYSBHLjcyMi4xIGNvZGVjCisgKiB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IChvciBmaXJzdCBpbmRleCBmb3VuZCBpbiBjb2RlYyBlbnVtZXJhdGlvbiAKKyAqIHdoZW4gdGhleSBoYXZlIHNhbWUgcHJpb3JpdHkpIGFuZCBpbnZva2luZworICogI3BqbWVkaWFfY29kZWNfbWdyX3NldF9jb2RlY19wcmlvcml0eSgpIHdpbGwgc2V0IHByaW9yaXR5IG9mIGFsbCBHLjcyMi4xCisgKiBjb2RlY3Mgd2l0aCBzYW1wbGluZyByYXRlIGFzIHNwZWNpZmllZC4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgRy43MjIuMSBjb2RlYyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVuZHB0CSAgICBUaGUgcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZzcyMjFfaW5pdCggcGptZWRpYV9lbmRwdCAqZW5kcHQgKTsKKworCisvKioKKyAqIEVuYWJsZSBhbmQgZGlzYWJsZSBHLjcyMi4xIG1vZGUuIEJ5IGRlZmF1bHQsIHRoZSBzdGFuZGFyZCBtb2RlcyBhcmUgCisgKiBlbmFibGVkIHVwb24gaW5pdGlhbGl6YXRpb24sIGkuZS46CisgKiAtIHNhbXBsaW5nIHJhdGUgMTZrSHosIGJpdHJhdGUgMjRrYnBzIGFuZCAzMmticHMuCisgKiAtIHNhbXBsaW5nIHJhdGUgMzJrSHosIGJpdHJhdGUgMjRrYnBzLCAzMmticHMsIGFuZCA0OGticHMuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGVuYWJsaW5nIG5vbi1zdGFuZGFyZCBtb2Rlcy4KKyAqIE5vdGUgdGhhdCBjdXJyZW50bHkgb25seSB1cCB0byB0d28gbm9uLXN0YW5kYXJkIG1vZGVzIGNhbiBiZSBlbmFibGVkCisgKiBhdCBvbmUgdGltZS4KKyAqCisgKiBAcGFyYW0gc2FtcGxlX3JhdGUJUENNIHNhbXBsaW5nIHJhdGUsIGluIEh6LCB2YWxpZCB2YWx1ZXMgYXJlIG9ubHkgCisgKgkJCTE2MDAwIGFuZCAzMjAwMC4KKyAqIEBwYXJhbSBiaXRyYXRlCUc3MjIuMSBiaXRyYXRlLCBpbiBicHMsIHRoZSB2YWxpZCB2YWx1ZXMgYXJlCisgKgkJCXN0YW5kYXJkIGFuZCBub24tc3RhbmRhcmQgYml0cmF0ZXMgYXMgZGVzY3JpYmVkIAorICoJCQlhYm92ZS4KKyAqIEBwYXJhbSBlbmFibGVkCVBKX1RSVUUgZm9yIGVuYWJsaW5nIHNwZWNpZmllZCBtb2RlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9zZXRfbW9kZSh1bnNpZ25lZCBzYW1wbGVfcmF0ZSwgCisJCQkJCQkgIHVuc2lnbmVkIGJpdHJhdGUsIAorCQkJCQkJICBwal9ib29sX3QgZW5hYmxlZCk7CisKKy8qKgorICogU2V0IHRoZSBHLjcyMi4xIGNvZGVjIGVuY29kZXIgYW5kIGRlY29kZXIgbGV2ZWwgYWRqdXN0bWVudC4gCisgKiBJZiB0aGUgdmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gUENNIGlucHV0IHNhbXBsZXMgdG8gdGhlIGVuY29kZXIgd2lsbCAKKyAqIGJlIHNoaWZ0ZWQgcmlnaHQgYnkgdGhpcyB2YWx1ZSwgYW5kIHNpbWlsYXJseSBQQ00gb3V0cHV0IHNhbXBsZXMgZnJvbQorICogdGhlIGRlY29kZXIgd2lsbCBiZSBzaGlmdGVkIGxlZnQgYnkgdGhpcyB2YWx1ZS4KKyAqCisgKiBcbm90ZQorICogVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFwcGxpY2FibGUgZm9yIEc3MjIuMSBpbXBsZW1lbnRhdGlvbiB3aXRoIElQUAorICogYmFjay1lbmQuCisgKgorICogRGVmYXVsdCB2YWx1ZSBpcyBQSk1FRElBX0c3MjIxX0RFRkFVTFRfUENNX1NISUZULgorICoKKyAqIEBwYXJhbSB2YWwJCVRoZSB2YWx1ZQorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9zZXRfcGNtX3NoaWZ0KGludCB2YWwpOworCisKKworLyoqCisgKiBVbnJlZ2lzdGVyIEcuNzIyLjEgY29kZWNzIGZhY3RvcnkgZnJvbSBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9kZWluaXQodm9pZCk7CisKKworUEpfRU5EX0RFQ0wKKworCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ1NfRzcyMjFfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIxX3NkcF9tYXRjaC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZzcyMjFfc2RwX21hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhYTY0NwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2c3MjIxX3NkcF9tYXRjaC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qICRJZDogZzcyMjFfc2RwX21hdGNoLmggMzkxMSAyMDExLTEyLTE1IDA2OjQ1OjIzWiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX0c3MjIxX1NEUF9NQVRDSF9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDX0c3MjIxX1NEUF9NQVRDSF9IX18KKworCisvKioKKyAqIEBmaWxlIGc3MjIxX3NkcF9tYXRjaC5oCisgKiBAYnJpZWYgU3BlY2lhbCBTRFAgZm9ybWF0IG1hdGNoIGZvciBHNzIyLjEuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvc2RwX25lZy5oPgorCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogTWF0Y2ggRy43MjIuMSBmb3JtYXQgaW4gdGhlIFNEUCBtZWRpYSBvZmZlciBhbmQgYW5zd2VyLiBUaGlzIGZ1bmN0aW9uCisgKiB3aWxsIG1hdGNoIEcuNzIyLjEgYml0cmF0ZSBzZXR0aW5nIGluIHRoZSBTRFAgZm9ybWF0IHBhcmFtZXRlciBvZgorICogb2ZmZXIgYW5kIGFuc3dlci4KKyAqCisgKiBAcGFyYW0gcG9vbAkJVGhlIG1lbW9yeSBwb29sLgorICogQHBhcmFtIG9mZmVyCQlUaGUgU0RQIG1lZGlhIG9mZmVyLgorICogQHBhcmFtIG9fZm10X2lkeAlJbmRleCBvZiB0aGUgRy43MjIuMSBmb3JtYXQgaW4gdGhlIFNEUCBtZWRpYSBvZmZlci4KKyAqIEBwYXJhbSBhbnN3ZXIJVGhlIFNEUCBtZWRpYSBhbnN3ZXIuCisgKiBAcGFyYW0gYV9mbXRfaWR4CUluZGV4IG9mIHRoZSBHLjcyMi4xIGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIGFuc3dlci4KKyAqIEBwYXJhbSBvcHRpb24JVGhlIGZvcm1hdCBtYXRjaGluZyBvcHRpb24sIHNlZQorICoJCQkjcGptZWRpYV9zZHBfbmVnX2ZtdF9tYXRjaF9mbGFnLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgd2hlbiB0aGUgZm9ybWF0cyBpbiBvZmZlciBhbmQgYW5zd2VyIG1hdGNoLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX2c3MjIxX21hdGNoX3NkcCggcGpfcG9vbF90ICpwb29sLAorCQkJCQkJICAgIHBqbWVkaWFfc2RwX21lZGlhICpvZmZlciwKKwkJCQkJCSAgICB1bnNpZ25lZCBvX2ZtdF9pZHgsCisJCQkJCQkgICAgcGptZWRpYV9zZHBfbWVkaWEgKmFuc3dlciwKKwkJCQkJCSAgICB1bnNpZ25lZCBhX2ZtdF9pZHgsCisJCQkJCQkgICAgdW5zaWduZWQgb3B0aW9uKTsKKworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ERUNfRzcyMjFfU0RQX01BVENIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZ3NtLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9nc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkzOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvZ3NtLmgKQEAgLTAsMCArMSw4NyBAQAorLyogJElkOiBnc20uaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNfR1NNX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfR1NNX0hfXworCisvKioKKyAqIEBmaWxlIHBqbWVkaWEtY29kZWMvZ3NtLmgKKyAqIEBicmllZiBHU00gMDYuMTAgY29kZWMuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfR1NNIEdTTSAwNi4xMCBDb2RlYworICogQGluZ3JvdXAgUEpNRURJQV9DT0RFQ19DT0RFQ1MKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBHU00gRlIgYmFzZWQgb24gR1NNIDA2LjEwIGxpYnJhcnkKKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgR1NNIGNvZGVjCisgKiBmYWN0b3J5IHRvIHRoZSBjb2RlYyBtYW5hZ2VyLiBBZnRlciB0aGUgY29kZWMgZmFjdG9yeSBoYXMgYmVlbiByZWdpc3RlcmVkLAorICogYXBwbGljYXRpb24gY2FuIHVzZSBAcmVmIFBKTUVESUFfQ09ERUMgQVBJIHRvIG1hbmlwdWxhdGUgdGhlIGNvZGVjLgorICoKKyAqIFRoZSBHU00gY29kZWMgc3VwcG9ydHMgMTYtYml0IFBDTSB3aXRoIHNhbXBsaW5nIHJhdGUgb2YgODAwMEh6IHJlc3VsdGluZworICogaW4gMTMuMmticHMgYml0cmF0ZS4KKyAqCisgKiBcc2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogXHN1YnNlY3Rpb24gZ2VuZXJhbF9zZXR0aW5nIEdlbmVyYWwgU2V0dGluZ3MKKyAqCisgKiBHZW5lcmFsIGNvZGVjIHNldHRpbmdzIGZvciB0aGlzIGNvZGVjIHN1Y2ggYXMgVkFEIGFuZCBQTEMgY2FuIGJlIAorICogbWFuaXB1bGF0ZWQgdGhyb3VnaCB0aGUgPHR0PnNldHRpbmc8L3R0PiBmaWVsZCBpbiAjcGptZWRpYV9jb2RlY19wYXJhbS4gCisgKiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICNwam1lZGlhX2NvZGVjX3BhcmFtIGZvciBtb3JlIGluZm8uCisgKgorICogXHN1YnNlY3Rpb24gc3BlY2lmaWNfc2V0dGluZyBDb2RlYyBTcGVjaWZpYyBTZXR0aW5ncworICoKKyAqIEN1cnJlbnRseSBub25lLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEdTTSBjb2RlYyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVuZHB0CSAgICBUaGUgcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZ3NtX2luaXQoIHBqbWVkaWFfZW5kcHQgKmVuZHB0ICk7CisKKworCisvKioKKyAqIFVucmVnaXN0ZXIgR1NNIGNvZGVjIGZhY3RvcnkgZnJvbSBwam1lZGlhIGVuZHBvaW50IGFuZCBkZWluaXRpYWxpemUKKyAqIHRoZSBHU00gY29kZWMgbGlicmFyeS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZ3NtX2RlaW5pdCh2b2lkKTsKKworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX0dTTV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaDI2M19wYWNrZXRpemVyLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9oMjYzX3BhY2tldGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY0NGEwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaDI2M19wYWNrZXRpemVyLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qICRJZDogaDI2M19wYWNrZXRpemVyLmggMzcxNSAyMDExLTA4LTE5IDA5OjM1OjI1WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9IMjYzX1BBQ0tFVElaRVJfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9IMjYzX1BBQ0tFVElaRVJfSF9fCisKKworLyoqCisgKiBAZmlsZSBoMjYzX3BhY2tldGl6ZXIuaAorICogQGJyaWVmIFBhY2tldGl6ZXMvdW5wYWNrZXRpemVzIEguMjYzIGJpdHN0cmVhbSBpbnRvIFJUUCBwYXlsb2FkLgorICovCisKKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovdHlwZXMuaD4KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogT3BhcXVlIGRlY2xhcmF0aW9uIGZvciBILjI2MyBwYWNrZXRpemVyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2gyNjNfcGFja2V0aXplciBwam1lZGlhX2gyNjNfcGFja2V0aXplcjsKKworCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIEguMjYzIHBhY2tldGl6YXRpb24gbW9kZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIC8qKgorICAgICAqIEguMjYzIFJUUCBwYWNrZXRpemF0aW9uIHVzaW5nIFJGQyA0NjI5LgorICAgICAqLworICAgIFBKTUVESUFfSDI2M19QQUNLRVRJWkVSX01PREVfUkZDNDYyOSwKKworICAgIC8qKgorICAgICAqIEguMjYzIFJUUCBwYWNrZXRpemF0aW9uIHVzaW5nIGxlZ2FjeSBSRkMgMjE5MC4KKyAgICAgKiBUaGlzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIFBKTUVESUFfSDI2M19QQUNLRVRJWkVSX01PREVfUkZDMjE5MCwKKworfSBwam1lZGlhX2gyNjNfcGFja2V0aXplcl9tb2RlOworCisKKy8qKgorICogSC4yNjMgcGFja2V0aXplciBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2gyNjNfcGFja2V0aXplcl9jZmcKK3sKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHBheWxvYWQgbGVuZ3RoLgorICAgICAqIERlZmF1bHQ6IFBKTUVESUFfTUFYX01UVQorICAgICAqLworICAgIGludAltdHU7CisKKyAgICAvKioKKyAgICAgKiBQYWNrZXRpemF0aW9uIG1vZGUuCisgICAgICogRGVmYXVsdDogUEpNRURJQV9IMjYzX1BBQ0tFVElaRVJfTU9ERV9SRkM0NjI5CisgICAgICovCisgICAgcGptZWRpYV9oMjYzX3BhY2tldGl6ZXJfbW9kZSBtb2RlOworCit9IHBqbWVkaWFfaDI2M19wYWNrZXRpemVyX2NmZzsKKworCisvKioKKyAqIENyZWF0ZSBILjI2MyBwYWNrZXRpemVyLgorICoKKyAqIEBwYXJhbSBwb29sCQlUaGUgbWVtb3J5IHBvb2wuCisgKiBAcGFyYW0gY2ZnCQlQYWNrZXRpemVyIHNldHRpbmdzLCBpZiBOVUxMLCBkZWZhdWx0IHNldHRpbmcKKyAqCQkJd2lsbCBiZSB1c2VkLgorICogQHBhcmFtIHBfcGt0eglQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHBhY2tldGl6ZXIuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2gyNjNfcGFja2V0aXplcl9jcmVhdGUoCisJCQkJICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgY29uc3QgcGptZWRpYV9oMjYzX3BhY2tldGl6ZXJfY2ZnICpjZmcsCisJCQkJICAgIHBqbWVkaWFfaDI2M19wYWNrZXRpemVyICoqcF9wa3R6KTsKKworCisvKioKKyAqIEdlbmVyYXRlIGFuIFJUUCBwYXlsb2FkIGZyb20gYSBILjI2MyBwaWN0dXJlIGJpdHN0cmVhbS4gTm90ZSB0aGF0IHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgYXBwbHkgaW4tcGxhY2UgcHJvY2Vzc2luZywgc28gdGhlIGJpdHN0cmVhbSBtYXkgYmUgbW9kaWZpZWQKKyAqIGR1cmluZyB0aGUgcGFja2V0aXphdGlvbi4KKyAqCisgKiBAcGFyYW0gcGt0egkJVGhlIHBhY2tldGl6ZXIuCisgKiBAcGFyYW0gYml0cwkJVGhlIHBpY3R1cmUgYml0c3RyZWFtIHRvIGJlIHBhY2tldGl6ZWQuCisgKiBAcGFyYW0gYml0c19sZW4JVGhlIGxlbmd0aCBvZiB0aGUgYml0c3RyZWFtLgorICogQHBhcmFtIGJpdHNfcG9zCVRoZSBiaXRzdHJlYW0gb2Zmc2V0IHRvIGJlIHBhY2tldGl6ZWQuCisgKiBAcGFyYW0gcGF5bG9hZAlUaGUgb3V0cHV0IHBheWxvYWQuCisgKiBAcGFyYW0gcGF5bG9hZF9sZW4JVGhlIG91dHB1dCBwYXlsb2FkIGxlbmd0aC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfaDI2M19wYWNrZXRpemUocGptZWRpYV9oMjYzX3BhY2tldGl6ZXIgKnBrdHosCisJCQkJCSAgICBwal91aW50OF90ICpiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zaXplX3QgYml0c19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpiaXRzX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdWludDhfdCAqKnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NpemVfdCAqcGF5bG9hZF9sZW4pOworCisKKy8qKgorICogQXBwZW5kIGFuIFJUUCBwYXlsb2FkIHRvIGFuIEguMjYzIHBpY3R1cmUgYml0c3RyZWFtLiBOb3RlIHRoYXQgaW4gY2FzZSBvZgorICogbm90aWNpbmcgcGFja2V0IGxvc3QsIGFwcGxpY2F0aW9uIHNob3VsZCBrZWVwIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoCisgKiBwYXlsb2FkIHBvaW50ZXIgc2V0IHRvIE5VTEwsIGFzIHRoZSBwYWNrZXRpemVyIG5lZWQgdG8gdXBkYXRlIGl0cyBpbnRlcm5hbAorICogc3RhdGUuCisgKgorICogQHBhcmFtIHBrdHoJCVRoZSBwYWNrZXRpemVyLgorICogQHBhcmFtIHBheWxvYWQJVGhlIHBheWxvYWQgdG8gYmUgdW5wYWNrZXRpemVkLgorICogQHBhcmFtIHBheWxvYWRfbGVuCVRoZSBwYXlsb2FkIGxlbmd0aC4KKyAqIEBwYXJhbSBiaXRzCQlUaGUgYml0c3RyZWFtIGJ1ZmZlci4KKyAqIEBwYXJhbSBiaXRzX3NpemUJVGhlIGJpdHN0cmVhbSBidWZmZXIgc2l6ZS4KKyAqIEBwYXJhbSBiaXRzX3BvcwlUaGUgYml0c3RyZWFtIG9mZnNldCB0byBwdXQgdGhlIHVucGFja2V0aXplZCBwYXlsb2FkCisgKgkJCWluIHRoZSBiaXRzdHJlYW0sIHVwb24gcmV0dXJuLCB0aGlzIHdpbGwgYmUgdXBkYXRlZAorICoJCQl0byB0aGUgbGF0ZXN0IG9mZnNldCBhcyBhIHJlc3VsdCBvZiB0aGUgdW5wYWNrZXRpemVkCisgKgkJCXBheWxvYWQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2gyNjNfdW5wYWNrZXRpemUocGptZWRpYV9oMjYzX3BhY2tldGl6ZXIgKnBrdHosCisJCQkJCSAgICAgIGNvbnN0IHBqX3VpbnQ4X3QgKnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc2l6ZV90IHBheWxvYWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3VpbnQ4X3QgKmJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc2l6ZV90IGJpdHNfc2l6ZSwKKwkJCQkJICAgICAgdW5zaWduZWQgKmJpdHNfcG9zKTsKKworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfSDI2M19QQUNLRVRJWkVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaDI2NF9wYWNrZXRpemVyLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9oMjY0X3BhY2tldGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI2MTgwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaDI2NF9wYWNrZXRpemVyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qICRJZDogaDI2NF9wYWNrZXRpemVyLmggMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfSDI2NF9QQUNLRVRJWkVSX0hfXworI2RlZmluZSBfX1BKTUVESUFfSDI2NF9QQUNLRVRJWkVSX0hfXworCisvKioKKyAqIEBmaWxlIGgyNjRfcGFja2V0aXplci5oCisgKiBAYnJpZWYgUGFja2V0aXplcyBILjI2NCBiaXRzdHJlYW0gaW50byBSVFAgcGF5bG9hZCBhbmQgdmljZSB2ZXJzYS4KKyAqLworCisjaW5jbHVkZSA8cGovdHlwZXMuaD4KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBmb3IgSC4yNjQgcGFja2V0aXplci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9oMjY0X3BhY2tldGl6ZXIgcGptZWRpYV9oMjY0X3BhY2tldGl6ZXI7CisKKworLyoqCisgKiBFbnVtZXJhdGlvbiBvZiBILjI2NCBwYWNrZXRpemF0aW9uIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvKioKKyAgICAgKiBTaW5nbGUgTkFMIHVuaXQgcGFja2V0aXphdGlvbiBtb2RlIHdpbGwgb25seSBnZW5lcmF0ZSBwYXlsb2FkcworICAgICAqIGNvbnRhaW5pbmcgYSBjb21wbGV0ZSBzaW5nbGUgTkFMIHVuaXQgcGFja2V0LiBBcyBILjI2NCBOQUwgdW5pdAorICAgICAqIHNpemUgY2FuIGJlIHZlcnkgbGFyZ2UsIHRoaXMgbW9kZSBpcyB1c3VhbGx5IG5vdCBhcHBsaWNhYmxlIGZvcgorICAgICAqIG5ldHdvcmsgZW52aXJvbm1lbnRzIHdpdGggTVRVIHNpemUgbGltaXRhdGlvbi4KKyAgICAgKi8KKyAgICBQSk1FRElBX0gyNjRfUEFDS0VUSVpFUl9NT0RFX1NJTkdMRV9OQUwsCisgICAgCisgICAgLyoqCisgICAgICogTm9uLWludGVybGVhdmVkIHBhY2tldGl6YXRpb24gbW9kZSB3aWxsIGdlbmVyYXRlIHBheWxvYWRzIHdpdGggdGhlCisgICAgICogZm9sbG93aW5nIHBvc3NpYmxlIGZvcm1hdHM6CisgICAgICogLSBzaW5nbGUgTkFMIHVuaXQgcGFja2V0cywKKyAgICAgKiAtIE5BTCB1bml0cyBhZ2dyZWdhdGlvbiBTVEFQLUEgcGFja2V0cywKKyAgICAgKiAtIGZyYWdtZW50ZWQgTkFMIHVuaXQgRlUtQSBwYWNrZXRzLgorICAgICAqLworICAgIFBKTUVESUFfSDI2NF9QQUNLRVRJWkVSX01PREVfTk9OX0lOVEVSTEVBVkVELAorCisgICAgLyoqCisgICAgICogSW50ZXJsZWF2ZWQgcGFja2V0aXphdGlvbiBtb2RlIHdpbGwgZ2VuZXJhdGUgcGF5bG9hZHMgd2l0aCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgcG9zc2libGUgZm9ybWF0czoKKyAgICAgKiAtIHNpbmdsZSBOQUwgdW5pdCBwYWNrZXRzLAorICAgICAqIC0gTkFMIHVuaXRzIGFnZ3JlZ2F0aW9uIFNUQVAtQSAmIFNUQVAtQiBwYWNrZXRzLAorICAgICAqIC0gZnJhZ21lbnRlZCBOQUwgdW5pdCBGVS1BICYgRlUtQiBwYWNrZXRzLgorICAgICAqIFRoaXMgcGFja2V0aXphdGlvbiBtb2RlIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0gyNjRfUEFDS0VUSVpFUl9NT0RFX0lOVEVSTEVBVkVELAorfSBwam1lZGlhX2gyNjRfcGFja2V0aXplcl9tb2RlOworCisKKy8qKgorICogSC4yNjQgcGFja2V0aXplciBzZXR0aW5nLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2gyNjRfcGFja2V0aXplcl9jZmcKK3sKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHBheWxvYWQgbGVuZ3RoLgorICAgICAqIERlZmF1bHQ6IFBKTUVESUFfTUFYX01UVQorICAgICAqLworICAgIGludAltdHU7CisKKyAgICAvKioKKyAgICAgKiBQYWNrZXRpemF0aW9uIG1vZGUuCisgICAgICogRGVmYXVsdDogUEpNRURJQV9IMjY0X1BBQ0tFVElaRVJfTU9ERV9OT05fSU5URVJMRUFWRUQKKyAgICAgKi8KKyAgICBwam1lZGlhX2gyNjRfcGFja2V0aXplcl9tb2RlIG1vZGU7Cit9Citwam1lZGlhX2gyNjRfcGFja2V0aXplcl9jZmc7CisKKworLyoqCisgKiBDcmVhdGUgSC4yNjQgcGFja2V0aXplci4KKyAqCisgKiBAcGFyYW0gcG9vbAkJVGhlIG1lbW9yeSBwb29sLgorICogQHBhcmFtIGNmZwkJUGFja2V0aXplciBzZXR0aW5ncywgaWYgTlVMTCwgZGVmYXVsdCBzZXR0aW5nCisgKgkJCXdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBwX3BrdHoJUG9pbnRlciB0byByZWNlaXZlIHRoZSBwYWNrZXRpemVyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9oMjY0X3BhY2tldGl6ZXJfY3JlYXRlKAorCQkJCSAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJICAgIGNvbnN0IHBqbWVkaWFfaDI2NF9wYWNrZXRpemVyX2NmZyAqY2ZnLAorCQkJCSAgICBwam1lZGlhX2gyNjRfcGFja2V0aXplciAqKnBfcGt0eik7CisKKworLyoqCisgKiBHZW5lcmF0ZSBhbiBSVFAgcGF5bG9hZCBmcm9tIGEgSC4yNjQgcGljdHVyZSBiaXRzdHJlYW0uIE5vdGUgdGhhdCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIGFwcGx5IGluLXBsYWNlIHByb2Nlc3NpbmcsIHNvIHRoZSBiaXRzdHJlYW0gbWF5IGJlIG1vZGlmaWVkCisgKiBkdXJpbmcgdGhlIHBhY2tldGl6YXRpb24uCisgKgorICogQHBhcmFtIHBrdHoJCVRoZSBwYWNrZXRpemVyLgorICogQHBhcmFtIGJpdHMJCVRoZSBwaWN0dXJlIGJpdHN0cmVhbSB0byBiZSBwYWNrZXRpemVkLgorICogQHBhcmFtIGJpdHNfbGVuCVRoZSBsZW5ndGggb2YgdGhlIGJpdHN0cmVhbS4KKyAqIEBwYXJhbSBiaXRzX3BvcwlUaGUgYml0c3RyZWFtIG9mZnNldCB0byBiZSBwYWNrZXRpemVkLgorICogQHBhcmFtIHBheWxvYWQJVGhlIG91dHB1dCBwYXlsb2FkLgorICogQHBhcmFtIHBheWxvYWRfbGVuCVRoZSBvdXRwdXQgcGF5bG9hZCBsZW5ndGguCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2gyNjRfcGFja2V0aXplKHBqbWVkaWFfaDI2NF9wYWNrZXRpemVyICpwa3R6LAorCQkJCQkgICAgcGpfdWludDhfdCAqYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc2l6ZV90IGJpdHNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqYml0c19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3VpbnQ4X3QgKipwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zaXplX3QgKnBheWxvYWRfbGVuKTsKKworCisvKioKKyAqIEFwcGVuZCBhbiBSVFAgcGF5bG9hZCB0byBhbiBILjI2NCBwaWN0dXJlIGJpdHN0cmVhbS4gTm90ZSB0aGF0IGluIGNhc2Ugb2YKKyAqIG5vdGljaW5nIHBhY2tldCBsb3N0LCBhcHBsaWNhdGlvbiBzaG91bGQga2VlcCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aAorICogcGF5bG9hZCBwb2ludGVyIHNldCB0byBOVUxMLCBhcyB0aGUgcGFja2V0aXplciBuZWVkIHRvIHVwZGF0ZSBpdHMgaW50ZXJuYWwKKyAqIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwa3R6CQlUaGUgcGFja2V0aXplci4KKyAqIEBwYXJhbSBwYXlsb2FkCVRoZSBwYXlsb2FkIHRvIGJlIHVucGFja2V0aXplZC4KKyAqIEBwYXJhbSBwYXlsb2FkX2xlbglUaGUgcGF5bG9hZCBsZW5ndGguCisgKiBAcGFyYW0gYml0cwkJVGhlIGJpdHN0cmVhbSBidWZmZXIuCisgKiBAcGFyYW0gYml0c19zaXplCVRoZSBiaXRzdHJlYW0gYnVmZmVyIHNpemUuCisgKiBAcGFyYW0gYml0c19wb3MJVGhlIGJpdHN0cmVhbSBvZmZzZXQgdG8gcHV0IHRoZSB1bnBhY2tldGl6ZWQgcGF5bG9hZAorICoJCQlpbiB0aGUgYml0c3RyZWFtLCB1cG9uIHJldHVybiwgdGhpcyB3aWxsIGJlIHVwZGF0ZWQKKyAqCQkJdG8gdGhlIGxhdGVzdCBvZmZzZXQgYXMgYSByZXN1bHQgb2YgdGhlIHVucGFja2V0aXplZAorICoJCQlwYXlsb2FkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9oMjY0X3VucGFja2V0aXplKHBqbWVkaWFfaDI2NF9wYWNrZXRpemVyICpwa3R6LAorCQkJCQkgICAgICBjb25zdCBwal91aW50OF90ICpwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NpemVfdCAgIHBheWxvYWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3VpbnQ4X3QgKmJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc2l6ZV90ICAgYml0c19sZW4sCisJCQkJCSAgICAgIHVuc2lnbmVkICAgKmJpdHNfcG9zKTsKKworCitQSl9FTkRfREVDTAorCisjZW5kaWYJLyogX19QSk1FRElBX0gyNjRfUEFDS0VUSVpFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lsYmMuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lsYmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJmNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaWxiYy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiAkSWQ6IGlsYmMuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNfSUxCQ19IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDX0lMQkNfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS1jb2RlYy9pbGJjLmgKKyAqIEBicmllZiBpTEJDIGNvZGVjLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3R5cGVzLmg+CisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX0lMQkMgaUxCQyBDb2RlYworICogQGluZ3JvdXAgUEpNRURJQV9DT0RFQ19DT0RFQ1MKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBpTEJDIENvZGVjCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGlMQkMgY29kZWMKKyAqIGZhY3RvcnkgdG8gdGhlIGNvZGVjIG1hbmFnZXIuIEFmdGVyIHRoZSBjb2RlYyBmYWN0b3J5IGhhcyBiZWVuIHJlZ2lzdGVyZWQsCisgKiBhcHBsaWNhdGlvbiBjYW4gdXNlIEByZWYgUEpNRURJQV9DT0RFQyBBUEkgdG8gbWFuaXB1bGF0ZSB0aGUgY29kZWMuCisgKgorICogVGhlIGlMQkMgY29kZWMgaXMgZGV2ZWxvcGVkIGJ5IEdsb2JhbCBJUCBTb2x1dGlvbnMgKEdJUFMpLCBmb3JtZXJseSAKKyAqIEdsb2JhbCBJUCBTb3VuZC4gVGhlIGlMQkMgb2ZmZXJzIGxvdyBiaXRyYXRlIGFuZCBncmFjZWZ1bCBhdWRpbyBxdWFsaXR5IAorICogZGVncmFkYXRpb24gb24gZnJhbWUgbG9zc2VzLgorICoKKyAqIFRoZSBpTEJDIGNvZGVjIHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gc2lnbmFsIHdpdGggc2FtcGxpbmcgcmF0ZSBvZiAKKyAqIDgwMDBIeiBvcGVyYXRpbmcgYXQgdHdvIG1vZGVzOiAyMG1zIGFuZCAzMG1zIGZyYW1lIGxlbmd0aCBtb2RlcywgcmVzdWx0aW5nCisgKiBpbiBiaXRyYXRlcyBvZiAxNS4ya2JwcyBmb3IgMjBtcyBtb2RlIGFuZCAxMy4zM2ticHMgZm9yIDMwbXMgbW9kZS4KKyAqCisgKgorICogXHNlY3Rpb24gY29kZWNfc2V0dGluZyBDb2RlYyBTZXR0aW5ncworICoKKyAqIFxzdWJzZWN0aW9uIGdlbmVyYWxfc2V0dGluZyBHZW5lcmFsIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzZWN0aW9uIHNwZWNpZmljX3NldHRpbmcgQ29kZWMgU3BlY2lmaWMgU2V0dGluZ3MKKyAqCisgKiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBhcHBsaWNhYmxlIGZvciB0aGlzIGNvZGVjLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIG1vZGUgTW9kZQorICoKKyAqIFRoZSBkZWZhdWx0IG1vZGUgc2hvdWxkIGJlIHNldCB1cG9uIGluaXRpYWxpemF0aW9uLCBzZWUKKyAqICNwam1lZGlhX2NvZGVjX2lsYmNfaW5pdCgpLiBBZnRlciB0aGUgY29kZWMgaXMgaW5pdGlhbGl6ZWQsIHRoZSBkZWZhdWx0CisgKiBtb2RlIGNhbiBiZSBtb2RpZmllZCB1c2luZyAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKS4KKyAqCisgKiBJbiAjcGptZWRpYV9jb2RlY19wYXJhbSwgaUxCQyBtb2RlIGNhbiBiZSBzZXQgYnkgc3BlY2lmeWluZyBTRFAKKyAqIGZvcm1hdCBwYXJhbWV0ZXIgIm1vZGUiIGluIHRoZSBTRFAgImE9Zm10cCIgYXR0cmlidXRlIGZvciBkZWNvZGluZworICogZGlyZWN0aW9uLiBWYWxpZCB2YWx1ZXMgYXJlICIyMCIgYW5kICIzMCIgKGZvciAyMG1zIGFuZCAzMG1zIG1vZGUgCisgKiByZXNwZWN0aXZlbHkpLgorICoKKyAqIEhlcmUgaXMgYW4gZXhhbXBsZSB0byBzZXQgdXAgI3BqbWVkaWFfY29kZWNfcGFyYW0gdG8gdXNlIG1vZGUgMjBtczoKKyAqICBcY29kZQorICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisgICAgLi4uCisgICAgLy8gc2V0dGluZyBpTEJDIG1vZGUgaW4gU0RQCisgICAgcGFyYW0uc2V0dGluZy5kZWNfZm10cC5jbnQgPSAxOworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMF0ubmFtZSA9IHBqX3N0cigibW9kZSIpOworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMF0udmFsICA9IHBqX3N0cigiMjAiKTsKKyAgICAuLi4KKyBcZW5kY29kZQorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGlMQkMgY29kZWMgZmFjdG9yeSB0byBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIHBqbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gbW9kZQkgICAgRGVmYXVsdCBkZWNvZGVyIG1vZGUgdG8gYmUgdXNlZC4gVmFsaWQgdmFsdWVzIGFyZQorICoJCSAgICAyMCBhbmQgMzAgbXMuIE5vdGUgdGhhdCBlbmNvZGVyIG1vZGUgZm9sbG93cyB0aGUKKyAqCQkgICAgc2V0dGluZyBhZHZlcnRpc2VkIGluIHRoZSByZW1vdGUncyBTRFAuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX2lsYmNfaW5pdCggcGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSAgICAgIGludCBtb2RlICk7CisKKworCisvKioKKyAqIFVucmVnaXN0ZXIgaUxCQyBjb2RlYyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludCBhbmQgZGVpbml0aWFsaXplCisgKiB0aGUgaUxCQyBjb2RlYyBsaWJyYXJ5LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19pbGJjX2RlaW5pdCh2b2lkKTsKKworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX0lMQkNfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lwcF9jb2RlY3MuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL2lwcF9jb2RlY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ0MzY3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvaXBwX2NvZGVjcy5oCkBAIC0wLDAgKzEsMzIyIEBACisvKiAkSWQ6IGlwcF9jb2RlY3MuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNTX0lQUF9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDU19JUFBfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS1jb2RlYy9pcHBfY29kZWNzLmgKKyAqIEBicmllZiBJUFAgY29kZWNzIHdyYXBwZXIuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfSVBQX0NPREVDIElQUCBDb2RlY3MKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgSVBQIGNvZGVjcworICogQHsKKyAqCisgKiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlciBJUFAgY29kZWMKKyAqIGZhY3RvcnkgdG8gdGhlIGNvZGVjIG1hbmFnZXIuIEFmdGVyIHRoZSBjb2RlYyBmYWN0b3J5IGhhcyBiZWVuIHJlZ2lzdGVyZWQsCisgKiBhcHBsaWNhdGlvbiBjYW4gdXNlIEByZWYgUEpNRURJQV9DT0RFQyBBUEkgdG8gbWFuaXB1bGF0ZSB0aGUgY29kZWMuCisgKgorICogVGhpcyBjb2RlYyBmYWN0b3J5IGNvbnRhaW5zIHZhcmlvdXMgY29kZWNzLCBpLmU6IEcuNzI5LCBHLjcyMy4xLCBHLjcyNiwgCisgKiBHLjcyOCwgRy43MjIuMSwgQU1SLCBhbmQgQU1SLVdCLgorICoKKyAqCisgKiBcc2VjdGlvbiBwam1lZGlhX2NvZGVjX2lwcF9nNzI5IElQUCBHLjcyOQorICoKKyAqIElQUCBHLjcyOSBpcyBjb21wbGlhbnQgd2l0aCBJVFUtVCBHLjcyOSBhbmQgQW5uZXhlcyBBLCBCLCBDLCBDKywgRCwgCisgKiBFLCBJIHNwZWNpZmljYXRpb25zLiBIb3dldmVyLCBjdXJyZW50bHkgdGhlIHBqbWVkaWEgaW1wbGVtZW50YXRpb24gaXMKKyAqIHVzaW5nIEFubmV4ZXMgQSBhbmQgQiBvbmx5LgorICoKKyAqIElQUCBHLjcyOSBzdXBwb3J0cyAxNi1iaXQgUENNIGF1ZGlvIHNpZ25hbCB3aXRoIHNhbXBsaW5nIHJhdGUgODAwMEh6LCAKKyAqIGZyYW1lIGxlbmd0aCAxMG1zLCBhbmQgcmVzdWx0aW5nIGluIGJpdHJhdGUgODAwMGJwcyAoYW5uZXhlcyBEIGFuZCBFCisgKiBpbnRyb2R1Y2UgYml0cmF0ZXMgNjQwMGJwcyBhbmQgMTE4MDBicHMpLgorICoKKyAqIFxzdWJzZWN0aW9uIGNvZGVjX3NldHRpbmcgQ29kZWMgU2V0dGluZ3MKKyAqCisgKiBHZW5lcmFsIGNvZGVjIHNldHRpbmdzIGZvciB0aGlzIGNvZGVjIHN1Y2ggYXMgVkFEIGFuZCBQTEMgY2FuIGJlIAorICogbWFuaXB1bGF0ZWQgdGhyb3VnaCB0aGUgPHR0PnNldHRpbmc8L3R0PiBmaWVsZCBpbiAjcGptZWRpYV9jb2RlY19wYXJhbS4gCisgKiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICNwam1lZGlhX2NvZGVjX3BhcmFtIGZvciBtb3JlIGluZm8uCisgKgorICogTm90ZSB0aGF0IEcuNzI5IFZBRCBzdGF0dXMgc2hvdWxkIGJlIHNpZ25hbGxlZCBpbiBTRFAsIHNlZSBtb3JlCisgKiBkZXNjcmlwdGlvbiBiZWxvdy4KKyAqCisgKiBcc3Vic3Vic2VjdGlvbiBhbm5leGIgQW5uZXggQgorICoKKyAqIFRoZSBjYXBhYmlsaXR5IG9mIFZBRC9EVFggaXMgc3BlY2lmaWVkIGluIEFubmV4IEIuCisgKgorICogQnkgZGVmYXVsdCwgQW5uZXggQiBpcyBlbmFibGVkLiBUaGlzIGRlZmF1bHQgc2V0dGluZyBvZiBBbm5leCBCIGNhbiAKKyAqIGJlIG1vZGlmaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSgpLgorICoKKyAqIEluICNwam1lZGlhX2NvZGVjX3BhcmFtLCBBbm5leCBCIGlzIGNvbmZpZ3VyZWQgdmlhIFZBRCBzZXR0aW5nIGFuZAorICogZm9ybWF0IHBhcmFtZXRlciAiYW5uZXhiIiBpbiB0aGUgU0RQICJhPWZtdHAiIGF0dHJpYnV0ZSBpbgorICogZGVjb2RpbmcgZm10cCBmaWVsZC4gVmFsaWQgdmFsdWVzIGFyZSAieWVzIiBhbmQgIm5vIiwKKyAqIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZhdWx0IGlzICJ5ZXMiLiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQKKyAqIGluIHRoZSBTRFAsIHRoZSB2YWx1ZSB3aWxsIGJlICJ5ZXMiIChSRkMgNDg1NiBTZWN0aW9uIDIuMS45KS4KKyAqCisgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgbW9kaWZ5aW5nIGRlZmF1bHQgc2V0dGluZyBvZiBBbm5leCBCIHRvCisgKiBiZSBkaXNhYmxlZCB1c2luZyAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKToKKyBcY29kZQorICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisKKyAgICBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyAgICAuLi4KKyAgICAvLyBTZXQgVkFECisgICAgcGFyYW0uc2V0dGluZy52YWQgPSAwOworICAgIC8vIFNldCBTRFAgZm9ybWF0IHBhcmFtZXRlcgorICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAuY250ID0gMTsKKyAgICBwYXJhbS5zZXR0aW5nLmRlY19mbXRwLnBhcmFtWzBdLm5hbWUgPSBwal9zdHIoImFubmV4YiIpOworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMF0udmFsICA9IHBqX3N0cigibm8iKTsKKyAgICAuLi4KKyAgICBwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyBcZW5kY29kZQorICoKKyAqIFxub3RlCisgKiBUaGUgZGlmZmVyZW5jZSBvZiBBbm5leCBCIHN0YXR1cyBpbiBTRFAgb2ZmZXIvYW5zd2VyIG1heSBiZSBjb25zaWRlcmVkIGFzIAorICogaW5jb21wYXRpYmxlIGNvZGVjIGluIFNEUCBuZWdvdGlhdGlvbi4KKyAqCisgKiAKKyAqIFxzZWN0aW9uIHBqbWVkaWFfY29kZWNfaXBwX2c3MjMxIElQUCBHLjcyMy4xCisgKgorICogSVBQIEcuNzIzLjEgc3BlZWNoIGNvZGVjIGlzIGNvbXBsaWFudCB3aXRoIElUVS1UIEcuNzIzLjEgYW5kIEFubmV4IEEKKyAqIHNwZWNpZmljYXRpb25zLgorICoKKyAqIElQUCBHLjcyMy4xIHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gc2lnbmFsIHdpdGggc2FtcGxpbmcgcmF0ZSA4MDAwSHosIAorICogZnJhbWUgbGVuZ3RoIDMwbXMsIGFuZCByZXN1bHRpbmcgaW4gYml0cmF0ZXMgNTMwMGJwcyBhbmQgNjMwMGJwcy4KKyAqCisgKiBCeSBkZWZhdWx0LCBwam1lZGlhIGltcGxlbWVudGF0aW9uIHVzZXMgZW5jb2RpbmcgYml0cmF0ZSBvZiA2MzAwYnBzLgorICogVGhlIGJpdHJhdGUgaXMgc2lnbmFsbGVkIGluLWJhbmQgaW4gRy43MjMuMSBmcmFtZXMgYW5kIGludGVyb3BlcmFibGUuCisgKgorICogXHN1YnNlY3Rpb24gY29kZWNfc2V0dGluZyBDb2RlYyBTZXR0aW5ncworICoKKyAqIEdlbmVyYWwgY29kZWMgc2V0dGluZ3MgZm9yIHRoaXMgY29kZWMgc3VjaCBhcyBWQUQgYW5kIFBMQyBjYW4gYmUgCisgKiBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSA8dHQ+c2V0dGluZzwvdHQ+IGZpZWxkIGluICNwam1lZGlhX2NvZGVjX3BhcmFtLiAKKyAqIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgI3BqbWVkaWFfY29kZWNfcGFyYW0gZm9yIG1vcmUgaW5mby4KKyAqCisgKgorICogXHNlY3Rpb24gcGptZWRpYV9jb2RlY19pcHBfZzcyNiBJUFAgRy43MjYKKyAqCisgKiBJUFAgRy43MjYgaXMgY29tcGxpYW50IHdpdGggSVRVLVQgRy43MjYgYW5kIEcuNzI2IEFubmV4IEEgc3BlY2lmaWNhdGlvbnMuCisgKgorICogSVBQIEcuNzI2IHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gc2lnbmFsIHdpdGggc2FtcGxpbmcgcmF0ZSA4MDAwSHosCisgKiAxMG1zIGZyYW1lIGxlbmd0aCBhbmQgcHJvZHVjaW5nIDE2a2JwcywgMjRrYnBzLCAzMmticHMsIDQ4a2JwcyBiaXRyYXRlcy4KKyAqIFRoZSBiaXRyYXRlIGlzIHNwZWNpZmllZCBleHBsaWNpdGx5IGluIGl0cyBlbmNvZGluZyBuYW1lLCBpLmU6IEc3MjYtMTYsCisgKiBHNzI2LTI0LCBHNzI2LTMyLCBHNzI2LTQ4LgorICoKKyAqIFxzdWJzZWN0aW9uIGNvZGVjX3NldHRpbmcgQ29kZWMgU2V0dGluZ3MKKyAqCisgKiBHZW5lcmFsIGNvZGVjIHNldHRpbmdzIGZvciB0aGlzIGNvZGVjIHN1Y2ggYXMgVkFEIGFuZCBQTEMgY2FuIGJlIAorICogbWFuaXB1bGF0ZWQgdGhyb3VnaCB0aGUgPHR0PnNldHRpbmc8L3R0PiBmaWVsZCBpbiAjcGptZWRpYV9jb2RlY19wYXJhbS4gCisgKiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICNwam1lZGlhX2NvZGVjX3BhcmFtIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFxzZWN0aW9uIHBqbWVkaWFfY29kZWNfaXBwX2c3MjggSVBQIEcuNzI4CisgKgorICogSVBQIEcuNzI4IGlzIGNvbXBsaWFudCB3aXRoIElUVS1UIEcuNzI4IHdpdGggSSwgRywgSCBBcHBlbmRpeGVzIAorICogc3BlY2lmaWNhdGlvbnMgZm9yIExvdy1EZWxheSBDRUxQIGNvZGVyLgorICogCisgKiBJUFAgRy43Mjggc3VwcG9ydHMgMTYtYml0IFBDTSBhdWRpbyBzaWduYWwgd2l0aCBzYW1wbGluZyByYXRlIDgwMDBIeiwKKyAqIDIwbXMgZnJhbWUgbGVuZ3RoIGFuZCBwcm9kdWNpbmcgOS42a2JwcywgMTIuOGticHMsIGFuZCAxNmticHMgYml0cmF0ZXMuCisgKgorICogVGhlIHBqbWVkaWEgaW1wbGVtZW50YXRpb24gY3VycmVudGx5IHVzZXMgMTZrYnBzIGJpdHJhdGUgb25seS4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBcc2VjdGlvbiBwam1lZGlhX2NvZGVjX2lwcF9nNzIyMSBJUFAgRy43MjIuMQorICoKKyAqIFRoZSBwam1lZGlhIGltcGxlbWVudGF0aW9uIG9mIElQUCBHLjcyMi4xIHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gCisgKiBzaWduYWwgd2l0aCBzYW1wbGluZyByYXRlIDE2MDAwSHosIDIwbXMgZnJhbWUgbGVuZ3RoIGFuZCBwcm9kdWNpbmcgCisgKiAxNmticHMsIDI0a2JwcywgYW5kIDMya2JwcyBiaXRyYXRlcy4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIGJpdHJhdGUgQml0cmF0ZQorICoKKyAqIFRoZSBjb2RlYyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHN0YW5kYXJkIGJpdHJhdGVzLCBpLmU6CisgKiAyNGticHMgYW5kIDMya2Jwcy4gQm90aCBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICoKKyAqIFxyZW1hcmsKKyAqIFRoZXJlIGlzIGEgZmxhdyBpbiB0aGUgY29kZWMgbWFuYWdlciBhcyBjdXJyZW50bHkgaXQgY291bGQgbm90IAorICogZGlmZmVyZW50aWF0ZSBHLjcyMi4xIGNvZGVjcyBieSBiaXRyYXRlcywgaGVuY2UgaW52b2tpbmcgCisgKiAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKSBtYXkgb25seSBhZmZlY3QgYSBHLjcyMi4xIGNvZGVjCisgKiB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IChvciBmaXJzdCBpbmRleCBmb3VuZCBpbiBjb2RlYyBlbnVtZXJhdGlvbiAKKyAqIHdoZW4gdGhleSBoYXZlIHNhbWUgcHJpb3JpdHkpIGFuZCBpbnZva2luZworICogI3BqbWVkaWFfY29kZWNfbWdyX3NldF9jb2RlY19wcmlvcml0eSgpIHdpbGwgc2V0IHByaW9yaXR5IG9mIGFsbCBHLjcyMi4xCisgKiBjb2RlY3Mgd2l0aCBzYW1wbGluZyByYXRlIGFzIHNwZWNpZmllZC4KKyAqCisgKgorICogXHNlY3Rpb24gcGptZWRpYV9jb2RlY19pcHBfYW1yIElQUCBBTVIKKyAqCisgKiBUaGUgSVBQIEFNUiBpcyBjb21wbGlhbnQgd2l0aCBHU00wNi45MC05NCBzcGVjaWZpY2F0aW9ucyBmb3IgR1NNIEFkYXB0aXZlCisgKiBNdWx0aS1SYXRlIGNvZGVjLgorICoKKyAqIElQUCBBTVIgc3VwcG9ydHMgMTYtYml0IFBDTSBhdWRpbyBzaWduYWwgd2l0aCBzYW1wbGluZyByYXRlIDgwMDBIeiwKKyAqIDIwbXMgZnJhbWUgbGVuZ3RoIGFuZCBwcm9kdWNpbmcgdmFyaW91cyBiaXRyYXRlcyB0aGF0IHJhbmdlcyBmcm9tIDQuNzVrYnBzCisgKiB0byAxMi4ya2Jwcy4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIGJpdHJhdGUgQml0cmF0ZQorICoKKyAqIEJ5IGRlZmF1bHQsIGVuY29kaW5nIGJpdHJhdGUgaXMgNzQwMGJwcy4gVGhpcyBkZWZhdWx0IHNldHRpbmcgY2FuIGJlIAorICogbW9kaWZpZWQgdXNpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkgYnkgc3BlY2lmeWluZyAKKyAqIHByZWZlcmVkIEFNUiBiaXRyYXRlIGluIGZpZWxkIDx0dD5pbmZvOjphdmdfYnBzPC90dD4gb2YgCisgKiAjcGptZWRpYV9jb2RlY19wYXJhbS4gVmFsaWQgYml0cmF0ZXMgY291bGQgYmUgc2VlbiBpbiAKKyAqICNwam1lZGlhX2NvZGVjX2Ftcm5iX2JpdHJhdGVzLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIHBheWxvYWRfZm9ybWF0IFBheWxvYWQgRm9ybWF0CisgKgorICogVGhlcmUgYXJlIHR3byBBTVIgcGF5bG9hZCBmb3JtYXQgdHlwZXMsIGJhbmR3aWR0aC1lZmZpY2llbnQgYW5kCisgKiBvY3RldC1hbGlnbmVkLiBEZWZhdWx0IHNldHRpbmcgaXMgdXNpbmcgb2N0ZXQtYWxpZ25lZC4gVGhpcyBkZWZhdWx0IHBheWxvYWQKKyAqIGZvcm1hdCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkuCisgKgorICogSW4gI3BqbWVkaWFfY29kZWNfcGFyYW0sIHBheWxvYWQgZm9ybWF0IGNhbiBiZSBzZXQgYnkgc3BlY2lmeWluZyBTRFAgCisgKiBmb3JtYXQgcGFyYW1ldGVycyAib2N0ZXQtYWxpZ24iIGluIHRoZSBTRFAgImE9Zm10cCIgYXR0cmlidXRlIGZvciAKKyAqIGRlY29kaW5nIGRpcmVjdGlvbi4gVmFsaWQgdmFsdWVzIGFyZSAiMCIgKGZvciBiYW5kd2lkdGggZWZmaWNpZW50IG1vZGUpCisgKiBhbmQgIjEiIChmb3Igb2N0ZXQtYWxpZ25lZCBtb2RlKS4KKyAqCisgKiBcc3Vic3Vic2VjdGlvbiBtb2RlX3NldCBNb2RlLVNldAorICogCisgKiBNb2RlLXNldCBpcyB1c2VkIGZvciByZXN0cmljdGluZyBBTVIgbW9kZXMgaW4gZGVjb2RpbmcgZGlyZWN0aW9uLgorICoKKyAqIEJ5IGRlZmF1bHQsIG5vIG1vZGUtc2V0IHJlc3RyaWN0aW9uIGFwcGxpZWQuIFRoaXMgZGVmYXVsdCBzZXR0aW5nIGNhbiBiZSAKKyAqIGJlIG1vZGlmaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSgpLgorICoKKyAqIEluICNwam1lZGlhX2NvZGVjX3BhcmFtLCBtb2RlLXNldCBjb3VsZCBiZSBzcGVjaWZpZWQgdmlhIGZvcm1hdCBwYXJhbWV0ZXJzCisgKiAibW9kZS1zZXQiIGluIHRoZSBTRFAgImE9Zm10cCIgYXR0cmlidXRlIGZvciBkZWNvZGluZyBkaXJlY3Rpb24uIFZhbGlkIAorICogdmFsdWUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtb2RlcyBmcm9tIHRoZSBzZXQgMCAtIDcsIGUuZzogCisgKiAiNCw1LDYsNyIuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgbm8gbW9kZS1zZXQgcmVzdHJpY3Rpb25zIGFwcGxpZWQuCisgKgorICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIG1vZGlmeWluZyBBTVIgZGVmYXVsdCBjb2RlYyBwYXJhbToKKyBcY29kZQorICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisKKyAgICBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyAgICAuLi4KKyAgICAvLyBzZXQgZGVmYXVsdCBlbmNvZGluZyBiaXRyYXRlIHRvIHRoZSBoaWdoZXN0IDEyLjJrYnBzCisgICAgcGFyYW0uaW5mby5hdmdfYnBzID0gMTIyMDA7CisKKyAgICAvLyByZXN0cmljdCBkZWNvZGluZyBiaXRyYXRlIHRvIDEwLjJrYnBzIGFuZCAxMi4ya2JwcyBvbmx5CisgICAgcGFyYW0uc2V0dGluZy5kZWNfZm10cC5wYXJhbVswXS5uYW1lID0gcGpfc3RyKCJtb2RlLXNldCIpOworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMF0udmFsICA9IHBqX3N0cigiNiw3Iik7CisKKyAgICAvLyBhbHNvIHNldCB0byB1c2UgYmFuZHdpZHRoLWVmZmljaWVudCBwYXlsb2FkIGZvcm1hdAorICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMV0ubmFtZSA9IHBqX3N0cigib2N0ZXQtYWxpZ24iKTsKKyAgICBwYXJhbS5zZXR0aW5nLmRlY19mbXRwLnBhcmFtWzFdLnZhbCAgPSBwal9zdHIoIjAiKTsKKworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAuY250ID0gMjsKKyAgICAuLi4KKyAgICBwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyBcZW5kY29kZQorICogCisgKgorICogXHNlY3Rpb24gcGptZWRpYV9jb2RlY19pcHBfYW1yd2IgSVBQIEFNUi1XQgorICoKKyAqIFRoZSBJUFAgQU1SLVdCIGlzIGNvbXBsaWFudCB3aXRoIDNHUFAgVFMgMjYuMTkwLTE5MiwgMTk0LCAyMDEgCisgKiBzcGVjaWZpY2F0aW9ucyBmb3IgQWRhcHRpdmUgTXVsdGktUmF0ZSBXaWRlQmFuZCBjb2RlYy4KKyAqCisgKiBJUFAgQU1SLVdCIHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gc2lnbmFsIHdpdGggc2FtcGxpbmcgcmF0ZSAxNjAwMEh6LAorICogMjBtcyBmcmFtZSBsZW5ndGggYW5kIHByb2R1Y2luZyB2YXJpb3VzIGJpdHJhdGVzLiBWYWxpZCBiaXRyYXRlcyBjb3VsZCBiZQorICogc2VlbiBpbiAjcGptZWRpYV9jb2RlY19hbXJ3Yl9iaXRyYXRlcy4gVGhlIHBqbWVkaWEgaW1wbGVtZW50YXRpb24gZGVmYXVsdAorICogYml0cmF0ZSBpcyAxNTg1MGJwcy4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIGJpdHJhdGUgQml0cmF0ZQorICoKKyAqIEJ5IGRlZmF1bHQsIGVuY29kaW5nIGJpdHJhdGUgaXMgMTU4NTBicHMuIFRoaXMgZGVmYXVsdCBzZXR0aW5nIGNhbiBiZSAKKyAqIG1vZGlmaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSgpIGJ5IHNwZWNpZnlpbmcgCisgKiBwcmVmZXJlZCBBTVIgYml0cmF0ZSBpbiBmaWVsZCA8dHQ+aW5mbzo6YXZnX2JwczwvdHQ+IG9mIAorICogI3BqbWVkaWFfY29kZWNfcGFyYW0uCisgKgorICogXHN1YnN1YnNlY3Rpb24gcGF5bG9hZF9mb3JtYXQgUGF5bG9hZCBGb3JtYXQKKyAqCisgKiBUaGVyZSBhcmUgdHdvIEFNUiBwYXlsb2FkIGZvcm1hdCB0eXBlcywgYmFuZHdpZHRoLWVmZmljaWVudCBhbmQKKyAqIG9jdGV0LWFsaWduZWQuIERlZmF1bHQgc2V0dGluZyBpcyB1c2luZyBvY3RldC1hbGlnbmVkLiBUaGlzIGRlZmF1bHQgcGF5bG9hZAorICogZm9ybWF0IGNhbiBiZSBtb2RpZmllZCB1c2luZyAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKS4KKyAqCisgKiBJbiAjcGptZWRpYV9jb2RlY19wYXJhbSwgcGF5bG9hZCBmb3JtYXQgY2FuIGJlIHNldCBieSBzcGVjaWZ5aW5nIFNEUCAKKyAqIGZvcm1hdCBwYXJhbWV0ZXJzICJvY3RldC1hbGlnbiIgaW4gdGhlIFNEUCAiYT1mbXRwIiBhdHRyaWJ1dGUgZm9yIAorICogZGVjb2RpbmcgZGlyZWN0aW9uLiBWYWxpZCB2YWx1ZXMgYXJlICIwIiAoZm9yIGJhbmR3aWR0aCBlZmZpY2llbnQgbW9kZSkKKyAqIGFuZCAiMSIgKGZvciBvY3RldC1hbGlnbmVkIG1vZGUpLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIG1vZGVfc2V0IE1vZGUtU2V0CisgKiAKKyAqIE1vZGUtc2V0IGlzIHVzZWQgZm9yIHJlc3RyaWN0aW5nIEFNUiBtb2RlcyBpbiBkZWNvZGluZyBkaXJlY3Rpb24uCisgKgorICogQnkgZGVmYXVsdCwgbm8gbW9kZS1zZXQgcmVzdHJpY3Rpb24gYXBwbGllZC4gVGhpcyBkZWZhdWx0IHNldHRpbmcgY2FuIGJlIAorICogYmUgbW9kaWZpZWQgdXNpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkuCisgKgorICogSW4gI3BqbWVkaWFfY29kZWNfcGFyYW0sIG1vZGUtc2V0IGNvdWxkIGJlIHNwZWNpZmllZCB2aWEgZm9ybWF0IHBhcmFtZXRlcnMKKyAqICJtb2RlLXNldCIgaW4gdGhlIFNEUCAiYT1mbXRwIiBhdHRyaWJ1dGUgZm9yIGRlY29kaW5nIGRpcmVjdGlvbi4gVmFsaWQgCisgKiB2YWx1ZSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vZGVzIGZyb20gdGhlIHNldCAwIC0gNywgZS5nOiAKKyAqICI0LDUsNiw3Ii4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBubyBtb2RlLXNldCByZXN0cmljdGlvbnMgYXBwbGllZC4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBJUFAgY29kZWNzIGZhY3RvcnkgdG8gcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcGFyYW0gZW5kcHQJICAgIFRoZSBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19pcHBfaW5pdCggcGptZWRpYV9lbmRwdCAqZW5kcHQgKTsKKworCisvKioKKyAqIFVucmVnaXN0ZXIgSVBQIGNvZGVjcyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludCBhbmQgZGVpbml0aWFsaXplCisgKiB0aGUgSVBQIGNvZGVjcyBsaWJyYXJ5LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19pcHBfZGVpbml0KHZvaWQpOworCisKK1BKX0VORF9ERUNMCisKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ERUNTX0lQUF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvbDE2LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9sMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGI1MGQwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvbDE2LmgKQEAgLTAsMCArMSw4MSBAQAorLyogJElkOiBsMTYuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNfTDE2X0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfTDE2X0hfXworCisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy90eXBlcy5oPgorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX0wxNiBMMTYgQ29kZWMgRmFtaWx5CisgKiBAaW5ncm91cCBQSk1FRElBX0NPREVDX0NPREVDUworICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIFBDTS8xNmJpdC9saW5lYXIgY29kZWNzCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEwxNiBjb2RlYworICogZmFjdG9yeSB0byB0aGUgY29kZWMgbWFuYWdlci4gQWZ0ZXIgdGhlIGNvZGVjIGZhY3RvcnkgaGFzIGJlZW4gcmVnaXN0ZXJlZCwKKyAqIGFwcGxpY2F0aW9uIGNhbiB1c2UgQHJlZiBQSk1FRElBX0NPREVDIEFQSSB0byBtYW5pcHVsYXRlIHRoZSBjb2RlYy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIEwxNiBjb2RlYyBmYWN0b3J5IHJlZ2lzdGVycyBzZXZlcmFsIChhYm91dCBmb3VydGVlbiEpIAorICogTDE2IGNvZGVjIHR5cGVzIHRvIGNvZGVjIG1hbmFnZXIgKGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgY2xvY2sKKyAqIHJhdGUgYW5kIG51bWJlciBvZiBjaGFubmVscykuCisgKgorICogXHNlY3Rpb24gY29kZWNfc2V0dGluZyBDb2RlYyBTZXR0aW5ncworICoKKyAqIFxzdWJzZWN0aW9uIGdlbmVyYWxfc2V0dGluZyBHZW5lcmFsIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzZWN0aW9uIHNwZWNpZmljX3NldHRpbmcgQ29kZWMgU3BlY2lmaWMgU2V0dGluZ3MKKyAqCisgKiBDdXJyZW50bHkgbm9uZS4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBMMTYgY29kZWMgZmFjdG9yeSB0byBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIHBqbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gb3B0aW9ucyAgIE11c3QgYmUgemVybyBmb3Igbm93LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19sMTZfaW5pdCggcGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSAgICAgdW5zaWduZWQgb3B0aW9ucyk7CisKKworCisvKioKKyAqIFVucmVnaXN0ZXIgTDE2IGNvZGVjIGZhY3RvcnkgZnJvbSBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19sMTZfZGVpbml0KHZvaWQpOworCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ19MMTZfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL29wZW5jb3JlX2Ftci5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvb3BlbmNvcmVfYW1yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MDQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL29wZW5jb3JlX2Ftci5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAkSWQ6IG9wZW5jb3JlX2Ftci5oIDQzMzUgMjAxMy0wMS0yOSAwODowOToxNVogbWluZyAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgRGFuIEFycmhlbml1cyA8ZGFuQGtleXN0cmVhbS5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX09QRU5DT1JFX0FNUl9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPREVDX09QRU5DT1JFX0FNUl9IX18KKworI2luY2x1ZGUgPHBqbWVkaWEtY29kZWMvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfT0NfQU1SIE9wZW5DT1JFIEFNUiBDb2RlYworICogQGluZ3JvdXAgUEpNRURJQV9DT0RFQ19DT0RFQ1MKKyAqIEBicmllZiBBTVJDb2RlYyB3cmFwcGVyIGZvciBPcGVuQ09SRSBBTVIgY29kZWMKKyAqIEB7CisgKi8KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIEJpdG1hc2sgb3B0aW9ucyB0byBiZSBwYXNzZWQgZHVyaW5nIEFNUiBjb2RlYyBmYWN0b3J5IGluaXRpYWxpemF0aW9uLgorICovCitlbnVtIHBqbWVkaWFfYW1yX29wdGlvbnMKK3sKKyAgICBQSk1FRElBX0FNUl9OT19OQgkgICAgPSAxLCAgICAvKio8IERpc2FibGUgbmFycm93YmFuZCBtb2RlLgkqLworICAgIFBKTUVESUFfQU1SX05PX1dCCSAgICA9IDIsICAgIC8qKjwgRGlzYWJsZSB3aWRlYmFuZCBtb2RlLgkJKi8KK307CisKKy8qKgorICogU2V0dGluZ3MuIFVzZSAjcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJuYi93Yl9zZXRfY29uZmlnKCkgdG8KKyAqIGFjdGl2YXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2NvZGVjX2Ftcl9jb25maWcKK3sKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgdG8gdXNlIG9jdGVudCBhbGlnbi4KKyAgICAgKi8KKyAgICBwal9ib29sX3Qgb2N0ZXRfYWxpZ247CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJpdHJhdGUuCisgICAgICovCisgICAgdW5zaWduZWQgYml0cmF0ZTsKKworfSBwam1lZGlhX2NvZGVjX2Ftcl9jb25maWc7CisKK3R5cGVkZWYgcGptZWRpYV9jb2RlY19hbXJfY29uZmlnIHBqbWVkaWFfY29kZWNfYW1ybmJfY29uZmlnOwordHlwZWRlZiBwam1lZGlhX2NvZGVjX2Ftcl9jb25maWcgcGptZWRpYV9jb2RlY19hbXJ3Yl9jb25maWc7CisKKy8qKgorICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgQU1SIGNvZGVjIGZhY3RvcnkgdG8gcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcGFyYW0gZW5kcHQgICAgIFRoZSBwam1lZGlhIGVuZHBvaW50LgorICogQHBhcmFtIG9wdGlvbnMgICBCaXRtYXNrIG9mIHBqbWVkaWFfYW1yX29wdGlvbnMgKGRlZmF1bHQ9MCkuCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfb3BlbmNvcmVfYW1yX2luaXQocGptZWRpYV9lbmRwdCogZW5kcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG9wdGlvbnMpOworCisvKioKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEFNUiBjb2RlYyBmYWN0b3J5IHVzaW5nIGRlZmF1bHQgc2V0dGluZ3MgdG8KKyAqIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVuZHB0IFRoZSBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4JUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJfaW5pdF9kZWZhdWx0KHBqbWVkaWFfZW5kcHQqIGVuZHB0KTsKKworLyoqCisgKiBVbnJlZ2lzdGVyIEFNUiBjb2RlYyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludCBhbmQgZGVpbml0aWFsaXplCisgKiB0aGUgT3BlbkNPUkUgY29kZWMgbGlicmFyeS4KKyAqCisgKiBAcmV0dXJuCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJfZGVpbml0KHZvaWQpOworCisvKioKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEFNUi1OQiBjb2RlYyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuIENhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgQU1SIGNvZGVjIGZhY3Rvcnkgd2l0aG91dAorICogdGhlIHdpZGViYW5kIG1vZGUgKGkuZS4gaXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgKiAjcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJfaW5pdCgpIHdpdGggUEpNRURJQV9BTVJfTk9fV0IpLiBBcHBsaWNhdGlvbgorICogc2hvdWxkIGNhbGwgI3BqbWVkaWFfY29kZWNfb3BlbmNvcmVfYW1yX2luaXQoKSBpbnN0ZWFkIGlmIHdpc2hpbmcgdG8gdXNlCisgKiBib3RoIG1vZGVzLgorICoKKyAqIEBwYXJhbSBlbmRwdAlUaGUgcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJuYl9pbml0KHBqbWVkaWFfZW5kcHQqIGVuZHB0KTsKKworLyoqCisgKiBVbnJlZ2lzdGVyIEFNUi1OQiBjb2RlYyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludCBhbmQgZGVpbml0aWFsaXplCisgKiB0aGUgT3BlbkNPUkUgY29kZWMgbGlicmFyeS4KKyAqCisgKiBAcmV0dXJuCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJuYl9kZWluaXQodm9pZCk7CisKKworLyoqCisgKiBTZXQgQU1SLU5CIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIGNmZwlUaGUgc2V0dGluZ3M7CisgKgorICogQHJldHVybglQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfb3BlbmNvcmVfYW1ybmJfc2V0X2NvbmZpZygKKwkJCQljb25zdCBwam1lZGlhX2NvZGVjX2Ftcm5iX2NvbmZpZyogY2ZnKTsKKworCisvKioKKyAqIFNldCBBTVItV0IgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gY2ZnCVRoZSBzZXR0aW5nczsKKyAqCisgKiBAcmV0dXJuCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19vcGVuY29yZV9hbXJ3Yl9zZXRfY29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfYW1yd2JfY29uZmlnKiBjZmcpOworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX09QRU5DT1JFX0FNUk5CX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9wYXNzdGhyb3VnaC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvcGFzc3Rocm91Z2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzVhZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtY29kZWMvcGFzc3Rocm91Z2guaApAQCAtMCwwICsxLDI3NyBAQAorLyogJElkOiBwYXNzdGhyb3VnaC5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ1NfUEFTU1RIUk9VR0hfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9DT0RFQ1NfUEFTU1RIUk9VR0hfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS1jb2RlYy9wYXNzdGhyb3VnaC5oCisgKiBAYnJpZWYgUGFzc3Rocm91Z2ggY29kZWNzLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3R5cGVzLmg+CisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1BBU1NUSFJPVUdIX0NPREVDIFBhc3N0aHJvdWdoIENvZGVjcworICogQGluZ3JvdXAgUEpNRURJQV9DT0RFQ19DT0RFQ1MKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBwYXNzdGhyb3VnaCBjb2RlY3MKKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmdW5jdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgcGFzc3Rocm91Z2ggCisgKiBjb2RlY3MgZmFjdG9yeSB0byB0aGUgY29kZWMgbWFuYWdlci4gQWZ0ZXIgdGhlIGNvZGVjIGZhY3RvcnkgaGFzIGJlZW4gCisgKiByZWdpc3RlcmVkLCBhcHBsaWNhdGlvbiBjYW4gdXNlIEByZWYgUEpNRURJQV9DT0RFQyBBUEkgdG8gbWFuaXB1bGF0ZSAKKyAqIHRoZSBjb2RlYy4KKyAqCisgKiBQYXNzdGhyb3VnaCBjb2RlY3MgYXJlIGNvZGVjcyB3cmFwcGVyIHRoYXQgZG9lcyBOT1QgcGVyZm9ybSBlbmNvZGluZyAKKyAqIG9yIGRlY29kaW5nLCBpdCBqdXN0IFBBQ0sgYW5kIFBBUlNFIGVuY29kZWQgYXVkaW8gZGF0YSBmcm9tL2ludG8gUlRQIAorICogcGF5bG9hZC4gVGhpcyB3aWxsIGFjY29tb2RhdGUgcGptZWRpYSBwb3J0cyB3aGljaCB3b3JrIHdpdGggZW5jb2RlZAorICogYXVkaW8gZGF0YSwgZS5nOiBlbmNvZGVkIGF1ZGlvIGZpbGVzLCBzb3VuZCBkZXZpY2Ugd2l0aCBjYXBhYmlsaXR5CisgKiBvZiBwbGF5aW5nL3JlY29yZGluZyBlbmNvZGVkIGF1ZGlvIGRhdGEuCisgKgorICogVGhpcyBjb2RlYyBmYWN0b3J5IGNvbnRhaW5zIHZhcmlvdXMgY29kZWNzLCBpLmU6IEcuNzI5LCBpTEJDLAorICogQU1SLCBhbmQgRy43MTEuCisgKgorICoKKyAqIFxzZWN0aW9uIHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfZzcyOSBQYXNzdGhyb3VnaCBHLjcyOQorICoKKyAqIEcuNzI5IHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gc2lnbmFsIHdpdGggc2FtcGxpbmcgcmF0ZSA4MDAwSHosIAorICogZnJhbWUgbGVuZ3RoIDEwbXMsIGFuZCByZXN1bHRpbmcgaW4gYml0cmF0ZSA4MDAwYnBzLgorICoKKyAqIFxzdWJzZWN0aW9uIGNvZGVjX3NldHRpbmcgQ29kZWMgU2V0dGluZ3MKKyAqCisgKiBHZW5lcmFsIGNvZGVjIHNldHRpbmdzIGZvciB0aGlzIGNvZGVjIHN1Y2ggYXMgVkFEIGFuZCBQTEMgY2FuIGJlIAorICogbWFuaXB1bGF0ZWQgdGhyb3VnaCB0aGUgPHR0PnNldHRpbmc8L3R0PiBmaWVsZCBpbiAjcGptZWRpYV9jb2RlY19wYXJhbS4gCisgKiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mICNwam1lZGlhX2NvZGVjX3BhcmFtIGZvciBtb3JlIGluZm8uCisgKgorICogTm90ZSB0aGF0IEcuNzI5IFZBRCBzdGF0dXMgc2hvdWxkIGJlIHNpZ25hbGxlZCBpbiBTRFAsIHNlZSBtb3JlCisgKiBkZXNjcmlwdGlvbiBiZWxvdy4KKyAqCisgKiBcc3Vic3Vic2VjdGlvbiBhbm5leGIgQW5uZXggQgorICoKKyAqIFRoZSBjYXBhYmlsaXR5IG9mIFZBRC9EVFggaXMgc3BlY2lmaWVkIGluIEFubmV4IEIuCisgKgorICogQnkgZGVmYXVsdCwgQW5uZXggQiBpcyBlbmFibGVkLiBUaGlzIGRlZmF1bHQgc2V0dGluZyBvZiBBbm5leCBCIGNhbiAKKyAqIGJlIG1vZGlmaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSgpLgorICoKKyAqIEluICNwam1lZGlhX2NvZGVjX3BhcmFtLCBBbm5leCBCIGlzIGNvbmZpZ3VyZWQgdmlhIFZBRCBzZXR0aW5nIGFuZAorICogZm9ybWF0IHBhcmFtZXRlciAiYW5uZXhiIiBpbiB0aGUgU0RQICJhPWZtdHAiIGF0dHJpYnV0ZSBpbgorICogZGVjb2RpbmcgZm10cCBmaWVsZC4gVmFsaWQgdmFsdWVzIGFyZSAieWVzIiBhbmQgIm5vIiwKKyAqIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZhdWx0IGlzICJ5ZXMiLiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQKKyAqIGluIHRoZSBTRFAsIHRoZSB2YWx1ZSB3aWxsIGJlICJ5ZXMiIChSRkMgNDg1NiBTZWN0aW9uIDIuMS45KS4KKyAqCisgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgbW9kaWZ5aW5nIGRlZmF1bHQgc2V0dGluZyBvZiBBbm5leCBCIHRvCisgKiBiZSBkaXNhYmxlZCB1c2luZyAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKToKKyBcY29kZQorICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisKKyAgICBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyAgICAuLi4KKyAgICAvLyBTZXQgVkFECisgICAgcGFyYW0uc2V0dGluZy52YWQgPSAwOworICAgIC8vIFNldCBTRFAgZm9ybWF0IHBhcmFtZXRlcgorICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAuY250ID0gMTsKKyAgICBwYXJhbS5zZXR0aW5nLmRlY19mbXRwLnBhcmFtWzBdLm5hbWUgPSBwal9zdHIoImFubmV4YiIpOworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMF0udmFsICA9IHBqX3N0cigibm8iKTsKKyAgICAuLi4KKyAgICBwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyBcZW5kY29kZQorICoKKyAqIFxub3RlCisgKiBUaGUgZGlmZmVyZW5jZSBvZiBBbm5leCBCIHN0YXR1cyBpbiBTRFAgb2ZmZXIvYW5zd2VyIG1heSBiZSBjb25zaWRlcmVkIGFzIAorICogaW5jb21wYXRpYmxlIGNvZGVjIGluIFNEUCBuZWdvdGlhdGlvbi4KKyAqCisgKiAKKyAqIFxzZWN0aW9uIHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfaWxiYyBQYXNzdGhyb3VnaCBpTEJDCisgKgorICogVGhlIGlMQkMgY29kZWMgaXMgZGV2ZWxvcGVkIGJ5IEdsb2JhbCBJUCBTb2x1dGlvbnMgKEdJUFMpLCBmb3JtZXJseSAKKyAqIEdsb2JhbCBJUCBTb3VuZC4gVGhlIGlMQkMgb2ZmZXJzIGxvdyBiaXRyYXRlIGFuZCBncmFjZWZ1bCBhdWRpbyBxdWFsaXR5IAorICogZGVncmFkYXRpb24gb24gZnJhbWUgbG9zc2VzLgorICoKKyAqIFRoZSBpTEJDIGNvZGVjIHN1cHBvcnRzIDE2LWJpdCBQQ00gYXVkaW8gc2lnbmFsIHdpdGggc2FtcGxpbmcgcmF0ZSBvZiAKKyAqIDgwMDBIeiBvcGVyYXRpbmcgYXQgdHdvIG1vZGVzOiAyMG1zIGFuZCAzMG1zIGZyYW1lIGxlbmd0aCBtb2RlcywgcmVzdWx0aW5nCisgKiBpbiBiaXRyYXRlcyBvZiAxNS4ya2JwcyBmb3IgMjBtcyBtb2RlIGFuZCAxMy4zM2ticHMgZm9yIDMwbXMgbW9kZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIG1vZGUgTW9kZQorICoKKyAqIFRoZSBkZWZhdWx0IG1vZGUgc2hvdWxkIGJlIHNldCB1cG9uIGluaXRpYWxpemF0aW9uLCBzZWUKKyAqICNwam1lZGlhX2NvZGVjX3Bhc3N0aHJvdWdoX2luaXQyKCkuIEFmdGVyIHRoZSBjb2RlYyBpcyBpbml0aWFsaXplZCwgdGhlCisgKiBkZWZhdWx0IG1vZGUgY2FuIGJlIG1vZGlmaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSgpLgorICoKKyAqIEluICNwam1lZGlhX2NvZGVjX3BhcmFtLCBpTEJDIG1vZGUgY2FuIGJlIHNldCBieSBzcGVjaWZ5aW5nIFNEUAorICogZm9ybWF0IHBhcmFtZXRlciAibW9kZSIgaW4gdGhlIFNEUCAiYT1mbXRwIiBhdHRyaWJ1dGUgZm9yIGRlY29kaW5nCisgKiBkaXJlY3Rpb24uIFZhbGlkIHZhbHVlcyBhcmUgIjIwIiBhbmQgIjMwIiAoZm9yIDIwbXMgYW5kIDMwbXMgbW9kZSAKKyAqIHJlc3BlY3RpdmVseSkuCisgKgorICogSGVyZSBpcyBhbiBleGFtcGxlIHRvIHNldCB1cCAjcGptZWRpYV9jb2RlY19wYXJhbSB0byB1c2UgbW9kZSAyMG1zOgorICogIFxjb2RlCisgICAgcGptZWRpYV9jb2RlY19wYXJhbSBwYXJhbTsKKyAgICAuLi4KKyAgICAvLyBzZXR0aW5nIGlMQkMgbW9kZSBpbiBTRFAKKyAgICBwYXJhbS5zZXR0aW5nLmRlY19mbXRwLmNudCA9IDE7CisgICAgcGFyYW0uc2V0dGluZy5kZWNfZm10cC5wYXJhbVswXS5uYW1lID0gcGpfc3RyKCJtb2RlIik7CisgICAgcGFyYW0uc2V0dGluZy5kZWNfZm10cC5wYXJhbVswXS52YWwgID0gcGpfc3RyKCIyMCIpOworICAgIC4uLgorIFxlbmRjb2RlCisgKgorICoKKyAqIFxzZWN0aW9uIHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfYW1yIFBhc3N0aHJvdWdoIEFNUgorICoKKyAqIElQUCBBTVIgc3VwcG9ydHMgMTYtYml0IFBDTSBhdWRpbyBzaWduYWwgd2l0aCBzYW1wbGluZyByYXRlIDgwMDBIeiwKKyAqIDIwbXMgZnJhbWUgbGVuZ3RoIGFuZCBwcm9kdWNpbmcgdmFyaW91cyBiaXRyYXRlcyB0aGF0IHJhbmdlcyBmcm9tIDQuNzVrYnBzCisgKiB0byAxMi4ya2Jwcy4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb2RlY19zZXR0aW5nIENvZGVjIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIGJpdHJhdGUgQml0cmF0ZQorICoKKyAqIEJ5IGRlZmF1bHQsIGVuY29kaW5nIGJpdHJhdGUgaXMgNzQwMGJwcy4gVGhpcyBkZWZhdWx0IHNldHRpbmcgY2FuIGJlIAorICogbW9kaWZpZWQgdXNpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkgYnkgc3BlY2lmeWluZyAKKyAqIHByZWZlcmVkIEFNUiBiaXRyYXRlIGluIGZpZWxkIDx0dD5pbmZvOjphdmdfYnBzPC90dD4gb2YgCisgKiAjcGptZWRpYV9jb2RlY19wYXJhbS4gVmFsaWQgYml0cmF0ZXMgY291bGQgYmUgc2VlbiBpbiAKKyAqICNwam1lZGlhX2NvZGVjX2Ftcm5iX2JpdHJhdGVzLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIHBheWxvYWRfZm9ybWF0IFBheWxvYWQgRm9ybWF0CisgKgorICogVGhlcmUgYXJlIHR3byBBTVIgcGF5bG9hZCBmb3JtYXQgdHlwZXMsIGJhbmR3aWR0aC1lZmZpY2llbnQgYW5kCisgKiBvY3RldC1hbGlnbmVkLiBEZWZhdWx0IHNldHRpbmcgaXMgdXNpbmcgb2N0ZXQtYWxpZ25lZC4gVGhpcyBkZWZhdWx0IHBheWxvYWQKKyAqIGZvcm1hdCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkuCisgKgorICogSW4gI3BqbWVkaWFfY29kZWNfcGFyYW0sIHBheWxvYWQgZm9ybWF0IGNhbiBiZSBzZXQgYnkgc3BlY2lmeWluZyBTRFAgCisgKiBmb3JtYXQgcGFyYW1ldGVycyAib2N0ZXQtYWxpZ24iIGluIHRoZSBTRFAgImE9Zm10cCIgYXR0cmlidXRlIGZvciAKKyAqIGRlY29kaW5nIGRpcmVjdGlvbi4gVmFsaWQgdmFsdWVzIGFyZSAiMCIgKGZvciBiYW5kd2lkdGggZWZmaWNpZW50IG1vZGUpCisgKiBhbmQgIjEiIChmb3Igb2N0ZXQtYWxpZ25lZCBtb2RlKS4KKyAqCisgKiBcc3Vic3Vic2VjdGlvbiBtb2RlX3NldCBNb2RlLVNldAorICogCisgKiBNb2RlLXNldCBpcyB1c2VkIGZvciByZXN0cmljdGluZyBBTVIgbW9kZXMgaW4gZGVjb2RpbmcgZGlyZWN0aW9uLgorICoKKyAqIEJ5IGRlZmF1bHQsIG5vIG1vZGUtc2V0IHJlc3RyaWN0aW9uIGFwcGxpZWQuIFRoaXMgZGVmYXVsdCBzZXR0aW5nIGNhbiBiZSAKKyAqIGJlIG1vZGlmaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSgpLgorICoKKyAqIEluICNwam1lZGlhX2NvZGVjX3BhcmFtLCBtb2RlLXNldCBjb3VsZCBiZSBzcGVjaWZpZWQgdmlhIGZvcm1hdCBwYXJhbWV0ZXJzCisgKiAibW9kZS1zZXQiIGluIHRoZSBTRFAgImE9Zm10cCIgYXR0cmlidXRlIGZvciBkZWNvZGluZyBkaXJlY3Rpb24uIFZhbGlkIAorICogdmFsdWUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtb2RlcyBmcm9tIHRoZSBzZXQgMCAtIDcsIGUuZzogCisgKiAiNCw1LDYsNyIuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgbm8gbW9kZS1zZXQgcmVzdHJpY3Rpb25zIGFwcGxpZWQuCisgKgorICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIG1vZGlmeWluZyBBTVIgZGVmYXVsdCBjb2RlYyBwYXJhbToKKyBcY29kZQorICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gcGFyYW07CisKKyAgICBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyAgICAuLi4KKyAgICAvLyBzZXQgZGVmYXVsdCBlbmNvZGluZyBiaXRyYXRlIHRvIHRoZSBoaWdoZXN0IDEyLjJrYnBzCisgICAgcGFyYW0uaW5mby5hdmdfYnBzID0gMTIyMDA7CisKKyAgICAvLyByZXN0cmljdCBkZWNvZGluZyBiaXRyYXRlIHRvIDEwLjJrYnBzIGFuZCAxMi4ya2JwcyBvbmx5CisgICAgcGFyYW0uc2V0dGluZy5kZWNfZm10cC5wYXJhbVswXS5uYW1lID0gcGpfc3RyKCJtb2RlLXNldCIpOworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMF0udmFsICA9IHBqX3N0cigiNiw3Iik7CisKKyAgICAvLyBhbHNvIHNldCB0byB1c2UgYmFuZHdpZHRoLWVmZmljaWVudCBwYXlsb2FkIGZvcm1hdAorICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAucGFyYW1bMV0ubmFtZSA9IHBqX3N0cigib2N0ZXQtYWxpZ24iKTsKKyAgICBwYXJhbS5zZXR0aW5nLmRlY19mbXRwLnBhcmFtWzFdLnZhbCAgPSBwal9zdHIoIjAiKTsKKworICAgIHBhcmFtLnNldHRpbmcuZGVjX2ZtdHAuY250ID0gMjsKKyAgICAuLi4KKyAgICBwam1lZGlhX2NvZGVjX21ncl9zZXRfZGVmYXVsdF9wYXJhbSguLiwgJnBhcmFtKTsKKyBcZW5kY29kZQorICogCisgKgorICogXHNlY3Rpb24gcGptZWRpYV9jb2RlY19wYXNzdGhyb3VnaF9nNzExIFBhc3N0aHJvdWdoIEcuNzExCisgKgorICogVGhlIEcuNzExIGlzIGFuIHVsdHJhIGxvdyBjb21wbGV4aXR5IGNvZGVjcyBhbmQgaW4gdHJhZGUtb2ZmIGl0IHJlc3VsdHMKKyAqIGluIGhpZ2ggYml0cmF0ZSwgaS5lOiA2NGticHMgZm9yIDE2LWJpdCBQQ00gd2l0aCBzYW1wbGluZyByYXRlIDgwMDBIei4KKyAqCisgKiBUaGUgZmFjdG9yeSBjb250YWlucyB0d28gbWFpbiBjb21wcmVzc2lvbiBhbGdvcml0aG1zLCBQQ01VL3UtTGF3IGFuZCAKKyAqIFBDTUEvQS1MYXcuCisgKgorICogXHN1YnNlY3Rpb24gY29kZWNfc2V0dGluZyBDb2RlYyBTZXR0aW5ncworICoKKyAqIEdlbmVyYWwgY29kZWMgc2V0dGluZ3MgZm9yIHRoaXMgY29kZWMgc3VjaCBhcyBWQUQgYW5kIFBMQyBjYW4gYmUgCisgKiBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSA8dHQ+c2V0dGluZzwvdHQ+IGZpZWxkIGluICNwam1lZGlhX2NvZGVjX3BhcmFtLiAKKyAqIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgI3BqbWVkaWFfY29kZWNfcGFyYW0gZm9yIG1vcmUgaW5mby4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKworLyoqIAorICogQ29kZWMgcGFzc3Rocm91Z2ggY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19wYXNzdGhyb3VnaF9zZXR0aW5nCit7CisgICAgdW5zaWduZWQJCSBmbXRfY250OwkvKio8IE51bWJlciBvZiBlbmNvZGluZyBmb3JtYXRzCisJCQkJCSAgICAgdG8gYmUgZW5hYmxlZC4JCSovCisgICAgcGptZWRpYV9mb3JtYXQJKmZtdHM7CQkvKio8IEVuY29kaW5nIGZvcm1hdHMgdG8gYmUgCisJCQkJCSAgICAgZW5hYmxlZC4JCQkqLworICAgIHVuc2lnbmVkCQkgaWxiY19tb2RlOwkvKio8IGlMQkMgZGVmYXVsdCBtb2RlLgkJKi8KK30gcGptZWRpYV9jb2RlY19wYXNzdGhyb3VnaF9zZXR0aW5nOworCisKKy8qKgorICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgcGFzc3Rocm91Z2ggY29kZWNzIGZhY3RvcnkgdG8gcGptZWRpYSBlbmRwb2ludCwKKyAqIGFsbCBzdXBwb3J0ZWQgZW5jb2RpbmcgZm9ybWF0cyB3aWxsIGJlIGVuYWJsZWQuCisgKgorICogQHBhcmFtIGVuZHB0CSAgICBUaGUgcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfaW5pdCggcGptZWRpYV9lbmRwdCAqZW5kcHQgKTsKKworCisvKioKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIHBhc3N0aHJvdWdoIGNvZGVjcyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQKKyAqIHdpdGggb25seSBzcGVjaWZpZWQgZW5jb2RpbmcgZm9ybWF0cyBlbmFibGVkLgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIHBqbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gc2V0dGluZyAgIFRoZSBzZXR0aW5ncy4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfaW5pdDIoCisJCSAgICAgICBwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJICAgICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfc2V0dGluZyAqc2V0dGluZyk7CisKKworLyoqCisgKiBVbnJlZ2lzdGVyIHBhc3N0aHJvdWdoIGNvZGVjcyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfcGFzc3Rocm91Z2hfZGVpbml0KHZvaWQpOworCisKK1BKX0VORF9ERUNMCisKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ERUNTX1BBU1NUSFJPVUdIX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zaWxrLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zaWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwZmFjYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NpbGsuaApAQCAtMCwwICsxLDEzMyBAQAorLyogJElkOiBzaWxrLmggNDI2NCAyMDEyLTA5LTI0IDA2OjU4OjE2WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMiBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvbnRyaWJ1dGVkIGJ5IFJlZ2lzIE1vbnRveWEgKGFrYSByM2dpcyAtIHd3dy5yM2dpcy5mcikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT0RFQ19TSUxLX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfU0lMS19IX18KKworLyoqCisgKiBAZmlsZSBzaWxrLmgKKyAqIEBicmllZiBTSUxLIGNvZGVjLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3R5cGVzLmg+CisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1NJTEsgU0lMSyBDb2RlYyBGYW1pbHkKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgU0lMSyBjb2RlY3MgKG5hcnJvdy9tZWRpdW0vd2lkZS9zdXBlcndpZGUtYmFuZCkuCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIFNJTEsgY29kZWMKKyAqIGZhY3RvcnkgdG8gdGhlIGNvZGVjIG1hbmFnZXIuIEFmdGVyIHRoZSBjb2RlYyBmYWN0b3J5IGhhcyBiZWVuIHJlZ2lzdGVyZWQsCisgKiBhcHBsaWNhdGlvbiBjYW4gdXNlIEByZWYgUEpNRURJQV9DT0RFQyBBUEkgdG8gbWFuaXB1bGF0ZSB0aGUgY29kZWMuCisgKgorICogVGhlIFNJTEsgY29kZWMgdXNlcyBtdWx0aXBsZSBiaXQgcmF0ZXMsIGFuZCBzdXBwb3J0cyBzdXBlciB3aWRlYmFuZCAKKyAqICgyNCBrSHogc2FtcGxpbmcgcmF0ZSksIHdpZGViYW5kICgxNiBrSHogc2FtcGxpbmcgcmF0ZSksIG1lZGl1bSAoMTJrSHoKKyAqIHNhbXBsaW5nIHJhdGUpLCBhbmQgbmFycm93YmFuZCAodGVsZXBob25lIHF1YWxpdHksIDgga0h6IHNhbXBsaW5nIHJhdGUpLgorICoKKyAqIEJ5IGRlZmF1bHQsIHRoZSBTSUxLIGNvZGVjIGZhY3RvcnkgcmVnaXN0ZXJzIHR3byBTSUxLIGNvZGVjczoKKyAqICJTSUxLLzgwMDAiIG5hcnJvd2JhbmQgY29kZWMgYW5kICJTSUxLLzE2MDAwIiB3aWRlYmFuZCBjb2RlYy4gVGhpcyBiZWhhdmlvcgorICogY2FuIGJlIGNoYW5nZWQgYnkgc3BlY2lmeWluZyAjcGptZWRpYV9jb2RlY19zaWxrX29wdGlvbnMgZmxhZ3MgZHVyaW5nCisgKiBpbml0aWFsaXphdGlvbi4KKyAqCisgKgorICogXHNlY3Rpb24gY29kZWNfc2V0dGluZyBDb2RlYyBTZXR0aW5ncworICoKKyAqIFxzdWJzZWN0aW9uIGdlbmVyYWxfc2V0dGluZyBHZW5lcmFsIFNldHRpbmdzCisgKgorICogR2VuZXJhbCBjb2RlYyBzZXR0aW5ncyBmb3IgdGhpcyBjb2RlYyBzdWNoIGFzIFZBRCBhbmQgUExDIGNhbiBiZSAKKyAqIG1hbmlwdWxhdGVkIHRocm91Z2ggdGhlIDx0dD5zZXR0aW5nPC90dD4gZmllbGQgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0uIAorICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFxzdWJzZWN0aW9uIHNwZWNpZmljX3NldHRpbmcgQ29kZWMgU3BlY2lmaWMgU2V0dGluZ3MKKyAqCisgKiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBhcHBsaWNhYmxlIGZvciB0aGlzIGNvZGVjLgorICoKKyAqIFxzdWJzdWJzZWN0aW9uIHF1YWxpdHlfdnNfY29tcGxleGl0eSBRdWFsaXR5IHZzIENvbXBsZXhpdHkKKyAqCisgKiBUaGUgU0lMSyBjb2RlYyBxdWFsaXR5IHZlcnN1cyBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgYW5kIGJhbmR3aWR0aAorICogcmVxdWlyZW1lbnQgY2FuIGJlIGFkanVzdGVkIGJ5IG1vZGlmeWluZyB0aGUgcXVhbGl0eSBhbmQgY29tcGxleGl0eQorICogc2V0dGluZywgYnkgY2FsbGluZyAjcGptZWRpYV9jb2RlY19zaWxrX3NldF9jb25maWcoKS4KKyAqCisgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIG9mIHF1YWxpdHkgaXMgc3BlY2lmaWVkIGluIAorICogI1BKTUVESUFfQ09ERUNfU0lMS19ERUZBVUxUX1FVQUxJVFkuIEFuZCB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mCisgKiBjb21wbGV4aXR5IGlzIHNwZWNpZmllZCBpbiAjUEpNRURJQV9DT0RFQ19TSUxLX0RFRkFVTFRfQ09NUExFWElUWS4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29kZWNfc2lsa19zZXR0aW5nCit7CisgICAgcGpfYm9vbF90CWVuYWJsZWQ7ICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUuCQkJICAgICovCisgICAgaW50CQlxdWFsaXR5OyAgICAvKio8IEVuY29kaW5nIHF1YWxpdHksIG9yIHVzZSAtMSBmb3IgZGVmYXVsdCAKKyAJCQkJIChAc2VlIFBKTUVESUFfQ09ERUNfU0lMS19ERUZBVUxUX1FVQUxJVFkpLiAqLworICAgIGludCAJY29tcGxleGl0eTsgLyoqPCBFbmNvZGluZyBjb21wbGV4aXR5LCBvciB1c2UgLTEgZm9yIGRlZmF1bHQKKwkJCSAgICAgICAgIChAc2VlIFBKTUVESUFfQ09ERUNfU0lMS19ERUZBVUxUX0NPTVBMRVhJVFkpKi8KK30gcGptZWRpYV9jb2RlY19zaWxrX3NldHRpbmc7CisKKworLyoqCisgKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBTSUxLIGNvZGVjIGZhY3RvcnkgdG8gcGptZWRpYSBlbmRwb2ludC4gQnkgZGVmYXVsdCwKKyAqIG9ubHkgbmFycm93YmFuZCAoOGtIeiBzYW1wbGluZyByYXRlKSBhbmQgd2lkZWJhbmQgKDE2a0h6IHNhbXBsaW5nIHJhdGUpCisgKiB3aWxsIGJlIGVuYWJsZWQuIFF1YWxpdHkgYW5kIGNvbXBsZXhpdHkgZm9yIHRob3NlIHNhbXBsaW5nIHJhdGUgbW9kZXMKKyAqIHdpbGwgYmUgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlcyAoc2VlICNQSk1FRElBX0NPREVDX1NJTEtfREVGQVVMVF9RVUFMSVRZCisgKiBhbmQgI1BKTUVESUFfQ09ERUNfU0lMS19ERUZBVUxUX0NPTVBMRVhJVFkpLCBhcHBsaWNhdGlvbiBtYXkgbW9kaWZ5IHRoZXNlCisgKiBzZXR0aW5ncyB2aWEgI3BqbWVkaWFfY29kZWNfc2lsa19zZXRfY29uZmlnKCkuCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgcGptZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfc2lsa19pbml0KHBqbWVkaWFfZW5kcHQgKmVuZHB0KTsKKworCisvKioKKyAqIENoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5nIG9mIHRoZSBTSUxLIGNvZGVjIGZvciB0aGUgc3BlY2lmaWVkCisgKiBjbG9jayByYXRlLgorICoKKyAqIEBwYXJhbSBjbG9ja19yYXRlCVBDTSBzYW1wbGluZyByYXRlLCBpbiBIeiwgdmFsaWQgdmFsdWVzIGFyZSA4MDAwLAorICoJCQkxMjAwMCwgMTYwMDAgYW5kIDI0MDAwLgorICogQHBhcmFtIG9wdAkJVGhlIHNldHRpbmcgdG8gYmUgYXBwbGllZCBmb3IgdGhlIHNwZWNpZmllZAorICoJCQljbG9jayByYXRlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19zaWxrX3NldF9jb25maWcoCisJCQkJICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUsIAorCQkJCSAgICBjb25zdCBwam1lZGlhX2NvZGVjX3NpbGtfc2V0dGluZyAqb3B0KTsKKworCisvKioKKyAqIFVucmVnaXN0ZXIgU0lMSyBjb2RlYyBmYWN0b3J5IGZyb20gcGptZWRpYSBlbmRwb2ludCBhbmQgZGVpbml0aWFsaXplCisgKiB0aGUgU0lMSyBjb2RlYyBsaWJyYXJ5LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19zaWxrX2RlaW5pdCh2b2lkKTsKKworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYJLyogX19QSk1FRElBX0NPREVDX1NJTEtfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3NwZWV4LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zcGVleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy9zcGVleC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKiAkSWQ6IHNwZWV4LmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX1NQRUVYX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfU1BFRVhfSF9fCisKKy8qKgorICogQGZpbGUgc3BlZXguaAorICogQGJyaWVmIFNwZWV4IGNvZGVjIGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy90eXBlcy5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRF9TUEVFWCBTcGVleCBDb2RlYyBGYW1pbHkKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgU3BlZXggY29kZWNzIChuYXJyb3cvd2lkZS91bHRyYXdpZGUtYmFuZCkuCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIHNwZWV4IGNvZGVjCisgKiBmYWN0b3J5IHRvIHRoZSBjb2RlYyBtYW5hZ2VyLiBBZnRlciB0aGUgY29kZWMgZmFjdG9yeSBoYXMgYmVlbiByZWdpc3RlcmVkLAorICogYXBwbGljYXRpb24gY2FuIHVzZSBAcmVmIFBKTUVESUFfQ09ERUMgQVBJIHRvIG1hbmlwdWxhdGUgdGhlIGNvZGVjLgorICoKKyAqIFRoZSBTcGVleCBjb2RlYyB1c2VzIG11bHRpcGxlIGJpdCByYXRlcywgYW5kIHN1cHBvcnRzIHVsdHJhLXdpZGViYW5kIAorICogKDMyIGtIeiBzYW1wbGluZyByYXRlKSwgd2lkZWJhbmQgKDE2IGtIeiBzYW1wbGluZyByYXRlKSBhbmQgbmFycm93YmFuZCAKKyAqICh0ZWxlcGhvbmUgcXVhbGl0eSwgOCBrSHogc2FtcGxpbmcgcmF0ZSkKKyAqCisgKiBCeSBkZWZhdWx0LCB0aGUgc3BlZXggY29kZWMgZmFjdG9yeSByZWdpc3RlcnMgdGhyZWUgU3BlZXggY29kZWNzOgorICogInNwZWV4LzgwMDAiIG5hcnJvd2JhbmQgY29kZWMsICJzcGVleC8xNjAwMCIgd2lkZWJhbmQgY29kZWMsIGFuZCAKKyAqICJzcGVleC8zMjAwMCIgdWx0cmEtd2lkZWJhbmQgY29kZWMuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQgYnkKKyAqIHNwZWNpZnlpbmcgI3BqbWVkaWFfc3BlZXhfb3B0aW9ucyBmbGFncyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKgorICoKKyAqIFxzZWN0aW9uIGNvZGVjX3NldHRpbmcgQ29kZWMgU2V0dGluZ3MKKyAqCisgKiBcc3Vic2VjdGlvbiBnZW5lcmFsX3NldHRpbmcgR2VuZXJhbCBTZXR0aW5ncworICoKKyAqIEdlbmVyYWwgY29kZWMgc2V0dGluZ3MgZm9yIHRoaXMgY29kZWMgc3VjaCBhcyBWQUQgYW5kIFBMQyBjYW4gYmUgCisgKiBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSA8dHQ+c2V0dGluZzwvdHQ+IGZpZWxkIGluICNwam1lZGlhX2NvZGVjX3BhcmFtLiAKKyAqIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgI3BqbWVkaWFfY29kZWNfcGFyYW0gZm9yIG1vcmUgaW5mby4KKyAqCisgKiBcc3Vic2VjdGlvbiBzcGVjaWZpY19zZXR0aW5nIENvZGVjIFNwZWNpZmljIFNldHRpbmdzCisgKgorICogVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgYXBwbGljYWJsZSBmb3IgdGhpcyBjb2RlYy4KKyAqCisgKiBcc3Vic3Vic2VjdGlvbiBxdWFsaXR5X3ZzX2NvbXBsZXhpdHkgUXVhbGl0eSB2cyBDb21wbGV4aXR5CisgKgorICogVGhlIFNwZWV4IGNvZGVjIHF1YWxpdHkgdmVyc3VzIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSBhbmQgYmFuZHdpZHRoCisgKiByZXF1aXJlbWVudCBjYW4gYmUgYWRqdXN0ZWQgYnkgbW9kaWZ5aW5nIHRoZSBxdWFsaXR5IGFuZCBjb21wbGV4aXR5CisgKiBzZXR0aW5nLCBieSBjYWxsaW5nICNwam1lZGlhX2NvZGVjX3NwZWV4X3NldF9wYXJhbSgpLiBUaGUgUkZDIDU1NzQKKyAqIFNlY3Rpb24gNSBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcXVhbGl0eSBzZXR0aW5nIGFuZCB0aGUKKyAqIHJlc3VsdGluZyBiaXRyYXRlLgorICoKKyAqIFRoZSBkZWZhdWx0IHNldHRpbmcgb2YgcXVhbGl0eSBpcyBzcGVjaWZpZWQgaW4gCisgKiAjUEpNRURJQV9DT0RFQ19TUEVFWF9ERUZBVUxUX1FVQUxJVFkuIEFuZCB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mCisgKiBjb21wbGV4aXR5IGlzIHNwZWNpZmllZCBpbiAjUEpNRURJQV9DT0RFQ19TUEVFWF9ERUZBVUxUX0NPTVBMRVhJVFkuCisgKi8KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQml0bWFzayBvcHRpb25zIHRvIGJlIHBhc3NlZCBkdXJpbmcgU3BlZXggY29kZWMgZmFjdG9yeSBpbml0aWFsaXphdGlvbi4KKyAqLworZW51bSBwam1lZGlhX3NwZWV4X29wdGlvbnMKK3sKKyAgICBQSk1FRElBX1NQRUVYX05PX05CCSAgICA9IDEsICAgIC8qKjwgRGlzYWJsZSBuYXJyb3diYW5kIG1vZGUuCSovCisgICAgUEpNRURJQV9TUEVFWF9OT19XQgkgICAgPSAyLCAgICAvKio8IERpc2FibGUgd2lkZWJhbmQgbW9kZS4JCSovCisgICAgUEpNRURJQV9TUEVFWF9OT19VV0IgICAgPSA0LCAgICAvKio8IERpc2FibGUgdWx0cmEtd2lkZWJhbmQgbW9kZS4JKi8KK307CisKKworLyoqCisgKiBJbml0aWFsaXplIGFuZCByZWdpc3RlciBTcGVleCBjb2RlYyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgcGptZWRpYSBlbmRwb2ludC4KKyAqIEBwYXJhbSBvcHRpb25zCUJpdG1hc2sgb2YgcGptZWRpYV9zcGVleF9vcHRpb25zIChkZWZhdWx0PTApLgorICogQHBhcmFtIHF1YWxpdHkJU3BlY2lmeSBlbmNvZGluZyBxdWFsaXR5LCBvciB1c2UgLTEgZm9yIGRlZmF1bHQgCisgKgkJCShAc2VlIFBKTUVESUFfQ09ERUNfU1BFRVhfREVGQVVMVF9RVUFMSVRZKS4KKyAqIEBwYXJhbSBjb21wbGV4aXR5CVNwZWNpZnkgZW5jb2RpbmcgY29tcGxleGl0eSAsIG9yIHVzZSAtMSBmb3IgZGVmYXVsdCAKKyAqCQkJKEBzZWUgUEpNRURJQV9DT0RFQ19TUEVFWF9ERUZBVUxUX0NPTVBMRVhJVFkpLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19zcGVleF9pbml0KCBwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCSAgICAgICBpbnQgcXVhbGl0eSwKKwkJCQkJICAgICAgIGludCBjb21wbGV4aXR5ICk7CisKKworLyoqCisgKiBJbml0aWFsaXplIFNwZWV4IGNvZGVjIGZhY3RvcnkgdXNpbmcgZGVmYXVsdCBzZXR0aW5ncyBhbmQgcmVnaXN0ZXIgdG8gCisgKiBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX3NwZWV4X2luaXRfZGVmYXVsdChwam1lZGlhX2VuZHB0ICplbmRwdCk7CisKKworLyoqCisgKiBDaGFuZ2UgdGhlIHNldHRpbmdzIG9mIFNwZWV4IGNvZGVjLgorICoKKyAqIEBwYXJhbSBjbG9ja19yYXRlCUNsb2NrIHJhdGUgb2YgU3BlZXggbW9kZSB0byBiZSBzZXQuCisgKiBAcGFyYW0gcXVhbGl0eQlTcGVjaWZ5IGVuY29kaW5nIHF1YWxpdHksIG9yIHVzZSAtMSBmb3IgZGVmYXVsdCAKKyAqCQkJKEBzZWUgUEpNRURJQV9DT0RFQ19TUEVFWF9ERUZBVUxUX1FVQUxJVFkpLgorICogQHBhcmFtIGNvbXBsZXhpdHkJU3BlY2lmeSBlbmNvZGluZyBjb21wbGV4aXR5ICwgb3IgdXNlIC0xIGZvciBkZWZhdWx0IAorICoJCQkoQHNlZSBQSk1FRElBX0NPREVDX1NQRUVYX0RFRkFVTFRfQ09NUExFWElUWSkuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX3NwZWV4X3NldF9wYXJhbSh1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkJICAgaW50IHF1YWxpdHksCisJCQkJCQkgICBpbnQgY29tcGxleGl0eSk7CisKKworLyoqCisgKiBVbnJlZ2lzdGVyIFNwZWV4IGNvZGVjIGZhY3RvcnkgZnJvbSBwam1lZGlhIGVuZHBvaW50IGFuZCBkZWluaXRpYWxpemUKKyAqIHRoZSBTcGVleCBjb2RlYyBsaWJyYXJ5LgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19zcGVleF9kZWluaXQodm9pZCk7CisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ERUNfU1BFRVhfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLWNvZGVjL3R5cGVzLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTcxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS1jb2RlYy90eXBlcy5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiAkSWQ6IHR5cGVzLmggNDI2NCAyMDEyLTA5LTI0IDA2OjU4OjE2WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPREVDX1RZUEVTX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ09ERUNfVFlQRVNfSF9fCisKKy8qKgorICogQGZpbGUgdHlwZXMuaAorICogQGJyaWVmIFBKTUVESUEtQ09ERUMgdHlwZXMgYW5kIGNvbnN0YW50cworICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL2NvbmZpZy5oPgorI2luY2x1ZGUgPHBqbWVkaWEvY29kZWMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgcGptZWRpYV9jb2RlY190eXBlcyBQSk1FRElBLUNPREVDIFR5cGVzIGFuZCBDb25zdGFudHMKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUMKKyAqIEBicmllZiBDb25zdGFudHMgdXNlZCBieSBQSk1FRElBLUNPREVDCisgKiBAeworICovCisKKworCisvKioKKyAqIFRoZXNlIGFyZSB0aGUgZHluYW1pYyBwYXlsb2FkIHR5cGVzIHRoYXQgYXJlIHVzZWQgYnkgYXVkaW8gY29kZWNzIGluCisgKiB0aGlzIGxpYnJhcnkuIEFsc28gc2VlIHRoZSBoZWFkZXIgZmlsZSA8cGptZWRpYS9jb2RlYy5oPiBmb3IgbGlzdAorICogb2Ygc3RhdGljIHBheWxvYWQgdHlwZXMuCisgKi8KK2VudW0gcGptZWRpYV9hdWRpb19wdAoreworICAgIC8qIEFjY29yZGluZyB0byBJQU5BIHNwZWNpZmljYXRpb25zLCBkeW5hbWljIHBheWxvYWQgdHlwZXMgYXJlIHRvIGJlIGluCisgICAgICogdGhlIHJhbmdlIDk2LTEyNyAoaW5jbHVzaXZlKS4gVGhpcyBlbnVtIGlzIHN0cnVjdHVyZWQgdG8gcGxhY2UgdGhlCisgICAgICogdmFsdWVzIG9mIHRoZSBwYXlsb2FkIHR5cGVzIHNwZWNpZmllZCBiZWxvdyBpbnRvIHRoYXQgcmFuZ2UuCisgICAgICoKKyAgICAgKiBQSk1FRElBX1JUUF9QVF9EWU5BTUlDIGlzIGRlZmluZWQgaW4gPHBqbWVkaWEvY29kZWMuaD4uIEl0IGlzIGRlZmluZWQKKyAgICAgKiB0byBiZSA5Ni4KKyAgICAgKgorICAgICAqIFBKTUVESUFfUlRQX1BUX1RFTEVQSE9ORV9FVkVOVFMgaXMgZGVmaW5lZCBpbiA8cGptZWRpYS9jb25maWcuaD4uCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgOTYuCisgICAgICovCisjaWYgUEpNRURJQV9SVFBfUFRfVEVMRVBIT05FX0VWRU5UUworICAgIFBKTUVESUFfUlRQX1BUX1NUQVJUID0gUEpNRURJQV9SVFBfUFRfVEVMRVBIT05FX0VWRU5UUywKKyNlbHNlCisgICAgUEpNRURJQV9SVFBfUFRfU1RBUlQgPSAoUEpNRURJQV9SVFBfUFRfRFlOQU1JQy0xKSwKKyNlbmRpZgorCisgICAgUEpNRURJQV9SVFBfUFRfU1BFRVhfTkIsCQkJLyoqPCBTcGVleCBuYXJyb3diYW5kLzhLSHogICovCisgICAgUEpNRURJQV9SVFBfUFRfU1BFRVhfV0IsCQkJLyoqPCBTcGVleCB3aWRlYmFuZC8xNktIeiAgICovCisgICAgUEpNRURJQV9SVFBfUFRfU1BFRVhfVVdCLAkJCS8qKjwgU3BlZXggMzJLSHoJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfU0lMS19OQiwJCQkvKio8IFNJTEsgbmFycm93YmFuZC84S0h6ICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9TSUxLX01CLAkJCS8qKjwgU0lMSyBtZWRpdW1iYW5kLzEyS0h6ICAqLworICAgIFBKTUVESUFfUlRQX1BUX1NJTEtfV0IsCQkJLyoqPCBTSUxLIHdpZGViYW5kLzE2S0h6ICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfU0lMS19TV0IsCQkJLyoqPCBTSUxLIDI0S0h6CQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9JTEJDLAkJCS8qKjwgaUxCQyAoMTMuMy8xNS4yS2JwcykgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0FNUiwJCQkJLyoqPCBBTVIgKDQuNzUgLSAxMi4yS2JwcykgICovCisgICAgUEpNRURJQV9SVFBfUFRfQU1SV0IsCQkJLyoqPCBBTVJXQiAoNi42IC0gMjMuODVLYnBzKSovCisgICAgUEpNRURJQV9SVFBfUFRfQU1SV0JFLAkJCS8qKjwgQU1SV0JFCQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzI2XzE2LAkJCS8qKjwgRzcyNiBAIDE2S2JwcwkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzI2XzI0LAkJCS8qKjwgRzcyNiBAIDI0S2JwcwkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzI2XzMyLAkJCS8qKjwgRzcyNiBAIDMyS2JwcwkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzI2XzQwLAkJCS8qKjwgRzcyNiBAIDQwS2JwcwkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzIyXzFfMTYsCQkJLyoqPCBHNzIyLjEgKDE2S2JwcykJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfRzcyMl8xXzI0LAkJCS8qKjwgRzcyMi4xICgyNEticHMpCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0c3MjJfMV8zMiwJCQkvKio8IEc3MjIuMSAoMzJLYnBzKQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzIyMUNfMjQsCQkJLyoqPCBHNzIyLjEgQW5uZXggQyAoMjRLYnBzKSovCisgICAgUEpNRURJQV9SVFBfUFRfRzcyMjFDXzMyLAkJCS8qKjwgRzcyMi4xIEFubmV4IEMgKDMyS2JwcykqLworICAgIFBKTUVESUFfUlRQX1BUX0c3MjIxQ180OCwJCQkvKio8IEc3MjIuMSBBbm5leCBDICg0OEticHMpKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzIyMV9SU1YxLAkJCS8qKjwgRzcyMi4xIHJlc2VydmUJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfRzcyMjFfUlNWMiwJCQkvKio8IEc3MjIuMSByZXNlcnZlCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0wxNl84S0haX01PTk8sCQkvKio8IEwxNiBAIDhLSHosIG1vbm8JICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfTDE2XzhLSFpfU1RFUkVPLAkJLyoqPCBMMTYgQCA4S0h6LCBzdGVyZW8gICAgICovCisgICAgLy9QSk1FRElBX1JUUF9QVF9MMTZfMTFLSFpfTU9OTywJCS8qKjwgTDE2IEAgMTFLSHosIG1vbm8JICAgICovCisgICAgLy9QSk1FRElBX1JUUF9QVF9MMTZfMTFLSFpfU1RFUkVPLAkJLyoqPCBMMTYgQCAxMUtIeiwgc3RlcmVvICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfTDE2XzE2S0haX01PTk8sCQkvKio8IEwxNiBAIDE2S0h6LCBtb25vCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0wxNl8xNktIWl9TVEVSRU8sCQkvKio8IEwxNiBAIDE2S0h6LCBzdGVyZW8gICAgKi8KKyAgICAvL1BKTUVESUFfUlRQX1BUX0wxNl8yMktIWl9NT05PLAkJLyoqPCBMMTYgQCAyMktIeiwgbW9ubwkgICAgKi8KKyAgICAvL1BKTUVESUFfUlRQX1BUX0wxNl8yMktIWl9TVEVSRU8sCQkvKio8IEwxNiBAIDIyS0h6LCBzdGVyZW8gICAgKi8KKyAgICAvL1BKTUVESUFfUlRQX1BUX0wxNl8zMktIWl9NT05PLAkJLyoqPCBMMTYgQCAzMktIeiwgbW9ubwkgICAgKi8KKyAgICAvL1BKTUVESUFfUlRQX1BUX0wxNl8zMktIWl9TVEVSRU8sCQkvKio8IEwxNiBAIDMyS0h6LCBzdGVyZW8gICAgKi8KKyAgICAvL1BKTUVESUFfUlRQX1BUX0wxNl80OEtIWl9NT05PLAkJLyoqPCBMMTYgQCA0OEtIeiwgbW9ubwkgICAgKi8KKyAgICAvL1BKTUVESUFfUlRQX1BUX0wxNl80OEtIWl9TVEVSRU8sCQkvKio8IEwxNiBAIDQ4S0h6LCBzdGVyZW8gICAgKi8KKworICAgIC8qIENhdXRpb24hCisgICAgICogRW5zdXJlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBwdCBhYm92ZSBpcyA8PSAxMjcuCisgICAgICovCit9OworCisvKioKKyAqIFRoZXNlIGFyZSB0aGUgZHluYW1pYyBwYXlsb2FkIHR5cGVzIHRoYXQgYXJlIHVzZWQgYnkgdmlkZW8gY29kZWNzIGluCisgKiB0aGlzIGxpYnJhcnkuCisgKi8KK2VudW0gcGptZWRpYV92aWRlb19wdAoreworICAgICAvKiBWaWRlbyBwYXlsb2FkIHR5cGVzICovCisgICAgIFBKTUVESUFfUlRQX1BUX1ZJRF9TVEFSVCA9IChQSk1FRElBX1JUUF9QVF9EWU5BTUlDLTEpLAorICAgICBQSk1FRElBX1JUUF9QVF9IMjYzUCwKKyAgICAgUEpNRURJQV9SVFBfUFRfSDI2NCwKKyAgICAgUEpNRURJQV9SVFBfUFRfSDI2NF9SU1YxLAorICAgICBQSk1FRElBX1JUUF9QVF9IMjY0X1JTVjIsCisgICAgIFBKTUVESUFfUlRQX1BUX0gyNjRfUlNWMywKKyAgICAgUEpNRURJQV9SVFBfUFRfSDI2NF9SU1Y0LAorCisgICAgIC8qIENhdXRpb24hCisgICAgICAqIEVuc3VyZSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgcHQgYWJvdmUgaXMgPD0gMTI3LgorICAgICAgKi8KK307CisKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ19UWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2F2aV9kZXYuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2F2aV9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWIxZThlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvYXZpX2Rldi5oCkBAIC0wLDAgKzEsMTM5IEBACisvKiAkSWQ6IGF2aV9kZXYuaCA0MDE2IDIwMTItMDQtMDQgMDU6MDU6NTBaIGJlbm55bHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBQSk1FRElBX1ZJREVPREVWX0FWSV9ERVZfSF9fCisjZGVmaW5lIFBKTUVESUFfVklERU9ERVZfQVZJX0RFVl9IX18KKworLyoqCisgKiBAZmlsZSBhdmlfZGV2LmgKKyAqIEBicmllZiBBVkkgcGxheWVyIHZpcnR1YWwgZGV2aWNlCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9hdmlfc3RyZWFtLmg+CisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBAZGVmZ3JvdXAgYXZpX2RldiBBVkkgUGxheWVyIFZpcnR1YWwgRGV2aWNlCisgKiBAaW5ncm91cCB2aWRlb19kZXZpY2VfYXBpCisgKiBAYnJpZWYgQVZJIHBsYXllciB2aXJ0dWFsIGRldmljZQorICogQHsKKyAqIFRoaXMgZGVzY3JpYmVzIGEgdmlydHVhbCBjYXB0dXJlIGRldmljZSB3aGljaCB0YWtlcyBpdHMgaW5wdXQgZnJvbSBhbiBBVkkKKyAqIGZpbGUuCisgKi8KKworLyoqCisgKiBTZXR0aW5ncyBmb3IgdGhlIEFWSSBwbGF5ZXIgdmlydHVhbCBkZXZpY2UuIFRoaXMgcGFyYW0gY29ycmVzcG9uZHMgdG8KKyAqIFBKTUVESUFfVklEX0RFVl9DQVBfQVZJX1BMQVkgY2FwYWJpbGl0eSBvZiB0aGUgdmlkZW8gZGV2aWNlL3N0cmVhbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9hdmlfZGV2X3BhcmFtCit7CisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBmdWxsIHBhdGggb2YgdGhlIEFWSSBmaWxlIHRvIGJlIHBsYXllZC4KKyAgICAgKi8KKyAgICBwal9zdHJfdAlwYXRoOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBzZXR0aW5nIGlzIHNwZWNpZmllZCB3aGVuIHNldHRpbmcgdGhlIGRldmljZSwgdGhpcyBzcGVjaWZpZXMKKyAgICAgKiB0aGUgdGl0bGUgdG8gYmUgYXNzaWduZWQgYXMgdGhlIGRldmljZSBuYW1lLiBJZiB0aGlzIHNldHRpbmcgbm90CisgICAgICogc3BlY2lmaWVkLCB0aGUgZmlsZW5hbWUgcGFydCBvZiB0aGUgcGF0aCB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcGpfc3RyX3QJdGl0bGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyBBVkkgc3RyZWFtcyBjcmVhdGVkIGJ5IHRoZSBkZXZpY2UuIElmIHRoZSB2YWx1ZSBpcyBOVUxMLAorICAgICAqIHRoYXQgbWVhbnMgdGhlIGRldmljZSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCB5ZXQuIEFwcGxpY2F0aW9uIGNhbiB1c2UKKyAgICAgKiB0aGlzIGZpZWxkIHRvIHJldHJpZXZlIHRoZSBhdWRpbyBzdHJlYW0gb2YgdGhlIEFWSS4gVGhpcyBzZXR0aW5nIGlzCisgICAgICogImdldCItb25seSBhbmQgd2lsbCBiZSBpZ25vcmVkIGluICJzZXQgY2FwYWJpbGl0eSIgb3BlcmF0aW9uLgorICAgICAqLworICAgIHBqbWVkaWFfYXZpX3N0cmVhbXMgKmF2aV9zdHJlYW1zOworCit9IHBqbWVkaWFfYXZpX2Rldl9wYXJhbTsKKworCisvKioKKyAqIFJlc2V0IHBqbWVkaWFfYXZpX2Rldl9wYXJhbSB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzLiBUaGlzIG1vc3RseSB3aWxsCisgKiByZXNldCBhbGwgdmFsdWVzIHRvIE5VTEwgb3IgemVyby4KKyAqCisgKiBAcGFyYW0gcAlUaGUgcGFyYW1ldGVyIHRvIGJlIGluaXRpYWxpemVkLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfYXZpX2Rldl9wYXJhbV9kZWZhdWx0KHBqbWVkaWFfYXZpX2Rldl9wYXJhbSAqcCk7CisKKworLyoqCisgKiBDcmVhdGUgYSBBVkkgZGV2aWNlIGZhY3RvcnksIGFuZCByZWdpc3RlciBpdCB0byB0aGUgdmlkZW8gZGV2aWNlCisgKiBzdWJzeXN0ZW0uIEF0IGxlYXN0IG9uZSBmYWN0b3J5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIGFuIEFWSQorICogZGV2aWNlIGNhbiBiZSBhbGxvY2F0ZWQgYW5kIHVzZWQsIGFuZCBub3JtYWxseSBvbmx5IG9uZSBmYWN0b3J5IGlzCisgKiBuZWVkZWQgcGVyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBwYXJhbSBwZgkJUG9vbCBmYWN0b3J5IHRvIGJlIHVzZWQuCisgKiBAcGFyYW0gbWF4X2RldglOdW1iZXIgb2YgZGV2aWNlcyB0byBiZSByZXNlcnZlZC4KKyAqIEBwYXJhbSBwX3JldAkJUG9pbnRlciB0byByZXR1cm4gdGhlIGZhY3RvcnkgaW5zdGFuY2UsIHRvIGJlCisgKiAJCQl1c2VkIHdoZW4gYWxsb2NhdGluZyBhIHZpcnR1YWwgZGV2aWNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdmlfZGV2X2NyZWF0ZV9mYWN0b3J5KAorCQkJCSAgICBwal9wb29sX2ZhY3RvcnkgKnBmLAorCQkJCSAgICB1bnNpZ25lZCBtYXhfZGV2LAorCQkJCSAgICBwam1lZGlhX3ZpZF9kZXZfZmFjdG9yeSAqKnBfcmV0KTsKKworLyoqCisgKiBBbGxvY2F0ZSBvbmUgZGV2aWNlIElEIHRvIGJlIHVzZWQgdG8gcGxheSB0aGUgc3BlY2lmaWVkIEFWSSBmaWxlIGluCisgKiB0aGUgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBwYXJhbQkJVGhlIHBhcmFtZXRlciwgd2l0aCBhdCBsZWFzdCB0aGUgQVZJIGZpbGUgcGF0aAorICogCQkJc2V0LgorICogQHBhcmFtIHBfaWQJCU9wdGlvbmFsIHBvaW50ZXIgdG8gcmVjZWl2ZSBkZXZpY2UgSUQgdG8gcGxheQorICogCQkJdGhlIGZpbGUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfYXZpX2Rldl9hbGxvYyhwam1lZGlhX3ZpZF9kZXZfZmFjdG9yeSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F2aV9kZXZfcGFyYW0gKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdmlkX2Rldl9pbmRleCAqcF9pZCk7CisKKy8qKgorICogUmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgc2V0IGZvciB0aGUgdmlydHVhbCBkZXZpY2UuCisgKgorICogQHBhcmFtIGlkCQlEZXZpY2UgSUQuCisgKiBAcGFyYW0gcHJtCQlTdHJ1Y3R1cmUgdG8gcmVjZWl2ZSB0aGUgc2V0dGluZ3MuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9hdmlfZGV2X2dldF9wYXJhbShwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfYXZpX2Rldl9wYXJhbSAqcGFyYW0pOworCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBpZAkJVGhlIGRldmljZSBJRC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2F2aV9kZXZfZnJlZShwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQpOworCisvKioKKyAqIEB9CisgKi8KKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYgICAgLyogUEpNRURJQV9WSURFT0RFVl9BVklfREVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvY29uZmlnLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVkMWEyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvY29uZmlnLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qICRJZDogY29uZmlnLmggNDY1NiAyMDEzLTExLTIzIDA3OjEzOjQwWiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfVklERU9ERVZfQ09ORklHX0hfXworI2RlZmluZSBfX1BKTUVESUFfVklERU9ERVZfQ09ORklHX0hfXworCisvKioKKyAqIEBmaWxlIGNvbmZpZy5oCisgKiBAYnJpZWYgVmlkZW8gY29uZmlnLgorICovCisjaW5jbHVkZSA8cGptZWRpYS90eXBlcy5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogQGRlZmdyb3VwIHZpZGVvX2RldmljZV9hcGkgVmlkZW8gRGV2aWNlIEFQSQorICogQGJyaWVmIFBKTUVESUEgdmlkZW8gZGV2aWNlIGFic3RyYWN0aW9uIEFQSS4KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBzMV92aWRlb19kZXZpY2VfY29uZmlnIENvbXBpbGUgdGltZSBjb25maWd1cmF0aW9ucworICogQGluZ3JvdXAgdmlkZW9fZGV2aWNlX2FwaQorICogQGJyaWVmIENvbXBpbGUgdGltZSBjb25maWd1cmF0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIFRoaXMgc2V0dGluZyBjb250cm9scyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZm9ybWF0cyB0aGF0IGNhbiBiZQorICogc3VwcG9ydGVkIGJ5IGEgdmlkZW8gZGV2aWNlLgorICoKKyAqIERlZmF1bHQ6IDE2CisgKi8KKyNpZm5kZWYgUEpNRURJQV9WSURfREVWX0lORk9fRk1UX0NOVAorIyAgIGRlZmluZSBQSk1FRElBX1ZJRF9ERVZfSU5GT19GTVRfQ05UIDE2CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19WSURFTykgJiYgKFBKTUVESUFfSEFTX1ZJREVPICE9IDApCisKKy8qKgorICogVGhpcyBzZXR0aW5nIGNvbnRyb2xzIHdoZXRoZXIgU0RMIHN1cHBvcnQgc2hvdWxkIGJlIGluY2x1ZGVkLgorICoKKyAqIERlZmF1bHQ6IDAgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX1ZJREVPX0RFVl9IQVNfU0RMCisjICAgZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19TREwJCTAKKyMgICBkZWZpbmUgUEpNRURJQV9WSURFT19ERVZfU0RMX0hBU19PUEVOR0wJMAorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBRVCBzdXBwb3J0IHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqCisgKiBEZWZhdWx0OiAwIChvciBkZXRlY3RlZCBieSBjb25maWd1cmUpCisgKi8KKyNpZm5kZWYgUEpNRURJQV9WSURFT19ERVZfSEFTX1FUCisjICAgZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19RVAkJMAorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBJT1Mgc3VwcG9ydCBzaG91bGQgYmUgaW5jbHVkZWQuCisgKgorICogRGVmYXVsdDogMCAob3IgZGV0ZWN0ZWQgYnkgY29uZmlndXJlKQorICovCisjaWZuZGVmIFBKTUVESUFfVklERU9fREVWX0hBU19JT1MKKyMgICBkZWZpbmUgUEpNRURJQV9WSURFT19ERVZfSEFTX0lPUwkJMAorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBEaXJlY3QgU2hvdyBzdXBwb3J0IHNob3VsZCBiZSBpbmNsdWRlZC4KKyAqCisgKiBEZWZhdWx0OiAwICh1bmZpbmlzaGVkKQorICovCisjaWZuZGVmIFBKTUVESUFfVklERU9fREVWX0hBU19EU0hPVworIyAgIGRlZmluZSBQSk1FRElBX1ZJREVPX0RFVl9IQVNfRFNIT1cJCTAgLy9QSl9XSU4zMgorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBjb2xvcmJhciBzb3VyY2Ugc3VwcG9ydCBzaG91bGQgYmUgaW5jbHVkZWQuCisgKgorICogRGVmYXVsdDogMQorICovCisjaWZuZGVmIFBKTUVESUFfVklERU9fREVWX0hBU19DQkFSX1NSQworIyAgIGRlZmluZSBQSk1FRElBX1ZJREVPX0RFVl9IQVNfQ0JBUl9TUkMJMQorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hldGhlciBmZm1wZWcgc3VwcG9ydCBzaG91bGQgYmUgaW5jbHVkZWQuCisgKgorICogRGVmYXVsdDogMCAodW5maW5pc2hlZCkKKyAqLworI2lmbmRlZiBQSk1FRElBX1ZJREVPX0RFVl9IQVNfRkZNUEVHCisjICAgZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19GRk1QRUcJICAgICAgICAwCisjZW5kaWYKKworCisvKioKKyAqIFZpZGVvNExpbnV4MgorICoKKyAqIERlZmF1bHQ6IDAgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX1ZJREVPX0RFVl9IQVNfVjRMMgorIyAgIGRlZmluZSBQSk1FRElBX1ZJREVPX0RFVl9IQVNfVjRMMgkJMAorI2VuZGlmCisKKworLyoqCisgKiBFbmFibGUgc3VwcG9ydCBmb3IgQVZJIHBsYXllciB2aXJ0dWFsIGNhcHR1cmUgZGV2aWNlLgorICoKKyAqIERlZmF1bHQ6IDEKKyAqLworI2lmbmRlZiBQSk1FRElBX1ZJREVPX0RFVl9IQVNfQVZJCisjICAgZGVmaW5lIFBKTUVESUFfVklERU9fREVWX0hBU19BVkkJCTEKKyNlbmRpZgorCisvKioKKyAqIFNwZWNpZnkgdGhlIFNETCBsaWJyYXJ5IG5hbWUgdG8gYmUgbGlua2VkIHdpdGggVmlzdWFsIFN0dWRpbyBwcm9qZWN0LiAKKyAqIEJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGF1dG9kZXRlY3RlZCBiYXNlZCBvbiBTREwgdmVyc2lvbiAoInNkbC5saWIiIG9yIAorICogInNkbDIubGliIiksIGJ1dCBhcHBsaWNhdGlvbiBtYXkgZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBsaWJyYXJ5IG5hbWUgaWYgdGhpcyAKKyAqIGF1dG9kZXRlY3Rpb24gZmFpbHMuIENvbW1vbiBuYW1lcyBhcmU6ICJzZGwyLmxpYiIgb3IgInNkbC5saWIiLgorICoKKyAqIERlZmF1bHQ6IHVuZGVjbGFyZWQuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TRExfTElCCisjICAgdW5kZWYgUEpNRURJQV9TRExfTElCCisjZW5kaWYKKworI2VuZGlmIC8qIGRlZmluZWQoUEpNRURJQV9IQVNfVklERU8pICYmIChQSk1FRElBX0hBU19WSURFTyAhPSAwKSAqLworCisvKioKKyAqIEB9CisgKi8KKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1ZJREVPREVWX0NPTkZJR19IX18gKi8KKworLyoKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE9DVU1FTlRBVElPTiBGT0xMT1dTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qKgorICogQGFkZHRvZ3JvdXAgdmlkZW9fZGV2aWNlX2FwaSBWaWRlbyBEZXZpY2UgQVBJCisgKiBAeworCitQSk1FRElBIFZpZGVvIERldmljZSBBUEkgaXMgYSBjcm9zcy1wbGF0Zm9ybSB2aWRlbyBBUEkgYXBwcm9wcmlhdGUgZm9yIHVzZSB3aXRoCitWb0lQIGFwcGxpY2F0aW9ucyBhbmQgbWFueSBvdGhlciB0eXBlcyBvZiB2aWRlbyBzdHJlYW1pbmcgYXBwbGljYXRpb25zLiAKKworVGhlIEFQSSBhYnN0cmFjdHMgbWFueSBkaWZmZXJlbnQgdmlkZW8gQVBJJ3Mgb24gdmFyaW91cyBwbGF0Zm9ybXMsIHN1Y2ggYXM6CisgLSBuYXRpdmUgRGlyZWN0IFNob3cgdmlkZW8gZm9yIFdpbjMyIGFuZCBXaW5kb3dzIE1vYmlsZSBkZXZpY2VzCisgLSBudWxsLXZpZGVvIGltcGxlbWVudGF0aW9uCisgLSBhbmQgbW9yZSB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgZnV0dXJlCisKK1RoZSBWaWRlbyBEZXZpY2UgQVBJL2xpYnJhcnkgaXMgYW4gZXZvbHV0aW9uIGZyb20gUEpNRURJQSBAcmVmIFBKTUVEX1NORCBhbmQgCitjb250YWlucyBtYW55IGVuaGFuY2VtZW50czoKKworIC0gRm9yd2FyZCBjb21wYXRpYmlsaXR5OgorXG4KKyAgIFRoZSBuZXcgQVBJIGhhcyBiZWVuIGRlc2lnbmVkIHRvIGJlIGV4dGVuc2libGUsIGl0IHdpbGwgc3VwcG9ydCBuZXcgQVBJJ3MgYXMgCisgICB3ZWxsIGFzIG5ldyBmZWF0dXJlcyB0aGF0IG1heSBiZSBpbnRyb2R1Y2VkIGluIHRoZSBmdXR1cmUgd2l0aG91dCBicmVha2luZyAKKyAgIGNvbXBhdGliaWxpdHkgd2l0aCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhpcyBBUEkgYXMgd2VsbCBhcyBjb21wYXRpYmlsaXR5IAorICAgd2l0aCBleGlzdGluZyBkZXZpY2UgaW1wbGVtZW50YXRpb25zLiAKKworIC0gRGV2aWNlIGNhcGFiaWxpdGllczoKK1xuCisgICBBdCB0aGUgaGVhcnQgb2YgdGhlIEFQSSBpcyBkZXZpY2UgY2FwYWJpbGl0aWVzIG1hbmFnZW1lbnQsIHdoZXJlIGFsbCBwb3NzaWJsZQorICAgdmlkZW8gY2FwYWJpbGl0aWVzIG9mIHZpZGVvIGRldmljZXMgc2hvdWxkIGJlIGFibGUgdG8gYmUgaGFuZGxlZCBpbiBhIGdlbmVyaWMKKyAgIG1hbm5lci4gV2l0aCB0aGlzIGZyYW1ld29yaywgbmV3IGNhcGFiaWxpdGllcyB0aGF0IG1heSBiZSBkaXNjb3ZlcmVkIGluIHRoZSAKKyAgIGZ1dHVyZSBjYW4gYmUgaGFuZGxlZCBpbiBtYW5uZXIgd2l0aG91dCBicmVha2luZyBleGlzdGluZyBhcHBsaWNhdGlvbnMuIAorCisgLSBCdWlsdC1pbiBmZWF0dXJlczoKK1xuCisgICBUaGUgZGV2aWNlIGNhcGFiaWxpdGllcyBmcmFtZXdvcmsgZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gdXNlIGFuZCBjb250cm9sIAorICAgdmlkZW8gZmVhdHVyZXMgYnVpbHQtaW4gaW4gdGhlIGRldmljZSwgc3VjaCBhczoKKyAgICAtIGJ1aWx0LWluIGZvcm1hdHMsIAorICAgIC0gZXRjLgorCisgLSBDb2RlYyBzdXBwb3J0OgorXG4KKyAgIFNvbWUgdmlkZW8gZGV2aWNlcyBzdXBwb3J0IGJ1aWx0LWluIGhhcmR3YXJlIHZpZGVvIGNvZGVjcywgYW5kIGFwcGxpY2F0aW9uCisgICBjYW4gdXNlIHRoZSB2aWRlbyBkZXZpY2UgaW4gZW5jb2RlZCBtb2RlIHRvIG1ha2UgdXNlIG9mIHRoZXNlIGhhcmR3YXJlIAorICAgY29kZWNzLiAKKworIC0gTXVsdGlwbGUgYmFja2VuZHM6CitcbgorICAgVGhlIG5ldyBBUEkgc3VwcG9ydHMgbXVsdGlwbGUgdmlkZW8gYmFja2VuZHMgKGNhbGxlZCBmYWN0b3JpZXMgb3IgZHJpdmVycyBpbiAKKyAgIHRoZSBjb2RlKSB0byBiZSBhY3RpdmUgc2ltdWx0YW5lb3VzbHksIGFuZCB2aWRlbyBiYWNrZW5kcyBtYXkgYmUgYWRkZWQgb3IgCisgICByZW1vdmVkIGR1cmluZyBydW4tdGltZS4gCisKKyovCisKKworLyoqCisgKiBAfQorICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L2Vycm5vLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNGM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi9lcnJuby5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiAkSWQ6IGVycm5vLmggMzcxNSAyMDExLTA4LTE5IDA5OjM1OjI1WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9WSURFT0RFVl9WSURFT0RFVl9FUlJOT19IX18KKyNkZWZpbmUgX19QSk1FRElBX1ZJREVPREVWX1ZJREVPREVWX0VSUk5PX0hfXworCisvKioKKyAqIEBmaWxlIGVycm5vLmggRXJyb3IgQ29kZXMKKyAqIEBicmllZiBWaWRlb2RldiBzcGVjaWZpYyBlcnJvciBjb2Rlcy4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS12aWRlb2Rldi9jb25maWcuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCisvKioKKyAqIEBkZWZncm91cCBlcnJvcl9jb2RlcyBFcnJvciBDb2RlcworICogQGluZ3JvdXAgdmlkZW9fZGV2aWNlX2FwaQorICogQGJyaWVmIFZpZGVvIGRldmljZSBsaWJyYXJ5IHNwZWNpZmljIGVycm9yIGNvZGVzLgorICogQHsKKyAqLworCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIFN0YXJ0IG9mIGVycm9yIGNvZGUgcmVsYXRpdmUgdG8gUEpfRVJSTk9fU1RBUlRfVVNFUi4KKyAqIFRoaXMgdmFsdWUgaXMgNTIwMDAwLgorICovCisjZGVmaW5lIFBKTUVESUFfVklERU9ERVZfRVJSTk9fU1RBUlQgXAorCSAgICAoUEpfRVJSTk9fU1RBUlRfVVNFUiArIFBKX0VSUk5PX1NQQUNFX1NJWkUqNykKKyNkZWZpbmUgUEpNRURJQV9WSURFT0RFVl9FUlJOT19FTkQgICBcCisJICAgIChQSk1FRElBX1ZJREVPREVWX0VSUk5PX1NUQVJUICsgUEpfRVJSTk9fU1BBQ0VfU0laRSAtIDEpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlkZW8gRGV2aWNlIEFQSSBlcnJvciBjb2RlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBHZW5lcmFsL3Vua25vd24gZXJyb3IuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FVklEX0VSUgkoUEpNRURJQV9WSURFT0RFVl9FUlJOT19TVEFSVCsxKSAvKiA1MjAwMDEgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBVbmtub3duIGVycm9yIGZyb20gdmlkZW8gZHJpdmVyCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FVklEX1NZU0VSUgkoUEpNRURJQV9WSURFT0RFVl9FUlJOT19TVEFSVCsyKSAvKiA1MjAwMDIgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBWaWRlbyBzdWJzeXN0ZW0gbm90IGluaXRpYWxpemVkCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FVklEX0lOSVQJKFBKTUVESUFfVklERU9ERVZfRVJSTk9fU1RBUlQrMykgLyogNTIwMDAzICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCB2aWRlbyBkZXZpY2UKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfSU5WREVWCShQSk1FRElBX1ZJREVPREVWX0VSUk5PX1NUQVJUKzQpIC8qIDUyMDAwNCAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEZvdW5kIG5vIGRldmljZXMKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfTk9ERVYJKFBKTUVESUFfVklERU9ERVZfRVJSTk9fU1RBUlQrNSkgLyogNTIwMDA1ICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogVW5hYmxlIHRvIGZpbmQgZGVmYXVsdCBkZXZpY2UKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfTk9ERUZERVYJKFBKTUVESUFfVklERU9ERVZfRVJSTk9fU1RBUlQrNikgLyogNTIwMDA2ICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogRGV2aWNlIG5vdCByZWFkeQorICovCisjZGVmaW5lIFBKTUVESUFfRVZJRF9OT1RSRUFEWQkoUEpNRURJQV9WSURFT0RFVl9FUlJOT19TVEFSVCs3KSAvKiA1MjAwMDcgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBUaGUgdmlkZW8gY2FwYWJpbGl0eSBpcyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfSU5WQ0FQCShQSk1FRElBX1ZJREVPREVWX0VSUk5PX1NUQVJUKzgpIC8qIDUyMDAwOCAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFRoZSBvcGVyYXRpb24gaXMgaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FVklEX0lOVk9QCShQSk1FRElBX1ZJREVPREVWX0VSUk5PX1NUQVJUKzkpIC8qIDUyMDAwOSAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEJhZCBvciBpbnZhbGlkIHZpZGVvIGRldmljZSBmb3JtYXQKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfQkFERk9STUFUCShQSk1FRElBX1ZJREVPREVWX0VSUk5PX1NUQVJUKzEwKSAvKiA1MjAwMTAgKi8KKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIHZpZGVvIGRldmljZSBzYW1wbGUgZm9ybWF0CisgKi8KKyNkZWZpbmUgUEpNRURJQV9FVklEX1NBTVBGT1JNQVQJKFBKTUVESUFfVklERU9ERVZfRVJSTk9fU1RBUlQrMTEpIC8qIDUyMDAxMSAqLworCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEJhZCBsYXRlbmN5IHNldHRpbmcKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfQkFETEFURU5DWQkoUEpNRURJQV9WSURFT0RFVl9FUlJOT19TVEFSVCsxMikgLyogNTIwMDEyICovCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQmFkL3Vuc3VwcG9ydGVkIHZpZGVvIHNpemUKKyAqLworI2RlZmluZSBQSk1FRElBX0VWSURfQkFEU0laRQkoUEpNRURJQV9WSURFT0RFVl9FUlJOT19TVEFSVCsxMykgLyogNTIwMDEzICovCisKKworLyoqCisgKiBHZXQgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlLiBOb3RlIHRoYXQgdGhpcworICogZnVuY3Rpb24gaXMgb25seSBhYmxlIHRvIGRlY29kZSBQSk1FRElBIFZpZGVvZGV2IHNwZWNpZmljIGVycm9yIGNvZGUuCisgKiBBcHBsaWNhdGlvbiBzaG91bGQgdXNlIHBqX3N0cmVycm9yKCksIHdoaWNoIHNob3VsZCBiZSBhYmxlIHRvCisgKiBkZWNvZGUgYWxsIGVycm9yIGNvZGVzIGJlbG9uZ2luZyB0byBhbGwgc3Vic3lzdGVtcyAoZS5nLiBwamxpYiwKKyAqIHBqbWVkaWEsIHBqc2lwLCBldGMpLgorICoKKyAqIEBwYXJhbSBzdGF0dXMgICAgVGhlIGVycm9yIGNvZGUuCisgKiBAcGFyYW0gYnVmZmVyICAgIFRoZSBidWZmZXIgd2hlcmUgdG8gcHV0IHRoZSBlcnJvciBtZXNzYWdlLgorICogQHBhcmFtIGJ1ZnNpemUgICBTaXplIG9mIHRoZSBidWZmZXIuCisgKgorICogQHJldHVybgkgICAgVGhlIGVycm9yIG1lc3NhZ2UgYXMgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZywKKyAqICAgICAgICAgICAgICAgICAgd3JhcHBlZCB3aXRoIHBqX3N0cl90LgorICovCitQSl9ERUNMKHBqX3N0cl90KSBwam1lZGlhX3ZpZGVvZGV2X3N0cmVycm9yKHBqX3N0YXR1c190IHN0YXR1cywgY2hhciAqYnVmZmVyLAorCQkJCQkgICAgcGpfc2l6ZV90IGJ1ZnNpemUpOworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfVklERU9ERVZfVklERU9ERVZfRVJSTk9fSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjQyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oCkBAIC0wLDAgKzEsODI3IEBACisvKiAkSWQ6IHZpZGVvZGV2LmggNDcwNCAyMDE0LTAxLTE2IDA1OjMwOjQ2WiBtaW5nICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1ZJREVPREVWX1ZJREVPREVWX0hfXworI2RlZmluZSBfX1BKTUVESUFfVklERU9ERVZfVklERU9ERVZfSF9fCisKKy8qKgorICogQGZpbGUgdmlkZW9kZXYuaAorICogQGJyaWVmIFZpZGVvIGRldmljZSBBUEkuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhLXZpZGVvZGV2L2NvbmZpZy5oPgorI2luY2x1ZGUgPHBqbWVkaWEtdmlkZW9kZXYvZXJybm8uaD4KKyNpbmNsdWRlIDxwam1lZGlhL2V2ZW50Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9mcmFtZS5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBAZGVmZ3JvdXAgdmlkZW9fZGV2aWNlX3JlZmVyZW5jZSBWaWRlbyBEZXZpY2UgQVBJIFJlZmVyZW5jZQorICogQGluZ3JvdXAgdmlkZW9fZGV2aWNlX2FwaQorICogQGJyaWVmIEFQSSBSZWZlcmVuY2UKKyAqIEB7CisgKi8KKyAKKy8qKgorICogVHlwZSBmb3IgZGV2aWNlIGluZGV4LgorICovCit0eXBlZGVmIHBqX2ludDMyX3QgcGptZWRpYV92aWRfZGV2X2luZGV4OworCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHdpbmRvdyBoYW5kbGUgdHlwZS4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfdmlkX2Rldl9od25kX3R5cGUKK3sKKyAgICAvKioKKyAgICAgKiBUeXBlIG5vbmUuCisgICAgICovCisgICAgUEpNRURJQV9WSURfREVWX0hXTkRfVFlQRV9OT05FLAorCisgICAgLyoqCisgICAgICogTmF0aXZlIHdpbmRvdyBoYW5kbGUgb24gV2luZG93cy4KKyAgICAgKi8KKyAgICBQSk1FRElBX1ZJRF9ERVZfSFdORF9UWVBFX1dJTkRPV1MKKworfSBwam1lZGlhX3ZpZF9kZXZfaHduZF90eXBlOworCisvKioKKyAqIFR5cGUgZm9yIHdpbmRvdyBoYW5kbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2Rldl9od25kCit7CisgICAgLyoqCisgICAgICogVGhlIHdpbmRvdyBoYW5kbGUgdHlwZS4KKyAgICAgKi8KKyAgICBwam1lZGlhX3ZpZF9kZXZfaHduZF90eXBlIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2luZG93IGhhbmRsZS4KKyAgICAgKi8KKyAgICB1bmlvbgorICAgIHsKKwlzdHJ1Y3QgeworCSAgICB2b2lkICAgICpod25kOwkvKio8IEhXTkQgICAgIAkqLworCX0gd2luOworCXN0cnVjdCB7CisJICAgIHZvaWQgICAgKndpbmRvdzsgICAgLyoqPCBXaW5kb3cJKi8KKwkgICAgdm9pZCAgICAqZGlzcGxheTsgICAvKio8IERpc3BsYXkJKi8KKwl9IHgxMTsKKwlzdHJ1Y3QgeworCSAgICB2b2lkICAgICp3aW5kb3c7ICAgIC8qKjwgV2luZG93CSovCisJfSBjb2NvYTsKKwlzdHJ1Y3QgeworCSAgICB2b2lkICAgICp3aW5kb3c7ICAgIC8qKjwgV2luZG93CSovCisJfSBpb3M7CisJdm9pZCAJICAgICp3aW5kb3c7CisgICAgfSBpbmZvOworCit9IHBqbWVkaWFfdmlkX2Rldl9od25kOworCisvKioKKyAqIFBhcmFtZXRlciBmb3Igc3dpdGNoaW5nIGRldmljZSB3aXRoIFBKTUVESUFfVklEX0RFVl9DQVBfU1dJVENIIGNhcGFiaWxpdHkuCisgKiBJbml0aWFsaXplIHRoaXMgd2l0aCBwam1lZGlhX3ZpZF9kZXZfc3dpdGNoX3BhcmFtX2RlZmF1bHQoKQorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9kZXZfc3dpdGNoX3BhcmFtCit7CisgICAgLyoqCisgICAgICogVGFyZ2V0IGRldmljZSBJRCB0byBzd2l0Y2ggdG8uIE9uY2UgdGhlIHN3aXRjaGluZyBpcyBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiB2aWRlbyBzdHJlYW0gd2lsbCB1c2UgdGhpcyBkZXZpY2UgYW5kIHRoZSBvbGQgZGV2aWNlIHdpbGwgYmUgY2xvc2VkLgorICAgICAqLworICAgIHBqbWVkaWFfdmlkX2Rldl9pbmRleCB0YXJnZXRfaWQ7CisKK30gcGptZWRpYV92aWRfZGV2X3N3aXRjaF9wYXJhbTsKKworCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHdpbmRvdyBmbGFncy4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfdmlkX2Rldl93bmRfZmxhZworeworICAgIC8qKgorICAgICAqIFdpbmRvdyB3aXRoIGJvcmRlci4KKyAgICAgKi8KKyAgICBQSk1FRElBX1ZJRF9ERVZfV05EX0JPUkRFUiA9IDEsCisKKyAgICAvKioKKyAgICAgKiBXaW5kb3cgY2FuIGJlIHJlc2l6ZWQuCisgICAgICovCisgICAgUEpNRURJQV9WSURfREVWX1dORF9SRVNJWkFCTEUgPSAyCisKK30gcGptZWRpYV92aWRfZGV2X3duZF9mbGFnOworCisKKy8qKgorICogRGV2aWNlIGluZGV4IGNvbnN0YW50cy4KKyAqLworZW51bSBwam1lZGlhX3ZpZF9kZXZfc3RkX2luZGV4Cit7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdG8gZGVub3RlIGRlZmF1bHQgY2FwdHVyZSBkZXZpY2UKKyAgICAgKi8KKyAgICBQSk1FRElBX1ZJRF9ERUZBVUxUX0NBUFRVUkVfREVWID0gLTEsCisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0byBkZW5vdGUgZGVmYXVsdCByZW5kZXIgZGV2aWNlCisgICAgICovCisgICAgUEpNRURJQV9WSURfREVGQVVMVF9SRU5ERVJfREVWID0gLTIsCisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0byBkZW5vdGUgaW52YWxpZCBkZXZpY2UgaW5kZXguCisgICAgICovCisgICAgUEpNRURJQV9WSURfSU5WQUxJRF9ERVYgPSAtMworfTsKKworCisvKioKKyAqIFRoaXMgZW51bWVyYXRpb24gaWRlbnRpZmllcyB2YXJpb3VzIHZpZGVvIGRldmljZSBjYXBhYmlsaXRpZXMuIFRoZXNlIHZpZGVvCisgKiBjYXBhYmlsaXRpZXMgaW5kaWNhdGVzIHdoYXQgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZworICogdmlkZW8gZGV2aWNlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEFwcGxpY2F0aW9ucyBnZXQgdGhlc2UgY2FwYWJpbGl0aWVzIGluIHRoZSAjcGptZWRpYV92aWRfZGV2X2luZm8gc3RydWN0dXJlLgorICoKKyAqIEFwcGxpY2F0aW9uIGNhbiBhbHNvIHNldCB0aGUgc3BlY2lmaWMgZmVhdHVyZXMvY2FwYWJpbGl0aWVzIHdoZW4gb3BlbmluZworICogdGhlIHZpZGVvIHN0cmVhbSBieSBzZXR0aW5nIHRoZSBcYSBmbGFncyBtZW1iZXIgb2YgI3BqbWVkaWFfdmlkX2Rldl9wYXJhbQorICogc3RydWN0dXJlLgorICoKKyAqIE9uY2UgdmlkZW8gc3RyZWFtIGlzIHJ1bm5pbmcsIGFwcGxpY2F0aW9uIGNhbiBhbHNvIHJldHJpZXZlIG9yIHNldCBzb21lCisgKiBzcGVjaWZpYyB2aWRlbyBjYXBhYmlsaXR5LCBieSB1c2luZyAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9nZXRfY2FwKCkgYW5kCisgKiAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9zZXRfY2FwKCkgYW5kIHNwZWNpZnlpbmcgdGhlIGRlc2lyZWQgY2FwYWJpbGl0eS4gVGhlCisgKiB2YWx1ZSBvZiB0aGUgY2FwYWJpbGl0eSBpcyBzcGVjaWZpZWQgYXMgcG9pbnRlciwgYW5kIGFwcGxpY2F0aW9uIG5lZWRzIHRvCisgKiBzdXBwbHkgdGhlIHBvaW50ZXIgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZSwgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uCisgKiBvZiBlYWNoIG9mIHRoZSBjYXBhYmlsaXR5LgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV92aWRfZGV2X2NhcAoreworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIHZpZGVvIGZvcm1hdHMuIFRoZSB2YWx1ZSBvZiB0aGlzIGNhcGFiaWxpdHkKKyAgICAgKiBpcyByZXByZXNlbnRlZCBieSAjcGptZWRpYV9mb3JtYXQgc3RydWN0dXJlLgorICAgICAqLworICAgIFBKTUVESUFfVklEX0RFVl9DQVBfRk9STUFUID0gMSwKKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIHZpZGVvIGlucHV0IHNjYWxpbmcKKyAgICAgKi8KKyAgICBQSk1FRElBX1ZJRF9ERVZfQ0FQX0lOUFVUX1NDQUxFID0gMiwKKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIHJldHVybmluZyB0aGUgbmF0aXZlIHdpbmRvdyBoYW5kbGUgb2YgdGhlIHZpZGVvIHdpbmRvdy4KKyAgICAgKiBGb3IgcmVuZGVyZXIsIHRoaXMgbWVhbnMgdGhlIHdpbmRvdyBoYW5kbGUgb2YgdGhlIHJlbmRlcmVyIHdpbmRvdywKKyAgICAgKiB3aGlsZSBmb3IgY2FwdHVyZSwgdGhpcyBtZWFucyB0aGUgd2luZG93IGhhbmRsZSBvZiB0aGUgbmF0aXZlIHByZXZpZXcsCisgICAgICogb25seSBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzICBQSk1FRElBX1ZJRF9ERVZfQ0FQX0lOUFVUX1BSRVZJRVcKKyAgICAgKiBjYXBhYmlsaXR5LgorICAgICAqCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY2FwYWJpbGl0eSBpcyBwb2ludGVyIHRvIHBqbWVkaWFfdmlkX2Rldl9od25kCisgICAgICogc3RydWN0dXJlLgorICAgICAqLworICAgIFBKTUVESUFfVklEX0RFVl9DQVBfT1VUUFVUX1dJTkRPVyA9IDQsCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciByZXNpemluZyB2aWRlbyBvdXRwdXQuIFRoaXMgY2FwYWJpbGl0eSBTSE9VTEQgYmUgCisgICAgICogaW1wbGVtZW50ZWQgYnkgcmVuZGVyZXIsIHRvIGFsdGVyIHRoZSB2aWRlbyBvdXRwdXQgZGltZW5zaW9uIG9uIHRoZSBmbHkuCisgICAgICogVmFsdWUgaXMgcGptZWRpYV9yZWN0X3NpemUuIAorICAgICAqLworICAgIFBKTUVESUFfVklEX0RFVl9DQVBfT1VUUFVUX1JFU0laRSA9IDgsCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciBzZXR0aW5nIHRoZSB2aWRlbyB3aW5kb3cncyBwb3NpdGlvbi4KKyAgICAgKiBWYWx1ZSBpcyBwam1lZGlhX2Nvb3JkIHNwZWNpZnlpbmcgdGhlIHdpbmRvdydzIG5ldyBjb29yZGluYXRlLgorICAgICAqLworICAgIFBKTUVESUFfVklEX0RFVl9DQVBfT1VUUFVUX1BPU0lUSU9OID0gMTYsCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciBzZXR0aW5nIHRoZSB2aWRlbyBvdXRwdXQncyB2aXNpYmlsaXR5LgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGNhcGFiaWxpdHkgaXMgYSBwal9ib29sX3QgY29udGFpbmluZyBib29sZWFuCisgICAgICogUEpfVFJVRSBvciBQSl9GQUxTRS4KKyAgICAgKi8KKyAgICBQSk1FRElBX1ZJRF9ERVZfQ0FQX09VVFBVVF9ISURFID0gMzIsCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciBuYXRpdmUgcHJldmlldyBjYXBhYmlsaXR5IGluIGNhcHR1cmUgZGV2aWNlcy4gVmFsdWUgaXMKKyAgICAgKiBwal9ib29sX3QuIFdpdGggbmF0aXZlIHByZXZpZXcsIGNhcHR1cmUgZGV2aWNlIGNhbiBiZSBpbnN0cnVjdGVkIHRvCisgICAgICogc2hvdyBvciBoaWRlIGEgcHJldmlldyB3aW5kb3cgc2hvd2luZyB2aWRlbyBkaXJlY3RseSBmcm9tIHRoZSBjYW1lcmEKKyAgICAgKiBieSBzZXR0aW5nIHRoaXMgY2FwYWJpbGl0eSB0byBQSl9UUlVFIG9yIFBKX0ZBTFNFLiBPbmNlIHRoZSBwcmV2aWV3CisgICAgICogaXMgc3RhcnRlZCwgYXBwbGljYXRpb24gbWF5IHVzZSBQSk1FRElBX1ZJRF9ERVZfQ0FQX09VVFBVVF9XSU5ET1cKKyAgICAgKiBjYXBhYmlsaXR5IHRvIHF1ZXJ5IHRoZSB2aWRvdyB3aW5kb3cuCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBjYXBhYmlsaXR5IGlzIGEgcGpfYm9vbF90IGNvbnRhaW5pbmcgYm9vbGVhbgorICAgICAqIFBKX1RSVUUgb3IgUEpfRkFMU0UuCisgICAgICovCisgICAgUEpNRURJQV9WSURfREVWX0NBUF9JTlBVVF9QUkVWSUVXID0gNjQsCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciBjaGFuZ2luZyB2aWRlbyBvcmllbnRhdGlvbiBpbiByZW5kZXJlciBhbmQgcXVlcnlpbmcKKyAgICAgKiB2aWRlbyBvcmllbnRhdGlvbiBpbmZvIGluIGNhcHR1cmUuIENoYW5naW5nIHZpZGVvIG9yaWVudGF0aW9uIGluCisgICAgICogYSByZW5kZXJlciB3aWxsIHBvdGVudGlhbGx5IGFmZmVjdCB0aGUgc2l6ZSBvZiByZW5kZXIgd2luZG93LAorICAgICAqIGkuZTogd2lkdGggYW5kIGhlaWdodCBzd2FwLiBXaGVuIGEgY2FwdHVyZSBkZXZpY2Ugc3VwcG9ydHMgdGhpcworICAgICAqIGNhcGFiaWxpdHksIGl0IHdpbGwgZ2VuZXJhdGUgZXZlbnQgUEpNRURJQV9FVkVOVF9PUklFTlRfQ0hBTkdFRAorICAgICAqIChzZWUgI3BqbWVkaWFfZXZlbnQpIGV2ZXJ5dGltZSB0aGUgY2FwdHVyZSBvcmllbnRhdGlvbiBpcyBjaGFuZ2VkLgorICAgICAqCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY2FwYWJpbGl0eSBpcyBwam1lZGlhX29yaWVudC4KKyAgICAgKi8KKyAgICBQSk1FRElBX1ZJRF9ERVZfQ0FQX09SSUVOVEFUSU9OID0gMTI4LAorCisgICAgLyoqCisgICAgICogU3VwcG9ydCBmb3IgZmFzdCBzd2l0Y2hpbmcgdG8gYW5vdGhlciBkZXZpY2UuIEEgdmlkZW8gc3RyZWFtIHdpdGggdGhpcworICAgICAqIGNhcGFiaWxpdHkgYWxsb3dzIHJlcGxhY2luZyBvZiBpdHMgdW5kZXJseWluZyBkZXZpY2Ugd2l0aCBhbm90aGVyCisgICAgICogZGV2aWNlLCBzYXZpbmcgdGhlIHVzZXIgZnJvbSBvcGVuaW5nIGEgbmV3IHZpZGVvIHN0cmVhbSBhbmQgZ2V0cyBhIG11Y2gKKyAgICAgKiBmYXN0ZXIgYW5kIHNtb290aGVyIHN3aXRjaGluZyBhY3Rpb24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgZXZlbiB3aGVuIHRoaXMgY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQgYnkgYSBkZXZpY2UsIGl0IG1heQorICAgICAqIG5vdCBiZSBhYmxlIHRvIHN3aXRjaCB0byBhcmJpdHJhcnkgZGV2aWNlLiBBcHBsaWNhdGlvbiBtdXN0IGFsd2F5cworICAgICAqIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG9wZXJhdGlvbiB0byB2ZXJpZnkgdGhhdCBzd2l0Y2hpbmcgaGFzCisgICAgICogb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgY3VycmVudGx5IHdyaXRlLW9ubHkgKGkuZS4gc2V0LW9ubHkpLgorICAgICAqCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY2FwYWJpbGl0eSBpcyBwb2ludGVyIHRvIHBqbWVkaWFfdmlkX2Rldl9zd2l0Y2hfcGFyYW0KKyAgICAgKiBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgUEpNRURJQV9WSURfREVWX0NBUF9TV0lUQ0ggPSAyNTYsCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciBzZXR0aW5nIHRoZSBvdXRwdXQgdmlkZW8gd2luZG93J3MgZmxhZ3MuCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY2FwYWJpbGl0eSBpcyBhIGJpdG1hc2sgY29tYmluYXRpb24gb2YKKyAgICAgKiAjcGptZWRpYV92aWRfZGV2X3duZF9mbGFnLgorICAgICAqLworICAgIFBKTUVESUFfVklEX0RFVl9DQVBfT1VUUFVUX1dJTkRPV19GTEFHUyA9IDUxMiwKKworICAgIC8qKgorICAgICAqIEVuZCBvZiBzdGFuZGFyZCBjYXBhYmlsaXR5CisgICAgICovCisgICAgUEpNRURJQV9WSURfREVWX0NBUF9NQVggPSAxNjM4NAorCit9IHBqbWVkaWFfdmlkX2Rldl9jYXA7CisKKy8qKgorICogRGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSByZXR1cm5lZCBieSAjcGptZWRpYV92aWRfZGV2X2dldF9pbmZvKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2Rldl9pbmZvCit7CisgICAgLyoqIFRoZSBkZXZpY2UgSUQgKi8KKyAgICBwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQ7CisKKyAgICAvKiogVGhlIGRldmljZSBuYW1lICovCisgICAgY2hhciBuYW1lWzY0XTsKKworICAgIC8qKiBUaGUgdW5kZXJseWluZyBkcml2ZXIgbmFtZSAqLworICAgIGNoYXIgZHJpdmVyWzMyXTsKKworICAgIC8qKiAKKyAgICAgKiBUaGUgc3VwcG9ydGVkIGRpcmVjdGlvbiBvZiB0aGUgdmlkZW8gZGV2aWNlLCBpLmUuIHdoZXRoZXIgaXQgc3VwcG9ydHMgCisgICAgICogY2FwdHVyZSBvbmx5LCByZW5kZXIgb25seSwgb3IgYm90aC4KKyAgICAgKi8KKyAgICBwam1lZGlhX2RpciBkaXI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBjYWxsYmFjay4gRGV2aWNlcyB0aGF0IGltcGxlbWVudAorICAgICAqICJhY3RpdmUgaW50ZXJmYWNlIiB3aWxsIGFjdGl2ZWx5IGNhbGwgdGhlIGNhbGxiYWNrcyB0byBnaXZlIG9yIGFzayBmb3IKKyAgICAgKiB2aWRlbyBmcmFtZXMuIElmIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGNhbGxiYWNrLCBhcHBsaWNhdGlvbgorICAgICAqIG11c3QgYWN0aXZlbHkgcmVxdWVzdCBvciBnaXZlIHZpZGVvIGZyYW1lcyBmcm9tL3RvIHRoZSBkZXZpY2UgYnkgdXNpbmcKKyAgICAgKiBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtX2dldF9mcmFtZSgpL3BqbWVkaWFfdmlkX2Rldl9zdHJlYW1fcHV0X2ZyYW1lKCkuCisgICAgICovCisgICAgcGpfYm9vbF90IGhhc19jYWxsYmFjazsKKworICAgIC8qKiBEZXZpY2UgY2FwYWJpbGl0aWVzLCBhcyBiaXRtYXNrIGNvbWJpbmF0aW9uIG9mICNwam1lZGlhX3ZpZF9kZXZfY2FwICovCisgICAgdW5zaWduZWQgY2FwczsKKworICAgIC8qKiBOdW1iZXIgb2YgdmlkZW8gZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UgKi8KKyAgICB1bnNpZ25lZCBmbXRfY250OworCisgICAgLyoqIAorICAgICAqIEFycmF5IG9mIHN1cHBvcnRlZCB2aWRlbyBmb3JtYXRzLiBTb21lIGZpZWxkcyBpbiBlYWNoIHN1cHBvcnRlZCB2aWRlbworICAgICAqIGZvcm1hdCBtYXkgYmUgc2V0IHRvIHplcm8gb3Igb2YgInVua25vd24iIHZhbHVlLCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICAgICAqIHZhbHVlIGlzIHVua25vd24gb3Igc2hvdWxkIGJlIGlnbm9yZWQuIFdoZW4gdGhlc2UgdmFsdWUgYXJlIG5vdCBzZXQKKyAgICAgKiB0byB6ZXJvLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZXhhY3QgZm9ybWF0IGNvbWJpbmF0aW9uIGlzIGJlaW5nIHVzZWQuIAorICAgICAqLworICAgIHBqbWVkaWFfZm9ybWF0IGZtdFtQSk1FRElBX1ZJRF9ERVZfSU5GT19GTVRfQ05UXTsKKworfSBwam1lZGlhX3ZpZF9kZXZfaW5mbzsKKworCisvKiogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgcGptZWRpYV92aWRfZGV2X3N0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfZGV2X3N0cmVhbSBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9kZXZfY2IKK3sKKyAgICAvKioKKyAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGJ5IGNhcHR1cmVyIHN0cmVhbSB3aGVuIGl0IGhhcyBjYXB0dXJlZCB0aGUKKyAgICAqIHdob2xlIHBhY2tldCB3b3J0aCBvZiB2aWRlbyBzYW1wbGVzLgorICAgICoKKyAgICAqIEBwYXJhbSBzdHJlYW0JICAgVGhlIHZpZGVvIHN0cmVhbS4KKyAgICAqIEBwYXJhbSB1c2VyX2RhdGEgICAgIFVzZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4KKyAgICAqIEBwYXJhbSBmcmFtZSAgICAgICAgIENhcHR1cmVkIGZyYW1lLgorICAgICoKKyAgICAqIEByZXR1cm4gICAgICAgICAgICAgIFJldHVybmluZyBub24tUEpfU1VDQ0VTUyB3aWxsIGNhdXNlIHRoZSB2aWRlbworICAgICogICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHRvIHN0b3AKKyAgICAqLworICAgIHBqX3N0YXR1c190ICgqY2FwdHVyZV9jYikocGptZWRpYV92aWRfZGV2X3N0cmVhbSAqc3RyZWFtLAorCQkgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfZnJhbWUgKmZyYW1lKTsKKworICAgIC8qKgorICAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgcmVuZGVyZXIgc3RyZWFtIHdoZW4gaXQgbmVlZHMgYWRkaXRpb25hbAorICAgICogZGF0YSB0byBiZSByZW5kZXJlZCBieSB0aGUgZGV2aWNlLiBBcHBsaWNhdGlvbiBtdXN0IGZpbGwgaW4gdGhlIHdob2xlCisgICAgKiBvZiBvdXRwdXQgYnVmZmVyIHdpdGggdmlkZW8gc2FtcGxlcy4KKyAgICAqCisgICAgKiBUaGUgZnJhbWUgYXJndW1lbnQgY29udGFpbnMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgKiAgLSB0aW1lc3RhbXAgICAgICAgICBSZW5kZXJpbmcgdGltZXN0YW1wLCBpbiBzYW1wbGVzLgorICAgICogIC0gYnVmICAgICAgICAgICAgICAgQnVmZmVyIHRvIGJlIGZpbGxlZCBvdXQgYnkgYXBwbGljYXRpb24uCisgICAgKiAgLSBzaXplICAgICAgICAgICAgICBUaGUgc2l6ZSByZXF1ZXN0ZWQgaW4gYnl0ZXMsIHdoaWNoIHdpbGwgYmUgZXF1YWwKKyAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzaXplIG9mIG9uZSB3aG9sZSBwYWNrZXQuCisgICAgKgorICAgICogQHBhcmFtIHN0cmVhbQkgICBUaGUgdmlkZW8gc3RyZWFtLgorICAgICogQHBhcmFtIHVzZXJfZGF0YSAgICAgVXNlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtLgorICAgICogQHBhcmFtIGZyYW1lICAgICAgICAgVmlkZW8gZnJhbWUsIHdoaWNoIGJ1ZmZlciBpcyB0byBiZSBmaWxsZWQgaW4gYnkKKyAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAqCisgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBSZXR1cm5pbmcgbm9uLVBKX1NVQ0NFU1Mgd2lsbCBjYXVzZSB0aGUgdmlkZW8gCisgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdG8gc3RvcAorICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpyZW5kZXJfY2IpKHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2ZyYW1lICpmcmFtZSk7CisKK30gcGptZWRpYV92aWRfZGV2X2NiOworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgc3BlY2lmaWVzIHRoZSBwYXJhbWV0ZXJzIHRvIG9wZW4gdGhlIHZpZGVvIHN0cmVhbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfZGV2X3BhcmFtCit7CisgICAgLyoqCisgICAgICogVGhlIHZpZGVvIGRpcmVjdGlvbi4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeS4KKyAgICAgKi8KKyAgICBwam1lZGlhX2RpciBkaXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlkZW8gY2FwdHVyZSBkZXZpY2UgSUQuIFRoaXMgc2V0dGluZyBpcyBtYW5kYXRvcnkgaWYgdGhlIHZpZGVvCisgICAgICogZGlyZWN0aW9uIGluY2x1ZGVzIGlucHV0L2NhcHR1cmUgZGlyZWN0aW9uLgorICAgICAqLworICAgIHBqbWVkaWFfdmlkX2Rldl9pbmRleCBjYXBfaWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlkZW8gcmVuZGVyIGRldmljZSBJRC4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeSBpZiB0aGUgdmlkZW8KKyAgICAgKiBkaXJlY3Rpb24gaW5jbHVkZXMgb3V0cHV0L3JlbmRlciBkaXJlY3Rpb24uCisgICAgICovCisgICAgcGptZWRpYV92aWRfZGV2X2luZGV4IHJlbmRfaWQ7CisKKyAgICAvKiogCisgICAgICogVmlkZW8gY2xvY2sgcmF0ZS4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeSBpZiB0aGUgdmlkZW8KKyAgICAgKiBkaXJlY3Rpb24gaW5jbHVkZXMgaW5wdXQvY2FwdHVyZSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjbG9ja19yYXRlOworCisgICAgLyoqCisgICAgICogVmlkZW8gZnJhbWUgcmF0ZS4gVGhpcyBzZXR0aW5nIGlzIG1hbmRhdG9yeSBpZiB0aGUgdmlkZW8KKyAgICAgKiBkaXJlY3Rpb24gaW5jbHVkZXMgaW5wdXQvY2FwdHVyZSBkaXJlY3Rpb24KKyAgICAgKi8KKy8vICAgIHBqbWVkaWFfcmF0aW8gZnJhbWVfcmF0ZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZmxhZ3Mgc3BlY2lmaWVzIHdoaWNoIG9mIHRoZSBvcHRpb25hbCBzZXR0aW5ncyBhcmUgdmFsaWQgaW4gdGhpcworICAgICAqIHN0cnVjdHVyZS4gVGhlIGZsYWdzIGlzIGJpdG1hc2sgY29tYmluYXRpb24gb2YgcGptZWRpYV92aWRfZGV2X2NhcC4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBmbGFnczsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmlkZW8gZm9ybWF0LiBUaGlzIHNldHRpbmcgaXMgbWFuZGF0b3J5LgorICAgICAqLworICAgIHBqbWVkaWFfZm9ybWF0IGZtdDsKKworICAgIC8qKgorICAgICAqIFdpbmRvdyBmb3IgdGhlIHJlbmRlcmVyIHRvIGRpc3BsYXkgdGhlIHZpZGVvLiBUaGlzIHNldHRpbmcgaXMgb3B0aW9uYWwsCisgICAgICogYW5kIHdpbGwgb25seSBiZSB1c2VkIGlmIFBKTUVESUFfVklEX0RFVl9DQVBfT1VUUFVUX1dJTkRPVyBpcyBzZXQgaW4gCisgICAgICogdGhlIGZsYWdzLgorICAgICAqLworICAgIHBqbWVkaWFfdmlkX2Rldl9od25kIHdpbmRvdzsKKworICAgIC8qKgorICAgICAqIFZpZGVvIGRpc3BsYXkgc2l6ZS4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgCisgICAgICogaWYgUEpNRURJQV9WSURfREVWX0NBUF9PVVRQVVRfUkVTSVpFIGlzIHNldCBpbiB0aGUgZmxhZ3MuCisgICAgICovCisgICAgcGptZWRpYV9yZWN0X3NpemUgZGlzcF9zaXplOworCisgICAgLyoqCisgICAgICogVmlkZW8gd2luZG93IHBvc2l0aW9uLiBUaGlzIHNldHRpbmcgaXMgb3B0aW9uYWwsIGFuZCB3aWxsIG9ubHkgYmUgdXNlZAorICAgICAqIGlmIFBKTUVESUFfVklEX0RFVl9DQVBfT1VUUFVUX1BPU0lUSU9OIGlzIHNldCBpbiB0aGUgZmxhZ3MuCisgICAgICovCisgICAgcGptZWRpYV9jb29yZCB3aW5kb3dfcG9zOworCisgICAgLyoqCisgICAgICogVmlkZW8gd2luZG93J3MgdmlzaWJpbGl0eS4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlCisgICAgICogdXNlZCBpZiBQSk1FRElBX1ZJRF9ERVZfQ0FQX09VVFBVVF9ISURFIGlzIHNldCBpbiB0aGUgZmxhZ3MuCisgICAgICovCisgICAgcGpfYm9vbF90IHdpbmRvd19oaWRlOworCisgICAgLyoqCisgICAgICogRW5hYmxlIGJ1aWx0LWluIHByZXZpZXcuIFRoaXMgc2V0dGluZyBpcyBvcHRpb25hbCBhbmQgaXMgb25seSB1c2VkCisgICAgICogaWYgUEpNRURJQV9WSURfREVWX0NBUF9JTlBVVF9QUkVWSUVXIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkIGFuZAorICAgICAqIHNldCBpbiB0aGUgZmxhZ3MuCisgICAgICovCisgICAgcGpfYm9vbF90IG5hdGl2ZV9wcmV2aWV3OworCisgICAgLyoqCisgICAgICogVmlkZW8gb3JpZW50YXRpb24uIFRoaXMgc2V0dGluZyBpcyBvcHRpb25hbCBhbmQgaXMgb25seSB1c2VkIGlmCisgICAgICogUEpNRURJQV9WSURfREVWX0NBUF9PUklFTlRBVElPTiBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZCBhbmQgaXMKKyAgICAgKiBzZXQgaW4gdGhlIGZsYWdzLgorICAgICAqLworICAgIHBqbWVkaWFfb3JpZW50IG9yaWVudDsKKworICAgIC8qKgorICAgICAqIFZpZGVvIHdpbmRvdyBmbGFncy4gVGhpcyBzZXR0aW5nIGlzIG9wdGlvbmFsLCBhbmQgd2lsbCBvbmx5IGJlIHVzZWQKKyAgICAgKiBpZiBQSk1FRElBX1ZJRF9ERVZfQ0FQX09VVFBVVF9XSU5ET1dfRkxBR1MgaXMgc2V0IGluIHRoZSBmbGFncy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCB3aW5kb3dfZmxhZ3M7CisKK30gcGptZWRpYV92aWRfZGV2X3BhcmFtOworCisKKy8qKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB2aWRlbyBkZXZpY2UgZmFjdG9yeSAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfZGV2X2ZhY3RvcnkgcGptZWRpYV92aWRfZGV2X2ZhY3Rvcnk7CisKKy8qIHR5cGVkZWYgZm9yIGZhY3RvcnkgY3JlYXRpb24gZnVuY3Rpb24gKi8KK3R5cGVkZWYgcGptZWRpYV92aWRfZGV2X2ZhY3RvcnkqCisoKnBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5X2NyZWF0ZV9mdW5jX3B0cikocGpfcG9vbF9mYWN0b3J5Kik7CisKKy8qKgorICogSW5pdGlhbGl6ZSBwam1lZGlhX3ZpZF9kZXZfc3dpdGNoX3BhcmFtLgorICoKKyAqIEBwYXJhbSBwCSAgICBQYXJhbWV0ZXIgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKi8KK1BKX0lOTElORSh2b2lkKQorcGptZWRpYV92aWRfZGV2X3N3aXRjaF9wYXJhbV9kZWZhdWx0KHBqbWVkaWFfdmlkX2Rldl9zd2l0Y2hfcGFyYW0gKnApCit7CisgICAgcGpfYnplcm8ocCwgc2l6ZW9mKCpwKSk7CisgICAgcC0+dGFyZ2V0X2lkID0gUEpNRURJQV9WSURfSU5WQUxJRF9ERVY7Cit9CisKKy8qKgorICogR2V0IHN0cmluZyBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIGNhcGFiaWxpdHkuCisgKgorICogQHBhcmFtIGNhcCAgICAgICBUaGUgY2FwYWJpbGl0eSBJRC4KKyAqIEBwYXJhbSBwX2Rlc2MgICAgT3B0aW9uYWwgcG9pbnRlciB3aGljaCB3aWxsIGJlIGZpbGxlZCB3aXRoIGxvbmdlcgorICogICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBhYm91dCB0aGUgY2FwYWJpbGl0eS4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIENhcGFiaWxpdHkgbmFtZS4KKyAqLworUEpfREVDTChjb25zdCBjaGFyKikgcGptZWRpYV92aWRfZGV2X2NhcF9uYW1lKHBqbWVkaWFfdmlkX2Rldl9jYXAgY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipwX2Rlc2MpOworCisKKy8qKgorICogU2V0IGEgY2FwYWJpbGl0eSBmaWVsZCB2YWx1ZSBpbiAjcGptZWRpYV92aWRfZGV2X3BhcmFtIHN0cnVjdHVyZS4gVGhpcyB3aWxsCisgKiBhbHNvIHNldCB0aGUgZmxhZ3MgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgY2FwYWJpbGl0eSBpbiB0aGUgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBwYXJhbSAgICAgVGhlIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBjYXAgICAgICAgVGhlIHZpZGVvIGNhcGFiaWxpdHkgd2hpY2ggdmFsdWUgaXMgdG8gYmUgc2V0LgorICogQHBhcmFtIHB2YWwgICAgICBQb2ludGVyIHRvIHZhbHVlLiBQbGVhc2Ugc2VlIHRoZSB0eXBlIG9mIHZhbHVlIHRvCisgKiAgICAgICAgICAgICAgICAgIGJlIHN1cHBsaWVkIGluIHRoZSBwam1lZGlhX3ZpZF9kZXZfY2FwIGRvY3VtZW50YXRpb24uCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfZGV2X3BhcmFtX3NldF9jYXAocGptZWRpYV92aWRfZGV2X3BhcmFtICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdmlkX2Rldl9jYXAgY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcHZhbCk7CisKKworLyoqCisgKiBHZXQgYSBjYXBhYmlsaXR5IGZpZWxkIHZhbHVlIGZyb20gI3BqbWVkaWFfdmlkX2Rldl9wYXJhbSBzdHJ1Y3R1cmUuIFRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIFBKTUVESUFfRVZJRF9JTlZDQVAgZXJyb3IgaWYgdGhlIGZsYWcgZm9yIHRoYXQKKyAqIGNhcGFiaWxpdHkgaXMgbm90IHNldCBpbiB0aGUgZmxhZ3MgZmllbGQgaW4gdGhlIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gcGFyYW0gICAgIFRoZSBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gY2FwICAgICAgIFRoZSB2aWRlbyBjYXBhYmlsaXR5IHdoaWNoIHZhbHVlIGlzIHRvIGJlIHJldHJpZXZlZC4KKyAqIEBwYXJhbSBwdmFsICAgICAgUG9pbnRlciB0byB2YWx1ZS4gUGxlYXNlIHNlZSB0aGUgdHlwZSBvZiB2YWx1ZSB0bworICogICAgICAgICAgICAgICAgICBiZSBzdXBwbGllZCBpbiB0aGUgcGptZWRpYV92aWRfZGV2X2NhcCBkb2N1bWVudGF0aW9uLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfdmlkX2Rldl9wYXJhbV9nZXRfY2FwKGNvbnN0IHBqbWVkaWFfdmlkX2Rldl9wYXJhbSAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZF9kZXZfY2FwIGNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2YWwpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHZpZGVvIGRldmljZSBzdWJzeXN0ZW0uIFRoaXMgd2lsbCByZWdpc3RlciBhbGwgc3VwcG9ydGVkCisgKiB2aWRlbyBkZXZpY2UgZmFjdG9yaWVzIHRvIHRoZSB2aWRlbyBkZXZpY2Ugc3Vic3lzdGVtLiBUaGlzIGZ1bmN0aW9uIG1heSBiZQorICogY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgZWFjaCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIHRoZQorICogY29ycmVzcG9uZGluZyAjcGptZWRpYV92aWRfZGV2X3N1YnN5c19zaHV0ZG93bigpIGNhbGwuCisgKgorICogQHBhcmFtIHBmICAgICAgICBUaGUgcG9vbCBmYWN0b3J5LgorICoKKyAqIEByZXR1cm4gICAgICAgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfZGV2X3N1YnN5c19pbml0KHBqX3Bvb2xfZmFjdG9yeSAqcGYpOworCisKKy8qKgorICogR2V0IHRoZSBwb29sIGZhY3RvcnkgcmVnaXN0ZXJlZCB0byB0aGUgdmlkZW8gZGV2aWNlIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIFRoZSBwb29sIGZhY3RvcnkuCisgKi8KK1BKX0RFQ0wocGpfcG9vbF9mYWN0b3J5KikgcGptZWRpYV92aWRfZGV2X3N1YnN5c19nZXRfcG9vbF9mYWN0b3J5KHZvaWQpOworCisKKy8qKgorICogU2h1dGRvd24gdGhlIHZpZGVvIGRldmljZSBzdWJzeXN0ZW0uIFRoaXMgd2lsbCBkZXN0cm95IGFsbCB2aWRlbyBkZXZpY2UKKyAqIGZhY3RvcmllcyByZWdpc3RlcmVkIGluIHRoZSB2aWRlbyBkZXZpY2Ugc3Vic3lzdGVtLiBOb3RlIHRoYXQgY3VycmVudGx5CisgKiBvcGVuZWQgdmlkZW8gc3RyZWFtcyBtYXkgb3IgbWF5IG5vdCBiZSBjbG9zZWQsIGRlcGVuZGluZyBvbiB0aGUKKyAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2aWRlbyBkZXZpY2UgZmFjdG9yaWVzLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfZGV2X3N1YnN5c19zaHV0ZG93bih2b2lkKTsKKworCisvKioKKyAqIFJlZ2lzdGVyIGEgc3VwcG9ydGVkIHZpZGVvIGRldmljZSBmYWN0b3J5IHRvIHRoZSB2aWRlbyBkZXZpY2Ugc3Vic3lzdGVtLgorICogQXBwbGljYXRpb24gY2FuIGVpdGhlciByZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgZmFjdG9yeSwgb3IKKyAqIGFuIGluc3RhbmNlIG9mIGFuIGFscmVhZHkgY3JlYXRlZCBmYWN0b3J5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcKKyAqICNwam1lZGlhX3ZpZF9kZXZfc3Vic3lzX2luaXQoKS4KKyAqCisgKiBAcGFyYW0gdmRmICAgICAgIFRoZSBmYWN0b3J5IGNyZWF0aW9uIGZ1bmN0aW9uLiBFaXRoZXIgdmRmIG9yIGZhY3RvcnkKKyAqIAkJICAgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkLgorICogQHBhcmFtIGZhY3RvcnkgICBGYWN0b3J5IGluc3RhbmNlLiBFaXRoZXIgdmRmIG9yIGZhY3RvcnkKKyAqIAkJICAgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfdmlkX3JlZ2lzdGVyX2ZhY3RvcnkocGptZWRpYV92aWRfZGV2X2ZhY3RvcnlfY3JlYXRlX2Z1bmNfcHRyIHZkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2ZhY3RvcnkgKmZhY3RvcnkpOworCisKKy8qKgorICogVW5yZWdpc3RlciBhIHZpZGVvIGRldmljZSBmYWN0b3J5IGZyb20gdGhlIHZpZGVvIGRldmljZSBzdWJzeXN0ZW0uIFRoaXMKKyAqIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nICNwam1lZGlhX3ZpZF9kZXZfc3Vic3lzX2luaXQoKS4KKyAqIERldmljZXMgZnJvbSB0aGlzIGZhY3Rvcnkgd2lsbCBiZSB1bmxpc3RlZC4gSWYgYSBkZXZpY2UgZnJvbSB0aGlzIGZhY3RvcnkKKyAqIGlzIGN1cnJlbnRseSBpbiB1c2UsIHRoZW4gdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyAqCisgKiBAcGFyYW0gdmRmICAgICAgIFRoZSB2aWRlbyBkZXZpY2UgZmFjdG9yeS4gRWl0aGVyIHZkZiBvciBmYWN0b3J5IGFyZ3VtZW50CisgKiAJCSAgICBtdXN0IGJlIHNwZWNpZmllZC4KKyAqIEBwYXJhbSBmYWN0b3J5ICAgVGhlIGZhY3RvcnkgaW5zdGFuY2UuIEVpdGhlciB2ZGYgb3IgZmFjdG9yeSBhcmd1bWVudAorICogCQkgICAgbXVzdCBiZSBzcGVjaWZpZWQuCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfdW5yZWdpc3Rlcl9mYWN0b3J5KHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5X2NyZWF0ZV9mdW5jX3B0ciB2ZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2ZhY3RvcnkgKmZhY3RvcnkpOworCisKKy8qKgorICogUmVmcmVzaCB0aGUgbGlzdCBvZiB2aWRlbyBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLiBUaGlzIGZ1bmN0aW9uCisgKiB3aWxsIG9ubHkgcmVmcmVzaCB0aGUgbGlzdCBvZiB2aWRlb28gZGV2aWNlIHNvIGFsbCBhY3RpdmUgdmlkZW8gc3RyZWFtcyB3aWxsCisgKiBiZSB1bmFmZmVjdGVkLiBBZnRlciByZWZyZXNoaW5nIHRoZSBkZXZpY2UgbGlzdCwgYXBwbGljYXRpb24gTVVTVCBtYWtlIHN1cmUKKyAqIHRvIHVwZGF0ZSBhbGwgaW5kZXggcmVmZXJlbmNlcyB0byB2aWRlbyBkZXZpY2VzIChpLmUuIGFsbCB2YXJpYWJsZXMgb2YgdHlwZQorICogcGptZWRpYV92aWRfZGV2X2luZGV4KSBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHZpZGVvIGRldmljZQorICogaW5kZXggYXMgaXRzIHBhcmFtZXRlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQllcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9kZXZfcmVmcmVzaCh2b2lkKTsKKworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIHZpZGVvIGRldmljZXMgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCisgKgorICogQHJldHVybiAgICAgICAgICBUaGUgbnVtYmVyIG9mIHZpZGVvIGRldmljZXMgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCisgKi8KK1BKX0RFQ0wodW5zaWduZWQpIHBqbWVkaWFfdmlkX2Rldl9jb3VudCh2b2lkKTsKKworCisvKioKKyAqIEdldCBkZXZpY2UgaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIGlkICAgICAgICBUaGUgdmlkZW8gZGV2aWNlIElELgorICogQHBhcmFtIGluZm8gICAgICBUaGUgZGV2aWNlIGluZm9ybWF0aW9uIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoaXMKKyAqICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb25jZSBpdCByZXR1cm5zIHN1Y2Nlc3NmdWxseS4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgICAgICAgICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2Rldl9nZXRfaW5mbyhwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2luZm8gKmluZm8pOworCisKKy8qKgorICogTG9va3VwIGRldmljZSBpbmRleCBiYXNlZCBvbiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gZHJ2X25hbWUgIFRoZSBkcml2ZXIgbmFtZS4KKyAqIEBwYXJhbSBkZXZfbmFtZSAgVGhlIGRldmljZSBuYW1lLgorICogQHBhcmFtIGlkICAgICAgICBQb2ludGVyIHRvIHN0b3JlIHRoZSByZXR1cm5lZCBkZXZpY2UgSUQuCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIGlmIHRoZSBkZXZpY2UgY2FuIGJlIGZvdW5kLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9kZXZfbG9va3VwKGNvbnN0IGNoYXIgKmRydl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2luZGV4ICppZCk7CisKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSB2aWRlbyBkZXZpY2UgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUKKyAqIHNwZWNpZmllZCBkZXZpY2UuCisgKgorICogQHBhcmFtIGlkICAgICAgICBUaGUgdmlkZW8gZGV2aWNlIElELgorICogQHBhcmFtIHBhcmFtICAgICBUaGUgdmlkZW8gZGV2aWNlIHBhcmFtZXRlcnMgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZAorICogICAgICAgICAgICAgICAgICBieSB0aGlzIGZ1bmN0aW9uIG9uY2UgaXQgcmV0dXJucyBzdWNjZXNzZnVsbHkuCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfZGV2X2RlZmF1bHRfcGFyYW0ocGpfcG9vbF90ICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X2luZGV4IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfZGV2X3BhcmFtICpwYXJhbSk7CisKKworLyoqCisgKiBPcGVuIHZpZGVvIHN0cmVhbSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBJZiBzdHJlYW0gaXMKKyAqIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIFBKX1NVQ0NFU1MgYW5kIHRoZQorICogc3RyZWFtIHBvaW50ZXIgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgcF9zdHJtIGFyZ3VtZW50LgorICoKKyAqIFRoZSBvcGVuZWQgc3RyZWFtIG1heSBoYXZlIGJlZW4gb3BlbmVkIHdpdGggZGlmZmVyZW50IHNpemUgYW5kIGZwcworICogdGhhbiB0aGUgcmVxdWVzdGVkIHZhbHVlcyBpbiB0aGUgXGEgcGFyYW0gYXJndW1lbnQuIEFwcGxpY2F0aW9uIHNob3VsZAorICogY2hlY2sgdGhlIGFjdHVhbCBzaXplIGFuZCBmcHMgdGhhdCB0aGUgc3RyZWFtIHdhcyBvcGVuZWQgd2l0aCBieSBpbnNwZWN0aW5nCisgKiB0aGUgdmFsdWVzIGluIHRoZSBcYSBwYXJhbSBhcmd1bWVudCBhbmQgc2VlIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkLiBBbHNvCisgKiBpZiB0aGUgZGV2aWNlIElEIGluIHRoZSBcYSBwYXJhbSBzcGVjaWZpZXMgZGVmYXVsdCBkZXZpY2UsIGl0IG1heSBiZQorICogcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIGRldmljZSBJRCB1cG9uIHJldHVybi4KKyAqCisgKiBAcGFyYW0gcGFyYW0gICAgICAgICBPbiBpbnB1dCwgaXQgc3BlY2lmaWVzIHRoZSB2aWRlbyBkZXZpY2UgcGFyYW1ldGVycworICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIHN0cmVhbS4gT24gb3V0cHV0LCB0aGlzIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgIHNldCB0byB0aGUgYWN0dWFsIHZpZGVvIGRldmljZSBwYXJhbWV0ZXJzIHVzZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIG9wZW4gdGhlIHN0cmVhbS4KKyAqIEBwYXJhbSBjYiAgICAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdmlkZW8gc3RyZWFtCisgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuCisgKiBAcGFyYW0gdXNlcl9kYXRhICAgICBBcmJpdHJhcnkgdXNlciBkYXRhLCB3aGljaCB3aWxsIGJlIGdpdmVuIGJhY2sgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuCisgKiBAcGFyYW0gcF9zdHJtICAgICAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfZGV2X3N0cmVhbV9jcmVhdGUoCisJCQkJCSAgICBwam1lZGlhX3ZpZF9kZXZfcGFyYW0gKnBhcmFtLAorCQkJCQkgICAgY29uc3QgcGptZWRpYV92aWRfZGV2X2NiICpjYiwKKwkJCQkJICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKipwX3N0cm0pOworCisvKioKKyAqIEdldCB0aGUgcnVubmluZyBwYXJhbWV0ZXJzIGZvciB0aGUgc3BlY2lmaWVkIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RybSAgICAgIFRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gcGFyYW0gICAgIFZpZGVvIHN0cmVhbSBwYXJhbWV0ZXJzIHRvIGJlIGZpbGxlZCBpbiBieSB0aGlzCisgKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uY2UgaXQgcmV0dXJucyBzdWNjZXNzZnVsbHkuCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtX2dldF9wYXJhbSgKKwkJCQkJICAgIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdmlkX2Rldl9wYXJhbSAqcGFyYW0pOworCisvKioKKyAqIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBjYXBhYmlsaXR5IG9mIHRoZSB2aWRlbyBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cm0gICAgICBUaGUgdmlkZW8gc3RyZWFtLgorICogQHBhcmFtIGNhcCAgICAgICBUaGUgdmlkZW8gY2FwYWJpbGl0eSB3aGljaCB2YWx1ZSBpcyB0byBiZSByZXRyaWV2ZWQuCisgKiBAcGFyYW0gdmFsdWUgICAgIFBvaW50ZXIgdG8gdmFsdWUgdG8gYmUgZmlsbGVkIGluIGJ5IHRoaXMgZnVuY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgb25jZSBpdCByZXR1cm5zIHN1Y2Nlc3NmdWxseS4gIFBsZWFzZSBzZWUgdGhlIHR5cGUKKyAqICAgICAgICAgICAgICAgICAgb2YgdmFsdWUgdG8gYmUgc3VwcGxpZWQgaW4gdGhlIHBqbWVkaWFfdmlkX2Rldl9jYXAKKyAqICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgICAgICAgICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW1fZ2V0X2NhcCgKKwkJCQkJICAgIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisJCQkJCSAgICBwam1lZGlhX3ZpZF9kZXZfY2FwIGNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUpOworCisvKioKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBjYXBhYmlsaXR5IG9mIHRoZSB2aWRlbyBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cm0gICAgICBUaGUgdmlkZW8gc3RyZWFtLgorICogQHBhcmFtIGNhcCAgICAgICBUaGUgdmlkZW8gY2FwYWJpbGl0eSB3aGljaCB2YWx1ZSBpcyB0byBiZSBzZXQuCisgKiBAcGFyYW0gdmFsdWUgICAgIFBvaW50ZXIgdG8gdmFsdWUuIFBsZWFzZSBzZWUgdGhlIHR5cGUgb2YgdmFsdWUgdG8KKyAqICAgICAgICAgICAgICAgICAgYmUgc3VwcGxpZWQgaW4gdGhlIHBqbWVkaWFfdmlkX2Rldl9jYXAgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgICAgICAgICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW1fc2V0X2NhcCgKKwkJCQkJICAgIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisJCQkJCSAgICBwam1lZGlhX3ZpZF9kZXZfY2FwIGNhcCwKKwkJCQkJICAgIGNvbnN0IHZvaWQgKnZhbHVlKTsKKworLyoqCisgKiBTdGFydCB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJtICAgICAgVGhlIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgICAgICAgICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW1fc3RhcnQoCisJCQkJCSAgICBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtICpzdHJtKTsKKworLyoqCisgKiBRdWVyeSB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RhcnRlZC4KKyAqCisgKiBAcGFyYW0gc3RybQkgICAgVGhlIHZpZGVvIHN0cmVhbQorICoKKyAqIEByZXR1cm4JICAgIFBKX1RSVUUgaWYgdGhlIHZpZGVvIHN0cmVhbSBoYXMgYmVlbiBzdGFydGVkLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV92aWRfZGV2X3N0cmVhbV9pc19ydW5uaW5nKHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0pOworCisKKy8qKgorICogUmVxdWVzdCBvbmUgZnJhbWUgZnJvbSB0aGUgc3RyZWFtLiBBcHBsaWNhdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqIHBlcmlvZGljYWxseSBvbmx5IGlmIHRoZSBzdHJlYW0gZG9lc24ndCBzdXBwb3J0ICJhY3RpdmUgaW50ZXJmYWNlIiwgaS5lLgorICogdGhlIHBqbWVkaWFfdmlkX2Rldl9pbmZvLmhhc19jYWxsYmFjayBtZW1iZXIgaXMgUEpfRkFMU0UuCisgKgorICogQHBhcmFtIHN0cm0gICAgICBUaGUgdmlkZW8gc3RyZWFtLgorICogQHBhcmFtIGZyYW1lCSAgICBUaGUgdmlkZW8gZnJhbWUgdG8gYmUgZmlsbGVkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtX2dldF9mcmFtZSgKKwkJCQkJICAgIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfZnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBQdXQgb25lIGZyYW1lIHRvIHRoZSBzdHJlYW0uIEFwcGxpY2F0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgorICogcGVyaW9kaWNhbGx5IG9ubHkgaWYgdGhlIHN0cmVhbSBkb2Vzbid0IHN1cHBvcnQgImFjdGl2ZSBpbnRlcmZhY2UiLCBpLmUuCisgKiB0aGUgcGptZWRpYV92aWRfZGV2X2luZm8uaGFzX2NhbGxiYWNrIG1lbWJlciBpcyBQSl9GQUxTRS4KKyAqCisgKiBAcGFyYW0gc3RybSAgICAgIFRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gZnJhbWUJICAgIFRoZSB2aWRlbyBmcmFtZSB0byBwdXQgdG8gdGhlIGRldmljZS4KKyAqCisgKiBAcmV0dXJuICAgICAgICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb3IgdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgICAgICAgICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2Rldl9zdHJlYW1fcHV0X2ZyYW1lKAorCQkJCQkgICAgcGptZWRpYV92aWRfZGV2X3N0cmVhbSAqc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9mcmFtZSAqZnJhbWUpOworCisvKioKKyAqIFN0b3AgdGhlIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RybSAgICAgIFRoZSB2aWRlbyBzdHJlYW0uCisgKgorICogQHJldHVybiAgICAgICAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIG9yIHRoZSBhcHByb3ByaWF0ZQorICogICAgICAgICAgICAgICAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtX3N0b3AoCisJCQkJCSAgICBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtICpzdHJtKTsKKworLyoqCisgKiBEZXN0cm95IHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cm0gICAgICBUaGUgdmlkZW8gc3RyZWFtLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzZnVsIG9wZXJhdGlvbiBvciB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfZGV2X3N0cmVhbV9kZXN0cm95KAorCQkJCQkgICAgcGptZWRpYV92aWRfZGV2X3N0cmVhbSAqc3RybSk7CisKKworLyoqCisgKiBAfQorICovCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmICAgIC8qIF9fUEpNRURJQV9WSURFT0RFVl9WSURFT0RFVl9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2X2ltcC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXZfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNDgwOQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLXZpZGVvZGV2L3ZpZGVvZGV2X2ltcC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKiAkSWQ6IHZpZGVvZGV2X2ltcC5oIDQwMTYgMjAxMi0wNC0wNCAwNTowNTo1MFogYmVubnlscCAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19WSURFT0RFVl9JTVBfSF9fCisjZGVmaW5lIF9fVklERU9ERVZfSU1QX0hfXworCisjaW5jbHVkZSA8cGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oPgorCisvKioKKyAqIEBkZWZncm91cCBzOF92aWRlb19kZXZpY2VfaW1wbGVtZW50b3JzX2FwaSBWaWRlbyBEZXZpY2UgSW1wbGVtZW50b3JzIEFQSQorICogQGluZ3JvdXAgdmlkZW9fZGV2aWNlX2FwaQorICogQGJyaWVmIEFQSSBmb3IgdmlkZW8gZGV2aWNlIGltcGxlbWVudG9ycworICogQHsKKyAqLworCisvKioKKyAqIFZpZGVvIGRldmljZSBmYWN0b3J5IG9wZXJhdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5X29wCit7CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgdmlkZW8gZGV2aWNlIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZgkJVGhlIHZpZGVvIGRldmljZSBmYWN0b3J5LgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqaW5pdCkocGptZWRpYV92aWRfZGV2X2ZhY3RvcnkgKmYpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhpcyB2aWRlbyBkZXZpY2UgZmFjdG9yeSBhbmQgcmVsZWFzZSBhbGwgcmVzb3VyY2VzIGJhY2sgdG8gdGhlCisgICAgICogb3BlcmF0aW5nIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCQlUaGUgdmlkZW8gZGV2aWNlIGZhY3RvcnkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpkZXN0cm95KShwam1lZGlhX3ZpZF9kZXZfZmFjdG9yeSAqZik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiB2aWRlbyBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCVRoZSB2aWRlbyBkZXZpY2UgZmFjdG9yeS4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCAoKmdldF9kZXZfY291bnQpKHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5ICpmKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmlkZW8gZGV2aWNlIGluZm9ybWF0aW9uIGFuZCBjYXBhYmlsaXRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZgkJVGhlIHZpZGVvIGRldmljZSBmYWN0b3J5LgorICAgICAqIEBwYXJhbSBpbmRleAlEZXZpY2UgaW5kZXguCisgICAgICogQHBhcmFtIGluZm8JVGhlIHZpZGVvIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZQorICAgICAqCQkJaW5pdGlhbGl6ZWQgYnkgdGhpcyBmdW5jdGlvbiBvbmNlIGl0IHJldHVybnMgCisgICAgICoJCQlzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QJKCpnZXRfZGV2X2luZm8pKHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5ICpmLCAKKwkJCQl1bnNpZ25lZCBpbmRleCwKKwkJCQlwam1lZGlhX3ZpZF9kZXZfaW5mbyAqaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgdmlkZW8gZGV2aWNlIHBhcmFtZXRlciB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmCQlUaGUgdmlkZW8gZGV2aWNlIGZhY3RvcnkuCisgICAgICogQHBhcmFtIGluZGV4CURldmljZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gcGFyYW0JVGhlIHZpZGVvIGRldmljZSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpkZWZhdWx0X3BhcmFtKShwal9wb29sX3QgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZF9kZXZfZmFjdG9yeSAqZiwKKwkJCQkgdW5zaWduZWQgaW5kZXgsCisJCQkJIHBqbWVkaWFfdmlkX2Rldl9wYXJhbSAqcGFyYW0pOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdmlkZW8gZGV2aWNlIGFuZCBjcmVhdGUgdmlkZW8gc3RyZWFtLiBTZWUKKyAgICAgKiAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9jcmVhdGUoKQorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqY3JlYXRlX3N0cmVhbSkocGptZWRpYV92aWRfZGV2X2ZhY3RvcnkgKmYsCisJCQkJIHBqbWVkaWFfdmlkX2Rldl9wYXJhbSAqcGFyYW0sCisJCQkJIGNvbnN0IHBqbWVkaWFfdmlkX2Rldl9jYiAqY2IsCisJCQkJIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkgcGptZWRpYV92aWRfZGV2X3N0cmVhbSAqKnBfdmlkX3N0cm0pOworCisgICAgLyoqCisgICAgICogUmVmcmVzaCB0aGUgbGlzdCBvZiB2aWRlbyBkZXZpY2VzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCVRoZSB2aWRlbyBkZXZpY2UgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnJlZnJlc2gpKHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5ICpmKTsKKworfSBwam1lZGlhX3ZpZF9kZXZfZmFjdG9yeV9vcDsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHZpZGVvIGRldmljZSBmYWN0b3J5LiAKKyAqLworc3RydWN0IHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5Cit7CisgICAgLyoqIEludGVybmFsIGRhdGEgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgdmlkZW8gc3Vic3lzdGVtLiAqLworICAgIHN0cnVjdCB7CisJLyoqIERyaXZlciBpbmRleCAqLworCXVuc2lnbmVkIGRydl9pZHg7CisgICAgfSBzeXM7CisKKyAgICAvKiogT3BlcmF0aW9ucyAqLworICAgIHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5X29wICpvcDsKK307CisKKworLyoqCisgKiBWaWRlbyBzdHJlYW0gb3BlcmF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfZGV2X3N0cmVhbV9vcAoreworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9nZXRfcGFyYW0oKQorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZ2V0X3BhcmFtKShwam1lZGlhX3ZpZF9kZXZfc3RyZWFtICpzdHJtLAorCQkJICAgICBwam1lZGlhX3ZpZF9kZXZfcGFyYW0gKnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9nZXRfY2FwKCkKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmdldF9jYXApKHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisJCQkgICBwam1lZGlhX3ZpZF9kZXZfY2FwIGNhcCwKKwkJCSAgIHZvaWQgKnZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9zZXRfY2FwKCkKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnNldF9jYXApKHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisJCQkgICBwam1lZGlhX3ZpZF9kZXZfY2FwIGNhcCwKKwkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9zdGFydCgpCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpzdGFydCkocGptZWRpYV92aWRfZGV2X3N0cmVhbSAqc3RybSk7CisKKyAgICAvKioKKyAgICAgKiBTZWUgI3BqbWVkaWFfdmlkX2Rldl9zdHJlYW1fZ2V0X2ZyYW1lKCkKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmdldF9mcmFtZSkocGptZWRpYV92aWRfZGV2X3N0cmVhbSAqc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9mcmFtZSAqZnJhbWUpOworCisgICAgLyoqCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9kZXZfc3RyZWFtX3B1dF9mcmFtZSgpCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpwdXRfZnJhbWUpKHBqbWVkaWFfdmlkX2Rldl9zdHJlYW0gKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfZnJhbWUgKmZyYW1lKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9zdG9wKCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpzdG9wKShwam1lZGlhX3ZpZF9kZXZfc3RyZWFtICpzdHJtKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfZGV2X3N0cmVhbV9kZXN0cm95KCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpkZXN0cm95KShwam1lZGlhX3ZpZF9kZXZfc3RyZWFtICpzdHJtKTsKKworfSBwam1lZGlhX3ZpZF9kZXZfc3RyZWFtX29wOworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSB2aWRlbyBkZXZpY2Ugc3RyZWFtLgorICovCitzdHJ1Y3QgcGptZWRpYV92aWRfZGV2X3N0cmVhbQoreworICAgIC8qKiBJbnRlcm5hbCBkYXRhIHRvIGJlIGluaXRpYWxpemVkIGJ5IHZpZGVvIHN1YnN5c3RlbSAqLworICAgIHN0cnVjdCB7CisJLyoqIERyaXZlciBpbmRleCAqLworCXVuc2lnbmVkIGRydl9pZHg7CisKKwkvKiogSGFzIGl0IGJlZW4gc3RhcnRlZD8gKi8KKwlwal9ib29sX3QgaXNfcnVubmluZzsKKyAgICB9IHN5czsKKworICAgIC8qKiBPcGVyYXRpb25zICovCisgICAgcGptZWRpYV92aWRfZGV2X3N0cmVhbV9vcCAqb3A7Cit9OworCisKKy8qKgorICogSW50ZXJuYWwgQVBJOiByZXR1cm4gdGhlIGZhY3RvcnkgaW5zdGFuY2UgYW5kIGRldmljZSBpbmRleCB0aGF0J3MgbG9jYWwKKyAqIHRvIHRoZSBmYWN0b3J5IGZvciBhIGdpdmVuIGRldmljZSBJRC4KKyAqCisgKiBAcGFyYW0gaWQJCURldmljZSBpZC4KKyAqIEBwYXJhbSBwX2YJCU91dDogZmFjdG9yeSBpbnN0YW5jZQorICogQHBhcmFtIHBfbG9jYWxfaW5kZXggT3V0OiBkZXZpY2UgaW5kZXggd2l0aGluIHRoZSBmYWN0b3J5CisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfZGV2X2dldF9sb2NhbF9pbmRleChwam1lZGlhX3ZpZF9kZXZfaW5kZXggaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdmlkX2Rldl9mYWN0b3J5ICoqcF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqcF9sb2NhbF9pbmRleCk7CisKKy8qKgorICogSW50ZXJuYWwgQVBJOiByZXR1cm4gdGhlIGdsb2JhbCBkZXZpY2UgaW5kZXggZ2l2ZW4gYSBmYWN0b3J5IGluc3RhbmNlIGFuZAorICogYSBsb2NhbCBkZXZpY2UgaW5kZXguCisgKgorICogQHBhcmFtIGYJCUZhY3RvcnkuCisgKiBAcGFyYW0gbG9jYWxfaWR4CUxvY2FsIGluZGV4LgorICogQHBhcmFtIHBpZAkJUmV0dXJuZWQgZ2xvYmFsIGluZGV4LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfZGV2X2dldF9nbG9iYWxfaW5kZXgoY29uc3QgcGptZWRpYV92aWRfZGV2X2ZhY3RvcnkgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb2NhbF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZF9kZXZfaW5kZXggKnBpZCk7CisKKy8qKgorICogQH0KKyAqLworCisKKworI2VuZGlmIC8qIF9fVklERU9ERVZfSU1QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlZjc5NgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhLmgKQEAgLTAsMCArMSw4MSBAQAorLyogJElkOiBwam1lZGlhLmggMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0hfXworI2RlZmluZSBfX1BKTUVESUFfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS5oCisgKiBAYnJpZWYgUEpNRURJQSBtYWluIGhlYWRlciBmaWxlLgorICovCisjaW5jbHVkZSA8cGptZWRpYS9hbGF3X3VsYXcuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2F2aV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxwam1lZGlhL2JpZGlyZWN0aW9uYWwuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2NpcmNidWYuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2Nsb2NrLmg+CisjaW5jbHVkZSA8cGptZWRpYS9jb2RlYy5oPgorI2luY2x1ZGUgPHBqbWVkaWEvY29uZmVyZW5jZS5oPgorI2luY2x1ZGUgPHBqbWVkaWEvY29udmVydGVyLmg+CisjaW5jbHVkZSA8cGptZWRpYS9kZWxheWJ1Zi5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZWNoby5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZWNob19wb3J0Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9lbmRwb2ludC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZXJybm8uaD4KKyNpbmNsdWRlIDxwam1lZGlhL2V2ZW50Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9mcmFtZS5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9nNzExLmg+CisjaW5jbHVkZSA8cGptZWRpYS9qYnVmLmg+CisjaW5jbHVkZSA8cGptZWRpYS9tYXN0ZXJfcG9ydC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvbWVtX3BvcnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL251bGxfcG9ydC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvcGxjLmg+CisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9yZXNhbXBsZS5oPgorI2luY2x1ZGUgPHBqbWVkaWEvcnRjcC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvcnRjcF94ci5oPgorI2luY2x1ZGUgPHBqbWVkaWEvcnRwLmg+CisjaW5jbHVkZSA8cGptZWRpYS9zZHAuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3NkcF9uZWcuaD4KKy8vI2luY2x1ZGUgPHBqbWVkaWEvc2Vzc2lvbi5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc2lsZW5jZWRldC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc291bmQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3NvdW5kX3BvcnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3NwbGl0Y29tYi5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc3RlcmVvLmg+CisjaW5jbHVkZSA8cGptZWRpYS9zdHJlYW0uaD4KKyNpbmNsdWRlIDxwam1lZGlhL3N0cmVhbV9jb21tb24uaD4KKyNpbmNsdWRlIDxwam1lZGlhL3RvbmVnZW4uaD4KKyNpbmNsdWRlIDxwam1lZGlhL3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvdHJhbnNwb3J0X2FkYXB0ZXJfc2FtcGxlLmg+CisjaW5jbHVkZSA8cGptZWRpYS90cmFuc3BvcnRfaWNlLmg+CisjaW5jbHVkZSA8cGptZWRpYS90cmFuc3BvcnRfbG9vcC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvdHJhbnNwb3J0X3NydHAuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3RyYW5zcG9ydF91ZHAuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3ZpZF9wb3J0Lmg+CisjaW5jbHVkZSA8cGptZWRpYS92aWRfY29kZWMuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3ZpZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxwam1lZGlhL3ZpZF90ZWUuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3dhdl9wbGF5bGlzdC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvd2F2X3BvcnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3dhdmUuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3dzb2xhLmg+CisKKyNlbmRpZgkvKiBfX1BKTUVESUFfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2FsYXdfdWxhdy5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYWxhd191bGF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkYTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2FsYXdfdWxhdy5oCkBAIC0wLDAgKzEsMjEzIEBACisvKiAkSWQ6IGFsYXdfdWxhdy5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9BTEFXX1VMQVdfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9BTEFXX1VMQVdfSF9fCisKKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKK1BKX0JFR0lOX0RFQ0wKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfQUxBV19VTEFXX1RBQkxFKSAmJiBQSk1FRElBX0hBU19BTEFXX1VMQVdfVEFCTEUhPTAKKworZXh0ZXJuIGNvbnN0IHBqX3VpbnQ4X3QgcGptZWRpYV9saW5lYXIydWxhd190YWJbMTYzODRdOworZXh0ZXJuIGNvbnN0IHBqX3VpbnQ4X3QgcGptZWRpYV9saW5lYXIyYWxhd190YWJbMTYzODRdOworZXh0ZXJuIGNvbnN0IHBqX2ludDE2X3QgcGptZWRpYV91bGF3MmxpbmVhcl90YWJbMjU2XTsKK2V4dGVybiBjb25zdCBwal9pbnQxNl90IHBqbWVkaWFfYWxhdzJsaW5lYXJfdGFiWzI1Nl07CisKKworLyoqCisgKiBDb252ZXJ0IDE2LWJpdCBsaW5lYXIgUENNIHZhbHVlIHRvIDgtYml0IEEtTGF3LgorICoKKyAqIEBwYXJhbSBwY21fdmFsICAgMTYtYml0IGxpbmVhciBQQ00gdmFsdWUuCisgKiBAcmV0dXJuCSAgICA4LWJpdCBBLUxhdyB2YWx1ZS4KKyAqLworI2RlZmluZSBwam1lZGlhX2xpbmVhcjJhbGF3KHBjbV92YWwpCVwKKwkgICAgcGptZWRpYV9saW5lYXIyYWxhd190YWJbKCgocGpfaW50MTZfdClwY21fdmFsKSA+PiAyKSAmIDB4M2ZmZl0KKworLyoqCisgKiBDb252ZXJ0IDgtYml0IEEtTGF3IHZhbHVlIHRvIDE2LWJpdCBsaW5lYXIgUENNIHZhbHVlLgorICoKKyAqIEBwYXJhbSBjaGFyYV92YWwgOC1iaXQgQS1MYXcgdmFsdWUuCisgKiBAcmV0dXJuCSAgICAxNi1iaXQgbGluZWFyIFBDTSB2YWx1ZS4KKyAqLworI2RlZmluZSBwam1lZGlhX2FsYXcybGluZWFyKGNoYXJhX3ZhbCkJXAorCSAgICBwam1lZGlhX2FsYXcybGluZWFyX3RhYltjaGFyYV92YWxdCisKKy8qKgorICogQ29udmVydCAxNi1iaXQgbGluZWFyIFBDTSB2YWx1ZSB0byA4LWJpdCBVLUxhdy4KKyAqCisgKiBAcGFyYW0gcGNtX3ZhbCAgIDE2LWJpdCBsaW5lYXIgUENNIHZhbHVlLgorICogQHJldHVybgkgICAgVS1iaXQgQS1MYXcgdmFsdWUuCisgKi8KKyNkZWZpbmUgcGptZWRpYV9saW5lYXIydWxhdyhwY21fdmFsKQlcCisJICAgIHBqbWVkaWFfbGluZWFyMnVsYXdfdGFiWygoKHBqX2ludDE2X3QpcGNtX3ZhbCkgPj4gMikgJiAweDNmZmZdCisKKy8qKgorICogQ29udmVydCA4LWJpdCBVLUxhdyB2YWx1ZSB0byAxNi1iaXQgbGluZWFyIFBDTSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdV92YWwJICAgIDgtYml0IFUtTGF3IHZhbHVlLgorICogQHJldHVybgkgICAgMTYtYml0IGxpbmVhciBQQ00gdmFsdWUuCisgKi8KKyNkZWZpbmUgcGptZWRpYV91bGF3MmxpbmVhcih1X3ZhbCkJXAorCSAgICBwam1lZGlhX3VsYXcybGluZWFyX3RhYlt1X3ZhbF0KKworLyoqCisgKiBDb252ZXJ0IDgtYml0IEEtTGF3IHZhbHVlIHRvIDgtYml0IFUtTGF3IHZhbHVlLgorICoKKyAqIEBwYXJhbSBhdmFsCSAgICA4LWJpdCBBLUxhdyB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIDgtYml0IFUtTGF3IHZhbHVlLgorICovCisjZGVmaW5lIHBqbWVkaWFfYWxhdzJ1bGF3KGF2YWwpCQlcCisJICAgIHBqbWVkaWFfbGluZWFyMnVsYXcocGptZWRpYV9hbGF3MmxpbmVhcihhdmFsKSkKKworLyoqCisgKiBDb252ZXJ0IDgtYml0IFUtTGF3IHZhbHVlIHRvIDgtYml0IEEtTGF3IHZhbHVlLgorICoKKyAqIEBwYXJhbSB1dmFsCSAgICA4LWJpdCBVLUxhdyB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIDgtYml0IEEtTGF3IHZhbHVlLgorICovCisjZGVmaW5lIHBqbWVkaWFfdWxhdzJhbGF3KHV2YWwpCQlcCisJICAgIHBqbWVkaWFfbGluZWFyMmFsYXcocGptZWRpYV91bGF3MmxpbmVhcih1dmFsKSkKKworCisjZWxzZQorCisvKioKKyAqIENvbnZlcnQgMTYtYml0IGxpbmVhciBQQ00gdmFsdWUgdG8gOC1iaXQgQS1MYXcuCisgKgorICogQHBhcmFtIHBjbV92YWwgICAxNi1iaXQgbGluZWFyIFBDTSB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIDgtYml0IEEtTGF3IHZhbHVlLgorICovCitQSl9ERUNMKHBqX3VpbnQ4X3QpIHBqbWVkaWFfbGluZWFyMmFsYXcoaW50IHBjbV92YWwpOworCisvKioKKyAqIENvbnZlcnQgOC1iaXQgQS1MYXcgdmFsdWUgdG8gMTYtYml0IGxpbmVhciBQQ00gdmFsdWUuCisgKgorICogQHBhcmFtIGNoYXJhX3ZhbCA4LWJpdCBBLUxhdyB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIDE2LWJpdCBsaW5lYXIgUENNIHZhbHVlLgorICovCitQSl9ERUNMKGludCkgcGptZWRpYV9hbGF3MmxpbmVhcih1bnNpZ25lZCBjaGFyYV92YWwpOworCisvKioKKyAqIENvbnZlcnQgMTYtYml0IGxpbmVhciBQQ00gdmFsdWUgdG8gOC1iaXQgVS1MYXcuCisgKgorICogQHBhcmFtIHBjbV92YWwgICAxNi1iaXQgbGluZWFyIFBDTSB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIFUtYml0IEEtTGF3IHZhbHVlLgorICovCitQSl9ERUNMKHVuc2lnbmVkIGNoYXIpIHBqbWVkaWFfbGluZWFyMnVsYXcoaW50IHBjbV92YWwpOworCisvKioKKyAqIENvbnZlcnQgOC1iaXQgVS1MYXcgdmFsdWUgdG8gMTYtYml0IGxpbmVhciBQQ00gdmFsdWUuCisgKgorICogQHBhcmFtIHVfdmFsCSAgICA4LWJpdCBVLUxhdyB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIDE2LWJpdCBsaW5lYXIgUENNIHZhbHVlLgorICovCitQSl9ERUNMKGludCkgcGptZWRpYV91bGF3MmxpbmVhcih1bnNpZ25lZCBjaGFyIHVfdmFsKTsKKworLyoqCisgKiBDb252ZXJ0IDgtYml0IEEtTGF3IHZhbHVlIHRvIDgtYml0IFUtTGF3IHZhbHVlLgorICoKKyAqIEBwYXJhbSBhdmFsCSAgICA4LWJpdCBBLUxhdyB2YWx1ZS4KKyAqIEByZXR1cm4JICAgIDgtYml0IFUtTGF3IHZhbHVlLgorICovCitQSl9ERUNMKHVuc2lnbmVkIGNoYXIpIHBqbWVkaWFfYWxhdzJ1bGF3KHVuc2lnbmVkIGNoYXIgYXZhbCk7CisKKy8qKgorICogQ29udmVydCA4LWJpdCBVLUxhdyB2YWx1ZSB0byA4LWJpdCBBLUxhdyB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdXZhbAkgICAgOC1iaXQgVS1MYXcgdmFsdWUuCisgKiBAcmV0dXJuCSAgICA4LWJpdCBBLUxhdyB2YWx1ZS4KKyAqLworUEpfREVDTCh1bnNpZ25lZCBjaGFyKSBwam1lZGlhX3VsYXcyYWxhdyh1bnNpZ25lZCBjaGFyIHV2YWwpOworCisjZW5kaWYKKworLyoqCisgKiBFbmNvZGUgMTYtYml0IGxpbmVhciBQQ00gZGF0YSB0byA4LWJpdCBVLUxhdyBkYXRhLgorICoKKyAqIEBwYXJhbSBkc3QJICAgIERlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgOC1iaXQgVS1MYXcgZGF0YS4KKyAqIEBwYXJhbSBzcmMJICAgIFNvdXJjZSwgMTYtYml0IGxpbmVhciBQQ00gZGF0YS4KKyAqIEBwYXJhbSBjb3VudAkgICAgTnVtYmVyIG9mIHNhbXBsZXMuCisgKi8KK1BKX0lOTElORSh2b2lkKSBwam1lZGlhX3VsYXdfZW5jb2RlKHBqX3VpbnQ4X3QgKmRzdCwgY29uc3QgcGpfaW50MTZfdCAqc3JjLCAKKwkJCQkgICAgcGpfc2l6ZV90IGNvdW50KQoreworICAgIGNvbnN0IHBqX2ludDE2X3QgKmVuZCA9IHNyYyArIGNvdW50OworICAgIAorICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKKwkqZHN0KysgPSBwam1lZGlhX2xpbmVhcjJ1bGF3KCpzcmMrKyk7CisgICAgfQorfQorCisvKioKKyAqIEVuY29kZSAxNi1iaXQgbGluZWFyIFBDTSBkYXRhIHRvIDgtYml0IEEtTGF3IGRhdGEuCisgKgorICogQHBhcmFtIGRzdAkgICAgRGVzdGluYXRpb24gYnVmZmVyIGZvciA4LWJpdCBBLUxhdyBkYXRhLgorICogQHBhcmFtIHNyYwkgICAgU291cmNlLCAxNi1iaXQgbGluZWFyIFBDTSBkYXRhLgorICogQHBhcmFtIGNvdW50CSAgICBOdW1iZXIgb2Ygc2FtcGxlcy4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfYWxhd19lbmNvZGUocGpfdWludDhfdCAqZHN0LCBjb25zdCBwal9pbnQxNl90ICpzcmMsIAorCQkJCSAgICBwal9zaXplX3QgY291bnQpCit7CisgICAgY29uc3QgcGpfaW50MTZfdCAqZW5kID0gc3JjICsgY291bnQ7CisgICAgCisgICAgd2hpbGUgKHNyYyA8IGVuZCkgeworCSpkc3QrKyA9IHBqbWVkaWFfbGluZWFyMmFsYXcoKnNyYysrKTsKKyAgICB9Cit9CisKKy8qKgorICogRGVjb2RlIDgtYml0IFUtTGF3IGRhdGEgdG8gMTYtYml0IGxpbmVhciBQQ00gZGF0YS4KKyAqCisgKiBAcGFyYW0gZHN0CSAgICBEZXN0aW5hdGlvbiBidWZmZXIgZm9yIDE2LWJpdCBQQ00gZGF0YS4KKyAqIEBwYXJhbSBzcmMJICAgIFNvdXJjZSwgOC1iaXQgVS1MYXcgZGF0YS4KKyAqIEBwYXJhbSBsZW4JICAgIEVuY29kZWQgZnJhbWUvc291cmNlIGxlbmd0aCBpbiBieXRlcy4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfdWxhd19kZWNvZGUocGpfaW50MTZfdCAqZHN0LCBjb25zdCBwal91aW50OF90ICpzcmMsIAorCQkJCSAgICBwal9zaXplX3QgbGVuKQoreworICAgIGNvbnN0IHBqX3VpbnQ4X3QgKmVuZCA9IHNyYyArIGxlbjsKKyAgICAKKyAgICB3aGlsZSAoc3JjIDwgZW5kKSB7CisJKmRzdCsrID0gcGptZWRpYV91bGF3MmxpbmVhcigqc3JjKyspOworICAgIH0KK30KKworLyoqCisgKiBEZWNvZGUgOC1iaXQgQS1MYXcgZGF0YSB0byAxNi1iaXQgbGluZWFyIFBDTSBkYXRhLgorICoKKyAqIEBwYXJhbSBkc3QJICAgIERlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgMTYtYml0IFBDTSBkYXRhLgorICogQHBhcmFtIHNyYwkgICAgU291cmNlLCA4LWJpdCBBLUxhdyBkYXRhLgorICogQHBhcmFtIGxlbgkgICAgRW5jb2RlZCBmcmFtZS9zb3VyY2UgbGVuZ3RoIGluIGJ5dGVzLgorICovCitQSl9JTkxJTkUodm9pZCkgcGptZWRpYV9hbGF3X2RlY29kZShwal9pbnQxNl90ICpkc3QsIGNvbnN0IHBqX3VpbnQ4X3QgKnNyYywgCisJCQkJICAgIHBqX3NpemVfdCBsZW4pCit7CisgICAgY29uc3QgcGpfdWludDhfdCAqZW5kID0gc3JjICsgbGVuOworICAgIAorICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKKwkqZHN0KysgPSBwam1lZGlhX2FsYXcybGluZWFyKCpzcmMrKyk7CisgICAgfQorfQorCitQSl9FTkRfREVDTAorCisjZW5kaWYJLyogX19QSk1FRElBX0FMQVdfVUxBV19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYXZpLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9hdmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjIzNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYXZpLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qICRJZDogYXZpLmggNDA1OCAyMDEyLTA0LTE3IDA2OjU3OjUwWiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQVZJX0hfXworI2RlZmluZSBfX1BKTUVESUFfQVZJX0hfXworCisKKy8qKgorICogQGZpbGUgYXZpLmgKKyAqIEBicmllZiBBVkkgZmlsZSBtYW5pcHVsYXRpb24uCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GSUxFX0ZPUk1BVCBGaWxlIEZvcm1hdHMKKyAqIEBicmllZiBTdXBwb3J0ZWQgZmlsZSBmb3JtYXRzCisgKi8KKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX0FWSSBBVkkgSGVhZGVyCisgKiBAaW5ncm91cCBQSk1FRElBX0ZJTEVfRk9STUFUCisgKiBAYnJpZWYgUmVwcmVzZW50YXRpb24gb2YgUklGRi9BVkkgZmlsZSBmb3JtYXQKKyAqIEB7CisgKgorICogVGhpcyB0aGUgdGhlIGxvdyBsZXZlbCByZXByZXNlbnRhdGlvbiBvZiBSSUZGL0FWSSBmaWxlIGZvcm1hdC4gRm9yCisgKiBoaWdoZXIgYWJzdHJhY3Rpb24sIHBsZWFzZSBzZWUgXHJlZiBQSk1FRElBX0ZJTEVfUExBWSBhbmQgCisgKiBccmVmIFBKTUVESUFfRklMRV9SRUMuCisgKi8KKworCitQSl9CRUdJTl9ERUNMCisKKyNkZWZpbmUgUEpNRURJQV9BVklfTUFYX05VTV9TVFJFQU1TIDQKKworc3RhdGljIGNvbnN0IGNoYXIgYXZpX3RhZ3NbXVs0XSA9IHsKKyAgICB7ICdSJywgJ0knLCAnRicsICdGJyB9LCB7ICdBJywgJ1YnLCAnSScsICcgJyB9LAorICAgIHsgJ2gnLCAnZCcsICdyJywgJ2wnIH0sIHsgJ2EnLCAndicsICdpJywgJ2gnIH0sCisgICAgeyAncycsICd0JywgJ3InLCAnbCcgfSwgeyAncycsICd0JywgJ3InLCAnaCcgfSwKKyAgICB7ICdhJywgJ3UnLCAnZCcsICdzJyB9LCB7ICd2JywgJ2knLCAnZCcsICdzJyB9LAorICAgIHsgJ3MnLCAndCcsICdyJywgJ2YnIH0sIHsgJ20nLCAnbycsICd2JywgJ2knIH0sCisgICAgeyAnTCcsICdJJywgJ1MnLCAnVCcgfSwgeyAnSicsICdVJywgJ04nLCAnSycgfSwKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgUEpNRURJQV9BVklfUklGRl9UQUcgPSAwLAorICAgIFBKTUVESUFfQVZJX0FWSV9UQUcsCisgICAgUEpNRURJQV9BVklfSERSTF9UQUcsCisgICAgUEpNRURJQV9BVklfQVZJSF9UQUcsCisgICAgUEpNRURJQV9BVklfU1RSTF9UQUcsCisgICAgUEpNRURJQV9BVklfU1RSSF9UQUcsCisgICAgUEpNRURJQV9BVklfQVVEU19UQUcsCisgICAgUEpNRURJQV9BVklfVklEU19UQUcsCisgICAgUEpNRURJQV9BVklfU1RSRl9UQUcsCisgICAgUEpNRURJQV9BVklfTU9WSV9UQUcsCisgICAgUEpNRURJQV9BVklfTElTVF9UQUcsCisgICAgUEpNRURJQV9BVklfSlVOS19UQUcsCit9IHBqbWVkaWFfYXZpX3RhZzsKKworCisvKioKKyAqIFRoZXNlIHR5cGVzIGRlc2NyaWJlIHRoZSBzaW1wbGVyL2Nhbm9uaWNhbCB2ZXJzaW9uIG9mIGFuIEFWSSBmaWxlLgorICogVGhleSBkbyBub3Qgc3VwcG9ydCB0aGUgZnVsbCBBVkkgUklGRiBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAqLworI3ByYWdtYSBwYWNrKDIpCisKKy8qKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgUklGRiBBVkkgZmlsZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IHJpZmZfaGRyX3QgeworICAgIHBqX3VpbnQzMl90IHJpZmY7CQkvKio8ICJSSUZGIiBBU0NJSSB0YWcuCQkqLworICAgIHBqX3VpbnQzMl90IGZpbGVfbGVuOyAgICAgICAvKio8IEZpbGUgbGVuZ3RoIG1pbnVzIDggYnl0ZXMJKi8KKyAgICBwal91aW50MzJfdCBhdmk7CQkvKio8ICJBVkkiIEFTQ0lJIHRhZy4JCSovCit9IHJpZmZfaGRyX3Q7CisKKy8qKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYXZpaCBoZWFkZXIgICovCit0eXBlZGVmIHN0cnVjdCBhdmloX2hkcl90IHsKKyAgICBwal91aW50MzJfdCBsaXN0X3RhZzsKKyAgICBwal91aW50MzJfdCBsaXN0X3N6OworICAgIHBqX3VpbnQzMl90IGhkcmxfdGFnOworICAgIHBqX3VpbnQzMl90IGF2aWg7CisgICAgcGpfdWludDMyX3Qgc2l6ZTsKKyAgICBwal91aW50MzJfdCB1c2VjX3Blcl9mcmFtZTsgICAgIC8qKjwgbWljcm9zZWNzIGJldHdlZW4gZnJhbWVzICAgKi8KKyAgICBwal91aW50MzJfdCBtYXhfQnBzOworICAgIHBqX3VpbnQzMl90IHBhZDsKKyAgICBwal91aW50MzJfdCBmbGFnczsKKyAgICBwal91aW50MzJfdCB0b3RfZnJhbWVzOworICAgIHBqX3VpbnQzMl90IGluaXRfZnJhbWVzOworICAgIHBqX3VpbnQzMl90IG51bV9zdHJlYW1zOworICAgIHBqX3VpbnQzMl90IGJ1Zl9zaXplOworICAgIHBqX3VpbnQzMl90IHdpZHRoOworICAgIHBqX3VpbnQzMl90IGhlaWdodDsKKyAgICBwal91aW50MzJfdCByZXNlcnZlZFs0XTsKK30gYXZpaF9oZHJfdDsKKworLyoqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBzdHJsIGhlYWRlciAgKi8KK3R5cGVkZWYgc3RydWN0IHN0cmxfaGRyX3QgeworICAgIHBqX3VpbnQzMl90IGxpc3RfdGFnOworICAgIHBqX3VpbnQzMl90IGxpc3Rfc3o7CisgICAgcGpfdWludDMyX3Qgc3RybF90YWc7CisKKyAgICBwal91aW50MzJfdCBzdHJoOworICAgIHBqX3VpbnQzMl90IHN0cmhfc2l6ZTsKKyAgICBwal91aW50MzJfdCBkYXRhX3R5cGU7CisgICAgcGpfdWludDMyX3QgY29kZWM7CisgICAgcGpfdWludDMyX3QgZmxhZ3M7CisgICAgcGpfdWludDMyX3QgYm9ndXNfcHJpb3JpdHlfbGFuZ3VhZ2U7IC8qKjwgRG8gbm90IGFjY2VzcyB0aGlzIGRhdGEgKi8KKyAgICBwal91aW50MzJfdCBpbml0X2ZyYW1lczsKKyAgICBwal91aW50MzJfdCBzY2FsZTsKKyAgICBwal91aW50MzJfdCByYXRlOworICAgIHBqX3VpbnQzMl90IHN0YXJ0OworICAgIHBqX3VpbnQzMl90IGxlbmd0aDsKKyAgICBwal91aW50MzJfdCBidWZfc2l6ZTsKKyAgICBwal91aW50MzJfdCBxdWFsaXR5OworICAgIHBqX3VpbnQzMl90IHNhbXBsZV9zaXplOworICAgIHBqX3VpbnQzMl90IGJvZ3VzX2ZyYW1lWzJdOyAgICAgICAgICAvKio8IERvIG5vdCBhY2Nlc3MgdGhpcyBkYXRhICovCit9IHN0cmxfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBwal91aW50MzJfdCBzdHJmOworICAgIHBqX3VpbnQzMl90IHN0cmZfc2l6ZTsKKyAgICBwal91aW50MTZfdCBmbXRfdGFnOwkgICAgLyoqPCAxIGZvciBQQ00JCQkqLworICAgIHBqX3VpbnQxNl90IG5jaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMuCSAgICAgICAgKi8KKyAgICBwal91aW50MzJfdCBzYW1wbGVfcmF0ZTsJICAgIC8qKjwgU2FtcGxpbmcgcmF0ZS4JCSAgICAgICAgKi8KKyAgICBwal91aW50MzJfdCBieXRlc19wZXJfc2VjOwkgICAgLyoqPCBBdmVyYWdlIGJ5dGVzIHBlciBzZWNvbmQuCSovCisgICAgcGpfdWludDE2X3QgYmxvY2tfYWxpZ247CSAgICAvKio8IG5jaGFubmVscyAqIGJpdHMgLyA4CSAgICAgICAgKi8KKyAgICBwal91aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7ICAgIC8qKjwgQml0cyBwZXIgc2FtcGxlLgkJKi8KKyAgICBwal91aW50MTZfdCBleHRyYV9zaXplOworfSBzdHJmX2F1ZGlvX2hkcl90OworCisvKioKKyAqIFNpemVzIG9mIHN0cmZfYXVkaW9faGRyX3Qgc3RydWN0LCBzdGFydGVkIGJ5IHRoZSBzaXplIChpbiBieXRlcykgb2YKKyAqIDMyLWJpdHMgc3RydWN0IG1lbWJlcnMsIGFsdGVybmF0ZWQgd2l0aCB0aGUgc2l6ZSBvZiAxNi1iaXRzIG1lbWJlcnMuCisgKi8KK3N0YXRpYyBjb25zdCBwal91aW50OF90IHN0cmZfYXVkaW9faGRyX3NpemVzIFtdID0gezgsIDQsIDgsIDZ9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgcGpfdWludDMyX3Qgc3RyZjsKKyAgICBwal91aW50MzJfdCBzdHJmX3NpemU7CisgICAgcGpfdWludDMyX3QgYmlTaXplOyAKKyAgICBwal9pbnQzMl90IGJpV2lkdGg7IAorICAgIHBqX2ludDMyX3QgYmlIZWlnaHQ7IAorICAgIHBqX3VpbnQxNl90IGJpUGxhbmVzOyAKKyAgICBwal91aW50MTZfdCBiaUJpdENvdW50OworICAgIHBqX3VpbnQzMl90IGJpQ29tcHJlc3Npb247IAorICAgIHBqX3VpbnQzMl90IGJpU2l6ZUltYWdlOyAKKyAgICBwal9pbnQzMl90IGJpWFBlbHNQZXJNZXRlcjsgCisgICAgcGpfaW50MzJfdCBiaVlQZWxzUGVyTWV0ZXI7IAorICAgIHBqX3VpbnQzMl90IGJpQ2xyVXNlZDsgCisgICAgcGpfdWludDMyX3QgYmlDbHJJbXBvcnRhbnQ7IAorfSBzdHJmX3ZpZGVvX2hkcl90OworCitzdGF0aWMgY29uc3QgcGpfdWludDhfdCBzdHJmX3ZpZGVvX2hkcl9zaXplcyBbXSA9IHsyMCwgNCwgMjR9OworCitzdHJ1Y3QgcGptZWRpYV9hdmlfaGRyCit7CisgICAgcmlmZl9oZHJfdCAgcmlmZl9oZHI7CisgICAgYXZpaF9oZHJfdCAgYXZpaF9oZHI7CisgICAgc3RybF9oZHJfdCAgc3RybF9oZHJbUEpNRURJQV9BVklfTUFYX05VTV9TVFJFQU1TXTsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cmZfYXVkaW9faGRyX3Qgc3RyZl9hdWRpb19oZHI7CisgICAgICAgIHN0cmZfdmlkZW9faGRyX3Qgc3RyZl92aWRlb19oZHI7CisgICAgfSBzdHJmX2hkcltQSk1FRElBX0FWSV9NQVhfTlVNX1NUUkVBTVNdOworfTsKKworI3ByYWdtYSBwYWNrKCkKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfYXZpX2hkcgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2F2aV9oZHIgcGptZWRpYV9hdmlfaGRyOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBnZW5lcmljIFJJRkYgc3ViY2h1bmsgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2F2aV9zdWJjaHVuaworeworICAgIHBqX3VpbnQzMl90CSAgICBpZDsJCQkvKio8IFN1YmNodW5rIEFTQ0lJIHRhZy4JICAgICovCisgICAgcGpfdWludDMyX3QJICAgIGxlbjsJCS8qKjwgTGVuZ3RoIGZvbGxvd2luZyB0aGlzIGZpZWxkICAgICovCit9IHBqbWVkaWFfYXZpX3N1YmNodW5rOworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQVZJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYXZpX3N0cmVhbS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYXZpX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGJmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9hdmlfc3RyZWFtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qICRJZDogYXZpX3N0cmVhbS5oIDM3MTUgMjAxMS0wOC0xOSAwOTozNToyNVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQVZJX1NUUkVBTV9IX18KKyNkZWZpbmUgX19QSk1FRElBX0FWSV9TVFJFQU1fSF9fCisKKy8qKgorICogQGZpbGUgYXZpX3N0cmVhbS5oCisgKiBAYnJpZWYgQVZJIGZpbGUgcGxheWVyLgorICovCisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisKKworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GSUxFX1BMQVkgQVZJIEZpbGUgUGxheWVyCisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBWaWRlbyBhbmQgYXVkaW8gcGxheWJhY2sgZnJvbSBBVkkgZmlsZQorICogQHsKKyAqLworCisvKioKKyAqIEFWSSBmaWxlIHBsYXllciBvcHRpb25zLgorICovCitlbnVtIHBqbWVkaWFfYXZpX2ZpbGVfcGxheWVyX29wdGlvbgoreworICAgIC8qKgorICAgICAqIFRlbGwgdGhlIGZpbGUgcGxheWVyIHRvIHJldHVybiBOVUxMIGZyYW1lIHdoZW4gdGhlIHdob2xlCisgICAgICogZmlsZSBoYXMgYmVlbiBwbGF5ZWQuCisgICAgICovCisgICAgUEpNRURJQV9BVklfRklMRV9OT19MT09QID0gMQorfTsKKworLyoqCisgKiBBVkkgc3RyZWFtIGRhdGEgdHlwZS4KKyAqLwordHlwZWRlZiBwam1lZGlhX3BvcnQgcGptZWRpYV9hdmlfc3RyZWFtOworCisvKioKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgZm9yIEFWSSBzdHJlYW1zLiBBVkkgc3RyZWFtcyBpcyBhIGNvbGxlY3Rpb24gb2YKKyAqIHplcm8gb3IgbW9yZSBBVkkgc3RyZWFtLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2F2aV9zdHJlYW1zIHBqbWVkaWFfYXZpX3N0cmVhbXM7CisKKy8qKgorICogQ3JlYXRlIGF2aSBzdHJlYW1zIHRvIHBsYXkgYW4gQVZJIGZpbGUuIEFWSSBwbGF5ZXIgc3VwcG9ydHMgCisgKiByZWFkaW5nIEFWSSBmaWxlIHdpdGggdW5jb21wcmVzc2VkIHZpZGVvIGZvcm1hdCBhbmQgCisgKiAxNiBiaXQgUENNIG9yIGNvbXByZXNzZWQgRy43MTEgQS1sYXcvVS1sYXcgYXVkaW8gZm9ybWF0LgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGNyZWF0ZSB0aGUgc3RyZWFtcy4KKyAqIEBwYXJhbSBmaWxlbmFtZQlGaWxlIG5hbWUgdG8gb3Blbi4KKyAqIEBwYXJhbSBmbGFncwkJQXZpIHN0cmVhbXMgY3JlYXRpb24gZmxhZ3MuCisgKiBAcGFyYW0gcF9zdHJlYW1zCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYXZpIHN0cmVhbXMgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9hdmlfcGxheWVyX2NyZWF0ZV9zdHJlYW1zKHBqX3Bvb2xfdCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2F2aV9zdHJlYW1zICoqcF9zdHJlYW1zKTsKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBBVkkgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJlYW1zCVRoZSBBVkkgc3RyZWFtcy4KKyAqCisgKiBAcmV0dXJuCQlUaGUgbnVtYmVyIG9mIEFWSSBzdHJlYW0uCisgKi8KK1BKX0RFQ0wodW5zaWduZWQpCitwam1lZGlhX2F2aV9zdHJlYW1zX2dldF9udW1fc3RyZWFtcyhwam1lZGlhX2F2aV9zdHJlYW1zICpzdHJlYW1zKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGlkeC10aCBzdHJlYW0gb2YgdGhlIEFWSSBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSBzdHJlYW1zCVRoZSBBVkkgc3RyZWFtcy4KKyAqIEBwYXJhbSBpZHgJICAgICAgICBUaGUgc3RyZWFtIGluZGV4LgorICoKKyAqIEByZXR1cm4JCVRoZSBBVkkgc3RyZWFtIG9yIE5VTEwgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9hdmlfc3RyZWFtICopCitwam1lZGlhX2F2aV9zdHJlYW1zX2dldF9zdHJlYW0ocGptZWRpYV9hdmlfc3RyZWFtcyAqc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpZHgpOworCisvKioKKyAqIFJldHVybiBhbiBBVkkgc3RyZWFtIHdpdGggYSBjZXJ0YWluIG1lZGlhIHR5cGUgZnJvbSB0aGUgQVZJIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHN0cmVhbXMJVGhlIEFWSSBzdHJlYW1zLgorICogQHBhcmFtIHN0YXJ0X2lkeCAgICAgVGhlIHN0YXJ0aW5nIGluZGV4LgorICogQHBhcmFtIG1lZGlhX3R5cGUgICAgVGhlIG1lZGlhIHR5cGUgb2YgdGhlIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlUaGUgQVZJIHN0cmVhbSBvciBOVUxMIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICovCitQSl9ERUNMKHBqbWVkaWFfYXZpX3N0cmVhbSAqKQorcGptZWRpYV9hdmlfc3RyZWFtc19nZXRfc3RyZWFtX2J5X21lZGlhKHBqbWVkaWFfYXZpX3N0cmVhbXMgKnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RhcnRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdHlwZSBtZWRpYV90eXBlKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIG1lZGlhIHBvcnQgb2YgYW4gQVZJIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBBVkkgc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVRoZSBtZWRpYSBwb3J0LgorICovCitQSl9JTkxJTkUocGptZWRpYV9wb3J0ICopCitwam1lZGlhX2F2aV9zdHJlYW1fZ2V0X3BvcnQocGptZWRpYV9hdmlfc3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIChwam1lZGlhX3BvcnQgKilzdHJlYW07Cit9CisKKy8qKgorICogR2V0IHRoZSBkYXRhIGxlbmd0aCwgaW4gYnl0ZXMuCisgKgorICogQHBhcmFtIHN0cmVhbSAgICAgICAgVGhlIEFWSSBzdHJlYW0uCisgKgorICogQHJldHVybgkJVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMuIFVwb24gZXJyb3IgaXQgd2lsbAorICoJCQlyZXR1cm4gbmVnYXRpdmUgdmFsdWUuCisgKi8KK1BKX0RFQ0wocGpfc3NpemVfdCkgcGptZWRpYV9hdmlfc3RyZWFtX2dldF9sZW4ocGptZWRpYV9hdmlfc3RyZWFtICpzdHJlYW0pOworCisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmlsZSByZWFkaW5nIGhhcyByZWFjaGVkIHRoZQorICogZW5kIG9mIGZpbGUuIElmIHRoZSBmaWxlIGlzIHNldCB0byBwbGF5IHJlcGVhdGVkbHksIHRoZW4gdGhlIGNhbGxiYWNrCisgKiB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gTm90ZSB0aGF0IG9ubHkgb25lIGNhbGxiYWNrIGNhbiBiZSAKKyAqIHJlZ2lzdGVyZWQgZm9yIGVhY2ggQVZJIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBBVkkgc3RyZWFtLgorICogQHBhcmFtIHVzZXJfZGF0YQlVc2VyIGRhdGEgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBjYWxsYmFjaworICogQHBhcmFtIGNiCQlDYWxsYmFjayB0byBiZSBjYWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi0KKyAqCQkJUEpfU1VDQ0VTUywgdGhlIHBsYXliYWNrIHdpbGwgc3RvcC4gTm90ZSB0aGF0IGlmCisgKgkJCWFwcGxpY2F0aW9uIGRlc3Ryb3lzIHRoZSBmaWxlIHBvcnQgaW4gdGhlIGNhbGxiYWNrLAorICoJCQlpdCBtdXN0IHJldHVybiBub24tUEpfU1VDQ0VTUyBoZXJlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX2F2aV9zdHJlYW1fc2V0X2VvZl9jYihwam1lZGlhX2F2aV9zdHJlYW0gKnN0cmVhbSwKKwkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgIHBqX3N0YXR1c190ICgqY2IpKHBqbWVkaWFfYXZpX3N0cmVhbSAqc3RyZWFtLAorCQkJCQkgICAgICAgIHZvaWQgKnVzcl9kYXRhKSk7CisKKy8qKgorICogQH0KKyAqLworCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9BVklfU1RSRUFNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYmlkaXJlY3Rpb25hbC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvYmlkaXJlY3Rpb25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhN2U1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9iaWRpcmVjdGlvbmFsLmgKQEAgLTAsMCArMSw2NyBAQAorLyogJElkOiBiaWRpcmVjdGlvbmFsLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0JJRElSRUNUSU9OQUxfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9CSURJUkVDVElPTkFMX0hfXworCisvKioKKyAqIEBmaWxlIGJpZGlyZWN0aW9uYWwuaAorICogQGJyaWVmIEJpZGlyZWN0aW9uYWwgbWVkaWEgcG9ydC4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvcG9ydC5oPgorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfQklESVJFQ1RJT05BTF9QT1JUIEJpZGlyZWN0aW9uYWwgUG9ydAorICogQGluZ3JvdXAgUEpNRURJQV9QT1JUCisgKiBAYnJpZWYgQSBiaWRpcmVjdGlvbmFsIHBvcnQgY29tYmluZXMgdHdvIHVuaWRpcmVjdGlvbmFsIHBvcnRzIGludG8gb25lCisgKiBiaWRpcmVjdGlvbmFsIHBvcnQKKyAqIEB7CisgKi8KKworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBDcmVhdGUgYmlkaXJlY3Rpb25hbCBwb3J0IGZyb20gdHdvIHVuaWRpcmVjdGlvbmFsIHBvcnRzCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LgorICogQHBhcmFtIGdldF9wb3J0CVBvcnQgd2hlcmUgZ2V0X2ZyYW1lKCkgd2lsbCBiZSBkaXJlY3RlZCB0by4KKyAqIEBwYXJhbSBwdXRfcG9ydAlQb3J0IHdoZXJlIHB1dF9mcmFtZSgpIHdpbGwgYmUgZGlyZWN0ZWQgdG8uCisgKiBAcGFyYW0gcF9wb3J0CVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfYmlkaXJlY3Rpb25hbF9wb3J0X2NyZWF0ZShwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgICAgICAgcGptZWRpYV9wb3J0ICpnZXRfcG9ydCwKKwkJCQkJCSAgICAgICBwam1lZGlhX3BvcnQgKnB1dF9wb3J0LAorCQkJCQkJICAgICAgIHBqbWVkaWFfcG9ydCAqKnBfcG9ydCApOworCisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9CSURJUkVDVElPTkFMX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jaXJjYnVmLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jaXJjYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwMGRjYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NpcmNidWYuaApAQCAtMCwwICsxLDQzNyBAQAorLyogJElkOiBjaXJjYnVmLmggNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKyNpZm5kZWYgX19QSk1FRElBX0NJUkNfQlVGX0hfXworI2RlZmluZSBfX1BKTUVESUFfQ0lSQ19CVUZfSF9fCisKKy8qKgorICogQGZpbGUgY2lyY2J1Zi5oCisgKiBAYnJpZWYgQ2lyY3VsYXIgQnVmZmVyLgorICovCisKKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2ZyYW1lLmg+CisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX0NJUkNCVUYgQ2lyY3VsYXIgQnVmZmVyCisgKiBAaW5ncm91cCBQSk1FRElBX0ZSQU1FX09QCisgKiBAYnJpZWYgQ2lyY3VsYXIgYnVmZmVyIG1hbmFnZXMgcmVhZCBhbmQgd3JpdGUgY29udGlndW91cyBhdWRpbyBzYW1wbGVzIGluIGEgCisgKiBub24tY29udGlndW91cyBidWZmZXIgYXMgaWYgdGhlIGJ1ZmZlciB3ZXJlIGNvbnRpZ3VvdXMuIFRoaXMgc2hvdWxkIGdpdmUKKyAqIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIGtlZXBpbmcgY29udGlndW91cyBzYW1wbGVzIGluIGEgY29udGlndW91cyBidWZmZXIsCisgKiBzaW5jZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgcG9pbnRlcnMsIGluc3RlYWQgb2YgCisgKiBzaGlmdGluZyBhdWRpbyBzYW1wbGVzLgorICoKKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBQSk1FRElBJ3MgaW1wbGVtZW50YXRpb24gb2YgY2lyY3VsYXIgYnVmZmVyLgorICovCisKKy8qIEFsZ29yaXRobSBjaGVja2luZ3MsIGZvciBkZXZlbG9wbWVudCBwdXJwb3NlIG9ubHkgKi8KKyNpZiAwCisjICAgZGVmaW5lIFBKTUVESUFfQ0lSQ19CVUZfQ0hFQ0soeCkgcGpfYXNzZXJ0KHgpCisjZWxzZQorIyAgIGRlZmluZSBQSk1FRElBX0NJUkNfQlVGX0NIRUNLKHgpCisjZW5kaWYKKworUEpfQkVHSU5fREVDTAorCisvKiogCisgKiBDaXJjdWxhciBidWZmZXIgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY2lyY19idWYgeworICAgIHBqX2ludDE2X3QJICAgICpidWY7CSAgICAvKio8IFRoZSBidWZmZXIJCQkqLworICAgIHVuc2lnbmVkCSAgICAgY2FwYWNpdHk7CSAgICAvKio8IEJ1ZmZlciBjYXBhY2l0eSwgaW4gc2FtcGxlcwkqLworCisgICAgcGpfaW50MTZfdAkgICAgKnN0YXJ0OwkgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUJKi8KKyAgICB1bnNpZ25lZAkgICAgIGxlbjsJICAgIC8qKjwgQXVkaW8gc2FtcGxlcyBsZW5ndGgsIAorCQkJCQkgaW4gc2FtcGxlcwkJCSovCit9IHBqbWVkaWFfY2lyY19idWY7CisKKworLyoqCisgKiBDcmVhdGUgdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgd2hlcmUgdGhlIGNpcmN1bGFyIGJ1ZmZlciB3aWxsIGJlIGFsbG9jYXRlZAorICoJCQkgICAgZnJvbS4KKyAqIEBwYXJhbSBjYXBhY2l0eQkgICAgQ2FwYWNpdHkgb2YgdGhlIGJ1ZmZlciwgaW4gc2FtcGxlcy4KKyAqIEBwYXJhbSBwX2NiCQkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBjaXJjdWxhciBidWZmZXIgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1MgaWYgdGhlIGNpcmN1bGFyIGJ1ZmZlciBoYXMgYmVlbgorICoJCQkgICAgY3JlYXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJICAgIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jaXJjX2J1Zl9jcmVhdGUocGpfcG9vbF90ICpwb29sLCAKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNhcGFjaXR5LCAKKwkJCQkJICAgICAgIHBqbWVkaWFfY2lyY19idWYgKipwX2NiKQoreworICAgIHBqbWVkaWFfY2lyY19idWYgKmNidWY7CisKKyAgICBjYnVmID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwam1lZGlhX2NpcmNfYnVmKTsKKyAgICBjYnVmLT5idWYgPSAocGpfaW50MTZfdCopIHBqX3Bvb2xfY2FsbG9jKHBvb2wsIGNhcGFjaXR5LCAKKwkJCQkJICAgICBzaXplb2YocGpfaW50MTZfdCkpOworICAgIGNidWYtPmNhcGFjaXR5ID0gY2FwYWNpdHk7CisgICAgY2J1Zi0+c3RhcnQgPSBjYnVmLT5idWY7CisgICAgY2J1Zi0+bGVuID0gMDsKKworICAgICpwX2NiID0gY2J1ZjsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qKgorICogUmVzZXQgdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gY2lyY2J1ZgkgICAgVGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyB3aGVuIHN1Y2Nlc3NmdWwuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jaXJjX2J1Zl9yZXNldChwam1lZGlhX2NpcmNfYnVmICpjaXJjYnVmKQoreworICAgIGNpcmNidWYtPnN0YXJ0ID0gY2lyY2J1Zi0+YnVmOworICAgIGNpcmNidWYtPmxlbiA9IDA7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKioKKyAqIEdldCB0aGUgY2lyY3VsYXIgYnVmZmVyIGxlbmd0aCwgaXQgaXMgbnVtYmVyIG9mIHNhbXBsZXMgYnVmZmVyZWQgaW4gdGhlIAorICogY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBjaXJjYnVmCSAgICBUaGUgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIEByZXR1cm4JCSAgICBUaGUgYnVmZmVyIGxlbmd0aC4KKyAqLworUEpfSU5MSU5FKHVuc2lnbmVkKSBwam1lZGlhX2NpcmNfYnVmX2dldF9sZW4ocGptZWRpYV9jaXJjX2J1ZiAqY2lyY2J1ZikKK3sKKyAgICByZXR1cm4gY2lyY2J1Zi0+bGVuOworfQorCisKKy8qKgorICogU2V0IGNpcmN1bGFyIGJ1ZmZlciBsZW5ndGguIFRoaXMgaXMgdXNlZnVsIHdoZW4gYXVkaW8gYnVmZmVyIGlzIG1hbnVhbGx5IAorICogbWFuaXB1bGF0ZWQgYnkgdGhlIHVzZXIsIGUuZzogc2hyaW5rZWQsIGV4cGFuZGVkLgorICoKKyAqIEBwYXJhbSBjaXJjYnVmCSAgICBUaGUgY2lyY3VsYXIgYnVmZmVyLgorICogQHBhcmFtIGxlbgkJICAgIFRoZSBuZXcgYnVmZmVyIGxlbmd0aC4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfY2lyY19idWZfc2V0X2xlbihwam1lZGlhX2NpcmNfYnVmICpjaXJjYnVmLAorCQkJCQkgdW5zaWduZWQgbGVuKQoreworICAgIFBKTUVESUFfQ0lSQ19CVUZfQ0hFQ0sobGVuIDw9IGNpcmNidWYtPmNhcGFjaXR5KTsKKyAgICBjaXJjYnVmLT5sZW4gPSBsZW47Cit9CisKKworLyoqCisgKiBBZHZhbmNlIHRoZSByZWFkIHBvaW50ZXIgb2YgY2lyY3VsYXIgYnVmZmVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGlzY2FyZAorICogdGhlIHNraXBwZWQgc2FtcGxlcyB3aGlsZSBhZHZhbmNpbmcgdGhlIHJlYWQgcG9pbnRlciwgdGh1cyByZWR1Y2luZyAKKyAqIHRoZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqIEBwYXJhbSBjaXJjYnVmCSAgICBUaGUgY2lyY3VsYXIgYnVmZmVyLgorICogQHBhcmFtIGNvdW50CQkgICAgRGlzdGFuY2UgZnJvbSBjdXJyZW50IHJlYWQgcG9pbnRlciwgY2FuIG9ubHkgYmUKKyAqCQkJICAgIHBvc3NpdGl2ZSBudW1iZXIsIGluIHNhbXBsZXMuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgd2hlbiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgCisgKgkJCSAgICB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX2NpcmNfYnVmX2Fkdl9yZWFkX3B0cihwam1lZGlhX2NpcmNfYnVmICpjaXJjYnVmLCAKKwkJCQkJCSAgICAgdW5zaWduZWQgY291bnQpCit7CisgICAgaWYgKGNvdW50ID49IGNpcmNidWYtPmxlbikKKwlyZXR1cm4gcGptZWRpYV9jaXJjX2J1Zl9yZXNldChjaXJjYnVmKTsKKworICAgIFBKTUVESUFfQ0lSQ19CVUZfQ0hFQ0soY291bnQgPD0gY2lyY2J1Zi0+bGVuKTsKKworICAgIGNpcmNidWYtPnN0YXJ0ICs9IGNvdW50OworICAgIGlmIChjaXJjYnVmLT5zdGFydCA+PSBjaXJjYnVmLT5idWYgKyBjaXJjYnVmLT5jYXBhY2l0eSkgCisJY2lyY2J1Zi0+c3RhcnQgLT0gY2lyY2J1Zi0+Y2FwYWNpdHk7CisgICAgY2lyY2J1Zi0+bGVuIC09IGNvdW50OworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqCisgKiBBZHZhbmNlIHRoZSB3cml0ZSBwb2ludGVyIG9mIGNpcmN1bGFyIGJ1ZmZlci4gU2luY2Ugd3JpdGUgcG9pbnRlciBpcyBhbHdheXMKKyAqIHBvaW50aW5nIHRvIGEgc2FtcGxlIGFmdGVyIHRoZSBlbmQgb2Ygc2FtcGxlLCBzbyB0aGlzIGZ1bmN0aW9uIGFsc28gbWVhbnMKKyAqIGluY3JlYXNpbmcgdGhlIGJ1ZmZlciBsZW5ndGguCisgKgorICogQHBhcmFtIGNpcmNidWYJICAgIFRoZSBjaXJjdWxhciBidWZmZXIuCisgKiBAcGFyYW0gY291bnQJCSAgICBEaXN0YW5jZSBmcm9tIGN1cnJlbnQgd3JpdGUgcG9pbnRlciwgY2FuIG9ubHkgYmUKKyAqCQkJICAgIHBvc3NpdGl2ZSBudW1iZXIsIGluIHNhbXBsZXMuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgd2hlbiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgCisgKgkJCSAgICB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX2NpcmNfYnVmX2Fkdl93cml0ZV9wdHIocGptZWRpYV9jaXJjX2J1ZiAqY2lyY2J1ZiwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGNvdW50KQoreworICAgIGlmIChjb3VudCArIGNpcmNidWYtPmxlbiA+IGNpcmNidWYtPmNhcGFjaXR5KQorCXJldHVybiBQSl9FVE9PQklHOworCisgICAgY2lyY2J1Zi0+bGVuICs9IGNvdW50OworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqCisgKiBHZXQgdGhlIHJlYWwgYnVmZmVyIGFkZHJlc3NlcyBjb250YWluaW5nIHRoZSBhdWRpbyBzYW1wbGVzLgorICoKKyAqIEBwYXJhbSBjaXJjYnVmCSAgICBUaGUgY2lyY3VsYXIgYnVmZmVyLgorICogQHBhcmFtIHJlZzEJCSAgICBQb2ludGVyIHRvIHN0b3JlIHRoZSBmaXJzdCBidWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSByZWcxX2xlbgkgICAgUG9pbnRlciB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBidWZmZXIsIAorICoJCQkgICAgaW4gc2FtcGxlcy4KKyAqIEBwYXJhbSByZWcyCQkgICAgUG9pbnRlciB0byBzdG9yZSB0aGUgc2Vjb25kIGJ1ZmZlciBhZGRyZXNzLgorICogQHBhcmFtIHJlZzJfbGVuCSAgICBQb2ludGVyIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZCBidWZmZXIsIAorICoJCQkgICAgaW4gc2FtcGxlcy4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfY2lyY19idWZfZ2V0X3JlYWRfcmVnaW9ucyhwam1lZGlhX2NpcmNfYnVmICpjaXJjYnVmLCAKKwkJCQkJCSAgcGpfaW50MTZfdCAqKnJlZzEsIAorCQkJCQkJICB1bnNpZ25lZCAqcmVnMV9sZW4sIAorCQkJCQkJICBwal9pbnQxNl90ICoqcmVnMiwgCisJCQkJCQkgIHVuc2lnbmVkICpyZWcyX2xlbikKK3sKKyAgICAqcmVnMSA9IGNpcmNidWYtPnN0YXJ0OworICAgICpyZWcxX2xlbiA9IGNpcmNidWYtPmxlbjsKKyAgICBpZiAoKnJlZzEgKyAqcmVnMV9sZW4gPiBjaXJjYnVmLT5idWYgKyBjaXJjYnVmLT5jYXBhY2l0eSkgeworCSpyZWcxX2xlbiA9ICh1bnNpZ25lZCkoY2lyY2J1Zi0+YnVmICsgY2lyY2J1Zi0+Y2FwYWNpdHkgLSAKKwkJCSAgICAgICBjaXJjYnVmLT5zdGFydCk7CisJKnJlZzIgPSBjaXJjYnVmLT5idWY7CisJKnJlZzJfbGVuID0gY2lyY2J1Zi0+bGVuIC0gKnJlZzFfbGVuOworICAgIH0gZWxzZSB7CisJKnJlZzIgPSBOVUxMOworCSpyZWcyX2xlbiA9IDA7CisgICAgfQorCisgICAgUEpNRURJQV9DSVJDX0JVRl9DSEVDSygqcmVnMV9sZW4gIT0gMCB8fCAoKnJlZzFfbGVuID09IDAgJiYgCisJCQkJCSAgICAgIGNpcmNidWYtPmxlbiA9PSAwKSk7CisgICAgUEpNRURJQV9DSVJDX0JVRl9DSEVDSygqcmVnMV9sZW4gKyAqcmVnMl9sZW4gPT0gY2lyY2J1Zi0+bGVuKTsKK30KKworCisvKioKKyAqIEdldCB0aGUgcmVhbCBidWZmZXIgYWRkcmVzc2VzIHRoYXQgaXMgZW1wdHkgb3Igd3JpdGVhYmxlLgorICoKKyAqIEBwYXJhbSBjaXJjYnVmCSAgICBUaGUgY2lyY3VsYXIgYnVmZmVyLgorICogQHBhcmFtIHJlZzEJCSAgICBQb2ludGVyIHRvIHN0b3JlIHRoZSBmaXJzdCBidWZmZXIgYWRkcmVzcy4KKyAqIEBwYXJhbSByZWcxX2xlbgkgICAgUG9pbnRlciB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBidWZmZXIsIAorICoJCQkgICAgaW4gc2FtcGxlcy4KKyAqIEBwYXJhbSByZWcyCQkgICAgUG9pbnRlciB0byBzdG9yZSB0aGUgc2Vjb25kIGJ1ZmZlciBhZGRyZXNzLgorICogQHBhcmFtIHJlZzJfbGVuCSAgICBQb2ludGVyIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZCBidWZmZXIsIAorICoJCQkgICAgaW4gc2FtcGxlcy4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfY2lyY19idWZfZ2V0X3dyaXRlX3JlZ2lvbnMocGptZWRpYV9jaXJjX2J1ZiAqY2lyY2J1ZiwgCisJCQkJCQkgICBwal9pbnQxNl90ICoqcmVnMSwgCisJCQkJCQkgICB1bnNpZ25lZCAqcmVnMV9sZW4sIAorCQkJCQkJICAgcGpfaW50MTZfdCAqKnJlZzIsIAorCQkJCQkJICAgdW5zaWduZWQgKnJlZzJfbGVuKQoreworICAgICpyZWcxID0gY2lyY2J1Zi0+c3RhcnQgKyBjaXJjYnVmLT5sZW47CisgICAgaWYgKCpyZWcxID49IGNpcmNidWYtPmJ1ZiArIGNpcmNidWYtPmNhcGFjaXR5KQorCSpyZWcxIC09IGNpcmNidWYtPmNhcGFjaXR5OworICAgICpyZWcxX2xlbiA9IGNpcmNidWYtPmNhcGFjaXR5IC0gY2lyY2J1Zi0+bGVuOworICAgIGlmICgqcmVnMSArICpyZWcxX2xlbiA+IGNpcmNidWYtPmJ1ZiArIGNpcmNidWYtPmNhcGFjaXR5KSB7CisJKnJlZzFfbGVuID0gKHVuc2lnbmVkKShjaXJjYnVmLT5idWYgKyBjaXJjYnVmLT5jYXBhY2l0eSAtICpyZWcxKTsKKwkqcmVnMiA9IGNpcmNidWYtPmJ1ZjsKKwkqcmVnMl9sZW4gPSAodW5zaWduZWQpKGNpcmNidWYtPnN0YXJ0IC0gY2lyY2J1Zi0+YnVmKTsKKyAgICB9IGVsc2UgeworCSpyZWcyID0gTlVMTDsKKwkqcmVnMl9sZW4gPSAwOworICAgIH0KKworICAgIFBKTUVESUFfQ0lSQ19CVUZfQ0hFQ0soKnJlZzFfbGVuICE9IDAgfHwgKCpyZWcxX2xlbiA9PSAwICYmIAorCQkJCQkgICAgICBjaXJjYnVmLT5sZW4gPT0gMCkpOworICAgIFBKTUVESUFfQ0lSQ19CVUZfQ0hFQ0soKnJlZzFfbGVuICsgKnJlZzJfbGVuID09IGNpcmNidWYtPmNhcGFjaXR5IC0gCisJCQkgICBjaXJjYnVmLT5sZW4pOworfQorCisKKy8qKgorICogUmVhZCBhdWRpbyBzYW1wbGVzIGZyb20gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gY2lyY2J1ZgkgICAgVGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqIEBwYXJhbSBkYXRhCQkgICAgQnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGF1ZGlvIHNhbXBsZXMuCisgKiBAcGFyYW0gY291bnQJCSAgICBOdW1iZXIgb2Ygc2FtcGxlcyBiZWluZyByZWFkLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIHdoZW4gc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIAorICoJCQkgICAgdGhlIGFwcHJvcHJpYXRlIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jaXJjX2J1Zl9yZWFkKHBqbWVkaWFfY2lyY19idWYgKmNpcmNidWYsIAorCQkJCQkgICAgIHBqX2ludDE2X3QgKmRhdGEsIAorCQkJCQkgICAgIHVuc2lnbmVkIGNvdW50KQoreworICAgIHBqX2ludDE2X3QgKnJlZzEsICpyZWcyOworICAgIHVuc2lnbmVkIHJlZzFjbnQsIHJlZzJjbnQ7CisKKyAgICAvKiBEYXRhIGluIHRoZSBidWZmZXIgaXMgbGVzcyB0aGFuIHJlcXVlc3RlZCAqLworICAgIGlmIChjb3VudCA+IGNpcmNidWYtPmxlbikKKwlyZXR1cm4gUEpfRVRPT0JJRzsKKworICAgIHBqbWVkaWFfY2lyY19idWZfZ2V0X3JlYWRfcmVnaW9ucyhjaXJjYnVmLCAmcmVnMSwgJnJlZzFjbnQsIAorCQkJCSAgICAgICZyZWcyLCAmcmVnMmNudCk7CisgICAgaWYgKHJlZzFjbnQgPj0gY291bnQpIHsKKwlwam1lZGlhX2NvcHlfc2FtcGxlcyhkYXRhLCByZWcxLCBjb3VudCk7CisgICAgfSBlbHNlIHsKKwlwam1lZGlhX2NvcHlfc2FtcGxlcyhkYXRhLCByZWcxLCByZWcxY250KTsKKwlwam1lZGlhX2NvcHlfc2FtcGxlcyhkYXRhICsgcmVnMWNudCwgcmVnMiwgY291bnQgLSByZWcxY250KTsKKyAgICB9CisKKyAgICByZXR1cm4gcGptZWRpYV9jaXJjX2J1Zl9hZHZfcmVhZF9wdHIoY2lyY2J1ZiwgY291bnQpOworfQorCisKKy8qKgorICogV3JpdGUgYXVkaW8gc2FtcGxlcyB0byB0aGUgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBjaXJjYnVmCSAgICBUaGUgY2lyY3VsYXIgYnVmZmVyLgorICogQHBhcmFtIGRhdGEJCSAgICBBdWRpbyBzYW1wbGVzIHRvIGJlIHdyaXR0ZW4uCisgKiBAcGFyYW0gY291bnQJCSAgICBOdW1iZXIgb2Ygc2FtcGxlcyBiZWluZyB3cml0dGVuLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIHdoZW4gc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCisgKgkJCSAgICB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX2NpcmNfYnVmX3dyaXRlKHBqbWVkaWFfY2lyY19idWYgKmNpcmNidWYsIAorCQkJCQkgICAgICBwal9pbnQxNl90ICpkYXRhLCAKKwkJCQkJICAgICAgdW5zaWduZWQgY291bnQpCit7CisgICAgcGpfaW50MTZfdCAqcmVnMSwgKnJlZzI7CisgICAgdW5zaWduZWQgcmVnMWNudCwgcmVnMmNudDsKKworICAgIC8qIERhdGEgdG8gd3JpdGUgaXMgbGFyZ2VyIHRoYW4gYnVmZmVyIGNhbiBzdG9yZSAqLworICAgIGlmIChjb3VudCA+IGNpcmNidWYtPmNhcGFjaXR5IC0gY2lyY2J1Zi0+bGVuKQorCXJldHVybiBQSl9FVE9PQklHOworCisgICAgcGptZWRpYV9jaXJjX2J1Zl9nZXRfd3JpdGVfcmVnaW9ucyhjaXJjYnVmLCAmcmVnMSwgJnJlZzFjbnQsIAorCQkJCSAgICAgICAmcmVnMiwgJnJlZzJjbnQpOworICAgIGlmIChyZWcxY250ID49IGNvdW50KSB7CisJcGptZWRpYV9jb3B5X3NhbXBsZXMocmVnMSwgZGF0YSwgY291bnQpOworICAgIH0gZWxzZSB7CisJcGptZWRpYV9jb3B5X3NhbXBsZXMocmVnMSwgZGF0YSwgcmVnMWNudCk7CisJcGptZWRpYV9jb3B5X3NhbXBsZXMocmVnMiwgZGF0YSArIHJlZzFjbnQsIGNvdW50IC0gcmVnMWNudCk7CisgICAgfQorCisgICAgcmV0dXJuIHBqbWVkaWFfY2lyY19idWZfYWR2X3dyaXRlX3B0cihjaXJjYnVmLCBjb3VudCk7Cit9CisKKworLyoqCisgKiBDb3B5IGF1ZGlvIHNhbXBsZXMgZnJvbSB0aGUgY2lyY3VsYXIgYnVmZmVyIHdpdGhvdXQgY2hhbmdpbmcgaXRzIHN0YXRlLiAKKyAqCisgKiBAcGFyYW0gY2lyY2J1ZgkgICAgVGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqIEBwYXJhbSBzdGFydF9pZHgJICAgIFN0YXJ0aW5nIHNhbXBsZSBpbmRleCB0byBiZSBjb3BpZWQuCisgKiBAcGFyYW0gZGF0YQkJICAgIEJ1ZmZlciB0byBzdG9yZSB0aGUgcmVhZCBhdWRpbyBzYW1wbGVzLgorICogQHBhcmFtIGNvdW50CQkgICAgTnVtYmVyIG9mIHNhbXBsZXMgYmVpbmcgcmVhZC4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyB3aGVuIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSAKKyAqCQkJICAgIHRoZSBhcHByb3ByaWF0ZSBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY2lyY19idWZfY29weShwam1lZGlhX2NpcmNfYnVmICpjaXJjYnVmLCAKKwkJCQkJICAgICB1bnNpZ25lZCBzdGFydF9pZHgsCisJCQkJCSAgICAgcGpfaW50MTZfdCAqZGF0YSwgCisJCQkJCSAgICAgdW5zaWduZWQgY291bnQpCit7CisgICAgcGpfaW50MTZfdCAqcmVnMSwgKnJlZzI7CisgICAgdW5zaWduZWQgcmVnMWNudCwgcmVnMmNudDsKKworICAgIC8qIERhdGEgaW4gdGhlIGJ1ZmZlciBpcyBsZXNzIHRoYW4gcmVxdWVzdGVkICovCisgICAgaWYgKGNvdW50ICsgc3RhcnRfaWR4ID4gY2lyY2J1Zi0+bGVuKQorCXJldHVybiBQSl9FVE9PQklHOworCisgICAgcGptZWRpYV9jaXJjX2J1Zl9nZXRfcmVhZF9yZWdpb25zKGNpcmNidWYsICZyZWcxLCAmcmVnMWNudCwgCisJCQkJICAgICAgJnJlZzIsICZyZWcyY250KTsKKyAgICBpZiAocmVnMWNudCA+IHN0YXJ0X2lkeCkgeworCXVuc2lnbmVkIHRtcF9sZW47CisJdG1wX2xlbiA9IHJlZzFjbnQgLSBzdGFydF9pZHg7CisJaWYgKHRtcF9sZW4gPiBjb3VudCkKKwkgICAgdG1wX2xlbiA9IGNvdW50OworCXBqbWVkaWFfY29weV9zYW1wbGVzKGRhdGEsIHJlZzEgKyBzdGFydF9pZHgsIHRtcF9sZW4pOworCWlmICh0bXBfbGVuIDwgY291bnQpCisJICAgIHBqbWVkaWFfY29weV9zYW1wbGVzKGRhdGEgKyB0bXBfbGVuLCByZWcyLCBjb3VudCAtIHRtcF9sZW4pOworICAgIH0gZWxzZSB7CisJcGptZWRpYV9jb3B5X3NhbXBsZXMoZGF0YSwgcmVnMiArIHN0YXJ0X2lkeCAtIHJlZzFjbnQsIGNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKioKKyAqIFBhY2sgdGhlIGJ1ZmZlciBzbyB0aGUgZmlyc3Qgc2FtcGxlIHdpbGwgYmUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLgorICogVGhpcyB3aWxsIGFsc28gbWFrZSB0aGUgYnVmZmVyIGNvbnRpZ3VvdXMuCisgKgorICogQHBhcmFtIGNpcmNidWYJICAgIFRoZSBjaXJjdWxhciBidWZmZXIuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgd2hlbiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgCisgKgkJCSAgICB0aGUgYXBwcm9wcmlhdGUgZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX2NpcmNfYnVmX3BhY2tfYnVmZmVyKHBqbWVkaWFfY2lyY19idWYgKmNpcmNidWYpCit7CisgICAgcGpfaW50MTZfdCAqcmVnMSwgKnJlZzI7CisgICAgdW5zaWduZWQgcmVnMWNudCwgcmVnMmNudDsKKyAgICB1bnNpZ25lZCBnYXA7CisKKyAgICBwam1lZGlhX2NpcmNfYnVmX2dldF9yZWFkX3JlZ2lvbnMoY2lyY2J1ZiwgJnJlZzEsICZyZWcxY250LCAKKwkJCQkgICAgICAmcmVnMiwgJnJlZzJjbnQpOworCisgICAgLyogQ2hlY2sgaWYgbm90IGNvbnRpZ3VlICovCisgICAgaWYgKHJlZzJjbnQgIT0gMCkgeworCS8qIENoZWNrIGlmIG5vIHNwYWNlIGxlZnQgdG8gcm9sbCB0aGUgYnVmZmVyIAorCSAqIChvciBzaG91bGQgdGhpcyBmdW5jdGlvbiBwcm92aWRlIHRlbXBvcmFyeSBidWZmZXI/KQorCSAqLworCWdhcCA9IGNpcmNidWYtPmNhcGFjaXR5IC0gcGptZWRpYV9jaXJjX2J1Zl9nZXRfbGVuKGNpcmNidWYpOworCWlmIChnYXAgPT0gMCkKKwkgICAgcmV0dXJuIFBKX0VUT09CSUc7CisKKwkvKiBSb2xsIGJ1ZmZlciBsZWZ0IHVzaW5nIHRoZSBnYXAgdW50aWwgcmVnMmNudCA9PSAwICovCisJZG8geworCSAgICBpZiAoZ2FwID4gcmVnMmNudCkKKwkJZ2FwID0gcmVnMmNudDsKKwkgICAgcGptZWRpYV9tb3ZlX3NhbXBsZXMocmVnMSAtIGdhcCwgcmVnMSwgcmVnMWNudCk7CisJICAgIHBqbWVkaWFfY29weV9zYW1wbGVzKHJlZzEgKyByZWcxY250IC0gZ2FwLCByZWcyLCBnYXApOworCSAgICBpZiAoZ2FwIDwgcmVnMmNudCkKKwkJcGptZWRpYV9tb3ZlX3NhbXBsZXMocmVnMiwgcmVnMiArIGdhcCwgcmVnMmNudCAtIGdhcCk7CisJICAgIHJlZzEgLT0gZ2FwOworCSAgICByZWcxY250ICs9IGdhcDsKKwkgICAgcmVnMmNudCAtPSBnYXA7CisJfSB3aGlsZSAocmVnMmNudCA+IDApOworICAgIH0KKworICAgIC8qIEZpbmFsbHksIFNoaWZ0IHNhbXBsZXMgdG8gdGhlIGxlZnQgZWRnZSAqLworICAgIGlmIChyZWcxICE9IGNpcmNidWYtPmJ1ZikKKwlwam1lZGlhX21vdmVfc2FtcGxlcyhjaXJjYnVmLT5idWYsIHJlZzEsIAorCQkJICAgICBwam1lZGlhX2NpcmNfYnVmX2dldF9sZW4oY2lyY2J1ZikpOworICAgIGNpcmNidWYtPnN0YXJ0ID0gY2lyY2J1Zi0+YnVmOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY2xvY2suaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzM2VlZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Nsb2NrLmgKQEAgLTAsMCArMSwzMzUgQEAKKy8qICRJZDogY2xvY2suaCAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ0xPQ0tfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9DTE9DS19IX18KKworLyoqCisgKiBAZmlsZSBjbG9jay5oCisgKiBAYnJpZWYgTWVkaWEgY2xvY2suCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9QT1JUX0NMT0NLIENsb2NrL1RpbWluZworICogQGluZ3JvdXAgUEpNRURJQV9QT1JUCisgKiBAYnJpZWYgVmFyaW91cyB0eXBlcyBvZiBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aW1pbmcuCisgKiBAeworCisgVGhlIG1lZGlhIGNsb2NrL3RpbWluZyBleHRlbmRzIHRoZSBtZWRpYSBwb3J0IGNvbmNlcHQgdGhhdCBpcyBleHBsYWluZWQgCisgaW4gQHJlZiBQSk1FRElBX1BPUlQuIFdoZW4gY2xvY2sgaXMgcHJlc2VudCBpbiB0aGUgcG9ydHMgCisgaW50ZXJjb25uZWN0aW9uLCBtZWRpYSB3aWxsIGZsb3cgYXV0b21hdGljYWxseSAoYW5kIHdpdGggY29ycmVjdCB0aW1pbmcgdG9vISkKKyBmcm9tIG9uZSBtZWRpYSBwb3J0IHRvIGFub3RoZXIuCisgCisgVGhlcmUgYXJlIGZldyBvYmplY3RzIGluIFBKTUVESUEgdGhhdCBhcmUgYWJsZSB0byBwcm92aWRlIGNsb2NrL3RpbWluZworIHRvIG1lZGlhIHBvcnRzIGludGVyY29ubmVjdGlvbjoKKworIC0gQHJlZiBQSk1FRF9TTkRfUE9SVFxuCisgICBUaGUgc291bmQgZGV2aWNlIG1ha2VzIGEgZ29vZCBjYW5kaWRhdGUgYXMgdGhlIGNsb2NrIHNvdXJjZSwgYW5kCisgICBQSk1FRElBIEByZWYgUEpNRURfU05EIGlzIGRlc2lnbmVkIHNvIHRoYXQgaXQgaXMgYWJsZSB0byBpbnZva2UKKyAgIG9wZXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRpbWluZyBkcml2ZW4gYnkgdGhlIHNvdW5kIGhhcmR3YXJlIGNsb2NrCisgICAodGhpcyBtYXkgc291bmQgY29tcGxpY2F0ZWQsIGJ1dCBhY3R1YWxseSBpdCBqdXN0IG1lYW5zIHRoYXQKKyAgIHRoZSBzb3VuZCBkZXZpY2UgYWJzdHJhY3Rpb24gcHJvdmlkZXMgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZCB3aGVuCisgICBpdCBoYXMvd2FudHMgbWVkaWEgZnJhbWVzKS5cbgorICAgU2VlIEByZWYgUEpNRURfU05EX1BPUlQgZm9yIG1vcmUgZGV0YWlscy4KKworIC0gQHJlZiBQSk1FRElBX01BU1RFUl9QT1JUXG4KKyAgIFRoZSBtYXN0ZXIgcG9ydCB1c2VzIEByZWYgUEpNRURJQV9DTE9DSyBhcyB0aGUgY2xvY2sgc291cmNlLiBCeSB1c2luZworICAgQHJlZiBQSk1FRElBX01BU1RFUl9QT1JULCBpdCBpcyBwb3NzaWJsZSB0byBpbnRlcmNvbm5lY3QgcGFzc2l2ZQorICAgbWVkaWEgcG9ydHMgYW5kIGxldCB0aGUgZnJhbWVzIGZsb3cgYXV0b21hdGljYWxseSBpbiB0aW1lbHkgbWFubmVyLlxuCisgICBQbGVhc2Ugc2VlIEByZWYgUEpNRURJQV9NQVNURVJfUE9SVCBmb3IgbW9yZSBkZXRhaWxzLgorCisgQH0KKyAqLworCisKKy8qKgorICogQGFkZHRvZ3JvdXAgUEpNRURJQV9DTE9DSyBDbG9jayBHZW5lcmF0b3IKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVF9DTE9DSworICogQGJyaWVmIEludGVyZmFjZSBmb3IgZ2VuZXJhdGluZyBjbG9jay4KKyAqIEB7CisgKiAKKyAqIFRoZSBjbG9jayBnZW5lcmF0b3IgcHJvdmlkZXMgdGhlIGFwcGxpY2F0aW9uIHdpdGggbWVkaWEgdGltaW5nLAorICogYW5kIGl0IGlzIHVzZWQgYnkgdGhlIEByZWYgUEpNRURJQV9NQVNURVJfUE9SVCBmb3IgaXRzIHNvdW5kIGNsb2NrLgorICoKKyAqIFRoZSBjbG9jayBnZW5lcmF0b3IgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gcnVuIDxiPmFzeW5jaHJvbm91c2x5PC9iPiAKKyAqICh0aGUgZGVmYXVsdCBiZWhhdmlvcikgb3IgPGI+c3luY2hyb25vdXNseTwvYj4uIFdoZW4gaXQgaXMgcnVuIAorICogYXN5bmNocm9ub3VzbHksIGl0IHdpbGwgY2FsbCB0aGUgYXBwbGljYXRpb24ncyBjYWxsYmFjayBldmVyeSB0aW1lCisgKiB0aGUgY2xvY2sgPGI+dGljazwvYj4gZXhwaXJlcy4gV2hlbiBpdCBpcyBydW4gc3luY2hyb25vdXNseSwgCisgKiBhcHBsaWNhdGlvbiBtdXN0IGNvbnRpbnVvdXNseSBwb2xscyB0aGUgY2xvY2sgZ2VuZXJhdG9yIHRvIHN5bmNocm9uaXplCisgKiB0aGUgdGltaW5nLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBNZWRpYSBjbG9jayBzb3VyY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY2xvY2tfc3JjCit7CisgICAgcGptZWRpYV90eXBlICAgIG1lZGlhX3R5cGU7ICAgICAvKio8IE1lZGlhIHR5cGUuICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgICAgICAgIGNsb2NrX3JhdGU7ICAgICAvKio8IENsb2NrIHJhdGUuICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgICAgICAgIHB0aW1lX3VzZWM7ICAgICAvKio8IEZyYW1lIGludGVydmFsIChpbiB1c2VjKS4gICovCisgICAgLyoqCisgICAgICogVGhlIHRpbWVzdGFtcCBmaWVsZCBob2xkcyBhbiBpbmNyZWFzaW5nIHZhbHVlIGluIHNhbXBsZXMgYW5kIGl0cworICAgICAqIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGluY3JlYXNlZCBieSBjbG9ja19yYXRlIHNhbXBsZXMgcGVyIHNlY29uZC4KKyAgICAgKi8KKyAgICBwal90aW1lc3RhbXAgICAgdGltZXN0YW1wOworICAgIC8qKgorICAgICAqIFRpbWVzdGFtcCdzIGxhc3QgdXBkYXRlLiBUaGUgbGFzdF91cGRhdGUgZmllbGQgY29udGFpbnMgYSB2YWx1ZSBpbgorICAgICAqIHRpY2tzLCBhbmQgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgaW5jcmVhc2VkIGJ5IHBqX2dldF90aW1lc3RhbXBfZnJlcSgpCisgICAgICogdGlja3MgcGVyIHNlY29uZC4KKyAgICAgKi8KKyAgICBwal90aW1lc3RhbXAgICAgbGFzdF91cGRhdGU7Cit9IHBqbWVkaWFfY2xvY2tfc3JjOworCisvKioKKyAqIFRoaXMgaXMgYW4gYXV4aWxpYXJ5IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG1lZGlhIGNsb2NrIHNvdXJjZS4KKyAqCisgKiBAcGFyYW0gY2xvY2tzcmMgICAgICAgICAgVGhlIGNsb2NrIHNvdXJjZSB0byBiZSBpbml0aWFsaXplZC4KKyAqIEBwYXJhbSBtZWRpYV90eXBlICAgICAgICBUaGUgbWVkaWEgdHlwZS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBUaGUgY2xvY2sgcmF0ZS4KKyAqIEBwYXJhbSBwdGltZV91c2VjICAgICAgICBNZWRpYSBmcmFtZSBpbnRlcnZhbCAoaW4gdXNlYykuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jbG9ja19zcmNfaW5pdCggcGptZWRpYV9jbG9ja19zcmMgKmNsb2Nrc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV90eXBlIG1lZGlhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjbG9ja19yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcHRpbWVfdXNlYyApOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgY2xvY2sgc291cmNlJ3MgdGltZXN0YW1wLiBBcHBsaWNhdGlvbiBzaG91bGQKKyAqIHVzZSB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIHRpbWVzdGFtcCBkaXJlY3RseSBzaW5jZSB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIGFsc28gdXBkYXRlIHRoZSBsYXN0X3VwZGF0ZSBmaWVsZCBvZiB0aGUgY2xvY2sgc291cmNlLgorICoKKyAqIEBwYXJhbSBjbG9ja3NyYyAgICAgICAgICBUaGUgY2xvY2sgc291cmNlIHRvIGJlIHVwZGF0ZWQuCisgKiBAcGFyYW0gdGltZXN0YW1wICAgICAgICAgVGhlIG5ldyB0aW1lc3RhbXAsIGNhbiBiZSBOVUxMIGlmIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIGRvZXMgbm90IGNoYW5nZSAoaW4gdGhpcyBjYXNlIGl0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgbGFzdF91cGRhdGUgZmllbGQpLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY2xvY2tfc3JjX3VwZGF0ZSggcGptZWRpYV9jbG9ja19zcmMgKmNsb2Nrc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnRpbWVzdGFtcCApOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgY2xvY2sgc291cmNlJ3MgY3VycmVudCB0aW1lc3RhbXAuIEFwcGxpY2F0aW9uCisgKiBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBhY2Nlc3NpbmcgdGhlIHRpbWVzdGFtcCBkaXJlY3RseQorICogc2luY2UgdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSB0aGUgcHJlZGljdGVkIHRpbWVzdGFtcCBmb3IgY3VycmVudAorICogdGltZSwgYmFzZWQgb24gdGhlIHZhbHVlcyBvZiB0aW1lc3RhbXAsIGxhc3RfdXBkYXRlLCBhbmQgY2xvY2tfcmF0ZS4KKyAqCisgKiBAcGFyYW0gY2xvY2tzcmMgICAgICAgICAgVGhlIGNsb2NrIHNvdXJjZS4KKyAqIEBwYXJhbSB0aW1lc3RhbXAgICAgICAgICBBcmd1bWVudCB0byByZWNlaXZlIHRoZSBjdXJyZW50IHRpbWVzdGFtcAorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX2Nsb2NrX3NyY19nZXRfY3VycmVudF90aW1lc3RhbXAoIGNvbnN0IHBqbWVkaWFfY2xvY2tfc3JjICpjbG9ja3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGltZXN0YW1wICp0aW1lc3RhbXApOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgY2xvY2sgc291cmNlJ3MgdGltZSBpbiBtc2VjLgorICoKKyAqIEBwYXJhbSBjbG9ja3NyYyAgICAgICAgICBUaGUgY2xvY2sgc291cmNlLgorICoKKyAqIEByZXR1cm4JCSAgICBUaGUgY2xvY2sgc291cmNlJ3MgdGltZSAoaW4gbXNlYykuCisgKi8KK1BKX0RFQ0wocGpfdWludDMyX3QpCitwam1lZGlhX2Nsb2NrX3NyY19nZXRfdGltZV9tc2VjKCBjb25zdCBwam1lZGlhX2Nsb2NrX3NyYyAqY2xvY2tzcmMgKTsKKworCisvKioKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBmb3IgbWVkaWEgY2xvY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY2xvY2sgcGptZWRpYV9jbG9jazsKKworCisvKioKKyAqIE9wdGlvbnMgd2hlbiBjcmVhdGluZyB0aGUgY2xvY2suCisgKi8KK2VudW0gcGptZWRpYV9jbG9ja19vcHRpb25zCit7CisgICAgLyoqCisgICAgICogUHJldmVudHMgdGhlIGNsb2NrIGZyb20gcnVubmluZyBhc3luY2hyb25vdXNseS4gSW4gdGhpcyBjYXNlLAorICAgICAqIGFwcGxpY2F0aW9uIG11c3QgcG9sbCB0aGUgY2xvY2sgY29udGludW91c2x5IGJ5IGNhbGxpbmcKKyAgICAgKiAjcGptZWRpYV9jbG9ja193YWl0KCkgaW4gb3JkZXIgdG8gc3luY2hyb25pemUgdGltaW5nLgorICAgICAqLworICAgIFBKTUVESUFfQ0xPQ0tfTk9fQVNZTkMgID0gMSwKKworICAgIC8qKgorICAgICAqIFByZXZlbnQgdGhlIGNsb2NrIGZyb20gc2V0dGluZyBpdCdzIHRocmVhZCB0byBoaWdoZXN0IHByaW9yaXR5LgorICAgICAqLworICAgIFBKTUVESUFfQ0xPQ0tfTk9fSElHSEVTVF9QUklPID0gMgorfTsKKworCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2Nsb2NrX3BhcmFtCit7CisgICAgLyoqCisgICAgICogVGhlIGZyYW1lIGludGVydmFsLCBpbiBtaWNyb3NlY29uZHMuCisgICAgICovCisgICAgdW5zaWduZWQgdXNlY19pbnRlcnZhbDsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVkaWEgY2xvY2sgcmF0ZSwgdG8gZGV0ZXJtaW5lIHRpbWVzdGFtcAorICAgICAqIGluY3JlbWVudCBmb3IgZWFjaCBjYWxsLgorICAgICAqLworICAgIHVuc2lnbmVkIGNsb2NrX3JhdGU7Cit9IHBqbWVkaWFfY2xvY2tfcGFyYW07CisKKy8qKgorICogVHlwZSBvZiBtZWRpYSBjbG9jayBjYWxsYmFjay4KKyAqCisgKiBAcGFyYW0gdHMJCSAgICBDdXJyZW50IHRpbWVzdGFtcCwgaW4gc2FtcGxlcy4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJICAgIEFwcGxpY2F0aW9uIGRhdGEgdGhhdCBpcyBwYXNzZWQgd2hlbgorICoJCQkgICAgdGhlIGNsb2NrIHdhcyBjcmVhdGVkLgorICovCit0eXBlZGVmIHZvaWQgcGptZWRpYV9jbG9ja19jYWxsYmFjayhjb25zdCBwal90aW1lc3RhbXAgKnRzLAorCQkJCSAgICB2b2lkICp1c2VyX2RhdGEpOworCisKKworLyoqCisgKiBDcmVhdGUgbWVkaWEgY2xvY2suIFRoaXMgY3JlYXRlcyBhIG1lZGlhIGNsb2NrIG9iamVjdCB0aGF0IHdpbGwgcnVuCisgKiBwZXJpb2RpY2FsbHkgYXQgYW4gaW50ZXJ2YWwgdGhhdCBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIGF1ZGlvIHBhcmFtZXRlcnMuCisgKiBPbmNlIGNyZWF0ZWQsIGFwcGxpY2F0aW9uIG11c3QgY2FsbCAjcGptZWRpYV9jbG9ja19zdGFydCgpIHRvIGFjdHVhbGx5CisgKiBzdGFydCB0aGUgY2xvY2suCisgKgorICogQHNlZSBwam1lZGlhX2Nsb2NrX2NyZWF0ZTIoKQorICoKKyAqIEBwYXJhbSBwb29sCQkgICAgUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkuCisgKiBAcGFyYW0gY2xvY2tfcmF0ZQkgICAgTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBOdW1iZXIgb2YgY2hhbm5lbC4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuIFRoaXMgYXJndW1lbnQKKyAqCQkJICAgIGFsb25nIHdpdGggY2xvY2tfcmF0ZSBhbmQgY2hhbm5lbF9jb3VudCwgc3BlY2lmaWVzIAorICoJCQkgICAgdGhlIGludGVydmFsIG9mIGVhY2ggY2xvY2sgcnVuIChvciBjbG9jayB0aWNrcykuCisgKiBAcGFyYW0gb3B0aW9ucwkgICAgQml0bWFzayBvZiBwam1lZGlhX2Nsb2NrX29wdGlvbnMuCisgKiBAcGFyYW0gY2IJCSAgICBDYWxsYmFjayB0byBiZSBjYWxsZWQgZm9yIGVhY2ggY2xvY2sgdGljay4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJICAgIFVzZXIgZGF0YSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgorICogQHBhcmFtIHBfY2xvY2sJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgY2xvY2sgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgKgkJCSAgICBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2Nsb2NrX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICAgcGptZWRpYV9jbG9ja19jYWxsYmFjayAqY2IsCisJCQkJCSAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgcGptZWRpYV9jbG9jayAqKnBfY2xvY2spOworCisKKy8qKgorICogQ3JlYXRlIG1lZGlhIGNsb2NrLiBUaGlzIGNyZWF0ZXMgYSBtZWRpYSBjbG9jayBvYmplY3QgdGhhdCB3aWxsIHJ1bgorICogcGVyaW9kaWNhbGx5IGF0IHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwuIE9uY2UgY3JlYXRlZCwgYXBwbGljYXRpb24gbXVzdAorICogY2FsbCAjcGptZWRpYV9jbG9ja19zdGFydCgpIHRvIGFjdHVhbGx5IHN0YXJ0IHRoZSBjbG9jay4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LgorICogQHBhcmFtIHBhcmFtCSAgICAgICAgICAgIFRoZSBjbG9jayBwYXJhbWV0ZXIuCisgKiBAcGFyYW0gb3B0aW9ucwkgICAgQml0bWFzayBvZiBwam1lZGlhX2Nsb2NrX29wdGlvbnMuCisgKiBAcGFyYW0gY2IJCSAgICBDYWxsYmFjayB0byBiZSBjYWxsZWQgZm9yIGVhY2ggY2xvY2sgdGljay4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJICAgIFVzZXIgZGF0YSwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgorICogQHBhcmFtIHBfY2xvY2sJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgY2xvY2sgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgKgkJCSAgICBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2Nsb2NrX2NyZWF0ZTIocGpfcG9vbF90ICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfY2xvY2tfcGFyYW0gKnBhcmFtLAorCQkJCQkgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgICBwam1lZGlhX2Nsb2NrX2NhbGxiYWNrICpjYiwKKwkJCQkJICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgICBwam1lZGlhX2Nsb2NrICoqcF9jbG9jayk7CisKKy8qKgorICogU3RhcnQgdGhlIGNsb2NrLiBGb3IgY2xvY2sgY3JlYXRlZCB3aXRoIGFzeW5jaHJvbm91cyBmbGFnIHNldCB0byBUUlVFLAorICogdGhpcyBtYXkgc3RhcnQgYSB3b3JrZXIgdGhyZWFkIGZvciB0aGUgY2xvY2sgKGRlcGVuZGluZyBvbiB0aGUgCisgKiBiYWNrZW5kIGNsb2NrIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQpLgorICoKKyAqIEBwYXJhbSBjbG9jawkJICAgIFRoZSBtZWRpYSBjbG9jay4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY2xvY2tfc3RhcnQocGptZWRpYV9jbG9jayAqY2xvY2spOworCisKKy8qKgorICogU3RvcCB0aGUgY2xvY2suCisgKgorICogQHBhcmFtIGNsb2NrCQkgICAgVGhlIG1lZGlhIGNsb2NrLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVMgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jbG9ja19zdG9wKHBqbWVkaWFfY2xvY2sgKmNsb2NrKTsKKworCisvKioKKyAqIE1vZGlmeSB0aGUgY2xvY2sncyBwYXJhbWV0ZXIuCisgKgorICogQHBhcmFtIGNsb2NrCQkgICAgVGhlIG1lZGlhIGNsb2NrLgorICogQHBhcmFtIHBhcmFtCSAgICAgICAgICAgIFRoZSBjbG9jaydzIG5ldyBwYXJhbWV0ZXIuCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY2xvY2tfbW9kaWZ5KHBqbWVkaWFfY2xvY2sgKmNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV9jbG9ja19wYXJhbSAqcGFyYW0pOworCisKKy8qKgorICogUG9sbCB0aGUgbWVkaWEgY2xvY2ssIGFuZCBleGVjdXRlIHRoZSBjYWxsYmFjayB3aGVuIHRoZSBjbG9jayB0aWNrIGhhcworICogZWxhcHNlZC4gVGhpcyBvcGVyYXRpb24gaXMgb25seSB2YWxpZCBpZiB0aGUgY2xvY2sgaXMgY3JlYXRlZCB3aXRoIGFzeW5jCisgKiBmbGFnIHNldCB0byBGQUxTRS4KKyAqCisgKiBAcGFyYW0gY2xvY2sJCSAgICBUaGUgbWVkaWEgY2xvY2suCisgKiBAcGFyYW0gd2FpdAkJICAgIElmIG5vbi16ZXJvLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKgkJCSAgICBhIGNsb2NrIHRpY2sgZWxhcHNlZCBhbmQgY2FsbGJhY2sgaGFzIGJlZW4gY2FsbGVkLgorICogQHBhcmFtIHRzCQkgICAgT3B0aW9uYWwgYXJndW1lbnQgdG8gcmVjZWl2ZSB0aGUgY3VycmVudCAKKyAqCQkJICAgIHRpbWVzdGFtcC4KKyAqCisgKiBAcmV0dXJuCQkgICAgTm9uLXplcm8gaWYgY2xvY2sgdGljayBoYXMgZWxhcHNlZCwgb3IgRkFMU0UgaWYKKyAqCQkJICAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIGJlZm9yZSBhIGNsb2NrIHRpY2sgaGFzCisgKgkJCSAgICBlbGFwc2VkLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV9jbG9ja193YWl0KHBqbWVkaWFfY2xvY2sgKmNsb2NrLAorCQkJCSAgICAgIHBqX2Jvb2xfdCB3YWl0LAorCQkJCSAgICAgIHBqX3RpbWVzdGFtcCAqdHMpOworCisKKy8qKgorICogRGVzdHJveSB0aGUgY2xvY2suCisgKgorICogQHBhcmFtIGNsb2NrCQkgICAgVGhlIG1lZGlhIGNsb2NrLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVMgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jbG9ja19kZXN0cm95KHBqbWVkaWFfY2xvY2sgKmNsb2NrKTsKKworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ0xPQ0tfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvZGVjLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZmE3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb2RlYy5oCkBAIC0wLDAgKzEsMTEzOSBAQAorLyogJElkOiBjb2RlYy5oIDQyNzggMjAxMi0xMC0wNSAxMDowNDo1NFogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ERUNfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9DT0RFQ19IX18KKworCisvKioKKyAqIEBmaWxlIGNvZGVjLmgKKyAqIEBicmllZiBDb2RlYyBmcmFtZXdvcmsuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvcG9ydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbGlzdC5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfQ09ERUMgQ29kZWMgRnJhbWV3b3JrCisgKiBAYnJpZWYgTWVkaWEgY29kZWMgZnJhbWV3b3JrIGFuZCBtYW5hZ2VtZW50CisgKiBAeworICoKKyAqIEBzZWN0aW9uIGNvZGVjX21nbXRfc2VjIENvZGVjIE1hbmFnZW1lbnQKKyAqIEBzdWJzZWN0aW9uIGNvZGVjX2ZhY3Rfc2VjIENvZGVjIE1hbmFnZXIKKyAqCisgKiBUaGUgY29kZWMgbWFuYWdlciBpcyB1c2VkIHRvIG1hbmFnZSBhbGwgY29kZWMgY2FwYWJpbGl0aWVzIGluIHRoZSBlbmRwb2ludC4KKyAqIFdoZW4gdXNlZCB3aXRoIG1lZGlhIGVuZHBvaW50IChwam1lZGlhX2VuZHB0KSwgYXBwbGljYXRpb24gY2FuIHJldHJpZXZlCisgKiB0aGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZSBieSBjYWxsaW5nICNwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IoKS4KKyAqCisgKiBAc3Vic2VjdGlvbiByZWdfbmV3X2NvZGVjIFJlZ2lzdGVyaW5nIE5ldyBDb2RlYworICoKKyAqIE5ldyBjb2RlYyB0eXBlcyBjYW4gYmUgcmVnaXN0ZXJlZCB0byBQSk1FRElBIChvciB0byBiZSBwcmVjaXNlLCB0byB0aGUgCisgKiBjb2RlYyBtYW5hZ2VyKSBkdXJpbmcgcnVuLXRpbWUuIAorICogVG8gZG8gdGhpcywgYXBwbGljYXRpb24gbmVlZHMgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZgorICogY29kZWMgZmFjdG9yeSAoI3BqbWVkaWFfY29kZWNfZmFjdG9yeSkgYW5kIHJlZ2lzdGVycyB0aGlzIGNvZGVjIGZhY3RvcnkKKyAqIGJ5IGNhbGxpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3JlZ2lzdGVyX2ZhY3RvcnkoKS4KKyAqCisgKiBGb3IgY29kZWNzIGltcGxlbWVudGVkL3N1cHBvcnRlZCBieSBQSk1FRElBLCB0aGlzIHByb2Nlc3MgaXMgbm9ybWFsbHkKKyAqIGNvbmNlYWxlZCBpbiBhbiBlYXN5IHRvIHVzZSBmdW5jdGlvbiBzdWNoIGFzICNwam1lZGlhX2NvZGVjX2c3MTFfaW5pdCgpLgorICoKKyAqIEBzdWJzZWN0aW9uIGNvZGVjX2ZhY3RvcnkgQ29kZWMgRmFjdG9yeQorICoKKyAqIEEgY29kZWMgZmFjdG9yeSAoI3BqbWVkaWFfY29kZWNfZmFjdG9yeSkgaXMgcmVnaXN0ZXJlZCB0byBjb2RlYyBtYW5hZ2VyLCAKKyAqIGFuZCBpdCBpcyB1c2VkIHRvIGNyZWF0ZSBhbmQgcmVsZWFzZSBjb2RlYyBpbnN0YW5jZS4KKyAqCisgKiBUaGUgbW9zdCBpbXBvcnRhbnQgbWVtYmVyIG9mIHRoZSBjb2RlYyBmYWN0b3J5IGlzIHRoZSAidmlydHVhbCIgZnVuY3Rpb24KKyAqIHRhYmxlICNwam1lZGlhX2NvZGVjX2ZhY3Rvcnlfb3AsIHdoZXJlIGl0IGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZywgCisgKiBwb2ludGVyIHRvIGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSBhbmQgZGVhbGxvY2F0ZSBjb2RlYyBpbnN0YW5jZS4KKyAqCisgKiBAc3Vic2VjdGlvbiBjb2RlY19pbnN0IENvZGVjIEluc3RhbmNlCisgKgorICogQXBwbGljYXRpb24gYWxsb2NhdGVzIGNvZGVjIGluc3RhbmNlIGJ5IGNhbGxpbmcgI3BqbWVkaWFfY29kZWNfbWdyX2FsbG9jX2NvZGVjKCkuCisgKiBPbmUgY29kZWMgaW5zdGFuY2UgKCNwam1lZGlhX2NvZGVjKSBjYW4gYmUgdXNlZCBmb3Igc2ltdWx0YW5lb3VzIGVuY29kaW5nCisgKiBhbmQgZGVjb2RpbmcuCisgKgorICogVGhlIG1vc3QgaW1wb3J0YW50IG1lbWJlciBvZiB0aGUgY29kZWMgaW5zdGFuY2UgaXMgdGhlICJ2aXJ0dWFsIiBmdW5jdGlvbgorICogdGFibGUgI3BqbWVkaWFfY29kZWNfb3AsIHdoZXJlIGl0IGhvbGRzIHBvaW50ZXIgdG8gZnVuY3Rpb25zIHRvCisgKiBlbmNvZGUvZGVjb2RlIG1lZGlhIGZyYW1lcy4KKyAqCisgKiBAc3Vic2VjdGlvbiBjb2RlY19pZGVudCBDb2RlYyBJZGVudGlmaWNhdGlvbgorICoKKyAqIEEgcGFydGljdWxhciBjb2RlYyB0eXBlIGluIFBKTUVESUEgY2FuIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdHdvCisgKiBrZXlzOiBieSAjcGptZWRpYV9jb2RlY19pbmZvLCBvciBieSAjcGptZWRpYV9jb2RlY19pZCBzdHJpbmcuIEEgZnVsbHkKKyAqIHF1YWxpZmllZCBjb2RlYyBJRCBzdHJpbmcgY29uc2lzdHMgb2YgY29kZWMgbmFtZSwgc2FtcGxpbmcgcmF0ZSwgYW5kCisgKiBudW1iZXIgb2YgY2hhbm5lbHMuIEhvd2V2ZXIsIGFwcGxpY2F0aW9uIG1heSB1c2Ugb25seSBmaXJzdCBwYXJ0cyBvZgorICogdGhlIHRva2VucyBhcyBsb25nIGFzIGl0IHdpbGwgbWFrZSB0byBjb2RlYyBJRCB1bmlxdWUuIEZvciBleGFtcGxlLCAiZ3NtIgorICogaXMgYSBmdWxseSBxdWFsaWZpZWQgY29kZWMgbmFtZSwgc2luY2UgaXQgd2lsbCBhbHdheXMgaGF2ZSA4MDAwIGNsb2NrCisgKiByYXRlIGFuZCAxIGNoYW5uZWwuIE90aGVyIGV4YW1wbGVzIG9mIGZ1bGx5IHF1YWxpZmllZCBjb2RlYyBJRCBzdHJpbmdzCisgKiBhcmUgInBjbWEiLCAic3BlZXgvODAwMCIsICJzcGVleC8xNjAwMCIsIGFuZCAiTDE2LzE2MDAwLzEiLiBBIGNvZGVjCisgKiBpZCAic3BlZXgiICh3aXRob3V0IGNsb2NrIHJhdGUpIGlzIG5vdCBmdWxseSBxdWFsaWZpZWQsIHNpbmNlIGl0IHdpbGwKKyAqIG1hdGNoIHRoZSBuYXJyb3diYW5kLCB3aWRlYmFuZCwgYW5kIHVsdHJhd2lkZWJhbmQgU3BlZXggY29kZWMuCisgKgorICogVGhlIHR3byBrZXlzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gb25lIGFub3RoZXIsIHdpdGgKKyAqICNwam1lZGlhX2NvZGVjX2luZm9fdG9faWQoKSBhbmQgI3BqbWVkaWFfY29kZWNfbWdyX2ZpbmRfY29kZWNzX2J5X2lkKCkKKyAqIGZ1bmN0aW9ucy4KKyAqCisgKiBDb2RlYyBJRCBzdHJpbmcgaXMgbm90IGNhc2Ugc2Vuc2l0aXZlLgorICoKKyAqCisgKiBAc2VjdGlvbiB1c2luZ19jb2RlYyBVc2luZyB0aGUgQ29kZWMgRnJhbWV3b3JrCisgKiBAc3Vic2VjdGlvbiBpbml0X2FsbG9jX2NvZGVjIEFsbG9jYXRpbmcgQ29kZWMKKyAqCisgKiBBcHBsaWNhdGlvbiBuZWVkcyB0byBhbGxvY2F0ZSBvbmUgY29kZWMgaW5zdGFuY2UgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZworICogbWVkaWEgZnJhbWVzLiBPbmUgY29kZWMgaW5zdGFuY2UgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBib3RoIGVuY29kaW5nCisgKiBhbmQgZGVjb2RpbmcuCisgKgorICogQXBwbGljYXRpb24gYWxsb2NhdGVzIGNvZGVjIGJ5IGNhbGxpbmcgI3BqbWVkaWFfY29kZWNfbWdyX2FsbG9jX2NvZGVjKCkuCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzICNwam1lZGlhX2NvZGVjX2luZm8gYXJndW1lbnQsIHdoaWNoIGlzIHVzZWQgdG8gbG9jYXRlCisgKiB0aGUgcGFydGljdWxhciBjb2RlYyBmYWN0b3J5IHRvIGJlIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGNvZGVjLgorICoKKyAqIEFwcGxpY2F0aW9uIGNhbiBidWlsZCAjcGptZWRpYV9jb2RlY19pbmZvIHN0cnVjdHVyZSBtYW51YWxseSBmb3IKKyAqIHRoZSBzcGVjaWZpYyBjb2RlYywgb3IgYWx0ZXJuYXRpdmVseSBpdCBtYXkgZ2V0IHRoZSAjcGptZWRpYV9jb2RlY19pbmZvCisgKiBmcm9tIHRoZSBjb2RlYyBJRCBzdHJpbmcsIGJ5IHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9maW5kX2NvZGVjc19ieV9pZCgpCisgKiBmdW5jdGlvbi4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHNuaXBwZXQgc2hvd3MgYW4gZXhhbXBsZSB0byBhbGxvY2F0ZSBhIGNvZGVjOgorICoKKyBcY29kZQorICAgIHBqX3N0cl90IGNvZGVjX2lkOworICAgIHBqbWVkaWFfY29kZWNfaW5mbyAqY29kZWNfaW5mbzsKKyAgICB1bnNpZ25lZCBjb3VudCA9IDE7CisgICAgcGptZWRpYV9jb2RlYyAqY29kZWM7CisKKyAgICBjb2RlY19pZCA9IHBqX3N0cigicGNtYSIpOworCisgICAgLy8gRmluZCBjb2RlYyBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIGNvZGVkIElEIChpLmUuICJwY21hIikuCisgICAgc3RhdHVzID0gcGptZWRpYV9jb2RlY19tZ3JfZmluZF9jb2RlY3NfYnlfaWQoIGNvZGVjX21nciwgJmNvZGVjX2lkLAorCQkJCQkJICAmY291bnQsICZjb2RlY19pbmZvLCBOVUxMKTsKKworICAgIC8vIEFsbG9jYXRlIHRoZSBjb2RlYy4KKyAgICBzdGF0dXMgPSBwam1lZGlhX2NvZGVjX21ncl9hbGxvY19jb2RlYyggY29kZWNfbWdyLCBjb2RlY19pbmZvLCAmY29kZWMgKTsKKworIFxlbmRjb2RlCisgKgorICoKKyAqIEBzdWJzZWN0aW9uIG9wZW5pbmdfY29kZWMgSW5pdGlhbGl6aW5nIENvZGVjCisgKgorICogT25jZSBjb2RlYyBpcyBhbGxvY2F0ZWQsIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGluaXRpYWxpemUgdGhlIGNvZGVjCisgKiBieSBjYWxsaW5nIDxiPjx0dD5vcGVuPC90dD48L2I+IG1lbWJlciBvZiB0aGUgY29kZWMuIFRoaXMgZnVuY3Rpb24KKyAqIHRha2VzICNwam1lZGlhX2NvZGVjX3BhcmFtIGFzIHRoZSBhcmd1bWVudCwgd2hpY2ggY29udGFpbnMgdGhlCisgKiBzZXR0aW5ncyBmb3IgdGhlIGNvZGVjLgorICoKKyAqIEFwcGxpY2F0aW9uIHNob3VkIHVzZSAjcGptZWRpYV9jb2RlY19tZ3JfZ2V0X2RlZmF1bHRfcGFyYW0oKSBmdW5jdGlvbgorICogdG8gaW5pdGlhaXplICNwam1lZGlhX2NvZGVjX3BhcmFtLiBUaGUgPHR0PnNldHRpbmc8L3R0PiBwYXJ0IG9mCisgKiAjcGptZWRpYV9jb2RlY19wYXJhbSB0aGVuIGNhbiBiZSB0dW5lZCB0byBzdWl0IHRoZSBhcHBsaWNhdGlvbidzCisgKiByZXF1aXJlbWVudHMuCisgKgorICogVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIGFuIGV4YW1wbGUgdG8gaW5pdGlhbGl6ZSBjb2RlYzoKKyAqCisgXGNvZGUKKyAgICBwam1lZGlhX2NvZGVjX3BhcmFtIHBhcmFtOworCisgICAgLy8gUmV0cmlldmUgZGVmYXVsdCBjb2RlYyBwYXJhbSBmb3IgdGhlIHNwZWNpZmllZCBjb2RlYy4KKyAgICBwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbShjb2RlY19tZ3IsIGNvZGVjX2luZm8KKwkJCQkJJnBhcmFtKTsKKworICAgIC8vIEFwcGxpY2F0aW9uIG1heSBjaGFuZ2UgdGhlICJzZXR0aW5ncyIgcGFydCBvZiBjb2RlYyBwYXJhbSwKKyAgICAvLyBmb3IgZXhhbXBsZSwgdG8gZGlzYWJsZSBWQUQKKyAgICBwYXJhbS5zZXR0aW5nLnZhZCA9IDA7CisKKyAgICAvLyBPcGVuIHRoZSBjb2RlYyB1c2luZyB0aGUgc3BlY2lmaWVkIHNldHRpbmdzLgorICAgIGNvZGVjLT5vcC0+b3BlbiggY29kZWMsICZwYXJhbSApOworCisgXGVuZGNvZGUKKyAqCisgKgorICogQHN1YnNlY3Rpb24gZW5jX2RlY19jb2RlYyBFbmNvZGluZyBhbmQgRGVjb2RpbmcgTWVkaWEgRnJhbWVzCisgKgorICogQXBwbGljYXRpb24gZW5jb2RlcyBhbmQgZGVjb2RlcyBtZWRpYSBmcmFtZXMgYnkgY2FsbGluZworICogPHR0PmVuY29kZTwvdHQ+IGFuZCA8dHQ+ZGVjb2RlPC90dD4gbWVtYmVyIG9mIHRoZSBjb2RlYydzICJ2aXJ0dWFsIgorICogZnVuY3Rpb24gdGFibGUgKCNwam1lZGlhX2NvZGVjX29wKS4KKyAqCisgKiBAc3Vic2VjdGlvbiBwbGNfY29kZWMgQ29uY2VhbGluZyBMb3N0IEZyYW1lcworICoKKyAqIEFsbCBjb2RlY3MgaGFzIFBhY2tldCBMb3N0IENvbmNlYWxtZW50IChQTEMpIGZlYXR1cmUsIGFuZCBhcHBsaWNhdGlvbgorICogY2FuIGFjdGl2YXRlIHRoZSBQTEMgdG8gY29uY2VhbCBsb3N0IGZyYW1lcyBieSBjYWxsaW5nIDx0dD5yZWNvdmVyPC90dD4KKyAqIG1lbWJlciBvZiB0aGUgY29kZWMncyAidmlydHVhbCIgZnVuY3Rpb24gdGFibGUgKCNwam1lZGlhX2NvZGVjX29wKS4KKyAqCisgKiBJZiB0aGUgY29kZWMncyBhbGdvcml0aG0gc3VwcG9ydHMgUExDLCB0aGUgPHR0PnJlY292ZXI8L3R0PiBmdW5jdGlvbgorICogd2lsbCB1c2UgdGhlIGNvZGVjJ3MgUExDLiBPdGhlcndpc2UgZm9yIGNvZGVjcyB0aGF0IGRvbid0IGhhdmUKKyAqIGludHJpbnNpYyBQTEMsIFBKTUVESUEgd2lsbCBzdXBseSB0aGUgUExDIGltcGxlbWVudGF0aW9uIGZyb20gdGhlCisgKiBAcmVmIFBKTUVEX1BMQyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAc3Vic2VjdGlvbiBjbG9zZV9jb2RlYyBDbG9zaW5nIGFuZCBSZWxlYXNpbmcgdGhlIENvZGVjCisgKgorICogVGhlIGNvZGVjIG11c3QgYmUgY2xvc2VkIGJ5IGNhbGxpbmcgPHR0PmNsb3NlPC90dD4gbWVtYmVyIG9mIHRoZSBjb2RlYydzCisgKiBvcGVyYXRpb24uIFRoZW4gaXQgbXVzdCBiZSByZWxlYXNlZCBieSBjYWxsaW5nIAorICogI3BqbWVkaWFfY29kZWNfbWdyX2RlYWxsb2NfY29kZWMoKS4KKyAqLworCisKKy8qKiAKKyAqIFN0YW5kYXJkIFJUUCBzdGF0aWMgcGF5bG9hZCB0eXBlcywgYXMgZGVmaW5lZCBieSBSRkMgMzU1MS4gCisgKiBUaGUgaGVhZGVyIGZpbGUgPHBqbWVkaWEtY29kZWMvdHlwZXMuaD4gYWxzbyBkZWNsYXJlcyBkeW5hbWljIHBheWxvYWQKKyAqIHR5cGUgbnVtYmVycyB0aGF0IGFyZSB1c2VkIGJ5IFBKTUVESUEgd2hlbiBhZHZlcnRpc2luZyB0aGUgY2FwYWJpbGl0eQorICogZm9yIGV4YW1wbGUgaW4gU0RQIG1lc3NhZ2UuCisgKi8KK2VudW0gcGptZWRpYV9ydHBfcHQKK3sKKyAgICBQSk1FRElBX1JUUF9QVF9QQ01VID0gMCwJICAgIC8qKjwgYXVkaW8gUENNVQkJCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0c3MjEgPSAyLAkgICAgLyoqPCBhdWRpbyBHNzIxIChvbGQgZGVmIGZvciBHNzI2LTMyKSAgICovCisgICAgUEpNRURJQV9SVFBfUFRfR1NNICA9IDMsCSAgICAvKio8IGF1ZGlvIEdTTQkJCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0c3MjMgPSA0LAkgICAgLyoqPCBhdWRpbyBHNzIzCQkJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfRFZJNF84SyA9IDUsCSAgICAvKio8IGF1ZGlvIERWSTQgOEtIegkJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfRFZJNF8xNksgPSA2LCAgICAvKio8IGF1ZGlvIERWSTQgMTZLaHoJCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX0xQQyA9IDcsCSAgICAvKio8IGF1ZGlvIExQQwkJCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX1BDTUEgPSA4LAkgICAgLyoqPCBhdWRpbyBQQ01BCQkJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfRzcyMiA9IDksCSAgICAvKio8IGF1ZGlvIEc3MjIJCQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9MMTZfMiA9IDEwLAkgICAgLyoqPCBhdWRpbyAxNmJpdCBsaW5lYXIgNDQuMUtIeiBzdGVyZW8gICovCisgICAgUEpNRURJQV9SVFBfUFRfTDE2XzEgPSAxMSwJICAgIC8qKjwgYXVkaW8gMTZiaXQgbGluZWFyIDQ0LjFLSHogbW9ubyAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX1FDRUxQID0gMTIsCSAgICAvKio8IGF1ZGlvIFFDRUxQCQkJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfQ04gPSAxMywJICAgIC8qKjwgYXVkaW8gQ29tZm9ydCBOb2lzZQkJICAgICovCisgICAgUEpNRURJQV9SVFBfUFRfTVBBID0gMTQsCSAgICAvKio8IGF1ZGlvIE1QRUcxL01QRUcyIGVsZW1ldHIuIHN0cmVhbXMgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzI4ID0gMTUsCSAgICAvKio8IGF1ZGlvIEc3MjgJCQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9EVkk0XzExSyA9IDE2LCAgIC8qKjwgYXVkaW8gRFZJNCAxMS4wMjVLSHogbW9ubwkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9EVkk0XzIySyA9IDE3LCAgIC8qKjwgYXVkaW8gRFZJNCAyMi4wNTBLSHogbW9ubwkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9HNzI5ID0gMTgsCSAgICAvKio8IGF1ZGlvIEc3MjkJCQkgICAgKi8KKworICAgIFBKTUVESUFfUlRQX1BUX0NFTEIgPSAyNSwJICAgIC8qKjwgdmlkZW8vY29tYiBDZWxsLUIgYnkgU3VuIChSRkMyMDI5KSAqLworICAgIFBKTUVESUFfUlRQX1BUX0pQRUcgPSAyNiwJICAgIC8qKjwgdmlkZW8gSlBFRwkJCSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX05WID0gMjgsCSAgICAvKio8IHZpZGVvIE5WICBieSBudiBwcm9ncmFtIGJ5IFhlcm94ICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9IMjYxID0gMzEsCSAgICAvKio8IHZpZGVvIEgyNjEJCQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9NUFYgPSAzMiwJICAgIC8qKjwgdmlkZW8gTVBFRzEgb3IgTVBFRzIgZWxlbWVudGFyeSAgICAqLworICAgIFBKTUVESUFfUlRQX1BUX01QMlQgPSAzMywJICAgIC8qKjwgdmlkZW8gTVBFRzIgdHJhbnNwb3J0CQkgICAgKi8KKyAgICBQSk1FRElBX1JUUF9QVF9IMjYzID0gMzQsCSAgICAvKio8IHZpZGVvIEgyNjMJCQkgICAgKi8KKworICAgIFBKTUVESUFfUlRQX1BUX0RZTkFNSUMgPSA5NiAgICAgLyoqPCBzdGFydCBvZiBkeW5hbWljIFJUUCBwYXlsb2FkCSAgICAqLworCit9OworCisKKy8qKiAKKyAqIElkZW50aWZpY2F0aW9uIHVzZWQgdG8gc2VhcmNoIGZvciBjb2RlYyBmYWN0b3J5IHRoYXQgc3VwcG9ydHMgc3BlY2lmaWMgCisgKiBjb2RlYyBzcGVjaWZpY2F0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19pbmZvCit7CisgICAgcGptZWRpYV90eXBlICAgIHR5cGU7CSAgICAvKio8IE1lZGlhIHR5cGUuCQkJKi8KKyAgICB1bnNpZ25lZAkgICAgcHQ7CQkgICAgLyoqPCBQYXlsb2FkIHR5cGUgKGNhbiBiZSBkeW5hbWljKS4gKi8KKyAgICBwal9zdHJfdAkgICAgZW5jb2RpbmdfbmFtZTsgIC8qKjwgRW5jb2RpbmcgbmFtZS4JCQkqLworICAgIHVuc2lnbmVkCSAgICBjbG9ja19yYXRlOwkgICAgLyoqPCBTYW1wbGluZyByYXRlLgkJCSovCisgICAgdW5zaWduZWQJICAgIGNoYW5uZWxfY250OyAgICAvKio8IENoYW5uZWwgY291bnQuCQkJKi8KK30gcGptZWRpYV9jb2RlY19pbmZvOworCisvKiogCisgKiBTdHJ1Y3R1cmUgb2YgY29kZWMgc3BlY2lmaWMgcGFyYW1ldGVycyB3aGljaCBjb250YWlucyBuYW1lPXZhbHVlIHBhaXJzLgorICogVGhlIGNvZGVjIHNwZWNpZmljIHBhcmFtZXRlcnMgYXJlIHRvIGJlIHVzZWQgd2l0aCBTRFAgYWNjb3JkaW5nIHRvIAorICogdGhlIHN0YW5kYXJkcyAoZS5nOiBSRkMgMzU1NSkgaW4gU0RQICdhPWZtdHAnIGF0dHJpYnV0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19mbXRwCit7CisgICAgcGpfdWludDhfdAkgICAgY250OwkgICAgLyoqPCBOdW1iZXIgb2YgcGFyYW1ldGVycy4JCSovCisgICAgc3RydWN0IHBhcmFtIHsKKwlwal9zdHJfdCAgICBuYW1lOwkgICAgLyoqPCBQYXJhbWV0ZXIgbmFtZS4JCSovCisJcGpfc3RyX3QgICAgdmFsOwkgICAgLyoqPCBQYXJhbWV0ZXIgdmFsdWUuCQkqLworICAgIH0gcGFyYW0gW1BKTUVESUFfQ09ERUNfTUFYX0ZNVFBfQ05UXTsgLyoqPCBUaGUgcGFyYW1ldGVycy4JCSovCit9IHBqbWVkaWFfY29kZWNfZm10cDsKKworLyoqIAorICogRGV0YWlsZWQgY29kZWMgYXR0cmlidXRlcyB1c2VkIGluIGNvbmZpZ3VyaW5nIGEgY29kZWMgYW5kIGluIHF1ZXJ5aW5nCisgKiB0aGUgY2FwYWJpbGl0eSBvZiBjb2RlYyBmYWN0b3JpZXMuIERlZmF1bHQgYXR0cmlidXRlcyBvZiBhbnkgY29kZWNzIGNvdWxkCisgKiBiZSBxdWVyaWVkIHVzaW5nICNwam1lZGlhX2NvZGVjX21ncl9nZXRfZGVmYXVsdF9wYXJhbSgpIGFuZCBtb2RpZmllZAorICogdXNpbmcgI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCBjb2RlYyBwYXJhbWV0ZXIgYWxzbyBjb250YWlucyBTRFAgc3BlY2lmaWMgc2V0dGluZywgCisgKiAjZGVjX2ZtdHAgYW5kICNlbmNfZm10cCwgd2hpY2ggbWF5IG5lZWQgdG8gYmUgc2V0IGFwcHJvcHJpYXRlbHkgYmFzZWQgb24KKyAqIHRoZSBlZmZlY3RpdmUgc2V0dGluZy4gU2VlIGVhY2ggY29kZWMgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29kZWNfcGFyYW0KK3sKKyAgICAvKioKKyAgICAgKiBUaGUgImluZm8iIHBhcnQgb2YgY29kZWMgcGFyYW0gZGVzY3JpYmVzIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBjb2RlYywKKyAgICAgKiBhbmQgdGhlIHZhbHVlIHNob3VsZCBOT1QgYmUgY2hhbmdlZCBieSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgIHVuc2lnbmVkCSAgIGNsb2NrX3JhdGU7CQkvKio8IFNhbXBsaW5nIHJhdGUgaW4gSHoJICAgICovCisgICAgICAgdW5zaWduZWQJICAgY2hhbm5lbF9jbnQ7CQkvKio8IENoYW5uZWwgY291bnQuCQkgICAgKi8KKyAgICAgICBwal91aW50MzJfdCBhdmdfYnBzOwkJLyoqPCBBdmVyYWdlIGJhbmR3aWR0aCBpbiBiaXRzL3NlYyAgKi8KKyAgICAgICBwal91aW50MzJfdCBtYXhfYnBzOwkJLyoqPCBNYXhpbXVtIGJhbmR3aWR0aCBpbiBiaXRzL3NlYyAgKi8KKyAgICAgICB1bnNpZ25lZCAgICBtYXhfcnhfZnJhbWVfc2l6ZTsgICAvKio8IE1heGltdW0gZnJhbWUgc2l6ZSAgICAgICAgICAgICAqLworICAgICAgIHBqX3VpbnQxNl90IGZybV9wdGltZTsJCS8qKjwgRGVjb2RlciBmcmFtZSBwdGltZSBpbiBtc2VjLiAgICovCisgICAgICAgcGpfdWludDE2X3QgZW5jX3B0aW1lOwkJLyoqPCBFbmNvZGVyIHB0aW1lLCBvciB6ZXJvIGlmIGl0J3MKKwkJCQkJICAgICBlcXVhbCB0byBkZWNvZGVyIHB0aW1lLgkgICAgKi8KKyAgICAgICBwal91aW50OF90ICBwY21fYml0c19wZXJfc2FtcGxlOwkvKio8IEJpdHMvc2FtcGxlIGluIHRoZSBQQ00gc2lkZSAgICAqLworICAgICAgIHBqX3VpbnQ4X3QgIHB0OwkJCS8qKjwgUGF5bG9hZCB0eXBlLgkJICAgICovCisgICAgICAgcGptZWRpYV9mb3JtYXRfaWQgZm10X2lkOwkvKio8IFNvdXJjZSBmb3JtYXQsIGl0J3MgZm9ybWF0IG9mCisJCQkJCSAgICAgZW5jb2RlciBpbnB1dCBhbmQgZGVjb2RlciAKKwkJCQkJICAgICBvdXRwdXQuCQkJICAgICovCisgICAgfSBpbmZvOworCisgICAgLyoqCisgICAgICogVGhlICJzZXR0aW5nIiBwYXJ0IG9mIGNvZGVjIHBhcmFtIGRlc2NyaWJlcyB2YXJpb3VzIHNldHRpbmdzIHRvIGJlCisgICAgICogYXBwbGllZCB0byB0aGUgY29kZWMuIFdoZW4gdGhlIGNvZGVjIHBhcmFtIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBjb2RlYworICAgICAqIG9yIGNvZGVjIGZhY3RvcnksIHRoZSB2YWx1ZXMgb2YgdGhlc2Ugd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNhcGFiaWxpdHkKKyAgICAgKiBvZiB0aGUgY29kZWMuIEFueSBmZWF0dXJlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjIChlLmcuIHZhZAorICAgICAqIG9yIHBsYykgd2lsbCBiZSB0dXJuZWQgb24sIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHF1ZXJ5IHdoaWNoIAorICAgICAqIGNhcGFiaWxpdGllcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYy4gQXBwbGljYXRpb24gbWF5IGNoYW5nZSB0aGUKKyAgICAgKiBzZXR0aW5ncyBoZXJlIGJlZm9yZSBpbnN0YW50aWF0aW5nIHRoZSBjb2RlYy9zdHJlYW0uCisgICAgICovCisgICAgc3RydWN0IHsKKwlwal91aW50OF90ICBmcm1fcGVyX3BrdDsgICAgLyoqPCBOdW1iZXIgb2YgZnJhbWVzIHBlciBwYWNrZXQuCSovCisJdW5zaWduZWQgICAgdmFkOjE7CSAgICAvKio8IFZvaWNlIEFjdGl2aXR5IERldGVjdG9yLgkqLworCXVuc2lnbmVkICAgIGNuZzoxOwkgICAgLyoqPCBDb21mb3J0IE5vaXNlIEdlbmVyYXRvci4JKi8KKwl1bnNpZ25lZCAgICBwZW5oOjE7CSAgICAvKio8IFBlcmNlcHR1YWwgRW5oYW5jZW1lbnQJCSovCisJdW5zaWduZWQgICAgcGxjOjE7CSAgICAvKio8IFBhY2tldCBsb3NzIGNvbmNlYWxtZW50CSovCisJdW5zaWduZWQgICAgcmVzZXJ2ZWQ6MTsJICAgIC8qKjwgUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4JKi8KKwlwam1lZGlhX2NvZGVjX2ZtdHAgZW5jX2ZtdHA7LyoqPCBFbmNvZGVyJ3MgZm10cCBwYXJhbXMuCQkqLworCXBqbWVkaWFfY29kZWNfZm10cCBkZWNfZm10cDsvKio8IERlY29kZXIncyBmbXRwIHBhcmFtcy4JCSovCisgICAgfSBzZXR0aW5nOworfSBwam1lZGlhX2NvZGVjX3BhcmFtOworCisKKy8qKgorICogRHVwbGljYXRlIGNvZGVjIHBhcmFtZXRlci4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wuCisgKiBAcGFyYW0gc3JjCSAgICBUaGUgY29kZWMgcGFyYW1ldGVyIHRvIGJlIGR1cGxpY2F0ZWQuCisgKgorICogQHJldHVybgkgICAgRHVwbGljYXRlZCBjb2RlYyBwYXJhbWV0ZXIuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9jb2RlY19wYXJhbSopIHBqbWVkaWFfY29kZWNfcGFyYW1fY2xvbmUoCisJCQkJCXBqX3Bvb2xfdCAqcG9vbCwgCisJCQkJCWNvbnN0IHBqbWVkaWFfY29kZWNfcGFyYW0gKnNyYyk7CisKKworLyoKKyAqIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHBqbWVkaWFfY29kZWMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29kZWMgcGptZWRpYV9jb2RlYzsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBjb2RlYyBvcGVyYXRpb25zLiBFYWNoIGNvZGVjIE1VU1QgaW1wbGVtZW50CisgKiBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2NvZGVjX29wCit7CisgICAgLyoqIAorICAgICAqIEluaXRpYWxpemUgY29kZWMgdXNpbmcgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV9jb2RlY19pbml0KCkgaW5zdGVhZCBvZiAKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZWMJVGhlIGNvZGVjIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBwb29sCVBvb2wgdG8gdXNlIHdoZW4gdGhlIGNvZGVjIG5lZWRzIHRvIGFsbG9jYXRlCisgICAgICoJCQlzb21lIG1lbW9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdAkoKmluaXQpKHBqbWVkaWFfY29kZWMgKmNvZGVjLCAKKwkJCXBqX3Bvb2xfdCAqcG9vbCApOworCisgICAgLyoqIAorICAgICAqIE9wZW4gdGhlIGNvZGVjIGFuZCBpbml0aWFsaXplIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuCisgICAgICogVXBvbiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLCB0aGUgY29kZWMgbWF5IG1vZGlmeSB0aGUgcGFyYW1ldGVyCisgICAgICogYW5kIGZpbGxzIGluIHRoZSB1bnNwZWNpZmllZCB2YWx1ZXMgKHN1Y2ggYXMgZW5jX3B0aW1lLCB3aGVuCisgICAgICogZW5jb2RlciBwdGltZSBpcyBkaWZmZXJlbnQgdGhhbiBkZWNvZGVyIHB0aW1lKS4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX2NvZGVjX29wZW4oKSBpbnN0ZWFkIG9mIAorICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlYwlUaGUgY29kZWMgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHBhcmFtCUNvZGVjIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdAkoKm9wZW4pKHBqbWVkaWFfY29kZWMgKmNvZGVjLCAKKwkJCXBqbWVkaWFfY29kZWNfcGFyYW0gKnBhcmFtICk7CisKKyAgICAvKiogCisgICAgICogQ2xvc2UgYW5kIHNodXRkb3duIGNvZGVjLCByZWxlYXNpbmcgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkKKyAgICAgKiB0aGlzIGNvZGVjLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV9jb2RlY19jbG9zZSgpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGVjCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmNsb3NlKShwam1lZGlhX2NvZGVjICpjb2RlYyk7CisKKyAgICAvKiogCisgICAgICogTW9kaWZ5IHRoZSBjb2RlYyBwYXJhbWV0ZXIgYWZ0ZXIgdGhlIGNvZGVjIGlzIG9wZW4uIAorICAgICAqIE5vdGUgdGhhdCBub3QgYWxsIGNvZGVjIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGR1cmluZyBydW4tdGltZS4gCisgICAgICogV2hlbiB0aGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBjaGFuZ2VkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIAorICAgICAqIG5vbi1QSl9TVUNDRVNTLCBhbmQgdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIGNhbiBleHBlY3QgY2hhbmdpbmcgdHJpdmlhbCBjb2RlYyBzZXR0aW5ncyBzdWNoIGFzCisgICAgICogY2hhbmdpbmcgVkFEIHNldHRpbmcgdG8gc3VjY2VlZC4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX2NvZGVjX21vZGlmeSgpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGVjCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcGFyYW0JVGhlIG5ldyBjb2RlYyBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QJKCptb2RpZnkpKHBqbWVkaWFfY29kZWMgKmNvZGVjLCAKKwkJCSAgY29uc3QgcGptZWRpYV9jb2RlY19wYXJhbSAqcGFyYW0gKTsKKworICAgIC8qKgorICAgICAqIEluc3RydWN0IHRoZSBjb2RlYyB0byBpbnNwZWN0IHRoZSBzcGVjaWZpZWQgcGF5bG9hZC9wYWNrZXQgYW5kCisgICAgICogc3BsaXQgdGhlIHBhY2tldCBpbnRvIGluZGl2aWR1YWwgYmFzZSBmcmFtZXMuIEVhY2ggb3V0cHV0IGZyYW1lcyB3aWxsCisgICAgICogaGF2ZSBwdGltZSB0aGF0IGlzIGVxdWFsIHRvIGJhc2ljIGZyYW1lIHB0aW1lIChpLmUuIHRoZSB2YWx1ZSBvZgorICAgICAqIGluZm8uZnJtX3B0aW1lIGluICNwam1lZGlhX2NvZGVjX3BhcmFtKS4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX2NvZGVjX3BhcnNlKCkgaW5zdGVhZCBvZiAKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZWMJVGhlIGNvZGVjIGluc3RhbmNlCisgICAgICogQHBhcmFtIHBrdAlUaGUgaW5wdXQgcGFja2V0LgorICAgICAqIEBwYXJhbSBwa3Rfc2l6ZQlTaXplIG9mIHRoZSBwYWNrZXQuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcAlUaGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCBzYW1wbGUgaW4gdGhlIHBhY2tldC4KKyAgICAgKiBAcGFyYW0gZnJhbWVfY250CU9uIGlucHV0LCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcworICAgICAqCQkJaW4gdGhlIGFycmF5LiBPbiBvdXRwdXQsIHRoZSBjb2RlYyBtdXN0IGZpbGwKKyAgICAgKgkJCXdpdGggbnVtYmVyIG9mIGZyYW1lcyBkZXRlY3RlZCBpbiB0aGUgcGFja2V0LgorICAgICAqIEBwYXJhbSBmcmFtZXMJT24gb3V0cHV0LCBzcGVjaWZpZXMgdGhlIGZyYW1lcyB0aGF0IGhhdmUgYmVlbgorICAgICAqCQkJZGV0ZWN0ZWQgaW4gdGhlIHBhY2tldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnBhcnNlKSggcGptZWRpYV9jb2RlYyAqY29kZWMsCisJCQkgIHZvaWQgKnBrdCwKKwkJCSAgcGpfc2l6ZV90IHBrdF9zaXplLAorCQkJICBjb25zdCBwal90aW1lc3RhbXAgKnRpbWVzdGFtcCwKKwkJCSAgdW5zaWduZWQgKmZyYW1lX2NudCwKKwkJCSAgcGptZWRpYV9mcmFtZSBmcmFtZXNbXSk7CisKKyAgICAvKiogCisgICAgICogSW5zdHJ1Y3QgdGhlIGNvZGVjIHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkIGlucHV0IGZyYW1lLiBUaGUgaW5wdXQKKyAgICAgKiBQQ00gc2FtcGxlcyBNVVNUIGhhdmUgcHRpbWUgdGhhdCBpcyBtdWx0aXBsaWNhdGlvbiBvZiBiYXNlIGZyYW1lCisgICAgICogcHRpbWUgKGkuZS4gdGhlIHZhbHVlIG9mIGluZm8uZnJtX3B0aW1lIGluICNwam1lZGlhX2NvZGVjX3BhcmFtKS4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX2NvZGVjX2VuY29kZSgpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGVjCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gaW5wdXQJVGhlIGlucHV0IGZyYW1lLgorICAgICAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLgorICAgICAqIEBwYXJhbSBvdXRwdXQJVGhlIG91dHB1dCBmcmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzczsKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmVuY29kZSkocGptZWRpYV9jb2RlYyAqY29kZWMsIAorCQkJICBjb25zdCBzdHJ1Y3QgcGptZWRpYV9mcmFtZSAqaW5wdXQsCisJCQkgIHVuc2lnbmVkIG91dF9zaXplLCAKKwkJCSAgc3RydWN0IHBqbWVkaWFfZnJhbWUgKm91dHB1dCk7CisKKyAgICAvKiogCisgICAgICogSW5zdHJ1Y3QgdGhlIGNvZGVjIHRvIGRlY29kZSB0aGUgc3BlY2lmaWVkIGlucHV0IGZyYW1lLiBUaGUgaW5wdXQKKyAgICAgKiBmcmFtZSBNVVNUIGhhdmUgcHRpbWUgdGhhdCBpcyBleGFjdGx5IGVxdWFsIHRvIGJhc2UgZnJhbWUKKyAgICAgKiBwdGltZSAoaS5lLiB0aGUgdmFsdWUgb2YgaW5mby5mcm1fcHRpbWUgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0pLgorICAgICAqIEFwcGxpY2F0aW9uIGNhbiBhY2hpZXZlIHRoaXMgYnkgcGFyc2luZyB0aGUgcGFja2V0IGludG8gYmFzZQorICAgICAqIGZyYW1lcyBiZWZvcmUgZGVjb2RpbmcgZWFjaCBmcmFtZS4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX2NvZGVjX2RlY29kZSgpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGVjCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gaW5wdXQJVGhlIGlucHV0IGZyYW1lLgorICAgICAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLgorICAgICAqIEBwYXJhbSBvdXRwdXQJVGhlIG91dHB1dCBmcmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzczsKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmRlY29kZSkocGptZWRpYV9jb2RlYyAqY29kZWMsIAorCQkJICBjb25zdCBzdHJ1Y3QgcGptZWRpYV9mcmFtZSAqaW5wdXQsCisJCQkgIHVuc2lnbmVkIG91dF9zaXplLCAKKwkJCSAgc3RydWN0IHBqbWVkaWFfZnJhbWUgKm91dHB1dCk7CisKKyAgICAvKioKKyAgICAgKiBJbnN0cnVjdCB0aGUgY29kZWMgdG8gcmVjb3ZlciBhIG1pc3NpbmcgZnJhbWUuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV9jb2RlY19yZWNvdmVyKCkgaW5zdGVhZCBvZiAKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZWMJVGhlIGNvZGVjIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLgorICAgICAqIEBwYXJhbSBvdXRwdXQJVGhlIG91dHB1dCBmcmFtZSB3aGVyZSBnZW5lcmF0ZWQgc2lnbmFsCisgICAgICoJCQl3aWxsIGJlIHBsYWNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzczsKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnJlY292ZXIpKHBqbWVkaWFfY29kZWMgKmNvZGVjLAorCQkJICAgdW5zaWduZWQgb3V0X3NpemUsCisJCQkgICBzdHJ1Y3QgcGptZWRpYV9mcmFtZSAqb3V0cHV0KTsKK30gcGptZWRpYV9jb2RlY19vcDsKKworCisKKy8qCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBwam1lZGlhX2NvZGVjX2ZhY3RvcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29kZWNfZmFjdG9yeSBwam1lZGlhX2NvZGVjX2ZhY3Rvcnk7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBjb2RlYyBpbnN0YW5jZS4gCisgKi8KK3N0cnVjdCBwam1lZGlhX2NvZGVjCit7CisgICAgLyoqIEVudHJpZXMgdG8gcHV0IHRoaXMgY29kZWMgaW5zdGFuY2UgaW4gY29kZWMgZmFjdG9yeSdzIGxpc3QuICovCisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgcGptZWRpYV9jb2RlYyk7CisKKyAgICAvKiogQ29kZWMncyBwcml2YXRlIGRhdGEuICovCisgICAgdm9pZAkJICAgICpjb2RlY19kYXRhOworCisgICAgLyoqIENvZGVjIGZhY3Rvcnkgd2hlcmUgdGhpcyBjb2RlYyB3YXMgYWxsb2NhdGVkLiAqLworICAgIHBqbWVkaWFfY29kZWNfZmFjdG9yeSAgICpmYWN0b3J5OworCisgICAgLyoqIE9wZXJhdGlvbnMgdG8gY29kZWMuICovCisgICAgcGptZWRpYV9jb2RlY19vcAkgICAgKm9wOworfTsKKworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIHN1cHBvcnRlZCBieSBjb2RlYyAKKyAqIGZhY3Rvcmllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19mYWN0b3J5X29wCit7CisgICAgLyoqIAorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGZhY3RvcnkgY2FuIGNyZWF0ZSBjb2RlYyB3aXRoIHRoZSBzcGVjaWZpZWQgCisgICAgICogY29kZWMgaW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWN0b3J5CVRoZSBjb2RlYyBmYWN0b3J5LgorICAgICAqIEBwYXJhbSBpbmZvCVRoZSBjb2RlYyBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiB0aGlzIGZhY3RvcnkgaXMgYWJsZSB0byBjcmVhdGUgYW4KKyAgICAgKgkJCWluc3RhbmNlIG9mIGNvZGVjIHdpdGggdGhlIHNwZWNpZmllZCBpbmZvLgorICAgICAqLworICAgIHBqX3N0YXR1c190CSgqdGVzdF9hbGxvYykocGptZWRpYV9jb2RlY19mYWN0b3J5ICpmYWN0b3J5LCAKKwkJCSAgICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfaW5mbyAqaW5mbyApOworCisgICAgLyoqIAorICAgICAqIENyZWF0ZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29kZWMgSUQuIFRoaXMgZnVuY3Rpb24KKyAgICAgKiBjYW4gYmUgY2FsbGVkIGJ5IGFwcGxpY2F0aW9uIHRvIGdldCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeQlUaGUgY29kZWMgZmFjdG9yeS4KKyAgICAgKiBAcGFyYW0gaW5mbwlUaGUgY29kZWMgaW5mby4KKyAgICAgKiBAcGFyYW0gYXR0cglUaGUgYXR0cmlidXRlIHRvIGJlIGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiBzdWNjZXNzLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZGVmYXVsdF9hdHRyKShwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksIAorICAgIAkJCQljb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKmluZm8sCisgICAgCQkJCXBqbWVkaWFfY29kZWNfcGFyYW0gKmF0dHIgKTsKKworICAgIC8qKiAKKyAgICAgKiBFbnVtZXJhdGUgc3VwcG9ydGVkIGNvZGVjcyB0aGF0IGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoaXMgZmFjdG9yeS4KKyAgICAgKiAKKyAgICAgKiAgQHBhcmFtIGZhY3RvcnkJVGhlIGNvZGVjIGZhY3RvcnkuCisgICAgICogIEBwYXJhbSBjb3VudAlPbiBpbnB1dCwgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4KKyAgICAgKgkJCXRoZSBhcnJheS4gT24gb3V0cHV0LCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgdG8KKyAgICAgKgkJCXRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKKyAgICAgKgkJCWJ5IHRoaXMgZnVuY3Rpb24uCisgICAgICogIEBwYXJhbSBpbmZvCVRoZSBjb2RlYyBpbmZvIGFycmF5LCB3aGljaCBjb250ZW50cyB3aWxsIGJlIAorICAgICAqCQkJaW5pdGlhbGl6ZWQgdXBvbiByZXR1cm4uCisgICAgICoKKyAgICAgKiAgQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZW51bV9pbmZvKShwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksIAorCQkJICAgICB1bnNpZ25lZCAqY291bnQsIAorCQkJICAgICBwam1lZGlhX2NvZGVjX2luZm8gY29kZWNzW10pOworCisgICAgLyoqIAorICAgICAqIENyZWF0ZSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGNvZGVjIHdpdGggdGhlIHNwZWNpZmllZCBjb2RlYyBpbmZvLgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkJVGhlIGNvZGVjIGZhY3RvcnkuCisgICAgICogQHBhcmFtIGluZm8JVGhlIGNvZGVjIGluZm8uCisgICAgICogQHBhcmFtIHBfY29kZWMJUG9pbnRlciB0byByZWNlaXZlIHRoZSBjb2RlYyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmFsbG9jX2NvZGVjKShwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksIAorCQkJICAgICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfaW5mbyAqaW5mbywKKwkJCSAgICAgICBwam1lZGlhX2NvZGVjICoqcF9jb2RlYyk7CisKKyAgICAvKiogCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgY29kZWMgbWFuYWdlciB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIAorICAgICAqIGluc3RhbmNlIG9mIGNvZGVjIGJhY2sgdG8gdGhlIGNvZGVjIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeQlUaGUgY29kZWMgZmFjdG9yeS4KKyAgICAgKiBAcGFyYW0gY29kZWMJVGhlIGNvZGVjIGluc3RhbmNlIHRvIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZGVhbGxvY19jb2RlYykocGptZWRpYV9jb2RlY19mYWN0b3J5ICpmYWN0b3J5LCAKKwkJCQkgcGptZWRpYV9jb2RlYyAqY29kZWMgKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgdG8gZGVpbml0aWFsaXplIGFuZCBkZXN0cm95IHRoaXMgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmRlc3Ryb3kpKHZvaWQpOworCit9IHBqbWVkaWFfY29kZWNfZmFjdG9yeV9vcDsKKworCisKKy8qKgorICogQ29kZWMgZmFjdG9yeSBkZXNjcmliZXMgYSBtb2R1bGUgdGhhdCBpcyBhYmxlIHRvIGNyZWF0ZSBjb2RlYyB3aXRoIHNwZWNpZmljCisgKiBjYXBhYmlsaXRpZXMuIFRoZXNlIGNhcGFiaWxpdGllcyBjYW4gYmUgcXVlcmllZCBieSBjb2RlYyBtYW5hZ2VyIHRvIGNyZWF0ZQorICogaW5zdGFuY2VzIG9mIGNvZGVjLgorICovCitzdHJ1Y3QgcGptZWRpYV9jb2RlY19mYWN0b3J5Cit7CisgICAgLyoqIEVudHJpZXMgdG8gcHV0IHRoaXMgc3RydWN0dXJlIGluIHRoZSBjb2RlYyBtYW5hZ2VyIGxpc3QuICovCisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgcGptZWRpYV9jb2RlY19mYWN0b3J5KTsKKworICAgIC8qKiBUaGUgZmFjdG9yeSdzIHByaXZhdGUgZGF0YS4gKi8KKyAgICB2b2lkCQkgICAgICpmYWN0b3J5X2RhdGE7CisKKyAgICAvKiogT3BlcmF0aW9ucyB0byB0aGUgZmFjdG9yeS4gKi8KKyAgICBwam1lZGlhX2NvZGVjX2ZhY3Rvcnlfb3AgKm9wOworCit9OworCisKKy8qKgorICogRGVjbGFyZSBtYXhpbXVtIGNvZGVjcworICovCisjZGVmaW5lIFBKTUVESUFfQ09ERUNfTUdSX01BWF9DT0RFQ1MJICAgIDMyCisKKworLyoqCisgKiBTcGVjaWZ5IHRoZXNlIHZhbHVlcyB0byBzZXQgdGhlIGNvZGVjIHByaW9yaXR5LCBieSBjYWxsaW5nCisgKiAjcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2NvZGVjX3ByaW9yaXR5KCkuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX2NvZGVjX3ByaW9yaXR5Cit7CisgICAgLyoqCisgICAgICogVGhpcyBwcmlvcml0eSBtYWtlcyB0aGUgY29kZWMgdGhlIGhpZ2hlc3QgaW4gdGhlIG9yZGVyLgorICAgICAqIFRoZSBsYXN0IGNvZGVjIHNwZWNpZmllZCB3aXRoIHRoaXMgcHJpb3JpdHkgd2lsbCBnZXQgdGhlCisgICAgICogaGlnaGVzdCBwbGFjZSBpbiB0aGUgb3JkZXIsIGFuZCB3aWxsIGNoYW5nZSB0aGUgcHJpb3JpdHkKKyAgICAgKiBvZiBwcmV2aW91c2x5IGhpZ2hlc3QgcHJpb3JpdHkgY29kZWMgdG8gTkVYVF9ISUdIRVIuCisgICAgICovCisgICAgUEpNRURJQV9DT0RFQ19QUklPX0hJR0hFU1QgPSAyNTUsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHByaW9yaXR5IHdpbGwgcHV0IHRoZSBjb2RlYyBhcyB0aGUgbmV4dCBjb2RlYyBhZnRlcgorICAgICAqIGNvZGVjcyB3aXRoIHRoaXMgc2FtZSBwcmlvcml0eS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0NPREVDX1BSSU9fTkVYVF9ISUdIRVIgPSAyNTQsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIGNvZGVjIHByaW9yaXR5IHdoZW4gaXQgaXMgcmVnaXN0ZXJlZCB0bworICAgICAqIGNvZGVjIG1hbmFnZXIgYnkgY29kZWMgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0NPREVDX1BSSU9fTk9STUFMID0gMTI4LAorCisgICAgLyoqCisgICAgICogVGhpcyBwcmlvcml0eSBtYWtlcyB0aGUgY29kZWMgdGhlIGxvd2VzdCBpbiB0aGUgb3JkZXIuCisgICAgICogVGhlIGxhc3QgY29kZWMgc3BlY2lmaWVkIHdpdGggdGhpcyBwcmlvcml0eSB3aWxsIGJlIHB1dAorICAgICAqIGluIHRoZSBsYXN0IHBsYWNlIGluIHRoZSBvcmRlci4KKyAgICAgKi8KKyAgICBQSk1FRElBX0NPREVDX1BSSU9fTE9XRVNUID0gMSwKKworICAgIC8qKgorICAgICAqIFRoaXMgcHJpb3JpdHkgd2lsbCBwcmV2ZW50IHRoZSBjb2RlYyBmcm9tIGJlaW5nIGxpc3RlZCBpbiB0aGUKKyAgICAgKiBTRFAgY3JlYXRlZCBieSBtZWRpYSBlbmRwb2ludCwgdGh1cyBzaG91bGQgcHJldmVudCB0aGUgY29kZWMKKyAgICAgKiBmcm9tIGJlaW5nIHVzZWQgaW4gdGhlIHNlc3Npb25zLiBIb3dldmVyLCB0aGUgY29kZWMgd2lsbCBzdGlsbAorICAgICAqIGJlIGxpc3RlZCBieSAjcGptZWRpYV9jb2RlY19tZ3JfZW51bV9jb2RlY3MoKSBhbmQgb3RoZXIgY29kZWMKKyAgICAgKiBxdWVyeSBmdW5jdGlvbnMuCisgICAgICovCisgICAgUEpNRURJQV9DT0RFQ19QUklPX0RJU0FCTEVEID0gMAorCit9IHBqbWVkaWFfY29kZWNfcHJpb3JpdHk7CisKKworLyoqIAorICogQ29kZWMgaWRlbnRpZmljYXRpb24gKGUuZy4gInBjbXUvODAwMC8xIikuCisgKiBTZWUgQHJlZiBjb2RlY19pZGVudCBmb3IgbW9yZSBpbmZvLgorICovCit0eXBlZGVmIGNoYXIgcGptZWRpYV9jb2RlY19pZFszMl07CisKKworLyoqCisgKiBPcGFxdWUgZGVjbGFyYXRpb24gb2YgZGVmYXVsdCBjb2RlY3MgcGFyYW1ldGVycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19kZWZhdWx0X3BhcmFtIHBqbWVkaWFfY29kZWNfZGVmYXVsdF9wYXJhbTsKKworLyoqIAorICogQ29kZWMgbWFuYWdlciBtYWludGFpbnMgYXJyYXkgb2YgdGhlc2Ugc3RydWN0cyBmb3IgZWFjaCBzdXBwb3J0ZWQKKyAqIGNvZGVjLgorICovCitzdHJ1Y3QgcGptZWRpYV9jb2RlY19kZXNjCit7CisgICAgcGptZWRpYV9jb2RlY19pbmZvCSAgICBpbmZvOwkvKio8IENvZGVjIGluZm8uCSAgICAqLworICAgIHBqbWVkaWFfY29kZWNfaWQJICAgIGlkOwkJLyoqPCBGdWxseSBxdWFsaWZpZWQgbmFtZSAgICovCisgICAgcGptZWRpYV9jb2RlY19wcmlvcml0eSAgcHJpbzsJLyoqPCBQcmlvcml0eS4JCSAgICAqLworICAgIHBqbWVkaWFfY29kZWNfZmFjdG9yeSAgKmZhY3Rvcnk7CS8qKjwgVGhlIGZhY3RvcnkuCSAgICAqLworICAgIHBqbWVkaWFfY29kZWNfZGVmYXVsdF9wYXJhbSAqcGFyYW07IC8qKjwgRGVmYXVsdCBjb2RlY3MgCisJCQkJCSAgICAgcGFyYW1ldGVycy4JICAgICovCit9OworCisKKy8qKgorICogVGhlIGRlY2xhcmF0aW9uIGZvciBjb2RlYyBtYW5hZ2VyLiBBcHBsaWNhdGlvbiBkb2Vzbid0IG5vcm1hbGx5IG5lZWQKKyAqIHRvIHNlZSB0aGlzIGRlY2xhcmF0aW9uLCBidXQgbmV2ZXJ0aGVsZXNzIHRoaXMgZGVjbGFyYXRpb24gaXMgbmVlZGVkCisgKiBieSBtZWRpYSBlbmRwb2ludCB0byBpbnN0YW50aWF0ZSB0aGUgY29kZWMgbWFuYWdlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb2RlY19tZ3IKK3sKKyAgICAvKiogTWVkaWEgZW5kcG9pbnQgaW5zdGFuY2UuICovCisgICAgcGpfcG9vbF9mYWN0b3J5CQkqcGY7CisKKyAgICAvKiogQ29kZWMgbWFuYWdlciBwb29sLiAqLworICAgIHBqX3Bvb2xfdAkJCSpwb29sOworCisgICAgLyoqIENvZGVjIG1hbmFnZXIgbXV0ZXguICovCisgICAgcGpfbXV0ZXhfdAkJCSptdXRleDsKKworICAgIC8qKiBMaXN0IG9mIGNvZGVjIGZhY3RvcmllcyByZWdpc3RlcmVkIHRvIGNvZGVjIG1hbmFnZXIuICovCisgICAgcGptZWRpYV9jb2RlY19mYWN0b3J5CSBmYWN0b3J5X2xpc3Q7CisKKyAgICAvKiogTnVtYmVyIG9mIHN1cHBvcnRlZCBjb2RlY3MuICovCisgICAgdW5zaWduZWQJCQkgY29kZWNfY250OworCisgICAgLyoqIEFycmF5IG9mIGNvZGVjIGRlc2NyaXB0b3IuICovCisgICAgc3RydWN0IHBqbWVkaWFfY29kZWNfZGVzYwkgY29kZWNfZGVzY1tQSk1FRElBX0NPREVDX01HUl9NQVhfQ09ERUNTXTsKKworfSBwam1lZGlhX2NvZGVjX21ncjsKKworCisKKy8qKgorICogSW5pdGlhbGl6ZSBjb2RlYyBtYW5hZ2VyLiBOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBwam1lZGlhCisgKiBlbmRwb2ludCdzIGluaXRpYWxpemF0aW9uIGNvZGUuCisgKgorICogQHBhcmFtIG1ncgkgICAgQ29kZWMgbWFuYWdlciBpbnN0YW5jZS4KKyAqIEBwYXJhbSBwZgkgICAgUG9vbCBmYWN0b3J5IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19tZ3JfaW5pdChwam1lZGlhX2NvZGVjX21nciAqbWdyLCAKKwkJCQkJICAgIHBqX3Bvb2xfZmFjdG9yeSAqcGYpOworCisKKy8qKgorICogRGVzdHJveSBjb2RlYyBtYW5hZ2VyLiBOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBwam1lZGlhCisgKiBlbmRwb2ludCdzIGRlaW5pdGlhbGl6YXRpb24gY29kZS4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBDb2RlYyBtYW5hZ2VyIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19tZ3JfZGVzdHJveShwam1lZGlhX2NvZGVjX21nciAqbWdyKTsKKworCisvKiogCisgKiBSZWdpc3RlciBjb2RlYyBmYWN0b3J5IHRvIGNvZGVjIG1hbmFnZXIuIFRoaXMgd2lsbCBhbHNvIHJlZ2lzdGVyCisgKiBhbGwgc3VwcG9ydGVkIGNvZGVjcyBpbiB0aGUgZmFjdG9yeSB0byB0aGUgY29kZWMgbWFuYWdlci4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gQXBwbGljYXRpb24gY2FuIGdldCB0aGUKKyAqCQkgICAgaW5zdGFuY2UgYnkgY2FsbGluZyAjcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKCkuCisgKiBAcGFyYW0gZmFjdG9yeSAgIFRoZSBjb2RlYyBmYWN0b3J5IHRvIGJlIHJlZ2lzdGVyZWQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfY29kZWNfbWdyX3JlZ2lzdGVyX2ZhY3RvcnkoIHBqbWVkaWFfY29kZWNfbWdyICptZ3IsCisJCQkJICAgIHBqbWVkaWFfY29kZWNfZmFjdG9yeSAqZmFjdG9yeSk7CisKKy8qKgorICogVW5yZWdpc3RlciBjb2RlYyBmYWN0b3J5IGZyb20gdGhlIGNvZGVjIG1hbmFnZXIuIFRoaXMgd2lsbCBhbHNvCisgKiByZW1vdmUgYWxsIHRoZSBjb2RlY3MgcmVnaXN0ZXJlZCBieSB0aGUgY29kZWMgZmFjdG9yeSBmcm9tIHRoZQorICogY29kZWMgbWFuYWdlcidzIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvZGVjcy4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjb2RlYyBpbXBsZW1lbnRlcnMgYW5kIG5vdCBieSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZSwgdXNlCisgKiAJCQkjcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKCkuCisgKiBAcGFyYW0gZmFjdG9yeSAgIFRoZSBjb2RlYyBmYWN0b3J5IHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9jb2RlY19tZ3JfdW5yZWdpc3Rlcl9mYWN0b3J5KCBwam1lZGlhX2NvZGVjX21nciAqbWdyLCAKKwkJCQkgICAgICBwam1lZGlhX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnkpOworCisvKioKKyAqIEVudW1lcmF0ZSBhbGwgc3VwcG9ydGVkIGNvZGVjcyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkIHRvIHRoZQorICogY29kZWMgbWFuYWdlciBieSBjb2RlYyBmYWN0b3JpZXMuCisgKgorICogQHBhcmFtIG1ncgkgICAgVGhlIGNvZGVjIG1hbmFnZXIgaW5zdGFuY2UuIEFwcGxpY2F0aW9uIGNhbiBnZXQgdGhlCisgKgkJICAgIGluc3RhbmNlIGJ5IGNhbGxpbmcgI3BqbWVkaWFfZW5kcHRfZ2V0X2NvZGVjX21ncigpLgorICogQHBhcmFtIGNvdW50CSAgICBPbiBpbnB1dCwgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4KKyAqCQkgICAgdGhlIGFycmF5LiBPbiBvdXRwdXQsIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0bworICoJCSAgICB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGluaXRpYWxpemVkCisgKgkJICAgIGJ5IHRoaXMgZnVuY3Rpb24uCisgKiBAcGFyYW0gaW5mbwkgICAgVGhlIGNvZGVjIGluZm8gYXJyYXksIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgCisgKgkJICAgIGluaXRpYWxpemVkIHVwb24gcmV0dXJuLgorICogQHBhcmFtIHByaW8JICAgIE9wdGlvbmFsIHBvaW50ZXIgdG8gcmVjZWl2ZSBhcnJheSBvZiBjb2RlYyBwcmlvcml0aWVzLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19tZ3JfZW51bV9jb2RlY3MoIHBqbWVkaWFfY29kZWNfbWdyICptZ3IsIAorCQkJCQkJICAgIHVuc2lnbmVkICpjb3VudCwgCisJCQkJCQkgICAgcGptZWRpYV9jb2RlY19pbmZvIGluZm9bXSwKKwkJCQkJCSAgICB1bnNpZ25lZCAqcHJpbyk7CisKKy8qKgorICogR2V0IGNvZGVjIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgc3RhdGljIHBheWxvYWQgdHlwZS4gTm90ZSB0aGF0CisgKiB0aGlzIGNhbiBvbmx5IGZpbmQgY29kZWMgd2l0aCBzdGF0aWMgcGF5bG9hZCB0eXBlcy4gVGhpcyBmdW5jdGlvbiBjYW4KKyAqIGJlIHVzZWQgdG8gZmluZCBjb2RlYyBpbmZvIGZvciBhIHBheWxvYWQgdHlwZSBpbnNpZGUgU0RQIHdoaWNoIGRvZXNuJ3QKKyAqIGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgcnRwbWFwIGF0dHJpYnV0ZS4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gQXBwbGljYXRpb24gY2FuIGdldCB0aGUKKyAqCQkgICAgaW5zdGFuY2UgYnkgY2FsbGluZyAjcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKCkuCisgKiBAcGFyYW0gcHQJICAgIFN0YXRpYyBwYXlsb2FkIHR5cGUvbnVtYmVyLgorICogQHBhcmFtIGluZgkgICAgUG9pbnRlciB0byByZWNlaXZlIGNvZGVjIGluZm8uCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfY29kZWNfbWdyX2dldF9jb2RlY19pbmZvKCBwam1lZGlhX2NvZGVjX21nciAqbWdyLAorCQkJCSAgdW5zaWduZWQgcHQsCisJCQkJICBjb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKippbmYpOworCisvKioKKyAqIENvbnZlcnQgY29kZWMgaW5mbyBzdHJ1Y3QgaW50byBhIHVuaXF1ZSBjb2RlYyBpZGVudGlmaWVyLgorICogQSBjb2RlYyBpZGVudGlmaWVyIGxvb2tzIHNvbWV0aGluZyBsaWtlICJMMTYvNDQxMDAvMiIuCisgKgorICogQHBhcmFtIGluZm8JICAgIFRoZSBjb2RlYyBpbmZvCisgKiBAcGFyYW0gaWQJICAgIEJ1ZmZlciB0byBwdXQgdGhlIGNvZGVjIGluZm8gc3RyaW5nLgorICogQHBhcmFtIG1heF9sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCisgKgorICogQHJldHVybgkgICAgVGhlIG51bGwgdGVybWluYXRlZCBjb2RlYyBpbmZvIHN0cmluZywgb3IgTlVMTCBpZgorICoJCSAgICB0aGUgYnVmZmVyIGlzIG5vdCBsb25nIGVub3VnaC4KKyAqLworUEpfREVDTChjaGFyKikgcGptZWRpYV9jb2RlY19pbmZvX3RvX2lkKGNvbnN0IHBqbWVkaWFfY29kZWNfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgIGNoYXIgKmlkLCB1bnNpZ25lZCBtYXhfbGVuICk7CisKKworLyoqCisgKiBGaW5kIGNvZGVjcyBieSB0aGUgdW5pcXVlIGNvZGVjIGlkZW50aWZpZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kCisgKiBhbGwgY29kZWNzIHRoYXQgbWF0Y2ggdGhlIGNvZGVjIGlkZW50aWZpZXIgcHJlZml4LiBGb3IgZXhhbXBsZSwgaWYKKyAqICJMMTYiIGlzIHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIGZpbmQgIkwxNi84MDAwLzEiLCAiTDE2LzE2MDAwLzEiLAorICogYW5kIHNvIG9uLCB1cCB0byB0aGUgbWF4aW11bSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50LgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiBBcHBsaWNhdGlvbiBjYW4gZ2V0IHRoZQorICoJCSAgICBpbnN0YW5jZSBieSBjYWxsaW5nICNwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IoKS4KKyAqIEBwYXJhbSBjb2RlY19pZCAgVGhlIGZ1bGwgY29kZWMgSUQgb3IgY29kZWMgSUQgcHJlZml4LiBJZiBhbiBlbXB0eQorICoJCSAgICBzdHJpbmcgaXMgZ2l2ZW4sIGl0IHdpbGwgbWF0Y2ggYWxsIGNvZGVjcy4KKyAqIEBwYXJhbSBjb3VudAkgICAgTWF4aW11bSBudW1iZXIgb2YgY29kZWNzIHRvIGZpbmQuIE9uIHJldHVybiwgaXQKKyAqCQkgICAgY29udGFpbnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgY29kZWNzIGZvdW5kLgorICogQHBhcmFtIHBfaW5mbyAgICBBcnJheSBvZiBwb2ludGVyIHRvIGNvZGVjIGluZm8gdG8gYmUgZmlsbGVkLiBUaGlzCisgKgkJICAgIGFyZ3VtZW50IG1heSBiZSBOVUxMLCB3aGljaCBpbiB0aGlzIGNhc2UsIG9ubHkKKyAqCQkgICAgY29kZWMgY291bnQgd2lsbCBiZSByZXR1cm5lZC4KKyAqIEBwYXJhbSBwcmlvCSAgICBPcHRpb25hbCBhcnJheSBvZiBjb2RlYyBwcmlvcml0aWVzLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1MgaWYgYXQgbGVhc3Qgb25lIGNvZGVjIGluZm8gaXMgZm91bmQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9jb2RlY19tZ3JfZmluZF9jb2RlY3NfYnlfaWQoIHBqbWVkaWFfY29kZWNfbWdyICptZ3IsCisJCQkJICAgICBjb25zdCBwal9zdHJfdCAqY29kZWNfaWQsCisJCQkJICAgICB1bnNpZ25lZCAqY291bnQsCisJCQkJICAgICBjb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKnBfaW5mb1tdLAorCQkJCSAgICAgdW5zaWduZWQgcHJpb1tdKTsKKworCisvKioKKyAqIFNldCBjb2RlYyBwcmlvcml0eS4gVGhlIGNvZGVjIHByaW9yaXR5IGRldGVybWluZXMgdGhlIG9yZGVyIG9mCisgKiB0aGUgY29kZWMgaW4gdGhlIFNEUCBjcmVhdGVkIGJ5IHRoZSBlbmRwb2ludC4gSWYgbW9yZSB0aGFuIG9uZSBjb2RlY3MKKyAqIGFyZSBmb3VuZCB3aXRoIHRoZSBzYW1lIGNvZGVjX2lkIHByZWZpeCwgdGhlbiB0aGUgZnVuY3Rpb24gc2V0cyB0aGUKKyAqIHByaW9yaXRpZXMgb2YgYWxsIHRob3NlIGNvZGVjcy4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gQXBwbGljYXRpb24gY2FuIGdldCB0aGUKKyAqCQkgICAgaW5zdGFuY2UgYnkgY2FsbGluZyAjcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKCkuCisgKiBAcGFyYW0gY29kZWNfaWQgIFRoZSBmdWxsIGNvZGVjIElEIG9yIGNvZGVjIElEIHByZWZpeC4gSWYgYW4gZW1wdHkKKyAqCQkgICAgc3RyaW5nIGlzIGdpdmVuLCBpdCB3aWxsIG1hdGNoIGFsbCBjb2RlY3MuCisgKiBAcGFyYW0gcHJpbwkgICAgUHJpb3JpdHkgdG8gYmUgc2V0LiBUaGUgcHJpb3JpdHkgY2FuIGhhdmUgYW55IHZhbHVlCisgKgkJICAgIGJldHdlZW4gMSB0byAyNTUuIFdoZW4gdGhlIHByaW9yaXR5IGlzIHNldCB0byB6ZXJvLAorICoJCSAgICB0aGUgY29kZWMgd2lsbCBiZSBkaXNhYmxlZC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIGlmIGF0IGxlYXN0IG9uZSBjb2RlYyBpbmZvIGlzIGZvdW5kLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9jb2RlY19tZ3Jfc2V0X2NvZGVjX3ByaW9yaXR5KHBqbWVkaWFfY29kZWNfbWdyICptZ3IsIAorCQkJCSAgICAgY29uc3QgcGpfc3RyX3QgKmNvZGVjX2lkLAorCQkJCSAgICAgcGpfdWludDhfdCBwcmlvKTsKKworCisvKioKKyAqIEdldCBkZWZhdWx0IGNvZGVjIHBhcmFtIGZvciB0aGUgc3BlY2lmaWVkIGNvZGVjIGluZm8uCisgKgorICogQHBhcmFtIG1ncgkgICAgVGhlIGNvZGVjIG1hbmFnZXIgaW5zdGFuY2UuIEFwcGxpY2F0aW9uIGNhbiBnZXQgdGhlCisgKgkJICAgIGluc3RhbmNlIGJ5IGNhbGxpbmcgI3BqbWVkaWFfZW5kcHRfZ2V0X2NvZGVjX21ncigpLgorICogQHBhcmFtIGluZm8JICAgIFRoZSBjb2RlYyBpbmZvLCB3aGljaCBkZWZhdWx0IHBhcmFtZXRlcidzIGlzIGJlaW5nCisgKgkJICAgIHF1ZXJpZWQuCisgKiBAcGFyYW0gcGFyYW0JICAgIE9uIHJldHVybiwgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVmYXVsdCBjb2RlYworICoJCSAgICBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfY29kZWNfbWdyX2dldF9kZWZhdWx0X3BhcmFtKCBwam1lZGlhX2NvZGVjX21nciAqbWdyLAorCQkJCSAgICAgY29uc3QgcGptZWRpYV9jb2RlY19pbmZvICppbmZvLAorCQkJCSAgICAgcGptZWRpYV9jb2RlY19wYXJhbSAqcGFyYW0gKTsKKworCisvKioKKyAqIFNldCBkZWZhdWx0IGNvZGVjIHBhcmFtIGZvciB0aGUgc3BlY2lmaWVkIGNvZGVjIGluZm8uCisgKgorICogQHBhcmFtIG1ncgkgICAgVGhlIGNvZGVjIG1hbmFnZXIgaW5zdGFuY2UuIEFwcGxpY2F0aW9uIGNhbiBnZXQgdGhlCisgKgkJICAgIGluc3RhbmNlIGJ5IGNhbGxpbmcgI3BqbWVkaWFfZW5kcHRfZ2V0X2NvZGVjX21ncigpLgorICogQHBhcmFtIGluZm8JICAgIFRoZSBjb2RlYyBpbmZvLCB3aGljaCBkZWZhdWx0IHBhcmFtZXRlcidzIGlzIGJlaW5nCisgKgkJICAgIHVwZGF0ZWQuCisgKiBAcGFyYW0gcGFyYW0JICAgIFRoZSBuZXcgZGVmYXVsdCBjb2RlYyBwYXJhbWV0ZXIuIFNldCB0byBOVUxMIHRvIHJlc2V0CisgKgkJICAgIGNvZGVjIHBhcmFtZXRlciB0byBsaWJyYXJ5IGRlZmF1bHQgc2V0dGluZ3MuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCBwam1lZGlhX2NvZGVjX21nciAqbWdyLAorCQkJCSAgICAgY29uc3QgcGptZWRpYV9jb2RlY19pbmZvICppbmZvLAorCQkJCSAgICAgY29uc3QgcGptZWRpYV9jb2RlY19wYXJhbSAqcGFyYW0gKTsKKworCisvKioKKyAqIFJlcXVlc3QgdGhlIGNvZGVjIG1hbmFnZXIgdG8gYWxsb2NhdGUgb25lIGluc3RhbmNlIG9mIGNvZGVjIHdpdGggdGhlCisgKiBzcGVjaWZpZWQgY29kZWMgaW5mby4gVGhlIGNvZGVjIHdpbGwgZW51bWVyYXRlIGFsbCBjb2RlYyBmYWN0b3JpZXMKKyAqIHVudGlsIGl0IGZpbmRzIGZhY3RvcnkgdGhhdCBpcyBhYmxlIHRvIGNyZWF0ZSB0aGUgc3BlY2lmaWVkIGNvZGVjLgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiBBcHBsaWNhdGlvbiBjYW4gZ2V0IHRoZQorICoJCSAgICBpbnN0YW5jZSBieSBjYWxsaW5nICNwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IoKS4KKyAqIEBwYXJhbSBpbmZvCSAgICBUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvZGVjIHRvIGJlIGNyZWF0ZWQuCisgKiBAcGFyYW0gcF9jb2RlYyAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgY29kZWMgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfY29kZWNfbWdyX2FsbG9jX2NvZGVjKCBwam1lZGlhX2NvZGVjX21nciAqbWdyLCAKKwkJCSAgICAgICBjb25zdCBwam1lZGlhX2NvZGVjX2luZm8gKmluZm8sCisJCQkgICAgICAgcGptZWRpYV9jb2RlYyAqKnBfY29kZWMpOworCisvKioKKyAqIERlYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBjb2RlYyBpbnN0YW5jZS4gVGhlIGNvZGVjIG1hbmFnZXIgd2lsbCByZXR1cm4KKyAqIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29kZWMgYmFjayB0byBpdHMgZmFjdG9yeS4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gQXBwbGljYXRpb24gY2FuIGdldCB0aGUKKyAqCQkgICAgaW5zdGFuY2UgYnkgY2FsbGluZyAjcGptZWRpYV9lbmRwdF9nZXRfY29kZWNfbWdyKCkuCisgKiBAcGFyYW0gY29kZWMJICAgIFRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19tZ3JfZGVhbGxvY19jb2RlYyhwam1lZGlhX2NvZGVjX21nciAqbWdyLCAKKwkJCQkJCSAgICAgcGptZWRpYV9jb2RlYyAqY29kZWMpOworCisKKworLyoqIAorICogSW5pdGlhbGl6ZSBjb2RlYyB1c2luZyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAqCisgKiBAcGFyYW0gY29kZWMJICAgIFRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBwb29sCSAgICBQb29sIHRvIHVzZSB3aGVuIHRoZSBjb2RlYyBuZWVkcyB0byBhbGxvY2F0ZSBzb21lIG1lbW9yeS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19pbml0KCBwam1lZGlhX2NvZGVjICpjb2RlYywgCisJCQkJCSAgIHBqX3Bvb2xfdCAqcG9vbCApCit7CisgICAgcmV0dXJuICgqY29kZWMtPm9wLT5pbml0KShjb2RlYywgcG9vbCk7Cit9CisKKworLyoqIAorICogT3BlbiB0aGUgY29kZWMgYW5kIGluaXRpYWxpemUgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4KKyAqIFVwb24gc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbiwgdGhlIGNvZGVjIG1heSBtb2RpZnkgdGhlIHBhcmFtZXRlcgorICogYW5kIGZpbGxzIGluIHRoZSB1bnNwZWNpZmllZCB2YWx1ZXMgKHN1Y2ggYXMgZW5jX3B0aW1lLCB3aGVuCisgKiBlbmNvZGVyIHB0aW1lIGlzIGRpZmZlcmVudCB0aGFuIGRlY29kZXIgcHRpbWUpLgorICoKKyAqIEBwYXJhbSBjb2RlYwkgICAgVGhlIGNvZGVjIGluc3RhbmNlLgorICogQHBhcmFtIHBhcmFtCSAgICBDb2RlYyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfb3BlbiggcGptZWRpYV9jb2RlYyAqY29kZWMsIAorCQkJCQkgICBwam1lZGlhX2NvZGVjX3BhcmFtICpwYXJhbSApCit7CisgICAgcmV0dXJuICgqY29kZWMtPm9wLT5vcGVuKShjb2RlYywgcGFyYW0pOworfQorCisKKy8qKiAKKyAqIENsb3NlIGFuZCBzaHV0ZG93biBjb2RlYywgcmVsZWFzaW5nIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5CisgKiB0aGlzIGNvZGVjLCBpZiBhbnkuCisgKgorICogQHBhcmFtIGNvZGVjCSAgICBUaGUgY29kZWMgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfY2xvc2UoIHBqbWVkaWFfY29kZWMgKmNvZGVjICkKK3sKKyAgICByZXR1cm4gKCpjb2RlYy0+b3AtPmNsb3NlKShjb2RlYyk7Cit9CisKKworLyoqIAorICogTW9kaWZ5IHRoZSBjb2RlYyBwYXJhbWV0ZXIgYWZ0ZXIgdGhlIGNvZGVjIGlzIG9wZW4uIAorICogTm90ZSB0aGF0IG5vdCBhbGwgY29kZWMgcGFyYW1ldGVycyBjYW4gYmUgbW9kaWZpZWQgZHVyaW5nIHJ1bi10aW1lLiAKKyAqIFdoZW4gdGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgY2hhbmdlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAKKyAqIG5vbi1QSl9TVUNDRVNTLCBhbmQgdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgY2hhbmdlZC4KKyAqCisgKiBBcHBsaWNhdGlvbiBjYW4gZXhwZWN0IGNoYW5naW5nIHRyaXZpYWwgY29kZWMgc2V0dGluZ3Mgc3VjaCBhcworICogY2hhbmdpbmcgVkFEIHNldHRpbmcgdG8gc3VjY2VlZC4KKyAqCisgKiBAcGFyYW0gY29kZWMJICAgIFRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBwYXJhbQkgICAgVGhlIG5ldyBjb2RlYyBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfbW9kaWZ5KHBqbWVkaWFfY29kZWMgKmNvZGVjLCAKKwkJCQkJICAgIGNvbnN0IHBqbWVkaWFfY29kZWNfcGFyYW0gKnBhcmFtKQoreworICAgIHJldHVybiAoKmNvZGVjLT5vcC0+bW9kaWZ5KShjb2RlYywgcGFyYW0pOworfQorCisKKy8qKgorICogSW5zdHJ1Y3QgdGhlIGNvZGVjIHRvIGluc3BlY3QgdGhlIHNwZWNpZmllZCBwYXlsb2FkL3BhY2tldCBhbmQKKyAqIHNwbGl0IHRoZSBwYWNrZXQgaW50byBpbmRpdmlkdWFsIGJhc2UgZnJhbWVzLiBFYWNoIG91dHB1dCBmcmFtZXMgd2lsbAorICogaGF2ZSBwdGltZSB0aGF0IGlzIGVxdWFsIHRvIGJhc2ljIGZyYW1lIHB0aW1lIChpLmUuIHRoZSB2YWx1ZSBvZgorICogaW5mby5mcm1fcHRpbWUgaW4gI3BqbWVkaWFfY29kZWNfcGFyYW0pLgorICoKKyAqIEBwYXJhbSBjb2RlYwkgICAgVGhlIGNvZGVjIGluc3RhbmNlCisgKiBAcGFyYW0gcGt0CSAgICBUaGUgaW5wdXQgcGFja2V0LgorICogQHBhcmFtIHBrdF9zaXplICBTaXplIG9mIHRoZSBwYWNrZXQuCisgKiBAcGFyYW0gdGltZXN0YW1wIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgcGFja2V0LgorICogQHBhcmFtIGZyYW1lX2NudCBPbiBpbnB1dCwgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMKKyAqCQkgICAgaW4gdGhlIGFycmF5LiBPbiBvdXRwdXQsIHRoZSBjb2RlYyBtdXN0IGZpbGwKKyAqCQkgICAgd2l0aCBudW1iZXIgb2YgZnJhbWVzIGRldGVjdGVkIGluIHRoZSBwYWNrZXQuCisgKiBAcGFyYW0gZnJhbWVzICAgIE9uIG91dHB1dCwgc3BlY2lmaWVzIHRoZSBmcmFtZXMgdGhhdCBoYXZlIGJlZW4KKyAqCQkgICAgZGV0ZWN0ZWQgaW4gdGhlIHBhY2tldC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19wYXJzZSggcGptZWRpYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgICB2b2lkICpwa3QsCisJCQkJCSAgICBwal9zaXplX3QgcGt0X3NpemUsCisJCQkJCSAgICBjb25zdCBwal90aW1lc3RhbXAgKnRpbWVzdGFtcCwKKwkJCQkJICAgIHVuc2lnbmVkICpmcmFtZV9jbnQsCisJCQkJCSAgICBwam1lZGlhX2ZyYW1lIGZyYW1lc1tdICkKK3sKKyAgICByZXR1cm4gKCpjb2RlYy0+b3AtPnBhcnNlKShjb2RlYywgcGt0LCBwa3Rfc2l6ZSwgdGltZXN0YW1wLAorCQkJICAgICAgIGZyYW1lX2NudCwgZnJhbWVzKTsKK30KKworCisvKiogCisgKiBJbnN0cnVjdCB0aGUgY29kZWMgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQgaW5wdXQgZnJhbWUuIFRoZSBpbnB1dAorICogUENNIHNhbXBsZXMgTVVTVCBoYXZlIHB0aW1lIHRoYXQgaXMgbXVsdGlwbGljYXRpb24gb2YgYmFzZSBmcmFtZQorICogcHRpbWUgKGkuZS4gdGhlIHZhbHVlIG9mIGluZm8uZnJtX3B0aW1lIGluICNwam1lZGlhX2NvZGVjX3BhcmFtKS4KKyAqCisgKiBAcGFyYW0gY29kZWMJCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBpbnB1dAkJVGhlIGlucHV0IGZyYW1lLgorICogQHBhcmFtIG91dF9zaXplCVRoZSBsZW5ndGggb2YgYnVmZmVyIGluIHRoZSBvdXRwdXQgZnJhbWUuCisgKiBAcGFyYW0gb3V0cHV0CVRoZSBvdXRwdXQgZnJhbWUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzOworICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZW5jb2RlKCAKKwkJCQkJcGptZWRpYV9jb2RlYyAqY29kZWMsIAorCQkJCQljb25zdCBzdHJ1Y3QgcGptZWRpYV9mcmFtZSAqaW5wdXQsCisJCQkJCXVuc2lnbmVkIG91dF9zaXplLCAKKwkJCQkJc3RydWN0IHBqbWVkaWFfZnJhbWUgKm91dHB1dCApCit7CisgICAgcmV0dXJuICgqY29kZWMtPm9wLT5lbmNvZGUpKGNvZGVjLCBpbnB1dCwgb3V0X3NpemUsIG91dHB1dCk7Cit9CisKKworLyoqIAorICogSW5zdHJ1Y3QgdGhlIGNvZGVjIHRvIGRlY29kZSB0aGUgc3BlY2lmaWVkIGlucHV0IGZyYW1lLiBUaGUgaW5wdXQKKyAqIGZyYW1lIE1VU1QgaGF2ZSBwdGltZSB0aGF0IGlzIGV4YWN0bHkgZXF1YWwgdG8gYmFzZSBmcmFtZQorICogcHRpbWUgKGkuZS4gdGhlIHZhbHVlIG9mIGluZm8uZnJtX3B0aW1lIGluICNwam1lZGlhX2NvZGVjX3BhcmFtKS4KKyAqIEFwcGxpY2F0aW9uIGNhbiBhY2hpZXZlIHRoaXMgYnkgcGFyc2luZyB0aGUgcGFja2V0IGludG8gYmFzZQorICogZnJhbWVzIGJlZm9yZSBkZWNvZGluZyBlYWNoIGZyYW1lLgorICoKKyAqIEBwYXJhbSBjb2RlYwkJVGhlIGNvZGVjIGluc3RhbmNlLgorICogQHBhcmFtIGlucHV0CQlUaGUgaW5wdXQgZnJhbWUuCisgKiBAcGFyYW0gb3V0X3NpemUJVGhlIGxlbmd0aCBvZiBidWZmZXIgaW4gdGhlIG91dHB1dCBmcmFtZS4KKyAqIEBwYXJhbSBvdXRwdXQJVGhlIG91dHB1dCBmcmFtZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3M7CisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19kZWNvZGUoIAorCQkJCQlwam1lZGlhX2NvZGVjICpjb2RlYywgCisJCQkJCWNvbnN0IHN0cnVjdCBwam1lZGlhX2ZyYW1lICppbnB1dCwKKwkJCQkJdW5zaWduZWQgb3V0X3NpemUsIAorCQkJCQlzdHJ1Y3QgcGptZWRpYV9mcmFtZSAqb3V0cHV0ICkKK3sKKyAgICByZXR1cm4gKCpjb2RlYy0+b3AtPmRlY29kZSkoY29kZWMsIGlucHV0LCBvdXRfc2l6ZSwgb3V0cHV0KTsKK30KKworCisvKioKKyAqIEluc3RydWN0IHRoZSBjb2RlYyB0byByZWNvdmVyIGEgbWlzc2luZyBmcmFtZS4KKyAqCisgKiBAcGFyYW0gY29kZWMJCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLgorICogQHBhcmFtIG91dHB1dAlUaGUgb3V0cHV0IGZyYW1lIHdoZXJlIGdlbmVyYXRlZCBzaWduYWwKKyAqCQkJd2lsbCBiZSBwbGFjZWQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzOworICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfcmVjb3ZlciggcGptZWRpYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgIHVuc2lnbmVkIG91dF9zaXplLAorCQkJCQkgICAgICBzdHJ1Y3QgcGptZWRpYV9mcmFtZSAqb3V0cHV0ICkKK3sKKyAgICBpZiAoY29kZWMtPm9wICYmIGNvZGVjLT5vcC0+cmVjb3ZlcikKKwlyZXR1cm4gKCpjb2RlYy0+b3AtPnJlY292ZXIpKGNvZGVjLCBvdXRfc2l6ZSwgb3V0cHV0KTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKworLyoqCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfQ09ERUNfQ09ERUNTIFN1cHBvcnRlZCBjb2RlY3MKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUMKKyAqIEBicmllZiBEb2N1bWVudGF0aW9uIGFib3V0IGluZGl2aWR1YWwgY29kZWMgc3VwcG9ydGVkIGJ5IFBKTUVESUEKKyAqIEB7CisgKiBQbGVhc2Ugc2VlIHRoZSBBUElzIHByb3ZpZGVkIGJ5IHRoZSBpbmRpdmlkdWFsIGNvZGVjcyBiZWxvdy4KKyAqLworLyoqCisgKiBAfQorICovCisKKworCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZlcmVuY2UuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZlcmVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZmJmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmVyZW5jZS5oCkBAIC0wLDAgKzEsNTA5IEBACisvKiAkSWQ6IGNvbmZlcmVuY2UuaCAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ORl9IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPTkZfSF9fCisKKworLyoqCisgKiBAZmlsZSBjb25mZXJlbmNlLmgKKyAqIEBicmllZiBDb25mZXJlbmNlIGJyaWRnZS4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvcG9ydC5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX0NPTkYgQ29uZmVyZW5jZSBCcmlkZ2UKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVAorICogQGJyaWVmIEF1ZGlvIGNvbmZlcmVuY2UgYnJpZGdlIGltcGxlbWVudGF0aW9uCisgKiBAeworICoKKyAqIFRoaXMgZGVzY3JpYmVzIHRoZSBjb25mZXJlbmNlIGJyaWRnZSBpbXBsZW1lbnRhdGlvbiBpbiBQSk1FRElBLiBUaGUKKyAqIGNvbmZlcmVuY2UgYnJpZGdlIHByb3ZpZGVzIHBvd2VyZnVsIGFuZCB2ZXJ5IGVmZmljaWVudCBtZWNoYW5pc20gdG8KKyAqIHJvdXRlIHRoZSBhdWRpbyBmbG93IGFuZCBtaXggdGhlIGF1ZGlvIHNpZ25hbCB3aGVuIHJlcXVpcmVkLgorICoKKyAqIFNvbWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgZmxvdyB3aGVuIGNvbmZlcmVuY2UgYnJpZGdlIGlzCisgKiB1c2VkIGlzIGRlc2NyaWJlZCBpbiBodHRwOi8vd3d3LnBqc2lwLm9yZy90cmFjL3dpa2kvbWVkaWEtZmxvdyAuCisgKi8KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIFRoZSBjb25mZXJlbmNlIGJyaWRnZSBzaWduYXR1cmUgaW4gcGptZWRpYV9wb3J0X2luZm8uCisgKi8KKyNkZWZpbmUgUEpNRURJQV9DT05GX0JSSURHRV9TSUdOQVRVUkUJUEpNRURJQV9TSUdfUE9SVF9DT05GCisKKy8qKgorICogVGhlIGF1ZGlvIHN3aXRjaGJvYXJkIHNpZ25hdHVyZSBpbiBwam1lZGlhX3BvcnRfaW5mby4KKyAqLworI2RlZmluZSBQSk1FRElBX0NPTkZfU1dJVENIX1NJR05BVFVSRQlQSk1FRElBX1NJR19QT1JUX0NPTkZfU1dJVENICisKKworLyoqCisgKiBPcGFxdWUgdHlwZSBmb3IgY29uZmVyZW5jZSBicmlkZ2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29uZiBwam1lZGlhX2NvbmY7CisKKy8qKgorICogQ29uZmVyZW5jZSBwb3J0IGluZm8uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29uZl9wb3J0X2luZm8KK3sKKyAgICB1bnNpZ25lZAkJc2xvdDsJCSAgICAvKio8IFNsb3QgbnVtYmVyLgkJICAgICovCisgICAgcGpfc3RyX3QJCW5hbWU7CQkgICAgLyoqPCBQb3J0IG5hbWUuCQkgICAgKi8KKyAgICBwam1lZGlhX2Zvcm1hdAlmb3JtYXQ7CQkgICAgLyoqPCBGb3JtYXQuCQkgICAgKi8KKyAgICBwam1lZGlhX3BvcnRfb3AJdHhfc2V0dGluZzsJICAgIC8qKjwgVHJhbnNtaXQgc2V0dGluZ3MuCSAgICAqLworICAgIHBqbWVkaWFfcG9ydF9vcAlyeF9zZXR0aW5nOwkgICAgLyoqPCBSZWNlaXZlIHNldHRpbmdzLgkgICAgKi8KKyAgICB1bnNpZ25lZAkJbGlzdGVuZXJfY250OwkgICAgLyoqPCBOdW1iZXIgb2YgbGlzdGVuZXJzLgkgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgICAgKmxpc3RlbmVyX3Nsb3RzOwkgICAgLyoqPCBBcnJheSBvZiBsaXN0ZW5lcnMuCSAgICAqLworICAgIHVuc2lnbmVkCQl0cmFuc21pdHRlcl9jbnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHRyYW5zbWl0dGVyLgkgICAgKi8KKyAgICB1bnNpZ25lZAkJY2xvY2tfcmF0ZTsJICAgIC8qKjwgQ2xvY2sgcmF0ZSBvZiB0aGUgcG9ydC4gICAgKi8KKyAgICB1bnNpZ25lZAkJY2hhbm5lbF9jb3VudDsJICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzLgkgICAgKi8KKyAgICB1bnNpZ25lZAkJc2FtcGxlc19wZXJfZnJhbWU7ICAvKio8IFNhbXBsZXMgcGVyIGZyYW1lCSAgICAqLworICAgIHVuc2lnbmVkCQliaXRzX3Blcl9zYW1wbGU7ICAgIC8qKjwgQml0cyBwZXIgc2FtcGxlLgkgICAgKi8KKyAgICBpbnQJCQl0eF9hZGpfbGV2ZWw7CSAgICAvKio8IFR4IGxldmVsIGFkanVzdG1lbnQuCSAgICAqLworICAgIGludAkJCXJ4X2Fkal9sZXZlbDsJICAgIC8qKjwgUnggbGV2ZWwgYWRqdXN0bWVudC4JICAgICovCit9IHBqbWVkaWFfY29uZl9wb3J0X2luZm87CisKKworLyoqCisgKiBDb25mZXJlbmNlIHBvcnQgb3B0aW9ucy4gVGhlIHZhbHVlcyBoZXJlIGNhbiBiZSBjb21iaW5lZCBpbiBiaXRtYXNrIHRvCisgKiBiZSBzcGVjaWZpZWQgd2hlbiB0aGUgY29uZmVyZW5jZSBicmlkZ2UgaXMgY3JlYXRlZC4KKyAqLworZW51bSBwam1lZGlhX2NvbmZfb3B0aW9uCit7CisgICAgUEpNRURJQV9DT05GX05PX01JQyAgPSAxLAkvKio8IERpc2FibGUgYXVkaW8gc3RyZWFtcyBmcm9tIHRoZQorCQkJCSAgICAgbWljcm9waG9uZSBkZXZpY2UuCQkJICAgICovCisgICAgUEpNRURJQV9DT05GX05PX0RFVklDRSA9IDIsCS8qKjwgRG8gbm90IGNyZWF0ZSBzb3VuZCBkZXZpY2UuCSAgICAqLworICAgIFBKTUVESUFfQ09ORl9TTUFMTF9GSUxURVI9NCwvKio8IFVzZSBzbWFsbCBmaWx0ZXIgdGFibGUgd2hlbiByZXNhbXBsaW5nICovCisgICAgUEpNRURJQV9DT05GX1VTRV9MSU5FQVI9OAkvKio8IFVzZSBsaW5lYXIgcmVzYW1wbGluZyBpbnN0ZWFkIG9mIGZpbHRlcgorCQkJCSAgICAgYmFzZWQuCQkJCSAgICAqLworfTsKKworCisvKioKKyAqIENyZWF0ZSBjb25mZXJlbmNlIGJyaWRnZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gVGhlIHNhbXBsaW5nIHJhdGUsCisgKiBzYW1wbGVzIHBlciBmcmFtZSwgYW5kIGJpdHMgcGVyIHNhbXBsZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBpbnRlcm5hbAorICogb3BlcmF0aW9uIG9mIHRoZSBicmlkZ2UgKGUuZy4gd2hlbiBtaXhpbmcgYXVkaW8gZnJhbWVzKS4gSG93ZXZlciwgcG9ydHMgCisgKiB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG1heSBiZSBjb25uZWN0ZWQgdG8gdGhlIGJyaWRnZS4gSW4gdGhpcyBjYXNlLAorICogdGhlIGJyaWRnZSBpcyBhYmxlIHRvIHBlcmZvcm0gc2FtcGxpbmcgcmF0ZSBjb252ZXJzaW9uLCBhbmQgYnVmZmVyaW5nIGluIAorICogY2FzZSB0aGUgc2FtcGxlcyBwZXIgZnJhbWUgaXMgZGlmZmVyZW50LgorICoKKyAqIEZvciB0aGlzIHZlcnNpb24gb2YgUEpNRURJQSwgb25seSAxNmJpdHMgcGVyIHNhbXBsZSBpcyBzdXBwb3J0ZWQuCisgKgorICogRm9yIHRoaXMgdmVyc2lvbiBvZiBQSk1FRElBLCB0aGUgY2hhbm5lbCBjb3VudCBvZiB0aGUgcG9ydHMgTVVTVCBtYXRjaAorICogdGhlIGNoYW5uZWwgY291bnQgb2YgdGhlIGJyaWRnZS4KKyAqCisgKiBVbmRlciBub3JtYWwgb3BlcmF0aW9uIChpLmUuIHdoZW4gUEpNRURJQV9DT05GX05PX0RFVklDRSBvcHRpb24gaXMgTk9UCisgKiBzcGVjaWZpZWQpLCB0aGUgYnJpZGdlIGludGVybmFsbHkgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHNvdW5kIGRldmljZQorICogYW5kIGNvbm5lY3QgdGhlIHNvdW5kIGRldmljZSB0byBwb3J0IHplcm8gb2YgdGhlIGJyaWRnZS4gCisgKgorICogSWYgUEpNRURJQV9DT05GX05PX0RFVklDRSBvcHRpb25zIGlzIHNwZWNpZmllZCwgbm8gc291bmQgZGV2aWNlIHdpbGwKKyAqIGJlIGNyZWF0ZWQgaW4gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiBBcHBsaWNhdGlvbiBNVVNUIGFjcXVpcmUgdGhlIHBvcnQKKyAqIGludGVyZmFjZSBvZiB0aGUgYnJpZGdlIGJ5IGNhbGxpbmcgI3BqbWVkaWFfY29uZl9nZXRfbWFzdGVyX3BvcnQoKSwgYW5kCisgKiBjb25uZWN0IHRoaXMgcG9ydCBpbnRlcmZhY2UgdG8gYSBzb3VuZCBkZXZpY2UgcG9ydCBieSBjYWxsaW5nCisgKiAjcGptZWRpYV9zbmRfcG9ydF9jb25uZWN0KCksIG9yIHRvIGEgbWFzdGVyIHBvcnQgKHBqbWVkaWFfbWFzdGVyX3BvcnQpCisgKiBpZiBhcHBsaWNhdGlvbiBkb2Vzbid0IHdhbnQgdG8gaW5zdGFudGlhdGUgYW55IHNvdW5kIGRldmljZXMuCisgKgorICogVGhlIHNvdW5kIGRldmljZSBvciBtYXN0ZXIgcG9ydCBhcmUgY3J1Y2lhbCBmb3IgdGhlIGJyaWRnZSdzIG9wZXJhdGlvbiwgCisgKiBiZWNhdXNlIGl0IHByb3ZpZGVzIHRoZSBicmlkZ2Ugd2l0aCBuZWNlc3NhcnkgY2xvY2sgdG8gcHJvY2VzcyB0aGUgYXVkaW8KKyAqIGZyYW1lcyBwZXJpb2RpY2FsbHkuIEludGVybmFsbHksIHRoZSBicmlkZ2UgcnVucyB3aGVuIGdldF9mcmFtZSgpIHRvIAorICogcG9ydCB6ZXJvIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gdXNlIHRvIGFsbG9jYXRlIHRoZSBicmlkZ2UgYW5kIAorICoJCQkgICAgYWRkaXRpb25hbCBidWZmZXJzIGZvciB0aGUgc291bmQgZGV2aWNlLgorICogQHBhcmFtIG1heF9zbG90cwkgICAgTWF4aW11bSBudW1iZXIgb2Ygc2xvdHMvcG9ydHMgdG8gYmUgY3JlYXRlZCBpbgorICoJCQkgICAgdGhlIGJyaWRnZS4gTm90ZSB0aGF0IHRoZSBicmlkZ2UgaW50ZXJuYWxseSB1c2VzCisgKgkJCSAgICBvbmUgcG9ydCBmb3IgdGhlIHNvdW5kIGRldmljZSwgc28gdGhlIGFjdHVhbCAKKyAqCQkJICAgIG1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHdpbGwgYmUgbGVzcyBvbmUgdGhhbgorICoJCQkgICAgdGhpcyB2YWx1ZS4KKyAqIEBwYXJhbSBzYW1wbGluZ19yYXRlCSAgICBTZXQgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGJyaWRnZS4gVGhpcyB2YWx1ZQorICoJCQkgICAgaXMgYWxzbyB1c2VkIHRvIHNldCB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUKKyAqCQkJICAgIHNvdW5kIGRldmljZS4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIFBDTSBzdHJlYW0uIE5vcm1hbGx5CisgKgkJCSAgICB0aGUgdmFsdWUgd2lsbCBiZSAxIGZvciBtb25vLCBidXQgYXBwbGljYXRpb24gbWF5CisgKgkJCSAgICBzcGVjaWZ5IGEgdmFsdWUgb2YgMiBmb3Igc3RlcmVvLiBOb3RlIHRoYXQgYWxsCisgKgkJCSAgICBwb3J0cyB0aGF0IHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBicmlkZ2UgTVVTVCAKKyAqCQkJICAgIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzIGFzIHRoZSBicmlkZ2UuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuIFRoaXMgdmFsdWUKKyAqCQkJICAgIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlIHNvdW5kIGRldmljZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBTZXQgdGhlIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUuIFRoaXMgdmFsdWUKKyAqCQkJICAgIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlIHNvdW5kIGRldmljZS4gQ3VycmVudGx5CisgKgkJCSAgICBvbmx5IDE2Yml0IHBlciBzYW1wbGUgaXMgc3VwcG9ydGVkLgorICogQHBhcmFtIG9wdGlvbnMJICAgIEJpdG1hc2sgb3B0aW9ucyB0byBiZSBzZXQgZm9yIHRoZSBicmlkZ2UuIFRoZQorICoJCQkgICAgb3B0aW9ucyBhcmUgY29uc3RydWN0ZWQgZnJvbSAjcGptZWRpYV9jb25mX29wdGlvbgorICoJCQkgICAgZW51bWVyYXRpb24uCisgKiBAcGFyYW0gcF9jb25mCSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGNvbmZlcmVuY2UgYnJpZGdlIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIGlmIGNvbmZlcmVuY2UgYnJpZGdlIGNhbiBiZSBjcmVhdGVkLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvbmZfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgdW5zaWduZWQgbWF4X3Nsb3RzLAorCQkJCQkgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGUsCisJCQkJCSAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICB1bnNpZ25lZCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCSAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICBwam1lZGlhX2NvbmYgKipwX2NvbmYgKTsKKworCisvKioKKyAqIERlc3Ryb3kgY29uZmVyZW5jZSBicmlkZ2UuCisgKgorICogQHBhcmFtIGNvbmYJCSAgICBUaGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2Rlc3Ryb3koIHBqbWVkaWFfY29uZiAqY29uZiApOworCisKKy8qKgorICogR2V0IHRoZSBtYXN0ZXIgcG9ydCBpbnRlcmZhY2Ugb2YgdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiBUaGUgbWFzdGVyIHBvcnQKKyAqIGNvcnJlc3BvbmRzIHRvIHRoZSBwb3J0IHplcm8gb2YgdGhlIGJyaWRnZS4gVGhpcyBpcyBvbmx5IHVzZWZ1bGwgd2hlbiAKKyAqIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1hbmFnZSB0aGUgc291bmQgZGV2aWNlIGJ5IGl0c2VsZiwgaW5zdGVhZCBvZiAKKyAqIGFsbG93aW5nIHRoZSBicmlkZ2UgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSBzb3VuZCBkZXZpY2UgaW1wbGljaXRseS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSByZXR1cm4gYSBwb3J0IGludGVyZmFjZSBpZiBQSk1FRElBX0NPTkZfTk9fREVWSUNFCisgKiBvcHRpb24gd2FzIHNwZWNpZmllZCB3aGVuIHRoZSBicmlkZ2Ugd2FzIGNyZWF0ZWQuCisgKgorICogQXBwbGljYXRpb24gY2FuIGNvbm5lY3QgdGhlIHBvcnQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB0byBhIAorICogc291bmQgZGV2aWNlIGJ5IGNhbGxpbmcgI3BqbWVkaWFfc25kX3BvcnRfY29ubmVjdCgpLgorICoKKyAqIEBwYXJhbSBjb25mCQkgICAgVGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICoKKyAqIEByZXR1cm4JCSAgICBUaGUgcG9ydCBpbnRlcmZhY2Ugb2YgcG9ydCB6ZXJvIG9mIHRoZSBicmlkZ2UsCisgKgkJCSAgICBvbmx5IHdoZW4gUEpNRURJQV9DT05GX05PX0RFVklDRSBvcHRpb25zIHdhcworICoJCQkgICAgc3BlY2lmaWVkIHdoZW4gdGhlIGJyaWRnZSB3YXMgY3JlYXRlZC4KKyAqLworUEpfREVDTChwam1lZGlhX3BvcnQqKSBwam1lZGlhX2NvbmZfZ2V0X21hc3Rlcl9wb3J0KHBqbWVkaWFfY29uZiAqY29uZik7CisKKworLyoqCisgKiBTZXQgbWFzdGVyIHBvcnQgbmFtZS4KKyAqCisgKiBAcGFyYW0gY29uZgkJICAgIFRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqIEBwYXJhbSBuYW1lCQkgICAgTmFtZSB0byBiZSBhc3NpZ25lZC4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvbmZfc2V0X3BvcnQwX25hbWUocGptZWRpYV9jb25mICpjb25mLAorCQkJCQkJIGNvbnN0IHBqX3N0cl90ICpuYW1lKTsKKworCisvKioKKyAqIEFkZCBtZWRpYSBwb3J0IHRvIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqCisgKiBCeSBkZWZhdWx0LCB0aGUgbmV3IGNvbmZlcmVuY2UgcG9ydCB3aWxsIGhhdmUgYm90aCBUWCBhbmQgUlggZW5hYmxlZCwgCisgKiBidXQgaXQgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgb3RoZXIgcG9ydHMuIEFwcGxpY2F0aW9uIFNIT1VMRCBjYWxsIAorICogI3BqbWVkaWFfY29uZl9jb25uZWN0X3BvcnQoKSB0byAgZW5hYmxlIGF1ZGlvIHRyYW5zbWlzc2lvbiBhbmQgcmVjZWlwdCAKKyAqIHRvL2Zyb20gdGhpcyBwb3J0LgorICoKKyAqIE9uY2UgdGhlIG1lZGlhIHBvcnQgaXMgY29ubmVjdGVkIHRvIG90aGVyIHBvcnQocykgaW4gdGhlIGJyaWRnZSwKKyAqIHRoZSBicmlkZ2Ugd2lsbCBjb250aW51b3NseSBjYWxsIGdldF9mcmFtZSgpIGFuZCBwdXRfZnJhbWUoKSB0byB0aGUKKyAqIHBvcnQsIGFsbG93aW5nIG1lZGlhIHRvIGZsb3cgdG8vZnJvbSB0aGUgcG9ydC4KKyAqCisgKiBAcGFyYW0gY29uZgkJVGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3IgdGhpcyBwb3J0LgorICogQHBhcmFtIHN0cm1fcG9ydAlTdHJlYW0gcG9ydCBpbnRlcmZhY2UuCisgKiBAcGFyYW0gbmFtZQkJT3B0aW9uYWwgbmFtZSBmb3IgdGhlIHBvcnQuIElmIHRoaXMgdmFsdWUgaXMgTlVMTCwKKyAqCQkJdGhlIG5hbWUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBuYW1lIGluIHRoZSBwb3J0IAorICoJCQlpbmZvLgorICogQHBhcmFtIHBfc2xvdAlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHNsb3QgaW5kZXggb2YgdGhlIHBvcnQgaW4KKyAqCQkJdGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2FkZF9wb3J0KCBwam1lZGlhX2NvbmYgKmNvbmYsCisJCQkJCSAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICBwam1lZGlhX3BvcnQgKnN0cm1fcG9ydCwKKwkJCQkJICAgIGNvbnN0IHBqX3N0cl90ICpuYW1lLAorCQkJCQkgICAgdW5zaWduZWQgKnBfc2xvdCApOworCisKKy8qKgorICogPGk+PGI+V2FybmluZzo8L2I+IFRoaXMgQVBJIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgMS4zIGFuZCB3aWxsIGJlCisgKiByZW1vdmVkIGluIHRoZSBmdXR1cmUgcmVsZWFzZSwgdXNlIEByZWYgUEpNRURJQV9TUExJVENPTUIgaW5zdGVhZC48L2k+CisgKgorICogQ3JlYXRlIGFuZCBhZGQgYSBwYXNzaXZlIG1lZGlhIHBvcnQgdG8gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLiBVbmxpa2UKKyAqICJub3JtYWwiIG1lZGlhIHBvcnQgdGhhdCBpcyBhZGRlZCB3aXRoICNwam1lZGlhX2NvbmZfYWRkX3BvcnQoKSwgbWVkaWEKKyAqIHBvcnQgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgaGF2ZSBpdHMgZ2V0X2ZyYW1lKCkgYW5kCisgKiBwdXRfZnJhbWUoKSBjYWxsZWQgYnkgdGhlIGJyaWRnZTsgaW5zdGVhZCwgYXBwbGljYXRpb24gTVVTVCBjb250aW51b3NseQorICogY2FsbCB0aGVzZSBmdW5jdGlvbnMgdG8gdGhlIHBvcnQsIHRvIGFsbG93IG1lZGlhIHRvIGZsb3cgZnJvbS90byB0aGUKKyAqIHBvcnQuCisgKgorICogVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgYXBwbGljYXRpb24gd2lsbCBiZSBnaXZlbiB0d28gb2JqZWN0czoKKyAqIHRoZSBzbG90IG51bWJlciBvZiB0aGUgcG9ydCBpbiB0aGUgYnJpZGdlLCBhbmQgcG9pbnRlciB0byB0aGUgbWVkaWEKKyAqIHBvcnQgd2hlcmUgYXBwbGljYXRpb24gTVVTVCBzdGFydCBjYWxsaW5nIGdldF9mcmFtZSgpIGFuZCBwdXRfZnJhbWUoKQorICogdG8gdGhlIHBvcnQuCisgKgorICogQHBhcmFtIGNvbmYJCSAgICBUaGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgYnVmZmVycyBldGMgZm9yIHRoaXMgcG9ydC4KKyAqIEBwYXJhbSBuYW1lCQkgICAgTmFtZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgcG9ydC4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBDbG9jayByYXRlL3NhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkgICAgTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE9wdGlvbnMgKHNob3VsZCBiZSB6ZXJvIGF0IHRoZSBtb21lbnQpLgorICogQHBhcmFtIHBfc2xvdAkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBzbG90IGluZGV4IG9mIHRoZSBwb3J0IGluCisgKgkJCSAgICB0aGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKiBAcGFyYW0gcF9wb3J0CSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHBvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIAorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2FkZF9wYXNzaXZlX3BvcnQoIHBqbWVkaWFfY29uZiAqY29uZiwKKwkJCQkJCSAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgICAgY29uc3QgcGpfc3RyX3QgKm5hbWUsCisJCQkJCQkgICAgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJCSAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkJICAgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkJICAgIHVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCSAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkJICAgIHVuc2lnbmVkICpwX3Nsb3QsCisJCQkJCQkgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0ICk7CisKKworLyoqCisgKiBDaGFuZ2UgVFggYW5kIFJYIHNldHRpbmdzIGZvciB0aGUgcG9ydC4KKyAqCisgKiBAcGFyYW0gY29uZgkJVGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICogQHBhcmFtIHNsb3QJCVBvcnQgbnVtYmVyL3Nsb3QgaW4gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICogQHBhcmFtIHR4CQlTZXR0aW5ncyBmb3IgdGhlIHRyYW5zbWlzc2lvbiBUTyB0aGlzIHBvcnQuCisgKiBAcGFyYW0gcngJCVNldHRpbmdzIGZvciB0aGUgcmVjZWlwdCBGUk9NIHRoaXMgcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29uZl9jb25maWd1cmVfcG9ydCggcGptZWRpYV9jb25mICpjb25mLAorCQkJCQkJICB1bnNpZ25lZCBzbG90LAorCQkJCQkJICBwam1lZGlhX3BvcnRfb3AgdHgsCisJCQkJCQkgIHBqbWVkaWFfcG9ydF9vcCByeCk7CisKKworLyoqCisgKiBFbmFibGUgdW5pZGlyZWN0aW9uYWwgYXVkaW8gZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBzbG90IHRvIHRoZQorICogc3BlY2lmaWVkIHNpbmsgc2xvdC4KKyAqCisgKiBAcGFyYW0gY29uZgkJVGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICogQHBhcmFtIHNyY19zbG90CVNvdXJjZSBzbG90LgorICogQHBhcmFtIHNpbmtfc2xvdAlTaW5rIHNsb3QuCisgKiBAcGFyYW0gbGV2ZWwJCVRoaXMgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBpbXByb3ZlbWVudHMKKyAqCQkJd2hlcmUgaXQgaXMgcG9zc2libGUgdG8gYWRqdXN0IHRoZSBsZXZlbCBvZiBzaWduYWwKKyAqCQkJdHJhbnNtaXR0ZWQgaW4gYSBzcGVjaWZpYyBjb25uZWN0aW9uLiBGb3Igbm93LAorICoJCQl0aGlzIGFyZ3VtZW50IE1VU1QgYmUgemVyby4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVMgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2Nvbm5lY3RfcG9ydCggcGptZWRpYV9jb25mICpjb25mLAorCQkJCQkJdW5zaWduZWQgc3JjX3Nsb3QsCisJCQkJCQl1bnNpZ25lZCBzaW5rX3Nsb3QsCisJCQkJCQlpbnQgbGV2ZWwgKTsKKworCisvKioKKyAqIERpc2Nvbm5lY3QgdW5pZGlyZWN0aW9uYWwgYXVkaW8gZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSB0byB0aGUgc3BlY2lmaWVkCisgKiBzaW5rIHNsb3QuCisgKgorICogQHBhcmFtIGNvbmYJCVRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqIEBwYXJhbSBzcmNfc2xvdAlTb3VyY2Ugc2xvdC4KKyAqIEBwYXJhbSBzaW5rX3Nsb3QJU2luayBzbG90LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2Rpc2Nvbm5lY3RfcG9ydCggcGptZWRpYV9jb25mICpjb25mLAorCQkJCQkJICAgdW5zaWduZWQgc3JjX3Nsb3QsCisJCQkJCQkgICB1bnNpZ25lZCBzaW5rX3Nsb3QgKTsKKworCisvKioKKyAqIEdldCBudW1iZXIgb2YgcG9ydHMgY3VycmVudGx5IHJlZ2lzdGVyZWQgdG8gdGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICoKKyAqIEBwYXJhbSBjb25mCQlUaGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKgorICogQHJldHVybgkJTnVtYmVyIG9mIHBvcnRzIGN1cnJlbnRseSByZWdpc3RlcmVkIHRvIHRoZSBjb25mZXJlbmNlCisgKgkJCWJyaWRnZS4KKyAqLworUEpfREVDTCh1bnNpZ25lZCkgcGptZWRpYV9jb25mX2dldF9wb3J0X2NvdW50KHBqbWVkaWFfY29uZiAqY29uZik7CisKKworLyoqCisgKiBHZXQgdG90YWwgbnVtYmVyIG9mIHBvcnRzIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBzZXQgdXAgaW4gdGhlIGJyaWRnZS4KKyAqIAorICogQHBhcmFtIGNvbmYJCVRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wodW5zaWduZWQpIHBqbWVkaWFfY29uZl9nZXRfY29ubmVjdF9jb3VudChwam1lZGlhX2NvbmYgKmNvbmYpOworCisKKy8qKgorICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcG9ydCBmcm9tIHRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqCisgKiBAcGFyYW0gY29uZgkJVGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICogQHBhcmFtIHNsb3QJCVRoZSBwb3J0IGluZGV4IHRvIGJlIHJlbW92ZWQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvbmZfcmVtb3ZlX3BvcnQoIHBqbWVkaWFfY29uZiAqY29uZiwKKwkJCQkJICAgICAgIHVuc2lnbmVkIHNsb3QgKTsKKworCisKKy8qKgorICogRW51bWVyYXRlIG9jY3VwaWVkIHBvcnRzIGluIHRoZSBicmlkZ2UuCisgKgorICogQHBhcmFtIGNvbmYJCVRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqIEBwYXJhbSBwb3J0cwkJQXJyYXkgb2YgcG9ydCBudW1iZXJzIHRvIGJlIGZpbGxlZCBpbi4KKyAqIEBwYXJhbSBjb3VudAkJT24gaW5wdXQsIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMKKyAqCQkJaW4gdGhlIGFycmF5LiBPbiByZXR1cm4sIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGgKKyAqCQkJdGhlIGFjdHVhbCBudW1iZXIgb2YgcG9ydHMuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvbmZfZW51bV9wb3J0cyggcGptZWRpYV9jb25mICpjb25mLAorCQkJCQkgICAgICB1bnNpZ25lZCBwb3J0c1tdLAorCQkJCQkgICAgICB1bnNpZ25lZCAqY291bnQgKTsKKworCisvKioKKyAqIEdldCBwb3J0IGluZm8uCisgKgorICogQHBhcmFtIGNvbmYJCVRoZSBjb25mZXJlbmNlIGJyaWRnZS4KKyAqIEBwYXJhbSBzbG90CQlQb3J0IGluZGV4LgorICogQHBhcmFtIGluZm8JCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgaW5mby4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29uZl9nZXRfcG9ydF9pbmZvKCBwam1lZGlhX2NvbmYgKmNvbmYsCisJCQkJCQkgdW5zaWduZWQgc2xvdCwKKwkJCQkJCSBwam1lZGlhX2NvbmZfcG9ydF9pbmZvICppbmZvKTsKKworCisvKioKKyAqIEdldCBvY2N1cGllZCBwb3J0cyBpbmZvLgorICoKKyAqIEBwYXJhbSBjb25mCQlUaGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKiBAcGFyYW0gc2l6ZQkJT24gaW5wdXQsIGNvbnRhaW5zIG1heGltdW0gbnVtYmVyIG9mIGluZm9zCisgKgkJCXRvIGJlIHJldHJpZXZlZC4gT24gb3V0cHV0LCBjb250YWlucyB0aGUgYWN0dWFsCisgKgkJCW51bWJlciBvZiBpbmZvcyB0aGF0IGhhdmUgYmVlbiBjb3BpZWQuCisgKiBAcGFyYW0gaW5mbwkJQXJyYXkgb2YgaW5mby4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29uZl9nZXRfcG9ydHNfaW5mbyhwam1lZGlhX2NvbmYgKmNvbmYsCisJCQkJCQkgdW5zaWduZWQgKnNpemUsCisJCQkJCQkgcGptZWRpYV9jb25mX3BvcnRfaW5mbyBpbmZvW10KKwkJCQkJCSApOworCisKKy8qKgorICogR2V0IGxhc3Qgc2lnbmFsIGxldmVsIHRyYW5zbWl0dGVkIHRvIG9yIHJlY2VpdmVkIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0LgorICogVGhpcyB3aWxsIHJldHJpZXZlIHRoZSAicmVhbC10aW1lIiBzaWduYWwgbGV2ZWwgb2YgdGhlIGF1ZGlvIGFzIHRoZXkgYXJlCisgKiB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBieSB0aGUgc3BlY2lmaWVkIHBvcnQuIEFwcGxpY2F0aW9uIG1heSBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIHBlcmlvZGljYWxseSB0byBkaXNwbGF5IHRoZSBzaWduYWwgbGV2ZWwgdG8gYSBWVSBtZXRlci4KKyAqCisgKiBUaGUgc2lnbmFsIGxldmVsIGlzIGFuIGludGVnZXIgdmFsdWUgaW4gemVybyB0byAyNTUsIHdpdGggemVybyBpbmRpY2F0ZXMKKyAqIG5vIHNpZ25hbCwgYW5kIDI1NSBpbmRpY2F0ZXMgdGhlIGxvdWRlc3Qgc2lnbmFsIGxldmVsLgorICoKKyAqIEBwYXJhbSBjb25mCQlUaGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKiBAcGFyYW0gc2xvdAkJU2xvdCBudW1iZXIuCisgKiBAcGFyYW0gdHhfbGV2ZWwJT3B0aW9uYWwgYXJndW1lbnQgdG8gcmVjZWl2ZSB0aGUgbGV2ZWwgb2Ygc2lnbmFsCisgKgkJCXRyYW5zbWl0dGVkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCAoaS5lLiB0aGUgZGlyZWN0aW9uCisgKgkJCWlzIGZyb20gdGhlIGJyaWRnZSB0byB0aGUgcG9ydCkuCisgKiBAcGFyYW0gcnhfbGV2ZWwJT3B0aW9uYWwgYXJndW1lbnQgdG8gcmVjZWl2ZSB0aGUgbGV2ZWwgb2Ygc2lnbmFsCisgKgkJCXJlY2VpdmVkIGZyb20gdGhlIHBvcnQgKGkuZS4gdGhlIGRpcmVjdGlvbiBpcyBmcm9tIHRoZQorICoJCQlwb3J0IHRvIHRoZSBicmlkZ2UpLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2dldF9zaWduYWxfbGV2ZWwocGptZWRpYV9jb25mICpjb25mLAorCQkJCQkJICAgdW5zaWduZWQgc2xvdCwKKwkJCQkJCSAgIHVuc2lnbmVkICp0eF9sZXZlbCwKKwkJCQkJCSAgIHVuc2lnbmVkICpyeF9sZXZlbCk7CisKKworLyoqCisgKiBBZGp1c3QgdGhlIGxldmVsIG9mIHNpZ25hbCByZWNlaXZlZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydC4KKyAqIEFwcGxpY2F0aW9uIG1heSBhZGp1c3QgdGhlIGxldmVsIHRvIG1ha2Ugc2lnbmFsIHJlY2VpdmVkIGZyb20gdGhlIHBvcnQKKyAqIGVpdGhlciBsb3VkZXIgb3IgbW9yZSBxdWlldC4gVGhlIGxldmVsIGFkanVzdG1lbnQgaXMgY2FsY3VsYXRlZCB3aXRoIHRoaXMKKyAqIGZvcm11bGE6IDxiPjx0dD5vdXRwdXQgPSBpbnB1dCAqIChhZGpfbGV2ZWwrMTI4KSAvIDEyODwvdHQ+PC9iPi4gVXNpbmcgCisgKiB0aGlzLCB6ZXJvIGluZGljYXRlcyBubyBhZGp1c3RtZW50LCB0aGUgdmFsdWUgLTEyOCB3aWxsIG11dGUgdGhlIHNpZ25hbCwgCisgKiBhbmQgdGhlIHZhbHVlIG9mICsxMjggd2lsbCBtYWtlIHRoZSBzaWduYWwgMTAwJSBsb3VkZXIsICsyNTYgd2lsbCBtYWtlIGl0CisgKiAyMDAlIGxvdWRlciwgZXRjLgorICoKKyAqIFRoZSBsZXZlbCBhZGp1c3RtZW50IHZhbHVlIHdpbGwgc3RheSB3aXRoIHRoZSBwb3J0IHVudGlsIHRoZSBwb3J0IGlzCisgKiByZW1vdmVkIGZyb20gdGhlIGJyaWRnZSBvciBuZXcgYWRqdXN0bWVudCB2YWx1ZSBpcyBzZXQuIFRoZSBjdXJyZW50CisgKiBsZXZlbCBhZGp1c3RtZW50IHZhbHVlIGlzIHJlcG9ydGVkIGluIHRoZSBtZWRpYSBwb3J0IGluZm8gd2hlbgorICogdGhlICNwam1lZGlhX2NvbmZfZ2V0X3BvcnRfaW5mbygpIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqCisgKiBAcGFyYW0gY29uZgkJVGhlIGNvbmZlcmVuY2UgYnJpZGdlLgorICogQHBhcmFtIHNsb3QJCVNsb3QgbnVtYmVyIG9mIHRoZSBwb3J0LgorICogQHBhcmFtIGFkal9sZXZlbAlBZGp1c3RtZW50IGxldmVsLCB3aGljaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICoJCQl0byAtMTI4LiBBIHZhbHVlIG9mIHplcm8gbWVhbnMgdGhlcmUgaXMgbm8gbGV2ZWwKKyAqCQkJYWRqdXN0bWVudCB0byBiZSBtYWRlLCB0aGUgdmFsdWUgLTEyOCB3aWxsIG11dGUgdGhlIAorICoJCQlzaWduYWwsIGFuZCB0aGUgdmFsdWUgb2YgKzEyOCB3aWxsIG1ha2UgdGhlIHNpZ25hbCAKKyAqCQkJMTAwJSBsb3VkZXIsICsyNTYgd2lsbCBtYWtlIGl0IDIwMCUgbG91ZGVyLCBldGMuIAorICoJCQlTZWUgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGZvciB0aGUgZm9ybXVsYS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29uZl9hZGp1c3RfcnhfbGV2ZWwoIHBqbWVkaWFfY29uZiAqY29uZiwKKwkJCQkJCSAgIHVuc2lnbmVkIHNsb3QsCisJCQkJCQkgICBpbnQgYWRqX2xldmVsICk7CisKKworLyoqCisgKiBBZGp1c3QgdGhlIGxldmVsIG9mIHNpZ25hbCB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKiBBcHBsaWNhdGlvbiBtYXkgYWRqdXN0IHRoZSBsZXZlbCB0byBtYWtlIHNpZ25hbCB0cmFuc21pdHRlZCB0byB0aGUgcG9ydAorICogZWl0aGVyIGxvdWRlciBvciBtb3JlIHF1aWV0LiBUaGUgbGV2ZWwgYWRqdXN0bWVudCBpcyBjYWxjdWxhdGVkIHdpdGggdGhpcworICogZm9ybXVsYTogPGI+PHR0Pm91dHB1dCA9IGlucHV0ICogKGFkal9sZXZlbCsxMjgpIC8gMTI4PC90dD48L2I+LiBVc2luZyAKKyAqIHRoaXMsIHplcm8gaW5kaWNhdGVzIG5vIGFkanVzdG1lbnQsIHRoZSB2YWx1ZSAtMTI4IHdpbGwgbXV0ZSB0aGUgc2lnbmFsLCAKKyAqIGFuZCB0aGUgdmFsdWUgb2YgKzEyOCB3aWxsIG1ha2UgdGhlIHNpZ25hbCAxMDAlIGxvdWRlciwgKzI1NiB3aWxsIG1ha2UgaXQKKyAqIDIwMCUgbG91ZGVyLCBldGMuCisgKgorICogVGhlIGxldmVsIGFkanVzdG1lbnQgdmFsdWUgd2lsbCBzdGF5IHdpdGggdGhlIHBvcnQgdW50aWwgdGhlIHBvcnQgaXMKKyAqIHJlbW92ZWQgZnJvbSB0aGUgYnJpZGdlIG9yIG5ldyBhZGp1c3RtZW50IHZhbHVlIGlzIHNldC4gVGhlIGN1cnJlbnQKKyAqIGxldmVsIGFkanVzdG1lbnQgdmFsdWUgaXMgcmVwb3J0ZWQgaW4gdGhlIG1lZGlhIHBvcnQgaW5mbyB3aGVuCisgKiB0aGUgI3BqbWVkaWFfY29uZl9nZXRfcG9ydF9pbmZvKCkgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIEBwYXJhbSBjb25mCQlUaGUgY29uZmVyZW5jZSBicmlkZ2UuCisgKiBAcGFyYW0gc2xvdAkJU2xvdCBudW1iZXIgb2YgdGhlIHBvcnQuCisgKiBAcGFyYW0gYWRqX2xldmVsCUFkanVzdG1lbnQgbGV2ZWwsIHdoaWNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgKgkJCXRvIC0xMjguIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGVyZSBpcyBubyBsZXZlbAorICoJCQlhZGp1c3RtZW50IHRvIGJlIG1hZGUsIHRoZSB2YWx1ZSAtMTI4IHdpbGwgbXV0ZSB0aGUgCisgKgkJCXNpZ25hbCwgYW5kIHRoZSB2YWx1ZSBvZiArMTI4IHdpbGwgbWFrZSB0aGUgc2lnbmFsIAorICoJCQkxMDAlIGxvdWRlciwgKzI1NiB3aWxsIG1ha2UgaXQgMjAwJSBsb3VkZXIsIGV0Yy4gCisgKgkJCVNlZSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRpb24gZm9yIHRoZSBmb3JtdWxhLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb25mX2FkanVzdF90eF9sZXZlbCggcGptZWRpYV9jb25mICpjb25mLAorCQkJCQkJICAgdW5zaWduZWQgc2xvdCwKKwkJCQkJCSAgIGludCBhZGpfbGV2ZWwgKTsKKworCisKK1BKX0VORF9ERUNMCisKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9DT05GX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWcuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGM1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWcuaApAQCAtMCwwICsxLDEyOTIgQEAKKy8qICRJZDogY29uZmlnLmggNDcwMSAyMDE0LTAxLTAzIDAzOjQ0OjA1WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0NPTkZJR19IX18KKyNkZWZpbmUgX19QSk1FRElBX0NPTkZJR19IX18KKworLyoqCisgKiBAZmlsZSBwam1lZGlhL2NvbmZpZy5oIENvbXBpbGUgdGltZSBjb25maWcKKyAqIEBicmllZiBDb250YWlucyBzb21lIGNvbXBpbGUgdGltZSBjb25zdGFudHMuCisgKi8KKyNpbmNsdWRlIDxwai9jb25maWcuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9CQVNFIEJhc2UgVHlwZXMgYW5kIENvbmZpZ3VyYXRpb25zCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9DT05GSUcgQ29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb24KKyAqIEBpbmdyb3VwIFBKTUVESUFfQkFTRQorICogQGJyaWVmIFNvbWUgY29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisgKiBAeworICovCisKKy8qCisgKiBJbmNsdWRlIGNvbmZpZ19hdXRvLmggaWYgYXV0b2NvbmYgaXMgdXNlZCAoUEpfQVVUT0NPTkYgaXMgc2V0KQorICovCisjaWYgZGVmaW5lZChQSl9BVVRPQ09ORikKKyMgICBpbmNsdWRlIDxwam1lZGlhL2NvbmZpZ19hdXRvLmg+CisjZW5kaWYKKworLyoqCisgKiBTcGVjaWZ5IHdoZXRoZXIgd2UgcHJlZmVyIHRvIHVzZSBhdWRpbyBzd2l0Y2ggYm9hcmQgcmF0aGVyIHRoYW4gCisgKiBjb25mZXJlbmNlIGJyaWRnZS4KKyAqCisgKiBBdWRpbyBzd2l0Y2ggYm9hcmQgaXMgYSBraW5kIG9mIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBjb25mZXJlbmNlIAorICogYnJpZGdlLCBidXQgbm90IHJlYWxseSB0aGUgc3Vic2V0IG9mIGNvbmZlcmVuY2UgYnJpZGdlLiBJdCBoYXMgCisgKiBzdHJpY3RlciBydWxlcyBvbiBhdWRpbyByb3V0aW5nIGFtb25nIHRoZSBwam1lZGlhIHBvcnRzIGFuZCBoYXMKKyAqIG5vIGF1ZGlvIG1peGluZyBjYXBhYmlsaXR5LiBUaGUgcG93ZXIgb2YgaXQgaXMgaXQgY291bGQgd29yayB3aXRoCisgKiBlbmNvZGVkIGF1ZGlvIGZyYW1lcyB3aGVyZSBjb25mZXJlbmNlIGJyaWdkZSBjb3VsZG4ndC4KKyAqCisgKiBEZWZhdWx0OiAwCisgKi8KKyNpZm5kZWYgUEpNRURJQV9DT05GX1VTRV9TV0lUQ0hfQk9BUkQKKyMgICBkZWZpbmUgUEpNRURJQV9DT05GX1VTRV9TV0lUQ0hfQk9BUkQgICAgMAorI2VuZGlmCisKKy8qKgorICogU3BlY2lmeSBidWZmZXIgc2l6ZSBmb3IgYXVkaW8gc3dpdGNoIGJvYXJkLCBpbiBieXRlcy4gVGhpcyBidWZmZXIgd2lsbAorICogYmUgdXNlZCBmb3IgdHJhbnNtaXR0aW5nL3JlY2VpdmluZyBhdWRpbyBmcmFtZSBkYXRhIChhbmQgc29tZSBvdmVyaGVhZHMsCisgKiBpLmU6IHBqbWVkaWFfZnJhbWUgc3RydWN0dXJlKSBhbW9uZyBjb25mZXJlbmNlIHBvcnRzIGluIHRoZSBhdWRpbworICogc3dpdGNoIGJvYXJkLiBGb3IgZXhhbXBsZSwgaWYgYSBwb3J0IHVzZXMgUENNIGZvcm1hdCBANDQxMDBIeiBtb25vCisgKiBhbmQgZnJhbWUgdGltZSAyMG1zLCB0aGUgUENNIGF1ZGlvIGRhdGEgd2lsbCByZXF1aXJlIDE3NjQgYnl0ZXMsCisgKiBzbyB3aXRoIG92ZXJoZWFkLCBhIHNhZmUgYnVmZmVyIHNpemUgd2lsbCBiZSB+MTkwMCBieXRlcy4KKyAqCisgKiBEZWZhdWx0OiBQSk1FRElBX01BWF9NVFUKKyAqLworI2lmbmRlZiBQSk1FRElBX0NPTkZfU1dJVENIX0JPQVJEX0JVRl9TSVpFCisjICAgZGVmaW5lIFBKTUVESUFfQ09ORl9TV0lUQ0hfQk9BUkRfQlVGX1NJWkUgICAgUEpNRURJQV9NQVhfTVRVCisjZW5kaWYKKworCisvKgorICogVHlwZXMgb2Ygc291bmQgc3RyZWFtIGJhY2tlbmRzLgorICovCisKKy8qKgorICogVGhpcyBtYWNybyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHJlbGVhc2VlIDEuMS4gUGxlYXNlIHNlZQorICogaHR0cDovL3RyYWMucGpzaXAub3JnL3JlcG9zL3dpa2kvQXVkaW9fRGV2X0FQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworI2lmIGRlZmluZWQoUEpNRURJQV9TT1VORF9JTVBMRU1FTlRBVElPTikKKyMgICBlcnJvciBQSk1FRElBX1NPVU5EX0lNUExFTUVOVEFUSU9OIGhhcyBiZWVuIGRlcHJlY2F0ZWQKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgbWFjcm8gaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiByZWxlYXNlZSAxLjEuIFBsZWFzZSBzZWUKKyAqIGh0dHA6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy93aWtpL0F1ZGlvX0Rldl9BUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNpZiBkZWZpbmVkKFBKTUVESUFfUFJFRkVSX0RJUkVDVF9TT1VORCkKKyMgICBlcnJvciBQSk1FRElBX1BSRUZFUl9ESVJFQ1RfU09VTkQgaGFzIGJlZW4gZGVwcmVjYXRlZAorI2VuZGlmCisKKy8qKgorICogVGhpcyBtYWNybyBjb250cm9scyB3aGV0aGVyIHRoZSBsZWdhY3kgc291bmQgZGV2aWNlIEFQSSBpcyB0byBiZQorICogaW1wbGVtZW50ZWQsIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBzdGlsbCB1c2UgdGhlIG9sZCBzb3VuZCBkZXZpY2UKKyAqIEFQSSAoc291bmQuaCkuIElmIHRoaXMgbWFjcm8gaXMgc2V0IHRvIG5vbi16ZXJvLCB0aGUgc291bmRfbGVnYWN5LmMKKyAqIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGNvbXBpbGF0aW9uLiBUaGUgc291bmRfbGVnYWN5LmMgaXMgYW4KKyAqIGltcGxlbWVudGF0aW9uIG9mIG9sZCBzb3VuZCBkZXZpY2UgKHNvdW5kLmgpIHVzaW5nIHRoZSBuZXcgQXVkaW8KKyAqIERldmljZSBBUEkuCisgKgorICogUGxlYXNlIHNlZSBodHRwOi8vdHJhYy5wanNpcC5vcmcvcmVwb3Mvd2lraS9BdWRpb19EZXZfQVBJIGZvciBtb3JlCisgKiBpbmZvLgorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0xFR0FDWV9TT1VORF9BUEkKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfTEVHQUNZX1NPVU5EX0FQSQkgICAgMQorI2VuZGlmCisKKy8qKgorICogU3BlY2lmeSBkZWZhdWx0IHNvdW5kIGRldmljZSBsYXRlbmN5LCBpbiBtaWxpc2Vjb25kLgorICovCisjaWZuZGVmIFBKTUVESUFfU05EX0RFRkFVTFRfUkVDX0xBVEVOQ1kKKyMgICBkZWZpbmUgUEpNRURJQV9TTkRfREVGQVVMVF9SRUNfTEFURU5DWSAgMTAwCisjZW5kaWYKKworLyoqCisgKiBTcGVjaWZ5IGRlZmF1bHQgc291bmQgZGV2aWNlIGxhdGVuY3ksIGluIG1pbGlzZWNvbmQuIAorICoKKyAqIERlZmF1bHQgaXMgMTYwbXMgZm9yIFdpbmRvd3MgTW9iaWxlIGFuZCAxNDBtcyBmb3Igb3RoZXIgcGxhdGZvcm1zLgorICovCisjaWZuZGVmIFBKTUVESUFfU05EX0RFRkFVTFRfUExBWV9MQVRFTkNZCisjICAgaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UhPTAKKyMJZGVmaW5lIFBKTUVESUFfU05EX0RFRkFVTFRfUExBWV9MQVRFTkNZCSAgICAxNjAKKyMgICBlbHNlCisjCWRlZmluZSBQSk1FRElBX1NORF9ERUZBVUxUX1BMQVlfTEFURU5DWQkgICAgMTQwCisjICAgZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBUeXBlcyBvZiBXU09MQSBiYWNrZW5kIGFsZ29yaXRobS4KKyAqLworCisvKioKKyAqIFRoaXMgZGVub3RlcyBpbXBsZW1lbnRhdGlvbiBvZiBXU09MQSB1c2luZyBudWxsIGFsZ29yaXRobS4gRXhwYW5zaW9uCisgKiB3aWxsIGdlbmVyYXRlIHplcm8gZnJhbWVzLCBhbmQgY29tcHJlc3Npb24gd2lsbCBqdXN0IGRpc2NhcmQgc29tZQorICogc2FtcGxlcyBmcm9tIHRoZSBpbnB1dC4KKyAqCisgKiBUaGlzIHR5cGUgb2YgaW1wbGVtZW50YXRpb24gbWF5IGJlIHVzZWQgYXMgaXQgcmVxdWlyZXMgdGhlIGxlYXN0CisgKiBwcm9jZXNzaW5nIHBvd2VyLgorICovCisjZGVmaW5lIFBKTUVESUFfV1NPTEFfSU1QX05VTEwJCSAgICAwCisKKy8qKgorICogVGhpcyBkZW5vdGVzIGltcGxlbWVudGF0aW9uIG9mIFdTT0xBIHVzaW5nIGZpeGVkIG9yIGZsb2F0aW5nIHBvaW50IFdTT0xBCisgKiBhbGdvcml0aG0uIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgdGhlIGJlc3QgcXVhbGl0eSBvZiB0aGUgcmVzdWx0LAorICogYXQgdGhlIGV4cGVuc2Ugb2Ygb25lIGZyYW1lIGRlbGF5IGFuZCBpbnRlbnNpdmUgcHJvY2Vzc2luZyBwb3dlciAKKyAqIHJlcXVpcmVtZW50LgorICovCisjZGVmaW5lIFBKTUVESUFfV1NPTEFfSU1QX1dTT0xBCQkgICAgMQorCisvKioKKyAqIFRoaXMgZGVub3RlcyBpbXBsZW1lbnRhdGlvbiBvZiBXU09MQSBhbGdvcml0aG0gd2l0aCBmYXN0ZXIgd2F2ZWZvcm0gCisgKiBzaW1pbGFyaXR5IGNhbGN1bGF0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGZhaXIgcXVhbGl0eSBvZiAKKyAqIHRoZSByZXN1bHQgd2l0aCB0aGUgbWFpbiBhZHZhbnRhZ2Ugb2YgbG93IHByb2Nlc3NpbmcgcG93ZXIgcmVxdWlyZW1lbnQuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9XU09MQV9JTVBfV1NPTEFfTElURQkgICAgMgorCisvKioKKyAqIFNwZWNpZnkgdHlwZSBvZiBXYXZlZm9ybSBiYXNlZCBTaW1pbGFyaXR5IE92ZXJsYXAgYW5kIEFkZCAoV1NPTEEpIGJhY2tlbmQKKyAqIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQuIFdTT0xBIGlzIGFuIGFsZ29yaXRobSB0byBleHBhbmQgYW5kL29yIGNvbXByZXNzIAorICogYXVkaW8gZnJhbWVzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBpdGNoLCBhbmQgdXNlZCBieSB0aGUgZGVsYXlidWYgYW5kIGFzIFBMQworICogYmFja2VuZCBhbGdvcml0aG0uCisgKgorICogRGVmYXVsdCBpcyBQSk1FRElBX1dTT0xBX0lNUF9XU09MQQorICovCisjaWZuZGVmIFBKTUVESUFfV1NPTEFfSU1QCisjICAgZGVmaW5lIFBKTUVESUFfV1NPTEFfSU1QCQkgICAgUEpNRURJQV9XU09MQV9JTVBfV1NPTEEKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB0aGUgZGVmYXVsdCBtYXhpbXVtIGR1cmF0aW9uIG9mIHN5bnRoZXRpYyBhdWRpbyB0aGF0IGlzIGdlbmVyYXRlZAorICogYnkgV1NPTEEuIFRoaXMgdmFsdWUgc2hvdWxkIGJlIGxvbmcgZW5vdWdoIHRvIGNvdmVyIGJ1cnN0IG9mIHBhY2tldCBsb3NzZXMuIAorICogYnV0IG5vdCB0b28gbG9uZywgYmVjYXVzZSBhcyB0aGUgZHVyYXRpb24gaW5jcmVhc2VzIHRoZSBxdWFsaXR5IHdvdWxkIAorICogZGVncmFkZSBjb25zaWRlcmFibHkuCisgKgorICogTm90ZSB0aGF0IHRoaXMgbGltaXQgaXMgb25seSBhcHBsaWVkIHdoZW4gZmFkaW5nIGlzIGVuYWJsZWQgaW4gdGhlIFdTT0xBCisgKiBzZXNzaW9uLgorICoKKyAqIERlZmF1bHQ6IDgwCisgKi8KKyNpZm5kZWYgUEpNRURJQV9XU09MQV9NQVhfRVhQQU5EX01TRUMKKyMgICBkZWZpbmUgUEpNRURJQV9XU09MQV9NQVhfRVhQQU5EX01TRUMgICAgODAKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSBXU09MQSB0ZW1wbGF0ZSBsZW5ndGgsIGluIG1pbGxpc2Vjb25kcy4gVGhlIGxvbmdlciB0aGUgdGVtcGxhdGUsCisgKiB0aGUgc21vb3RoZXIgc2lnbmFsIHRvIGJlIGdlbmVyYXRlZCBhdCB0aGUgZXhwZW5zZSBvZiBtb3JlIGNvbXB1dGF0aW9uCisgKiBuZWVkZWQsIHNpbmNlIHRoZSBhbGdvcml0aG0gd2lsbCBoYXZlIHRvIGNvbXBhcmUgbW9yZSBzYW1wbGVzIHRvIGZpbmQKKyAqIHRoZSBtb3N0IHNpbWlsYXIgcGl0Y2guCisgKgorICogRGVmYXVsdDogNQorICovCisjaWZuZGVmIFBKTUVESUFfV1NPTEFfVEVNUExBVEVfTEVOR1RIX01TRUMKKyMgICBkZWZpbmUgUEpNRURJQV9XU09MQV9URU1QTEFURV9MRU5HVEhfTVNFQwk1CisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgV1NPTEEgYWxnb3JpdGhtIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMuIFRoZSBhbGdvcml0aG0gZGVsYXkgaXMKKyAqIHVzZWQgdG8gbWVyZ2Ugc3ludGhldGljIHNhbXBsZXMgd2l0aCByZWFsIHNhbXBsZXMgaW4gdGhlIHRyYW5zaXRpb24KKyAqIGJldHdlZW4gcmVhbCB0byBzeW50aGV0aWMgYW5kIHZpY2UgdmVyc2EuIFRoZSBsb25nZXIgdGhlIGRlbGF5LCB0aGUgCisgKiBzbW9vdGhlciBzaWduYWwgdG8gYmUgZ2VuZXJhdGVkLCBhdCB0aGUgZXhwZW5zZSBvZiBsb25nZXIgbGF0ZW5jeSBhbmQKKyAqIGEgc2xpZ2h0eSBtb3JlIGNvbXB1dGF0aW9uLgorICoKKyAqIERlZmF1bHQ6IDUKKyAqLworI2lmbmRlZiBQSk1FRElBX1dTT0xBX0RFTEFZX01TRUMKKyMgICBkZWZpbmUgUEpNRURJQV9XU09MQV9ERUxBWV9NU0VDCSAgICA1CisjZW5kaWYKKworCisvKioKKyAqIFNldCB0aGlzIHRvIG5vbi16ZXJvIHRvIGRpc2FibGUgZmFkZS1vdXQvaW4gZWZmZWN0IGluIHRoZSBQTEMgd2hlbiBpdAorICogaW5zdHJ1Y3RzIFdTT0xBIHRvIGdlbmVyYXRlIHN5bnRoZXRpYyBmcmFtZXMuIFRoZSB1c2Ugb2YgZmFkaW5nIG1heQorICogb3IgbWF5IG5vdCBpbXByb3ZlIHRoZSBxdWFsaXR5IG9mIGF1ZGlvLCBkZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZgorICogcGFja2V0IGxvc3MgYW5kIHRoZSB0eXBlIG9mIGF1ZGlvIGlucHV0IChlLmcuIHNwZWVjaCB2cyBtdXNpYykuCisgKiBEaXNhYmxpbmcgZmFkaW5nIGFsc28gaW1wbGljaXRseSByZW1vdmUgdGhlIG1heGltdW0gbGltaXQgb2Ygc3ludGhldGljCisgKiBhdWRpbyBzYW1wbGVzIGdlbmVyYXRlZCBieSBXU09MQSAoc2VlIFBKTUVESUFfV1NPTEFfTUFYX0VYUEFORF9NU0VDKS4KKyAqCisgKiBEZWZhdWx0OiAwCisgKi8KKyNpZm5kZWYgUEpNRURJQV9XU09MQV9QTENfTk9fRkFESU5HCisjICAgZGVmaW5lIFBKTUVESUFfV1NPTEFfUExDX05PX0ZBRElORwkgICAgMAorI2VuZGlmCisKKworLyoqCisgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGNhbGxzIGJ5IHN0cmVhbSB0byB0aGUgUExDIHRvIGdlbmVyYXRlIHN5bnRoZXRpYworICogZnJhbWVzIHRvIHRoaXMgZHVyYXRpb24uIElmIHBhY2tldHMgYXJlIHN0aWxsIGxvc3QgYWZ0ZXIgdGhpcyBtYXhpbXVtCisgKiBkdXJhdGlvbiwgc2lsZW5jZSB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgc3RyZWFtIGluc3RlYWQuIFNpbmNlIHRoZQorICogUExDIG5vcm1hbGx5IHNob3VsZCBoYXZlIGl0cyBvd24gbGltaXQgb24gdGhlIG1heGltdW0gZHVyYXRpb24gb2YKKyAqIHN5bnRoZXRpYyBmcmFtZXMgdG8gYmUgZ2VuZXJhdGVkIChmb3IgUEpNRURJQSdzIFBMQywgdGhlIGxpbWl0IGlzCisgKiBQSk1FRElBX1dTT0xBX01BWF9FWFBBTkRfTVNFQyksIHdlIGNhbiBzZXQgdGhpcyB2YWx1ZSB0byBhIGxhcmdlIG51bWJlcgorICogdG8gZ2l2ZSBhZGRpdGlvbmFsIGZsZXhpYmlsaXR5IHNob3VsZCB0aGUgUExDIHdhbnRzIHRvIGRvIHNvbWV0aGluZworICogY2xldmVyIHdpdGggdGhlIGxvc3QgZnJhbWVzLgorICoKKyAqIERlZmF1bHQ6IDI0MCBtcworICovCisjaWZuZGVmIFBKTUVESUFfTUFYX1BMQ19EVVJBVElPTl9NU0VDCisjICAgZGVmaW5lIFBKTUVESUFfTUFYX1BMQ19EVVJBVElPTl9NU0VDICAgIDI0MAorI2VuZGlmCisKKworLyoqCisgKiBTcGVjaWZ5IG51bWJlciBvZiBzb3VuZCBidWZmZXJzLiBMYXJnZXIgbnVtYmVyIGlzIGJldHRlciBmb3Igc291bmQKKyAqIHN0YWJpbGl0eSBhbmQgdG8gYWNjb21tb2RhdGUgc291bmQgZGV2aWNlcyB0aGF0IGFyZSB1bmFibGUgdG8gc2VuZCBmcmFtZXMKKyAqIGluIHRpbWVseSBtYW5uZXIsIGhvd2V2ZXIgaXQgd291bGQgcHJvYmFibHkgY2F1c2UgbW9yZSBhdWRpbyBkZWxheSAoYW5kIAorICogZGVmaW5pdGVseSB3aWxsIHRha2UgbW9yZSBtZW1vcnkpLiBPbmUgaW5kaXZpZHVhbCBidWZmZXIgaXMgbm9ybWFsbHkgMTBtcworICogb3IgMjAgbXMgbG9uZywgZGVwZW5kaW5nIG9uIHB0aW1lIHNldHRpbmdzIChzYW1wbGVzX3Blcl9mcmFtZSB2YWx1ZSkuCisgKgorICogVGhlIHNldHRpbmcgaGVyZSBjdXJyZW50bHkgaXMgdXNlZCBieSB0aGUgY29uZmVyZW5jZSBicmlkZ2UsIHRoZSBzcGxpdHRlcgorICogY29tYmluZXIgcG9ydCwgYW5kIGRzb3VuZC5jLgorICoKKyAqIERlZmF1bHQ6IChQSk1FRElBX1NORF9ERUZBVUxUX1BMQVlfTEFURU5DWSsyMCkvMjAKKyAqLworI2lmbmRlZiBQSk1FRElBX1NPVU5EX0JVRkZFUl9DT1VOVAorIyAgIGRlZmluZSBQSk1FRElBX1NPVU5EX0JVRkZFUl9DT1VOVAkgICAgKChQSk1FRElBX1NORF9ERUZBVUxUX1BMQVlfTEFURU5DWSsyMCkvMjApCisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgd2hpY2ggQS1sYXcvVS1sYXcgY29udmVyc2lvbiBhbGdvcml0aG0gdG8gdXNlLgorICogQnkgZGVmYXVsdCB0aGUgY29udmVyc2lvbiBhbGdvcml0aG0gdXNlcyBBLWxhdy9VLWxhdyB0YWJsZSB3aGljaCBnaXZlcworICogdGhlIGJlc3QgcGVyZm9ybWFuY2UsIGF0IHRoZSBleHBlbnNlIG9mIDMzIEtCeXRlcyBvZiBzdGF0aWMgZGF0YS4KKyAqIElmIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLCBhIHNtYWxsZXIgYnV0IHNsb3dlciBhbGdvcml0aG0gd2lsbCBiZSB1c2VkLgorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0FMQVdfVUxBV19UQUJMRQorIyAgIGRlZmluZSBQSk1FRElBX0hBU19BTEFXX1VMQVdfVEFCTEUJICAgIDEKKyNlbmRpZgorCisKKy8qKgorICogVW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UsIEc3MTEgY29kZWMgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19HNzExX0NPREVDCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0c3MTFfQ09ERUMJICAgIDEKKyNlbmRpZgorCisKKy8qCisgKiBXYXJuIGFib3V0IG9ic29sZXRlIG1hY3Jvcy4KKyAqCisgKiBQSk1FRElBX0hBU19TTUFMTF9GSUxURVIgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiAwLjcuCisgKi8KKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NNQUxMX0ZJTFRFUikKKyMgICBpZmRlZiBfTVNDX1ZFUgorIwlwcmFnbWEgbWVzc2FnZSgiV2FybmluZzogUEpNRURJQV9IQVNfU01BTExfRklMVEVSIG1hY3JvIGlzIGRlcHJlY2F0ZWQiXAorCQkgICAgICAgIiBhbmQgaGFzIG5vIGVmZmVjdCIpCisjICAgZWxzZQorIwl3YXJuaW5nICJQSk1FRElBX0hBU19TTUFMTF9GSUxURVIgbWFjcm8gaXMgZGVwcmVjYXRlZCBhbmQgaGFzIG5vIGVmZmVjdCIKKyMgICBlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFdhcm4gYWJvdXQgb2Jzb2xldGUgbWFjcm9zLgorICoKKyAqIFBKTUVESUFfSEFTX0xBUkdFX0ZJTFRFUiBoYXMgYmVlbiBkZXByZWNhdGVkIGluIDAuNy4KKyAqLworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfTEFSR0VfRklMVEVSKQorIyAgIGlmZGVmIF9NU0NfVkVSCisjCXByYWdtYSBtZXNzYWdlKCJXYXJuaW5nOiBQSk1FRElBX0hBU19MQVJHRV9GSUxURVIgbWFjcm8gaXMgZGVwcmVjYXRlZCJcCisJCSAgICAgICAiIGFuZCBoYXMgbm8gZWZmZWN0IikKKyMgICBlbHNlCisjCXdhcm5pbmcgIlBKTUVESUFfSEFTX0xBUkdFX0ZJTFRFUiBtYWNybyBpcyBkZXByZWNhdGVkIgorIyAgIGVuZGlmCisjZW5kaWYKKworCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSBvYnNvbGV0ZSBpbiAwLjcuMSBzbyBpdCB3aWxsIHRyaWdnZXIgY29tcGlsYXRpb24gZXJyb3IuCisgKiBQbGVhc2UgdXNlIFBKTUVESUFfUkVTQU1QTEVfSU1QIHRvIHNlbGVjdCB0aGUgcmVzYW1wbGUgaW1wbGVtZW50YXRpb24KKyAqIHRvIHVzZS4KKyAqLworI2lmZGVmIFBKTUVESUFfSEFTX0xJQlJFU0FNUExFCisjICAgZXJyb3IgIlBKTUVESUFfSEFTX0xJQlJFU0FNUExFIG1hY3JvIGlzIGRlcHJlY2F0ZWQuIFVzZSAnI2RlZmluZSBQSk1FRElBX1JFU0FNUExFX0lNUCBQSk1FRElBX1JFU0FNUExFX0xJQlJFU0FNUExFJyIKKyNlbmRpZgorCisjaWZkZWYgUEpNRURJQV9IQVNfU1BFRVhfUkVTQU1QTEUKKyMgICBlcnJvciAiUEpNRURJQV9IQVNfU1BFRVhfUkVTQU1QTEUgbWFjcm8gaXMgZGVwcmVjYXRlZC4gVXNlICcjZGVmaW5lIFBKTUVESUFfUkVTQU1QTEVfSU1QIFBKTUVESUFfUkVTQU1QTEVfU1BFRVgnIgorI2VuZGlmCisKKworLyoKKyAqIFNhbXBsZSByYXRlIGNvbnZlcnNpb24gYmFja2VuZHMuCisgKiBTZWxlY3Qgb25lIG9mIHRoZXNlIGJhY2tlbmRzIGluIFBKTUVESUFfUkVTQU1QTEVfSU1QLgorICovCisjZGVmaW5lIFBKTUVESUFfUkVTQU1QTEVfTk9ORQkJICAgIDEJLyoqPCBObyByZXNhbXBsaW5nLgkgICAgKi8KKyNkZWZpbmUgUEpNRURJQV9SRVNBTVBMRV9MSUJSRVNBTVBMRQkgICAgMgkvKio8IFNhbXBsZSByYXRlIGNvbnZlcnNpb24gCisJCQkJCQkgICAgIHVzaW5nIGxpYnJlc2FtcGxlLiAgKi8KKyNkZWZpbmUgUEpNRURJQV9SRVNBTVBMRV9TUEVFWAkJICAgIDMJLyoqPCBTYW1wbGUgcmF0ZSBjb252ZXJzaW9uIAorCQkJCQkJICAgICB1c2luZyBTcGVleC4gKi8KKyNkZWZpbmUgUEpNRURJQV9SRVNBTVBMRV9MSUJTQU1QTEVSQVRFCSAgICA0CS8qKjwgU2FtcGxlIHJhdGUgY29udmVyc2lvbiAKKwkJCQkJCSAgICAgdXNpbmcgbGlic2FtcGxlcmF0ZSAKKwkJCQkJCSAgICAgKGEuay5hIFNlY3JldCBSYWJiaXQgQ29kZSkKKwkJCQkJCSAqLworCisvKioKKyAqIFNlbGVjdCB3aGljaCByZXNhbXBsZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuIEN1cnJlbnRseSBwam1lZGlhIHN1cHBvcnRzOgorICogIC0gI1BKTUVESUFfUkVTQU1QTEVfTElCUkVTQU1QTEUsIHRvIHVzZSBsaWJyZXNhbXBsZS0xLjcsIHRoaXMgaXMgdGhlIGRlZmF1bHQKKyAqICAgIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQuCisgKiAgLSAjUEpNRURJQV9SRVNBTVBMRV9MSUJTQU1QTEVSQVRFLCB0byB1c2UgbGlic2FtcGxlcmF0ZSBpbXBsZW1lbnRhdGlvbgorICogICAgKGEuay5hLiBTZWNyZXQgUmFiYml0IENvZGUpLgorICogIC0gI1BKTUVESUFfUkVTQU1QTEVfU1BFRVgsIHRvIHVzZSBleHBlcmltZW50YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBpbgorICogICAgU3BlZXggbGlicmFyeS4KKyAqICAtICNQSk1FRElBX1JFU0FNUExFX05PTkUsIHRvIGRpc2FibGUgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4gQW55IGNhbGxzIHRvCisgKiAgICByZXNhbXBsZSBmdW5jdGlvbiB3aWxsIHJldHVybiBlcnJvci4KKyAqCisgKiBEZWZhdWx0IGlzIFBKTUVESUFfUkVTQU1QTEVfTElCUkVTQU1QTEUKKyAqLworI2lmbmRlZiBQSk1FRElBX1JFU0FNUExFX0lNUAorIyAgIGRlZmluZSBQSk1FRElBX1JFU0FNUExFX0lNUAkJICAgIFBKTUVESUFfUkVTQU1QTEVfTElCUkVTQU1QTEUKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB3aGV0aGVyIGxpYnNhbXBsZXJhdGUsIHdoZW4gdXNlZCwgc2hvdWxkIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisgKiBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgZm9yIFZpc3VhbCBTdHVkaW8KKyAqIHByb2plY3RzLCBhbmQgd2hlbiB0aGlzIHN0YXRpYyBsaW5raW5nIGlzIGVuYWJsZWQKKyAqLworCisKKy8qKgorICogRGVmYXVsdCBmaWxlIHBsYXllci93cml0ZXIgYnVmZmVyIHNpemUuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9GSUxFX1BPUlRfQlVGU0laRQorIyAgIGRlZmluZSBQSk1FRElBX0ZJTEVfUE9SVF9CVUZTSVpFCQk0MDAwCisjZW5kaWYKKworCisvKioKKyAqIE1heGltdW0gZnJhbWUgZHVyYXRpb24gKGluIG1zZWMpIHRvIGJlIHN1cHBvcnRlZC4KKyAqIFRoaXMgKGFtb25nIG90aGVyIHRoaW5nKSB3aWxsIGFmZmVjdCB0aGUgc2l6ZSBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogZm9yIG91dGdvaW5nIHBhY2tldHMuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9NQVhfRlJBTUVfRFVSQVRJT05fTVMgICAKKyMgICBkZWZpbmUgUEpNRURJQV9NQVhfRlJBTUVfRFVSQVRJT05fTVMgICAJMjAwCisjZW5kaWYKKworCisvKioKKyAqIE1heCBwYWNrZXQgc2l6ZSBmb3IgdHJhbnNtaXR0aW5nIGRpcmVjdGlvbi4KKyAqLworI2lmbmRlZiBQSk1FRElBX01BWF9NVFUJCQkKKyMgIGRlZmluZSBQSk1FRElBX01BWF9NVFUJCQkxNTAwCisjZW5kaWYKKworCisvKioKKyAqIE1heCBwYWNrZXQgc2l6ZSBmb3IgcmVjZWl2aW5nIGRpcmVjdGlvbi4KKyAqLworI2lmbmRlZiBQSk1FRElBX01BWF9NUlUJCQkKKyMgIGRlZmluZSBQSk1FRElBX01BWF9NUlUJCQkyMDAwCisjZW5kaWYKKworCisvKioKKyAqIERUTUYvdGVsZXBob25lLWV2ZW50IGR1cmF0aW9uLCBpbiB0aW1lc3RhbXAuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9EVE1GX0RVUkFUSU9OCQkKKyMgIGRlZmluZSBQSk1FRElBX0RUTUZfRFVSQVRJT04JCQkxNjAwCS8qIGluIHRpbWVzdGFtcCAqLworI2VuZGlmCisKKworLyoqCisgKiBOdW1iZXIgb2YgUlRQIHBhY2tldHMgcmVjZWl2ZWQgZnJvbSBkaWZmZXJlbnQgc291cmNlIElQIGFkZHJlc3MgZnJvbSB0aGUKKyAqIHJlbW90ZSBhZGRyZXNzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIHN0cmVhbSBzd2l0Y2ggdHJhbnNtaXNzaW9uCisgKiB0byB0aGUgc291cmNlIGFkZHJlc3MuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9SVFBfTkFUX1BST0JBVElPTl9DTlQJCisjICBkZWZpbmUgUEpNRURJQV9SVFBfTkFUX1BST0JBVElPTl9DTlQJCTEwCisjZW5kaWYKKworCisvKioKKyAqIE51bWJlciBvZiBSVENQIHBhY2tldHMgcmVjZWl2ZWQgZnJvbSBkaWZmZXJlbnQgc291cmNlIElQIGFkZHJlc3MgZnJvbSB0aGUKKyAqIHJlbW90ZSBhZGRyZXNzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIHN0cmVhbSBzd2l0Y2ggUlRDUCB0cmFuc21pc3Npb24KKyAqIHRvIHRoZSBzb3VyY2UgYWRkcmVzcy4KKyAqLworI2lmbmRlZiBQSk1FRElBX1JUQ1BfTkFUX1BST0JBVElPTl9DTlQKKyMgIGRlZmluZSBQSk1FRElBX1JUQ1BfTkFUX1BST0JBVElPTl9DTlQJMworI2VuZGlmCisKKworLyoqCisgKiBTcGVjaWZ5IHdoZXRoZXIgUlRDUCBzaG91bGQgYmUgYWR2ZXJ0aXNlZCBpbiBTRFAuIFRoaXMgc2V0dGluZyB3b3VsZAorICogYWZmZWN0IHdoZXRoZXIgUlRDUCBjYW5kaWRhdGUgd2lsbCBiZSBhZGRlZCBpbiBTRFAgd2hlbiBJQ0UgaXMgdXNlZC4KKyAqIEFwcGxpY2F0aW9uIG1pZ2h0IHdhbnQgdG8gZGlzYWJsZSBSVENQIGFkdmVydGlzZW1lbnQgaW4gU0RQIHRvCisgKiByZWR1Y2UgdGhlIG1lc3NhZ2Ugc2l6ZS4KKyAqCisgKiBEZWZhdWx0OiAxICh5ZXMpCisgKi8KKyNpZm5kZWYgUEpNRURJQV9BRFZFUlRJU0VfUlRDUAorIyAgIGRlZmluZSBQSk1FRElBX0FEVkVSVElTRV9SVENQCQkxCisjZW5kaWYKKworCisvKioKKyAqIEludGVydmFsIHRvIHNlbmQgUlRDUCBwYWNrZXRzLCBpbiBtc2VjCisgKi8KKyNpZm5kZWYgUEpNRURJQV9SVENQX0lOVEVSVkFMCisjCWRlZmluZSBQSk1FRElBX1JUQ1BfSU5URVJWQUwJCTUwMDAJLyogbXNlYyovCisjZW5kaWYKKworCisvKioKKyAqIFRlbGwgUlRDUCB0byBpZ25vcmUgdGhlIGZpcnN0IE4gcGFja2V0cyB3aGVuIGNhbGN1bGF0aW5nIHRoZQorICogaml0dGVyIHN0YXRpc3RpY3MuIEZyb20gZXhwZXJpbWVudGF0aW9uLCB0aGUgZmlyc3QgZmV3IHBhY2tldHMKKyAqICgyNSBvciBzbykgaGF2ZSByZWxhdGl2ZWx5IGJpZyBqaXR0ZXIsIHBvc3NpYmx5IGJlY2F1c2UgZHVyaW5nCisgKiB0aGlzIHRpbWUsIHRoZSBwcm9ncmFtIGlzIGFsc28gYnVzeSBzZXR0aW5nIHVwIHRoZSBzaWduYWxpbmcsCisgKiBzbyB0aGV5IG1ha2UgdGhlIGF2ZXJhZ2Ugaml0dGVyIGJpZy4KKyAqCisgKiBEZWZhdWx0OiAyNS4KKyAqLworI2lmbmRlZiBQSk1FRElBX1JUQ1BfSUdOT1JFX0ZJUlNUX1BBQ0tFVFMKKyMgICBkZWZpbmUgIFBKTUVESUFfUlRDUF9JR05PUkVfRklSU1RfUEFDS0VUUwkyNQorI2VuZGlmCisKKworLyoqCisgKiBTcGVjaWZ5IHdoZXRoZXIgUlRDUCBzdGF0aXN0aWNzIGluY2x1ZGVzIHJhdyBqaXR0ZXIgc3RhdGlzdGljcy4KKyAqIFJhdyBqaXR0ZXIgaXMgZGVmaW5lZCBhcyBhYnNvbHV0ZSB2YWx1ZSBvZiBuZXR3b3JrIHRyYW5zaXQgdGltZQorICogZGlmZmVyZW5jZSBvZiB0d28gY29uc2VjdXRpdmUgcGFja2V0czsgcmVmZXJpbmcgdG8gImRpZmZlcmVuY2UgRCIKKyAqIHRlcm0gaW4gaW50ZXJhcnJpdmFsIGppdHRlciBjYWxjdWxhdGlvbiBpbiBSRkMgMzU1MCBzZWN0aW9uIDYuNC4xLgorICoKKyAqIERlZmF1bHQ6IDAgKG5vKS4KKyAqLworI2lmbmRlZiBQSk1FRElBX1JUQ1BfU1RBVF9IQVNfUkFXX0pJVFRFUgorIyAgIGRlZmluZSBQSk1FRElBX1JUQ1BfU1RBVF9IQVNfUkFXX0pJVFRFUgkwCisjZW5kaWYKKworLyoqCisgKiBTcGVjaWZ5IHRoZSBmYWN0b3Igd2l0aCB3aWNoIFJUQ1AgUlRUIHN0YXRpc3RpY3Mgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgCisgKiBpZiBleGNlcHRpb25hbGx5IGhpZ2guIEZvciBlLmcuIG1vYmlsZSBuZXR3b3JrcyB3aXRoIHBvdGVudGlhbGx5IGxhcmdlCisgKiBmbHVjdHVhdGlvbnMsIHRoaXMgbWlnaHQgYmUgdW53YW50ZWQuCisgKgorICogVXNlICgwKSB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAqCisgKiBEZWZhdWx0OiAzLgorICovCisjaWZuZGVmIFBKTUVESUFfUlRDUF9OT1JNQUxJWkVfRkFDVE9SCisjICAgZGVmaW5lIFBKTUVESUFfUlRDUF9OT1JNQUxJWkVfRkFDVE9SCTMKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB3aGV0aGVyIFJUQ1Agc3RhdGlzdGljcyBpbmNsdWRlcyBJUCBEZWxheSBWYXJpYXRpb24gc3RhdGlzdGljcy4KKyAqIElQRFYgaXMgZGVmaW5lZCBhcyBuZXR3b3JrIHRyYW5zaXQgdGltZSBkaWZmZXJlbmNlIG9mIHR3byBjb25zZWN1dGl2ZQorICogcGFja2V0cy4gVGhlIElQRFYgc3RhdGlzdGljIGNhbiBiZSB1c2VmdWwgdG8gaW5zcGVjdCBjbG9jayBza2V3IGV4aXN0YW5jZQorICogYW5kIGxldmVsLCBlLmc6IHdoZW4gdGhlIElQRFYgbWVhbiB2YWx1ZXMgd2VyZSBzdGFibGUgaW4gcG9zaXRpdmUgbnVtYmVycywKKyAqIHRoZW4gdGhlIHJlbW90ZSBjbG9jayAodXNlZCBpbiBzZW5kaW5nIFJUUCBwYWNrZXRzKSBpcyBmYXN0ZXIgdGhhbiBsb2NhbAorICogc3lzdGVtIGNsb2NrLiBJZGVhbGx5LCB0aGUgSVBEViBtZWFuIHZhbHVlcyBhcmUgYWx3YXlzIGVxdWFsIHRvIDAuCisgKgorICogRGVmYXVsdDogMCAobm8pLgorICovCisjaWZuZGVmIFBKTUVESUFfUlRDUF9TVEFUX0hBU19JUERWCisjICAgZGVmaW5lIFBKTUVESUFfUlRDUF9TVEFUX0hBU19JUERWCQkwCisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgd2hldGhlciBSVENQIFhSIHN1cHBvcnQgc2hvdWxkIGJlIGJ1aWx0IGludG8gUEpNRURJQS4gRGlzYWJsaW5nCisgKiB0aGlzIGZlYXR1cmUgd2lsbCByZWR1Y2UgZm9vdHByaW50IHNsaWdodGx5LiBOb3RlIHRoYXQgZXZlbiB3aGVuIHRoaXMgCisgKiBzZXR0aW5nIGlzIGVuYWJsZWQsIFJUQ1AgWFIgcHJvY2Vzc2luZyB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGluIHN0cmVhbSAKKyAqIGlmIGl0IGlzIGVuYWJsZWQgb24gcnVuLXRpbWUgb24gcGVyIHN0cmVhbSBiYXNpcy4gU2VlICAKKyAqIFBKTUVESUFfU1RSRUFNX0VOQUJMRV9YUiBzZXR0aW5nIGZvciBtb3JlIGluZm8uCisgKgorICogRGVmYXVsdDogMCAobm8pLgorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX1JUQ1BfWFIKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfUlRDUF9YUgkJCTAKKyNlbmRpZgorCisKKy8qKgorICogVGhlIFJUQ1AgWFIgZmVhdHVyZSBpcyBhY3RpdmF0ZWQgYW5kIHVzZWQgYnkgc3RyZWFtIGlmIFxhIGVuYWJsZV9ydGNwX3hyCisgKiBmaWVsZCBvZiBcYSBwam1lZGlhX3N0cmVhbV9pbmZvIHN0cnVjdHVyZSBpcyBub24temVyby4gVGhpcyBzZXR0aW5nIAorICogY29udHJvbHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBmaWVsZC4KKyAqCisgKiBEZWZhdWx0OiAwIChkaXNhYmxlZCkKKyAqLworI2lmbmRlZiBQSk1FRElBX1NUUkVBTV9FTkFCTEVfWFIKKyMgICBkZWZpbmUgUEpNRURJQV9TVFJFQU1fRU5BQkxFX1hSCQkwCisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgdGhlIGJ1ZmZlciBsZW5ndGggZm9yIHN0b3JpbmcgYW55IHJlY2VpdmVkIFJUQ1AgU0RFUyB0ZXh0CisgKiBpbiBhIHN0cmVhbSBzZXNzaW9uLiBVc3VhbGx5IFJUQ1AgY29udGFpbnMgb25seSB0aGUgbWFuZGF0b3J5IFNERVMKKyAqIGZpZWxkLCBpLmU6IENOQU1FLgorICogCisgKiBEZWZhdWx0OiA2NCBieXRlcy4KKyAqLworI2lmbmRlZiBQSk1FRElBX1JUQ1BfUlhfU0RFU19CVUZfTEVOCisjICAgZGVmaW5lIFBKTUVESUFfUlRDUF9SWF9TREVTX0JVRl9MRU4JCTY0CisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgaG93IGxvbmcgKGluIG1pbGlzZWNvbmRzKSB0aGUgc3RyZWFtIHNob3VsZCBzdXNwZW5kIHRoZQorICogc2lsZW5jZSBkZXRlY3Rvci92b2ljZSBhY3Rpdml0eSBkZXRlY3RvciAoVkFEKSBkdXJpbmcgdGhlIGluaXRpYWwKKyAqIHBlcmlvZCBvZiB0aGUgc2Vzc2lvbi4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCB0byBvcGVuIGJpbmRpbmdzIGluCisgKiBhbGwgTkFUIHJvdXRlcnMgYmV0d2VlbiBsb2NhbCBhbmQgcmVtb3RlIGVuZHBvaW50IHNpbmNlIG1vc3QgTkFUcworICogZG8gbm90IGFsbG93IGluY29taW5nIHBhY2tldCB0byBnZXQgaW4gYmVmb3JlIGxvY2FsIGVuZHBvaW50IHNlbmRzCisgKiBvdXRnb2luZyBwYWNrZXRzLgorICoKKyAqIFNwZWNpZnkgemVybyB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAqCisgKiBEZWZhdWx0OiA2MDAgbXNlYyAod2hpY2ggZ2l2ZXMgZ29vZCBwcm9iYWJpbGl0eSB0aGF0IHNvbWUgUlRQIAorICogICAgICAgICAgICAgICAgICAgIHBhY2tldHMgd2lsbCByZWFjaCB0aGUgZGVzdGluYXRpb24sIGJ1dCB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgICAgZmlsbGluZyB1cCB0aGUgaml0dGVyIGJ1ZmZlciBvbiB0aGUgcmVtb3RlIGVuZCkuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TVFJFQU1fVkFEX1NVU1BFTkRfTVNFQworIyAgIGRlZmluZSBQSk1FRElBX1NUUkVBTV9WQURfU1VTUEVORF9NU0VDCTYwMAorI2VuZGlmCisKKy8qKgorICogUGVyZm9ybSBSVFAgcGF5bG9hZCB0eXBlIGNoZWNraW5nIGluIHRoZSBzdHJlYW0uIE5vcm1hbGx5IHRoZSBwZWVyCisgKiBNVVNUIHNlbmQgUlRQIHdpdGggcGF5bG9hZCB0eXBlIGFzIHdlIHNwZWNpZmllZCBpbiBvdXIgU0RQLiBDZXJ0YWluCisgKiBhZ2VudHMgbWF5IG5vdCBiZSBhYmxlIHRvIGZvbGxvdyB0aGlzIGhlbmNlIHRoZSBvbmx5IHdheSB0byBoYXZlCisgKiBjb21tdW5pY2F0aW9uIGlzIHRvIGRpc2FibGUgdGhpcyBjaGVjay4KKyAqCisgKiBEZWZhdWx0OiAxCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TVFJFQU1fQ0hFQ0tfUlRQX1BUCisjICAgZGVmaW5lIFBKTUVESUFfU1RSRUFNX0NIRUNLX1JUUF9QVAkJMQorI2VuZGlmCisKKy8qKgorICogUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciBhcHBsaWNhdGlvbiBleHRyYSBkYXRhLCBlLmc6IFNSVFAgYXV0aCB0YWcsCisgKiBpbiBSVFAgcGF5bG9hZCwgc28gdGhlIHRvdGFsIHBheWxvYWQgbGVuZ3RoIHdpbGwgbm90IGV4Y2VlZCB0aGUgTVRVLgorICovCisjaWZuZGVmIFBKTUVESUFfU1RSRUFNX1JFU1ZfUEFZTE9BRF9MRU4KKyMgICBkZWZpbmUgUEpNRURJQV9TVFJFQU1fUkVTVl9QQVlMT0FEX0xFTgkyMAorI2VuZGlmCisKKworLyoqCisgKiBTcGVjaWZ5IHRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIHNpbGVuY2UgcGVyaW9kIGluIHRoZSBjb2RlYywgaW4gbXNlYy4gCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZXhhbXBsZSB0byBrZWVwIE5BVCBiaW5kaW5nIG9wZW4gaW4gdGhlIGZpcmV3YWxsCisgKiBhbmQgdG8gcHJldmVudCBzZXJ2ZXIgZnJvbSBkaXNjb25uZWN0aW5nIHRoZSBjYWxsIGJlY2F1c2Ugbm8gCisgKiBSVFAgcGFja2V0IGlzIHJlY2VpdmVkLgorICoKKyAqIFRoaXMgb25seSBhcHBsaWVzIHRvIGNvZGVjcyB0aGF0IHVzZSBQSk1FRElBJ3MgVkFEIChwcmV0dHkgbXVjaAorICogZXZlcnl0aGluZyBpbmNsdWRpbmcgaUxCQywgZXhjZXB0IFNwZWV4LCB3aGljaCBoYXMgaXRzIG93biBEVFggCisgKiBtZWNoYW5pc20pLgorICoKKyAqIFVzZSAoLTEpIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorICoKKyAqIERlZmF1bHQ6IDUwMDAgbXMKKyAqCisgKi8KKyNpZm5kZWYgUEpNRURJQV9DT0RFQ19NQVhfU0lMRU5DRV9QRVJJT0QKKyMgICBkZWZpbmUgUEpNRURJQV9DT0RFQ19NQVhfU0lMRU5DRV9QRVJJT0QJNTAwMAorI2VuZGlmCisKKworLyoqCisgKiBTdWdnZXN0ZWQgb3IgZGVmYXVsdCB0aHJlc2hvbGQgdG8gYmUgc2V0IGZvciBmaXhlZCBzaWxlbmNlIGRldGVjdGlvbgorICogb3IgYXMgc3RhcnRpbmcgdGhyZXNob2xkIGZvciBhZGFwdGl2ZSBzaWxlbmNlIGRldGVjdGlvbi4gVGhlIHRocmVzaG9sZAorICogaGFzIHRoZSByYW5nZSBmcm9tIHplcm8gdG8gMHhGRkZGLgorICovCisjaWZuZGVmIFBKTUVESUFfU0lMRU5DRV9ERVRfVEhSRVNIT0xECisjICAgZGVmaW5lIFBKTUVESUFfU0lMRU5DRV9ERVRfVEhSRVNIT0xECTQKKyNlbmRpZgorCisKKy8qKgorICogTWF4aW11bSBzaWxlbmNlIHRocmVzaG9sZCBpbiB0aGUgc2lsZW5jZSBkZXRlY3Rvci4gVGhlIHNpbGVuY2UgZGV0ZWN0b3IKKyAqIHdpbGwgbm90IGN1dCB0aGUgYXVkaW8gdHJhbnNtaXNzaW9uIGlmIHRoZSBhdWRpbyBsZXZlbCBpcyBhYm92ZSB0aGlzCisgKiBsZXZlbC4KKyAqCisgKiBVc2UgMHgxMDAwMCAob3IgZ3JlYXRlcikgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgKgorICogRGVmYXVsdDogMHgxMDAwMCAoZGlzYWJsZWQpCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TSUxFTkNFX0RFVF9NQVhfVEhSRVNIT0xECisjICAgZGVmaW5lIFBKTUVESUFfU0lMRU5DRV9ERVRfTUFYX1RIUkVTSE9MRAkweDEwMDAwCisjZW5kaWYKKworCisvKioKKyAqIFNwZWV4IEFjY291c3RpYyBFY2hvIENhbmNlbGxhdGlvbiAoQUVDKS4KKyAqIEJ5IGRlZmF1bHQgaXMgZW5hYmxlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19TUEVFWF9BRUMKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfU1BFRVhfQUVDCQkxCisjZW5kaWYKKworCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gU0RQIGZtdHAgYXR0cmlidXRlLgorICoKKyAqIERlZmF1bHQ6IDE2CisgKi8KKyNpZm5kZWYgUEpNRURJQV9DT0RFQ19NQVhfRk1UUF9DTlQKKyMgICBkZWZpbmUgUEpNRURJQV9DT0RFQ19NQVhfRk1UUF9DTlQJCTE2CisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgc3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgU0RQIG5lZ290aWF0b3Igd2hlbiByZXNwb25kaW5nIHRvIGFuCisgKiBvZmZlciwgd2hldGhlciBpdCBzaG91bGQgcmF0aGVyIHVzZSB0aGUgY29kZWMgcHJlZmVyZW5jZSBhcyBzZXQgYnkKKyAqIHJlbW90ZSwgb3Igc2hvdWxkIGl0IHJhdGhlciB1c2UgdGhlIGNvZGVjIHByZWZlcmVuY2UgYXMgc3BlY2lmaWVkIGJ5CisgKiBsb2NhbCBlbmRwb2ludC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSBpbmNvbWluZyBjYWxsIGhhcyBjb2RlYyBvcmRlciAiOCAwIDMiLCB3aGlsZSAKKyAqIGxvY2FsIGNvZGVjIG9yZGVyIGlzICIzIDAgOCIuIElmIHJlbW90ZSBjb2RlYyBvcmRlciBpcyBwcmVmZXJhYmxlLAorICogdGhlIHNlbGVjdGVkIGNvZGVjIHdpbGwgYmUgOCwgd2hpbGUgaWYgbG9jYWwgY29kZWMgb3JkZXIgaXMgcHJlZmVyYWJsZSwKKyAqIHRoZSBzZWxlY3RlZCBjb2RlYyB3aWxsIGJlIDMuCisgKgorICogSWYgc2V0IHRvIG5vbi16ZXJvLCB0aGUgbmVnb3RpYXRvciB3aWxsIHVzZSB0aGUgY29kZWMgb3JkZXIgYXMgc3BlY2lmaWVkCisgKiBieSByZW1vdGUgaW4gdGhlIG9mZmVyLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGR1cmluZyBydW4tdGltZSBieSBjYWxsaW5nCisgKiBwam1lZGlhX3NkcF9uZWdfc2V0X3ByZWZlcl9yZW1vdGVfY29kZWNfb3JkZXIoKS4KKyAqCisgKiBEZWZhdWx0IGlzIDEgKHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TRFBfTkVHX1BSRUZFUl9SRU1PVEVfQ09ERUNfT1JERVIKKyMgICBkZWZpbmUgUEpNRURJQV9TRFBfTkVHX1BSRUZFUl9SRU1PVEVfQ09ERUNfT1JERVIJMQorI2VuZGlmCisKKy8qKgorICogVGhpcyBzcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBTRFAgbmVnb3RpYXRvciB3aGVuIHJlc3BvbmRpbmcgdG8gYW4KKyAqIG9mZmVyLCB3aGV0aGVyIGl0IHNob3VsZCBhbnN3ZXIgd2l0aCBtdWx0aXBsZSBmb3JtYXRzIG9yIG5vdC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBkdXJpbmcgcnVuLXRpbWUgYnkgY2FsbGluZworICogcGptZWRpYV9zZHBfbmVnX3NldF9hbGxvd19tdWx0aXBsZV9jb2RlY3MoKS4KKyAqCisgKiBEZWZhdWx0IGlzIDAgKHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TRFBfTkVHX0FOU1dFUl9NVUxUSVBMRV9DT0RFQ1MKKyMgICBkZWZpbmUgUEpNRURJQV9TRFBfTkVHX0FOU1dFUl9NVUxUSVBMRV9DT0RFQ1MJMAorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhlIGN1c3RvbWl6ZWQgU0RQIGZvcm1hdAorICogbmVnb3RpYXRpb24gY2FsbGJhY2tzLgorICovCisjaWZuZGVmIFBKTUVESUFfU0RQX05FR19NQVhfQ1VTVE9NX0ZNVF9ORUdfQ0IKKyMgICBkZWZpbmUgUEpNRURJQV9TRFBfTkVHX01BWF9DVVNUT01fRk1UX05FR19DQgk4CisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgc3BlY2lmaWVzIGlmIHRoZSBTRFAgbmVnb3RpYXRvciBzaG91bGQgcmV3cml0ZSBhbnN3ZXIgcGF5bG9hZAorICogdHlwZSBudW1iZXJzIHRvIHVzZSB0aGUgc2FtZSBwYXlsb2FkIHR5cGUgbnVtYmVycyBhcyB0aGUgcmVtb3RlIG9mZmVyCisgKiBmb3IgYWxsIG1hdGNoZWQgY29kZWNzLgorICoKKyAqIERlZmF1bHQgaXMgMSAoeWVzKQorICovCisjaWZuZGVmIFBKTUVESUFfU0RQX05FR19BTlNXRVJfU1lNTUVUUklDX1BUCisjICAgZGVmaW5lIFBKTUVESUFfU0RQX05FR19BTlNXRVJfU1lNTUVUUklDX1BUCQkxCisjZW5kaWYKKworCisvKioKKyAqIFN1cHBvcnQgZm9yIHNlbmRpbmcgYW5kIGRlY29kaW5nIFJUQ1AgcG9ydCBpbiBTRFAgKFJGQyAzNjA1KS4KKyAqIERlZmF1bHQgaXMgZXF1YWwgdG8gUEpNRURJQV9BRFZFUlRJU0VfUlRDUCBzZXR0aW5nLgorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX1JUQ1BfSU5fU0RQCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX1JUQ1BfSU5fU0RQCQkoUEpNRURJQV9BRFZFUlRJU0VfUlRDUCkKKyNlbmRpZgorCisKKy8qKgorICogVGhpcyBtYWNybyBjb250cm9scyB3aGV0aGVyIHBqbWVkaWEgc2hvdWxkIGluY2x1ZGUgU0RQCisgKiBiYW5kd2lkdGggbW9kaWZpZXIgIlRJQVMiIChSRkMzODkwKS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbyBhIHJ1bi10aW1lIHZhcmlhYmxlIHRvIHR1cm4gdGhpcyBzZXR0aW5nCisgKiBvbiBvciBvZmYsIGRlZmluZWQgaW4gZW5kcG9pbnQuYy4gVG8gYWNjZXNzIHRoaXMgdmFyaWFibGUsIHVzZQorICogdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3QKKyAqCisgXHZlcmJhdGltCisgICAgZXh0ZXJuIHBqX2Jvb2xfdCBwam1lZGlhX2FkZF9iYW5kd2lkdGhfdGlhc19pbl9zZHA7CisKKyAgICAvLyBEbyBub3QgZW5hYmxlIGJhbmR3aWR0aCBpbmZvcm1hdGlvbiBpbmNsdXNpb24gaW4gc2RwCisgICAgcGptZWRpYV9hZGRfYmFuZHdpZHRoX3RpYXNfaW5fc2RwID0gUEpfRkFMU0U7CisgXGVuZHZlcmJhdGltCisgKgorICogRGVmYXVsdDogMSAoeWVzKQorICovCisjaWZuZGVmIFBKTUVESUFfQUREX0JBTkRXSURUSF9USUFTX0lOX1NEUAorIyAgIGRlZmluZSBQSk1FRElBX0FERF9CQU5EV0lEVEhfVElBU19JTl9TRFAJMQorI2VuZGlmCisKKworLyoqCisgKiBUaGlzIG1hY3JvIGNvbnRyb2xzIHdoZXRoZXIgcGptZWRpYSBzaG91bGQgaW5jbHVkZSBTRFAgcnRwbWFwIAorICogYXR0cmlidXRlIGZvciBzdGF0aWMgcGF5bG9hZCB0eXBlcy4gU0RQIHJ0cG1hcCBmb3Igc3RhdGljCisgKiBwYXlsb2FkIHR5cGVzIGFyZSBvcHRpb25hbCwgYWx0aG91Z2ggdGhleSBhcmUgbm9ybWFsbHkgaW5jbHVkZWQKKyAqIGZvciBpbnRlcm9wZXJhYmlsaXR5IHJlYXNvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbyBhIHJ1bi10aW1lIHZhcmlhYmxlIHRvIHR1cm4gdGhpcyBzZXR0aW5nCisgKiBvbiBvciBvZmYsIGRlZmluZWQgaW4gZW5kcG9pbnQuYy4gVG8gYWNjZXNzIHRoaXMgdmFyaWFibGUsIHVzZQorICogdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3QKKyAqCisgXHZlcmJhdGltCisgICAgZXh0ZXJuIHBqX2Jvb2xfdCBwam1lZGlhX2FkZF9ydHBtYXBfZm9yX3N0YXRpY19wdDsKKworICAgIC8vIERvIG5vdCBpbmNsdWRlIHJ0cG1hcCBmb3Igc3RhdGljIHBheWxvYWQgdHlwZXMgKDw5NikKKyAgICBwam1lZGlhX2FkZF9ydHBtYXBfZm9yX3N0YXRpY19wdCA9IFBKX0ZBTFNFOworIFxlbmR2ZXJiYXRpbQorICoKKyAqIERlZmF1bHQ6IDEgKHllcykKKyAqLworI2lmbmRlZiBQSk1FRElBX0FERF9SVFBNQVBfRk9SX1NUQVRJQ19QVAorIyAgIGRlZmluZSBQSk1FRElBX0FERF9SVFBNQVBfRk9SX1NUQVRJQ19QVAkxCisjZW5kaWYKKworCisvKioKKyAqIFRoaXMgbWFjcm8gZGVjbGFyZXMgdGhlIHBheWxvYWQgdHlwZSBmb3IgdGVsZXBob25lLWV2ZW50CisgKiB0aGF0IGlzIGFkdmVydGlzZWQgYnkgUEpNRURJQSBmb3Igb3V0Z29pbmcgU0RQLiBJZiB0aGlzIG1hY3JvCisgKiBpcyBzZXQgdG8gemVybywgdGVsZXBob25lIGV2ZW50cyB3b3VsZCBub3QgYmUgYWR2ZXJ0aXNlZCBub3IKKyAqIHN1cHBvcnRlZC4KKyAqCisgKiBJZiB0aGlzIHZhbHVlIGlzIGNoYW5nZWQgdG8gb3RoZXIgbnVtYmVyLCBwbGVhc2UgdXBkYXRlIHRoZQorICogUEpNRURJQV9SVFBfUFRfVEVMRVBIT05FX0VWRU5UU19TVFIgdG9vLgorICovCisjaWZuZGVmIFBKTUVESUFfUlRQX1BUX1RFTEVQSE9ORV9FVkVOVFMKKyMgICBkZWZpbmUgUEpNRURJQV9SVFBfUFRfVEVMRVBIT05FX0VWRU5UUwkgICAgOTYKKyNlbmRpZgorCisKKy8qKgorICogTWFjcm8gdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbGVwaG9uZS1ldmVudAorICogcGF5bG9hZCB0eXBlLgorICovCisjaWZuZGVmIFBKTUVESUFfUlRQX1BUX1RFTEVQSE9ORV9FVkVOVFNfU1RSCisjICAgZGVmaW5lIFBKTUVESUFfUlRQX1BUX1RFTEVQSE9ORV9FVkVOVFNfU1RSCSAgICAiOTYiCisjZW5kaWYKKworCisvKioKKyAqIE1heGltdW0gdG9uZXMvZGlnaXRzIHRoYXQgY2FuIGJlIGVucXVldWVkIGluIHRoZSB0b25lIGdlbmVyYXRvci4KKyAqLworI2lmbmRlZiBQSk1FRElBX1RPTkVHRU5fTUFYX0RJR0lUUworIyAgIGRlZmluZSBQSk1FRElBX1RPTkVHRU5fTUFYX0RJR0lUUwkJICAgIDMyCisjZW5kaWYKKworCisvKiAKKyAqIEJlbG93IHNwZWNpZmllcyB0aGUgdmFyaW91cyB0b25lIGdlbmVyYXRvciBiYWNrZW5kIGFsZ29yaXRobS4KKyAqLworCisvKiogCisgKiBUaGUgbWF0aCdzIHNpbmUoKSwgZmxvYXRpbmcgcG9pbnQuIFRoaXMgaGFzIHZlcnkgZ29vZCBwcmVjaXNpb24gCisgKiBidXQgaXQncyB0aGUgc2xvd2VzdCBhbmQgcmVxdWlyZXMgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBhbmQKKyAqIGxpbmtpbmcgd2l0aCB0aGUgbWF0aCBsaWJyYXJ5LgorICovCisjZGVmaW5lIFBKTUVESUFfVE9ORUdFTl9TSU5FCQkJICAgIDEKKworLyoqCisgKiBGbG9hdGluZyBwb2ludCBhcHByb3hpbWF0aW9uIG9mIHNpbmUoKS4gVGhpcyBoYXMgcmVsYXRpdmVseSBnb29kCisgKiBwcmVjaXNpb24gYW5kIG11Y2ggZmFzdGVyIHRoYW4gcGxhaW4gc2luZSgpLCBidXQgaXQgcmVxdWlyZXMgZmxvYXRpbmctCisgKiBwb2ludCBzdXBwb3J0IGFuZCBsaW5raW5nIHdpdGggdGhlIG1hdGggbGlicmFyeS4KKyAqLworI2RlZmluZSBQSk1FRElBX1RPTkVHRU5fRkxPQVRJTkdfUE9JTlQJCSAgICAyCisKKy8qKgorICogRml4ZWQgcG9pbnQgdXNpbmcgc2luZSBzaWduYWwgZ2VuZXJhdGVkIGJ5IENvcmRpYyBhbGdvcml0aG0uIFRoaXMKKyAqIGFsZ29yaXRobSBjYW4gYmUgdHVuZWQgdG8gcHJvdmlkZSBiYWxhbmNlIGJldHdlZW4gcHJlY2lzaW9uIGFuZAorICogcGVyZm9ybWFuY2UgYnkgdHVuaW5nIHRoZSBQSk1FRElBX1RPTkVHRU5fRklYRURfUE9JTlRfQ09SRElDX0xPT1AgCisgKiBzZXR0aW5nLCBhbmQgbWF5IGJlIHN1aXRhYmxlIGZvciBwbGF0Zm9ybXMgdGhhdCBsYWNrIGZsb2F0aW5nLXBvaW50CisgKiBzdXBwb3J0LgorICovCisjZGVmaW5lIFBKTUVESUFfVE9ORUdFTl9GSVhFRF9QT0lOVF9DT1JESUMJICAgIDMKKworLyoqCisgKiBGYXN0IGZpeGVkIHBvaW50IHVzaW5nIHNvbWUgYXBwcm94aW1hdGlvbiB0byBnZW5lcmF0ZSBzaW5lIHdhdmVzLgorICogVGhlIHRvbmUgZ2VuZXJhdGVkIGJ5IHRoaXMgYWxnb3JpdGhtIGlzIG5vdCB2ZXJ5IHByZWNpc2UsIGhvd2V2ZXIKKyAqIHRoZSBhbGdvcml0aG0gaXMgdmVyeSBmYXN0LgorICovCisjZGVmaW5lIFBKTUVESUFfVE9ORUdFTl9GQVNUX0ZJWEVEX1BPSU5UCSAgICA0CisKKworLyoqCisgKiBTcGVjaWZ5IHRoZSB0b25lIGdlbmVyYXRvciBhbGdvcml0aG0gdG8gYmUgdXNlZC4gUGxlYXNlIHNlZSAKKyAqIGh0dHA6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy93aWtpL1RvbmVfR2VuZXJhdG9yIGZvciB0aGUgcGVyZm9ybWFuY2UKKyAqIGFuYWx5c2lzIHJlc3VsdHMgb2YgdGhlIHZhcmlvdXMgdG9uZSBnZW5lcmF0b3IgYWxnb3JpdGhtcy4KKyAqCisgKiBEZWZhdWx0IHZhbHVlOgorICogIC0gUEpNRURJQV9UT05FR0VOX0ZMT0FUSU5HX1BPSU5UIHdoZW4gUEpfSEFTX0ZMT0FUSU5HX1BPSU5UIGlzIHNldAorICogIC0gUEpNRURJQV9UT05FR0VOX0ZJWEVEX1BPSU5UX0NPUkRJQyB3aGVuIFBKX0hBU19GTE9BVElOR19QT0lOVCBpcyBub3Qgc2V0CisgKi8KKyNpZm5kZWYgUEpNRURJQV9UT05FR0VOX0FMRworIyAgIGlmIGRlZmluZWQoUEpfSEFTX0ZMT0FUSU5HX1BPSU5UKSAmJiBQSl9IQVNfRkxPQVRJTkdfUE9JTlQKKyMJZGVmaW5lIFBKTUVESUFfVE9ORUdFTl9BTEcJUEpNRURJQV9UT05FR0VOX0ZMT0FUSU5HX1BPSU5UCisjICAgZWxzZQorIwlkZWZpbmUgUEpNRURJQV9UT05FR0VOX0FMRwlQSk1FRElBX1RPTkVHRU5fRklYRURfUE9JTlRfQ09SRElDCisjICAgZW5kaWYKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNhbGN1bGF0aW9uIGxvb3BzIHRvIGdlbmVyYXRlIHRoZSB0b25lLCB3aGVuCisgKiBQSk1FRElBX1RPTkVHRU5fRklYRURfUE9JTlRfQ09SRElDIGFsZ29yaXRobSBpcyB1c2VkLiBXaXRoIG1vcmUgY2FsY3VsYXRpb24KKyAqIGxvb3BzLCB0aGUgdG9uZSBzaWduYWwgZ2V0cyBtb3JlIHByZWNpc2UsIGJ1dCB0aGlzIHdpbGwgYWRkIG1vcmUgCisgKiBwcm9jZXNzaW5nLgorICoKKyAqIFZhbGlkIHZhbHVlcyBhcmUgMSB0byAyOC4KKyAqCisgKiBEZWZhdWx0IHZhbHVlOiAxMAorICovCisjaWZuZGVmIFBKTUVESUFfVE9ORUdFTl9GSVhFRF9QT0lOVF9DT1JESUNfTE9PUAorIyAgIGRlZmluZSBQSk1FRElBX1RPTkVHRU5fRklYRURfUE9JTlRfQ09SRElDX0xPT1AgIDEwCisjZW5kaWYKKworCisvKioKKyAqIEVuYWJsZSBoaWdoIHF1YWxpdHkgb2YgdG9uZSBnZW5lcmF0aW9uLCB0aGUgYmV0dGVyIHF1YWxpdHkgd2lsbCBjb3N0CisgKiBtb3JlIENQVSBsb2FkLiBUaGlzIGlzIG9ubHkgYXBwbGllZCB0byBmbG9hdGluZyBwb2ludCBlbmFibGVkIG1hY2hpbmVzLgorICoKKyAqIEJ5IGRlZmF1bHQgaXQgaXMgZW5hYmxlZCB3aGVuIFBKX0hBU19GTE9BVElOR19QT0lOVCBpcyBzZXQuCisgKgorICogVGhpcyBtYWNybyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHZlcnNpb24gMS4wLXJjMy4KKyAqLworI2lmZGVmIFBKTUVESUFfVVNFX0hJR0hfUVVBTElUWV9UT05FR0VOCisjICAgZXJyb3IgICAiVGhlIFBKTUVESUFfVVNFX0hJR0hfUVVBTElUWV9UT05FR0VOIG1hY3JvIGlzIG9ic29sZXRlIgorI2VuZGlmCisKKworLyoqCisgKiBGYWRlLWluIGR1cmF0aW9uIGZvciB0aGUgdG9uZSwgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdG8gemVybyB0byBkaXNhYmxlCisgKiB0aGlzIGZlYXR1cmUuCisgKgorICogRGVmYXVsdDogMSAobXNlYykKKyAqLworI2lmbmRlZiBQSk1FRElBX1RPTkVHRU5fRkFERV9JTl9USU1FCisjICAgZGVmaW5lIFBKTUVESUFfVE9ORUdFTl9GQURFX0lOX1RJTUUJCSAgICAxCisjZW5kaWYKKworCisvKioKKyAqIEZhZGUtb3V0IGR1cmF0aW9uIGZvciB0aGUgdG9uZSwgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdG8gemVybyB0byBkaXNhYmxlCisgKiB0aGlzIGZlYXR1cmUuCisgKgorICogRGVmYXVsdDogMiAobXNlYykKKyAqLworI2lmbmRlZiBQSk1FRElBX1RPTkVHRU5fRkFERV9PVVRfVElNRQorIyAgIGRlZmluZSBQSk1FRElBX1RPTkVHRU5fRkFERV9PVVRfVElNRQkgICAgMgorI2VuZGlmCisKKworLyoqCisgKiBUaGUgZGVmYXVsdCB0b25lIGdlbmVyYXRvciBhbXBsaXR1ZGUgKDEtMzI3NjcpLgorICoKKyAqIERlZmF1bHQgdmFsdWU6IDEyMjg4CisgKi8KKyNpZm5kZWYgUEpNRURJQV9UT05FR0VOX1ZPTFVNRQorIyAgIGRlZmluZSBQSk1FRElBX1RPTkVHRU5fVk9MVU1FCQkgICAgMTIyODgKKyNlbmRpZgorCisKKy8qKgorICogRW5hYmxlIHN1cHBvcnQgZm9yIFNSVFAgbWVkaWEgdHJhbnNwb3J0LiBUaGlzIHdpbGwgcmVxdWlyZSBsaW5raW5nCisgKiB3aXRoIGxpYnNydHAgZnJvbSB0aGUgdGhpcmRfcGFydHkgZGlyZWN0b3J5LgorICoKKyAqIEJ5IGRlZmF1bHQgaXQgaXMgZW5hYmxlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19TUlRQCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX1NSVFAJCQkgICAgMQorI2VuZGlmCisKKworLyoqCisgKiBMZXQgdGhlIGxpYnJhcnkgaGFuZGxlIGxpYnNydHAgaW5pdGlhbGl6YXRpb24gYW5kIGRlaW5pdGlhbGl6YXRpb24uCisgKiBBcHBsaWNhdGlvbiBtYXkgd2FudCB0byBkaXNhYmxlIHRoaXMgYW5kIG1hbnVhbGx5IHBlcmZvcm0gbGlic3J0cAorICogaW5pdGlhbGl6YXRpb24gYW5kIGRlaW5pdGlhbGl6YXRpb24gd2hlbiBpdCBuZWVkcyB0byB1c2UgbGlic3J0cAorICogYmVmb3JlIHRoZSBsaWJyYXJ5IGlzIGluaXRpYWxpemVkIG9yIGFmdGVyIHRoZSBsaWJyYXJ5IGlzIHNodXRkb3duLgorICoKKyAqIEJ5IGRlZmF1bHQgaXQgaXMgZW5hYmxlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0xJQlNSVFBfQVVUT19JTklUX0RFSU5JVAorIyAgIGRlZmluZSBQSk1FRElBX0xJQlNSVFBfQVVUT19JTklUX0RFSU5JVAkgICAgMQorI2VuZGlmCisKKworLyoqCisgKiBFbmFibGUgc3VwcG9ydCB0byBoYW5kbGUgY29kZWNzIHdpdGggaW5jb25zaXN0ZW50IGNsb2NrIHJhdGUKKyAqIGJldHdlZW4gY2xvY2sgcmF0ZSBpbiBTRFAvUlRQICYgdGhlIGNsb2NrIHJhdGUgdGhhdCBpcyBhY3R1YWxseSB1c2VkLgorICogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIHdpdGggRy43MjIgYW5kIE1QRUcgYXVkaW8gY29kZWNzLgorICogU2VlOgorICogIC0gRy43MjIgICAgICA6IFJGQyAzNTUxIDQuNS4yCisgKiAgLSBNUEVHIGF1ZGlvIDogUkZDIDM1NTEgNC41LjEzICYgUkZDIDMxMTkKKyAqCisgKiBBbHNvIHdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHNvbWUgaGFuZGxpbmcgd2lsbCBiZSBwZXJmb3JtZWQKKyAqIHRvIGRlYWwgd2l0aCBjbG9jayByYXRlIGluY29tcGF0aWJpbGl0aWVzIG9mIHNvbWUgcGhvbmVzLgorICoKKyAqIEJ5IGRlZmF1bHQgaXQgaXMgZW5hYmxlZC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0hBTkRMRV9HNzIyX01QRUdfQlVHCisjICAgZGVmaW5lIFBKTUVESUFfSEFORExFX0c3MjJfTVBFR19CVUcJCSAgICAxCisjZW5kaWYKKworCisvKioKKyAqIFRyYW5zcG9ydCBpbmZvIChwam1lZGlhX3RyYW5zcG9ydF9pbmZvKSBjb250YWlucyBhIHNvY2tldCBpbmZvIGFuZCBsaXN0CisgKiBvZiB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mbywgc2luY2UgdHJhbnNwb3J0cyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlciAKKyAqIChmb3IgZXhhbXBsZSwgU1JUUCB0cmFuc3BvcnQgdXNlcyBVRFAgdHJhbnNwb3J0IGFzIHRoZSB1bmRlcmx5aW5nIAorICogdHJhbnNwb3J0KS4gVGhpcyBjb25zdGFudCBzcGVjaWZpZXMgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNwb3J0IHNwZWNpZmljCisgKiBpbmZvcyB0aGF0IGNhbiBiZSBoZWxkIGluIGEgdHJhbnNwb3J0IGluZm8uCisgKi8KKyNpZm5kZWYgUEpNRURJQV9UUkFOU1BPUlRfU1BFQ0lGSUNfSU5GT19NQVhDTlQKKyMgICBkZWZpbmUgUEpNRURJQV9UUkFOU1BPUlRfU1BFQ0lGSUNfSU5GT19NQVhDTlQgICA0CisjZW5kaWYKKworCisvKioKKyAqIE1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBzdG9yYWdlIGJ1ZmZlciBvZiBhIHRyYW5zcG9ydCBzcGVjaWZpYyBpbmZvLgorICovCisjaWZuZGVmIFBKTUVESUFfVFJBTlNQT1JUX1NQRUNJRklDX0lORk9fTUFYU0laRQorIyAgIGRlZmluZSBQSk1FRElBX1RSQU5TUE9SVF9TUEVDSUZJQ19JTkZPX01BWFNJWkUgICgzNipzaXplb2YobG9uZykpCisjZW5kaWYKKworCisvKioKKyAqIFZhbHVlIHRvIGJlIHNwZWNpZmllZCBpbiBQSk1FRElBX1NUUkVBTV9FTkFCTEVfS0Egc2V0dGluZy4KKyAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgYW4gZW1wdHkgUlRQIHBhY2tldCBzaG91bGQgYmUgdXNlZCBhcworICogdGhlIGtlZXAtYWxpdmUgcGFja2V0LgorICovCisjZGVmaW5lIFBKTUVESUFfU1RSRUFNX0tBX0VNUFRZX1JUUAkJICAgIDEKKworLyoqCisgKiBWYWx1ZSB0byBiZSBzcGVjaWZpZWQgaW4gUEpNRURJQV9TVFJFQU1fRU5BQkxFX0tBIHNldHRpbmcuCisgKiBUaGlzIGluZGljYXRlcyB0aGF0IGEgdXNlciBkZWZpbmVkIHBhY2tldCBzaG91bGQgYmUgdXNlZAorICogYXMgdGhlIGtlZXAtYWxpdmUgcGFja2V0LiBUaGUgY29udGVudCBvZiB0aGUgdXNlci1kZWZpbmVkCisgKiBwYWNrZXQgaXMgc3BlY2lmaWVkIGJ5IFBKTUVESUFfU1RSRUFNX0tBX1VTRVJfUEtULiBEZWZhdWx0CisgKiBjb250ZW50IGlzIGEgQ1ItTEYgcGFja2V0LgorICovCisjZGVmaW5lIFBKTUVESUFfU1RSRUFNX0tBX1VTRVIJCQkgICAgMgorCisvKioKKyAqIFRoZSBjb250ZW50IG9mIHRoZSB1c2VyIGRlZmluZWQga2VlcC1hbGl2ZSBwYWNrZXQuIFRoZSBmb3JtYXQKKyAqIG9mIHRoZSBwYWNrZXQgaXMgaW5pdGlhbGl6ZXIgdG8gcGpfc3RyX3Qgc3RydWN0dXJlLiBOb3RlIHRoYXQKKyAqIHRoZSBjb250ZW50IG1heSBjb250YWluIE5VTEwgY2hhcmFjdGVyLgorICovCisjaWZuZGVmIFBKTUVESUFfU1RSRUFNX0tBX1VTRVJfUEtUCisjICAgZGVmaW5lIFBKTUVESUFfU1RSRUFNX0tBX1VTRVJfUEtUCXsgIlxyXG4iLCAyIH0KKyNlbmRpZgorCisvKioKKyAqIFNwZWNpZnkgYW5vdGhlciB0eXBlIG9mIGtlZXAtYWxpdmUgYW5kIE5BVCBob2xlIHB1bmNoaW5nIAorICogbWVjaGFuaXNtICh0aGUgb3RoZXIgdHlwZSBpcyBQSk1FRElBX1NUUkVBTV9WQURfU1VTUEVORF9NU0VDCisgKiBhbmQgUEpNRURJQV9DT0RFQ19NQVhfU0lMRU5DRV9QRVJJT0QpIHRvIGJlIHVzZWQgYnkgc3RyZWFtLiAKKyAqIFdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSBzdHJlYW0gd2lsbCBpbml0aWFsbHkgCisgKiB0cmFuc21pdCBvbmUgcGFja2V0IHRvIHB1bmNoIGEgaG9sZSBpbiBOQVQsIGFuZCBwZXJpb2RpY2FsbHkKKyAqIHRyYW5zbWl0IGtlZXAtYWxpdmUgcGFja2V0cy4KKyAqCisgKiBXaGVuIHRoaXMgYWx0ZXJuYXRpdmUga2VlcC1hbGl2ZSBtZWNoYW5pc20gaXMgdXNlZCwgYXBwbGljYXRpb24KKyAqIG1heSBkaXNhYmxlIHRoZSBvdGhlciBrZWVwLWFsaXZlIG1lY2hhbmlzbXMsIGkuZTogYnkgc2V0dGluZyAKKyAqIFBKTUVESUFfU1RSRUFNX1ZBRF9TVVNQRU5EX01TRUMgdG8gemVybyBhbmQgCisgKiBQSk1FRElBX0NPREVDX01BWF9TSUxFTkNFX1BFUklPRCB0byAtMS4KKyAqCisgKiBUaGUgdmFsdWUgb2YgdGhpcyBtYWNybyBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgcGFja2V0IHVzZWQKKyAqIGZvciB0aGUga2VlcC1hbGl2ZSBtZWNoYW5pc20uIFZhbGlkIHZhbHVlcyBhcmUKKyAqIFBKTUVESUFfU1RSRUFNX0tBX0VNUFRZX1JUUCBhbmQgUEpNRURJQV9TVFJFQU1fS0FfVVNFUi4KKyAqIAorICogVGhlIGR1cmF0aW9uIG9mIHRoZSBrZWVwLWFsaXZlIGludGVydmFsIGZ1cnRoZXIgY2FuIGJlIHNldAorICogd2l0aCBQSk1FRElBX1NUUkVBTV9LQV9JTlRFUlZBTCBzZXR0aW5nLgorICoKKyAqIERlZmF1bHQ6IDAgKGRpc2FibGVkKQorICovCisjaWZuZGVmIFBKTUVESUFfU1RSRUFNX0VOQUJMRV9LQQorIyAgIGRlZmluZSBQSk1FRElBX1NUUkVBTV9FTkFCTEVfS0EJCSAgICAwCisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgdGhlIGtlZXAtYWxpdmUgaW50ZXJ2YWwgb2YgUEpNRURJQV9TVFJFQU1fRU5BQkxFX0tBCisgKiBtZWNoYW5pc20sIGluIHNlY29uZHMuCisgKgorICogRGVmYXVsdDogNSBzZWNvbmRzCisgKi8KKyNpZm5kZWYgUEpNRURJQV9TVFJFQU1fS0FfSU5URVJWQUwKKyMgICBkZWZpbmUgUEpNRURJQV9TVFJFQU1fS0FfSU5URVJWQUwJCSAgICA1CisjZW5kaWYKKworCisvKgorICogLi4uLiBuZXcgc3R1ZmZzIC4uLgorICovCisKKy8qCisgKiBWaWRlbworICovCisKKy8qKgorICogVG9wIGxldmVsIG9wdGlvbiB0byBlbmFibGUvZGlzYWJsZSB2aWRlbyBmZWF0dXJlcy4KKyAqCisgKiBEZWZhdWx0OiAwIChkaXNhYmxlZCkKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19WSURFTworIyAgIGRlZmluZSBQSk1FRElBX0hBU19WSURFTwkJCQkwCisjZW5kaWYKKworCisvKioKKyAqIFNwZWNpZnkgaWYgRkZNUEVHIGlzIGF2YWlsYWJsZS4gVGhlIHZhbHVlIGhlcmUgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0CisgKiB2YWx1ZSBmb3Igb3RoZXIgRkZNUEVHIHNldHRpbmdzIGJlbG93LgorICoKKyAqIERlZmF1bHQ6IDAKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19GRk1QRUcKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfRkZNUEVHCQkJCTAKKyNlbmRpZgorCisvKioKKyAqIFNwZWNpZnkgaWYgRkZNUEVHIGxpYmF2Zm9ybWF0IGlzIGF2YWlsYWJsZS4KKyAqCisgKiBEZWZhdWx0OiBQSk1FRElBX0hBU19GRk1QRUcgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19MSUJBVkZPUk1BVAorIyAgIGRlZmluZSBQSk1FRElBX0hBU19MSUJBVkZPUk1BVAkJCVBKTUVESUFfSEFTX0ZGTVBFRworI2VuZGlmCisKKy8qKgorICogU3BlY2lmeSBpZiBGRk1QRUcgbGliYXZmb3JtYXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIERlZmF1bHQ6IFBKTUVESUFfSEFTX0ZGTVBFRyAob3IgZGV0ZWN0ZWQgYnkgY29uZmlndXJlKQorICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0xJQkFWQ09ERUMKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfTElCQVZDT0RFQwkJCVBKTUVESUFfSEFTX0ZGTVBFRworI2VuZGlmCisKKy8qKgorICogU3BlY2lmeSBpZiBGRk1QRUcgbGliYXZ1dGlsIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBEZWZhdWx0OiBQSk1FRElBX0hBU19GRk1QRUcgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19MSUJBVlVUSUwKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfTElCQVZVVElMCQkJUEpNRURJQV9IQVNfRkZNUEVHCisjZW5kaWYKKworLyoqCisgKiBTcGVjaWZ5IGlmIEZGTVBFRyBsaWJzd3NjYWxlIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBEZWZhdWx0OiBQSk1FRElBX0hBU19GRk1QRUcgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19MSUJTV1NDQUxFCisjICAgZGVmaW5lIFBKTUVESUFfSEFTX0xJQlNXU0NBTEUJCQlQSk1FRElBX0hBU19GRk1QRUcKKyNlbmRpZgorCisvKioKKyAqIFNwZWNpZnkgaWYgRkZNUEVHIGxpYmF2ZGV2aWNlIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBEZWZhdWx0OiBQSk1FRElBX0hBU19GRk1QRUcgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19MSUJBVkRFVklDRQorIyAgIGRlZmluZSBQSk1FRElBX0hBU19MSUJBVkRFVklDRQkJCVBKTUVESUFfSEFTX0ZGTVBFRworI2VuZGlmCisKKy8qKgorICogU3BlY2lmeSBpZiBGRk1QRUcgbGliYXZjb3JlIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBEZWZhdWx0OiBQSk1FRElBX0hBU19GRk1QRUcgKG9yIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZSkKKyAqLworI2lmbmRlZiBQSk1FRElBX0hBU19MSUJBVkNPUkUKKyMgICBkZWZpbmUgUEpNRURJQV9IQVNfTElCQVZDT1JFCQkJUEpNRURJQV9IQVNfRkZNUEVHCisjZW5kaWYKKworLyoqCisgKiBNYXhpbXVtIHZpZGVvIHBsYW5lcy4KKyAqCisgKiBEZWZhdWx0OiA0CisgKi8KKyNpZm5kZWYgUEpNRURJQV9NQVhfVklERU9fUExBTkVTCisjICAgZGVmaW5lIFBKTUVESUFfTUFYX1ZJREVPX1BMQU5FUwkJCTQKKyNlbmRpZgorCisvKioKKyAqIE1heGltdW0gbnVtYmVyIG9mIHZpZGVvIGZvcm1hdHMuCisgKgorICogRGVmYXVsdDogMzIKKyAqLworI2lmbmRlZiBQSk1FRElBX01BWF9WSURFT19GT1JNQVRTCisjICAgZGVmaW5lIFBKTUVESUFfTUFYX1ZJREVPX0ZPUk1BVFMJCQkzMgorI2VuZGlmCisKKy8qKgorICogU3BlY2lmeSB0aGUgbWF4aW11bSB0aW1lIGRpZmZlcmVuY2UgKGluIG1zKSBmb3Igc3luY2hyb25pemF0aW9uIGJldHdlZW4KKyAqIHR3byBtZWRpYXMuIElmIHRoZSBzeW5jaHJvbml6YXRpb24gbWVkaWEgc291cmNlIGlzIGFoZWFkIG9mIHRpbWUKKyAqIGdyZWF0ZXIgdGhhbiB0aGlzIGR1cmF0aW9uLCBpdCBpcyBjb25zaWRlcmVkIHRvIG1ha2UgYSB2ZXJ5IGxhcmdlIGp1bXAKKyAqIGFuZCB0aGUgc3luY2hyb25pemF0aW9uIHdpbGwgYmUgcmVzZXQuCisgKgorICogRGVmYXVsdDogMjAwMDAKKyAqLworI2lmbmRlZiBQSk1FRElBX0NMT0NLX1NZTkNfTUFYX1NZTkNfTVNFQworIyAgIGRlZmluZSBQSk1FRElBX0NMT0NLX1NZTkNfTUFYX1NZTkNfTVNFQyAgICAgICAgIDIwMDAwCisjZW5kaWYKKworLyoqCisgKiBNYXhpbXVtIHZpZGVvIGZyYW1lIHNpemUuCisgKiBEZWZhdWx0OiAxMjhrQgorICovCisjaWZuZGVmIFBKTUVESUFfTUFYX1ZJREVPX0VOQ19GUkFNRV9TSVpFCisjICBkZWZpbmUgUEpNRURJQV9NQVhfVklERU9fRU5DX0ZSQU1FX1NJWkUJICAgICgxPDwxNykKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB0aGUgbWF4aW11bSBkdXJhdGlvbiAoaW4gbXMpIGZvciByZXN5bmNocm9uaXphdGlvbi4gV2hlbiBhIG1lZGlhCisgKiBpcyBsYXRlIHRvIGFub3RoZXIgbWVkaWEgaXQgaXMgc3VwcG9zZWQgdG8gYmUgc3luY2hyb25pemVkIHRvLCBpdCBpcworICogZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbml6ZWQgYWdhaW4gYWZ0ZXIgdGhpcyBkdXJhdGlvbi4gV2hpbGUgaWYgdGhlCisgKiBtZWRpYSBpcyBhaGVhZC9lYXJseSBieSB0IG1zLCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9uaXplZCBhZnRlcgorICogdCArIHRoaXMgZHVyYXRpb24uIFRoaXMgdGltaW5nIG9ubHkgYXBwbGllcyBpZiB0aGVyZSBpcyBubyBhZGRpdGlvbmFsCisgKiByZXN5bmNocm9uaXphdGlvbiByZXF1aXJlZCBkdXJpbmcgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi4KKyAqCisgKiBEZWZhdWx0OiAyMDAwCisgKi8KKyNpZm5kZWYgUEpNRURJQV9DTE9DS19TWU5DX01BWF9SRVNZTkNfRFVSQVRJT04KKyMgICBkZWZpbmUgUEpNRURJQV9DTE9DS19TWU5DX01BWF9SRVNZTkNfRFVSQVRJT04gMjAwMAorI2VuZGlmCisKKworLyoqCisgKiBNaW5pbXVtIGdhcCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBkaXNjYXJkcyBpbiBqaXR0ZXIgYnVmZmVyLAorICogaW4gbWlsbGlzZWNvbmRzLgorICoKKyAqIERlZmF1bHQ6IDIwMCBtcworICovCisjaWZuZGVmIFBKTUVESUFfSkJVRl9ESVNDX01JTl9HQVAKKyMgICBkZWZpbmUgUEpNRURJQV9KQlVGX0RJU0NfTUlOX0dBUAkJICAgIDIwMAorI2VuZGlmCisKKworLyoqCisgKiBNaW5pbXVtIGJ1cnN0IGxldmVsIHJlZmVyZW5jZSB1c2VkIGZvciBjYWxjdWxhdGluZyBkaXNjYXJkIGR1cmF0aW9uCisgKiBpbiBqaXR0ZXIgYnVmZmVyIHByb2dyZXNzaXZlIGRpc2NhcmQgYWxnb3JpdGhtLCBpbiBmcmFtZXMuCisgKiAKKyAqIERlZmF1bHQ6IDEgZnJhbWUKKyAqLworI2lmbmRlZiBQSk1FRElBX0pCVUZfUFJPX0RJU0NfTUlOX0JVUlNUCisjICAgZGVmaW5lIFBKTUVESUFfSkJVRl9QUk9fRElTQ19NSU5fQlVSU1QJICAgIDEKKyNlbmRpZgorCisKKy8qKgorICogTWF4aW11bSBidXJzdCBsZXZlbCByZWZlcmVuY2UgdXNlZCBmb3IgY2FsY3VsYXRpbmcgZGlzY2FyZCBkdXJhdGlvbgorICogaW4gaml0dGVyIGJ1ZmZlciBwcm9ncmVzc2l2ZSBkaXNjYXJkIGFsZ29yaXRobSwgaW4gZnJhbWVzLgorICogCisgKiBEZWZhdWx0OiAyMDAgZnJhbWVzCisgKi8KKyNpZm5kZWYgUEpNRURJQV9KQlVGX1BST19ESVNDX01BWF9CVVJTVAorIyAgIGRlZmluZSBQSk1FRElBX0pCVUZfUFJPX0RJU0NfTUFYX0JVUlNUCSAgICAxMDAKKyNlbmRpZgorCisKKy8qKgorICogRHVyYXRpb24gZm9yIHByb2dyZXNzaXZlIGRpc2NhcmQgYWxnb3RpdGhtIGluIGppdHRlciBidWZmZXIgdG8gZGlzY2FyZAorICogYW4gZXhjZXNzaXZlIGZyYW1lIHdoZW4gYnVyc3QgaXMgZXF1YWwgdG8gb3IgbG93ZXIgdGhhbgorICogUEpNRURJQV9KQlVGX1BST19ESVNDX01JTl9CVVJTVCwgaW4gbWlsbGlzZWNvbmRzLgorICoKKyAqIERlZmF1bHQ6IDIwMDAgbXMKKyAqLworI2lmbmRlZiBQSk1FRElBX0pCVUZfUFJPX0RJU0NfVDEKKyMgICBkZWZpbmUgUEpNRURJQV9KQlVGX1BST19ESVNDX1QxCQkgICAgMjAwMAorI2VuZGlmCisKKworLyoqCisgKiBEdXJhdGlvbiBmb3IgcHJvZ3Jlc3NpdmUgZGlzY2FyZCBhbGdvdGl0aG0gaW4gaml0dGVyIGJ1ZmZlciB0byBkaXNjYXJkCisgKiBhbiBleGNlc3NpdmUgZnJhbWUgd2hlbiBidXJzdCBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4KKyAqIFBKTUVESUFfSkJVRl9QUk9fRElTQ19NQVhfQlVSU1QsIGluIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBEZWZhdWx0OiAxMDAwMCBtcworICovCisjaWZuZGVmIFBKTUVESUFfSkJVRl9QUk9fRElTQ19UMgorIyAgIGRlZmluZSBQSk1FRElBX0pCVUZfUFJPX0RJU0NfVDIJCSAgICAxMDAwMAorI2VuZGlmCisKKworLyoqCisgKiBWaWRlbyBzdHJlYW0gd2lsbCBkaXNjYXJkIG9sZCBwaWN0dXJlIGZyb20gdGhlIGppdHRlciBidWZmZXIgYXMgc29vbiBhcworICogbmV3IHBpY3R1cmUgaXMgcmVjZWl2ZWQsIHRvIHJlZHVjZSBsYXRlbmN5LgorICoKKyAqIERlZmF1bHQ6IDAKKyAqLworI2lmbmRlZiBQSk1FRElBX1ZJRF9TVFJFQU1fU0tJUF9QQUNLRVRTX1RPX1JFRFVDRV9MQVRFTkNZCisjICAgZGVmaW5lIFBKTUVESUFfVklEX1NUUkVBTV9TS0lQX1BBQ0tFVFNfVE9fUkVEVUNFX0xBVEVOQ1kJMAorI2VuZGlmCisKKworLyoqCisgKiBNYXhpbXVtIHZpZGVvIHBheWxvYWQgc2l6ZS4gTm90ZSB0aGF0IHRoaXMgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuCisgKiBQSk1FRElBX01BWF9NVFUuCisgKgorICogRGVmYXVsdDogKFBKTUVESUFfTUFYX01UVSAtIDEwMCkKKyAqLworI2lmbmRlZiBQSk1FRElBX01BWF9WSURfUEFZTE9BRF9TSVpFCQkJCisjICBkZWZpbmUgUEpNRURJQV9NQVhfVklEX1BBWUxPQURfU0laRQkJKFBKTUVESUFfTUFYX01UVSAtIDEwMCkKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB0YXJnZXQgdmFsdWUgZm9yIHNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplLiBJdCB3aWxsIGJlCisgKiBhcHBsaWVkIHRvIFJUUCBzb2NrZXQgb2YgbWVkaWEgdHJhbnNwb3J0IHVzaW5nIHNldHNvY2tvcHQoKS4gV2hlbgorICogdHJhbnNwb3J0IGZhaWxlZCB0byBzZXQgdGhlIHNwZWNpZmllZCBzaXplLCBpdCB3aWxsIHRyeSB3aXRoIGxvd2VyCisgKiB2YWx1ZSB1bnRpbCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBpcyBzdWNjZXNzZnVsbHkgc2V0LgorICoKKyAqIFNldHRpbmcgdGhpcyB0byB6ZXJvIHdpbGwgbGVhdmUgdGhlIHNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplIHRvCisgKiBPUyBkZWZhdWx0IChlLmc6IHVzdWFsbHkgOCBLQiBvbiBkZXNrdG9wIHBsYXRmb3JtcykuCisgKgorICogRGVmYXVsdDogNjQgS0Igd2hlbiB2aWRlbyBpcyBlbmFibGVkLCBvdGhlcndpc2UgemVybyAoT1MgZGVmYXVsdCkKKyAqLworI2lmbmRlZiBQSk1FRElBX1RSQU5TUE9SVF9TT19SQ1ZCVUZfU0laRQorIyAgIGlmIFBKTUVESUFfSEFTX1ZJREVPCisjCWRlZmluZSBQSk1FRElBX1RSQU5TUE9SVF9TT19SQ1ZCVUZfU0laRQkoNjQqMTAyNCkKKyMgICBlbHNlCisjCWRlZmluZSBQSk1FRElBX1RSQU5TUE9SVF9TT19SQ1ZCVUZfU0laRQkwCisjICAgZW5kaWYKKyNlbmRpZgorCisKKy8qKgorICogU3BlY2lmeSB0YXJnZXQgdmFsdWUgZm9yIHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplLiBJdCB3aWxsIGJlCisgKiBhcHBsaWVkIHRvIFJUUCBzb2NrZXQgb2YgbWVkaWEgdHJhbnNwb3J0IHVzaW5nIHNldHNvY2tvcHQoKS4gV2hlbgorICogdHJhbnNwb3J0IGZhaWxlZCB0byBzZXQgdGhlIHNwZWNpZmllZCBzaXplLCBpdCB3aWxsIHRyeSB3aXRoIGxvd2VyCisgKiB2YWx1ZSB1bnRpbCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBpcyBzdWNjZXNzZnVsbHkgc2V0LgorICoKKyAqIFNldHRpbmcgdGhpcyB0byB6ZXJvIHdpbGwgbGVhdmUgdGhlIHNvY2tldCBzZW5kIGJ1ZmZlciBzaXplIHRvCisgKiBPUyBkZWZhdWx0IChlLmc6IHVzdWFsbHkgOCBLQiBvbiBkZXNrdG9wIHBsYXRmb3JtcykuCisgKgorICogRGVmYXVsdDogNjQgS0Igd2hlbiB2aWRlbyBpcyBlbmFibGVkLCBvdGhlcndpc2UgemVybyAoT1MgZGVmYXVsdCkKKyAqLworI2lmbmRlZiBQSk1FRElBX1RSQU5TUE9SVF9TT19TTkRCVUZfU0laRQorIyAgIGlmIFBKTUVESUFfSEFTX1ZJREVPCisjCWRlZmluZSBQSk1FRElBX1RSQU5TUE9SVF9TT19TTkRCVUZfU0laRQkoNjQqMTAyNCkKKyMgICBlbHNlCisjCWRlZmluZSBQSk1FRElBX1RSQU5TUE9SVF9TT19TTkRCVUZfU0laRQkwCisjICAgZW5kaWYKKyNlbmRpZgorCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQ09ORklHX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZ19hdXRvLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWdfYXV0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjk1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWdfYXV0by5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHBqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbmZpZ19hdXRvLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWdfYXV0by5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiAkSWQ6IGNvbmZpZ19hdXRvLmguaW4gMzI5NSAyMDEwLTA4LTI1IDEyOjUxOjI5WiBiZW5ueWxwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ORklHX0FVVE9fSF8KKyNkZWZpbmUgX19QSk1FRElBX0NPTkZJR19BVVRPX0hfCisKKy8qKgorICogQGZpbGUgY29uZmlnX2F1dG8uaAorICogQGJyaWVmIFBKTUVESUEgY29uZmlndXJhdGlvbiBhcyBzZXQgYnkgYXV0b2NvbmYgc2NyaXB0CisgKi8KKworLyoKKyAqIE5vdGU6CisgKglUaGUgY29uZmlndXJhdGlvbiBpbiBjb25maWdfc2l0ZS5oIG92ZXJyaWRlcyBhbnkgb3RoZXIgc2V0dGluZ3MsCisgKglpbmNsdWRpbmcgdGhlIHNldHRpbmcgYXMgZGV0ZWN0ZWQgYnkgYXV0b2NvbmYuIAorICovCisgCisvKiBHNzExIGNvZGVjICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0c3MTFfQ09ERUMKKyNkZWZpbmUgUEpNRURJQV9IQVNfRzcxMV9DT0RFQyAwCisjZW5kaWYKKworCisjZW5kaWYJLyogX19QSk1FRElBX0NPTkZJR19BVVRPX0hfICovCisKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb25maWdfYXV0by5oLmluIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnX2F1dG8uaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzhkZGNkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvY29uZmlnX2F1dG8uaC5pbgpAQCAtMCwwICsxLDQzIEBACisvKiAkSWQ6IGNvbmZpZ19hdXRvLmguaW4gMzI5NSAyMDEwLTA4LTI1IDEyOjUxOjI5WiBiZW5ueWxwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQ09ORklHX0FVVE9fSF8KKyNkZWZpbmUgX19QSk1FRElBX0NPTkZJR19BVVRPX0hfCisKKy8qKgorICogQGZpbGUgY29uZmlnX2F1dG8uaAorICogQGJyaWVmIFBKTUVESUEgY29uZmlndXJhdGlvbiBhcyBzZXQgYnkgYXV0b2NvbmYgc2NyaXB0CisgKi8KKworLyoKKyAqIE5vdGU6CisgKglUaGUgY29uZmlndXJhdGlvbiBpbiBjb25maWdfc2l0ZS5oIG92ZXJyaWRlcyBhbnkgb3RoZXIgc2V0dGluZ3MsCisgKglpbmNsdWRpbmcgdGhlIHNldHRpbmcgYXMgZGV0ZWN0ZWQgYnkgYXV0b2NvbmYuIAorICovCisgCisvKiBHNzExIGNvZGVjICovCisjaWZuZGVmIFBKTUVESUFfSEFTX0c3MTFfQ09ERUMKKyN1bmRlZiBQSk1FRElBX0hBU19HNzExX0NPREVDCisjZW5kaWYKKworCisjZW5kaWYJLyogX19QSk1FRElBX0NPTkZJR19BVVRPX0hfICovCisKKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb252ZXJ0ZXIuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2NvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDkwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9jb252ZXJ0ZXIuaApAQCAtMCwwICsxLDMyMiBAQAorLyogJElkOiBjb252ZXJ0ZXIuaCAzNjY0IDIwMTEtMDctMTkgMDM6NDI6MjhaIG5hbmFuZyAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fUEpNRURJQV9DT05WRVJURVJfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9DT05WRVJURVJfSF9fCisKKworLyoqCisgKiBAZmlsZSBwam1lZGlhL2NvbnZlcnRlci5oIEZvcm1hdCBjb252ZXJzaW9uIHV0aWxpdGllcworICogQGJyaWVmIEZvcm1hdCBjb252ZXJzaW9uIHV0aWxpdGllcworICovCisKKyNpbmNsdWRlIDxwam1lZGlhL2ZyYW1lLmg+CisjaW5jbHVkZSA8cGptZWRpYS9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwai9saXN0Lmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfQ09OVkVSVEVSIEZvcm1hdCBjb252ZXJ0ZXIKKyAqIEBpbmdyb3VwIFBKTUVESUFfRlJBTUVfT1AKKyAqIEBicmllZiBBdWRpbyBhbmQgdmlkZW8gY29udmVydGVyIHV0aWxpdGllcworICogQHsKKyAqLworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogVGhpcyBkZXNjcmliZXMgY29udmVyc2lvbiBwYXJhbWV0ZXIuIEl0IHNwZWNpZmllcyB0aGUgc291cmNlIGFuZAorICogZGVzdGluYXRpb24gZm9ybWF0cyBvZiB0aGUgY29udmVyc2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb252ZXJzaW9uX3BhcmFtCit7CisgICAgcGptZWRpYV9mb3JtYXQJc3JjOwkvKio8IFNvdXJjZSBmb3JtYXQuCQkqLworICAgIHBqbWVkaWFfZm9ybWF0CWRzdDsJLyoqPCBEZXN0aW5hdGlvbiBmb3JtYXQuCSovCit9IHBqbWVkaWFfY29udmVyc2lvbl9wYXJhbTsKKworCisvKiogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBmYWN0b3J5IG9wZXJhdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29udmVydGVyX2ZhY3Rvcnlfb3AgcGptZWRpYV9jb252ZXJ0ZXJfZmFjdG9yeV9vcDsKKworLyoqCisgKiBDb252ZXJ0ZXIgcHJpb3JpdHkgZ3VpZGVzLiBDb252ZXJ0ZXIgcHJpb3JpdHkgZGV0ZXJtaW5lcyB3aGljaCBjb252ZXJ0ZXIKKyAqIGluc3RhbmNlIHRvIGJlIHVzZWQgaWYgbW9yZSB0aGFuIG9uZSBjb252ZXJ0ZXJzIGFyZSBhYmxlIHRvIHBlcmZvcm0gdGhlCisgKiByZXF1ZXN0ZWQgY29udmVyc2lvbi4gQ29udmVydGVyIGltcGxlbWVudG9yIGNhbiB1c2UgdGhpcyB2YWx1ZSB0byBvcmRlcgorICogdGhlIHByZWZlcmVuY2UgYmFzZWQgb24gYXR0cmlidXRlcyBzdWNoIGFzIHF1YWxpdHkgb3IgcGVyZm9ybWFuY2UuIEhpZ2hlcgorICogbnVtYmVyIGluZGljYXRlcyBoaWdoZXIgcHJpb3JpdHkuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX2NvbnZlcnRlcl9wcmlvcml0eV9ndWlkZQoreworICAgIC8qKiBMb3dlc3QgcHJpb3JpdHkuICovCisgICAgUEpNRURJQV9DT05WRVJURVJfUFJJT1JJVFlfTE9XRVNUIAkJPSAwLAorCisgICAgLyoqIE5vcm1hbCBwcmlvcml0eS4gKi8KKyAgICBQSk1FRElBX0NPTlZFUlRFUl9QUklPUklUWV9OT1JNQUwgCQk9IDE1MDAwLAorCisgICAgLyoqIEhpZ2hlc3QgcHJpb3JpdHkuICovCisgICAgUEpNRURJQV9DT05WRVJURVJfUFJJT1JJVFlfSElHSEVTVCAJCT0gMzIwMDAKK30gcGptZWRpYV9jb252ZXJ0ZXJfcHJpb3JpdHlfZ3VpZGU7CisKKy8qKgorICogQ29udmVydGVyIGZhY3RvcnkuIFRoZSBjb252ZXJ0ZXIgZmFjdG9yeSByZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbgorICogdG8gY3JlYXRlIGNvbnZlcnRlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29udmVydGVyX2ZhY3RvcnkKK3sKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBsaXN0IG1lbWJlcnMuCisgICAgICovCisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgcGptZWRpYV9jb252ZXJ0ZXJfZmFjdG9yeSk7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG5hbWUuCisgICAgICovCisgICAgY29uc3QgY2hhciAJCQkgKm5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0ZXIgcHJpb3JpdHkgZGV0ZXJtaW5lcyB3aGljaCBjb252ZXJ0ZXIgaW5zdGFuY2UgdG8gYmUgdXNlZCBpZgorICAgICAqIG1vcmUgdGhhbiBvbmUgY29udmVydGVycyBhcmUgYWJsZSB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgY29udmVyc2lvbi4KKyAgICAgKiBDb252ZXJ0ZXIgaW1wbGVtZW50b3IgY2FuIHVzZSB0aGlzIHZhbHVlIHRvIG9yZGVyIHRoZSBwcmVmZXJlbmNlIGJhc2VkCisgICAgICogb24gYXR0cmlidXRlcyBzdWNoIGFzIHF1YWxpdHkgb3IgcGVyZm9ybWFuY2UuIEhpZ2hlciBudW1iZXIgaW5kaWNhdGVzCisgICAgICogaGlnaGVyIHByaW9yaXR5LiBUaGUgcGptZWRpYV9jb252ZXJ0ZXJfcHJpb3JpdHlfZ3VpZGUgZW51bWVyYXRpb24gc2hhbGwKKyAgICAgKiBiZSB1c2VkIGFzIHRoZSBiYXNlIHZhbHVlIHRvIHNldCB0aGUgcHJpb3JpdHkuCisgICAgICovCisgICAgaW50IHByaW9yaXR5OworCisgICAgLyoqCisgICAgICogUG9pbnRlciB0byBmYWN0b3J5IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwam1lZGlhX2NvbnZlcnRlcl9mYWN0b3J5X29wICpvcDsKKworfSBwam1lZGlhX2NvbnZlcnRlcl9mYWN0b3J5OworCisvKiogRm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgY29udmVydGVyIG9wZXJhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfY29udmVydGVyX29wIHBqbWVkaWFfY29udmVydGVyX29wOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGNvbnZlcnRlciBpbnN0YW5jZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb252ZXJ0ZXIKK3sKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIGNvbnZlcnRlciBvcGVyYXRpb24uCisgICAgICovCisgICAgcGptZWRpYV9jb252ZXJ0ZXJfb3AgKm9wOworCit9IHBqbWVkaWFfY29udmVydGVyOworCisKKy8qKgorICogQ29udmVydGVyIGZhY3Rvcnkgb3BlcmF0aW9uLgorICovCitzdHJ1Y3QgcGptZWRpYV9jb252ZXJ0ZXJfZmFjdG9yeV9vcAoreworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGNvbnZlcnRlciB3aXRoIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbiBmb3JtYXQsCisgICAgICogaWYgc3VjaCBmb3JtYXQgaXMgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNmCVRoZSBjb252ZXJ0ZXIgZmFjdG9yeS4KKyAgICAgKiBAcGFyYW0gcG9vbAlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tLgorICAgICAqIEBwYXJhbSBwcm0JQ29udmVyc2lvbiBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHBfY3YJUG9pbnRlciB0byBob2xkIHRoZSBjcmVhdGVkIGNvbnZlcnRlciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgY29udmVydGVyIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqY3JlYXRlX2NvbnZlcnRlcikocGptZWRpYV9jb252ZXJ0ZXJfZmFjdG9yeSAqY2YsCisJCQkJICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgY29uc3QgcGptZWRpYV9jb252ZXJzaW9uX3BhcmFtICpwcm0sCisJCQkJICAgIHBqbWVkaWFfY29udmVydGVyICoqcF9jdik7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95IHRoZSBmYWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGNmCVRoZSBjb252ZXJ0ZXIgZmFjdG9yeS4KKyAgICAgKi8KKyAgICB2b2lkICgqZGVzdHJveV9mYWN0b3J5KShwam1lZGlhX2NvbnZlcnRlcl9mYWN0b3J5ICpjZik7Cit9OworCisvKioKKyAqIENvbnZlcnRlciBvcGVyYXRpb24uCisgKi8KK3N0cnVjdCBwam1lZGlhX2NvbnZlcnRlcl9vcAoreworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGJ1ZmZlciBpbiB0aGUgc291cmNlIGZyYW1lIGFuZCBzYXZlIHRoZSByZXN1bHQgaW4gdGhlCisgICAgICogYnVmZmVyIG9mIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSwgYWNjb3JkaW5nIHRvIGNvbnZlcnNpb24gZm9ybWF0IHRoYXQKKyAgICAgKiB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlIGNvbnZlcnRlciB3YXMgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBhcHBsaWNhdGlvbiBzaG91bGQgdXNlICNwam1lZGlhX2NvbnZlcnRlcl9jb252ZXJ0KCkgaW5zdGVhZAorICAgICAqIG9mIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdglUaGUgY29udmVydGVyIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBzcmNfZnJhbWUJVGhlIHNvdXJjZSBmcmFtZS4KKyAgICAgKiBAcGFyYW0gZHN0X2ZyYW1lCVRoZSBkZXN0aW5hdGlvbiBmcmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgY29udmVyc2lvbiBoYXMgYmVlbiBwZXJmb3JtZWQKKyAgICAgKiAJCQlzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpjb252ZXJ0KShwam1lZGlhX2NvbnZlcnRlciAqY3YsCisJCQkgICBwam1lZGlhX2ZyYW1lICpzcmNfZnJhbWUsCisJCQkgICBwam1lZGlhX2ZyYW1lICpkc3RfZnJhbWUpOworCisgICAgLyoqCisgICAgICogRGVzdHJveSB0aGUgY29udmVydGVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGFwcGxpY2F0aW9uIHNob3VsZCB1c2UgI3BqbWVkaWFfY29udmVydGVyX2Rlc3Ryb3koKSBpbnN0ZWFkCisgICAgICogb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGN2CVRoZSBjb252ZXJ0ZXIuCisgICAgICovCisgICAgdm9pZCAoKmRlc3Ryb3kpKHBqbWVkaWFfY29udmVydGVyICpjdik7CisKK307CisKKworLyoqCisgKiBPcGFxdWUgZGF0YSB0eXBlIGZvciBjb252ZXJzaW9uIG1hbmFnZXIuIFR5cGljYWxseSwgdGhlIGNvbnZlcnNpb24gbWFuYWdlcgorICogaXMgYSBzaW5nbGV0b24gaW5zdGFuY2UsIGFsdGhvdWdoIGFwcGxpY2F0aW9uIG1heSBpbnN0YW50aWF0ZSBtb3JlIHRoYW4gb25lCisgKiBpbnN0YW5jZXMgb2YgdGhpcyBpZiByZXF1aXJlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9jb252ZXJ0ZXJfbWdyIHBqbWVkaWFfY29udmVydGVyX21ncjsKKworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBjb252ZXJzaW9uIG1hbmFnZXIgaW5zdGFuY2UuIFRoaXMgd2lsbCBhbHNvIHNldCB0aGUgcG9pbnRlcgorICogdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiB0aGUgdmFsdWUgaXMgc3RpbGwgTlVMTC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbS4KKyAqIEBwYXJhbSBtZ3IJCVBvaW50ZXIgdG8gaG9sZCB0aGUgY3JlYXRlZCBpbnN0YW5jZSBvZiB0aGUKKyAqIAkJCWNvbnZlcnNpb24gbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29udmVydGVyX21ncl9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkJICBwam1lZGlhX2NvbnZlcnRlcl9tZ3IgKiptZ3IpOworCisvKioKKyAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBjb252ZXJzaW9uIG1hbmFnZXIuCisgKgorICogQHJldHVybgkJVGhlIGluc3RhbmNlLgorICovCitQSl9ERUNMKHBqbWVkaWFfY29udmVydGVyX21nciopIHBqbWVkaWFfY29udmVydGVyX21ncl9pbnN0YW5jZSh2b2lkKTsKKworLyoqCisgKiBNYW51YWxseSBhc3NpZ24gYSBzcGVjaWZpYyB2aWRlbyBtYW5hZ2VyIGluc3RhbmNlIGFzIHRoZSBzaW5nbGV0b24KKyAqIGluc3RhbmNlLiBOb3JtYWxseSB0aGlzIGlzIG5vdCBuZWVkZWQgaWYgb25seSBvbmUgaW5zdGFuY2UgaXMgZXZlcgorICogZ29pbmcgdG8gYmUgY3JlYXRlZCwgYXMgdGhlIGxpYnJhcnkgYXV0b21hdGljYWxseSBhc3NpZ24gdGhlIHNpbmdsZXRvbgorICogaW5zdGFuY2UuCisgKgorICogQHBhcmFtIG1ncgkJVGhlIGluc3RhbmNlIHRvIGJlIHVzZWQgYXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAqIAkJCUFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IE5VTEwgdG8gY2xlYXIgdGhlIHNpbmdsZXRvbgorICogCQkJc2luZ2xldG9uIGluc3RhbmNlLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfY29udmVydGVyX21ncl9zZXRfaW5zdGFuY2UocGptZWRpYV9jb252ZXJ0ZXJfbWdyICptZ3IpOworCisvKioKKyAqIERlc3Ryb3kgYSBjb252ZXJ0ZXIgbWFuYWdlci4gSWYgdGhlIG1hbmFnZXIgaGFwcGVucyB0byBiZSB0aGUgc2luZ2xldG9uCisgKiBpbnN0YW5jZSwgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSB3aWxsIGJlIHNldCB0byBOVUxMLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSBjb252ZXJ0ZXIgbWFuYWdlci4gU3BlY2lmeSBOVUxMIHRvIHVzZQorICogCQkJdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX2NvbnZlcnRlcl9tZ3JfZGVzdHJveShwam1lZGlhX2NvbnZlcnRlcl9tZ3IgKm1ncik7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjb252ZXJ0ZXIgZmFjdG9yeSB0byB0aGUgY29udmVydGVyIG1hbmFnZXIuCisgKgorICogQHBhcmFtIG1ncgkJVGhlIGNvbnZlcnRlciBtYW5hZ2VyLiBTcGVjaWZ5IE5VTEwgdG8gdXNlCisgKiAJCQl0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICogQHBhcmFtIGYJCVRoZSBjb252ZXJ0ZXIgZmFjdG9yeSB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfY29udmVydGVyX21ncl9yZWdpc3Rlcl9mYWN0b3J5KHBqbWVkaWFfY29udmVydGVyX21nciAqbWdyLAorCQkJCSAgICAgICBwam1lZGlhX2NvbnZlcnRlcl9mYWN0b3J5ICpmKTsKKworLyoqCisgKiBVbnJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbnZlcnRlciBmYWN0b3J5IGZyb20gdGhlIGNvbnZlcnRlcgorICogbWFuYWdlci4KKyAqCisgKiBAcGFyYW0gbWdyCQlUaGUgY29udmVydGVyIG1hbmFnZXIuIFNwZWNpZnkgTlVMTCB0byB1c2UKKyAqIAkJCXRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisgKiBAcGFyYW0gZgkJVGhlIGNvbnZlcnRlciBmYWN0b3J5IHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAqIEBwYXJhbSBjYWxsX2Rlc3Ryb3kJSWYgdGhpcyBpcyBzZXQgdG8gbm9uLXplcm8sIHRoZSBcYSBkZXN0cm95X2ZhY3RvcnkoKQorICogCQkJY2FsbGJhY2sgb2YgdGhlIGZhY3Rvcnkgd2lsbCBiZSBjYWxsZWQgd2hpbGUKKyAqIAkJCXVucmVnaXN0ZXJpbmcgdGhlIGZhY3RvcnkgZnJvbSB0aGUgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX2NvbnZlcnRlcl9tZ3JfdW5yZWdpc3Rlcl9mYWN0b3J5KHBqbWVkaWFfY29udmVydGVyX21nciAqbWdyLAorCQkJCSAgICAgICAgIHBqbWVkaWFfY29udmVydGVyX2ZhY3RvcnkgKmYsCisJCQkJICAgICAgICAgcGpfYm9vbF90IGNhbGxfZGVzdHJveSk7CisKKy8qKgorICogQ3JlYXRlIGEgY29udmVydGVyIGluc3RhbmNlIHRvIHBlcmZvcm0gdGhlIHNwZWNpZmllZCBmb3JtYXQgY29udmVyc2lvbgorICogYXMgc3BlY2lmaWVkIGluIFxhIHBhcmFtLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSBjb252ZXJ0ZXIgbWFuYWdlci4gU3BlY2lmeSBOVUxMIHRvIHVzZQorICogCQkJdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgZnJvbS4KKyAqIEBwYXJhbSBwYXJhbQkJQ29udmVyc2lvbiBwYXJhbWV0ZXIuCisgKiBAcGFyYW0gcF9jdgkJUG9pbnRlciB0byBob2xkIHRoZSBjcmVhdGVkIGNvbnZlcnRlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIGEgY29udmVydGVyIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgKiAJCQlvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb252ZXJ0ZXJfY3JlYXRlKHBqbWVkaWFfY29udmVydGVyX21nciAqbWdyLAorCQkJCQkgICAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgIHBqbWVkaWFfY29udmVyc2lvbl9wYXJhbSAqcGFyYW0sCisJCQkJCSAgICAgIHBqbWVkaWFfY29udmVydGVyICoqcF9jdik7CisKKy8qKgorICogQ29udmVydCB0aGUgYnVmZmVyIGluIHRoZSBzb3VyY2UgZnJhbWUgYW5kIHNhdmUgdGhlIHJlc3VsdCBpbiB0aGUKKyAqIGJ1ZmZlciBvZiB0aGUgZGVzdGluYXRpb24gZnJhbWUsIGFjY29yZGluZyB0byBjb252ZXJzaW9uIGZvcm1hdCB0aGF0CisgKiB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlIGNvbnZlcnRlciB3YXMgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gY3YJCVRoZSBjb252ZXJ0ZXIgaW5zdGFuY2UuCisgKiBAcGFyYW0gc3JjX2ZyYW1lCVRoZSBzb3VyY2UgZnJhbWUuCisgKiBAcGFyYW0gZHN0X2ZyYW1lCVRoZSBkZXN0aW5hdGlvbiBmcmFtZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIGNvbnZlcnNpb24gaGFzIGJlZW4gcGVyZm9ybWVkCisgKiAJCQlzdWNjZXNzZnVsbHkuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29udmVydGVyX2NvbnZlcnQocGptZWRpYV9jb252ZXJ0ZXIgKmN2LAorCQkJCQkgICAgICAgcGptZWRpYV9mcmFtZSAqc3JjX2ZyYW1lLAorCQkJCQkgICAgICAgcGptZWRpYV9mcmFtZSAqZHN0X2ZyYW1lKTsKKworLyoqCisgKiBEZXN0cm95IHRoZSBjb252ZXJ0ZXIuCisgKgorICogQHBhcmFtIGN2CQlUaGUgY29udmVydGVyIGluc3RhbmNlLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfY29udmVydGVyX2Rlc3Ryb3kocGptZWRpYV9jb252ZXJ0ZXIgKmN2KTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYgLyogX19QSk1FRElBX0NPTlZFUlRFUl9IX18gKi8KKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9kZWxheWJ1Zi5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZGVsYXlidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE3YzRkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZGVsYXlidWYuaApAQCAtMCwwICsxLDE3NiBAQAorLyogJElkOiBkZWxheWJ1Zi5oIDM4NDEgMjAxMS0xMC0yNCAwOToyODoxM1ogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisjaWZuZGVmIF9fUEpNRURJQV9ERUxBWUJVRl9IX18KKyNkZWZpbmUgX19QSk1FRElBX0RFTEFZQlVGX0hfXworCisKKy8qKgorICogQGZpbGUgZGVsYXlidWYuaAorICogQGJyaWVmIERlbGF5IEJ1ZmZlci4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS90eXBlcy5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRF9ERUxBWUJVRiBBZGFwdGl2ZSBEZWxheSBCdWZmZXIKKyAqIEBpbmdyb3VwIFBKTUVESUFfRlJBTUVfT1AKKyAqIEBicmllZiBBZGFwdGl2ZSBkZWxheSBidWZmZXIgd2l0aCBoaWdoLXF1YWxpdHkgdGltZS1zY2FsZQorICogbW9kaWZpY2F0aW9uCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgUEpNRURJQSdzIGltcGxlbWVudGF0aW9uIG9mIGRlbGF5IGJ1ZmZlci4KKyAqIERlbGF5IGJ1ZmZlciB3b3JrcyBxdWl0ZSBzaW1pbGFybHkgbGlrZSBhIGZpeGVkIGppdHRlciBidWZmZXIsIHRoYXQKKyAqIGlzIGl0IHdpbGwgZGVsYXkgdGhlIGZyYW1lIHJldHJpZXZhbCBieSBzb21lIGludGVydmFsIHNvIHRoYXQgY2FsbGVyCisgKiB3aWxsIGdldCBjb250aW51b3VzIGZyYW1lIGZyb20gdGhlIGJ1ZmZlci4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4KKyAqIHRoZSBwdXQoKSBhbmQgZ2V0KCkgb3BlcmF0aW9ucyBhcmUgbm90IGV2ZW5seSBpbnRlcmxlYXZlZCwgZm9yIGV4YW1wbGUKKyAqIHdoZW4gY2FsbGVyIHBlcmZvcm1zIGJ1cnN0IG9mIHB1dCgpIG9wZXJhdGlvbnMgYW5kIHRoZW4gZm9sbG93ZWQgYnkKKyAqIGJ1cnN0IG9mIGdldCgpIG9wZXJhdGlvbnMuIFdpdGggdXNpbmcgdGhpcyBkZWxheSBidWZmZXIsIHRoZSBidWZmZXIKKyAqIHdpbGwgcHV0IHRoZSBidXJzdCBmcmFtZXMgaW50byBhIGJ1ZmZlciBzbyB0aGF0IGdldCgpIG9wZXJhdGlvbnMKKyAqIHdpbGwgYWx3YXlzIGdldCBhIGZyYW1lIGZyb20gdGhlIGJ1ZmZlciAoYXNzdW1pbmcgdGhhdCB0aGUgbnVtYmVyIG9mCisgKiBnZXQoKSBhbmQgcHV0KCkgYXJlIG1hdGNoZWQpLgorICoKKyAqIFRoZSBidWZmZXIgaXMgYWRhcHRpdmUsIHRoYXQgaXMgaXQgY29udGludW91c2x5IGxlYXJucyB0aGUgb3B0aW1hbCBkZWxheQorICogdG8gYmUgYXBwbGllZCB0byB0aGUgYXVkaW8gZmxvdyBhdCBydW4tdGltZS4gT25jZSB0aGUgb3B0aW1hbCBkZWxheSBoYXMgCisgKiBiZWVuIGxlYXJuZWQsIHRoZSBkZWxheSBidWZmZXIgd2lsbCBhcHBseSB0aGlzIGRlbGF5IHRvIHRoZSBhdWRpbyBmbG93LAorICogZXhwYW5kaW5nIG9yIHNocmlua2luZyB0aGUgYXVkaW8gc2FtcGxlcyBhcyBuZWNlc3Nhcnkgd2hlbiB0aGUgYWN0dWFsCisgKiBhdWRpbyBzYW1wbGVzIGluIHRoZSBidWZmZXIgYXJlIHRvbyBsb3cgb3IgdG9vIGhpZ2guIEl0IGRvZXMgdGhpcyB3aXRob3V0CisgKiBkaXN0b3J0aW5nIHRoZSBhdWRpbyBxdWFsaXR5IG9mIHRoZSBhdWRpbywgYnkgdXNpbmcgXGEgUEpNRURfV1NPTEEuCisgKgorICogVGhlIGRlbGF5IGJ1ZmZlciBpcyB1c2VkIGluIFxyZWYgUEpNRURfU05EX1BPUlQsIFxyZWYgUEpNRURJQV9TUExJVENPTUIsCisgKiBhbmQgXHJlZiBQSk1FRElBX0NPTkYuCisgKi8KKworUEpfQkVHSU5fREVDTAorCisvKiogT3BhcXVlIGRlY2xhcmF0aW9uIGZvciBkZWxheSBidWZmZXIuICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2RlbGF5X2J1ZiBwam1lZGlhX2RlbGF5X2J1ZjsKKworLyoqCisgKiBEZWxheSBidWZmZXIgb3B0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZGVsYXlfYnVmX2ZsYWcKK3sKKyAgICAvKioKKyAgICAgKiBVc2Ugc2ltcGxlIEZJRk8gbWVjaGFuaXNtIGZvciB0aGUgZGVsYXkgYnVmZmVyLCBpLmUuCisgICAgICogd2l0aG91dCBXU09MQSBmb3IgZXhwYW5kaW5nIGFuZCBzaHJpbmtpbmcgYXVkaW8gc2FtcGxlcy4KKyAgICAgKi8KKyAgICBQSk1FRElBX0RFTEFZX0JVRl9TSU1QTEVfRklGTyA9IDEKKworfSBwam1lZGlhX2RlbGF5X2J1Zl9mbGFnOworCisvKioKKyAqIENyZWF0ZSB0aGUgZGVsYXkgYnVmZmVyLiBPbmNlIHRoZSBkZWxheSBidWZmZXIgaXMgY3JlYXRlZCwgaXQgd2lsbAorICogZW50ZXIgbGVhcm5pbmcgc3RhdGUgdW5sZXNzIHRoZSBkZWxheSBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHdoaWNoCisgKiBpbiB0aGlzIGNhc2UgaXQgd2lsbCBkaXJlY3RseSBlbnRlciB0aGUgcnVubmluZyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgd2hlcmUgdGhlIGRlbGF5IGJ1ZmZlciB3aWxsIGJlIGFsbG9jYXRlZAorICoJCQkgICAgZnJvbS4KKyAqIEBwYXJhbSBuYW1lCQkgICAgT3B0aW9uYWwgbmFtZSBmb3IgdGhlIGJ1ZmZlciBmb3IgbG9nIAorICoJCQkgICAgaWRlbnRpZmljYXRpb24uCisgKiBAcGFyYW0gY2xvY2tfcmF0ZQkgICAgTnVtYmVyIG9mIHNhbXBsZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lLgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIE51bWJlciBvZiBjaGFubmVsIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBtYXhfZGVsYXkJICAgIE1heGltdW0gbnVtYmVyIG9mIGRlbGF5IHRvIGJlIGFjY29tbW9kYXRlZCwKKyAqCQkJICAgIGluIG1zLCBpZiB0aGlzIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIGxlc3MgdGhhbiAKKyAqCQkJICAgIG9uZSBmcmFtZSB0aW1lLCBkZWZhdWx0IG1heGltdW0gZGVsYXkgdXNlZCBpcworICoJCQkgICAgNDAwIG1zLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE9wdGlvbnMuIElmIFBKTUVESUFfREVMQVlfQlVGX1NJTVBMRV9GSUZPIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIGEgc2ltcGxlIEZJRk8gbWVjaGFuaXNtCisgKgkJCSAgICB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWRhcHRpdmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggdXNlcyBXU09MQSB0byBleHBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzaHJpbmsgYXVkaW8gc2FtcGxlcykuCisgKgkJCSAgICBTZWUgI3BqbWVkaWFfZGVsYXlfYnVmX2ZsYWcgZm9yIG90aGVyIG9wdGlvbnMuCisgKiBAcGFyYW0gcF9iCQkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBkZWxheSBidWZmZXIgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1MgaWYgdGhlIGRlbGF5IGJ1ZmZlciBoYXMgYmVlbgorICoJCQkgICAgY3JlYXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJICAgIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZGVsYXlfYnVmX2NyZWF0ZShwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCSAgICAgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkgICAgICB1bnNpZ25lZCBtYXhfZGVsYXksCisJCQkJCSAgICAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCSAgICAgIHBqbWVkaWFfZGVsYXlfYnVmICoqcF9iKTsKKworLyoqCisgKiBQdXQgb25lIGZyYW1lIGludG8gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYgkJICAgIFRoZSBkZWxheSBidWZmZXIuCisgKiBAcGFyYW0gZnJhbWUJCSAgICBGcmFtZSB0byBiZSBwdXQgaW50byB0aGUgYnVmZmVyLiBUaGlzIGZyYW1lCisgKgkJCSAgICBtdXN0IGhhdmUgc2FtcGxlc19wZXJfZnJhbWUgbGVuZ3RoLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIGlmIGZyYW1lcyBjYW4gYmUgcHV0IHN1Y2Nlc3NmdWxseS4KKyAqCQkJICAgIFBKX0VQRU5ESU5HIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgYXQgbGVhcm5pbmcKKyAqCQkJICAgIHN0YXRlLiBQSl9FVE9PTUFOWSBpZiB0aGUgbnVtYmVyIG9mIGZyYW1lcworICoJCQkgICAgd2lsbCBleGNlZWQgbWF4aW11bSBkZWxheSBsZXZlbCwgd2hpY2ggaW4gdGhpcworICoJCQkgICAgY2FzZSB0aGUgbmV3IGZyYW1lIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGRlc3QKKyAqCQkJICAgIGZyYW1lIGluIHRoZSBidWZmZXIuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZGVsYXlfYnVmX3B1dChwam1lZGlhX2RlbGF5X2J1ZiAqYiwKKwkJCQkJICAgcGpfaW50MTZfdCBmcmFtZVtdKTsKKworLyoqCisgKiBHZXQgb25lIGZyYW1lIGZyb20gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYgkJICAgIFRoZSBkZWxheSBidWZmZXIuCisgKiBAcGFyYW0gZnJhbWUJCSAgICBCdWZmZXIgdG8gcmVjZWl2ZSB0aGUgZnJhbWUgZnJvbSB0aGUgZGVsYXkKKyAqCQkJICAgIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBpZiBmcmFtZSBoYXMgYmVlbiBjb3BpZWQgc3VjY2Vzc2Z1bGx5LgorICoJCQkgICAgUEpfRVBFTkRJTkcgaWYgbm8gZnJhbWUgaXMgYXZhaWxhYmxlLCBlaXRoZXIKKyAqCQkJICAgIGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBzdGlsbCBhdCBsZWFybmluZyBzdGF0ZSBvcgorICoJCQkgICAgbm8gYnVmZmVyIGlzIGF2YWlsYWJsZSBkdXJpbmcgcnVubmluZyBzdGF0ZS4KKyAqCQkJICAgIE9uIG5vbi1zdWNjZXNzZnVsIHJldHVybiwgdGhlIGZyYW1lIHdpbGwgYmUKKyAqCQkJICAgIGZpbGxlZCB3aXRoIHplcm9lcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9kZWxheV9idWZfZ2V0KHBqbWVkaWFfZGVsYXlfYnVmICpiLAorCQkJCQkgICBwal9pbnQxNl90IGZyYW1lW10pOworCisvKioKKyAqIFJlc2V0IGRlbGF5IGJ1ZmZlci4gVGhpcyB3aWxsIGNsZWFyIHRoZSBidWZmZXIncyBjb250ZW50LiBCdXQga2VlcAorICogdGhlIGxlYXJuaW5nIHJlc3VsdC4KKyAqCisgKiBAcGFyYW0gYgkJICAgIFRoZSBkZWxheSBidWZmZXIuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZGVsYXlfYnVmX3Jlc2V0KHBqbWVkaWFfZGVsYXlfYnVmICpiKTsKKworLyoqCisgKiBEZXN0cm95IGRlbGF5IGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gYgkgICAgRGVsYXkgYnVmZmVyIHNlc3Npb24uCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBub3JtYWxseS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9kZWxheV9idWZfZGVzdHJveShwam1lZGlhX2RlbGF5X2J1ZiAqYik7CisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfREVMQVlCVUZfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9kb3h5Z2VuLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9kb3h5Z2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5M2NhMgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2RveHlnZW4uaApAQCAtMCwwICsxLDI0NCBAQAorLyogJElkOiBkb3h5Z2VuLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0RPWFlHRU5fSF9fCisjZGVmaW5lIF9fUEpNRURJQV9ET1hZR0VOX0hfXworCisvKioKKyAqIEBmaWxlIGRveHlnZW4uaAorICogQGJyaWVmIERveHlnZW4ncyBtYWlucGFnZS4KKyAqLworCisKKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qCisJSU5UUk9EVUNUSU9OIFBBR0UKKyAqLworCisvKioKKyAqIEBtYWlucGFnZSBQSk1FRElBCisgKgorICogXG4KKyAqIEBzZWN0aW9uIGludHJvMiBJbnRyb2R1Y3Rpb24gdG8gUEpNRURJQQorICoKKyAqIFBKTUVESUEgaXMgYSBmdWxseSBmZWF0dXJlZCBtZWRpYSBzdGFjaywgZGlzdHJpYnV0ZWQgdW5kZXIgT3BlbiBTb3VyY2UvR1BMCisgKiB0ZXJtcywgYW5kIGZlYXR1cmluZyBzbWFsbCBmb290cHJpbnQgYW5kIGdvb2QgZXh0ZW5zaWJpbGl0eSBhbmQgZXhjZWxsZW50CisgKiBwb3J0YWJpbGl0eS4gSGVyZSBhcmUgc29tZSBicmllZiBvdmVydmlldyBvZiBQSk1FRElBIGJlbmVmaXRzLgorICoKKyAqIEBzdWJzZWN0aW9uIGJlbmVmaXQgQmVuZWZpdHMKKyAqIEBzdWJzdWJzZWN0aW9uIGZ1bGxfZmVhdHVyZSBNYW55IEZlYXR1cmVzCisgKiBQSk1FRElBIGhhcyBtYW55IGZlYXR1cmVzLCBhbmQgcmF0aGVyIHRoYW4gdG8gbGlzdCB0aGVtIGFsbCBoZXJlLCBwbGVhc2UKKyAqIHNlZSB0aGUgPEEgSFJFRj0ibW9kdWxlcy5odG0iPjxiPk1vZHVsZXM8L2I+PC9BPiBwYWdlIGZvciBtb3JlIGluZm8uCisgKgorICogVmlkZW8gaXMgcGxhbm5lZCB0byBhcnJpdmUgYXQgdmVyc2lvbiAyLgorICoKKyAqIEBzdWJzdWJzZWN0aW9uIHBvcnRhYmxlIEV4Y2VsbGVudCBQb3J0YWJpbGl0eQorICogSXQncyBiZWVuIHBvcnRlZCB0byBhbGwgZGVza3RvcCBzeXN0ZW1zIGFuZCBtYW55IG1vYmlsZSBwbGF0Zm9ybXMgaW5jbHVkaW5nCisgKiBTeW1iaWFuLCBXaW5kb3dzIE1vYmlsZSwgaVBob25lLCBhbmQgQW5kcm9pZC4gVGhhbmtzIHRvIGl0cyB6ZXJvIHRocmVhZAorICogZGVzaWduLCB1c2VycyBoYXZlIGJlZW4gYWJsZSB0byBydW4gUEpNRURJQSBvbiBkZWVwbHkgZW1iZWRkZWQgcGxhdGZvcm1zLAorICogZXZlbiB3aXRob3V0IG9wZXJhdGluZyBzeXN0ZW1zICh0aG9zZSB0eXBpY2FsbHkgZm91bmQgaW4gRFNQIHBsYXRmb3JtcykuCisgKiBFeGNlcHQgdGhlIGVjaG8gc3VwcHJlc3NvciwgYWxsIG90aGVyIFBKTUVESUEgY29tcG9uZW50cyBoYXZlIGZpeGVkIHBvaW50CisgKiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggbWFrZXMgaXQgaWRlYWwgZm9yIGVtYmVkZGVkIHN5c3RlbXMgd2hpY2ggbGFjayBGUFUuCisgKiBQSk1FRElBIGFsc28gaGFzIHRpbnkgZm9vdHByaW50LCBhcyBleHBsYWluZWQgYmVsb3cKKyAqCisgKiBAc3Vic3Vic2VjdGlvbiBmb290cHJpbnQgVGlueSBGb290cHJpbnQKKyAqIExldHMgbm90IHRhbGsgYWJvdXQgbGVzcyBtZWFuaW5nZnVsIGFuZCBwb3RlbnRpYWxseSBtaXNsZWFkaW5nIHRlcm0gc3VjaCBhcworICogY29yZSBmb290cHJpbnQsIGFuZCBpbnN0ZWFkIGhlcmUgaXMgdGhlIGZvb3RwcmludCBvZiBhbGwgY29tcG9uZW50cworICogdHlwaWNhbGx5IHVzZWQgdG8gYnVpbGQgYSBmdWxsIHN0cmVhbWluZyBtZWRpYToKKyAqCisgKiBcdmVyYmF0aW0KK0NhdGVnb3J5ICAgICAgICBDb21wb25lbnQgICAgICAgdGV4dCAgICBkYXRhICAgIGJzcyAgICAgZGVjICAgICBmaWxlbmFtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29yZSAgICAgICAgICAgIEVycm9yIHN1YnN5c3RlbSAxMzUgICAgIDAgICAgICAgMCAgICAgICAxMzUgICAgIGVycm5vLm8KK0NvcmUgICAgICAgICAgICBFbmRwb2ludCAgICAgICAgNDIxMCAgICA0ICAgICAgIDQgICAgICAgNDIxOCAgICBlbmRwb2ludC5vCitDb3JlICAgICAgICAgICAgUG9ydCBmcmFtZXdvcmsgIDY1MiAgICAgMCAgICAgICAwICAgICAgIDY1MiAgICAgcG9ydC5vCitDb3JlICAgICAgICAgICAgQ29kZWMgZnJhbWV3b3JrIDYyNTcgICAgMCAgICAgICAwICAgICAgIDYyNTcgICAgY29kZWMubworQ29kZWMgICAgICAgICAgIEFsYXcvdWxhdyBjb252LiAxMDYwICAgIDE2ICAgICAgMCAgICAgICAxMDc2ICAgIGFsYXdfdWxhdy5vCitDb2RlYyAgICAgICAgICAgRy43MTEgICAgICAgICAgIDMyOTggICAgMTI4ICAgICA5NiAgICAgIDM1MjIgICAgZzcxMS5vCitDb2RlYyAgICAgICAgICAgUExDICAgICAgICAgICAgIDg4MyAgICAgMjQgICAgICAwICAgICAgIDkwNyAgICAgcGxjX2NvbW1vbi5vCitDb2RlYyAgICAgICAgICAgUExDICAgICAgICAgICAgIDcxMzAgICAgMCAgICAgICAwICAgICAgIDcxMzAgICAgd3NvbGEubworU2Vzc2lvbiAgICAgICAgIFN0cmVhbSAgICAgICAgICAxMjIyMiAgIDAgICAgICAgMTkyMCAgICAxNDE0MiAgIHN0cmVhbS5vCitUcmFuc3BvcnQgICAgICAgUlRDUCAgICAgICAgICAgIDM3MzIgICAgMCAgICAgICAwICAgICAgIDM3MzIgICAgcnRjcC5vCitUcmFuc3BvcnQgICAgICAgUlRQICAgICAgICAgICAgIDI1NjggICAgMCAgICAgICAwICAgICAgIDI1NjggICAgcnRwLm8KK1RyYW5zcG9ydCAgICAgICBVRFAgICAgICAgICAgICAgNjYxMiAgICA5NiAgICAgIDAgICAgICAgNjcwOCAgICB0cmFuc3BvcnRfdWRwLm8KK1RyYW5zcG9ydCAgICAgICBKaXR0ZXIgYnVmZmVyICAgNjQ3MyAgICAwICAgICAgIDAgICAgICAgNjQ3MyAgICBqYnVmLm8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICA1NSwyMzIgICAyNjggICAgMiwwMjAgICAgNTcsNTIwCisKKyBcZW5kdmVyYmF0aW0KKyAqIFRoZSA1NktCIGFyZSBmb3IgbWVkaWEgc3RyZWFtaW5nIGNvbXBvbmVudHMsIGNvbXBsZXRlIHdpdGggY29kZWMsIFJUUCwgYW5kCisgKiBSVENQLiBUaGUgZm9vdHByaW50IGFib3ZlIHdhcyBkb25lIGZvciBQSlNJUCB2ZXJzaW9uIDEuOC4yIG9uIGEgTGludXggeDg2CisgKiBtYWNoaW5lLCB1c2luZyBmb290cHJpbnRvcGltaXphdGlvbiBhcyBleHBsYWluZWQgaW4gUEpTSVAgRkFRLiBOdW1iZXJzIGFyZQorICogaW4gYnl0ZXMuCisgKgorICogQHN1YnN1YnNlY3Rpb24gcXVhbGl0eSBHb29kIFF1YWxpdHkKKyAqIFBKTUVESUEgc3VwcG9ydHMgd2lkZWJhbmQsIHVsdHJhLXdpZGViYW5kLCBhbmQgYmV5b25kLCBhcyB3ZWxsIGFzIG11bHRpcGxlCisgKiBhdWRpbyBjaGFubmVscy4gVGhlIGppdHRlciBidWZmZXIgaGFzIGJlZW4gcHJvdmVuIHRvIHdvcmsgb24gbG93ZXIKKyAqIGJhbmR3aWR0aCBsaW5rcyBzdWNoIGFzIDNHLCBhbmQgdG8gc29tZSBleHRlbnQsIEVkZ2UgYW5kIEdQUlMuIFdlJ3ZlIGdyb3duCisgKiBvdXIgb3duIGFsZ29yaXRobSB0byBjb21wZW5zYXRlIGZvciBwYWNrZXQgbG9zc2VzIGFuZCBjbG9jayBkcmlmdHMgaW4gYXVkaW8KKyAqIHRyYW5zbWlzc2lvbiwgYXMgd2VsbCBhcyBmZWF0dXJlIHRvIHVzZSBjb2RlYydzIGJ1aWx0IGluIFBMQyBpZiBhdmFpbGFibGUuCisgKgorICogQHN1YnN1YnNlY3Rpb24gaHcgSGFyZHdhcmUgU3VwcG9ydAorICogUEpNRURJQSBzdXBwb3J0cyBoYXJkd2FyZSwgZmlybXdhcmUsIG9yIG90aGVyIGJ1aWx0LWluIGZlYXR1cmUgdGhhdCBjb21lcworICogd2l0aCB0aGUgZGV2aWNlLiBUaGVzZSBhcmUgY3J1Y2lhbCBmb3IgbW9iaWxlIGRldmljZXMgdG8gYWxsb3cgdGhlIGJlc3QKKyAqIHVzZSBvZiB0aGUgdmVyeSBsaW1pdGVkIENQVSBhbmQgYmF0dGVyeSBwb3dlciBvZiB0aGUgZGV2aWNlLiBBbW9uZyBvdGhlcgorICogdGhpbmdzLCBkZXZpY2UncyBvbi1ib2FyZCBjb2RlYyBhbmQgZWNobyBjYW5jZWxsYXRpb24gbWF5IGJlIHVzZWQgaWYKKyAqIGF2YWlsYWJsZS4KKyAqCisgKiBAc3Vic3Vic2VjdGlvbiBleHRlbnNpYmxlIEV4dGVuc2libGUKKyAqIERlc3BpdGUgaXRzIHRpbnkgZm9vdHByaW50LCBQSk1FRElBIHVzZXMgYSBmbGV4aWJsZSBwb3J0IGNvbmNlcHQsIHdoaWNoIGlzCisgKiBhZGFwdGVkIGZyb20gZmlsdGVyIGJhc2VkIGNvbmNlcHQgZm91bmQgaW4gb3RoZXIgbWVkaWEgZnJhbWV3b3JrLiBJdCBpcyBub3QKKyAqIGFzIGZsZXhpYmxlIGFzIHRob3NlIGZvdW5kIGluIERpcmVjdCBTaG93IG9yIGdzdHJlYW1lciAoYW5kIHRoYXQgd291bGQgYmUKKyAqIHVubmVjZXNzYXJ5IHNpbmNlIGl0IHNlcnZlcyBkaWZmZXJlbnQgcHVycG9zZSksIGJ1dCBpdCdzIGZsZXhpYmxlIGVub3VnaAorICogdG8gYWxsb3cgY29tcG9uZW50cyB0byBiZSBhc3NlbWJsZWQgb25lIGFmdGVyIGFub3RoZXIgdG8gYWNoaWV2ZSBjZXJ0YWluCisgKiB0YXNrLCBhbmQgZWFzeSBjcmVhdGlvbiBvZiBzdWNoIGNvbXBvbmVudHMgYnkgYXBwbGljYXRpb24gYW5kIGludGVyY29ubmVjdAorICogdGhlbSB0byB0aGUgcmVzdCBvZiB0aGUgZnJhbWV3b3JrLgorICoKKyAqIEBzdWJzdWJzZWN0aW9uIGRvYyAoRmFpcmx5IE9rYXkpIERvY3VtZW50YXRpb24KKyAqIFdlIHVuZGVyc3RhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiBjYW4gYWx3YXlzIGJlIGltcHJvdmVkLCBidXQgd2UgcHV0CisgKiBhIGxvdCBvZiBlZmZvcnRzIGluIGNyZWF0aW5nIGFuZCBtYWludGFpbmluZyBvdXIgZG9jdW1lbnRhdGlvbiwgYmVjYXVzZQorICogd2Uga25vdyBpdCBtYXR0ZXJzLgorICoKKyAqIFxuCisgKiBAc3Vic2VjdGlvbiBvcmcxIE9yZ2FuaXphdGlvbgorICoKKyAqIEF0IHRoZSB0b3AtbW9zdCBsZXZlbCwgUEpNRURJQSBsaWJyYXJ5IHN1aXRlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKKyAqIGxpYnJhcmllcy4KKyAqCisgKiBAc3Vic3Vic2VjdGlvbiBsaWJwam1lZGlhIFBKTUVESUEKKyAqIFRoaXMgY29udGFpbnMgYWxsIG1haW4gbWVkaWEgY29tcG9uZW50cy4gUGxlYXNlIHNlZSB0aGUKKyAqIDxBIEhSRUY9Im1vZHVsZXMuaHRtIj48Yj5Nb2R1bGVzPC9iPjwvQT4gcGFnZSBmb3IgY29tcGxldGUgbGlzdCBvZgorICogY29tcG9uZW50cyB0aGF0IFBKTUVESUEgcHJvdmlkZXMuCisgKgorICogQHN1YnN1YnNlY3Rpb24gbGlicGptZWRpYWNvZGVjIFBKTUVESUEgQ29kZWMKKyAqIFBKTUVESUEtQ09ERUMgaXMgYSBzdGF0aWMgbGlicmFyeSBjb250YWluaW5nIHZhcmlvdXMgY29kZWMgaW1wbGVtZW50YXRpb25zLAorICogd3JhcHBlZCBpbnRvIFBKTUVESUEgY29kZWMgZnJhbWV3b3JrLiBUaGUgc3RhdGljIGxpYnJhcnkgaXMgZGVzaWduZWQgYXMKKyAqIHN1Y2ggc28gdGhhdCBvbmx5IGNvZGVjcyB0aGF0IGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGFyZSBsaW5rZWQgd2l0aCAKKyAqIHRoZSBhcHBsaWNhdGlvbiwgdGhlcmVmb3JlIGtlZXBpbmcgdGhlIGFwcGxpY2F0aW9uIHNpemUgaW4gY29udHJvbC4KKyAqCisgKiBQbGVhc2Ugc2VlIEByZWYgUEpNRURJQV9DT0RFQyBmb3IgbW9yZSBpbmZvLgorICoKKyAqIEBzdWJzdWJzZWN0aW9uIGxpYnBqbWVkaWFhdWRpb2RldiBQSk1FRElBIEF1ZGlvIERldmljZQorICogUEpNRURJQS1BdWRpb2RldiBpcyBhdWRpbyBkZXZpY2UgZnJhbWV3b3JrIGFuZCBhYnN0cmFjdGlvbiBsaWJyYXJ5LiBQbGVhc2UKKyAqIHNlZSBAcmVmIGF1ZGlvX2RldmljZV9hcGkgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBcbgorICogQHNlY3Rpb24gcGptZWRpYV9jb25jZXB0cyBQSk1FRElBIEtleSBDb25jZXB0cworICogQmVsb3cgYXJlIHNvbWUga2V5IGNvbmNlcHRzIGluIFBKTUVESUE6CisgKiAgLSBAcmVmIFBKTUVESUFfUE9SVAorICogIC0gQHJlZiBQSk1FRElBX1BPUlRfQ0xPQ0sKKyAqICAtIEByZWYgUEpNRURJQV9UUkFOU1BPUlQKKyAqICAtIEByZWYgUEpNRURJQV9TRVNTSU9OCisgKi8KKworCisvKioKKyAgQHBhZ2UgcGFnZV9wam1lZGlhX3NhbXBsZXMgUEpNRURJQSBhbmQgUEpNRURJQS1DT0RFQyBFeGFtcGxlcworCisgIEBzZWN0aW9uIHBqbWVkaWFfc2FtcGxlc19zZWMgUEpNRURJQSBhbmQgUEpNRURJQS1DT0RFQyBFeGFtcGxlcworCisgIFBsZWFzZSBmaW5kIGJlbG93IHNvbWUgUEpNRURJQSByZWxhdGVkIGV4YW1wbGVzIHRoYXQgbWF5IGhlbHAgaW4gZ2l2aW5nCisgIHNvbWUgbW9yZSBpbmZvOgorCisgIC0gQHJlZiBwYWdlX3BqbWVkaWFfc2FtcGxlc19sZXZlbF9jXG4KKyAgICBUaGlzIGlzIGEgZ29vZCBwbGFjZSB0byBzdGFydCBsZWFybmluZyBhYm91dCBAcmVmIFBKTUVESUFfUE9SVCwKKyAgICBhcyBpdCBzaG93cyB0aGF0IEByZWYgUEpNRURJQV9QT1JUIGFyZSBvbmx5ICJwYXNzaXZlIiBvYmplY3RzCisgICAgd2l0aCA8dHQ+Z2V0X2ZyYW1lKCk8L3R0PiBhbmQgPHR0PnB1dF9mcmFtZSgpPC90dD4gaW50ZXJmYWNlLCBhbmQKKyAgICBzb21lb25lIGhhcyB0byBjYWxsIHRoZXNlIHRvIHJldHJpZXZlL3N0b3JlIG1lZGlhIGZyYW1lcy4KKworICAtIEByZWYgcGFnZV9wam1lZGlhX3NhbXBsZXNfcGxheWZpbGVfY1xuCisgICAgVGhpcyBleGFtcGxlIHNob3dzIHRoYXQgd2hlbiBhcHBsaWNhdGlvbiBjb25uZWN0cyBhIG1lZGlhIHBvcnQgKGluIHRoaXMKKyAgICBjYXNlIGEgQHJlZiBQSk1FRElBX0ZJTEVfUExBWSkgdG8gQHJlZiBQSk1FRF9TTkRfUE9SVCwgbWVkaWEgd2lsbCBmbG93CisgICAgYXV0b21hdGljYWxseSBzaW5jZSB0aGUgQHJlZiBQSk1FRF9TTkRfUE9SVCBwcm92aWRlcyBAcmVmIFBKTUVESUFfUE9SVF9DTE9DSy4KKworICAtIEByZWYgcGFnZV9wam1lZGlhX3NhbXBsZXNfcmVjZmlsZV9jXG4KKyAgICBEZW1vbnN0cmF0ZXMgaG93IHRvIGNhcHR1cmUgYXVkaW8gZnJvbSBtaWNyb3Bob25lIHRvIFdBViBmaWxlLgorCisgIC0gQHJlZiBwYWdlX3BqbWVkaWFfc2FtcGxlc19wbGF5c2luZV9jXG4KKyAgICBEZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhIGN1c3RvbSBAcmVmIFBKTUVESUFfUE9SVCAoaW4gdGhpcworICAgIGNhc2UgYSBzaW5lIHdhdmUgZ2VuZXJhdG9yKSBhbmQgaW50ZWdyYXRlIGl0IHRvIFBKTUVESUEuCisKKyAgLSBAcmVmIHBhZ2VfcGptZWRpYV9zYW1wbGVzX2NvbmZzYW1wbGVfY1xuCisgICAgVGhpcyBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgQHJlZiBQSk1FRElBX0NPTkYuIFRoZSBzYW1wbGUgcHJvZ3JhbSBjYW4gCisgICAgb3BlbiBtdWx0aXBsZSBXQVYgZmlsZXMsIGFuZCBpbnN0cnVjdCB0aGUgY29uZmVyZW5jZSBicmlkZ2UgdG8gbWl4IHRoZQorICAgIHNpZ25hbCBiZWZvcmUgcGxheWluZyBpdCB0byB0aGUgc291bmQgZGV2aWNlLgorCisgIC0gQHJlZiBwYWdlX3BqbWVkaWFfc2FtcGxlc19jb25mYmVuY2hfY1xuCisgICAgSSB1c2UgdGhpcyB0byBiZW5jaG1hcmsvb3B0aW1pemUgdGhlIGNvbmZlcmVuY2UgYnJpZGdlIGFsZ29yaXRobSwgYnV0CisgICAgcmVhZGVycyBtYXkgZmluZCB0aGUgc291cmNlIHVzZWZ1bC4KKworICAtIEByZWYgcGFnZV9wam1lZGlhX3NhbXBsZXNfcmVzYW1wbGVwbGF5X2NcbgorICAgIERlbW9uc3RyYXRlcyBob3cgdG8gdXNlIEByZWYgUEpNRURJQV9SRVNBTVBMRV9QT1JUIHRvIGNoYW5nZSB0aGUKKyAgICBzYW1wbGluZyByYXRlIG9mIGEgbWVkaWEgcG9ydCAoaW4gdGhpcyBjYXNlLCBhIEByZWYgUEpNRURJQV9GSUxFX1BMQVkpLgorCisgIC0gQHJlZiBwYWdlX3BqbWVkaWFfc2FtcGxlc19zbmR0ZXN0X2NcbgorICAgIFRoaXMgcHJvZ3JhbSBwZXJmb3JtcyBzb21lIHRlc3RzIHRvIHRoZSBzb3VuZCBkZXZpY2UgdG8gZ2V0IHNvbWUKKyAgICBxdWFsaXR5IHBhcmFtZXRlcnMgKHN1Y2ggYXMgc291bmQgaml0dGVyIGFuZCBjbG9jayBkcmlmdHMpLlxuCisgICAgU2NyZWVuc2hvdHMgb24gV2luWFA6IFxpbWFnZSBodG1sIHNuZHRlc3QuanBnICJzbmR0ZXN0IHNjcmVlbnNob3Qgb24gV2luWFAiCisKKyAgLSBAcmVmIHBhZ2VfcGptZWRpYV9zYW1wbGVzX3N0cmVhbXV0aWxfY1xuCisgICAgVGhpcyBleGFtcGxlIG1haW5seSBkZW1vbnN0cmF0ZXMgaG93IHRvIHN0cmVhbSBtZWRpYSAoaW4gdGhpcyBjYXNlIGEKKyAgICBAcmVmIFBKTUVESUFfRklMRV9QTEFZKSB0byByZW1vdGUgcGVlciB1c2luZyBSVFAuCisKKyAgLSBAcmVmIHBhZ2VfcGptZWRpYV9zYW1wbGVzX3NpcHJ0cF9jXG4KKyAgICBUaGlzIGlzIGEgdXNlZnVsIHByb2dyYW0gKGludGVncmF0ZWQgd2l0aCBQSlNJUCkgdG8gYWN0aXZlbHkgbWVhc3VyZSAKKyAgICB0aGUgbmV0d29yayBxdWFsaXR5L2ltcGFpcm1lbnQgcGFyYW1ldGVycyBieSBtYWtpbmcgb25lIG9yIG1vcmUgU0lQIAorICAgIGNhbGxzIChvciByZWNlaXZpbmcgb25lIG9yIG1vcmUgU0lQIGNhbGxzKSBhbmQgZGlzcGxheSB0aGUgbmV0d29yaworICAgIGltcGFpcm1lbnQgb2YgZWFjaCBzdHJlYW0gZGlyZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwuCisgICAgVGhlIHByb2dyYW0gaXMgYWJsZSB0byBtZWFzdXJlIG5ldHdvcmsgcXVhbGl0eSBwYXJhbWV0ZXJzIHN1Y2ggYXMKKyAgICBqaXR0ZXIsIHBhY2tldCBsb3N0L3Jlb3JkZXIvZHVwbGljYXRlLCByb3VuZCB0cmlwIHRpbWUsIGV0Yy5cbgorICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIHBlZXIgTVVTVCBzdXBwb3J0IFJUQ1Agc28gdGhhdCBuZXR3b3JrIHF1YWxpdHkKKyAgICBvZiBlYWNoIGRpcmVjdGlvbiBjYW4gYmUgY2FsY3VsYXRlZC4gVXNpbmcgc2lwcnRwIGZvciBib3RoIGVuZHBvaW50cworICAgIGlzIHJlY29tbWVuZGVkLlxuCisgICAgU2NyZWVuc2hvdHMgb24gV2luWFA6IFxpbWFnZSBodG1sIHNpcHJ0cC5qcGcgInNpcHJ0cCBzY3JlZW5zaG90IG9uIFdpblhQIgorCisgIC0gQHJlZiBwYWdlX3BqbWVkaWFfc2FtcGxlc190b25lZ2VuX2NcbgorICAgIFRoaXMgaXMgYSBzaW1wbGUgcHJvZ3JhbSB0byBnZW5lcmF0ZSBhIHRvbmUgYW5kIHdyaXRlIHRoZSBzYW1wbGVzIHRvCisgICAgYSByYXcgUENNIGZpbGUuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGFuYWx5emUgdGhlCisgICAgcXVhbGl0eSBvZiB0aGUgdG9uZXMvc2luZSB3YXZlIGdlbmVyYXRlZCBieSBQSk1FRElBIHRvbmUvc2luZSB3YXZlCisgICAgZ2VuZXJhdG9yLgorCisgIC0gQHJlZiBwYWdlX3BqbWVkaWFfc2FtcGxlc19hZWN0ZXN0X2NcbgorICAgIFBsYXkgYSBmaWxlIHRvIHNwZWFrZXIsIHJ1biBBRUMsIGFuZCByZWNvcmQgdGhlIG1pY3JvcGhvbmUgaW5wdXQKKyAgICB0byBzZWUgaWYgZWNobyBpcyBjb21pbmcuCisgKi8KKworLyoqCisgKiBccGFnZSBwYWdlX3BqbWVkaWFfc2FtcGxlc19zaXBydHBfYyBTYW1wbGVzOiBVc2luZyBTSVAgYW5kIEN1c3RvbSBSVFAvUlRDUCB0byBNb25pdG9yIFF1YWxpdHkKKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBhbiBleGFtcGxlIHRvIGRlbW9uc3RyYXRlIHVzaW5nIFNJUCBhbmQgUlRQL1JUQ1AgZnJhbWV3b3JrCisgKiB0byBtZWFzdXJlIHRoZSBuZXR3b3JrIHF1YWxpdHkvaW1wYWlybWVudCBmcm9tIHRoZSBTSVAgY2FsbC4gVGhpcworICogcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBtYWtlIGNhbGxzIG9yIHRvIHJlY2VpdmUgY2FsbHMgZnJvbSBvdGhlcgorICogU0lQIGVuZHBvaW50IChvciBvdGhlciBzaXBydHAgcHJvZ3JhbSksIGFuZCB0byBkaXNwbGF5IHRoZSBtZWRpYQorICogcXVhbGl0eSBzdGF0aXN0aWNzIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwuCisgKgorICogTm90ZSB0aGF0IHRoZSByZW1vdGUgcGVlciBtdXN0IHN1cHBvcnQgUlRDUC4KKyAqCisgKiBUaGUgbGF5b3V0IG9mIHRoZSBwcm9ncmFtIGhhcyBiZWVuIGRlc2lnbmVkIHNvIHRoYXQgY3VzdG9tIHJlcG9ydGluZworICogY2FuIGJlIGdlbmVyYXRlZCBpbnN0ZWFkIG9mIHBsYWluIGh1bWFuIHJlYWRhYmxlIHRleHQuCisgKgorICogVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBmaWxlIGlzIHBqc2lwLWFwcHMvc3JjL3NhbXBsZXMvc2lwcnRwLmMKKyAqCisgKiBTY3JlZW5zaG90cyBvbiBXaW5YUDogXGltYWdlIGh0bWwgc2lwcnRwLmpwZworICoKKyAqIFxpbmNsdWRlbGluZW5vIHNpcHJ0cC5jCisgKi8KKworI2VuZGlmIC8qIF9fUEpNRURJQV9ET1hZR0VOX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4MWU5YQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2VjaG8uaApAQCAtMCwwICsxLDI2MCBAQAorLyogJElkOiBlY2hvLmggNDA4MiAyMDEyLTA0LTI0IDEzOjA5OjE0WiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9FQ0hPX0hfXworI2RlZmluZSBfX1BKTUVESUFfRUNIT19IX18KKworCisvKioKKyAqIEBmaWxlIGVjaG8uaAorICogQGJyaWVmIEVjaG8gQ2FuY2VsbGF0aW9uICBBUEkuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX0VjaG9fQ2FuY2VsIEFjY291c3RpYyBFY2hvIENhbmNlbGxhdGlvbiBBUEkKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVAorICogQGJyaWVmIEVjaG8gQ2FuY2VsbGF0aW9uIEFQSS4KKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBBUEkgdG8gcGVyZm9ybSBlY2hvIGNhbmNlbGxhdGlvbiB0byBhdWRpbyBzaWduYWwuCisgKiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgZWNobyBjYW5jZWxsZXIgaW1wbGVtZW50YXRpb24gaW4gUEpNRURJQSwgcmFuZ2luZworICogZnJvbSBzaW1wbGUgZWNobyBzdXBwcmVzc29yIHRvIGEgZnVsbCBBY2NvdXN0aWMgRWNobyBDYW5jZWxsZXIvQUVDLiBCeSAKKyAqIHVzaW5nIHRoaXMgQVBJLCBhcHBsaWNhdGlvbiBzaG91bGQgYmUgYWJsZSB0byB1c2Ugd2hpY2ggRUMgYmFja2VuZCB0bworICogdXNlIGJhc2Ugb24gdGhlIHJlcXVpcmVtZW50IGFuZCBjYXBhYmlsaXR5IG9mIHRoZSBwbGF0Zm9ybS4KKyAqLworCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIE9wYXF1ZSB0eXBlIGZvciBQSk1FRElBIEVjaG8gQ2FuY2VsbGVyIHN0YXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2VjaG9fc3RhdGUgcGptZWRpYV9lY2hvX3N0YXRlOworCisKKy8qKgorICogRWNobyBjYW5jZWxsYXRpb24gb3B0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZWNob19mbGFnCit7CisgICAgLyoqCisgICAgICogVXNlIGFueSBhdmFpbGFibGUgYmFja2VuZCBlY2hvIGNhbmNlbGxlciBhbGdvcml0aG0uIFRoaXMgaXMKKyAgICAgKiB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gVGhpcyBzZXR0aW5nIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoCisgICAgICogUEpNRURJQV9FQ0hPX1NJTVBMRSBhbmQgUEpNRURJQV9FQ0hPX1NQRUVYLgorICAgICAqLworICAgIFBKTUVESUFfRUNIT19ERUZBVUxUPSAwLAorCisgICAgLyoqCisgICAgICogRm9yY2UgdG8gdXNlIFNwZWV4IEFFQyBhcyB0aGUgYmFja2VuZCBlY2hvIGNhbmNlbGxlciBhbGdvcml0aG0uCisgICAgICogVGhpcyBzZXR0aW5nIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFBKTUVESUFfRUNIT19TSU1QTEUuCisgICAgICovCisgICAgUEpNRURJQV9FQ0hPX1NQRUVYCT0gMSwKKworICAgIC8qKgorICAgICAqIElmIFBKTUVESUFfRUNIT19TSU1QTEUgZmxhZyBpcyBzcGVjaWZpZWQgZHVyaW5nIGVjaG8gY2FuY2VsbGVyCisgICAgICogY3JlYXRpb24sIHRoZW4gYSBzaW1wbGUgZWNobyBzdXBwcmVzc29yIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mCisgICAgICogYW4gYWNjb3VzdGljIGVjaG8gY2FuY2VsbGF0aW9uLiBUaGlzIHNldHRpbmcgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCisgICAgICogd2l0aCBQSk1FRElBX0VDSE9fU1BFRVguCisgICAgICovCisgICAgUEpNRURJQV9FQ0hPX1NJTVBMRQk9IDIsCisKKyAgICAvKioKKyAgICAgKiBGb3IgaW50ZXJuYWwgdXNlLgorICAgICAqLworICAgIFBKTUVESUFfRUNIT19BTEdPX01BU0sgPSAxNSwKKworICAgIC8qKgorICAgICAqIElmIFBKTUVESUFfRUNIT19OT19MT0NLIGZsYWcgaXMgc3BlY2lmaWVkLCBubyBtdXRleCB3aWxsIGJlIGNyZWF0ZWQKKyAgICAgKiBmb3IgdGhlIGVjaG8gY2FuY2VsbGVyLCBidXQgYXBwbGljYXRpb24gd2lsbCBndWFyYW50ZWUgdGhhdCBlY2hvCisgICAgICogY2FuY2VsbGVyIHdpbGwgbm90IGJlIGNhbGxlZCBieSBkaWZmZXJlbnQgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqLworICAgIFBKTUVESUFfRUNIT19OT19MT0NLID0gMTYsCisKKyAgICAvKioKKyAgICAgKiBJZiBQSk1FRElBX0VDSE9fVVNFX1NJTVBMRV9GSUZPIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgZGVsYXkgYnVmZmVyCisgICAgICogY3JlYXRlZCBmb3IgdGhlIGVjaG8gY2FuY2VsbGVyIHdpbGwgdXNlIHNpbXBsZSBGSUZPIG1lY2hhbmlzbSwgaS5lLgorICAgICAqIHdpdGhvdXQgdXNpbmcgV1NPTEEgdG8gZXhwYW5kIGFuZCBzaHJpbmsgYXVkaW8gc2FtcGxlcy4KKyAgICAgKi8KKyAgICBQSk1FRElBX0VDSE9fVVNFX1NJTVBMRV9GSUZPID0gMzIsCisKKyAgICAvKioKKyAgICAgKiBJZiBQSk1FRElBX0VDSE9fVVNFX1NXX0VDSE8gZmxhZyBpcyBzcGVjaWZpZWQsIHNvZnR3YXJlIGVjaG8gY2FuY2VsbGVyCisgICAgICogd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgZGV2aWNlIEVDLgorICAgICAqLworICAgIFBKTUVESUFfRUNIT19VU0VfU1dfRUNITyA9IDY0CisKK30gcGptZWRpYV9lY2hvX2ZsYWc7CisKKworCisKKy8qKgorICogQ3JlYXRlIHRoZSBlY2hvIGNhbmNlbGxlci4gCisgKgorICogQHBhcmFtIHBvb2wJCSAgICBQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBNZWRpYSBjbG9jayByYXRlL3NhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lLgorICogQHBhcmFtIHRhaWxfbXMJICAgIFRhaWwgbGVuZ3RoLCBtaWxpc2Vjb25kcy4KKyAqIEBwYXJhbSBsYXRlbmN5X21zCSAgICBUb3RhbCBsYWNlbmN5IGludHJvZHVjZWQgYnkgcGxheWJhY2sgYW5kIAorICoJCQkgICAgcmVjb3JkaW5nIGRldmljZS4gU2V0IHRvIHplcm8gaWYgdGhlIGxhdGVuY3kKKyAqCQkJICAgIGlzIG5vdCBrbm93bi4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb25zLiBJZiBQSk1FRElBX0VDSE9fU0lNUExFIGlzIHNwZWNpZmllZCwKKyAqCQkJICAgIHRoZW4gYSBzaW1wbGUgZWNobyBzdXBwcmVzc29yIGltcGxlbWVudGF0aW9uIAorICoJCQkgICAgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgYW4gYWNjb3VzdGljIGVjaG8gCisgKgkJCSAgICBjYW5jZWxsYXRpb24uCisgKgkJCSAgICBTZWUgI3BqbWVkaWFfZWNob19mbGFnIGZvciBvdGhlciBvcHRpb25zLgorICogQHBhcmFtIHBfZWNobwkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBFY2hvIENhbmNlbGxlciBzdGF0ZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2VjaG9fY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCSB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJIHVuc2lnbmVkIHRhaWxfbXMsCisJCQkJCSB1bnNpZ25lZCBsYXRlbmN5X21zLAorCQkJCQkgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJIHBqbWVkaWFfZWNob19zdGF0ZSAqKnBfZWNobyApOworCisvKioKKyAqIENyZWF0ZSBtdWx0aS1jaGFubmVsIHRoZSBlY2hvIGNhbmNlbGxlci4gCisgKgorICogQHBhcmFtIHBvb2wJCSAgICBQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBNZWRpYSBjbG9jayByYXRlL3NhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkgICAgTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSB0YWlsX21zCSAgICBUYWlsIGxlbmd0aCwgbWlsaXNlY29uZHMuCisgKiBAcGFyYW0gbGF0ZW5jeV9tcwkgICAgVG90YWwgbGFjZW5jeSBpbnRyb2R1Y2VkIGJ5IHBsYXliYWNrIGFuZCAKKyAqCQkJICAgIHJlY29yZGluZyBkZXZpY2UuIFNldCB0byB6ZXJvIGlmIHRoZSBsYXRlbmN5CisgKgkJCSAgICBpcyBub3Qga25vd24uCisgKiBAcGFyYW0gb3B0aW9ucwkgICAgT3B0aW9ucy4gSWYgUEpNRURJQV9FQ0hPX1NJTVBMRSBpcyBzcGVjaWZpZWQsCisgKgkJCSAgICB0aGVuIGEgc2ltcGxlIGVjaG8gc3VwcHJlc3NvciBpbXBsZW1lbnRhdGlvbiAKKyAqCQkJICAgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIGFuIGFjY291c3RpYyBlY2hvIAorICoJCQkgICAgY2FuY2VsbGF0aW9uLgorICoJCQkgICAgU2VlICNwam1lZGlhX2VjaG9fZmxhZyBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqIEBwYXJhbSBwX2VjaG8JICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgRWNobyBDYW5jZWxsZXIgc3RhdGUuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIHN0YXR1cy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lY2hvX2NyZWF0ZTIocGpfcG9vbF90ICpwb29sLAorCQkJCQkgIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCSAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICB1bnNpZ25lZCB0YWlsX21zLAorCQkJCQkgIHVuc2lnbmVkIGxhdGVuY3lfbXMsCisJCQkJCSAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICBwam1lZGlhX2VjaG9fc3RhdGUgKipwX2VjaG8gKTsKKworLyoqCisgKiBEZXN0cm95IHRoZSBFY2hvIENhbmNlbGxlci4gCisgKgorICogQHBhcmFtIGVjaG8JCVRoZSBFY2hvIENhbmNlbGxlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZWNob19kZXN0cm95KHBqbWVkaWFfZWNob19zdGF0ZSAqZWNobyApOworCisKKy8qKgorICogUmVzZXQgdGhlIGVjaG8gY2FuY2VsbGVyLgorICoKKyAqIEBwYXJhbSBlY2hvCQlUaGUgRWNobyBDYW5jZWxsZXIuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2VjaG9fcmVzZXQocGptZWRpYV9lY2hvX3N0YXRlICplY2hvICk7CisKKworLyoqCisgKiBMZXQgdGhlIEVjaG8gQ2FuY2VsbGVyIGtub3cgdGhhdCBhIGZyYW1lIGhhcyBiZWVuIHBsYXllZCB0byB0aGUgc3BlYWtlci4KKyAqIFRoZSBFY2hvIENhbmNlbGxlciB3aWxsIGtlZXAgdGhlIGZyYW1lIGluIGl0cyBpbnRlcm5hbCBidWZmZXIsIHRvIGJlIHVzZWQKKyAqIHdoZW4gY2FuY2VsbGluZyB0aGUgZWNobyB3aXRoICNwam1lZGlhX2VjaG9fY2FwdHVyZSgpLgorICoKKyAqIEBwYXJhbSBlY2hvCQlUaGUgRWNobyBDYW5jZWxsZXIuCisgKiBAcGFyYW0gcGxheV9mcm0JU2FtcGxlIGJ1ZmZlciBjb250YWluaW5nIGZyYW1lIHRvIGJlIHBsYXllZAorICoJCQkob3IgaGFzIGJlZW4gcGxheWVkKSB0byB0aGUgcGxheWJhY2sgZGV2aWNlLgorICoJCQlUaGUgZnJhbWUgbXVzdCBjb250YWluIGV4YWN0bHkgc2FtcGxlc19wZXJfZnJhbWUgCisgKgkJCW51bWJlciBvZiBzYW1wbGVzLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lY2hvX3BsYXliYWNrKHBqbWVkaWFfZWNob19zdGF0ZSAqZWNobywKKwkJCQkJICAgcGpfaW50MTZfdCAqcGxheV9mcm0gKTsKKworCisvKioKKyAqIExldCB0aGUgRWNobyBDYW5jZWxsZXIga25vdyB0aGF0IGEgZnJhbWUgaGFzIGJlZW4gY2FwdHVyZWQgZnJvbSB0aGUgCisgKiBtaWNyb3Bob25lLiBUaGUgRWNobyBDYW5jZWxsZXIgd2lsbCBjYW5jZWwgdGhlIGVjaG8gZnJvbSB0aGUgY2FwdHVyZWQKKyAqIHNpZ25hbCwgdXNpbmcgdGhlIGludGVybmFsIGJ1ZmZlciAoc3VwcGxpZWQgYnkgI3BqbWVkaWFfZWNob19wbGF5YmFjaygpKQorICogYXMgdGhlIEZFUyAoRmFyIEVuZCBTcGVlY2gpIHJlZmVyZW5jZS4KKyAqCisgKiBAcGFyYW0gZWNobwkJVGhlIEVjaG8gQ2FuY2VsbGVyLgorICogQHBhcmFtIHJlY19mcm0JT24gaW5wdXQsIGl0IGNvbnRhaW5zIHRoZSBpbnB1dCBzaWduYWwgKGNhcHR1cmVkIAorICoJCQlmcm9tIG1pY3JvcGhvbmUpIHdoaWNoIGVjaG8gaXMgdG8gYmUgcmVtb3ZlZC4KKyAqCQkJVXBvbiByZXR1cm5pbmcgdGhpcyBmdW5jdGlvbiwgdGhpcyBidWZmZXIgY29udGFpbgorICoJCQl0aGUgcHJvY2Vzc2VkIHNpZ25hbCB3aXRoIHRoZSBlY2hvIHJlbW92ZWQuCisgKgkJCVRoZSBmcmFtZSBtdXN0IGNvbnRhaW4gZXhhY3RseSBzYW1wbGVzX3Blcl9mcmFtZSAKKyAqCQkJbnVtYmVyIG9mIHNhbXBsZXMuCisgKiBAcGFyYW0gb3B0aW9ucwlFY2hvIGNhbmNlbGxhdGlvbiBvcHRpb25zLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqCQkJUHV0IHplcm8gZm9yIG5vdy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZWNob19jYXB0dXJlKHBqbWVkaWFfZWNob19zdGF0ZSAqZWNobywKKwkJCQkJICBwal9pbnQxNl90ICpyZWNfZnJtLAorCQkJCQkgIHVuc2lnbmVkIG9wdGlvbnMgKTsKKworCisvKioKKyAqIFBlcmZvcm0gZWNobyBjYW5jZWxsYXRpb24uCisgKgorICogQHBhcmFtIGVjaG8JCVRoZSBFY2hvIENhbmNlbGxlci4KKyAqIEBwYXJhbSByZWNfZnJtCU9uIGlucHV0LCBpdCBjb250YWlucyB0aGUgaW5wdXQgc2lnbmFsIChjYXB0dXJlZCAKKyAqCQkJZnJvbSBtaWNyb3Bob25lKSB3aGljaCBlY2hvIGlzIHRvIGJlIHJlbW92ZWQuCisgKgkJCVVwb24gcmV0dXJuaW5nIHRoaXMgZnVuY3Rpb24sIHRoaXMgYnVmZmVyIGNvbnRhaW4KKyAqCQkJdGhlIHByb2Nlc3NlZCBzaWduYWwgd2l0aCB0aGUgZWNobyByZW1vdmVkLgorICogQHBhcmFtIHBsYXlfZnJtCVNhbXBsZSBidWZmZXIgY29udGFpbmluZyBmcmFtZSB0byBiZSBwbGF5ZWQKKyAqCQkJKG9yIGhhcyBiZWVuIHBsYXllZCkgdG8gdGhlIHBsYXliYWNrIGRldmljZS4KKyAqCQkJVGhlIGZyYW1lIG11c3QgY29udGFpbiBleGFjdGx5IHNhbXBsZXNfcGVyX2ZyYW1lIAorICoJCQludW1iZXIgb2Ygc2FtcGxlcy4KKyAqIEBwYXJhbSBvcHRpb25zCUVjaG8gY2FuY2VsbGF0aW9uIG9wdGlvbnMsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorICoJCQlQdXQgemVybyBmb3Igbm93LgorICogQHBhcmFtIHJlc2VydmVkCVJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBwdXQgTlVMTCBmb3Igbm93LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lY2hvX2NhbmNlbCggcGptZWRpYV9lY2hvX3N0YXRlICplY2hvLAorCQkJCQkgIHBqX2ludDE2X3QgKnJlY19mcm0sCisJCQkJCSAgY29uc3QgcGpfaW50MTZfdCAqcGxheV9mcm0sCisJCQkJCSAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICB2b2lkICpyZXNlcnZlZCApOworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfRUNIT19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZWNob19wb3J0LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lY2hvX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk1NjAxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZWNob19wb3J0LmgKQEAgLTAsMCArMSw3NCBAQAorLyogJElkOiBlY2hvX3BvcnQuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfQUVDX1BPUlRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9BRUNfUE9SVF9IX18KKworLyoqCisgKiBAZmlsZSBlY2hvX3BvcnQuaAorICogQGJyaWVmIEFFQyAoQWNjb3VzdGljIEVjaG8gQ2FuY2VsbGF0aW9uKSBtZWRpYSBwb3J0LgorICovCisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisKKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX0VDSE9fUE9SVCBFY2hvIENhbmNlbGxhdGlvbiBQb3J0CisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBFY2hvIENhbmNlbGxhdGlvbgorICogQHsKKyAqCisgKiBXcmFwcGVyIHRvIFxyZWYgUEpNRURJQV9FY2hvX0NhbmNlbCBpbnRvIG1lZGlhIHBvcnQgaW50ZXJmYWNlLgorICovCisKKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQ3JlYXRlIGVjaG8gY2FuY2VsbGVyIHBvcnQuIAorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBkbl9wb3J0CURvd25zdHJlYW0gcG9ydC4KKyAqIEBwYXJhbSB0YWlsX21zCVRhaWwgbGVuZ3RoIGluIG1pbGlzZWNvbmRzLgorICogQHBhcmFtIGxhdGVuY3lfbXMJVG90YWwgbGFjZW5jeSBpbnRyb2R1Y2VkIGJ5IHBsYXliYWNrIGFuZCAKKyAqCQkJcmVjb3JkaW5nIGRldmljZS4gU2V0IHRvIHplcm8gaWYgdGhlIGxhdGVuY3kKKyAqCQkJaXMgbm90IGtub3duLgorICogQHBhcmFtIG9wdGlvbnMJT3B0aW9ucywgYXMgaW4gI3BqbWVkaWFfZWNob19jcmVhdGUoKS4KKyAqIEBwYXJhbSBwX3BvcnQJUG9pbnRlciB0byByZWNlaXZlIHRoZSBwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lY2hvX3BvcnRfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgcGptZWRpYV9wb3J0ICpkbl9wb3J0LAorCQkJCQkgICAgICB1bnNpZ25lZCB0YWlsX21zLAorCQkJCQkgICAgICB1bnNpZ25lZCBsYXRlbmN5X21zLAorCQkJCQkgICAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgICAgICBwam1lZGlhX3BvcnQgKipwX3BvcnQgKTsKKworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfQUVDX1BPUlRfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lbmRwb2ludC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZW5kcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE5ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZW5kcG9pbnQuaApAQCAtMCwwICsxLDMwNCBAQAorLyogJElkOiBlbmRwb2ludC5oIDQ0NzQgMjAxMy0wNC0xNiAwOToxMjo1OVogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfTUVESUFNR1JfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9NRURJQU1HUl9IX18KKworCisvKioKKyAqIEBmaWxlIGVuZHBvaW50LmgKKyAqIEBicmllZiBNZWRpYSBlbmRwb2ludC4KKyAqLworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfRU5EUFQgVGhlIEVuZHBvaW50CisgKiBAeworICoKKyAqIFRoZSBtZWRpYSBlbmRwb2ludCBhY3RzIGFzIHBsYWNlaG9sZGVyIGZvciBlbmRwb2ludCBjYXBhYmlsaXRpZXMuIEVhY2ggCisgKiBtZWRpYSBlbmRwb2ludCB3aWxsIGhhdmUgYSBjb2RlYyBtYW5hZ2VyIHRvIG1hbmFnZSBsaXN0IG9mIGNvZGVjcyBpbnN0YWxsZWQKKyAqIGluIHRoZSBlbmRwb2ludCBhbmQgYSBzb3VuZCBkZXZpY2UgZmFjdG9yeS4KKyAqCisgKiBBIHJlZmVyZW5jZSB0byBtZWRpYSBlbmRwb2ludCBpbnN0YW5jZSBpcyByZXF1aXJlZCB3aGVuIGFwcGxpY2F0aW9uIHdhbnRzCisgKiB0byBjcmVhdGUgYSBtZWRpYSBzZXNzaW9uICgjcGptZWRpYV9zZXNzaW9uX2NyZWF0ZSgpKS4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS9jb2RlYy5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc2RwLmg+CisjaW5jbHVkZSA8cGptZWRpYS90cmFuc3BvcnQuaD4KKworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogVGhpcyBlbnVtZXJhdGlvbiBkZXNjcmliZXMgdmFyaW91cyBmbGFncyB0aGF0IGNhbiBiZSBzZXQgb3IgcmV0cmlldmVkIGluCisgKiB0aGUgbWVkaWEgZW5kcG9pbnQsIGJ5IHVzaW5nIHBqbWVkaWFfZW5kcHRfc2V0X2ZsYWcoKSBhbmQKKyAqIHBqbWVkaWFfZW5kcHRfZ2V0X2ZsYWcoKSByZXNwZWN0aXZlbHkuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX2VuZHB0X2ZsYWcKK3sKKyAgICAvKioKKyAgICAgKiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciB0ZWxlcGhvbnktZXZlbnQgc2hvdWxkIGJlIG9mZmVyZWQgaW4gU0RQLgorICAgICAqIFZhbHVlIGlzIGJvb2xlYW4uCisgICAgICovCisgICAgUEpNRURJQV9FTkRQVF9IQVNfVEVMRVBIT05FX0VWRU5UX0ZMQUcKKworfSBwam1lZGlhX2VuZHB0X2ZsYWc7CisKKworLyoqCisgKiBUeXBlIG9mIGNhbGxiYWNrIHRvIHJlZ2lzdGVyIHRvIHBqbWVkaWFfZW5kcHRfYXRleGl0KCkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKnBqbWVkaWFfZW5kcHRfZXhpdF9jYWxsYmFjaykocGptZWRpYV9lbmRwdCAqZW5kcHQpOworCisKKy8qKgorICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIG1lZGlhIGVuZHBvaW50LgorICoKKyAqIEBwYXJhbSBwZgkJUG9vbCBmYWN0b3J5LCB3aGljaCB3aWxsIGJlIHVzZWQgYnkgdGhlIG1lZGlhIGVuZHBvaW50CisgKgkJCXRocm91Z2hvdXQgaXRzIGxpZmV0aW1lLgorICogQHBhcmFtIGlvcXVldWUJT3B0aW9uYWwgaW9xdWV1ZSBpbnN0YW5jZSB0byBiZSByZWdpc3RlcmVkIHRvIHRoZSAKKyAqCQkJZW5kcG9pbnQuIFRoZSBpb3F1ZXVlIGluc3RhbmNlIGlzIHVzZWQgdG8gcG9sbCBhbGwgUlRQCisgKgkJCWFuZCBSVENQIHNvY2tldHMuIElmIHRoaXMgYXJndW1lbnQgaXMgTlVMTCwgdGhlIAorICoJCQllbmRwb2ludCB3aWxsIGNyZWF0ZSBhbiBpbnRlcm5hbCBpb3F1ZXVlIGluc3RhbmNlLgorICogQHBhcmFtIHdvcmtlcl9jbnQJU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRvIGJlIGNyZWF0ZWQKKyAqCQkJdG8gcG9sbCB0aGUgaW9xdWV1ZS4KKyAqIEBwYXJhbSBwX2VuZHB0CVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgZW5kcG9pbnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2VuZHB0X2NyZWF0ZSggcGpfcG9vbF9mYWN0b3J5ICpwZiwKKwkJCQkJICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQkgICB1bnNpZ25lZCB3b3JrZXJfY250LAorCQkJCQkgICBwam1lZGlhX2VuZHB0ICoqcF9lbmRwdCk7CisKKy8qKgorICogRGVzdHJveSBtZWRpYSBlbmRwb2ludCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZW5kcHQJCU1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lbmRwdF9kZXN0cm95KHBqbWVkaWFfZW5kcHQgKmVuZHB0KTsKKworLyoqCisgKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIGEgZmxhZy4KKyAqCisgKiBAcGFyYW0gZW5kcHQJCU1lZGlhIGVuZHBvaW50LgorICogQHBhcmFtIGZsYWcJCVRoZSBmbGFnLgorICogQHBhcmFtIHZhbHVlCQlQb2ludGVyIHRvIHRoZSB2YWx1ZSB0byBiZSBzZXQuCisgKgorICogQHJldXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZW5kcHRfc2V0X2ZsYWcocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSAgICBwam1lZGlhX2VuZHB0X2ZsYWcgZmxhZywKKwkJCQkJICAgIGNvbnN0IHZvaWQgKnZhbHVlKTsKKworLyoqCisgKiAgUmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgZmxhZy4KKyAqCisgKiAgQHBhcmFtIGVuZHB0CU1lZGlhIGVuZHBvaW50LgorICogIEBwYXJhbSBmbGFnCQlUaGUgZmxhZy4KKyAqICBAcGFyYW0gdmFsdWUJUG9pbnRlciB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqICBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZW5kcHRfZ2V0X2ZsYWcocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSAgICBwam1lZGlhX2VuZHB0X2ZsYWcgZmxhZywKKwkJCQkJICAgIHZvaWQgKnZhbHVlKTsKKworLyoqCisgKiBHZXQgdGhlIGlvcXVldWUgaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIGVuZHBvaW50LgorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCVRoZSBpb3F1ZXVlIGluc3RhbmNlIG9mIHRoZSBtZWRpYSBlbmRwb2ludC4KKyAqLworUEpfREVDTChwal9pb3F1ZXVlX3QqKSBwam1lZGlhX2VuZHB0X2dldF9pb3F1ZXVlKHBqbWVkaWFfZW5kcHQgKmVuZHB0KTsKKworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIG9uIHRoZSBtZWRpYSBlbmRwb2ludAorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICogQHJldHVybgkJVGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBvbiB0aGUgbWVkaWEgZW5kcG9pbnQKKyAqLworUEpfREVDTCh1bnNpZ25lZCkgcGptZWRpYV9lbmRwdF9nZXRfdGhyZWFkX2NvdW50KHBqbWVkaWFfZW5kcHQgKmVuZHB0KTsKKworLyoqCisgKiBHZXQgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZSB3b3JrZXIgdGhyZWFkcyBvZiB0aGUgbWVkaWEgZW5kcG9pbnQgCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQgaW5zdGFuY2UuCisgKiBAcGFyYW0gaW5kZXgJCVRoZSBpbmRleCBvZiB0aGUgdGhyZWFkOiAwPD0gaW5kZXggPCB0aHJlYWRfY250CisgKgorICogQHJldHVybgkJcGpfdGhyZWFkX3Qgb3IgTlVMTAorICovCitQSl9ERUNMKHBqX3RocmVhZF90KikgcGptZWRpYV9lbmRwdF9nZXRfdGhyZWFkKHBqbWVkaWFfZW5kcHQgKmVuZHB0LCAKKwkJCQkJICAgICAgIHVuc2lnbmVkIGluZGV4KTsKKworLyoqCisgKiBTdG9wIGFuZCBkZXN0cm95IHRoZSB3b3JrZXIgdGhyZWFkcyBvZiB0aGUgbWVkaWEgZW5kcG9pbnQKKyAqCisgKiBAcGFyYW0gZW5kcHQJCVRoZSBtZWRpYSBlbmRwb2ludCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZW5kcHRfc3RvcF90aHJlYWRzKHBqbWVkaWFfZW5kcHQgKmVuZHB0KTsKKworCisvKioKKyAqIFJlcXVlc3QgdGhlIG1lZGlhIGVuZHBvaW50IHRvIGNyZWF0ZSBwb29sLgorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICogQHBhcmFtIG5hbWUJCU5hbWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHBvb2wuCisgKiBAcGFyYW0gaW5pdGlhbAlJbml0aWFsIHBvb2wgc2l6ZSwgaW4gYnl0ZXMuCisgKiBAcGFyYW0gaW5jcmVtZW50CUluY3JlbWVudCBzaXplLCBpbiBieXRlcy4KKyAqCisgKiBAcmV0dXJuCQlNZW1vcnkgcG9vbC4KKyAqLworUEpfREVDTChwal9wb29sX3QqKSBwam1lZGlhX2VuZHB0X2NyZWF0ZV9wb29sKCBwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgICBwal9zaXplX3QgaW5pdGlhbCwKKwkJCQkJICAgICAgIHBqX3NpemVfdCBpbmNyZW1lbnQpOworCisvKioKKyAqIEdldCB0aGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJVGhlIGluc3RhbmNlIG9mIGNvZGVjIG1hbmFnZXIgYmVsb25naW5nIHRvCisgKgkJCXRoaXMgbWVkaWEgZW5kcG9pbnQuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9jb2RlY19tZ3IqKSBwam1lZGlhX2VuZHB0X2dldF9jb2RlY19tZ3IocGptZWRpYV9lbmRwdCAqZW5kcHQpOworCisKKy8qKgorICogQ3JlYXRlIGEgU0RQIHNlc3Npb24gZGVzY3JpcHRpb24gdGhhdCBkZXNjcmliZXMgdGhlIGVuZHBvaW50CisgKiBjYXBhYmlsaXR5LgorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIG1lZGlhIGVuZHBvaW50LgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgU0RQIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gc3RyZWFtX2NudAlOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNvY2tfaW5mbyBhcnJheS4gVGhpcworICoJCQlhbHNvIGRlbm90ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMgKGkuZS4KKyAqCQkJdGhlICJtPSIgbGluZXMpIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBTRFAuCisgKgkJCUJ5IGNvbnZlbnRpb24sIGlmIHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9uZSwKKyAqCQkJdGhlIGZpcnN0IG1lZGlhIHdpbGwgYmUgYXVkaW8gYW5kIHRoZSByZW1haW5pbmcKKyAqCQkJbWVkaWEgaXMgdmlkZW8uCisgKiBAcGFyYW0gc29ja19pbmZvCUFycmF5IG9mIHNvY2tldCB0cmFuc3BvcnQgaW5mb3JtYXRpb24uIE9uZSAKKyAqCQkJdHJhbnNwb3J0IGlzIG5lZWRlZCBmb3IgZWFjaCBtZWRpYSBzdHJlYW0sIGFuZAorICoJCQllYWNoIHRyYW5zcG9ydCBjb25zaXN0cyBvZiBhbiBSVFAgYW5kIFJUQ1Agc29ja2V0CisgKgkJCXBhaXIuCisgKiBAcGFyYW0gcF9zZHAJCVBvaW50ZXIgdG8gcmVjZWl2ZSBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lbmRwdF9jcmVhdGVfc2RwKCBwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkJICAgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIHN0cmVhbV9jbnQsCisJCQkJCSAgICAgICBjb25zdCBwam1lZGlhX3NvY2tfaW5mbyBzb2NrX2luZm9bXSwKKwkJCQkJICAgICAgIHBqbWVkaWFfc2RwX3Nlc3Npb24gKipwX3NkcCApOworCisvKioKKyAqIENyZWF0ZSBhICJibGFuayIgU0RQIHNlc3Npb24gZGVzY3JpcHRpb24uIFRoZSBTRFAgd2lsbCBjb250YWluIGJhc2ljIFNEUAorICogZmllbGRzIHN1Y2ggYXMgb3JpZ2luLCB0aW1lLCBhbmQgbmFtZSwgYnV0IHdpdGhvdXQgYW55IG1lZGlhIGxpbmVzLgorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIG1lZGlhIGVuZHBvaW50LgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20uCisgKiBAcGFyYW0gc2Vzc19uYW1lCU9wdGlvbmFsIFNEUCBzZXNzaW9uIG5hbWUsIG9yIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAqIAkJCXZhbHVlLgorICogQHBhcmFtIG9yaWdpbglBZGRyZXNzIHRvIHB1dCBpbiB0aGUgb3JpZ2luIGZpZWxkLgorICogQHBhcmFtIHBfc2RwCQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGNyZWF0ZWQgU0RQIHNlc3Npb24uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lbmRwdF9jcmVhdGVfYmFzZV9zZHAocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCQkgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgICBjb25zdCBwal9zdHJfdCAqc2Vzc19uYW1lLAorCQkJCQkJICAgY29uc3QgcGpfc29ja2FkZHIgKm9yaWdpbiwKKwkJCQkJCSAgIHBqbWVkaWFfc2RwX3Nlc3Npb24gKipwX3NkcCk7CisKKy8qKgorICogQ3JlYXRlIFNEUCBtZWRpYSBsaW5lIGZvciBhdWRpbyBtZWRpYS4KKyAqCisgKiBAcGFyYW0gZW5kcHQJCVRoZSBtZWRpYSBlbmRwb2ludC4KKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tLgorICogQHBhcmFtIHNpCQlTb2NrZXQgaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gb3B0aW9ucwlPcHRpb24gZmxhZ3MsIG11c3QgYmUgemVybyBmb3Igbm93LgorICogQHBhcmFtIHBfbQkJUG9pbnRlciB0byByZWNlaXZlIHRoZSBjcmVhdGVkIFNEUCBtZWRpYS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2VuZHB0X2NyZWF0ZV9hdWRpb19zZHAocGptZWRpYV9lbmRwdCAqZW5kcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfcG9vbF90ICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqbWVkaWFfc29ja19pbmZvKnNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9zZHBfbWVkaWEgKipwX20pOworCisvKioKKyAqIENyZWF0ZSBTRFAgbWVkaWEgbGluZSBmb3IgdmlkZW8gbWVkaWEuCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbS4KKyAqIEBwYXJhbSBzaQkJU29ja2V0IGluZm9ybWF0aW9uLgorICogQHBhcmFtIG9wdGlvbnMJT3B0aW9uIGZsYWdzLCBtdXN0IGJlIHplcm8gZm9yIG5vdy4KKyAqIEBwYXJhbSBwX20JCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgY3JlYXRlZCBTRFAgbWVkaWEuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lbmRwdF9jcmVhdGVfdmlkZW9fc2RwKHBqbWVkaWFfZW5kcHQgKmVuZHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwam1lZGlhX3NvY2tfaW5mbypzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfc2RwX21lZGlhICoqcF9tKTsKKworLyoqCisgKiBEdW1wIG1lZGlhIGVuZHBvaW50IGNhcGFiaWxpdGllcy4KKyAqCisgKiBAcGFyYW0gZW5kcHQJCVRoZSBtZWRpYSBlbmRwb2ludC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfZW5kcHRfZHVtcChwam1lZGlhX2VuZHB0ICplbmRwdCk7CisKKworLyoqCisgKiBSZWdpc3RlciBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSBtZWRpYSBlbmRwb2ludCB3aGVuIAorICogI3BqbWVkaWFfZW5kcHRfZGVzdHJveSgpIGlzIGNhbGxlZC4gTm90ZSB0aGF0IGFwcGxpY2F0aW9uIHNob3VsZCBub3QKKyAqIHVzZSBvciBhY2Nlc3MgYW55IGVuZHBvaW50IHJlc291cmNlIChzdWNoIGFzIHBvb2wsIGlvcXVldWUpIGZyb20gd2l0aGluCisgKiB0aGUgY2FsbGJhY2sgYXMgc3VjaCByZXNvdXJjZSBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHdoZW4gdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBpcyBpbnZva2VkLgorICoKKyAqIEBwYXJhbSBlbmRwdAkJVGhlIG1lZGlhIGVuZHBvaW50LgorICogQHBhcmFtIGZ1bmMJCVRoZSBmdW5jdGlvbiB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9lbmRwdF9hdGV4aXQocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSAgcGptZWRpYV9lbmRwdF9leGl0X2NhbGxiYWNrIGZ1bmMpOworCisKKworUEpfRU5EX0RFQ0wKKworCisvKioKKyAqIEB9CisgKi8KKworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfTUVESUFNR1JfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9lcnJuby5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NjYTgxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXJybm8uaApAQCAtMCwwICsxLDY1MCBAQAorLyogJElkOiBlcnJuby5oIDM5NDUgMjAxMi0wMS0yNyAwOToxMjo1OVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9FUlJOT19IX18KKyNkZWZpbmUgX19QSk1FRElBX0VSUk5PX0hfXworCisvKioKKyAqIEBmaWxlIGVycm5vLmggRXJyb3IgQ29kZXMKKyAqIEBicmllZiBQSk1FRElBIHNwZWNpZmljIGVycm9yIGNvZGVzLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9FUlJOTyBFcnJvciBDb2RlcworICogQGluZ3JvdXAgUEpNRURJQV9CQVNFCisgKiBAYnJpZWYgUEpNRURJQSBzcGVjaWZpYyBlcnJvciBjb2Rlcy4KKyAqIEB7CisgKi8KKworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBTdGFydCBvZiBlcnJvciBjb2RlIHJlbGF0aXZlIHRvIFBKX0VSUk5PX1NUQVJUX1VTRVIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FUlJOT19TVEFSVCAgICAgICAoUEpfRVJSTk9fU1RBUlRfVVNFUiArIFBKX0VSUk5PX1NQQUNFX1NJWkUpCisjZGVmaW5lIFBKTUVESUFfRVJSTk9fRU5EICAgICAgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQgKyBQSl9FUlJOT19TUEFDRV9TSVpFIC0gMSkKKworCisvKioKKyAqIE1hcHBpbmcgZnJvbSBQb3J0QXVkaW8gZXJyb3IgY29kZXMgdG8gcGptZWRpYSBlcnJvciBzcGFjZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1BPUlRBVURJT19FUlJOT19TVEFSVCAoUEpNRURJQV9FUlJOT19FTkQtMTAwMDApCisjZGVmaW5lIFBKTUVESUFfUE9SVEFVRElPX0VSUk5PX0VORCAgIChQSk1FRElBX1BPUlRBVURJT19FUlJOT19TVEFSVCArIDEwMDAwIC0xKQorLyoqCisgKiBDb252ZXJ0IFBvcnRBdWRpbyBlcnJvciBjb2RlIHRvIFBKTUVESUEgZXJyb3IgY29kZS4KKyAqIFBvcnRBdWRpbyBlcnJvciBjb2RlIHJhbmdlOiAwID49IGVyciA+PSAtMTAwMDAKKyAqLworI2RlZmluZSBQSk1FRElBX0VSUk5PX0ZST01fUE9SVEFVRElPKGVycikgICAoKGludClQSk1FRElBX1BPUlRBVURJT19FUlJOT19TVEFSVC1lcnIpCisKKworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfU1JUUCkgJiYgKFBKTUVESUFfSEFTX1NSVFAgIT0gMCkKKworIC8qKgorICogTWFwcGluZyBmcm9tIExpYlNSVFAgZXJyb3IgY29kZXMgdG8gcGptZWRpYSBlcnJvciBzcGFjZS4KKyAqLworI2RlZmluZSBQSk1FRElBX0xJQlNSVFBfRVJSTk9fU1RBUlQgKFBKTUVESUFfRVJSTk9fRU5ELTEwMjAwKQorI2RlZmluZSBQSk1FRElBX0xJQlNSVFBfRVJSTk9fRU5EICAgKFBKTUVESUFfTElCU1JUUF9FUlJOT19TVEFSVCArIDIwMCAtIDEpCisvKioKKyAqIENvbnZlcnQgTGliU1JUUCBlcnJvciBjb2RlIHRvIFBKTUVESUEgZXJyb3IgY29kZS4KKyAqIExpYlNSVFAgZXJyb3IgY29kZSByYW5nZTogMCA8PSBlcnIgPCAyMDAKKyAqLworI2RlZmluZSBQSk1FRElBX0VSUk5PX0ZST01fTElCU1JUUChlcnIpICAgKFBKTUVESUFfTElCU1JUUF9FUlJOT19TVEFSVCtlcnIpCisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHRU5FUklDL0dFTkVSQUwgUEpNRURJQSBFUlJPUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogR2VuZXJhbC91bmtub3duIFBKTUVESUEgZXJyb3IuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FUlJPUgkJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEpCS8qIDIyMDAwMSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNEUCBFUlJPUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogR2VuZXJpYyBpbnZhbGlkIFNEUCBkZXNjcmlwdG9yLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTlNEUAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMjApICAgIC8qIDIyMDAyMCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIFNEUCB2ZXJzaW9uLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTlZFUgkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMjEpICAgIC8qIDIyMDAyMSAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIFNEUCBvcmlnaW4gKG89KSBsaW5lLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTk9SSUdJTgkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMjIpICAgIC8qIDIyMDAyMiAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIFNEUCB0aW1lICh0PSkgbGluZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FSU5USU1FCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsyMykgICAgLyogMjIwMDIzICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEVtcHR5IFNEUCBzdWJqZWN0L25hbWUgKHM9KSBsaW5lLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTk5BTUUJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzI0KSAgICAvKiAyMjAwMjQgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBTRFAgY29ubmVjdGlvbiBpbmZvIChjPSkgbGluZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FSU5DT05OCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsyNSkgICAgLyogMjIwMDI1ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIE1pc3NpbmcgU0RQIGNvbm5lY3Rpb24gaW5mbyBsaW5lLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VNSVNTSU5HQ09OTiAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsyNikgICAgLyogMjIwMDI2ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgYXR0cmlidXRlIChhPSkgbGluZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FSU5BVFRSCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsyNykgICAgLyogMjIwMDI3ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgcnRwbWFwIGF0dHJpYnV0ZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FSU5SVFBNQVAJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzI4KSAgICAvKiAyMjAwMjggKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogcnRwbWFwIGF0dHJpYnV0ZSBpcyB0b28gbG9uZy4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FUlRQTUFQVE9PTE9ORyAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMjkpICAgIC8qIDIyMDAyOSAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBydHBtYXAgaXMgbWlzc2luZyBmb3IgZHluYW1pYyBwYXlsb2FkIHR5cGUuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRU1JU1NJTkdSVFBNQVAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzMwKSAgICAvKiAyMjAwMzAgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBTRFAgbWVkaWEgKG09KSBsaW5lLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTk1FRElBCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCszMSkgICAgLyogMjIwMDMxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIE5vIHBheWxvYWQgZm9ybWF0IGluIHRoZSBtZWRpYSBzdHJlYW0uCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRU5PRk1UCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCszMikgICAgLyogMjIwMDMyICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgcGF5bG9hZCB0eXBlIGluIG1lZGlhLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTlBUCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCszMykgICAgLyogMjIwMDMzICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgU0RQICJmbXRwIiBhdHRyaWJ1dGUuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRUlORk1UUAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMzQpICAgIC8qIDIyMDAzNCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIFNEUCAicnRjcCIgYXR0cmlidXRlLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTlJUQ1AJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzM1KSAgICAvKiAyMjAwMzUgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBTRFAgbWVkaWEgdHJhbnNwb3J0IHByb3RvY29sLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VJTlBST1RPCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCszNikgICAgLyogMjIwMDM2ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgU0RQIGJhbmR3aWR0aCBpbmZvIChiPSkgbGluZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FSU5CQU5EVwkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMzcpICAgIC8qIDIyMDAzNyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNEUCBORUdPVElBVE9SIEVSUk9SUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIHN0YXRlIHRvIHBlcmZvcm0gdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRUlOU1RBVEUJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzQwKSAgICAvKiAyMjAwNDAgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gaW5pdGlhbCBsb2NhbCBTRFAuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRU5PSU5JVElBTCAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzQxKSAgICAvKiAyMjAwNDEgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gY3VycmVudGx5IGFjdGl2ZSBTRFAuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRU5PQUNUSVZFICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzQyKSAgICAvKiAyMjAwNDIgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gY3VycmVudCBvZmZlciBvciBhbnN3ZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRU5PTkVHCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCs0MykgICAgLyogMjIwMDQzICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIE1lZGlhIGNvdW50IG1pc21hdGNoIGluIG9mZmVyIGFuZCBhbnN3ZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRU1JU01FRElBICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzQ0KSAgICAvKiAyMjAwNDQgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTWVkaWEgdHlwZSBpcyBkaWZmZXJlbnQgaW4gdGhlIHJlbW90ZSBhbnN3ZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRUlOVkFOU01FRElBIChQSk1FRElBX0VSUk5PX1NUQVJUKzQ1KSAgICAvKiAyMjAwNDUgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogVHJhbnNwb3J0IHR5cGUgaXMgZGlmZmVyZW50IGluIHRoZSByZW1vdGUgYW5zd2VyLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQTkVHX0VJTlZBTlNUUCAgICAoUEpNRURJQV9FUlJOT19TVEFSVCs0NikgICAgLyogMjIwMDQ2ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIE5vIGNvbW1vbiBtZWRpYSBwYXlsb2FkIGlzIHByb3ZpZGVkIGluIHRoZSBhbnN3ZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfRUFOU05PTUVESUEgIChQSk1FRElBX0VSUk5PX1NUQVJUKzQ3KSAgICAvKiAyMjAwNDcgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gbWVkaWEgaXMgYWN0aXZlIGFmdGVyIG5lZ290aWF0aW9uLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQTkVHX0VOT01FRElBCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCs0OCkgICAgLyogMjIwMDQ4ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIE5vIHN1aXRhYmxlIGNvZGVjIGZvciByZW1vdGUgb2ZmZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfTk9BTlNDT0RFQyAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzQ5KSAgICAvKiAyMjAwNDkgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gc3VpdGFibGUgdGVsZXBob25lLWV2ZW50IGZvciByZW1vdGUgb2ZmZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBORUdfTk9BTlNURUxFVkVOVCAoUEpNRURJQV9FUlJOT19TVEFSVCs1MCkgICAvKiAyMjAwNTAgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gc3VpdGFibGUgYW5zd2VyIGZvciB1bmtub3duIHJlbW90ZSBvZmZlci4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUE5FR19OT0FOU1VOS05PV04gKFBKTUVESUFfRVJSTk9fU1RBUlQrNTEpICAgIC8qIDIyMDA1MSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNEUCBDT01QQVJJU09OIFNUQVRVUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBTRFAgbWVkaWEgc3RyZWFtIG5vdCBlcXVhbC4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FTUVESUFOT1RFUVVBTCAgKFBKTUVESUFfRVJSTk9fU1RBUlQrNjApICAgIC8qIDIyMDA2MCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBQb3J0IG51bWJlciBpbiBTRFAgbWVkaWEgZGVzY3JpcHRvciBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRVBPUlROT1RFUVVBTCAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzYxKSAgICAvKiAyMjAwNjEgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogVHJhbnNwb3J0IGluIFNEUCBtZWRpYSBkZXNjcmlwdG9yIG5vdCBlcXVhbC4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FVFBPUlROT1RFUVVBTCAgKFBKTUVESUFfRVJSTk9fU1RBUlQrNjIpICAgIC8qIDIyMDA2MiAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBNZWRpYSBmb3JtYXQgaW4gU0RQIG1lZGlhIGRlc2NyaXB0b3Igbm90IGVxdWFsLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VGT1JNQVROT1RFUVVBTCAoUEpNRURJQV9FUlJOT19TVEFSVCs2MykgICAgLyogMjIwMDYzICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFNEUCBjb25uZWN0aW9uIGRlc2NyaXB0aW9uIG5vdCBlcXVhbC4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FQ09OTk5PVEVRVUFMICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrNjQpICAgIC8qIDIyMDA2NCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBTRFAgYXR0cmlidXRlcyBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRUFUVFJOT1RFUVVBTCAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzY1KSAgICAvKiAyMjAwNjUgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU0RQIG1lZGlhIGRpcmVjdGlvbiBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRURJUk5PVEVRVUFMICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzY2KSAgICAvKiAyMjAwNjYgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU0RQIGZtdHAgYXR0cmlidXRlIG5vdCBlcXVhbC4KKyAqLworI2RlZmluZSBQSk1FRElBX1NEUF9FRk1UUE5PVEVRVUFMICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrNjcpICAgIC8qIDIyMDA2NyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBTRFAgZnRwbWFwIGF0dHJpYnV0ZSBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRVJUUE1BUE5PVEVRVUFMIChQSk1FRElBX0VSUk5PX1NUQVJUKzY4KSAgICAvKiAyMjAwNjggKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU0RQIHNlc3Npb24gZGVzY3JpcHRvciBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRVNFU1NOT1RFUVVBTCAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzY5KSAgICAvKiAyMjAwNjkgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU0RQIG9yaWdpbiBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRU9SSUdJTk5PVEVRVUFMIChQSk1FRElBX0VSUk5PX1NUQVJUKzcwKSAgICAvKiAyMjAwNzAgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU0RQIG5hbWUvc3ViamVjdCBub3QgZXF1YWwuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TRFBfRU5BTUVOT1RFUVVBTCAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzcxKSAgICAvKiAyMjAwNzEgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU0RQIHRpbWUgbm90IGVxdWFsLgorICovCisjZGVmaW5lIFBKTUVESUFfU0RQX0VUSU1FTk9URVFVQUwgICAoUEpNRURJQV9FUlJOT19TVEFSVCs3MikgICAgLyogMjIwMDcyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09ERUMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogVW5zdXBwb3J0ZWQgY29kZWMuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9DT0RFQ19FVU5TVVAJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzgwKSAgICAvKiAyMjAwODAgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQ29kZWMgaW50ZXJuYWwgY3JlYXRpb24gZXJyb3IuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9DT0RFQ19FRkFJTEVECSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCs4MSkgICAgLyogMjIwMDgxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIENvZGVjIGZyYW1lIGlzIHRvbyBzaG9ydC4KKyAqLworI2RlZmluZSBQSk1FRElBX0NPREVDX0VGUk1UT09TSE9SVCAgKFBKTUVESUFfRVJSTk9fU1RBUlQrODIpICAgIC8qIDIyMDA4MiAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBQQ00gYnVmZmVyIGlzIHRvbyBzaG9ydC4KKyAqLworI2RlZmluZSBQSk1FRElBX0NPREVDX0VQQ01UT09TSE9SVCAgKFBKTUVESUFfRVJSTk9fU1RBUlQrODMpICAgIC8qIDIyMDA4MyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIGNvZGVjIGZyYW1lIGxlbmd0aC4KKyAqLworI2RlZmluZSBQSk1FRElBX0NPREVDX0VGUk1JTkxFTgkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrODQpICAgIC8qIDIyMDA4NCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIFBDTSBmcmFtZSBsZW5ndGguCisgKi8KKyNkZWZpbmUgUEpNRURJQV9DT0RFQ19FUENNRlJNSU5MRU4gIChQSk1FRElBX0VSUk5PX1NUQVJUKzg1KSAgICAvKiAyMjAwODUgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBtb2RlLgorICovCisjZGVmaW5lIFBKTUVESUFfQ09ERUNfRUlOTU9ERQkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrODYpICAgIC8qIDIyMDA4NiAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBCYWQgb3IgY29ycnVwdGVkIGJpdHN0cmVhbS4KKyAqLworI2RlZmluZSBQSk1FRElBX0NPREVDX0VCQURCSVRTVFJFQU0gKFBKTUVESUFfRVJSTk9fU1RBUlQrODcpICAgIC8qIDIyMDA4NyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1FRElBCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgcmVtb3RlIElQIGFkZHJlc3MgKGluIFNEUCkuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FSU5WQUxJRElQCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxMDApICAgIC8qIDIyMDEwMCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBBc3ltZXRyaWMgY29kZWMgaXMgbm90IHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBQSk1FRElBX0VBU1lNQ09ERUMJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEwMSkgICAgLyogMjIwMTAxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgcGF5bG9hZCB0eXBlLgorICovCisjZGVmaW5lIFBKTUVESUFfRUlOVkFMSURQVAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTAyKSAgICAvKiAyMjAxMDIgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTWlzc2luZyBydHBtYXAuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FTUlTU0lOR1JUUE1BUAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTAzKSAgICAvKiAyMjAxMDMgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBtZWRpYSB0eXBlLgorICovCisjZGVmaW5lIFBKTUVESUFfRUlOVkFMSU1FRElBVFlQRSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxMDQpICAgIC8qIDIyMDEwNCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBSZW1vdGUgZG9lcyBub3Qgc3VwcG9ydCBEVE1GLgorICovCisjZGVmaW5lIFBKTUVESUFfRVJFTU9URU5PRFRNRgkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTA1KSAgICAvKiAyMjAxMDUgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBEVE1GIGRpZ2l0LgorICovCisjZGVmaW5lIFBKTUVESUFfUlRQX0VJTkRUTUYJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEwNikgICAgLyogMjIwMTA2ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFJlbW90ZSBkb2VzIG5vdCBzdXBwb3J0IFJGQyAyODMzCisgKi8KKyNkZWZpbmUgUEpNRURJQV9SVFBfRVJFTU5PUkZDMjgzMyAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEwNykgICAgLyogMjIwMTA3ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgb3IgYmFkIGZvcm1hdAorICovCisjZGVmaW5lIFBKTUVESUFfRUJBREZNVCAgICAgICAgICAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxMDgpICAgIC8qIDIyMDEwOCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJUUCBTRVNTSU9OIEVSUk9SUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBHZW5lcmFsIGludmFsaWQgUlRQIHBhY2tldCBlcnJvci4KKyAqLworI2RlZmluZSBQSk1FRElBX1JUUF9FSU5QS1QJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEyMCkgICAgLyogMjIwMTIwICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgUlRQIHBhY2tldCBwYWNraW5nLgorICovCisjZGVmaW5lIFBKTUVESUFfUlRQX0VJTlBBQ0sJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEyMSkgICAgLyogMjIwMTIxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgUlRQIHBhY2tldCB2ZXJzaW9uLgorICovCisjZGVmaW5lIFBKTUVESUFfUlRQX0VJTlZFUgkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTIyKSAgICAvKiAyMjAxMjIgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogUlRQIFNTUkMgaWQgbWlzbWF0Y2guCisgKi8KKyNkZWZpbmUgUEpNRURJQV9SVFBfRUlOU1NSQwkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTIzKSAgICAvKiAyMjAxMjMgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogUlRQIHBheWxvYWQgdHlwZSBtaXNtYXRjaC4KKyAqLworI2RlZmluZSBQSk1FRElBX1JUUF9FSU5QVAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTI0KSAgICAvKiAyMjAxMjQgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBSVFAgcGFja2V0IGxlbmd0aC4KKyAqLworI2RlZmluZSBQSk1FRElBX1JUUF9FSU5MRU4JICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzEyNSkgICAgLyogMjIwMTI1ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFJUUCBzZXNzaW9uIHJlc3RhcnRlZC4KKyAqLworI2RlZmluZSBQSk1FRElBX1JUUF9FU0VTU1JFU1RBUlQgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTMwKSAgICAvKiAyMjAxMzAgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogUlRQIHNlc3Npb24gaW4gcHJvYmF0aW9uCisgKi8KKyNkZWZpbmUgUEpNRURJQV9SVFBfRVNFU1NQUk9CQVRJT04gIChQSk1FRElBX0VSUk5PX1NUQVJUKzEzMSkgICAgLyogMjIwMTMxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEJhZCBSVFAgc2VxdWVuY2UgbnVtYmVyCisgKi8KKyNkZWZpbmUgUEpNRURJQV9SVFBfRUJBRFNFUQkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTMyKSAgICAvKiAyMjAxMzIgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogUlRQIG1lZGlhIHBvcnQgZGVzdGluYXRpb24gaXMgbm90IGNvbmZpZ3VyZWQKKyAqLworI2RlZmluZSBQSk1FRElBX1JUUF9FQkFEREVTVAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTMzKSAgICAvKiAyMjAxMzMgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogUlRQIGlzIG5vdCBjb25maWd1cmVkLgorICovCisjZGVmaW5lIFBKTUVESUFfUlRQX0VOT0NPTkZJRwkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTM0KSAgICAvKiAyMjAxMzQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQT1JUIEVSUk9SUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBHZW5lcmljIGluY29tcGF0aWJsZSBwb3J0IGVycm9yLgorICovCisjZGVmaW5lIFBKTUVESUFfRU5PVENPTVBBVElCTEUJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzE2MCkgICAgLyogMjIwMTYwICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEluY29tcGF0aWJsZSBjbG9jayByYXRlCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FTkNDTE9DS1JBVEUJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzE2MSkgICAgLyogMjIwMTYxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEluY29tcGF0aWJsZSBzYW1wbGVzIHBlciBmcmFtZQorICovCisjZGVmaW5lIFBKTUVESUFfRU5DU0FNUExFU1BGUkFNRSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxNjIpICAgIC8qIDIyMDE2MiAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbmNvbXBhdGlibGUgbWVkaWEgdHlwZQorICovCisjZGVmaW5lIFBKTUVESUFfRU5DVFlQRQkJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzE2MykgICAgLyogMjIwMTYzICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEluY29tcGF0aWJsZSBiaXRzIHBlciBzYW1wbGUKKyAqLworI2RlZmluZSBQSk1FRElBX0VOQ0JJVFMJCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxNjQpICAgIC8qIDIyMDE2NCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbmNvbXBhdGlibGUgYnl0ZXMgcGVyIGZyYW1lCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FTkNCWVRFUwkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTY1KSAgICAvKiAyMjAxNjUgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW5jb21wYXRpYmxlIG51bWJlciBvZiBjaGFubmVscworICovCisjZGVmaW5lIFBKTUVESUFfRU5DQ0hBTk5FTAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTY2KSAgICAvKiAyMjAxNjYgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGSUxFIEVSUk9SUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBOb3QgYSB2YWxpZCBXQVZFIGZpbGUuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FTk9UVkFMSURXQVZFCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxODApICAgIC8qIDIyMDE4MCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBVbnN1cHBvcnRlZCBXQVZFIGZpbGUuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FV0FWRVVOU1VQUAkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTgxKSAgICAvKiAyMjAxODEgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogV2F2ZSBmaWxlIHRvbyBzaG9ydC4KKyAqLworI2RlZmluZSBQSk1FRElBX0VXQVZFVE9PU0hPUlQJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzE4MikgICAgLyogMjIwMTgyICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFNvdW5kIGZyYW1lIGlzIHRvbyBsYXJnZSBmb3IgZmlsZSBidWZmZXIuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FRlJNRklMRVRPT0JJRwkgICAgKFBKTUVESUFfRVJSTk9fU1RBUlQrMTgzKSAgICAvKiAyMjAxODMgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogVW5zdXBwb3J0ZWQgQVZJIGZpbGUuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FQVZJVU5TVVBQCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsxOTEpICAgIC8qIDIyMDE5MSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNPVU5EIERFVklDRSBFUlJPUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogTm8gc3VpdGFibGUgYXVkaW8gY2FwdHVyZSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FTk9TTkRSRUMJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzIwMCkgICAgLyogMjIwMjAwICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIE5vIHN1aXRhYmxlIGF1ZGlvIHBsYXliYWNrIGRldmljZS4KKyAqLworI2RlZmluZSBQSk1FRElBX0VOT1NORFBMQVkJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzIwMSkgICAgLyogMjIwMjAxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgc291bmQgZGV2aWNlIElELgorICovCisjZGVmaW5lIFBKTUVESUFfRVNORElOREVWSUQJICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzIwMikgICAgLyogMjIwMjAyICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgc2FtcGxlIGZvcm1hdCBmb3Igc291bmQgZGV2aWNlLgorICovCisjZGVmaW5lIFBKTUVESUFfRVNORElOU0FNUExFRk1UCSAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsyMDMpICAgIC8qIDIyMDIwMyAqLworCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1NSVFApICYmIChQSk1FRElBX0hBU19TUlRQICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTUlRQIFRSQU5TUE9SVCBFUlJPUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogU1JUUCBjcnlwdG8tc3VpdGUgbmFtZSBub3QgbWF0Y2ggdGhlIG9mZmVyZXIgdGFnLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FQ1JZUFRPTk9UTUFUQ0ggKFBKTUVESUFfRVJSTk9fU1RBUlQrMjIwKSAgIC8qIDIyMDIyMCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIFNSVFAga2V5IGxlbmd0aCBmb3Igc3BlY2lmaWMgY3J5cHRvLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FSU5LRVlMRU4JICAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzIyMSkgICAgLyogMjIwMjIxICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIFVuc3VwcG9ydGVkIFNSVFAgY3J5cHRvLXN1aXRlLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FTk9UU1VQQ1JZUFRPICAoUEpNRURJQV9FUlJOT19TVEFSVCsyMjIpICAgIC8qIDIyMDIyMiAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBTUlRQIFNEUCBjb250YWlucyBhbWJpZ3VlIGFuc3dlci4KKyAqLworI2RlZmluZSBQSk1FRElBX1NSVFBfRVNEUEFNQklHVUVBTlMgKFBKTUVESUFfRVJSTk9fU1RBUlQrMjIzKSAgICAvKiAyMjAyMjMgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogRHVwbGljYXRlZCBjcnlwdG8gdGFnLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FU0RQRFVQQ1JZUFRPVEFHIChQSk1FRElBX0VSUk5PX1NUQVJUKzIyNCkgIC8qIDIyMDIyNCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBJbnZhbGlkIGNyeXB0byBhdHRyaWJ1dGUuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TUlRQX0VTRFBJTkNSWVBUTyAgIChQSk1FRElBX0VSUk5PX1NUQVJUKzIyNSkgICAgLyogMjIwMjI1ICovCisvKioKKyAqIEBoaWRlaW5pdGlhbGl6ZXIKKyAqIEludmFsaWQgY3J5cHRvIHRhZy4KKyAqLworI2RlZmluZSBQSk1FRElBX1NSVFBfRVNEUElOQ1JZUFRPVEFHIChQSk1FRElBX0VSUk5PX1NUQVJUKzIyNikgICAvKiAyMjAyMjYgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogSW52YWxpZCBTRFAgbWVkaWEgdHJhbnNwb3J0IGZvciBTUlRQLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FU0RQSU5UUkFOU1BPUlQgKFBKTUVESUFfRVJSTk9fU1RBUlQrMjI3KSAgIC8qIDIyMDIyNyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBTUlRQIGNyeXB0byBhdHRyaWJ1dGUgcmVxdWlyZWQgaW4gU0RQLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FU0RQUkVRQ1JZUFRPICAoUEpNRURJQV9FUlJOT19TVEFSVCsyMjgpICAgIC8qIDIyMDIyOCAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBTZWN1cmUgdHJhbnNwb3J0IHJlcXVpcmVkIGluIFNEUCBtZWRpYSBkZXNjcmlwdG9yLgorICovCisjZGVmaW5lIFBKTUVESUFfU1JUUF9FU0RQUkVRU0VDVFAgICAoUEpNRURJQV9FUlJOT19TVEFSVCsyMjkpICAgIC8qIDIyMDIyOSAqLworCisjZW5kaWYgLyogUEpNRURJQV9IQVNfU1JUUCAqLworCisKKy8qKgorICogR2V0IGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZS4gTm90ZSB0aGF0IHRoaXMKKyAqIGZ1bmN0aW9uIGlzIG9ubHkgYWJsZSB0byBkZWNvZGUgUEpNRURJQSBzcGVjaWZpYyBlcnJvciBjb2RlLgorICogQXBwbGljYXRpb24gc2hvdWxkIHVzZSBwal9zdHJlcnJvcigpLCB3aGljaCBzaG91bGQgYmUgYWJsZSB0bworICogZGVjb2RlIGFsbCBlcnJvciBjb2RlcyBiZWxvbmdpbmcgdG8gYWxsIHN1YnN5c3RlbXMgKGUuZy4gcGpsaWIsCisgKiBwam1lZGlhLCBwanNpcCwgZXRjKS4KKyAqCisgKiBAcGFyYW0gc3RhdHVzICAgIFRoZSBlcnJvciBjb2RlLgorICogQHBhcmFtIGJ1ZmZlciAgICBUaGUgYnVmZmVyIHdoZXJlIHRvIHB1dCB0aGUgZXJyb3IgbWVzc2FnZS4KKyAqIEBwYXJhbSBidWZzaXplICAgU2l6ZSBvZiB0aGUgYnVmZmVyLgorICoKKyAqIEByZXR1cm4JICAgIFRoZSBlcnJvciBtZXNzYWdlIGFzIE5VTEwgdGVybWluYXRlZCBzdHJpbmcsCisgKiAgICAgICAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBwal9zdHJfdC4KKyAqLworUEpfREVDTChwal9zdHJfdCkgcGptZWRpYV9zdHJlcnJvciggcGpfc3RhdHVzX3Qgc3RhdHVzLCBjaGFyICpidWZmZXIsCisJCQkJICAgIHBqX3NpemVfdCBidWZzaXplKTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYJLyogX19QSk1FRElBX0VSUk5PX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ldmVudC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTljNzczCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZXZlbnQuaApAQCAtMCwwICsxLDM5NSBAQAorLyogJElkOiBldmVudC5oIDM5MDUgMjAxMS0xMi0wOSAwNToxNTozOVogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0VWRU5UX0hfXworI2RlZmluZSBfX1BKTUVESUFfRVZFTlRfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS9ldmVudC5oCisgKiBAYnJpZWYgRXZlbnQgZnJhbWV3b3JrCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc2lnbmF0dXJlcy5oPgorCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfRVZFTlQgRXZlbnQgRnJhbWV3b3JrCisgKiBAYnJpZWYgUEpNRURJQSBldmVudCBmcmFtZXdvcmsKKyAqIEB7CisgKi8KKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIGRlc2NyaWJlcyBsaXN0IG9mIG1lZGlhIGV2ZW50cy4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZXZlbnRfdHlwZQoreworICAgIC8qKgorICAgICAqIE5vIGV2ZW50LgorICAgICAqLworICAgIFBKTUVESUFfRVZFTlRfTk9ORSwKKworICAgIC8qKgorICAgICAqIE1lZGlhIGZvcm1hdCBoYXMgY2hhbmdlZCBldmVudC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0VWRU5UX0ZNVF9DSEFOR0VECT0gUEpNRURJQV9GT1VSQ0MoJ0YnLCAnTScsICdDJywgJ0gnKSwKKworICAgIC8qKgorICAgICAqIFZpZGVvIHdpbmRvdyBpcyBiZWluZyBjbG9zZWQuCisgICAgICovCisgICAgUEpNRURJQV9FVkVOVF9XTkRfQ0xPU0lORwk9IFBKTUVESUFfRk9VUkNDKCdXJywgJ04nLCAnQycsICdMJyksCisKKyAgICAvKioKKyAgICAgKiBWaWRlbyB3aW5kb3cgaGFzIGJlZW4gY2xvc2VkIGV2ZW50LgorICAgICAqLworICAgIFBKTUVESUFfRVZFTlRfV05EX0NMT1NFRAk9IFBKTUVESUFfRk9VUkNDKCdXJywgJ04nLCAnQycsICdPJyksCisKKyAgICAvKioKKyAgICAgKiBWaWRlbyB3aW5kb3cgaGFzIGJlZW4gcmVzaXplZCBldmVudC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0VWRU5UX1dORF9SRVNJWkVECT0gUEpNRURJQV9GT1VSQ0MoJ1cnLCAnTicsICdSJywgJ1onKSwKKworICAgIC8qKgorICAgICAqIE1vdXNlIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkIGV2ZW50LgorICAgICAqLworICAgIFBKTUVESUFfRVZFTlRfTU9VU0VfQlROX0RPV04gPSBQSk1FRElBX0ZPVVJDQygnTScsICdTJywgJ0QnLCAnTicpLAorCisgICAgLyoqCisgICAgICogVmlkZW8ga2V5ZnJhbWUgaGFzIGp1c3QgYmVlbiBkZWNvZGVkIGV2ZW50LgorICAgICAqLworICAgIFBKTUVESUFfRVZFTlRfS0VZRlJBTUVfRk9VTkQgPSBQSk1FRElBX0ZPVVJDQygnSScsICdGJywgJ1InLCAnRicpLAorCisgICAgLyoqCisgICAgICogVmlkZW8gZGVjb2RpbmcgZXJyb3IgZHVlIHRvIG1pc3Npbmcga2V5ZnJhbWUgZXZlbnQuCisgICAgICovCisgICAgUEpNRURJQV9FVkVOVF9LRVlGUkFNRV9NSVNTSU5HID0gUEpNRURJQV9GT1VSQ0MoJ0knLCAnRicsICdSJywgJ00nKSwKKworICAgIC8qKgorICAgICAqIFZpZGVvIG9yaWVudGF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgZXZlbnQuCisgICAgICovCisgICAgUEpNRURJQV9FVkVOVF9PUklFTlRfQ0hBTkdFRCA9IFBKTUVESUFfRk9VUkNDKCdPJywgJ1InLCAnTicsICdUJykKKworfSBwam1lZGlhX2V2ZW50X3R5cGU7CisKKy8qKgorICogQWRkaXRpb25hbCBkYXRhL3BhcmFtZXRlcnMgZm9yIG1lZGlhIGZvcm1hdCBjaGFuZ2VkIGV2ZW50CisgKiAoUEpNRURJQV9FVkVOVF9GTVRfQ0hBTkdFRCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfZXZlbnRfZm10X2NoYW5nZWRfZGF0YQoreworICAgIC8qKiBUaGUgbWVkaWEgZmxvdyBkaXJlY3Rpb24gKi8KKyAgICBwam1lZGlhX2RpcgkJZGlyOworCisgICAgLyoqIFRoZSBuZXcgbWVkaWEgZm9ybWF0LiAqLworICAgIHBqbWVkaWFfZm9ybWF0CW5ld19mbXQ7Cit9IHBqbWVkaWFfZXZlbnRfZm10X2NoYW5nZWRfZGF0YTsKKworLyoqCisgKiBBZGRpdGlvbmFsIGRhdGEvcGFyYW1ldGVycyBhcmUgbm90IG5lZWRlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ldmVudF9kdW1teV9kYXRhCit7CisgICAgLyoqIER1bW15IGRhdGEgKi8KKyAgICBpbnQJCQlkdW1teTsKK30gcGptZWRpYV9ldmVudF9kdW1teV9kYXRhOworCisvKioKKyAqIEFkZGl0aW9uYWwgZGF0YS9wYXJhbWV0ZXJzIGZvciB3aW5kb3cgcmVzaXplZCBldmVudAorICogKFBKTUVESUFfRVZFTlRfV05EX1JFU0laRUQpLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2V2ZW50X3duZF9yZXNpemVkX2RhdGEKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgbmV3IHdpbmRvdyBzaXplLgorICAgICAqLworICAgIHBqbWVkaWFfcmVjdF9zaXplCW5ld19zaXplOworfSBwam1lZGlhX2V2ZW50X3duZF9yZXNpemVkX2RhdGE7CisKKy8qKgorICogQWRkaXRpb25hbCBkYXRhL3BhcmFtZXRlcnMgZm9yIHdpbmRvdyBjbG9zaW5nIGV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2V2ZW50X3duZF9jbG9zaW5nX2RhdGEKK3sKKyAgICAvKiogQ29uc3VtZXIgbWF5IHNldCB0aGlzIGZpZWxkIHRvIFBKX1RSVUUgdG8gY2FuY2VsIHRoZSBjbG9zaW5nICovCisgICAgcGpfYm9vbF90CQljYW5jZWw7Cit9IHBqbWVkaWFfZXZlbnRfd25kX2Nsb3NpbmdfZGF0YTsKKworLyoqIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3Igd2luZG93IGNoYW5nZWQgZXZlbnQuICovCit0eXBlZGVmIHBqbWVkaWFfZXZlbnRfZHVtbXlfZGF0YSBwam1lZGlhX2V2ZW50X3duZF9jbG9zZWRfZGF0YTsKKworLyoqIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgbW91c2UgYnV0dG9uIGRvd24gZXZlbnQgKi8KK3R5cGVkZWYgcGptZWRpYV9ldmVudF9kdW1teV9kYXRhIHBqbWVkaWFfZXZlbnRfbW91c2VfYnRuX2Rvd25fZGF0YTsKKworLyoqIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3Iga2V5ZnJhbWUgZm91bmQgZXZlbnQgKi8KK3R5cGVkZWYgcGptZWRpYV9ldmVudF9kdW1teV9kYXRhIHBqbWVkaWFfZXZlbnRfa2V5ZnJhbWVfZm91bmRfZGF0YTsKKworLyoqIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3Iga2V5ZnJhbWUgbWlzc2luZyBldmVudCAqLwordHlwZWRlZiBwam1lZGlhX2V2ZW50X2R1bW15X2RhdGEgcGptZWRpYV9ldmVudF9rZXlmcmFtZV9taXNzaW5nX2RhdGE7CisKKy8qKgorICogTWF4aW11bSBzaXplIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBzZWN0aW9uIGluIHBqbWVkaWFfZXZlbnQgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgUEpNRURJQV9FVkVOVF9EQVRBX01BWF9TSVpFCXNpemVvZihwam1lZGlhX2V2ZW50X2ZtdF9jaGFuZ2VkX2RhdGEpCisKKy8qKiBUeXBlIG9mIHN0b3JhZ2UgdG8gaG9sZCB1c2VyIGRhdGEgaW4gcGptZWRpYV9ldmVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgY2hhciBwam1lZGlhX2V2ZW50X3VzZXJfZGF0YVtQSk1FRElBX0VWRU5UX0RBVEFfTUFYX1NJWkVdOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIG1lZGlhIGV2ZW50LiBJdCBjb25zaXN0cyBtYWlubHkgb2YgdGhlIGV2ZW50CisgKiB0eXBlIGFuZCBhZGRpdGlvbmFsIGRhdGEvcGFyYW1ldGVycyBmb3IgdGhlIGV2ZW50LiBBcHBsaWNhdGlvbnMgY2FuCisgKiB1c2UgI3BqbWVkaWFfZXZlbnRfaW5pdCgpIHRvIGluaXRpYWxpemUgdGhpcyBldmVudCBzdHJ1Y3R1cmUgd2l0aAorICogYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2V2ZW50Cit7CisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHR5cGUuCisgICAgICovCisgICAgcGptZWRpYV9ldmVudF90eXBlCQkJIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWVkaWEgdGltZXN0YW1wIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy4KKyAgICAgKi8KKyAgICBwal90aW1lc3RhbXAJCSAJIHRpbWVzdGFtcDsKKworICAgIC8qKgorICAgICAqIFBvaW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LiBUaGlzIGZpZWxkCisgICAgICogaXMgcHJvdmlkZWQgbWFpbmx5IGZvciBjb21wYXJpc29uIHB1cnBvc2Ugc28gdGhhdCBldmVudCBzdWJzY3JpYmVycworICAgICAqIGNhbiBjaGVjayB3aGljaCBzb3VyY2UgdGhlIGV2ZW50IG9yaWdpbmF0ZWQgZnJvbS4gVXNhZ2Ugb2YgdGhpcworICAgICAqIHBvaW50ZXIgZm9yIG90aGVyIHB1cnBvc2UgbWF5IHJlcXVpcmUgc3BlY2lhbCBjYXJlIHN1Y2ggYXMgbXV0ZXgKKyAgICAgKiBsb2NraW5nIG9yIGNoZWNraW5nIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBjb25zdCB2b2lkCSAgICAgICAgICAgICAgICAgICAgICAgICpzcmM7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwdWJsaXNoZXIgb2YgdGhpcyBldmVudC4gVGhpcyBmaWVsZAorICAgICAqIGlzIHByb3ZpZGVkIG1haW5seSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlIHNvIHRoYXQgZXZlbnQgc3Vic2NyaWJlcnMKKyAgICAgKiBjYW4gY2hlY2sgd2hpY2ggb2JqZWN0IHB1Ymxpc2hlZCB0aGUgZXZlbnQuIFVzYWdlIG9mIHRoaXMKKyAgICAgKiBwb2ludGVyIGZvciBvdGhlciBwdXJwb3NlIG1heSByZXF1aXJlIHNwZWNpYWwgY2FyZSBzdWNoIGFzIG11dGV4CisgICAgICogbG9ja2luZyBvciBjaGVja2luZyB3aGV0aGVyIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBkZXN0cm95ZWQuCisgICAgICovCisgICAgY29uc3Qgdm9pZAkgICAgICAgICAgICAgICAgICAgICAgICAqZXB1YjsKKworICAgIC8qKgorICAgICAqIEFkZGl0aW9uYWwgZGF0YS9wYXJhbWV0ZXJzIGFib3V0IHRoZSBldmVudC4gVGhlIHR5cGUgb2YgZGF0YQorICAgICAqIHdpbGwgYmUgc3BlY2lmaWMgdG8gdGhlIGV2ZW50IHR5cGUgYmVpbmcgcmVwb3J0ZWQuCisgICAgICovCisgICAgdW5pb24geworCS8qKiBNZWRpYSBmb3JtYXQgY2hhbmdlZCBldmVudCBkYXRhLiAqLworCXBqbWVkaWFfZXZlbnRfZm10X2NoYW5nZWRfZGF0YQkJZm10X2NoYW5nZWQ7CisKKwkvKiogV2luZG93IHJlc2l6ZWQgZXZlbnQgZGF0YSAqLworCXBqbWVkaWFfZXZlbnRfd25kX3Jlc2l6ZWRfZGF0YQkJd25kX3Jlc2l6ZWQ7CisKKwkvKiogV2luZG93IGNsb3NpbmcgZXZlbnQgZGF0YS4gKi8KKwlwam1lZGlhX2V2ZW50X3duZF9jbG9zaW5nX2RhdGEJCXduZF9jbG9zaW5nOworCisJLyoqIFdpbmRvdyBjbG9zZWQgZXZlbnQgZGF0YSAqLworCXBqbWVkaWFfZXZlbnRfd25kX2Nsb3NlZF9kYXRhCQl3bmRfY2xvc2VkOworCisJLyoqIE1vdXNlIGJ1dHRvbiBkb3duIGV2ZW50IGRhdGEgKi8KKwlwam1lZGlhX2V2ZW50X21vdXNlX2J0bl9kb3duX2RhdGEJbW91c2VfYnRuX2Rvd247CisKKwkvKiogS2V5ZnJhbWUgZm91bmQgZXZlbnQgZGF0YSAqLworCXBqbWVkaWFfZXZlbnRfa2V5ZnJhbWVfZm91bmRfZGF0YQlrZXlmcmFtZV9mb3VuZDsKKworCS8qKiBLZXlmcmFtZSBtaXNzaW5nIGV2ZW50IGRhdGEgKi8KKwlwam1lZGlhX2V2ZW50X2tleWZyYW1lX21pc3NpbmdfZGF0YQlrZXlmcmFtZV9taXNzaW5nOworCisJLyoqIFN0b3JhZ2UgZm9yIHVzZXIgZXZlbnQgZGF0YSAqLworCXBqbWVkaWFfZXZlbnRfdXNlcl9kYXRhCQkJdXNlcjsKKworCS8qKiBQb2ludGVyIHRvIHN0b3JhZ2UgdG8gdXNlciBldmVudCBkYXRhLCBpZiBpdCdzIG91dHNpZGUKKwkgKiB0aGlzIHN0cnVjdAorCSAqLworCXZvaWQJCQkJCSpwdHI7CisgICAgfSBkYXRhOworfSBwam1lZGlhX2V2ZW50OworCisvKioKKyAqIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIG1lZGlhIGV2ZW50cy4KKyAqCisgKiBAcGFyYW0gZXZlbnQJCVRoZSBtZWRpYSBldmVudC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJVGhlIHVzZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxiYWNrLgorICoKKyAqIEByZXR1cm4JCUlmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi1QSl9TVUNDRVNTLCB0aGlzIHJldHVybgorICogCQkJY29kZSBtYXkgYmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBjYWxsZXIuCisgKi8KK3R5cGVkZWYgcGpfc3RhdHVzX3QgcGptZWRpYV9ldmVudF9jYihwam1lZGlhX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisvKioKKyAqIFRoaXMgZW51bWVyYXRpb24gZGVzY3JpYmVzIGZsYWdzIGZvciBldmVudCBwdWJsaWNhdGlvbiB2aWEKKyAqICNwam1lZGlhX2V2ZW50X3B1Ymxpc2goKS4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZXZlbnRfcHVibGlzaF9mbGFnCit7CisgICAgLyoqCisgICAgICogUHVibGlzaGVyIHdpbGwgb25seSBwb3N0IHRoZSBldmVudCB0byB0aGUgZXZlbnQgbWFuYWdlci4gSXQgaXMgdGhlCisgICAgICogZXZlbnQgbWFuYWdlciB0aGF0IHdpbGwgbGF0ZXIgbm90aWZ5IGFsbCB0aGUgcHVibGlzaGVyJ3Mgc3Vic2NyaWJlcnMuCisgICAgICovCisgICAgUEpNRURJQV9FVkVOVF9QVUJMSVNIX1BPU1RfRVZFTlQgPSAxCisKK30gcGptZWRpYV9ldmVudF9wdWJsaXNoX2ZsYWc7CisKKy8qKgorICogRXZlbnQgbWFuYWdlciBmbGFnLgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV9ldmVudF9tZ3JfZmxhZworeworICAgIC8qKgorICAgICAqIFRlbGwgdGhlIGV2ZW50IG1hbmFnZXIgbm90IHRvIGNyZWF0ZSBhbnkgZXZlbnQgd29ya2VyIHRocmVhZC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0VWRU5UX01HUl9OT19USFJFQUQgPSAxCisKK30gcGptZWRpYV9ldmVudF9tZ3JfZmxhZzsKKworLyoqCisgKiBPcGFxdWUgZGF0YSB0eXBlIGZvciBldmVudCBtYW5hZ2VyLiBUeXBpY2FsbHksIHRoZSBldmVudCBtYW5hZ2VyCisgKiBpcyBhIHNpbmdsZXRvbiBpbnN0YW5jZSwgYWx0aG91Z2ggYXBwbGljYXRpb24gbWF5IGluc3RhbnRpYXRlIG1vcmUgdGhhbiBvbmUKKyAqIGluc3RhbmNlcyBvZiB0aGlzIGlmIHJlcXVpcmVkLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2V2ZW50X21nciBwam1lZGlhX2V2ZW50X21ncjsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgZXZlbnQgbWFuYWdlciBpbnN0YW5jZS4gVGhpcyB3aWxsIGFsc28gc2V0IHRoZSBwb2ludGVyCisgKiB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGlmIHRoZSB2YWx1ZSBpcyBzdGlsbCBOVUxMLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tLgorICogQHBhcmFtIG9wdGlvbnMgICAgICAgT3B0aW9ucy4gQml0bWFzayBmbGFncyBmcm9tICNwam1lZGlhX2V2ZW50X21ncl9mbGFnCisgKiBAcGFyYW0gbWdyCQlQb2ludGVyIHRvIGhvbGQgdGhlIGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlCisgKiAJCQlldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9ldmVudF9tZ3JfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCSAgICAgICAgICAgICAgcGptZWRpYV9ldmVudF9tZ3IgKiptZ3IpOworCisvKioKKyAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4JCVRoZSBpbnN0YW5jZS4KKyAqLworUEpfREVDTChwam1lZGlhX2V2ZW50X21nciopIHBqbWVkaWFfZXZlbnRfbWdyX2luc3RhbmNlKHZvaWQpOworCisvKioKKyAqIE1hbnVhbGx5IGFzc2lnbiBhIHNwZWNpZmljIGV2ZW50IG1hbmFnZXIgaW5zdGFuY2UgYXMgdGhlIHNpbmdsZXRvbgorICogaW5zdGFuY2UuIE5vcm1hbGx5IHRoaXMgaXMgbm90IG5lZWRlZCBpZiBvbmx5IG9uZSBpbnN0YW5jZSBpcyBldmVyCisgKiBnb2luZyB0byBiZSBjcmVhdGVkLCBhcyB0aGUgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGFzc2lnbiB0aGUgc2luZ2xldG9uCisgKiBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gbWdyCQlUaGUgaW5zdGFuY2UgdG8gYmUgdXNlZCBhcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICogCQkJQXBwbGljYXRpb24gbWF5IHNwZWNpZnkgTlVMTCB0byBjbGVhciB0aGUgc2luZ2xldG9uCisgKiAJCQlzaW5nbGV0b24gaW5zdGFuY2UuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ldmVudF9tZ3Jfc2V0X2luc3RhbmNlKHBqbWVkaWFfZXZlbnRfbWdyICptZ3IpOworCisvKioKKyAqIERlc3Ryb3kgYW4gZXZlbnQgbWFuYWdlci4gSWYgdGhlIG1hbmFnZXIgaGFwcGVucyB0byBiZSB0aGUgc2luZ2xldG9uCisgKiBpbnN0YW5jZSwgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSB3aWxsIGJlIHNldCB0byBOVUxMLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSBldmVudG1hbmFnZXIuIFNwZWNpZnkgTlVMTCB0byB1c2UKKyAqIAkJCXRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ldmVudF9tZ3JfZGVzdHJveShwam1lZGlhX2V2ZW50X21nciAqbWdyKTsKKworLyoqCisgKiBJbml0aWFsaXplIGV2ZW50IHN0cnVjdHVyZSB3aXRoIGJhc2ljIGRhdGEgYWJvdXQgdGhlIGV2ZW50LgorICoKKyAqIEBwYXJhbSBldmVudAkJVGhlIGV2ZW50IHRvIGJlIGluaXRpYWxpemVkLgorICogQHBhcmFtIHR5cGUJCVRoZSBldmVudCB0eXBlIHRvIGJlIHNldCBmb3IgdGhpcyBldmVudC4KKyAqIEBwYXJhbSB0cwkJRXZlbnQgdGltZXN0YW1wLiBNYXkgYmUgc2V0IHRvIE5VTEwgdG8gc2V0IHRoZSBldmVudAorICogCQkJdGltZXN0YW1wIHRvIHplcm8uCisgKiBAcGFyYW0gc3JjCQlFdmVudCBzb3VyY2UuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ldmVudF9pbml0KHBqbWVkaWFfZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9ldmVudF90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjKTsKKworLyoqCisgKiBTdWJzY3JpYmUgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBldmVudHMgcHVibGlzaGVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAqIHB1Ymxpc2hlci4gTm90ZSB0aGF0IHRoZSBzdWJzY3JpYmVyIG1heSByZWNlaXZlIG5vdCBvbmx5IGV2ZW50cyBlbWl0dGVkIGJ5CisgKiB0aGUgc3BlY2lmaWMgcHVibGlzaGVyIHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnQsIGJ1dCBhbHNvIGZyb20gb3RoZXIKKyAqIHB1Ymxpc2hlcnMgY29udGFpbmVkIGJ5IHRoZSBwdWJsaXNoZXIsIGlmIHRoZSBwdWJsaXNoZXIgaXMgcmVwdWJsaXNoaW5nCisgKiBldmVudHMgZnJvbSBvdGhlciBwdWJsaXNoZXJzLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtIGNiICAgICAgICAgICAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlY2VpdmUgdGhlIGV2ZW50LgorICogQHBhcmFtIHVzZXJfZGF0YSAgICAgVGhlIHVzZXIgZGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIEBwYXJhbSBlcHViCQlUaGUgZXZlbnQgcHVibGlzaGVyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9ldmVudF9zdWJzY3JpYmUocGptZWRpYV9ldmVudF9tZ3IgKm1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfZXZlbnRfY2IgKmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXB1Yik7CisKKy8qKgorICogVW5zdWJzY3JpYmUgdGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBkYXRhIGZyb20gYSBwdWJsaXNoZXIuCisgKiBJZiB0aGUgdXNlciBkYXRhIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBkbyB0aGUKKyAqIHVuc3Vic2NyaXB0aW9uIGZvciBhbGwgdXNlciBkYXRhLiBJZiB0aGUgcHVibGlzaGVyLCBlcHViLCBpcyBub3QKKyAqIHNwZWNpZmllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGRvIHRoZSB1bnN1YnNjcmlwdGlvbiBmcm9tIGFsbCBwdWJsaXNoZXJzLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtIGNiICAgICAgICAgICAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogQHBhcmFtIHVzZXJfZGF0YSAgICAgVGhlIHVzZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgY2FuIGJlIE5VTEwuCisgKiBAcGFyYW0gZXB1YgkJVGhlIGV2ZW50IHB1Ymxpc2hlciwgY2FuIGJlIE5VTEwuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9ldmVudF91bnN1YnNjcmliZShwam1lZGlhX2V2ZW50X21nciAqbWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX2V2ZW50X2NiICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICplcHViKTsKKworLyoqCisgKiBQdWJsaXNoIHRoZSBzcGVjaWZpZWQgZXZlbnQgdG8gYWxsIHN1YnNjcmliZXJzIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQKKyAqIHB1Ymxpc2hlci4gQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHdpbGwgY2FsbCBhbGwgdGhlIHN1YmNyaWJlcnMnCisgKiBjYWxsYmFja3MgaW1tZWRpYXRlbHkuIElmIHRoZSBwdWJsaXNoZXIgdXNlcyB0aGUgZmxhZworICogUEpNRURJQV9FVkVOVF9QVUJMSVNIX1BPU1RfRVZFTlQsIHB1Ymxpc2hlciB3aWxsIG9ubHkgcG9zdCB0aGUgZXZlbnQKKyAqIHRvIHRoZSBldmVudCBtYW5hZ2VyIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIEl0IGlzIHRoZSBldmVudCBtYW5hZ2VyCisgKiB0aGF0IHdpbGwgbGF0ZXIgbm90aWZ5IGFsbCB0aGUgcHVibGlzaGVyJ3Mgc3Vic2NyaWJlcnMuCisgKgorICogQHBhcmFtIG1ncgkJVGhlIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gZXB1YgkJVGhlIGV2ZW50IHB1Ymxpc2hlci4KKyAqIEBwYXJhbSBldmVudAkJVGhlIGV2ZW50IHRvIGJlIHB1Ymxpc2hlZC4KKyAqIEBwYXJhbSBmbGFnICAgICAgICAgIFB1YmxpY2F0aW9uIGZsYWcuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbmx5IGlmIGFsbCBzdWJzY3JpcHRpb24gY2FsbGJhY2tzIHJldHVybmVkCisgKiAJCQlQSl9TVUNDRVNTLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2V2ZW50X3B1Ymxpc2gocGptZWRpYV9ldmVudF9tZ3IgKm1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICplcHViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfZXZlbnRfcHVibGlzaF9mbGFnIGZsYWcpOworCisKKy8qKgorICogQH0gIFBKTUVESUFfRVZFTlQKKyAqLworCisKK1BKX0VORF9ERUNMCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfRVZFTlRfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mb3JtYXQuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDJjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mb3JtYXQuaApAQCAtMCwwICsxLDc2NiBAQAorLyogJElkOiBmb3JtYXQuaCA0NDcwIDIwMTMtMDQtMTUgMTA6NDA6MjZaIGJlbm55bHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fUEpNRURJQV9GT1JNQVRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9GT1JNQVRfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS9mb3JtYXQuaCBNZWRpYSBmb3JtYXQKKyAqIEBicmllZiBNZWRpYSBmb3JtYXQKKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GT1JNQVQgTWVkaWEgZm9ybWF0CisgKiBAaW5ncm91cCBQSk1FRElBX1RZUEVTCisgKiBAYnJpZWYgTWVkaWEgZm9ybWF0CisgKiBAeworICovCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBNYWNybyBmb3IgcGFja2luZyBmb3JtYXQgZnJvbSBhIGZvdXIgY2hhcmFjdGVyIGNvZGUsIHNpbWlsYXIgdG8gRk9VUkNDLgorICogVGhpcyBtYWNybyBpcyB1c2VkIGZvciBidWlsZGluZyB0aGUgY29uc3RhbnRzIGluIHBqbWVkaWFfZm9ybWF0X2lkCisgKiBlbnVtZXJhdGlvbi4KKyAqLworI2RlZmluZSBQSk1FRElBX0ZPUk1BVF9QQUNLKEMxLCBDMiwgQzMsIEM0KSBQSk1FRElBX0ZPVVJDQyhDMSwgQzIsIEMzLCBDNCkKKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIHVuaXF1ZWx5IGlkZW50aWZ5IGF1ZGlvIHNhbXBsZSBhbmQvb3IgdmlkZW8gcGl4ZWwgZm9ybWF0cy4KKyAqIFNvbWUgd2VsbCBrbm93biBmb3JtYXRzIGFyZSBsaXN0ZWQgaGVyZS4gVGhlIGZvcm1hdCBpZHMgYXJlIGJ1aWx0IGJ5CisgKiBjb21iaW5pbmcgZm91ciBjaGFyYWN0ZXIgY29kZXMsIHNpbWlsYXIgdG8gRk9VUkNDLiBUaGUgZm9ybWF0IGlkIGlzCisgKiBleHRlbnNpYmxlLCBhcyBhcHBsaWNhdGlvbiBtYXkgZGVmaW5lIGFuZCB1c2UgZm9ybWF0IGlkcyBub3QgZGVjbGFyZWQKKyAqIG9uIHRoaXMgZW51bWVyYXRpb24uCisgKgorICogVGhpcyBmb3JtYXQgaWQgYWxvbmcgd2l0aCBvdGhlciBpbmZvcm1hdGlvbiB3aWxsIGZ1bGx5IGRlc2NyaWJlIHRoZSBtZWRpYQorICogaW4gI3BqbWVkaWFfZm9ybWF0IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZm9ybWF0X2lkCit7CisgICAgLyoKKyAgICAgKiBBdWRpbyBmb3JtYXRzCisgICAgICovCisKKyAgICAvKiogMTZiaXQgc2lnbmVkIGludGVnZXIgbGluZWFyIFBDTSBhdWRpbyAqLworICAgIFBKTUVESUFfRk9STUFUX0wxNgkgICAgPSAwLAorCisgICAgLyoqIEFsaWFzIGZvciBQSk1FRElBX0ZPUk1BVF9MMTYgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9QQ00JICAgID0gUEpNRURJQV9GT1JNQVRfTDE2LAorCisgICAgLyoqIEcuNzExIEFMQVcgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9QQ01BCSAgICA9IFBKTUVESUFfRk9STUFUX1BBQ0soJ0EnLCAnTCcsICdBJywgJ1cnKSwKKworICAgIC8qKiBBbGlhcyBmb3IgUEpNRURJQV9GT1JNQVRfUENNQSAqLworICAgIFBKTUVESUFfRk9STUFUX0FMQVcJICAgID0gUEpNRURJQV9GT1JNQVRfUENNQSwKKworICAgIC8qKiBHLjcxMSBVTEFXICovCisgICAgUEpNRURJQV9GT1JNQVRfUENNVQkgICAgPSBQSk1FRElBX0ZPUk1BVF9QQUNLKCd1JywgJ0wnLCAnQScsICdXJyksCisKKyAgICAvKiogQWxpYXcgZm9yIFBKTUVESUFfRk9STUFUX1BDTVUgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9VTEFXCSAgICA9IFBKTUVESUFfRk9STUFUX1BDTVUsCisKKyAgICAvKiogQU1SIG5hcnJvd2JhbmQgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9BTVIJICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnICcsICdBJywgJ00nLCAnUicpLAorCisgICAgLyoqIElUVSBHLjcyOSAqLworICAgIFBKTUVESUFfRk9STUFUX0c3MjkJICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnRycsICc3JywgJzInLCAnOScpLAorCisgICAgLyoqIEludGVybmV0IExvdyBCaXQtUmF0ZSBDb2RlYyAoSUxCQykgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9JTEJDCSAgICA9IFBKTUVESUFfRk9STUFUX1BBQ0soJ0knLCAnTCcsICdCJywgJ0MnKSwKKworCisgICAgLyoKKyAgICAgKiBWaWRlbyBmb3JtYXRzLgorICAgICAqLworICAgIC8qKgorICAgICAqIDI0Yml0IFJHQgorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX1JHQjI0ICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnUicsICdHJywgJ0InLCAnMycpLAorCisgICAgLyoqCisgICAgICogMzJiaXQgUkdCIHdpdGggYWxwaGEgY2hhbm5lbAorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX1JHQkEgICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnUicsICdHJywgJ0InLCAnQScpLAorICAgIFBKTUVESUFfRk9STUFUX0JHUkEgICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnQicsICdHJywgJ1InLCAnQScpLAorCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIFBKTUVESUFfRk9STUFUX1JHQkEKKyAgICAgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9SR0IzMiAgICA9IFBKTUVESUFfRk9STUFUX1JHQkEsCisKKyAgICAvKioKKyAgICAgKiBEZXZpY2UgSW5kZXBlbmRlbnQgQml0bWFwLCBhbGlhcyBmb3IgMjQgYml0IFJHQgorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX0RJQiAgICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnRCcsICdJJywgJ0InLCAnICcpLAorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBwbGFuYXIgNDo0OjQvMjRicHAgUkdCIGZvcm1hdCwgdGhlIGRhdGEgY2FuIGJlIHRyZWF0ZWQgYXMKKyAgICAgKiB0aHJlZSBwbGFuZXMgb2YgY29sb3IgY29tcG9uZW50cywgd2hlcmUgdGhlIGZpcnN0IHBsYW5lIGNvbnRhaW5zCisgICAgICogb25seSB0aGUgRyBzYW1wbGVzLCB0aGUgc2Vjb25kIHBsYW5lIGNvbnRhaW5zIG9ubHkgdGhlIEIgc2FtcGxlcywKKyAgICAgKiBhbmQgdGhlIHRoaXJkIHBsYW5lIGNvbnRhaW5zIG9ubHkgdGhlIFIgc2FtcGxlcy4KKyAgICAgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9HQlJQICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnRycsICdCJywgJ1InLCAnUCcpLAorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHBhY2tlZCA0OjQ6NC8zMmJwcCBmb3JtYXQsIHdoZXJlIGVhY2ggcGl4ZWwgaXMgZW5jb2RlZCBhcworICAgICAqIGZvdXIgY29uc2VjdXRpdmUgYnl0ZXMsIGFycmFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6IFYwLCBVMCwKKyAgICAgKiBZMCwgQTAuIFNvdXJjZToKKyAgICAgKiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyMDY3NTAlMjh2PVZTLjg1JTI5LmFzcHgjYXl1dgorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX0FZVVYJICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnQScsICdZJywgJ1UnLCAnVicpLAorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBwYWNrZWQgNDoyOjIvMTZicHAgWVVWIGZvcm1hdCwgdGhlIGRhdGEgY2FuIGJlIHRyZWF0ZWQgYXMKKyAgICAgKiBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyIHZhbHVlcywgd2hlcmUgdGhlIGZpcnN0IGJ5dGUgY29udGFpbnMKKyAgICAgKiB0aGUgZmlyc3QgWSBzYW1wbGUsIHRoZSBzZWNvbmQgYnl0ZSBjb250YWlucyB0aGUgZmlyc3QgVSAoQ2IpIHNhbXBsZSwKKyAgICAgKiB0aGUgdGhpcmQgYnl0ZSBjb250YWlucyB0aGUgc2Vjb25kIFkgc2FtcGxlLCBhbmQgdGhlIGZvdXJ0aCBieXRlCisgICAgICogY29udGFpbnMgdGhlIGZpcnN0IFYgKENyKSBzYW1wbGUsIGFuZCBzbyBmb3J0aC4gU291cmNlOgorICAgICAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDIwNjc1MCUyOHY9VlMuODUlMjkuYXNweCN5dXkyCisgICAgICovCisgICAgUEpNRURJQV9GT1JNQVRfWVVZMgkgICAgPSBQSk1FRElBX0ZPUk1BVF9QQUNLKCdZJywgJ1UnLCAnWScsICcyJyksCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyB0aGUgWVVZMiBmb3JtYXQgZXhjZXB0IHRoZSBieXRlIG9yZGVyIGlzCisgICAgICogcmV2ZXJzZWQgLS0gdGhhdCBpcywgdGhlIGNocm9tYSBhbmQgbHVtYSBieXRlcyBhcmUgZmxpcHBlZC4gSWYgdGhlCisgICAgICogaW1hZ2UgaXMgYWRkcmVzc2VkIGFzIGFuIGFycmF5IG9mIHR3byBsaXR0bGUtZW5kaWFuIFdPUkQgdmFsdWVzLCB0aGUKKyAgICAgKiBmaXJzdCBXT1JEIGNvbnRhaW5zIFUgaW4gdGhlIExTQnMgYW5kIFkwIGluIHRoZSBNU0JzLCBhbmQgdGhlIHNlY29uZAorICAgICAqIFdPUkQgY29udGFpbnMgViBpbiB0aGUgTFNCcyBhbmQgWTEgaW4gdGhlIE1TQnMuIFNvdXJjZToKKyAgICAgKiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQyMDY3NTAlMjh2PVZTLjg1JTI5LmFzcHgjdXl2eQorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX1VZVlkJICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnVScsICdZJywgJ1YnLCAnWScpLAorCisgICAgLyoqCisgICAgICogVGhpcyBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIFlVWTIgYW5kIFVZVlkgZm9ybWF0IGV4Y2VwdCB0aGUgYnl0ZQorICAgICAqIG9yZGVyIGlzIHJldmVyc2VkIC0tIHRoYXQgaXMsIHRoZSBjaHJvbWEgYW5kIGx1bWEgYnl0ZXMgYXJlIGZsaXBwZWQuCisgICAgICogSWYgdGhlIGltYWdlIGlzIGFkZHJlc3NlZCBhcyBhbiBhcnJheSBvZiB0d28gbGl0dGxlLWVuZGlhbiBXT1JEIHZhbHVlcywKKyAgICAgKiB0aGUgZmlyc3QgV09SRCBjb250YWlucyBZMCBpbiB0aGUgTFNCcyBhbmQgViBpbiB0aGUgTVNCcywgYW5kIHRoZSBzZWNvbmQKKyAgICAgKiBXT1JEIGNvbnRhaW5zIFkxIGluIHRoZSBMU0JzIGFuZCBVIGluIHRoZSBNU0JzLgorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX1lWWVUJICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnWScsICdWJywgJ1knLCAnVScpLAorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBwbGFuYXIgNDoyOjAvMTJicHAgWVVWIGZvcm1hdCwgdGhlIGRhdGEgY2FuIGJlIHRyZWF0ZWQgYXMKKyAgICAgKiB0aHJlZSBwbGFuZXMgb2YgY29sb3IgY29tcG9uZW50cywgd2hlcmUgdGhlIGZpcnN0IHBsYW5lIGNvbnRhaW5zCisgICAgICogb25seSB0aGUgWSBzYW1wbGVzLCB0aGUgc2Vjb25kIHBsYW5lIGNvbnRhaW5zIG9ubHkgdGhlIFUgKENiKSBzYW1wbGVzLAorICAgICAqIGFuZCB0aGUgdGhpcmQgcGxhbmUgY29udGFpbnMgb25seSB0aGUgViAoQ3IpIHNhbXBsZS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9JNDIwCSAgICA9IFBKTUVESUFfRk9STUFUX1BBQ0soJ0knLCAnNCcsICcyJywgJzAnKSwKKworICAgIC8qKgorICAgICAqIElZVVYgaXMgYWxpYXMgZm9yIEk0MjAuCisgICAgICovCisgICAgUEpNRURJQV9GT1JNQVRfSVlVVgkgICAgPSBQSk1FRElBX0ZPUk1BVF9JNDIwLAorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBwbGFuYXIgNDoyOjAvMTJicHAgWVVWIGZvcm1hdCwgc2ltaWxhciB0byBJNDIwIG9yIElZVVYgYnV0CisgICAgICogdGhlIFUgKENiKSBhbmQgViAoQ3IpIHBsYW5lcyBvcmRlciBpcyBzd2l0Y2hlZCwgaS5lOiB0aGUgc2Vjb25kIHBsYW5lCisgICAgICogY29udGFpbnMgdGhlIFYgKENiKSBzYW1wbGVzIGFuZCB0aGUgdGhpcmQgcGxhbmUgY29udGFpbnMgdGhlIFYgKENyKQorICAgICAqIHNhbXBsZXMuCisgICAgICovCisgICAgUEpNRURJQV9GT1JNQVRfWVYxMgkgICAgPSBQSk1FRElBX0ZPUk1BVF9QQUNLKCdZJywgJ1YnLCAnMScsICcyJyksCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHBsYW5hciA0OjI6Mi8xNmJwcCBZVVYgZm9ybWF0LCB0aGUgZGF0YSBjYW4gYmUgdHJlYXRlZCBhcworICAgICAqIHRocmVlIHBsYW5lcyBvZiBjb2xvciBjb21wb25lbnRzLCB3aGVyZSB0aGUgZmlyc3QgcGxhbmUgY29udGFpbnMKKyAgICAgKiBvbmx5IHRoZSBZIHNhbXBsZXMsIHRoZSBzZWNvbmQgcGxhbmUgY29udGFpbnMgb25seSB0aGUgVSAoQ2IpIHNhbXBsZXMsCisgICAgICogYW5kIHRoZSB0aGlyZCBwbGFuZSBjb250YWlucyBvbmx5IHRoZSBWIChDcikgc2FtcGxlLgorICAgICAqLworICAgIFBKTUVESUFfRk9STUFUX0k0MjIJICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnSScsICc0JywgJzInLCAnMicpLAorCisgICAgLyoqCisgICAgICogVGhlIEpQRUcgdmVyc2lvbiBvZiBwbGFuYXIgNDoyOjAvMTJicHAgWVVWIGZvcm1hdC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9JNDIwSlBFRyA9IFBKTUVESUFfRk9STUFUX1BBQ0soJ0onLCAnNCcsICcyJywgJzAnKSwKKworICAgIC8qKgorICAgICAqIFRoZSBKUEVHIHZlcnNpb24gb2YgcGxhbmFyIDQ6MjoyLzE2YnBwIFlVViBmb3JtYXQuCisgICAgICovCisgICAgUEpNRURJQV9GT1JNQVRfSTQyMkpQRUcgPSBQSk1FRElBX0ZPUk1BVF9QQUNLKCdKJywgJzQnLCAnMicsICcyJyksCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVkIHZpZGVvIGZvcm1hdHMKKyAgICAgKi8KKworICAgIFBKTUVESUFfRk9STUFUX0gyNjEgICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnSCcsICcyJywgJzYnLCAnMScpLAorICAgIFBKTUVESUFfRk9STUFUX0gyNjMgICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnSCcsICcyJywgJzYnLCAnMycpLAorICAgIFBKTUVESUFfRk9STUFUX0gyNjNQICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnUCcsICcyJywgJzYnLCAnMycpLAorICAgIFBKTUVESUFfRk9STUFUX0gyNjQgICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnSCcsICcyJywgJzYnLCAnNCcpLAorCisgICAgUEpNRURJQV9GT1JNQVRfTUpQRUcgICAgPSBQSk1FRElBX0ZPUk1BVF9QQUNLKCdNJywgJ0onLCAnUCcsICdHJyksCisgICAgUEpNRURJQV9GT1JNQVRfTVBFRzFWSURFTyA9IFBKTUVESUFfRk9STUFUX1BBQ0soJ00nLCAnUCcsICcxJywgJ1YnKSwKKyAgICBQSk1FRElBX0ZPUk1BVF9NUEVHMlZJREVPID0gUEpNRURJQV9GT1JNQVRfUEFDSygnTScsICdQJywgJzInLCAnVicpLAorICAgIFBKTUVESUFfRk9STUFUX01QRUc0ICAgID0gUEpNRURJQV9GT1JNQVRfUEFDSygnTScsICdQJywgJ0cnLCAnNCcpLAorCit9IHBqbWVkaWFfZm9ybWF0X2lkOworCisvKioKKyAqIFRoaXMgZW51bWVyYXRpb24gc3BlY2lmaWVzIHdoYXQgdHlwZSBvZiBkZXRhaWwgaXMgaW5jbHVkZWQgaW4gYQorICogI3BqbWVkaWFfZm9ybWF0IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfZm9ybWF0X2RldGFpbF90eXBlCit7CisgICAgLyoqIEZvcm1hdCBkZXRhaWwgaXMgbm90IHNwZWNpZmllZC4gKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9ERVRBSUxfTk9ORSwKKworICAgIC8qKiBBdWRpbyBmb3JtYXQgZGV0YWlsLiAqLworICAgIFBKTUVESUFfRk9STUFUX0RFVEFJTF9BVURJTywKKworICAgIC8qKiBWaWRlbyBmb3JtYXQgZGV0YWlsLiAqLworICAgIFBKTUVESUFfRk9STUFUX0RFVEFJTF9WSURFTywKKworICAgIC8qKiBOdW1iZXIgb2YgZm9ybWF0IGRldGFpbCB0eXBlIHRoYXQgaGFzIGJlZW4gZGVmaW5lZC4gKi8KKyAgICBQSk1FRElBX0ZPUk1BVF9ERVRBSUxfTUFYCisKK30gcGptZWRpYV9mb3JtYXRfZGV0YWlsX3R5cGU7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHV0IGluIFxhIGRldGFpbCBmaWVsZCBvZiAjcGptZWRpYV9mb3JtYXQgdG8gZGVzY3JpYmUKKyAqIGRldGFpbCBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdWRpbyBtZWRpYS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsCit7CisgICAgdW5zaWduZWQJY2xvY2tfcmF0ZTsJLyoqPCBBdWRpbyBjbG9jayByYXRlIGluIHNhbXBsZXMgb3IgSHouICovCisgICAgdW5zaWduZWQJY2hhbm5lbF9jb3VudDsJLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMuCQkqLworICAgIHVuc2lnbmVkCWZyYW1lX3RpbWVfdXNlYzsvKio8IEZyYW1lIGludGVydmFsLCBpbiBtaWNyb3NlY29uZHMuCSovCisgICAgdW5zaWduZWQJYml0c19wZXJfc2FtcGxlOy8qKjwgTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZS4JCSovCisgICAgcGpfdWludDMyX3QJYXZnX2JwczsJLyoqPCBBdmVyYWdlIGJpdHJhdGUJCQkqLworICAgIHBqX3VpbnQzMl90CW1heF9icHM7CS8qKjwgTWF4aW11bSBiaXRyYXRlCQkJKi8KK30gcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHB1dCBpbiBcYSBkZXRhaWwgZmllbGQgb2YgI3BqbWVkaWFfZm9ybWF0IHRvIGRlc2NyaWJlCisgKiBkZXRhaWwgaW5mb3JtYXRpb24gYWJvdXQgYSB2aWRlbyBtZWRpYS4KKyAqCisgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgdmlkZW8gZm9ybWF0IGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieQorICogY2FsbGluZyAjcGptZWRpYV9nZXRfdmlkZW9fZm9ybWF0X2luZm8oKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRlb19mb3JtYXRfZGV0YWlsCit7CisgICAgcGptZWRpYV9yZWN0X3NpemUJc2l6ZTsJLyoqPCBWaWRlbyBzaXplICh3aWR0aCwgaGVpZ2h0KSAJKi8KKyAgICBwam1lZGlhX3JhdGlvCWZwczsJLyoqPCBOdW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQuCSovCisgICAgcGpfdWludDMyX3QJCWF2Z19icHM7LyoqPCBBdmVyYWdlIGJpdHJhdGUuCQkJKi8KKyAgICBwal91aW50MzJfdAkJbWF4X2JwczsvKio8IE1heGltdW0gYml0cmF0ZS4JCQkqLworfSBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9kZXRhaWw7CisKKy8qKgorICogVGhpcyBtYWNybyBkZWNsYXJlcyB0aGUgc2l6ZSBvZiB0aGUgZGV0YWlsIHNlY3Rpb24gaW4gI3BqbWVkaWFfZm9ybWF0CisgKiB0byBiZSByZXNlcnZlZCBmb3IgdXNlciBkZWZpbmVkIGRldGFpbC4KKyAqLworI2lmbmRlZiBQSk1FRElBX0ZPUk1BVF9ERVRBSUxfVVNFUl9TSVpFCisjICAgZGVmaW5lIFBKTUVESUFfRk9STUFUX0RFVEFJTF9VU0VSX1NJWkUJCTEKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbXBsZXRlbHkgZGVzY3JpYmUKKyAqIGEgbWVkaWEuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfZm9ybWF0Cit7CisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdCBpZCB0aGF0IHNwZWNpZmllcyB0aGUgYXVkaW8gc2FtcGxlIG9yIHZpZGVvIHBpeGVsIGZvcm1hdC4KKyAgICAgKiBTb21lIHdlbGwga25vd24gZm9ybWF0cyBpZHMgYXJlIGRlY2xhcmVkIGluIHBqbWVkaWFfZm9ybWF0X2lkCisgICAgICogZW51bWVyYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlIHBqbWVkaWFfZm9ybWF0X2lkCisgICAgICovCisgICAgcGpfdWludDMyX3QJCSAJIGlkOworCisgICAgLyoqCisgICAgICogVGhlIHRvcC1tb3N0IHR5cGUgb2YgdGhlIG1lZGlhLCBhcyBhbiBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwam1lZGlhX3R5cGUJCSB0eXBlOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZGV0YWlsIHN0cnVjdHVyZSBpbiB0aGUgXGEgZGV0YWlsIHBvaW50ZXIuCisgICAgICovCisgICAgcGptZWRpYV9mb3JtYXRfZGV0YWlsX3R5cGUJIGRldGFpbF90eXBlOworCisgICAgLyoqCisgICAgICogRGV0YWlsIHNlY3Rpb24gdG8gZGVzY3JpYmUgdGhlIG1lZGlhLgorICAgICAqLworICAgIHVuaW9uCisgICAgeworCS8qKgorCSAqIERldGFpbCBzZWN0aW9uIGZvciBhdWRpbyBmb3JtYXQuCisJICovCisJcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsCWF1ZDsKKworCS8qKgorCSAqIERldGFpbCBzZWN0aW9uIGZvciB2aWRlbyBmb3JtYXQuCisJICovCisJcGptZWRpYV92aWRlb19mb3JtYXRfZGV0YWlsCXZpZDsKKworCS8qKgorCSAqIFJlc2VydmVkIGFyZWEgZm9yIHVzZXItZGVmaW5lZCBmb3JtYXQgZGV0YWlsLgorCSAqLworCWNoYXIJCQkJdXNlcltQSk1FRElBX0ZPUk1BVF9ERVRBSUxfVVNFUl9TSVpFXTsKKyAgICB9IGRldDsKKworfSBwam1lZGlhX2Zvcm1hdDsKKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIGRlc2NyaWJlcyB2aWRlbyBjb2xvciBtb2RlbC4gSXQgbW9zdGx5IHNlcnZlcyBhcworICogaW5mb3JtYXRpb24gb25seS4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfY29sb3JfbW9kZWwKK3sKKyAgICAvKiogVGhlIGNvbG9yIG1vZGVsIGlzIHVua25vd24gb3IgdW5zcGVjaWZpZWQuICovCisgICAgUEpNRURJQV9DT0xPUl9NT0RFTF9OT05FLAorCisgICAgLyoqIFJHQiBjb2xvciBtb2RlbC4gKi8KKyAgICBQSk1FRElBX0NPTE9SX01PREVMX1JHQiwKKworICAgIC8qKiBZVVYgY29sb3IgbW9kZWwuICovCisgICAgUEpNRURJQV9DT0xPUl9NT0RFTF9ZVVYKK30gcGptZWRpYV9jb2xvcl9tb2RlbDsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiB0byBhcHBseSBhIHNwZWNpZmljIHZpZGVvIGZvcm1hdAorICogYWdhaW5zdCBzaXplIGFuZCBidWZmZXIgaW5mb3JtYXRpb24sIGFuZCBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogZnJvbSBpdC4gVG8gZG8gdGhhdCwgYXBwbGljYXRpb24gZmlsbHMgdXAgdGhlIGlucHV0IGZpZWxkcyBvZiB0aGlzCisgKiBzdHJ1Y3R1cmUsIGFuZCBnaXZlIHRoaXMgc3RydWN0dXJlIHRvIFxhIGFwcGx5X2ZtdCgpIGZ1bmN0aW9uCisgKiBvZiAjcGptZWRpYV92aWRlb19mb3JtYXRfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkZW9fYXBwbHlfZm10X3BhcmFtCit7CisgICAgLyogaW5wdXQgZmllbGRzOiAqLworCisgICAgLyoqCisgICAgICogW0lOXSBUaGUgaW1hZ2Ugc2l6ZS4gVGhpcyBmaWVsZCBpcyBtYW5kYXRvcnksIGFuZCBoYXMgdG8gYmUgc2V0CisgICAgICogY29ycmVjdGx5IHByaW9yIHRvIGNhbGxpbmcgXGEgYXBwbHlfZm10KCkgZnVuY3Rpb24uCisgICAgICovCisgICAgcGptZWRpYV9yZWN0X3NpemUJIHNpemU7CisKKyAgICAvKioKKyAgICAgKiBbSU5dIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBmcmFtZS4gVGhlIFxhIGFwcGx5X2ZtdCgpCisgICAgICogZnVuY3Rpb24gdXNlcyB0aGlzIHBvaW50ZXIgdG8gY2FsY3VsYXRlIHRoZSBwb2ludGVyIGZvciBlYWNoIHZpZGVvCisgICAgICogcGxhbmVzIG9mIHRoZSBtZWRpYS4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCAtLSBob3dldmVyLCB0aGUKKyAgICAgKiBcYSBhcHBseV9mbXQoKSB3b3VsZCBzdGlsbCBmaWxsIHVwIHRoZSBcYSBwbGFuZXNbXSBhcnJheSB3aXRoIHRoZQorICAgICAqIGNvcnJlY3QgcG9pbnRlciBldmVuIHRob3VnaCB0aGUgYnVmZmVyIGlzIHNldCB0byBOVUxMLiBUaGlzIGNvdWxkIGJlCisgICAgICogdXNlZnVsIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGVhY2ggcGxhbmUuCisgICAgICovCisgICAgcGpfdWludDhfdAkJKmJ1ZmZlcjsKKworICAgIC8qIG91dHB1dCBmaWVsZHM6ICovCisKKyAgICAvKioKKyAgICAgKiBbT1VUXSBUaGUgc2l6ZSAoaW4gYnl0ZXMpIHJlcXVpcmVkIG9mIHRoZSBidWZmZXIgdG8gaG9sZCB0aGUgdmlkZW8KKyAgICAgKiBmcmFtZSBvZiB0aGUgcGFydGljdWxhciBmcmFtZSBzaXplICh3aWR0aCwgaGVpZ2h0KS4KKyAgICAgKi8KKyAgICBwal9zaXplX3QJCSBmcmFtZWJ5dGVzOworCisgICAgLyoqCisgICAgICogW09VVF0gQXJyYXkgb2Ygc3RyaWRlcyB2YWx1ZSAoaW4gYnl0ZXMpIGZvciBlYWNoIHZpZGVvIHBsYW5lLgorICAgICAqLworICAgIGludAkJICAgICAgICAgc3RyaWRlc1tQSk1FRElBX01BWF9WSURFT19QTEFORVNdOworCisgICAgLyoqCisgICAgICogW09VVF0gQXJyYXkgb2YgcG9pbnRlcnMgdG8gZWFjaCBvZiB0aGUgdmlkZW8gcGxhbmVzLiBUaGUgdmFsdWVzIGFyZQorICAgICAqIGNhbGN1bGF0ZWQgZnJvbSB0aGUgXGEgYnVmZmVyIGZpZWxkLgorICAgICAqLworICAgIHBqX3VpbnQ4X3QJCSpwbGFuZXNbUEpNRURJQV9NQVhfVklERU9fUExBTkVTXTsKKworICAgIC8qKgorICAgICAqIFtPVVRdIEFycmF5IG9mIHZpZGVvIHBsYW5lIHNpemVzLgorICAgICAqLworICAgIHBqX3NpemVfdAkJIHBsYW5lX2J5dGVzW1BKTUVESUFfTUFYX1ZJREVPX1BMQU5FU107CisKK30gcGptZWRpYV92aWRlb19hcHBseV9mbXRfcGFyYW07CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gdG8gZGVzY3JpYmUgYSB2aWRlbyBmb3JtYXQuIEFwcGxpY2F0aW9uCisgKiBjYW4gcmV0cmlldmUgdGhpcyBzdHJ1Y3R1cmUgYnkgY2FsbGluZyAjcGptZWRpYV9nZXRfdmlkZW9fZm9ybWF0X2luZm8oKQorICogZnVuY2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRlb19mb3JtYXRfaW5mbworeworICAgIC8qKgorICAgICAqIFRoZSB1bmlxdWUgZm9ybWF0IElEIG9mIHRoZSBtZWRpYS4gV2VsbCBrbm93biBmb3JtYXQgaWRzIGFyZSBkZWNsYXJlZAorICAgICAqIGluIHBqbWVkaWFfZm9ybWF0X2lkIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHBqX3VpbnQzMl90CQlpZDsKKworICAgIC8qKgorICAgICAqIE51bGwgdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBzaG9ydCBpZGVudGlmaWNhdGlvbiBhYm91dCB0aGUKKyAgICAgKiBmb3JtYXQuCisgICAgICovCisgICAgY2hhcgkJbmFtZVs4XTsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xvciBtb2RlbCBvZiB0aGlzIHZpZGVvIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwam1lZGlhX2NvbG9yX21vZGVsCWNvbG9yX21vZGVsOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHN0b3JlIG9uZSBwaXhlbCBvZiB0aGlzIHZpZGVvIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwal91aW50OF90CQlicHA7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgdmlkZW8gcGxhbmVzIHRoYXQgdGhpcyBmb3JtYXQgdXNlcy4gVmFsdWUgMSBpbmRpY2F0ZXMKKyAgICAgKiBwYWNrZWQgZm9ybWF0LCB3aGlsZSB2YWx1ZSBncmVhdGVyIHRoYW4gMSBpbmRpY2F0ZXMgcGxhbmFyIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwal91aW50OF90CQlwbGFuZV9jbnQ7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGFwcGx5IHRoaXMgZm9ybWF0IGFnYWluc3Qgc2l6ZSBhbmQgYnVmZmVyCisgICAgICogaW5mb3JtYXRpb24gaW4gcGptZWRpYV92aWRlb19hcHBseV9mbXRfcGFyYW0gYXJndW1lbnQuIEFwcGxpY2F0aW9uCisgICAgICogdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIG9idGFpbiB2YXJpb3VzIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlCisgICAgICogbWVtb3J5IHNpemUgb2YgYSBmcmFtZSBidWZmZXIsIHN0cmlkZXMgdmFsdWUgb2YgdGhlIGltYWdlLCB0aGUKKyAgICAgKiBsb2NhdGlvbiBvZiB0aGUgcGxhbmVzLCBhbmQgc28gb24uIFNlZSBwam1lZGlhX3ZpZGVvX2FwcGx5X2ZtdF9wYXJhbQorICAgICAqIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZmaQlUaGUgdmlkZW8gZm9ybWF0IGluZm8uCisgICAgICogQHBhcmFtIHZhZnAJVGhlIHBhcmFtZXRlcnMgdG8gaW52ZXN0aWdhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHRoZSBmdW5jdGlvbiBoYXMgY2FsY3VsYXRlZCB0aGUKKyAgICAgKiAJCQlpbmZvcm1hdGlvbiBpbiBcYSB2YWZwIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmFwcGx5X2ZtdCkoY29uc3Qgc3RydWN0IHBqbWVkaWFfdmlkZW9fZm9ybWF0X2luZm8gKnZmaSwKKwkgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZGVvX2FwcGx5X2ZtdF9wYXJhbSAqdmFmcCk7CisKK30gcGptZWRpYV92aWRlb19mb3JtYXRfaW5mbzsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVUSUxJVElFUzoKKyAqLworCisvKioKKyAqIEdlbmVyYWwgdXRpbGl0eSByb3V0aW5lIHRvIGNhbGN1bGF0ZSBzYW1wbGVzIHBlciBmcmFtZSB2YWx1ZSBmcm9tIGNsb2NrCisgKiByYXRlLCBwdGltZSAoaW4gdXNlYyksIGFuZCBjaGFubmVsIGNvdW50LiBBcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoaXMKKyAqIG1hY3JvIHdoZW5ldmVyIHBvc3NpYmxlIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdyBpbiB0aGUgbWF0aCBjYWxjdWxhdGlvbi4KKyAqCisgKiBAcGFyYW0gY2xvY2tfcmF0ZQkJQ2xvY2sgcmF0ZS4KKyAqIEBwYXJhbSB1c2VjX3B0aW1lCQlGcmFtZSBpbnRlcnZhbCwgaW4gbWljcm9zZWNvbmQuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkJTnVtYmVyIG9mIGNoYW5uZWxzLgorICoKKyAqIEByZXR1cm4JCQlUaGUgc2FtcGxlcyBwZXIgZnJhbWUgdmFsdWUuCisgKi8KK1BKX0lOTElORSh1bnNpZ25lZCkgUEpNRURJQV9TUEYodW5zaWduZWQgY2xvY2tfcmF0ZSwgdW5zaWduZWQgdXNlY19wdGltZSwKKwkJCQl1bnNpZ25lZCBjaGFubmVsX2NvdW50KQoreworI2lmIFBKX0hBU19JTlQ2NAorICAgIHJldHVybiAoKHVuc2lnbmVkKSgocGpfdWludDY0X3QpdXNlY19wdGltZSAqIFwKKwkJICAgICAgIGNsb2NrX3JhdGUgKiBjaGFubmVsX2NvdW50IC8gMTAwMDAwMCkpOworI2VsaWYgUEpfSEFTX0ZMT0FUSU5HX1BPSU5UCisgICAgcmV0dXJuICgodW5zaWduZWQpKDEuMCp1c2VjX3B0aW1lICogY2xvY2tfcmF0ZSAqIGNoYW5uZWxfY291bnQgLyAxMDAwMDAwKSk7CisjZWxzZQorICAgIHJldHVybiAoKHVuc2lnbmVkKSh1c2VjX3B0aW1lIC8gMTAwMEwgKiBjbG9ja19yYXRlICogXAorCQkgICAgICAgY2hhbm5lbF9jb3VudCAvIDEwMDApKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFZhcmlhbnQgb2YgI1BKTUVESUFfU1BGKCkgd2hpY2ggdGFrZXMgZnJhbWUgcmF0ZSBpbnN0ZWFkIG9mIHB0aW1lLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfU1BGMih1bnNpZ25lZCBjbG9ja19yYXRlLCBjb25zdCBwam1lZGlhX3JhdGlvICpmciwKKwkJCQkgdW5zaWduZWQgY2hhbm5lbF9jb3VudCkKK3sKKyNpZiBQSl9IQVNfSU5UNjQKKyAgICByZXR1cm4gKCh1bnNpZ25lZCkoKHBqX3VpbnQ2NF90KWNsb2NrX3JhdGUgKiBmci0+ZGVudW0gXAorCQkgICAgICAgLyBmci0+bnVtIC8gY2hhbm5lbF9jb3VudCkpOworI2VsaWYgUEpfSEFTX0ZMT0FUSU5HX1BPSU5UCisgICAgcmV0dXJuICgodW5zaWduZWQpKDEuMCogY2xvY2tfcmF0ZSAqIGZyLT5kZW51bSAvIGZyLT5udW0gL2NoYW5uZWxfY291bnQpKTsKKyNlbHNlCisgICAgcmV0dXJuICgodW5zaWduZWQpKDFMICogY2xvY2tfcmF0ZSAqIGZyLT5kZW51bSAvIGZyLT5udW0gLyBjaGFubmVsX2NvdW50KSk7CisjZW5kaWYKK30KKworCisvKioKKyAqIFV0aWxpdHkgcm91dGluZSB0byBjYWxjdWxhdGUgZnJhbWUgc2l6ZSAoaW4gYnl0ZXMpIGZyb20gYml0cmF0ZSBhbmQgZnJhbWUKKyAqIGludGVydmFsIHZhbHVlcy4gQXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGlzIG1hY3JvIHdoZW5ldmVyIHBvc3NpYmxlIGR1ZQorICogdG8gcG9zc2libGUgb3ZlcmZsb3cgaW4gdGhlIG1hdGggY2FsY3VsYXRpb24uCisgKgorICogQHBhcmFtIGJwcwkJCVRoZSBiaXRyYXRlIG9mIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0gdXNlY19wdGltZQkJRnJhbWUgaW50ZXJ2YWwsIGluIG1pY3Jvc2Vjb25kLgorICoKKyAqIEByZXR1cm4JCQlGcmFtZSBzaXplIGluIGJ5dGVzLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfRlNaKHVuc2lnbmVkIGJwcywgdW5zaWduZWQgdXNlY19wdGltZSkKK3sKKyNpZiBQSl9IQVNfSU5UNjQKKyAgICByZXR1cm4gKCh1bnNpZ25lZCkoKHBqX3VpbnQ2NF90KWJwcyAqIHVzZWNfcHRpbWUgLyBQSl9VSU5UNjQoODAwMDAwMCkpKTsKKyNlbGlmIFBKX0hBU19GTE9BVElOR19QT0lOVAorICAgIHJldHVybiAoKHVuc2lnbmVkKSgxLjAgKiBicHMgKiB1c2VjX3B0aW1lIC8gODAwMDAwMC4wKSk7CisjZWxzZQorICAgIHJldHVybiAoKHVuc2lnbmVkKShicHMgLyA4TCAqIHVzZWNfcHRpbWUgLyAxMDAwMDAwKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZW5lcmFsIHV0aWxpdHkgcm91dGluZSB0byBjYWxjdWxhdGUgcHRpbWUgdmFsdWUgZnJvbSBmcmFtZSByYXRlLgorICogQXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGlzIG1hY3JvIHdoZW5ldmVyIHBvc3NpYmxlIGR1ZSB0byBwb3NzaWJsZQorICogb3ZlcmZsb3cgaW4gdGhlIG1hdGggY2FsY3VsYXRpb24uCisgKgorICogQHBhcmFtIGZyYW1lX3JhdGUJCUZyYW1lIHJhdGUKKyAqCisgKiBAcmV0dXJuCQkJVGhlIHB0aW1lIHZhbHVlIChpbiB1c2VjKS4KKyAqLworUEpfSU5MSU5FKHVuc2lnbmVkKSBQSk1FRElBX1BUSU1FKGNvbnN0IHBqbWVkaWFfcmF0aW8gKmZyYW1lX3JhdGUpCit7CisjaWYgUEpfSEFTX0lOVDY0CisgICAgcmV0dXJuICgodW5zaWduZWQpKChwal91aW50NjRfdCkxMDAwMDAwICogXAorCQkgICAgICAgZnJhbWVfcmF0ZS0+ZGVudW0gLyBmcmFtZV9yYXRlLT5udW0pKTsKKyNlbGlmIFBKX0hBU19GTE9BVElOR19QT0lOVAorICAgIHJldHVybiAoKHVuc2lnbmVkKSgxMDAwMDAwLjAgKiBmcmFtZV9yYXRlLT5kZW51bSAvCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGUtPm51bSkpOworI2Vsc2UKKyAgICByZXR1cm4gKCh1bnNpZ25lZCkoKDEwMDBMICogZnJhbWVfcmF0ZS0+ZGVudW0gLworICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlLT5udW0pICogMTAwMCkpOworI2VuZGlmCit9CisKKy8qKgorICogVXRpbGl0eSB0byByZXRyaWV2ZSBzYW1wbGVzX3Blcl9mcmFtZSB2YWx1ZSBmcm9tCisgKiBwam1lZGlhX2F1ZGlvX2Zvcm1hdF9kZXRhaWwuCisgKgorICogQHBhcmFtIHBhZmQJCVBvaW50ZXIgdG8gcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsCisgKiBAcmV0dXJuCQlTYW1wbGVzIHBlciBmcmFtZQorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfQUZEX1NQRihjb25zdCBwam1lZGlhX2F1ZGlvX2Zvcm1hdF9kZXRhaWwgKnBhZmQpCit7CisgICAgcmV0dXJuIFBKTUVESUFfU1BGKHBhZmQtPmNsb2NrX3JhdGUsIHBhZmQtPmZyYW1lX3RpbWVfdXNlYywKKwkJICAgICAgIHBhZmQtPmNoYW5uZWxfY291bnQpOworfQorCisvKioKKyAqIFV0aWxpdHkgdG8gcmV0cmlldmUgYXZlcmFnZSBmcmFtZSBzaXplIGZyb20gcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsLgorICogVGhlIGF2ZXJhZ2UgZnJhbWUgc2l6ZSBpcyBkZXJpdmVkIGZyb20gdGhlIGF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgYXVkaW8KKyAqIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gYWZkCQlQb2ludGVyIHRvIHBqbWVkaWFfYXVkaW9fZm9ybWF0X2RldGFpbAorICogQHJldHVybgkJQXZlcmFnZSBmcmFtZSBzaXplLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfQUZEX0FWR19GU1ooY29uc3QgcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsICphZmQpCit7CisgICAgcmV0dXJuIFBKTUVESUFfRlNaKGFmZC0+YXZnX2JwcywgYWZkLT5mcmFtZV90aW1lX3VzZWMpOworfQorCisvKioKKyAqIFV0aWxpdHkgdG8gcmV0cmlldmUgbWF4aW11bSBmcmFtZSBzaXplIGZyb20gcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsLgorICogVGhlIG1heGltdW0gZnJhbWUgc2l6ZSBpcyBkZXJpdmVkIGZyb20gdGhlIG1heGltdW0gYml0cmF0ZSBvZiB0aGUgYXVkaW8KKyAqIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gYWZkCQlQb2ludGVyIHRvIHBqbWVkaWFfYXVkaW9fZm9ybWF0X2RldGFpbAorICogQHJldHVybgkJQXZlcmFnZSBmcmFtZSBzaXplLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfQUZEX01BWF9GU1ooY29uc3QgcGptZWRpYV9hdWRpb19mb3JtYXRfZGV0YWlsICphZmQpCit7CisgICAgcmV0dXJuIFBKTUVESUFfRlNaKGFmZC0+bWF4X2JwcywgYWZkLT5mcmFtZV90aW1lX3VzZWMpOworfQorCisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgZm9ybWF0IGFzIGF1ZGlvIGZvcm1hdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gZm10CQkJVGhlIGZvcm1hdCB0byBiZSBpbml0aWFsaXplZC4KKyAqIEBwYXJhbSBmbXRfaWQJCUZvcm1hdCBJRC4gU2VlICNwam1lZGlhX2Zvcm1hdF9pZAorICogQHBhcmFtIGNsb2NrX3JhdGUJCUF1ZGlvIGNsb2NrIHJhdGUuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkJTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIGJpdHNfcGVyX3NhbXBsZQlOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLgorICogQHBhcmFtIGZyYW1lX3RpbWVfdXNlYwlGcmFtZSBpbnRlcnZhbCwgaW4gbWljcm9zZWNvbmQuCisgKiBAcGFyYW0gYXZnX2JwcwkJQXZlcmFnZSBiaXRyYXRlLgorICogQHBhcmFtIG1heF9icHMJCU1heGltdW0gYml0cmF0ZS4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX2Zvcm1hdF9pbml0X2F1ZGlvKHBqbWVkaWFfZm9ybWF0ICpmbXQsCisJCQkJICAgICAgICBwal91aW50MzJfdCBmbXRfaWQsCisJCQkJCXVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCXVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCXVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJdW5zaWduZWQgZnJhbWVfdGltZV91c2VjLAorCQkJCQlwal91aW50MzJfdCBhdmdfYnBzLAorCQkJCQlwal91aW50MzJfdCBtYXhfYnBzKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBmb3JtYXQgYXMgdmlkZW8gZm9ybWF0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICogQSBmb3JtYXQgbWFuYWdlciBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFzIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkCisgKiB0byBjb25zdWx0IHRvIGEgZm9ybWF0IG1hbmFnZXIgaW4gb3JkZXIgdG8gZmlsbCBpbiBkZXRhaWxlZAorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gZm10CQlUaGUgZm9ybWF0IHRvIGJlIGluaXRpYWxpc2VkLgorICogQHBhcmFtIGZtdF9pZAlGb3JtYXQgSUQuIFNlZSAjcGptZWRpYV9mb3JtYXRfaWQKKyAqIEBwYXJhbSB3aWR0aAkJSW1hZ2Ugd2lkdGguCisgKiBAcGFyYW0gaGVpZ2h0CUltYWdlIGhlaWd0aC4KKyAqIEBwYXJhbSBmcHNfbnVtCUZQUyBudW1lcmF0b3IuCisgKiBAcGFyYW0gZnBzX2RlbnVtCUZQUyBkZW51bWVyYXRvci4KKyAqIEBwYXJhbSBhdmdfYnBzCUF2ZXJhZ2UgYml0cmF0ZS4KKyAqIEBwYXJhbSBtYXhfYnBzCU1heGltdW0gYml0cmF0ZS4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX2Zvcm1hdF9pbml0X3ZpZGVvKHBqbWVkaWFfZm9ybWF0ICpmbXQsCisJCQkJCXBqX3VpbnQzMl90IGZtdF9pZCwKKwkJCQkJdW5zaWduZWQgd2lkdGgsCisJCQkJCXVuc2lnbmVkIGhlaWdodCwKKwkJCQkJdW5zaWduZWQgZnBzX251bSwKKwkJCQkJdW5zaWduZWQgZnBzX2RlbnVtKTsKKworLyoqCisgKiBDb3B5IGZvcm1hdCB0byBhbm90aGVyLgorICoKKyAqIEBwYXJhbSBkc3QJCVRoZSBkZXN0aW5hdGlvbiBmb3JtYXQuCisgKiBAcGFyYW0gc3JjCQlUaGUgc291cmNlIGZvcm1hdC4KKyAqCisgKiBAcmV0dXJuCQlQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGZvcm1hdC4KKyAqLworUEpfREVDTChwam1lZGlhX2Zvcm1hdCopIHBqbWVkaWFfZm9ybWF0X2NvcHkocGptZWRpYV9mb3JtYXQgKmRzdCwKKwkJCQkJICAgICBjb25zdCBwam1lZGlhX2Zvcm1hdCAqc3JjKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgZm9ybWF0IGNvbnRhaW5zIGF1ZGlvIGZvcm1hdCwgYW5kIHJldHJpZXZlIHRoZSBhdWRpbyBmb3JtYXQKKyAqIGRldGFpbCBpbiB0aGUgZm9ybWF0LgorICoKKyAqIEBwYXJhbSBmbXQJCVRoZSBmb3JtYXQgc3RydWN0dXJlLgorICogQHBhcmFtIGFzc2VydF92YWxpZAlJZiB0aGlzIGlzIHNldCB0byBub24temVybywgYW4gYXNzZXJ0aW9uIHdpbGwgYmUKKyAqIAkJCXJhaXNlZCBpZiB0aGUgZGV0YWlsIHR5cGUgaXMgbm90IGF1ZGlvIG9yIGlmIHRoZQorICogCQkJdGhlIGRldGFpbCBpcyBOVUxMLgorICoKKyAqIEByZXR1cm4JCVRoZSBpbnN0YW5jZSBvZiBhdWRpbyBmb3JtYXQgZGV0YWlsIGluIHRoZSBmb3JtYXQKKyAqIAkJCXN0cnVjdHVyZSwgb3IgTlVMTCBpZiB0aGUgZm9ybWF0IGRvZXNuJ3QgY29udGFpbgorICogCQkJYXVkaW8gZGV0YWlsLgorICovCitQSl9ERUNMKHBqbWVkaWFfYXVkaW9fZm9ybWF0X2RldGFpbCopCitwam1lZGlhX2Zvcm1hdF9nZXRfYXVkaW9fZm9ybWF0X2RldGFpbChjb25zdCBwam1lZGlhX2Zvcm1hdCAqZm10LAorCQkJCSAgICAgICBwal9ib29sX3QgYXNzZXJ0X3ZhbGlkKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgZm9ybWF0IGNvbnRhaW5zIHZpZGVvIGZvcm1hdCwgYW5kIHJldHJpZXZlIHRoZSB2aWRlbyBmb3JtYXQKKyAqIGRldGFpbCBpbiB0aGUgZm9ybWF0LgorICoKKyAqIEBwYXJhbSBmbXQJCVRoZSBmb3JtYXQgc3RydWN0dXJlLgorICogQHBhcmFtIGFzc2VydF92YWxpZAlJZiB0aGlzIGlzIHNldCB0byBub24temVybywgYW4gYXNzZXJ0aW9uIHdpbGwgYmUKKyAqIAkJCXJhaXNlZCBpZiB0aGUgZGV0YWlsIHR5cGUgaXMgbm90IHZpZGVvIG9yIGlmIHRoZQorICogCQkJdGhlIGRldGFpbCBpcyBOVUxMLgorICoKKyAqIEByZXR1cm4JCVRoZSBpbnN0YW5jZSBvZiB2aWRlbyBmb3JtYXQgZGV0YWlsIGluIHRoZSBmb3JtYXQKKyAqIAkJCXN0cnVjdHVyZSwgb3IgTlVMTCBpZiB0aGUgZm9ybWF0IGRvZXNuJ3QgY29udGFpbgorICogCQkJdmlkZW8gZGV0YWlsLgorICovCitQSl9ERUNMKHBqbWVkaWFfdmlkZW9fZm9ybWF0X2RldGFpbCopCitwam1lZGlhX2Zvcm1hdF9nZXRfdmlkZW9fZm9ybWF0X2RldGFpbChjb25zdCBwam1lZGlhX2Zvcm1hdCAqZm10LAorCQkJCSAgICAgICBwal9ib29sX3QgYXNzZXJ0X3ZhbGlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGT1JNQVQgTUFOQUdFTUVOVDoKKyAqLworCisvKioKKyAqIE9wYXF1ZSBkYXRhIHR5cGUgZm9yIHZpZGVvIGZvcm1hdCBtYW5hZ2VyLiBUaGUgdmlkZW8gZm9ybWF0IG1hbmFnZXIgbWFuYWdlcworICogdGhlIHJlcG9zaXRvcnkgb2YgdmlkZW8gZm9ybWF0cyB0aGF0IHRoZSBmcmFtZXdvcmsgcmVjb2duaXNlcy4gVHlwaWNhbGx5IGl0CisgKiBpcyBhIHNpbmdsZXRvbiBpbnN0YW5jZSwgYWx0aG91Z2ggYXBwbGljYXRpb24gbWF5IGluc3RhbnRpYXRlIG1vcmUgdGhhbiBvbmUKKyAqIGluc3RhbmNlcyBvZiB0aGlzIGlmIHJlcXVpcmVkLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9tZ3IgcGptZWRpYV92aWRlb19mb3JtYXRfbWdyOworCisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHZpZGVvIGZvcm1hdCBtYW5hZ2VyIGluc3RhbmNlLiBUaGlzIHdpbGwgYWxzbyBzZXQgdGhlIHBvaW50ZXIKKyAqIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgaWYgdGhlIHZhbHVlIGlzIHN0aWxsIE5VTEwuCisgKgorICogQHBhcmFtIHBvb2wJCVRoZSBwb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBtYXhfZm10CU1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgdG8gYWNjb21tb2RhdGUuCisgKiBAcGFyYW0gb3B0aW9ucwlPcHRpb24gZmxhZ3MuIE11c3QgYmUgemVybyBmb3Igbm93LgorICogQHBhcmFtIHBfbWdyCQlQb2ludGVyIHRvIGhvbGQgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcmlwcmlhdGUgZXJyb3IgdmFsdWUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3ZpZGVvX2Zvcm1hdF9tZ3JfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQl1bnNpZ25lZCBtYXhfZm10LAorCQkJCXVuc2lnbmVkIG9wdGlvbnMsCisJCQkJcGptZWRpYV92aWRlb19mb3JtYXRfbWdyICoqcF9tZ3IpOworCisvKioKKyAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2aWRlbyBmb3JtYXQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuCQlUaGUgaW5zdGFuY2UuCisgKi8KK1BKX0RFQ0wocGptZWRpYV92aWRlb19mb3JtYXRfbWdyKikgcGptZWRpYV92aWRlb19mb3JtYXRfbWdyX2luc3RhbmNlKHZvaWQpOworCisvKioKKyAqIE1hbnVhbGx5IGFzc2lnbiBhIHNwZWNpZmljIHZpZGVvIG1hbmFnZXIgaW5zdGFuY2UgYXMgdGhlIHNpbmdsZXRvbgorICogaW5zdGFuY2UuIE5vcm1hbGx5IHRoaXMgaXMgbm90IG5lZWRlZCBpZiBvbmx5IG9uZSBpbnN0YW5jZSBpcyBldmVyCisgKiBnb2luZyB0byBiZSBjcmVhdGVkLCBhcyB0aGUgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGFzc2lnbiB0aGUgc2luZ2xldG9uCisgKiBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gbWdyCQlUaGUgaW5zdGFuY2UgdG8gYmUgdXNlZCBhcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICogCQkJQXBwbGljYXRpb24gbWF5IHNwZWNpZnkgTlVMTCB0byBjbGVhciB0aGUgc2luZ2xldG9uCisgKiAJCQlzaW5nbGV0b24gaW5zdGFuY2UuCisgKi8KK1BKX0RFQ0wodm9pZCkKK3BqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9zZXRfaW5zdGFuY2UocGptZWRpYV92aWRlb19mb3JtYXRfbWdyICptZ3IpOworCisvKioKKyAqIFJldHJpZXZlIGEgdmlkZW8gZm9ybWF0IGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGlkLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSB2aWRlbyBmb3JtYXQgbWFuYWdlci4gU3BlY2lmeSBOVUxMIHRvIHVzZQorICogCQkJdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAoaG93ZXZlciwgYSB2aWRlbyBmb3JtYXQKKyAqIAkJCW1hbmFnZXIgc3RpbGwgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBwcmlvciB0bworICogCQkJY2FsbGluZyB0aGlzIGZ1bmN0aW9uKS4KKyAqIEBwYXJhbSBpZAkJVGhlIGZvcm1hdCBpZCB3aGljaCBmb3JtYXQgaW5mbyBpcyB0byBiZQorICogCQkJcmV0cmlldmVkLgorICoKKyAqIEByZXR1cm4JCVRoZSB2aWRlbyBmb3JtYXQgaW5mby4KKyAqLworUEpfREVDTChjb25zdCBwam1lZGlhX3ZpZGVvX2Zvcm1hdF9pbmZvKikKK3BqbWVkaWFfZ2V0X3ZpZGVvX2Zvcm1hdF9pbmZvKHBqbWVkaWFfdmlkZW9fZm9ybWF0X21nciAqbWdyLAorCQkJICAgICAgcGpfdWludDMyX3QgaWQpOworCisvKioKKyAqIFJlZ2lzdGVyIGEgbmV3IHZpZGVvIGZvcm1hdCB0byB0aGUgZnJhbWV3b3JrLiBCeSBkZWZhdWx0LCBidWlsdC1pbgorICogZm9ybWF0cyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseSB0byB0aGUgZm9ybWF0IG1hbmFnZXIgd2hlbgorICogaXQgaXMgY3JlYXRlZCAobm90ZTogYnVpbHQtaW4gZm9ybWF0cyBhcmUgb25lcyB3aGljaCBmb3JtYXQgaWQgaXMKKyAqIGxpc3RlZCBpbiBwam1lZGlhX2Zvcm1hdF9pZCBlbnVtZXJhdGlvbikuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCisgKiBhcHBsaWNhdGlvbiB0byB1c2UgdXNlciBkZWZpbmVkIGZvcm1hdCBpZCBieSByZWdpc3RlcmluZyB0aGF0IGZvcm1hdAorICogaW50byB0aGUgZnJhbWV3b3JrLgorICoKKyAqIEBwYXJhbSBtZ3IJCVRoZSB2aWRlbyBmb3JtYXQgbWFuYWdlci4gU3BlY2lmeSBOVUxMIHRvIHVzZQorICogCQkJdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAoaG93ZXZlciwgYSB2aWRlbyBmb3JtYXQKKyAqIAkJCW1hbmFnZXIgc3RpbGwgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBwcmlvciB0bworICogCQkJY2FsbGluZyB0aGlzIGZ1bmN0aW9uKS4KKyAqIEBwYXJhbSB2ZmkJCVRoZSB2aWRlbyBmb3JtYXQgaW5mbyB0byBiZSByZWdpc3RlcmVkLiBUaGlzCisgKiAJCQlzdHJ1Y3R1cmUgbXVzdCByZW1haW4gdmFsaWQgdW50aWwgdGhlIGZvcm1hdAorICogCQkJbWFuYWdlciBpcyBkZXN0cm95ZWQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcmlwcmlhdGUgZXJyb3IgdmFsdWUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3JlZ2lzdGVyX3ZpZGVvX2Zvcm1hdF9pbmZvKHBqbWVkaWFfdmlkZW9fZm9ybWF0X21nciAqbWdyLAorCQkJCSAgIHBqbWVkaWFfdmlkZW9fZm9ybWF0X2luZm8gKnZmaSk7CisKKy8qKgorICogRGVzdHJveSBhIHZpZGVvIGZvcm1hdCBtYW5hZ2VyLiBJZiB0aGUgbWFuYWdlciBoYXBwZW5zIHRvIGJlIHRoZSBzaW5nbGV0b24KKyAqIGluc3RhbmNlLCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIHdpbGwgYmUgc2V0IHRvIE5VTEwuCisgKgorICogQHBhcmFtIG1ncgkJVGhlIHZpZGVvIGZvcm1hdCBtYW5hZ2VyLiBTcGVjaWZ5IE5VTEwgdG8gdXNlCisgKiAJCQl0aGUgc2luZ2xldG9uIGluc3RhbmNlIChob3dldmVyLCBhIHZpZGVvIGZvcm1hdAorICogCQkJbWFuYWdlciBzdGlsbCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHByaW9yIHRvCisgKiAJCQljYWxsaW5nIHRoaXMgZnVuY3Rpb24pLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfdmlkZW9fZm9ybWF0X21ncl9kZXN0cm95KHBqbWVkaWFfdmlkZW9fZm9ybWF0X21nciAqbWdyKTsKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfRk9STUFUX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9mcmFtZS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODZjNTFmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZnJhbWUuaApAQCAtMCwwICsxLDMzMiBAQAorLyogJElkOiBmcmFtZS5oIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0ZSQU1FX0hfXworI2RlZmluZSBfX1BKTUVESUFfRlJBTUVfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS9mcmFtZS5oIE1lZGlhIGZyYW1lCisgKiBAYnJpZWYgRnJhbWUKKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GUkFNRSBNZWRpYSBmcmFtZQorICogQGluZ3JvdXAgUEpNRURJQV9UWVBFUworICogQGJyaWVmIEZyYW1lCisgKiBAeworICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIFR5cGVzIG9mIG1lZGlhIGZyYW1lLgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV9mcmFtZV90eXBlCit7CisgICAgUEpNRURJQV9GUkFNRV9UWVBFX05PTkUsCSAgICAvKio8IE5vIGZyYW1lLgkJKi8KKyAgICBQSk1FRElBX0ZSQU1FX1RZUEVfQVVESU8sCSAgICAvKio8IE5vcm1hbCBhdWRpbyBmcmFtZS4JKi8KKyAgICBQSk1FRElBX0ZSQU1FX1RZUEVfRVhURU5ERUQsICAgIC8qKjwgRXh0ZW5kZWQgYXVkaW8gZnJhbWUuCSovCisgICAgUEpNRURJQV9GUkFNRV9UWVBFX1ZJREVPICAgICAgICAvKio8IFZpZGVvIGZyYW1lLiAgICAgICAgICAgKi8KKworfSBwam1lZGlhX2ZyYW1lX3R5cGU7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBtZWRpYSBmcmFtZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9mcmFtZQoreworICAgIHBqbWVkaWFfZnJhbWVfdHlwZQkgdHlwZTsJICAgIC8qKjwgRnJhbWUgdHlwZS4JCQkgICAgKi8KKyAgICB2b2lkCQkqYnVmOwkgICAgLyoqPCBQb2ludGVyIHRvIGJ1ZmZlci4JCSAgICAqLworICAgIHBqX3NpemVfdAkJIHNpemU7CSAgICAvKio8IEZyYW1lIHNpemUgaW4gYnl0ZXMuCQkgICAgKi8KKyAgICBwal90aW1lc3RhbXAJIHRpbWVzdGFtcDsgLyoqPCBGcmFtZSB0aW1lc3RhbXAuCQkgICAgKi8KKyAgICBwal91aW50MzJfdAkJIGJpdF9pbmZvOyAgLyoqPCBCaXQgaW5mbyBvZiB0aGUgZnJhbWUsIHNhbXBsZSBjYXNlOgorCQkJCQkgYSBmcmFtZSBtYXkgbm90IGV4YWN0bHkgc3RhcnQgYW5kIGVuZAorCQkJCQkgYXQgdGhlIG9jdGV0IGJvdW5kYXJ5LCBzbyB0aGlzIGZpZWxkCisJCQkJCSBtYXkgYmUgdXNlZCBmb3Igc3BlY2lmeWluZyBzdGFydCAmCisJCQkJCSBlbmQgYml0IG9mZnNldC4JCSAgICAqLworfSBwam1lZGlhX2ZyYW1lOworCisKKy8qKgorICogVGhlIHBqbWVkaWFfZnJhbWVfZXh0IGlzIHVzZWQgdG8gY2FycnkgYSBtb3JlIGNvbXBsZXggYXVkaW8gZnJhbWVzIHRoYW4KKyAqIHRoZSB0eXBpY2FsIFBDTSBhdWRpbyBmcmFtZXMsIGFuZCBpdCBpcyBzaWduYWxlZCBieSBzZXR0aW5nIHRoZSAidHlwZSIKKyAqIGZpZWxkIG9mIGEgcGptZWRpYV9mcmFtZSB0byBQSk1FRElBX0ZSQU1FX1RZUEVfRVhURU5ERUQuIFdpdGggdGhpcyBzZXQsCisgKiBhcHBsaWNhdGlvbiBtYXkgdHlwZWNhc3QgcGptZWRpYV9mcmFtZSB0byBwam1lZGlhX2ZyYW1lX2V4dC4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIGF1ZGlvIGZyYW1lcywgd2hpY2ggc3Vic2VxdWVudGx5CisgKiB3aWxsIGJlIGNhbGxlZCBzdWJmcmFtZXMgaW4gdGhpcyBzdHJ1Y3R1cmUuIFRoZSBzdWJmcmFtZXMgc2VjdGlvbgorICogaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlLCBhbmQgZWFjaCBzdWJmcmFtZSBpcworICogcmVwcmVzZW50ZWQgYnkgcGptZWRpYV9mcmFtZV9leHRfc3ViZnJhbWUgc3RydWN0dXJlLiBFdmVyeSBuZXh0CisgKiBzdWJmcmFtZSBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBwcmV2aW91cyBzdWJmcmFtZSwgYW5kIGFsbCBzdWJmcmFtZXMKKyAqIGFyZSBieXRlLWFsaWduZWQgYWx0aG91Z2ggaXRzIHBheWxvYWQgbWF5IG5vdCBiZSBieXRlLWFsaWduZWQuCisgKi8KKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2ZyYW1lX2V4dCB7CisgICAgcGptZWRpYV9mcmFtZSAgIGJhc2U7CSAgICAvKio8IEJhc2UgZnJhbWUgaW5mbyAqLworICAgIHBqX3VpbnQxNl90ICAgICBzYW1wbGVzX2NudDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGlzIGZyYW1lICovCisgICAgcGpfdWludDE2X3QgICAgIHN1YmZyYW1lX2NudDsgICAvKio8IE51bWJlciBvZiAoc3ViKWZyYW1lcyBpbiB0aGlzIGZyYW1lICovCisKKyAgICAvKiBaZXJvIG9yIG1vcmUgKHN1YilmcmFtZXMgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGlzLAorICAgICAqIGVhY2ggd2lsbCBiZSByZXByZXNlbnRlZCBieSBwam1lZGlhX2ZyYW1lX2V4dF9zdWJmcmFtZQorICAgICAqLworfSBwam1lZGlhX2ZyYW1lX2V4dDsKKyNwcmFnbWEgcGFjaygpCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgaW5kaXZpZHVhbCBzdWJmcmFtZXMgaW4gdGhlCisgKiBwam1lZGlhX2ZyYW1lX2V4dCBzdHJ1Y3R1cmUuCisgKi8KKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9mcmFtZV9leHRfc3ViZnJhbWUgeworICAgIHBqX3VpbnQxNl90ICAgICBiaXRsZW47CSAgICAvKio8IE51bWJlciBvZiBiaXRzIGluIHRoZSBkYXRhICovCisgICAgcGpfdWludDhfdCAgICAgIGRhdGFbMV07CSAgICAvKio8IFN0YXJ0IG9mIGVuY29kZWQgZGF0YSAqLworfSBwam1lZGlhX2ZyYW1lX2V4dF9zdWJmcmFtZTsKKworI3ByYWdtYSBwYWNrKCkKKworLyoqCisgKiBDb3B5IG9uZSBmcmFtZSB0byBhbm90aGVyLiBJZiB0aGUgZGVzdGluYXRpb24gZnJhbWUncyBzaXplIGlzIHNtYWxsZXIgdGhhbgorICogdGhlIHNvdXJjZSBmcmFtZSdzLCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHdpbGwgYmUgdHJ1bmNhdGVkLgorICoKKyAqIEBwYXJhbSBzcmMJCSAgICBTb3VyY2UgZnJhbWUuCisgKiBAcGFyYW0gZHN0CQkgICAgRGVzdGluYXRpb24gZnJhbWUuCisgKi8KK1BKX0lOTElORSh2b2lkKSBwam1lZGlhX2ZyYW1lX2NvcHkocGptZWRpYV9mcmFtZSAqZHN0LAorCQkJCSAgIGNvbnN0IHBqbWVkaWFfZnJhbWUgKnNyYykKK3sKKyAgICBkc3QtPnR5cGUgPSBzcmMtPnR5cGU7CisgICAgZHN0LT50aW1lc3RhbXAgPSBzcmMtPnRpbWVzdGFtcDsKKyAgICBkc3QtPmJpdF9pbmZvID0gc3JjLT5iaXRfaW5mbzsKKyAgICBkc3QtPnNpemUgPSAoZHN0LT5zaXplIDwgc3JjLT5zaXplPyBkc3QtPnNpemU6IHNyYy0+c2l6ZSk7CisgICAgcGpfbWVtY3B5KGRzdC0+YnVmLCBzcmMtPmJ1ZiwgZHN0LT5zaXplKTsKK30KKworLyoqCisgKiBBcHBlbmQgb25lIHN1YmZyYW1lIHRvICNwam1lZGlhX2ZyYW1lX2V4dC4KKyAqCisgKiBAcGFyYW0gZnJtCQkgICAgVGhlICNwam1lZGlhX2ZyYW1lX2V4dC4KKyAqIEBwYXJhbSBzcmMJCSAgICBTdWJmcmFtZSBkYXRhLgorICogQHBhcmFtIGJpdGxlbgkgICAgTGVuZ3RoIG9mIHN1YmZyYW1lLCBpbiBiaXRzLgorICogQHBhcmFtIHNhbXBsZXNfY250CSAgICBOdW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBpbiBzdWJmcmFtZS4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfZnJhbWVfZXh0X2FwcGVuZF9zdWJmcmFtZShwam1lZGlhX2ZyYW1lX2V4dCAqZnJtLAorCQkJCQkJICBjb25zdCB2b2lkICpzcmMsCisJCQkJCSAgICAgICAgICB1bnNpZ25lZCBiaXRsZW4sCisJCQkJCQkgIHVuc2lnbmVkIHNhbXBsZXNfY250KQoreworICAgIHBqbWVkaWFfZnJhbWVfZXh0X3N1YmZyYW1lICpmc3ViOworICAgIHBqX3VpbnQ4X3QgKnA7CisgICAgdW5zaWduZWQgaTsKKworICAgIHAgPSAocGpfdWludDhfdCopZnJtICsgc2l6ZW9mKHBqbWVkaWFfZnJhbWVfZXh0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJtLT5zdWJmcmFtZV9jbnQ7ICsraSkgeworCWZzdWIgPSAocGptZWRpYV9mcmFtZV9leHRfc3ViZnJhbWUqKSBwOworCXAgKz0gc2l6ZW9mKGZzdWItPmJpdGxlbikgKyAoKGZzdWItPmJpdGxlbis3KSA+PiAzKTsKKyAgICB9CisKKyAgICBmc3ViID0gKHBqbWVkaWFfZnJhbWVfZXh0X3N1YmZyYW1lKikgcDsKKyAgICBmc3ViLT5iaXRsZW4gPSAocGpfdWludDE2X3QpYml0bGVuOworICAgIGlmIChiaXRsZW4pCisJcGpfbWVtY3B5KGZzdWItPmRhdGEsIHNyYywgKGJpdGxlbis3KSA+PiAzKTsKKworICAgIGZybS0+c3ViZnJhbWVfY250Kys7CisgICAgZnJtLT5zYW1wbGVzX2NudCA9IChwal91aW50MTZfdCkoZnJtLT5zYW1wbGVzX2NudCArIHNhbXBsZXNfY250KTsKK30KKworLyoqCisgKiBHZXQgYSBzdWJmcmFtZSBmcm9tICNwam1lZGlhX2ZyYW1lX2V4dC4KKyAqCisgKiBAcGFyYW0gZnJtCQkgICAgVGhlICNwam1lZGlhX2ZyYW1lX2V4dC4KKyAqIEBwYXJhbSBuCQkgICAgU3ViZnJhbWUgaW5kZXgsIHplcm8gYmFzZWQuCisgKgorICogQHJldHVybgkJICAgIFRoZSBuLXRoIHN1YmZyYW1lLCBvciBOVUxMIGlmIG4gaXMgb3V0LW9mLXJhbmdlLgorICovCitQSl9JTkxJTkUocGptZWRpYV9mcmFtZV9leHRfc3ViZnJhbWUqKQorcGptZWRpYV9mcmFtZV9leHRfZ2V0X3N1YmZyYW1lKGNvbnN0IHBqbWVkaWFfZnJhbWVfZXh0ICpmcm0sIHVuc2lnbmVkIG4pCit7CisgICAgcGptZWRpYV9mcmFtZV9leHRfc3ViZnJhbWUgKnNmID0gTlVMTDsKKworICAgIGlmIChuIDwgZnJtLT5zdWJmcmFtZV9jbnQpIHsKKwlwal91aW50OF90ICpwOworCXVuc2lnbmVkIGk7CisKKwlwID0gKHBqX3VpbnQ4X3QqKWZybSArIHNpemVvZihwam1lZGlhX2ZyYW1lX2V4dCk7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCSAgICBzZiA9IChwam1lZGlhX2ZyYW1lX2V4dF9zdWJmcmFtZSopIHA7CisJICAgIHAgKz0gc2l6ZW9mKHNmLT5iaXRsZW4pICsgKChzZi0+Yml0bGVuKzcpID4+IDMpOworCX0KKworCXNmID0gKHBqbWVkaWFfZnJhbWVfZXh0X3N1YmZyYW1lKikgcDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Y7Cit9CisKKy8qKgorICogRXh0cmFjdCBhbGwgZnJhbWUgcGF5bG9hZCB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gZnJtCQkgICAgVGhlIGZyYW1lLgorICogQHBhcmFtIGRzdAkJICAgIERlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIEBwYXJhbSBtYXhsZW4JICAgIE1heGltdW0gc2l6ZSB0byBjb3B5IChpLmUuIHRoZSBzaXplIG9mIHRoZQorICoJCQkgICAgZGVzdGluYXRpb24gYnVmZmVyKS4KKyAqCisgKiBAcmV0dXJuCQkgICAgVG90YWwgc2l6ZSBvZiBwYXlsb2FkIGNvcGllZC4KKyAqLworUEpfSU5MSU5FKHVuc2lnbmVkKQorcGptZWRpYV9mcmFtZV9leHRfY29weV9wYXlsb2FkKGNvbnN0IHBqbWVkaWFfZnJhbWVfZXh0ICpmcm0sCisJCQkgICAgICAgdm9pZCAqZHN0LAorCQkJICAgICAgIHVuc2lnbmVkIG1heGxlbikKK3sKKyAgICB1bnNpZ25lZCBpLCBjb3BpZWQ9MDsKKyAgICBmb3IgKGk9MDsgaTxmcm0tPnN1YmZyYW1lX2NudDsgKytpKSB7CisJcGptZWRpYV9mcmFtZV9leHRfc3ViZnJhbWUgKnNmOworCXVuc2lnbmVkIHN6OworCisJc2YgPSBwam1lZGlhX2ZyYW1lX2V4dF9nZXRfc3ViZnJhbWUoZnJtLCBpKTsKKwlpZiAoIXNmKQorCSAgICBjb250aW51ZTsKKworCXN6ID0gKChzZi0+Yml0bGVuICsgNykgPj4gMyk7CisJaWYgKHN6ICsgY29waWVkID4gbWF4bGVuKQorCSAgICBicmVhazsKKworCXBqX21lbWNweSgoKHBqX3VpbnQ4X3QqKWRzdCkgKyBjb3BpZWQsIHNmLT5kYXRhLCBzeik7CisJY29waWVkICs9IHN6OworICAgIH0KKyAgICByZXR1cm4gY29waWVkOworfQorCisKKy8qKgorICogUG9wIG91dCBmaXJzdCBuIHN1YmZyYW1lcyBmcm9tICNwam1lZGlhX2ZyYW1lX2V4dC4KKyAqCisgKiBAcGFyYW0gZnJtCQkgICAgVGhlICNwam1lZGlhX2ZyYW1lX2V4dC4KKyAqIEBwYXJhbSBuCQkgICAgTnVtYmVyIG9mIGZpcnN0IHN1YmZyYW1lcyB0byBiZSBwb3BwZWQgb3V0LgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIHdoZW4gc3VjY2Vzc2Z1bC4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KQorcGptZWRpYV9mcmFtZV9leHRfcG9wX3N1YmZyYW1lcyhwam1lZGlhX2ZyYW1lX2V4dCAqZnJtLCB1bnNpZ25lZCBuKQoreworICAgIHBqbWVkaWFfZnJhbWVfZXh0X3N1YmZyYW1lICpzZjsKKyAgICBwal91aW50OF90ICptb3ZlX3NyYzsKKyAgICBwal9zaXplX3QgbW92ZV9sZW47CisKKyAgICBpZiAoZnJtLT5zdWJmcmFtZV9jbnQgPD0gbikgeworCWZybS0+c3ViZnJhbWVfY250ID0gMDsKKwlmcm0tPnNhbXBsZXNfY250ID0gMDsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBtb3ZlX3NyYyA9IChwal91aW50OF90Kilwam1lZGlhX2ZyYW1lX2V4dF9nZXRfc3ViZnJhbWUoZnJtLCBuKTsKKyAgICBzZiA9IHBqbWVkaWFfZnJhbWVfZXh0X2dldF9zdWJmcmFtZShmcm0sIGZybS0+c3ViZnJhbWVfY250LTEpOworICAgIG1vdmVfbGVuID0gKChwal91aW50OF90KilzZiAtIG1vdmVfc3JjICsgc2l6ZW9mKHNmLT5iaXRsZW4pICsKKwkgICAgICAgKChzZi0+Yml0bGVuKzcpID4+IDMpKTsKKyAgICBwal9tZW1tb3ZlKChwal91aW50OF90Kilmcm0rc2l6ZW9mKHBqbWVkaWFfZnJhbWVfZXh0KSwKKwkgICAgICAgbW92ZV9zcmMsIG1vdmVfbGVuKTsKKworICAgIGZybS0+c2FtcGxlc19jbnQgPSAocGpfdWludDE2X3QpCisJCSAgIChmcm0tPnNhbXBsZXNfY250IC0gbipmcm0tPnNhbXBsZXNfY250L2ZybS0+c3ViZnJhbWVfY250KTsKKyAgICBmcm0tPnN1YmZyYW1lX2NudCA9IChwal91aW50MTZfdCkgKGZybS0+c3ViZnJhbWVfY250IC0gbik7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKioKKyAqIFRoaXMgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gc2V0IFBDTSBzYW1wbGVzIHRvIHplcm8uCisgKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSBtYW55IHBhcnRzIG9mIHRoZSBsaWJyYXJ5LAorICogYnkgcHV0dGluZyB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gb25lIHBsYWNlLCBpdCBlbmFibGVzIHNvbWUuCisgKiBjbGV2ZXIgcGVvcGxlIHRvIG9wdGltaXplIHRoaXMgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHNhbXBsZXMJVGhlIDE2Yml0IFBDTSBzYW1wbGVzLgorICogQHBhcmFtIGNvdW50CQlOdW1iZXIgb2Ygc2FtcGxlcy4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfemVyb19zYW1wbGVzKHBqX2ludDE2X3QgKnNhbXBsZXMsIHVuc2lnbmVkIGNvdW50KQoreworI2lmIDEKKyAgICBwal9iemVybyhzYW1wbGVzLCAoY291bnQ8PDEpKTsKKyNlbGlmIDAKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHNhbXBsZXNbaV0gPSAwOworI2Vsc2UKKyAgICB1bnNpZ25lZCBpOworICAgIGNvdW50ID4+PSAxOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpICgocGpfaW50MzJfdCopc2FtcGxlcylbaV0gPSAocGpfaW50MzJfdCkwOworI2VuZGlmCit9CisKKworLyoqCisgKiBUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGZ1bmN0aW9uIHRvIGNvcHkgc2FtcGxlcyBmcm9tL3RvIGJ1ZmZlcnMgd2l0aAorICogZXF1YWwgc2l6ZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgbWFueSBwYXJ0cyBvZiB0aGUgbGlicmFyeSwKKyAqIGJ5IHB1dHRpbmcgdGhpcyBmdW5jdGlvbmFsaXR5IGluIG9uZSBwbGFjZSwgaXQgZW5hYmxlcyBzb21lLgorICogY2xldmVyIHBlb3BsZSB0byBvcHRpbWl6ZSB0aGlzIGZ1bmN0aW9uLgorICovCitQSl9JTkxJTkUodm9pZCkgcGptZWRpYV9jb3B5X3NhbXBsZXMocGpfaW50MTZfdCAqZHN0LCBjb25zdCBwal9pbnQxNl90ICpzcmMsCisJCQkJICAgICB1bnNpZ25lZCBjb3VudCkKK3sKKyNpZiAxCisgICAgcGpfbWVtY3B5KGRzdCwgc3JjLCAoY291bnQ8PDEpKTsKKyNlbGlmIDAKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIGRzdFtpXSA9IHNyY1tpXTsKKyNlbHNlCisgICAgdW5zaWduZWQgaTsKKyAgICBjb3VudCA+Pj0gMTsKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKQorCSgocGpfaW50MzJfdCopZHN0KVtpXSA9ICgocGpfaW50MzJfdCopc3JjKVtpXTsKKyNlbmRpZgorfQorCisKKy8qKgorICogVGhpcyBpcyBhIGdlbmVyYWwgcHVycG9zZSBmdW5jdGlvbiB0byBjb3B5IHNhbXBsZXMgZnJvbS90byBidWZmZXJzIHdpdGgKKyAqIGVxdWFsIHNpemUuIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIGJ5IG1hbnkgcGFydHMgb2YgdGhlIGxpYnJhcnksCisgKiBieSBwdXR0aW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBvbmUgcGxhY2UsIGl0IGVuYWJsZXMgc29tZS4KKyAqIGNsZXZlciBwZW9wbGUgdG8gb3B0aW1pemUgdGhpcyBmdW5jdGlvbi4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfbW92ZV9zYW1wbGVzKHBqX2ludDE2X3QgKmRzdCwgY29uc3QgcGpfaW50MTZfdCAqc3JjLAorCQkJCSAgICAgdW5zaWduZWQgY291bnQpCit7CisjaWYgMQorICAgIHBqX21lbW1vdmUoZHN0LCBzcmMsIChjb3VudDw8MSkpOworI2VsaWYgMAorICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgZHN0W2ldID0gc3JjW2ldOworI2Vsc2UKKyAgICB1bnNpZ25lZCBpOworICAgIGNvdW50ID4+PSAxOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpCisJKChwal9pbnQzMl90Kilkc3QpW2ldID0gKChwal9pbnQzMl90KilzcmMpW2ldOworI2VuZGlmCit9CisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogX19QSk1FRElBX0ZSQU1FX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZzcxMS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvZzcxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjY2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9nNzExLmgKQEAgLTAsMCArMSw4OSBAQAorLyogJElkOiBnNzExLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0c3MTFfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9HNzExX0hfXworCisvKioKKyAqIEBmaWxlIGc3MTEuaAorICogQGJyaWVmIEc3MTEgQ29kZWMKKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS1jb2RlYy90eXBlcy5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRF9HNzExIEcuNzExIENvZGVjCisgKiBAaW5ncm91cCBQSk1FRElBX0NPREVDX0NPREVDUworICogQGJyaWVmIFN0YW5kYXJkIEcuNzExL1BDTUEgYW5kIFBDTVUgY29kZWMuCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIEcuNzExIGNvZGVjCisgKiBmYWN0b3J5IHRvIHRoZSBjb2RlYyBtYW5hZ2VyLiBBZnRlciB0aGUgY29kZWMgZmFjdG9yeSBoYXMgYmVlbiByZWdpc3RlcmVkLAorICogYXBwbGljYXRpb24gY2FuIHVzZSBAcmVmIFBKTUVESUFfQ09ERUMgQVBJIHRvIG1hbmlwdWxhdGUgdGhlIGNvZGVjLgorICoKKyAqIFRoZSBHLjcxMSBpcyBhbiB1bHRyYSBsb3cgY29tcGxleGl0eSBjb2RlY3MgYW5kIGluIHRyYWRlLW9mZiBpdCByZXN1bHRzCisgKiBpbiBoaWdoIGJpdHJhdGUsIGkuZTogNjRrYnBzIGZvciAxNi1iaXQgUENNIHdpdGggc2FtcGxpbmcgcmF0ZSA4MDAwSHouCisgKgorICogVGhlIGZhY3RvcnkgY29udGFpbnMgdHdvIG1haW4gY29tcHJlc3Npb24gYWxnb3JpdGhtcywgUENNVS91LUxhdyBhbmQgCisgKiBQQ01BL0EtTGF3LgorICoKKyAqIFxzZWN0aW9uIGNvZGVjX3NldHRpbmcgQ29kZWMgU2V0dGluZ3MKKyAqCisgKiBcc3Vic2VjdGlvbiBnZW5lcmFsX3NldHRpbmcgR2VuZXJhbCBTZXR0aW5ncworICoKKyAqIEdlbmVyYWwgY29kZWMgc2V0dGluZ3MgZm9yIHRoaXMgY29kZWMgc3VjaCBhcyBWQUQgYW5kIFBMQyBjYW4gYmUgCisgKiBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSA8dHQ+c2V0dGluZzwvdHQ+IGZpZWxkIGluICNwam1lZGlhX2NvZGVjX3BhcmFtLiAKKyAqIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgI3BqbWVkaWFfY29kZWNfcGFyYW0gZm9yIG1vcmUgaW5mby4KKyAqCisgKiBcc3Vic2VjdGlvbiBzcGVjaWZpY19zZXR0aW5nIENvZGVjIFNwZWNpZmljIFNldHRpbmdzCisgKgorICogQ3VycmVudGx5IG5vbmUuCisgKi8KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgRzcxMSBjb2RlYyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuCisgKiBUaGlzIHdpbGwgcmVnaXN0ZXIgUENNVSBhbmQgUENNQSBjb2RlYywgaW4gdGhhdCBvcmRlci4KKyAqCisgKiBAcGFyYW0gZW5kcHQJCVRoZSBwam1lZGlhIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzExX2luaXQocGptZWRpYV9lbmRwdCAqZW5kcHQpOworCisKKworLyoqCisgKiBVbnJlZ2lzdGVyIEc3MTEgY29kZWMgZmFjdG9yeSBmcm9tIHBqbWVkaWEgZW5kcG9pbnQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2NvZGVjX2c3MTFfZGVpbml0KHZvaWQpOworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYJLyogX19QSk1FRElBX0c3MTFfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2pidWYuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL2pidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODhiYjMzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvamJ1Zi5oCkBAIC0wLDAgKzEsNDUxIEBACisvKiAkSWQ6IGpidWYuaCAzODQxIDIwMTEtMTAtMjQgMDk6Mjg6MTNaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKy8qCisgKiBCYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBraW5kbHkgY29udHJpYnV0ZWQgYnkgU3dpdGNobGFiLCBMdGQuCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0pCVUZfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9KQlVGX0hfXworCisKKy8qKgorICogQGZpbGUgamJ1Zi5oCisgKiBAYnJpZWYgQWRhcHRpdmUgaml0dGVyIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfSkJVRiBBZGFwdGl2ZSBqaXR0ZXIgYnVmZmVyCisgKiBAaW5ncm91cCBQSk1FRElBX0ZSQU1FX09QCisgKiBAYnJpZWYgQWRhcHRpdmUgZGUtaml0dGVyIGJ1ZmZlcmluZyBpbXBsZW1lbnRhdGlvbgorICogQHsKKyAqCisgKiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIFBKTUVESUEncyBpbXBsZW1lbnRhdGlvbiBvZiBkZS1qaXR0ZXIgYnVmZmVyLgorICogVGhlIGRlLWppdHRlciBidWZmZXIgbWF5IGJlIHNldCB0byBvcGVyYXRlIGluIGFkYXB0aXZlIG1vZGUgb3IgZml4ZWQKKyAqIGRlbGF5IG1vZGUuCisgKi8KKworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBUeXBlcyBvZiBmcmFtZSByZXR1cm5lZCBieSB0aGUgaml0dGVyIGJ1ZmZlci4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfamJfZnJhbWVfdHlwZSAKK3sKKyAgICBQSk1FRElBX0pCX01JU1NJTkdfRlJBTUUJICAgPSAwLCAvKio8IE5vIGZyYW1lIGJlY2F1c2UgaXQncyBtaXNzaW5nICAqLworICAgIFBKTUVESUFfSkJfTk9STUFMX0ZSQU1FCSAgID0gMSwgLyoqPCBOb3JtYWwgZnJhbWUgaXMgYmVpbmcgcmV0dXJuZWQgKi8KKyAgICBQSk1FRElBX0pCX1pFUk9fUFJFRkVUQ0hfRlJBTUUgPSAyLCAvKio8IFplcm8gZnJhbWUgaXMgYmVpbmcgcmV0dXJuZWQgIAorCQkJCQkgICAgIGJlY2F1c2UgSkIgaXMgYnVmZmVycmluZy4JICAgICovCisgICAgUEpNRURJQV9KQl9aRVJPX0VNUFRZX0ZSQU1FCSAgID0gMwkvKio8IFplcm8gZnJhbWUgaXMgYmVpbmcgcmV0dXJuZWQKKwkJCQkJICAgICBiZWNhdXNlIEpCIGlzIGVtcHR5LgkgICAgKi8KK30gcGptZWRpYV9qYl9mcmFtZV90eXBlOworCisKKy8qKgorICogRW51bWVyYXRpb24gb2Ygaml0dGVyIGJ1ZmZlciBkaXNjYXJkIGFsZ29yaXRobS4gVGhlIGppdHRlciBidWZmZXIKKyAqIGNvbnRpbnVvdXNseSBjYWxjdWxhdGVzIHRoZSBqaXR0ZXIgbGV2ZWwgdG8gZ2V0IHRoZSBvcHRpbXVtIGxhdGVuY3kgYXQKKyAqIGFueSB0aW1lIGFuZCBpbiBvcmRlciB0byBhZGp1c3QgdGhlIGxhdGVuY3ksIHRoZSBqaXR0ZXIgYnVmZmVyIG1heSBuZWVkCisgKiB0byBkaXNjYXJkIHNvbWUgZnJhbWVzLgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV9qYl9kaXNjYXJkX2FsZ28KK3sKKyAgICAvKioKKyAgICAgKiBKaXR0ZXIgYnVmZmVyIHNob3VsZCBub3QgZGlzY2FyZCBhbnkgZnJhbWUsIGV4Y2VwdCB3aGVuIHRoZSBqaXR0ZXIKKyAgICAgKiBidWZmZXIgaXMgZnVsbCBhbmQgYSBuZXcgZnJhbWUgYXJyaXZlcywgb25lIGZyYW1lIHdpbGwgYmUgZGlzY2FyZGVkCisgICAgICogdG8gbWFrZSBzcGFjZSBmb3IgdGhlIG5ldyBmcmFtZS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0pCX0RJU0NBUkRfTk9ORQkgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiBPbmx5IGRpc2NhcmQgb25lIGZyYW1lIGluIGF0IGxlYXN0IDIwMG1zIHdoZW4gdGhlIGxhdGVuY3kgaXMgY29uc2lkZXJlZAorICAgICAqIG11Y2ggaGlnaGVyIHRoYW4gaXQgc2hvdWxkIGJlLiBXaGVuIHRoZSBqaXR0ZXIgYnVmZmVyIGlzIGZ1bGwgYW5kIGEgbmV3CisgICAgICogZnJhbWUgYXJyaXZlcywgb25lIGZyYW1lIHdpbGwgYmUgZGlzY2FyZGVkIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBuZXcKKyAgICAgKiBmcmFtZS4KKyAgICAgKi8KKyAgICBQSk1FRElBX0pCX0RJU0NBUkRfU1RBVElDLAorCisgICAgLyoqCisgICAgICogVGhlIGRpc2NhcmQgcmF0ZSBpcyBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGJhc2VkIG9uIGFjdHVhbCBwYXJhbWV0ZXJzCisgICAgICogc3VjaCBhcyBqaXR0ZXIgbGV2ZWwgYW5kIGxhdGVuY3kuIFdoZW4gdGhlIGppdHRlciBidWZmZXIgaXMgZnVsbCBhbmQKKyAgICAgKiBhIG5ldyBmcmFtZSBhcnJpdmVzLCBvbmUgZnJhbWUgd2lsbCBiZSBkaXNjYXJkZWQgdG8gbWFrZSBzcGFjZSBmb3IgdGhlCisgICAgICogbmV3IGZyYW1lLgorICAgICAqLworICAgIFBKTUVESUFfSkJfRElTQ0FSRF9QUk9HUkVTU0lWRQorCit9IHBqbWVkaWFfamJfZGlzY2FyZF9hbGdvOworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGppdHRlciBidWZmZXIgc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfamJfc3RhdGUKK3sKKyAgICAvKiBTZXR0aW5nICovCisgICAgdW5zaWduZWQJZnJhbWVfc2l6ZTsJICAgIC8qKjwgSW5kaXZpZHVhbCBmcmFtZSBzaXplLCBpbiBieXRlcy4gICAqLworICAgIHVuc2lnbmVkCW1pbl9wcmVmZXRjaDsJICAgIC8qKjwgTWluaW11bSBhbGxvd2VkIHByZWZldGNoLCBpbiBmcm1zLiAqLworICAgIHVuc2lnbmVkCW1heF9wcmVmZXRjaDsJICAgIC8qKjwgTWF4aW11bSBhbGxvd2VkIHByZWZldGNoLCBpbiBmcm1zLiAqLworCisgICAgLyogU3RhdHVzICovCisgICAgdW5zaWduZWQJYnVyc3Q7CQkgICAgLyoqPCBDdXJyZW50IGJ1cnN0IGxldmVsLCBpbiBmcmFtZXMJICAgICovCisgICAgdW5zaWduZWQJcHJlZmV0Y2g7CSAgICAvKio8IEN1cnJlbnQgcHJlZmV0Y2ggdmFsdWUsIGluIGZyYW1lcyAgKi8KKyAgICB1bnNpZ25lZAlzaXplOwkJICAgIC8qKjwgQ3VycmVudCBidWZmZXIgc2l6ZSwgaW4gZnJhbWVzLiAgICAqLworCisgICAgLyogU3RhdGlzdGljICovCisgICAgdW5zaWduZWQJYXZnX2RlbGF5OwkgICAgLyoqPCBBdmVyYWdlIGRlbGF5LCBpbiBtcy4JCSAgICAqLworICAgIHVuc2lnbmVkCW1pbl9kZWxheTsJICAgIC8qKjwgTWluaW11bSBkZWxheSwgaW4gbXMuCQkgICAgKi8KKyAgICB1bnNpZ25lZAltYXhfZGVsYXk7CSAgICAvKio8IE1heGltdW0gZGVsYXksIGluIG1zLgkJICAgICovCisgICAgdW5zaWduZWQJZGV2X2RlbGF5OwkgICAgLyoqPCBTdGFuZGFyZCBkZXZpYXRpb24gb2YgZGVsYXksIGluIG1zLiovCisgICAgdW5zaWduZWQJYXZnX2J1cnN0OwkgICAgLyoqPCBBdmVyYWdlIGJ1cnN0LCBpbiBmcmFtZXMuCSAgICAqLworICAgIHVuc2lnbmVkCWxvc3Q7CQkgICAgLyoqPCBOdW1iZXIgb2YgbG9zdCBmcmFtZXMuCQkgICAgKi8KKyAgICB1bnNpZ25lZAlkaXNjYXJkOwkgICAgLyoqPCBOdW1iZXIgb2YgZGlzY2FyZGVkIGZyYW1lcy4JICAgICovCisgICAgdW5zaWduZWQJZW1wdHk7CQkgICAgLyoqPCBOdW1iZXIgb2YgZW1wdHkgb24gR0VUIGV2ZW50cy4JICAgICovCit9IHBqbWVkaWFfamJfc3RhdGU7CisKKworLyoqCisgKiBUaGUgY29uc3RhbnQgUEpNRURJQV9KQl9ERUZBVUxUX0lOSVRfREVMQVkgc3BlY2lmaWVzIGRlZmF1bHQgaml0dGVyCisgKiBidWZmZXIgcHJlZmV0Y2ggY291bnQgZHVyaW5nIGppdHRlciBidWZmZXIgY3JlYXRpb24uCisgKi8KKyNkZWZpbmUgUEpNRURJQV9KQl9ERUZBVUxUX0lOSVRfREVMQVkgICAgMTUKKworLyoqCisgKiBPcGFxdWUgZGVjbGFyYXRpb24gZm9yIGppdHRlciBidWZmZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfamJ1ZiBwam1lZGlhX2pidWY7CisKKworLyoqCisgKiBDcmVhdGUgYW4gYWRhcHRpdmUgaml0dGVyIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24uIElmCisgKiBhcHBsaWNhdGlvbiB3YW50cyB0byBoYXZlIGEgZml4ZWQgaml0dGVyIGJ1ZmZlciwgaXQgbWF5IGNhbGwKKyAqICNwam1lZGlhX2pidWZfc2V0X2ZpeGVkKCkgYWZ0ZXIgdGhlIGppdHRlciBidWZmZXIgaXMgY3JlYXRlZC4gQWxzbworICogaWYgYXBwbGljYXRpb24gd2FudHMgdG8gYWx0ZXIgdGhlIGRpc2NhcmQgYWxnb3JpdGhtLCB3aGljaCB0aGUgZGVmYXVsdAorICogUEpNRURJQV9KQl9ESVNDQVJEX1BST0dSRVNTSVZFLCBpdCBtYXkgY2FsbCAjcGptZWRpYV9qYnVmX3NldF9kaXNjYXJkKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYWxsb2NhdGUgbGFyZ2UgY2h1bmsgb2YgbWVtb3J5IHRvIGtlZXAgdGhlIGZyYW1lcyBpbiAKKyAqIHRoZSBidWZmZXIuCisgKgorICogQHBhcmFtIHBvb2wJCVRoZSBwb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBuYW1lCQlOYW1lIHRvIGlkZW50aWZ5IHRoZSBqaXR0ZXIgYnVmZmVyIGZvciBsb2dnaW5nCisgKgkJCXB1cnBvc2UuCisgKiBAcGFyYW0gZnJhbWVfc2l6ZQlUaGUgc2l6ZSBvZiBlYWNoIGZyYW1lIHRoYXQgd2lsbCBiZSBrZXB0IGluIHRoZQorICoJCQlqaXR0ZXIgYnVmZmVyLCBpbiBieXRlcy4gVGhpcyBzaG91bGQgY29ycmVzcG9uZAorICoJCQl0byB0aGUgbWluaW11bSBmcmFtZSBzaXplIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCisgKgkJCUZvciBleGFtcGxlLCBhIDEwbXMgZnJhbWUgKDgwIGJ5dGVzKSB3b3VsZCBiZSAKKyAqCQkJcmVjb21tZW5kZWQgZm9yIEcuNzExIGNvZGVjLgorICogQHBhcmFtIG1heF9jb3VudAlNYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgdGhhdCBjYW4gYmUga2VwdCBpbiB0aGUKKyAqCQkJaml0dGVyIGJ1ZmZlci4gVGhpcyBlZmZlY3RpdmVseSBtZWFucyB0aGUgbWF4aW11bQorICoJCQlkZWxheSB0aGF0IG1heSBiZSBpbnRyb2R1Y2VkIGJ5IHRoaXMgaml0dGVyIAorICoJCQlidWZmZXIuCisgKiBAcGFyYW0gcHRpbWUJCUluZGljYXRpb24gb2YgZnJhbWUgZHVyYXRpb24sIHVzZWQgdG8gY2FsY3VsYXRlIAorICoJCQl0aGUgaW50ZXJ2YWwgYmV0d2VlbiBqaXR0ZXIgcmVjYWxjdWxhdGlvbi4KKyAqIEBwYXJhbSBwX2piCQlQb2ludGVyIHRvIHJlY2VpdmUgaml0dGVyIGJ1ZmZlciBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfamJ1Zl9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkgY29uc3QgcGpfc3RyX3QgKm5hbWUsCisJCQkJCSB1bnNpZ25lZCBmcmFtZV9zaXplLAorCQkJCQkgdW5zaWduZWQgcHRpbWUsCisJCQkJCSB1bnNpZ25lZCBtYXhfY291bnQsCisJCQkJCSBwam1lZGlhX2pidWYgKipwX2piKTsKKworLyoqCisgKiBTZXQgdGhlIGppdHRlciBidWZmZXIgdG8gZml4ZWQgZGVsYXkgbW9kZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAqIGlzIHRvIGFkYXB0IHRoZSBkZWxheSB3aXRoIGFjdHVhbCBwYWNrZXQgZGVsYXkuCisgKgorICogQHBhcmFtIGpiCQlUaGUgaml0dGVyIGJ1ZmZlcgorICogQHBhcmFtIHByZWZldGNoCVRoZSBmaXhlZCBkZWxheSB2YWx1ZSwgaW4gbnVtYmVyIG9mIGZyYW1lcy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfamJ1Zl9zZXRfZml4ZWQoIHBqbWVkaWFfamJ1ZiAqamIsCisJCQkJCSAgICAgdW5zaWduZWQgcHJlZmV0Y2gpOworCisKKy8qKgorICogU2V0IHRoZSBqaXR0ZXIgYnVmZmVyIHRvIGFkYXB0aXZlIG1vZGUuCisgKgorICogQHBhcmFtIGpiCQlUaGUgaml0dGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBwcmVmZXRjaAlUaGUgaW5pdGlhbCBwcmVmZXRjaCB2YWx1ZSB0byBiZSBhcHBsaWVkIHRvIHRoZQorICoJCQlqaXR0ZXIgYnVmZmVyLiBTZXR0aW5nIHRoaXMgdG8gb3RoZXIgdGhhbiAwIHdpbGwKKyAqCQkJYWN0aXZhdGUgcHJlZmV0Y2ggYnVmZmVyaW5nLCBhIGppdHRlciBidWZmZXIgZmVhdHVyZQorICoJCQl0aGF0IGVhY2ggdGltZSBpdCBnZXRzIGVtcHR5LCBpdCB3b24ndCByZXR1cm4gYSAKKyAqCQkJbm9ybWFsIGZyYW1lIHVudGlsIGl0cyBzaXplIHJlYWNoZXMgdGhlIG51bWJlcgorICoJCQlzcGVjaWZpZWQgaGVyZS4KKyAqIEBwYXJhbSBtaW5fcHJlZmV0Y2gJVGhlIG1pbmltdW0gZGVsYXkgdGhhdCBtdXN0IGJlIGFwcGxpZWQgdG8gZWFjaAorICoJCQlpbmNvbWluZyBwYWNrZXRzLCBpbiBudW1iZXIgb2YgZnJhbWVzLgorICogQHBhcmFtIG1heF9wcmVmZXRjaAlUaGUgbWF4aW11bSBhbGxvd2FibGUgdmFsdWUgZm9yIHByZWZldGNoIGRlbGF5LAorICoJCQlpbiBudW1iZXIgb2YgZnJhbWVzLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9qYnVmX3NldF9hZGFwdGl2ZSggcGptZWRpYV9qYnVmICpqYiwKKwkJCQkJICAgICAgICB1bnNpZ25lZCBwcmVmZXRjaCwKKwkJCQkJICAgICAgICB1bnNpZ25lZCBtaW5fcHJlZmV0Y2gsCisJCQkJCQl1bnNpZ25lZCBtYXhfcHJlZmV0Y2gpOworCisKKy8qKgorICogU2V0IHRoZSBqaXR0ZXIgYnVmZmVyIGRpc2NhcmQgYWxnb3JpdGhtLiBUaGUgZGVmYXVsdCBkaXNjYXJkIGFsZ29yaXRobSwKKyAqIHNldCBpbiBqaXR0ZXIgYnVmZmVyIGNyZWF0aW9uLCBpcyBQSk1FRElBX0pCX0RJU0NBUkRfUFJPR1JFU1NJVkUuCisgKgorICogQHBhcmFtIGpiCQlUaGUgaml0dGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBhbGdvCQlUaGUgZGlzY2FyZCBhbGdvcml0aG0gdG8gYmUgdXNlZC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfamJ1Zl9zZXRfZGlzY2FyZChwam1lZGlhX2pidWYgKmpiLAorCQkJCQkgICAgICBwam1lZGlhX2piX2Rpc2NhcmRfYWxnbyBhbGdvKTsKKworCisvKioKKyAqIERlc3Ryb3kgaml0dGVyIGJ1ZmZlciBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gamIJCVRoZSBqaXR0ZXIgYnVmZmVyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9qYnVmX2Rlc3Ryb3kocGptZWRpYV9qYnVmICpqYik7CisKKworLyoqCisgKiBSZXN0YXJ0IGppdHRlci4gVGhpcyBmdW5jdGlvbiBmbHVzaGVzIGFsbCBwYWNrZXRzIGluIHRoZSBidWZmZXIgYW5kCisgKiByZXNldCB0aGUgaW50ZXJuYWwgc2VxdWVuY2UgbnVtYmVyLgorICoKKyAqIEBwYXJhbSBqYgkJVGhlIGppdHRlciBidWZmZXIuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2pidWZfcmVzZXQocGptZWRpYV9qYnVmICpqYik7CisKKy8qKgorICogUHV0IGEgZnJhbWUgdG8gdGhlIGppdHRlciBidWZmZXIuIElmIHRoZSBmcmFtZSBjYW4gYmUgYWNjZXB0ZWQgKGJhc2VkCisgKiBvbiB0aGUgc2VxdWVuY2UgbnVtYmVyKSwgdGhlIGppdHRlciBidWZmZXIgd2lsbCBjb3B5IHRoZSBmcmFtZSBhbmQgcHV0CisgKiBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBBcHBsaWNhdGlvbiBNVVNUIG1hbmFnZSBpdCdzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiBtdWx0aXBsZSB0aHJlYWRzCisgKiBhcmUgYWNjZXNzaW5nIHRoZSBqaXR0ZXIgYnVmZmVyIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogQHBhcmFtIGpiCQlUaGUgaml0dGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBmcmFtZQkJUG9pbnRlciB0byBmcmFtZSBidWZmZXIgdG8gYmUgc3RvcmVkIGluIHRoZSBqaXR0ZXIKKyAqCQkJYnVmZmVyLgorICogQHBhcmFtIHNpemUJCVRoZSBmcmFtZSBzaXplLgorICogQHBhcmFtIGZyYW1lX3NlcQlUaGUgZnJhbWUgc2VxdWVuY2UgbnVtYmVyLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfamJ1Zl9wdXRfZnJhbWUoIHBqbWVkaWFfamJ1ZiAqamIsIAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmZyYW1lLCAKKwkJCQkgICAgICBwal9zaXplX3Qgc2l6ZSwgCisJCQkJICAgICAgaW50IGZyYW1lX3NlcSk7CisKKy8qKgorICogUHV0IGEgZnJhbWUgdG8gdGhlIGppdHRlciBidWZmZXIuIElmIHRoZSBmcmFtZSBjYW4gYmUgYWNjZXB0ZWQgKGJhc2VkCisgKiBvbiB0aGUgc2VxdWVuY2UgbnVtYmVyKSwgdGhlIGppdHRlciBidWZmZXIgd2lsbCBjb3B5IHRoZSBmcmFtZSBhbmQgcHV0CisgKiBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBBcHBsaWNhdGlvbiBNVVNUIG1hbmFnZSBpdCdzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiBtdWx0aXBsZSB0aHJlYWRzCisgKiBhcmUgYWNjZXNzaW5nIHRoZSBqaXR0ZXIgYnVmZmVyIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogQHBhcmFtIGpiCQlUaGUgaml0dGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBmcmFtZQkJUG9pbnRlciB0byBmcmFtZSBidWZmZXIgdG8gYmUgc3RvcmVkIGluIHRoZSBqaXR0ZXIKKyAqCQkJYnVmZmVyLgorICogQHBhcmFtIHNpemUJCVRoZSBmcmFtZSBzaXplLgorICogQHBhcmFtIGJpdF9pbmZvCUJpdCBwcmVjaXNlIGluZm8gb2YgdGhlIGZyYW1lLCBlLmc6IGEgZnJhbWUgbWF5IG5vdCAKKyAqCQkJZXhhY3RseSBzdGFydCBhbmQgZW5kIGF0IHRoZSBvY3RldCBib3VuZGFyeSwgc28gdGhpcworICoJCQlmaWVsZCBtYXkgYmUgdXNlZCBmb3Igc3BlY2lmeWluZyBzdGFydCAmIGVuZCBiaXQgb2Zmc2V0LgorICogQHBhcmFtIGZyYW1lX3NlcQlUaGUgZnJhbWUgc2VxdWVuY2UgbnVtYmVyLgorICogQHBhcmFtIGRpc2NhcmRlZAlGbGFnIHdoZXRoZXIgdGhlIGZyYW1lIGlzIGRpc2NhcmRlZCBieSBqaXR0ZXIgYnVmZmVyLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfamJ1Zl9wdXRfZnJhbWUyKCBwam1lZGlhX2pidWYgKmpiLCAKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZnJhbWUsIAorCQkJCSAgICAgICBwal9zaXplX3Qgc2l6ZSwgCisJCQkJICAgICAgIHBqX3VpbnQzMl90IGJpdF9pbmZvLAorCQkJCSAgICAgICBpbnQgZnJhbWVfc2VxLAorCQkJCSAgICAgICBwal9ib29sX3QgKmRpc2NhcmRlZCk7CisKKy8qKgorICogUHV0IGEgZnJhbWUgdG8gdGhlIGppdHRlciBidWZmZXIuIElmIHRoZSBmcmFtZSBjYW4gYmUgYWNjZXB0ZWQgKGJhc2VkCisgKiBvbiB0aGUgc2VxdWVuY2UgbnVtYmVyKSwgdGhlIGppdHRlciBidWZmZXIgd2lsbCBjb3B5IHRoZSBmcmFtZSBhbmQgcHV0CisgKiBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBBcHBsaWNhdGlvbiBNVVNUIG1hbmFnZSBpdCdzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiBtdWx0aXBsZSB0aHJlYWRzCisgKiBhcmUgYWNjZXNzaW5nIHRoZSBqaXR0ZXIgYnVmZmVyIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogQHBhcmFtIGpiCQlUaGUgaml0dGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBmcmFtZQkJUG9pbnRlciB0byBmcmFtZSBidWZmZXIgdG8gYmUgc3RvcmVkIGluIHRoZSBqaXR0ZXIKKyAqCQkJYnVmZmVyLgorICogQHBhcmFtIHNpemUJCVRoZSBmcmFtZSBzaXplLgorICogQHBhcmFtIGJpdF9pbmZvCUJpdCBwcmVjaXNlIGluZm8gb2YgdGhlIGZyYW1lLCBlLmc6IGEgZnJhbWUgbWF5IG5vdCAKKyAqCQkJZXhhY3RseSBzdGFydCBhbmQgZW5kIGF0IHRoZSBvY3RldCBib3VuZGFyeSwgc28gdGhpcworICoJCQlmaWVsZCBtYXkgYmUgdXNlZCBmb3Igc3BlY2lmeWluZyBzdGFydCAmIGVuZCBiaXQgb2Zmc2V0LgorICogQHBhcmFtIGZyYW1lX3NlcQlUaGUgZnJhbWUgc2VxdWVuY2UgbnVtYmVyLgorICogQHBhcmFtIGZyYW1lX3RzCVRoZSBmcmFtZSB0aW1lc3RhbXAuCisgKiBAcGFyYW0gZGlzY2FyZGVkCUZsYWcgd2hldGhlciB0aGUgZnJhbWUgaXMgZGlzY2FyZGVkIGJ5IGppdHRlciBidWZmZXIuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9qYnVmX3B1dF9mcmFtZTMoIHBqbWVkaWFfamJ1ZiAqamIsIAorCQkJCSAgICAgICBjb25zdCB2b2lkICpmcmFtZSwgCisJCQkJICAgICAgIHBqX3NpemVfdCBzaXplLCAKKwkJCQkgICAgICAgcGpfdWludDMyX3QgYml0X2luZm8sCisJCQkJICAgICAgIGludCBmcmFtZV9zZXEsCisJCQkJICAgICAgIHBqX3VpbnQzMl90IGZyYW1lX3RzLAorCQkJCSAgICAgICBwal9ib29sX3QgKmRpc2NhcmRlZCk7CisvKioKKyAqIEdldCBhIGZyYW1lIGZyb20gdGhlIGppdHRlciBidWZmZXIuIFRoZSBqaXR0ZXIgYnVmZmVyIHdpbGwgcmV0dXJuIHRoZQorICogb2xkZXN0IGZyYW1lIGZyb20gaXQncyBidWZmZXIsIHdoZW4gaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEFwcGxpY2F0aW9uIE1VU1QgbWFuYWdlIGl0J3Mgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIG11bHRpcGxlIHRocmVhZHMKKyAqIGFyZSBhY2Nlc3NpbmcgdGhlIGppdHRlciBidWZmZXIgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBAcGFyYW0gamIJCVRoZSBqaXR0ZXIgYnVmZmVyLgorICogQHBhcmFtIGZyYW1lCQlCdWZmZXIgdG8gcmVjZWl2ZSB0aGUgcGF5bG9hZCBmcm9tIHRoZSBqaXR0ZXIgYnVmZmVyLgorICoJCQlBcHBsaWNhdGlvbiBNVVNUIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWZmZXIgaGFzCisgKgkJCWFwcHJvcHJpYXRlIHNpemUgKGkuZS4gbm90IGxlc3MgdGhhbiB0aGUgZnJhbWUgc2l6ZSwKKyAqCQkJYXMgc3BlY2lmaWVkIHdoZW4gdGhlIGppdHRlciBidWZmZXIgd2FzIGNyZWF0ZWQpLgorICoJCQlUaGUgaml0dGVyIGJ1ZmZlciBvbmx5IGNvcGllZCBhIGZyYW1lIHRvIHRoaXMgCisgKgkJCWJ1ZmZlciB3aGVuIHRoZSBmcmFtZSB0eXBlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24KKyAqCQkJaXMgUEpNRURJQV9KQl9OT1JNQUxfRlJBTUUuCisgKiBAcGFyYW0gcF9mcm1fdHlwZQlQb2ludGVyIHRvIHJlY2VpdmUgZnJhbWUgdHlwZS4gSWYgaml0dGVyIGJ1ZmZlciBpcworICoJCQljdXJyZW50bHkgZW1wdHkgb3IgYnVmZmVycmluZywgdGhlIGZyYW1lIHR5cGUgd2lsbAorICoJCQliZSBzZXQgdG8gUEpNRURJQV9KQl9aRVJPX0ZSQU1FLCBhbmQgbm8gZnJhbWUgd2lsbAorICoJCQliZSBjb3BpZWQuIElmIHRoZSBqaXR0ZXIgYnVmZmVyIGRldGVjdHMgdGhhdCBmcmFtZSBpcworICoJCQltaXNzaW5nIHdpdGggY3VycmVudCBzZXF1ZW5jZSBudW1iZXIsIHRoZSBmcmFtZSB0eXBlCisgKgkJCXdpbGwgYmUgc2V0IHRvIFBKTUVESUFfSkJfTUlTU0lOR19GUkFNRSwgYW5kIG5vCisgKgkJCWZyYW1lIHdpbGwgYmUgY29waWVkLiBJZiB0aGVyZSBpcyBhIGZyYW1lLCB0aGUgaml0dGVyCisgKgkJCWJ1ZmZlciB3aWxsIGNvcHkgdGhlIGZyYW1lIHRvIHRoZSBidWZmZXIsIGFuZCBmcmFtZQorICoJCQl0eXBlIHdpbGwgYmUgc2V0IHRvIFBKTUVESUFfSkJfTk9STUFMX0ZSQU1FLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfamJ1Zl9nZXRfZnJhbWUoIHBqbWVkaWFfamJ1ZiAqamIsIAorCQkJCSAgICAgIHZvaWQgKmZyYW1lLCAKKwkJCQkgICAgICBjaGFyICpwX2ZybV90eXBlKTsKKworLyoqCisgKiBHZXQgYSBmcmFtZSBmcm9tIHRoZSBqaXR0ZXIgYnVmZmVyLiBUaGUgaml0dGVyIGJ1ZmZlciB3aWxsIHJldHVybiB0aGUKKyAqIG9sZGVzdCBmcmFtZSBmcm9tIGl0J3MgYnVmZmVyLCB3aGVuIGl0IGlzIGF2YWlsYWJsZS4KKyAqCisgKiBAcGFyYW0gamIJCVRoZSBqaXR0ZXIgYnVmZmVyLgorICogQHBhcmFtIGZyYW1lCQlCdWZmZXIgdG8gcmVjZWl2ZSB0aGUgcGF5bG9hZCBmcm9tIHRoZSBqaXR0ZXIgYnVmZmVyLgorICoJCQlAc2VlIHBqbWVkaWFfamJ1Zl9nZXRfZnJhbWUoKS4gICAgCisgKiBAcGFyYW0gc2l6ZQkJUG9pbnRlciB0byByZWNlaXZlIGZyYW1lIHNpemUuCisgKiBAcGFyYW0gcF9mcm1fdHlwZQlQb2ludGVyIHRvIHJlY2VpdmUgZnJhbWUgdHlwZS4KKyAqCQkJQHNlZSBwam1lZGlhX2pidWZfZ2V0X2ZyYW1lKCkuICAgIAorICogQHBhcmFtIGJpdF9pbmZvCUJpdCBwcmVjaXNlIGluZm8gb2YgdGhlIGZyYW1lLCBlLmc6IGEgZnJhbWUgbWF5IG5vdCAKKyAqCQkJZXhhY3RseSBzdGFydCBhbmQgZW5kIGF0IHRoZSBvY3RldCBib3VuZGFyeSwgc28gdGhpcworICoJCQlmaWVsZCBtYXkgYmUgdXNlZCBmb3Igc3BlY2lmeWluZyBzdGFydCAmIGVuZCBiaXQgb2Zmc2V0LgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfamJ1Zl9nZXRfZnJhbWUyKHBqbWVkaWFfamJ1ZiAqamIsIAorCQkJCSAgICAgIHZvaWQgKmZyYW1lLCAKKwkJCQkgICAgICBwal9zaXplX3QgKnNpemUsIAorCQkJCSAgICAgIGNoYXIgKnBfZnJtX3R5cGUsCisJCQkJICAgICAgcGpfdWludDMyX3QgKmJpdF9pbmZvKTsKKworCisvKioKKyAqIEdldCBhIGZyYW1lIGZyb20gdGhlIGppdHRlciBidWZmZXIuIFRoZSBqaXR0ZXIgYnVmZmVyIHdpbGwgcmV0dXJuIHRoZQorICogb2xkZXN0IGZyYW1lIGZyb20gaXQncyBidWZmZXIsIHdoZW4gaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSBqYgkJVGhlIGppdHRlciBidWZmZXIuCisgKiBAcGFyYW0gZnJhbWUJCUJ1ZmZlciB0byByZWNlaXZlIHRoZSBwYXlsb2FkIGZyb20gdGhlIGppdHRlciBidWZmZXIuCisgKgkJCUBzZWUgcGptZWRpYV9qYnVmX2dldF9mcmFtZSgpLiAgICAKKyAqIEBwYXJhbSBzaXplCQlQb2ludGVyIHRvIHJlY2VpdmUgZnJhbWUgc2l6ZS4KKyAqIEBwYXJhbSBwX2ZybV90eXBlCVBvaW50ZXIgdG8gcmVjZWl2ZSBmcmFtZSB0eXBlLgorICoJCQlAc2VlIHBqbWVkaWFfamJ1Zl9nZXRfZnJhbWUoKS4gICAgCisgKiBAcGFyYW0gYml0X2luZm8JQml0IHByZWNpc2UgaW5mbyBvZiB0aGUgZnJhbWUsIGUuZzogYSBmcmFtZSBtYXkgbm90IAorICoJCQlleGFjdGx5IHN0YXJ0IGFuZCBlbmQgYXQgdGhlIG9jdGV0IGJvdW5kYXJ5LCBzbyB0aGlzCisgKgkJCWZpZWxkIG1heSBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHN0YXJ0ICYgZW5kIGJpdCBvZmZzZXQuCisgKiBAcGFyYW0gdHMJCUZyYW1lIHRpbWVzdGFtcC4KKyAqIEBwYXJhbSBzZXEJCUZyYW1lIHNlcXVlbmNlIG51bWJlci4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX2pidWZfZ2V0X2ZyYW1lMyhwam1lZGlhX2pidWYgKmpiLCAKKwkJCQkgICAgICB2b2lkICpmcmFtZSwgCisJCQkJICAgICAgcGpfc2l6ZV90ICpzaXplLCAKKwkJCQkgICAgICBjaGFyICpwX2ZybV90eXBlLAorCQkJCSAgICAgIHBqX3VpbnQzMl90ICpiaXRfaW5mbywKKwkJCQkgICAgICBwal91aW50MzJfdCAqdHMsCisJCQkJICAgICAgaW50ICpzZXEpOworCisKKy8qKgorICogUGVlayBhIGZyYW1lIGZyb20gdGhlIGppdHRlciBidWZmZXIuIFRoZSBqaXR0ZXIgYnVmZmVyIHN0YXRlIHdpbGwgbm90IGJlCisgKiBtb2RpZmllZC4KKyAqCisgKiBAcGFyYW0gamIJCVRoZSBqaXR0ZXIgYnVmZmVyLgorICogQHBhcmFtIG9mZnNldAlPZmZzZXQgZnJvbSB0aGUgb2xkZXN0IGZyYW1lIHRvIGJlIHBlZWtlZC4KKyAqIEBwYXJhbSBmcmFtZQkJQnVmZmVyIHRvIHJlY2VpdmUgdGhlIHBheWxvYWQgZnJvbSB0aGUgaml0dGVyIGJ1ZmZlci4KKyAqCQkJQHNlZSBwam1lZGlhX2pidWZfZ2V0X2ZyYW1lKCkuICAgIAorICogQHBhcmFtIHNpemUJCVBvaW50ZXIgdG8gcmVjZWl2ZSBmcmFtZSBzaXplLgorICogQHBhcmFtIHBfZnJtX3R5cGUJUG9pbnRlciB0byByZWNlaXZlIGZyYW1lIHR5cGUuCisgKgkJCUBzZWUgcGptZWRpYV9qYnVmX2dldF9mcmFtZSgpLiAgICAKKyAqIEBwYXJhbSBiaXRfaW5mbwlCaXQgcHJlY2lzZSBpbmZvIG9mIHRoZSBmcmFtZSwgZS5nOiBhIGZyYW1lIG1heSBub3QgCisgKgkJCWV4YWN0bHkgc3RhcnQgYW5kIGVuZCBhdCB0aGUgb2N0ZXQgYm91bmRhcnksIHNvIHRoaXMKKyAqCQkJZmllbGQgbWF5IGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgc3RhcnQgJiBlbmQgYml0IG9mZnNldC4KKyAqIEBwYXJhbSB0cwkJRnJhbWUgdGltZXN0YW1wLgorICogQHBhcmFtIHNlcQkJRnJhbWUgc2VxdWVuY2UgbnVtYmVyLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfamJ1Zl9wZWVrX2ZyYW1lKHBqbWVkaWFfamJ1ZiAqamIsCisJCQkJICAgICAgdW5zaWduZWQgb2Zmc2V0LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKipmcmFtZSwgCisJCQkJICAgICAgcGpfc2l6ZV90ICpzaXplLCAKKwkJCQkgICAgICBjaGFyICpwX2ZybV90eXBlLAorCQkJCSAgICAgIHBqX3VpbnQzMl90ICpiaXRfaW5mbywKKwkJCQkgICAgICBwal91aW50MzJfdCAqdHMsCisJCQkJICAgICAgaW50ICpzZXEpOworCisKKy8qKgorICogUmVtb3ZlIGZyYW1lcyBmcm9tIHRoZSBqaXR0ZXIgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBqYgkJVGhlIGppdHRlciBidWZmZXIuCisgKiBAcGFyYW0gZnJhbWVfY250CU51bWJlciBvZiBmcmFtZXMgdG8gYmUgcmVtb3ZlZC4KKyAqCisgKiBAcmV0dXJuCQlUaGUgbnVtYmVyIG9mIGZyYW1lIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgorICovCitQSl9ERUNMKHVuc2lnbmVkKSBwam1lZGlhX2pidWZfcmVtb3ZlX2ZyYW1lKHBqbWVkaWFfamJ1ZiAqamIsIAorCQkJCQkgICAgdW5zaWduZWQgZnJhbWVfY250KTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgaml0dGVyIGJ1ZmZlciBpcyBmdWxsLgorICoKKyAqIEBwYXJhbSBqYgkJVGhlIGppdHRlciBidWZmZXIuCisgKgorICogQHJldHVybgkJUEpfVFJVRSBpZiBpdCBpcyBmdWxsLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV9qYnVmX2lzX2Z1bGwoY29uc3QgcGptZWRpYV9qYnVmICpqYik7CisKKworLyoqCisgKiBHZXQgaml0dGVyIGJ1ZmZlciBjdXJyZW50IHN0YXRlL3NldHRpbmdzLgorICoKKyAqIEBwYXJhbSBqYgkJVGhlIGppdHRlciBidWZmZXIuCisgKiBAcGFyYW0gc3RhdGUJCUJ1ZmZlciB0byByZWNlaXZlIGppdHRlciBidWZmZXIgc3RhdGUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2pidWZfZ2V0X3N0YXRlKCBjb25zdCBwam1lZGlhX2pidWYgKmpiLAorCQkJCQkgICAgIHBqbWVkaWFfamJfc3RhdGUgKnN0YXRlICk7CisKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9KQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbWFzdGVyX3BvcnQuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21hc3Rlcl9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiODliOQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21hc3Rlcl9wb3J0LmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qICRJZDogbWFzdGVyX3BvcnQuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfTUFTVEVSX1BPUlRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9NQVNURVJfUE9SVF9IX18KKworCisvKioKKyAqIEBmaWxlIG1hc3Rlcl9wb3J0LmgKKyAqIEBicmllZiBNYXN0ZXIgcG9ydC4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvcG9ydC5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX01BU1RFUl9QT1JUIE1hc3RlciBQb3J0CisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlRfQ0xPQ0sKKyAqIEBicmllZiBUaHJlYWQgYmFzZWQgbWVkaWEgY2xvY2sgcHJvdmlkZXIKKyAqIEB7CisgKgorICogQSBtYXN0ZXIgcG9ydCBoYXMgdHdvIG1lZGlhIHBvcnRzIGNvbm5lY3RlZCB0byBpdCwgYW5kIGJ5IGNvbnZlbnRpb24KKyAqIHRoYXkgYXJlIGNhbGxlZCBkb3duc3RyZWFtIGFuZCB1cHN0cmVhbSBwb3J0cy4gVGhlIG1lZGlhIHN0cmVhbSBmbG93aW5nIHRvCisgKiB0aGUgZG93bnN0cmVhbSBwb3J0IGlzIGNhbGxlZCBlbmNvZGluZyBvciBzZW5kIGRpcmVjdGlvbiwgYW5kIG1lZGlhIHN0cmVhbSAKKyAqIGZsb3dpbmcgdG8gdGhlIHVwc3RyZWFtIHBvcnQgaXMgY2FsbGVkIGRlY29kaW5nIG9yIHJlY2VpdmUgZGlyZWN0aW9uCisgKiAoaW1hZ2luZSB0aGUgZG93bnN0cmVhbSBhcyBzdHJlYW0gdG8gcmVtb3RlIGVuZHBvaW50LCBhbmQgdXBzdHJlYW0gYXMKKyAqIGxvY2FsIG1lZGlhIHBvcnQ7IG1lZGlhIGZsb3dpbmcgdG8gcmVtb3RlIGVuZHBvaW50IChkb3duc3RyZWFtKSB3aWxsIG5lZWQKKyAqIHRvIGJlIGVuY29kZWQgYmVmb3JlIGl0IGlzIHRyYW5zbWl0dGVkIHRvIHJlbW90ZSBlbmRwb2ludCkuCisgKgorICogQSBtYXN0ZXIgcG9ydCBpbnRlcm5hbGx5IGhhcyBhbiBpbnN0YW5jZSBvZiBAcmVmIFBKTUVESUFfQ0xPQ0ssIHdoaWNoCisgKiBwcm92aWRlcyB0aGUgZXNzZW5zaWFsIHRpbWluZyBmb3IgdGhlIG1hc3RlciBwb3J0LiBUaGUgQHJlZiBQSk1FRElBX0NMT0NLCisgKiBydW5zIGFzeW5jaHJvbm91c2x5LCBhbmQgd2hlbmV2ZXIgYSBjbG9jayA8Yj50aWNrPC9iPiBleHBpcmVzLCBhIGNhbGxiYWNrCisgKiB3aWxsIGJlIGNhbGxlZCwgYW5kIHRoZSBtYXN0ZXIgcG9ydCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRhc2tzOgorICogIC0gaXQgY2FsbHMgPGI+PHR0PmdldF9mcmFtZSgpPC90dD48L2I+IGZyb20gdGhlIGRvd25zdHJlYW0gcG9ydCwKKyAqICAgIHdoZW4gZ2l2ZSB0aGUgZnJhbWUgdG8gdGhlIHVwc3RyZWFtIHBvcnQgYnkgY2FsbGluZyA8Yj48dHQ+cHV0X2ZyYW1lCisgKiAgICA8L3R0PjwvYj4gdG8gdGhlIHVwc3RyZWFtIHBvcnQsIGFuZAorICogIC0gcGVyZm9ybXMgdGhlIHNhbWUgdGFzaywgYnV0IG9uIHRoZSByZXZlcnNlIGRpcmVjdGlvbiAoaS5lLiBnZXQgdGhlIHN0cmVhbQorICogICAgZnJvbSB1cHN0cmVhbSBwb3J0IGFuZCBnaXZlIGl0IHRvIHRoZSBkb3duc3RyZWFtIHBvcnQpLgorICoKKyAqIEJlY2F1c2UgbWFzdGVyIHBvcnQgZW5hYmxlcyBtZWRpYSBzdHJlYW0gdG8gZmxvdyBhdXRvbWF0aWNhbGx5LCBpdCBpcworICogc2FpZCB0aGF0IHRoZSBtYXN0ZXIgcG9ydCBzdXBwbGllcyBAcmVmIFBKTUVESUFfUE9SVF9DTE9DSyB0byB0aGUgCisgKiBtZWRpYSBwb3J0cyBpbnRlcmNvbm5lY3Rpb24uCisgKgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBmb3IgbWFzdGVyIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfbWFzdGVyX3BvcnQgcGptZWRpYV9tYXN0ZXJfcG9ydDsKKworCisvKioKKyAqIENyZWF0ZSBhIG1hc3RlciBwb3J0LgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1hc3RlciBwb3J0IGZyb20uCisgKiBAcGFyYW0gdV9wb3J0CVVwc3RyZWFtIHBvcnQuCisgKiBAcGFyYW0gZF9wb3J0CURvd25zdHJlYW0gcG9ydC4KKyAqIEBwYXJhbSBvcHRpb25zCU9wdGlvbnMgZmxhZ3MsIGZyb20gYml0bWFzayBjb21iaW5hdGlvbnMgZnJvbQorICoJCQlwam1lZGlhX2Nsb2NrX29wdGlvbnMuCisgKiBAcGFyYW0gcF9tCQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIG1hc3RlciBwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9tYXN0ZXJfcG9ydF9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkJcGptZWRpYV9wb3J0ICp1X3BvcnQsCisJCQkJCQlwam1lZGlhX3BvcnQgKmRfcG9ydCwKKwkJCQkJCXVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCQlwam1lZGlhX21hc3Rlcl9wb3J0ICoqcF9tKTsKKworCisvKioKKyAqIFN0YXJ0IHRoZSBtZWRpYSBmbG93LgorICoKKyAqIEBwYXJhbSBtCQlUaGUgbWFzdGVyIHBvcnQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX21hc3Rlcl9wb3J0X3N0YXJ0KHBqbWVkaWFfbWFzdGVyX3BvcnQgKm0pOworCisKKy8qKgorICogU3RvcCB0aGUgbWVkaWEgZmxvdy4KKyAqCisgKiBAcGFyYW0gbQkJVGhlIG1hc3RlciBwb3J0LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9tYXN0ZXJfcG9ydF9zdG9wKHBqbWVkaWFfbWFzdGVyX3BvcnQgKm0pOworCisKKy8qKgorICogUG9sbCB0aGUgbWFzdGVyIHBvcnQgY2xvY2sgYW5kIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIGNsb2NrIHRpY2sgaGFzCisgKiBlbGFwc2VkLiBUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IHZhbGlkIGlmIHRoZSBtYXN0ZXIgcG9ydCBpcyBjcmVhdGVkIHdpdGgKKyAqICNQSk1FRElBX0NMT0NLX05PX0FTWU5DIGZsYWcuCisgKgorICogQHBhcmFtIG0JCSAgICBUaGUgbWFzdGVyIHBvcnQuCisgKiBAcGFyYW0gd2FpdAkJICAgIElmIG5vbi16ZXJvLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKgkJCSAgICBhIGNsb2NrIHRpY2sgZWxhcHNlZCBhbmQgY2FsbGJhY2sgaGFzIGJlZW4gY2FsbGVkLgorICogQHBhcmFtIHRzCQkgICAgT3B0aW9uYWwgYXJndW1lbnQgdG8gcmVjZWl2ZSB0aGUgY3VycmVudCAKKyAqCQkJICAgIHRpbWVzdGFtcC4KKyAqCisgKiBAcmV0dXJuCQkgICAgTm9uLXplcm8gaWYgY2xvY2sgdGljayBoYXMgZWxhcHNlZCwgb3IgRkFMU0UgaWYKKyAqCQkJICAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIGJlZm9yZSBhIGNsb2NrIHRpY2sgaGFzCisgKgkJCSAgICBlbGFwc2VkLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV9tYXN0ZXJfcG9ydF93YWl0KHBqbWVkaWFfbWFzdGVyX3BvcnQgKm0sCisJCQkJCSAgICBwal9ib29sX3Qgd2FpdCwKKwkJCQkJICAgIHBqX3RpbWVzdGFtcCAqdHMpOworCisKKy8qKgorICogQ2hhbmdlIHRoZSB1cHN0cmVhbSBwb3J0LiBOb3RlIHRoYXQgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgdG8gZGVzdHJveQorICogY3VycmVudCB1cHN0cmVhbSBwb3J0ICh0aGUgb25lIHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUKKyAqIG5ldyBwb3J0KS4KKyAqCisgKiBAcGFyYW0gbQkJVGhlIG1hc3RlciBwb3J0LgorICogQHBhcmFtIHBvcnQJCVBvcnQgdG8gYmUgdXNlZCBmb3IgdXBzdHJlYW0gcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfbWFzdGVyX3BvcnRfc2V0X3Vwb3J0KHBqbWVkaWFfbWFzdGVyX3BvcnQgKm0sCisJCQkJCQkgICBwam1lZGlhX3BvcnQgKnBvcnQpOworCisKKy8qKgorICogR2V0IHRoZSB1cHN0cmVhbSBwb3J0LgorICoKKyAqIEBwYXJhbSBtCQlUaGUgbWFzdGVyIHBvcnQuCisgKgorICogQHJldHVybgkJVGhlIHVwc3RyZWFtIHBvcnQuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9wb3J0KikgcGptZWRpYV9tYXN0ZXJfcG9ydF9nZXRfdXBvcnQocGptZWRpYV9tYXN0ZXJfcG9ydCptKTsKKworCisvKioKKyAqIENoYW5nZSB0aGUgZG93bnN0cmVhbSBwb3J0LiBOb3RlIHRoYXQgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgdG8gZGVzdHJveQorICogY3VycmVudCBkb3duc3RyZWFtIHBvcnQgKHRoZSBvbmUgdGhhdCBpcyBnb2luZyB0byBiZSByZXBsYWNlZCB3aXRoIHRoZQorICogbmV3IHBvcnQpLgorICoKKyAqIEBwYXJhbSBtCQlUaGUgbWFzdGVyIHBvcnQuCisgKiBAcGFyYW0gcG9ydAkJUG9ydCB0byBiZSB1c2VkIGZvciBkb3duc3RyZWFtIHBvcnQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX21hc3Rlcl9wb3J0X3NldF9kcG9ydChwam1lZGlhX21hc3Rlcl9wb3J0ICptLAorCQkJCQkJICAgcGptZWRpYV9wb3J0ICpwb3J0KTsKKworCisvKioKKyAqIEdldCB0aGUgZG93bnN0cmVhbSBwb3J0LgorICoKKyAqIEBwYXJhbSBtCQlUaGUgbWFzdGVyIHBvcnQuCisgKgorICogQHJldHVybgkJVGhlIGRvd25zdHJlYW0gcG9ydC4KKyAqLworUEpfREVDTChwam1lZGlhX3BvcnQqKSBwam1lZGlhX21hc3Rlcl9wb3J0X2dldF9kcG9ydChwam1lZGlhX21hc3Rlcl9wb3J0Km0pOworCisKKy8qKgorICogRGVzdHJveSB0aGUgbWFzdGVyIHBvcnQsIGFuZCBvcHRpb25hbGx5IGRlc3Ryb3kgdGhlIHVwc3RyZWFtIGFuZCAKKyAqIGRvd25zdHJlYW0gcG9ydHMuCisgKgorICogQHBhcmFtIG0JCVRoZSBtYXN0ZXIgcG9ydC4KKyAqIEBwYXJhbSBkZXN0cm95X3BvcnRzCUlmIG5vbi16ZXJvLCB0aGUgZnVuY3Rpb24gd2lsbCBkZXN0cm95IGJvdGgKKyAqCQkJdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gcG9ydHMgdG9vLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9tYXN0ZXJfcG9ydF9kZXN0cm95KHBqbWVkaWFfbWFzdGVyX3BvcnQgKm0sCisJCQkJCQkgcGpfYm9vbF90IGRlc3Ryb3lfcG9ydHMpOworCisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9NQVNURVJfUE9SVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvbWVtX3BvcnQuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21lbV9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0NTUwNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL21lbV9wb3J0LmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qICRJZDogbWVtX3BvcnQuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfTUVNX1BPUlRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9NRU1fUE9SVF9IX18KKworLyoqCisgKiBAZmlsZSBtZW1fcG9ydC5oCisgKiBAYnJpZWYgTWVtb3J5IGJhc2VkIG1lZGlhIHBsYXliYWNrL2NhcHR1cmUgcG9ydAorICovCisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX01FTV9QTEFZRVIgTWVtb3J5L0J1ZmZlci1iYXNlZCBQbGF5YmFjayBQb3J0CisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBNZWRpYSBwbGF5YmFjayBmcm9tIGEgZml4ZWQgc2l6ZSBtZW1vcnkgYnVmZmVyCisgKiBAeworICoKKyAqIEEgbWVtb3J5L2J1ZmZlciBiYXNlZCBwbGF5YmFjayBwb3J0IGlzIHVzZWQgdG8gcGxheSBtZWRpYSBmcm9tIGEgZml4ZWQKKyAqIHNpemUgYnVmZmVyLiBUaGlzIGlzIHVzZWZ1bCBvdmVyIEByZWYgUEpNRURJQV9GSUxFX1BMQVkgZm9yIAorICogc2l0dWF0aW9uIHdoZXJlIGZpbGVzeXN0ZW1zIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSB0YXJnZXQgc3lzdGVtLgorICovCisKKworLyoqCisgKiBNZW1vcnkgcGxheWVyIG9wdGlvbnMuCisgKi8KK2VudW0gcGptZWRpYV9tZW1fcGxheWVyX29wdGlvbgoreworICAgIC8qKgorICAgICAqIFRlbGwgdGhlIG1lbW9yeSBwbGF5ZXIgdG8gcmV0dXJuIE5VTEwgZnJhbWUgd2hlbiB0aGUgd2hvbGUKKyAgICAgKiBidWZmZXIgaGFzIGJlZW4gcGxheWVkIGluc3RlYWQgb2YgcmV3aW5kaW5nIHRoZSBidWZmZXIgYmFjaworICAgICAqIHRvIHN0YXJ0IHBvc2l0aW9uLgorICAgICAqLworICAgIFBKTUVESUFfTUVNX05PX0xPT1AgPSAxCit9OworCisKKy8qKgorICogQ3JlYXRlIHRoZSBidWZmZXIgYmFzZWQgcGxheWJhY2sgdG8gcGxheSB0aGUgbWVkaWEgZnJvbSB0aGUgc3BlY2lmaWVkCisgKiBidWZmZXIuCisgKgorICogQHBhcmFtIHBvb2wJCSAgICBQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvcnQgc3RydWN0dXJlLgorICogQHBhcmFtIGJ1ZmZlcgkgICAgVGhlIGJ1ZmZlciB0byBwbGF5IHRoZSBtZWRpYSBmcm9tLCB3aGljaCBzaG91bGQKKyAqCQkJICAgIGJlIGF2YWlsYWJsZSB0aHJvdWdob3V0IHRoZSBsaWZlIHRpbWUgb2YgdGhlIHBvcnQuCisgKgkJCSAgICBUaGUgcGxheWVyIHBsYXlzIHRoZSBtZWRpYSBkaXJlY3RseSBmcm9tIHRoaXMKKyAqCQkJICAgIGJ1ZmZlciAoaS5lLiBubyBjb3B5aW5nIGlzIGRvbmUpLgorICogQHBhcmFtIHNpemUJCSAgICBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCBpbiBieXRlcy4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBTYW1wbGluZyByYXRlLgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIE51bWJlciBvZiBjaGFubmVscy4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gYml0c19wZXJfc2FtcGxlICAgTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZS4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb24gZmxhZ3MsIHNlZSAjcGptZWRpYV9tZW1fcGxheWVyX29wdGlvbgorICogQHBhcmFtIHBfcG9ydAkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQkgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9tZW1fcGxheWVyX2NyZWF0ZShwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpidWZmZXIsCisJCQkJCSAgICAgICBwal9zaXplX3Qgc2l6ZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCSAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkgICAgICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJCSAgICAgICB1bnNpZ25lZCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCSAgICAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgICAgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0ICk7CisKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgcmVhZGluZyBoYXMgcmVhY2hlZCB0aGUKKyAqIGVuZCBvZiBidWZmZXIuIElmIHRoZSBwbGF5ZXIgaXMgc2V0IHRvIHBsYXkgcmVwZWF0ZWRseSwgdGhlbiB0aGUgY2FsbGJhY2sKKyAqIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBOb3RlIHRoYXQgb25seSBvbmUgY2FsbGJhY2sgY2FuIGJlIAorICogcmVnaXN0ZXJlZCBmb3IgZWFjaCBwbGF5ZXIgcG9ydC4KKyAqCisgKiBAcGFyYW0gcG9ydAkJVGhlIG1lbW9yeSBwbGF5ZXIgcG9ydC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJVXNlciBkYXRhIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbGJhY2sKKyAqIEBwYXJhbSBjYgkJQ2FsbGJhY2sgdG8gYmUgY2FsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24tCisgKgkJCVBKX1NVQ0NFU1MsIHRoZSBwbGF5YmFjayB3aWxsIHN0b3AuIE5vdGUgdGhhdCBpZgorICoJCQlhcHBsaWNhdGlvbiBkZXN0cm95cyB0aGUgcGxheWVyIHBvcnQgaW4gdGhlIGNhbGxiYWNrLAorICoJCQlpdCBtdXN0IHJldHVybiBub24tUEpfU1VDQ0VTUyBoZXJlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX21lbV9wbGF5ZXJfc2V0X2VvZl9jYiggcGptZWRpYV9wb3J0ICpwb3J0LAorCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgICBwal9zdGF0dXNfdCAoKmNiKShwam1lZGlhX3BvcnQgKnBvcnQsCisJCQkJCQkgdm9pZCAqdXNyX2RhdGEpKTsKKworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9NRU1fQ0FQVFVSRSBNZW1vcnkvQnVmZmVyLWJhc2VkIENhcHR1cmUgUG9ydAorICogQGluZ3JvdXAgUEpNRURJQV9QT1JUCisgKiBAYnJpZWYgTWVkaWEgY2FwdHVyZSB0byBmaXhlZCBzaXplIG1lbW9yeSBidWZmZXIKKyAqIEB7CisgKgorICogQSBtZW1vcnkgYmFzZWQgY2FwdHVyZSBpcyB1c2VkIHRvIHNhdmUgbWVkaWEgc3RyZWFtcyB0byBhIGZpeGVkIHNpemUKKyAqIGJ1ZmZlci4gVGhpcyBpcyB1c2VmdWwgb3ZlciBAcmVmIFBKTUVESUFfRklMRV9SRUMgZm9yIAorICogc2l0dWF0aW9uIHdoZXJlIGZpbGVzeXN0ZW1zIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSB0YXJnZXQgc3lzdGVtLgorICovCisKKy8qKgorICogQ3JlYXRlIG1lZGlhIHBvcnQgdG8gY2FwdHVyZS9yZWNvcmQgbWVkaWEgaW50byBhIGZpeGVkIHNpemUgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwb29sCQkgICAgUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3J0IHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBidWZmZXIJICAgIFRoZSBidWZmZXIgdG8gcmVjb3JkIHRoZSBtZWRpYSB0bywgd2hpY2ggc2hvdWxkCisgKgkJCSAgICBiZSBhdmFpbGFibGUgdGhyb3VnaG91dCB0aGUgbGlmZSB0aW1lIG9mIHRoZSBwb3J0LgorICogQHBhcmFtIHNpemUJCSAgICBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBidWZmZXIsIGluIGJ5dGVzLgorICogQHBhcmFtIGNsb2NrX3JhdGUJICAgIFNhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkgICAgTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE9wdGlvbiBmbGFncy4KKyAqIEBwYXJhbSBwX3BvcnQJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfbWVtX2NhcHR1cmVfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCXZvaWQgKmJ1ZmZlciwKKwkJCQkJCXBqX3NpemVfdCBzaXplLAorCQkJCQkJdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJCXVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCQl1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJCXVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCXVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCQlwam1lZGlhX3BvcnQgKipwX3BvcnQpOworCisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBubyBzcGFjZSBsZWZ0IGluIHRoZSBidWZmZXIuCisgKiBOb3RlIHRoYXQgd2hlbiBhIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBhbHNvIGJlCisgKiBjYWxsZWQgd2hlbiBhcHBsaWNhdGlvbiBkZXN0cm95cyB0aGUgcG9ydCBhbmQgdGhlIGNhbGxiYWNrIGhhcyBub3QgCisgKiBiZWVuIGNhbGxlZCBiZWZvcmUuCisgKgorICogQHBhcmFtIHBvcnQJCVRoZSBtZW1vcnkgcmVjb3JkZXIgcG9ydC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJVXNlciBkYXRhIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbGJhY2sKKyAqIEBwYXJhbSBjYgkJQ2FsbGJhY2sgdG8gYmUgY2FsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24tCisgKgkJCVBKX1NVQ0NFU1MsIHRoZSByZWNvcmRpbmcgd2lsbCBzdG9wLiBJbiBvdGhlciBjYXNlcworICogICAgICAgICAgICAgICAgICAgICAgcmVjb3JkaW5nIHdpbGwgYmUgcmVzdGFydGVkIGFuZCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgCisgKgkJCWJ1ZmZlci4gTm90ZSB0aGF0IGlmIGFwcGxpY2F0aW9uIGRlc3Ryb3lzIHRoZSBjYXB0dXJlCisgKgkJCXBvcnQgaW4gdGhlIGNhbGxiYWNrLCBpdCBtdXN0IHJldHVybiBub24tUEpfU1VDQ0VTUyAKKyAqCQkJaGVyZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX21lbV9jYXB0dXJlX3NldF9lb2ZfY2IocGptZWRpYV9wb3J0ICpwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zdGF0dXNfdCAoKmNiKShwam1lZGlhX3BvcnQgKnBvcnQsCisJCQkJCQkgdm9pZCAqdXNyX2RhdGEpKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgcmVjb3JkZWQgZGF0YSBpbiB0aGUgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwb3J0CQlUaGUgbWVtb3J5IHJlY29yZGVyIHBvcnQuCisgKiBAcmV0dXJuCQlUaGUgc2l6ZSBvZiBidWZmZXIgZGF0YS4uCisgKi8KK1BKX0RFQ0wocGpfc2l6ZV90KQorcGptZWRpYV9tZW1fY2FwdHVyZV9nZXRfc2l6ZShwam1lZGlhX3BvcnQgKnBvcnQpOworCisKKy8qKgorICogQH0KKyAqLworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfTUVNX1BPUlRfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9udWxsX3BvcnQuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL251bGxfcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmY0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9udWxsX3BvcnQuaApAQCAtMCwwICsxLDcwIEBACisvKiAkSWQ6IG51bGxfcG9ydC5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9OVUxMX1BPUlRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9OVUxMX1BPUlRfSF9fCisKKy8qKgorICogQGZpbGUgbnVsbF9wb3J0LmgKKyAqIEBicmllZiBOdWxsIG1lZGlhIHBvcnQuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3BvcnQuaD4KKworCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfTlVMTF9QT1JUIE51bGwgUG9ydAorICogQGluZ3JvdXAgUEpNRURJQV9QT1JUCisgKiBAYnJpZWYgVGhlIHNpbXBsZXN0IHR5cGUgb2YgbWVkaWEgcG9ydCB3aGljaCBkb2VzIG5vdGhpbmcuCisgKiBAeworICovCisKKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQ3JlYXRlIE51bGwgcG9ydC4gCisgKgorICogQHBhcmFtIHBvb2wJCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBzYW1wbGluZ19yYXRlCQlTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJCU51bWJlciBvZiBjaGFubmVscy4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZQlOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gYml0c19wZXJfc2FtcGxlCU51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUuCisgKiBAcGFyYW0gcF9wb3J0CQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHBvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9udWxsX3BvcnRfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19yYXRlLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkgICAgICAgdW5zaWduZWQgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0ICk7CisKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYJLyogX19QSk1FRElBX05VTExfUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BsYy5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcGxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0MTdmZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BsYy5oCkBAIC0wLDAgKzEsMTE1IEBACisvKiAkSWQ6IHBsYy5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9QTENfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9QTENfSF9fCisKKworLyoqCisgKiBAZmlsZSBwbGMuaAorICogQGJyaWVmIFBhY2tldCBMb3N0IENvbmNlYWxtZW50IChQTEMpIEFQSS4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfUExDIFBhY2tldCBMb3N0IENvbmNlYWxtZW50IChQTEMpCisgKiBAaW5ncm91cCBQSk1FRElBX0ZSQU1FX09QCisgKiBAYnJpZWYgUGFja2V0IGxvc3QgY29tcGVuc2F0aW9uIGFsZ29yaXRobQorICogQHsKKyAqCisgKiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIFBKTUVESUEncyBpbXBsZW1lbnRhdGlvbiBvZiBQYWNrZXQgTG9zdAorICogQ29uY2VhbG1lbnQgYWxnb3JpdGhtLiBUaGlzIGFsZ29yaXRobSBpcyB1c2VkIHRvIGltcGxlbWVudCBQTEMgZm9yCisgKiBjb2RlY3MgdGhhdCBkbyBub3QgaGF2ZSBidWlsdC1pbiBzdXBwb3J0IGZvciBvbmUgKGUuZy4gRy43MTEgb3IgR1NNIAorICogY29kZWNzKS4KKyAqCisgKiBUaGUgUExDIGFsZ29yaXRobSAoZWl0aGVyIGJ1aWx0LWluIG9yIGV4dGVybmFsKSBpcyBlbWJlZGRlZCBpbgorICogUEpNRURJQSBjb2RlYyBpbnN0YW5jZSwgYW5kIGFwcGxpY2F0aW9uIGNhbiBjb25jZWFsIGxvc3QgZnJhbWVzCisgKiBieSBjYWxsaW5nIDxiPjx0dD5yZWNvdmVyKCk8L3R0PjwvYj4gbWVtYmVyIG9mIHRoZSBjb2RlYydzIG1lbWJlcgorICogb3BlcmF0aW9uICgjcGptZWRpYV9jb2RlY19vcCkuCisgKgorICogU2VlIGFsc28gQHJlZiBwbGNfY29kZWMgZm9yIG1vcmUgaW5mby4KKyAqLworCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBmb3IgUExDLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3BsYyBwam1lZGlhX3BsYzsKKworCisKKy8qKgorICogQ3JlYXRlIFBMQyBzZXNzaW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VsZWN0IHRoZSBQTEMgYWxnb3JpdGhtIHRvCisgKiB1c2UgYmFzZWQgb24gdGhlIGFyZ3VtZW50cy4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgUExDLgorICogQHBhcmFtIGNsb2NrX3JhdGUJICAgIE1lZGlhIHNhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE11c3QgYmUgemVybyBmb3Igbm93LgorICogQHBhcmFtIHBfcGxjCQkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBQTEMgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9wbGNfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJCSB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgcGptZWRpYV9wbGMgKipwX3BsYyk7CisKKworLyoqCisgKiBTYXZlIGEgZ29vZCBmcmFtZSB0byBQTEMuCisgKgorICogQHBhcmFtIHBsYwkJICAgIFRoZSBQTEMgc2Vzc2lvbi4KKyAqIEBwYXJhbSBmcmFtZQkJICAgIFRoZSBnb29kIGZyYW1lIHRvIGJlIHN0b3JlZCB0byBQTEMuIFRoaXMgZnJhbWUKKyAqCQkJICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGNvbmZpZ3VyZWQKKyAqCQkJICAgIHNhbXBsZXMgcGVyIGZyYW1lLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfcGxjX3NhdmUoIHBqbWVkaWFfcGxjICpwbGMsCisJCQkJICAgICAgIHBqX2ludDE2X3QgKmZyYW1lICk7CisKKworLyoqCisgKiBHZW5lcmF0ZSBhIHJlcGxhY2VtZW50IGZvciBsb3N0IGZyYW1lLgorICoKKyAqIEBwYXJhbSBwbGMJCSAgICBUaGUgUExDIHNlc3Npb24uCisgKiBAcGFyYW0gZnJhbWUJCSAgICBCdWZmZXIgdG8gcmVjZWl2ZSB0aGUgZ2VuZXJhdGVkIGZyYW1lLiBUaGlzIGJ1ZmZlcgorICoJCQkgICAgbXVzdCBiZSBhYmxlIHRvIHN0b3JlIHRoZSBmcmFtZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3BsY19nZW5lcmF0ZSggcGptZWRpYV9wbGMgKnBsYywKKwkJCQkJICAgcGpfaW50MTZfdCAqZnJhbWUgKTsKKworCisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfUExDX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wb3J0LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1YWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3BvcnQuaApAQCAtMCwwICsxLDQ5OSBAQAorLyogJElkOiBwb3J0LmggMzg5MyAyMDExLTEyLTAxIDEwOjQ5OjA3WiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9QT1JUX0hfXworI2RlZmluZSBfX1BKTUVESUFfUE9SVF9IX18KKworLyoqCisgKiBAZmlsZSBwb3J0LmgKKyAqIEBicmllZiBQb3J0IGludGVyZmFjZSBkZWNsYXJhdGlvbgorICovCisjaW5jbHVkZSA8cGptZWRpYS9jbG9jay5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZXZlbnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvZnJhbWUuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3NpZ25hdHVyZXMuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorCisKKy8qKgorICBAYWRkdG9ncm91cCBQSk1FRElBX1BPUlQgTWVkaWEgUG9ydHMgRnJhbWV3b3JrCisgIEB7CisKKyAgQHNlY3Rpb24gbWVkaWFfcG9ydF9pbnRybyBNZWRpYSBQb3J0IENvbmNlcHRzCisgIAorICBAc3Vic2VjdGlvbiBUaGUgTWVkaWEgUG9ydAorICBBIG1lZGlhIHBvcnQgKHJlcHJlc2VudGVkIHdpdGggcGptZWRpYV9wb3J0ICJjbGFzcyIpIHByb3ZpZGVzIGEgZ2VuZXJpYworICBhbmQgZXh0ZW5zaWJsZSBmcmFtZXdvcmsgZm9yIGltcGxlbWVudGluZyBtZWRpYSBlbGVtZW50cy4gTWVkaWEgZWxlbWVudAorICBpdHNlbGYgY291bGQgYmUgYSBtZWRpYSBzb3VyY2UsIHNpbmssIG9yIHByb2Nlc3NpbmcgZWxlbWVudC4gQSBtZWRpYQorICBwb3J0IGludGVyZmFjZSBiYXNpY2FsbHkgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgLSBtZWRpYSBwb3J0IGluZm9ybWF0aW9uIChwam1lZGlhX3BvcnRfaW5mbykgdG8gZGVzY3JpYmUgdGhlCisgIG1lZGlhIHBvcnQgcHJvcGVydGllcyAoc2FtcGxpbmcgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzLCBldGMuKSwKKyAgLSBvcHRpb25hbCBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGFjcXVpcmUgZnJhbWVzIGZyb20gdGhlIHBvcnQgKHRoZQorICAgIDx0dD5nZXRfZnJhbWUoKSA8L3R0PiBpbnRlcmZhY2UpLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBieQorICAgICNwam1lZGlhX3BvcnRfZ2V0X2ZyYW1lKCkgcHVibGljIEFQSSwgYW5kCisgIC0gb3B0aW9uYWwgcG9pbnRlciB0byBmdW5jdGlvbiB0byBzdG9yZSBmcmFtZXMgdG8gdGhlIHBvcnQgKHRoZQorICAgIDx0dD5wdXRfZnJhbWUoKTwvdHQ+IGludGVyZmFjZSkgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYnkKKyAgICAjcGptZWRpYV9wb3J0X3B1dF9mcmFtZSgpIHB1YmxpYyBBUEkuCisKKyAgVGhlIDx0dD5nZXRfZnJhbWUoKTwvdHQ+IGFuZCA8dHQ+cHV0X2ZyYW1lKCk8L3R0PiBpbnRlcmZhY2Ugb2YgY291cnNlCisgIHdvdWxkIG9ubHkgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCBpZiB0aGUgbWVkaWEgcG9ydCBlbWl0cyBhbmQvb3IgdGFrZXMKKyAgbWVkaWEgZnJhbWVzIHJlc3BlY3RpdmVseS4KKyAgCisgIE1lZGlhIHBvcnRzIGFyZSBwYXNzaXZlICJvYmplY3RzIi4gQnkgZGVmYXVsdCwgdGhlcmUgaXMgbm8gd29ya2VyIHRocmVhZAorICB0byBydW4gdGhlIG1lZGlhIGZsb3cuIEFwcGxpY2F0aW9ucyAob3Igb3RoZXIgUEpNRURJQQorICBjb21wb25lbnRzLCBhcyBleHBsYWluZWQgaW4gQHJlZiBQSk1FRElBX1BPUlRfQ0xPQ0spIG11c3QgYWN0aXZlbHkgY2FsbAorICAjcGptZWRpYV9wb3J0X2dldF9mcmFtZSgpIG9yICNwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKCkgZnJvbS90byB0aGUgbWVkaWEKKyAgcG9ydCBpbiBvcmRlciB0byByZXRyaWV2ZS9zdG9yZSBtZWRpYSBmcmFtZXMuCisgIAorICBTb21lIG1lZGlhIHBvcnRzIChzdWNoIGFzIEByZWYgUEpNRURJQV9DT05GIGFuZCBAcmVmIFBKTUVESUFfUkVTQU1QTEVfUE9SVCkKKyAgbWF5IGJlIGludGVyY29ubmVjdGVkIHdpdGggKG9yIGVuY2Fwc3VsYXRlKSBvdGhlciBwb3J0LCB0byBwZXJmb3JtIHRoZQorICBjb21iaW5lZCB0YXNrIG9mIHRoZSBwb3J0cywgd2hpbGUgc29tZQorICBvdGhlcnMgcmVwcmVzZW50IHRoZSB1bHRpbWF0ZSBzb3VyY2Uvc2luayB0ZXJtaW5hdGlvbiBmb3IgdGhlIG1lZGlhLiAKKyAgSW50ZXJjb25uZWN0aW9uIG1lYW5zIHRoZSB1cHN0cmVhbSBtZWRpYSBwb3J0IHdpbGwgY2FsbCA8dHQ+Z2V0X2ZyYW1lKCk8L3R0PgorICBhbmQgPHR0PnB1dF9mcmFtZSgpPC90dD4gdG8gaXRzIGRvd25zdHJlYW0gbWVkaWEgcG9ydC4gRm9yIHRoaXMgdG8gaGFwcGVuLAorICB0aGUgbWVkaWEgcG9ydHMgbmVlZCB0byBoYXZlIHRoZSBzYW1lIGZvcm1hdCwgd2hlcmUgZm9ybWF0IGlzIGRlZmluZWQgYXMKKyAgY29tYmluYXRpb24gb2Ygc2FtcGxlIGZvcm1hdCwgY2xvY2sgcmF0ZSwgY2hhbm5lbCBjb3VudCwgYml0cyBwZXIgc2FtcGxlLAorICBhbmQgc2FtcGxlcyBwZXIgZnJhbWUgZm9yIGF1ZGlvIG1lZGlhLgorCisKKyAgQHN1YnNlY3Rpb24gcG9ydF9jbG9ja19leDEgRXhhbXBsZTogTWFudWFsIFJlc2FtcGxpbmcKKworICBGb3IgZXhhbXBsZSwgc3VwcG9zZSBhcHBsaWNhdGlvbiB3YW50cyB0byBjb252ZXJ0IHRoZSBzYW1wbGluZyByYXRlCisgIG9mIG9uZSBXQVYgZmlsZSB0byBhbm90aGVyLiBJbiB0aGlzIGNhc2UsIGFwcGxpY2F0aW9uIHdvdWxkIGNyZWF0ZSBhbmQKKyAgYXJyYW5nZSBtZWRpYSBwb3J0cyBjb25uZWN0aW9uIGFzIGZvbGxvd3M6CisKKyAgICBcaW1hZ2UgaHRtbCBzYW1wbGUtbWFudWFsLXJlc2FtcGxpbmcuanBnCisKKyAgQXBwbGljYXRpb24gd291bGQgc2V0dXAgdGhlIG1lZGlhIHBvcnRzIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHNldWRvLQorICBjb2RlOgorCisgIFxjb2RlCisgIAorICAgICAgcGptZWRpYV9wb3J0ICpwbGF5ZXIsICpyZXNhbXBsZSwgKndyaXRlcjsKKyAgICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgCisgICAgICAvLyBDcmVhdGUgdGhlIGZpbGUgcGxheWVyIHBvcnQuCisgICAgICBzdGF0dXMgPSBwam1lZGlhX3dhdl9wbGF5ZXJfcG9ydF9jcmVhdGUocG9vbCwgCisgIAkJCQkJICAgICAgIklucHV0LldBViIsCSAgICAvLyBmaWxlIG5hbWUKKyAgCQkJCQkgICAgICAyMCwJCSAgICAvLyBwdGltZS4KKyAgCQkJCQkgICAgICBQSk1FRElBX0ZJTEVfTk9fTE9PUCwgLy8gZmxhZ3MKKyAgCQkJCQkgICAgICAwLAkJICAgIC8vIGJ1ZmZlciBzaXplCisgIAkJCQkJICAgICAgTlVMTCwJCSAgICAvLyB1c2VyIGRhdGEuCisgIAkJCQkJICAgICAgJnBsYXllciApOworICAgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0dXM9PVBKX1NVQ0NFU1MsIFBKX1NVQ0NFU1MpOworICAKKyAgICAgIC8vIENyZWF0ZSB0aGUgcmVzYW1wbGUgcG9ydCB3aXRoIHNwZWNpZnlpbmcgdGhlIHRhcmdldCBzYW1wbGluZyByYXRlLCAKKyAgICAgIC8vIGFuZCB3aXRoIHRoZSBmaWxlIHBvcnQgYXMgdGhlIHNvdXJjZS4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5CisgICAgICAvLyBjb25uZWN0IHRoZSByZXNhbXBsZSBwb3J0IHdpdGggdGhlIHBsYXllciBwb3J0LgorICAgICAgc3RhdHVzID0gcGptZWRpYV9yZXNhbXBsZV9wb3J0X2NyZWF0ZSggcG9vbCwgcGxheWVyLCA4MDAwLCAKKyAgCQkJCQkgICAgIDAsICZyZXNhbXBsZSk7CisgICAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cz09UEpfU1VDQ0VTUywgUEpfU1VDQ0VTUyk7CisgIAorICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIHdyaXRlciwgc3BlY2lmeWluZyB0aGUgcmVzYW1wbGUgcG9ydCdzIGNvbmZpZ3VyYXRpb24KKyAgICAgIC8vIGFzIHRoZSBXQVYgcGFyYW1ldGVycy4KKyAgICAgIHN0YXR1cyBwam1lZGlhX3dhdl93cml0ZXJfcG9ydF9jcmVhdGUocG9vbCwgCisgIAkJCQkJICAgICJPdXRwdXQuV0FWIiwgIC8vIGZpbGUgbmFtZS4KKyAgCQkJCQkgICAgcmVzYW1wbGUtPmluZm8uY2xvY2tfcmF0ZSwKKyAgCQkJCQkgICAgcmVzYW1wbGUtPmluZm8uY2hhbm5lbF9jb3VudCwKKyAgCQkJCQkgICAgcmVzYW1wbGUtPmluZm8uc2FtcGxlc19wZXJfZnJhbWUsCisgIAkJCQkJICAgIHJlc2FtcGxlLT5pbmZvLmJpdHNfcGVyX3NhbXBsZSwKKyAgCQkJCQkgICAgMCwJCS8vIGZsYWdzCisgIAkJCQkJICAgIDAsCQkvLyBidWZmZXIgc2l6ZQorICAJCQkJCSAgICBOVUxMLAkvLyB1c2VyIGRhdGEuCisgIAkJCQkJICAgICZ3cml0ZXIpOworICAKKyAgXGVuZGNvZGUKKworICAKKyAgQWZ0ZXIgdGhlIHBvcnRzIGhhdmUgYmVlbiBzZXQgdXAsIGFwcGxpY2F0aW9uIGNhbiBwZXJmb3JtIHRoZSBjb252ZXJzaW9uCisgIHByb2Nlc3MgYnkgcnVubmluZyB0aGlzIGxvb3A6CisgCisgIFxjb2RlCisgIAorICAJcGpfaW50MTZfdCBzYW1wbGVidWZbTUFYX0ZSQU1FXTsKKyAgCQorICAJd2hpbGUgKDEpIHsKKyAgCSAgICBwam1lZGlhX2ZyYW1lIGZyYW1lOworICAJICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgCisgIAkgICAgZnJhbWUuYnVmID0gc2FtcGxlYnVmOworICAJICAgIGZyYW1lLnNpemUgPSBzaXplb2Yoc2FtcGxlYnVmKTsKKyAgCisgIAkgICAgLy8gR2V0IHRoZSBmcmFtZSBmcm9tIHJlc2FtcGxlIHBvcnQuCisgIAkgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X2dldF9mcmFtZShyZXNhbXBsZSwgJmZyYW1lKTsKKyAgCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgfHwgZnJhbWUudHlwZSA9PSBQSk1FRElBX0ZSQU1FX1RZUEVfTk9ORSkgeworICAJCS8vIEVuZC1vZi1maWxlLCBlbmQgdGhlIGNvbnZlcnNpb24uCisgIAkJYnJlYWs7CisgIAkgICAgfQorICAKKyAgCSAgICAvLyBQdXQgdGhlIGZyYW1lIHRvIHdyaXRlIHBvcnQuCisgIAkgICAgc3RhdHVzID0gcGptZWRpYV9wb3J0X3B1dF9mcmFtZSh3cml0ZXIsICZmcmFtZSk7CisgIAkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgIAkJLy8gRXJyb3IgaW4gd3JpdGluZyB0aGUgZmlsZS4KKyAgCQlicmVhazsKKyAgCSAgICB9CisgIAl9CisgIAorICBcZW5kY29kZQorIAorICBGb3IgdGhlIHNha2Ugb2YgY29tcGxldGVuZXNzLCBhZnRlciB0aGUgcmVzYW1wbGluZyBwcm9jZXNzIGlzIGRvbmUsIAorICBhcHBsaWNhdGlvbiB3b3VsZCBuZWVkIHRvIGRlc3Ryb3kgdGhlIHBvcnRzOgorICAKKyAgXGNvZGUKKwkvLyBOb3RlOiBieSBkZWZhdWx0LCBkZXN0cm95aW5nIHJlc2FtcGxlIHBvcnQgd2lsbCBkZXN0cm95IHRoZQorCS8vCSB0aGUgZG93bnN0cmVhbSBwb3J0IHRvby4KKyAgCXBqbWVkaWFfcG9ydF9kZXN0cm95KHJlc2FtcGxlKTsKKyAgCXBqbWVkaWFfcG9ydF9kZXN0cm95KHdyaXRlcik7CisgIFxlbmRjb2RlCisgCisgCisgIFRoZSBhYm92ZSBzdGVwcyBhcmUgb2theSBmb3Igb3VyIHNpbXBsZSBwdXJwb3NlIG9mIGNoYW5naW5nIGZpbGUncyBzYW1wbGluZworICByYXRlLiBCdXQgZm9yIG90aGVyIHB1cnBvc2VzLCB0aGUgcHJvY2VzcyBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGZyYW1lcworICBuZWVkIHRvIGJlIGRvbmUgaW4gdGltZWx5IG1hbm5lciAoZm9yIGV4YW1wbGUsIHNlbmRpbmcgUlRQIHBhY2tldHMgdG8KKyAgcmVtb3RlIHN0cmVhbSkuIEFuZCBtb3JlIG92ZXIsIGFzIHRoZSBhcHBsaWNhdGlvbidzIHNjb3BlIGdvZXMgYmlnZ2VyLAorICB0aGUgc2FtZSBwYXR0ZXJuIG9mIG1hbnVhbGx5IHJlYWRpbmcvd3JpdGluZyBmcmFtZXMgY29tZXMgdXAgbW9yZSBhbmQgbW9yZSBvZnRlbiwKKyAgdGh1cyBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiBQSk1FRElBIHByb3ZpZGVzIG1lY2hhbmlzbSB0byAKKyAgYXV0b21hdGUgdGhpcyBwcm9jZXNzLgorICAKKyAgQW5kIGluZGVlZCBQSk1FRElBIGRvZXMgcHJvdmlkZSBzdWNoIG1lY2hhbmlzbSwgd2hpY2ggaXMgZGVzY3JpYmVkIGluIAorICBAcmVmIFBKTUVESUFfUE9SVF9DTE9DSyBzZWN0aW9uLgorCisKKyAgQHN1YnNlY3Rpb24gbWVkaWFfcG9ydF9hdXRvbSBBdXRvbWF0aW5nIE1lZGlhIEZsb3cKKworICBQSk1FRElBIHByb3ZpZGVzIGZldyBtZWNoYW5pc21zIHRvIG1ha2UgbWVkaWEgZmxvd3MgYXV0b21hdGljYWxseQorICBhbW9uZyBtZWRpYSBwb3J0cy4gVGhpcyBjb25jZXB0IGlzIGRlc2NyaWJlZCBpbiBAcmVmIFBKTUVESUFfUE9SVF9DTE9DSyAKKyAgc2VjdGlvbi4KKyovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIENyZWF0ZSAzMmJpdCBwb3J0IHNpZ25hdHVyZSBmcm9tIEFTQ0lJIGNoYXJhY3RlcnMuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9QT1JUX1NJRyhhLGIsYyxkKQkgICAgCVBKTUVESUFfT0JKX1NJRyhhLGIsYyxkKQorCisKKy8qKgorICogUG9ydCBvcGVyYXRpb24gc2V0dGluZy4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfcG9ydF9vcAoreworICAgIC8qKiAKKyAgICAgKiBObyBjaGFuZ2UgdG8gdGhlIHBvcnQgVFggb3IgUlggc2V0dGluZ3MuCisgICAgICovCisgICAgUEpNRURJQV9QT1JUX05PX0NIQU5HRSwKKworICAgIC8qKgorICAgICAqIFRYIG9yIFJYIGlzIGRpc2FibGVkIGZyb20gdGhlIHBvcnQuIEl0IG1lYW5zIGdldF9mcmFtZSgpIG9yCisgICAgICogcHV0X2ZyYW1lKCkgV0lMTCBOT1QgYmUgY2FsbGVkIGZvciB0aGlzIHBvcnQuCisgICAgICovCisgICAgUEpNRURJQV9QT1JUX0RJU0FCTEUsCisKKyAgICAvKioKKyAgICAgKiBUWCBvciBSWCBpcyBtdXRlZCwgd2hpY2ggbWVhbnMgdGhhdCBnZXRfZnJhbWUoKSBvciBwdXRfZnJhbWUoKQorICAgICAqIHdpbGwgc3RpbGwgYmUgY2FsbGVkLCBidXQgdGhlIGF1ZGlvIGZyYW1lIGlzIGRpc2NhcmRlZC4KKyAgICAgKi8KKyAgICBQSk1FRElBX1BPUlRfTVVURSwKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBUWCBhbmQgUlggdG8vZnJvbSB0aGlzIHBvcnQuCisgICAgICovCisgICAgUEpNRURJQV9QT1JUX0VOQUJMRQorCit9IHBqbWVkaWFfcG9ydF9vcDsKKworCisvKioKKyAqIFBvcnQgaW5mby4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9wb3J0X2luZm8KK3sKKyAgICBwal9zdHJfdAkgICAgbmFtZTsJCS8qKjwgUG9ydCBuYW1lLgkJCSAgICAqLworICAgIHBqX3VpbnQzMl90CSAgICBzaWduYXR1cmU7CQkvKio8IFBvcnQgc2lnbmF0dXJlLgkJICAgICovCisgICAgcGptZWRpYV9kaXIgICAgIGRpcjsgICAgICAgICAgICAgICAgLyoqPCBQb3J0IGRpcmVjdGlvbi4gICAgICAgICAgICAgICAgKi8KKyAgICBwam1lZGlhX2Zvcm1hdCAgZm10OyAgICAgICAgICAgICAgICAvKio8IEZvcm1hdC4JCSAgICAgICAgICAgICovCit9IHBqbWVkaWFfcG9ydF9pbmZvOworCisvKioKKyAqIFV0aWxpdHkgdG8gcmV0cmlldmUgYXVkaW8gY2xvY2sgcmF0ZS9zYW1wbGluZyByYXRlIHZhbHVlIGZyb20KKyAqIHBqbWVkaWFfcG9ydF9pbmZvLgorICoKKyAqIEBwYXJhbSBwaWEJCVBvaW50ZXIgdG8gcG9ydCBpbmZvIGNvbnRhaW5pbmcgYXVkaW8gZm9ybWF0LgorICogQHJldHVybgkJQXVkaW8gY2xvY2sgcmF0ZS4KKyAqLworUEpfSU5MSU5FKHVuc2lnbmVkKSBQSk1FRElBX1BJQV9TUkFURShjb25zdCBwam1lZGlhX3BvcnRfaW5mbyAqcGlhKQoreworICAgIHBqX2Fzc2VydChwaWEtPmZtdC50eXBlPT1QSk1FRElBX1RZUEVfQVVESU8gJiYKKwkgICAgICBwaWEtPmZtdC5kZXRhaWxfdHlwZT09UEpNRURJQV9GT1JNQVRfREVUQUlMX0FVRElPKTsKKyAgICByZXR1cm4gcGlhLT5mbXQuZGV0LmF1ZC5jbG9ja19yYXRlOworfQorCisvKioKKyAqIFV0aWxpdHkgdG8gcmV0cmlldmUgYXVkaW8gY2hhbm5lbCBjb3VudCB2YWx1ZSBmcm9tIHBqbWVkaWFfcG9ydF9pbmZvLgorICoKKyAqIEBwYXJhbSBwaWEJCVBvaW50ZXIgdG8gcG9ydCBpbmZvIGNvbnRhaW5pbmcgYXVkaW8gZm9ybWF0LgorICogQHJldHVybgkJQXVkaW8gY2hhbm5lbCBjb3VudC4KKyAqLworUEpfSU5MSU5FKHVuc2lnbmVkKSBQSk1FRElBX1BJQV9DQ05UKGNvbnN0IHBqbWVkaWFfcG9ydF9pbmZvICpwaWEpCit7CisgICAgcGpfYXNzZXJ0KHBpYS0+Zm10LnR5cGU9PVBKTUVESUFfVFlQRV9BVURJTyAmJgorCSAgICAgIHBpYS0+Zm10LmRldGFpbF90eXBlPT1QSk1FRElBX0ZPUk1BVF9ERVRBSUxfQVVESU8pOworICAgIHJldHVybiBwaWEtPmZtdC5kZXQuYXVkLmNoYW5uZWxfY291bnQ7Cit9CisKKy8qKgorICogVXRpbGl0eSB0byByZXRyaWV2ZSBhdWRpbyBiaXRzIHBlciBzYW1wbGUgdmFsdWUgZnJvbSBwam1lZGlhX3BvcnRfaW5mby4KKyAqCisgKiBAcGFyYW0gcGlhCQlQb2ludGVyIHRvIHBvcnQgaW5mbyBjb250YWluaW5nIGF1ZGlvIGZvcm1hdC4KKyAqIEByZXR1cm4JCU51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUuCisgKi8KK1BKX0lOTElORSh1bnNpZ25lZCkgUEpNRURJQV9QSUFfQklUUyhjb25zdCBwam1lZGlhX3BvcnRfaW5mbyAqcGlhKQoreworICAgIHBqX2Fzc2VydChwaWEtPmZtdC50eXBlPT1QSk1FRElBX1RZUEVfQVVESU8gJiYKKwkgICAgICBwaWEtPmZtdC5kZXRhaWxfdHlwZT09UEpNRURJQV9GT1JNQVRfREVUQUlMX0FVRElPKTsKKyAgICByZXR1cm4gcGlhLT5mbXQuZGV0LmF1ZC5iaXRzX3Blcl9zYW1wbGU7Cit9CisKKy8qKgorICogVXRpbGl0eSB0byByZXRyaWV2ZSBhdWRpbyBmcmFtZSBpbnRlcnZhbCAocHRpbWUpIHZhbHVlIGZyb20KKyAqIHBqbWVkaWFfcG9ydF9pbmZvLgorICoKKyAqIEBwYXJhbSBwaWEJCVBvaW50ZXIgdG8gcG9ydCBpbmZvIGNvbnRhaW5pbmcgYXVkaW8gZm9ybWF0LgorICogQHJldHVybgkJRnJhbWUgaW50ZXJ2YWwgaW4gbXNlYy4KKyAqLworUEpfSU5MSU5FKHVuc2lnbmVkKSBQSk1FRElBX1BJQV9QVElNRShjb25zdCBwam1lZGlhX3BvcnRfaW5mbyAqcGlhKQoreworICAgIHBqX2Fzc2VydChwaWEtPmZtdC50eXBlPT1QSk1FRElBX1RZUEVfQVVESU8gJiYKKwkgICAgICBwaWEtPmZtdC5kZXRhaWxfdHlwZT09UEpNRURJQV9GT1JNQVRfREVUQUlMX0FVRElPKTsKKyAgICByZXR1cm4gcGlhLT5mbXQuZGV0LmF1ZC5mcmFtZV90aW1lX3VzZWMgLyAxMDAwOworfQorCisvKioKKyAqIFRoaXMgaXMgYSB1dGlsaXR5IHJvdXRpbmUgdG8gcmV0cmlldmUgdGhlIGF1ZGlvIHNhbXBsZXNfcGVyX2ZyYW1lIHZhbHVlCisgKiBmcm9tIHBvcnQgaW5mby4KKyAqCisgKiBAcGFyYW0gcGlhCQlQb2ludGVyIHRvIHBvcnQgaW5mbyBjb250YWluaW5nIGF1ZGlvIGZvcm1hdC4KKyAqIEByZXR1cm4JCVNhbXBsZXMgcGVyIGZyYW1lIHZhbHVlLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfUElBX1NQRihjb25zdCBwam1lZGlhX3BvcnRfaW5mbyAqcGlhKQoreworICAgIHBqX2Fzc2VydChwaWEtPmZtdC50eXBlPT1QSk1FRElBX1RZUEVfQVVESU8gJiYKKwkgICAgICBwaWEtPmZtdC5kZXRhaWxfdHlwZT09UEpNRURJQV9GT1JNQVRfREVUQUlMX0FVRElPKTsKKyAgICByZXR1cm4gUEpNRURJQV9BRkRfU1BGKCZwaWEtPmZtdC5kZXQuYXVkKTsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSByb3V0aW5lIHRvIHJldHJpZXZlIHRoZSBhdmVyYWdlIGJpdHJhdGUgdmFsdWUKKyAqIGZyb20gcG9ydCBpbmZvLgorICoKKyAqIEBwYXJhbSBwaWEJCVBvaW50ZXIgdG8gcG9ydCBpbmZvIGNvbnRhaW5pbmcgYXVkaW8gZm9ybWF0LgorICogQHJldHVybgkJQml0cmF0ZSwgaW4gYml0cyBwZXIgc2Vjb25kLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfUElBX0FWR19CUFMoY29uc3QgcGptZWRpYV9wb3J0X2luZm8gKnBpYSkKK3sKKyAgICBwal9hc3NlcnQocGlhLT5mbXQudHlwZT09UEpNRURJQV9UWVBFX0FVRElPICYmCisJICAgICAgcGlhLT5mbXQuZGV0YWlsX3R5cGU9PVBKTUVESUFfRk9STUFUX0RFVEFJTF9BVURJTyk7CisgICAgcmV0dXJuIHBpYS0+Zm10LmRldC5hdWQuYXZnX2JwczsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSByb3V0aW5lIHRvIHJldHJpZXZlIHRoZSBtYXhpbXVtIGJpdHJhdGUgdmFsdWUKKyAqIGZyb20gcG9ydCBpbmZvLgorICoKKyAqIEBwYXJhbSBwaWEJCVBvaW50ZXIgdG8gcG9ydCBpbmZvIGNvbnRhaW5pbmcgYXVkaW8gZm9ybWF0LgorICogQHJldHVybgkJQml0cmF0ZSwgaW4gYml0cyBwZXIgc2Vjb25kLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfUElBX01BWF9CUFMoY29uc3QgcGptZWRpYV9wb3J0X2luZm8gKnBpYSkKK3sKKyAgICBwal9hc3NlcnQocGlhLT5mbXQudHlwZT09UEpNRURJQV9UWVBFX0FVRElPICYmCisJICAgICAgcGlhLT5mbXQuZGV0YWlsX3R5cGU9PVBKTUVESUFfRk9STUFUX0RFVEFJTF9BVURJTyk7CisgICAgcmV0dXJuIHBpYS0+Zm10LmRldC5hdWQubWF4X2JwczsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSByb3V0aW5lIHRvIHJldHJpZXZlIHRoZSBhdmVyYWdlIGF1ZGlvIGZyYW1lIHNpemUgdmFsdWUKKyAqIGZyb20gcGptZWRpYV9wb3J0X2luZm8uCisgKgorICogQHBhcmFtIHBpYQkJUG9pbnRlciB0byBwb3J0IGluZm8gY29udGFpbmluZyBhdWRpbyBmb3JtYXQuCisgKiBAcmV0dXJuCQlGcmFtZSBzaXplIGluIGJ5dGVzLgorICovCitQSl9JTkxJTkUodW5zaWduZWQpIFBKTUVESUFfUElBX0FWR19GU1ooY29uc3QgcGptZWRpYV9wb3J0X2luZm8gKnBpYSkKK3sKKyAgICBwal9hc3NlcnQocGlhLT5mbXQudHlwZT09UEpNRURJQV9UWVBFX0FVRElPICYmCisJICAgICAgcGlhLT5mbXQuZGV0YWlsX3R5cGU9PVBKTUVESUFfRk9STUFUX0RFVEFJTF9BVURJTyk7CisgICAgcmV0dXJuIFBKTUVESUFfQUZEX0FWR19GU1ooJnBpYS0+Zm10LmRldC5hdWQpOworfQorCisvKioKKyAqIFV0aWxpdHkgdG8gcmV0cmlldmUgYXVkaW8gZnJhbWUgc2l6ZSBmcm9tIG1heGltdW0gYml0cmF0ZSBmcm9tCisgKiBwam1lZGlhX3BvcnRfaW5mby4KKyAqCisgKiBAcGFyYW0gcGlhCQlQb2ludGVyIHRvIHBvcnQgaW5mbyBjb250YWluaW5nIGF1ZGlvIGZvcm1hdC4KKyAqIEByZXR1cm4JCUZyYW1lIHNpemUgaW4gYnl0ZXMuCisgKi8KK1BKX0lOTElORSh1bnNpZ25lZCkgUEpNRURJQV9QSUFfTUFYX0ZTWihjb25zdCBwam1lZGlhX3BvcnRfaW5mbyAqcGlhKQoreworICAgIHBqX2Fzc2VydChwaWEtPmZtdC50eXBlPT1QSk1FRElBX1RZUEVfQVVESU8gJiYKKwkgICAgICBwaWEtPmZtdC5kZXRhaWxfdHlwZT09UEpNRURJQV9GT1JNQVRfREVUQUlMX0FVRElPKTsKKyAgICByZXR1cm4gUEpNRURJQV9BRkRfTUFYX0ZTWigmcGlhLT5mbXQuZGV0LmF1ZCk7Cit9CisKKy8qKgorICogUG9ydCBpbnRlcmZhY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcG9ydAoreworICAgIHBqbWVkaWFfcG9ydF9pbmZvCSBpbmZvOwkJICAgIC8qKjwgUG9ydCBpbmZvcm1hdGlvbi4gICovCisKKyAgICAvKiogUG9ydCBkYXRhIGNhbiBiZSB1c2VkIGJ5IHRoZSBwb3J0IGNyZWF0b3IgdG8gYXR0YWNoIGFyYml0cmFyeQorICAgICAqICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQuCisgICAgICovCisgICAgc3RydWN0IHBvcnRfZGF0YSB7CisJdm9pZAkJKnBkYXRhOwkJICAgIC8qKjwgUG9pbnRlciBkYXRhLgkgICAgKi8KKwlsb25nCQkgbGRhdGE7CQkgICAgLyoqPCBMb25nIGRhdGEuCSAgICAqLworICAgIH0gcG9ydF9kYXRhOworCisgICAgLyoqCisgICAgICogR2V0IGNsb2NrIHNvdXJjZS4KKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSAjcGptZWRpYV9wb3J0X2dldF9jbG9ja19zcmMoKS4KKyAgICAgKi8KKyAgICBwam1lZGlhX2Nsb2NrX3NyYyogKCpnZXRfY2xvY2tfc3JjKShzdHJ1Y3QgcGptZWRpYV9wb3J0ICp0aGlzX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9kaXIgZGlyKTsKKworICAgIC8qKgorICAgICAqIFNpbmsgaW50ZXJmYWNlLiAKKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSAjcGptZWRpYV9wb3J0X3B1dF9mcmFtZSgpLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqcHV0X2ZyYW1lKShzdHJ1Y3QgcGptZWRpYV9wb3J0ICp0aGlzX3BvcnQsIAorCQkJICAgICBwam1lZGlhX2ZyYW1lICpmcmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBTb3VyY2UgaW50ZXJmYWNlLiAKKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSAjcGptZWRpYV9wb3J0X2dldF9mcmFtZSgpLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZ2V0X2ZyYW1lKShzdHJ1Y3QgcGptZWRpYV9wb3J0ICp0aGlzX3BvcnQsIAorCQkJICAgICBwam1lZGlhX2ZyYW1lICpmcmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGVzdHJveSB0aGlzIHBvcnQuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpvbl9kZXN0cm95KShzdHJ1Y3QgcGptZWRpYV9wb3J0ICp0aGlzX3BvcnQpOworCit9IHBqbWVkaWFfcG9ydDsKKworCisvKioKKyAqIFRoaXMgaXMgYW4gYXV4aWxpYXJ5IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgcG9ydCBpbmZvIGZvcgorICogcG9ydHMgd2hpY2ggZGVhbCB3aXRoIFBDTSBhdWRpby4KKyAqCisgKiBAcGFyYW0gaW5mbwkJICAgIFRoZSBwb3J0IGluZm8gdG8gYmUgaW5pdGlhbGl6ZWQuCisgKiBAcGFyYW0gbmFtZQkJICAgIFBvcnQgbmFtZS4KKyAqIEBwYXJhbSBzaWduYXR1cmUJICAgIFBvcnQgc2lnbmF0dXJlLgorICogQHBhcmFtIGNsb2NrX3JhdGUJICAgIFBvcnQncyBjbG9jayByYXRlLgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIE51bWJlciBvZiBjaGFubmVscy4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBCaXRzIHBlciBzYW1wbGUuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfcG9ydF9pbmZvX2luaXQoIHBqbWVkaWFfcG9ydF9pbmZvICppbmZvLAorCQkJCQkgICAgIGNvbnN0IHBqX3N0cl90ICpuYW1lLAorCQkJCQkgICAgIHVuc2lnbmVkIHNpZ25hdHVyZSwKKwkJCQkJICAgICB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkgICAgIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCSAgICAgdW5zaWduZWQgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lKTsKKworLyoqCisgKiBUaGlzIGlzIGFuIGF1eGlsaWFyeSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHBvcnQgaW5mbyBmb3IKKyAqIHBvcnRzIHdoaWNoIGRlYWwgd2l0aCBQQ00gYXVkaW8uCisgKgorICogQHBhcmFtIGluZm8JCSAgICBUaGUgcG9ydCBpbmZvIHRvIGJlIGluaXRpYWxpemVkLgorICogQHBhcmFtIG5hbWUJCSAgICBQb3J0IG5hbWUuCisgKiBAcGFyYW0gc2lnbmF0dXJlCSAgICBQb3J0IHNpZ25hdHVyZS4KKyAqIEBwYXJhbSBkaXIJICAgICAgICAgICAgUG9ydCdzIGRpcmVjdGlvbi4KKyAqIEBwYXJhbSBmbXQJICAgICAgICAgICAgUG9ydCdzIG1lZGlhIGZvcm1hdC4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3BvcnRfaW5mb19pbml0Mihwam1lZGlhX3BvcnRfaW5mbyAqaW5mbywKKwkJCQkJICAgICBjb25zdCBwal9zdHJfdCAqbmFtZSwKKwkJCQkJICAgICB1bnNpZ25lZCBzaWduYXR1cmUsCisJCQkJCSAgICAgcGptZWRpYV9kaXIgZGlyLAorCQkJCQkgICAgIGNvbnN0IHBqbWVkaWFfZm9ybWF0ICpmbXQpOworCisKKy8qKgorICogR2V0IGEgY2xvY2sgc291cmNlIGZyb20gdGhlIHBvcnQuCisgKgorICogQHBhcmFtIHBvcnQJICAgIFRoZSBtZWRpYSBwb3J0LgorICogQHBhcmFtIGRpciAgICAgICBNZWRpYSBwb3J0J3MgZGlyZWN0aW9uLgorICoKKyAqIEByZXR1cm4JICAgIFRoZSBjbG9jayBzb3VyY2Ugb3IgTlVMTCBpZiBjbG9jayBzb3VyY2UgaXMgbm90IHByZXNlbnQKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvcnQuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9jbG9ja19zcmMgKikgcGptZWRpYV9wb3J0X2dldF9jbG9ja19zcmMoIHBqbWVkaWFfcG9ydCAqcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfZGlyIGRpciApOworCisKKy8qKgorICogR2V0IGEgZnJhbWUgZnJvbSB0aGUgcG9ydCAoYW5kIHN1YnNlcXVlbnQgZG93bnN0cmVhbSBwb3J0cykuCisgKgorICogQHBhcmFtIHBvcnQJICAgIFRoZSBtZWRpYSBwb3J0LgorICogQHBhcmFtIGZyYW1lCSAgICBGcmFtZSB0byBzdG9yZSBzYW1wbGVzLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfcG9ydF9nZXRfZnJhbWUoIHBqbWVkaWFfcG9ydCAqcG9ydCwKKwkJCQkJICAgICBwam1lZGlhX2ZyYW1lICpmcmFtZSApOworCisvKioKKyAqIFB1dCBhIGZyYW1lIHRvIHRoZSBwb3J0IChhbmQgc3Vic2VxdWVudCBkb3duc3RyZWFtIHBvcnRzKS4KKyAqCisgKiBAcGFyYW0gcG9ydAkgICAgVGhlIG1lZGlhIHBvcnQuCisgKiBAcGFyYW0gZnJhbWUJICAgIEZyYW1lIHRvIHRoZSBwdXQgdG8gdGhlIHBvcnQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9wb3J0X3B1dF9mcmFtZSggcGptZWRpYV9wb3J0ICpwb3J0LAorCQkJCQkgICAgIHBqbWVkaWFfZnJhbWUgKmZyYW1lICk7CisKKy8qKgorICogRGVzdHJveSBwb3J0IChhbmQgc3Vic2VxdWVudCBkb3duc3RyZWFtIHBvcnRzKQorICoKKyAqIEBwYXJhbSBwb3J0CSAgICBUaGUgbWVkaWEgcG9ydC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3BvcnRfZGVzdHJveSggcGptZWRpYV9wb3J0ICpwb3J0ICk7CisKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9QT1JUX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9yZXNhbXBsZS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcmVzYW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RkMTExCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcmVzYW1wbGUuaApAQCAtMCwwICsxLDIwMCBAQAorLyogJElkOiByZXNhbXBsZS5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9SRVNBTVBMRV9IX18KKyNkZWZpbmUgX19QSk1FRElBX1JFU0FNUExFX0hfXworCisKKworLyoqCisgKiBAZmlsZSByZXNhbXBsZS5oCisgKiBAYnJpZWYgU2FtcGxlIHJhdGUgY29udmVydGVyLgorICovCisjaW5jbHVkZSA8cGptZWRpYS90eXBlcy5oPgorI2luY2x1ZGUgPHBqbWVkaWEvcG9ydC5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1JFU0FNUExFIFJlc2FtcGxpbmcgQWxnb3JpdGhtCisgKiBAaW5ncm91cCBQSk1FRElBX0ZSQU1FX09QCisgKiBAYnJpZWYgU2FtcGxlIHJhdGUgY29udmVyc2lvbiBhbGdvcml0aG0KKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgYmFzZSByZXNhbXBsaW5nIGZ1bmN0aW9ucy4gSW4gYWRkaXRpb24gdG8gdGhpcywKKyAqIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhlIEByZWYgUEpNRURJQV9SRVNBTVBMRV9QT1JUIHdoaWNoIHByb3ZpZGVzCisgKiBtZWRpYSBwb3J0IGFic3RyYWN0aW9uIGZvciB0aGUgYmFzZSByZXNhbXBsaW5nIGFsZ29yaXRobS4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKy8qCisgKiBUaGlzIGZpbGUgZGVjbGFyZXMgdHdvIHR5cGVzIG9mIEFQSToKKyAqCisgKiBBcHBsaWNhdGlvbiBjYW4gdXNlICNwam1lZGlhX3Jlc2FtcGxlX2NyZWF0ZSgpIGFuZCAjcGptZWRpYV9yZXNhbXBsZV9ydW4oKQorICogdG8gY29udmVydCBhIGZyYW1lIGZyb20gc291cmNlIHJhdGUgdG8gZGVzdGluYXRpb24gcmF0ZS4gVGhlIGlucHVpdCBmcmFtZSAKKyAqIG11c3QgaGF2ZSBhIGNvbnN0YW50IGxlbmd0aC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBhcHBsaWNhdGlvbiBjYW4gY3JlYXRlIGEgcmVzYW1wbGluZyBwb3J0IHdpdGgKKyAqICNwam1lZGlhX3Jlc2FtcGxlX3BvcnRfY3JlYXRlKCkgYW5kIGNvbm5lY3QgdGhlIHBvcnQgdG8gb3RoZXIgcG9ydHMgdG8KKyAqIGNoYW5nZSB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgc2FtcGxlcy4KKyAqLworCisKKy8qKgorICogT3BhcXVlIHJlc2FtcGxlIHNlc3Npb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcmVzYW1wbGUgcGptZWRpYV9yZXNhbXBsZTsKKworLyoqCisgKiBDcmVhdGUgYSBmcmFtZSBiYXNlZCByZXNhbXBsZSBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBwb29sCQkJUG9vbCB0byBhbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGFuZCBidWZmZXJzLgorICogQHBhcmFtIGhpZ2hfcXVhbGl0eQkJSWYgdHJ1ZSwgdGhlbiBoaWdoIHF1YWxpdHkgY29udmVyc2lvbiB3aWxsIGJlCisgKgkJCQl1c2VkLCBhdCB0aGUgZXhwZW5zZSBvZiBtb3JlIENQVSBhbmQgbWVtb3J5LAorICoJCQkJYmVjYXVzZSB0ZW1wb3JhcnkgYnVmZmVyIG5lZWRzIHRvIGJlIGNyZWF0ZWQuCisgKiBAcGFyYW0gbGFyZ2VfZmlsdGVyCQlJZiB0cnVlLCBsYXJnZSBmaWx0ZXIgc2l6ZSB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkJTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIHJhdGVfaW4JCUNsb2NrIHJhdGUgb2YgdGhlIGlucHV0IHNhbXBsZXMuCisgKiBAcGFyYW0gcmF0ZV9vdXQJCUNsb2NrIHJhdGUgb2YgdGhlIG91dHB1dCBzYW1wbGVzLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lCU51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZSBpbiB0aGUgaW5wdXQuCisgKiBAcGFyYW0gcF9yZXNhbXBsZQkJUG9pbnRlciB0byByZWNlaXZlIHRoZSByZXNhbXBsZSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3Jlc2FtcGxlX2NyZWF0ZShwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgcGpfYm9vbF90IGhpZ2hfcXVhbGl0eSwKKwkJCQkJICAgICBwal9ib29sX3QgbGFyZ2VfZmlsdGVyLAorCQkJCQkgICAgIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCSAgICAgdW5zaWduZWQgcmF0ZV9pbiwKKwkJCQkJICAgICB1bnNpZ25lZCByYXRlX291dCwKKwkJCQkJICAgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICAgICBwam1lZGlhX3Jlc2FtcGxlICoqcF9yZXNhbXBsZSk7CisKKworLyoqCisgKiBVc2UgdGhlIHJlc2FtcGxlIHNlc3Npb24gdG8gcmVzYW1wbGUgYSBmcmFtZS4gVGhlIGZyYW1lIG11c3QgaGF2ZSB0aGUKKyAqIHNhbWUgc2l6ZSBhbmQgc2V0dGluZ3MgYXMgdGhlIHJlc2FtcGxlIHNlc3Npb24sIG9yIG90aGVyd2lzZSB0aGUKKyAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyAqCisgKiBAcGFyYW0gcmVzYW1wbGUJCVRoZSByZXNhbXBsZSBzZXNzaW9uLgorICogQHBhcmFtIGlucHV0CQkJQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGlucHV0IHNhbXBsZXMuCisgKiBAcGFyYW0gb3V0cHV0CQlCdWZmZXIgdG8gc3RvcmUgdGhlIG91dHB1dCBzYW1wbGVzLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfcmVzYW1wbGVfcnVuKCBwam1lZGlhX3Jlc2FtcGxlICpyZXNhbXBsZSwKKwkJCQkgICAgY29uc3QgcGpfaW50MTZfdCAqaW5wdXQsCisJCQkJICAgIHBqX2ludDE2X3QgKm91dHB1dCApOworCisKKy8qKgorICogR2V0IHRoZSBpbnB1dCBmcmFtZSBzaXplIG9mIGEgcmVzYW1wbGUgc2Vzc2lvbi4KKyAqCisgKiBAcGFyYW0gcmVzYW1wbGUJCVRoZSByZXNhbXBsZSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4JCQlUaGUgZnJhbWUgc2l6ZSwgaW4gbnVtYmVyIG9mIHNhbXBsZXMuCisgKi8KK1BKX0RFQ0wodW5zaWduZWQpIHBqbWVkaWFfcmVzYW1wbGVfZ2V0X2lucHV0X3NpemUocGptZWRpYV9yZXNhbXBsZSAqcmVzYW1wbGUpOworCisKKy8qKgorICogRGVzdHJveSB0aGUgcmVzYW1wbGUuCisgKgorICogQHBhcmFtIHJlc2FtcGxlCQlUaGUgcmVzYW1wbGUgc2Vzc2lvbi4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX3Jlc2FtcGxlX2Rlc3Ryb3kocGptZWRpYV9yZXNhbXBsZSAqcmVzYW1wbGUpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9SRVNBTVBMRV9QT1JUIFJlc2FtcGxlIFBvcnQKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVAorICogQGJyaWVmIEF1ZGlvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KKyAqIEB7CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBtZWRpYSBwb3J0IGFic3RyYWN0aW9uIGZvciBAcmVmIFBKTUVESUFfUkVTQU1QTEUuCisgKi8KKworCisvKioKKyAqIE9wdGlvbiBmbGFncyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyByZXNhbXBsZSBwb3J0LgorICovCitlbnVtIHBqbWVkaWFfcmVzYW1wbGVfcG9ydF9vcHRpb25zCit7CisgICAgLyoqCisgICAgICogRG8gbm90IHVzZSBoaWdoIHF1YWxpdHkgcmVzYW1wbGluZyBhbGdvcml0aG0sIGJ1dCB1c2UgbGluZWFyCisgICAgICogYWxnb3JpdGhtIGluc3RlYWQuCisgICAgICovCisgICAgUEpNRURJQV9SRVNBTVBMRV9VU0VfTElORUFSID0gMSwKKworICAgIC8qKgorICAgICAqIFVzZSBzbWFsbCBmaWx0ZXIgd29ya3NwYWNlIHdoZW4gaGlnaCBxdWFsaXR5IHJlc2FtcGxpbmcgaXMKKyAgICAgKiB1c2VkLgorICAgICAqLworICAgIFBKTUVESUFfUkVTQU1QTEVfVVNFX1NNQUxMX0ZJTFRFUiA9IDIsCisKKyAgICAvKioKKyAgICAgKiBEbyBub3QgZGVzdHJveSBkb3duc3RyZWFtIHBvcnQgd2hlbiByZXNhbXBsZSBwb3J0IGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBQSk1FRElBX1JFU0FNUExFX0RPTlRfREVTVFJPWV9ETiA9IDQKK307CisKKworCisvKioKKyAqIENyZWF0ZSBhIHJlc2FtcGxlIHBvcnQuIFRoaXMgY3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgcmVzYW1wbGUgc2Vzc2lvbiwKKyAqIHdoaWNoIHdpbGwgcmVzYW1wbGUgZnJhbWVzIHdoZW4gdGhlIHBvcnQncyBnZXRfZnJhbWUoKSBhbmQgcHV0X2ZyYW1lKCkKKyAqIGlzIGNhbGxlZC4KKyAqCisgKiBXaGVuIHRoZSByZXNhbXBsZSBwb3J0J3MgZ2V0X2ZyYW1lKCkgaXMgY2FsbGVkLCB0aGlzIHBvcnQgd2lsbCBnZXQKKyAqIGEgZnJhbWUgZnJvbSB0aGUgZG93bnN0cmVhbSBwb3J0IGFuZCByZXNhbXBsZSB0aGUgZnJhbWUgdG8gdGhlIHRhcmdldAorICogY2xvY2sgcmF0ZSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIHRoZSBjYWxsZXIuCisgKgorICogV2hlbiB0aGUgcmVzYW1wbGUgcG9ydCdzIHB1dF9mcmFtZSgpIGlzIGNhbGxlZCwgdGhpcyBwb3J0IHdpbGwgcmVzYW1wbGUKKyAqIHRoZSBmcmFtZSB0byB0aGUgZG93bnN0cmVhbSBwb3J0J3MgY2xvY2sgcmF0ZSBiZWZvcmUgZ2l2aW5nIHRoZSBmcmFtZQorICogdG8gdGhlIGRvd25zdHJlYW0gcG9ydC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJCVBvb2wgdG8gYWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBhbmQgYnVmZmVycy4KKyAqIEBwYXJhbSBkbl9wb3J0CQlUaGUgZG93bnN0cmVhbSBwb3J0LCB3aGljaCBjbG9jayByYXRlIGlzIHRvCisgKgkJCQliZSBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCBjbG9jayByYXRlLgorICogQHBhcmFtIGNsb2NrX3JhdGUJCVRhcmdldCBjbG9jayByYXRlLgorICogQHBhcmFtIG9wdGlvbnMJCUZsYWdzIGZyb20gI3BqbWVkaWFfcmVzYW1wbGVfcG9ydF9vcHRpb25zLgorICoJCQkJV2hlbiB0aGlzIGZsYWcgaXMgemVybywgdGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAqCQkJCWlzIHRvIHVzZSBoaWdoIHF1YWxpdHkgcmVzYW1wbGluZyB3aXRoCisgKgkJCQlsYXJnZSBmaWx0ZXIsIGFuZCB0byBkZXN0cm95IGRvd25zdHJlYW0gcG9ydAorICoJCQkJd2hlbiByZXNhbXBsZSBwb3J0IGlzIGRlc3Ryb3llZC4KKyAqIEBwYXJhbSBwX3BvcnQJCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgcmVzYW1wbGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9yZXNhbXBsZV9wb3J0X2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkJICAgcGptZWRpYV9wb3J0ICpkbl9wb3J0LAorCQkJCQkJICAgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJCSAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCQkgICBwam1lZGlhX3BvcnQgKipwX3BvcnQgKTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYJLyogX19QSk1FRElBX1JFU0FNUExFX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4NGY2MwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0Y3AuaApAQCAtMCwwICsxLDQ4NiBAQAorLyogJElkOiBydGNwLmggMzk5OSAyMDEyLTAzLTMwIDA3OjEwOjEzWiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9SVENQX0hfXworI2RlZmluZSBfX1BKTUVESUFfUlRDUF9IX18KKworLyoqCisgKiBAZmlsZSBydGNwLmgKKyAqIEBicmllZiBSVENQIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisjaW5jbHVkZSA8cGptZWRpYS9ydGNwX3hyLmg+CisjaW5jbHVkZSA8cGptZWRpYS9ydHAuaD4KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1JUQ1AgUlRDUCBTZXNzaW9uIGFuZCBFbmNhcHN1bGF0aW9uIChSRkMgMzU1MCkKKyAqIEBpbmdyb3VwIFBKTUVESUFfU0VTU0lPTgorICogQGJyaWVmIFJUQ1AgZm9ybWF0IGFuZCBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqIEB7CisgKgorICogUEpNRURJQSBpbXBsZW1lbnRzIHN1YnNldHMgb2YgUlRDUCBzcGVjaWZpY2F0aW9uIChSRkMgMzU1MCkgdG8gbW9uaXRvcgorICogdGhlIHF1YWxpdHkgb2YgdGhlIHJlYWwtdGltZSBtZWRpYSAoYXVkaW8vdmlkZW8pIHRyYW5zbWlzc2lvbi4gSW4KKyAqIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBxdWFsaXR5IG1vbml0b3JpbmcgYW5kIHJlcG9ydGluZyB3aXRoIFJUQ1AKKyAqIFNSIGFuZCBSUiB0eXBlcywgUEpNRURJQSdzIFJUQ1AgaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byByZXBvcnQKKyAqIGV4dGVuZGVkIHN0YXRpc3RpY3MgZm9yIGluY29taW5nIHN0cmVhbXMsIHN1Y2ggYXMgcGFja2V0IGR1cGxpY2F0aW9ucywKKyAqIHJlb3JkZXIsIGRpc2NhcmRlZCwgYW5kIGxvc3MgcGVyaW9kICh0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJhbmRvbQorICogYW5kIGJ1cnN0IGxvc3MpLgorICoKKyAqIFRoZSBiaWRpcmVjdGlvbmFsIG1lZGlhIHF1YWxpdHkgc3RhdGlzdGljIGlzIHJlcHJlc2VudGVkIHdpdGgKKyAqICNwam1lZGlhX3J0Y3Bfc3RhdCBzdHJ1Y3R1cmUuCisgKgorICogV2hlbiBhcHBsaWNhdGlvbiB1c2VzIHRoZSBzdHJlYW0gaW50ZXJmYWNlIChzZWUgQHJlZiBQSk1FRF9TVFJNKSwKKyAqIGFwcGxpY2F0aW9uIG1heSByZXRyaWV2ZSB0aGUgUlRDUCBzdGF0aXN0aWMgYnkgY2FsbGluZyAKKyAqICNwam1lZGlhX3N0cmVhbV9nZXRfc3RhdCgpIGZ1bmN0aW9uLgorICovCisKKyAKKyNwcmFnbWEgcGFjaygxKQorCisvKioKKyAqIFJUQ1Agc2VuZGVyIHJlcG9ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3NyCit7CisgICAgcGpfdWludDMyX3QJICAgIG50cF9zZWM7CSAgICAvKio8IE5UUCB0aW1lLCBzZWNvbmRzIHBhcnQuCSovCisgICAgcGpfdWludDMyX3QJICAgIG50cF9mcmFjOwkgICAgLyoqPCBOVFAgdGltZSwgZnJhY3Rpb25zIHBhcnQuCSovCisgICAgcGpfdWludDMyX3QJICAgIHJ0cF90czsJICAgIC8qKjwgUlRQIHRpbWVzdGFtcC4JCQkqLworICAgIHBqX3VpbnQzMl90CSAgICBzZW5kZXJfcGNvdW50OyAgLyoqPCBTZW5kZXIgcGFja2V0IGNvdW5kLgkJKi8KKyAgICBwal91aW50MzJfdAkgICAgc2VuZGVyX2Jjb3VudDsgIC8qKjwgU2VuZGVyIG9jdGV0L2J5dGVzIGNvdW50LgkqLworfSBwam1lZGlhX3J0Y3Bfc3I7CisKKworLyoqCisgKiBSVENQIHJlY2VpdmVyIHJlcG9ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3JyCit7CisgICAgcGpfdWludDMyX3QJICAgIHNzcmM7CSAgICAvKio8IFNTUkMgaWRlbnRpZmljYXRpb24uCQkqLworI2lmIGRlZmluZWQoUEpfSVNfQklHX0VORElBTikgJiYgUEpfSVNfQklHX0VORElBTiE9MAorICAgIHBqX3VpbnQzMl90CSAgICBmcmFjdF9sb3N0Ojg7ICAgLyoqPCBGcmFjdGlvbiBsb3N0LgkJCSovCisgICAgcGpfdWludDMyX3QJICAgIHRvdGFsX2xvc3RfMjo4OyAvKio8IFRvdGFsIGxvc3QsIGJpdCAxNi0yMy4JCSovCisgICAgcGpfdWludDMyX3QJICAgIHRvdGFsX2xvc3RfMTo4OyAvKio8IFRvdGFsIGxvc3QsIGJpdCA4LTE1LgkJKi8KKyAgICBwal91aW50MzJfdAkgICAgdG90YWxfbG9zdF8wOjg7IC8qKjwgVG90YWwgbG9zdCwgYml0IDAtNy4JCSovCisjZWxzZQorICAgIHBqX3VpbnQzMl90CSAgICBmcmFjdF9sb3N0Ojg7ICAgLyoqPCBGcmFjdGlvbiBsb3N0LgkJCSovCisgICAgcGpfdWludDMyX3QJICAgIHRvdGFsX2xvc3RfMjo4OyAvKio8IFRvdGFsIGxvc3QsIGJpdCAwLTcuCQkqLworICAgIHBqX3VpbnQzMl90CSAgICB0b3RhbF9sb3N0XzE6ODsgLyoqPCBUb3RhbCBsb3N0LCBiaXQgOC0xNS4JCSovCisgICAgcGpfdWludDMyX3QJICAgIHRvdGFsX2xvc3RfMDo4OyAvKio8IFRvdGFsIGxvc3QsIGJpdCAxNi0yMy4JCSovCisjZW5kaWYJCisgICAgcGpfdWludDMyX3QJICAgIGxhc3Rfc2VxOwkgICAgLyoqPCBMYXN0IHNlcXVlbmNlIG51bWJlci4JCSovCisgICAgcGpfdWludDMyX3QJICAgIGppdHRlcjsJICAgIC8qKjwgSml0dGVyLgkJCSovCisgICAgcGpfdWludDMyX3QJICAgIGxzcjsJICAgIC8qKjwgTGFzdCBTUi4JCQkqLworICAgIHBqX3VpbnQzMl90CSAgICBkbHNyOwkgICAgLyoqPCBEZWxheSBzaW5jZSBsYXN0IFNSLgkJKi8KK30gcGptZWRpYV9ydGNwX3JyOworCisKKy8qKgorICogUlRDUCBjb21tb24gaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3BfY29tbW9uCit7CisjaWYgZGVmaW5lZChQSl9JU19CSUdfRU5ESUFOKSAmJiBQSl9JU19CSUdfRU5ESUFOIT0wCisgICAgdW5zaWduZWQJICAgIHZlcnNpb246MjsJLyoqPCBwYWNrZXQgdHlwZSAgICAgICAgICAgICovCisgICAgdW5zaWduZWQJICAgIHA6MTsJLyoqPCBwYWRkaW5nIGZsYWcgICAgICAgICAgICovCisgICAgdW5zaWduZWQJICAgIGNvdW50OjU7CS8qKjwgdmFyaWVzIGJ5IHBheWxvYWQgdHlwZSAqLworICAgIHVuc2lnbmVkCSAgICBwdDo4OwkvKio8IHBheWxvYWQgdHlwZSAgICAgICAgICAgKi8KKyNlbHNlCisgICAgdW5zaWduZWQJICAgIGNvdW50OjU7CS8qKjwgdmFyaWVzIGJ5IHBheWxvYWQgdHlwZSAqLworICAgIHVuc2lnbmVkCSAgICBwOjE7CS8qKjwgcGFkZGluZyBmbGFnICAgICAgICAgICAqLworICAgIHVuc2lnbmVkCSAgICB2ZXJzaW9uOjI7CS8qKjwgcGFja2V0IHR5cGUgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkCSAgICBwdDo4OwkvKio8IHBheWxvYWQgdHlwZSAgICAgICAgICAgKi8KKyNlbmRpZgorICAgIHVuc2lnbmVkCSAgICBsZW5ndGg6MTY7CS8qKjwgcGFja2V0IGxlbmd0aCAgICAgICAgICAqLworICAgIHBqX3VpbnQzMl90CSAgICBzc3JjOwkvKio8IFNTUkMgaWRlbnRpZmljYXRpb24gICAgKi8KK30gcGptZWRpYV9ydGNwX2NvbW1vbjsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlY2xhcmVzIGRlZmF1bHQgUlRDUCBwYWNrZXQgKFNSKSB0aGF0IGlzIHNlbnQgYnkgcGptZWRpYS4KKyAqIEluY29taW5nIFJUQ1AgcGFja2V0IG1heSBoYXZlIGRpZmZlcmVudCBmb3JtYXQsIGFuZCBtdXN0IGJlIHBhcnNlZAorICogbWFudWFsbHkgYnkgYXBwbGljYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRjcF9zcl9wa3QKK3sKKyAgICBwam1lZGlhX3J0Y3BfY29tbW9uICBjb21tb247CS8qKjwgQ29tbW9uIGhlYWRlci4JICAgICovCisgICAgcGptZWRpYV9ydGNwX3NyCSBzcjsJCS8qKjwgU2VuZGVyIHJlcG9ydC4JICAgICovCisgICAgcGptZWRpYV9ydGNwX3JyCSBycjsJCS8qKjwgdmFyaWFibGUtbGVuZ3RoIGxpc3QgICAqLworfSBwam1lZGlhX3J0Y3Bfc3JfcGt0OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlY2xhcmVzIFJUQ1AgUlIgKFJlY2VpdmVyIFJlcG9ydCkgcGFja2V0LgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3BfcnJfcGt0Cit7CisgICAgcGptZWRpYV9ydGNwX2NvbW1vbiAgY29tbW9uOwkvKio8IENvbW1vbiBoZWFkZXIuCSAgICAqLworICAgIHBqbWVkaWFfcnRjcF9ycgkgcnI7CQkvKio8IHZhcmlhYmxlLWxlbmd0aCBsaXN0ICAgKi8KK30gcGptZWRpYV9ydGNwX3JyX3BrdDsKKworCisjcHJhZ21hIHBhY2soKQorCisKKy8qKgorICogUlRDUCBTREVTIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3NkZXMKK3sKKyAgICBwal9zdHJfdAljbmFtZTsJCS8qKjwgUlRDUCBTREVTIHR5cGUgQ05BTUUuCSovCisgICAgcGpfc3RyX3QJbmFtZTsJCS8qKjwgUlRDUCBTREVTIHR5cGUgTkFNRS4JKi8KKyAgICBwal9zdHJfdAllbWFpbDsJCS8qKjwgUlRDUCBTREVTIHR5cGUgRU1BSUwuCSovCisgICAgcGpfc3RyX3QJcGhvbmU7CQkvKio8IFJUQ1AgU0RFUyB0eXBlIFBIT05FLgkqLworICAgIHBqX3N0cl90CWxvYzsJCS8qKjwgUlRDUCBTREVTIHR5cGUgTE9DLgkqLworICAgIHBqX3N0cl90CXRvb2w7CQkvKio8IFJUQ1AgU0RFUyB0eXBlIFRPT0wuCSovCisgICAgcGpfc3RyX3QJbm90ZTsJCS8qKjwgUlRDUCBTREVTIHR5cGUgTk9URS4JKi8KK30gcGptZWRpYV9ydGNwX3NkZXM7CisKKworLyoqCisgKiBOVFAgdGltZSByZXByZXNlbnRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX250cF9yZWMKK3sKKyAgICBwal91aW50MzJfdAkgICAgaGk7CQkvKio8IEhpZ2ggb3JkZXIgMzItYml0IHBhcnQuCSovCisgICAgcGpfdWludDMyX3QJICAgIGxvOwkJLyoqPCBMbyBvcmRlciAzMi1iaXQgcGFydC4JKi8KK30gcGptZWRpYV9ydGNwX250cF9yZWM7CisKKworLyoqCisgKiBVbmlkaXJlY3Rpb25hbCBSVFAgc3RyZWFtIHN0YXRpc3RpY3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRjcF9zdHJlYW1fc3RhdAoreworICAgIHBqX3RpbWVfdmFsCSAgICB1cGRhdGU7CS8qKjwgVGltZSBvZiBsYXN0IHVwZGF0ZS4JCSAgICAqLworICAgIHVuc2lnbmVkCSAgICB1cGRhdGVfY250OwkvKio8IE51bWJlciBvZiB1cGRhdGVzICh0byBjYWxjdWxhdGUgYXZnKSAgICovCisgICAgcGpfdWludDMyX3QJICAgIHBrdDsJLyoqPCBUb3RhbCBudW1iZXIgb2YgcGFja2V0cwkJICAgICovCisgICAgcGpfdWludDMyX3QJICAgIGJ5dGVzOwkvKio8IFRvdGFsIG51bWJlciBvZiBwYXlsb2FkL2J5dGVzCSAgICAqLworICAgIHVuc2lnbmVkCSAgICBkaXNjYXJkOwkvKio8IFRvdGFsIG51bWJlciBvZiBkaXNjYXJkZWQgcGFja2V0cy4JICAgICovCisgICAgdW5zaWduZWQJICAgIGxvc3M7CS8qKjwgVG90YWwgbnVtYmVyIG9mIHBhY2tldHMgbG9zdAkgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgcmVvcmRlcjsJLyoqPCBUb3RhbCBudW1iZXIgb2Ygb3V0IG9mIG9yZGVyIHBhY2tldHMgICAqLworICAgIHVuc2lnbmVkCSAgICBkdXA7CS8qKjwgVG90YWwgbnVtYmVyIG9mIGR1cGxpY2F0ZXMgcGFja2V0cwkgICAgKi8KKworICAgIHBqX21hdGhfc3RhdCAgICBsb3NzX3BlcmlvZDsvKio8IExvc3MgcGVyaW9kIHN0YXRpc3RpY3MgKGluIHVzZWMpCSAgICAqLworCisgICAgc3RydWN0IHsKKwl1bnNpZ25lZCAgICBidXJzdDoxOwkvKio8IEJ1cnN0L3NlcXVlbnRpYWwgcGFja2V0IGxvc3QgZGV0ZWN0ZWQgICovCisgICAgCXVuc2lnbmVkICAgIHJhbmRvbToxOwkvKio8IFJhbmRvbSBwYWNrZXQgbG9zdCBkZXRlY3RlZC4JICAgICovCisgICAgfSBsb3NzX3R5cGU7CQkvKio8IFR5cGVzIG9mIGxvc3MgZGV0ZWN0ZWQuCQkgICAgKi8KKworICAgIHBqX21hdGhfc3RhdCAgICBqaXR0ZXI7CS8qKjwgSml0dGVyIHN0YXRpc3RpY3MgKGluIHVzZWMpCSAgICAqLworCit9IHBqbWVkaWFfcnRjcF9zdHJlYW1fc3RhdDsKKworCisvKioKKyAqIEJpZGlyZWN0aW9uYWwgUlRQIHN0cmVhbSBzdGF0aXN0aWNzLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3Bfc3RhdAoreworICAgIHBqX3RpbWVfdmFsCQkgICAgIHN0YXJ0OyAvKio8IFRpbWUgd2hlbiBzZXNzaW9uIHdhcyBjcmVhdGVkCSAgICAqLworCisgICAgcGptZWRpYV9ydGNwX3N0cmVhbV9zdGF0IHR4OyAgICAvKio8IEVuY29kZXIgc3RyZWFtIHN0YXRpc3RpY3MuCSAgICAqLworICAgIHBqbWVkaWFfcnRjcF9zdHJlYW1fc3RhdCByeDsgICAgLyoqPCBEZWNvZGVyIHN0cmVhbSBzdGF0aXN0aWNzLgkgICAgKi8KKyAgICAKKyAgICBwal9tYXRoX3N0YXQJICAgICBydHQ7ICAgLyoqPCBSb3VuZCB0cmlwIGRlbGF5IHN0YXRpc3RpYyhpbiB1c2VjKSovCisKKyAgICBwal91aW50MzJfdAkJICAgICBydHBfdHhfbGFzdF90czsgLyoqPCBMYXN0IFRYIFJUUCB0aW1lc3RhbXAuICAgICovCisgICAgcGpfdWludDE2X3QJCSAgICAgcnRwX3R4X2xhc3Rfc2VxOy8qKjwgTGFzdCBUWCBSVFAgc2VxdWVuY2UuCSAgICAqLworCisjaWYgZGVmaW5lZChQSk1FRElBX1JUQ1BfU1RBVF9IQVNfSVBEVikgJiYgUEpNRURJQV9SVENQX1NUQVRfSEFTX0lQRFYhPTAKKyAgICBwal9tYXRoX3N0YXQJICAgICByeF9pcGR2Oy8qKjwgU3RhdGlzdGljcyBvZiBJUCBwYWNrZXQgZGVsYXkKKwkJCQkgICAgICAgICAgdmFyaWF0aW9uIGluIHJlY2VpdmluZyBkaXJlY3Rpb24KKwkJCQkJICAoaW4gdXNlYykuCQkJICAgICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEpNRURJQV9SVENQX1NUQVRfSEFTX1JBV19KSVRURVIpICYmIFBKTUVESUFfUlRDUF9TVEFUX0hBU19SQVdfSklUVEVSIT0wCisgICAgcGpfbWF0aF9zdGF0CSAgICAgcnhfcmF3X2ppdHRlcjsvKio8IFN0YXRpc3RpYyBvZiByYXcgaml0dGVyIGluCisJCQkJCQlyZWNlaXZpbmcgZGlyZWN0aW9uIAorCQkJCQkJKGluIHVzZWMpLgkJICAgICovCisjZW5kaWYKKworICAgIHBqbWVkaWFfcnRjcF9zZGVzCSAgICAgcGVlcl9zZGVzOwkvKio8IFBlZXIgU0RFUy4JCQkgICAgKi8KKyAgICBjaGFyCQkgICAgIHBlZXJfc2Rlc19idWZfW1BKTUVESUFfUlRDUF9SWF9TREVTX0JVRl9MRU5dOworCQkJCQkvKio8IFBlZXIgU0RFUyBidWZmZXIuCQkgICAgKi8KKworfSBwam1lZGlhX3J0Y3Bfc3RhdDsKKworCisvKioKKyAqIFJUQ1Agc2Vzc2lvbiBpcyB1c2VkIHRvIG1vbml0b3IgdGhlIFJUUCBzZXNzaW9uIG9mIG9uZSBlbmRwb2ludC4gVGhlcmUKKyAqIHNob3VsZCBvbmx5IGJlIG9uZSBSVENQIHNlc3Npb24gZm9yIGEgYmlkaXJlY3Rpb25hbCBSVFAgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3Nlc3Npb24KK3sKKyAgICBjaGFyCQkgICAqbmFtZTsJLyoqPCBOYW1lIGlkZW50aWZpY2F0aW9uLgkgICAgKi8KKyAgICBwam1lZGlhX3J0Y3Bfc3JfcGt0CSAgICBydGNwX3NyX3BrdDsvKio8IENhY2hlZCBSVENQIFNSIHBhY2tldC4JICAgICovCisgICAgcGptZWRpYV9ydGNwX3JyX3BrdAkgICAgcnRjcF9ycl9wa3Q7LyoqPCBDYWNoZWQgUlRDUCBSUiBwYWNrZXQuCSAgICAqLworICAgIAorICAgIHBqbWVkaWFfcnRwX3NlcV9zZXNzaW9uIHNlcV9jdHJsOwkvKio8IFJUQ1Agc2VxdWVuY2UgbnVtYmVyIGNvbnRyb2wuICAqLworICAgIHVuc2lnbmVkCQkgICAgcnRwX2xhc3RfdHM7LyoqPCBMYXN0IHRpbWVzdGFtcCBpbiBSWCBSVFAgcGt0LiAgKi8KKworICAgIHVuc2lnbmVkCQkgICAgY2xvY2tfcmF0ZTsJLyoqPCBDbG9jayByYXRlIG9mIHRoZSBzdHJlYW0JICAgICovCisgICAgdW5zaWduZWQJCSAgICBwa3Rfc2l6ZTsJLyoqPCBBdmcgcGt0IHNpemUsIGluIHNhbXBsZXMuCSAgICAqLworICAgIHBqX3VpbnQzMl90CQkgICAgcmVjZWl2ZWQ7ICAgLyoqPCAjIHBrdCByZWNlaXZlZAkJICAgICovCisgICAgcGpfdWludDMyX3QJCSAgICBleHBfcHJpb3I7CS8qKjwgIyBwa3QgZXhwZWN0ZWQgYXQgbGFzdCBpbnRlcnZhbCovCisgICAgcGpfdWludDMyX3QJCSAgICByeF9wcmlvcjsJLyoqPCAjIHBrdCByZWNlaXZlZCBhdCBsYXN0IGludGVydmFsKi8KKyAgICBwal9pbnQzMl90CQkgICAgdHJhbnNpdDsgICAgLyoqPCBSZWwgdHJhbnNpdCB0aW1lIGZvciBwcmV2IHBrdCAgKi8KKyAgICBwal91aW50MzJfdAkJICAgIGppdHRlcjsJLyoqPCBTY2FsZWQgaml0dGVyCQkgICAgKi8KKyAgICBwal90aW1lX3ZhbAkJICAgIHR2X2Jhc2U7CS8qKjwgQmFzZSB0aW1lLCBpbiBzZWNvbmRzLgkgICAgKi8KKyAgICBwal90aW1lc3RhbXAJICAgIHRzX2Jhc2U7CS8qKjwgQmFzZSBzeXN0ZW0gdGltZXN0YW1wLgkgICAgKi8KKyAgICBwal90aW1lc3RhbXAJICAgIHRzX2ZyZXE7CS8qKjwgU3lzdGVtIHRpbWVzdGFtcCBmcmVxdWVuY3kuICAgICovCisgICAgcGpfdWludDMyX3QJCSAgICBydHBfdHNfYmFzZTsvKio8IEJhc2UgUlRQIHRpbWVzdGFtcC4JICAgICovCisKKyAgICBwal91aW50MzJfdAkJICAgIHJ4X2xzcjsJLyoqPCBOVFAgdHMgaW4gbGFzdCBTUiByZWNlaXZlZAkgICAgKi8KKyAgICBwal90aW1lc3RhbXAJICAgIHJ4X2xzcl90aW1lOy8qKjwgVGltZSB3aGVuIGxhc3QgU1IgaXMgcmVjZWl2ZWQgICovCisgICAgcGpfdWludDMyX3QJCSAgICBwZWVyX3NzcmM7CS8qKjwgUGVlciBTU1JDCQkJICAgICovCisgICAgCisgICAgcGptZWRpYV9ydGNwX3N0YXQJICAgIHN0YXQ7CS8qKjwgQmlkaXJlY3Rpb25hbCBzdHJlYW0gc3RhdC4JICAgICovCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1JUQ1BfWFIpICYmIChQSk1FRElBX0hBU19SVENQX1hSICE9IDApCisgICAgLyoqCisgICAgICogU3BlY2lmeSB3aGV0aGVyIFJUQ1AgWFIgcHJvY2Vzc2luZyBpcyBlbmFibGVkIG9uIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwal9ib29sX3QJCSAgICB4cl9lbmFibGVkOworCisgICAgLyoqCisgICAgICogUlRDUCBYUiBzZXNzaW9uLCBvbmx5IHZhbGlkIGlmIFJUQ1AgWFIgcHJvY2Vzc2luZyBpcyBlbmFibGVkCisgICAgICogb24gdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHBqbWVkaWFfcnRjcF94cl9zZXNzaW9uIHhyX3Nlc3Npb247CisjZW5kaWYKK30gcGptZWRpYV9ydGNwX3Nlc3Npb247CisKKworLyoqCisgKiBSVENQIHNlc3Npb24gc2V0dGluZ3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRjcF9zZXNzaW9uX3NldHRpbmcKK3sKKyAgICBjaGFyCSAgICAqbmFtZTsJCS8qKjwgUlRDUCBzZXNzaW9uIG5hbWUuCQkqLworICAgIHVuc2lnbmVkCSAgICAgY2xvY2tfcmF0ZTsJLyoqPCBTZXF1ZW5jZS4JCQkqLworICAgIHVuc2lnbmVkCSAgICAgc2FtcGxlc19wZXJfZnJhbWU7CS8qKjwgVGltZXN0YW1wLgkJCSovCisgICAgcGpfdWludDMyX3QJICAgICBzc3JjOwkJLyoqPCBTZW5kZXIgU1NSQy4JCSovCisgICAgcGpfdWludDMyX3QJICAgICBydHBfdHNfYmFzZTsJLyoqPCBCYXNlIFJUUCB0aW1lc3RhbXAuCSovCit9IHBqbWVkaWFfcnRjcF9zZXNzaW9uX3NldHRpbmc7CisKKworLyoqCisgKiBJbml0aWFsaXplIFJUQ1Agc2Vzc2lvbiBzZXR0aW5nLgorICoKKyAqIEBwYXJhbSBzZXR0aW5ncwkgICAgVGhlIFJUQ1Agc2Vzc2lvbiBzZXR0aW5nIHRvIGJlIGluaXRpYWxpemVkLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfcnRjcF9zZXNzaW9uX3NldHRpbmdfZGVmYXVsdCgKKwkJCQkgICAgcGptZWRpYV9ydGNwX3Nlc3Npb25fc2V0dGluZyAqc2V0dGluZ3MpOworCisKKy8qKgorICogSW5pdGlhbGl6ZSBiaWRpcmVjdGlvbmFsIFJUQ1Agc3RhdGlzdGljcy4KKyAqCisgKiBAcGFyYW0gc3RhdAkJICAgIFRoZSBiaWRpcmVjdGlvbmFsIFJUQ1Agc3RhdGlzdGljcy4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX3J0Y3BfaW5pdF9zdGF0KHBqbWVkaWFfcnRjcF9zdGF0ICpzdGF0KTsKKworCisvKioKKyAqIEluaXRpYWxpemUgUlRDUCBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCSAgICBUaGUgc2Vzc2lvbgorICogQHBhcmFtIG5hbWUJCSAgICBPcHRpb25hbCBuYW1lIHRvIGlkZW50aWZ5IHRoZSBzZXNzaW9uIChmb3IKKyAqCQkJICAgIGxvZ2dpbmcgcHVycG9zZSkuCisgKiBAcGFyYW0gY2xvY2tfcmF0ZQkgICAgQ29kZWMgY2xvY2sgcmF0ZSBpbiBzYW1wbGVzIHBlciBzZWNvbmQuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgQXZlcmFnZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gc3NyYwkJICAgIFRoZSBTU1JDIHVzZWQgaW4gdG8gaWRlbnRpZnkgdGhlIHNlc3Npb24uCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ydGNwX2luaXQoIHBqbWVkaWFfcnRjcF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkgY2hhciAqbmFtZSwKKwkJCQkgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJIHBqX3VpbnQzMl90IHNzcmMgKTsKKworCisvKioKKyAqIEluaXRpYWxpemUgUlRDUCBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCSAgICBUaGUgc2Vzc2lvbgorICogQHBhcmFtIHNldHRpbmdzCSAgICBUaGUgUlRDUCBzZXNzaW9uIHNldHRpbmdzLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfcnRjcF9pbml0Mihwam1lZGlhX3J0Y3Bfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkgY29uc3QgcGptZWRpYV9ydGNwX3Nlc3Npb25fc2V0dGluZyAqc2V0dGluZ3MpOworCisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byByZXRyaWV2ZSBjdXJyZW50IE5UUCB0aW1lc3RhbXAuCisgKgorICogQHBhcmFtIHNlc3MJCSAgICBSVENQIHNlc3Npb24uCisgKiBAcGFyYW0gbnRwCQkgICAgTlRQIHJlY29yZC4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3J0Y3BfZ2V0X250cF90aW1lKGNvbnN0IHBqbWVkaWFfcnRjcF9zZXNzaW9uICpzZXNzLAorCQkJCQkgICAgICAgcGptZWRpYV9ydGNwX250cF9yZWMgKm50cCk7CisKKworLyoqCisgKiBEZWluaXRpYWxpemUgUlRDUCBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uICAgVGhlIHNlc3Npb24uCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ydGNwX2ZpbmkoIHBqbWVkaWFfcnRjcF9zZXNzaW9uICpzZXNzaW9uKTsKKworCisvKioKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiBldmVyeXRpbWUgYW4gUlRQIHBhY2tldCBpcyByZWNlaXZlZCB0byBsZXQgdGhlIFJUQ1AKKyAqIHNlc3Npb24gZG8gaXRzIGludGVybmFsIGNhbGN1bGF0aW9ucy4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbiAgIFRoZSBzZXNzaW9uLgorICogQHBhcmFtIHNlcQkgICAgVGhlIFJUUCBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyLCBpbiBob3N0IGJ5dGUgb3JkZXIuCisgKiBAcGFyYW0gdHMJICAgIFRoZSBSVFAgcGFja2V0IHRpbWVzdGFtcCwgaW4gaG9zdCBieXRlIG9yZGVyLgorICogQHBhcmFtIHBheWxvYWQgICBTaXplIG9mIHRoZSBwYXlsb2FkLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfcnRjcF9yeF9ydHAoIHBqbWVkaWFfcnRjcF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkgICB1bnNpZ25lZCBzZXEsIAorCQkJCSAgIHVuc2lnbmVkIHRzLAorCQkJCSAgIHVuc2lnbmVkIHBheWxvYWQpOworCisKKy8qKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGV2ZXJ5dGltZSBhbiBSVFAgcGFja2V0IGlzIHJlY2VpdmVkIHRvIGxldCB0aGUgUlRDUAorICogc2Vzc2lvbiBkbyBpdHMgaW50ZXJuYWwgY2FsY3VsYXRpb25zLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uICAgVGhlIHNlc3Npb24uCisgKiBAcGFyYW0gc2VxCSAgICBUaGUgUlRQIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIsIGluIGhvc3QgYnl0ZSBvcmRlci4KKyAqIEBwYXJhbSB0cwkgICAgVGhlIFJUUCBwYWNrZXQgdGltZXN0YW1wLCBpbiBob3N0IGJ5dGUgb3JkZXIuCisgKiBAcGFyYW0gcGF5bG9hZCAgIFNpemUgb2YgdGhlIHBheWxvYWQuCisgKiBAcGFyYW0gZGlzY2FyZGVkIEZsYWcgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBwYWNrZXQgaXMgZGlzY2FyZGVkLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfcnRjcF9yeF9ydHAyKHBqbWVkaWFfcnRjcF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkgICB1bnNpZ25lZCBzZXEsIAorCQkJCSAgIHVuc2lnbmVkIHRzLAorCQkJCSAgIHVuc2lnbmVkIHBheWxvYWQsCisJCQkJICAgcGpfYm9vbF90IGRpc2NhcmRlZCk7CisKKworLyoqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gZXZlcnl0aW1lIGFuIFJUUCBwYWNrZXQgaXMgc2VudCB0byBsZXQgdGhlIFJUQ1Agc2Vzc2lvbgorICogZG8gaXRzIGludGVybmFsIGNhbGN1bGF0aW9ucy4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbiAgIFRoZSBzZXNzaW9uLgorICogQHBhcmFtIHB0c2l6ZSAgICBUaGUgcGF5bG9hZCBzaXplIG9mIHRoZSBSVFAgcGFja2V0IChpZSBwYWNrZXQgbWludXMKKyAqCQkgICAgUlRQIGhlYWRlcikgaW4gYnl0ZXMuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ydGNwX3R4X3J0cCggcGptZWRpYV9ydGNwX3Nlc3Npb24gKnNlc3Npb24sIAorCQkJCSAgIHVuc2lnbmVkIHB0c2l6ZSApOworCisKKy8qKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYW4gUlRDUCBwYWNrZXQgaXMgcmVjZWl2ZWQgZnJvbSByZW1vdGUgcGVlci4KKyAqIFRoaXMgUlRDUCBwYWNrZXQgcmVjZWl2ZWQgZnJvbSByZW1vdGUgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGVuZC10by0KKyAqIGVuZCBkZWxheSBvZiB0aGUgbmV0d29yay4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbiAgIFJUQ1Agc2Vzc2lvbi4KKyAqIEBwYXJhbSBydGNwX3BrdCAgVGhlIHJlY2VpdmVkIFJUQ1AgcGFja2V0LgorICogQHBhcmFtIHNpemUJICAgIFNpemUgb2YgdGhlIGluY29taW5nIHBhY2tldC4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX3J0Y3BfcnhfcnRjcCggcGptZWRpYV9ydGNwX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJICAgIGNvbnN0IHZvaWQgKnJ0Y3BfcGt0LAorCQkJCSAgICBwal9zaXplX3Qgc2l6ZSk7CisKKworLyoqCisgKiBCdWlsZCBhIFJUQ1AgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkIHRvIHJlbW90ZSBSVFAgcGVlci4gVGhpcyB3aWxsCisgKiBjcmVhdGUgUlRDUCBTZW5kZXIgUmVwb3J0IChTUikgb3IgUmVjZWl2ZXIgUmVwb3J0IChSUikgZGVwZW5kaW5nIG9uCisgKiB3aGV0aGVyIHRoZSBlbmRwb2ludCBoYXMgYmVlbiB0cmFuc21pdHRpbmcgUlRQIHNpbmNlIHRoZSBsYXN0IGludGVydmFsLgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgaW50ZXJ2YWwgY291bnRlcnMgKHN1Y2ggYXMKKyAqIHRoZSBvbmVzIHRvIGNhbGN1bGF0ZSBmcmFjdGlvbiBsb3N0KSBpbiB0aGUgc2Vzc2lvbi4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbiAgIFRoZSBSVENQIHNlc3Npb24uCisgKiBAcGFyYW0gcnRjcF9wa3QgIFVwb24gcmV0dXJuLCBpdCB3aWxsIGNvbnRhaW4gcG9pbnRlciB0byB0aGUgCisgKgkJICAgIFJUQ1AgcGFja2V0LCB3aGljaCBjYW4gYmUgUlRDUCBTUiBvciBSUi4KKyAqIEBwYXJhbSBsZW4JICAgIFVwb24gcmV0dXJuLCBpdCB3aWxsIGluZGljYXRlIHRoZSBzaXplIG9mIAorICoJCSAgICB0aGUgUlRDUCBwYWNrZXQuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ydGNwX2J1aWxkX3J0Y3AoIHBqbWVkaWFfcnRjcF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkgICAgICAgdm9pZCAqKnJ0Y3BfcGt0LCBpbnQgKmxlbik7CisKKworLyoqCisgKiBCdWlsZCBhbiBSVENQIFNERVMgKHNvdXJjZSBkZXNjcmlwdGlvbikgcGFja2V0LiBUaGlzIHBhY2tldCBjYW4gYmUKKyAqIGFwcGVuZGVkIHRvIG90aGVyIFJUQ1AgcGFja2V0cywgZS5nOiBSVENQIFJSL1NSLCB0byBjb21wb3NlIGEgY29tcG91bmQKKyAqIFJUQ1AgcGFja2V0LgorICoKKyAqIEBwYXJhbSBzZXNzaW9uICAgVGhlIFJUQ1Agc2Vzc2lvbi4KKyAqIEBwYXJhbSBidWYJICAgIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBSVENQIFNERVMgcGFja2V0LgorICogQHBhcmFtIGxlbmd0aCAgICBPbiBpbnB1dCwgaXQgd2lsbCBjb250YWluIHRoZSBidWZmZXIgbGVuZ3RoLgorICoJCSAgICBPbiBvdXRwdXQsIGl0IHdpbGwgY29udGFpbiB0aGUgZ2VuZXJhdGVkIFJUQ1AgU0RFUworICoJCSAgICBwYWNrZXQgbGVuZ3RoLgorICogQHBhcmFtIHNkZXMJICAgIFRoZSBzb3VyY2UgZGVzY3JpcHRpb24sIHNlZSAjcGptZWRpYV9ydGNwX3NkZXMuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3J0Y3BfYnVpbGRfcnRjcF9zZGVzKAorCQkJCQkgICAgcGptZWRpYV9ydGNwX3Nlc3Npb24gKnNlc3Npb24sIAorCQkJCQkgICAgdm9pZCAqYnVmLAorCQkJCQkgICAgcGpfc2l6ZV90ICpsZW5ndGgsCisJCQkJCSAgICBjb25zdCBwam1lZGlhX3J0Y3Bfc2RlcyAqc2Rlcyk7CisKKy8qKgorICogQnVpbGQgYW4gUlRDUCBCWUUgcGFja2V0LiBUaGlzIHBhY2tldCBjYW4gYmUgYXBwZW5kZWQgdG8gb3RoZXIgUlRDUAorICogcGFja2V0cywgZS5nOiBSVENQIFJSL1NSLCB0byBjb21wb3NlIGEgY29tcG91bmQgUlRDUCBwYWNrZXQuCisgKgorICogQHBhcmFtIHNlc3Npb24gICBUaGUgUlRDUCBzZXNzaW9uLgorICogQHBhcmFtIGJ1ZgkgICAgVGhlIGJ1ZmZlciB0byByZWNlaXZlIFJUQ1AgQllFIHBhY2tldC4KKyAqIEBwYXJhbSBsZW5ndGggICAgT24gaW5wdXQsIGl0IHdpbGwgY29udGFpbiB0aGUgYnVmZmVyIGxlbmd0aC4KKyAqCQkgICAgT24gb3V0cHV0LCBpdCB3aWxsIGNvbnRhaW4gdGhlIGdlbmVyYXRlZCBSVENQIEJZRQorICoJCSAgICBwYWNrZXQgbGVuZ3RoLgorICogQHBhcmFtIHJlYXNvbiAgICBPcHRpb25hbCwgdGhlIEJZRSByZWFzb24uCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3J0Y3BfYnVpbGRfcnRjcF9ieWUoCisJCQkJCSAgICBwam1lZGlhX3J0Y3Bfc2Vzc2lvbiAqc2Vzc2lvbiwgCisJCQkJCSAgICB2b2lkICpidWYsCisJCQkJCSAgICBwal9zaXplX3QgKmxlbmd0aCwKKwkJCQkJICAgIGNvbnN0IHBqX3N0cl90ICpyZWFzb24pOworCisKKy8qKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGlmIFJUQ1AgWFIgbmVlZHMgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZCBpbiB0aGUgCisgKiBSVENQIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24gICBUaGUgUlRDUCBzZXNzaW9uLgorICogQHBhcmFtIGVuYWJsZSAgICBFbmFibGUvZGlzYWJsZSBSVENQIFhSLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9ydGNwX2VuYWJsZV94ciggcGptZWRpYV9ydGNwX3Nlc3Npb24gKnNlc3Npb24sIAorCQkJCQkgICAgIHBqX2Jvb2xfdCBlbmFibGUpOworCisKKy8qKgorICogQH0KKyAqLworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfUlRDUF9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0Y3BfeHIuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0Y3BfeHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDUwZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvcnRjcF94ci5oCkBAIC0wLDAgKzEsNDc4IEBACisvKiAkSWQ6IHJ0Y3BfeHIuaCAzOTk5IDIwMTItMDMtMzAgMDc6MTA6MTNaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1JUQ1BfWFJfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9SVENQX1hSX0hfXworCisvKioKKyAqIEBmaWxlIHJ0Y3BfeHIuaAorICogQGJyaWVmIFJUQ1AgWFIgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKyNpbmNsdWRlIDxwai9tYXRoLmg+CisKKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1JUQ1BfWFIgUlRDUCBFeHRlbmRlZCBSZXBvcnQgKFhSKSAtIFJGQyAzNjExCisgKiBAaW5ncm91cCBQSk1FRElBX1NFU1NJT04KKyAqIEBicmllZiBSVENQIFhSIGV4dGVuc2lvbiB0byBSVENQIHNlc3Npb24KKyAqIEB7CisgKgorICogUEpNRURJQSBpbXBsZW1lbnRzIHN1YnNldHMgb2YgUlRDUCBYUiBzcGVjaWZpY2F0aW9uIChSRkMgMzYxMSkgdG8gbW9uaXRvcgorICogdGhlIHF1YWxpdHkgb2YgdGhlIHJlYWwtdGltZSBtZWRpYSAoYXVkaW8vdmlkZW8pIHRyYW5zbWlzc2lvbi4KKyAqLworCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHJlcG9ydCB0eXBlcyBvZiBSVENQIFhSLiBVc2VmdWwgZm9yIHVzZXIgdG8gZW5hYmxlIHZhcnlpbmcKKyAqIGNvbWJpbmF0aW9ucyBvZiBSVENQIFhSIHJlcG9ydCBibG9ja3MuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgUEpNRURJQV9SVENQX1hSX0xPU1NfUkxFCSAgICA9ICgxIDw8IDApLAorICAgIFBKTUVESUFfUlRDUF9YUl9EVVBfUkxFCSAgICA9ICgxIDw8IDEpLAorICAgIFBKTUVESUFfUlRDUF9YUl9SQ1BUX1RJTUVTCSAgICA9ICgxIDw8IDIpLAorICAgIFBKTUVESUFfUlRDUF9YUl9SUl9USU1FCSAgICA9ICgxIDw8IDMpLAorICAgIFBKTUVESUFfUlRDUF9YUl9ETFJSCSAgICA9ICgxIDw8IDQpLAorICAgIFBKTUVESUFfUlRDUF9YUl9TVEFUUwkgICAgPSAoMSA8PCA1KSwKKyAgICBQSk1FRElBX1JUQ1BfWFJfVk9JUF9NRVRSSUNTICAgID0gKDEgPDwgNikKK30gcGptZWRpYV9ydGNwX3hyX3R5cGU7CisKKy8qKgorICogRW51bWVyYXRpb24gb2YgaW5mbyBuZWVkIHRvIGJlIHVwZGF0ZWQgbWFudWFsbHkgdG8gUlRDUCBYUi4gTW9zdCBpbmZvCisgKiBjb3VsZCBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgZWFjaCB0aW1lIFJUUCByZWNlaXZlZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBQSk1FRElBX1JUQ1BfWFJfSU5GT19TSUdOQUxfTFZMID0gMSwKKyAgICBQSk1FRElBX1JUQ1BfWFJfSU5GT19OT0lTRV9MVkwgID0gMiwKKyAgICBQSk1FRElBX1JUQ1BfWFJfSU5GT19SRVJMCSAgICA9IDMsCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fUl9GQUNUT1IgICA9IDQsCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fTU9TX0xRCSAgICA9IDUsCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fTU9TX0NRCSAgICA9IDYsCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fQ09ORl9QTEMgICA9IDcsCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fQ09ORl9KQkEgICA9IDgsCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fQ09ORl9KQlIgICA9IDksCisgICAgUEpNRURJQV9SVENQX1hSX0lORk9fSkJfTk9NCSAgICA9IDEwLAorICAgIFBKTUVESUFfUlRDUF9YUl9JTkZPX0pCX01BWAkgICAgPSAxMSwKKyAgICBQSk1FRElBX1JUQ1BfWFJfSU5GT19KQl9BQlNfTUFYID0gMTIKK30gcGptZWRpYV9ydGNwX3hyX2luZm87CisKKy8qKgorICogRW51bWVyYXRpb24gb2YgUExDIHR5cGVzIGRlZmluaXRpb25zIGZvciBSVENQIFhSIHJlcG9ydC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBQSk1FRElBX1JUQ1BfWFJfUExDX1VOSwkgICAgPSAwLAorICAgIFBKTUVESUFfUlRDUF9YUl9QTENfRElTCSAgICA9IDEsCisgICAgUEpNRURJQV9SVENQX1hSX1BMQ19FTkgJICAgID0gMiwKKyAgICBQSk1FRElBX1JUQ1BfWFJfUExDX1NURAkgICAgPSAzCit9IHBqbWVkaWFfcnRjcF94cl9wbGNfdHlwZTsKKworLyoqCisgKiBFbnVtZXJhdGlvbiBvZiBqaXR0ZXIgYnVmZmVyIHR5cGVzIGRlZmluaXRpb25zIGZvciBSVENQIFhSIHJlcG9ydC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBQSk1FRElBX1JUQ1BfWFJfSkJfVU5LTk9XTiAgICAgID0gMCwKKyAgICBQSk1FRElBX1JUQ1BfWFJfSkJfRklYRUQgICAgICAgID0gMiwKKyAgICBQSk1FRElBX1JUQ1BfWFJfSkJfQURBUFRJVkUgICAgID0gMworfSBwam1lZGlhX3J0Y3BfeHJfamJfdHlwZTsKKworCisjcHJhZ21hIHBhY2soMSkKKworLyoqCisgKiBUaGlzIHR5cGUgZGVjbGFyZXMgUlRDUCBYUiBSZXBvcnQgSGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3BfeHJfcmJfaGVhZGVyCit7CisgICAgcGpfdWludDhfdAkJIGJ0OwkJLyoqPCBCbG9jayB0eXBlLgkJKi8KKyAgICBwal91aW50OF90CQkgc3BlY2lmaWM7CS8qKjwgQmxvY2sgc3BlY2lmaWMgZGF0YS4JKi8KKyAgICBwal91aW50MTZfdAkJIGxlbmd0aDsJLyoqPCBCbG9jayBsZW5ndGguCQkqLworfSBwam1lZGlhX3J0Y3BfeHJfcmJfaGVhZGVyOworCisvKioKKyAqIFRoaXMgdHlwZSBkZWNsYXJlcyBSVENQIFhSIFJlY2VpdmVyIFJlZmVyZW5jZSBUaW1lIFJlcG9ydCBCbG9jay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3hyX3JiX3JyX3RpbWUKK3sKKyAgICBwam1lZGlhX3J0Y3BfeHJfcmJfaGVhZGVyIGhlYWRlcjsJLyoqPCBCbG9jayBoZWFkZXIuCQkqLworICAgIHBqX3VpbnQzMl90CQkgbnRwX3NlYzsJLyoqPCBOVFAgdGltZSwgc2Vjb25kcyBwYXJ0LgkqLworICAgIHBqX3VpbnQzMl90CQkgbnRwX2ZyYWM7CS8qKjwgTlRQIHRpbWUsIGZyYWN0aW9ucyBwYXJ0LgkqLworfSBwam1lZGlhX3J0Y3BfeHJfcmJfcnJfdGltZTsKKworCisvKioKKyAqIFRoaXMgdHlwZSBkZWNsYXJlcyBSVENQIFhSIERMUlIgUmVwb3J0IFN1Yi1ibG9jaworICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3BfeHJfcmJfZGxycl9pdGVtCit7CisgICAgcGpfdWludDMyX3QJCSBzc3JjOwkJLyoqPCByZWNlaXZlciBTU1JDCQkqLworICAgIHBqX3VpbnQzMl90CQkgbHJyOwkJLyoqPCBsYXN0IHJlY2VpdmVyIHJlcG9ydAkqLworICAgIHBqX3VpbnQzMl90CQkgZGxycjsJCS8qKjwgZGVsYXkgc2luY2UgbGFzdCByZWNlaXZlcgorCQkJCQkgICAgIHJlcG9ydAkJCSovCit9IHBqbWVkaWFfcnRjcF94cl9yYl9kbHJyX2l0ZW07CisKKy8qKgorICogVGhpcyB0eXBlIGRlY2xhcmVzIFJUQ1AgWFIgRExSUiBSZXBvcnQgQmxvY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3hyX3JiX2RscnIKK3sKKyAgICBwam1lZGlhX3J0Y3BfeHJfcmJfaGVhZGVyIGhlYWRlcjsJLyoqPCBCbG9jayBoZWFkZXIuCQkqLworICAgIHBqbWVkaWFfcnRjcF94cl9yYl9kbHJyX2l0ZW0gaXRlbTsJLyoqPCBCbG9jayBjb250ZW50cywgCisJCQkJCSAgICAgdmFyaWFibGUgbGVuZ3RoIGxpc3QJKi8KK30gcGptZWRpYV9ydGNwX3hyX3JiX2RscnI7CisKKy8qKgorICogVGhpcyB0eXBlIGRlY2xhcmVzIFJUQ1AgWFIgU3RhdGlzdGljcyBTdW1tYXJ5IFJlcG9ydCBCbG9jaworICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3BfeHJfcmJfc3RhdHMKK3sKKyAgICBwam1lZGlhX3J0Y3BfeHJfcmJfaGVhZGVyIGhlYWRlcjsJLyoqPCBCbG9jayBoZWFkZXIuCQkgICAgICovCisgICAgcGpfdWludDMyX3QJCSBzc3JjOwkJLyoqPCBSZWNlaXZlciBTU1JDCQkgICAgICovCisgICAgcGpfdWludDE2X3QJCSBiZWdpbl9zZXE7CS8qKjwgQmVnaW4gUlRQIHNlcXVlbmNlIHJlcG9ydGVkICAgICAqLworICAgIHBqX3VpbnQxNl90CQkgZW5kX3NlcTsJLyoqPCBFbmQgUlRQIHNlcXVlbmNlIHJlcG9ydGVkICAgICAgICovCisgICAgcGpfdWludDMyX3QJCSBsb3N0OwkJLyoqPCBOdW1iZXIgb2YgcGFja2V0IGxvc3QgaW4gdGhpcyAKKwkJCQkJICAgICBpbnRlcnZhbCAgKi8KKyAgICBwal91aW50MzJfdAkJIGR1cDsJCS8qKjwgTnVtYmVyIG9mIGR1cGxpY2F0ZWQgcGFja2V0IGluIAorCQkJCQkgICAgIHRoaXMgaW50ZXJ2YWwgKi8KKyAgICBwal91aW50MzJfdAkJIGppdHRlcl9taW47CS8qKjwgTWluaW11bSBqaXR0ZXIgaW4gdGhpcyBpbnRlcnZhbCAqLworICAgIHBqX3VpbnQzMl90CQkgaml0dGVyX21heDsJLyoqPCBNYXhpbXVtIGppdHRlciBpbiB0aGlzIGludGVydmFsICovCisgICAgcGpfdWludDMyX3QJCSBqaXR0ZXJfbWVhbjsJLyoqPCBBdmVyYWdlIGppdHRlciBpbiB0aGlzIGludGVydmFsICovCisgICAgcGpfdWludDMyX3QJCSBqaXR0ZXJfZGV2OwkvKio8IEppdHRlciBkZXZpYXRpb24gaW4gdGhpcyAKKwkJCQkJICAgICBpbnRlcnZhbCAqLworICAgIHBqX3VpbnQzMl90CQkgdG9oX21pbjo4OwkvKio8IE1pbmltdW0gVG9IIGluIHRoaXMgaW50ZXJ2YWwgICAgKi8KKyAgICBwal91aW50MzJfdAkJIHRvaF9tYXg6ODsJLyoqPCBNYXhpbXVtIFRvSCBpbiB0aGlzIGludGVydmFsICAgICovCisgICAgcGpfdWludDMyX3QJCSB0b2hfbWVhbjo4OwkvKio8IEF2ZXJhZ2UgVG9IIGluIHRoaXMgaW50ZXJ2YWwgICAgKi8KKyAgICBwal91aW50MzJfdAkJIHRvaF9kZXY6ODsJLyoqPCBUb0ggZGV2aWF0aW9uIGluIHRoaXMgaW50ZXJ2YWwgICovCit9IHBqbWVkaWFfcnRjcF94cl9yYl9zdGF0czsKKworLyoqCisgKiBUaGlzIHR5cGUgZGVjbGFyZXMgUlRDUCBYUiBWb0lQIE1ldHJpY3MgUmVwb3J0IEJsb2NrCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRjcF94cl9yYl92b2lwX210YworeworICAgIHBqbWVkaWFfcnRjcF94cl9yYl9oZWFkZXIgaGVhZGVyOwkvKio8IEJsb2NrIGhlYWRlci4JCSovCisgICAgcGpfdWludDMyX3QJCSBzc3JjOwkJLyoqPCBSZWNlaXZlciBTU1JDCQkqLworICAgIHBqX3VpbnQ4X3QJCSBsb3NzX3JhdGU7CS8qKjwgUGFja2V0IGxvc3MgcmF0ZQkJKi8KKyAgICBwal91aW50OF90CQkgZGlzY2FyZF9yYXRlOwkvKio8IFBhY2tldCBkaXNjYXJkZWQgcmF0ZQkqLworICAgIHBqX3VpbnQ4X3QJCSBidXJzdF9kZW47CS8qKjwgQnVyc3QgZGVuc2l0eQkJKi8KKyAgICBwal91aW50OF90CQkgZ2FwX2RlbjsJLyoqPCBHYXAgZGVuc2l0eQkJKi8KKyAgICBwal91aW50MTZfdAkJIGJ1cnN0X2R1cjsJLyoqPCBCdXJzdCBkdXJhdGlvbgkJKi8KKyAgICBwal91aW50MTZfdAkJIGdhcF9kdXI7CS8qKjwgR2FwIGR1cmF0aW9uCQkqLworICAgIHBqX3VpbnQxNl90CQkgcm5kX3RyaXBfZGVsYXk7LyoqPCBSb3VuZCB0cmlwIGRlbGF5CQkqLworICAgIHBqX3VpbnQxNl90CQkgZW5kX3N5c19kZWxheTsgLyoqPCBFbmQgc3lzdGVtIGRlbGF5CQkqLworICAgIHBqX3VpbnQ4X3QJCSBzaWduYWxfbHZsOwkvKio8IFNpZ25hbCBsZXZlbAkJKi8KKyAgICBwal91aW50OF90CQkgbm9pc2VfbHZsOwkvKio8IE5vaXNlIGxldmVsCQkqLworICAgIHBqX3VpbnQ4X3QJCSByZXJsOwkJLyoqPCBSZXNpZHVhbCBFY2hvIFJldHVybiBMb3NzCSovCisgICAgcGpfdWludDhfdAkJIGdtaW47CQkvKio8IFRoZSBnYXAgdGhyZXNob2xkCQkqLworICAgIHBqX3VpbnQ4X3QJCSByX2ZhY3RvcjsJLyoqPCBWb2ljZSBxdWFsaXR5IG1ldHJpYyBjYXJyaWVkCisJCQkJCSAgICAgb3ZlciB0aGlzIFJUUCBzZXNzaW9uCSovCisgICAgcGpfdWludDhfdAkJIGV4dF9yX2ZhY3RvcjsgIC8qKjwgVm9pY2UgcXVhbGl0eSBtZXRyaWMgY2FycmllZCAKKwkJCQkJICAgICBvdXRzaWRlIG9mIHRoaXMgUlRQIHNlc3Npb24qLworICAgIHBqX3VpbnQ4X3QJCSBtb3NfbHE7CS8qKjwgTWVhbiBPcGluaW9uIFNjb3JlIGZvciAKKwkJCQkJICAgICBMaXN0ZW5pbmcgUXVhbGl0eSAgICAgICAgICAqLworICAgIHBqX3VpbnQ4X3QJCSBtb3NfY3E7CS8qKjwgTWVhbiBPcGluaW9uIFNjb3JlIGZvciAKKwkJCQkJICAgICBDb252ZXJzYXRpb24gUXVhbGl0eSAgICAgICAqLworICAgIHBqX3VpbnQ4X3QJCSByeF9jb25maWc7CS8qKjwgUmVjZWl2ZXIgY29uZmlndXJhdGlvbgkqLworICAgIHBqX3VpbnQ4X3QJCSByZXNlcnZlZDI7CS8qKjwgTm90IHVzZWQJCQkqLworICAgIHBqX3VpbnQxNl90CQkgamJfbm9tOwkvKio8IEN1cnJlbnQgZGVsYXkgYnkgaml0dGVyCisJCQkJCSAgICAgYnVmZmVyCQkJKi8KKyAgICBwal91aW50MTZfdAkJIGpiX21heDsJLyoqPCBNYXhpbXVtIGRlbGF5IGJ5IGppdHRlcgorCQkJCQkgICAgIGJ1ZmZlcgkJCSovCisgICAgcGpfdWludDE2X3QJCSBqYl9hYnNfbWF4OwkvKio8IE1heGltdW0gcG9zc2libGUgZGVsYXkgYnkKKwkJCQkJICAgICBqaXR0ZXIgYnVmZmVyCQkqLworfSBwam1lZGlhX3J0Y3BfeHJfcmJfdm9pcF9tdGM7CisKKworLyoqCisgKiBDb25zdGFudCBvZiBSVENQLVhSIGNvbnRlbnQgc2l6ZS4KKyAqLworI2RlZmluZSBQSk1FRElBX1JUQ1BfWFJfQlVGX1NJWkUgXAorICAgIHNpemVvZihwam1lZGlhX3J0Y3BfeHJfcmJfcnJfdGltZSkgKyBcCisgICAgc2l6ZW9mKHBqbWVkaWFfcnRjcF94cl9yYl9kbHJyKSArIFwKKyAgICBzaXplb2YocGptZWRpYV9ydGNwX3hyX3JiX3N0YXRzKSArIFwKKyAgICBzaXplb2YocGptZWRpYV9ydGNwX3hyX3JiX3ZvaXBfbXRjKQorCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVjbGFyZXMgUlRDUCBYUiAoRXh0ZW5kZWQgUmVwb3J0KSBwYWNrZXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRjcF94cl9wa3QKK3sKKyAgICBzdHJ1Y3QgeworI2lmIGRlZmluZWQoUEpfSVNfQklHX0VORElBTikgJiYgUEpfSVNfQklHX0VORElBTiE9MAorCXVuc2lnbmVkCSB2ZXJzaW9uOjI7CS8qKjwgcGFja2V0IHR5cGUgICAgICAgICAgICAqLworCXVuc2lnbmVkCSBwOjE7CQkvKio8IHBhZGRpbmcgZmxhZyAgICAgICAgICAgKi8KKwl1bnNpZ25lZAkgY291bnQ6NTsJLyoqPCB2YXJpZXMgYnkgcGF5bG9hZCB0eXBlICovCisJdW5zaWduZWQJIHB0Ojg7CQkvKio8IHBheWxvYWQgdHlwZSAgICAgICAgICAgKi8KKyNlbHNlCisJdW5zaWduZWQJIGNvdW50OjU7CS8qKjwgdmFyaWVzIGJ5IHBheWxvYWQgdHlwZSAqLworCXVuc2lnbmVkCSBwOjE7CQkvKio8IHBhZGRpbmcgZmxhZyAgICAgICAgICAgKi8KKwl1bnNpZ25lZAkgdmVyc2lvbjoyOwkvKio8IHBhY2tldCB0eXBlICAgICAgICAgICAgKi8KKwl1bnNpZ25lZAkgcHQ6ODsJCS8qKjwgcGF5bG9hZCB0eXBlICAgICAgICAgICAqLworI2VuZGlmCisJdW5zaWduZWQJIGxlbmd0aDoxNjsJLyoqPCBwYWNrZXQgbGVuZ3RoICAgICAgICAgICovCisJcGpfdWludDMyX3QJIHNzcmM7CQkvKio8IFNTUkMgaWRlbnRpZmljYXRpb24gICAgKi8KKyAgICB9IGNvbW1vbjsKKworICAgIHBqX2ludDhfdAkJIGJ1ZltQSk1FRElBX1JUQ1BfWFJfQlVGX1NJWkVdOworCQkJCQkvKio8IENvbnRlbnQgYnVmZmVyICAgKi8KK30gcGptZWRpYV9ydGNwX3hyX3BrdDsKKworI3ByYWdtYSBwYWNrKCkKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBSVENQIFhSIHN0YXRpdGljLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0Y3BfeHJfc3RyZWFtX3N0YXQKK3sKKyAgICBzdHJ1Y3QgeworCXBqX3RpbWVfdmFsCSAgICB1cGRhdGU7CS8qKjwgVGltZSBvZiBsYXN0IHVwZGF0ZS4JICAgICovCisKKwlwal91aW50MzJfdAkgICAgYmVnaW5fc2VxOwkvKio8IEJlZ2luICMgc2VxIG9mIHRoaXMgaW50ZXJ2YWwuICAqLworCXBqX3VpbnQzMl90CSAgICBlbmRfc2VxOwkvKio8IEVuZCAjIHNlcSBvZiB0aGlzIGludGVydmFsLiAgICAqLworCXVuc2lnbmVkCSAgICBjb3VudDsJLyoqPCBOdW1iZXIgb2YgcGFja2V0cy4JCSAgICAqLworCisJLyoqCisJICogRmxhZ3MgcmVwcmVzZW50IHdoZXRoZXIgdGhlIHN1Y2ggcmVwb3J0IGlzIHZhbGlkL3VwZGF0ZWQKKwkgKi8KKwl1bnNpZ25lZAkgICAgbDoxOwkvKio8IExvc3QgZmxhZwkJCSAgICAqLworCXVuc2lnbmVkCSAgICBkOjE7CS8qKjwgRHVwbGljYXRlZCBmbGFnCQkgICAgKi8KKwl1bnNpZ25lZAkgICAgajoxOwkvKio8IEppdHRlciBmbGFnCQkgICAgKi8KKwl1bnNpZ25lZAkgICAgdDoyOwkvKio8IFRUTCBvciBIb3AgTGltaXQsIAorCQkJCQkgICAgIDA9bm9uZSwgMT1UVEwsIDI9SEwJICAgICovCisKKwl1bnNpZ25lZAkgICAgbG9zdDsJLyoqPCBOdW1iZXIgb2YgcGFja2V0cyBsb3N0CSAgICAqLworCXVuc2lnbmVkCSAgICBkdXA7CS8qKjwgTnVtYmVyIG9mIGR1cGxpY2F0ZWQgcGFja2V0cyAgICovCisJcGpfbWF0aF9zdGF0CSAgICBqaXR0ZXI7CS8qKjwgSml0dGVyIHN0YXRpc3RpY3MgKGluIHVzZWMpICAgICovCisJcGpfbWF0aF9zdGF0CSAgICB0b2g7CS8qKjwgVFRMIG9mIGhvcCBsaW1pdCBzdGF0aXN0aWNzLiAgICovCisgICAgfSBzdGF0X3N1bTsKKworICAgIHN0cnVjdCB7CisJcGpfdGltZV92YWwJICAgIHVwZGF0ZTsJICAgIC8qKjwgVGltZSBvZiBsYXN0IHVwZGF0ZS4JICAgICovCisKKwlwal91aW50OF90CSAgICBsb3NzX3JhdGU7CSAgICAvKio8IFBhY2tldCBsb3NzIHJhdGUJICAgICovCisJcGpfdWludDhfdAkgICAgZGlzY2FyZF9yYXRlOyAgIC8qKjwgUGFja2V0IGRpc2NhcmRlZCByYXRlCSAgICAqLworCXBqX3VpbnQ4X3QJICAgIGJ1cnN0X2RlbjsJICAgIC8qKjwgQnVyc3QgZGVuc2l0eQkJICAgICovCisJcGpfdWludDhfdAkgICAgZ2FwX2RlbjsJICAgIC8qKjwgR2FwIGRlbnNpdHkJCSAgICAqLworCXBqX3VpbnQxNl90CSAgICBidXJzdF9kdXI7CSAgICAvKio8IEJ1cnN0IGR1cmF0aW9uCQkgICAgKi8KKwlwal91aW50MTZfdAkgICAgZ2FwX2R1cjsJICAgIC8qKjwgR2FwIGR1cmF0aW9uCQkgICAgKi8KKwlwal91aW50MTZfdAkgICAgcm5kX3RyaXBfZGVsYXk7IC8qKjwgUm91bmQgdHJpcCBkZWxheQkgICAgKi8KKwlwal91aW50MTZfdAkgICAgZW5kX3N5c19kZWxheTsgIC8qKjwgRW5kIHN5c3RlbSBkZWxheQkgICAgKi8KKwlwal9pbnQ4X3QJICAgIHNpZ25hbF9sdmw7CSAgICAvKio8IFNpZ25hbCBsZXZlbAkJICAgICovCisJcGpfaW50OF90CSAgICBub2lzZV9sdmw7CSAgICAvKio8IE5vaXNlIGxldmVsCQkgICAgKi8KKwlwal91aW50OF90CSAgICByZXJsOwkgICAgLyoqPCBSZXNpZHVhbCBFY2hvIFJldHVybiBMb3NzICAqLworCXBqX3VpbnQ4X3QJICAgIGdtaW47CSAgICAvKio8IFRoZSBnYXAgdGhyZXNob2xkCSAgICAqLworCXBqX3VpbnQ4X3QJICAgIHJfZmFjdG9yOwkgICAgLyoqPCBWb2ljZSBxdWFsaXR5IG1ldHJpYyBjYXJyaWVkCisJCQkJCQkgb3ZlciB0aGlzIFJUUCBzZXNzaW9uCSAgICAqLworCXBqX3VpbnQ4X3QJICAgIGV4dF9yX2ZhY3RvcjsgICAvKio8IFZvaWNlIHF1YWxpdHkgbWV0cmljIGNhcnJpZWQgCisJCQkJCQkgb3V0c2lkZSBvZiB0aGlzIFJUUCBzZXNzaW9uKi8KKwlwal91aW50OF90CSAgICBtb3NfbHE7CSAgICAvKio8IE1lYW4gT3BpbmlvbiBTY29yZSBmb3IgCisJCQkJCQkgTGlzdGVuaW5nIFF1YWxpdHkgICAgICAgICAgKi8KKwlwal91aW50OF90CSAgICBtb3NfY3E7CSAgICAvKio8IE1lYW4gT3BpbmlvbiBTY29yZSBmb3IgCisJCQkJCQkgQ29udmVyc2F0aW9uIFF1YWxpdHkgICAgICAgKi8KKwlwal91aW50OF90CSAgICByeF9jb25maWc7CSAgICAvKio8IFJlY2VpdmVyIGNvbmZpZ3VyYXRpb24JICAgICovCisJcGpfdWludDE2X3QJICAgIGpiX25vbTsJICAgIC8qKjwgQ3VycmVudCBkZWxheSBieSBqaXR0ZXIKKwkJCQkJCSBidWZmZXIJCQkgICAgKi8KKwlwal91aW50MTZfdAkgICAgamJfbWF4OwkgICAgLyoqPCBNYXhpbXVtIGRlbGF5IGJ5IGppdHRlcgorCQkJCQkJIGJ1ZmZlcgkJCSAgICAqLworCXBqX3VpbnQxNl90CSAgICBqYl9hYnNfbWF4OwkgICAgLyoqPCBNYXhpbXVtIHBvc3NpYmxlIGRlbGF5IGJ5CisJCQkJCQkgaml0dGVyIGJ1ZmZlcgkJICAgICovCisgICAgfSB2b2lwX210YzsKKworfSBwam1lZGlhX3J0Y3BfeHJfc3RyZWFtX3N0YXQ7CisKK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRjcF94cl9zdGF0Cit7CisgICAgcGptZWRpYV9ydGNwX3hyX3N0cmVhbV9zdGF0CSByeDsgIC8qKjwgRGVjb2RpbmcgZGlyZWN0aW9uIHN0YXRpc3RpY3MuICAgKi8KKyAgICBwam1lZGlhX3J0Y3BfeHJfc3RyZWFtX3N0YXQJIHR4OyAgLyoqPCBFbmNvZGluZyBkaXJlY3Rpb24gc3RhdGlzdGljcy4gICAqLworICAgIHBqX21hdGhfc3RhdAkJIHJ0dDsgLyoqPCBSb3VuZC10cmlwIGRlbGF5IHN0YXQgKGluIHVzZWMpIAorCQkJCQkgICB0aGUgdmFsdWUgaXMgY2FsY3VsYXRlZCBmcm9tIAorCQkJCQkgICByZWNlaXZlciBzaWRlLgkJICAgICovCit9IHBqbWVkaWFfcnRjcF94cl9zdGF0OworCisvKioKKyAqIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgUlRDUCBzZXNzaW9uCisgKi8KK3N0cnVjdCBwam1lZGlhX3J0Y3Bfc2Vzc2lvbjsKKworLyoqCisgKiBSVENQIHNlc3Npb24gaXMgdXNlZCB0byBtb25pdG9yIHRoZSBSVFAgc2Vzc2lvbiBvZiBvbmUgZW5kcG9pbnQuIFRoZXJlCisgKiBzaG91bGQgb25seSBiZSBvbmUgUlRDUCBzZXNzaW9uIGZvciBhIGJpZGlyZWN0aW9uYWwgUlRQIHN0cmVhbXMuCisgKi8KK3N0cnVjdCBwam1lZGlhX3J0Y3BfeHJfc2Vzc2lvbgoreworICAgIGNoYXIJCSAgICpuYW1lOwkvKio8IE5hbWUgaWRlbnRpZmljYXRpb24uCSAgICAqLworICAgIHBqbWVkaWFfcnRjcF94cl9wa3QJICAgIHBrdDsJLyoqPCBDYWNoZWQgUlRDUCBYUiBwYWNrZXQuCSAgICAqLworCisgICAgcGpfdWludDMyX3QJCSAgICByeF9scnI7CS8qKjwgTlRQIHRzIGluIGxhc3QgUlIgcmVjZWl2ZWQuICAgICovCisgICAgcGpfdGltZXN0YW1wCSAgICByeF9scnJfdGltZTsvKio8IFRpbWUgd2hlbiBsYXN0IFJSIGlzIHJlY2VpdmVkLiAqLworICAgIHBqX3VpbnQzMl90CQkgICAgcnhfbGFzdF9ycjsgLyoqPCAjIHBrdCByZWNlaXZlZCBzaW5jZSBsYXN0IAorCQkJCSAgICAgICAgICAgICBzZW5kaW5nIFJSIHRpbWUuCQkgICAgKi8KKworICAgIHBqbWVkaWFfcnRjcF94cl9zdGF0ICAgIHN0YXQ7CS8qKjwgUlRDUCBYUiBzdGF0aXN0aWNzLgkgICAgKi8KKworICAgIC8qIFRoZSByZWZlcmVuY2Ugc2VxdWVuY2UgbnVtYmVyIGlzIGFuIGV4dGVuZGVkIHNlcXVlbmNlIG51bWJlcgorICAgICAqIHRoYXQgc2VydmVzIGFzIHRoZSBiYXNpcyBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIG5ldyAxNiBiaXQKKyAgICAgKiBzZXF1ZW5jZSBudW1iZXIgY29tZXMgZWFybGllciBvciBsYXRlciBpbiB0aGUgMzIgYml0IHNlcXVlbmNlCisgICAgICogc3BhY2UuCisgICAgICovCisgICAgcGpfdWludDMyX3QJCSAgICBzcmNfcmVmX3NlcTsKKyAgICBwal9ib29sX3QJCSAgICB1bmluaXRpYWxpemVkX3NyY19yZWZfc2VxOworCisgICAgLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdmFyaWFibGVzIG5lZWRlZCBmb3IgY2FsY3VsYXRpbmcgCisgICAgICogYnVyc3QgbWV0cmljcy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgeworCXBqX3VpbnQzMl90CSAgICBwa3Q7CisJcGpfdWludDMyX3QJICAgIGxvc3Q7CisJcGpfdWludDMyX3QJICAgIGxvc3NfY291bnQ7CisJcGpfdWludDMyX3QJICAgIGRpc2NhcmRfY291bnQ7CisJcGpfdWludDMyX3QJICAgIGMxMTsKKwlwal91aW50MzJfdAkgICAgYzEzOworCXBqX3VpbnQzMl90CSAgICBjMTQ7CisJcGpfdWludDMyX3QJICAgIGMyMjsKKwlwal91aW50MzJfdAkgICAgYzIzOworCXBqX3VpbnQzMl90CSAgICBjMzM7CisgICAgfSB2b2lwX210Y19zdGF0OworCisgICAgdW5zaWduZWQgcHRpbWU7CQkJLyoqPCBQYWNrZXQgdGltZS4JCSAgICAqLworICAgIHVuc2lnbmVkIGZyYW1lc19wZXJfcGFja2V0OwkJLyoqPCAjIGZyYW1lcyBwZXIgcGFja2V0LgkgICAgKi8KKworICAgIHN0cnVjdCBwam1lZGlhX3J0Y3Bfc2Vzc2lvbiAqcnRjcF9zZXNzaW9uOworCQkJCQkvKio8IFBhcmVudC9SVENQIHNlc3Npb24uCSAgICAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydGNwX3hyX3Nlc3Npb24gcGptZWRpYV9ydGNwX3hyX3Nlc3Npb247CisKKy8qKgorICogQnVpbGQgYW4gUlRDUCBYUiBwYWNrZXQgd2hpY2ggY29udGFpbnMgb25lIG9yIG1vcmUgUlRDUCBYUiByZXBvcnQgYmxvY2tzLgorICogVGhlcmUgYXJlIHNldmVuIHJlcG9ydCB0eXBlcyBhcyBkZWZpbmVkIGluIFJGQyAzNjExLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uICAgVGhlIFJUQ1AgWFIgc2Vzc2lvbi4KKyAqIEBwYXJhbSBycHRfdHlwZXMgUmVwb3J0IHR5cGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwYWNrZXQsIHJlcG9ydCB0eXBlcworICoJCSAgICBhcmUgZGVmaW5lZCBpbiBwam1lZGlhX3J0Y3BfeHJfdHlwZSwgc2V0IHRoaXMgdG8gemVybworICoJCSAgICB3aWxsIG1ha2UgdGhpcyBmdW5jdGlvbiBidWlsZCBhbGwgcmVwb3J0cyBhcHByb3ByaWF0ZWx5LgorICogQHBhcmFtIHJ0Y3BfcGt0ICBVcG9uIHJldHVybiwgaXQgd2lsbCBjb250YWluIHBvaW50ZXIgdG8gdGhlIFJUQ1AgWFIgcGFja2V0LgorICogQHBhcmFtIGxlbgkgICAgVXBvbiByZXR1cm4sIGl0IHdpbGwgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCAKKyAqCQkgICAgUlRDUCBYUiBwYWNrZXQuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV9ydGNwX2J1aWxkX3J0Y3BfeHIoIHBqbWVkaWFfcnRjcF94cl9zZXNzaW9uICpzZXNzaW9uLAorCQkJCQkgIHVuc2lnbmVkIHJwdF90eXBlcywKKwkJCQkJICB2b2lkICoqcnRjcF9wa3QsIGludCAqbGVuKTsKKworLyoqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgdXBkYXRlIHNvbWUgaW5mbyBuZWVkZWQgYnkgUlRDUCBYUiB0byAKKyAqIGdlbmVyYXRlIHJlcG9ydCB3aGljaCBjb3VsZCBub3QgYmUgcG9wdWxhdGVkIGRpcmVjdGx5IHdoZW4gcmVjZWl2aW5nCisgKiBSVFAuCisgKgorICogQHBhcmFtIHNlc3Npb24gICBUaGUgUlRDUCBYUiBzZXNzaW9uLgorICogQHBhcmFtIGluZm8JICAgIEluZm8gdHlwZSB0byBiZSB1cGRhdGVkLCBAc2VlIHBqbWVkaWFfcnRjcF94cl9pbmZvLgorICogQHBhcmFtIHZhbAkgICAgVmFsdWUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfcnRjcF94cl91cGRhdGVfaW5mbygKKwkJCQkJICBwam1lZGlhX3J0Y3BfeHJfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICB1bnNpZ25lZCBpbmZvLAorCQkJCQkgIHBqX2ludDMyX3QgdmFsKTsKKworLyoKKyAqIFByaXZhdGUgQVBJczoKKyAqLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGludGVybmFsbHkgYnkgUlRDUCBzZXNzaW9uIHdoZW4gUlRDUCBYUiBpcyBlbmFibGVkCisgKiB0byBpbml0aWFsaXplIHRoZSBSVENQIFhSIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24gICBSVENQIFhSIHNlc3Npb24uCisgKiBAcGFyYW0gcl9zZXNzaW9uIFJUQ1Agc2Vzc2lvbi4KKyAqIEBwYXJhbSBnbWluICAgICAgR21pbiB2YWx1ZSAoZGVmaW5lZCBpbiBSRkMgMzYxMSksIHNldCB0byAwIGZvciBkZWZhdWx0ICgxNikuCisgKiBAcGFyYW0gZnJhbWVzX3Blcl9wYWNrZXQKKwkJICAgIE51bWJlciBvZiBmcmFtZXMgcGVyIHBhY2tldC4KKyAqLwordm9pZCBwam1lZGlhX3J0Y3BfeHJfaW5pdCggcGptZWRpYV9ydGNwX3hyX3Nlc3Npb24gKnNlc3Npb24sIAorCQkJICAgc3RydWN0IHBqbWVkaWFfcnRjcF9zZXNzaW9uICpyX3Nlc3Npb24sCisJCQkgICBwal91aW50OF90IGdtaW4sCisJCQkgICB1bnNpZ25lZCBmcmFtZXNfcGVyX3BhY2tldCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSBSVENQIHNlc3Npb24gdG8gZGVzdHJveSAKKyAqIHRoZSBSVENQIFhSIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24gICBSVENQIFhSIHNlc3Npb24uCisgKi8KK3ZvaWQgcGptZWRpYV9ydGNwX3hyX2ZpbmkoIHBqbWVkaWFfcnRjcF94cl9zZXNzaW9uICpzZXNzaW9uICk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSBSVENQIHNlc3Npb24gd2hlbiBpdCByZWNlaXZlcyAKKyAqIGluY29taW5nIFJUQ1AgWFIgcGFja2V0cy4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbiAgIFJUQ1AgWFIgc2Vzc2lvbi4KKyAqIEBwYXJhbSBydGNwX3BrdCAgVGhlIHJlY2VpdmVkIFJUQ1AgWFIgcGFja2V0LgorICogQHBhcmFtIHNpemUJICAgIFNpemUgb2YgdGhlIGluY29taW5nIHBhY2tldC4KKyAqLwordm9pZCBwam1lZGlhX3J0Y3BfeHJfcnhfcnRjcF94ciggcGptZWRpYV9ydGNwX3hyX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJIGNvbnN0IHZvaWQgKnJ0Y3BfcGt0LAorCQkJCSBwal9zaXplX3Qgc2l6ZSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseSBieSBSVENQIHNlc3Npb24gd2hlbmV2ZXIgYW4gUlRQIHBhY2tldAorICogaXMgcmVjZWl2ZWQgb3IgbG9zdCB0byBsZXQgdGhlIFJUQ1AgWFIgc2Vzc2lvbiB1cGRhdGUgaXRzIHN0YXRpc3RpY3MuCisgKiBEYXRhIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIGlzIGEgcmVzdWx0IG9mIGFuYWx5emF0aW9uIGJ5IFJUQ1AgYW5kIHRoZQorICogaml0dGVyIGJ1ZmZlci4gV2hlbmV2ZXIgc29tZSBpbmZvIGlzIGF2YWlsYWJsZSwgdGhlIHZhbHVlIHNob3VsZCBiZSB6ZXJvCisgKiBvciBtb3JlIChubyBuZWdhdGl2ZSBpbmZvKSwgb3RoZXJ3aXNlIGlmIGluZm8gaXMgbm90IGF2YWlsYWJsZSB0aGUgaW5mbworICogc2hvdWxkIGJlIC0xIHNvIG5vIHVwZGF0ZSB3aWxsIGJlIGRvbmUgZm9yIHRoaXMgaW5mbyBpbiB0aGUgUlRDUCBYUiBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uICAgUlRDUCBYUiBzZXNzaW9uLgorICogQHBhcmFtIHNlcQkgICAgU2VxdWVuY2UgbnVtYmVyIG9mIFJUUCBwYWNrZXQuCisgKiBAcGFyYW0gbG9zdAkgICAgSW5mbyBpZiB0aGlzIHBhY2tldCBpcyBsb3N0LiAKKyAqIEBwYXJhbSBkdXAJICAgIEluZm8gaWYgdGhpcyBwYWNrZXQgaXMgYSBkdXBsaWNhdGlvbi4gCisgKiBAcGFyYW0gZGlzY2FyZGVkIEluZm8gaWYgdGhpcyBwYWNrZXQgaXMgZGlzY2FyZGVkIAorICoJCSAgICAobm90IGJlY2F1c2Ugb2YgZHVwbGljYXRpb24pLgorICogQHBhcmFtIGppdHRlciAgICBJbmZvIGppdHRlciBvZiB0aGlzIHBhY2tldC4KKyAqIEBwYXJhbSB0b2gJICAgIEluZm8gVGltZSBUbyBMaXZlIG9yIEhvcHMgTGltaXQgb2YgdGhpcyBwYWNrZXQuCisgKiBAcGFyYW0gdG9oX2lwdjQgIFNldCBQSl9UUlVFIGlmIHBhY2tldCBpcyB0cmFuc3BvcnRlZCBvdmVyIElQdjQuCisgKi8KK3ZvaWQgcGptZWRpYV9ydGNwX3hyX3J4X3J0cCggcGptZWRpYV9ydGNwX3hyX3Nlc3Npb24gKnNlc3Npb24sCisJCQkgICAgIHVuc2lnbmVkIHNlcSwgCisJCQkgICAgIGludCBsb3N0LAorCQkJICAgICBpbnQgZHVwLAorCQkJICAgICBpbnQgZGlzY2FyZGVkLAorCQkJICAgICBpbnQgaml0dGVyLAorCQkJICAgICBpbnQgdG9oLCBwal9ib29sX3QgdG9oX2lwdjQpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGludGVybmFsbHkgYnkgUlRDUCBzZXNzaW9uIHdoZW5ldmVyIGFuIFJUUCAKKyAqIHBhY2tldCBpcyBzZW50IHRvIGxldCB0aGUgUlRDUCBYUiBzZXNzaW9uIGRvIGl0cyBpbnRlcm5hbCBjYWxjdWxhdGlvbnMuCisgKgorICogQHBhcmFtIHNlc3Npb24gICBSVENQIFhSIHNlc3Npb24uCisgKiBAcGFyYW0gcHRzaXplICAgIFNpemUgb2YgUlRQIHBheWxvYWQgYmVpbmcgc2VudC4KKyAqLwordm9pZCBwam1lZGlhX3J0Y3BfeHJfdHhfcnRwKCBwam1lZGlhX3J0Y3BfeHJfc2Vzc2lvbiAqc2Vzc2lvbiwgCisJCQkgICAgIHVuc2lnbmVkIHB0c2l6ZSApOworCisvKioKKyAqIEB9CisgKi8KKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1JUQ1BfWFJfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydHAuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3J0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjM0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9ydHAuaApAQCAtMCwwICsxLDM5NCBAQAorLyogJElkOiBydHAuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfUlRQX0hfXworI2RlZmluZSBfX1BKTUVESUFfUlRQX0hfXworCisKKy8qKgorICogQGZpbGUgcnRwLmgKKyAqIEBicmllZiBSVFAgcGFja2V0IGFuZCBSVFAgc2Vzc2lvbiBkZWNsYXJhdGlvbnMuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1JUUCBSVFAgU2Vzc2lvbiBhbmQgRW5jYXBzdWxhdGlvbiAoUkZDIDM1NTApCisgKiBAaW5ncm91cCBQSk1FRElBX1NFU1NJT04KKyAqIEBicmllZiBSVFAgZm9ybWF0IGFuZCBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqIEB7CisgKgorICogVGhlIFJUUCBtb2R1bGUgaXMgZGVzaWduZWQgdG8gYmUgZGVwZW5kZW50IG9ubHkgdG8gUEpMSUIsIGl0IGRvZXMgbm90IGRlcGVuZAorICogb24gYW55IG90aGVyIHBhcnRzIG9mIFBKTUVESUEgbGlicmFyeS4gVGhlIFJUUCBtb2R1bGUgZG9lcyBub3QgZXZlbiBkZXBlbmQKKyAqIG9uIGFueSB0cmFuc3BvcnRzIChzb2NrZXRzKSwgdG8gcHJvbW90ZSBldmVuIG1vcmUgdXNlLCBzdWNoIGFzIGluIERTUAorICogZGV2ZWxvcG1lbnQgKHdoZXJlIHRyYW5zcG9ydCBtYXkgYmUgaGFuZGxlZCBieSBkaWZmZXJlbnQgcHJvY2Vzc29yKS4KKyAqCisgKiBBbiBSVENQIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSwgaW4gc2VwYXJhdGUgbW9kdWxlLiBQbGVhc2Ugc2VlIAorICogQHJlZiBQSk1FRF9SVENQLgorICoKKyAqIFRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGU6CisgKiAgLSBjcmVhdGluZyBSVFAgaGVhZGVyIGZvciBlYWNoIG91dGdvaW5nIHBhY2tldC4KKyAqICAtIGRlY29kaW5nIFJUUCBwYWNrZXQgaW50byBSVFAgaGVhZGVyIGFuZCBwYXlsb2FkLgorICogIC0gcHJvdmlkZSBzaW1wbGUgUlRQIHNlc3Npb24gbWFuYWdlbWVudCAoc2VxdWVuY2UgbnVtYmVyLCBldGMuKQorICoKKyAqIFRoZSBSVFAgbW9kdWxlIGRvZXMgbm90IHVzZSBhbnkgZHluYW1pYyBtZW1vcnkgYXQgYWxsLgorICoKKyAqIFxzZWN0aW9uIFAxIEhvdyB0byBVc2UgdGhlIFJUUCBNb2R1bGUKKyAqIAorICogRmlyc3QgYXBwbGljYXRpb24gbXVzdCBjYWxsICNwam1lZGlhX3J0cF9zZXNzaW9uX2luaXQoKSB0byBpbml0aWFsaXplIHRoZSBSVFAgCisgKiBzZXNzaW9uLgorICoKKyAqIFdoZW4gYXBwbGljYXRpb24gd2FudHMgdG8gc2VuZCBSVFAgcGFja2V0LCBpdCBuZWVkcyB0byBjYWxsIAorICogI3BqbWVkaWFfcnRwX2VuY29kZV9ydHAoKSB0byBidWlsZCB0aGUgUlRQIGhlYWRlci4gTm90ZSB0aGF0IHRoaXMgV0lMTCBOT1QgYnVpbGQKKyAqIHRoZSBjb21wbGV0ZSBSVFAgcGFja2V0LCBidXQgaW5zdGVhZCBvbmx5IHRoZSBoZWFkZXIuIEFwcGxpY2F0aW9uIGNhbgorICogdGhlbiBlaXRoZXIgY29uY2F0ZW5hdGUgdGhlIGhlYWRlciB3aXRoIHRoZSBwYXlsb2FkLCBvciBzZW5kIHRoZSB0d28KKyAqIGZyYWdtZW50cyAodGhlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQpIHVzaW5nIHNjYXR0ZXItZ2F0aGVyIHRyYW5zcG9ydCBBUEkKKyAqIChlLmcuIFxhIHNlbmR2KCkpLgorICoKKyAqIFdoZW4gYXBwbGljYXRpb24gcmVjZWl2ZXMgYW4gUlRQIHBhY2tldCwgZmlyc3QgaXQgc2hvdWxkIGNhbGwKKyAqICNwam1lZGlhX3J0cF9kZWNvZGVfcnRwIHRvIGRlY29kZSBSVFAgaGVhZGVyIGFuZCBwYXlsb2FkLCB0aGVuIGl0IHNob3VsZCBjYWxsCisgKiAjcGptZWRpYV9ydHBfc2Vzc2lvbl91cGRhdGUgdG8gY2hlY2sgd2hldGhlciB3ZSBjYW4gcHJvY2VzcyB0aGUgUlRQIHBheWxvYWQsCisgKiBhbmQgdG8gbGV0IHRoZSBSVFAgc2Vzc2lvbiB1cGRhdGVzIGl0cyBpbnRlcm5hbCBzdGF0dXMuIFRoZSBkZWNvZGUgZnVuY3Rpb24KKyAqIGlzIGd1YXJhbnRlZWQgdG8gcG9pbnQgdGhlIHBheWxvYWQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gcmVnYXJkbGVzcyBvZgorICogYW55IG9wdGlvbnMgcHJlc2VudCBpbiB0aGUgUlRQIHBhY2tldC4KKyAqCisgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjE0KSAgICAvLyBiaXQgZmllbGQgdHlwZXMgb3RoZXIgdGhhbiBpbnQKKyNlbmRpZgorCisKKy8qKgorICogUlRQIHBhY2tldCBoZWFkZXIuIE5vdGUgdGhhdCBhbGwgUlRQIGZ1bmN0aW9ucyBoZXJlIHdpbGwgd29yayB3aXRoIHRoaXMKKyAqIGhlYWRlciBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IHBqbWVkaWFfcnRwX2hkcgoreworI2lmIGRlZmluZWQoUEpfSVNfQklHX0VORElBTikgJiYgKFBKX0lTX0JJR19FTkRJQU4hPTApCisgICAgcGpfdWludDE2X3QgdjoyOwkJLyoqPCBwYWNrZXQgdHlwZS92ZXJzaW9uCSAgICAqLworICAgIHBqX3VpbnQxNl90IHA6MTsJCS8qKjwgcGFkZGluZyBmbGFnCQkgICAgKi8KKyAgICBwal91aW50MTZfdCB4OjE7CQkvKio8IGV4dGVuc2lvbiBmbGFnCQkgICAgKi8KKyAgICBwal91aW50MTZfdCBjYzo0OwkJLyoqPCBDU1JDIGNvdW50CQkJICAgICovCisgICAgcGpfdWludDE2X3QgbToxOwkJLyoqPCBtYXJrZXIgYml0CQkJICAgICovCisgICAgcGpfdWludDE2X3QgcHQ6NzsJCS8qKjwgcGF5bG9hZCB0eXBlCQkgICAgKi8KKyNlbHNlCisgICAgcGpfdWludDE2X3QgY2M6NDsJCS8qKjwgQ1NSQyBjb3VudAkJCSAgICAqLworICAgIHBqX3VpbnQxNl90IHg6MTsJCS8qKjwgaGVhZGVyIGV4dGVuc2lvbiBmbGFnCSAgICAqLyAKKyAgICBwal91aW50MTZfdCBwOjE7CQkvKio8IHBhZGRpbmcgZmxhZwkJICAgICovCisgICAgcGpfdWludDE2X3QgdjoyOwkJLyoqPCBwYWNrZXQgdHlwZS92ZXJzaW9uCSAgICAqLworICAgIHBqX3VpbnQxNl90IHB0Ojc7CQkvKio8IHBheWxvYWQgdHlwZQkJICAgICovCisgICAgcGpfdWludDE2X3QgbToxOwkJLyoqPCBtYXJrZXIgYml0CQkJICAgICovCisjZW5kaWYKKyAgICBwal91aW50MTZfdCBzZXE7CQkvKio8IHNlcXVlbmNlIG51bWJlcgkJICAgICovCisgICAgcGpfdWludDMyX3QgdHM7CQkvKio8IHRpbWVzdGFtcAkJCSAgICAqLworICAgIHBqX3VpbnQzMl90IHNzcmM7CQkvKio8IHN5bmNocm9uaXphdGlvbiBzb3VyY2UJICAgICovCit9OworI3ByYWdtYSBwYWNrKCkKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfcnRwX2hkcgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0cF9oZHIgcGptZWRpYV9ydHBfaGRyOworCisKKy8qKgorICogUlRQIGV4dGVuZHNpb24gaGVhZGVyLgorICovCitzdHJ1Y3QgcGptZWRpYV9ydHBfZXh0X2hkcgoreworICAgIHBqX3VpbnQxNl90CXByb2ZpbGVfZGF0YTsJLyoqPCBQcm9maWxlIGRhdGEuCSAgICAqLworICAgIHBqX3VpbnQxNl90CWxlbmd0aDsJCS8qKjwgTGVuZ3RoLgkJICAgICovCit9OworCisvKioKKyAqIEBzZWUgcGptZWRpYV9ydHBfZXh0X2hkcgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0cF9leHRfaGRyIHBqbWVkaWFfcnRwX2V4dF9oZHI7CisKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qKgorICogRGVjbGFyYXRpb24gZm9yIERUTUYgdGVsZXBob255LWV2ZW50cyAoUkZDMjgzMykuCisgKi8KK3N0cnVjdCBwam1lZGlhX3J0cF9kdG1mX2V2ZW50Cit7CisgICAgcGpfdWludDhfdAlldmVudDsJICAgIC8qKjwgRXZlbnQgdHlwZSBJRC4JICAgICovCisgICAgcGpfdWludDhfdAllX3ZvbDsJICAgIC8qKjwgRXZlbnQgdm9sdW1lLgkgICAgKi8KKyAgICBwal91aW50MTZfdAlkdXJhdGlvbjsgICAvKio8IEV2ZW50IGR1cmF0aW9uLiAgICAqLworfTsKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfcnRwX2R0bWZfZXZlbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydHBfZHRtZl9ldmVudCBwam1lZGlhX3J0cF9kdG1mX2V2ZW50OworCisjcHJhZ21hIHBhY2soKQorCisKKy8qKgorICogQSBnZW5lcmljIHNlcXVlbmNlIG51bWJlciBtYW5hZ2VtZW50LCB1c2VkIGJ5IGJvdGggUlRQIGFuZCBSVENQLgorICovCitzdHJ1Y3QgcGptZWRpYV9ydHBfc2VxX3Nlc3Npb24KK3sKKyAgICBwal91aW50MTZfdAkgICAgbWF4X3NlcTsJICAgIC8qKjwgSGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgaGVhcmQJICAgICovCisgICAgcGpfdWludDMyX3QJICAgIGN5Y2xlczsJICAgIC8qKjwgU2hpZnRlZCBjb3VudCBvZiBzZXEgbnVtYmVyIGN5Y2xlcyAqLworICAgIHBqX3VpbnQzMl90CSAgICBiYXNlX3NlcTsJICAgIC8qKjwgQmFzZSBzZXEgbnVtYmVyCQkgICAgKi8KKyAgICBwal91aW50MzJfdAkgICAgYmFkX3NlcTsgICAgICAgIC8qKjwgTGFzdCAnYmFkJyBzZXEgbnVtYmVyICsgMQkgICAgKi8KKyAgICBwal91aW50MzJfdAkgICAgcHJvYmF0aW9uOyAgICAgIC8qKjwgU2VxdS4gcGFja2V0cyB0aWxsIHNvdXJjZSBpcyB2YWxpZCAqLworfTsKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfcnRwX3NlcV9zZXNzaW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRwX3NlcV9zZXNzaW9uIHBqbWVkaWFfcnRwX3NlcV9zZXNzaW9uOworCisKKy8qKgorICogUlRQIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqLworc3RydWN0IHBqbWVkaWFfcnRwX3Nlc3Npb24KK3sKKyAgICBwam1lZGlhX3J0cF9oZHIJICAgIG91dF9oZHI7ICAgIC8qKjwgU2F2ZWQgaGRyIGZvciBvdXRnb2luZyBwa3RzLiAgICovCisgICAgcGptZWRpYV9ydHBfc2VxX3Nlc3Npb24gc2VxX2N0cmw7ICAgLyoqPCBTZXF1ZW5jZSBudW1iZXIgbWFuYWdlbWVudC4gICAgKi8KKyAgICBwal91aW50MTZfdAkJICAgIG91dF9wdDsJLyoqPCBEZWZhdWx0IG91dGdvaW5nIHBheWxvYWQgdHlwZS4gKi8KKyAgICBwal91aW50MzJfdAkJICAgIG91dF9leHRzZXE7IC8qKjwgT3V0Z29pbmcgZXh0ZW5kZWQgc2VxICMuCSAgICAqLworICAgIHBqX3VpbnQzMl90CQkgICAgcGVlcl9zc3JjOyAgLyoqPCBQZWVyIFNTUkMuCQkJICAgICovCisgICAgcGpfdWludDMyX3QJCSAgICByZWNlaXZlZDsgICAvKio8IE51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzLiAgICAqLworfTsKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfcnRwX3Nlc3Npb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9ydHBfc2Vzc2lvbiBwam1lZGlhX3J0cF9zZXNzaW9uOworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZWNlaXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBzdGF0ZSBvZiBpbmNvbWluZyBSVFAgcGFja2V0LgorICovCitzdHJ1Y3QgcGptZWRpYV9ydHBfc3RhdHVzCit7CisgICAgdW5pb24geworCXN0cnVjdCBmbGFnIHsKKwkgICAgaW50CWJhZDoxOwkgICAgLyoqPCBHZW5lcmFsIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBzZXF1ZW5jZSBpcworCQkJCSBiYWQsIGFuZCBhcHBsaWNhdGlvbiBzaG91bGQgbm90IHByb2Nlc3MKKwkJCQkgdGhpcyBwYWNrZXQuIE1vcmUgaW5mb3JtYXRpb24gd2lsbCBiZSBnaXZlbgorCQkJCSBpbiBvdGhlciBmbGFncy4JCQkgICAgKi8KKwkgICAgaW50IGJhZHB0OjE7ICAgIC8qKjwgQmFkIHBheWxvYWQgdHlwZS4JCQkgICAgKi8KKwkgICAgaW50IGJhZHNzcmM6MTsgIC8qKjwgQmFkIFNTUkMJCQkJICAgICovCisJICAgIGludAlkdXA6MTsJICAgIC8qKjwgSW5kaWNhdGVzIGR1cGxpY2F0ZSBwYWNrZXQJCSAgICAqLworCSAgICBpbnQJb3V0b3JkZXI6MTsgLyoqPCBJbmRpY2F0ZXMgb3V0IG9mIG9yZGVyIHBhY2tldAkJICAgICovCisJICAgIGludAlwcm9iYXRpb246MTsvKio8IEluZGljYXRlcyB0aGF0IHNlc3Npb24gaXMgaW4gcHJvYmF0aW9uCisJCQkJIHVudGlsIG1vcmUgcGFja2V0cyBhcmUgcmVjZWl2ZWQuCSAgICAqLworCSAgICBpbnQJcmVzdGFydDoxOyAgLyoqPCBJbmRpY2F0ZXMgdGhhdCBzZXF1ZW5jZSBudW1iZXIgaGFzIG1hZGUKKwkJCQkgYSBsYXJnZSBqdW1wLCBhbmQgaW50ZXJuYWwgYmFzZSBzZXF1ZW5jZQorCQkJCSBudW1iZXIgaGFzIGJlZW4gYWRqdXN0ZWQuCQkgICAgKi8KKwl9IGZsYWc7CQkgICAgLyoqPCBTdGF0dXMgZmxhZ3MuCQkJCSAgICAqLworCisJcGpfdWludDE2X3QgdmFsdWU7ICAvKio8IFN0YXR1cyB2YWx1ZSwgdG8gY29udmVuaWVudGx5IGFkZHJlc3MgYWxsCisJCQkJIGZsYWdzLgkJCQkJICAgICovCisKKyAgICB9IHN0YXR1czsJCSAgICAvKio8IFN0YXR1cyBpbmZvcm1hdGlvbiB1bmlvbi4JCSAgICAqLworCisgICAgcGpfdWludDE2X3QJZGlmZjsJICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyIGRpZmZlcmVuY2UgZnJvbSBwcmV2aW91cworCQkJCSBwYWNrZXQuIE5vcm1hbGx5IHRoZSB2YWx1ZSBzaG91bGQgYmUgMS4gICAgCisJCQkJIFZhbHVlIGdyZWF0ZXIgdGhhbiBvbmUgbWF5IGluZGljYXRlIHBhY2tldAorCQkJCSBsb3NzLiBJZiBwYWNrZXQgd2l0aCBsb3dlciBzZXF1ZW5jZSBpcworCQkJCSByZWNlaXZlZCwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHplcm8uCisJCQkJIElmIGJhc2Ugc2VxdWVuY2UgaGFzIGJlZW4gcmVzdGFydGVkLCB0aGUKKwkJCQkgdmFsdWUgd2lsbCBiZSBvbmUuCQkJICAgICovCit9OworCisKKy8qKgorICogUlRQIHNlc3Npb24gc2V0dGluZ3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcnRwX3Nlc3Npb25fc2V0dGluZworeworICAgIHBqX3VpbnQ4X3QJICAgICBmbGFnczsJICAgIC8qKjwgQml0bWFzayBmbGFncyB0byBzcGVjaWZ5IHdoZXRoZXIgc3VjaAorCQkJCSAgICAgICAgIGZpZWxkIGlzIHNldC4gQml0bWFzayBjb250ZW50cyBhcmU6CisJCQkJCSAoYml0ICMwIGlzIExTQikKKwkJCQkJIGJpdCAjMDogZGVmYXVsdCBwYXlsb2FkIHR5cGUKKwkJCQkJIGJpdCAjMTogc2VuZGVyIFNTUkMKKwkJCQkJIGJpdCAjMjogc2VxdWVuY2UKKwkJCQkJIGJpdCAjMzogdGltZXN0YW1wCQkgICAgKi8KKyAgICBpbnQJCSAgICAgZGVmYXVsdF9wdDsgICAgLyoqPCBEZWZhdWx0IHBheWxvYWQgdHlwZS4JCSAgICAqLworICAgIHBqX3VpbnQzMl90CSAgICAgc2VuZGVyX3NzcmM7ICAgLyoqPCBTZW5kZXIgU1NSQy4JCQkgICAgKi8KKyAgICBwal91aW50MTZfdAkgICAgIHNlcTsJICAgIC8qKjwgU2VxdWVuY2UuCQkJICAgICovCisgICAgcGpfdWludDMyX3QJICAgICB0czsJICAgIC8qKjwgVGltZXN0YW1wLgkJCSAgICAqLworfSBwam1lZGlhX3J0cF9zZXNzaW9uX3NldHRpbmc7CisKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfcnRwX3N0YXR1cworICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3J0cF9zdGF0dXMgcGptZWRpYV9ydHBfc3RhdHVzOworCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIFJUUCBzZXNzaW9uIGFjY29yZGluZyB0byBnaXZlbiBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBzZXMJCVRoZSBzZXNzaW9uLgorICogQHBhcmFtIGRlZmF1bHRfcHQJRGVmYXVsdCBwYXlsb2FkIHR5cGUuCisgKiBAcGFyYW0gc2VuZGVyX3NzcmMJU1NSQyB1c2VkIGZvciBvdXRnb2luZyBwYWNrZXRzLCBpbiBob3N0IGJ5dGUgb3JkZXIuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9ydHBfc2Vzc2lvbl9pbml0KCBwam1lZGlhX3J0cF9zZXNzaW9uICpzZXMsCisJCQkJCSAgICAgICBpbnQgZGVmYXVsdF9wdCwgCisJCQkJCSAgICAgICBwal91aW50MzJfdCBzZW5kZXJfc3NyYyApOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBSVFAgc2Vzc2lvbiBhY2NvcmRpbmcgdG8gZ2l2ZW4gcGFyYW1ldGVycworICogZGVmaW5lZCBpbiBSVFAgc2Vzc2lvbiBzZXR0aW5ncy4KKyAqCisgKiBAcGFyYW0gc2VzCQlUaGUgc2Vzc2lvbi4KKyAqIEBwYXJhbSBzZXR0aW5ncwlSVFAgc2Vzc2lvbiBzZXR0aW5ncy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3J0cF9zZXNzaW9uX2luaXQyKCAKKwkJCQkgICAgcGptZWRpYV9ydHBfc2Vzc2lvbiAqc2VzLAorCQkJCSAgICBwam1lZGlhX3J0cF9zZXNzaW9uX3NldHRpbmcgc2V0dGluZ3MpOworCisKKy8qKgorICogQ3JlYXRlIHRoZSBSVFAgaGVhZGVyIGJhc2VkIG9uIGFyZ3VtZW50cyBhbmQgY3VycmVudCBzdGF0ZSBvZiB0aGUgUlRQCisgKiBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXMJCVRoZSBzZXNzaW9uLgorICogQHBhcmFtIHB0CQlQYXlsb2FkIHR5cGUuCisgKiBAcGFyYW0gbQkJTWFya2VyIGZsYWcuCisgKiBAcGFyYW0gcGF5bG9hZF9sZW4JUGF5bG9hZCBsZW5ndGggaW4gYnl0ZXMuCisgKiBAcGFyYW0gdHNfbGVuCVRpbWVzdGFtcCBsZW5ndGguCisgKiBAcGFyYW0gcnRwaGRyCVVwb24gcmV0dXJuIHdpbGwgcG9pbnQgdG8gUlRQIHBhY2tldCBoZWFkZXIuCisgKiBAcGFyYW0gaGRybGVuCVVwb24gcmV0dXJuIHdpbGwgaW5kaWNhdGUgdGhlIHNpemUgb2YgUlRQIHBhY2tldCBoZWFkZXIKKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3J0cF9lbmNvZGVfcnRwKCBwam1lZGlhX3J0cF9zZXNzaW9uICpzZXMsIAorCQkJCQkgICAgIGludCBwdCwgaW50IG0sCisJCQkJCSAgICAgaW50IHBheWxvYWRfbGVuLCBpbnQgdHNfbGVuLAorCQkJCQkgICAgIGNvbnN0IHZvaWQgKipydHBoZHIsIAorCQkJCQkgICAgIGludCAqaGRybGVuICk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGluY29taW5nIHBhY2tldCBpbnRvIFJUUCBoZWFkZXIgYW5kIHBheWxvYWQuCisgKiBUaGUgZGVjb2RlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcG9pbnQgdGhlIHBheWxvYWQgdG8gdGhlIGNvcnJlY3QgCisgKiBwb3NpdGlvbiByZWdhcmRsZXNzIG9mIGFueSBvcHRpb25zIHByZXNlbnQgaW4gdGhlIFJUUCBwYWNrZXQuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBSVFAgaGVhZGVyIHRvCisgKiBob3N0IGJ5dGUgb3JkZXIuCisgKgorICogQHBhcmFtIHNlcwkJVGhlIHNlc3Npb24uCisgKiBAcGFyYW0gcGt0CQlUaGUgcmVjZWl2ZWQgUlRQIHBhY2tldC4KKyAqIEBwYXJhbSBwa3RfbGVuCVRoZSBsZW5ndGggb2YgdGhlIHBhY2tldC4KKyAqIEBwYXJhbSBoZHIJCVVwb24gcmV0dXJuIHdpbGwgcG9pbnQgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBSVFAgCisgKgkJCWhlYWRlciBpbnNpZGUgdGhlIHBhY2tldC4gTm90ZSB0aGF0IHRoZSBSVFAgaGVhZGVyCisgKgkJCXdpbGwgYmUgZ2l2ZW4gYmFjayBhcyBpcywgbWVhbmluZyB0aGF0IHRoZSBmaWVsZHMKKyAqCQkJd2lsbCBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiBAcGFyYW0gcGF5bG9hZAlVcG9uIHJldHVybiB3aWxsIHBvaW50IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAqCQkJcGF5bG9hZCBpbnNpZGUgdGhlIHBhY2tldC4KKyAqIEBwYXJhbSBwYXlsb2FkbGVuCVVwb24gcmV0dXJuIHdpbGwgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9ydHBfZGVjb2RlX3J0cCggcGptZWRpYV9ydHBfc2Vzc2lvbiAqc2VzLCAKKwkJCQkJICAgICBjb25zdCB2b2lkICpwa3QsIGludCBwa3RfbGVuLAorCQkJCQkgICAgIGNvbnN0IHBqbWVkaWFfcnRwX2hkciAqKmhkciwKKwkJCQkJICAgICBjb25zdCB2b2lkICoqcGF5bG9hZCwKKwkJCQkJICAgICB1bnNpZ25lZCAqcGF5bG9hZGxlbik7CisKKy8qKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGV2ZXJ5dGltZSBhbiBSVFAgcGFja2V0IGlzIHJlY2VpdmVkIHRvIGNoZWNrIHdoZXRoZXIgCisgKiB0aGUgcGFja2V0IGNhbiBiZSByZWNlaXZlZCBhbmQgdG8gbGV0IHRoZSBSVFAgc2Vzc2lvbiBwZXJmb3JtcyBpdHMgaW50ZXJuYWwKKyAqIGNhbGN1bGF0aW9ucy4KKyAqCisgKiBAcGFyYW0gc2VzCSAgICBUaGUgc2Vzc2lvbi4KKyAqIEBwYXJhbSBoZHIJICAgIFRoZSBSVFAgaGVhZGVyIG9mIHRoZSBpbmNvbWluZyBwYWNrZXQuIFRoZSBoZWFkZXIgbXVzdAorICoJCSAgICBiZSBnaXZlbiB3aXRoIGZpZWxkcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiBAcGFyYW0gc2VxX3N0ICAgIE9wdGlvbmFsIHN0cnVjdHVyZSB0byByZWNlaXZlIHRoZSBzdGF0dXMgb2YgdGhlIFJUUCBwYWNrZXQKKyAqCQkgICAgcHJvY2Vzc2luZy4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX3J0cF9zZXNzaW9uX3VwZGF0ZSggcGptZWRpYV9ydHBfc2Vzc2lvbiAqc2VzLCAKKwkJCQkJICBjb25zdCBwam1lZGlhX3J0cF9oZHIgKmhkciwKKwkJCQkJICBwam1lZGlhX3J0cF9zdGF0dXMgKnNlcV9zdCk7CisKKworLyoqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gZXZlcnl0aW1lIGFuIFJUUCBwYWNrZXQgaXMgcmVjZWl2ZWQgdG8gY2hlY2sgd2hldGhlciAKKyAqIHRoZSBwYWNrZXQgY2FuIGJlIHJlY2VpdmVkIGFuZCB0byBsZXQgdGhlIFJUUCBzZXNzaW9uIHBlcmZvcm1zIGl0cyBpbnRlcm5hbAorICogY2FsY3VsYXRpb25zLgorICoKKyAqIEBwYXJhbSBzZXMJICAgIFRoZSBzZXNzaW9uLgorICogQHBhcmFtIGhkcgkgICAgVGhlIFJUUCBoZWFkZXIgb2YgdGhlIGluY29taW5nIHBhY2tldC4gVGhlIGhlYWRlciBtdXN0CisgKgkJICAgIGJlIGdpdmVuIHdpdGggZmllbGRzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqIEBwYXJhbSBzZXFfc3QgICAgT3B0aW9uYWwgc3RydWN0dXJlIHRvIHJlY2VpdmUgdGhlIHN0YXR1cyBvZiB0aGUgUlRQIHBhY2tldAorICoJCSAgICBwcm9jZXNzaW5nLgorICogQHBhcmFtIGNoZWNrX3B0ICBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgcGF5bG9hZCB0eXBlIG5lZWRzIHRvIGJlIHZhbGlkYXRlLgorICoKKyAqIEBzZWUgcGptZWRpYV9ydHBfc2Vzc2lvbl91cGRhdGUoKQorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfcnRwX3Nlc3Npb25fdXBkYXRlMihwam1lZGlhX3J0cF9zZXNzaW9uICpzZXMsIAorCQkJCQkgIGNvbnN0IHBqbWVkaWFfcnRwX2hkciAqaGRyLAorCQkJCQkgIHBqbWVkaWFfcnRwX3N0YXR1cyAqc2VxX3N0LAorCQkJCQkgIHBqX2Jvb2xfdCBjaGVja19wdCk7CisKKworLyoKKyAqIElOVEVSTkFMOgorICovCisKKy8qKiAKKyAqIEludGVybmFsIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBzZXF1ZW5jZSBudW1iZXIgY29udHJvbCwgc2hhcmVkIGJ5IFJUQ1AgCisgKiBpbXBsZW1lbnRhdGlvbi4gCisgKgorICogQHBhcmFtIHNlcV9jdHJsICBUaGUgc2VxdWVuY2UgY29udHJvbCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzZXEJICAgIFNlcXVlbmNlIG51bWJlciB0byBpbml0aWFsaXplLgorICovCit2b2lkIHBqbWVkaWFfcnRwX3NlcV9pbml0KHBqbWVkaWFfcnRwX3NlcV9zZXNzaW9uICpzZXFfY3RybCwgCisJCQkgIHBqX3VpbnQxNl90IHNlcSk7CisKKworLyoqIAorICogSW50ZXJuYWwgZnVuY3Rpb24gdXBkYXRlIHNlcXVlbmNlIGNvbnRyb2wsIHNoYXJlZCBieSBSVENQIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbSBzZXFfY3RybAlUaGUgc2VxdWVuY2UgY29udHJvbCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzZXEJCVNlcXVlbmNlIG51bWJlciB0byB1cGRhdGUuCisgKiBAcGFyYW0gc2VxX3N0YXR1cwlPcHRpb25hbCBzdHJ1Y3R1cmUgdG8gcmVjZWl2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIAorICoJCQlhYm91dCB0aGUgcGFja2V0LgorICovCit2b2lkIHBqbWVkaWFfcnRwX3NlcV91cGRhdGUoIHBqbWVkaWFfcnRwX3NlcV9zZXNzaW9uICpzZXFfY3RybCwgCisJCQkgICAgIHBqX3VpbnQxNl90IHNlcSwKKwkJCSAgICAgcGptZWRpYV9ydHBfc3RhdHVzICpzZXFfc3RhdHVzKTsKKworLyoqCisgKiBAfQorICovCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9SVFBfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHAuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmFiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zZHAuaApAQCAtMCwwICsxLDc1MyBAQAorLyogJElkOiBzZHAuaCA0MzY3IDIwMTMtMDItMjEgMjA6NDk6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfU0RQX0hfXworI2RlZmluZSBfX1BKTUVESUFfU0RQX0hfXworCisvKioKKyAqIEBmaWxlIHNkcC5oCisgKiBAYnJpZWYgU0RQIGhlYWRlciBmaWxlLgorICovCisjaW5jbHVkZSA8cGptZWRpYS90eXBlcy5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9TRFAgU0RQIFBhcnNpbmcgYW5kIERhdGEgU3RydWN0dXJlCisgKiBAaW5ncm91cCBQSk1FRElBX1NFU1NJT04KKyAqIEBicmllZiBTRFAgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50YXRpb24gYW5kIHBhcnNpbmcKKyAqIEB7CisgKgorICogVGhlIGJhc2ljIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IgYW5kIGVsZW1lbnRzIGFyZSBkZXNjcmliZWQgaW4gaGVhZGVyCisgKiBmaWxlIDxiPjxwam1lZGlhL3NkcC5oPjwvYj4uIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbiBmb3IKKyAqIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IgYW5kIFNEUCBtZWRpYSBkZXNjcmlwdG9yLCBhbG9uZyB3aXRoIHRoZWlyCisgKiBhdHRyaWJ1dGVzLiBUaGlzIGZpbGUgYWxzbyBkZWNsYXJlcyBmdW5jdGlvbnMgdG8gcGFyc2UgU0RQIG1lc3NhZ2UuCisgKi8KKworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogVGhlIFBKTUVESUFfTUFYX1NEUF9GTVQgbWFjcm8gZGVmaW5lcyBtYXhpbXVtIGZvcm1hdCBpbiBhIG1lZGlhIGxpbmUuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9NQVhfU0RQX0ZNVAorIyAgIGRlZmluZSBQSk1FRElBX01BWF9TRFBfRk1UCQkzMgorI2VuZGlmCisKKy8qKgorICogVGhlIFBKTUVESUFfTUFYX1NEUF9CQU5EVyBtYWNybyBkZWZpbmVzIG1heGltdW0gYmFuZHdpZHRoIGluZm9ybWF0aW9uCisgKiBsaW5lcyBpbiBhIG1lZGlhIGxpbmUuCisgKi8KKyNpZm5kZWYgUEpNRURJQV9NQVhfU0RQX0JBTkRXCisjICAgZGVmaW5lIFBKTUVESUFfTUFYX1NEUF9CQU5EVwk0CisjZW5kaWYKKworLyoqCisgKiBUaGUgUEpNRURJQV9NQVhfU0RQX0FUVFIgbWFjcm8gZGVmaW5lcyBtYXhpbXVtIFNEUCBhdHRyaWJ1dGVzIGluIG1lZGlhIGFuZAorICogc2Vzc2lvbiBkZXNjcmlwdG9yLgorICovCisjaWZuZGVmIFBKTUVESUFfTUFYX1NEUF9BVFRSCisjICAgZGVmaW5lIFBKTUVESUFfTUFYX1NEUF9BVFRSCQkoUEpNRURJQV9NQVhfU0RQX0ZNVCoyICsgNCkKKyNlbmRpZgorCisvKioKKyAqIFRoZSBQSk1FRElBX01BWF9TRFBfTUVESUEgbWFjcm8gZGVmaW5lcyBtYXhpbXVtIFNEUCBtZWRpYSBsaW5lcyBpbiBhCisgKiBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICovCisjaWZuZGVmIFBKTUVESUFfTUFYX1NEUF9NRURJQQorIyAgIGRlZmluZSBQSk1FRElBX01BWF9TRFBfTUVESUEJMTYKKyNlbmRpZgorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRFAgQVRUUklCVVRFUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKiAKKyAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYXR0cmlidXRlLgorICovCitzdHJ1Y3QgcGptZWRpYV9zZHBfYXR0cgoreworICAgIHBqX3N0cl90CQluYW1lOwkgICAgLyoqPCBBdHRyaWJ1dGUgbmFtZS4gICAgKi8KKyAgICBwal9zdHJfdAkJdmFsdWU7CSAgICAvKio8IEF0dHJpYnV0ZSB2YWx1ZS4gICAqLworfTsKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfc2RwX2F0dHIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zZHBfYXR0ciBwam1lZGlhX3NkcF9hdHRyOworCisKKy8qKgorICogQ3JlYXRlIFNEUCBhdHRyaWJ1dGUuCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUuCisgKiBAcGFyYW0gbmFtZQkJQXR0cmlidXRlIG5hbWUuCisgKiBAcGFyYW0gdmFsdWUJCU9wdGlvbmFsIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCisgKiBAcmV0dXJuCQlUaGUgbmV3IFNEUCBhdHRyaWJ1dGUuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9zZHBfYXR0ciopIHBqbWVkaWFfc2RwX2F0dHJfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICBjb25zdCBwal9zdHJfdCAqdmFsdWUpOworCisvKiogCisgKiBDbG9uZSBhdHRyaWJ1dGUgCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYmUgdXNlZC4KKyAqIEBwYXJhbSBhdHRyCQlUaGUgYXR0cmlidXRlIHRvIGNsb25lLgorICoKKyAqIEByZXR1cm4JCU5ldyBhdHRyaWJ1dGUgYXMgY2xvbmVkIGZyb20gdGhlIGF0dHJpYnV0ZS4KKyAqLworUEpfREVDTChwam1lZGlhX3NkcF9hdHRyKikgcGptZWRpYV9zZHBfYXR0cl9jbG9uZShwal9wb29sX3QgKnBvb2wsIAorCQkJCQkJICBjb25zdCBwam1lZGlhX3NkcF9hdHRyKmF0dHIpOworCisvKiogCisgKiBGaW5kIHRoZSBmaXJzdCBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuCisgKgorICogQHBhcmFtIGNvdW50CQlOdW1iZXIgb2YgYXR0cmlidXRlcyBpbiB0aGUgYXJyYXkuCisgKiBAcGFyYW0gYXR0cl9hcnJheQlBcnJheSBvZiBhdHRyaWJ1dGVzLgorICogQHBhcmFtIG5hbWUJCUF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQuCisgKiBAcGFyYW0gZm10CQlPcHRpb25hbCBzdHJpbmcgdG8gaW5kaWNhdGUgd2hpY2ggcGF5bG9hZCBmb3JtYXQKKyAqCQkJdG8gZmluZCBmb3IgXGEgcnRwbWFwIGFuZCBcYSBmbXQgYXR0cmlidXRlcy4gRm9yIG90aGVyCisgKgkJCXR5cGVzIG9mIGF0dHJpYnV0ZXMsIHRoZSB2YWx1ZSBzaG91bGQgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuCQlUaGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBpdCBjYW4ndCBiZSBmb3VuZC4KKyAqCisgKiBAc2VlIHBqbWVkaWFfc2RwX2F0dHJfZmluZDIsIHBqbWVkaWFfc2RwX21lZGlhX2ZpbmRfYXR0ciwgCisgKglwam1lZGlhX3NkcF9tZWRpYV9maW5kX2F0dHIyCisgKi8KK1BKX0RFQ0wocGptZWRpYV9zZHBfYXR0ciopIAorcGptZWRpYV9zZHBfYXR0cl9maW5kKHVuc2lnbmVkIGNvdW50LCAKKwkJICAgICAgcGptZWRpYV9zZHBfYXR0ciAqY29uc3QgYXR0cl9hcnJheVtdLAorCQkgICAgICBjb25zdCBwal9zdHJfdCAqbmFtZSwgY29uc3QgcGpfc3RyX3QgKmZtdCk7CisKKy8qKiAKKyAqIEZpbmQgdGhlIGZpcnN0IGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAqCisgKiBAcGFyYW0gY291bnQJCU51bWJlciBvZiBhdHRyaWJ1dGVzIGluIHRoZSBhcnJheS4KKyAqIEBwYXJhbSBhdHRyX2FycmF5CUFycmF5IG9mIGF0dHJpYnV0ZXMuCisgKiBAcGFyYW0gbmFtZQkJQXR0cmlidXRlIG5hbWUgdG8gZmluZC4KKyAqIEBwYXJhbSBmbXQJCU9wdGlvbmFsIHN0cmluZyB0byBpbmRpY2F0ZSB3aGljaCBwYXlsb2FkIGZvcm1hdAorICoJCQl0byBmaW5kIGZvciBcYSBydHBtYXAgYW5kIFxhIGZtdCBhdHRyaWJ1dGVzLiBGb3Igb3RoZXIKKyAqCQkJdHlwZXMgb2YgYXR0cmlidXRlcywgdGhlIHZhbHVlIHNob3VsZCBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4JCVRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLCBvciBOVUxMIGlmIGl0IGNhbid0IGJlIGZvdW5kLgorICoKKyAqIEBzZWUgcGptZWRpYV9zZHBfYXR0cl9maW5kLCBwam1lZGlhX3NkcF9tZWRpYV9maW5kX2F0dHIsCisgKglwam1lZGlhX3NkcF9tZWRpYV9maW5kX2F0dHIyCisgKi8KK1BKX0RFQ0wocGptZWRpYV9zZHBfYXR0ciopIAorcGptZWRpYV9zZHBfYXR0cl9maW5kMih1bnNpZ25lZCBjb3VudCwgCisJCSAgICAgICBwam1lZGlhX3NkcF9hdHRyICpjb25zdCBhdHRyX2FycmF5W10sCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBwal9zdHJfdCAqZm10KTsKKworLyoqCisgKiBBZGQgYSBuZXcgYXR0cmlidXRlIHRvIGFycmF5IG9mIGF0dHJpYnV0ZXMuCisgKgorICogQHBhcmFtIGNvdW50CQlOdW1iZXIgb2YgYXR0cmlidXRlcyBpbiB0aGUgYXJyYXkuCisgKiBAcGFyYW0gYXR0cl9hcnJheQlBcnJheSBvZiBhdHRyaWJ1dGVzLgorICogQHBhcmFtIGF0dHIJCVRoZSBhdHRyaWJ1dGUgdG8gYWRkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb3IgdGhlIGVycm9yIGNvZGUuCisgKgorICogQHNlZSBwam1lZGlhX3NkcF9tZWRpYV9hZGRfYXR0cgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NkcF9hdHRyX2FkZCh1bnNpZ25lZCAqY291bnQsCisJCQkJCSAgcGptZWRpYV9zZHBfYXR0ciAqYXR0cl9hcnJheVtdLAorCQkJCQkgIHBqbWVkaWFfc2RwX2F0dHIgKmF0dHIpOworCisvKioKKyAqIFJlbW92ZSBhbGwgYXR0cmlidXRlcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiBhcnJheSBvZiBhdHRyaWJ1dGVzLgorICoKKyAqIEBwYXJhbSBjb3VudAkJTnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gdGhlIGFycmF5LgorICogQHBhcmFtIGF0dHJfYXJyYXkJQXJyYXkgb2YgYXR0cmlidXRlcy4KKyAqIEBwYXJhbSBuYW1lCQlBdHRyaWJ1dGUgbmFtZSB0byBmaW5kLgorICoKKyAqIEByZXR1cm4JCU51bWJlciBvZiBhdHRyaWJ1dGVzIHJlbW92ZWQuCisgKgorICogQHNlZSBwam1lZGlhX3NkcF9tZWRpYV9yZW1vdmVfYWxsX2F0dHIKKyAqLworUEpfREVDTCh1bnNpZ25lZCkgcGptZWRpYV9zZHBfYXR0cl9yZW1vdmVfYWxsKHVuc2lnbmVkICpjb3VudCwKKwkJCQkJICAgICAgcGptZWRpYV9zZHBfYXR0ciAqYXR0cl9hcnJheVtdLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworCisvKioKKyAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBhdHRyaWJ1dGUgYXJyYXkuCisgKgorICogQHBhcmFtIGNvdW50CQlOdW1iZXIgb2YgYXR0cmlidXRlcyBpbiB0aGUgYXJyYXkuCisgKiBAcGFyYW0gYXR0cl9hcnJheQlBcnJheSBvZiBhdHRyaWJ1dGVzLgorICogQHBhcmFtIGF0dHIJCVRoZSBhdHRyaWJ1dGUgaW5zdGFuY2UgdG8gcmVtb3ZlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgd2hlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZCwgb3IgCisgKgkJCVBKX0VOT1RGT1VORCB3aGVuIHRoZSBhdHRyaWJ1dGUgY2FuIG5vdCBiZSBmb3VuZC4KKyAqCisgKiBAc2VlIHBqbWVkaWFfc2RwX21lZGlhX3JlbW92ZV9hdHRyCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX2F0dHJfcmVtb3ZlKHVuc2lnbmVkICpjb3VudCwKKwkJCQkJICAgICBwam1lZGlhX3NkcF9hdHRyICphdHRyX2FycmF5W10sCisJCQkJCSAgICAgcGptZWRpYV9zZHBfYXR0ciAqYXR0cik7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWNsYXJlcyBTRFAgXGEgcnRwbWFwIGF0dHJpYnV0ZS4KKyAqLworc3RydWN0IHBqbWVkaWFfc2RwX3J0cG1hcAoreworICAgIHBqX3N0cl90CQlwdDsJICAgIC8qKjwgUGF5bG9hZCB0eXBlLgkgICAgKi8KKyAgICBwal9zdHJfdAkJZW5jX25hbWU7ICAgLyoqPCBFbmNvZGluZyBuYW1lLgkgICAgKi8KKyAgICB1bnNpZ25lZAkJY2xvY2tfcmF0ZTsgLyoqPCBDbG9jayByYXRlLgkgICAgKi8KKyAgICBwal9zdHJfdAkJcGFyYW07CSAgICAvKio8IFBhcmFtZXRlci4JICAgICovCit9OworCisvKioKKyAqIEBzZWUgcGptZWRpYV9zZHBfcnRwbWFwCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc2RwX3J0cG1hcCBwam1lZGlhX3NkcF9ydHBtYXA7CisKKworLyoqCisgKiBDb252ZXJ0IGdlbmVyaWMgYXR0cmlidXRlIHRvIFNEUCBcYSBydHBtYXAuIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzCisgKiBhIG5ldyBhdHRyaWJ1dGUgYW5kIGNhbGwgI3BqbWVkaWFfc2RwX2F0dHJfZ2V0X3J0cG1hcCgpLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHVzZWQgdG8gY3JlYXRlIHRoZSBydHBtYXAgYXR0cmlidXRlLgorICogQHBhcmFtIGF0dHIJCUdlbmVyaWMgYXR0cmlidXRlIHRvIGJlIGNvbnZlcnRlZCB0byBydHBtYXAsIHdoaWNoCisgKgkJCW5hbWUgbXVzdCBiZSAicnRwbWFwIi4KKyAqIEBwYXJhbSBwX3J0cG1hcAlQb2ludGVyIHRvIHJlY2VpdmUgU0RQIHJ0cG1hcCBhdHRyaWJ1dGUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiB0aGUgYXR0cmlidXRlIGNhbiBiZSBzdWNjZXNzZnVsbHkKKyAqCQkJY29udmVydGVkIHRvIFxhIHJ0cG1hcCB0eXBlLgorICoKKyAqIEBzZWUgcGptZWRpYV9zZHBfYXR0cl9nZXRfcnRwbWFwCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX2F0dHJfdG9fcnRwbWFwKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCWNvbnN0IHBqbWVkaWFfc2RwX2F0dHIgKmF0dHIsCisJCQkJCQlwam1lZGlhX3NkcF9ydHBtYXAgKipwX3J0cG1hcCk7CisKKworLyoqCisgKiBHZXQgdGhlIHJ0cG1hcCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtZSBTRFAgYXR0cmlidXRlLgorICoKKyAqIEBwYXJhbSBhdHRyCQlHZW5lcmljIGF0dHJpYnV0ZSB0byBiZSBjb252ZXJ0ZWQgdG8gcnRwbWFwLCB3aGljaAorICoJCQluYW1lIG11c3QgYmUgInJ0cG1hcCIuCisgKiBAcGFyYW0gcnRwbWFwCVNEUCBcYSBydHBtYXAgYXR0cmlidXRlIHRvIGJlIGluaXRpYWxpemVkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgdGhlIGF0dHJpYnV0ZSBjYW4gYmUgc3VjY2Vzc2Z1bGx5CisgKgkJCWNvbnZlcnRlZCB0byBcYSBydHBtYXAgYXR0cmlidXRlLgorICoKKyAqIEBzZWUgcGptZWRpYV9zZHBfYXR0cl90b19ydHBtYXAKKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfYXR0cl9nZXRfcnRwbWFwKGNvbnN0IHBqbWVkaWFfc2RwX2F0dHIgKmF0dHIsCisJCQkJCQkgcGptZWRpYV9zZHBfcnRwbWFwICpydHBtYXApOworCisKKy8qKgorICogQ29udmVydCBcYSBydHBtYXAgYXR0cmlidXRlIHRvIGdlbmVyaWMgYXR0cmlidXRlLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGJlIHVzZWQuCisgKiBAcGFyYW0gcnRwbWFwCVRoZSBcYSBydHBtYXAgYXR0cmlidXRlLgorICogQHBhcmFtIHBfYXR0cglQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGdlbmVyaWMgU0RQIGF0dHJpYnV0ZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9zZHBfcnRwbWFwX3RvX2F0dHIoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCSAgICBjb25zdCBwam1lZGlhX3NkcF9ydHBtYXAgKnJ0cG1hcCwKKwkJCSAgICBwam1lZGlhX3NkcF9hdHRyICoqcF9hdHRyKTsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBTRFAgXGEgZm10cCBhdHRyaWJ1dGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc2RwX2ZtdHAKK3sKKyAgICBwal9zdHJfdAkJZm10OwkgICAgLyoqPCBGb3JtYXQgdHlwZS4JCSAgICAqLworICAgIHBqX3N0cl90CQlmbXRfcGFyYW07ICAvKio8IEZvcm1hdCBzcGVjaWZpYyBwYXJhbWV0ZXIuICovCit9IHBqbWVkaWFfc2RwX2ZtdHA7CisKKworLyoqCisgKiBHZXQgdGhlIGZtdHAgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNhbWUgU0RQIGF0dHJpYnV0ZS4KKyAqCisgKiBAcGFyYW0gYXR0cgkJR2VuZXJpYyBhdHRyaWJ1dGUgdG8gYmUgY29udmVydGVkIHRvIGZtdHAsIHdoaWNoCisgKgkJCW5hbWUgbXVzdCBiZSAiZm10cCIuCisgKiBAcGFyYW0gZm10cAkJU0RQIGZtdHAgYXR0cmlidXRlIHRvIGJlIGluaXRpYWxpemVkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfYXR0cl9nZXRfZm10cChjb25zdCBwam1lZGlhX3NkcF9hdHRyICphdHRyLAorCQkJCQkgICAgICAgcGptZWRpYV9zZHBfZm10cCAqZm10cCk7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgU0RQIFxhIHJ0Y3AgYXR0cmlidXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3NkcF9ydGNwX2F0dHIKK3sKKyAgICB1bnNpZ25lZAlwb3J0OwkgICAgLyoqPCBSVENQIHBvcnQgbnVtYmVyLgkgICAgKi8KKyAgICBwal9zdHJfdAluZXRfdHlwZTsgICAvKio8IE9wdGlvbmFsIG5ldHdvcmsgdHlwZS4JICAgICovCisgICAgcGpfc3RyX3QJYWRkcl90eXBlOyAgLyoqPCBPcHRpb25hbCBhZGRyZXNzIHR5cGUuCSAgICAqLworICAgIHBqX3N0cl90CWFkZHI7CSAgICAvKio8IE9wdGlvbmFsIGFkZHJlc3MuCSAgICAqLworfSBwam1lZGlhX3NkcF9ydGNwX2F0dHI7CisKKworLyoqCisgKiBQYXJzZSBhIGdlbmVyaWMgU0RQIGF0dHJpYnV0ZSB0byBnZXQgU0RQIHJ0Y3AgYXR0cmlidXRlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gYXR0cgkJR2VuZXJpYyBhdHRyaWJ1dGUgdG8gYmUgY29udmVydGVkIHRvIHJ0Y3AsIHdoaWNoCisgKgkJCW5hbWUgbXVzdCBiZSAicnRjcCIuCisgKiBAcGFyYW0gcnRjcAkJU0RQIHJ0Y3AgYXR0cmlidXRlIHRvIGJlIGluaXRpYWxpemVkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfYXR0cl9nZXRfcnRjcChjb25zdCBwam1lZGlhX3NkcF9hdHRyICphdHRyLAorCQkJCQkgICAgICAgcGptZWRpYV9zZHBfcnRjcF9hdHRyICpydGNwKTsKKworCisvKioKKyAqIENyZWF0ZSBhPXJ0Y3AgYXR0cmlidXRlLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlLgorICogQHBhcmFtIGEJCVNvY2tldCBhZGRyZXNzLgorICoKKyAqIEByZXR1cm4JCVNEUCBSVENQIGF0dHJpYnV0ZS4KKyAqLworUEpfREVDTChwam1lZGlhX3NkcF9hdHRyKikgcGptZWRpYV9zZHBfYXR0cl9jcmVhdGVfcnRjcChwal9wb29sX3QgKnBvb2wsCisJCQkJCQkJY29uc3QgcGpfc29ja2FkZHIgKmEpOworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRFAgQ09OTkVDVElPTiBJTkZPCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIFNEUCBjb25uZWN0aW9uIGluZm8gKCJjPSIgbGluZSkuIAorICovCitzdHJ1Y3QgcGptZWRpYV9zZHBfY29ubgoreworICAgIHBqX3N0cl90CW5ldF90eXBlOwkvKio8IE5ldHdvcmsgdHlwZSAoIklOIikuCQkqLworICAgIHBqX3N0cl90CWFkZHJfdHlwZTsJLyoqPCBBZGRyZXNzIHR5cGUgKCJJUDQiLCAiSVA2IikuCSovCisgICAgcGpfc3RyX3QJYWRkcjsJCS8qKjwgVGhlIGFkZHJlc3MuCQkJKi8KK307CisKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfc2RwX2Nvbm4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zZHBfY29ubiBwam1lZGlhX3NkcF9jb25uOworCisKKy8qKiAKKyAqIENsb25lIGNvbm5lY3Rpb24gaW5mby4gCisgKiAKKyAqIEBwYXJhbSBwb29sCSAgICBQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBjb25uZWN0aW9uIGluZm8uCisgKiBAcGFyYW0gcmhzCSAgICBUaGUgY29ubmVjdGlvbiBpbnRvIHRvIGNsb25lLgorICoKKyAqIEByZXR1cm4JICAgIFRoZSBuZXcgY29ubmVjdGlvbiBpbmZvLgorICovCitQSl9ERUNMKHBqbWVkaWFfc2RwX2Nvbm4qKSBwam1lZGlhX3NkcF9jb25uX2Nsb25lKHBqX3Bvb2xfdCAqcG9vbCwgCisJCQkJCQkgIGNvbnN0IHBqbWVkaWFfc2RwX2Nvbm4gKnJocyk7CisKKworLyoqIAorICogQ29tcGFyZSBjb25uZWN0aW9uIGluZm8uIAorICogCisgKiBAcGFyYW0gY29ubjEJICAgIFRoZSBmaXJzdCBjb25uZWN0aW9uIGluZm8gdG8gY29tcGFyZS4KKyAqIEBwYXJhbSBjb25uMQkgICAgVGhlIHNlY29uZCBjb25uZWN0aW9uIGluZm8gdG8gY29tcGFyZS4KKyAqIEBwYXJhbSBvcHRpb24gICAgQ29tcGFyaXNvbiBvcHRpb24sIHdoaWNoIHNob3VsZCBiZSB6ZXJvIGZvciBub3cuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyB3aGVuIGJvdGggY29ubmVjdGlvbiBpbmZvIGFyZSBlcXVhbCwgb3RoZXJ3aXNlCisgKgkJICAgIHJldHVybnMgUEpNRURJQV9TRFBfRUNPTk5OT1RFUVVBTC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfY29ubl9jbXAoY29uc3QgcGptZWRpYV9zZHBfY29ubiAqY29ubjEsIAorCQkJCQkgIGNvbnN0IHBqbWVkaWFfc2RwX2Nvbm4gKmNvbm4yLAorCQkJCQkgIHVuc2lnbmVkIG9wdGlvbik7CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNEUCBCQU5EV0lEVEggSU5GTworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBTRFAgYmFuZHdpZHRoIGluZm8gKCJiPSIgbGluZSkuIAorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3NkcF9iYW5kdworeworICAgIHBqX3N0cl90CW1vZGlmaWVyOwkvKio8IEJhbmR3aWR0aCBtb2RpZmllci4JCSovCisgICAgcGpfdWludDMyX3QJdmFsdWU7CSAgICAgICAgLyoqPCBCYW5kd2lkdGggdmFsdWUuCSAgICAgICAgICAgICAgICAqLworfSBwam1lZGlhX3NkcF9iYW5kdzsKKworCisvKiogCisgKiBDbG9uZSBiYW5kd2lkdGggaW5mby4gCisgKiAKKyAqIEBwYXJhbSBwb29sCSAgICBQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBiYW5kd2lkdGggaW5mby4KKyAqIEBwYXJhbSByaHMJICAgIFRoZSBiYW5kd2lkdGggaW50byB0byBjbG9uZS4KKyAqCisgKiBAcmV0dXJuCSAgICBUaGUgbmV3IGJhbmR3aWR0aCBpbmZvLgorICovCitQSl9ERUNMKHBqbWVkaWFfc2RwX2JhbmR3KikKK3BqbWVkaWFfc2RwX2JhbmR3X2Nsb25lKHBqX3Bvb2xfdCAqcG9vbCwgY29uc3QgcGptZWRpYV9zZHBfYmFuZHcgKnJocyk7CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0RQIE1FRElBIElORk8vTElORQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBTRFAgbWVkaWEgZGVzY3JpcHRvci4gQSBTRFAgbWVkaWEgZGVzY3JpcHRvcgorICogc3RhcnRzIHdpdGggIm09IiBsaW5lIGFuZCBjb250YWlucyB0aGUgbWVkaWEgYXR0cmlidXRlcyBhbmQgb3B0aW9uYWwKKyAqIGNvbm5lY3Rpb24gbGluZS4KKyAqLworc3RydWN0IHBqbWVkaWFfc2RwX21lZGlhCit7CisgICAgLyoqIE1lZGlhIGRlc2NyaXB0b3IgbGluZSAoIm09IiBsaW5lKSAqLworICAgIHN0cnVjdAorICAgIHsKKwlwal9zdHJfdCAgICBtZWRpYTsJCS8qKjwgTWVkaWEgdHlwZSAoImF1ZGlvIiwgInZpZGVvIikgICovCisJcGpfdWludDE2X3QgcG9ydDsJCS8qKjwgUG9ydCBudW1iZXIuCQkgICAgKi8KKwl1bnNpZ25lZCAgICBwb3J0X2NvdW50OwkJLyoqPCBQb3J0IGNvdW50LCB1c2VkIG9ubHkgd2hlbiA+MiAgKi8KKwlwal9zdHJfdCAgICB0cmFuc3BvcnQ7CQkvKio8IFRyYW5zcG9ydCAoIlJUUC9BVlAiKQkgICAgKi8KKwl1bnNpZ25lZCAgICBmbXRfY291bnQ7CQkvKio8IE51bWJlciBvZiBmb3JtYXRzLgkJICAgICovCisJcGpfc3RyX3QgICAgZm10W1BKTUVESUFfTUFYX1NEUF9GTVRdOyAgICAgICAvKio8IE1lZGlhIGZvcm1hdHMuCSAgICAqLworICAgIH0gZGVzYzsKKworICAgIHBqbWVkaWFfc2RwX2Nvbm4gICAqY29ubjsJCS8qKjwgT3B0aW9uYWwgY29ubmVjdGlvbiBpbmZvLgkgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgICAgIGJhbmR3X2NvdW50OwkvKio8IE51bWJlciBvZiBiYW5kd2lkdGggaW5mby4JICAgICovCisgICAgcGptZWRpYV9zZHBfYmFuZHcgICpiYW5kd1tQSk1FRElBX01BWF9TRFBfQkFORFddOyAvKio8IEJhbmR3aWR0aCBpbmZvLiAgKi8KKyAgICB1bnNpZ25lZAkgICAgICAgIGF0dHJfY291bnQ7CS8qKjwgTnVtYmVyIG9mIGF0dHJpYnV0ZXMuCSAgICAqLworICAgIHBqbWVkaWFfc2RwX2F0dHIgICAqYXR0cltQSk1FRElBX01BWF9TRFBfQVRUUl07ICAgLyoqPCBBdHRyaWJ1dGVzLgkgICAgKi8KKworfTsKKworCisvKioKKyAqIEBzZWUgcGptZWRpYV9zZHBfbWVkaWEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zZHBfbWVkaWEgcGptZWRpYV9zZHBfbWVkaWE7CisKKworLyoqIAorICogQ2xvbmUgU0RQIG1lZGlhIGRlc2NyaXB0aW9uLiAKKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgbWVkaWEgZGVzY3JpcHRpb24uCisgKiBAcGFyYW0gcmhzCSAgICBUaGUgbWVkaWEgZGVzY3JpcHRpbiB0byBjbG9uZS4KKyAqCisgKiBAcmV0dXJuCSAgICBOZXcgbWVkaWEgZGVzY3JpcHRpb24uCisgKi8KK1BKX0RFQ0wocGptZWRpYV9zZHBfbWVkaWEqKSAKK3BqbWVkaWFfc2RwX21lZGlhX2Nsb25lKCBwal9wb29sX3QgKnBvb2wsIAorCQkJIGNvbnN0IHBqbWVkaWFfc2RwX21lZGlhICpyaHMpOworCisvKioKKyAqIEZpbmQgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lIGluIHRoZSBtZWRpYSAKKyAqIGRlc2NyaXB0b3IuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgYmUgc3BlY2lmaWVkLgorICoKKyAqIEBwYXJhbSBtCQlUaGUgU0RQIG1lZGlhIGRlc2NyaXB0aW9uLgorICogQHBhcmFtIG5hbWUJCUF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQuCisgKiBAcGFyYW0gZm10CQlPcHRpb25hbCBwYXlsb2FkIHR5cGUgdG8gbWF0Y2ggaW4gdGhlCisgKgkJCWF0dHJpYnV0ZSBsaXN0LCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgXGEgcnRwbWFwCisgKgkJCW9yIFxhIGZtdHAuIEZvciBvdGhlciB0eXBlcyBvZiBTRFAgYXR0cmlidXRlcywgdGhpcworICoJCQl2YWx1ZSBzaG91bGQgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuCQlUaGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3IgTlVMTC4KKyAqLworUEpfREVDTChwam1lZGlhX3NkcF9hdHRyKikgCitwam1lZGlhX3NkcF9tZWRpYV9maW5kX2F0dHIoY29uc3QgcGptZWRpYV9zZHBfbWVkaWEgKm0sCisJCQkgICAgY29uc3QgcGpfc3RyX3QgKm5hbWUsIGNvbnN0IHBqX3N0cl90ICpmbXQpOworCisKKy8qKgorICogRmluZCB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG5hbWUgaW4gdGhlIFNEUCBtZWRpYSAKKyAqIGRlc2NyaXB0b3IuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgYmUgc3BlY2lmaWVkLgorICoKKyAqIEBwYXJhbSBtCQlUaGUgU0RQIG1lZGlhIGRlc2NyaXB0aW9uLgorICogQHBhcmFtIG5hbWUJCUF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQuCisgKiBAcGFyYW0gZm10CQlPcHRpb25hbCBwYXlsb2FkIHR5cGUgdG8gbWF0Y2ggaW4gdGhlCisgKgkJCWF0dHJpYnV0ZSBsaXN0LCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgXGEgcnRwbWFwCisgKgkJCW9yIFxhIGZtdHAuIEZvciBvdGhlciB0eXBlcyBvZiBTRFAgYXR0cmlidXRlcywgdGhpcworICoJCQl2YWx1ZSBzaG91bGQgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuCQlUaGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3IgTlVMTC4KKyAqLworUEpfREVDTChwam1lZGlhX3NkcF9hdHRyKikgCitwam1lZGlhX3NkcF9tZWRpYV9maW5kX2F0dHIyKGNvbnN0IHBqbWVkaWFfc2RwX21lZGlhICptLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBwal9zdHJfdCAqZm10KTsKKworLyoqCisgKiBBZGQgbmV3IGF0dHJpYnV0ZSB0byB0aGUgbWVkaWEgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gbQkJVGhlIFNEUCBtZWRpYSBkZXNjcmlwdGlvbi4KKyAqIEBwYXJhbSBhdHRyCQlBdHRyaWJ1dGUgdG8gYWRkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX21lZGlhX2FkZF9hdHRyKHBqbWVkaWFfc2RwX21lZGlhICptLAorCQkJCQkJcGptZWRpYV9zZHBfYXR0ciAqYXR0cik7CisKKy8qKgorICogUmVtb3ZlIGFsbCBhdHRyaWJ1dGVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhlIFNEUCBtZWRpYQorICogZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gbQkJVGhlIFNEUCBtZWRpYSBkZXNjcmlwdGlvbi4KKyAqIEBwYXJhbSBuYW1lCQlBdHRyaWJ1dGUgbmFtZSB0byByZW1vdmUuCisgKgorICogQHJldHVybgkJVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHJlbW92ZWQuCisgKi8KK1BKX0RFQ0wodW5zaWduZWQpIAorcGptZWRpYV9zZHBfbWVkaWFfcmVtb3ZlX2FsbF9hdHRyKHBqbWVkaWFfc2RwX21lZGlhICptLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSk7CisKKworLyoqCisgKiBSZW1vdmUgdGhlIG9jY3VyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBTRFAgbWVkaWEKKyAqIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtIG0JCVRoZSBTRFAgbWVkaWEgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBhdHRyCQlUaGUgYXR0cmlidXRlIHRvIGZpbmQgYW5kIHJlbW92ZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHRoZSBhdHRyaWJ1dGUgY2FuIGJlIGZvdW5kIGFuZCBoYXMKKyAqCQkJYmVlbiByZW1vdmVkIGZyb20gdGhlIGFycmF5LgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9zZHBfbWVkaWFfcmVtb3ZlX2F0dHIocGptZWRpYV9zZHBfbWVkaWEgKm0sCisJCQkgICAgICBwam1lZGlhX3NkcF9hdHRyICphdHRyKTsKKworCisvKioKKyAqIENvbXBhcmUgdHdvIFNEUCBtZWRpYSBmb3IgZXF1YWxpdHkuCisgKgorICogQHBhcmFtIHNkMQkgICAgVGhlIGZpcnN0IFNEUCBtZWRpYSB0byBjb21wYXJlLgorICogQHBhcmFtIHNkMgkgICAgVGhlIHNlY29uZCBTRFAgbWVkaWEgdG8gY29tcGFyZS4KKyAqIEBwYXJhbSBvcHRpb24gICAgQ29tcGFyaXNvbiBvcHRpb24sIHdoaWNoIHNob3VsZCBiZSB6ZXJvIGZvciBub3cuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyB3aGVuIGJvdGggU0RQIG1lZGlhcyBhcmUgZXF1YWwsIG9yIHRoZQorICoJCSAgICBhcHByb3ByaWF0ZSBzdGF0dXMgY29kZSBkZXNjcmliaW5nIHdoaWNoIHBhcnQgb2YKKyAqCQkgICAgdGhlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIG5vdCBlcXVhbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfbWVkaWFfY21wKGNvbnN0IHBqbWVkaWFfc2RwX21lZGlhICpzZDEsCisJCQkJCSAgIGNvbnN0IHBqbWVkaWFfc2RwX21lZGlhICpzZDIsCisJCQkJCSAgIHVuc2lnbmVkIG9wdGlvbik7CisKKworLyoqCisgKiBDb21wYXJlIHR3byBtZWRpYSB0cmFuc3BvcnRzIGZvciBjb21wYXRpYmlsaXR5LgorICoKKyAqIEBwYXJhbSB0MQkgICAgVGhlIGZpcnN0IG1lZGlhIHRyYW5zcG9ydCB0byBjb21wYXJlLgorICogQHBhcmFtIHQyCSAgICBUaGUgc2Vjb25kIG1lZGlhIHRyYW5zcG9ydCB0byBjb21wYXJlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgd2hlbiBib3RoIG1lZGlhIHRyYW5zcG9ydHMgYXJlIGNvbXBhdGlibGUsCisgKgkJICAgIG90aGVyd2lzZSByZXR1cm5zIFBKTUVESUFfU0RQX0VUUE9SVE5PVEVRVUFMLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NkcF90cmFuc3BvcnRfY21wKGNvbnN0IHBqX3N0cl90ICp0MSwKKwkJCQkJICAgICAgIGNvbnN0IHBqX3N0cl90ICp0Mik7CisKKworLyoqCisgKiBEZWFjdGl2YXRlIFNEUCBtZWRpYS4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgTWVtb3J5IHBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20uCisgKiBAcGFyYW0gbQkgICAgVGhlIFNEUCBtZWRpYSB0byBkZWFjdGl2YXRlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgd2hlbiBTRFAgbWVkaWEgc3VjY2Vzc2Z1bGx5IGRlYWN0aXZhdGVkLAorICoJCSAgICBvdGhlcndpc2UgYXBwcm9wcmlhdGUgc3RhdHVzIGNvZGUgcmV0dXJuZWQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX21lZGlhX2RlYWN0aXZhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkJICBwam1lZGlhX3NkcF9tZWRpYSAqbSk7CisKKworLyoqCisgKiBDbG9uZSBTRFAgbWVkaWEgZGVzY3JpcHRpb24gYW5kIGRlYWN0aXZhdGUgdGhlIG5ldyBTRFAgbWVkaWEuCisgKgorICogQHBhcmFtIHBvb2wJICAgIE1lbW9yeSBwb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNsb25lLgorICogQHBhcmFtIHJocwkgICAgVGhlIFNEUCBtZWRpYSB0byBjbG9uZS4KKyAqCisgKiBAcmV0dXJuCSAgICBOZXcgbWVkaWEgZGVzY3JwdGlvbiB3aXRoIGRlYWN0aXZhdGVkIGluZGljYXRpb24uCisgKi8KK1BKX0RFQ0wocGptZWRpYV9zZHBfbWVkaWEqKSBwam1lZGlhX3NkcF9tZWRpYV9jbG9uZV9kZWFjdGl2YXRlKAorCQkJCQkJcGpfcG9vbF90ICpwb29sLAorCQkJCQkJY29uc3QgcGptZWRpYV9zZHBfbWVkaWEgKnJocyk7CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNEUCBTRVNTSU9OIERFU0NSSVBUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgU0RQIHNlc3Npb24gZGVzY3JpcHRpb24uIEEgU0RQIHNlc3Npb24gZGVzY3JpcHRvcgorICogY29udGFpbnMgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXNzaW9uLCBhbmQgbm9ybWFsbHkgaXMgZXhjaGFuZ2VkCisgKiB3aXRoIHJlbW90ZSBtZWRpYSBwZWVyIHVzaW5nIHNpZ25hbGluZyBwcm90b2NvbCBzdWNoIGFzIFNJUC4KKyAqLworc3RydWN0IHBqbWVkaWFfc2RwX3Nlc3Npb24KK3sKKyAgICAvKiogU2Vzc2lvbiBvcmlnaW4gKG89IGxpbmUpICovCisgICAgc3RydWN0CisgICAgeworCXBqX3N0cl90ICAgIHVzZXI7CSAgICAvKio8IFVzZXIgCQkJCSovCisJcGpfdWludDMyX3QgaWQ7CQkgICAgLyoqPCBTZXNzaW9uIElECQkJKi8KKwlwal91aW50MzJfdCB2ZXJzaW9uOwkgICAgLyoqPCBTZXNzaW9uIHZlcnNpb24JCSovCisJcGpfc3RyX3QgICAgbmV0X3R5cGU7CSAgICAvKio8IE5ldHdvcmsgdHlwZSAoIklOIikJCSovCisJcGpfc3RyX3QgICAgYWRkcl90eXBlOwkgICAgLyoqPCBBZGRyZXNzIHR5cGUgKCJJUDQiLCAiSVA2IikJKi8KKwlwal9zdHJfdCAgICBhZGRyOwkgICAgLyoqPCBUaGUgYWRkcmVzcy4JCQkqLworICAgIH0gb3JpZ2luOworCisgICAgcGpfc3RyX3QJICAgICAgIG5hbWU7CSAgICAvKio8IFN1YmplY3QgbGluZSAocz0pCQkqLworICAgIHBqbWVkaWFfc2RwX2Nvbm4gICpjb25uOwkgICAgLyoqPCBDb25uZWN0aW9uIGxpbmUgKGM9KQkJKi8KKyAgICB1bnNpZ25lZAkgICAgICAgYmFuZHdfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGJhbmR3aWR0aCBpbmZvIChiPSkJKi8KKyAgICBwam1lZGlhX3NkcF9iYW5kdyAqYmFuZHdbUEpNRURJQV9NQVhfU0RQX0JBTkRXXTsKKwkJCQkgICAgLyoqPCBCYW5kd2lkdGggaW5mbyBhcnJheSAoYj0pCSovCisgICAgCisgICAgLyoqIFNlc3Npb24gdGltZSAodD0gbGluZSkJKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisJcGpfdWludDMyX3Qgc3RhcnQ7CSAgICAvKio8IFN0YXJ0IHRpbWUuCQkJKi8KKwlwal91aW50MzJfdCBzdG9wOwkgICAgLyoqPCBTdG9wIHRpbWUuCQkJKi8KKyAgICB9IHRpbWU7CisKKyAgICB1bnNpZ25lZAkgICAgICAgYXR0cl9jb3VudDsJCS8qKjwgTnVtYmVyIG9mIGF0dHJpYnV0ZXMuICAqLworICAgIHBqbWVkaWFfc2RwX2F0dHIgICphdHRyW1BKTUVESUFfTUFYX1NEUF9BVFRSXTsgLyoqPCBBdHRyaWJ1dGVzIGFycmF5LiAgICovCisKKyAgICB1bnNpZ25lZAkgICAgICAgbWVkaWFfY291bnQ7CQkvKio8IE51bWJlciBvZiBtZWRpYS4JICAgICovCisgICAgcGptZWRpYV9zZHBfbWVkaWEgKm1lZGlhW1BKTUVESUFfTUFYX1NEUF9NRURJQV07CS8qKjwgTWVkaWEgYXJyYXkuICAgKi8KKworfTsKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfc2RwX3Nlc3Npb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zZHBfc2Vzc2lvbiBwam1lZGlhX3NkcF9zZXNzaW9uOworCisKKworLyoqCisgKiBQYXJzZSBTRFAgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wgdG8gYWxsb2NhdGUgU0RQIHNlc3Npb24gZGVzY3JpcHRpb24uCisgKiBAcGFyYW0gYnVmCSAgICBUaGUgbWVzc2FnZSBidWZmZXIuCisgKiBAcGFyYW0gbGVuCSAgICBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLgorICogQHBhcmFtIHBfc2RwCSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBpZiBtZXNzYWdlIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkIGludG8KKyAqCQkgICAgU0RQIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfcGFyc2UoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgICAgIGNoYXIgKmJ1ZiwgcGpfc2l6ZV90IGxlbiwgCisJCQkJCXBqbWVkaWFfc2RwX3Nlc3Npb24gKipwX3NkcCApOworCisvKioKKyAqIFByaW50IFNEUCBkZXNjcmlwdGlvbiB0byBhIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gc2RwCSAgICBUaGUgU0RQIHNlc3Npb24gZGVzY3JpcHRpb24uCisgKiBAcGFyYW0gYnVmCSAgICBUaGUgYnVmZmVyLgorICogQHBhcmFtIHNpemUJICAgIFRoZSBidWZmZXIgbGVuZ3RoLgorICoKKyAqIEByZXR1cm4JICAgIHRoZSBsZW5ndGggcHJpbnRlZCwgb3IgLTEgaWYgdGhlIGJ1ZmZlciBpcyB0b28KKyAqCQkgICAgc2hvcnQuCisgKi8KK1BKX0RFQ0woaW50KSBwam1lZGlhX3NkcF9wcmludCggY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqc2RwLCAKKwkJCQljaGFyICpidWYsIHBqX3NpemVfdCBzaXplKTsKKworCisvKioKKyAqIFBlcmZvcm0gc2VtYW50aWMgdmFsaWRhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHZhbGlkYXRpb24gYmV5b25kIGp1c3Qgc3ludGFjdGljIHZlcmlmaWNhdGlvbiwKKyAqIHN1Y2ggYXMgdG8gdmVyaWZ5IHRoZSB2YWx1ZSBvZiBuZXR3b3JrIHR5cGUgYW5kIGFkZHJlc3MgdHlwZSwgY2hlY2sKKyAqIHRoZSBjb25uZWN0aW9uIGxpbmUsIGFuZCB2ZXJpZnkgdGhhdCBcYSBydHBtYXAgYXR0cmlidXRlIGlzIHByZXNlbnQKKyAqIHdoZW4gZHluYW1pYyBwYXlsb2FkIHR5cGUgaXMgdXNlZC4KKyAqCisgKiBAcGFyYW0gc2RwCSAgICBUaGUgU0RQIHNlc3Npb24gZGVzY3JpcHRvciB0byB2YWxpZGF0ZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX3ZhbGlkYXRlKGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnNkcCk7CisKKworLyoqCisgKiBQZXJmb3JtIHNlbWFudGljIHZhbGlkYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU0RQIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB2YWxpZGF0aW9uIGJleW9uZCBqdXN0IHN5bnRhY3RpYyB2ZXJpZmljYXRpb24sCisgKiBzdWNoIGFzIHRvIHZlcmlmeSB0aGUgdmFsdWUgb2YgbmV0d29yayB0eXBlIGFuZCBhZGRyZXNzIHR5cGUsIGNoZWNrCisgKiB0aGUgY29ubmVjdGlvbiBsaW5lLCBhbmQgdmVyaWZ5IHRoYXQgXGEgcnRwbWFwIGF0dHJpYnV0ZSBpcyBwcmVzZW50CisgKiB3aGVuIGR5bmFtaWMgcGF5bG9hZCB0eXBlIGlzIHVzZWQuCisgKgorICogQHBhcmFtIHNkcAkgICAgVGhlIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IgdG8gdmFsaWRhdGUuCisgKiBAcGFyYW0gc3RyaWN0ICAgIEZsYWcgd2hldGhlciB0aGUgY2hlY2sgc2hvdWxkIGJlIHN0cmljdCwgaS5lOiBhbGxvdworICoJCSAgICBtZWRpYSB3aXRob3V0IGNvbm5lY3Rpb24gbGluZSB3aGVuIHBvcnQgaXMgemVyby4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX3ZhbGlkYXRlMihjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpzZHAsCisJCQkJCSAgIHBqX2Jvb2xfdCBzdHJpY3QpOworCisKKy8qKgorICogQ2xvbmUgU0RQIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wgdXNlZCB0byBjbG9uZSB0aGUgc2Vzc2lvbi4KKyAqIEBwYXJhbSBzZHAJICAgIFRoZSBTRFAgc2Vzc2lvbiB0byBjbG9uZS4KKyAqCisgKiBAcmV0dXJuCSAgICBOZXcgU0RQIHNlc3Npb24uCisgKi8KK1BKX0RFQ0wocGptZWRpYV9zZHBfc2Vzc2lvbiopIAorcGptZWRpYV9zZHBfc2Vzc2lvbl9jbG9uZSggcGpfcG9vbF90ICpwb29sLAorCQkJICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqc2RwKTsKKworCisvKioKKyAqIENvbXBhcmUgdHdvIFNEUCBzZXNzaW9uIGZvciBlcXVhbGl0eS4KKyAqCisgKiBAcGFyYW0gc2QxCSAgICBUaGUgZmlyc3QgU0RQIHNlc3Npb24gdG8gY29tcGFyZS4KKyAqIEBwYXJhbSBzZDIJICAgIFRoZSBzZWNvbmQgU0RQIHNlc3Npb24gdG8gY29tcGFyZS4KKyAqIEBwYXJhbSBvcHRpb24gICAgTXVzdCBiZSB6ZXJvIGZvciBub3cuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyB3aGVuIGJvdGggU0RQcyBhcmUgZXF1YWwsIG9yIG90aGVyd2lzZQorICoJCSAgICB0aGUgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHdoaWNoIHBhcnQgb2YgdGhlIHNlc3Npb24KKyAqCQkgICAgZGVzY3JpcHRvcnMgYXJlIG5vdCBlcXVhbC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfc2Vzc2lvbl9jbXAoY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqc2QxLAorCQkJCQkgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnNkMiwKKwkJCQkJICAgICB1bnNpZ25lZCBvcHRpb24pOworCisKKy8qKgorICogQWRkIG5ldyBhdHRyaWJ1dGUgdG8gdGhlIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW0gcwkJVGhlIFNEUCBzZXNzaW9uIGRlc2NyaXB0aW9uLgorICogQHBhcmFtIGF0dHIJCUF0dHJpYnV0ZSB0byBhZGQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfc2Vzc2lvbl9hZGRfYXR0cihwam1lZGlhX3NkcF9zZXNzaW9uICpzLAorCQkJCQkJICBwam1lZGlhX3NkcF9hdHRyICphdHRyKTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9TRFBfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcF9uZWcuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NkcF9uZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU3MTMzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2RwX25lZy5oCkBAIC0wLDAgKzEsODIyIEBACisvKiAkSWQ6IHNkcF9uZWcuaCA0NTc3IDIwMTMtMDgtMDEgMDQ6MTg6MTVaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1NEUF9ORUdfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9TRFBfTkVHX0hfXworCisKKy8qKgorICogQGZpbGUgc2RwX25lZy5oCisgKiBAYnJpZWYgU0RQIG5lZ290aWF0b3IgaGVhZGVyIGZpbGUuCisgKi8KKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfU0RQX05FRyBTRFAgTmVnb3RpYXRpb24gU3RhdGUgTWFjaGluZSAoT2ZmZXIvQW5zd2VyIE1vZGVsLCBSRkMgMzI2NCkKKyAqIEBpbmdyb3VwIFBKTUVESUFfU0VTU0lPTgorICogQGJyaWVmIFNEUCBOZWdvdGlhdGlvbiBTdGF0ZSBNYWNoaW5lIChPZmZlci9BbnN3ZXIgTW9kZWwsIFJGQyAzMjY0KQorICogQHsKKyAqCisgKiBUaGUgaGVhZGVyIGZpbGUgPGI+PHBqbWVkaWEvc2RwX25lZy5oPjwvYj4gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCisgKiBvZiBTRFAgb2ZmZXIgYW5kIGFuc3dlciBuZWdvdGlhdG9yLiBTRFAgb2ZmZXIgYW5kIGFuc3dlciBtb2RlbCBpcyBkZXNjcmliZWQKKyAqIGluIFJGQyAzMjY0IDxiPiJBbiBPZmZlci9BbnN3ZXIgTW9kZWwgd2l0aCBTZXNzaW9uIERlc2NyaXB0aW9uIFByb3RvY29sIAorICogKFNEUCkiPC9iPi4KKyAqCisgKiBUaGUgU0RQIG5lZ290aWF0b3IgaXMgcmVwcmVzZW50ZWQgd2l0aCBvcGFxdWUgdHlwZSBcYSBwam1lZGlhX3NkcF9uZWcuCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBuZWdvdGlhdGlvbiBzdGF0ZSBhbmQgc2V2ZXJhbCBTRFAgc2Vzc2lvbiAKKyAqIGRlc2NyaXB0b3JzIGN1cnJlbnRseSBiZWluZyB1c2VkIGluIHRoZSBuZWdvdGlhdGlvbi4KKyAqCisgKgorICogXHNlY3Rpb24gc2RwbmVnX3N0YXRlX2RpYSBTRFAgTmVnb3RpYXRvciBTdGF0ZSBEaWFncmFtCisgKgorICogVGhlIGZvbGxvd2luZyBkaWFncmFtIGRlc2NyaWJlcyB0aGUgc3RhdGUgdHJhbnNpdGlvbiBkaWFncmFtIG9mIHRoZQorICogU0RQIG5lZ290aWF0b3IuCisgKiAKKyAqIDxwcmU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeV9sb2NhbF9vZmZlcigpCisgKiAgICAgY3JlYXRlX3dfbG9jYWxfb2ZmZXIoKSAgKy0tLS0tLS0tLS0tLS0rICBzZW5kX2xvY2FsX29mZmVyKCkKKyAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IExPQ0FMX09GRkVSIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLStfX19fX18gICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgXF9fX19fX19fX19fX18gICAgfAorICogICAgfCAgICAgICAgICAgc2V0X3JlbW90ZV9hbnN3ZXIoKSB8ICAgICAgICAgICBjYW5jZWxfb2ZmZXIoKSAgXCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgViAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICB8CisgKiArLS0rLS0tKyAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgIG5lZ290aWF0ZSgpICAgICArLX4tLS0tKworICogfCBOVUxMIHwgICAgICAgICAgICAgICAgICAgICB8IFdBSVRfTkVHTyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0+fCBET05FIHwKKyAqICstLS0tLS0rICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICstLS0tLS0rCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgICAgICBfX19fX19fX19fX19fX19fX19fX19fXiAgfAorICogICAgfCAgICAgICAgICAgIHNldF9sb2NhbF9hbnN3ZXIoKSB8ICAgICAvICAgICBjYW5jZWxfb2ZmZXIoKSAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKyAgIHNldF9yZW1vdGVfb2ZmZXIoKSAgfAorICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwgUkVNT1RFX09GRkVSIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIGNyZWF0ZV93X3JlbW90ZV9vZmZlcigpICstLS0tLS0tLS0tLS0tLSsKKyAqCisgKiA8L3ByZT4KKyAqCisgKgorICoKKyAqIFxzZWN0aW9uIHNkcG5lZ19vZmZlcl9hbnN3ZXIgU0RQIE9mZmVyL0Fuc3dlciBNb2RlbCB3aXRoIE5lZ290aWF0b3IKKyAqCisgKiBcc3Vic2VjdGlvbiBzZHBuZWdfY3JlYXRlX29mZmVyIENyZWF0aW5nIEluaXRpYWwgT2ZmZXIKKyAqCisgKiBBcHBsaWNhdGlvbiBjcmVhdGVzIGFuIG9mZmVyIGJ5IG1hbnVhbHkgYnVpbGRpbmcgdGhlIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IKKyAqIChwam1lZGlhX3NkcF9zZXNzaW9uKSwgb3IgcmVxdWVzdCBQSk1FRElBIGVuZHBvaW50IChwam1lZGlhX2VuZHB0KSB0byAKKyAqIGNyZWF0ZSBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yIGJhc2VkIG9uIGNhcGFiaWxpdGllcyB0aGF0IHByZXNlbnQgaW4gdGhlCisgKiBlbmRwb2ludCBieSBjYWxsaW5nICNwam1lZGlhX2VuZHB0X2NyZWF0ZV9zZHAoKS4KKyAqCisgKiBBcHBsaWNhdGlvbiB0aGVuIGNyZWF0ZXMgU0RQIG5lZ290aWF0b3IgaW5zdGFuY2UgYnkgY2FsbGluZworICogI3BqbWVkaWFfc2RwX25lZ19jcmVhdGVfd19sb2NhbF9vZmZlcigpLCBwYXNzaW5nIHRoZSBTRFAgb2ZmZXIgaW4gdGhlCisgKiBmdW5jdGlvbiBhcmd1bWVudHMuIFRoZSBTRFAgbmVnb3RpYXRvciBrZWVwcyBhIGNvcHkgb2YgY3VycmVudCBsb2NhbCBvZmZlciwKKyAqIGFuZCB1cGRhdGUgaXRzIHN0YXRlIHRvIFBKTUVESUFfU0RQX05FR19TVEFURV9MT0NBTF9PRkZFUi4KKyAqCisgKiBBcHBsaWNhdGlvbiBjYW4gdGhlbiBzZW5kIHRoZSBpbml0aWFsIFNEUCBvZmZlciB0aGF0IGl0IGNyZWF0ZXMgdG8KKyAqIHJlbW90ZSBwZWVyIHVzaW5nIHNpZ25hbGluZyBwcm90b2NvbCBzdWNoIGFzIFNJUC4KKyAqCisgKgorICogXHN1YnNlY3Rpb24gc2RwbmVnX3N1YnNlcV9vZmZlciBHZW5lcmF0aW5nIFN1YnNlcXVlbnQgT2ZmZXIKKyAqCisgKiBUaGUgbmVnb3RpYXRvciBjYW4gb25seSBjcmVhdGUgc3Vic2VxdWVudCBvZmZlciBhZnRlciBpdCBoYXMgZmluaXNoZWQKKyAqIHRoZSBuZWdvdGlhdGlvbiBwcm9jZXNzIG9mIHByZXZpb3VzIG9mZmVyL2Fuc3dlciBzZXNzaW9uIChpLmUuIHRoZQorICogbmVnb3RpYXRvciBzdGF0ZSBpcyBQSk1FRElBX1NEUF9ORUdfU1RBVEVfRE9ORSkuCisgKgorICogSWYgYW55IHByZXZpb3VzIG5lZ290aWF0aW9uIHByb2Nlc3Mgd2FzIHN1Y2Nlc3NmdWxsIChpLmUuIHRoZSByZXR1cm4gCisgKiB2YWx1ZSBvZiAjcGptZWRpYV9zZHBfbmVnX25lZ290aWF0ZSgpIHdhcyBQSl9TVUNDRVNTKSwgdGhlIG5lZ290aWF0b3IKKyAqIGtlZXBzIGJvdGggYWN0aXZlIGxvY2FsIGFuZCBhY3RpdmUgcmVtb3RlIFNEUC4KKyAqCisgKiBJZiBhcHBsaWNhdGlvbiBkb2VzIG5vdCB3YW50IHNlbmQgbW9kaWZpZWQgb2ZmZXIsIGl0IGNhbiBqdXN0IHNlbmQKKyAqIHRoZSBhY3RpdmUgbG9jYWwgU0RQIGFzIHRoZSBvZmZlci4gSW4gdGhpcyBjYXNlLCBhcHBsaWNhdGlvbiBjYWxscworICogI3BqbWVkaWFfc2RwX25lZ19zZW5kX2xvY2FsX29mZmVyKCkgdG8gZ2V0IHRoZSBhY3RpdmUgbG9jYWwgU0RQLgorICogCisgKiBJZiBhcHBsaWNhdGlvbiB3YW50cyB0byBtb2RpZnkgaXQncyBsb2NhbCBvZmZlciwgaXQgTVVTVCBpbmZvcm0gCisgKiB0aGUgbmVnb3RpYXRvciBhYm91dCB0aGUgbW9kaWZpZWQgU0RQIGJ5IGNhbGxpbmcgCisgKiAjcGptZWRpYV9zZHBfbmVnX21vZGlmeV9sb2NhbF9vZmZlcigpLgorICoKKyAqIEluIGJvdGggY2FzZXMsIHRoZSBuZWdvdGlhdG9yIHdpbGwgaW50ZXJuYWxseSBjcmVhdGUgYSBjb3B5IG9mIHRoZSBvZmZlciwKKyAqIGFuZCBtb3ZlIGl0J3Mgc3RhdGUgdG8gUEpNRURJQV9TRFBfTkVHX1NUQVRFX0xPQ0FMX09GRkVSLCB3aGVyZSBpdAorICogd2FpdHMgdW50aWwgYXBwbGljYXRpb24gcGFzc2VzIHRoZSByZW1vdGUgYW5zd2VyLgorICoKKyAqCisgKiBcc3Vic2VjdGlvbiBzZHBuZWdfcmVjZWl2ZV9vZmZlciBSZWNlaXZpbmcgSW5pdGlhbCBPZmZlcgorICoKKyAqIEFwcGxpY2F0aW9uIHJlY2VpdmVzIGFuIG9mZmVyIGluIHRoZSBpbmNvbWluZyByZXF1ZXN0IGZyb20gcmVtb3RlIHRvCisgKiBlc3RhYmxpc2ggbXVsdGltZWRpYSBzZXNzaW9uLCBzdWNoIGFzIGluY29taW5nIElOVklURSBtZXNzYWdlIHdpdGggU0RQCisgKiBib2R5LiAKKyAqCisgKiBJbml0aWFsbHksIHdoZW4gdGhlIGluaXRpYWwgb2ZmZXIgaXMgcmVjZWl2ZWQsIGFwcGxpY2F0aW9uIGNyZWF0ZXMgdGhlIAorICogU0RQIG5lZ290aWF0b3IgYnkgY2FsbGluZyAjcGptZWRpYV9zZHBfbmVnX2NyZWF0ZV93X3JlbW90ZV9vZmZlcigpLAorICogc3BlY2lmeWluZyB0aGUgcmVtb3RlIFNEUCBvZmZlciBpbiBvbmUgb2YgdGhlIGFyZ3VtZW50LiAKKyAqCisgKiBBdCB0aGlzIHN0YWdlLCBhcHBsaWNhdGlvbiBtYXkgb3IgbWF5IG5vdCByZWFkeSB0byBjcmVhdGUgYW4gYW5zd2VyLgorICogRm9yIGV4YW1wbGUsIGEgU0lQIEIyQlVBIG5lZWRzIHRvIG1ha2Ugb3V0Z29pbmcgY2FsbCBhbmQgcmVjZWl2ZSBTRFAKKyAqIGZyb20gdGhlIG91dGdvaW5nIGNhbGwgbGVnIGluIG9yZGVyIHRvIGNyZWF0ZSBhIFNEUCBhbnN3ZXIgdG8gdGhlCisgKiBpbmNvbWluZyBjYWxsIGxlZy4KKyAqCisgKiBJZiBhcHBsaWNhdGlvbiBpcyBub3QgcmVhZHkgdG8gY3JlYXRlIGFuIGFuc3dlciwgaXQgcGFzc2VzIE5VTEwgYXMKKyAqIHRoZSBsb2NhbCBTRFAgd2hlbiBpdCBjYWxscyAjcGptZWRpYV9zZHBfbmVnX2NyZWF0ZV93X3JlbW90ZV9vZmZlcigpLgorICoKKyAqIFRoZSBzZWN0aW9uIEByZWYgc2RwbmVnX2NyZWF0ZV9hbnN3ZXIgZGVzY3JpYmVzIHRoZSBjYXNlIHdoZW4gCisgKiBhcHBsaWNhdGlvbiBpcyByZWFkeSB0byBjcmVhdGUgYSBTRFAgYW5zd2VyLgorICoKKyAqCisgKiBcc3Vic2VjdGlvbiBzZHBuZWdfc3Vic2VxX29mZmVyIFJlY2VpdmluZyBTdWJzZXF1ZW50IE9mZmVyCisgKgorICogQXBwbGljYXRpb24gcGFzc2VzIHN1YnNlcXVlbnQgU0RQIG9mZmVyIHJlY2VpdmVkIGZyb20gcmVtb3RlIGJ5CisgKiBjYWxsaW5nICNwam1lZGlhX3NkcF9uZWdfc2V0X3JlbW90ZV9vZmZlcigpLgorICoKKyAqIFRoZSBuZWdvdGlhdG9yIGNhbiBvbmx5IHJlY2VpdmUgc3Vic2VxdWVudCBvZmZlciBhZnRlciBpdCBoYXMgZmluaXNoZWQKKyAqIHRoZSBuZWdvdGlhdGlvbiBwcm9jZXNzIG9mIHByZXZpb3VzIG9mZmVyL2Fuc3dlciBzZXNzaW9uIChpLmUuIHRoZQorICogbmVnb3RpYXRvciBzdGF0ZSBpcyBQSk1FRElBX1NEUF9ORUdfU1RBVEVfRE9ORSkuCisgKgorICoKKyAqIFxzdWJzZWN0aW9uIHNkcG5lZ19yZWN2X2Fuc3dlciBSZWNlaXZpbmcgU0RQIEFuc3dlcgorICoKKyAqIFdoZW4gYXBwbGljYXRpb24gcmVjZWl2ZXMgU0RQIGFuc3dlciBmcm9tIHJlbW90ZSwgaXQgaW5mb3JtcyB0aGUKKyAqIG5lZ290aWF0b3IgYnkgY2FsbGluZyAjcGptZWRpYV9zZHBfbmVnX3NldF9yZW1vdGVfYW5zd2VyKCkuIFRoZQorICogbmVnb3RpYXRvciB2YWxpZGF0ZXMgdGhlIGFuc3dlciAoI3BqbWVkaWFfc2RwX3ZhbGlkYXRlKCkpLCBhbmQgaWYKKyAqIHN1Y2NlZWRzLCBpdCBtb3ZlcyBpdCdzIHN0YXRlIHRvIFBKTUVESUFfU0RQX05FR19TVEFURV9XQUlUX05FR08uCisgKgorICogQXBwbGljYXRpb24gdGhlbiBpbnN0cnVjdCB0aGUgbmVnb3RpYXRvciB0byBuZWdvdGlhdGUgdGhlIHJlbW90ZQorICogYW5zd2VyIGJ5IGNhbGxpbmcgI3BqbWVkaWFfc2RwX25lZ19uZWdvdGlhdGUoKS4gVGhlIHB1cnBvc2Ugb2YKKyAqIHRoaXMgbmVnb3RpYXRpb24gaXMgdG8gdmVyaWZ5IHJlbW90ZSBhbnN3ZXIsIGFuZCB1cGRhdGUgdGhlIGluaXRpYWwKKyAqIG9mZmVyIGFjY29yZGluZyB0byB0aGUgYW5zd2VyLiBGb3IgZXhhbXBsZSwgdGhlIGluaXRpYWwgb2ZmZXIgbWF5CisgKiBzcGVjaWZ5IHRoYXQgYSBzdHJlYW0gaXMgXGEgc2VuZHJlY3YsIHdoaWxlIHRoZSBhbnN3ZXIgc3BlY2lmaWVzCisgKiB0aGF0IHJlbW90ZSBzdHJlYW0gaXMgXGEgaW5hY3RpdmUuIEluIHRoaXMgY2FzZSwgdGhlIG5lZ290aWF0b3IKKyAqIHdpbGwgdXBkYXRlIHRoZSBzdHJlYW0gaW4gdGhlIGxvY2FsIGFjdGl2ZSBtZWRpYSBhcyBcYSBpbmFjdGl2ZQorICogdG9vLgorICoKKyAqIElmICNwam1lZGlhX3NkcF9uZWdfbmVnb3RpYXRlKCkgcmV0dXJucyBQSl9TVUNDRVNTLCB0aGUgbmVnb3RpYXRvciB3aWxsCisgKiBrZWVwIHRoZSB1cGRhdGVkIGxvY2FsIGFuc3dlciBhbmQgcmVtb3RlIGFuc3dlciBpbnRlcm5hbGx5LiBUaGVzZSB0d28gCisgKiBTRFBzIGFyZSBjYWxsZWQgYWN0aXZlIGxvY2FsIFNEUCBhbmQgYWN0aXZlIHJlbW90ZSBTRFAsIGFzIGl0IGRlc2NyaWJlcyAKKyAqIGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbi4KKyAqCisgKiBBcHBsaWNhdGlvbiBjYW4gcmV0cmlldmUgdGhlIGFjdGl2ZSBsb2NhbCBTRFAgYnkgY2FsbGluZworICogI3BqbWVkaWFfc2RwX25lZ19nZXRfYWN0aXZlX2xvY2FsKCksIGFuZCBhY3RpdmUgcmVtb3RlIFNEUCBieSBjYWxsaW5nCisgKiAjcGptZWRpYV9zZHBfbmVnX2dldF9hY3RpdmVfcmVtb3RlKCkuCisgKgorICogSWYgI3BqbWVkaWFfc2RwX25lZ19uZWdvdGlhdGUoKSByZXR1cm5zIGZhaWx1cmUgKGkuZS4gbm90IFBKX1NVQ0NFU1MpLAorICogaXQgV0lMTCBOT1QgdXBkYXRlIGl0cyBhY3RpdmUgbG9jYWwgYW5kIGFjdGl2ZSByZW1vdGUgU0RQLgorICoKKyAqIFJlZ2FyZGxlc3Mgb2YgdGhlIHJldHVybiBzdGF0dXMgb2YgdGhlICNwam1lZGlhX3NkcF9uZWdfbmVnb3RpYXRlKCksIAorICogdGhlIG5lZ290aWF0b3Igc3RhdGUgd2lsbCBtb3ZlIHRvIFBKTUVESUFfU0RQX05FR19TVEFURV9ET05FLgorICogCisgKgorICogXHN1YnNlY3Rpb24gc2RwbmVnX2NhbmNlbF9vZmZlciBDYW5jZWxsaW5nIGFuIE9mZmVyCisgKgorICogSW4gb3RoZXIgY2FzZSwgYWZ0ZXIgYW4gb2ZmZXIgaXMgZ2VuZXJhdGVkIChuZWdvdGlhdG9yIHN0YXRlIGlzIGluCisgKiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfTE9DQUxfT0ZGRVIpLCB0aGUgYW5zd2VyIG1heSBub3QgYmUgcmVjZWl2ZWQsIGFuZAorICogYXBwbGljYXRpb24gd2FudHMgdGhlIG5lZ290aWF0b3IgdG8gcmVzZXQgaXRzZWxmIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS4KKyAqIENvbnNpZGVyIHRoaXMgZXhhbXBsZToKKyAqCisgKiAgLSBtZWRpYSBoYXMgYmVlbiBlc3RhYmxpc2hlZCwgYW5kIG5lZ290aWF0b3Igc3RhdGUgaXMKKyAqICAgIFBKTUVESUFfU0RQX05FR19TVEFURV9ET05FLgorICogIC0gYXBwbGljYXRpb24gZ2VuZXJhdGVzIGEgbmV3IG9mZmVyIGZvciByZS1JTlZJVEUsIHNvIGluIHRoaXMgY2FzZQorICogICAgaXQgd291bGQgZWl0aGVyIGNhbGwgI3BqbWVkaWFfc2RwX25lZ19zZW5kX2xvY2FsX29mZmVyKCkgb3IKKyAqICAgICNwam1lZGlhX3NkcF9uZWdfbW9kaWZ5X2xvY2FsX29mZmVyKCkKKyAqICAtIHRoZSBuZWdvdGlhdG9yIHN0YXRlIG1vdmVzIHRvIFBKTUVESUFfU0RQX05FR19TVEFURV9MT0NBTF9PRkZFUgorICogIC0gdGhlIHJlLUlOVklURSB3YXMgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvcgorICoKKyAqIFNpbmNlIGFuIGFuc3dlciBpcyBub3QgcmVjZWl2ZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byByZXNldCB0aGUgbmVnb3RpYXRvcgorICogc3RhdGUgYmFjayB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfRE9ORSBzbyB0aGF0IHRoZSBuZWdvdGlhdG9yIGNhbgorICogY3JlYXRlIG9yIHJlY2VpdmUgbmV3IG9mZmVyLgorICoKKyAqIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSBjYWxsaW5nICNwam1lZGlhX3NkcF9uZWdfY2FuY2VsX29mZmVyKCksCisgKiB0byByZXNldCB0aGUgbmVnb3RpYXRvciBzdGF0ZSBiYWNrIHRvIFBKTUVESUFfU0RQX05FR19TVEFURV9ET05FLiBJbgorICogdGhpcyBjYXNlLCBib3RoIGFjdGl2ZSBsb2NhbCBhbmQgYWN0aXZlIHJlbW90ZSB3aWxsIG5vdCBiZSBtb2RpZmllZC4KKyAqCisgKiBcc3Vic2VjdGlvbiBzZHBuZWdfY3JlYXRlX2Fuc3dlciBHZW5lcmF0aW5nIFNEUCBBbnN3ZXIKKyAqCisgKiBBZnRlciByZW1vdGUgb2ZmZXIgaGFzIGJlZW4gc2V0IGluIHRoZSBuZWdvdGlhdG9yLCBhcHBsaWNhdGlvbiBjYW4gCisgKiByZXF1ZXN0IHRoZSBTRFAgbmVnb3RpYXRvciB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBhbnN3ZXIgYmFzZWQgb24gbG9jYWwgCisgKiBjYXBhYmlsaXR5LgorICoKKyAqIFRvIGRvIHRoaXMsIGZpcnN0IHRoZSBhcHBsaWNhdGlvbiBNVVNUIGhhdmUgYW4gU0RQIGRlc2NyaWJpbmcgaXRzIGxvY2FsCisgKiBjYXBhYmlsaXRpZXMuIFRoaXMgU0RQIGNhbiBiZSBidWlsdCBtYW51YWxseSwgb3IgYXBwbGljYXRpb24gY2FuIGdlbmVyYXRlCisgKiBTRFAgdG8gZGVzY3JpYmUgbG9jYWwgbWVkaWEgZW5kcG9pbnQgY2FwYWJpbGl0eSBieSBjYWxsaW5nIAorICogI3BqbWVkaWFfZW5kcHRfY3JlYXRlX3NkcCgpLiBXaGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhIFNJUCBCMkJVQSwgCisgKiBhcHBsaWNhdGlvbiBjYW4gdHJlYXQgdGhlIFNEUCByZWNlaXZlZCBmcm9tIHRoZSBvdXRnb2luZyBjYWxsIGxlZyBhcyBpZgorICogaXQgd2FzIGl0J3MgbG9jYWwgY2FwYWJpbGl0eS4KKyAqIAorICogVGhlIGxvY2FsIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IgRE9FUyBOT1QgaGF2ZSB0byBtYXRjaCB0aGUgU0RQIG9mZmVyLgorICogRm9yIGV4YW1wbGUsIGl0IGNhbiBoYXZlIG1vcmUgb3IgbGVzcyBtZWRpYSBsaW5lcyB0aGFuIHRoZSBvZmZlciwgb3IKKyAqIHRoZWlyIG9yZGVyIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgb2ZmZXIuIFRoZSBuZWdvdGlhdG9yIGlzIGNhcGFibGUKKyAqIHRvIG1hdGNoIGFuZCByZW9yZGVyIGxvY2FsIFNEUCBhY2NvcmRpbmcgdG8gcmVtb3RlIG9mZmVyLCBhbmQgY3JlYXRlCisgKiBhbiBhbnN3ZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgdGhlIG9mZmVyLgorICoKKyAqIEFmdGVyIGxvY2FsIFNEUCBjYXBhYmlsaXR5IGhhcyBiZWVuIGFjcXVpcmVkLCBhcHBsaWNhdGlvbiBjYW4gY3JlYXRlCisgKiBhIFNEUCBhbnN3ZXIuCisgKgorICogSWYgYXBwbGljYXRpb24gZG9lcyBub3QgYWxyZWFkeSBoYXZlIHRoZSBuZWdvdGlhdG9yIGluc3RhbmNlLCBpdCBjcmVhdGVzCisgKiBvbmUgYnkgY2FsbGluZyAjcGptZWRpYV9zZHBfbmVnX2NyZWF0ZV93X3JlbW90ZV9vZmZlcigpLCBzcGVjaWZ5aW5nIAorICogYm90aCByZW1vdGUgU0RQIG9mZmVyIGFuZCBsb2NhbCBTRFAgYXMgdGhlIGFyZ3VtZW50cy4gVGhlIFNEUCBuZWdvdGlhdG9yCisgKiB2YWxpZGF0ZXMgYm90aCByZW1vdGUgYW5kIGxvY2FsIFNEUCBieSBjYWxsaW5nICNwam1lZGlhX3NkcF92YWxpZGF0ZSgpLAorICogYW5kIGlmIGJvdGggU0RQcyBhcmUgdmFsaWQsIHRoZSBuZWdvdGlhdG9yIHN0YXRlIHdpbGwgbW92ZSB0bworICogUEpNRURJQV9TRFBfTkVHX1NUQVRFX1dBSVRfTkVHTyB3aGVyZSBpdCBpcyByZWFkeSB0byBuZWdvdGlhdGUgdGhlCisgKiBvZmZlciBhbmQgYW5zd2VyLgorICoKKyAqIElmIGFwcGxpY2F0aW9uIGFscmVhZHkgaGFzIHRoZSBuZWdvdGlhdG9yIGluc3RhbmNlLCBpdCBzZXRzIHRoZSBsb2NhbAorICogU0RQIGluIHRoZSBuZWdvdGlhdG9yIGJ5IGNhbGxpbmcgI3BqbWVkaWFfc2RwX25lZ19zZXRfbG9jYWxfYW5zd2VyKCkuCisgKiBUaGUgU0RQIG5lZ290aWF0b3IgdGhlbiB2YWxpZGF0ZXMgbG9jYWwgU0RQICgjcGptZWRpYV9zZHBfdmFsaWRhdGUoKSApLAorICogYW5kIGlmIGl0IGlzICB2YWxpZCwgdGhlIG5lZ290aWF0b3Igc3RhdGUgd2lsbCBtb3ZlIHRvCisgKiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfV0FJVF9ORUdPIHdoZXJlIGl0IGlzIHJlYWR5IHRvIG5lZ290aWF0ZSB0aGUKKyAqIG9mZmVyIGFuZCBhbnN3ZXIuCisgKgorICogQWZ0ZXIgdGhlIFNEUCBuZWdvdGlhdG9yIHN0YXRlIGhhcyBtb3ZlZCB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfV0FJVF9ORUdPLAorICogYXBwbGljYXRpb24gY2FsbHMgI3BqbWVkaWFfc2RwX25lZ19uZWdvdGlhdGUoKSB0byBpbnN0cnVjdCB0aGUgU0RQCisgKiBuZWdvdGlhdG9yIHRvIG5lZ290aWF0ZSBib3RoIG9mZmVyIGFuZCBhbnN3ZXIuIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICogUEpfU1VDQ0VTUyBpZiBhbiBhbnN3ZXIgY2FuIGJlIGdlbmVyYXRlZCBBTkQgYXQgbGVhc3Qgb25lIG1lZGlhIHN0cmVhbQorICogaXMgYWN0aXZlIGluIHRoZSBzZXNzaW9uLgorICoKKyAqIElmICNwam1lZGlhX3NkcF9uZWdfbmVnb3RpYXRlKCkgcmV0dXJucyBQSl9TVUNDRVNTLCB0aGUgbmVnb3RpYXRvciB3aWxsCisgKiBrZWVwIHRoZSByZW1vdGUgb2ZmZXIgYW5kIGxvY2FsIGFuc3dlciBpbnRlcm5hbGx5LiBUaGVzZSB0d28gU0RQcyBhcmUKKyAqIGNhbGxlZCBhY3RpdmUgbG9jYWwgU0RQIGFuZCBhY3RpdmUgcmVtb3RlIFNEUCwgYXMgaXQgZGVzY3JpYmVzIGN1cnJlbnRseQorICogYWN0aXZlIHNlc3Npb24uCisgKgorICogQXBwbGljYXRpb24gY2FuIHJldHJpZXZlIHRoZSBhY3RpdmUgbG9jYWwgU0RQIGJ5IGNhbGxpbmcKKyAqICNwam1lZGlhX3NkcF9uZWdfZ2V0X2FjdGl2ZV9sb2NhbCgpLCBhbmQgc2VuZCB0aGlzIFNEUCB0byByZW1vdGUgYXMgdGhlCisgKiBTRFAgYW5zd2VyLgorICoKKyAqIElmICNwam1lZGlhX3NkcF9uZWdfbmVnb3RpYXRlKCkgcmV0dXJucyBmYWlsdXJlIChpLmUuIG5vdCBQSl9TVUNDRVNTKSwKKyAqIGl0IFdJTEwgTk9UIHVwZGF0ZSBpdHMgYWN0aXZlIGxvY2FsIGFuZCBhY3RpdmUgcmVtb3RlIFNEUC4KKyAqCisgKiBSZWdhcmRsZXNzIG9mIHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSAjcGptZWRpYV9zZHBfbmVnX25lZ290aWF0ZSgpLCAKKyAqIHRoZSBuZWdvdGlhdG9yIHN0YXRlIHdpbGwgbW92ZSB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfRE9ORS4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3NkcC5oPgorCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogVGhpcyBlbnVtZXJhdGlvbiBkZXNjcmliZXMgU0RQIG5lZ290aWF0aW9uIHN0YXRlLiAKKyAqLworZW51bSBwam1lZGlhX3NkcF9uZWdfc3RhdGUKK3sKKyAgICAvKiogCisgICAgICogVGhpcyBpcyB0aGUgc3RhdGUgb2YgU0RQIG5lZ29hdG9yIGJlZm9yZSBpdCBpcyBpbml0aWFsaXplZC4gCisgICAgICovCisgICAgUEpNRURJQV9TRFBfTkVHX1NUQVRFX05VTEwsCisKKyAgICAvKiogCisgICAgICogVGhpcyBzdGF0ZSBvY2N1cnMgd2hlbiBTRFAgbmVnb3RpYXRvciBoYXMgc2VudCBvdXIgb2ZmZXIgdG8gcmVtb3RlIGFuZAorICAgICAqIGl0IGlzIHdhaXRpbmcgZm9yIGFuc3dlci4gCisgICAgICovCisgICAgUEpNRURJQV9TRFBfTkVHX1NUQVRFX0xPQ0FMX09GRkVSLAorCisgICAgLyoqIAorICAgICAqIFRoaXMgc3RhdGUgb2NjdXJzIHdoZW4gU0RQIG5lZ290aWF0b3IgaGFzIHJlY2VpdmVkIG9mZmVyIGZyb20gcmVtb3RlCisgICAgICogYW5kIGN1cnJlbnRseSB3YWl0aW5nIGZvciBsb2NhbCBhbnN3ZXIuCisgICAgICovCisgICAgUEpNRURJQV9TRFBfTkVHX1NUQVRFX1JFTU9URV9PRkZFUiwKKworICAgIC8qKgorICAgICAqIFRoaXMgc3RhdGUgb2NjdXJzIHdoZW4gYW4gb2ZmZXIgKGVpdGhlciBsb2NhbCBvciByZW1vdGUpIGhhcyBiZWVuIAorICAgICAqIHByb3ZpZGVkIHdpdGggYW5zd2VyLiBUaGUgU0RQIG5lZ290aWF0b3IgaXMgcmVhZHkgdG8gbmVnb3RpYXRlIGJvdGgKKyAgICAgKiBzZXNzaW9uIGRlc2NyaXB0b3JzLiBBcHBsaWNhdGlvbiBjYW4gY2FsbCAjcGptZWRpYV9zZHBfbmVnX25lZ290aWF0ZSgpCisgICAgICogaW1tZWRpYXRlbHkgdG8gYmVnaW4gbmVnb3RpYXRpb24gcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBQSk1FRElBX1NEUF9ORUdfU1RBVEVfV0FJVF9ORUdPLAorCisgICAgLyoqCisgICAgICogVGhpcyBzdGF0ZSBvY2N1cnMgd2hlbiBTRFAgbmVnb3RpYXRpb24gaGFzIGNvbXBsZXRlZCwgZWl0aGVyIAorICAgICAqIHN1Y2Nlc3NmdWxseSBvciBub3QuCisgICAgICovCisgICAgUEpNRURJQV9TRFBfTkVHX1NUQVRFX0RPTkUKK307CisKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfc2RwX25lZ19zdGF0ZQorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV9zZHBfbmVnX3N0YXRlIHBqbWVkaWFfc2RwX25lZ19zdGF0ZTsKKworCisvKioKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBvZiBTRFAgbmVnb3RpYXRvci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zZHBfbmVnIHBqbWVkaWFfc2RwX25lZzsKKworCisvKioKKyAqIEZsYWdzIHRvIGJlIGdpdmVuIHRvIHBqbWVkaWFfc2RwX25lZ19tb2RpZnlfbG9jYWxfb2ZmZXIyKCkuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX21vZF9vZmZlcl9mbGFnCit7CisgICAvKioKKyAgICAqIEFsbG93IG1lZGlhIHR5cGUgaW4gdGhlIFNEUCB0byBiZSBjaGFuZ2VkLgorICAgICogV2hlbiBnZW5lcmF0aW5nIGEgbmV3IG9mZmVyLCBpbiB0aGUgY2FzZSB0aGF0IGEgbWVkaWEgbGluZSBkb2Vzbid0IG1hdGNoCisgICAgKiB0aGUgYWN0aXZlIFNEUCwgdGhlIG5ldyBtZWRpYSBsaW5lIHdpbGwgYmUgY29uc2lkZXJlZCB0byByZXBsYWNlIHRoZQorICAgICogZXhpc3RpbmcgbWVkaWEgYXQgdGhlIHNhbWUgcG9zaXRpb24uCisgICAgKi8KKyAgIFBKTUVESUFfU0RQX05FR19BTExPV19NRURJQV9DSEFOR0UgPSAxCisKK30gcGptZWRpYV9tb2Rfb2ZmZXJfZmxhZzsKKworCisvKioKKyAqIEdldCB0aGUgc3RhdGUgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSBzcGVjaWZpZWQgc3RhdGUuCisgKgorICogQHBhcmFtIHN0YXRlCQlOZWdvdGlhdG9yIHN0YXRlLgorICoKKyAqIEByZXR1cm4JCVN0cmluZyBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhdGUuCisgKi8KK1BKX0RFQ0woY29uc3QgY2hhciopIHBqbWVkaWFfc2RwX25lZ19zdGF0ZV9zdHIocGptZWRpYV9zZHBfbmVnX3N0YXRlIHN0YXRlKTsKKworCisvKioKKyAqIENyZWF0ZSB0aGUgU0RQIG5lZ290aWF0b3Igd2l0aCBsb2NhbCBvZmZlci4gVGhlIFNEUCBuZWdvdGlhdG9yIHRoZW4KKyAqIHdpbGwgbW92ZSB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfTE9DQUxfT0ZGRVIgc3RhdGUsIHdoZXJlIGl0IHdhaXRzCisgKiB1bnRpbCBpdCByZWNlaXZlcyBhbnN3ZXIgZnJvbSByZW1vdGUuIFdoZW4gU0RQIGFuc3dlciBmcm9tIHJlbW90ZSBpcworICogcmVjZWl2ZWQsIGFwcGxpY2F0aW9uIG11c3QgY2FsbCAjcGptZWRpYV9zZHBfbmVnX3NldF9yZW1vdGVfYW5zd2VyKCkuCisgKgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBhcHBsaWNhdGlvbiBzaG91bGQgc2VuZCB0aGUgbG9jYWwgU0RQIG9mZmVyCisgKiB0byByZW1vdGUgcGFydHkgdXNpbmcgc2lnbmFsaW5nIHByb3RvY29sIHN1Y2ggYXMgU0lQIGFuZCB3YWl0IGZvciBTRFAgCisgKiBhbnN3ZXIuCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LiBUaGUgcG9vbCdzIGxpZmV0aW1lIG5lZWRzCisgKgkJCXRvIGJlIHZhbGlkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG5lZ290aWF0b3IuCisgKiBAcGFyYW0gbG9jYWwJCVRoZSBpbml0aWFsIGxvY2FsIGNhcGFiaWxpdHkuCisgKiBAcGFyYW0gcF9uZWcJCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQljb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfc2RwX25lZ19jcmVhdGVfd19sb2NhbF9vZmZlciggcGpfcG9vbF90ICpwb29sLAorCQkJCSAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKmxvY2FsLAorCQkJCSAgICAgIHBqbWVkaWFfc2RwX25lZyAqKnBfbmVnKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSBTRFAgbmVnb3RpYXRvciB3aXRoIHJlbW90ZSBvZmZlciwgYW5kIG9wdGlvbmFsbHkKKyAqIHNwZWNpZnkgdGhlIGluaXRpYWwgbG9jYWwgY2FwYWJpbGl0eSwgaWYga25vd24uIEFwcGxpY2F0aW9uIG5vcm1hbGx5IAorICogY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0IHJlY2VpdmVzIGluaXRpYWwgb2ZmZXIgZnJvbSByZW1vdGUuIAorICoKKyAqIElmIGxvY2FsIG1lZGlhIGNhcGFiaWxpdHkgaXMgc3BlY2lmaWVkLCB0aGlzIGNhcGFiaWxpdHkgd2lsbCBiZSBzZXQgYXMKKyAqIGluaXRpYWwgbG9jYWwgY2FwYWJpbGl0eSBvZiB0aGUgbmVnb3RpYXRvciwgYW5kIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMKKyAqIGNhbGxlZCwgdGhlIFNEUCBuZWdvdGlhdG9yIHN0YXRlIHdpbGwgbW92ZSB0byBzdGF0ZQorICogUEpNRURJQV9TRFBfTkVHX1NUQVRFX1dBSVRfTkVHTywgYW5kIHRoZSBuZWdvdGlhdGlvbiBmdW5jdGlvbiBjYW4gYmUgCisgKiBjYWxsZWQuIAorICoKKyAqIElmIGxvY2FsIFNEUCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmVnb3RpYXRvciB3aWxsIG5vdCBoYXZlIGluaXRpYWwgbG9jYWwKKyAqIGNhcGFiaWxpdHksIGFuZCBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGUgbmVnb3RpYXRvciBzdGF0ZSB3aWxsIAorICogbW92ZSB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfUkVNT1RFX09GRkVSIHN0YXRlLiBBcHBsaWNhdGlvbiBNVVNUIHN1cHBseQorICogbG9jYWwgYW5zd2VyIGxhdGVyIHdpdGggI3BqbWVkaWFfc2RwX25lZ19zZXRfbG9jYWxfYW5zd2VyKCksIGJlZm9yZQorICogY2FsbGluZyB0aGUgbmVnb3RpYXRpb24gZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LiBUaGUgcG9vbCdzIGxpZmV0aW1lIG5lZWRzCisgKgkJCXRvIGJlIHZhbGlkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG5lZ290aWF0b3IuCisgKiBAcGFyYW0gaW5pdGlhbAlPcHRpb25hbCBpbml0aWFsIGxvY2FsIGNhcGFiaWxpdHkuCisgKiBAcGFyYW0gcmVtb3RlCVRoZSByZW1vdGUgb2ZmZXIuCisgKiBAcGFyYW0gcF9uZWcJCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQljb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfc2RwX25lZ19jcmVhdGVfd19yZW1vdGVfb2ZmZXIocGpfcG9vbF90ICpwb29sLAorCQkJCSAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKmluaXRpYWwsCisJCQkJICAgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqcmVtb3RlLAorCQkJCSAgICAgIHBqbWVkaWFfc2RwX25lZyAqKnBfbmVnKTsKKworLyoqCisgKiBUaGlzIHNwZWNpZmllcyB0aGUgYmVoYXZpb3Igb2YgdGhlIFNEUCBuZWdvdGlhdG9yIHdoZW4gcmVzcG9uZGluZyB0byBhbgorICogb2ZmZXIsIHdoZXRoZXIgaXQgc2hvdWxkIHJhdGhlciB1c2UgdGhlIGNvZGVjIHByZWZlcmVuY2UgYXMgc2V0IGJ5CisgKiByZW1vdGUsIG9yIHNob3VsZCBpdCByYXRoZXIgdXNlIHRoZSBjb2RlYyBwcmVmZXJlbmNlIGFzIHNwZWNpZmllZCBieQorICogbG9jYWwgZW5kcG9pbnQuCisgKgorICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgaW5jb21pbmcgY2FsbCBoYXMgY29kZWMgb3JkZXIgIjggMCAzIiwgd2hpbGUgCisgKiBsb2NhbCBjb2RlYyBvcmRlciBpcyAiMyAwIDgiLiBJZiByZW1vdGUgY29kZWMgb3JkZXIgaXMgcHJlZmVyYWJsZSwKKyAqIHRoZSBzZWxlY3RlZCBjb2RlYyB3aWxsIGJlIDgsIHdoaWxlIGlmIGxvY2FsIGNvZGVjIG9yZGVyIGlzIHByZWZlcmFibGUsCisgKiB0aGUgc2VsZWN0ZWQgY29kZWMgd2lsbCBiZSAzLgorICoKKyAqIEJ5IGRlZmF1bHQsIHRoZSB2YWx1ZSBpbiBQSk1FRElBX1NEUF9ORUdfUFJFRkVSX1JFTU9URV9DT0RFQ19PUkRFUiB3aWxsCisgKiBiZSB1c2VkLgorICoKKyAqIEBwYXJhbSBuZWcJCVRoZSBTRFAgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqIEBwYXJhbSBwcmVmZXJfcmVtb3RlCUlmIG5vbi16ZXJvLCB0aGUgbmVnb3RpYXRvciB3aWxsIHVzZSB0aGUgY29kZWMKKyAqCQkJb3JkZXIgYXMgc3BlY2lmaWVkIGluIHJlbW90ZSBvZmZlci4gSWYgemVybywgaXQKKyAqCQkJd2lsbCBwcmVmZXIgdG8gdXNlIHRoZSBsb2NhbCBjb2RlYyBvcmRlci4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfc2RwX25lZ19zZXRfcHJlZmVyX3JlbW90ZV9jb2RlY19vcmRlcihwam1lZGlhX3NkcF9uZWcgKm5lZywKKwkJCQkJICAgICAgcGpfYm9vbF90IHByZWZlcl9yZW1vdGUpOworCisvKioKKyAqIFRoaXMgc3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgU0RQIG5lZ290aWF0b3Igd2hlbiByZXNwb25kaW5nIHRvIGFuCisgKiBvZmZlciwgd2hldGhlciBpdCBzaG91bGQgYW5zd2VyIHdpdGggbXVsdGlwbGUgZm9ybWF0cyBvciBub3QuCisgKgorICogQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGluIFBKTUVESUFfU0RQX05FR19BTlNXRVJfTVVMVElQTEVfQ09ERUNTIHdpbGwKKyAqIGJlIHVzZWQuCisgKgorICogQHBhcmFtIG5lZyAgICAgICAgICAgVGhlIFNEUCBuZWdvdGlhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIGFuc3dlcl9tdWx0aXBsZQorICogICAgICAgICAgICAgICAgICAgICAgSWYgbm9uLXplcm8sIHRoZSBuZWdvdGlhdG9yIHdpbGwgcmVzcG9uZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBmb3JtYXRzLiBJZiB6ZXJvIG9ubHkgYSBzaW5nbGUgZm9ybWF0CisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJldHVybmVkLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9zZHBfbmVnX3NldF9hbnN3ZXJfbXVsdGlwbGVfY29kZWNzKHBqbWVkaWFfc2RwX25lZyAqbmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2Jvb2xfdCBhbnN3ZXJfbXVsdGlwbGUpOworCisKKy8qKgorICogR2V0IFNEUCBuZWdvdGlhdG9yIHN0YXRlLgorICoKKyAqIEBwYXJhbSBuZWcJCVRoZSBTRFAgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlUaGUgbmVnb3RpYXRvciBzdGF0ZS4KKyAqLworUEpfREVDTChwam1lZGlhX3NkcF9uZWdfc3RhdGUpCitwam1lZGlhX3NkcF9uZWdfZ2V0X3N0YXRlKCBwam1lZGlhX3NkcF9uZWcgKm5lZyApOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBsb2NhbCBTRFAuIEFwcGxpY2F0aW9uIGNhbiBvbmx5IGNhbGwgdGhpcworICogZnVuY3Rpb24gYWZ0ZXIgbmVnb3RpYXRpb24gaGFzIGJlZW4gZG9uZSwgb3Igb3RoZXJ3aXNlIHRoZXJlIHdvbid0IGJlCisgKiBhY3RpdmUgU0RQcy4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIAorICogbmVnb3RpYXRvci4KKyAqCisgKiBAcGFyYW0gbmVnCQlUaGUgU0RQIG5lZ290aWF0b3IgaW5zdGFuY2UuCisgKiBAcGFyYW0gbG9jYWwJCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgbG9jYWwgYWN0aXZlIFNEUC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIGxvY2FsIGFjdGl2ZSBTRFAgaXMgcHJlc2VudC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3NkcF9uZWdfZ2V0X2FjdGl2ZV9sb2NhbCggcGptZWRpYV9zZHBfbmVnICpuZWcsCisJCQkJICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICoqbG9jYWwpOworCisvKioKKyAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSByZW1vdGUgU0RQLiBBcHBsaWNhdGlvbiBjYW4gb25seSBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIGFmdGVyIG5lZ290aWF0aW9uIGhhcyBiZWVuIGRvbmUsIG9yIG90aGVyd2lzZSB0aGVyZSB3b24ndCBiZQorICogYWN0aXZlIFNEUHMuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSAKKyAqIG5lZ290aWF0b3IuCisgKgorICogQHBhcmFtIG5lZwkJVGhlIFNEUCBuZWdvdGlhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIHJlbW90ZQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHJlbW90ZSBhY3RpdmUgU0RQLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgcmVtb3RlIGFjdGl2ZSBTRFAgaXMgcHJlc2VudC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3NkcF9uZWdfZ2V0X2FjdGl2ZV9yZW1vdGUoIHBqbWVkaWFfc2RwX25lZyAqbmVnLAorCQkJCSAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKipyZW1vdGUpOworCisKKy8qKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgcmVtb3RlIHNlbnQgYW5zd2VyIChhcyBvcHBvc2VkIHRvIG9mZmVyKSBvbiB0aGUKKyAqIGxhc3QgbmVnb3RpYXRpb24uIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGluIHN0YXRlCisgKiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfRE9ORS4KKyAqCisgKiBAcGFyYW0gbmVnCQlUaGUgU0RQIG5lZ290aWF0b3IgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJTm9uLXplcm8gaWYgaXQgd2FzIHJlbW90ZSB3aG8gc2VudCBhbnN3ZXIsCisgKgkJCW90aGVyd2lzZSB6ZXJvIGlmIGl0IHdhcyBsb2NhbCB3aG8gc3VwcGxpZWQKKyAqCQkJYW5zd2VyLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkKK3BqbWVkaWFfc2RwX25lZ193YXNfYW5zd2VyX3JlbW90ZShwam1lZGlhX3NkcF9uZWcgKm5lZyk7CisKKworLyoqCisgKiBHZXQgdGhlIGN1cnJlbnQgcmVtb3RlIFNEUCBvZmZlciBvciBhbnN3ZXIuIEFwcGxpY2F0aW9uIGNhbiBvbmx5IAorICogY2FsbCB0aGlzIGZ1bmN0aW9uIGluIHN0YXRlIFBKTUVESUFfU0RQX05FR19TVEFURV9SRU1PVEVfT0ZGRVIgb3IKKyAqIFBKTUVESUFfU0RQX05FR19TVEFURV9XQUlUX05FR08sIG9yIG90aGVyd2lzZSB0aGVyZSB3b24ndCBiZSByZW1vdGUgCisgKiBTRFAgb2ZmZXIvYW5zd2VyLiBDYWxsaW5nIHRoaXMgIGZ1bmN0aW9uIHdpbGwgbm90IGNoYW5nZSB0aGUgc3RhdGUgCisgKiBvZiB0aGUgbmVnb3RpYXRvci4KKyAqCisgKiBAcGFyYW0gbmVnCQlUaGUgU0RQIG5lZ290aWF0b3IgaW5zdGFuY2UuCisgKiBAcGFyYW0gcmVtb3RlCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgY3VycmVudCByZW1vdGUgb2ZmZXIgb3IKKyAqCQkJYW5zd2VyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgdGhlIG5lZ290aWF0b3IgY3VycmVudGx5IGhhcworICoJCQlyZW1vdGUgb2ZmZXIgb3IgYW5zd2VyLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9zZHBfbmVnX2dldF9uZWdfcmVtb3RlKCBwam1lZGlhX3NkcF9uZWcgKm5lZywKKwkJCQljb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICoqcmVtb3RlKTsKKworCisvKioKKyAqIEdldCB0aGUgY3VycmVudCBsb2NhbCBTRFAgb2ZmZXIgb3IgYW5zd2VyLiBBcHBsaWNhdGlvbiBjYW4gb25seSAKKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBzdGF0ZSBQSk1FRElBX1NEUF9ORUdfU1RBVEVfTE9DQUxfT0ZGRVIgb3IKKyAqIFBKTUVESUFfU0RQX05FR19TVEFURV9XQUlUX05FR08sIG9yIG90aGVyd2lzZSB0aGVyZSB3b24ndCBiZSBsb2NhbCAKKyAqIFNEUCBvZmZlci9hbnN3ZXIuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIAorICogb2YgdGhlIG5lZ290aWF0b3IuCisgKgorICogQHBhcmFtIG5lZwkJVGhlIFNEUCBuZWdvdGlhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIGxvY2FsCQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQgbG9jYWwgb2ZmZXIgb3IKKyAqCQkJYW5zd2VyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgdGhlIG5lZ290aWF0b3IgY3VycmVudGx5IGhhcworICoJCQlsb2NhbCBvZmZlciBvciBhbnN3ZXIuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9zZHBfbmVnX2dldF9uZWdfbG9jYWwoIHBqbWVkaWFfc2RwX25lZyAqbmVnLAorCQkJICAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKipsb2NhbCk7CisKKy8qKgorICogTW9kaWZ5IGxvY2FsIHNlc3Npb24gd2l0aCBhIG5ldyBTRFAgYW5kIHRyZWF0IHRoaXMgYXMgYSBuZXcgb2ZmZXIuIAorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaW4gc3RhdGUgUEpNRURJQV9TRFBfTkVHX1NUQVRFX0RPTkUuCisgKiBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGFwcGxpY2F0aW9uIGNhbiBzZW5kIHRoZSBTRFAgYXMgb2ZmZXIgCisgKiB0byByZW1vdGUgcGFydHksIHVzaW5nIHNpZ25hbGluZyBwcm90b2NvbCBzdWNoIGFzIFNJUC4KKyAqIFRoZSBuZWdvdGlhdG9yIHN0YXRlIHdpbGwgbW92ZSB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfTE9DQUxfT0ZGRVIsCisgKiB3aGVyZSBpdCB3YWl0cyBmb3IgU0RQIGFuc3dlciBmcm9tIHJlbW90ZS4gU2VlIGFsc28KKyAqICNwam1lZGlhX3NkcF9uZWdfbW9kaWZ5X2xvY2FsX29mZmVyMigpCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LiBUaGUgcG9vbCdzIGxpZmV0aW1lIG5lZWRzCisgKgkJCXRvIGJlIHZhbGlkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG5lZ290aWF0b3IuCisgKiBAcGFyYW0gbmVnCQlUaGUgU0RQIG5lZ290aWF0b3IgaW5zdGFuY2UuCisgKiBAcGFyYW0gbG9jYWwJCVRoZSBuZXcgbG9jYWwgU0RQLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlCisgKgkJCWVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9zZHBfbmVnX21vZGlmeV9sb2NhbF9vZmZlciggcGpfcG9vbF90ICpwb29sLAorCQkJCSAgICBwam1lZGlhX3NkcF9uZWcgKm5lZywKKwkJCQkgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqbG9jYWwpOworCisvKioKKyAqIE1vZGlmeSBsb2NhbCBzZXNzaW9uIHdpdGggYSBuZXcgU0RQIGFuZCB0cmVhdCB0aGlzIGFzIGEgbmV3IG9mZmVyLiAKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGluIHN0YXRlIFBKTUVESUFfU0RQX05FR19TVEFURV9ET05FLgorICogQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBhcHBsaWNhdGlvbiBjYW4gc2VuZCB0aGUgU0RQIGFzIG9mZmVyIAorICogdG8gcmVtb3RlIHBhcnR5LCB1c2luZyBzaWduYWxpbmcgcHJvdG9jb2wgc3VjaCBhcyBTSVAuCisgKiBUaGUgbmVnb3RpYXRvciBzdGF0ZSB3aWxsIG1vdmUgdG8gUEpNRURJQV9TRFBfTkVHX1NUQVRFX0xPQ0FMX09GRkVSLAorICogd2hlcmUgaXQgd2FpdHMgZm9yIFNEUCBhbnN3ZXIgZnJvbSByZW1vdGUuCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LiBUaGUgcG9vbCdzIGxpZmV0aW1lIG5lZWRzCisgKgkJCXRvIGJlIHZhbGlkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG5lZ290aWF0b3IuCisgKiBAcGFyYW0gbmVnCQlUaGUgU0RQIG5lZ290aWF0b3IgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmxhZ3MgICAgICAgICBCaXRtYXNrIGZyb20gcGptZWRpYV9tb2Rfb2ZmZXJfZmxhZy4KKyAqIEBwYXJhbSBsb2NhbAkJVGhlIG5ldyBsb2NhbCBTRFAuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3NkcF9uZWdfbW9kaWZ5X2xvY2FsX29mZmVyMiggcGpfcG9vbF90ICpwb29sLAorCQkJCSAgICAgcGptZWRpYV9zZHBfbmVnICpuZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MsCisJCQkJICAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpsb2NhbCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaW4gUEpNRURJQV9TRFBfTkVHX1NUQVRFX0RPTkUgc3RhdGUuCisgKiBBcHBsaWNhdGlvbiBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGN1cnJlbnRseSBhY3RpdmUKKyAqIGxvY2FsIFNEUCwgYW5kIHRoZW4gc2VuZCB0aGUgU0RQIHRvIHJlbW90ZSBhcyBhbiBvZmZlci4gVGhlIG5lZ290aWF0b3IKKyAqIHN0YXRlIHdpbGwgdGhlbiBtb3ZlIHRvIFBKTUVESUFfU0RQX05FR19TVEFURV9MT0NBTF9PRkZFUiwgd2hlcmUgaXQgd2FpdHMKKyAqIGZvciBTRFAgYW5zd2VyIGZyb20gcmVtb3RlLiAKKyAqCisgKiBXaGVuIFNEUCBhbnN3ZXIgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSByZW1vdGUsIGFwcGxpY2F0aW9uIG11c3QgY2FsbCAKKyAqICNwam1lZGlhX3NkcF9uZWdfc2V0X3JlbW90ZV9hbnN3ZXIoKS4KKyAqCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBwb29sJ3MgbGlmZXRpbWUgbmVlZHMKKyAqCQkJdG8gYmUgdmFsaWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbmVnb3RpYXRvci4KKyAqIEBwYXJhbSBuZWcJCVRoZSBTRFAgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqIEBwYXJhbSBvZmZlcgkJUG9pbnRlciB0byByZWNlaXZlIGFjdGl2ZSBsb2NhbCBTRFAgdG8gYmUKKyAqCQkJb2ZmZXJlZCB0byByZW1vdGUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiBsb2NhbCBvZmZlciBjYW4gYmUgY3JlYXRlZC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3NkcF9uZWdfc2VuZF9sb2NhbF9vZmZlciggcGpfcG9vbF90ICpwb29sLAorCQkJICAgICAgICAgIHBqbWVkaWFfc2RwX25lZyAqbmVnLAorCQkJCSAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqKm9mZmVyKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfTE9DQUxfT0ZGRVIKKyAqIHN0YXRlLCBpLmUuIGFmdGVyIGFwcGxpY2F0aW9uIGNhbGxzICNwam1lZGlhX3NkcF9uZWdfc2VuZF9sb2NhbF9vZmZlcigpCisgKiBmdW5jdGlvbi4gQXBwbGljYXRpb24gY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0IHJlY2VpdmVzIFNEUCBhbnN3ZXIKKyAqIGZyb20gcmVtb3RlLiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG5lZ290aWF0b3Igc3RhdGUgd2lsbAorICogbW92ZSB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfV0FJVF9ORUdPLCBhbmQgYXBwbGljYXRpb24gY2FuIGNhbGwgdGhlCisgKiBuZWdvdGlhdGlvbiBmdW5jdGlvbiAjcGptZWRpYV9zZHBfbmVnX25lZ290aWF0ZSgpLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4gVGhlIHBvb2wncyBsaWZldGltZSBuZWVkcworICoJCQl0byBiZSB2YWxpZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBuZWdvdGlhdG9yLgorICogQHBhcmFtIG5lZwkJVGhlIFNEUCBuZWdvdGlhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIHJlbW90ZQlUaGUgcmVtb3RlIGFuc3dlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9zZHBfbmVnX3NldF9yZW1vdGVfYW5zd2VyKCBwal9wb29sX3QgKnBvb2wsCisJCQkJICAgcGptZWRpYV9zZHBfbmVnICpuZWcsCisJCQkJICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqcmVtb3RlKTsKKworCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaW4gUEpNRURJQV9TRFBfTkVHX1NUQVRFX0RPTkUgc3RhdGUuIAorICogQXBwbGljYXRpb24gY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0IHJlY2VpdmVzIFNEUCBvZmZlciBmcm9tIHJlbW90ZS4KKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgbmVnb3RpYXRvciBzdGF0ZSB3aWxsIG1vdmUgdG8gCisgKiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfUkVNT1RFX09GRkVSLCBhbmQgYXBwbGljYXRpb24gTVVTVCBjYWxsIHRoZQorICogI3BqbWVkaWFfc2RwX25lZ19zZXRfbG9jYWxfYW5zd2VyKCkgdG8gc2V0IGxvY2FsIGFuc3dlciBiZWZvcmUgaXQgY2FuCisgKiBjYWxsIHRoZSBuZWdvdGlhdGlvbiBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBwb29sJ3MgbGlmZXRpbWUgbmVlZHMKKyAqCQkJdG8gYmUgdmFsaWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbmVnb3RpYXRvci4KKyAqIEBwYXJhbSBuZWcJCVRoZSBTRFAgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqIEBwYXJhbSByZW1vdGUJVGhlIHJlbW90ZSBvZmZlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV9zZHBfbmVnX3NldF9yZW1vdGVfb2ZmZXIoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgIHBqbWVkaWFfc2RwX25lZyAqbmVnLAorCQkJCSAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqcmVtb3RlKTsKKworCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaW4gUEpNRURJQV9TRFBfTkVHX1NUQVRFX1JFTU9URV9PRkZFUgorICogc3RhdGUsIGkuZS4gYWZ0ZXIgYXBwbGljYXRpb24gY2FsbHMgI3BqbWVkaWFfc2RwX25lZ19zZXRfcmVtb3RlX29mZmVyKCkKKyAqIGZ1bmN0aW9uLiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG5lZ290aWF0b3Igc3RhdGUgd2lsbAorICogbW92ZSB0byBQSk1FRElBX1NEUF9ORUdfU1RBVEVfV0FJVF9ORUdPLCBhbmQgYXBwbGljYXRpb24gY2FuIGNhbGwgdGhlCisgKiBuZWdvdGlhdGlvbiBmdW5jdGlvbiAjcGptZWRpYV9zZHBfbmVnX25lZ290aWF0ZSgpLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4gVGhlIHBvb2wncyBsaWZldGltZSBuZWVkcworICoJCQl0byBiZSB2YWxpZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBuZWdvdGlhdG9yLgorICogQHBhcmFtIG5lZwkJVGhlIFNEUCBuZWdvdGlhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIGxvY2FsCQlPcHRpb25hbCBsb2NhbCBhbnN3ZXIuIElmIG5lZ290aWF0b3IgaGFzIGluaXRpYWwKKyAqCQkJbG9jYWwgY2FwYWJpbGl0eSwgYXBwbGljYXRpb24gY2FuIHNwZWNpZnkgTlVMTCBvbgorICoJCQl0aGlzIGFyZ3VtZW50OyBpbiB0aGlzIGNhc2UsIHRoZSBuZWdvdGlhdG9yIHdpbGwKKyAqCQkJY3JlYXRlIGFuc3dlciBieSBieSBuZWdvdGlhdGluZyByZW1vdGUgb2ZmZXIgd2l0aAorICoJCQlpbml0aWFsIGxvY2FsIGNhcGFiaWxpdHkuIElmIG5lZ290aWF0b3IgZG9lc24ndCBoYXZlCisgKgkJCWluaXRpYWwgbG9jYWwgY2FwYWJpbGl0eSwgYXBwbGljYXRpb24gTVVTVCBzcGVjaWZ5CisgKgkJCWxvY2FsIGFuc3dlciBoZXJlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3NkcF9uZWdfc2V0X2xvY2FsX2Fuc3dlciggcGpfcG9vbF90ICpwb29sLAorCQkJCSAgcGptZWRpYV9zZHBfbmVnICpuZWcsCisJCQkJICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpsb2NhbCk7CisKKworLyoqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgbmVnb3RpYXRvciBpcyBpbiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfV0FJVF9ORUdPCisgKiBzdGF0ZSB0byBzZWUgaWYgaXQgd2FzIGxvY2FsIHdobyBpcyBhbnN3ZXJpbmcgdGhlIG9mZmVyIChpbnN0ZWFkIG9mCisgKiByZW1vdGUpLgorICoKKyAqIEBwYXJhbSBuZWcJCVRoZSBuZWdvdGlhdG9yLgorICoKKyAqIEByZXR1cm4JCVBKX1RSVUUgaWYgaXQgaXMgbG9jYWwgaXMgYW5zd2VyaW5nIGFuIG9mZmVyLCBQSl9GQUxTRQorICoJCQlpZiByZW1vdGUgaGFzIGFuc3dlcmVkIGxvY2FsIG9mZmVyLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV9zZHBfbmVnX2hhc19sb2NhbF9hbnN3ZXIocGptZWRpYV9zZHBfbmVnICpuZWcpOworCisKKy8qKgorICogQ2FuY2VsIGFueSBwZW5kaW5nIG9mZmVyLCB3aGV0aGVyIHRoZSBvZmZlciBpcyBpbml0aWF0ZWQgYnkgbG9jYWwgb3IKKyAqIHJlbW90ZSwgYW5kIG1vdmUgbmVnb3RpYXRvciBzdGF0ZSBiYWNrIHRvIHByZXZpb3VzIHN0YWJsZSBzdGF0ZQorICogKFBKTUVESUFfU0RQX05FR19TVEFURV9ET05FKS4gVGhlIG5lZ290aWF0b3IgbXVzdCBiZSBpbgorICogUEpNRURJQV9TRFBfTkVHX1NUQVRFX0xPQ0FMX09GRkVSIG9yIFBKTUVESUFfU0RQX05FR19TVEFURV9SRU1PVEVfT0ZGRVIKKyAqIHN0YXRlLgorICoKKyAqIEBwYXJhbSBuZWcJCVRoZSBuZWdvdGlhdG9yLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2RwX25lZ19jYW5jZWxfb2ZmZXIocGptZWRpYV9zZHBfbmVnICpuZWcpOworCisKKy8qKgorICogTmVnb3RpYXRlIGxvY2FsIGFuZCByZW1vdGUgYW5zd2VyLiBCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUKKyAqIFNEUCBuZWdvdGlhdG9yIG11c3QgYmUgaW4gUEpNRURJQV9TRFBfTkVHX1NUQVRFX1dBSVRfTkVHTyBzdGF0ZS4KKyAqIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIG5lZ290aWF0b3Igc3RhdGUgd2lsbCBtb3ZlIHRvCisgKiBQSk1FRElBX1NEUF9ORUdfU1RBVEVfRE9ORSByZWdhcmRsZXNzIHdoZXRoZXIgdGhlIG5lZ290aWF0aW9uIGhhcworICogYmVlbiBzdWNjZXNzZnVsbCBvciBub3QuCisgKgorICogSWYgdGhlIG5lZ290aWF0aW9uIHN1Y2NlZWRzIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgaXMgUEpfU1VDQ0VTUyksCisgKiB0aGUgYWN0aXZlIGxvY2FsIGFuZCByZW1vdGUgU0RQIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IFNEUAorICogZnJvbSB0aGUgbmVnb3RpYXRpb24gcHJvY2Vzcy4KKyAqCisgKiBJZiB0aGUgbmVnb3RpYXRpb24gZmFpbHMsIHRoZSBhY3RpdmUgbG9jYWwgYW5kIHJlbW90ZSBTRFAgd2lsbCBub3QKKyAqIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBwb29sJ3MgbGlmZXRpbWUgbmVlZHMKKyAqCQkJdG8gYmUgdmFsaWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgbmVnb3RpYXRvci4KKyAqIEBwYXJhbSBuZWcJCVRoZSBTRFAgbmVnb3RpYXRvciBpbnN0YW5jZS4KKyAqIEBwYXJhbSBhbGxvd19hc3ltCVNob3VsZCBiZSB6ZXJvLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgd2hlbiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbWVkaWEKKyAqCQkJaXMgYWN0dXZlIGNvbW1vbiBpbiBib3RoIG9mZmVyIGFuZCBhbnN3ZXIsIG9yIAorICoJCQlmYWlsdXJlIGNvZGUgd2hlbiBuZWdvdGlhdGlvbiBoYXMgZmFpbGVkLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NkcF9uZWdfbmVnb3RpYXRlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICAgcGptZWRpYV9zZHBfbmVnICpuZWcsCisJCQkJCQlwal9ib29sX3QgYWxsb3dfYXN5bSk7CisKKworLyoqCisgKiBFbnVtZXJhdGlvbiBvZiBjdXN0b21pemVkIFNEUCBmb3JtYXQgbWF0Y2hpbmcgb3B0aW9uIGZsYWdzLiBTZWUKKyAqICNwam1lZGlhX3NkcF9uZWdfcmVnaXN0ZXJfZm10X21hdGNoX2NiKCkgZm9yIG1vcmUgaW5mby4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfc2RwX25lZ19mbXRfbWF0Y2hfZmxhZworeworICAgIC8qKgorICAgICAqIEluIGdlbmVyYXRpbmcgYW5zd2VyLCB0aGUgU0RQIGZtdHAgaW4gdGhlIGFuc3dlciBjYW5kaWRhdGUgbWF5IG5lZWQKKyAgICAgKiB0byBiZSBtb2RpZmllZCBieSB0aGUgY3VzdG9taXplZCBTRFAgZm9ybWF0IG1hdGNoaW5nIGNhbGxiYWNrIHRvCisgICAgICogYWNoaWV2ZSBmbGV4aWJsZSBTRFAgbmVnb3RpYXRpb24sIGUuZzogQU1SIGZtdHAgJ29jdGV0LWFsaWduJyBmaWVsZAorICAgICAqIGNhbiBiZSBhZGp1c3RlZCB3aXRoIHRoZSBvZmZlciB3aGVuIHRoZSBjb2RlYyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0CisgICAgICogYm90aCBwYWNrZXRpemF0aW9uIG1vZGVzIG9jdGV0LWFsaWduZWQgYW5kIGJhbmR3aWR0aC1lZmZpY2llbnQuCisgICAgICovCisgICAgUEpNRURJQV9TRFBfTkVHX0ZNVF9NQVRDSF9BTExPV19NT0RJRllfQU5TV0VSID0gMSwKKworfSBwam1lZGlhX3NkcF9uZWdfZm10X21hdGNoX2ZsYWc7CisKKworLyoqCisgKiBUaGUgZGVjbGFyYXRpb24gb2YgY3VzdG9taXplZCBTRFAgZm9ybWF0IG1hdGNoaW5nIGNhbGxiYWNrLiBTZWUKKyAqICNwam1lZGlhX3NkcF9uZWdfcmVnaXN0ZXJfZm10X21hdGNoX2NiKCkgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBAcGFyYW0gcG9vbAkJVGhlIG1lbW9yeSBwb29sLgorICogQHBhcmFtIG9mZmVyCQlUaGUgU0RQIG1lZGlhIG9mZmVyLgorICogQHBhcmFtIG9fZm10X2lkeAlJbmRleCBvZiB0aGUgZm9ybWF0IGluIHRoZSBTRFAgbWVkaWEgb2ZmZXIuCisgKiBAcGFyYW0gYW5zd2VyCVRoZSBTRFAgbWVkaWEgYW5zd2VyLgorICogQHBhcmFtIGFfZm10X2lkeAlJbmRleCBvZiB0aGUgZm9ybWF0IGluIHRoZSBTRFAgbWVkaWEgYW5zd2VyLgorICogQHBhcmFtIG9wdGlvbglUaGUgZm9ybWF0IG1hdGNoaW5nIG9wdGlvbiwgc2VlCisgKgkJCSNwam1lZGlhX3NkcF9uZWdfZm10X21hdGNoX2ZsYWcuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyB3aGVuIHRoZSBmb3JtYXRzIGluIG9mZmVyIGFuZCBhbnN3ZXIgbWF0Y2guCisgKi8KK3R5cGVkZWYgcGpfc3RhdHVzX3QgKCpwam1lZGlhX3NkcF9uZWdfZm10X21hdGNoX2NiKShwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgICAgcGptZWRpYV9zZHBfbWVkaWEgKm9mZmVyLAorCQkJCQkJICAgIHVuc2lnbmVkIG9fZm10X2lkeCwKKwkJCQkJCSAgICBwam1lZGlhX3NkcF9tZWRpYSAqYW5zd2VyLAorCQkJCQkJICAgIHVuc2lnbmVkIGFfZm10X2lkeCwKKwkJCQkJCSAgICB1bnNpZ25lZCBvcHRpb24pOworCisKKy8qKgorICogUmVnaXN0ZXIgY3VzdG9taXplZCBTRFAgZm9ybWF0IG1hdGNoaW5nIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkCisgKiBmb3JtYXQuIFRoZSBjdXN0b21pemVkIFNEUCBmb3JtYXQgbWF0Y2hpbmcgaXMgbmVlZGVkIHdoZW4gdGhlIGZvcm1hdAorICogaWRlbnRpZmljYXRpb24gaW4gYSBtZWRpYSBzdHJlYW0gc2Vzc2lvbiBjYW5ub3QgYmUgc2ltcGx5IGRldGVybWluZWQgYnkKKyAqIGVuY29kaW5nIG5hbWUgYW5kIGNsb2NrIHJhdGUsIGJ1dCBhbHNvIGludm9sdmVzIG9uZSBvciBtb3JlIGZvcm1hdCBzcGVjaWZpYworICogcGFyYW1ldGVycywgd2hpY2ggYXJlIHNwZWNpZmllZCBpbiBTRFAgZm10cCBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLAorICogYW4gSC4yNjQgdmlkZW8gc3RyZWFtIGlzIGFsc28gaWRlbnRpZmllZCBieSBwcm9maWxlLCBsZXZlbCwgYW5kCisgKiBwYWNrZXRpemF0aW9uLW1vZGUgcGFyYW1ldGVycy4gQXMgdGhvc2UgcGFyYW1ldGVycyBhcmUgZm9ybWF0IHNwZWNpZmljcywKKyAqIHRoZSBuZWdvdGlhdGlvbiBtdXN0IGJlIGRvbmUgYnkgdGhlIGZvcm1hdCBvciBjb2RlYyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUbyB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBvZiBzcGVjaWZpYyBmb3JtYXQsIGp1c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGgKKyAqIHBhcmFtZXRlciAjY2Igc2V0IHRvIE5VTEwuCisgKgorICogQHBhcmFtIGZtdF9uYW1lCVRoZSBmb3JtYXQgbmFtZSwgZS5nOiAiSC4yNjQiLCAiQU1SIiwgIkc3MjIxIi4gTm90ZQorICoJCQl0aGF0IHRoZSBzdHJpbmcgYnVmZmVyIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIHRoZQorICoJCQljYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQuCisgKiBAcGFyYW0gY2IJCVRoZSBjdXN0b21pemVkIFNEUCBmb3JtYXQgbmVnb3RpYXRpb24gY2FsbGJhY2sgb3IKKyAqCQkJTlVMTCB0byB1bnJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGNhbGxiYWNrLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfbmVnX3JlZ2lzdGVyX2ZtdF9tYXRjaF9jYigKKwkJCQkJY29uc3QgcGpfc3RyX3QgKmZtdF9uYW1lLAorCQkJCQlwam1lZGlhX3NkcF9uZWdfZm10X21hdGNoX2NiIGNiKTsKKworCisvKioKKyAqIE1hdGNoIGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIG9mZmVyIGFuZCBhbnN3ZXIuIFRoZSBtYXRjaGluZyBtZWNoYW5pc20KKyAqIHdpbGwgYmUgZG9uZSBieSBjb21wYXJpbmcgdGhlIGVuY29kaW5nIG5hbWUgYW5kIGNsb2NrIHJhdGUsIGFuZCBpZiB0aGUKKyAqIGN1c3RvbSBmb3JtYXQgbWF0Y2hpbmcgY2FsbGJhY2sgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGlzIHJlZ2lzdGVyZWQsCisgKiBzZWUgI3BqbWVkaWFfc2RwX25lZ19yZWdpc3Rlcl9mbXRfbWF0Y2hfY2IoKSwgaXQgd2lsbCBiZSBjYWxsZWQgZm9yIG1vcmUKKyAqIGRldGFpbCB2ZXJpZmljYXRpb24sIGUuZzogZm9ybWF0IHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIFNEUCBmbXRwLgorICoKKyAqIEBwYXJhbSBwb29sCQlUaGUgbWVtb3J5IHBvb2wuCisgKiBAcGFyYW0gb2ZmZXIJCVRoZSBTRFAgbWVkaWEgb2ZmZXIuCisgKiBAcGFyYW0gb19mbXRfaWR4CUluZGV4IG9mIHRoZSBmb3JtYXQgaW4gdGhlIFNEUCBtZWRpYSBvZmZlci4KKyAqIEBwYXJhbSBhbnN3ZXIJVGhlIFNEUCBtZWRpYSBhbnN3ZXIuCisgKiBAcGFyYW0gYV9mbXRfaWR4CUluZGV4IG9mIHRoZSBmb3JtYXQgaW4gdGhlIFNEUCBtZWRpYSBhbnN3ZXIuCisgKiBAcGFyYW0gb3B0aW9uCVRoZSBmb3JtYXQgbWF0Y2hpbmcgb3B0aW9uLCBzZWUKKyAqCQkJI3BqbWVkaWFfc2RwX25lZ19mbXRfbWF0Y2hfZmxhZy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIHdoZW4gdGhlIGZvcm1hdHMgaW4gb2ZmZXIgYW5kIGFuc3dlciBtYXRjaC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZHBfbmVnX2ZtdF9tYXRjaCggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICAgIHBqbWVkaWFfc2RwX21lZGlhICpvZmZlciwKKwkJCQkJICAgICAgICB1bnNpZ25lZCBvX2ZtdF9pZHgsCisJCQkJCSAgICAgICAgcGptZWRpYV9zZHBfbWVkaWEgKmFuc3dlciwKKwkJCQkJICAgICAgICB1bnNpZ25lZCBhX2ZtdF9pZHgsCisJCQkJCSAgICAgICAgdW5zaWduZWQgb3B0aW9uKTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYJLyogX19QSk1FRElBX1NEUF9ORUdfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3Nlc3Npb24uaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTE1NjAwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2Vzc2lvbi5oCkBAIC0wLDAgKzEsNDM2IEBACisvKiAkSWQ6IHNlc3Npb24uaCAzODQxIDIwMTEtMTAtMjQgMDk6Mjg6MTNaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1NFU1NJT05fSF9fCisjZGVmaW5lIF9fUEpNRURJQV9TRVNTSU9OX0hfXworCisKKy8qKgorICogQGZpbGUgc2Vzc2lvbi5oCisgKiBAYnJpZWYgTWVkaWEgU2Vzc2lvbi4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS9lbmRwb2ludC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc3RyZWFtLmg+CisjaW5jbHVkZSA8cGptZWRpYS9zZHAuaD4KKworUEpfQkVHSU5fREVDTCAKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9TRVNTSU9OIE1lZGlhIFNlc3Npb25zCisgKiBAYnJpZWYgTWFuYWdlbWVudCBvZiBtZWRpYSBzZXNzaW9ucworICogQHsKKyAqCisgKiBBIG1lZGlhIHNlc3Npb24gcmVwcmVzZW50cyBtdWx0aW1lZGlhIGNvbW11bmljYXRpb24gYmV0d2VlbiB0d28KKyAqIHBhcnRpZXMuIEEgbWVkaWEgc2Vzc2lvbiByZXByZXNlbnRzIHRoZSBtdWx0aW1lZGlhIHNlc3Npb24gdGhhdAorICogaXMgZGVzY3JpYmVkIGJ5IFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IuIEEgbWVkaWEgc2Vzc2lvbiBjb25zaXN0cyAKKyAqIG9mIG9uZSBvciBtb3JlIG1lZGlhIHN0cmVhbXMgKHBqbWVkaWFfc3RyZWFtKSwgd2hlcmUgZWFjaCBzdHJlYW0gCisgKiByZXByZXNlbnRzIG9uZSBtZWRpYSBsaW5lIChtPSBsaW5lKSBpbiBTRFAuCisgKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIG11bHRpbWVkaWEKKyAqIHNlc3Npb25zLgorICoKKyAqIEFwcGxpY2F0aW9uIGNyZWF0ZXMgdGhlIG1lZGlhIHNlc3Npb24gYnkgY2FsbGluZyAjcGptZWRpYV9zZXNzaW9uX2NyZWF0ZSgpLAorICogbm9ybWFsbHkgYWZ0ZXIgaXQgaGFzIGNvbXBsZXRlZCBuZWdvdGlhdGluZyBib3RoIFNEUCBvZmZlciBhbmQgYW5zd2VyLgorICogVGhlIHNlc3Npb24gY3JlYXRpb24gZnVuY3Rpb24gY3JlYXRlcyB0aGUgbWVkaWEgc2Vzc2lvbiAoaW5jbHVkaW5nCisgKiBtZWRpYSBzdHJlYW1zKSBiYXNlZCBvbiB0aGUgY29udGVudCBvZiBsb2NhbCBhbmQgcmVtb3RlIFNEUC4KKyAqLworCisKKy8qKgorICogU2Vzc2lvbiBpbmZvLCByZXRyaWV2ZWQgZnJvbSBhIHNlc3Npb24gYnkgY2FsbGluZworICogI3BqbWVkaWFfc2Vzc2lvbl9nZXRfaW5mbygpLgorICovCitzdHJ1Y3QgcGptZWRpYV9zZXNzaW9uX2luZm8KK3sKKyAgICAvKiogTnVtYmVyIG9mIHN0cmVhbXMuICovCisgICAgdW5zaWduZWQJCXN0cmVhbV9jbnQ7CisKKyAgICAvKiogSW5kaXZpZHVhbCBzdHJlYW0gaW5mby4gKi8KKyAgICBwam1lZGlhX3N0cmVhbV9pbmZvCXN0cmVhbV9pbmZvW1BKTUVESUFfTUFYX1NEUF9NRURJQV07Cit9OworCisKKy8qKiAKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBvZiBtZWRpYSBzZXNzaW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zZXNzaW9uIHBqbWVkaWFfc2Vzc2lvbjsKKworCisvKioKKyAqIEBzZWUgcGptZWRpYV9zZXNzaW9uX2luZm8uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc2Vzc2lvbl9pbmZvIHBqbWVkaWFfc2Vzc2lvbl9pbmZvOworCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIHNlc3Npb24gaW5mbyBiYXNlZCBvbiBpbmZvcm1hdGlvbgorICogaW4gYm90aCBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9ycy4gVGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiB3aWxsIGJlCisgKiB0YWtlbiBmcm9tIGRlZmF1bHQgY29kZWMgcGFyYW1ldGVycy4gSWYgc29ja2V0IGluZm8gYXJyYXkgaXMgc3BlY2lmaWVkLAorICogdGhlIHNvY2tldCB3aWxsIGJlIGNvcGllZCB0byB0aGUgc2Vzc2lvbiBpbmZvIGFzIHdlbGwuCisgKgorICogQHBhcmFtIHBvb2wJCVBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5LgorICogQHBhcmFtIGVuZHB0CQlQam1lZGlhIGVuZHBvaW50LgorICogQHBhcmFtIG1heF9zdHJlYW1zCU1heGltdW0gbnVtYmVyIG9mIHN0cmVhbSBpbmZvcyB0byBiZSBjcmVhdGVkLgorICogQHBhcmFtIHNpCQlTZXNzaW9uIGluZm8gc3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkLgorICogQHBhcmFtIGxvY2FsCQlMb2NhbCBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICogQHBhcmFtIHJlbW90ZQlSZW1vdGUgU0RQIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHN0cmVhbSBpbmZvIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfc2Vzc2lvbl9pbmZvX2Zyb21fc2RwKCBwal9wb29sX3QgKnBvb2wsCisJCQkgICAgICAgcGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkgICAgICAgdW5zaWduZWQgbWF4X3N0cmVhbXMsCisJCQkgICAgICAgcGptZWRpYV9zZXNzaW9uX2luZm8gKnNpLAorCQkJICAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKmxvY2FsLAorCQkJICAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnJlbW90ZSk7CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgc3RyZWFtIGluZm8gYmFzZWQgb24gaW5mb3JtYXRpb24KKyAqIGluIGJvdGggU0RQIHNlc3Npb24gZGVzY3JpcHRvcnMgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGluZGV4LiAKKyAqIFRoZSByZW1haW5pbmcgaW5mb3JtYXRpb24gd2lsbCBiZSB0YWtlbiBmcm9tIGRlZmF1bHQgY29kZWMgcGFyYW1ldGVycy4gCisgKiBJZiBzb2NrZXQgaW5mbyBhcnJheSBpcyBzcGVjaWZpZWQsIHRoZSBzb2NrZXQgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIAorICogc2Vzc2lvbiBpbmZvIGFzIHdlbGwuCisgKgorICogQHBhcmFtIHNpCQlTdHJlYW0gaW5mbyBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkuCisgKiBAcGFyYW0gZW5kcHQJCVBKTUVESUEgZW5kcG9pbnQgaW5zdGFuY2UuCisgKiBAcGFyYW0gbG9jYWwJCUxvY2FsIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gcmVtb3RlCVJlbW90ZSBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICogQHBhcmFtIHN0cmVhbV9pZHgJTWVkaWEgc3RyZWFtIGluZGV4IGluIHRoZSBzZXNzaW9uIGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiBzdHJlYW0gaW5mbyBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3N0cmVhbV9pbmZvX2Zyb21fc2RwKCBwam1lZGlhX3N0cmVhbV9pbmZvICpzaSwKKwkJCSAgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCSAgICAgIHBqbWVkaWFfZW5kcHQgKmVuZHB0LAorCQkJICAgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqbG9jYWwsCisJCQkgICAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpyZW1vdGUsCisJCQkgICAgICB1bnNpZ25lZCBzdHJlYW1faWR4KTsKKworLyoqCisgKiBDcmVhdGUgbWVkaWEgc2Vzc2lvbiBiYXNlZCBvbiB0aGUgbG9jYWwgYW5kIHJlbW90ZSBTRFAuIEFmdGVyIHRoZSBzZXNzaW9uCisgKiBoYXMgYmVlbiBjcmVhdGVkLCBhcHBsaWNhdGlvbiBub3JtYWxseSB3b3VsZCB3YW50IHRvIGdldCB0aGUgbWVkaWEgcG9ydCAKKyAqIGludGVyZmFjZSBvZiBlYWNoIHN0cmVhbXMsIGJ5IGNhbGxpbmcgI3BqbWVkaWFfc2Vzc2lvbl9nZXRfcG9ydCgpLiBUaGUgCisgKiBtZWRpYSBwb3J0IGludGVyZmFjZSBleHBvcnRzIHB1dF9mcmFtZSgpIGFuZCBnZXRfZnJhbWUoKSBmdW5jdGlvbiwgdXNlZAorICogdG8gdHJhbnNtaXQgYW5kIHJlY2VpdmUgbWVkaWEgZnJhbWVzIGZyb20gdGhlIHN0cmVhbS4KKyAqCisgKiBXaXRob3V0IGFwcGxpY2F0aW9uIGNhbGxpbmcgcHV0X2ZyYW1lKCkgYW5kIGdldF9mcmFtZSgpLCB0aGVyZSB3aWxsIGJlIAorICogbm8gbWVkaWEgZnJhbWVzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGJ5IHRoZSBzZXNzaW9uLgorICogCisgKiBAcGFyYW0gZW5kcHQJCVRoZSBQSk1FRElBIGVuZHBvaW50IGluc3RhbmNlLgorICogQHBhcmFtIHNpCQlTZXNzaW9uIGluZm8gY29udGFpbmluZyBzdHJlYW0gY291bnQgYW5kIGFycmF5IG9mCisgKgkJCXN0cmVhbSBpbmZvLiBUaGUgc3RyZWFtIGNvdW50IGluZGljYXRlcyBob3cgbWFueQorICoJCQlzdHJlYW1zIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIHNlc3Npb24uCisgKiBAcGFyYW0gdHJhbnNwb3J0cwlBcnJheSBvZiBtZWRpYSBzdHJlYW0gdHJhbnNwb3J0cywgd2l0aCAKKyAqCQkJc3VmZmljaWVudCBudW1iZXIgb2YgZWxlbWVudHMgKG9uZSBmb3IgZWFjaCBzdHJlYW0pLgorICogQHBhcmFtIHVzZXJfZGF0YQlBcmJpdHJhcnkgdXNlciBkYXRhIHRvIGJlIGtlcHQgaW4gdGhlIHNlc3Npb24uCisgKiBAcGFyYW0gcF9zZXNzaW9uCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIG1lZGlhIHNlc3Npb24gY2FuIGJlIGNyZWF0ZWQgCisgKgkJCXN1Y2Nlc3NmdWxseS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3Nlc3Npb25fY3JlYXRlKCBwam1lZGlhX2VuZHB0ICplbmRwdCwgCisJCQljb25zdCBwam1lZGlhX3Nlc3Npb25faW5mbyAqc2ksCisJCQlwam1lZGlhX3RyYW5zcG9ydCAqdHJhbnNwb3J0c1tdLAorCQkJdm9pZCAqdXNlcl9kYXRhLAorCQkJcGptZWRpYV9zZXNzaW9uICoqcF9zZXNzaW9uICk7CisKKworLyoqCisgKiBHZXQgbWVkaWEgc2Vzc2lvbiBpbmZvIG9mIHRoZSBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBzZXNzaW9uIHdoaWNoIGluZm8gaXMgYmVpbmcgcXVlcmllZC4KKyAqIEBwYXJhbSBpbmZvCQlQb2ludGVyIHRvIHJlY2VpdmUgc2Vzc2lvbiBpbmZvLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZXNzaW9uX2dldF9pbmZvKCBwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCSAgICAgICBwam1lZGlhX3Nlc3Npb25faW5mbyAqaW5mbyApOworCisvKioKKyAqIEdldCB1c2VyIGRhdGEgb2YgdGhlIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIHNlc3Npb24gYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuCQlVc2VyIGRhdGEgb2YgdGhlIHNlc3Npb24uCisgKi8KK1BKX0RFQ0wodm9pZCopIHBqbWVkaWFfc2Vzc2lvbl9nZXRfdXNlcl9kYXRhKCBwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24pOworCisKKy8qKgorICogQWN0aXZhdGUgYWxsIHN0cmVhbXMgaW4gbWVkaWEgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24uCisgKiBBcHBsaWNhdGlvbiBvbmx5IG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiBpdCBwcmV2aW91c2x5IHBhdXNlZAorICogdGhlIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKiBAcGFyYW0gZGlyCQlUaGUgZGlyZWN0aW9uIHRvIGFjdGl2YXRlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZXNzaW9uX3Jlc3VtZShwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCSAgICBwam1lZGlhX2RpciBkaXIpOworCisKKy8qKgorICogU3VzcGVuZCByZWNlaXB0IGFuZCB0cmFuc21pc3Npb24gb2YgYWxsIHN0cmVhbXMgaW4gbWVkaWEgc2Vzc2lvbgorICogZm9yIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBtZWRpYSBzZXNzaW9uLgorICogQHBhcmFtIGRpcgkJVGhlIG1lZGlhIGRpcmVjdGlvbiB0byBzdXNwZW5kLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZXNzaW9uX3BhdXNlKHBqbWVkaWFfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICAgcGptZWRpYV9kaXIgZGlyKTsKKworLyoqCisgKiBTdXNwZW5kIHJlY2VpcHQgYW5kIHRyYW5zbWlzc2lvbiBvZiBpbmRpdmlkdWFsIHN0cmVhbSBpbiBtZWRpYSBzZXNzaW9uCisgKiBmb3IgdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKiBAcGFyYW0gaW5kZXgJCVRoZSBzdHJlYW0gaW5kZXguCisgKiBAcGFyYW0gZGlyCQlUaGUgbWVkaWEgZGlyZWN0aW9uIHRvIHBhdXNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZXNzaW9uX3BhdXNlX3N0cmVhbSggcGptZWRpYV9zZXNzaW9uICpzZXNzaW9uLAorCQkJCQkJICAgdW5zaWduZWQgaW5kZXgsCisJCQkJCQkgICBwam1lZGlhX2RpciBkaXIpOworCisvKioKKyAqIEFjdGl2YXRlIGluZGl2aWR1YWwgc3RyZWFtIGluIG1lZGlhIHNlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBtZWRpYSBzZXNzaW9uLgorICogQHBhcmFtIGluZGV4CQlUaGUgc3RyZWFtIGluZGV4LgorICogQHBhcmFtIGRpcgkJVGhlIG1lZGlhIGRpcmVjdGlvbiB0byBhY3RpdmF0ZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9yZXN1bWVfc3RyZWFtKHBqbWVkaWFfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJCSAgIHVuc2lnbmVkIGluZGV4LAorCQkJCQkJICAgcGptZWRpYV9kaXIgZGlyKTsKKworLyoqCisgKiBTZW5kIFJUQ1AgU0RFUyBmb3IgdGhlIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfc2Vzc2lvbl9zZW5kX3J0Y3Bfc2RlcyggY29uc3QgcGptZWRpYV9zZXNzaW9uICpzZXNzaW9uICk7CisKKy8qKgorICogU2VuZCBSVENQIEJZRSBmb3IgdGhlIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfc2Vzc2lvbl9zZW5kX3J0Y3BfYnllKCBjb25zdCBwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24gKTsKKworLyoqCisgKiBFbnVtZXJhdGUgbWVkaWEgc3RyZWFtcyBpbiB0aGUgc2Vzc2lvbi4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbglUaGUgbWVkaWEgc2Vzc2lvbi4KKyAqIEBwYXJhbSBjb3VudAkJT24gaW5wdXQsIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluCisgKgkJCXRoZSBhcnJheS4gT24gb3V0cHV0LCB0aGUgbnVtYmVyIHdpbGwgYmUgZmlsbGVkCisgKgkJCXdpdGggbnVtYmVyIG9mIHN0cmVhbXMgaW4gdGhlIHNlc3Npb24uCisgKiBAcGFyYW0gc3RybV9pbmZvCUFycmF5IG9mIHN0cmVhbSBpbmZvLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3Nlc3Npb25fZW51bV9zdHJlYW1zKCBjb25zdCBwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24sCisJCQkgICAgICB1bnNpZ25lZCAqY291bnQsIAorCQkJICAgICAgcGptZWRpYV9zdHJlYW1faW5mbyBzdHJtX2luZm9bXSk7CisKKworLyoqCisgKiBHZXQgdGhlIG1lZGlhIHBvcnQgaW50ZXJmYWNlIG9mIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgbWVkaWEgcG9ydAorICogaW50ZXJmYWNlIGRlY2xhcmVzIHB1dF9mcmFtZSgpIGFuZCBnZXRfZnJhbWUoKSBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlIAorICogb25seSAgd2F5IGZvciBhcHBsaWNhdGlvbiB0byB0cmFuc21pdCBhbmQgcmVjZWl2ZSBtZWRpYSBmcmFtZXMgZnJvbSB0aGUKKyAqIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbglUaGUgbWVkaWEgc2Vzc2lvbi4KKyAqIEBwYXJhbSBpbmRleAkJU3RyZWFtIGluZGV4LgorICogQHBhcmFtIHBfcG9ydAlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIG1lZGlhIHBvcnQgaW50ZXJmYWNlIGZvcgorICoJCQl0aGUgc3BlY2lmaWVkIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9nZXRfcG9ydCggcGptZWRpYV9zZXNzaW9uICpzZXNzaW9uLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW5kZXgsCisJCQkJCSAgICAgICBwam1lZGlhX3BvcnQgKipwX3BvcnQpOworCisKKy8qKgorICogR2V0IHNlc3Npb24gc3RhdGlzdGljcy4gVGhlIHN0cmVhbSBzdGF0aXN0aWMgc2hvd3MgdmFyaW91cworICogaW5kaWNhdG9ycyBzdWNoIGFzIHBhY2tldCBjb3VudCwgcGFja2V0IGxvc3QsIGppdHRlciwgZGVsYXksIGV0Yy4KKyAqIFNlZSBhbHNvICNwam1lZGlhX3Nlc3Npb25fZ2V0X3N0cmVhbV9zdGF0X2pidWYoKQorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBtZWRpYSBzZXNzaW9uLgorICogQHBhcmFtIGluZGV4CQlTdHJlYW0gaW5kZXguCisgKiBAcGFyYW0gc3RhdAkJU3RyZWFtIHN0YXRpc3RpYy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9nZXRfc3RyZWFtX3N0YXQocGptZWRpYV9zZXNzaW9uICpzZXNzaW9uLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbmRleCwKKwkJCQkJCSAgICAgcGptZWRpYV9ydGNwX3N0YXQgKnN0YXQpOworCisKKy8qKgorICogUmVzZXQgc2Vzc2lvbiBzdGF0aXN0aWNzLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBtZWRpYSBzZXNzaW9uLgorICogQHBhcmFtIGluZGV4CQlTdHJlYW0gaW5kZXguCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3Nlc3Npb25fcmVzZXRfc3RyZWFtX3N0YXQocGptZWRpYV9zZXNzaW9uICpzZXNzaW9uLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGluZGV4KTsKKworCisjaWYgZGVmaW5lZChQSk1FRElBX0hBU19SVENQX1hSKSAmJiAoUEpNRURJQV9IQVNfUlRDUF9YUiAhPSAwKQorLyoqCisgKiBHZXQgZXh0ZW5kZWQgc2Vzc2lvbiBzdGF0aXN0aWNzLiBUaGUgZXh0ZW5kZWQgc3RhdGlzdGljIHNob3dzIHJlcG9ydHMKKyAqIGZyb20gUlRDUCBYUiwgc3VjaCBhcyBwZXIgaW50ZXJ2YWwgc3RhdGlzdGljcyBzdW1tYXJ5IChwYWNrZXQgY291bnQsIAorICogcGFja2V0IGxvc3QsIGppdHRlciwgZXRjKSwgVm9JUCBtZXRyaWNzIChkZWxheSwgcXVhbGl0eSwgZXRjKQorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBtZWRpYSBzZXNzaW9uLgorICogQHBhcmFtIGluZGV4CQlTdHJlYW0gaW5kZXguCisgKiBAcGFyYW0gc3RhdF94cglTdHJlYW0gZXh0ZW5kZWQgc3RhdGlzdGljcy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9nZXRfc3RyZWFtX3N0YXRfeHIoCisJCQkJCSAgICAgcGptZWRpYV9zZXNzaW9uICpzZXNzaW9uLAorCQkJCQkgICAgIHVuc2lnbmVkIGluZGV4LAorCQkJCQkgICAgIHBqbWVkaWFfcnRjcF94cl9zdGF0ICpzdGF0X3hyKTsKKyNlbmRpZgorCisKKy8qKgorICogR2V0IGN1cnJlbnQgaml0dGVyIGJ1ZmZlciBzdGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgKiBTZWUgYWxzbyAjcGptZWRpYV9zZXNzaW9uX2dldF9zdHJlYW1fc3RhdCgpCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKiBAcGFyYW0gaW5kZXgJCVN0cmVhbSBpbmRleC4KKyAqIEBwYXJhbSBzdGF0ZQkJSml0dGVyIGJ1ZmZlciBzdGF0ZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9nZXRfc3RyZWFtX3N0YXRfamJ1ZigKKwkJCQkJICAgIHBqbWVkaWFfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICAgIHVuc2lnbmVkIGluZGV4LAorCQkJCQkgICAgcGptZWRpYV9qYl9zdGF0ZSAqc3RhdGUpOworCisvKioKKyAqIERpYWwgRFRNRiBkaWdpdCB0byB0aGUgc3RyZWFtLCB1c2luZyBSRkMgMjgzMyBtZWNoYW5pc20uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKiBAcGFyYW0gaW5kZXgJCVRoZSBzdHJlYW0gaW5kZXguCisgKiBAcGFyYW0gYXNjaWlfZGlnaXRzCVN0cmluZyBvZiBBU0NJSSBkaWdpdHMgKGkuZS4gMC05KiMjQS1CKS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9kaWFsX2R0bWYoIHBqbWVkaWFfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICAgICAgICB1bnNpZ25lZCBpbmRleCwKKwkJCQkJCWNvbnN0IHBqX3N0cl90ICphc2NpaV9kaWdpdHMgKTsKKworCisvKioKKyAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGhhcyByZWNlaXZlZCBEVE1GIGRpZ2l0cy4KKyAqCisgKiBAcGFyYW0gc2Vzc2lvbglUaGUgbWVkaWEgc2Vzc2lvbi4KKyAqIEBwYXJhbSBpbmRleAkJVGhlIHN0cmVhbSBpbmRleC4KKyAqCisgKiBAcmV0dXJuCQlOb24temVybyAoUEpfVFJVRSkgaWYgdGhlIHN0cmVhbSBoYXMgRFRNRiBkaWdpdHMuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2Vzc2lvbl9jaGVja19kdG1mKCBwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCSAgICAgICAgIHVuc2lnbmVkIGluZGV4KTsKKworCisvKioKKyAqIFJldHJpZXZlIERUTUYgZGlnaXRzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKiBAcGFyYW0gaW5kZXgJCVRoZSBzdHJlYW0gaW5kZXguCisgKiBAcGFyYW0gYXNjaWlfZGlnaXRzCUJ1ZmZlciB0byByZWNlaXZlIHRoZSBkaWdpdHMuIFRoZSBsZW5ndGggb2YgdGhpcworICoJCQlidWZmZXIgaXMgaW5kaWNhdGVkIGluIHRoZSAic2l6ZSIgYXJndW1lbnQuCisgKiBAcGFyYW0gc2l6ZQkJT24gaW5wdXQsIGNvbnRhaW5zIHRoZSBtYXhpbXVtIGRpZ2l0cyB0byBiZSBjb3BpZWQKKyAqCQkJdG8gdGhlIGJ1ZmZlci4KKyAqCQkJT24gb3V0cHV0LCBpdCBjb250YWlucyB0aGUgYWN0dWFsIGRpZ2l0cyB0aGF0IGhhcworICoJCQliZWVuIGNvcGllZCB0byB0aGUgYnVmZmVyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZXNzaW9uX2dldF9kdG1mKCBwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbmRleCwKKwkJCQkJICAgICAgIGNoYXIgKmFzY2lpX2RpZ2l0cywKKwkJCQkJICAgICAgIHVuc2lnbmVkICpzaXplICk7CisKKy8qKgorICogU2V0IGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBEVE1GIGRpZ2l0cy4gSWYgY2FsbGJhY2sgaXMKKyAqIHJlZ2lzdGVyZWQsIHRoZSBzdHJlYW0gd2lsbCBub3QgYnVmZmVyIGluY29taW5nIERUTUYgYnV0IHJhdGhlciBjYWxsCisgKiB0aGUgY2FsbGJhY2sgYXMgc29vbiBhcyBEVE1GIGRpZ2l0IGlzIHJlY2VpdmVkIGNvbXBsZXRlbHkuCisgKgorICogQHBhcmFtIHNlc3Npb24JVGhlIG1lZGlhIHNlc3Npb24uCisgKiBAcGFyYW0gaW5kZXgJCVRoZSBzdHJlYW0gaW5kZXguCisgKiBAcGFyYW0gY2IJCUNhbGxiYWNrIHRvIGJlIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBEVE1GIGRpZ2l0cy4KKyAqCQkJVGhlIERUTUYgZGlnaXRzIHdpbGwgYmUgZ2l2ZW4gdG8gdGhlIGNhbGxiYWNrIGFzCisgKgkJCUFTQ0lJIGRpZ2l0cy4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJVXNlciBkYXRhIHRvIGJlIHJldHVybmVkIGJhY2sgd2hlbiB0aGUgY2FsbGJhY2sKKyAqCQkJaXMgY2FsbGVkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfc2Vzc2lvbl9zZXRfZHRtZl9jYWxsYmFjayhwam1lZGlhX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJICB1bnNpZ25lZCBpbmRleCwKKwkJCQkgIHZvaWQgKCpjYikocGptZWRpYV9zdHJlYW0qLCAKKwkJCQkgCSAgICAgdm9pZCAqdXNlcl9kYXRhLCAKKwkJCQkJICAgICBpbnQgZGlnaXQpLCAKKwkJCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogRGVzdHJveSBtZWRpYSBzZXNzaW9uLgorICoKKyAqIEBwYXJhbSBzZXNzaW9uCVRoZSBtZWRpYSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1MgaWYgc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zZXNzaW9uX2Rlc3Ryb3kocGptZWRpYV9zZXNzaW9uICpzZXNzaW9uKTsKKworCisKKy8qKgorICogQH0KKyAqLworCitQSl9FTkRfREVDTAorCisjZW5kaWYJLyogX19QSk1FRElBX1NFU1NJT05fSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWduYXR1cmVzLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zaWduYXR1cmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhZGJjMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NpZ25hdHVyZXMuaApAQCAtMCwwICsxLDIxNyBAQAorLyogJElkOiBzaWduYXR1cmVzLmggMzY2NCAyMDExLTA3LTE5IDAzOjQyOjI4WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9TSUdOQVRVUkVTX0hfXworI2RlZmluZSBfX1BKTUVESUFfU0lHTkFUVVJFU19IX18KKworLyoqCisgKiBAZmlsZSBwam1lZGlhL3NpZ25hdHVyZXMuaAorICogQGJyaWVmIFN0YW5kYXJkIFBKTUVESUEgb2JqZWN0IHNpZ25hdHVyZXMKKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1NJRyBPYmplY3QgU2lnbmF0dXJlcworICogQGluZ3JvdXAgUEpNRURJQV9CQVNFCisgKiBAYnJpZWYgU3RhbmRhcmQgUEpNRURJQSBvYmplY3Qgc2lnbmF0dXJlcworICogQHsKKyAqCisgKiBPYmplY3Qgc2lnbmF0dXJlIGlzIGEgMzItYml0IGludGVncmFsIHZhbHVlIHNpbWlsYXIgdG8gRk9VUkNDIHRvIGhlbHAKKyAqIGlkZW50aWZ5IFBKTUVESUEgb2JqZWN0cyBzdWNoIGFzIG1lZGlhIHBvcnRzLCB0cmFuc3BvcnRzLCBjb2RlY3MsIGV0Yy4KKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHVzZXMgb2YgdGhpcyBzaWduYXR1cmUsIGZvciBleGFtcGxlIGEgbWVkaWEgcG9ydCBjYW4KKyAqIHVzZSB0aGUgcG9ydCBvYmplY3Qgc2lnbmF0dXJlIHRvIHZlcmlmeSB0aGF0IHRoZSBnaXZlbiBwb3J0IGluc3RhbmNlCisgKiBpcyB0aGUgb25lIHRoYXQgaXQgY3JlYXRlZCwgYW5kIGEgcmVjZWl2ZXIgb2YgXHJlZiBQSk1FRElBX0VWRU5UIGNhbgorICogdXNlIHRoZSBzaWduYXR1cmUgb2YgdGhlIHB1Ymxpc2hlciB0byBrbm93IHdoaWNoIG9iamVjdCBlbWl0dGVkIHRoZQorICogZXZlbnQuCisgKgorICogVGhlIDMyLWJpdCB2YWx1ZSBvZiBhbiBvYmplY3Qgc2lnbmF0dXJlIGlzIGdlbmVyYXRlZCBieSB0aGUgZm9sbG93aW5nCisgKiBtYWNybzoKKyAqCisgKiBcdmVyYmF0aW0KKyAgICNkZWZpbmUgUEpNRURJQV9TSUdOQVRVUkUoYSxiLGMsZCkJKGE8PDI0IHwgYjw8MTYgfCBjPDw4IHwgZCkKKyAqIFxlbmR2ZXJiYXRpbQorICoKKyAqIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbiBpcyB1c2VkIHRvIG1haW50YWluIG9yZGVyIHRvIHRoZSBzaWduYXR1cmUKKyAqIHZhbHVlcyBzbyB0aGF0IGFwcGxpY2F0aW9uIGNhbiBtYWtlIHVzZSBvZiBpdCBtb3JlIGVmZmVjdGl2ZWx5LCBhbmQgdG8KKyAqIGF2b2lkIGNvbmZsaWN0IGJldHdlZW4gdGhlIHZhbHVlcyB0aGVtc2VsdmVzLiBGb3IgZWFjaCBvYmplY3QgdHlwZSBvcgorICogY2xhc3MsIGEgc3BlY2lmaWMgcHJlZml4IHdpbGwgYmUgYXNzaWduZWQgYXMgc2lnbmF0dXJlLCBhbmQgYSBtYWNybworICogaXMgY3JlYXRlZCB0byBidWlsZCBhIHNpZ25hdHVyZSBmb3Igc3VjaCBvYmplY3Q6CisgKgorICogXHZlcmJhdGltCisgICAgQ2xhc3MgICAgICAgICAgICAgICBTaWduYXR1cmUgIFNpZ25hdHVyZSBjcmVhdGlvbiBhbmQgdGVzdCBtYWNyb3MKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDb2RlYyAgICAJCUN4eHgJICAgUEpNRURJQV9TSUdfQ0xBU1NfQ09ERUMoYixjLGQpCisJCQkJICAgUEpNRURJQV9TSUdfSVNfQ0xBU1NfQ09ERUMoc2lnKQorCisgICAgQXVkaW8gY29kZWMgCUNBeHgJICAgUEpNRURJQV9TSUdfQ0xBU1NfQVVEX0NPREVDKGMsZCkKKwkJCQkgICBQSk1FRElBX1NJR19JU19DTEFTU19BVURfQ09ERUMoc2lnKQorCisgICAgVmlkZW8gY29kZWMgCUNWeHgJICAgUEpNRURJQV9TSUdfQ0xBU1NfVklEX0NPREVDKGMsZCkKKwkJCQkgICBQSk1FRElBX1NJR19JU19DTEFTU19WSURfQ09ERUMoc2lnKQorCisgICAgTWVkaWEgcG9ydAkJUHh4eAkgICBQSk1FRElBX1NJR19DTEFTU19QT1JUKGIsYyxkKQorCQkJCSAgIFBKTUVESUFfU0lHX0lTX0NMQVNTX1BPUlQoc2lnKQorCisgICAgQXVkaW8gbWVkaWEgcG9ydCAgICBQQXh4CSAgIFBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKGMsZCkKKwkJCQkgICBQSk1FRElBX1NJR19JU19DTEFTU19QT1JUX0FVRChzaWcpCisKKyAgICBWaWRlbyBtZWRpYSBwb3J0ICAgIFBWeHgJICAgUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9WSUQoYyxkKQorCQkJCSAgIFBKTUVESUFfU0lHX0lTX0NMQVNTX1BPUlRfVklEKHNpZykKKworICAgIFZpZGVvIGRldmljZQlWRHh4CSAgIFBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoYyxkKQorCQkJCSAgIFBKTUVESUFfU0lHX0lTX0NMQVNTX1ZJRF9ERVYoc2lnKQorCisgICAgVmlkZW8gb3RoZXIJCVZPeHgJICAgUEpNRURJQV9TSUdfQ0xBU1NfVklEX09USEVSKGMsZCkKKwkJCQkgICBQSk1FRElBX1NJR19JU19DTEFTU19WSURfT1RIRVIoc2lnKQorCisgICAgQXBwbGljYXRpb24gb2JqZWN0CUF4eHgJICAgUEpNRURJQV9TSUdfQ0xBU1NfQVBQKGIsYyxkKQorCQkJCSAgIFBKTUVESUFfU0lHX0lTX0NMQVNTX0FQUChzaWcpCisKKyAqIFxlbmR2ZXJiYXRpbQorICoKKyAqIEluIGFkZGl0aW9uLCBzaWduYXR1cmVzIGNyZWF0ZWQgaW4gYXBwbGljYXRpb24gY29kZSBzaG91bGQgaGF2ZSBsb3dlcmNhc2UKKyAqIGxldHRlcnMgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBidWlsdC1pbiBvYmplY3RzLgorICovCisKKy8qKgorICogVHlwZSB0byBzdG9yZSBvYmplY3Qgc2lnbmF0dXJlLgorICovCit0eXBlZGVmIHBqX3VpbnQzMl90IHBqbWVkaWFfb2JqX3NpZzsKKworLyoqCisgKiBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBzaWduYXR1cmUgdG8gZm91ciBsZXR0ZXJzIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc2lnCQlUaGUgc2lnbmF0dXJlIHZhbHVlLgorICogQHBhcmFtIGJ1ZgkJQnVmZmVyIHRvIHN0b3JlIHRoZSBzdHJpbmcsIHdoaWNoIE1VU1QgYmUgYXQgbGVhc3QKKyAqIAkJCWZpdmUgYnl0ZXMgbG9uZy4KKyAqCisgKiBAcmV0dXJuCQlUaGUgc3RyaW5nLgorICovCitQSl9JTkxJTkUoY29uc3QgY2hhciopIHBqbWVkaWFfc2lnX25hbWUocGptZWRpYV9vYmpfc2lnIHNpZywgY2hhciBidWZbXSkKK3sKKyAgICByZXR1cm4gcGptZWRpYV9mb3VyY2NfbmFtZShzaWcsIGJ1Zik7Cit9CisKKy8qKgorICogTWFjcm8gdG8gZ2VuZXJhdGUgc2lnbmF0dXJlIGZyb20gZm91ciBBU0NJSSBsZXR0ZXJzLgorICovCisjZGVmaW5lIFBKTUVESUFfU0lHTkFUVVJFKGEsYixjLGQpCVBKTUVESUFfRk9VUkNDKGEsYixjLGQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb2RlYyBzaWduYXR1cmUgKCdDeHh4JykuIFBsZWFzZSBrZWVwIHRoZSBjb25zdGFudCBuYW1lcyBzb3J0ZWQuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TSUdfQ0xBU1NfQ09ERUMoYixjLGQpCVBKTUVESUFfU0lHTkFUVVJFKCdDJyxiLGMsZCkKKyNkZWZpbmUgUEpNRURJQV9TSUdfSVNfQ0xBU1NfQ09ERUMoc2lnKQkoKHNpZykgPj4gMjQgPT0gJ0MnKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQXVkaW8gY29kZWMgc2lnbmF0dXJlcyAoJ0NBeHgnKS4gUGxlYXNlIGtlZXAgdGhlIGNvbnN0YW50IG5hbWVzIHNvcnRlZC4KKyAqLworI2RlZmluZSBQSk1FRElBX1NJR19DTEFTU19BVURfQ09ERUMoYyxkKSBQSk1FRElBX1NJR19DTEFTU19DT0RFQygnQScsYyxkKQorI2RlZmluZSBQSk1FRElBX1NJR19JU19DTEFTU19BVURfQ09ERUMocykgKChzKT4+MjQ9PSdDJyAmJiAocyk+PjE2PT0nQScpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBjb2RlYyBzaWduYXR1cmVzICgnQ1Z4eCcpLiBQbGVhc2Uga2VlcCB0aGUgY29uc3RhbnQgbmFtZXMgc29ydGVkLgorICovCisjZGVmaW5lIFBKTUVESUFfU0lHX0NMQVNTX1ZJRF9DT0RFQyhjLGQpIFBKTUVESUFfU0lHX0NMQVNTX0NPREVDKCdWJyxjLGQpCisjZGVmaW5lIFBKTUVESUFfU0lHX0lTX0NMQVNTX1ZJRF9DT0RFQyhzaWcpICgocyk+PjI0PT0nQycgJiYgKHMpPj4xNj09J1YnKQorCisjZGVmaW5lIFBKTUVESUFfU0lHX1ZJRF9DT0RFQ19GRk1QRUcJUEpNRURJQV9TSUdfQ0xBU1NfVklEX0NPREVDKCdGJywnRicpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb3J0IHNpZ25hdHVyZXMgKCdQeHh4JykuIFBsZWFzZSBrZWVwIHRoZSBjb25zdGFudCBuYW1lcyBzb3J0ZWQuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TSUdfQ0xBU1NfUE9SVChiLGMsZCkJUEpNRURJQV9TSUdOQVRVUkUoJ1AnLGIsYyxkKQorI2RlZmluZSBQSk1FRElBX1NJR19JU19DTEFTU19QT1JUKHNpZykJKChzaWcpID4+IDI0ID09ICdQJykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEF1ZGlvIHBvcnRzIHNpZ25hdHVyZXMgKCdQQXh4JykuIFBsZWFzZSBrZWVwIHRoZSBjb25zdGFudCBuYW1lcyBzb3J0ZWQuCisgKi8KKyNkZWZpbmUgUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoYyxkKQlQSk1FRElBX1NJR19DTEFTU19QT1JUKCdBJyxjLGQpCisjZGVmaW5lIFBKTUVESUFfU0lHX0lTX0NMQVNTX1BPUlRfQVVEKHMpICgocyk+PjI0PT0nUCcgJiYgKHMpPj4xNj09J0EnKQorCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfQklESVIJCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKCdCJywnRCcpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfQ09ORgkJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ0MnLCdGJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9DT05GX1BBU1YJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ0MnLCdQJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9DT05GX1NXSVRDSAlQSk1FRElBX1NJR19DTEFTU19QT1JUX0FVRCgnQycsJ1MnKQorI2RlZmluZSBQSk1FRElBX1NJR19QT1JUX0VDSE8JCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKCdFJywnQycpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfTUVNX0NBUFRVUkUJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ00nLCdDJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9NRU1fUExBWUVSCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKCdNJywnUCcpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfTlVMTAkJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ04nLCdVJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9SRVNBTVBMRQlQSk1FRElBX1NJR19DTEFTU19QT1JUX0FVRCgnUicsJ0UnKQorI2RlZmluZSBQSk1FRElBX1NJR19QT1JUX1NQTElUX0NPTUIJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ1MnLCdDJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9TUExJVF9DT01CX1AJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ1MnLCdQJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9TVEVSRU8JCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKCdTJywnUicpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfU1RSRUFNCQlQSk1FRElBX1NJR19DTEFTU19QT1JUX0FVRCgnUycsJ1QnKQorI2RlZmluZSBQSk1FRElBX1NJR19QT1JUX1RPTkVHRU4JUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9BVUQoJ1QnLCdPJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfUE9SVF9XQVZfUExBWUVSCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKCdXJywnUCcpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfV0FWX1BMQVlMSVNUCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfQVVEKCdXJywnWScpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfV0FWX1dSSVRFUglQSk1FRElBX1NJR19DTEFTU19QT1JUX0FVRCgnVycsJ1cnKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBwb3J0cyBzaWduYXR1cmVzICgnUFZ4eCcpLiBQbGVhc2Uga2VlcCB0aGUgY29uc3RhbnQgbmFtZXMgc29ydGVkLgorICovCisjZGVmaW5lIFBKTUVESUFfU0lHX0NMQVNTX1BPUlRfVklEKGMsZCkJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVCgnVicsYyxkKQorI2RlZmluZSBQSk1FRElBX1NJR19JU19DTEFTU19QT1JUX1ZJRChzKSAoKHMpPj4yND09J1AnICYmIChzKT4+MTY9PSdWJykKKworLyoqIEFWSSBwbGF5ZXIgc2lnbmF0dXJlLiAqLworI2RlZmluZSBQSk1FRElBX1NJR19QT1JUX1ZJRF9BVklfUExBWUVSCVBKTUVESUFfU0lHX0NMQVNTX1BPUlRfVklEKCdBJywnVicpCisjZGVmaW5lIFBKTUVESUFfU0lHX1BPUlRfVklEX1NUUkVBTQlQSk1FRElBX1NJR19DTEFTU19QT1JUX1ZJRCgnUycsJ1QnKQorI2RlZmluZSBQSk1FRElBX1NJR19QT1JUX1ZJRF9URUUJUEpNRURJQV9TSUdfQ0xBU1NfUE9SVF9WSUQoJ1QnLCdFJykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZpZGVvIGRldmljZSBzaWduYXR1cmVzICgnVkR4eCcpLiBQbGVhc2Uga2VlcCB0aGUgY29uc3RhbnQgbmFtZXMgc29ydGVkLgorICovCisjZGVmaW5lIFBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoYyxkKQlQSk1FRElBX1NJR05BVFVSRSgnVicsJ0QnLGMsZCkKKyNkZWZpbmUgUEpNRURJQV9TSUdfSVNfQ0xBU1NfVklEX0RFVihzKSAoKHMpPj4yND09J1YnICYmIChzKT4+MTY9PSdEJykKKworI2RlZmluZSBQSk1FRElBX1NJR19WSURfREVWX0NPTE9SQkFSCVBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoJ0MnLCdCJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfVklEX0RFVl9TREwJCVBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoJ1MnLCdEJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfVklEX0RFVl9WNEwyCVBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoJ1YnLCcyJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfVklEX0RFVl9EU0hPVwlQSk1FRElBX1NJR19DTEFTU19WSURfREVWKCdEJywnUycpCisjZGVmaW5lIFBKTUVESUFfU0lHX1ZJRF9ERVZfUVQJCVBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoJ1EnLCdUJykKKyNkZWZpbmUgUEpNRURJQV9TSUdfVklEX0RFVl9JT1MJCVBKTUVESUFfU0lHX0NMQVNTX1ZJRF9ERVYoJ0knLCdQJykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPdGhlciB2aWRlbyBvYmplY3RzICgnVk94eCcpLiBQbGVhc2Uga2VlcCB0aGUgY29uc3RhbnQgbmFtZXMgc29ydGVkLgorICovCisjZGVmaW5lIFBKTUVESUFfU0lHX0NMQVNTX1ZJRF9PVEhFUihjLGQpIFBKTUVESUFfU0lHTkFUVVJFKCdWJywnTycsYyxkKQorI2RlZmluZSBQSk1FRElBX1NJR19JU19DTEFTU19WSURfT1RIRVIocykgKChzKT4+MjQ9PSdWJyAmJiAocyk+PjE2PT0nTycpCisKKyNkZWZpbmUgUEpNRURJQV9TSUdfVklEX1BPUlQJCVBKTUVESUFfU0lHX0NMQVNTX1ZJRF9PVEhFUignUCcsJ08nKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFwcGxpY2F0aW9uIGNsYXNzICgnQXh4eCcpLgorICovCisjZGVmaW5lIFBKTUVESUFfU0lHX0NMQVNTX0FQUChiLGMsZCkJUEpNRURJQV9TSUdOQVRVUkUoJ0EnLGIsYyxkKQorI2RlZmluZSBQSk1FRElBX1NJR19JU19DTEFTU19BUFAocykJKChzKT4+MjQ9PSdBJykKKworCisvKioKKyAqIEB9ICBQSlNJUF9NU0cKKyAqLworCisKK1BKX0VORF9ERUNMCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfU0lHTkFUVVJFU19IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NpbGVuY2VkZXQuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NpbGVuY2VkZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc0MWRlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc2lsZW5jZWRldC5oCkBAIC0wLDAgKzEsMjAwIEBACisvKiAkSWQ6IHNpbGVuY2VkZXQuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfU0lMRU5DRV9ERVRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9TSUxFTkNFX0RFVF9IX18KKworCisvKioKKyAqIEBmaWxlIHNpbGVuY2VkZXQuaAorICogQGJyaWVmIEFkYXB0aXZlIHNpbGVuY2UgZGV0ZWN0b3IuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9TSUxFTkNFREVUIEFkYXB0aXZlIFNpbGVuY2UgRGV0ZWN0aW9uCisgKiBAaW5ncm91cCBQSk1FRElBX0ZSQU1FX09QCisgKiBAYnJpZWYgQWRhcHRpdmUgU2lsZW5jZSBEZXRlY3RvcgorICogQHsKKyAqLworCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIE9wYXF1ZSBkZWNsYXJhdGlvbiBmb3Igc2lsZW5jZSBkZXRlY3Rvci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zaWxlbmNlX2RldCBwam1lZGlhX3NpbGVuY2VfZGV0OworCisKKworLyoqCisgKiBDcmVhdGUgdm9pY2UgYWN0aXZpdHkgZGV0ZWN0b3Igd2l0aCBkZWZhdWx0IHNldHRpbmdzLiBUaGUgZGVmYXVsdCBzZXR0aW5ncworICogYXJlIHNldCB0byBhZGFwdGl2ZSBzaWxlbmNlIGRldGVjdGlvbiB3aXRoIHRoZSBkZWZhdWx0IHRocmVzaG9sZC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgZm9yIGFsbG9jYXRpbmcgdGhlIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBDbG9jayByYXRlLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4gVGhlIGNsb2NrX3JhdGUgYW5kCisgKgkJCSAgICBzYW1wbGVzX3Blcl9mcmFtZSBpcyBvbmx5IHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICoJCQkgICAgZnJhbWUgdGltZSwgZnJvbSB3aGljaCBzb21lIHRpbWluZyBwYXJhbWV0ZXJzCisgKgkJCSAgICBhcmUgY2FsY3VsYXRlZCBmcm9tLgorICogQHBhcmFtIHBfc2QJCSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHNpbGVuY2UgZGV0ZWN0b3IgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zaWxlbmNlX2RldF9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCSB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkJIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkJIHBqbWVkaWFfc2lsZW5jZV9kZXQgKipwX3NkICk7CisKKworLyoqCisgKiBTZXQgc2lsZW5jZSBkZXRlY3RvciBuYW1lIHRvIGlkZW50aWZ5IHRoZSBwYXJ0aWN1bGFyIHNpbGVuY2UgZGV0ZWN0b3IKKyAqIGluc3RhbmNlIGluIHRoZSBsb2cuCisgKgorICogQHBhcmFtIHNkCQkgICAgVGhlIHNpbGVuY2UgZGV0ZWN0b3IuCisgKiBAcGFyYW0gbmFtZQkJICAgIE5hbWUuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zaWxlbmNlX2RldF9zZXRfbmFtZShwam1lZGlhX3NpbGVuY2VfZGV0ICpzZCwKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSk7CisKKworLyoqCisgKiBTZXQgdGhlIHNkIHRvIG9wZXJhdGUgaW4gZml4ZWQgdGhyZXNob2xkIG1vZGUuIFdpdGggZml4ZWQgdGhyZXNob2xkIG1vZGUsCisgKiB0aGUgdGhyZXNob2xkIHdpbGwgbm90IGJlIGNoYW5nZWQgYWRhcHRpdmVseS4KKyAqCisgKiBAcGFyYW0gc2QJCSAgICBUaGUgc2lsZW5jZSBkZXRlY3RvcgorICogQHBhcmFtIHRocmVzaG9sZAkgICAgVGhlIHNpbGVuY2UgdGhyZXNob2xkLCBvciAtMSB0byB1c2UgZGVmYXVsdAorICoJCQkgICAgdGhyZXNob2xkLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc2lsZW5jZV9kZXRfc2V0X2ZpeGVkKCBwam1lZGlhX3NpbGVuY2VfZGV0ICpzZCwKKwkJCQkJCSAgICBpbnQgdGhyZXNob2xkICk7CisKKy8qKgorICogU2V0IHRoZSBzZCB0byBvcGVyYXRlIGluIGFkYXB0aXZlIG1vZGUuIFRoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZQorICogd2hlbiB0aGUgc2lsZW5jZSBkZXRlY3RvciBpcyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSBzZAkJICAgIFRoZSBzaWxlbmNlIGRldGVjdG9yCisgKiBAcGFyYW0gdGhyZXNob2xkCSAgICBJbml0aWFsIHRocmVzaG9sZCB0byBiZSBzZXQsIG9yIC0xIHRvIHVzZSBkZWZhdWx0CisgKgkJCSAgICB0aHJlc2hvbGQuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zaWxlbmNlX2RldF9zZXRfYWRhcHRpdmUocGptZWRpYV9zaWxlbmNlX2RldCAqc2QsCisJCQkJCQkgICAgICBpbnQgdGhyZXNob2xkKTsKKworLyoqCisgKiBTZXQgb3RoZXIgc2lsZW5jZSBkZXRlY3RvciBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBzZAkJICAgIFRoZSBzaWxlbmNlIGRldGVjdG9yCisgKiBAcGFyYW0gYmVmb3JlX3NpbGVuY2UgICAgTWluaW11bSBkdXJhdGlvbiBvZiBzaWxlbmNlIChpbiBtc2VjKSBiZWZvcmUgCisgKgkJCSAgICBzaWxlbmNlIGlzIHJlcG9ydGVkLiBJZiAtMSBpcyBzcGVjaWZpZWQsIHRoZW4KKyAqCQkJICAgIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC4gVGhlIGRlZmF1bHQgaXMKKyAqCQkJICAgIDQwMCBtc2VjLgorICogQHBhcmFtIHJlY2FsY190aW1lMQkgICAgVGhlIGludGVydmFsIChpbiBtc2VjKSB0byByZWNhbGN1bGF0ZSB0aHJlc2hvbGQKKyAqCQkJICAgIGluIG5vbi1zaWxlbmNlIGNvbmRpdGlvbiB3aGVuIGFkYXB0aXZlIHNpbGVuY2UgCisgKgkJCSAgICBkZXRlY3Rpb24gaXMgc2V0LiBJZiAtMSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIAorICoJCQkgICAgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuIFRoZSBkZWZhdWx0IGlzIDQwMDAKKyAqCQkJICAgIChtc2VjKS4KKyAqIEBwYXJhbSByZWNhbGNfdGltZTIJICAgIFRoZSBpbnRlcnZhbCAoaW4gbXNlYykgdG8gcmVjYWxjdWxhdGUgdGhyZXNob2xkCisgKgkJCSAgICBpbiBzaWxlbmNlIGNvbmRpdGlvbiB3aGVuIGFkYXB0aXZlIHNpbGVuY2UgZGV0ZWN0aW9uCisgKgkJCSAgICBpcyBzZXQuIElmIC0xIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSAKKyAqCQkJICAgIHdpbGwgYmUgdXNlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAwMCAobXNlYykuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zaWxlbmNlX2RldF9zZXRfcGFyYW1zKCBwam1lZGlhX3NpbGVuY2VfZGV0ICpzZCwKKwkJCQkJCSAgICAgaW50IGJlZm9yZV9zaWxlbmNlLAorCQkJCQkJICAgICBpbnQgcmVjYWxjX3RpbWUxLAorCQkJCQkJICAgICBpbnQgcmVjYWxjX3RpbWUyKTsKKworCisvKioKKyAqIERpc2FibGUgdGhlIHNpbGVuY2UgZGV0ZWN0b3IuCisgKgorICogQHBhcmFtIHNkCQlUaGUgc2lsZW5jZSBkZXRlY3RvcgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zaWxlbmNlX2RldF9kaXNhYmxlKCBwam1lZGlhX3NpbGVuY2VfZGV0ICpzZCApOworCisKKy8qKgorICogUGVyZm9ybSB2b2ljZSBhY3Rpdml0eSBkZXRlY3Rpb24gb24gdGhlIGdpdmVuIGlucHV0IHNhbXBsZXMuIFRoaXMKKyAqIGZ1bmN0aW9uIHVzZXMgI3BqbWVkaWFfY2FsY19hdmdfc2lnbmFsKCkgYW5kICNwam1lZGlhX3NpbGVuY2VfZGV0X2FwcGx5KCkKKyAqIGZvciBpdHMgY2FsY3VsYXRpb24uCisgKgorICogQHBhcmFtIHNkCQlUaGUgc2lsZW5jZSBkZXRlY3RvciBpbnN0YW5jZS4KKyAqIEBwYXJhbSBzYW1wbGVzCVBvaW50ZXIgdG8gMTYtYml0IFBDTSBpbnB1dCBzYW1wbGVzLgorICogQHBhcmFtIGNvdW50CQlOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQuCisgKiBAcGFyYW0gcF9sZXZlbAlPcHRpb25hbCBwb2ludGVyIHRvIHJlY2VpdmUgYXZlcmFnZSBzaWduYWwgbGV2ZWwKKyAqCQkJb2YgdGhlIGlucHV0IHNhbXBsZXMuCisgKgorICogQHJldHVybgkJTm9uIHplcm8gaWYgc2lnbmFsIGlzIHNpbGVuY2UuCisgKi8KK1BKX0RFQ0wocGpfYm9vbF90KSBwam1lZGlhX3NpbGVuY2VfZGV0X2RldGVjdCggcGptZWRpYV9zaWxlbmNlX2RldCAqc2QsCisJCQkJCSAgICAgICBjb25zdCBwal9pbnQxNl90IHNhbXBsZXNbXSwKKwkJCQkJICAgICAgIHBqX3NpemVfdCBjb3VudCwKKwkJCQkJICAgICAgIHBqX2ludDMyX3QgKnBfbGV2ZWwpOworCisKKy8qKgorICogQ2FsY3VsYXRlIGF2ZXJhZ2Ugc2lnbmFsIGxldmVsIGZvciB0aGUgZ2l2ZW4gc2FtcGxlcy4KKyAqCisgKiBAcGFyYW0gc2FtcGxlcwlQb2ludGVyIHRvIDE2LWJpdCBQQ00gc2FtcGxlcy4KKyAqIEBwYXJhbSBjb3VudAkJTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0LgorICoKKyAqIEByZXR1cm4JCVRoZSBhdmVyYWdlIHNpZ25hbCBsZXZlbCwgd2hpY2ggc2ltcGx5IGlzIHRvdGFsIGxldmVsCisgKgkJCWRpdmlkZWQgYnkgbnVtYmVyIG9mIHNhbXBsZXMuCisgKi8KK1BKX0RFQ0wocGpfaW50MzJfdCkgcGptZWRpYV9jYWxjX2F2Z19zaWduYWwoIGNvbnN0IHBqX2ludDE2X3Qgc2FtcGxlc1tdLAorCQkJCQkgICAgIHBqX3NpemVfdCBjb3VudCApOworCisKKworLyoqCisgKiBQZXJmb3JtIHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbiwgZ2l2ZW4gdGhlIHNwZWNpZmllZCBhdmVyYWdlIHNpZ25hbAorICogbGV2ZWwuCisgKgorICogQHBhcmFtIHNkCQlUaGUgc2lsZW5jZSBkZXRlY3RvciBpbnN0YW5jZS4KKyAqIEBwYXJhbSBsZXZlbAkJU2lnbmFsIGxldmVsLgorICoKKyAqIEByZXR1cm4JCU5vbiB6ZXJvIGlmIHNpZ25hbCBpcyBzaWxlbmNlLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV9zaWxlbmNlX2RldF9hcHBseSggcGptZWRpYV9zaWxlbmNlX2RldCAqc2QsCisJCQkJCSAgICAgIHBqX3VpbnQzMl90IGxldmVsKTsKKworCisKK1BKX0VORF9ERUNMCisKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9TSUxFTkNFX0RFVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmQuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NvdW5kLmgKQEAgLTAsMCArMSwzMzYgQEAKKy8qICRJZDogc291bmQuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfU09VTkRfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9TT1VORF9IX18KKworCisvKioKKyAqIEBmaWxlIHNvdW5kLmgKKyAqIEBicmllZiBMZWdhY3kgc291bmQgZGV2aWNlIEFQSQorICovCisjaW5jbHVkZSA8cGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldi5oPgorI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKworCitQSl9CRUdJTl9ERUNMCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1NORCBQb3J0YWJsZSBTb3VuZCBIYXJkd2FyZSBBYnN0cmFjdGlvbgorICogQGluZ3JvdXAgUEpNRURfU05EX1BPUlQKKyAqIEBicmllZiBQSk1FRElBIGFic3RyYWN0aW9uIGZvciBzb3VuZCBkZXZpY2UgaGFyZHdhcmUKKyAqIEB7CisgKgorICogPHN0cm9uZz5XYXJuaW5nOiB0aGlzIHNvdW5kIGRldmljZSBBUEkgaGFzIGJlZW4gZGVwcmVjYXRlZAorICogYW5kIHJlcGxhY2VkIGJ5IFBKTUVESUEgQXVkaW8gRGV2aWNlIEFQSS4gUGxlYXNlIHNlZQorICogaHR0cDovL3RyYWMucGpzaXAub3JnL3JlcG9zL3dpa2kvQXVkaW9fRGV2X0FQSSBmb3IgbW9yZQorICogaW5mb3JtYXRpb24uPC9zdHJvbmc+CisgKgorICogVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBsb3dlciBsZXZlbCBhYnN0cmFjdGlvbiBmb3Igc291bmQgZGV2aWNlCisgKiBoYXJkd2FyZS4gQXBwbGljYXRpb24gbm9ybWFsbHkgdXNlcyB0aGUgaGlnaGVyIGxheWVyIEByZWYKKyAqIFBKTUVEX1NORF9QT1JUIGFic3RyYWN0aW9uIHNpbmNlIGl0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCAKKyAqIEByZWYgUEpNRURJQV9QT1JULgorICoKKyAqIFRoZSBzb3VuZCBoYXJkd2FyZSBhYnN0cmFjdGlvbiBiYXNpY2FsbHkgcnVucyA8Yj5hc3ljaHJvbm91c2x5PC9iPiwKKyAqIGFuZCBhcHBsaWNhdGlvbiBtdXN0IHJlZ2lzdGVyIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgdG8gcmVjZWl2ZS8KKyAqIHN1cHBseSBhdWRpbyBmcmFtZXMgZnJvbS90byB0aGUgc291bmQgaGFyZHdhcmUuCisgKgorICogQSBmdWxsIGR1cGxleCBzb3VuZCBzdHJlYW0gKGNyZWF0ZWQgd2l0aCAjcGptZWRpYV9zbmRfb3BlbigpKSAKKyAqIHJlcXVpcmVzIGFwcGxpY2F0aW9uIHRvIHN1cHBseSB0d28gY2FsbGJhY2tzOgorICogIC0gPGI+PHR0PnJlY19jYjwvdHQ+PC9iPiBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBpdCBoYXMgZmluaXNoZWQKKyAqICAgIGNhcHR1cmluZyBvbmUgbWVkaWEgZnJhbWUsIGFuZCAKKyAqICAtIDxiPjx0dD5wbGF5X2NiPC90dD48L2I+IGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGl0IG5lZWRzIG1lZGlhIAorICogICAgZnJhbWUgdG8gYmUgcGxheWVkIHRvIHRoZSBzb3VuZCBwbGF5YmFjayBoYXJkd2FyZS4KKyAqCisgKiBIYWxmIGR1cGxleCBzb3VuZCBzdHJlYW0gKGNyZWF0ZWQgd2l0aCAjcGptZWRpYV9zbmRfb3Blbl9yZWMoKSBvcgorICogI3BqbWVkaWFfc25kX29wZW5fcGxheWVyKCkpIHdpbGwgb25seSBuZWVkIG9uZSBvZiB0aGUgY2FsbGJhY2sgdG8KKyAqIGJlIHNwZWNpZmllZC4KKyAqCisgKiBBZnRlciBzb3VuZCBzdHJlYW0gaXMgY3JlYXRlZCwgYXBwbGljYXRpb24gbmVlZCB0byBjYWxsCisgKiAjcGptZWRpYV9zbmRfc3RyZWFtX3N0YXJ0KCkgdG8gc3RhcnQgY2FwdHVyaW5nL3BsYXlpbmcgYmFjayBtZWRpYQorICogZnJhbWVzIGZyb20vdG8gdGhlIHNvdW5kIGRldmljZS4KKyAqLworCisvKiogT3BhcXVlIGRlY2xhcmF0aW9uIGZvciBwam1lZGlhX3NuZF9zdHJlYW0uICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3NuZF9zdHJlYW0gcGptZWRpYV9zbmRfc3RyZWFtOworCisvKioKKyAqIERldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgcmV0dXJuZWQgYnkgI3BqbWVkaWFfc25kX2dldF9kZXZfaW5mby4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9zbmRfZGV2X2luZm8KK3sKKyAgICBjaGFyCW5hbWVbNjRdOwkgICAgICAgIC8qKjwgRGV2aWNlIG5hbWUuCQkgICAgKi8KKyAgICB1bnNpZ25lZAlpbnB1dF9jb3VudDsJICAgICAgICAvKio8IE1heCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMuICAqLworICAgIHVuc2lnbmVkCW91dHB1dF9jb3VudDsJICAgICAgICAvKio8IE1heCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAqLworICAgIHVuc2lnbmVkCWRlZmF1bHRfc2FtcGxlc19wZXJfc2VjOy8qKjwgRGVmYXVsdCBzYW1wbGluZyByYXRlLgkgICAgKi8KK30gcGptZWRpYV9zbmRfZGV2X2luZm87CisKKy8qKiAKKyAqIFN0cmVhbSBpbmZvcm1hdGlvbiwgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgbGl2ZSBzdHJlYW0gYnkgY2FsbGluZworICogI3BqbWVkaWFfc25kX3N0cmVhbV9nZXRfaW5mbygpLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3NuZF9zdHJlYW1faW5mbworeworICAgIHBqbWVkaWFfZGlyCWRpcjsJCSAgICAvKio8IFN0cmVhbSBkaXJlY3Rpb24uCQkgICAgKi8KKyAgICBpbnQJCXBsYXlfaWQ7CSAgICAvKio8IFBsYXliYWNrIGRldiBpZCwgb3IgLTEgZm9yIHJlYyBvbmx5Ki8KKyAgICBpbnQJCXJlY19pZDsJCSAgICAvKio8IENhcHR1cmUgZGV2IGlkLCBvciAtMSBmb3IgcGxheSBvbmx5Ki8KKyAgICB1bnNpZ25lZAljbG9ja19yYXRlOwkgICAgLyoqPCBBY3R1YWwgY2xvY2sgcmF0ZS4JCSAgICAqLworICAgIHVuc2lnbmVkCWNoYW5uZWxfY291bnQ7CSAgICAvKio8IE51bWJlciBvZiBjaGFubmVscy4JCSAgICAqLworICAgIHVuc2lnbmVkCXNhbXBsZXNfcGVyX2ZyYW1lOyAgLyoqPCBTYW1wbGVzIHBlciBmcmFtZS4JCSAgICAqLworICAgIHVuc2lnbmVkCWJpdHNfcGVyX3NhbXBsZTsgICAgLyoqPCBCaXRzIHBlciBzYW1wbGUuCQkgICAgKi8KKyAgICB1bnNpZ25lZAlyZWNfbGF0ZW5jeTsJICAgIC8qKjwgUmVjb3JkIGxhdGVuY3ksIGluIHNhbXBsZXMuCSAgICAqLworICAgIHVuc2lnbmVkCXBsYXlfbGF0ZW5jeTsJICAgIC8qKjwgUGxheWJhY2sgbGF0ZW5jeSwgaW4gc2FtcGxlcy4JICAgICovCit9IHBqbWVkaWFfc25kX3N0cmVhbV9pbmZvOworCisvKiogCisgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBieSBwbGF5ZXIgc3RyZWFtIHdoZW4gaXQgbmVlZHMgYWRkaXRpb25hbCBkYXRhCisgKiB0byBiZSBwbGF5ZWQgYnkgdGhlIGRldmljZS4gQXBwbGljYXRpb24gbXVzdCBmaWxsIGluIHRoZSB3aG9sZSBvZiBvdXRwdXQgCisgKiBidWZmZXIgd2l0aCBzb3VuZCBzYW1wbGVzLgorICoKKyAqIEBwYXJhbSB1c2VyX2RhdGEJVXNlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtLgorICogQHBhcmFtIHRpbWVzdGFtcAlUaW1lc3RhbXAsIGluIHNhbXBsZXMuCisgKiBAcGFyYW0gb3V0cHV0CUJ1ZmZlciB0byBiZSBmaWxsZWQgb3V0IGJ5IGFwcGxpY2F0aW9uLgorICogQHBhcmFtIHNpemUJCVRoZSBzaXplIHJlcXVlc3RlZCBpbiBieXRlcywgd2hpY2ggd2lsbCBiZSBlcXVhbCB0bworICoJCQl0aGUgc2l6ZSBvZiBvbmUgd2hvbGUgcGFja2V0LgorICoKKyAqIEByZXR1cm4JCU5vbi16ZXJvIHRvIHN0b3AgdGhlIHN0cmVhbS4KKyAqLwordHlwZWRlZiBwal9zdGF0dXNfdCAoKnBqbWVkaWFfc25kX3BsYXlfY2IpKC8qIGluICovICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCSAgICAgIC8qIGluICovICAgcGpfdWludDMyX3QgdGltZXN0YW1wLAorCQkJCSAgICAgIC8qIG91dCAqLyAgdm9pZCAqb3V0cHV0LAorCQkJCSAgICAgIC8qIG91dCAqLyAgdW5zaWduZWQgc2l6ZSk7CisKKy8qKgorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgcmVjb3JkZXIgc3RyZWFtIHdoZW4gaXQgaGFzIGNhcHR1cmVkIHRoZSB3aG9sZQorICogcGFja2V0IHdvcnRoIG9mIGF1ZGlvIHNhbXBsZXMuCisgKgorICogQHBhcmFtIHVzZXJfZGF0YQlVc2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0gdGltZXN0YW1wCVRpbWVzdGFtcCwgaW4gc2FtcGxlcy4KKyAqIEBwYXJhbSBvdXRwdXQJQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNhcHR1cmVkIGF1ZGlvIHNhbXBsZXMuCisgKiBAcGFyYW0gc2l6ZQkJVGhlIHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwgaW4gYnl0ZXMuCisgKgorICogQHJldHVybgkJTm9uLXplcm8gdG8gc3RvcCB0aGUgc3RyZWFtLgorICovCit0eXBlZGVmIHBqX3N0YXR1c190ICgqcGptZWRpYV9zbmRfcmVjX2NiKSgvKiBpbiAqLyAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkgICAgIC8qIGluICovICAgcGpfdWludDMyX3QgdGltZXN0YW1wLAorCQkJCSAgICAgLyogaW4gKi8gICB2b2lkICppbnB1dCwKKwkJCQkgICAgIC8qIGluKi8gICAgdW5zaWduZWQgc2l6ZSk7CisKKy8qKgorICogSW5pdCB0aGUgc291bmQgbGlicmFyeS4KKyAqCisgKiBAcGFyYW0gZmFjdG9yeQlUaGUgc291bmQgZmFjdG9yeS4KKyAqCisgKiBAcmV0dXJuCQlaZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc25kX2luaXQocGpfcG9vbF9mYWN0b3J5ICpmYWN0b3J5KTsKKworCisvKioKKyAqIEdldCB0aGUgbnVtYmVyIG9mIGRldmljZXMgZGV0ZWN0ZWQgYnkgdGhlIGxpYnJhcnkuCisgKgorICogQHJldHVybgkJTnVtYmVyIG9mIGRldmljZXMuCisgKi8KK1BKX0RFQ0woaW50KSBwam1lZGlhX3NuZF9nZXRfZGV2X2NvdW50KHZvaWQpOworCisKKy8qKgorICogR2V0IGRldmljZSBpbmZvLgorICoKKyAqIEBwYXJhbSBpbmRleAkJVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UsIHdoaWNoIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UKKyAqCQkJZnJvbSB6ZXJvIHRvICNwam1lZGlhX3NuZF9nZXRfZGV2X2NvdW50IC0gMS4KKyAqLworUEpfREVDTChjb25zdCBwam1lZGlhX3NuZF9kZXZfaW5mbyopIHBqbWVkaWFfc25kX2dldF9kZXZfaW5mbyh1bnNpZ25lZCBpbmRleCk7CisKKworLyoqCisgKiBTZXQgc291bmQgZGV2aWNlIGxhdGVuY3ksIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHNvdW5kIGRldmljZQorICogb3BlbmVkLCBvciBvdGhlcndpc2UgZGVmYXVsdCBsYXRlbmN5IHNldHRpbmcgd2lsbCBiZSB1c2VkLCBAc2VlCisgKiBQSk1FRElBX1NORF9ERUZBVUxUX1JFQ19MQVRFTkNZICYgUEpNRURJQV9TTkRfREVGQVVMVF9QTEFZX0xBVEVOQ1kuCisgKgorICogQ2hvb3NpbmcgbGF0ZW5jeSB2YWx1ZSBpcyBub3Qgc3RyYWlnaHRmb3J3YXJkLCBpdCBzaG91bGQgYWNjb21vZGF0ZSBib3RoIAorICogbWluaW11bSBsYXRlbmN5IGFuZCBzdGFiaWxpdHkuIExvd2VyIGxhdGVuY3kgdGVuZHMgdG8gY2F1c2Ugc291bmQgZGV2aWNlIAorICogbGVzcyByZWxpYWJsZSAocHJvZHVjaW5nIGF1ZGlvIGRyb3BvdXRzKSBvbiBDUFUgbG9hZCBkaXN0dXJiYW5jZS4gTW9yZW92ZXIsCisgKiB0aGUgYmVzdCBsYXRlbmN5IHNldHRpbmcgbWF5IHZhcnkgYmFzZWQgb24gbWFueSBhc3BlY3RzLCBlLmc6IHNvdW5kIGNhcmQsIAorICogQ1BVLCBPUywga2VybmVsLCBldGMuCisgKgorICogQHBhcmFtIGlucHV0X2xhdGVuY3kJICAgIFRoZSBsYXRlbmN5IG9mIGlucHV0IGRldmljZSwgaW4gbXMsIHNldCB0byAwCisgKgkJCSAgICBmb3IgZGVmYXVsdCBQSk1FRElBX1NORF9ERUZBVUxUX1JFQ19MQVRFTkNZLgorICogQHBhcmFtIG91dHB1dF9sYXRlbmN5ICAgIFRoZSBsYXRlbmN5IG9mIG91dHB1dCBkZXZpY2UsIGluIG1zLCBzZXQgdG8gMAorICoJCQkgICAgZm9yIGRlZmF1bHQgUEpNRURJQV9TTkRfREVGQVVMVF9QTEFZX0xBVEVOQ1kuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfc2V0X2xhdGVuY3kodW5zaWduZWQgaW5wdXRfbGF0ZW5jeSwgCisJCQkJCSAgICAgdW5zaWduZWQgb3V0cHV0X2xhdGVuY3kpOworCisKKy8qKgorICogQ3JlYXRlIHNvdW5kIHN0cmVhbSBmb3IgYm90aCBjYXB0dXJpbmcgYXVkaW8gYW5kIGF1ZGlvIHBsYXliYWNrLCAgZnJvbSB0aGUgCisgKiBzYW1lIGRldmljZS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNyZWF0ZSBzaW11bHRhbmVvdXMgcmVjb3JkZXIgCisgKiBhbmQgcGxheWVyIHN0cmVhbXMgKGluc3RlYWQgb2YgY3JlYXRpbmcgc2VwYXJhdGUgY2FwdHVyZSBhbmQgcGxheWJhY2sKKyAqIHN0cmVhbXMpLCBiZWNhdXNlIGl0IHdvcmtzIG9uIGJhY2tlbmRzIHRoYXQgZG9lcyBub3QgYWxsb3cKKyAqIGEgZGV2aWNlIHRvIGJlIG9wZW5lZCBtb3JlIHRoYW4gb25jZS4KKyAqCisgKiBAcGFyYW0gcmVjX2lkCSAgICBEZXZpY2UgaW5kZXggZm9yIHJlY29yZGVyL2NhcHR1cmUgc3RyZWFtLCBvcgorICoJCQkgICAgLTEgdG8gdXNlIHRoZSBmaXJzdCBjYXBhYmxlIGRldmljZS4KKyAqIEBwYXJhbSBwbGF5X2lkCSAgICBEZXZpY2UgaW5kZXggZm9yIHBsYXliYWNrIHN0cmVhbSwgb3IgLTEgdG8gdXNlIAorICoJCQkgICAgdGhlIGZpcnN0IGNhcGFibGUgZGV2aWNlLgorICogQHBhcmFtIGNsb2NrX3JhdGUJICAgIFNvdW5kIGRldmljZSdzIGNsb2NrIHJhdGUgdG8gc2V0LgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIFNldCBudW1iZXIgb2YgY2hhbm5lbHMsIDEgZm9yIG1vbm8sIG9yIDIgZm9yCisgKgkJCSAgICBzdGVyZW8uIFRoZSBjaGFubmVsIGNvdW50IGRldGVybWluZXMgdGhlIGZvcm1hdAorICoJCQkgICAgb2YgdGhlIGZyYW1lLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBTZXQgdGhlIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUuIFRoZSBub3JtYWwgCisgKgkJCSAgICB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgMTYgYml0cyBwZXIgc2FtcGxlLgorICogQHBhcmFtIHJlY19jYgkgICAgQ2FsbGJhY2sgdG8gaGFuZGxlIGNhcHR1cmVkIGF1ZGlvIHNhbXBsZXMuCisgKiBAcGFyYW0gcGxheV9jYgkgICAgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNvdW5kIHBsYXllciBuZWVkcworICoJCQkgICAgbW9yZSBhdWRpbyBzYW1wbGVzIHRvIHBsYXkuCisgKiBAcGFyYW0gdXNlcl9kYXRhCSAgICBVc2VyIGRhdGEgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0gcF9zbmRfc3RybQkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBzdHJlYW0gaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfb3BlbihpbnQgcmVjX2lkLAorCQkJCSAgICAgIGludCBwbGF5X2lkLAorCQkJCSAgICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkgICAgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkgICAgICB1bnNpZ25lZCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJICAgICAgcGptZWRpYV9zbmRfcmVjX2NiIHJlY19jYiwKKwkJCQkgICAgICBwam1lZGlhX3NuZF9wbGF5X2NiIHBsYXlfY2IsCisJCQkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCSAgICAgIHBqbWVkaWFfc25kX3N0cmVhbSAqKnBfc25kX3N0cm0pOworCisKKy8qKgorICogQ3JlYXRlIGEgdW5pZGlyZWN0aW9uYWwgYXVkaW8gc3RyZWFtIGZvciBjYXB0dXJpbmcgYXVkaW8gc2FtcGxlcyBmcm9tCisgKiB0aGUgc291bmQgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBpbmRleAkJICAgIERldmljZSBpbmRleCwgb3IgLTEgdG8gbGV0IHRoZSBsaWJyYXJ5IGNob29zZSB0aGUgCisgKgkJCSAgICBmaXJzdCBhdmFpbGFibGUgZGV2aWNlLgorICogQHBhcmFtIGNsb2NrX3JhdGUJICAgIFNvdW5kIGRldmljZSdzIGNsb2NrIHJhdGUgdG8gc2V0LgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIFNldCBudW1iZXIgb2YgY2hhbm5lbHMsIDEgZm9yIG1vbm8sIG9yIDIgZm9yCisgKgkJCSAgICBzdGVyZW8uIFRoZSBjaGFubmVsIGNvdW50IGRldGVybWluZXMgdGhlIGZvcm1hdAorICoJCQkgICAgb2YgdGhlIGZyYW1lLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBTZXQgdGhlIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUuIFRoZSBub3JtYWwgCisgKgkJCSAgICB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgMTYgYml0cyBwZXIgc2FtcGxlLgorICogQHBhcmFtIHJlY19jYgkgICAgQ2FsbGJhY2sgdG8gaGFuZGxlIGNhcHR1cmVkIGF1ZGlvIHNhbXBsZXMuCisgKiBAcGFyYW0gdXNlcl9kYXRhCSAgICBVc2VyIGRhdGEgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0gcF9zbmRfc3RybQkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBzdHJlYW0gaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfb3Blbl9yZWMoIGludCBpbmRleCwKKwkJCQkJICAgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJICAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJCSAgIHVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgcGptZWRpYV9zbmRfcmVjX2NiIHJlY19jYiwKKwkJCQkJICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgICBwam1lZGlhX3NuZF9zdHJlYW0gKipwX3NuZF9zdHJtKTsKKworLyoqCisgKiBDcmVhdGUgYSB1bmlkaXJlY3Rpb25hbCBhdWRpbyBzdHJlYW0gZm9yIHBsYXlpbmcgYXVkaW8gc2FtcGxlcyB0byB0aGUKKyAqIHNvdW5kIGRldmljZS4KKyAqCisgKiBAcGFyYW0gaW5kZXgJCSAgICBEZXZpY2UgaW5kZXgsIG9yIC0xIHRvIGxldCB0aGUgbGlicmFyeSBjaG9vc2UgdGhlIAorICoJCQkgICAgZmlyc3QgYXZhaWxhYmxlIGRldmljZS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBTb3VuZCBkZXZpY2UncyBjbG9jayByYXRlIHRvIHNldC4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzLCAxIGZvciBtb25vLCBvciAyIGZvcgorICoJCQkgICAgc3RlcmVvLiBUaGUgY2hhbm5lbCBjb3VudCBkZXRlcm1pbmVzIHRoZSBmb3JtYXQKKyAqCQkJICAgIG9mIHRoZSBmcmFtZS4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gYml0c19wZXJfc2FtcGxlICAgU2V0IHRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLiBUaGUgbm9ybWFsIAorICoJCQkgICAgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIDE2IGJpdHMgcGVyIHNhbXBsZS4KKyAqIEBwYXJhbSBwbGF5X2NiCSAgICBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc291bmQgcGxheWVyIG5lZWRzCisgKgkJCSAgICBtb3JlIGF1ZGlvIHNhbXBsZXMgdG8gcGxheS4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJICAgIFVzZXIgZGF0YSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4KKyAqIEBwYXJhbSBwX3NuZF9zdHJtCSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHN0cmVhbSBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NuZF9vcGVuX3BsYXllciggaW50IGluZGV4LAorCQkJCQkgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCSB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJIHVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJIHBqbWVkaWFfc25kX3BsYXlfY2IgcGxheV9jYiwKKwkJCQkJIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJIHBqbWVkaWFfc25kX3N0cmVhbSAqKnBfc25kX3N0cm0gKTsKKworCisvKioKKyAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBsaXZlIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RybQkJVGhlIHN0cmVhbSB0byBiZSBxdWVyaWVkLgorICogQHBhcmFtIHBpCQlQb2ludGVyIHRvIHN0cmVhbSBpbmZvcm1hdGlvbiB0byBiZSBmaWxsZWQgdXAgd2l0aAorICoJCQlpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzcyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfc3RyZWFtX2dldF9pbmZvKHBqbWVkaWFfc25kX3N0cmVhbSAqc3RybSwKKwkJCQkJCSBwam1lZGlhX3NuZF9zdHJlYW1faW5mbyAqcGkpOworCisKKy8qKgorICogU3RhcnQgdGhlIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSByZWNvcmRlciBvciBwbGF5ZXIgc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVplcm8gb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfc3RyZWFtX3N0YXJ0KHBqbWVkaWFfc25kX3N0cmVhbSAqc3RyZWFtKTsKKworLyoqCisgKiBTdG9wIHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgcmVjb3JkZXIgb3IgcGxheWVyIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlaZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc25kX3N0cmVhbV9zdG9wKHBqbWVkaWFfc25kX3N0cmVhbSAqc3RyZWFtKTsKKworLyoqCisgKiBEZXN0cm95IHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgcmVjb3JkZXIgb2YgcGxheWVyIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlaZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc25kX3N0cmVhbV9jbG9zZShwam1lZGlhX3NuZF9zdHJlYW0gKnN0cmVhbSk7CisKKy8qKgorICogRGVpbml0aWFsaXplIHNvdW5kIGxpYnJhcnkuCisgKgorICogQHJldHVybgkJWmVybyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NuZF9kZWluaXQodm9pZCk7CisKKworCisvKioKKyAqIEB9CisgKi8KKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1NPVU5EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmRfcG9ydC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc291bmRfcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGM5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zb3VuZF9wb3J0LmgKQEAgLTAsMCArMSwzNTIgQEAKKy8qICRJZDogc291bmRfcG9ydC5oIDQwODIgMjAxMi0wNC0yNCAxMzowOToxNFogYmVubnlscCAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfU09VTkRfUE9SVF9IX18KKyNkZWZpbmUgX19QSk1FRElBX1NPVU5EX1BPUlRfSF9fCisKKy8qKgorICogQGZpbGUgc291bmRfcG9ydC5oCisgKiBAYnJpZWYgTWVkaWEgcG9ydCBjb25uZWN0aW9uIGFic3RyYWN0aW9uIHRvIHNvdW5kIGRldmljZS4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEtYXVkaW9kZXYvYXVkaW9kZXYuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2Nsb2NrLmg+CisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfU05EX1BPUlQgU291bmQgRGV2aWNlIFBvcnQKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVF9DTE9DSworICogQGJyaWVmIE1lZGlhIFBvcnQgQ29ubmVjdGlvbiBBYnN0cmFjdGlvbiB0byB0aGUgU291bmQgRGV2aWNlCisgQHsKKworIEFzIGV4cGxhaW5lZCBpbiBAcmVmIFBKTUVEX1NORCwgdGhlIHNvdW5kIGhhcmR3YXJlIGFic3RyYWN0aW9uIHByb3ZpZGVzCisgc29tZSBjYWxsYmFja3MgZm9yIGl0cyB1c2VyOgorIC0gaXQgY2FsbHMgPGI+PHR0PnJlY19jYjwvdHQ+PC9iPiBjYWxsYmFjayB3aGVuIGl0IGhhcyBmaW5pc2hlZCBjYXB0dXJpbmcKKyAgIG9uZSBtZWRpYSBmcmFtZSwgYW5kIAorIC0gaXQgY2FsbHMgPGI+PHR0PnBsYXlfY2I8L3R0PjwvYj4gd2hlbiBpdCBuZWVkcyBtZWRpYSBmcmFtZSB0byBiZSAKKyAgIHBsYXllZCB0byB0aGUgc291bmQgcGxheWJhY2sgaGFyZHdhcmUuCisKKyBUaGUgQHJlZiBQSk1FRF9TTkRfUE9SVCAodGhlIG9iamVjdCBiZWluZyBleHBsYWluZWQgaGVyZSkgYWRkIGEKKyB0aGluIHdyYXBwZXIgdG8gdGhlIGhhcmR3YXJlIGFic3RyYWN0aW9uOgorIC0gaXQgd2lsbCBjYWxsIGRvd25zdHJlYW0gcG9ydCdzIDx0dD5wdXRfZnJhbWUoKTwvdHQ+CisgICB3aGVuIDxiPjx0dD5yZWNfY2IoKTwvdHQ+PC9iPiBpcyBjYWxsZWQgKGkuZS4gd2hlbiB0aGUgc291bmQgaGFyZHdhcmUgCisgICBoYXMgZmluaXNoZWQgY2FwdHVyaW5nIGZyYW1lKSwgYW5kIAorIC0gaXQgd2lsbCBjYWxsIGRvd25zdHJlYW0gcG9ydCdzIDx0dD5nZXRfZnJhbWUoKTwvdHQ+IHdoZW4gCisgICA8Yj48dHQ+cGxheV9jYigpPC90dD48L2I+IGlzIGNhbGxlZCAoaS5lLiBldmVyeSB0aW1lIHRoZSAKKyAgIHNvdW5kIGhhcmR3YXJlIG5lZWRzIG1vcmUgZnJhbWVzIHRvIGJlIHBsYXllZCB0byB0aGUgcGxheWJhY2sgaGFyZHdhcmUpLgorCisgVGhpcyBzaW1wbGUgYWJzdHJhY3Rpb24gZW5hYmxlcyBtZWRpYSB0byBmbG93IGF1dG9tYXRpY2FsbHkgKGFuZAorIGluIHRpbWVseSBtYW5uZXIpIGZyb20gdGhlIGRvd25zdHJlYW0gbWVkaWEgcG9ydCB0byB0aGUgc291bmQgZGV2aWNlLgorIEluIG90aGVyIHdvcmRzLCB0aGUgc291bmQgZGV2aWNlIHBvcnQgc3VwcGxpZXMgbWVkaWEgY2xvY2sgdG8KKyB0aGUgcG9ydHMuIFRoZSBtZWRpYSBjbG9jayBjb25jZXB0IGlzIGV4cGxhaW5lZCBpbiBAcmVmIFBKTUVESUFfUE9SVF9DTE9DSworIHNlY3Rpb24uCisKKyBBcHBsaWNhdGlvbiByZWdpc3RlcnMgZG93bnN0cmVhbSBwb3J0IHRvIHRoZSBzb3VuZCBkZXZpY2UgcG9ydCBieQorIGNhbGxpbmcgI3BqbWVkaWFfc25kX3BvcnRfY29ubmVjdCgpOworIAorICovCisKKy8qKgorICogU291bmQgcG9ydCBvcHRpb25zLgorICovCitlbnVtIHBqbWVkaWFfc25kX3BvcnRfb3B0aW9uCit7CisgICAgLyoqIAorICAgICAqIERvbid0IHN0YXJ0IHRoZSBhdWRpbyBkZXZpY2Ugd2hlbiBjcmVhdGluZyBhIHNvdW5kIHBvcnQuCisgICAgICovICAgIAorICAgIFBKTUVESUFfU05EX1BPUlRfTk9fQVVUT19TVEFSVCA9IDEKK307CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgc3BlY2lmaWVzIHRoZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSB0aGUgc291bmQgcG9ydC4KKyAqIFVzZSBwam1lZGlhX3NuZF9wb3J0X3BhcmFtX2RlZmF1bHQoKSB0byBpbml0aWFsaXplIHRoaXMgc3RydWN0dXJlIHdpdGgKKyAqIGRlZmF1bHQgdmFsdWVzIChtb3N0bHkgemVyb2VzKQorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3NuZF9wb3J0X3BhcmFtCit7CisgICAgLyoqCisgICAgICogQmFzZSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcGptZWRpYV9hdWRfcGFyYW0gYmFzZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTb3VuZCBwb3J0IGNyZWF0aW9uIG9wdGlvbnMuCisgICAgICovCisgICAgdW5zaWduZWQgb3B0aW9uczsKKworICAgIC8qKgorICAgICAqIEVjaG8gY2FuY2VsbGF0aW9uIG9wdGlvbnMvZmxhZ3MuCisgICAgICovCisgICAgdW5zaWduZWQgZWNfb3B0aW9uczsKKworfSBwam1lZGlhX3NuZF9wb3J0X3BhcmFtOworCisvKioKKyAqIEluaXRpYWxpemUgcGptZWRpYV9zbmRfcG9ydF9wYXJhbSB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICoKKyAqIEBwYXJhbSBwcm0JCSAgICBUaGUgcGFyYW1ldGVyLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfc25kX3BvcnRfcGFyYW1fZGVmYXVsdChwam1lZGlhX3NuZF9wb3J0X3BhcmFtICpwcm0pOworCisvKioKKyAqIFRoaXMgb3BhcXVlIHR5cGUgZGVzY3JpYmVzIHNvdW5kIGRldmljZSBwb3J0IGNvbm5lY3Rpb24uCisgKiBTb3VuZCBkZXZpY2UgcG9ydCBpcyBub3QgYSBtZWRpYSBwb3J0LCBidXQgaXQgaXMgdXNlZCB0byBjb25uZWN0IG1lZGlhCisgKiBwb3J0IHRvIHRoZSBzb3VuZCBkZXZpY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc25kX3BvcnQgcGptZWRpYV9zbmRfcG9ydDsKKworCisvKioKKyAqIENyZWF0ZSBiaWRpcmVjdGlvbmFsIHNvdW5kIHBvcnQgZm9yIGJvdGggY2FwdHVyaW5nIGFuZCBwbGF5YmFjayBvZgorICogYXVkaW8gc2FtcGxlcy4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgc291bmQgcG9ydCBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gcmVjX2lkCSAgICBEZXZpY2UgaW5kZXggZm9yIHJlY29yZGVyL2NhcHR1cmUgc3RyZWFtLCBvcgorICoJCQkgICAgLTEgdG8gdXNlIHRoZSBmaXJzdCBjYXBhYmxlIGRldmljZS4KKyAqIEBwYXJhbSBwbGF5X2lkCSAgICBEZXZpY2UgaW5kZXggZm9yIHBsYXliYWNrIHN0cmVhbSwgb3IgLTEgdG8gdXNlIAorICoJCQkgICAgdGhlIGZpcnN0IGNhcGFibGUgZGV2aWNlLgorICogQHBhcmFtIGNsb2NrX3JhdGUJICAgIFNvdW5kIGRldmljZSdzIGNsb2NrIHJhdGUgdG8gc2V0LgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIFNldCBudW1iZXIgb2YgY2hhbm5lbHMsIDEgZm9yIG1vbm8sIG9yIDIgZm9yCisgKgkJCSAgICBzdGVyZW8uIFRoZSBjaGFubmVsIGNvdW50IGRldGVybWluZXMgdGhlIGZvcm1hdAorICoJCQkgICAgb2YgdGhlIGZyYW1lLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBTZXQgdGhlIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUuIFRoZSBub3JtYWwgCisgKgkJCSAgICB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgMTYgYml0cyBwZXIgc2FtcGxlLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE9wdGlvbnMgZmxhZy4KKyAqIEBwYXJhbSBwX3BvcnQJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgc291bmQgZGV2aWNlIHBvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgKgkJCSAgICBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NuZF9wb3J0X2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICBpbnQgcmVjX2lkLAorCQkJCQkgICAgICBpbnQgcGxheV9pZCwKKwkJCQkJICAgICAgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJICAgICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgICAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICAgICAgcGptZWRpYV9zbmRfcG9ydCAqKnBfcG9ydCk7CisKKy8qKgorICogQ3JlYXRlIHVuaWRpcmVjdGlvbmFsIHNvdW5kIGRldmljZSBwb3J0IGZvciBjYXB0dXJpbmcgYXVkaW8gc3RyZWFtcyBmcm9tIAorICogdGhlIHNvdW5kIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgc291bmQgcG9ydCBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gaW5kZXgJCSAgICBEZXZpY2UgaW5kZXgsIG9yIC0xIHRvIGxldCB0aGUgbGlicmFyeSBjaG9vc2UgdGhlIAorICoJCQkgICAgZmlyc3QgYXZhaWxhYmxlIGRldmljZS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBTb3VuZCBkZXZpY2UncyBjbG9jayByYXRlIHRvIHNldC4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzLCAxIGZvciBtb25vLCBvciAyIGZvcgorICoJCQkgICAgc3RlcmVvLiBUaGUgY2hhbm5lbCBjb3VudCBkZXRlcm1pbmVzIHRoZSBmb3JtYXQKKyAqCQkJICAgIG9mIHRoZSBmcmFtZS4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gYml0c19wZXJfc2FtcGxlICAgU2V0IHRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLiBUaGUgbm9ybWFsIAorICoJCQkgICAgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIDE2IGJpdHMgcGVyIHNhbXBsZS4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb25zIGZsYWcuCisgKiBAcGFyYW0gcF9wb3J0CSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHNvdW5kIGRldmljZSBwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfcG9ydF9jcmVhdGVfcmVjKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCSBpbnQgaW5kZXgsCisJCQkJCQkgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJCSB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkJIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkJIHVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCSB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkJIHBqbWVkaWFfc25kX3BvcnQgKipwX3BvcnQpOworCQkJCQkgICAgICAKKy8qKgorICogQ3JlYXRlIHVuaWRpcmVjdGlvbmFsIHNvdW5kIGRldmljZSBwb3J0IGZvciBwbGF5aW5nIGF1ZGlvIHN0cmVhbXMgd2l0aCB0aGUgCisgKiBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgc291bmQgcG9ydCBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gaW5kZXgJCSAgICBEZXZpY2UgaW5kZXgsIG9yIC0xIHRvIGxldCB0aGUgbGlicmFyeSBjaG9vc2UgdGhlIAorICoJCQkgICAgZmlyc3QgYXZhaWxhYmxlIGRldmljZS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBTb3VuZCBkZXZpY2UncyBjbG9jayByYXRlIHRvIHNldC4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzLCAxIGZvciBtb25vLCBvciAyIGZvcgorICoJCQkgICAgc3RlcmVvLiBUaGUgY2hhbm5lbCBjb3VudCBkZXRlcm1pbmVzIHRoZSBmb3JtYXQKKyAqCQkJICAgIG9mIHRoZSBmcmFtZS4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gYml0c19wZXJfc2FtcGxlICAgU2V0IHRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLiBUaGUgbm9ybWFsIAorICoJCQkgICAgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIDE2IGJpdHMgcGVyIHNhbXBsZS4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb25zIGZsYWcuCisgKiBAcGFyYW0gcF9wb3J0CSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHNvdW5kIGRldmljZSBwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfcG9ydF9jcmVhdGVfcGxheWVyKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJCSAgICBpbnQgaW5kZXgsCisJCQkJCQkgICAgdW5zaWduZWQgY2xvY2tfcmF0ZSwKKwkJCQkJCSAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkJICAgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkJICAgIHVuc2lnbmVkIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCSAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkJICAgIHBqbWVkaWFfc25kX3BvcnQgKipwX3BvcnQpOworCisKKy8qKgorICogQ3JlYXRlIHNvdW5kIGRldmljZSBwb3J0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHBvb2wJCSAgICBQb29sIHRvIGFsbG9jYXRlIHNvdW5kIHBvcnQgc3RydWN0dXJlLgorICogQHBhcmFtIHBybQkJICAgIFNvdW5kIHBvcnQgcGFyYW1ldGVyLgorICogQHBhcmFtIHBfcG9ydAkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSBzb3VuZCBkZXZpY2UgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IKKyAqCQkJICAgIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc25kX3BvcnRfY3JlYXRlMihwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgIGNvbnN0IHBqbWVkaWFfc25kX3BvcnRfcGFyYW0gKnBybSwKKwkJCQkJICAgICAgcGptZWRpYV9zbmRfcG9ydCAqKnBfcG9ydCk7CisKKworLyoqCisgKiBEZXN0cm95IHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEBwYXJhbSBzbmRfcG9ydAkgICAgVGhlIHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfcG9ydF9kZXN0cm95KHBqbWVkaWFfc25kX3BvcnQgKnNuZF9wb3J0KTsKKworCisvKioKKyAqIFJldHJpZXZlIHRoZSBzb3VuZCBzdHJlYW0gYXNzb2NpYXRlZCBieSB0aGlzIHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEBwYXJhbSBzbmRfcG9ydAkgICAgVGhlIHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEByZXR1cm4JCSAgICBUaGUgc291bmQgc3RyZWFtIGluc3RhbmNlLgorICovCitQSl9ERUNMKHBqbWVkaWFfYXVkX3N0cmVhbSopIHBqbWVkaWFfc25kX3BvcnRfZ2V0X3NuZF9zdHJlYW0oCisJCQkJCQlwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCk7CisKKworLyoqCisgKiBDaGFuZ2UgdGhlIGVjaG8gY2FuY2VsbGF0aW9uIHNldHRpbmdzLiBUaGUgZWNobyBjYW5jZWxsYXRpb24gc2V0dGluZ3MgCisgKiBzaG91bGQgaGF2ZSBiZWVuIHNwZWNpZmllZCB3aGVuIHRoaXMgc291bmQgcG9ydCB3YXMgY3JlYXRlZCwgYnkgc2V0dGluZworICogdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBpbiB0aGUgcGptZWRpYV9hdWRfcGFyYW0sIGJlY2F1c2Ugbm90IGFsbCBzb3VuZAorICogZGV2aWNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGNoYW5naW5nIHRoZSBFQyBzZXR0aW5nIG9uY2UgdGhlIGRldmljZQorICogaGFzIGJlZW4gb3BlbmVkLgorICoKKyAqIFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gd2hldGhlciBkZXZpY2Ugb3Igc29mdHdhcmUgQUVDCisgKiBpcyBiZWluZyB1c2VkLiBJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIEFFQywgdGhpcyBmdW5jdGlvbiB3aWxsIGZvcndhcmQKKyAqIHRoZSBjaGFuZ2UgcmVxdWVzdCB0byB0aGUgZGV2aWNlIGFuZCBpdCB3aWxsIGJlIHVwIHRvIHRoZSBkZXZpY2Ugd2hldGhlcgorICogdG8gc3VwcG9ydCB0aGUgcmVxdWVzdC4gSWYgc29mdHdhcmUgQUVDIGlzIGJlaW5nIHVzZWQgKHRoZSBzb2Z0d2FyZSBFQworICogd2lsbCBiZSB1c2VkIGlmIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBBRUMpLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGNoYW5nZSB0aGUgc29mdHdhcmUgRUMgc2V0dGluZ3MuCisgKgorICogQHBhcmFtIHNuZF9wb3J0CSAgICBUaGUgc291bmQgZGV2aWNlIHBvcnQuCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gcmUtY3JlYXRlIHRoZSBlY2hvIGNhbmNlbGxlciBpZiBuZWNlc3NhcnkuCisgKiBAcGFyYW0gdGFpbF9tcwkgICAgTWF4aW11bSBlY2hvIHRhaWwgbGVuZ3RoIHRvIGJlIHN1cHBvcnRlZCwgaW4KKyAqCQkJICAgIG1pbGlzZWNvbmRzLiBJZiB6ZXJvIGlzIHNwZWNpZmllZCwgdGhlIEVDIHdvdWxkCisgKgkJCSAgICBiZSBkaXNhYmxlZC4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBUaGUgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gI3BqbWVkaWFfZWNob19jcmVhdGUoKS4KKyAqCQkJICAgIFRoaXMgaXMgb25seSB1c2VkIGlmIHNvZnR3YXJlIEVDIGlzIGJlaW5nIHVzZWQuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfcG9ydF9zZXRfZWMoIHBqbWVkaWFfc25kX3BvcnQgKnNuZF9wb3J0LAorCQkJCQkgICAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgIHVuc2lnbmVkIHRhaWxfbXMsCisJCQkJCSAgICAgIHVuc2lnbmVkIG9wdGlvbnMpOworCisKKy8qKgorICogR2V0IGN1cnJlbnQgZWNobyBjYW5jZWxsZXIgdGFpbCBsZW5ndGgsIGluIG1pbGlzZWNvbmRzLiBUaGUgdGFpbCBsZW5ndGggCisgKiB3aWxsIGJlIHplcm8gaWYgRUMgaXMgbm90IGVuYWJsZWQuCisgKgorICogQHBhcmFtIHNuZF9wb3J0CSAgICBUaGUgc291bmQgZGV2aWNlIHBvcnQuCisgKiBAcGFyYW0gcF9sZW5ndGgJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgdGFpbCBsZW5ndGguCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zbmRfcG9ydF9nZXRfZWNfdGFpbChwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCwKKwkJCQkJCSAgdW5zaWduZWQgKnBfbGVuZ3RoKTsKKworCisvKioKKyAqIEdldCBhIGNsb2NrIHNvdXJjZSBmcm9tIHRoZSBzb3VuZCBwb3J0LgorICoKKyAqIEBwYXJhbSBzbmRfcG9ydCAgVGhlIHNvdW5kIHBvcnQuCisgKiBAcGFyYW0gZGlyICAgICAgIFNvdW5kIHBvcnQncyBkaXJlY3Rpb24uCisgKgorICogQHJldHVybgkgICAgVGhlIGNsb2NrIHNvdXJjZS4KKyAqLworUEpfREVDTChwam1lZGlhX2Nsb2NrX3NyYyAqKQorcGptZWRpYV9zbmRfcG9ydF9nZXRfY2xvY2tfc3JjKCBwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9kaXIgZGlyICk7CisKKworLyoqCisgKiBDb25uZWN0IGEgcG9ydCB0byB0aGUgc291bmQgZGV2aWNlIHBvcnQuIElmIHRoZSBzb3VuZCBkZXZpY2UgcG9ydCBoYXMgYQorICogc291bmQgcmVjb3JkZXIgZGV2aWNlLCB0aGVuIHRoaXMgd2lsbCBzdGFydCBwZXJpb2RpYyBmdW5jdGlvbiBjYWxsIHRvCisgKiB0aGUgcG9ydCdzIHB1dF9mcmFtZSgpIGZ1bmN0aW9uLiBJZiB0aGUgc291bmQgZGV2aWNlIGhhcyBhIHNvdW5kIHBsYXllcgorICogZGV2aWNlLCB0aGVuIHRoaXMgd2lsbCBzdGFydCBwZXJpb2RpYyBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwb3J0J3MKKyAqIGdldF9mcmFtZSgpIGZ1bmN0aW9uLgorICoKKyAqIEZvciB0aGlzIHZlcnNpb24gb2YgUEpNRURJQSwgdGhlIG1lZGlhIHBvcnQgTVVTVCBoYXZlIHRoZSBzYW1lIGF1ZGlvCisgKiBzZXR0aW5ncyBhcyB0aGUgc291bmQgZGV2aWNlIHBvcnQsIG9yIG90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiB3aWxsCisgKiBmYWlsLiBUaGlzIG1lYW5zIHRoZSBwb3J0IE1VU1QgaGF2ZSB0aGUgc2FtZSBjbG9ja19yYXRlLCBjaGFubmVsIGNvdW50LAorICogc2FtcGxlcyBwZXIgZnJhbWUsIGFuZCBiaXRzIHBlciBzYW1wbGUgYXMgdGhlIHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEBwYXJhbSBzbmRfcG9ydAkgICAgVGhlIHNvdW5kIGRldmljZSBwb3J0LgorICogQHBhcmFtIHBvcnQJCSAgICBUaGUgbWVkaWEgcG9ydCB0byBiZSBjb25uZWN0ZWQuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgKgkJCSAgICBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NuZF9wb3J0X2Nvbm5lY3QocGptZWRpYV9zbmRfcG9ydCAqc25kX3BvcnQsCisJCQkJCSAgICAgIHBqbWVkaWFfcG9ydCAqcG9ydCk7CisKKworLyoqCisgKiBSZXRyaWV2ZSB0aGUgcG9ydCBpbnN0YW5jZSBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhlIHNvdW5kIHBvcnQsIGlmIGFueS4KKyAqCisgKiBAcGFyYW0gc25kX3BvcnQJICAgIFRoZSBzb3VuZCBkZXZpY2UgcG9ydC4KKyAqCisgKiBAcmV0dXJuCQkgICAgVGhlIHBvcnQgaW5zdGFuY2UgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSAKKyAqCQkJICAgIHNvdW5kIGRldmljZSBwb3J0LCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIHBvcnQKKyAqCQkJICAgIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgc291bmQgZGV2aWNlIHBvcnQuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9wb3J0KikgcGptZWRpYV9zbmRfcG9ydF9nZXRfcG9ydChwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCk7CisKKworLyoqCisgKiBEaXNjb25uZWN0IGN1cnJlbnRseSBhdHRhY2hlZCBwb3J0IGZyb20gdGhlIHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEBwYXJhbSBzbmRfcG9ydAkgICAgVGhlIHNvdW5kIGRldmljZSBwb3J0LgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc25kX3BvcnRfZGlzY29ubmVjdChwam1lZGlhX3NuZF9wb3J0ICpzbmRfcG9ydCk7CisKKworLyoqCisgKiBAfQorICovCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9TT1VORF9QT1JUX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zcGxpdGNvbWIuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3NwbGl0Y29tYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zcGxpdGNvbWIuaApAQCAtMCwwICsxLDE0MCBAQAorLyogJElkOiBzcGxpdGNvbWIuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfU1BMSVRDT01CX0hfXworI2RlZmluZSBfX1BKTUVESUFfU1BMSVRDT01CX0hfXworCisKKy8qKgorICogQGZpbGUgc3BsaXRjb21iLmgKKyAqIEBicmllZiBNZWRpYSBjaGFubmVsIHNwbGl0dGVyL2NvbWJpbmVyIHBvcnQuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3BvcnQuaD4KKworCisvKioKKyAqIEBhZGR0b2dyb3VwIFBKTUVESUFfU1BMSVRDT01CIE1lZGlhIGNoYW5uZWwgc3BsaXR0ZXIvY29tYmluZXIKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVAorICogQGJyaWVmIFNwbGl0IGFuZCBjb21iaW5lIG11bHRpcGxlIG1vbm8tY2hhbm5lbCBtZWRpYSBwb3J0cyBpbnRvCisgKiAgYSBzaW5nbGUgbXVsdGlwbGUtY2hhbm5lbHMgbWVkaWEgcG9ydAorICogQHsKKyAqCisgKiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIG1lZGlhIHBvcnQgdG8gc3BsaXQgYW5kIGNvbWJpbmUgbWVkaWEKKyAqIGNoYW5uZWxzIGluIHRoZSBzdHJlYW0uCisgKgorICogQSBzcGxpdHRlci9jb21iaW5lciBzcGxpdHMgYSBzaW5nbGUgc3RlcmVvL211bHRpY2hhbm5lbHMgYXVkaW8gZnJhbWUgaW50bworICogbXVsdGlwbGUgYXVkaW8gZnJhbWVzIHRvIGVhY2ggY2hhbm5lbCB3aGVuIHB1dF9mcmFtZSgpIGlzIGNhbGxlZCwgCisgKiBhbmQgY29tYmluZXMgbW9ubyBmcmFtZXMgZnJvbSBlYWNoIGNoYW5uZWwgaW50byBhIHN0ZXJlby9tdWx0aWNoYW5uZWwgCisgKiBmcmFtZSB3aGVuIGdldF9mcmFtZSgpIGlzIGNhbGxlZC4gQSBjb21tb24gYXBwbGljYXRpb24gZm9yIHRoZSBzcGxpdHRlci8KKyAqIGNvbWJpbmVyIGlzIHRvIHNwbGl0IGZyYW1lcyBmcm9tIHN0ZXJlbyB0byBtb25vIGFuZCB2aXNlIHZlcnNhLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIENyZWF0ZSBhIG1lZGlhIHNwbGl0dGVyL2NvbWJpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICogV2hlbiB0aGUgc3BsaXR0ZXIvY29tYmluZXIgaXMgY3JlYXRlZCwgaXQgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZgorICogcGptZWRpYV9wb3J0LiBUaGlzIG1lZGlhIHBvcnQgcmVwcmVzZW50cyB0aGUgc3RlcmVvL211bHRpY2hhbm5lbCBzaWRlCisgKiBvZiB0aGUgc3BsaXR0ZXIvY29tYmluZXIuIEFwcGxpY2F0aW9uIG5lZWRzIHRvIHN1cHBseSB0aGUgc3BsaXR0ZXIvCisgKiBjb21iaW5lciB3aXRoIGEgbWVkaWEgcG9ydCBmb3IgZWFjaCBhdWRpbyBjaGFubmVscy4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGNyZWF0ZSB0aGUgc3BsaXR0ZXIvCisgKgkJCSAgICBjb21iaW5lci4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBBdWRpbyBjbG9jayByYXRlL3NhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkgICAgTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBCaXRzIHBlciBzYW1wbGUuCisgKiBAcGFyYW0gb3B0aW9ucwkgICAgT3B0aW9uYWwgZmxhZ3MuCisgKiBAcGFyYW0gcF9zcGxpdGNvbWIJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgc3BsaXR0ZXIvY29tYmluZXIuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlCisgKgkJCSAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NwbGl0Y29tYl9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkgICAgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJICAgICAgdW5zaWduZWQgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgICAgICBwam1lZGlhX3BvcnQgKipwX3NwbGl0Y29tYik7CisKKy8qKgorICogU3VwcGx5IHRoZSBzcGxpdHRlci9jb21iaW5lciB3aXRoIG1lZGlhIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCAKKyAqIG51bWJlci4gVGhlIG1lZGlhIHBvcnQgd2lsbCBiZSBjYWxsZWQgYXQgdGhlCisgKiBzYW1lIHBoYXNlIGFzIHRoZSBzcGxpdHRlci9jb21iaW5lcjsgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIGFwcGxpY2F0aW9uCisgKiBjYWxscyBnZXRfZnJhbWUoKSBvZiB0aGUgc3BsaXR0ZXIvY29tYmluZXIsIGl0IHdpbGwgY2FsbCBnZXRfZnJhbWUoKQorICogZm9yIGFsbCBwb3J0cyB0aGF0IGhhdmUgdGhlIHNhbWUgcGhhc2UuIEFuZCBzaW1pbGFybHkgZm9yIHB1dF9mcmFtZSgpLgorICoKKyAqIEBwYXJhbSBzcGxpdGNvbWIJICAgIFRoZSBzcGxpdHRlci9jb21iaW5lci4KKyAqIEBwYXJhbSBjaF9udW0JICAgIEF1ZGlvIGNoYW5uZWwgc3RhcnRpbmcgbnVtYmVyICh6ZXJvIGJhc2VkKS4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBNdXN0IGJlIHplcm8gYXQgdGhlIG1vbWVudC4KKyAqIEBwYXJhbSBwb3J0CQkgICAgVGhlIG1lZGlhIHBvcnQuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgKgkJCSAgICBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3NwbGl0Y29tYl9zZXRfY2hhbm5lbChwam1lZGlhX3BvcnQgKnNwbGl0Y29tYiwKKwkJCQkJCSAgIHVuc2lnbmVkIGNoX251bSwKKwkJCQkJCSAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCQkgICBwam1lZGlhX3BvcnQgKnBvcnQpOworCisvKioKKyAqIENyZWF0ZSBhIHJldmVyc2UgcGhhc2UgbWVkaWEgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsIG51bWJlci4KKyAqIEZvciBjaGFubmVscyB3aXRoIHJldmVyc2VkIHBoYXNlLCB3aGVuIGFwcGxpY2F0aW9uIGNhbGxzIHB1dF9mcmFtZSgpIHRvCisgKiB0aGUgc3BsaXR0ZXIvY29tYmluZXIsIHRoZSBzcGxpdHRlci9jb21iaW5lciB3aWxsIG9ubHkgcHV0IHRoZSBmcmFtZSB0bworICogYSBidWZmZXIuIExhdGVyIG9uLCB3aGVuIGFwcGxpY2F0aW9uIGNhbGxzIGdldF9mcmFtZSgpIG9uIHRoZSBjaGFubmVsJ3MKKyAqIG1lZGlhIHBvcnQsIGl0IHdpbGwgcmV0dXJuIHRoZSBmcmFtZSB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4KKyAqIFRoZSBzYW1lIHByb2Nlc3MgaGFwcGVucyB3aGVuIGFwcGxpY2F0aW9uIGNhbGxzIHB1dF9mcmFtZSgpIHRvIHRoZQorICogY2hhbm5lbCdzIG1lZGlhIHBvcnQsIGl0IHdpbGwgb25seSBwdXQgdGhlIGZyYW1lIHRvIGFub3RoZXIgYnVmZmVyLCB3aGljaAorICogd2lsbCBiZSByZXR1cm5lZCB3aGVuIGFwcGxpY2F0aW9uIGNhbGxzIGdldF9mcmFtZSgpIHRvIHRoZSBzcGxpdHRlcidzIAorICogbWVkaWEgcG9ydC4gU28gdGhpcyBlZmZlY3RpdmVseSByZXZlcnNlIHRoZSBwaGFzZSBvZiB0aGUgbWVkaWEgcG9ydC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFRoZSBwb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvcnQgYW5kCisgKgkJCSAgICBidWZmZXJzLgorICogQHBhcmFtIHNwbGl0Y29tYgkgICAgVGhlIHNwbGl0dGVyL2NvbWJpbmVyLgorICogQHBhcmFtIGNoX251bQkgICAgQXVkaW8gY2hhbm5lbCBzdGFydGluZyBudW1iZXIgKHplcm8gYmFzZWQpLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE5vcm1hbGx5IGlzIHplcm8sIGJ1dCB0aGUgbG93ZXIgOC1iaXQgb2YgdGhlIAorICoJCQkgICAgb3B0aW9ucyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgCisgKgkJCSAgICBidWZmZXJzIGluIHRoZSBjaXJjdWxhciBidWZmZXIuIElmIHplcm8sIHRoZW4KKyAqCQkJICAgIGRlZmF1bHQgbnVtYmVyIHdpbGwgYmUgdXNlZCAoZGVmYXVsdDogOCkuCisgKiBAcGFyYW0gcF9jaHBvcnQJICAgIFRoZSBtZWRpYSBwb3J0IGNyZWF0ZWQgd2l0aCByZXZlcnNlIHBoYXNlIGZvcgorICoJCQkgICAgdGhlIHNwZWNpZmllZCBhdWRpbyBjaGFubmVsLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3NwbGl0Y29tYl9jcmVhdGVfcmV2X2NoYW5uZWwoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgICBwam1lZGlhX3BvcnQgKnNwbGl0Y29tYiwKKwkJCQkgICAgICB1bnNpZ25lZCBjaF9udW0sCisJCQkJICAgICAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkgICAgICBwam1lZGlhX3BvcnQgKipwX2NocG9ydCk7CisKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9TUExJVENPTUJfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RlcmVvLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zdGVyZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg2OTIyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RlcmVvLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qICRJZDogc3RlcmVvLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1NURVJFT19IX18KKyNkZWZpbmUgX19QSk1FRElBX1NURVJFT19IX18KKworLyoqCisgKiBAZmlsZSBzdGVyZW8uaAorICogQGJyaWVmIE1vbm9jaGFubmVsIGFuZCBtdWx0aWNoYW5uZWwgY29udmVydGVyLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL2Vycm5vLmg+CisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisjaW5jbHVkZSA8cGptZWRpYS90eXBlcy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfU1RFUkVPIE1vbm9jaGFubmVsIGFuZCBtdWx0aWNoYW5uZWwgYXVkaW8gZnJhbWUgY29udmVydGVyCisgKiBAaW5ncm91cCBQSk1FRElBX0ZSQU1FX09QCisgKiBAYnJpZWYgTW9ubyAtIG11bHRpLWNoYW5uZWxzIGF1ZGlvIGNvbnZlcnNpb24KKyAqIEB7CisgKgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIE11bHRpY2hhbm5lbCB0byBtb25vY2hhbm5lbCBjb252ZXJzaW9uIG1peGVzIHNhbXBsZXMgZnJvbSBhbGwgY2hhbm5lbHMKKyAqIGludG8gdGhlIG1vbm9jaGFubmVsLgorICovCisjZGVmaW5lIFBKTUVESUFfU1RFUkVPX01JWCAgUEpfVFJVRQorCisKKworLyoqCisgKiBNdWx0aWNoYW5uZWwgdG8gbW9ub2NoYW5uZWwgY29udmVyc2lvbiwgaXQgaGFzIHR3byBvcGVyYXRpb24gbW9kZSBzcGVjaWZpZWQKKyAqIGJ5IHBhcmFtIG9wdGlvbnMsIEBzZWUgcGptZWRpYV9zdGVyZW9fb3B0aW9ucy4gVGhpcyBmdW5jdGlvbiBjYW4gd29yayBzYWZlbHkKKyAqIHVzaW5nIHRoZSBzYW1lIGJ1ZmZlciAoaW4gcGxhY2UgY29udmVyc2lvbikuCisgKgorICogQHBhcmFtIG1vbm8JCSAgICBPdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSBtb25vIGZyYW1lIGV4dHJhY3RlZCAKKyAqCQkJICAgIGZyb20gdGhlIG11bHRpY2hhbm5lbHMgZnJhbWUuCisgKiBAcGFyYW0gbXVsdGkJCSAgICBJbnB1dCBmcmFtZSBjb250YWluaW5nIG11bHRpY2hhbm5lbHMgYXVkaW8uCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkgICAgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBpbnB1dCBmcmFtZS4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZnJhbWUuCisgKiBAcGFyYW0gbWl4CQkgICAgSWYgdGhlIHZhbHVlIGlzIFBKX1RSVUUgdGhlbiB0aGUgaW5wdXQgY2hhbm5lbHMgCisgKgkJCSAgICB3aWxsIGJlIG1peGVkIHRvIHByb2R1Y2Ugb3V0cHV0IGZyYW1lLCBvdGhlcndpc2UKKyAqCQkJICAgIG9ubHkgZnJhbWUgZnJvbSBjaGFubmVsX3NyYyB3aWxsIGJlIGNvcGllZCB0byB0aGUKKyAqCQkJICAgIG91dHB1dCBmcmFtZS4KKyAqIEBwYXJhbSBjaGFubmVsX3NyYwkgICAgV2hlbiBtaXhpbmcgaXMgZGlzYWJsZWQsIHRoZSBtb25vIG91dHB1dCBmcmFtZQorICoJCQkgICAgd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGlzIGNoYW5uZWwgbnVtYmVyLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3M7CisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV9jb252ZXJ0X2NoYW5uZWxfbnRvMShwal9pbnQxNl90IG1vbm9bXSwKKwkJCQkJCSAgICBjb25zdCBwal9pbnQxNl90IG11bHRpW10sCisJCQkJCQkgICAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJCSAgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJCSAgICBwal9ib29sX3QgbWl4LAorCQkJCQkJICAgIHVuc2lnbmVkIGNoYW5uZWxfc3JjKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG1vbm8gJiYgbXVsdGkgJiYgY2hhbm5lbF9jb3VudCAmJiBzYW1wbGVzX3Blcl9mcmFtZSAmJgorCQkgICAgIGNoYW5uZWxfc3JjIDwgY2hhbm5lbF9jb3VudCwgIFBKX0VJTlZBTCk7CisKKyAgICBpZiAobWl4PT1QSl9GQUxTRSkgeworCWZvciAoaSA9IGNoYW5uZWxfc3JjOyBpIDwgc2FtcGxlc19wZXJfZnJhbWU7IGkgKz0gY2hhbm5lbF9jb3VudCkgeworCSAgICAqbW9ubyA9IG11bHRpW2ldOworCSAgICArK21vbm87CisJfQorICAgIH0gZWxzZSB7CisJdW5zaWduZWQgajsKKwlmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc19wZXJfZnJhbWU7IGkgKz0gY2hhbm5lbF9jb3VudCkgeworCSAgICBpbnQgdG1wID0gMDsKKwkgICAgZm9yKGogPSAwOyBqIDwgY2hhbm5lbF9jb3VudDsgKytqKQorCQl0bXAgKz0gbXVsdGlbaStqXTsKKworCSAgICBpZiAodG1wID4gMzI3NjcpIHRtcCA9IDMyNzY3OworCSAgICBlbHNlIGlmICh0bXAgPCAtMzI3NjgpIHRtcCA9IC0zMjc2ODsKKwkgICAgKm1vbm8gPSAocGpfaW50MTZfdCkgdG1wOworCSAgICArK21vbm87CisJfQorICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qKgorICogTW9ub2NoYW5uZWwgdG8gbXVsdGljaGFubmVsIGNvbnZlcnNpb24sIGl0IHdpbGwganVzdCBkdXBsaWNhdGUgdGhlIHNhbXBsZXMKKyAqIGZyb20gbW9ub2NoYW5uZWwgZnJhbWUgdG8gYWxsIGNoYW5uZWxzIGluIHRoZSBtdWx0aWNoYW5uZWwgZnJhbWUuIAorICogVGhpcyBmdW5jdGlvbiBjYW4gd29yayBzYWZlbHkgdXNpbmcgdGhlIHNhbWUgYnVmZmVyIChpbiBwbGFjZSBjb252ZXJzaW9uKQorICogYXMgbG9uZyBhcyB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggZm9yIHRoZSBtdWx0aWNoYW5uZWwgc2FtcGxlcy4KKyAqCisgKiBAcGFyYW0gbXVsdGkJCSAgICBPdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSBtdWx0aWNoYW5uZWxzIGZyYW1lIAorICoJCQkgICAgbWl4ZWQgZnJvbSB0aGUgbW9ubyBmcmFtZS4KKyAqIEBwYXJhbSBtb25vCQkgICAgVGhlIGlucHV0IG1vbm9jaGFubmVsIGF1ZGlvIGZyYW1lLgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIERlc2lyZWQgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBvdXRwdXQgZnJhbWUuCisgKiBAcGFyYW0gc2FtcGxlc19wZXJfZnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGZyYW1lLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE9wdGlvbnMgZm9yIGNvbnZlcnNpb24sIGN1cnJlbnRseSBtdXN0IGJlIHplcm8uCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2VzczsKKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX2NvbnZlcnRfY2hhbm5lbF8xdG9uKHBqX2ludDE2X3QgbXVsdGlbXSwKKwkJCQkJCSAgICBjb25zdCBwal9pbnQxNl90IG1vbm9bXSwKKwkJCQkJCSAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkJICAgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkJICAgIHVuc2lnbmVkIG9wdGlvbnMpCit7CisgICAgY29uc3QgcGpfaW50MTZfdCAqc3JjOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihtb25vICYmIG11bHRpICYmIGNoYW5uZWxfY291bnQgJiYgc2FtcGxlc19wZXJfZnJhbWUsIAorCQkgICAgIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihvcHRpb25zID09IDAsIFBKX0VJTlZBTCk7CisKKyAgICBQSl9VTlVTRURfQVJHKG9wdGlvbnMpOworCisgICAgc3JjID0gbW9ubyArIHNhbXBsZXNfcGVyX2ZyYW1lIC0gMTsKKyAgICBzYW1wbGVzX3Blcl9mcmFtZSAqPSBjaGFubmVsX2NvdW50OworICAgIHdoaWxlIChzYW1wbGVzX3Blcl9mcmFtZSkgeworCXVuc2lnbmVkIGk7CisJZm9yIChpPTE7IGk8PWNoYW5uZWxfY291bnQ7ICsraSkKKwkgICAgbXVsdGlbc2FtcGxlc19wZXJfZnJhbWUtaV0gPSAqc3JjOworCXNhbXBsZXNfcGVyX2ZyYW1lIC09IGNoYW5uZWxfY291bnQ7CisJLS1zcmM7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqIAorICogT3B0aW9ucyBmb3IgY2hhbm5lbCBjb252ZXJ0ZXIgcG9ydC4gVGhlICNwam1lZGlhX3N0ZXJlb19vcHRpb25zIGlzIGFsc28KKyAqIHZhbGlkIGZvciB0aGlzIHBvcnQgb3B0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfc3RlcmVvX3BvcnRfb3B0aW9ucworeworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcG9ydCBzaG91bGQgbm90IGRlc3Ryb3kgZG93bnN0cmVhbSBwb3J0IHdoZW4gCisgICAgICogdGhpcyBwb3J0IGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBQSk1FRElBX1NURVJFT19ET05UX0RFU1RST1lfRE4gID0gNAorfSBwam1lZGlhX3N0ZXJlb19wb3J0X29wdGlvbnM7CisKKworLyoqCisgKiBDcmVhdGUgYSBtb25vLW11bHRpIGNoYW5uZWwgY29udmVydGVyIHBvcnQuIFRoaXMgY3JlYXRlcyBhIGNvbnZlcnRlciBzZXNzaW9uLAorICogd2hpY2ggd2lsbCBhZGp1c3QgdGhlIHNhbXBsZXMgb2YgYXVkaW8gZnJhbWUgdG8gYSBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudAorICogd2hlbiB0aGUgcG9ydCdzIGdldF9mcmFtZSgpIGFuZCBwdXRfZnJhbWUoKSBpcyBjYWxsZWQuCisgKgorICogV2hlbiB0aGUgcG9ydCdzIGdldF9mcmFtZSgpIGlzIGNhbGxlZCwgdGhpcyBwb3J0IHdpbGwgZ2V0IGEgZnJhbWUgZnJvbSAKKyAqIHRoZSBkb3duc3RyZWFtIHBvcnQgYW5kIGNvbnZlcnQgdGhlIGZyYW1lIHRvIHRoZSB0YXJnZXQgY2hhbm5lbCBjb3VudCBiZWZvcmUKKyAqIHJldHVybmluZyBpdCB0byB0aGUgY2FsbGVyLgorICoKKyAqIFdoZW4gdGhlIHBvcnQncyBwdXRfZnJhbWUoKSBpcyBjYWxsZWQsIHRoaXMgcG9ydCB3aWxsIGNvbnZlcnQgdGhlIGZyYW1lCisgKiB0byB0aGUgZG93bnN0cmVhbSBwb3J0J3MgY2hhbm5lbCBjb3VudCBiZWZvcmUgZ2l2aW5nIHRoZSBmcmFtZSB0byB0aGUgCisgKiBkb3duc3RyZWFtIHBvcnQuCisgKgorICogQHBhcmFtIHBvb2wJCQlQb29sIHRvIGFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgYW5kIGJ1ZmZlcnMuCisgKiBAcGFyYW0gZG5fcG9ydAkJVGhlIGRvd25zdHJlYW0gcG9ydCwgd2hpY2ggY2hhbm5lbCBjb3VudCBpcyB0bworICoJCQkJYmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgY2hhbm5lbCBjb3VudC4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CQlUaGlzIHBvcnQgY2hhbm5lbCBjb3VudC4KKyAqIEBwYXJhbSBvcHRpb25zCQlCaXRtYXNrIGZsYWdzIGZyb20gI3BqbWVkaWFfc3RlcmVvX3BvcnRfb3B0aW9ucworICoJCQkJYW5kIGFsc28gYXBwbGljYXRpb24gbWF5IGFkZCBQSk1FRElBX1NURVJFT19NSVgKKyAqCQkJCXRvIG1peCBjaGFubmVscy4KKyAqCQkJCVdoZW4gdGhpcyBmbGFnIGlzIHplcm8sIHRoZSBkZWZhdWx0IGJlaGF2aW9yCisgKgkJCQlpcyB0byB1c2Ugc2ltcGxlIE4tdG8tMSBjaGFubmVsIGNvbnZlcnRlciBhbmQgCisgKgkJCQl0byBkZXN0cm95IGRvd25zdHJlYW0gcG9ydCB3aGVuIHRoaXMgcG9ydCBpcyAKKyAqCQkJCWRlc3Ryb3llZC4KKyAqIEBwYXJhbSBwX3BvcnQJCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgc3RlcmVvIHBvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybiBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc3RlcmVvX3BvcnRfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgcGptZWRpYV9wb3J0ICpkbl9wb3J0LAorCQkJCQkJIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCQkgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJCSBwam1lZGlhX3BvcnQgKipwX3BvcnQgKTsKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9TVEVSRU9fSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkZjFjNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbS5oCkBAIC0wLDAgKzEsNDM2IEBACisvKiAkSWQ6IHN0cmVhbS5oIDM4NDEgMjAxMS0xMC0yNCAwOToyODoxM1ogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfU1RSRUFNX0hfXworI2RlZmluZSBfX1BKTUVESUFfU1RSRUFNX0hfXworCisKKy8qKgorICogQGZpbGUgc3RyZWFtLmgKKyAqIEBicmllZiBNZWRpYSBTdHJlYW0uCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvY29kZWMuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2VuZHBvaW50Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9qYnVmLmg+CisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9ydGNwLmg+CisjaW5jbHVkZSA8cGptZWRpYS90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3ZpZF9jb2RlYy5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1NUUk0gU3RyZWFtcworICogQGluZ3JvdXAgUEpNRURJQV9QT1JUCisgKiBAYnJpZWYgQ29tbXVuaWNhdGluZyB3aXRoIHJlbW90ZSBwZWVyIHZpYSB0aGUgbmV0d29yaworICogQHsKKyAqCisgKiBBIG1lZGlhIHN0cmVhbSBpcyBhIGJpZGlyZWN0aW9uYWwgbXVsdGltZWRpYSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdHdvCisgKiBlbmRwb2ludHMuIEl0IGNvcnJlc3BvbmRzIHRvIGEgbWVkaWEgZGVzY3JpcHRpb24gKG09IGxpbmUpIGluIFNEUAorICogc2Vzc2lvbiBkZXNjcmlwdG9yLgorICoKKyAqIEEgbWVkaWEgc3RyZWFtIGNvbnNpc3RzIG9mIHR3byB1bmlkaXJlY3Rpb25hbCBjaGFubmVsczoKKyAqICAtIGVuY29kaW5nIGNoYW5uZWwsIHdoaWNoIHRyYW5zbWl0cyB1bmlkaXJlY3Rpb25hbCBtZWRpYSB0byByZW1vdGUsIGFuZAorICogIC0gZGVjb2RpbmcgY2hhbm5lbCwgd2hpY2ggcmVjZWl2ZXMgdW5pZGlyZWN0aW9uYWwgbWVkaWEgZnJvbSByZW1vdGUuCisgKgorICogQSBtZWRpYSBzdHJlYW0gZXhwb3J0cyBtZWRpYSBwb3J0IGludGVyZmFjZSAoc2VlIEByZWYgUEpNRURJQV9QT1JUKQorICogYW5kIGFwcGxpY2F0aW9uIG5vcm1hbGx5IHVzZXMgdGhpcyBpbnRlcmZhY2UgdG8gaW50ZXJjb25uZWN0IHRoZSBzdHJlYW0KKyAqIHRvIG90aGVyIFBKTUVESUEgY29tcG9uZW50cy4KKyAqCisgKiBBIG1lZGlhIHN0cmVhbSBpbnRlcm5hbGx5IG1hbmFnZXMgdGhlIGZvbGxvd2luZyBvYmplY3RzOgorICogIC0gYW4gaW5zdGFuY2Ugb2YgbWVkaWEgY29kZWMgKHNlZSBAcmVmIFBKTUVESUFfQ09ERUMpLAorICogIC0gYW4gQHJlZiBQSk1FRF9KQlVGLAorICogIC0gdHdvIGluc3RhbmNlcyBvZiBSVFAgc2Vzc2lvbnMgKCNwam1lZGlhX3J0cF9zZXNzaW9uLCBvbmUgZm9yIGVhY2gKKyAqICAgIGRpcmVjdGlvbiksCisgKiAgLSBvbmUgaW5zdGFuY2Ugb2YgUlRDUCBzZXNzaW9uICgjcGptZWRpYV9ydGNwX3Nlc3Npb24pLAorICogIC0gYW5kIGEgcmVmZXJlbmNlIHRvIG1lZGlhIHRyYW5zcG9ydCB0byBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMKKyAqICAgIHRvL2Zyb20gdGhlIG5ldHdvcmsgKHNlZSBAcmVmIFBKTUVESUFfVFJBTlNQT1JUKS4KKyAqCisgKiBTdHJlYW1zIGFyZSBjcmVhdGVkIGJ5IGNhbGxpbmcgI3BqbWVkaWFfc3RyZWFtX2NyZWF0ZSgpLCBzcGVjaWZ5aW5nCisgKiAjcGptZWRpYV9zdHJlYW1faW5mbyBzdHJ1Y3R1cmUgaW4gdGhlIHBhcmFtZXRlci4gQXBwbGljYXRpb24gY2FuIGNvbnN0cnVjdAorICogdGhlICNwam1lZGlhX3N0cmVhbV9pbmZvIHN0cnVjdHVyZSBtYW51YWxseSwgb3IgdXNlIAorICogI3BqbWVkaWFfc3RyZWFtX2luZm9fZnJvbV9zZHAoKSBvciAjcGptZWRpYV9zZXNzaW9uX2luZm9fZnJvbV9zZHAoKSAKKyAqIGZ1bmN0aW9ucyB0byBjb25zdHJ1Y3QgdGhlICNwam1lZGlhX3N0cmVhbV9pbmZvIGZyb20gbG9jYWwgYW5kIHJlbW90ZSAKKyAqIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3JzLgorICoKKyAqIEFwcGxpY2F0aW9uIGNhbiBhbHNvIHVzZSBAcmVmIFBKTUVESUFfU0VTU0lPTiB0byBpbmRpcmVjdGx5IGNyZWF0ZSB0aGUKKyAqIHN0cmVhbXMuCisgKi8KKworLyoqCisgKiBPcGFxdWUgZGVjbGFyYXRpb24gZm9yIG1lZGlhIGNoYW5uZWwuCisgKiBNZWRpYSBjaGFubmVsIGlzIHVuaWRpcmVjdGlvbmFsIGZsb3cgb2YgbWVkaWEgZnJvbSBzZW5kZXIgdG8KKyAqIHJlY2VpdmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2NoYW5uZWwgcGptZWRpYV9jaGFubmVsOworCisvKiogCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgbWVkaWEgc3RyZWFtIGluZm9ybWF0aW9uLiBFYWNoIG1lZGlhIHN0cmVhbQorICogY29ycmVzcG9uZHMgdG8gb25lICJtPSIgbGluZSBpbiBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLCBhbmQgaXQgaGFzCisgKiBpdHMgb3duIFJUUC9SVENQIHNvY2tldCBwYWlyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3N0cmVhbV9pbmZvCit7CisgICAgcGptZWRpYV90eXBlCXR5cGU7CSAgICAvKio8IE1lZGlhIHR5cGUgKGF1ZGlvLCB2aWRlbykJICAgICovCisgICAgcGptZWRpYV90cF9wcm90bwlwcm90bzsJICAgIC8qKjwgVHJhbnNwb3J0IHByb3RvY29sIChSVFAvQVZQLCBldGMuKSAqLworICAgIHBqbWVkaWFfZGlyCQlkaXI7CSAgICAvKio8IE1lZGlhIGRpcmVjdGlvbi4JCSAgICAqLworICAgIHBqX3NvY2thZGRyCQlyZW1fYWRkcjsgICAvKio8IFJlbW90ZSBSVFAgYWRkcmVzcwkJICAgICovCisgICAgcGpfc29ja2FkZHIJCXJlbV9ydGNwOyAgIC8qKjwgT3B0aW9uYWwgcmVtb3RlIFJUQ1AgYWRkcmVzcy4gSWYKKwkJCQkJIHNpbl9mYW1pbHkgaXMgemVybywgdGhlIFJUUCBhZGRyZXNzCisJCQkJCSB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBSVFAuCSAgICAqLworI2lmIGRlZmluZWQoUEpNRURJQV9IQVNfUlRDUF9YUikgJiYgKFBKTUVESUFfSEFTX1JUQ1BfWFIgIT0gMCkKKyAgICBwal9ib29sX3QJCXJ0Y3BfeHJfZW5hYmxlZDsKKwkJCQkgICAgLyoqPCBTcGVjaWZ5IHdoZXRoZXIgUlRDUCBYUiBpcyBlbmFibGVkLiovCisgICAgcGpfdWludDMyX3QJCXJ0Y3BfeHJfaW50ZXJ2YWw7IC8qKjwgUlRDUCBYUiBpbnRlcnZhbC4gICAgICAgICAgICAqLworICAgIHBqX3NvY2thZGRyCQlydGNwX3hyX2Rlc3Q7LyoqPEFkZGl0aW9uYWwgcmVtb3RlIFJUQ1AgWFIgYWRkcmVzcy4KKwkJCQkgICAgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhpcmQtcGFydHkgKGUuZzoKKwkJCQkJIG5ldHdvcmsgbW9uaXRvcikgdG8gbW9uaXRvciB0aGUgCisJCQkJCSBzdHJlYW0uIElmIHNpbl9mYW1pbHkgaXMgemVybywgCisJCQkJCSB0aGlzIHdpbGwgYmUgaWdub3JlZC4JCSAgICAqLworI2VuZGlmCisgICAgcGptZWRpYV9jb2RlY19pbmZvCWZtdDsJICAgIC8qKjwgSW5jb21pbmcgY29kZWMgZm9ybWF0IGluZm8uCSAgICAqLworICAgIHBqbWVkaWFfY29kZWNfcGFyYW0gKnBhcmFtOwkgICAgLyoqPCBPcHRpb25hbCBjb2RlYyBwYXJhbS4JCSAgICAqLworICAgIHVuc2lnbmVkCQl0eF9wdDsJICAgIC8qKjwgT3V0Z29pbmcgY29kZWMgcGF5bGFvZCB0eXBlLgkgICAgKi8KKyAgICB1bnNpZ25lZAkJcnhfcHQ7CSAgICAvKio8IEluY29taW5nIGNvZGVjIHBheWxhb2QgdHlwZS4JICAgICovCisgICAgdW5zaWduZWQJCXR4X21heHB0aW1lOy8qKjwgT3V0Z29pbmcgY29kZWMgbWF4IHB0aW1lLgkgICAgKi8KKyAgICBpbnQJCSAgICAgICAgdHhfZXZlbnRfcHQ7LyoqPCBPdXRnb2luZyBwdCBmb3IgdGVsZXBob25lLWV2ZW50cy4gICovCisgICAgaW50CQkJcnhfZXZlbnRfcHQ7LyoqPCBJbmNvbWluZyBwdCBmb3IgdGVsZXBob25lLWV2ZW50cy4gICovCisgICAgcGpfdWludDMyX3QJCXNzcmM7CSAgICAvKio8IFJUUCBTU1JDLgkJCSAgICAqLworICAgIHBqX3VpbnQzMl90CQlydHBfdHM7CSAgICAvKio8IEluaXRpYWwgUlRQIHRpbWVzdGFtcC4JCSAgICAqLworICAgIHBqX3VpbnQxNl90CQlydHBfc2VxOyAgICAvKio8IEluaXRpYWwgUlRQIHNlcXVlbmNlIG51bWJlci4JICAgICovCisgICAgcGpfdWludDhfdAkJcnRwX3NlcV90c19zZXQ7CisJCQkJICAgIC8qKjwgQml0bWFzayBmbGFncyBpZiBpbml0aWFsIFJUUCBzZXF1ZW5jZSAKKwkJCQkgICAgICAgICBhbmQvb3IgdGltZXN0YW1wIGZvciBzZW5kZXIgYXJlIHNldC4KKwkJCQkJIGJpdCAwL0xTQiA6IHNlcXVlbmNlIGZsYWcgCisJCQkJCSBiaXQgMSAgICAgOiB0aW1lc3RhbXAgZmxhZyAJICAgICovCisgICAgaW50CQkJamJfaW5pdDsgICAgLyoqPCBKaXR0ZXIgYnVmZmVyIGluaXQgZGVsYXkgaW4gbXNlYy4gIAorCQkJCQkgKC0xIGZvciBkZWZhdWx0KS4JCSAgICAqLworICAgIGludAkJCWpiX21pbl9wcmU7IC8qKjwgSml0dGVyIGJ1ZmZlciBtaW5pbXVtIHByZWZldGNoCisJCQkJCSBkZWxheSBpbiBtc2VjICgtMSBmb3IgZGVmYXVsdCkuICAgICovCisgICAgaW50CQkJamJfbWF4X3ByZTsgLyoqPCBKaXR0ZXIgYnVmZmVyIG1heGltdW0gcHJlZmV0Y2gKKwkJCQkJIGRlbGF5IGluIG1zZWMgKC0xIGZvciBkZWZhdWx0KS4gICAgKi8KKyAgICBpbnQJCQlqYl9tYXg7CSAgICAvKio8IEppdHRlciBidWZmZXIgbWF4IGRlbGF5IGluIG1zZWMuICAgKi8KKworI2lmIGRlZmluZWQoUEpNRURJQV9TVFJFQU1fRU5BQkxFX0tBKSAmJiBQSk1FRElBX1NUUkVBTV9FTkFCTEVfS0EhPTAKKyAgICBwal9ib29sX3QJCXVzZV9rYTsJICAgIC8qKjwgU3RyZWFtIGtlZXAtYWxpdmUgYW5kIE5BVCBob2xlIHB1bmNoCisJCQkJCSAoc2VlICNQSk1FRElBX1NUUkVBTV9FTkFCTEVfS0EpCisJCQkJCSBpcyBlbmFibGVkPwkJCSAgICAqLworI2VuZGlmCisgICAgcGpfYm9vbF90ICAgICAgICAgICBydGNwX3NkZXNfYnllX2Rpc2FibGVkOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBhdXRvbWF0aWMgc2VuZGluZyBvZiBSVENQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNERVMgYW5kIEJZRS4gICAgICAgICAgICAgICAgICAgICAgKi8KK30gcGptZWRpYV9zdHJlYW1faW5mbzsKKworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBzdHJlYW0gaW5mbyBiYXNlZCBvbiBpbmZvcm1hdGlvbgorICogaW4gYm90aCBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9ycyBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0gaW5kZXguIAorICogVGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHRha2VuIGZyb20gZGVmYXVsdCBjb2RlYyBwYXJhbWV0ZXJzLiAKKyAqIElmIHNvY2tldCBpbmZvIGFycmF5IGlzIHNwZWNpZmllZCwgdGhlIHNvY2tldCB3aWxsIGJlIGNvcGllZCB0byB0aGUgCisgKiBzZXNzaW9uIGluZm8gYXMgd2VsbC4KKyAqCisgKiBAcGFyYW0gc2kJCVN0cmVhbSBpbmZvIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZC4KKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeS4KKyAqIEBwYXJhbSBlbmRwdAkJUEpNRURJQSBlbmRwb2ludCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBsb2NhbAkJTG9jYWwgU0RQIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqIEBwYXJhbSByZW1vdGUJUmVtb3RlIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gc3RyZWFtX2lkeAlNZWRpYSBzdHJlYW0gaW5kZXggaW4gdGhlIHNlc3Npb24gZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHN0cmVhbSBpbmZvIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkKK3BqbWVkaWFfc3RyZWFtX2luZm9fZnJvbV9zZHAoIHBqbWVkaWFfc3RyZWFtX2luZm8gKnNpLAorCQkJICAgICAgcGpfcG9vbF90ICpwb29sLAorCQkJICAgICAgcGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkgICAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpsb2NhbCwKKwkJCSAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnJlbW90ZSwKKwkJCSAgICAgIHVuc2lnbmVkIHN0cmVhbV9pZHgpOworCisKKy8qKgorICogQ3JlYXRlIGEgbWVkaWEgc3RyZWFtIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyLiBBZnRlciB0aGUgc3RyZWFtCisgKiBoYXMgYmVlbiBjcmVhdGVkLCBhcHBsaWNhdGlvbiBub3JtYWxseSB3b3VsZCB3YW50IHRvIGdldCB0aGUgbWVkaWEgcG9ydCAKKyAqIGludGVyZmFjZSBvZiB0aGUgc3RyZWFtcywgYnkgY2FsbGluZyBwam1lZGlhX3N0cmVhbV9nZXRfcG9ydCgpLiBUaGUgCisgKiBtZWRpYSBwb3J0IGludGVyZmFjZSBleHBvcnRzIHB1dF9mcmFtZSgpIGFuZCBnZXRfZnJhbWUoKSBmdW5jdGlvbiwgdXNlZAorICogdG8gdHJhbnNtaXQgYW5kIHJlY2VpdmUgbWVkaWEgZnJhbWVzIGZyb20gdGhlIHN0cmVhbS4KKyAqCisgKiBXaXRob3V0IGFwcGxpY2F0aW9uIGNhbGxpbmcgcHV0X2ZyYW1lKCkgYW5kIGdldF9mcmFtZSgpLCB0aGVyZSB3aWxsIGJlIAorICogbm8gbWVkaWEgZnJhbWVzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGJ5IHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIGVuZHB0CQlNZWRpYSBlbmRwb2ludC4KKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0cmVhbS4gQSBsYXJnZQorICoJCQludW1iZXIgb2YgbWVtb3J5IG1heSBiZSBuZWVkZWQgYmVjYXVzZSBqaXR0ZXIKKyAqCQkJYnVmZmVyIG5lZWRzIHRvIHByZWFsbG9jYXRlIHNvbWUgc3RvcmFnZS4KKyAqIEBwYXJhbSBpbmZvCQlTdHJlYW0gaW5mb3JtYXRpb24uCisgKiBAcGFyYW0gdHAJCVN0cmVhbSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCB0byB0cmFuc21pdCAKKyAqCQkJYW5kIHJlY2VpdmUgUlRQL1JUQ1AgcGFja2V0cyB0by9mcm9tIHRoZSB1bmRlcmx5aW5nIAorICoJCQl0cmFuc3BvcnQuIAorICogQHBhcmFtIHVzZXJfZGF0YQlBcmJpdHJhcnkgdXNlciBkYXRhIChmb3IgZnV0dXJlIGNhbGxiYWNrIGZlYXR1cmUpLgorICogQHBhcmFtIHBfc3RyZWFtCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgbWVkaWEgc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fY3JlYXRlKHBqbWVkaWFfZW5kcHQgKmVuZHB0LAorCQkJCQkgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgIGNvbnN0IHBqbWVkaWFfc3RyZWFtX2luZm8gKmluZm8sCisJCQkJCSAgIHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCQkJICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgICBwam1lZGlhX3N0cmVhbSAqKnBfc3RyZWFtKTsKKworLyoqCisgKiBEZXN0cm95IHRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgbWVkaWEgc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fZGVzdHJveShwam1lZGlhX3N0cmVhbSAqc3RyZWFtKTsKKworCisvKioKKyAqIEdldCB0aGUgbGFzdCBmcmFtZSB0eXBlIHJldHJlaXZlZCBmcm9tIHRoZSBqaXR0ZXIgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlKaXR0ZXIgYnVmZmVyIGZyYW1lIHR5cGUuCisgKi8KK1BKX0RFRihjaGFyKSBwam1lZGlhX3N0cmVhbV9nZXRfbGFzdF9qYl9mcmFtZV90eXBlKHBqbWVkaWFfc3RyZWFtICpzdHJlYW0pOworCisKKy8qKgorICogR2V0IHRoZSBtZWRpYSBwb3J0IGludGVyZmFjZSBvZiB0aGUgc3RyZWFtLiBUaGUgbWVkaWEgcG9ydCBpbnRlcmZhY2UKKyAqIGRlY2xhcmVzIHB1dF9mcmFtZSgpIGFuZCBnZXRfZnJhbWUoKSBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlIG9ubHkgCisgKiB3YXkgZm9yIGFwcGxpY2F0aW9uIHRvIHRyYW5zbWl0IGFuZCByZWNlaXZlIG1lZGlhIGZyYW1lcyBmcm9tIHRoZQorICogc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIHN0cmVhbS4KKyAqIEBwYXJhbSBwX3BvcnQJUG9pbnRlciB0byByZWNlaXZlIHRoZSBwb3J0IGludGVyZmFjZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc3RyZWFtX2dldF9wb3J0KHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0ICk7CisKKworLyoqCisgKiBHZXQgdGhlIG1lZGlhIHRyYW5zcG9ydCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdAkJVGhlIG1lZGlhIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlUaGUgdHJhbnNwb3J0IG9iamVjdCBiZWluZyB1c2VkIGJ5IHRoZSBzdHJlYW0uCisgKi8KK1BKX0RFQ0wocGptZWRpYV90cmFuc3BvcnQqKSBwam1lZGlhX3N0cmVhbV9nZXRfdHJhbnNwb3J0KHBqbWVkaWFfc3RyZWFtICpzdCk7CisKKworLyoqCisgKiBTdGFydCB0aGUgbWVkaWEgc3RyZWFtLiBUaGlzIHdpbGwgc3RhcnQgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWxzCisgKiBpbiB0aGUgbWVkaWEgc3RyZWFtLCBkZXBlbmRpbmcgb24gdGhlIG1lZGlhIGRpcmVjdGlvbiB0aGF0IHdhcyBzZXQKKyAqIHdoZW4gdGhlIHN0cmVhbSB3YXMgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3N0cmVhbV9zdGFydChwam1lZGlhX3N0cmVhbSAqc3RyZWFtKTsKKworCisvKioKKyAqIEdldCB0aGUgc3RyZWFtIGluZm8uCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgbWVkaWEgc3RyZWFtLgorICogQHBhcmFtIGluZm8JCVN0cmVhbSBpbmZvLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fZ2V0X2luZm8oIGNvbnN0IHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICAgIHBqbWVkaWFfc3RyZWFtX2luZm8gKmluZm8pOworCisvKioKKyAqIEdldCB0aGUgc3RyZWFtIHN0YXRpc3RpY3MuIFNlZSBhbHNvCisgKiAjcGptZWRpYV9zdHJlYW1fZ2V0X3N0YXRfamJ1ZigpCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgbWVkaWEgc3RyZWFtLgorICogQHBhcmFtIHN0YXQJCU1lZGlhIHN0cmVhbSBzdGF0aXN0aWNzLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fZ2V0X3N0YXQoIGNvbnN0IHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICAgIHBqbWVkaWFfcnRjcF9zdGF0ICpzdGF0KTsKKworCisvKioKKyAqIFJlc2V0IHRoZSBzdHJlYW0gc3RhdGlzdGljcy4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3N0cmVhbV9yZXNldF9zdGF0KHBqbWVkaWFfc3RyZWFtICpzdHJlYW0pOworCisKKyNpZiBkZWZpbmVkKFBKTUVESUFfSEFTX1JUQ1BfWFIpICYmIChQSk1FRElBX0hBU19SVENQX1hSICE9IDApCisvKioKKyAqIEdldCB0aGUgc3RyZWFtIGV4dGVuZGVkIHJlcG9ydCBzdGF0aXN0aWNzIChSVENQIFhSKS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBtZWRpYSBzdHJlYW0uCisgKiBAcGFyYW0gc3RhdAkJTWVkaWEgc3RyZWFtIGV4dGVuZGVkIHJlcG9ydCBzdGF0aXN0aWNzLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fZ2V0X3N0YXRfeHIoIGNvbnN0IHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICAgICAgIHBqbWVkaWFfcnRjcF94cl9zdGF0ICpzdGF0KTsKKyNlbmRpZgorCisvKioKKyAqIEdldCBjdXJyZW50IGppdHRlciBidWZmZXIgc3RhdGUuIFNlZSBhbHNvCisgKiAjcGptZWRpYV9zdHJlYW1fZ2V0X3N0YXQoKQorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIHN0cmVhbS4KKyAqIEBwYXJhbSBzdGF0ZQkJSml0dGVyIGJ1ZmZlciBzdGF0ZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc3RyZWFtX2dldF9zdGF0X2pidWYoY29uc3QgcGptZWRpYV9zdHJlYW0gKnN0cmVhbSwKKwkJCQkJCSAgcGptZWRpYV9qYl9zdGF0ZSAqc3RhdGUpOworCisKKy8qKgorICogUGF1c2UgdGhlIGluZGl2aWR1YWwgY2hhbm5lbCBpbiB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIGNoYW5uZWwuCisgKiBAcGFyYW0gZGlyCQlXaGljaCBkaXJlY3Rpb24gdG8gcGF1c2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3N0cmVhbV9wYXVzZSggcGptZWRpYV9zdHJlYW0gKnN0cmVhbSwKKwkJCQkJICAgcGptZWRpYV9kaXIgZGlyKTsKKworLyoqCisgKiBSZXN1bWUgdGhlIGluZGl2aWR1YWwgY2hhbm5lbCBpbiB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIGNoYW5uZWwuCisgKiBAcGFyYW0gZGlyCQlXaGljaCBkaXJlY3Rpb24gdG8gcmVzdW1lLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzczsKKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fcmVzdW1lKHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgIHBqbWVkaWFfZGlyIGRpcik7CisKKy8qKgorICogVHJhbnNtaXQgRFRNRiB0byB0aGlzIHN0cmVhbS4gVGhlIERUTUYgd2lsbCBiZSB0cmFuc21pdHRlZCB1aXNuZworICogUlRQIHRlbGVwaG9uZS1ldmVudHMgYXMgZGVzY3JpYmVkIGluIFJGQyAyODMzLiBUaGlzIG9wZXJhdGlvbiBpcworICogb25seSB2YWxpZCBmb3IgYXVkaW8gc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIHN0cmVhbS4KKyAqIEBwYXJhbSBhc2NpaV9kaWdpdAlTdHJpbmcgY29udGFpbmluZyBkaWdpdHMgdG8gYmUgc2VudCB0byByZW1vdGUuCisgKgkJCUN1cnJlbnRseSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIGFyZSAzMi4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc3RyZWFtX2RpYWxfZHRtZihwam1lZGlhX3N0cmVhbSAqc3RyZWFtLAorCQkJCQkgICAgICBjb25zdCBwal9zdHJfdCAqYXNjaWlfZGlnaXQpOworCisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHN0cmVhbSBoYXMgaW5jb21pbmcgRFRNRiBkaWdpdHMgaW4gdGhlIGluY29taW5nIERUTUYKKyAqIHF1ZXVlLiBJbmNvbWluZyBEVE1GIGRpZ2l0cyByZWNlaXZlZCB2aWEgUkZDIDI4MzMgbWVjaGFuaXNtIGFyZQorICogc2F2ZWQgaW4gdGhlIGluY29taW5nIGRpZ2l0cyBxdWV1ZS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHJldHVybgkJTm9uLXplcm8gKFBKX1RSVUUpIGlmIHRoZSBzdHJlYW0gaGFzIHJlY2VpdmVkIERUTUYKKyAqCQkJZGlnaXRzIGluIHRoZSAuCisgKi8KK1BKX0RFQ0wocGpfYm9vbF90KSBwam1lZGlhX3N0cmVhbV9jaGVja19kdG1mKHBqbWVkaWFfc3RyZWFtICpzdHJlYW0pOworCisKKy8qKgorICogUmV0cmlldmUgdGhlIGluY29taW5nIERUTUYgZGlnaXRzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJlbW92ZSB0aGUgZGlnaXRzCisgKiBmcm9tIHN0cmVhbSdzIERUTUYgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIGRpZ2l0cyBidWZmZXIgd2lsbCBub3QgYmUgTlVMTCAKKyAqIHRlcm1pbmF0ZWQuCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgbWVkaWEgc3RyZWFtLgorICogQHBhcmFtIGFzY2lpX2RpZ2l0cwlCdWZmZXIgdG8gcmVjZWl2ZSB0aGUgZGlnaXRzLiBUaGUgbGVuZ3RoIG9mIHRoaXMKKyAqCQkJYnVmZmVyIGlzIGluZGljYXRlZCBpbiB0aGUgInNpemUiIGFyZ3VtZW50LgorICogQHBhcmFtIHNpemUJCU9uIGlucHV0LCBjb250YWlucyB0aGUgbWF4aW11bSBkaWdpdHMgdG8gYmUgY29waWVkCisgKgkJCXRvIHRoZSBidWZmZXIuCisgKgkJCU9uIG91dHB1dCwgaXQgY29udGFpbnMgdGhlIGFjdHVhbCBkaWdpdHMgdGhhdCBoYXMKKyAqCQkJYmVlbiBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuCQlOb24temVybyAoUEpfVFJVRSkgaWYgdGhlIHN0cmVhbSBoYXMgcmVjZWl2ZWQgRFRNRgorICoJCQlkaWdpdHMgaW4gdGhlIC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9zdHJlYW1fZ2V0X2R0bWYoIHBqbWVkaWFfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICAgIGNoYXIgKmFzY2lpX2RpZ2l0cywKKwkJCQkJICAgICAgdW5zaWduZWQgKnNpemUpOworCisKKy8qKgorICogU2V0IGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB1cG9uIHJlY2VpdmluZyBEVE1GIGRpZ2l0cy4gSWYgY2FsbGJhY2sgaXMKKyAqIHJlZ2lzdGVyZWQsIHRoZSBzdHJlYW0gd2lsbCBub3QgYnVmZmVyIGluY29taW5nIERUTUYgYnV0IHJhdGhlciBjYWxsCisgKiB0aGUgY2FsbGJhY2sgYXMgc29vbiBhcyBEVE1GIGRpZ2l0IGlzIHJlY2VpdmVkIGNvbXBsZXRlbHkuCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgbWVkaWEgc3RyZWFtLgorICogQHBhcmFtIGNiCQlDYWxsYmFjayB0byBiZSBjYWxsZWQgdXBvbiByZWNlaXZpbmcgRFRNRiBkaWdpdHMuCisgKgkJCVRoZSBEVE1GIGRpZ2l0cyB3aWxsIGJlIGdpdmVuIHRvIHRoZSBjYWxsYmFjayBhcworICoJCQlBU0NJSSBkaWdpdHMuCisgKiBAcGFyYW0gdXNlcl9kYXRhCVVzZXIgZGF0YSB0byBiZSByZXR1cm5lZCBiYWNrIHdoZW4gdGhlIGNhbGxiYWNrCisgKgkJCWlzIGNhbGxlZC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3N0cmVhbV9zZXRfZHRtZl9jYWxsYmFjayhwam1lZGlhX3N0cmVhbSAqc3RyZWFtLAorCQkJCSB2b2lkICgqY2IpKHBqbWVkaWFfc3RyZWFtKiwgCisJCQkJCSAgICB2b2lkICp1c2VyX2RhdGEsIAorCQkJCQkgICAgaW50IGRpZ2l0KSwgCisJCQkJIHZvaWQgKnVzZXJfZGF0YSk7CisKKworLyoqCisgKiBTZW5kIFJUQ1AgU0RFUyBmb3IgdGhlIG1lZGlhIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfc3RyZWFtX3NlbmRfcnRjcF9zZGVzKCBwam1lZGlhX3N0cmVhbSAqc3RyZWFtICk7CisKKy8qKgorICogU2VuZCBSVENQIEJZRSBmb3IgdGhlIG1lZGlhIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV9zdHJlYW1fc2VuZF9ydGNwX2J5ZSggcGptZWRpYV9zdHJlYW0gKnN0cmVhbSApOworCisvKioKKyAqIEB9CisgKi8KKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1NUUkVBTV9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbV9jb21tb24uaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3N0cmVhbV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWFhMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3RyZWFtX2NvbW1vbi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qICRJZDogc3RyZWFtX2NvbW1vbi5oIDM2NjQgMjAxMS0wNy0xOSAwMzo0MjoyOFogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1NUUkVBTV9DT01NT05fSF9fCisjZGVmaW5lIF9fUEpNRURJQV9TVFJFQU1fQ09NTU9OX0hfXworCisKKy8qKgorICogQGZpbGUgc3RyZWFtX2NvbW1vbi5oCisgKiBAYnJpZWYgU3RyZWFtIGNvbW1vbiBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvY29kZWMuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3NkcC5oPgorCisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBUaGlzIGlzIGludGVybmFsIGZ1bmN0aW9uIGZvciBwYXJzaW5nIFNEUCBmb3JtYXQgcGFyYW1ldGVyIG9mIHNwZWNpZmljCisgKiBmb3JtYXQgb3IgcGF5bG9hZCB0eXBlLCB1c2VkIGJ5IHN0cmVhbSBpbiBnZW5lcmF0aW5nIHN0cmVhbSBpbmZvIGZyb20gU0RQLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGFsbG9jYXRlIG1lbW9yeSwgaWYgcG9vbCBpcyBOVUxMLCB0aGUgZm10cAorICoJCQlzdHJpbmcgcG9pbnRlcnMgd2lsbCBwb2ludCB0byB0aGUgb3JpZ2luYWwgc3RyaW5nIGluCisgKgkJCXRoZSBTRFAgbWVkaWEgZGVzY3JpcHRvci4KKyAqIEBwYXJhbSBtCQlUaGUgU0RQIG1lZGlhIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBwYXJhbWV0ZXIgdG8KKyAqCQkJYmUgcGFyc2VkLgorICogQHBhcmFtIHB0CQlUaGUgZm9ybWF0IG9yIHBheWxvYWQgdHlwZS4KKyAqIEBwYXJhbSBmbXRwCQlUaGUgZm9ybWF0IHBhcmFtZXRlciB0byBzdG9yZSB0aGUgcGFyc2luZyByZXN1bHQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3N0cmVhbV9pbmZvX3BhcnNlX2ZtdHAocGpfcG9vbF90ICpwb29sLAorCQkJCQkJICAgIGNvbnN0IHBqbWVkaWFfc2RwX21lZGlhICptLAorCQkJCQkJICAgIHVuc2lnbmVkIHB0LAorCQkJCQkJICAgIHBqbWVkaWFfY29kZWNfZm10cCAqZm10cCk7CisKKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYgLyogX19QSk1FRElBX1NUUkVBTV9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS9zeW1iaWFuX3NvdW5kX2Fwcy5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3ltYmlhbl9zb3VuZF9hcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZlMWZhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvc3ltYmlhbl9zb3VuZF9hcHMuaApAQCAtMCwwICsxLDQ4IEBACisvKiAkSWQ6IHN5bWJpYW5fc291bmRfYXBzLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1NZTUJJQU5fU09VTkRfQVBTX0hfXworI2RlZmluZSBfX1BKTUVESUFfU1lNQklBTl9TT1VORF9BUFNfSF9fCisKKworLyoqCisgKiBAZmlsZSBzeW1iaWFuX3NvdW5kX2Fwcy5oCisgKiBAYnJpZWYgU291bmQgZGV2aWNlIHdyYXBwZXIgdXNpbmcgQXVkaW8gUHJveHkgU2VydmVyIG9uIAorICogU3ltYmlhbiBTNjAgM3JkIGVkaXRpb24uCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKK1BKX0JFR0lOX0RFQ0wKKworLyoqCisgKiBTZXQgYXVkaW8gcm91dGluZyBmb3IgQVBTIHNvdW5kIGRldmljZS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSBzb3VuZCBkZXZpY2Ugc3RyZWFtLCB0aGUgc3RyZWFtIHNob3VsZCBiZSBzdGFydGVkIAorICoJCQliZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogQHBhcmFtIHJvdXRlCQlBdWRpbyByb3V0aW5nIHRvIGJlIHNldC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc25kX2Fwc19zZXRfcm91dGUoIHBqbWVkaWFfc25kX3N0cmVhbSAqc3RyZWFtLAorCQkJCQkJcGptZWRpYV9zbmRfcm91dGUgcm91dGUpOworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfU1lNQklBTl9TT1VORF9BUFNfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90b25lZ2VuLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90b25lZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkYzYwMgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RvbmVnZW4uaApAQCAtMCwwICsxLDI5MyBAQAorLyogJElkOiB0b25lZ2VuLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1RPTkVHRU5fUE9SVF9IX18KKyNkZWZpbmUgX19QSk1FRElBX1RPTkVHRU5fUE9SVF9IX18KKworLyoqCisgKiBAZmlsZSB0b25lZ2VuLmgKKyAqIEBicmllZiBUb25lIChzaW5lLCBNRiwgRFRNRikgZ2VuZXJhdG9yIG1lZGlhIHBvcnQuCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3BvcnQuaD4KKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX01GX0RUTUZfVE9ORV9HRU5FUkFUT1IgTXVsdGktZnJlcXVlbmN5IHRvbmUgZ2VuZXJhdG9yCisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBNdWx0aS1mcmVxdWVuY3kgdG9uZSBnZW5lcmF0b3IKKyAqIEB7CisgKgorICogVGhpcyBwYWdlIGRlc2NyaWJlcyB0b25lIGdlbmVyYXRvciBtZWRpYSBwb3J0LiBBIHRvbmUgZ2VuZXJhdG9yIGNhbiBiZQorICogdXNlZCB0byBnZW5lcmF0ZSBhIHNpbmdsZSBmcmVxdWVuY3kgc2luZSB3YXZlIG9yIGR1YWwgZnJlcXVlbmN5IHRvbmVzCisgKiBzdWNoIGFzIERUTUYuCisgKgorICogVGhlIHRvbmUgZ2VuZXJhdG9yIG1lZGlhIHBvcnQgcHJvdmlkZXMgdHdvIGZ1bmN0aW9ucyB0byBnZW5lcmF0ZSB0b25lcy4KKyAqIFRoZSBmdW5jdGlvbiAjcGptZWRpYV90b25lZ2VuX3BsYXkoKSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhcmJpdHJhcnkKKyAqIHNpbmdsZSBvciBkdWFsIGZyZXF1ZW5jeSB0b25lLCBhbmQgI3BqbWVkaWFfdG9uZWdlbl9wbGF5X2RpZ2l0cygpIGlzCisgKiB1c2VkIHRvIHBsYXkgZGlnaXRzIHN1Y2ggYXMgRFRNRi4gRWFjaCB0b25lIHNwZWNpZmllZCBpbiB0aGUgcGxheWJhY2sKKyAqIGZ1bmN0aW9uIGhhcyBpbmRpdmlkdWFsIG9uIGFuZCBvZmYgc2lnbmFsIGR1cmF0aW9uIHRoYXQgbXVzdCBiZQorICogc3BlY2lmaWVkIGJ5IGFwcGxpY2F0aW9uLgorICoKKyAqIEluIG9yZGVyIHRvIHBsYXkgZGlnaXRzIHN1Y2ggYXMgRFRNRiwgdGhlIHRvbmUgZ2VuZXJhdG9yIGlzIGVxdWlwcGVkCisgKiB3aXRoIGRpZ2l0IG1hcCwgd2hpY2ggY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnJlcXVlbmNpZXMgb2YKKyAqIHRoZSBkaWdpdHMuIFRoZSBkZWZhdWx0IGRpZ2l0IG1hcCBpcyBEVE1GICgwLTksYS1kLCosIyksIGJ1dCBhcHBsaWNhdGlvbgorICogbWF5IHNwZWNpZml5IGRpZmZlcmVudCBkaWdpdCBtYXAgdG8gdGhlIHRvbmUgZ2VuZXJhdG9yIGJ5IGNhbGxpbmcKKyAqICNwam1lZGlhX3RvbmVnZW5fc2V0X2RpZ2l0X21hcCgpIGZ1bmN0aW9uLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBpbmRpdmlkdWFsIE1GIGRpZ2l0cyB0byBiZSBwbGF5ZWQKKyAqIHdpdGggI3BqbWVkaWFfdG9uZWdlbl9wbGF5KCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdG9uZV9kZXNjCit7CisgICAgc2hvcnQgICBmcmVxMTsJICAgIC8qKjwgRmlyc3QgZnJlcXVlbmN5LgkJCSAgICAqLworICAgIHNob3J0ICAgZnJlcTI7CSAgICAvKio8IE9wdGlvbmFsIHNlY29uZCBmcmVxdWVuY3kuCQkgICAgKi8KKyAgICBzaG9ydCAgIG9uX21zZWM7CSAgICAvKio8IFBsYXliYWNrIE9OIGR1cmF0aW9uLCBpbiBtaWxpc2Vjb25kcy4JICAgICovCisgICAgc2hvcnQgICBvZmZfbXNlYzsJICAgIC8qKjwgUGxheWJhY2sgT0ZGIGR1cmF0aW9uLCBpbmkgbWlsaXNlY29uZHMuICAgICovCisgICAgc2hvcnQgICB2b2x1bWU7CSAgICAvKio8IFZvbHVtZSAoMS0zMjc2NyksIG9yIDAgZm9yIGRlZmF1bHQsIHdoaWNoCisJCQkJIFBKTUVESUFfVE9ORUdFTl9WT0xVTUUgd2lsbCBiZSB1c2VkLgkgICAgKi8KKyAgICBzaG9ydCAgIGZsYWdzOwkgICAgLyoqPCBDdXJyZW50bHkgaW50ZXJuYWwgZmxhZ3MsIG11c3QgYmUgMAkgICAgKi8KK30gcGptZWRpYV90b25lX2Rlc2M7CisKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBpbmRpdmlkdWFsIE1GIGRpZ2l0cyB0byBiZSBwbGF5ZWQKKyAqIHdpdGggI3BqbWVkaWFfdG9uZWdlbl9wbGF5X2RpZ2l0cygpLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3RvbmVfZGlnaXQKK3sKKyAgICBjaGFyICAgIGRpZ2l0OwkgICAgLyoqPCBUaGUgQVNDSSBpZGVudGlmaWNhdGlvbiBmb3IgdGhlIGRpZ2l0LgkgICAgKi8KKyAgICBzaG9ydCAgIG9uX21zZWM7CSAgICAvKio8IFBsYXliYWNrIE9OIGR1cmF0aW9uLCBpbiBtaWxpc2Vjb25kcy4JICAgICovCisgICAgc2hvcnQgICBvZmZfbXNlYzsJICAgIC8qKjwgUGxheWJhY2sgT0ZGIGR1cmF0aW9uLCBpbmkgbWlsaXNlY29uZHMuICAgICovCisgICAgc2hvcnQgICB2b2x1bWU7CSAgICAvKio8IFZvbHVtZSAoMS0zMjc2NyksIG9yIDAgZm9yIGRlZmF1bHQsIHdoaWNoCisJCQkJIFBKTUVESUFfVE9ORUdFTl9WT0xVTUUgd2lsbCBiZSB1c2VkLgkgICAgKi8KK30gcGptZWRpYV90b25lX2RpZ2l0OworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBkaWdpdCBtYXAgd2hpY2ggaXMgdXNlZCBieSB0aGUgdG9uZSBnZW5lcmF0b3IKKyAqIHRvIHByb2R1Y2UgdG9uZXMgZnJvbSBhbiBBU0NJSSBkaWdpdHMuCisgKiBEaWdpdCBtYXAgdXNlZCBieSBhIHBhcnRpY3VsYXIgdG9uZSBnZW5lcmF0b3IgY2FuIGJlIHJldHJpZXZlZC9zZXQgd2l0aAorICogI3BqbWVkaWFfdG9uZWdlbl9nZXRfZGlnaXRfbWFwKCkgYW5kICNwam1lZGlhX3RvbmVnZW5fc2V0X2RpZ2l0X21hcCgpLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3RvbmVfZGlnaXRfbWFwCit7CisgICAgdW5zaWduZWQgY291bnQ7CSAgICAvKio8IE51bWJlciBvZiBkaWdpdHMgaW4gdGhlIG1hcC4JCSovCisKKyAgICBzdHJ1Y3QgeworCWNoYXIgICAgZGlnaXQ7CSAgICAvKio8IFRoZSBBU0NJIGlkZW50aWZpY2F0aW9uIGZvciB0aGUgZGlnaXQuCSovCisJc2hvcnQgICBmcmVxMTsJICAgIC8qKjwgRmlyc3QgZnJlcXVlbmN5LgkJCSovCisJc2hvcnQgICBmcmVxMjsJICAgIC8qKjwgT3B0aW9uYWwgc2Vjb25kIGZyZXF1ZW5jeS4JCSovCisgICAgfSBkaWdpdHNbMTZdOwkgICAgLyoqPCBBcnJheSBvZiBkaWdpdHMgaW4gdGhlIGRpZ2l0IG1hcC4JKi8KK30gcGptZWRpYV90b25lX2RpZ2l0X21hcDsKKworCisvKioKKyAqIFRvbmUgZ2VuZXJhdG9yIG9wdGlvbnMuCisgKi8KK2VudW0KK3sKKyAgICAvKioKKyAgICAgKiBQbGF5IHRoZSB0b25lcyBpbiBsb29wLCByZXN0YXJ0aW5nIHBsYXlpbmcgdGhlIGZpcnN0IHRvbmUgYWZ0ZXIKKyAgICAgKiB0aGUgbGFzdCB0b25lIGhhcyBiZWVuIHBsYXllZC4KKyAgICAgKi8KKyAgICBQSk1FRElBX1RPTkVHRU5fTE9PUCAgICA9IDEsCisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIG11dGV4IHByb3RlY3Rpb24gdG8gdGhlIHRvbmUgZ2VuZXJhdG9yLgorICAgICAqLworICAgIFBKTUVESUFfVE9ORUdFTl9OT19MT0NLID0gMgorfTsKKworCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0b25lIGdlbmVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAqIFdoZW4gdGhlIHRvbmUgZ2VuZXJhdG9yIGlzIGZpcnN0IGNyZWF0ZWQsIGl0IHdpbGwgYmUgbG9hZGVkIHdpdGggdGhlCisgKiBkZWZhdWx0IGRpZ2l0IG1hcC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9ydCBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gY2xvY2tfcmF0ZQkgICAgU2FtcGxpbmcgcmF0ZS4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBOdW1iZXIgb2YgY2hhbm5lbHMuIEN1cnJlbnRseSBvbmx5IG1vbm8gYW5kIHN0ZXJlbworICoJCQkgICAgYXJlIHN1cHBvcnRlZC4KKyAqIEBwYXJhbSBzYW1wbGVzX3Blcl9mcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUuCisgKiBAcGFyYW0gYml0c19wZXJfc2FtcGxlICAgTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZS4gVGhpcyB2ZXJzaW9uIG9mIFBKTUVESUEKKyAqCQkJICAgIG9ubHkgc3VwcG9ydHMgMTZiaXQgcGVyIHNhbXBsZS4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb24gZmxhZ3MuIEFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IAorICoJCQkgICAgUEpNRURJQV9UT05FR0VOX0xPT1AgdG8gcGxheSB0aGUgdG9uZSBpbiBhIGxvb3AuCisgKiBAcGFyYW0gcF9wb3J0CSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHBvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlCisgKgkJCSAgICBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3RvbmVnZW5fY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCSAgICB1bnNpZ25lZCBjaGFubmVsX2NvdW50LAorCQkJCQkgICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJCSAgICB1bnNpZ25lZCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCSAgICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0KTsKKworCisvKioKKyAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0b25lIGdlbmVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAqIFdoZW4gdGhlIHRvbmUgZ2VuZXJhdG9yIGlzIGZpcnN0IGNyZWF0ZWQsIGl0IHdpbGwgYmUgbG9hZGVkIHdpdGggdGhlCisgKiBkZWZhdWx0IGRpZ2l0IG1hcC4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9ydCBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gbmFtZQkJICAgIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSB0b25lIGdlbmVyYXRvci4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBTYW1wbGluZyByYXRlLgorICogQHBhcmFtIGNoYW5uZWxfY291bnQJICAgIE51bWJlciBvZiBjaGFubmVscy4gQ3VycmVudGx5IG9ubHkgbW9ubyBhbmQgc3RlcmVvCisgKgkJCSAgICBhcmUgc3VwcG9ydGVkLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlLiBUaGlzIHZlcnNpb24gb2YgUEpNRURJQQorICoJCQkgICAgb25seSBzdXBwb3J0cyAxNmJpdCBwZXIgc2FtcGxlLgorICogQHBhcmFtIG9wdGlvbnMJICAgIE9wdGlvbiBmbGFncy4gQXBwbGljYXRpb24gbWF5IHNwZWNpZnkgCisgKgkJCSAgICBQSk1FRElBX1RPTkVHRU5fTE9PUCB0byBwbGF5IHRoZSB0b25lIGluIGEgbG9vcC4KKyAqIEBwYXJhbSBwX3BvcnQJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUKKyAqCQkJICAgIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdG9uZWdlbl9jcmVhdGUyKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICBjb25zdCBwal9zdHJfdCAqbmFtZSwKKwkJCQkJICAgICB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkgICAgIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCSAgICAgdW5zaWduZWQgc2FtcGxlc19wZXJfZnJhbWUsCisJCQkJCSAgICAgdW5zaWduZWQgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCSAgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0KTsKKworCisvKioKKyAqIENoZWNrIGlmIHRoZSB0b25lIGdlbmVyYXRvciBpcyBzdGlsbCBidXN5IHByb2R1Y2luZyBzb21lIHRvbmVzLgorICoKKyAqIEBwYXJhbSB0b25lZ2VuCSAgICBUaGUgdG9uZSBnZW5lcmF0b3IgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIE5vbi16ZXJvIGlmIGJ1c3kuCisgKi8KK1BKX0RFQ0wocGpfYm9vbF90KSBwam1lZGlhX3RvbmVnZW5faXNfYnVzeShwam1lZGlhX3BvcnQgKnRvbmVnZW4pOworCisKKy8qKgorICogSW5zdHJ1Y3QgdGhlIHRvbmUgZ2VuZXJhdG9yIHRvIHN0b3AgY3VycmVudCBwcm9jZXNzaW5nLgorICoKKyAqIEBwYXJhbSB0b25lZ2VuCSAgICBUaGUgdG9uZSBnZW5lcmF0b3IgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90b25lZ2VuX3N0b3AocGptZWRpYV9wb3J0ICp0b25lZ2VuKTsKKworCisvKioKKyAqIFJld2luZCB0aGUgcGxheWJhY2suIFRoaXMgd2lsbCBzdGFydCB0aGUgcGxheWJhY2sgdG8gdGhlIGZpcnN0CisgKiB0b25lIGluIHRoZSBwbGF5YmFjayBsaXN0LgorICoKKyAqIEBwYXJhbSB0b25lZ2VuCSAgICBUaGUgdG9uZSBnZW5lcmF0b3IgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90b25lZ2VuX3Jld2luZChwam1lZGlhX3BvcnQgKnRvbmVnZW4pOworCisKKy8qKgorICogSW5zdHJ1Y3QgdGhlIHRvbmUgZ2VuZXJhdG9yIHRvIHBsYXkgc2luZ2xlIG9yIGR1YWwgZnJlcXVlbmN5IHRvbmVzIAorICogd2l0aCB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uLiBUaGUgbmV3IHRvbmVzIHdpbGwgYmUgYXBwZW5kZWQgdG8gY3VycmVudGx5CisgKiBwbGF5aW5nIHRvbmVzLCB1bmxlc3MgI3BqbWVkaWFfdG9uZWdlbl9zdG9wKCkgaXMgY2FsbGVkIGJlZm9yZSBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uLiBUaGUgcGxheWJhY2sgd2lsbCBiZWdpbiBhcyBzb29uIGFzICB0aGUgZmlyc3QgZ2V0X2ZyYW1lKCkKKyAqIGlzIGNhbGxlZCB0byB0aGUgZ2VuZXJhdG9yLgorICoKKyAqIEBwYXJhbSB0b25lZ2VuCSAgICBUaGUgdG9uZSBnZW5lcmF0b3IgaW5zdGFuY2UuCisgKiBAcGFyYW0gY291bnQJCSAgICBUaGUgbnVtYmVyIG9mIHRvbmVzIGluIHRoZSBhcnJheS4KKyAqIEBwYXJhbSB0b25lcwkJICAgIEFycmF5IG9mIHRvbmVzIHRvIGJlIHBsYXllZC4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb24gZmxhZ3MuIEFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IAorICoJCQkgICAgUEpNRURJQV9UT05FR0VOX0xPT1AgdG8gcGxheSB0aGUgdG9uZSBpbiBhIGxvb3AuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgUEpfRVRPT01BTlkgaWYKKyAqCQkJICAgIHRoZXJlIGFyZSB0b28gbWFueSBkaWdpdHMgaW4gdGhlIHF1ZXVlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3RvbmVnZW5fcGxheShwam1lZGlhX3BvcnQgKnRvbmVnZW4sCisJCQkJCSAgdW5zaWduZWQgY291bnQsCisJCQkJCSAgY29uc3QgcGptZWRpYV90b25lX2Rlc2MgdG9uZXNbXSwKKwkJCQkJICB1bnNpZ25lZCBvcHRpb25zKTsKKworLyoqCisgKiBJbnN0cnVjdCB0aGUgdG9uZSBnZW5lcmF0b3IgdG8gcGxheSBtdWx0aXBsZSBNRiBkaWdpdHMgd2l0aCBlYWNoIG9mCisgKiB0aGUgZGlnaXRzIGhhdmluZyBpbmRpdmlkdWFsIE9OL09GRiBkdXJhdGlvbi4gRWFjaCBvZiB0aGUgZGlnaXQgaW4gdGhlCisgKiBkaWdpdCBhcnJheSBtdXN0IGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvciBpbiB0aGUgZGlnaXQgbWFwLgorICogVGhlIG5ldyB0b25lcyB3aWxsIGJlIGFwcGVuZGVkIHRvIGN1cnJlbnRseSBwbGF5aW5nIHRvbmVzLCB1bmxlc3MgCisgKiAjcGptZWRpYV90b25lZ2VuX3N0b3AoKSBpcyBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiBUaGUgcGxheWJhY2sgd2lsbCBiZWdpbiBhcyBzb29uIGFzIHRoZSBmaXJzdCBnZXRfZnJhbWUoKSBpcyBjYWxsZWQgCisgKiB0byB0aGUgZ2VuZXJhdG9yLgorICoKKyAqIEBwYXJhbSB0b25lZ2VuCSAgICBUaGUgdG9uZSBnZW5lcmF0b3IgaW5zdGFuY2UuCisgKiBAcGFyYW0gY291bnQJCSAgICBOdW1iZXIgb2YgZGlnaXRzIGluIHRoZSBhcnJheS4KKyAqIEBwYXJhbSBkaWdpdHMJICAgIEFycmF5IG9mIE1GIGRpZ2l0cy4KKyAqIEBwYXJhbSBvcHRpb25zCSAgICBPcHRpb24gZmxhZ3MuIEFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IAorICoJCQkgICAgUEpNRURJQV9UT05FR0VOX0xPT1AgdG8gcGxheSB0aGUgdG9uZSBpbiBhIGxvb3AuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgUEpfRVRPT01BTlkgaWYKKyAqCQkJICAgIHRoZXJlIGFyZSB0b28gbWFueSBkaWdpdHMgaW4gdGhlIHF1ZXVlLCBvcgorICoJCQkgICAgUEpNRURJQV9SVFBfRUlORFRNRiBpZiBpbnZhbGlkIGRpZ2l0IGlzCisgKgkJCSAgICBzcGVjaWZpZWQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdG9uZWdlbl9wbGF5X2RpZ2l0cyhwam1lZGlhX3BvcnQgKnRvbmVnZW4sCisJCQkJCQkgdW5zaWduZWQgY291bnQsCisJCQkJCQkgY29uc3QgcGptZWRpYV90b25lX2RpZ2l0IGRpZ2l0c1tdLAorCQkJCQkJIHVuc2lnbmVkIG9wdGlvbnMpOworCisKKy8qKgorICogR2V0IHRoZSBkaWdpdC1tYXAgY3VycmVudGx5IHVzZWQgYnkgdGhpcyB0b25lIGdlbmVyYXRvci4KKyAqCisgKiBAcGFyYW0gdG9uZWdlbgkgICAgVGhlIHRvbmUgZ2VuZXJhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIG0JCSAgICBPbiBvdXRwdXQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHBvaW50ZXIgdG8KKyAqCQkJICAgIHRoZSBkaWdpdG1hcCBjdXJyZW50bHkgdXNlZCBieSB0aGUgdG9uZSBnZW5lcmF0b3IuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90b25lZ2VuX2dldF9kaWdpdF9tYXAocGptZWRpYV9wb3J0ICp0b25lZ2VuLAorCQkJCQkJICAgY29uc3QgcGptZWRpYV90b25lX2RpZ2l0X21hcCAqKm0pOworCisKKy8qKgorICogU2V0IGRpZ2l0IG1hcCB0byBiZSB1c2VkIGJ5IHRoZSB0b25lIGdlbmVyYXRvci4KKyAqCisgKiBAcGFyYW0gdG9uZWdlbgkgICAgVGhlIHRvbmUgZ2VuZXJhdG9yIGluc3RhbmNlLgorICogQHBhcmFtIG0JCSAgICBEaWdpdG1hcCB0byBiZSB1c2VkIGJ5IHRoZSB0b25lIGdlbmVyYXRvci4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3RvbmVnZW5fc2V0X2RpZ2l0X21hcChwam1lZGlhX3BvcnQgKnRvbmVnZW4sCisJCQkJCQkgICBwam1lZGlhX3RvbmVfZGlnaXRfbWFwICptKTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYJLyogX19QSk1FRElBX1RPTkVHRU5fUE9SVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZjOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw4NzYgQEAKKy8qICRJZDogdHJhbnNwb3J0LmggNDM0NSAyMDEzLTAyLTEzIDA3OjQzOjMyWiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1RSQU5TUE9SVF9IX18KKyNkZWZpbmUgX19QSk1FRElBX1RSQU5TUE9SVF9IX18KKworCisvKioKKyAqIEBmaWxlIHRyYW5zcG9ydC5oIE1lZGlhIFRyYW5zcG9ydCBJbnRlcmZhY2UKKyAqIEBicmllZiBUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisjaW5jbHVkZSA8cGptZWRpYS9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1RSQU5TUE9SVCBNZWRpYSBUcmFuc3BvcnQKKyAqIEBicmllZiBUcmFuc3BvcnRzLgorICogQHsKKyAqIFRoZSBtZWRpYSB0cmFuc3BvcnQgKCNwam1lZGlhX3RyYW5zcG9ydCkgaXMgdGhlIG9iamVjdCB0byBzZW5kIGFuZAorICogcmVjZWl2ZSBtZWRpYSBwYWNrZXRzIG92ZXIgdGhlIG5ldHdvcmsuIFRoZSBtZWRpYSB0cmFuc3BvcnQgaW50ZXJmYWNlCisgKiBhbGxvd3MgdGhlIGxpYnJhcnkgdG8gYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgdHlwZXMgb2YgCisgKiB0cmFuc3BvcnRzIHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KKyAqCisgKiBUaGUgbWVkaWEgdHJhbnNwb3J0IGlzIGRlY2xhcmVkIGFzICNwam1lZGlhX3RyYW5zcG9ydCAiY2xhc3MiLCB3aGljaAorICogZGVjbGFyZXMgImludGVyZmFjZXMiIHRvIHVzZSB0aGUgY2xhc3MgaW4gI3BqbWVkaWFfdHJhbnNwb3J0X29wCisgKiBzdHJ1Y3R1cmUuIEZvciB0aGUgdXNlciBvZiB0aGUgbWVkaWEgdHJhbnNwb3J0IChub3JtYWxseSB0aGUgdXNlciBvZgorICogbWVkaWEgdHJhbnNwb3J0IGlzIG1lZGlhIHN0cmVhbSwgc2VlIFxyZWYgUEpNRURfU1RSTSksIHRoZXNlIHRyYW5zcG9ydAorICogIm1ldGhvZHMiIGFyZSB3cmFwcGVkIHdpdGggQVBJIHN1Y2ggYXMgI3BqbWVkaWFfdHJhbnNwb3J0X2F0dGFjaCgpLAorICogc28gaXQgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW5zaWRlIAorICogI3BqbWVkaWFfdHJhbnNwb3J0X29wIGRpcmVjdGx5LgorICoKKyAqIFRoZSBjb25uZWN0aW9uIGJldHdlZW4gXHJlZiBQSk1FRF9TVFJNIGFuZCBtZWRpYSB0cmFuc3BvcnQgaXMgc2hvd24gaW4KKyAqIHRoZSBkaWFncmFtIGJlbG93OgorCisgICBcaW1hZ2UgaHRtbCBtZWRpYS10cmFuc3BvcnQuUE5HCisKKworICogXHNlY3Rpb24gUEpNRURJQV9UUkFOU1BPUlRfSF9VU0lORyBCYXNpYyBNZWRpYSBUcmFuc3BvcnQgVXNhZ2UKKyAqCisgKiBUaGUgbWVkaWEgdHJhbnNwb3J0J3MgbGlmZS1jeWNsZSBub3JtYWxseSBmb2xsb3dzIHRoZSBmb2xsb3dpbmcgc3RhZ2VzLgorICoKKyAqIFxzdWJzZWN0aW9uIFBKTUVESUFfVFJBTlNQT1JUX0hfQ1JFQVRFIENyZWF0aW5nIHRoZSBNZWRpYSBUcmFuc3BvcnQKKyAqCisgKiAgQXBwbGljYXRpb24gY3JlYXRlcyB0aGUgbWVkaWEgdHJhbnNwb3J0IHdoZW4gaXQgbmVlZHMgdG8gZXN0YWJsaXNoCisgKiAgICBtZWRpYSBzZXNzaW9uIHRvIHJlbW90ZSBwZWVyLiBUaGUgbWVkaWEgdHJhbnNwb3J0IGlzIGNyZWF0ZWQgdXNpbmcKKyAqICAgIHNwZWNpZmljIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGF0IHBhcnRpY3VsYXIgdHJhbnNwb3J0OyBmb3IgZXhhbXBsZSwKKyAqICAgIGZvciBVRFAgbWVkaWEgdHJhbnNwb3J0LCBpdCBpcyBjcmVhdGVkIHdpdGggI3BqbWVkaWFfdHJhbnNwb3J0X3VkcF9jcmVhdGUoKQorICogICAgb3IgI3BqbWVkaWFfdHJhbnNwb3J0X3VkcF9jcmVhdGUyKCkgZnVuY3Rpb25zLiBEaWZmZXJlbnQgbWVkaWEKKyAqICAgIHRyYW5zcG9ydHMgd2lsbCBwcm92aWRlIGRpZmZlcmVudCBBUEkgdG8gY3JlYXRlIHRob3NlIHRyYW5zcG9ydHMuCisgKgorICogIEFsdGVybmF0aXZlbHksIGFwcGxpY2F0aW9uIG1heSBjcmVhdGUgcG9vbCBvZiBtZWRpYSB0cmFuc3BvcnRzIHdoZW4KKyAqICAgIGl0IGlzIGZpcnN0IHN0YXJ0ZWQgdXAuIFVzaW5nIHRoaXMgYXBwcm9hY2ggcHJvYmFibHkgaXMgYmV0dGVyLCBzaW5jZQorICogICAgYXBwbGljYXRpb24gaGFzIHRvIHNwZWNpZnkgdGhlIFJUUCBwb3J0IHdoZW4gc2VuZGluZyB0aGUgaW5pdGlhbAorICogICAgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHJlcXVlc3QgKGUuZy4gU0lQIElOVklURSByZXF1ZXN0KSwgdGh1cyBpZgorICogICAgYXBwbGljYXRpb24gb25seSBjcmVhdGVzIHRoZSBtZWRpYSB0cmFuc3BvcnQgbGF0ZXIgd2hlbiBtZWRpYSBpcyB0byBiZQorICogICAgZXN0YWJsaXNoZWQgKG5vcm1hbGx5IHdoZW4gMjAwL09LIGlzIHJlY2VpdmVkLCBvciB3aGVuIDE4eCBpcyByZWNlaXZlZAorICogICAgZm9yIGVhcmx5IG1lZGlhKSwgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBwYXJ0aWN1bGFyIFJUUAorICogICAgcG9ydCBtaWdodCBoYXZlIGJlZW4gb2NjdXBpZWQgYnkgb3RoZXIgcHJvZ3JhbXMuIEFsc28gaXQgaXMgbW9yZQorICogICAgZWZmaWNpZW50IHNpbmNlIHNvY2tldHMgZG9uJ3QgbmVlZCB0byBiZSBjbG9zZWQgYW5kIHJlLW9wZW5lZCBiZXR3ZWVuCisgKiAgICBjYWxscy4KKyAqCisgKgorICogXHN1YnNlY3Rpb24gUEpNRURJQV9UUkFOU1BPUlRfSF9BVFRBQ0ggQXR0YWNoaW5nIGFuZCBVc2luZyB0aGUgTWVkaWEgVHJhbnNwb3J0LgorICoKKyAqICBBcHBsaWNhdGlvbiBzcGVjaWZpZXMgdGhlIG1lZGlhIHRyYW5zcG9ydCBpbnN0YW5jZSB3aGVuIGNyZWF0aW5nCisgKiAgICB0aGUgbWVkaWEgc2Vzc2lvbiAoI3BqbWVkaWFfc2Vzc2lvbl9jcmVhdGUoKSkuIEFsdGVybmF0aXZlbHksIGl0CisgKiAgICBtYXkgY3JlYXRlIHRoZSBtZWRpYSBzdHJlYW0gZGlyZWN0bHkgd2l0aCAjcGptZWRpYV9zdHJlYW1fY3JlYXRlKCkKKyAqICAgIGFuZCBzcGVjaWZ5IHRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgaW4gdGhlIGFyZ3VtZW50LiAoTm90ZTogbWVkaWEKKyAqICAgIHNlc3Npb24gaXMgYSBoaWdoLWxldmVsIGFic3RyYWN0aW9uIGZvciBtZWRpYSBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuCisgKiAgICB0d28gZW5kcG9pbnRzLCBhbmQgaXQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBtZWRpYSBzdHJlYW1zLCBmb3IKKyAqICAgIGV4YW1wbGUsIGFuIGF1ZGlvIHN0cmVhbSBhbmQgYSB2aWRlbyBzdHJlYW0pLgorICoKKyAqICBXaGVuIHN0cmVhbSBpcyBjcmVhdGVkLCBpdCB3aWxsICJhdHRhY2giIGl0c2VsZiB0byB0aGUgbWVkaWEgCisgKiAgICB0cmFuc3BvcnQgYnkgY2FsbGluZyAjcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKCksIHdoaWNoIGlzIGEgdGhpbgorICogICAgd3JhcHBlciB3aGljaCBjYWxscyAiYXR0YWNoKCkiIG1ldGhvZCBvZiB0aGUgbWVkaWEgdHJhbnNwb3J0J3MgCisgKiAgICAidmlydHVhbCBmdW5jdGlvbiBwb2ludGVyIiAoI3BqbWVkaWFfdHJhbnNwb3J0X29wKS4gQW1vbmcgb3RoZXIgdGhpbmdzLAorICogICAgdGhlIHN0cmVhbSBzcGVjaWZpZXMgdHdvIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUgdHJhbnNwb3J0OiBvbmUKKyAqICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJ5IHRyYW5zcG9ydCB3aGVuIGl0IHJlY2VpdmVzIFJUUAorICogICAgcGFja2V0LCBhbmQgYW5vdGhlciBjYWxsYmFjayBmb3IgaW5jb21pbmcgUlRDUCBwYWNrZXQuIFRoZSAKKyAqICAgICNwam1lZGlhX3RyYW5zcG9ydF9hdHRhY2goKSBmdW5jdGlvbiBhbHNvIGVzdGFibGlzaCB0aGUgZGVzdGluYXRpb24KKyAqICAgIG9mIHRoZSBvdXRnb2luZyBSVFAgYW5kIFJUQ1AgcGFja2V0cy4KKyAqCisgKiAgV2hlbiB0aGUgc3RyZWFtIG5lZWRzIHRvIHNlbmQgb3V0Z29pbmcgUlRQL1JUQ1AgcGFja2V0cywgaXQgd2lsbAorICogICAgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfc2VuZF9ydHAoKSBhbmQgI3BqbWVkaWFfdHJhbnNwb3J0X3NlbmRfcnRjcCgpCisgKiAgICBvZiB0aGUgbWVkaWEgdHJhbnNwb3J0IEFQSSwgd2hpY2ggaXMgYSB0aGluIHdyYXBwZXIgdG8gY2FsbCBzZW5kX3J0cCgpIAorICogICAgYW5kIHNlbmRfcnRjcCgpIG1ldGhvZHMgaW4gdGhlIG1lZGlhIHRyYW5zcG9ydCdzICJ2aXJ0dWFsIGZ1bmN0aW9uIAorICogICAgcG9pbnRlciIgICgjcGptZWRpYV90cmFuc3BvcnRfb3ApLgorICoKKyAqICBXaGVuIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLCBpdCB3aWxsICJkZXRhY2giIGl0c2VsZiBmcm9tCisgKiAgICB0aGUgbWVkaWEgdHJhbnNwb3J0IGJ5IGNhbGxpbmcgI3BqbWVkaWFfdHJhbnNwb3J0X2RldGFjaCgpLCB3aGljaCBpcworICogICAgYSB0aGluIHdyYXBwZXIgd2hpY2ggY2FsbHMgImRldGFjaCgpIiBtZXRob2Qgb2YgdGhlIG1lZGlhIHRyYW5zcG9ydCdzIAorICogICAgInZpcnR1YWwgZnVuY3Rpb24gcG9pbnRlciIgKCNwam1lZGlhX3RyYW5zcG9ydF9vcCkuIEFmdGVyIHRoZSB0cmFuc3BvcnQKKyAqICAgIGlzIGRldGFjaGVkIGZyb20gaXRzIHVzZXIgKHRoZSBzdHJlYW0pLCBpdCB3aWxsIG5vIGxvbmdlciByZXBvcnQgCisgKiAgICBpbmNvbWluZyBSVFAvUlRDUCBwYWNrZXRzIHRvIHRoZSBzdHJlYW0sIGFuZCBpdCB3aWxsIHJlZnVzZSB0byBzZW5kCisgKiAgICBvdXRnb2luZyBwYWNrZXRzIHNpbmNlIHRoZSBkZXN0aW5hdGlvbiBoYXMgYmVlbiBjbGVhcmVkLgorICoKKyAqCisgKiBcc3Vic2VjdGlvbiBQSk1FRElBX1RSQU5TUE9SVF9IX1JFVVNFIFJldXNpbmcgdGhlIE1lZGlhIFRyYW5zcG9ydC4KKyAqCisgKiAgQWZ0ZXIgdHJhbnNwb3J0IGhhcyBiZWVuIGRldGFjaGVkLCBhcHBsaWNhdGlvbiBtYXkgcmUtYXR0YWNoIHRoZQorICogICAgdHJhbnNwb3J0IHRvIGFub3RoZXIgc3RyZWFtIGlmIGl0IHdhbnRzIHRvLiBEZXRhY2hpbmcgYW5kIHJlLWF0dGFjaGluZworICogICAgbWVkaWEgdHJhbnNwb3J0IG1heSBiZSBwcmVmZXJhYmxlIHRoYW4gY2xvc2luZyBhbmQgcmUtb3BlbmluZyB0aGUKKyAqICAgIHRyYW5zcG9ydCwgc2luY2UgaXQgaXMgbW9yZSBlZmZpY2llbnQgKHNvY2tldHMgZG9uJ3QgbmVlZCB0byBiZQorICogICAgY2xvc2VkIGFuZCByZS1vcGVuZWQpLiBIb3dldmVyIGl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjaG9vc2UKKyAqICAgIHdoaWNoIG1ldGhvZCBpcyBtb3N0IHN1aXRhYmxlIGZvciBpdHMgdXNlcy4KKyAqCisgKiAKKyAqIFxzdWJzZWN0aW9uIFBKTUVESUFfVFJBTlNQT1JUX0hfREVTVFJPWSBEZXN0cm95aW5nIHRoZSBNZWRpYSBUcmFuc3BvcnQuCisgKgorICogIEZpbmFsbHkgaWYgYXBwbGljYXRpb24gbm8gbG9uZ2VyIG5lZWRzIHRoZSBtZWRpYSB0cmFuc3BvcnQsIGl0IHdpbGwKKyAqICAgIGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X2Nsb3NlKCkgZnVuY3Rpb24sIHdoaWNoIGlzIHRoaW4gd3JhcHBlciB3aGljaCAKKyAqICAgIGNhbGxzICJkZXN0cm95KCkiIG1ldGhvZCBvZiB0aGUgbWVkaWEgdHJhbnNwb3J0J3MgICJ2aXJ0dWFsIGZ1bmN0aW9uIAorICogICAgcG9pbnRlciIgKCNwam1lZGlhX3RyYW5zcG9ydF9vcCkuIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMKKyAqICAgIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgdHJhbnNwb3J0LCBzdWNoIGFzIHNvY2tldHMgYW5kIG1lbW9yeS4KKyAqCisgKgorICogXHNlY3Rpb24gb2ZmZXJfYW5zd2VyIEludGVyYWN0aW9uIHdpdGggU0RQIE9mZmVyL0Fuc3dlcgorIAorICAgRm9yIGJhc2ljIFVEUCB0cmFuc3BvcnQsIHRoZSBccmVmIFBKTUVESUFfVFJBTlNQT1JUX0hfVVNJTkcgYWJvdmUgaXMKKyAgIHN1ZmZpY2llbnQgdG8gdXNlIHRoZSBtZWRpYSB0cmFuc3BvcnQuIEhvd2V2ZXIsIG1vcmUgY29tcGxleCBtZWRpYQorICAgdHJhbnNwb3J0cyBzdWNoIGFzIFxyZWYgUEpNRURJQV9UUkFOU1BPUlRfU1JUUCBhbmQgXHJlZgorICAgUEpNRURJQV9UUkFOU1BPUlRfSUNFIHJlcXVpcmVzIGNsb3NlciBpbnRlcmFjdGlvbnMgd2l0aCBTRFAgb2ZmZXIgYW5kCisgICBhbnN3ZXIgbmVnb3RpYXRpb24uCisKKyAgIFRoZSBtZWRpYSB0cmFuc3BvcnRzIGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBTRFAgb2ZmZXIvYW5zd2VyIHZpYQorICAgdGhlc2UgQVBJczoKKyAgICAgLSAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfY3JlYXRlKCksIHRvIGluaXRpYWxpemUgdGhlIG1lZGlhIHRyYW5zcG9ydAorICAgICAgIGZvciBuZXcgbWVkaWEgc2Vzc2lvbiwKKyAgICAgLSAjcGptZWRpYV90cmFuc3BvcnRfZW5jb2RlX3NkcCgpLCB0byBlbmNvZGUgU0RQIG9mZmVyIG9yIGFuc3dlciwKKyAgICAgLSAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfc3RhcnQoKSwgdG8gYWN0aXZhdGUgdGhlIHNldHRpbmdzIHRoYXQKKyAgICAgICBoYXZlIGJlZW4gbmVnb3RpYXRlZCBieSBTRFAgb2ZmZXIgYW5zd2VyLCBhbmQKKyAgICAgLSAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfc3RvcCgpLCB0byBkZWluaXRpYWxpemUgdGhlIG1lZGlhIHRyYW5zcG9ydAorICAgICAgIGFuZCByZXNldCB0aGUgdHJhbnNwb3J0IHRvIGl0cyBpZGxlIHN0YXRlLgorICAgCisgICBUaGUgdXNhZ2Ugb2YgdGhlc2UgQVBJIGluIHRoZSBjb250ZXh0IG9mIFNEUCBvZmZlciBhbnN3ZXIgd2lsbCBiZSAKKyAgIGRlc2NyaWJlZCBiZWxvdy4KKworICAgXHN1YnNlY3Rpb24gbWVkaWFfY3JlYXRlIEluaXRpYWxpemluZyBUcmFuc3BvcnQgZm9yIE5ldyBTZXNzaW9uCisKKyAgIEFwcGxpY2F0aW9uIG11c3QgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfY3JlYXRlKCkgYmVmb3JlIHVzaW5nCisgICB0aGUgdHJhbnNwb3J0IGZvciBhIG5ldyBzZXNzaW9uLgorCisgICBcc3Vic2VjdGlvbiBjcmVhdF9vYSBDcmVhdGluZyBTRFAgT2ZmZXIgYW5kIEFuc3dlcgorCisgICBUaGUgI3BqbWVkaWFfdHJhbnNwb3J0X2VuY29kZV9zZHAoKSBpcyB1c2VkIHRvIHB1dCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICBmcm9tIHRoZSB0cmFuc3BvcnQgdG8gdGhlIGxvY2FsIFNEUCwgYmVmb3JlIHRoZSBTRFAgaXMgc2VudCBhbmQgbmVnb3RpYXRlZAorICAgd2l0aCByZW1vdGUgU0RQLgorCisgICBXaGVuIGNyZWF0aW5nIGFuIG9mZmVyLCBjYWxsICNwam1lZGlhX3RyYW5zcG9ydF9lbmNvZGVfc2RwKCkgd2l0aAorICAgbG9jYWwgU0RQIChhbmQgTlVMTCBhcyBcYSByZW1fc2RwKS4gVGhlIG1lZGlhIHRyYW5zcG9ydCB3aWxsIGFkZCB0aGUKKyAgIHJlbGV2YW50IGF0dHJpYnV0ZXMgaW4gdGhlIGxvY2FsIFNEUC4gQXBwbGljYXRpb24gdGhlbiBnaXZlcyB0aGUgbG9jYWwKKyAgIFNEUCB0byB0aGUgaW52aXRlIHNlc3Npb24gdG8gYmUgc2VudCB0byByZW1vdGUgYWdlbnQuCisKKyAgIFdoZW4gY3JlYXRpbmcgYW4gYW5zd2VyLCBhbHNvIGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X2VuY29kZV9zZHAoKSwKKyAgIGJ1dCB0aGlzIHRpbWUgc3BlY2lmeSBib3RoIGxvY2FsIGFuZCByZW1vdGUgU0RQIHRvIHRoZSBmdW5jdGlvbi4gVGhlIAorICAgbWVkaWEgdHJhbnNwb3J0IHdpbGwgb25jZSBhZ2FpbiBtb2RpZnkgdGhlIGxvY2FsIFNEUCBhbmQgYWRkIHJlbGV2YW50CisgICBhdHRyaWJ1dGVzIHRvIHRoZSBsb2NhbCBTRFAsIGlmIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8KKyAgIHRoZSB0cmFuc3BvcnQgZnVuY3Rpb25hbGl0eSBhcmUgcHJlc2VudCBpbiByZW1vdGUgb2ZmZXIuIFRoZSByZW1vdGUKKyAgIFNEUCBkb2VzIG5vdCBjb250YWluIHRoZSByZWxldmFudCBhdHRyaWJ1dGVzLCB0aGVuIHRoZSBzcGVjaWZpYyB0cmFuc3BvcnQKKyAgIGZ1bmN0aW9uYWxpdHkgd2lsbCBub3QgYmUgYWN0aXZhdGVkIGZvciB0aGUgc2Vzc2lvbi4KKworICAgVGhlICNwam1lZGlhX3RyYW5zcG9ydF9lbmNvZGVfc2RwKCkgc2hvdWxkIGFsc28gYmUgY2FsbGVkIHdoZW4gYXBwbGljYXRpb24KKyAgIHNlbmRzIHN1YnNlcXVlbnQgU0RQIG9mZmVyIG9yIGFuc3dlci4gVGhlIG1lZGlhIHRyYW5zcG9ydCB3aWxsIGVuY29kZQorICAgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSBzZXNzaW9uLgorCisgICBcc3Vic2VjdGlvbiBtZWRpYV9zdGFydCBPZmZlci9BbnN3ZXIgQ29tcGxldGlvbgorCisgICBPbmNlIGJvdGggbG9jYWwgYW5kIHJlbW90ZSBTRFAgaGF2ZSBiZWVuIG5lZ290aWF0ZWQgYnkgdGhlIAorICAgXHJlZiBQSk1FRElBX1NEUF9ORUcgKG5vcm1hbGx5IHRoaXMgaXMgcGFydCBvZiBQSlNJUCBpbnZpdGUgc2Vzc2lvbiksCisgICBhcHBsaWNhdGlvbiBzaG91bGQgZ2l2ZSBib3RoIGxvY2FsIGFuZCByZW1vdGUgU0RQIHRvIAorICAgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0YXJ0KCkgc28gdGhhdCB0aGUgc2V0dGluZ3MgYXJlIGFjdGl2YXRlZAorICAgZm9yIHRoZSBzZXNzaW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZm9yIGJvdGggaW5pdGlhbCBhbmQKKyAgIHN1YnNlcXVlbnQgU0RQIG5lZ290aWF0aW9uLgorCisgICBcc3Vic2VjdGlvbiBtZWRpYV9zdG9wIFN0b3BwaW5nIFRyYW5zcG9ydAorCisgICBPbmNlIHNlc3Npb24gaXMgc3RvcCBhcHBsaWNhdGlvbiBtdXN0IGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0b3AoKQorICAgdG8gZGVhY3RpdmF0ZSB0aGUgdHJhbnNwb3J0IGZlYXR1cmUuIEFwcGxpY2F0aW9uIG1heSByZXVzZSB0aGUgdHJhbnNwb3J0CisgICBmb3Igc3Vic2VxdWVudCBtZWRpYSBzZXNzaW9uIGJ5IHJlcGVhdGluZyB0aGUgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX2NyZWF0ZSgpLAorICAgI3BqbWVkaWFfdHJhbnNwb3J0X2VuY29kZV9zZHAoKSwgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0YXJ0KCksIGFuZAorICAgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0b3AoKSBhYm92ZS4KKworICogXHNlY3Rpb24gUEpNRURJQV9UUkFOU1BPUlRfSF9JTVBMIEltcGxlbWVudGluZyBNZWRpYSBUcmFuc3BvcnQKKyAqCisgKiBUbyBpbXBsZW1lbnQgYSBuZXcgdHlwZSBvZiBtZWRpYSB0cmFuc3BvcnQsIG9uZSBuZWVkcyB0byAic3ViY2xhc3MiIHRoZQorICogbWVkaWEgdHJhbnNwb3J0ICJjbGFzcyIgKCNwam1lZGlhX3RyYW5zcG9ydCkgYnkgcHJvdmlkaW5nIHRoZSAibWV0aG9kcyIKKyAqIGluIHRoZSBtZWRpYSB0cmFuc3BvcnQgImludGVyZmFjZSIgKCNwam1lZGlhX3RyYW5zcG9ydF9vcCksIGFuZCBwcm92aWRlcworICogYSBmdW5jdGlvbiB0byBjcmVhdGUgdGhpcyBuZXcgdHlwZSBvZiB0cmFuc3BvcnQgKHNpbWlsYXIgdG8gCisgKiAjcGptZWRpYV90cmFuc3BvcnRfdWRwX2NyZWF0ZSgpIGZ1bmN0aW9uKS4KKyAqCisgKiBUaGUgbWVkaWEgdHJhbnNwb3J0IGlzIGV4cGVjdGVkIHRvIHJ1biBpbmRlcGVudGx5LCB0aGF0IGlzIHRoZXJlIHNob3VsZAorICogYmUgbm8gcG9sbGluZyBsaWtlIGZ1bmN0aW9uIHRvIHBvbGwgdGhlIHRyYW5zcG9ydCBmb3IgaW5jb21pbmcgUlRQL1JUQ1AKKyAqIHBhY2tldHMuIFRoaXMgbm9ybWFsbHkgY2FuIGJlIGRvbmUgYnkgcmVnaXN0ZXJpbmcgdGhlIG1lZGlhIHNvY2tldHMgdG8KKyAqIHRoZSBtZWRpYSBlbmRwb2ludCdzIElPUXVldWUsIHdoaWNoIGFsbG93cyB0aGUgdHJhbnNwb3J0IHRvIGJlIG5vdGlmaWVkCisgKiB3aGVuIGluY29taW5nIHBhY2tldCBoYXMgYXJyaXZlZC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBtZWRpYSB0cmFuc3BvcnQgbWF5IHV0aWxpemUgdGhyZWFkKHMpIGludGVybmFsbHkgdG8gd2FpdAorICogZm9yIGluY29taW5nIHBhY2tldHMuIFRoZSB0aHJlYWQgdGhlbiB3aWxsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIFJUUCBvcgorICogUlRDUCBjYWxsYmFjayBwcm92aWRlZCBieSBpdHMgdXNlciAoc3RyZWFtKSB3aGVuZXZlciBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgKiBJZiB0aGUgdHJhbnNwb3J0J3MgdXNlciBpcyBhIHN0cmVhbSwgdGhlbiB0aGUgY2FsbGJhY2tzIHByb3ZpZGVkIGJ5IHRoZQorICogc3RyZWFtIHdpbGwgYmUgdGhyZWFkLXNhZmUsIHNvIHRoZSB0cmFuc3BvcnQgbWF5IGNhbGwgdGhlc2UgY2FsbGJhY2tzCisgKiB3aXRob3V0IGhhdmluZyB0byBzZXJpYWxpemUgdGhlIGFjY2VzcyB3aXRoIHNvbWUgbXV0ZXggcHJvdGVjdGlvbi4gQnV0CisgKiB0aGUgbWVkaWEgdHJhbnNwb3J0IG1heSBzdGlsbCBoYXZlIHRvIHByb3RlY3QgaXRzIGludGVybmFsIGRhdGEgd2l0aAorICogbXV0ZXggcHJvdGVjdGlvbiwgc2luY2UgaXQgbWF5IGJlIGNhbGxlZCBieSBhcHBsaWNhdGlvbidzIHRocmVhZCAoZm9yCisgKiBleGFtcGxlLCB0byBzZW5kIFJUUC9SVENQIHBhY2tldHMpLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxwam1lZGlhL3NkcC5oPgorCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBtZWRpYSB0cmFuc3BvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdHJhbnNwb3J0IHBqbWVkaWFfdHJhbnNwb3J0OworCisvKioKKyAqIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIG1lZGlhIHRyYW5zcG9ydCBpbmZvLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3RyYW5zcG9ydF9pbmZvIHBqbWVkaWFfdHJhbnNwb3J0X2luZm87CisKKy8qKgorICogVGhpcyBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgdGhlIGdlbmVyYWwgYmVoYXZpb3VyIG9mIG1lZGlhIHByb2Nlc3NpbmcKKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfdHJhbnBvcnRfbWVkaWFfb3B0aW9uCit7CisgICAgLyoqCisgICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgdHJhbnNwb3J0IHdpbGwgbm90IHBlcmZvcm0gbWVkaWEKKyAgICAgKiB0cmFuc3BvcnQgdmFsaWRhdGlvbiwgdGhpcyBpcyB1c2VmdWwgd2hlbiB0cmFuc3BvcnQgaXMgc3RhY2tlZCB3aXRoCisgICAgICogb3RoZXIgdHJhbnNwb3J0LCBmb3IgZXhhbXBsZSB3aGVuIHRyYW5zcG9ydCBVRFAgaXMgc3RhY2tlZCB1bmRlcgorICAgICAqIHRyYW5zcG9ydCBTUlRQLCBtZWRpYSB0cmFuc3BvcnQgdmFsaWRhdGlvbiBvbmx5IG5lZWQgdG8gYmUgZG9uZSBieSAKKyAgICAgKiB0cmFuc3BvcnQgU1JUUC4KKyAgICAgKi8KKyAgICBQSk1FRElBX1RQTUVEX05PX1RSQU5TUE9SVF9DSEVDS0lORyA9IDEKKworfSBwam1lZGlhX3RyYW5wb3J0X21lZGlhX29wdGlvbjsKKworCisvKioKKyAqIE1lZGlhIHNvY2tldCBpbmZvIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHVuZGVybHlpbmcgc29ja2V0cworICogdG8gYmUgdXNlZCBhcyBtZWRpYSB0cmFuc3BvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc29ja19pbmZvCit7CisgICAgLyoqIFRoZSBSVFAgc29ja2V0IGhhbmRsZSAqLworICAgIHBqX3NvY2tfdAkgICAgcnRwX3NvY2s7CisKKyAgICAvKiogQWRkcmVzcyB0byBiZSBhZHZlcnRpc2VkIGFzIHRoZSBsb2NhbCBhZGRyZXNzIGZvciB0aGUgUlRQCisgICAgICogIHNvY2tldCwgd2hpY2ggZG9lcyBub3QgbmVlZCB0byBiZSBlcXVhbCBhcyB0aGUgYm91bmQKKyAgICAgKiAgYWRkcmVzcyAoZm9yIGV4YW1wbGUsIHRoaXMgYWRkcmVzcyBjYW4gYmUgdGhlIGFkZHJlc3MgcmVzb2x2ZWQKKyAgICAgKiAgd2l0aCBTVFVOKS4KKyAgICAgKi8KKyAgICBwal9zb2NrYWRkcgkgICAgcnRwX2FkZHJfbmFtZTsKKworICAgIC8qKiBUaGUgUlRDUCBzb2NrZXQgaGFuZGxlLiAqLworICAgIHBqX3NvY2tfdAkgICAgcnRjcF9zb2NrOworCisgICAgLyoqIEFkZHJlc3MgdG8gYmUgYWR2ZXJ0aXNlZCBhcyB0aGUgbG9jYWwgYWRkcmVzcyBmb3IgdGhlIFJUQ1AKKyAgICAgKiAgc29ja2V0LCB3aGljaCBkb2VzIG5vdCBuZWVkIHRvIGJlIGVxdWFsIGFzIHRoZSBib3VuZAorICAgICAqICBhZGRyZXNzIChmb3IgZXhhbXBsZSwgdGhpcyBhZGRyZXNzIGNhbiBiZSB0aGUgYWRkcmVzcyByZXNvbHZlZAorICAgICAqICB3aXRoIFNUVU4pLgorICAgICAqLworICAgIHBqX3NvY2thZGRyCSAgICBydGNwX2FkZHJfbmFtZTsKKworfSBwam1lZGlhX3NvY2tfaW5mbzsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucyBmb3IgdGhlIHN0cmVhbSB0cmFuc3BvcnQuCisgKi8KK3N0cnVjdCBwam1lZGlhX3RyYW5zcG9ydF9vcAoreworICAgIC8qKgorICAgICAqIEdldCBtZWRpYSBzb2NrZXQgaW5mbyBmcm9tIHRoZSBzcGVjaWZpZWQgdHJhbnNwb3J0LgorICAgICAqCisgICAgICogQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X2dldF9pbmZvKCkgaW5zdGVhZAorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZ2V0X2luZm8pKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCSAgICBwam1lZGlhX3RyYW5zcG9ydF9pbmZvICppbmZvKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzdHJlYW0gd2hlbiB0aGUgdHJhbnNwb3J0IGlzIGFib3V0CisgICAgICogdG8gYmUgdXNlZCBieSB0aGUgc3RyZWFtIGZvciB0aGUgZmlyc3QgdGltZSwgYW5kIGl0IHRlbGxzIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBhYm91dCByZW1vdGUgUlRQIGFkZHJlc3MgdG8gc2VuZCB0aGUgcGFja2V0IGFuZCBzb21lIGNhbGxiYWNrcyB0byBiZSAKKyAgICAgKiBjYWxsZWQgZm9yIGluY29taW5nIHBhY2tldHMuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKCkgaW5zdGVhZCBvZiAKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCphdHRhY2gpKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCSAgdm9pZCAqdXNlcl9kYXRhLAorCQkJICBjb25zdCBwal9zb2NrYWRkcl90ICpyZW1fYWRkciwKKwkJCSAgY29uc3QgcGpfc29ja2FkZHJfdCAqcmVtX3J0Y3AsCisJCQkgIHVuc2lnbmVkIGFkZHJfbGVuLAorCQkJICB2b2lkICgqcnRwX2NiKSh2b2lkICp1c2VyX2RhdGEsCisJCQkJCSB2b2lkICpwa3QsCisJCQkJCSBwal9zc2l6ZV90IHNpemUpLAorCQkJICB2b2lkICgqcnRjcF9jYikodm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgIHZvaWQgKnBrdCwKKwkJCQkJICBwal9zc2l6ZV90IHNpemUpKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzdHJlYW0gd2hlbiB0aGUgc3RyZWFtIG5vIGxvbmdlcgorICAgICAqIG5lZWRzIHRoZSB0cmFuc3BvcnQgKG5vcm1hbGx5IHdoZW4gdGhlIHN0cmVhbSBpcyBhYm91dCB0byBiZSBjbG9zZWQpLgorICAgICAqIEFmdGVyIHRoZSB0cmFuc3BvcnQgaXMgZGV0YWNoZWQsIGl0IHdpbGwgaWdub3JlIGluY29taW5nCisgICAgICogUlRQL1JUQ1AgcGFja2V0cywgYW5kIHdpbGwgcmVmdXNlIHRvIHNlbmQgb3V0Z29pbmcgUlRQL1JUQ1AgcGFja2V0cy4KKyAgICAgKiBBcHBsaWNhdGlvbiBtYXkgcmUtYXR0YWNoIHRoZSBtZWRpYSB0cmFuc3BvcnQgdG8gYW5vdGhlciB0cmFuc3BvcnQgCisgICAgICogdXNlciAoZS5nLiBzdHJlYW0pIGFmdGVyIHRoZSB0cmFuc3BvcnQgaGFzIGJlZW4gZGV0YWNoZWQuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfZGV0YWNoKCkgaW5zdGVhZCBvZiAKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCAoKmRldGFjaCkocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkgICB2b2lkICp1c2VyX2RhdGEpOworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHN0cmVhbSB0byBzZW5kIFJUUCBwYWNrZXQgdXNpbmcgdGhlIAorICAgICAqIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0cCgpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqc2VuZF9ydHApKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCSAgICBjb25zdCB2b2lkICpwa3QsCisJCQkgICAgcGpfc2l6ZV90IHNpemUpOworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHN0cmVhbSB0byBzZW5kIFJUQ1AgcGFja2V0IHVzaW5nIHRoZQorICAgICAqIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0Y3AoKSBpbnN0ZWFkIG9mIAorICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnNlbmRfcnRjcCkocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJICAgICBjb25zdCB2b2lkICpwa3QsCisJCQkgICAgIHBqX3NpemVfdCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzdHJlYW0gdG8gc2VuZCBSVENQIHBhY2tldCB1c2luZyB0aGUKKyAgICAgKiB0cmFuc3BvcnQgd2l0aCBkZXN0aW5hdGlvbiBhZGRyZXNzIG90aGVyIHRoYW4gZGVmYXVsdCBzcGVjaWZpZWQgaW4KKyAgICAgKiAjcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKCkuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfc2VuZF9ydGNwMigpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqc2VuZF9ydGNwMikocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJICAgICAgY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCSAgICAgIHVuc2lnbmVkIGFkZHJfbGVuLAorCQkJICAgICAgY29uc3Qgdm9pZCAqcGt0LAorCQkJICAgICAgcGpfc2l6ZV90IHNpemUpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZSB0aGUgdHJhbnNwb3J0IGZvciBhIG5ldyBtZWRpYSBzZXNzaW9uLgorICAgICAqCisgICAgICogQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX2NyZWF0ZSgpIGluc3RlYWQgb2YgCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqbWVkaWFfY3JlYXRlKShwam1lZGlhX3RyYW5zcG9ydCAqdHAsCisJCQkJcGpfcG9vbF90ICpzZHBfcG9vbCwKKwkJCQl1bnNpZ25lZCBvcHRpb25zLAorCQkJCWNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnJlbW90ZV9zZHAsCisJCQkJdW5zaWduZWQgbWVkaWFfaW5kZXgpOworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYXBwbGljYXRpb24gdG8gZ2VuZXJhdGUgdGhlIFNEUCBwYXJ0cworICAgICAqIHJlbGF0ZWQgdG8gdHJhbnNwb3J0IHR5cGUsIGUuZzogSUNFLCBTUlRQLgorICAgICAqCisgICAgICogQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X2VuY29kZV9zZHAoKSBpbnN0ZWFkIG9mCisgICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZW5jb2RlX3NkcCkocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJICAgICAgcGpfcG9vbF90ICpzZHBfcG9vbCwKKwkJCSAgICAgIHBqbWVkaWFfc2RwX3Nlc3Npb24gKnNkcF9sb2NhbCwKKwkJCSAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnJlbV9zZHAsCisJCQkgICAgICB1bnNpZ25lZCBtZWRpYV9pbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhcHBsaWNhdGlvbiB0byBzdGFydCB0aGUgdHJhbnNwb3J0CisgICAgICogYmFzZWQgb24gbG9jYWwgYW5kIHJlbW90ZSBTRFAuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfc3RhcnQoKSBpbnN0ZWFkIG9mIAorICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKm1lZGlhX3N0YXJ0KSAocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJICAgICAgICBwal9wb29sX3QgKnRtcF9wb29sLAorCQkJICAgICAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpzZHBfbG9jYWwsCisJCQkgICAgICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnNkcF9yZW1vdGUsCisJCQkJdW5zaWduZWQgbWVkaWFfaW5kZXgpOworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYXBwbGljYXRpb24gdG8gc3RvcCB0aGUgdHJhbnNwb3J0LgorICAgICAqCisgICAgICogQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgI3BqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0b3AoKSBpbnN0ZWFkIG9mIAorICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKm1lZGlhX3N0b3ApICAocGptZWRpYV90cmFuc3BvcnQgKnRwKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB0byBzaW11bGF0ZSBwYWNrZXQgbG9zdC4KKyAgICAgKgorICAgICAqIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsICNwam1lZGlhX3RyYW5zcG9ydF9zaW11bGF0ZV9sb3N0KCkgaW5zdGVhZCBvZiAKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpzaW11bGF0ZV9sb3N0KShwam1lZGlhX3RyYW5zcG9ydCAqdHAsCisJCQkJIHBqbWVkaWFfZGlyIGRpciwKKwkJCQkgdW5zaWduZWQgcGN0X2xvc3QpOworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIGRlc3Ryb3kgdGhpcyB0cmFuc3BvcnQuCisgICAgICoKKyAgICAgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCAjcGptZWRpYV90cmFuc3BvcnRfY2xvc2UoKSBpbnN0ZWFkIG9mIAorICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmRlc3Ryb3kpKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCk7Cit9OworCisKKy8qKgorICogQHNlZSBwam1lZGlhX3RyYW5zcG9ydF9vcC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV90cmFuc3BvcnRfb3AgcGptZWRpYV90cmFuc3BvcnRfb3A7CisKKworLyoqIAorICogTWVkaWEgdHJhbnNwb3J0IHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX3RyYW5zcG9ydF90eXBlCit7CisgICAgLyoqIE1lZGlhIHRyYW5zcG9ydCB1c2luZyBzdGFuZGFyZCBVRFAgKi8KKyAgICBQSk1FRElBX1RSQU5TUE9SVF9UWVBFX1VEUCwKKworICAgIC8qKiBNZWRpYSB0cmFuc3BvcnQgdXNpbmcgSUNFICovCisgICAgUEpNRURJQV9UUkFOU1BPUlRfVFlQRV9JQ0UsCisKKyAgICAvKiogCisgICAgICogTWVkaWEgdHJhbnNwb3J0IFNSVFAsIHRoaXMgdHJhbnNwb3J0IGlzIGFjdHVhbGx5IHNlY3VyaXR5IGFkYXB0ZXIgdG8gYmUKKyAgICAgKiBzdGFja2VkIHdpdGggb3RoZXIgdHJhbnNwb3J0IHRvIGVuYWJsZSBlbmNyeXB0aW9uIG9uIHRoZSB1bmRlcmx5aW5nCisgICAgICogdHJhbnNwb3J0LgorICAgICAqLworICAgIFBKTUVESUFfVFJBTlNQT1JUX1RZUEVfU1JUUCwKKworICAgIC8qKgorICAgICAqIFN0YXJ0IG9mIHVzZXIgZGVmaW5lZCB0cmFuc3BvcnQuCisgICAgICovCisgICAgUEpNRURJQV9UUkFOU1BPUlRfVFlQRV9VU0VSCisKK30gcGptZWRpYV90cmFuc3BvcnRfdHlwZTsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlY2xhcmVzIG1lZGlhIHRyYW5zcG9ydC4gQSBtZWRpYSB0cmFuc3BvcnQgaXMgY2FsbGVkCisgKiBieSB0aGUgc3RyZWFtIHRvIHRyYW5zbWl0IGEgcGFja2V0LCBhbmQgd2lsbCBub3RpZnkgc3RyZWFtIHdoZW4KKyAqIGluY29taW5nIHBhY2tldCBpcyBhcnJpdmVkLgorICovCitzdHJ1Y3QgcGptZWRpYV90cmFuc3BvcnQKK3sKKyAgICAvKiogVHJhbnNwb3J0IG5hbWUgKGZvciBsb2dnaW5nIHB1cnBvc2UpLiAqLworICAgIGNoYXIJCSAgICAgbmFtZVtQSl9NQVhfT0JKX05BTUVdOworCisgICAgLyoqIFRyYW5zcG9ydCB0eXBlLiAqLworICAgIHBqbWVkaWFfdHJhbnNwb3J0X3R5cGUgICB0eXBlOworCisgICAgLyoqIFRyYW5zcG9ydCdzICJ2aXJ0dWFsIiBmdW5jdGlvbiB0YWJsZS4gKi8KKyAgICBwam1lZGlhX3RyYW5zcG9ydF9vcCAgICAqb3A7CisKKyAgICAvKiogQXBwbGljYXRpb24vdXNlciBkYXRhICovCisgICAgdm9pZAkJICAgICp1c2VyX2RhdGE7Cit9OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBzdG9yYWdlIGJ1ZmZlciBvZiB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mby4KKyAqIFRoZSBhY3R1YWwgdHJhbnNwb3J0IHNwZWNpZmljIGluZm8gY29udGVudHMgd2lsbCBiZSBkZWZpbmVkIGJ5IHRyYW5zcG9ydAorICogaW1wbGVtZW50YXRpb24uIE5vdGUgdGhhdCBzb21lIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IG5lZWQgdG8KKyAqIHByb3ZpZGUgc3BlY2lmaWMgaW5mbywgc2luY2UgdGhlIGdlbmVyYWwgc29ja2V0IGluZm8gaXMgZW5vdWdoLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3RyYW5zcG9ydF9zcGVjaWZpY19pbmZvCit7CisgICAgLyoqCisgICAgICogU3BlY2lmeSBtZWRpYSB0cmFuc3BvcnQgdHlwZS4KKyAgICAgKi8KKyAgICBwam1lZGlhX3RyYW5zcG9ydF90eXBlICAgdHlwZTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgc3RvcmFnZSBidWZmZXIgc2l6ZSBvZiB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mby4KKyAgICAgKi8KKyAgICBpbnQJCQkgICAgIGNic2l6ZTsKKworICAgIC8qKgorICAgICAqIFN0b3JhZ2UgYnVmZmVyIG9mIHRyYW5zcG9ydCBzcGVjaWZpYyBpbmZvLgorICAgICAqLworICAgIGNoYXIJCSAgICAgYnVmZmVyW1BKTUVESUFfVFJBTlNQT1JUX1NQRUNJRklDX0lORk9fTUFYU0laRV07CisKK30gcGptZWRpYV90cmFuc3BvcnRfc3BlY2lmaWNfaW5mbzsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0cmFuc3BvcnQgaW5mb3JtYXRpb25zLCBpbmNsdWRpbmcgZ2VuZXJhbCAKKyAqIHNvY2tldCBpbmZvcm1hdGlvbiBhbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gb2Ygc2luZ2xlIHRyYW5zcG9ydCBvciAKKyAqIHN0YWNrZWQgdHJhbnNwb3J0cyAoZS5nOiBTUlRQIHN0YWNrZWQgb24gdG9wIG9mIFVEUCkKKyAqLworc3RydWN0IHBqbWVkaWFfdHJhbnNwb3J0X2luZm8KK3sKKyAgICAvKioKKyAgICAgKiBHZW5lcmFsIHNvY2tldCBpbmZvLgorICAgICAqLworICAgIHBqbWVkaWFfc29ja19pbmZvIHNvY2tfaW5mbzsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBhZGRyZXNzIHdoZXJlIFJUUC9SVENQIG9yaWdpbmF0ZWQgZnJvbS4gSW4gY2FzZSB0aGlzIHRyYW5zcG9ydAorICAgICAqIGhhc24ndCBldmVyIHJlY2VpdmVkIHBhY2tldCwgdGhlIAorICAgICAqLworICAgIHBqX3NvY2thZGRyCSAgICBzcmNfcnRwX25hbWU7CisgICAgcGpfc29ja2FkZHIJICAgIHNyY19ydGNwX25hbWU7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgbnVtYmVyIG9mIHRyYW5zcG9ydCBzcGVjaWZpYyBpbmZvIGluY2x1ZGVkLgorICAgICAqLworICAgIHVuc2lnbmVkIHNwZWNpZmljX2luZm9fY250OworCisgICAgLyoqCisgICAgICogQnVmZmVyIHN0b3JhZ2Ugb2YgdHJhbnNwb3J0IHNwZWNpZmljIGluZm8uCisgICAgICovCisgICAgcGptZWRpYV90cmFuc3BvcnRfc3BlY2lmaWNfaW5mbyBzcGNfaW5mb1tQSk1FRElBX1RSQU5TUE9SVF9TUEVDSUZJQ19JTkZPX01BWENOVF07CisKK307CisKKworLyoqCisgKiBJbml0aWFsaXplIHRyYW5zcG9ydCBpbmZvLgorICoKKyAqIEBwYXJhbSBpbmZvCSAgICBUcmFuc3BvcnQgaW5mbyB0byBiZSBpbml0aWFsaXplZC4KKyAqLworUEpfSU5MSU5FKHZvaWQpIHBqbWVkaWFfdHJhbnNwb3J0X2luZm9faW5pdChwam1lZGlhX3RyYW5zcG9ydF9pbmZvICppbmZvKQoreworICAgIHBqX2J6ZXJvKCZpbmZvLT5zb2NrX2luZm8sIHNpemVvZihwam1lZGlhX3NvY2tfaW5mbykpOworICAgIGluZm8tPnNvY2tfaW5mby5ydHBfc29jayA9IGluZm8tPnNvY2tfaW5mby5ydGNwX3NvY2sgPSBQSl9JTlZBTElEX1NPQ0tFVDsKKyAgICBpbmZvLT5zcGVjaWZpY19pbmZvX2NudCA9IDA7Cit9CisKKworLyoqCisgKiBHZXQgbWVkaWEgdHJhbnNwb3J0IGluZm8gZnJvbSB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydCBhbmQgYWxsIHVuZGVybHlpbmcgCisgKiB0cmFuc3BvcnRzIGlmIGFueS4gVGhlIHRyYW5zcG9ydCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHNvY2tldCBpbmZvCisgKiB3aGljaCBkZXNjcmliZXMgdGhlIGxvY2FsIGFkZHJlc3Mgb2YgdGhlIHRyYW5zcG9ydCwgYW5kIHdvdWxkIGJlIG5lZWRlZAorICogZm9yIGV4YW1wbGUgdG8gZmlsbCBpbiB0aGUgImM9IiBhbmQgIm09IiBsaW5lIG9mIGxvY2FsIFNEUC4KKyAqCisgKiBAcGFyYW0gdHAJICAgIFRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gaW5mbwkgICAgTWVkaWEgdHJhbnNwb3J0IGluZm8gdG8gYmUgaW5pdGlhbGl6ZWQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X2dldF9pbmZvKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCQkJCSAgcGptZWRpYV90cmFuc3BvcnRfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAodHAgJiYgdHAtPm9wICYmIHRwLT5vcC0+Z2V0X2luZm8pCisJcmV0dXJuICgqdHAtPm9wLT5nZXRfaW5mbykodHAsIGluZm8pOworICAgIAorICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisKKy8qKgorICogVXRpbGl0eSBBUEkgdG8gZ2V0IHRyYW5zcG9ydCB0eXBlIHNwZWNpZmljIGluZm8gZnJvbSB0aGUgc3BlY2lmaWVkIG1lZGlhCisgKiB0cmFuc3BvcnQgaW5mby4KKyAqIAorICogQHBhcmFtIGluZm8JICAgIE1lZGlhIHRyYW5zcG9ydCBpbmZvLgorICogQHBhcmFtIHR5cGUJICAgIE1lZGlhIHRyYW5zcG9ydCB0eXBlLgorICoKKyAqIEByZXR1cm4JICAgIFBvaW50ZXIgdG8gbWVkaWEgdHJhbnNwb3J0IHNwZWNpZmljIGluZm8sIG9yIE5VTEwgaWYKKyAqIAkJICAgIHNwZWNpZmljIGluZm8gZm9yIHRoZSB0cmFuc3BvcnQgdHlwZSBpcyBub3QgZm91bmQuCisgKi8KK1BKX0lOTElORSh2b2lkKikgcGptZWRpYV90cmFuc3BvcnRfaW5mb19nZXRfc3BjX2luZm8oCisJCQkJCQlwam1lZGlhX3RyYW5zcG9ydF9pbmZvICppbmZvLAorCQkJCQkJcGptZWRpYV90cmFuc3BvcnRfdHlwZSB0eXBlKQoreworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPnNwZWNpZmljX2luZm9fY250OyArK2kpIHsKKwlpZiAoaW5mby0+c3BjX2luZm9baV0udHlwZSA9PSB0eXBlKQorCSAgICByZXR1cm4gKHZvaWQqKWluZm8tPnNwY19pbmZvW2ldLmJ1ZmZlcjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiBBdHRhY2ggY2FsbGJhY2tzIHRvIGJlIGNhbGxlZCBvbiByZWNlaXB0IG9mIGluY29taW5nIFJUUC9SVENQIHBhY2tldHMuCisgKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgd3JhcHBlciB3aGljaCBjYWxscyA8dHQ+YXR0YWNoKCk8L3R0PiBtZW1iZXIgb2YgCisgKiB0aGUgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cAkgICAgVGhlIG1lZGlhIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEgQXJiaXRyYXJ5IHVzZXIgZGF0YSB0byBiZSBzZXQgd2hlbiB0aGUgY2FsbGJhY2tzIGFyZSAKKyAqCQkgICAgY2FsbGVkLgorICogQHBhcmFtIHJlbV9hZGRyICBSZW1vdGUgUlRQIGFkZHJlc3MgdG8gc2VuZCBSVFAgcGFja2V0IHRvLgorICogQHBhcmFtIHJlbV9ydGNwICBPcHRpb25hbCByZW1vdGUgUlRDUCBhZGRyZXNzLiBJZiB0aGUgYXJndW1lbnQgaXMgTlVMTAorICoJCSAgICBvciBpZiB0aGUgYWRkcmVzcyBpcyB6ZXJvLCB0aGUgUlRDUCBhZGRyZXNzIHdpbGwgYmUKKyAqCQkgICAgY2FsY3VsYXRlZCBmcm9tIHRoZSBSVFAgYWRkcmVzcyAod2hpY2ggaXMgUlRQIHBvcnQKKyAqCQkgICAgcGx1cyBvbmUpLgorICogQHBhcmFtIGFkZHJfbGVuICBMZW5ndGggb2YgdGhlIHJlbW90ZSBhZGRyZXNzLgorICogQHBhcmFtIHJ0cF9jYiAgICBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBSVFAgcGFja2V0IGlzIHJlY2VpdmVkIG9uCisgKgkJICAgIHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gcnRjcF9jYiAgIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIFJUQ1AgcGFja2V0IGlzIHJlY2VpdmVkIG9uCisgKgkJICAgIHRoZSB0cmFuc3BvcnQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9hdHRhY2gocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJCQkgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICpyZW1fYWRkciwKKwkJCQkJCWNvbnN0IHBqX3NvY2thZGRyX3QgKnJlbV9ydGNwLAorCQkJCQkgICAgICAgIHVuc2lnbmVkIGFkZHJfbGVuLAorCQkJCQkgICAgICAgIHZvaWQgKCpydHBfY2IpKHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJCQkgICAgICAgdm9pZCAqcGt0LAorCQkJCQkJCSAgICAgICBwal9zc2l6ZV90KSwKKwkJCQkJICAgICAgICB2b2lkICgqcnRjcF9jYikodm9pZCAqdXNyX2RhdGEsCisJCQkJCQkJICAgICAgICB2b2lkKnBrdCwKKwkJCQkJCQkgICAgICAgIHBqX3NzaXplX3QpKQoreworICAgIHJldHVybiB0cC0+b3AtPmF0dGFjaCh0cCwgdXNlcl9kYXRhLCByZW1fYWRkciwgcmVtX3J0Y3AsIGFkZHJfbGVuLCAKKwkJCSAgcnRwX2NiLCBydGNwX2NiKTsKK30KKworCisvKioKKyAqIERldGFjaCBjYWxsYmFja3MgZnJvbSB0aGUgdHJhbnNwb3J0LgorICogVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHdyYXBwZXIgd2hpY2ggY2FsbHMgPHR0PmRldGFjaCgpPC90dD4gbWVtYmVyIG9mIAorICogdGhlIHRyYW5zcG9ydC4gQWZ0ZXIgdGhlIHRyYW5zcG9ydCBpcyBkZXRhY2hlZCwgaXQgd2lsbCBpZ25vcmUgaW5jb21pbmcKKyAqIFJUUC9SVENQIHBhY2tldHMsIGFuZCB3aWxsIHJlZnVzZSB0byBzZW5kIG91dGdvaW5nIFJUUC9SVENQIHBhY2tldHMuCisgKiBBcHBsaWNhdGlvbiBtYXkgcmUtYXR0YWNoIHRoZSBtZWRpYSB0cmFuc3BvcnQgdG8gYW5vdGhlciB0cmFuc3BvcnQgdXNlcgorICogKGUuZy4gc3RyZWFtKSBhZnRlciB0aGUgdHJhbnNwb3J0IGhhcyBiZWVuIGRldGFjaGVkLgorICoKKyAqIEBwYXJhbSB0cAkgICAgVGhlIG1lZGlhIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEgVXNlciBkYXRhIHdoaWNoIG11c3QgbWF0Y2ggdGhlIHByZXZpb3VzbHkgc2V0IHZhbHVlCisgKgkJICAgIG9uIGF0dGFjaG1lbnQuCisgKi8KK1BKX0lOTElORSh2b2lkKSBwam1lZGlhX3RyYW5zcG9ydF9kZXRhY2gocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJCQkgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIHRwLT5vcC0+ZGV0YWNoKHRwLCB1c2VyX2RhdGEpOworfQorCisKKy8qKgorICogU2VuZCBSVFAgcGFja2V0IHdpdGggdGhlIHNwZWNpZmllZCBtZWRpYSB0cmFuc3BvcnQuIFRoaXMgaXMganVzdCBhIHNpbXBsZQorICogd3JhcHBlciB3aGljaCBjYWxscyA8dHQ+c2VuZF9ydHAoKTwvdHQ+IG1lbWJlciBvZiB0aGUgdHJhbnNwb3J0LiBUaGUgCisgKiBSVFAgcGFja2V0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHNwZWNpZmllZCBpbgorICogI3BqbWVkaWFfdHJhbnNwb3J0X2F0dGFjaCgpIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0cAkgICAgVGhlIG1lZGlhIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBwa3QJICAgIFRoZSBwYWNrZXQgdG8gc2VuZC4KKyAqIEBwYXJhbSBzaXplCSAgICBTaXplIG9mIHRoZSBwYWNrZXQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0cChwam1lZGlhX3RyYW5zcG9ydCAqdHAsCisJCQkJCQkgIGNvbnN0IHZvaWQgKnBrdCwKKwkJCQkJCSAgcGpfc2l6ZV90IHNpemUpCit7CisgICAgcmV0dXJuICgqdHAtPm9wLT5zZW5kX3J0cCkodHAsIHBrdCwgc2l6ZSk7Cit9CisKKworLyoqCisgKiBTZW5kIFJUQ1AgcGFja2V0IHdpdGggdGhlIHNwZWNpZmllZCBtZWRpYSB0cmFuc3BvcnQuIFRoaXMgaXMganVzdCBhIHNpbXBsZQorICogd3JhcHBlciB3aGljaCBjYWxscyA8dHQ+c2VuZF9ydGNwKCk8L3R0PiBtZW1iZXIgb2YgdGhlIHRyYW5zcG9ydC4gVGhlIAorICogUlRDUCBwYWNrZXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgc3BlY2lmaWVkIGluCisgKiAjcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKCkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRwCSAgICBUaGUgbWVkaWEgdHJhbnNwb3J0LgorICogQHBhcmFtIHBrdAkgICAgVGhlIHBhY2tldCB0byBzZW5kLgorICogQHBhcmFtIHNpemUJICAgIFNpemUgb2YgdGhlIHBhY2tldC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X3NlbmRfcnRjcChwam1lZGlhX3RyYW5zcG9ydCAqdHAsCisJCQkJCQkgIGNvbnN0IHZvaWQgKnBrdCwKKwkJCQkJCSAgcGpfc2l6ZV90IHNpemUpCit7CisgICAgcmV0dXJuICgqdHAtPm9wLT5zZW5kX3J0Y3ApKHRwLCBwa3QsIHNpemUpOworfQorCisKKy8qKgorICogU2VuZCBSVENQIHBhY2tldCB3aXRoIHRoZSBzcGVjaWZpZWQgbWVkaWEgdHJhbnNwb3J0LiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUKKyAqIHdyYXBwZXIgd2hpY2ggY2FsbHMgPHR0PnNlbmRfcnRjcDIoKTwvdHQ+IG1lbWJlciBvZiB0aGUgdHJhbnNwb3J0LiBUaGUgCisgKiBSVENQIHBhY2tldCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBzcGVjaWZpZWQgaW4KKyAqIHBhcmFtIGFkZHIsIGlmIGFkZHIgaXMgTlVMTCwgUlRDUCBwYWNrZXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gZGVzdGluYXRpb24gCisgKiBhZGRyZXNzIHNwZWNpZmllZCBpbiAjcGptZWRpYV90cmFuc3BvcnRfYXR0YWNoKCkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRwCSAgICBUaGUgbWVkaWEgdHJhbnNwb3J0LgorICogQHBhcmFtIGFkZHIJICAgIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICogQHBhcmFtIGFkZHJfbGVuICBMZW5ndGggb2YgZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqIEBwYXJhbSBwa3QJICAgIFRoZSBwYWNrZXQgdG8gc2VuZC4KKyAqIEBwYXJhbSBzaXplCSAgICBTaXplIG9mIHRoZSBwYWNrZXQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9zZW5kX3J0Y3AyKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCQkJCSAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQkJICAgIHVuc2lnbmVkIGFkZHJfbGVuLAorCQkJCQkJICAgIGNvbnN0IHZvaWQgKnBrdCwKKwkJCQkJCSAgICBwal9zaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gKCp0cC0+b3AtPnNlbmRfcnRjcDIpKHRwLCBhZGRyLCBhZGRyX2xlbiwgcGt0LCBzaXplKTsKK30KKworCisvKioKKyAqIFByZXBhcmUgdGhlIG1lZGlhIHRyYW5zcG9ydCBmb3IgYSBuZXcgbWVkaWEgc2Vzc2lvbiwgQXBwbGljYXRpb24gbXVzdAorICogY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBzdGFydGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHVzaW5nIHRoaXMKKyAqIHRyYW5zcG9ydC4KKyAqCisgKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgd3JhcHBlciB3aGljaCBjYWxscyA8dHQ+bWVkaWFfY3JlYXRlKCk8L3R0PiBtZW1iZXIgCisgKiBvZiB0aGUgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cAkJVGhlIG1lZGlhIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBzZHBfcG9vbAlQb29sIG9iamVjdCB0byBhbGxvY2F0ZSBtZW1vcnkgcmVsYXRlZCB0byBTRFAKKyAqCQkJbWVzc2FnaW5nIGNvbXBvbmVudHMuCisgKiBAcGFyYW0gb3B0aW9ucwlPcHRpb24gZmxhZ3MsIGZyb20gI3BqbWVkaWFfdHJhbnBvcnRfbWVkaWFfb3B0aW9uCisgKiBAcGFyYW0gcmVtX3NkcAlSZW1vdGUgU0RQIGlmIGxvY2FsIFNEUCBpcyBhbiBhbnN3ZXIsIG90aGVyd2lzZQorICoJCQlzcGVjaWZ5IE5VTEwgaWYgU0RQIGlzIGFuIG9mZmVyLgorICogQHBhcmFtIG1lZGlhX2luZGV4CU1lZGlhIGluZGV4IGluIFNEUC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X21lZGlhX2NyZWF0ZShwam1lZGlhX3RyYW5zcG9ydCAqdHAsCisJCQkJICAgIHBqX3Bvb2xfdCAqc2RwX3Bvb2wsCisJCQkJICAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJICAgIGNvbnN0IHBqbWVkaWFfc2RwX3Nlc3Npb24gKnJlbV9zZHAsCisJCQkJICAgIHVuc2lnbmVkIG1lZGlhX2luZGV4KQoreworICAgIHJldHVybiAoKnRwLT5vcC0+bWVkaWFfY3JlYXRlKSh0cCwgc2RwX3Bvb2wsIG9wdGlvbnMsIHJlbV9zZHAsIAorCQkJCSAgIG1lZGlhX2luZGV4KTsKK30KKworCisvKioKKyAqIFB1dCB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW50byB0aGUgU0RQLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZQorICogY2FsbGVkIHRvIHB1dCB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlIGluaXRpYWwgb3IKKyAqIHN1YnNlcXVlbnQgU0RQIG9mZmVyIG9yIGFuc3dlci4KKyAqCisgKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgd3JhcHBlciB3aGljaCBjYWxscyA8dHQ+ZW5jb2RlX3NkcCgpPC90dD4gbWVtYmVyIAorICogb2YgdGhlIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHAJCVRoZSBtZWRpYSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gc2RwX3Bvb2wJUG9vbCBvYmplY3QgdG8gYWxsb2NhdGUgbWVtb3J5IHJlbGF0ZWQgdG8gU0RQCisgKgkJCW1lc3NhZ2luZyBjb21wb25lbnRzLgorICogQHBhcmFtIHNkcAkJVGhlIGxvY2FsIFNEUCB0byBiZSBmaWxsZWQgaW4gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAqCQkJbWVkaWEgdHJhbnNwb3J0LgorICogQHBhcmFtIHJlbV9zZHAJUmVtb3RlIFNEUCBpZiBsb2NhbCBTRFAgaXMgYW4gYW5zd2VyLCBvdGhlcndpc2UKKyAqCQkJc3BlY2lmeSBOVUxMIGlmIFNEUCBpcyBhbiBvZmZlci4KKyAqIEBwYXJhbSBtZWRpYV9pbmRleAlNZWRpYSBpbmRleCBpbiBTRFAuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9lbmNvZGVfc2RwKHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCQkJICAgIHBqX3Bvb2xfdCAqc2RwX3Bvb2wsCisJCQkJCSAgICBwam1lZGlhX3NkcF9zZXNzaW9uICpzZHAsCisJCQkJCSAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpyZW1fc2RwLAorCQkJCQkgICAgdW5zaWduZWQgbWVkaWFfaW5kZXgpCit7CisgICAgcmV0dXJuICgqdHAtPm9wLT5lbmNvZGVfc2RwKSh0cCwgc2RwX3Bvb2wsIHNkcCwgcmVtX3NkcCwgbWVkaWFfaW5kZXgpOworfQorCisKKy8qKgorICogU3RhcnQgdGhlIHRyYW5zcG9ydCBzZXNzaW9uIHdpdGggdGhlIHNldHRpbmdzIGluIGJvdGggbG9jYWwgYW5kIHJlbW90ZSAKKyAqIFNEUC4gVGhlIGFjdHVhbCB3b3JrIHRoYXQgaXMgZG9uZSBieSB0aGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIAorICogdW5kZXJseWluZyB0cmFuc3BvcnQgdHlwZS4gRm9yIFNSVFAsIHRoaXMgd2lsbCBhY3RpdmF0ZSB0aGUgZW5jcnlwdGlvbgorICogYW5kIGRlY3J5cHRpb24gYmFzZWQgb24gdGhlIGtleXMgZm91bmQgdGhlIFNEUHMuIEZvciBJQ0UsIHRoaXMgd2lsbAorICogc3RhcnQgSUNFIG5lZ290aWF0aW9uIGFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlIFNEUHMuCisgKgorICogVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHdyYXBwZXIgd2hpY2ggY2FsbHMgPHR0Pm1lZGlhX3N0YXJ0KCk8L3R0PiBtZW1iZXIgCisgKiBvZiB0aGUgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cAkJVGhlIG1lZGlhIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSB0bXBfcG9vbAlUaGUgbWVtb3J5IHBvb2wgZm9yIGFsbG9jYXRpbmcgdGVtcG9yYXJ5IG9iamVjdHMuCisgKiBAcGFyYW0gc2RwX2xvY2FsCUxvY2FsIFNEUC4KKyAqIEBwYXJhbSBzZHBfcmVtb3RlCVJlbW90ZSBTRFAuCisgKiBAcGFyYW0gbWVkaWFfaW5kZXgJTWVkaWEgaW5kZXggaW4gdGhlIFNEUC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0YXJ0KHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCQkgICAgcGpfcG9vbF90ICp0bXBfcG9vbCwKKwkJCQkgICAgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqc2RwX2xvY2FsLAorCQkJCSAgICBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpzZHBfcmVtb3RlLAorCQkJCSAgICB1bnNpZ25lZCBtZWRpYV9pbmRleCkKK3sKKyAgICByZXR1cm4gKCp0cC0+b3AtPm1lZGlhX3N0YXJ0KSh0cCwgdG1wX3Bvb2wsIHNkcF9sb2NhbCwgc2RwX3JlbW90ZSwgCisJCQkJICBtZWRpYV9pbmRleCk7Cit9CisKKworLyoqCisgKiBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgc3RvcHBlZCwgdG8gYWxsb3cgdGhlIG1lZGlhCisgKiB0cmFuc3BvcnQgdG8gcmVsZWFzZSBpdHMgcmVzb3VyY2VzIHVzZWQgZm9yIHRoZSBzZXNzaW9uLgorICoKKyAqIFRoaXMgaXMganVzdCBhIHNpbXBsZSB3cmFwcGVyIHdoaWNoIGNhbGxzIDx0dD5tZWRpYV9zdG9wKCk8L3R0PiBtZW1iZXIgCisgKiBvZiB0aGUgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSB0cAkJVGhlIG1lZGlhIHRyYW5zcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X21lZGlhX3N0b3AocGptZWRpYV90cmFuc3BvcnQgKnRwKQoreworICAgIHJldHVybiAoKnRwLT5vcC0+bWVkaWFfc3RvcCkodHApOworfQorCisvKioKKyAqIENsb3NlIG1lZGlhIHRyYW5zcG9ydC4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHdyYXBwZXIgd2hpY2ggY2FsbHMgCisgKiA8dHQ+ZGVzdHJveSgpPC90dD4gbWVtYmVyIG9mIHRoZSB0cmFuc3BvcnQuIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlCisgKiBhbGwgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyB0cmFuc3BvcnQgKHN1Y2ggYXMgc29ja2V0cywgbWVtb3J5LCBldGMuKS4KKyAqCisgKiBAcGFyYW0gdHAJICAgIFRoZSBtZWRpYSB0cmFuc3BvcnQuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9jbG9zZShwam1lZGlhX3RyYW5zcG9ydCAqdHApCit7CisgICAgaWYgKHRwLT5vcC0+ZGVzdHJveSkKKwlyZXR1cm4gKCp0cC0+b3AtPmRlc3Ryb3kpKHRwKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qKgorICogU2ltdWxhdGUgcGFja2V0IGxvc3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24gKGZvciB0ZXN0aW5nIHB1cnBvc2VzKS4KKyAqIFdoZW4gZW5hYmxlZCwgdGhlIHRyYW5zcG9ydCB3aWxsIHJhbmRvbWx5IGRyb3AgcGFja2V0cyB0byB0aGUgc3BlY2lmaWVkCisgKiBkaXJlY3Rpb24uCisgKgorICogQHBhcmFtIHRwCSAgICBUaGUgbWVkaWEgdHJhbnNwb3J0LgorICogQHBhcmFtIGRpcgkgICAgTWVkaWEgZGlyZWN0aW9uIHRvIHdoaWNoIHBhY2tldHMgd2lsbCBiZSByYW5kb21seSBkcm9wcGVkLgorICogQHBhcmFtIHBjdF9sb3N0ICBQZXJjZW50IGxvc3QgKDAtMTAwKS4gU2V0IHRvIHplcm8gdG8gZGlzYWJsZSBwYWNrZXQKKyAqCQkgICAgbG9zdCBzaW11bGF0aW9uLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9zaW11bGF0ZV9sb3N0KHBqbWVkaWFfdHJhbnNwb3J0ICp0cCwKKwkJCQkJCSAgICAgICBwam1lZGlhX2RpciBkaXIsCisJCQkJCQkgICAgICAgdW5zaWduZWQgcGN0X2xvc3QpCit7CisgICAgcmV0dXJuICgqdHAtPm9wLT5zaW11bGF0ZV9sb3N0KSh0cCwgZGlyLCBwY3RfbG9zdCk7Cit9CisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9UUkFOU1BPUlRfSF9fICovCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9hZGFwdGVyX3NhbXBsZS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2FkYXB0ZXJfc2FtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5OTFhMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9hZGFwdGVyX3NhbXBsZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qICRJZDogdHJhbnNwb3J0X2FkYXB0ZXJfc2FtcGxlLmggMzg0MSAyMDExLTEwLTI0IDA5OjI4OjEzWiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9UUkFOU1BPUlRfQURBUFRFUl9TQU1QTEVfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9UUkFOU1BPUlRfQURBUFRFUl9TQU1QTEVfSF9fCisKKworLyoqCisgKiBAZmlsZSB0cmFuc3BvcnRfYWRhcHRlcl9zYW1wbGUuaAorICogQGJyaWVmIFNhbXBsZSBNZWRpYSBUcmFuc3BvcnQgQWRhcHRlcgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3RyYW5zcG9ydC5oPgorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfVFJBTlNQT1JUX0FEQVBURVJfU0FNUExFIFNhbXBsZSBUcmFuc3BvcnQgQWRhcHRlcgorICogQGluZ3JvdXAgUEpNRURJQV9UUkFOU1BPUlQKKyAqIEBicmllZiBFeGFtcGxlIG9uIGhvdyB0byBjcmVhdGUgdHJhbnNwb3J0IGFkYXB0ZXIuCisgKiBAeworICoKKyAqIFRoaXMgZGVzY3JpYmVzIGEgc2FtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRyYW5zcG9ydCBhZGFwdGVyLCBzaW1pbGFyIHRvCisgKiB0aGUgd2F5IHRoZSBTUlRQIHRyYW5zcG9ydCBhZGFwdGVyIHdvcmtzLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIENyZWF0ZSB0aGUgdHJhbnNwb3J0IGFkYXB0ZXIsIHNwZWNpZnlpbmcgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIGJlCisgKiB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgUlRQL1JUQ1AgcGFja2V0cy4KKyAqCisgKiBAcGFyYW0gZW5kcHQJCVRoZSBtZWRpYSBlbmRwb2ludC4KKyAqIEBwYXJhbSBuYW1lCQlPcHRpb25hbCBuYW1lIHRvIGlkZW50aWZ5IHRoaXMgbWVkaWEgdHJhbnNwb3J0CisgKgkJCWZvciBsb2dnaW5nIHB1cnBvc2VzLgorICogQHBhcmFtIGJhc2VfdHAJVGhlIGJhc2UvdW5kZXJseWluZyBtZWRpYSB0cmFuc3BvcnQgdG8gc2VuZCBhbmQKKyAqIAkJCXJlY2VpdmUgUlRQL1JUQ1AgcGFja2V0cy4KKyAqIEBwYXJhbSBkZWxfYmFzZQlTcGVjaWZ5IHdoZXRoZXIgdGhlIGJhc2UgdHJhbnNwb3J0IHNob3VsZCBhbHNvIGJlCisgKiAJCQlkZXN0cm95ZWQgd2hlbiBkZXN0cm95KCkgaXMgY2FsbGVkIHVwb24gdXMuCisgKiBAcGFyYW0gcF90cAkJUG9pbnRlciB0byByZWNlaXZlIHRoZSBtZWRpYSB0cmFuc3BvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90cF9hZGFwdGVyX2NyZWF0ZSggcGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICAgICBwam1lZGlhX3RyYW5zcG9ydCAqYmFzZV90cCwKKwkJCQkJICAgICAgICBwal9ib29sX3QgZGVsX2Jhc2UsCisJCQkJCQlwam1lZGlhX3RyYW5zcG9ydCAqKnBfdHApOworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfVFJBTlNQT1JUX0FEQVBURVJfU0FNUExFX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9pY2UuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9pY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzU1NWNiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2ljZS5oCkBAIC0wLDAgKzEsMjQzIEBACisvKiAkSWQ6IHRyYW5zcG9ydF9pY2UuaCA0NjA2IDIwMTMtMTAtMDEgMDU6MDA6NTdaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1RSQU5TUE9SVF9JQ0VfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9UUkFOU1BPUlRfSUNFX0hfXworCisKKy8qKgorICogQGZpbGUgdHJhbnNwb3J0X2ljZS5oCisgKiBAYnJpZWYgSUNFIGNhcGFibGUgbWVkaWEgdHJhbnNwb3J0LgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3N0cmVhbS5oPgorI2luY2x1ZGUgPHBqbmF0aC9pY2Vfc3RyYW5zLmg+CisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9UUkFOU1BPUlRfSUNFIElDRSBNZWRpYSBUcmFuc3BvcnQgCisgKiBAaW5ncm91cCBQSk1FRElBX1RSQU5TUE9SVAorICogQGJyaWVmIEludGVyYWN0aXZlIENvbm5lY3Rpdml0eSBFc3RhYmxpc2htZW50IChJQ0UpIHRyYW5zcG9ydAorICogQHsKKyAqCisgKiBUaGlzIGRlc2NyaWJlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgbWVkaWEgdHJhbnNwb3J0IHVzaW5nCisgKiBJbnRlcmFjdGl2ZSBDb25uZWN0aXZpdHkgRXN0YWJsaXNobWVudCAoSUNFKSBwcm90b2NvbC4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBJQ0Ugbm90aWZpY2F0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9pY2VfY2IKK3sKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gSUNFIG5lZ290aWF0aW9uIGNvbXBsZXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cAlQSk1FRElBIElDRSB0cmFuc3BvcnQuCisgICAgICogQHBhcmFtIG9wCVRoZSBvcGVyYXRpb24KKyAgICAgKiBAcGFyYW0gc3RhdHVzCU9wZXJhdGlvbiBzdGF0dXMuCisgICAgICovCisgICAgdm9pZCAgICAoKm9uX2ljZV9jb21wbGV0ZSkocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJICAgICAgIHBqX2ljZV9zdHJhbnNfb3Agb3AsCisJCQkgICAgICAgcGpfc3RhdHVzX3Qgc3RhdHVzKTsKKworfSBwam1lZGlhX2ljZV9jYjsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHNwZWNpZmllcyBJQ0UgdHJhbnNwb3J0IHNwZWNpZmljIGluZm8uIFRoaXMgc3RydWN0dXJlCisgKiB3aWxsIGJlIGZpbGxlZCBpbiBtZWRpYSB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mby4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9pY2VfdHJhbnNwb3J0X2luZm8KK3sKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBJQ0UgaXMgdXNlZCwgaS5lLiBTRFAgb2ZmZXIgYW5kIGFuc3dlciBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGJvdGggcGFydGllcyBzdXBwb3J0IElDRSBhbmQgSUNFIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwal9ib29sX3QgYWN0aXZlOworCisgICAgLyoqCisgICAgICogSUNFIHNlc2lvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwal9pY2Vfc3RyYW5zX3N0YXRlIHNlc3Nfc3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHJvbGUuCisgICAgICovCisgICAgcGpfaWNlX3Nlc3Nfcm9sZSByb2xlOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIGNvbXBvbmVudCBhcnJheS4gQmVmb3JlIElDRSBuZWdvdGlhdGlvbgorICAgICAqIGlzIGNvbXBsZXRlLCB0aGUgbnVtYmVyIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIG9mIHRoZQorICAgICAqIGxvY2FsIGFnZW50LiBBZnRlciBJQ0UgbmVnb3RpYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwKKyAgICAgKiB0aGUgbnVtYmVyIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBjb21tb24gY29tcG9uZW50cyBiZXR3ZWVuIGxvY2FsCisgICAgICogYW5kIHJlbW90ZSBhZ2VudHMuCisgICAgICovCisgICAgdW5zaWduZWQgY29tcF9jbnQ7CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBvZiBJQ0UgY29tcG9uZW50cy4gVHlwaWNhbGx5IHRoZSBmaXJzdCBlbGVtZW50IGRlbm90ZXMgUlRQIGFuZAorICAgICAqIHNlY29uZCBlbGVtZW50IGRlbm90ZXMgUlRDUC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisJLyoqCisJICogTG9jYWwgY2FuZGlkYXRlIHR5cGUuCisJICovCisJcGpfaWNlX2NhbmRfdHlwZSAgICBsY2FuZF90eXBlOworCisJLyoqCisJICogVGhlIGxvY2FsIGFkZHJlc3MuCisJICovCisJcGpfc29ja2FkZHIJICAgIGxjYW5kX2FkZHI7CisKKwkvKioKKwkgKiBSZW1vdGUgY2FuZGlkYXRlIHR5cGUuCisJICovCisJcGpfaWNlX2NhbmRfdHlwZSAgICByY2FuZF90eXBlOworCisJLyoqCisJICogUmVtb3RlIGFkZHJlc3MuCisJICovCisJcGpfc29ja2FkZHIJICAgIHJjYW5kX2FkZHI7CisKKyAgICB9IGNvbXBbMl07CisKK30gcGptZWRpYV9pY2VfdHJhbnNwb3J0X2luZm87CisKKworLyoqCisgKiBPcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIElDRSB0cmFuc3BvcnQuCisgKi8KK2VudW0gcGptZWRpYV90cmFuc3BvcnRfaWNlX29wdGlvbnMKK3sKKyAgICAvKioKKyAgICAgKiBOb3JtYWxseSB3aGVuIHJlbW90ZSBkb2Vzbid0IHVzZSBJQ0UsIHRoZSBJQ0UgdHJhbnNwb3J0IHdpbGwgCisgICAgICogY29udGludW91c2x5IGNoZWNrIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiBpbmNvbWluZyBwYWNrZXRzIHRvIHNlZSAKKyAgICAgKiBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29uZmlndXJlZCByZW1vdGUgYWRkcmVzcywgYW5kIHN3aXRjaCAKKyAgICAgKiB0aGUgcmVtb3RlIGFkZHJlc3MgdG8gdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaWYgdGhleSAKKyAgICAgKiBhcmUgZGlmZmVyZW50IGFmdGVyIHNldmVyYWwgcGFja2V0cyBhcmUgcmVjZWl2ZWQuCisgICAgICogU3BlY2lmeWluZyB0aGlzIG9wdGlvbiB3aWxsIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorICAgICAqLworICAgIFBKTUVESUFfSUNFX05PX1NSQ19BRERSX0NIRUNLSU5HID0gMQorfTsKKworCisvKioKKyAqIENyZWF0ZSB0aGUgSW50ZXJhY3RpdmUgQ29ubmVjdGl2aXR5IEVzdGFibGlzaG1lbnQgKElDRSkgbWVkaWEgdHJhbnNwb3J0CisgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uIFdoZW4gU1RVTiBvciBUVVJOIChvciBib3RoKSBpcyB1c2VkLAorICogdGhlIGNyZWF0aW9uIG9wZXJhdGlvbiB3aWxsIGNvbXBsZXRlIGFzeW5jaHJvbm91c2x5LCB3aGVuIFNUVU4gcmVzb2x1dGlvbgorICogYW5kIFRVUk4gYWxsb2NhdGlvbiBjb21wbGV0ZXMuIFdoZW4gdGhlIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlcywgdGhlCisgKiBcYSBvbl9pY2VfY29tcGxldGUoKSBjb21wbGV0ZSB3aWxsIGJlIGNhbGxlZCB3aXRoIFxhIG9wIHBhcmFtZXRlciBlcXVhbAorICogdG8gUEpfSUNFX1NUUkFOU19PUF9JTklULgorICoKKyAqIEluIGFkZGl0aW9uLCB0aGlzIHRyYW5zcG9ydCB3aWxsIGFsc28gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBhYm91dCB0aGUKKyAqIHJlc3VsdCBvZiBJQ0UgbmVnb3RpYXRpb24sIGFsc28gaW4gXGEgb25faWNlX2NvbXBsZXRlKCkgY2FsbGJhY2suIEluIHRoaXMKKyAqIGNhc2UgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggXGEgb3AgcGFyYW1ldGVyIGVxdWFsIHRvCisgKiBQSl9JQ0VfU1RSQU5TX09QX05FR09USUFUSU9OLgorICoKKyAqIE90aGVyIHRoYW4gdGhpcywgYXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGUgXHJlZiBQSk1FRElBX1RSQU5TUE9SVCBBUEkKKyAqIHRvIG1hbmlwdWxhdGUgdGhpcyBtZWRpYSB0cmFuc3BvcnQuCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gbmFtZQkJT3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGlzIElDRSBtZWRpYSB0cmFuc3BvcnQKKyAqCQkJZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgKiBAcGFyYW0gY29tcF9jbnQJTnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gYmUgY3JlYXRlZC4KKyAqIEBwYXJhbSBjZmcJCVBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKyAqIEBwYXJhbSBjYgkJT3B0aW9uYWwgc3RydWN0dXJlIGNvbnRhaW5pbmcgSUNFIHNwZWNpZmljIGNhbGxiYWNrcy4KKyAqIEBwYXJhbSBwX3RwCQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIG1lZGlhIHRyYW5zcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX2ljZV9jcmVhdGUocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCXVuc2lnbmVkIGNvbXBfY250LAorCQkJCQljb25zdCBwal9pY2Vfc3RyYW5zX2NmZyAqY2ZnLAorCQkJCQljb25zdCBwam1lZGlhX2ljZV9jYiAqY2IsCisJCQkJCXBqbWVkaWFfdHJhbnNwb3J0ICoqcF90cCk7CisKKworLyoqCisgKiBUaGUgc2FtZSBhcyAjcGptZWRpYV9pY2VfY3JlYXRlKCkgd2l0aCBhZGRpdGlvbmFsIFxhIG9wdGlvbnMgcGFyYW0uCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gbmFtZQkJT3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGlzIElDRSBtZWRpYSB0cmFuc3BvcnQKKyAqCQkJZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgKiBAcGFyYW0gY29tcF9jbnQJTnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gYmUgY3JlYXRlZC4KKyAqIEBwYXJhbSBjZmcJCVBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKyAqIEBwYXJhbSBjYgkJT3B0aW9uYWwgc3RydWN0dXJlIGNvbnRhaW5pbmcgSUNFIHNwZWNpZmljIGNhbGxiYWNrcy4KKyAqIEBwYXJhbSBvcHRpb25zCU9wdGlvbnMsIHNlZSAjcGptZWRpYV90cmFuc3BvcnRfaWNlX29wdGlvbnMuCisgKiBAcGFyYW0gcF90cAkJUG9pbnRlciB0byByZWNlaXZlIHRoZSBtZWRpYSB0cmFuc3BvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9pY2VfY3JlYXRlMihwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSB1bnNpZ25lZCBjb21wX2NudCwKKwkJCQkJIGNvbnN0IHBqX2ljZV9zdHJhbnNfY2ZnICpjZmcsCisJCQkJCSBjb25zdCBwam1lZGlhX2ljZV9jYiAqY2IsCisJCQkJCSB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkgcGptZWRpYV90cmFuc3BvcnQgKipwX3RwKTsKKworLyoqCisgKiBUaGUgc2FtZSBhcyAjcGptZWRpYV9pY2VfY3JlYXRlMigpIHdpdGggYWRkaXRpb25hbCBcYSB1c2VyX2RhdGEgcGFyYW0uCisgKgorICogQHBhcmFtIGVuZHB0CQlUaGUgbWVkaWEgZW5kcG9pbnQuCisgKiBAcGFyYW0gbmFtZQkJT3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGlzIElDRSBtZWRpYSB0cmFuc3BvcnQKKyAqCQkJZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgKiBAcGFyYW0gY29tcF9jbnQJTnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gYmUgY3JlYXRlZC4KKyAqIEBwYXJhbSBjZmcJCVBvaW50ZXIgdG8gY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKyAqIEBwYXJhbSBjYgkJT3B0aW9uYWwgc3RydWN0dXJlIGNvbnRhaW5pbmcgSUNFIHNwZWNpZmljIGNhbGxiYWNrcy4KKyAqIEBwYXJhbSBvcHRpb25zCU9wdGlvbnMsIHNlZSAjcGptZWRpYV90cmFuc3BvcnRfaWNlX29wdGlvbnMuCisgKiBAcGFyYW0gdXNlcl9kYXRhCVVzZXIgZGF0YSB0byBiZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNwb3J0LgorICogQHBhcmFtIHBfdHAJCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgbWVkaWEgdHJhbnNwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfaWNlX2NyZWF0ZTMocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgdW5zaWduZWQgY29tcF9jbnQsCisJCQkJCSBjb25zdCBwal9pY2Vfc3RyYW5zX2NmZyAqY2ZnLAorCQkJCQkgY29uc3QgcGptZWRpYV9pY2VfY2IgKmNiLAorCQkJCQkgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJIHBqbWVkaWFfdHJhbnNwb3J0ICoqcF90cCk7CisKKy8qKgorICogR2V0IHRoZSBncm91cCBsb2NrIGZvciB0aGUgSUNFIG1lZGlhIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gdHAJICAgICAgICBUaGUgSUNFIG1lZGlhIHRyYW5zcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlUaGUgZ3JvdXAgbG9jay4KKyAqLworUEpfREVDTChwal9ncnBfbG9ja190ICopIHBqbWVkaWFfaWNlX2dldF9ncnBfbG9jayhwam1lZGlhX3RyYW5zcG9ydCAqdHApOworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfVFJBTlNQT1JUX0lDRV9IX18gKi8KKworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfbG9vcC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2xvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFhNWJhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X2xvb3AuaApAQCAtMCwwICsxLDgyIEBACisvKiAkSWQ6IHRyYW5zcG9ydF9sb29wLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1RSQU5TUE9SVF9MT09QX0hfXworI2RlZmluZSBfX1BKTUVESUFfVFJBTlNQT1JUX0xPT1BfSF9fCisKKworLyoqCisgKiBAZmlsZSB0cmFuc3BvcnRfbG9vcC5oCisgKiBAYnJpZWYgTG9vcGJhY2sgdHJhbnNwb3J0CisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvc3RyZWFtLmg+CisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9UUkFOU1BPUlRfTE9PUCBMb29wYmFjayBNZWRpYSBUcmFuc3BvcnQKKyAqIEBpbmdyb3VwIFBKTUVESUFfVFJBTlNQT1JUCisgKiBAYnJpZWYgTG9vcGJhY2sgdHJhbnNwb3J0IGZvciB0ZXN0aW5nLgorICogQHsKKyAqCisgKiBUaGlzIGlzIHRoZSBsb29wYmFjayBtZWRpYSB0cmFuc3BvcnQsIHdoZXJlIHBhY2tldHMgc2VudCB0byB0aGlzIHRyYW5zcG9ydAorICogd2lsbCBiZSBzZW50IGJhY2sgdG8gdGhlIHN0cmVhbXMgYXR0YWNoZWQgdG8gdGhpcyB0cmFuc3BvcnQuIFVubGlrZSB0aGUKKyAqIG90aGVyIFBKTUVESUEgdHJhbnNwb3J0cywgdGhlIGxvb3AgdHJhbnNwb3J0IG1heSBiZSBhdHRhY2hlZCB0byBtdWx0aXBsZQorICogc3RyZWFtcyAoaW4gb3RoZXIgd29yZHMsIGFwcGxpY2F0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzYW1lIGxvb3AgdHJhbnNwb3J0CisgKiBpbnN0YW5jZSB3aGVuIGNhbGxpbmcgI3BqbWVkaWFfc3RyZWFtX2NyZWF0ZSgpKS4gQW55IFJUUCBvciBSVENQIHBhY2tldHMKKyAqIHNlbnQgYnkgb25lIHN0cmVhbSB0byB0aGlzIHRyYW5zcG9ydCBieSBkZWZhdWx0IHdpbGwgYmUgc2VudCBiYWNrIHRvIGFsbCAKKyAqIHN0cmVhbXMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhpcyB0cmFuc3BvcnQsIGluY2x1ZGluZyB0byB0aGUgc3RyZWFtIHRoYXQKKyAqIHNlbmRzIHRoZSBwYWNrZXQuIEFwcGxpY2F0aW9uIG1heSBpbmRpdmlkdWFsbHkgc2VsZWN0IHdoaWNoIHN0cmVhbSB0bworICogcmVjZWl2ZSBwYWNrZXRzIGJ5IGNhbGxpbmcgI3BqbWVkaWFfdHJhbnNwb3J0X2xvb3BfZGlzYWJsZV9yeCgpLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIENyZWF0ZSB0aGUgbG9vcGJhY2sgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICogQHBhcmFtIHBfdHAJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgdHJhbnNwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90cmFuc3BvcnRfbG9vcF9jcmVhdGUocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCQkgICBwam1lZGlhX3RyYW5zcG9ydCAqKnBfdHApOworCisKKy8qKgorICogU2V0IHRoaXMgc3RyZWFtIGFzIHRoZSByZWNlaXZlciBvZiBpbmNvbWluZyBwYWNrZXRzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9sb29wX2Rpc2FibGVfcngocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJCQkJICAgICAgIHZvaWQgKnVzZXIsCisJCQkJCQkgICAgICAgcGpfYm9vbF90IGRpc2FibGVkKTsKKworCitQSl9FTkRfREVDTAorCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfVFJBTlNQT1JUX0xPT1BfSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3NydHAuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9zcnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYmRhNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3RyYW5zcG9ydF9zcnRwLmgKQEAgLTAsMCArMSwzMTcgQEAKKy8qICRJZDogdHJhbnNwb3J0X3NydHAuaCAzOTk5IDIwMTItMDMtMzAgMDc6MTA6MTNaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfVFJBTlNQT1JUX1NSVFBfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9UUkFOU1BPUlRfU1JUUF9IX18KKworLyoqCisgKiBAZmlsZSB0cmFuc3BvcnRfc3J0cC5oCisgKiBAYnJpZWYgU2VjdXJlIFJUUCAoU1JUUCkgdHJhbnNwb3J0LgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3RyYW5zcG9ydC5oPgorCisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVESUFfVFJBTlNQT1JUX1NSVFAgU2VjdXJlIFJUUCAoU1JUUCkgTWVkaWEgVHJhbnNwb3J0CisgKiBAaW5ncm91cCBQSk1FRElBX1RSQU5TUE9SVAorICogQGJyaWVmIE1lZGlhIHRyYW5zcG9ydCBhZGFwdGVyIHRvIGFkZCBTUlRQIGZlYXR1cmUgdG8gZXhpc3RpbmcgdHJhbnNwb3J0cworICogQHsKKyAqCisgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIFNSVFAgYXMgZGVzY3JpYmVkIGJ5IFJGQyAzNzExLCB1c2luZyBSRkMgNDU2OCBhcworICoga2V5IGV4Y2hhbmdlIG1ldGhvZC4gSXQgaW1wbGVtZW50cyBccmVmIFBKTUVESUFfVFJBTlNQT1JUIHRvIGludGVncmF0ZQorICogd2l0aCB0aGUgcmVzdCBvZiBQSk1FRElBIGZyYW1ld29yay4KKyAqCisgKiBBcyB3ZSBrbm93LCBtZWRpYSB0cmFuc3BvcnQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHN0cmVhbSBvYmplY3QgKHdoaWNoIAorICogZG9lcyB0aGUgZW5jb2RpbmcvZGVjb2Rpbmcgb2YgUENNIGZyYW1lcywgKGRlKXBhY2tldGl6YXRpb24gb2YgUlRQL1JUQ1AgCisgKiBwYWNrZXRzLCBhbmQgZGUtaml0dGVyIGJ1ZmZlcmluZykuIFRoZSBjb25uZWN0aW9uIGJldHdlZW4gc3RyZWFtIGFuZCBtZWRpYQorICogdHJhbnNwb3J0IGlzIGVzdGFibGlzaGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjcmVhdGVkICh3ZSBuZWVkIHRvIHNwZWNpZnkgCisgKiBtZWRpYSB0cmFuc3BvcnQgZHVyaW5nIHN0cmVhbSBjcmVhdGlvbiksIGFuZCB0aGUgaW50ZXJjb25uZWN0aW9uIGNhbiBiZSAKKyAqIGRlcGljdGVkIGZyb20gdGhlIGRpYWdyYW0gYmVsb3c6CisgKgorICAgXGltYWdlIGh0bWwgbWVkaWEtdHJhbnNwb3J0LlBORworCisgKiBJIHRoaW5rIHRoZSBkaWFncmFtIGFib3ZlIGlzIHNlbGYtZXhwbGFuYXRvcnkuCisgKgorICogU1JUUCBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkIGFzIHNvbWUga2luZCBvZiAiYWRhcHRlciIsIHdoaWNoIGlzIAorICogcGx1Z2dlZCBiZXR3ZWVuIHRoZSBzdHJlYW0gYW5kIHRoZSBhY3R1YWwgbWVkaWEgdHJhbnNwb3J0IHRoYXQgZG9lcyAKKyAqIHNlbmRpbmcvcmVjZWl2aW5nIFJUUC9SVENQIHBhY2tldHMuIFdoZW4gU1JUUCBpcyB1c2VkLCB0aGUgaW50ZXJjb25uZWN0aW9uCisgKiBiZXR3ZWVuIHN0cmVhbSBhbmQgdHJhbnNwb3J0IGlzIGxpa2UgdGhlIGRpYWdyYW0gYmVsb3c6CisgKgorICAgIFxpbWFnZSBodG1sIG1lZGlhLXNydHAtdHJhbnNwb3J0LlBORworCisgKiBTbyB0byBzdHJlYW0sIHRoZSBTUlRQIHRyYW5zcG9ydCBiZWhhdmVzIGFzIGlmIGl0IGlzIGEgbWVkaWEgdHJhbnNwb3J0IAorICogKGJlY2F1c2UgaXQgaXMgYSBtZWRpYSB0cmFuc3BvcnQpLCBhbmQgdG8gdGhlIG1lZGlhIHRyYW5zcG9ydCBpdCBiZWhhdmVzCisgKiBhcyBpZiBpdCBpcyBhIHN0cmVhbS4gVGhlIFNSVFAgb2JqZWN0IHRoZW4gZm9yd2FyZHMgUlRQIHBhY2tldHMgYmFjayBhbmQKKyAqIGZvcnRoIGJldHdlZW4gc3RyZWFtIGFuZCB0aGUgYWN0dWFsIHRyYW5zcG9ydCwgZW5jcnlwdGluZy9kZWNyeXB0aW5nIAorICogdGhlIFJUUC9SVENQIHBhY2tldHMgYXMgbmVjZXNzYXJ5LgorICogCisgKiBUaGUgbmVhdCB0aGluZyBhYm91dCB0aGlzIGRlc2lnbiBpcyB0aGUgU1JUUCAiYWRhcHRlciIgdGhlbiBjYW4gYmUgdXNlZCAKKyAqIHRvIGVuY3J5cHQgYW55IGtpbmQgb2YgbWVkaWEgdHJhbnNwb3J0cy4gV2UgY3VycmVudGx5IGhhdmUgVURQIGFuZCBJQ0UgCisgKiBtZWRpYSB0cmFuc3BvcnRzIHRoYXQgY2FuIGJlbmVmaXQgU1JUUCwgYW5kIHdlIGNvdWxkIGFkZCBTUlRQIHRvIGFueSAKKyAqIG1lZGlhIHRyYW5zcG9ydHMgdGhhdCB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuIAorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIENyeXB0byBvcHRpb24uCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX3NydHBfY3J5cHRvX29wdGlvbgoreworICAgIC8qKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIGVuY3J5cHRpb24gd2lsbCBiZSBkaXNhYmxlZC4gKi8KKyAgICBQSk1FRElBX1NSVFBfTk9fRU5DUllQVElPTiAgPSAxLAorCisgICAgLyoqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgYXV0aGVudGljYXRpb24gd2lsbCBiZSBkaXNhYmxlZC4gKi8KKyAgICBQSk1FRElBX1NSVFBfTk9fQVVUSEVOVElDQVRJT04gID0gMgorCit9IHBqbWVkaWFfc3J0cF9jcnlwdG9fb3B0aW9uOworCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGFuIGluZGl2aWR1YWwgY3J5cHRvIHNldHRpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc3J0cF9jcnlwdG8KK3sKKyAgICAvKiogT3B0aW9uYWwga2V5LiBJZiBlbXB0eSwgYSByYW5kb20ga2V5IHdpbGwgYmUgYXV0b2dlbmVyYXRlZC4gKi8KKyAgICBwal9zdHJfdAlrZXk7CisKKyAgICAvKiogQ3J5cHRvIG5hbWUuICAgKi8KKyAgICBwal9zdHJfdAluYW1lOworCisgICAgLyoqIEZsYWdzLCBiaXRtYXNrIGZyb20gI3BqbWVkaWFfc3J0cF9jcnlwdG9fb3B0aW9uICovCisgICAgdW5zaWduZWQJZmxhZ3M7CisKK30gcGptZWRpYV9zcnRwX2NyeXB0bzsKKworCisvKioKKyAqIFRoaXMgZW51bWVyYXRpb24gc3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgU1JUUCB0cmFuc3BvcnQgcmVnYXJkaW5nCisgKiBtZWRpYSBzZWN1cml0eSBvZmZlciBhbmQgYW5zd2VyLgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV9zcnRwX3VzZQoreworICAgIC8qKgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgU1JUUCB3aWxsIGJlIGRpc2FibGVkLCBhbmQgdGhlIHRyYW5zcG9ydAorICAgICAqIHdpbGwgcmVqZWN0IFJUUC9TQVZQIG9mZmVyLgorICAgICAqLworICAgIFBKTUVESUFfU1JUUF9ESVNBQkxFRCwKKworICAgIC8qKgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgU1JUUCB3aWxsIGJlIGFkdmVydGlzZWQgYXMgb3B0aW9uYWwgYW5kCisgICAgICogaW5jb21pbmcgU1JUUCBvZmZlciB3aWxsIGJlIGFjY2VwdGVkLgorICAgICAqLworICAgIFBKTUVESUFfU1JUUF9PUFRJT05BTCwKKworICAgIC8qKgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIHRyYW5zcG9ydCB3aWxsIHJlcXVpcmUgdGhhdCBSVFAvU0FWUAorICAgICAqIG1lZGlhIHNoYWxsIGJlIHVzZWQuCisgICAgICovCisgICAgUEpNRURJQV9TUlRQX01BTkRBVE9SWQorCit9IHBqbWVkaWFfc3J0cF91c2U7CisKKworLyoqCisgKiBTZXR0aW5ncyB0byBiZSBnaXZlbiB3aGVuIGNyZWF0aW5nIFNSVFAgdHJhbnNwb3J0LiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbAorICogI3BqbWVkaWFfc3J0cF9zZXR0aW5nX2RlZmF1bHQoKSB0byBpbml0aWFsaXplIHRoaXMgc3RydWN0dXJlIHdpdGggaXRzIAorICogZGVmYXVsdCB2YWx1ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc3J0cF9zZXR0aW5nCit7CisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgdXNhZ2UgcG9saWN5LiBEZWZhdWx0IGlzIFBKTUVESUFfU1JUUF9PUFRJT05BTC4KKyAgICAgKi8KKyAgICBwam1lZGlhX3NydHBfdXNlCQl1c2U7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNSVFAgdHJhbnNwb3J0IHNob3VsZCBjbG9zZSB0aGUgbWVtYmVyIHRyYW5zcG9ydCAKKyAgICAgKiB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gRGVmYXVsdDogUEpfVFJVRS4KKyAgICAgKi8KKyAgICBwal9ib29sX3QJCQljbG9zZV9tZW1iZXJfdHA7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgY3J5cHRvIHN1aXRlIHNldHRpbmdzLgorICAgICAqLworICAgIHVuc2lnbmVkCQkJY3J5cHRvX2NvdW50OworCisgICAgLyoqCisgICAgICogU3BlY2lmeSBpbmRpdmlkdWFsIGNyeXB0byBzdWl0ZSBzZXR0aW5nLgorICAgICAqLworICAgIHBqbWVkaWFfc3J0cF9jcnlwdG8JCWNyeXB0b1s4XTsKKworfSBwam1lZGlhX3NydHBfc2V0dGluZzsKKworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHNwZWNpZmllcyBTUlRQIHRyYW5zcG9ydCBzcGVjaWZpYyBpbmZvLiBUaGlzIHdpbGwgZml0CisgKiBpbnRvIFxhIGJ1ZmZlciBmaWVsZCBvZiBwam1lZGlhX3RyYW5zcG9ydF9zcGVjaWZpY19pbmZvLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3NydHBfaW5mbworeworICAgIC8qKgorICAgICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU1JUUCB0cmFuc3BvcnQgaXMgYWN0aXZlIGZvciBTUlRQIHNlc3Npb24uCisgICAgICovCisgICAgcGpfYm9vbF90CQkJYWN0aXZlOworCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgcG9saWN5IHVzZWQgYnkgdGhlIFNSVFAgc2Vzc2lvbiBmb3IgcmVjZWl2ZSBkaXJlY3Rpb24uCisgICAgICovCisgICAgcGptZWRpYV9zcnRwX2NyeXB0bwkJcnhfcG9saWN5OworCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgcG9saWN5IHVzZWQgYnkgdGhlIFNSVFAgc2Vzc2lvbiBmb3IgdHJhbnNtaXQgZGlyZWN0aW9uLgorICAgICAqLworICAgIHBqbWVkaWFfc3J0cF9jcnlwdG8JCXR4X3BvbGljeTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhlIHVzYWdlIHBvbGljeS4KKyAgICAgKi8KKyAgICBwam1lZGlhX3NydHBfdXNlCQl1c2U7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBwZWVyJ3MgdXNhZ2UgcG9saWN5LgorICAgICAqLworICAgIHBqbWVkaWFfc3J0cF91c2UJCXBlZXJfdXNlOworCit9IHBqbWVkaWFfc3J0cF9pbmZvOworCisKKy8qKgorICogSW5pdGlhbGl6ZSBTUlRQIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKyAqIGFueSBTUlRQIGZ1bmN0aW9ucywgaG93ZXZlciBjYWxsaW5nICNwam1lZGlhX3RyYW5zcG9ydF9zcnRwX2NyZWF0ZSgpIAorICogd2lsbCBhbHNvIGludm9rZSB0aGlzIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyByZWdpc3RlciBTUlRQCisgKiBsaWJyYXJ5IGRlaW5pdGlhbGl6YXRpb24gdG8gI3BqX2F0ZXhpdCgpLCBzbyB0aGUgZGVpbml0aWFsaXphdGlvbgorICogb2YgU1JUUCBsaWJyYXJ5IHdpbGwgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgUEpMSUIgZGVzdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gZW5kcHQJICAgIFRoZSBtZWRpYSBlbmRwb2ludCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfc3J0cF9pbml0X2xpYihwam1lZGlhX2VuZHB0ICplbmRwdCk7CisKKworLyoqCisgKiBJbml0aWFsaXplIFNSVFAgc2V0dGluZyB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gb3B0CVNSVFAgc2V0dGluZyB0byBiZSBpbml0aWFsaXplZC4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX3NydHBfc2V0dGluZ19kZWZhdWx0KHBqbWVkaWFfc3J0cF9zZXR0aW5nICpvcHQpOworCisKKy8qKgorICogQ3JlYXRlIGFuIFNSVFAgbWVkaWEgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICogQHBhcmFtIHRwCSAgICBUaGUgYWN0dWFsIG1lZGlhIHRyYW5zcG9ydCB0byBzZW5kIGFuZCByZWNlaXZlIAorICoJCSAgICBSVFAvUlRDUCBwYWNrZXRzLiBUaGlzIG1lZGlhIHRyYW5zcG9ydCB3aWxsIGJlCisgKgkJICAgIGtlcHQgYXMgbWVtYmVyIHRyYW5zcG9ydCBvZiB0aGlzIFNSVFAgaW5zdGFuY2UuCisgKiBAcGFyYW0gb3B0CSAgICBPcHRpb25hbCBzZXR0aW5ncy4gSWYgTlVMTCBpcyBnaXZlbiwgZGVmYXVsdAorICoJCSAgICBzZXR0aW5ncyB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gcF90cAkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSB0cmFuc3BvcnQgU1JUUCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X3NydHBfY3JlYXRlKAorCQkJCSAgICAgICBwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkgICAgICAgcGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJCSAgICAgICBjb25zdCBwam1lZGlhX3NydHBfc2V0dGluZyAqb3B0LAorCQkJCSAgICAgICBwam1lZGlhX3RyYW5zcG9ydCAqKnBfdHApOworCisKKy8qKgorICogTWFudWFsbHkgc3RhcnQgU1JUUCBzZXNzaW9uIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuIEFwcGxpY2F0aW9uIG9ubHkKKyAqIG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBTUlRQIHRyYW5zcG9ydCBpcyB1c2VkIHdpdGhvdXQgU0RQCisgKiBvZmZlci9hbnN3ZXIuIFdoZW4gU0RQIG9mZmVyL2Fuc3dlciBmcmFtZXdvcmsgaXMgdXNlZCwgdGhlIFNSVFAgdHJhbnNwb3J0CisgKiB3aWxsIGJlIHN0YXJ0ZWQvc3RvcHBlZCBieSAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfc3RhcnQoKSBhbmQgCisgKiAjcGptZWRpYV90cmFuc3BvcnRfbWVkaWFfc3RvcCgpIHJlc3BlY3RpdmVseS4KKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IGV2ZW4gaWYgYW4gUlRQIHN0cmVhbSBpcyBvbmx5IG9uZSBkaXJlY3Rpb24sIGFwcGxpY2F0aW9uCisgKiB3aWxsIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBib3RoIGNyeXB0byBzdWl0ZXMsIGJlY2F1c2UgaXQgaXMgbmVlZGVkIGJ5IAorICogUlRDUC4KKworICogSWYgYXBwbGljYXRpb24gc3BlY2lmaWVzIHRoZSBjcnlwdG8ga2V5cywgdGhlIGtleXMgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKiBkaXJlY3Rpb24gTVVTVCBiZSBkaWZmZXJlbnQuCisgKgorICogQHBhcmFtIHNydHAJICAgIFRoZSBTUlRQIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSB0eAkgICAgQ3J5cHRvIHN1aXRlIHNldHRpbmcgZm9yIHRyYW5zbWl0IGRpcmVjdGlvbi4KKyAqIEBwYXJhbSByeAkgICAgQ3J5cHRvIHN1aXRlIHNldHRpbmcgZm9yIHJlY2VpdmUgZGlyZWN0aW9uLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90cmFuc3BvcnRfc3J0cF9zdGFydCgKKwkJCQkJICAgIHBqbWVkaWFfdHJhbnNwb3J0ICpzcnRwLAorCQkJCQkgICAgY29uc3QgcGptZWRpYV9zcnRwX2NyeXB0byAqdHgsCisJCQkJCSAgICBjb25zdCBwam1lZGlhX3NydHBfY3J5cHRvICpyeCk7CisKKy8qKgorICogU3RvcCBTUlRQIHNlc3Npb24uCisgKgorICogQHBhcmFtIHNydHAJICAgIFRoZSBTUlRQIG1lZGlhIHRyYW5zcG9ydC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKgorICogQHNlZSAjcGptZWRpYV90cmFuc3BvcnRfc3J0cF9zdGFydCgpIAorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF9zcnRwX3N0b3AocGptZWRpYV90cmFuc3BvcnQgKnNydHApOworCisKKy8qKgorICogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gZGVjcnlwdCBTUlRQIHBhY2tldCB1c2luZyBTUlRQIHRyYW5zcG9ydC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgU1JUUCB0cmFuc3BvcnQncyBBUEksIGJ1dCBpdCBjYW4gYmUgdXNlZAorICogdG8gZGVjcnlwdCBTUlRQIHBhY2tldHMgZnJvbSBub24tbmV0d29yayAoZm9yIGV4YW1wbGUsIGZyb20gYSBzYXZlZCBmaWxlKQorICogd2l0aG91dCBoYXZpbmcgdG8gdXNlIHRoZSB0cmFuc3BvcnQgZnJhbWV3b3JrLiBTZWUgcGNhcHV0aWwuYyBpbiB0aGUKKyAqIHNhbXBsZXMgY29sbGVjdGlvbiBvbiBob3cgdG8gdXNlIHRoaXMgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRwCQlUaGUgU1JUUCB0cmFuc3BvcnQuCisgKiBAcGFyYW0gaXNfcnRwCVNldCB0byBub24temVybyBpZiB0aGUgcGFja2V0IGlzIFNSVFAsIG90aGVyd2lzZSBzZXQKKyAqCQkJdG8gemVybyBpZiB0aGUgcGFja2V0IGlzIFNSVENQLgorICogQHBhcmFtIHBrdAkJT24gaW5wdXQsIGl0IGNvbnRhaW5zIFNSVFAgb3IgU1JUQ1AgcGFja2V0LiBPbgorICoJCQlvdXRwdXQsIGl0IGNvbnRhaW5zIHRoZSBkZWNyeXB0ZWQgUlRQL1JUQ1AgcGFja2V0LgorICogQHBhcmFtIHBrdF9sZW4JT24gaW5wdXQsIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLiBPbgorICoJCQlvdXRwdXQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGFjdHVhbCBsZW5ndGgKKyAqCQkJb2YgZGVjcnlwdGVkIHBhY2tldC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X3NydHBfZGVjcnlwdF9wa3QocGptZWRpYV90cmFuc3BvcnQgKnRwLAorCQkJCQkJCXBqX2Jvb2xfdCBpc19ydHAsCisJCQkJCQkJdm9pZCAqcGt0LAorCQkJCQkJCWludCAqcGt0X2xlbik7CisKKworLyoqCisgKiBRdWVyeSBtZW1iZXIgdHJhbnNwb3J0IG9mIFNSVFAuCisgKgorICogQHBhcmFtIHNydHAJCSAgICBUaGUgU1JUUCBtZWRpYSB0cmFuc3BvcnQuCisgKgorICogQHJldHVybgkJICAgIG1lbWJlciBtZWRpYSB0cmFuc3BvcnQuCisgKi8KK1BKX0RFQ0wocGptZWRpYV90cmFuc3BvcnQqKSBwam1lZGlhX3RyYW5zcG9ydF9zcnRwX2dldF9tZW1iZXIoCisJCQkJCQkgICAgcGptZWRpYV90cmFuc3BvcnQgKnNydHApOworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisjZW5kaWYgLyogX19QSk1FRElBX1RSQU5TUE9SVF9TUlRQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3VkcC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdHJhbnNwb3J0X3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTg5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90cmFuc3BvcnRfdWRwLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qICRJZDogdHJhbnNwb3J0X3VkcC5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9UUkFOU1BPUlRfVURQX0hfXworI2RlZmluZSBfX1BKTUVESUFfVFJBTlNQT1JUX1VEUF9IX18KKworCisvKioKKyAqIEBmaWxlIHRyYW5zcG9ydF91ZHAuaAorICogQGJyaWVmIFN0cmVhbSB0cmFuc3BvcnQgd2l0aCBVRFAuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvc3RyZWFtLmg+CisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9UUkFOU1BPUlRfVURQIFVEUCBNZWRpYSBUcmFuc3BvcnQKKyAqIEBpbmdyb3VwIFBKTUVESUFfVFJBTlNQT1JUCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgbWVkaWEgdHJhbnNwb3J0IHdpdGggVURQIHNvY2tldHMuCisgKiBAeworICoKKyAqIFRoZSBVRFAgbWVkaWEgdHJhbnNwb3J0IGlzIHRoZSBzdGFuZGFyZCBiYXNlZCBtZWRpYSB0cmFuc3BvcnQKKyAqIGFzIGRlc2NyaWJlZCBieSBSRkMgMzU1MC8zNTUxLiBJdCBjYW4gYmUgdXNlZCB0byBmYWNpbGl0YXRlIFJUUC9SVENQCisgKiB1bmljYXN0IG9yIG11bHRpY2FzdCBjb21tdW5pY2F0aW9uLgorICovCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIE9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgVURQIHRyYW5zcG9ydC4KKyAqLworZW51bSBwam1lZGlhX3RyYW5zcG9ydF91ZHBfb3B0aW9ucworeworICAgIC8qKgorICAgICAqIE5vcm1hbGx5IHRoZSBVRFAgdHJhbnNwb3J0IHdpbGwgY29udGludW91c2x5IGNoZWNrIHRoZSBzb3VyY2UgYWRkcmVzcworICAgICAqIG9mIGluY29taW5nIHBhY2tldHMgdG8gc2VlIGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb25maWd1cmVkCisgICAgICogcmVtb3RlIGFkZHJlc3MsIGFuZCBzd2l0Y2ggdGhlIHJlbW90ZSBhZGRyZXNzIHRvIHRoZSBzb3VyY2UgYWRkcmVzcworICAgICAqIG9mIHRoZSBwYWNrZXQgaWYgdGhleSBhcmUgZGlmZmVyZW50IGFmdGVyIHNldmVyYWwgcGFja2V0cyBhcmUKKyAgICAgKiByZWNlaXZlZC4KKyAgICAgKiBTcGVjaWZ5aW5nIHRoaXMgb3B0aW9uIHdpbGwgZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgICAgICovCisgICAgUEpNRURJQV9VRFBfTk9fU1JDX0FERFJfQ0hFQ0tJTkcgPSAxCit9OworCisKKy8qKgorICogQ3JlYXRlIGFuIFJUUCBhbmQgUlRDUCBzb2NrZXRzIGFuZCBiaW5kIHRoZSBzb2NrZXRzIHRvIHRoZSBzcGVjaWZpZWQKKyAqIHBvcnQgdG8gY3JlYXRlIG1lZGlhIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gZW5kcHQJICAgIFRoZSBtZWRpYSBlbmRwb2ludCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBuYW1lCSAgICBPcHRpb25hbCBuYW1lIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gcG9ydAkgICAgVURQIHBvcnQgbnVtYmVyIGZvciB0aGUgUlRQIHNvY2tldC4gVGhlIFJUQ1AgcG9ydCBudW1iZXIKKyAqCQkgICAgd2lsbCBiZSBzZXQgdG8gb25lIGFib3ZlIFJUUCBwb3J0LgorICogQHBhcmFtIG9wdGlvbnMgICBPcHRpb25zLCBiaXRtYXNrIG9mICNwam1lZGlhX3RyYW5zcG9ydF91ZHBfb3B0aW9ucy4KKyAqIEBwYXJhbSBwX3RwCSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHRyYW5zcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdHJhbnNwb3J0X3VkcF9jcmVhdGUocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgIGludCBwb3J0LAorCQkJCQkJICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkJICBwam1lZGlhX3RyYW5zcG9ydCAqKnBfdHApOworCisKKy8qKgorICogQ3JlYXRlIGFuIFJUUCBhbmQgUlRDUCBzb2NrZXRzIGFuZCBiaW5kIHRoZSBzb2NrZXRzIHRvIHRoZSBzcGVjaWZpZWQKKyAqIGFkZHJlc3MgYW5kIHBvcnQgdG8gY3JlYXRlIG1lZGlhIHRyYW5zcG9ydC4KKyAqCisgKiBAcGFyYW0gZW5kcHQJICAgIFRoZSBtZWRpYSBlbmRwb2ludCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBuYW1lCSAgICBPcHRpb25hbCBuYW1lIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB0cmFuc3BvcnQuCisgKiBAcGFyYW0gYWRkcgkgICAgT3B0aW9uYWwgbG9jYWwgYWRkcmVzcyB0byBiaW5kIHRoZSBzb2NrZXRzIHRvLiBJZiB0aGlzCisgKgkJICAgIGFyZ3VtZW50IGlzIE5VTEwgb3IgZW1wdHksIHRoZSBzb2NrZXRzIHdpbGwgYmUgYm91bmQKKyAqCQkgICAgdG8gYWxsIGludGVyZmFjZS4KKyAqIEBwYXJhbSBwb3J0CSAgICBVRFAgcG9ydCBudW1iZXIgZm9yIHRoZSBSVFAgc29ja2V0LiBUaGUgUlRDUCBwb3J0IG51bWJlcgorICoJCSAgICB3aWxsIGJlIHNldCB0byBvbmUgYWJvdmUgUlRQIHBvcnQuCisgKiBAcGFyYW0gb3B0aW9ucyAgIE9wdGlvbnMsIGJpdG1hc2sgb2YgI3BqbWVkaWFfdHJhbnNwb3J0X3VkcF9vcHRpb25zLgorICogQHBhcmFtIHBfdHAJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgdHJhbnNwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90cmFuc3BvcnRfdWRwX2NyZWF0ZTIocGptZWRpYV9lbmRwdCAqZW5kcHQsCisJCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJICAgY29uc3QgcGpfc3RyX3QgKmFkZHIsCisJCQkJCQkgICBpbnQgcG9ydCwKKwkJCQkJCSAgIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCQkgICBwam1lZGlhX3RyYW5zcG9ydCAqKnBfdHApOworCisvKioKKyAqIEFub3RoZXIgdmFyaWFudCBvZiAjcGptZWRpYV90cmFuc3BvcnRfdWRwX2NyZWF0ZSgpIHdoaWNoIGFsbG93cworICogdGhlIGNyZWF0aW9uIG9mIElQdjYgdHJhbnNwb3J0LgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICogQHBhcmFtIGFmCSAgICBBZGRyZXNzIGZhbWlseSwgd2hpY2ggY2FuIGJlIHBqX0FGX0lORVQoKSBmb3IgSVB2NCBvcgorICoJCSAgICBwal9BRl9JTkVUNigpIGZvciBJUHY2LgorICogQHBhcmFtIG5hbWUJICAgIE9wdGlvbmFsIG5hbWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBhZGRyCSAgICBPcHRpb25hbCBsb2NhbCBhZGRyZXNzIHRvIGJpbmQgdGhlIHNvY2tldHMgdG8uIElmIHRoaXMKKyAqCQkgICAgYXJndW1lbnQgaXMgTlVMTCBvciBlbXB0eSwgdGhlIHNvY2tldHMgd2lsbCBiZSBib3VuZAorICoJCSAgICB0byBhbGwgaW50ZXJmYWNlLgorICogQHBhcmFtIHBvcnQJICAgIFVEUCBwb3J0IG51bWJlciBmb3IgdGhlIFJUUCBzb2NrZXQuIFRoZSBSVENQIHBvcnQgbnVtYmVyCisgKgkJICAgIHdpbGwgYmUgc2V0IHRvIG9uZSBhYm92ZSBSVFAgcG9ydC4KKyAqIEBwYXJhbSBvcHRpb25zICAgT3B0aW9ucywgYml0bWFzayBvZiAjcGptZWRpYV90cmFuc3BvcnRfdWRwX29wdGlvbnMuCisgKiBAcGFyYW0gcF90cAkgICAgUG9pbnRlciB0byByZWNlaXZlIHRoZSB0cmFuc3BvcnQgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3RyYW5zcG9ydF91ZHBfY3JlYXRlMyhwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkJCSAgIGludCBhZiwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICBjb25zdCBwal9zdHJfdCAqYWRkciwKKwkJCQkJCSAgIGludCBwb3J0LAorCQkJCQkJICAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJCSAgIHBqbWVkaWFfdHJhbnNwb3J0ICoqcF90cCk7CisKKworLyoqCisgKiBDcmVhdGUgVURQIHN0cmVhbSB0cmFuc3BvcnQgZnJvbSBleGlzdGluZyBzb2NrZXRzLiBVc2UgdGhpcyBmdW5jdGlvbiB3aGVuCisgKiB0aGUgc29ja2V0cyBoYXZlIHByZXZpb3VzbHkgYmVlbiBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIG1lZGlhIGVuZHBvaW50IGluc3RhbmNlLgorICogQHBhcmFtIG5hbWUJICAgIE9wdGlvbmFsIG5hbWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHRyYW5zcG9ydC4KKyAqIEBwYXJhbSBzaQkgICAgTWVkaWEgc29ja2V0IGluZm8gY29udGFpbmluZyB0aGUgUlRQIGFuZCBSVENQIHNvY2tldHMuCisgKiBAcGFyYW0gb3B0aW9ucyAgIE9wdGlvbnMsIGJpdG1hc2sgb2YgI3BqbWVkaWFfdHJhbnNwb3J0X3VkcF9vcHRpb25zLgorICogQHBhcmFtIHBfdHAJICAgIFBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgdHJhbnNwb3J0IGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV90cmFuc3BvcnRfdWRwX2F0dGFjaChwam1lZGlhX2VuZHB0ICplbmRwdCwKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgY29uc3QgcGptZWRpYV9zb2NrX2luZm8gKnNpLAorCQkJCQkJICB1bnNpZ25lZCBvcHRpb25zLAorCQkJCQkJICBwam1lZGlhX3RyYW5zcG9ydCAqKnBfdHApOworCisKK1BKX0VORF9ERUNMCisKKworLyoqCisgKiBAfQorICovCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9UUkFOU1BPUlRfVURQX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3R5cGVzLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTQxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS90eXBlcy5oCkBAIC0wLDAgKzEsMjcyIEBACisvKiAkSWQ6IHR5cGVzLmggMzc3NCAyMDExLTA5LTI3IDA1OjI0OjA2WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1RZUEVTX0hfXworI2RlZmluZSBfX1BKTUVESUFfVFlQRVNfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYS90eXBlcy5oIEJhc2ljIFR5cGVzCisgKiBAYnJpZWYgQmFzaWMgUEpNRURJQSB0eXBlcy4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS9jb25maWcuaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovdHlwZXMuaD4KKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1BPUlQgTWVkaWEgUG9ydHMgRnJhbWV3b3JrCisgKiBAYnJpZWYgRXh0ZW5zaWJsZSBmcmFtZXdvcmsgZm9yIG1lZGlhIHRlcm1pbmF0aW9ucworICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GUkFNRV9PUCBBdWRpbyBNYW5pcHVsYXRpb24gQWxnb3JpdGhtcworICogQGJyaWVmIEFsZ29yaXRobXMgdG8gbWFuaXB1bGF0ZSBhdWRpbyBmcmFtZXMKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1RZUEVTIEJhc2ljIFR5cGVzCisgKiBAaW5ncm91cCBQSk1FRElBX0JBU0UKKyAqIEBicmllZiBCYXNpYyBQSk1FRElBIHR5cGVzIGFuZCBvcGVyYXRpb25zLgorICogQHsKKyAqLworCisvKioKKyAqIFRvcCBtb3N0IG1lZGlhIHR5cGUuIFNlZSBhbHNvICNwam1lZGlhX3R5cGVfbmFtZSgpLgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV90eXBlCit7CisgICAgLyoqIFR5cGUgaXMgbm90IHNwZWNpZmllZC4gKi8KKyAgICBQSk1FRElBX1RZUEVfTk9ORSwKKworICAgIC8qKiBUaGUgbWVkaWEgaXMgYXVkaW8gKi8KKyAgICBQSk1FRElBX1RZUEVfQVVESU8sCisKKyAgICAvKiogVGhlIG1lZGlhIGlzIHZpZGVvLiAqLworICAgIFBKTUVESUFfVFlQRV9WSURFTywKKworICAgIC8qKiBUaGUgbWVkaWEgaXMgYXBwbGljYXRpb24uICovCisgICAgUEpNRURJQV9UWVBFX0FQUExJQ0FUSU9OLAorCisgICAgLyoqIFRoZSBtZWRpYSB0eXBlIGlzIHVua25vd24gb3IgdW5zdXBwb3J0ZWQuICovCisgICAgUEpNRURJQV9UWVBFX1VOS05PV04KKworfSBwam1lZGlhX3R5cGU7CisKKworLyoqCisgKiBNZWRpYSB0cmFuc3BvcnQgcHJvdG9jb2wuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX3RwX3Byb3RvCit7CisgICAgLyoqIE5vIHRyYW5zcG9ydCB0eXBlICovCisgICAgUEpNRURJQV9UUF9QUk9UT19OT05FID0gMCwKKworICAgIC8qKiBSVFAgdXNpbmcgQS9WIHByb2ZpbGUgKi8KKyAgICBQSk1FRElBX1RQX1BST1RPX1JUUF9BVlAsCisKKyAgICAvKiogU2VjdXJlIFJUUCAqLworICAgIFBKTUVESUFfVFBfUFJPVE9fUlRQX1NBVlAsCisKKyAgICAvKiogVW5rbm93biAqLworICAgIFBKTUVESUFfVFBfUFJPVE9fVU5LTk9XTgorCit9IHBqbWVkaWFfdHBfcHJvdG87CisKKworLyoqCisgKiBNZWRpYSBkaXJlY3Rpb24uCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX2RpcgoreworICAgIC8qKiBOb25lICovCisgICAgUEpNRURJQV9ESVJfTk9ORSA9IDAsCisKKyAgICAvKiogRW5jb2RpbmcgKG91dGdvaW5nIHRvIG5ldHdvcmspIHN0cmVhbSwgYWxzbyBrbm93biBhcyBjYXB0dXJlICovCisgICAgUEpNRURJQV9ESVJfRU5DT0RJTkcgPSAxLAorCisgICAgLyoqIFNhbWUgYXMgZW5jb2RpbmcgZGlyZWN0aW9uLiAqLworICAgIFBKTUVESUFfRElSX0NBUFRVUkUgPSBQSk1FRElBX0RJUl9FTkNPRElORywKKworICAgIC8qKiBEZWNvZGluZyAoaW5jb21pbmcgZnJvbSBuZXR3b3JrKSBzdHJlYW0sIGFsc28ga25vd24gYXMgcGxheWJhY2suICovCisgICAgUEpNRURJQV9ESVJfREVDT0RJTkcgPSAyLAorCisgICAgLyoqIFNhbWUgYXMgZGVjb2RpbmcuICovCisgICAgUEpNRURJQV9ESVJfUExBWUJBQ0sgPSBQSk1FRElBX0RJUl9ERUNPRElORywKKworICAgIC8qKiBTYW1lIGFzIGRlY29kaW5nLiAqLworICAgIFBKTUVESUFfRElSX1JFTkRFUiA9IFBKTUVESUFfRElSX0RFQ09ESU5HLAorCisgICAgLyoqIEluY29taW5nIGFuZCBvdXRnb2luZyBzdHJlYW0sIHNhbWUgYXMgUEpNRURJQV9ESVJfQ0FQVFVSRV9QTEFZQkFDSyAqLworICAgIFBKTUVESUFfRElSX0VOQ09ESU5HX0RFQ09ESU5HID0gMywKKworICAgIC8qKiBTYW1lIGFzIEVOQ09ESU5HX0RFQ09ESU5HICovCisgICAgUEpNRURJQV9ESVJfQ0FQVFVSRV9QTEFZQkFDSyA9IFBKTUVESUFfRElSX0VOQ09ESU5HX0RFQ09ESU5HLAorCisgICAgLyoqIFNhbWUgYXMgRU5DT0RJTkdfREVDT0RJTkcgKi8KKyAgICBQSk1FRElBX0RJUl9DQVBUVVJFX1JFTkRFUiA9IFBKTUVESUFfRElSX0VOQ09ESU5HX0RFQ09ESU5HCisKK30gcGptZWRpYV9kaXI7CisKKworLyoqCisgKiBPcGFxdWUgZGVjbGFyYXRpb24gb2YgbWVkaWEgZW5kcG9pbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfZW5kcHQgcGptZWRpYV9lbmRwdDsKKworLyoKKyAqIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHN0cmVhbSAobmVlZGVkIGJ5IHRyYW5zcG9ydCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfc3RyZWFtIHBqbWVkaWFfc3RyZWFtOworCisvKioKKyAqIEVudW1lcmF0aW9uIGZvciBwaWN0dXJlIGNvb3JkaW5hdGUgYmFzZS4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfY29vcmRfYmFzZQoreworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lmaWVzIHRoYXQgdGhlIHBpeGVsIFswLCAwXSBsb2NhdGlvbiBpcyBhdCB0aGUgbGVmdC10b3AKKyAgICAgKiBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBQSk1FRElBX0NPT1JEX0JBU0VfTEVGVF9UT1AsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNwZWNpZmllcyB0aGF0IHRoZSBwaXhlbCBbMCwgMF0gbG9jYXRpb24gaXMgYXQgdGhlIGxlZnQtYm90dG9tCisgICAgICogcG9zaXRpb24uCisgICAgICovCisgICAgUEpNRURJQV9DT09SRF9CQVNFX0xFRlRfQk9UVE9NCisKK30gcGptZWRpYV9jb29yZF9iYXNlOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHJhdGlvbmFsIG51bWJlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcmF0aW8KK3sKKyAgICBpbnQJCW51bTsgICAgLyoqIDwgTnVtZXJhdG9yLiAqLworICAgIGludAkJZGVudW07ICAvKiogPCBEZW51bWVyYXRvci4gKi8KK30gcGptZWRpYV9yYXRpbzsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgYSBjb29yZGluYXRlLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX2Nvb3JkCit7CisgICAgaW50CQl4OwkvKio8IFggcG9zaXRpb24gb2YgdGhlIGNvb3JkaW5hdGUgKi8KKyAgICBpbnQJCXk7CS8qKjwgWSBwb3NpdGlvbiBvZiB0aGUgY29vcmRpbmF0ZSAqLworfSBwam1lZGlhX2Nvb3JkOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgcmVjdGFuZ2xlIHNpemUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfcmVjdF9zaXplCit7CisgICAgdW5zaWduZWQJdzsJLyoqPCBUaGUgd2lkdGguCQkqLworICAgIHVuc2lnbmVkIAloOwkvKio8IFRoZSBoZWlnaHQuCSovCit9IHBqbWVkaWFfcmVjdF9zaXplOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHJlY3RhbmdsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV9yZWN0Cit7CisgICAgcGptZWRpYV9jb29yZAljb29yZDsJLyoqPCBUaGUgcG9zaXRpb24uCSovCisgICAgcGptZWRpYV9yZWN0X3NpemUJc2l6ZTsJLyoqPCBUaGUgc2l6ZS4JCSovCit9IHBqbWVkaWFfcmVjdDsKKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3IgdmlkZW8vcGljdHVyZSBvcmllbnRhdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIHBqbWVkaWFfb3JpZW50Cit7CisgICAgLyoqCisgICAgICogVW5rbm93biBvcmllbnRhdGlvbi4KKyAgICAgKi8KKyAgICBQSk1FRElBX09SSUVOVF9VTktOT1dOLAorCisgICAgLyoqCisgICAgICogTmF0dXJhbCBvcmllbnRhdGlvbiwgZS5nOiBza3kgdXBzaWRlIG9uIGxhbmRzY2FwZSB2aWV3LCBoZWFkIHVwc2lkZQorICAgICAqIG9uIGh1bWFuIHBvcnRyYWl0LgorICAgICAqLworICAgIFBKTUVESUFfT1JJRU5UX05BVFVSQUwsCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgdmlkZW8vcGljdHVyZSBuZWVkcyB0byBiZSByb3RhdGVkIDkwIGRlZ3JlZXMKKyAgICAgKiBjbG9ja3dpc2UgdG8gYmUgZGlzcGxheWVkIGluIG5hdHVyYWwgb3JpZW50YXRpb24uCisgICAgICovCisgICAgUEpNRURJQV9PUklFTlRfUk9UQVRFXzkwREVHLAorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIHZpZGVvL3BpY3R1cmUgbmVlZHMgdG8gYmUgcm90YXRlZCAxODAgZGVncmVlcworICAgICAqIGNsb2Nrd2lzZSB0byBiZSBkaXNwbGF5ZWQgaW4gbmF0dXJhbCBvcmllbnRhdGlvbi4KKyAgICAgKi8KKyAgICBQSk1FRElBX09SSUVOVF9ST1RBVEVfMTgwREVHLAorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIHZpZGVvL3BpY3R1cmUgbmVlZHMgdG8gYmUgcm90YXRlZCAyNzAgZGVncmVlcworICAgICAqIGNsb2Nrd2lzZSB0byBiZSBkaXNwbGF5ZWQgaW4gbmF0dXJhbCBvcmllbnRhdGlvbi4KKyAgICAgKi8KKyAgICBQSk1FRElBX09SSUVOVF9ST1RBVEVfMjcwREVHCisKK30gcGptZWRpYV9vcmllbnQ7CisKKworLyoqCisgKiBNYWNybyBmb3IgcGFja2luZyBmb3JtYXQgZnJvbSBhIGZvdXIgY2hhcmFjdGVyIGNvZGUsIHNpbWlsYXIgdG8gRk9VUkNDLgorICovCisjZGVmaW5lIFBKTUVESUFfRk9VUkNDKEMxLCBDMiwgQzMsIEM0KSAoIEM0PDwyNCB8IEMzPDwxNiB8IEMyPDw4IHwgQzEgKQorCisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHN0cmluZyBuYW1lIGZvciBhIHBqbWVkaWFfdHlwZS4KKyAqCisgKiBAcGFyYW0gdAkJVGhlIG1lZGlhIHR5cGUuCisgKgorICogQHJldHVybgkJU3RyaW5nLgorICovCitQSl9ERUNMKGNvbnN0IGNoYXIqKSBwam1lZGlhX3R5cGVfbmFtZShwam1lZGlhX3R5cGUgdCk7CisKKy8qKgorICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgZm91cmNjIHR5cGUgb2YgdmFsdWUgdG8gZm91ciBsZXR0ZXJzIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gc2lnCQlUaGUgZm91cmNjIHZhbHVlLgorICogQHBhcmFtIGJ1ZgkJQnVmZmVyIHRvIHN0b3JlIHRoZSBzdHJpbmcsIHdoaWNoIE1VU1QgYmUgYXQgbGVhc3QKKyAqIAkJCWZpdmUgYnl0ZXMgbG9uZy4KKyAqCisgKiBAcmV0dXJuCQlUaGUgc3RyaW5nLgorICovCitQSl9JTkxJTkUoY29uc3QgY2hhciopIHBqbWVkaWFfZm91cmNjX25hbWUocGpfdWludDMyX3Qgc2lnLCBjaGFyIGJ1ZltdKQoreworICAgIGJ1ZlszXSA9IChjaGFyKSgoc2lnID4+IDI0KSAmIDB4RkYpOworICAgIGJ1ZlsyXSA9IChjaGFyKSgoc2lnID4+IDE2KSAmIDB4RkYpOworICAgIGJ1ZlsxXSA9IChjaGFyKSgoc2lnID4+ICA4KSAmIDB4RkYpOworICAgIGJ1ZlswXSA9IChjaGFyKSgoc2lnID4+ICAwKSAmIDB4RkYpOworICAgIGJ1Zls0XSA9ICdcMCc7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisvKioKKyAqIEB9CisgKi8KKworCisjZW5kaWYJLyogX19QSk1FRElBX1RZUEVTX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfY29kZWMuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzYwODMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfY29kZWMuaApAQCAtMCwwICsxLDg3MSBAQAorLyogJElkOiB2aWRfY29kZWMuaCAzOTU2IDIwMTItMDItMjEgMDg6MzE6MjZaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfVklEX0NPREVDX0hfXworI2RlZmluZSBfX1BKTUVESUFfVklEX0NPREVDX0hfXworCisKKy8qKgorICogQGZpbGUgdmlkX2NvZGVjLmgKKyAqIEBicmllZiBWaWRlbyBjb2RlYyBmcmFtZXdvcmsuCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvY29kZWMuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2V2ZW50Lmg+CisjaW5jbHVkZSA8cGptZWRpYS9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisjaW5jbHVkZSA8cGovbGlzdC5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1ZJRF9DT0RFQyBWaWRlbyBDb2RlY3MKKyAqIEBpbmdyb3VwIFBKTUVESUFfQ09ERUMKKyAqIEB7CisgKi8KKworI2RlZmluZSBQSk1FRElBX1ZJRF9DT0RFQ19NQVhfREVDX0ZNVF9DTlQgICAgOAorI2RlZmluZSBQSk1FRElBX1ZJRF9DT0RFQ19NQVhfRlBTX0NOVCAgICAgICAgMTYKKworLyoqCisgKiBUaGlzIGVudW1lcmF0aW9uIHNwZWNpZmllcyB0aGUgcGFja2V0aXphdGlvbiBwcm9wZXJ0eSBvZiB2aWRlbyBlbmNvZGluZworICogcHJvY2Vzcy4gVGhlIHZhbHVlIGlzIGJpdG1hc2ssIGFuZCBzbWFsbGVyIHZhbHVlIHdpbGwgaGF2ZSBoaWdoZXIgcHJpb3JpdHkKKyAqIHRvIGJlIHVzZWQuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX3ZpZF9wYWNraW5nCit7CisgICAgLyoqCisgICAgICogVGhpcyBzcGVjaWZpZXMgdGhhdCB0aGUgcGFja2V0aXphdGlvbiBpcyB1bmtub3duLCBvciBpZiBub3RoaW5nCisgICAgICogaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIFBKTUVESUFfVklEX1BBQ0tJTkdfVU5LTk9XTiwKKworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lmaWVzIHRoYXQgdGhlIHJlc3VsdCBvZiB2aWRlbyBlbmNvZGluZyBwcm9jZXNzIHdpbGwgYmUKKyAgICAgKiBzZWdtZW50ZWQgaW50byBwYWNrZXRzLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgUlRQIHRyYW5zbWlzc2lvbi4KKyAgICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBwYWNrZXRzIGlzIHNldCBpbiBcYSBlbmNfbXR1IGZpZWxkIG9mCisgICAgICogcGptZWRpYV92aWRfY29kZWNfcGFyYW0uCisgICAgICovCisgICAgUEpNRURJQV9WSURfUEFDS0lOR19QQUNLRVRTID0gMSwKKworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lmaWVzIHRoYXQgdmlkZW8gZW5jb2RpbmcgZnVuY3Rpb24gd2lsbCBwcm9kdWNlIGEgd2hvbGUKKyAgICAgKiBvciBmdWxsIGZyYW1lIGZyb20gdGhlIHNvdXJjZSBmcmFtZS4gVGhpcyBpcyBub3JtYWxseSB1c2VkIGZvcgorICAgICAqIGVuY29kaW5nIHZpZGVvIGZvciBvZmZsaW5lIHN0b3JhZ2Ugc3VjaCBhcyB0byBhbiBBVkkgZmlsZS4gVGhlCisgICAgICogbWF4aW11bSBzaXplIG9mIHRoZSBwYWNrZXRzIGlzIHNldCBpbiBcYSBlbmNfbXR1IGZpZWxkIG9mCisgICAgICogcGptZWRpYV92aWRfY29kZWNfcGFyYW0uCisgICAgICovCisgICAgUEpNRURJQV9WSURfUEFDS0lOR19XSE9MRSA9IDIKKworfSBwam1lZGlhX3ZpZF9wYWNraW5nOworCisKKy8qKgorICogRW51bWVyYXRpb24gb2YgdmlkZW8gZnJhbWUgaW5mbyBmbGFnIGZvciB0aGUgYml0X2luZm8gZmllbGQgaW4gdGhlCisgKiBwam1lZGlhX2ZyYW1lLgorICovCit0eXBlZGVmIGVudW0gcGptZWRpYV92aWRfZnJtX2JpdF9pbmZvCit7CisgICAgLyoqCisgICAgICogVGhlIHZpZGVvIGZyYW1lIGlzIGtleWZyYW1lLgorICAgICAqLworICAgIFBKTUVESUFfVklEX0ZSTV9LRVlGUkFNRQk9IDEKKworfSBwam1lZGlhX3ZpZF9mcm1fYml0X2luZm87CisKKworLyoqCisgKiBFbmNvZGluZyBvcHRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2VuY29kZV9vcHQKK3sKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGZvcmNlIHRoZSBlbmNvZGVyIHRvIGdlbmVyYXRlIGtleWZyYW1lIGZvciB0aGUgc3BlY2lmaWVkIGlucHV0CisgICAgICogZnJhbWUuIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgYXBwbGljYXRpb24gY2FuIHZlcmlmeSB0aGUgcmVzdWx0IGJ5CisgICAgICogZXhhbWluaW5nIFBKTUVESUFfVklEX0ZSTV9LRVlGUkFNRSBmbGFnIGluIHRoZSBiaXRfaW5mbyBmaWVsZCBvZiB0aGUKKyAgICAgKiBvdXRwdXQgZnJhbWUuCisgICAgICovCisgICAgcGpfYm9vbF90IGZvcmNlX2tleWZyYW1lOworCit9IHBqbWVkaWFfdmlkX2VuY29kZV9vcHQ7CisKKworLyoqIAorICogSWRlbnRpZmljYXRpb24gdXNlZCB0byBzZWFyY2ggZm9yIGNvZGVjIGZhY3RvcnkgdGhhdCBzdXBwb3J0cyBzcGVjaWZpYyAKKyAqIGNvZGVjIHNwZWNpZmljYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9jb2RlY19pbmZvCit7CisgICAgcGptZWRpYV9mb3JtYXRfaWQgICBmbXRfaWQ7ICAgICAgICAgLyoqPCBFbmNvZGVkIGZvcm1hdCBJRCAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCAgICAgICAgICAgIHB0OyAgICAgICAgICAgICAvKio8IFBheWxvYWQgdHlwZQkJICAgICovCisgICAgcGpfc3RyX3QJICAgICAgICBlbmNvZGluZ19uYW1lOyAgLyoqPCBFbmNvZGluZyBuYW1lICAgICAgICAgICAgICAgICAgKi8KKyAgICBwal9zdHJfdAkgICAgICAgIGVuY29kaW5nX2Rlc2M7CS8qKjwgRW5jb2RpbmcgZGVzYwkJICAgICovCisgICAgdW5zaWduZWQgICAgICAgICAgICBjbG9ja19yYXRlOyAgICAgLyoqPCBDbG9jayByYXRlCQkJICAgICovCisgICAgcGptZWRpYV9kaXIgICAgICAgICBkaXI7ICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCAgICAgICAgICAgIGRlY19mbXRfaWRfY250OyAvKio8ICMgb2Ygc3VwcG9ydGVkIGVuY29kaW5nIHNvdXJjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBJRHMgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBqbWVkaWFfZm9ybWF0X2lkICAgZGVjX2ZtdF9pZFtQSk1FRElBX1ZJRF9DT0RFQ19NQVhfREVDX0ZNVF9DTlRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3VwcG9ydGVkIGVuY29kaW5nIHNvdXJjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBJRHMgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkCQlwYWNraW5nczsJLyoqPCBTdXBwb3J0ZWQgb3IgcmVxdWVzdGVkIHBhY2tpbmdzLAorCQkJCQkgICAgIHN0cmF0ZWdpZXMsIGJpdG1hc2sgZnJvbQorCQkJCQkgICAgIHBqbWVkaWFfdmlkX3BhY2tpbmcJICAgICovCisgICAgdW5zaWduZWQgICAgICAgICAgICBmcHNfY250OyAgICAgICAgLyoqPCAjIG9mIHN1cHBvcnRlZCBmcmFtZS1yYXRlcywgY2FuIGJlCisJCQkJCSAgICAgemVybyAoc3VwcG9ydCBhbnkgZnJhbWUtcmF0ZSkgICovCisgICAgcGptZWRpYV9yYXRpbyAgICAgICBmcHNbUEpNRURJQV9WSURfQ09ERUNfTUFYX0ZQU19DTlRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3VwcG9ydGVkIGZyYW1lLXJhdGVzCSAgICAqLworCit9IHBqbWVkaWFfdmlkX2NvZGVjX2luZm87CisKKworLyoqIAorICogRGV0YWlsZWQgY29kZWMgYXR0cmlidXRlcyB1c2VkIGluIGNvbmZpZ3VyaW5nIGEgY29kZWMgYW5kIGluIHF1ZXJ5aW5nCisgKiB0aGUgY2FwYWJpbGl0eSBvZiBjb2RlYyBmYWN0b3JpZXMuIERlZmF1bHQgYXR0cmlidXRlcyBvZiBhbnkgY29kZWNzIGNvdWxkCisgKiBiZSBxdWVyaWVkIHVzaW5nICNwam1lZGlhX3ZpZF9jb2RlY19tZ3JfZ2V0X2RlZmF1bHRfcGFyYW0oKSBhbmQgbW9kaWZpZWQKKyAqIHVzaW5nICNwam1lZGlhX3ZpZF9jb2RlY19tZ3Jfc2V0X2RlZmF1bHRfcGFyYW0oKS4KKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IGNvZGVjIHBhcmFtZXRlciBhbHNvIGNvbnRhaW5zIFNEUCBzcGVjaWZpYyBzZXR0aW5nLCAKKyAqICNkZWNfZm10cCBhbmQgI2VuY19mbXRwLCB3aGljaCBtYXkgbmVlZCB0byBiZSBzZXQgYXBwcm9wcmlhdGVseSBiYXNlZCBvbgorICogdGhlIGVmZmVjdGl2ZSBzZXR0aW5nLiBTZWUgZWFjaCBjb2RlYyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfY29kZWNfcGFyYW0KK3sKKyAgICBwam1lZGlhX2RpciAgICAgICAgIGRpcjsgICAgICAgICAgICAvKio8IERpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHBqbWVkaWFfdmlkX3BhY2tpbmcgcGFja2luZzsgCS8qKjwgUGFja2V0aXphdGlvbiBzdHJhdGVneS4JICAgICovCisKKyAgICBwam1lZGlhX2Zvcm1hdCAgICAgIGVuY19mbXQ7ICAgICAgICAvKio8IEVuY29kZWQgZm9ybWF0CSAgICAgICAgICAgICovCisgICAgcGptZWRpYV9jb2RlY19mbXRwICBlbmNfZm10cDsgICAgICAgLyoqPCBFbmNvZGVyIGZtdHAgcGFyYW1zCSAgICAqLworICAgIHVuc2lnbmVkICAgICAgICAgICAgZW5jX210dTsgICAgICAgIC8qKjwgTVRVIG9yIG1heCBwYXlsb2FkIHNpemUgc2V0dGluZyovCisKKyAgICBwam1lZGlhX2Zvcm1hdCAgICAgIGRlY19mbXQ7ICAgICAgICAvKio8IERlY29kZWQgZm9ybWF0CSAgICAgICAgICAgICovCisgICAgcGptZWRpYV9jb2RlY19mbXRwICBkZWNfZm10cDsgICAgICAgLyoqPCBEZWNvZGVyIGZtdHAgcGFyYW1zCSAgICAqLworCisgICAgcGpfYm9vbF90CQlpZ25vcmVfZm10cDsJLyoqPCBJZ25vcmUgZm10cCBwYXJhbXMuIElmIHNldCB0bworCQkJCQkgICAgIFBKX1RSVUUsIHRoZSBjb2RlYyB3aWxsIGFwcGx5CisJCQkJCSAgICAgZm9ybWF0IHNldHRpbmdzIHNwZWNpZmllZCBpbgorCQkJCQkgICAgIGVuY19mbXQgYW5kIGRlY19mbXQgb25seS4JICAgICovCisKK30gcGptZWRpYV92aWRfY29kZWNfcGFyYW07CisKKworLyoqCisgKiBEdXBsaWNhdGUgdmlkZW8gY29kZWMgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBwb29sCSAgICBUaGUgcG9vbC4KKyAqIEBwYXJhbSBzcmMJICAgIFRoZSB2aWRlbyBjb2RlYyBwYXJhbWV0ZXIgdG8gYmUgZHVwbGljYXRlZC4KKyAqCisgKiBAcmV0dXJuCSAgICBEdXBsaWNhdGVkIGNvZGVjIHBhcmFtZXRlci4KKyAqLworUEpfREVDTChwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSopIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtX2Nsb25lKAorCQkJCQlwal9wb29sX3QgKnBvb2wsIAorCQkJCQljb25zdCBwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSAqc3JjKTsKKworLyoqCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB2aWRlbyBjb2RlYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfY29kZWMgcGptZWRpYV92aWRfY29kZWM7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgY29kZWMgb3BlcmF0aW9ucy4gRWFjaCBjb2RlYyBNVVNUIGltcGxlbWVudAorICogYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV92aWRfY29kZWNfb3AKK3sKKyAgICAvKiogCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9jb2RlY19pbml0KCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QJKCppbml0KShwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsIAorCQkJcGpfcG9vbF90ICpwb29sICk7CisKKyAgICAvKiogCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9jb2RlY19vcGVuKCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QJKCpvcGVuKShwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsIAorCQkJcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtICk7CisKKyAgICAvKiogCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9jb2RlY19jbG9zZSgpLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqY2xvc2UpKHBqbWVkaWFfdmlkX2NvZGVjICpjb2RlYyk7CisKKyAgICAvKiogCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9jb2RlY19tb2RpZnkoKS4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdAkoKm1vZGlmeSkocGptZWRpYV92aWRfY29kZWMgKmNvZGVjLAorCQkJICBjb25zdCBwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSAqcGFyYW0pOworCisgICAgLyoqIAorICAgICAqIFNlZSAjcGptZWRpYV92aWRfY29kZWNfZ2V0X3BhcmFtKCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QJKCpnZXRfcGFyYW0pKHBqbWVkaWFfdmlkX2NvZGVjICpjb2RlYywKKwkJCSAgICAgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIFNlZSAjcGptZWRpYV92aWRfY29kZWNfZW5jb2RlX2JlZ2luKCkuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCplbmNvZGVfYmVnaW4pKHBqbWVkaWFfdmlkX2NvZGVjICpjb2RlYywKKwkJCQljb25zdCBwam1lZGlhX3ZpZF9lbmNvZGVfb3B0ICpvcHQsCisJCQkJY29uc3QgcGptZWRpYV9mcmFtZSAqaW5wdXQsCisJCQkJdW5zaWduZWQgb3V0X3NpemUsCisJCQkJcGptZWRpYV9mcmFtZSAqb3V0cHV0LAorCQkJCXBqX2Jvb2xfdCAqaGFzX21vcmUpOworCisgICAgLyoqCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9jb2RlY19lbmNvZGVfbW9yZSgpCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCplbmNvZGVfbW9yZSkocGptZWRpYV92aWRfY29kZWMgKmNvZGVjLAorCQkJICAgICAgIHVuc2lnbmVkIG91dF9zaXplLAorCQkJICAgICAgIHBqbWVkaWFfZnJhbWUgKm91dHB1dCwKKwkJCSAgICAgICBwal9ib29sX3QgKmhhc19tb3JlKTsKKworCisgICAgLyoKKyAgICAgKiBTZWUgI3BqbWVkaWFfdmlkX2NvZGVjX2RlY29kZSgpLgorICAgICAqLworICAgIHBqX3N0YXR1c190ICgqZGVjb2RlKShwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsCisJCQkgIHBqX3NpemVfdCBjb3VudCwKKwkJCSAgcGptZWRpYV9mcmFtZSBwYWNrZXRzW10sCisJCQkgIHVuc2lnbmVkIG91dF9zaXplLAorCQkJICBwam1lZGlhX2ZyYW1lICpvdXRwdXQpOworCisgICAgLyoqCisgICAgICogU2VlICNwam1lZGlhX3ZpZF9jb2RlY19yZWNvdmVyKCkKKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKnJlY292ZXIpKHBqbWVkaWFfdmlkX2NvZGVjICpjb2RlYywKKwkJCSAgIHVuc2lnbmVkIG91dF9zaXplLAorCQkJICAgcGptZWRpYV9mcmFtZSAqb3V0cHV0KTsKKworfSBwam1lZGlhX3ZpZF9jb2RlY19vcDsKKworCisKKy8qCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5LgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5IHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3Rvcnk7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSB2aWRlbyBjb2RlYyBpbnN0YW5jZS4gQ29kZWMgaW1wbGVtZW50ZXJzCisgKiBzaG91bGQgdXNlICNwam1lZGlhX3ZpZF9jb2RlY19pbml0KCkgdG8gaW5pdGlhbGl6ZSB0aGlzIHN0cnVjdHVyZSB3aXRoCisgKiBkZWZhdWx0IHZhbHVlcy4KKyAqLworc3RydWN0IHBqbWVkaWFfdmlkX2NvZGVjCit7CisgICAgLyoqIEVudHJpZXMgdG8gcHV0IHRoaXMgY29kZWMgaW5zdGFuY2UgaW4gY29kZWMgZmFjdG9yeSdzIGxpc3QuICovCisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgcGptZWRpYV92aWRfY29kZWMpOworCisgICAgLyoqIENvZGVjJ3MgcHJpdmF0ZSBkYXRhLiAqLworICAgIHZvaWQJCQkqY29kZWNfZGF0YTsKKworICAgIC8qKiBDb2RlYyBmYWN0b3J5IHdoZXJlIHRoaXMgY29kZWMgd2FzIGFsbG9jYXRlZC4gKi8KKyAgICBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5ICAgKmZhY3Rvcnk7CisKKyAgICAvKiogT3BlcmF0aW9ucyB0byBjb2RlYy4gKi8KKyAgICBwam1lZGlhX3ZpZF9jb2RlY19vcAkqb3A7Cit9OworCisKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgc3VwcG9ydGVkIGJ5IGNvZGVjIAorICogZmFjdG9yaWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5X29wCit7CisgICAgLyoqIAorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGZhY3RvcnkgY2FuIGNyZWF0ZSBjb2RlYyB3aXRoIHRoZSBzcGVjaWZpZWQgCisgICAgICogY29kZWMgaW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWN0b3J5CVRoZSBjb2RlYyBmYWN0b3J5LgorICAgICAqIEBwYXJhbSBpbmZvCVRoZSBjb2RlYyBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiB0aGlzIGZhY3RvcnkgaXMgYWJsZSB0byBjcmVhdGUgYW4KKyAgICAgKgkJCWluc3RhbmNlIG9mIGNvZGVjIHdpdGggdGhlIHNwZWNpZmllZCBpbmZvLgorICAgICAqLworICAgIHBqX3N0YXR1c190CSgqdGVzdF9hbGxvYykocGptZWRpYV92aWRfY29kZWNfZmFjdG9yeSAqZmFjdG9yeSwgCisJCQkgICAgICBjb25zdCBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICppbmZvICk7CisKKyAgICAvKiogCisgICAgICogQ3JlYXRlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBjb2RlYyBJRC4gVGhpcyBmdW5jdGlvbgorICAgICAqIGNhbiBiZSBjYWxsZWQgYnkgYXBwbGljYXRpb24gdG8gZ2V0IHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWN0b3J5CVRoZSBjb2RlYyBmYWN0b3J5LgorICAgICAqIEBwYXJhbSBpbmZvCVRoZSBjb2RlYyBpbmZvLgorICAgICAqIEBwYXJhbSBhdHRyCVRoZSBhdHRyaWJ1dGUgdG8gYmUgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHN1Y2Nlc3MuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCpkZWZhdWx0X2F0dHIpKHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksIAorICAgIAkJCQljb25zdCBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICppbmZvLAorICAgIAkJCQlwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSAqYXR0ciApOworCisgICAgLyoqIAorICAgICAqIEVudW1lcmF0ZSBzdXBwb3J0ZWQgY29kZWNzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhpcyBmYWN0b3J5LgorICAgICAqIAorICAgICAqICBAcGFyYW0gZmFjdG9yeQlUaGUgY29kZWMgZmFjdG9yeS4KKyAgICAgKiAgQHBhcmFtIGNvdW50CU9uIGlucHV0LCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbgorICAgICAqCQkJdGhlIGFycmF5LiBPbiBvdXRwdXQsIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0bworICAgICAqCQkJdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBpbml0aWFsaXplZAorICAgICAqCQkJYnkgdGhpcyBmdW5jdGlvbi4KKyAgICAgKiAgQHBhcmFtIGluZm8JVGhlIGNvZGVjIGluZm8gYXJyYXksIHdoaWNoIGNvbnRlbnRzIHdpbGwgYmUgCisgICAgICoJCQlpbml0aWFsaXplZCB1cG9uIHJldHVybi4KKyAgICAgKgorICAgICAqICBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCplbnVtX2luZm8pKHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksIAorCQkJICAgICB1bnNpZ25lZCAqY291bnQsIAorCQkJICAgICBwam1lZGlhX3ZpZF9jb2RlY19pbmZvIGNvZGVjc1tdKTsKKworICAgIC8qKiAKKyAgICAgKiBDcmVhdGUgb25lIGluc3RhbmNlIG9mIHRoZSBjb2RlYyB3aXRoIHRoZSBzcGVjaWZpZWQgY29kZWMgaW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWN0b3J5CVRoZSBjb2RlYyBmYWN0b3J5LgorICAgICAqIEBwYXJhbSBpbmZvCVRoZSBjb2RlYyBpbmZvLgorICAgICAqIEBwYXJhbSBwX2NvZGVjCVBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgY29kZWMgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgICAgICovCisgICAgcGpfc3RhdHVzX3QgKCphbGxvY19jb2RlYykocGptZWRpYV92aWRfY29kZWNfZmFjdG9yeSAqZmFjdG9yeSwgCisJCQkgICAgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqaW5mbywKKwkJCSAgICAgICBwam1lZGlhX3ZpZF9jb2RlYyAqKnBfY29kZWMpOworCisgICAgLyoqIAorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNvZGVjIG1hbmFnZXIgdG8gcmV0dXJuIGEgcGFydGljdWxhciAKKyAgICAgKiBpbnN0YW5jZSBvZiBjb2RlYyBiYWNrIHRvIHRoZSBjb2RlYyBmYWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkJVGhlIGNvZGVjIGZhY3RvcnkuCisgICAgICogQHBhcmFtIGNvZGVjCVRoZSBjb2RlYyBpbnN0YW5jZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwal9zdGF0dXNfdCAoKmRlYWxsb2NfY29kZWMpKHBqbWVkaWFfdmlkX2NvZGVjX2ZhY3RvcnkgKmZhY3RvcnksIAorCQkJCSBwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMgKTsKKworfSBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5X29wOworCisKKworLyoqCisgKiBDb2RlYyBmYWN0b3J5IGRlc2NyaWJlcyBhIG1vZHVsZSB0aGF0IGlzIGFibGUgdG8gY3JlYXRlIGNvZGVjIHdpdGggc3BlY2lmaWMKKyAqIGNhcGFiaWxpdGllcy4gVGhlc2UgY2FwYWJpbGl0aWVzIGNhbiBiZSBxdWVyaWVkIGJ5IGNvZGVjIG1hbmFnZXIgdG8gY3JlYXRlCisgKiBpbnN0YW5jZXMgb2YgY29kZWMuCisgKi8KK3N0cnVjdCBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5Cit7CisgICAgLyoqIEVudHJpZXMgdG8gcHV0IHRoaXMgc3RydWN0dXJlIGluIHRoZSBjb2RlYyBtYW5hZ2VyIGxpc3QuICovCisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgcGptZWRpYV92aWRfY29kZWNfZmFjdG9yeSk7CisKKyAgICAvKiogVGhlIGZhY3RvcnkncyBwcml2YXRlIGRhdGEuICovCisgICAgdm9pZAkJICAgICAqZmFjdG9yeV9kYXRhOworCisgICAgLyoqIE9wZXJhdGlvbnMgdG8gdGhlIGZhY3RvcnkuICovCisgICAgcGptZWRpYV92aWRfY29kZWNfZmFjdG9yeV9vcCAqb3A7CisKK307CisKKworLyoqCisgKiBPcGFxdWUgZGVjbGFyYXRpb24gZm9yIGNvZGVjIG1hbmFnZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2NvZGVjX21nciBwam1lZGlhX3ZpZF9jb2RlY19tZ3I7CisKKy8qKgorICogRGVjbGFyZSBtYXhpbXVtIGNvZGVjcworICovCisjZGVmaW5lIFBKTUVESUFfVklEX0NPREVDX01HUl9NQVhfQ09ERUNTCSAgICAzMgorCisKKy8qKgorICogSW5pdGlhbGl6ZSBjb2RlYyBtYW5hZ2VyLiBJZiB0aGVyZSBpcyBubyB0aGUgZGVmYXVsdCB2aWRlbyBjb2RlYyBtYW5hZ2VyLAorICogdGhpcyBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBkZWZhdWx0IHZpZGVvIGNvZGVjIG1hbmFnZXIgdG8KKyAqIHRoZSBuZXcgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gTm9ybWFsbHkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcGptZWRpYQorICogZW5kcG9pbnQncyBpbml0aWFsaXphdGlvbiBjb2RlLgorICoKKyAqIEBwYXJhbSBwb29sCSAgICBUaGUgcG9vbCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBwb2ludGVyIHRvIHRoZSBuZXcgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX21ncl9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwam1lZGlhX3ZpZF9jb2RlY19tZ3IgKiptZ3IpOworCisKKy8qKgorICogRGVzdHJveSBjb2RlYyBtYW5hZ2VyLiBOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBwam1lZGlhCisgKiBlbmRwb2ludCdzIGRlaW5pdGlhbGl6YXRpb24gY29kZS4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBDb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiAgSWYgTlVMTCwgaXQgaXMgdGhlIGRlZmF1bHQgY29kZWMKKyAqCQkgICAgbWFuYWdlciBpbnN0YW5jZSB3aWxsIGJlIGRlc3Ryb3llZC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX21ncl9kZXN0cm95KHBqbWVkaWFfdmlkX2NvZGVjX21nciAqbWdyKTsKKworCisvKioKKyAqIEdldCB0aGUgZGVmYXVsdCBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFRoZSBkZWZhdWx0IGNvZGVjIG1hbmFnZXIgaW5zdGFuY2Ugb3IgTlVMTCBpZiBub25lLgorICovCitQSl9ERUNMKHBqbWVkaWFfdmlkX2NvZGVjX21nciopIHBqbWVkaWFfdmlkX2NvZGVjX21ncl9pbnN0YW5jZSh2b2lkKTsKKworCisvKioKKyAqIFNldCB0aGUgZGVmYXVsdCBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfdmlkX2NvZGVjX21ncl9zZXRfaW5zdGFuY2UocGptZWRpYV92aWRfY29kZWNfbWdyKiBtZ3IpOworCisKKy8qKiAKKyAqIFJlZ2lzdGVyIGNvZGVjIGZhY3RvcnkgdG8gY29kZWMgbWFuYWdlci4gVGhpcyB3aWxsIGFsc28gcmVnaXN0ZXIKKyAqIGFsbCBzdXBwb3J0ZWQgY29kZWNzIGluIHRoZSBmYWN0b3J5IHRvIHRoZSBjb2RlYyBtYW5hZ2VyLgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiBJZiBOVUxMLCB0aGUgZGVmYXVsdCBjb2RlYworICoJCSAgICBtYW5hZ2VyIGluc3RhbmNlIHdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBmYWN0b3J5ICAgVGhlIGNvZGVjIGZhY3RvcnkgdG8gYmUgcmVnaXN0ZXJlZC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV92aWRfY29kZWNfbWdyX3JlZ2lzdGVyX2ZhY3RvcnkoIHBqbWVkaWFfdmlkX2NvZGVjX21nciAqbWdyLAorCQkJCSAgICAgICAgcGptZWRpYV92aWRfY29kZWNfZmFjdG9yeSAqZmFjdG9yeSk7CisKKy8qKgorICogVW5yZWdpc3RlciBjb2RlYyBmYWN0b3J5IGZyb20gdGhlIGNvZGVjIG1hbmFnZXIuIFRoaXMgd2lsbCBhbHNvCisgKiByZW1vdmUgYWxsIHRoZSBjb2RlY3MgcmVnaXN0ZXJlZCBieSB0aGUgY29kZWMgZmFjdG9yeSBmcm9tIHRoZQorICogY29kZWMgbWFuYWdlcidzIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvZGVjcy4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gSWYgTlVMTCwgdGhlIGRlZmF1bHQgY29kZWMKKyAqCQkgICAgbWFuYWdlciBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gZmFjdG9yeSAgIFRoZSBjb2RlYyBmYWN0b3J5IHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV92aWRfY29kZWNfbWdyX3VucmVnaXN0ZXJfZmFjdG9yeSggcGptZWRpYV92aWRfY29kZWNfbWdyICptZ3IsIAorCQkJCSAgICAgICAgICBwam1lZGlhX3ZpZF9jb2RlY19mYWN0b3J5ICpmYWN0b3J5KTsKKworLyoqCisgKiBFbnVtZXJhdGUgYWxsIHN1cHBvcnRlZCBjb2RlY3MgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB0byB0aGUKKyAqIGNvZGVjIG1hbmFnZXIgYnkgY29kZWMgZmFjdG9yaWVzLgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiBJZiBOVUxMLCB0aGUgZGVmYXVsdCBjb2RlYworICoJCSAgICBtYW5hZ2VyIGluc3RhbmNlIHdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBjb3VudAkgICAgT24gaW5wdXQsIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluCisgKgkJICAgIHRoZSBhcnJheS4gT24gb3V0cHV0LCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgdG8KKyAqCQkgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBpbml0aWFsaXplZAorICoJCSAgICBieSB0aGlzIGZ1bmN0aW9uLgorICogQHBhcmFtIGluZm8JICAgIFRoZSBjb2RlYyBpbmZvIGFycmF5LCB3aGljaCBjb250ZW50cyB3aWxsIGJlIAorICoJCSAgICBpbml0aWFsaXplZCB1cG9uIHJldHVybi4KKyAqIEBwYXJhbSBwcmlvCSAgICBPcHRpb25hbCBwb2ludGVyIHRvIHJlY2VpdmUgYXJyYXkgb2YgY29kZWMgcHJpb3JpdGllcy4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3ZpZF9jb2RlY19tZ3JfZW51bV9jb2RlY3MocGptZWRpYV92aWRfY29kZWNfbWdyICptZ3IsCisJCQkJICB1bnNpZ25lZCAqY291bnQsCisJCQkJICBwam1lZGlhX3ZpZF9jb2RlY19pbmZvIGluZm9bXSwKKwkJCQkgIHVuc2lnbmVkICpwcmlvKTsKKworCisvKioKKyAqIEdldCBjb2RlYyBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIHBheWxvYWQgdHlwZS4gVGhlIHBheWxvYWQgdHlwZSBtdXN0IGJlCisgKiBzdGF0aWMgb3IgbG9jYWxseSBkZWZpbmVkIGluICNwam1lZGlhX3ZpZGVvX3B0LgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiBJZiBOVUxMLCB0aGUgZGVmYXVsdCBjb2RlYworICoJCSAgICBtYW5hZ2VyIGluc3RhbmNlIHdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBwdAkgICAgVGhlIHBheWxvYWQgdHlwZS9udW1iZXIuCisgKiBAcGFyYW0gaW5mbwkgICAgUG9pbnRlciB0byByZWNlaXZlIGNvZGVjIGluZm8uCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfdmlkX2NvZGVjX21ncl9nZXRfY29kZWNfaW5mbyggcGptZWRpYV92aWRfY29kZWNfbWdyICptZ3IsCisJCQkJICAgICAgdW5zaWduZWQgcHQsCisJCQkJICAgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqKmluZm8pOworCisKKy8qKgorICogR2V0IGNvZGVjIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0IElELgorICoKKyAqIEBwYXJhbSBtZ3IJICAgIFRoZSBjb2RlYyBtYW5hZ2VyIGluc3RhbmNlLiBJZiBOVUxMLCB0aGUgZGVmYXVsdCBjb2RlYworICoJCSAgICBtYW5hZ2VyIGluc3RhbmNlIHdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBmbXRfaWQgICAgRm9ybWF0IElELiBTZWUgI3BqbWVkaWFfZm9ybWF0X2lkCisgKiBAcGFyYW0gaW5mbwkgICAgUG9pbnRlciB0byByZWNlaXZlIGNvZGVjIGluZm8uCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfdmlkX2NvZGVjX21ncl9nZXRfY29kZWNfaW5mbzIocGptZWRpYV92aWRfY29kZWNfbWdyICptZ3IsCisJCQkJICAgICAgcGptZWRpYV9mb3JtYXRfaWQgZm10X2lkLAorCQkJCSAgICAgIGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gKippbmZvKTsKKworCisvKioKKyAqIENvbnZlcnQgY29kZWMgaW5mbyBzdHJ1Y3QgaW50byBhIHVuaXF1ZSBjb2RlYyBpZGVudGlmaWVyLgorICogQSBjb2RlYyBpZGVudGlmaWVyIGxvb2tzIHNvbWV0aGluZyBsaWtlICJIMjYzLzkwMDAwIi4KKyAqCisgKiBAcGFyYW0gaW5mbwkgICAgVGhlIGNvZGVjIGluZm8KKyAqIEBwYXJhbSBpZAkgICAgQnVmZmVyIHRvIHB1dCB0aGUgY29kZWMgaW5mbyBzdHJpbmcuCisgKiBAcGFyYW0gbWF4X2xlbiAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuCSAgICBUaGUgbnVsbCB0ZXJtaW5hdGVkIGNvZGVjIGluZm8gc3RyaW5nLCBvciBOVUxMIGlmCisgKgkJICAgIHRoZSBidWZmZXIgaXMgbm90IGxvbmcgZW5vdWdoLgorICovCitQSl9ERUNMKGNoYXIqKSBwam1lZGlhX3ZpZF9jb2RlY19pbmZvX3RvX2lkKGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmlkLCB1bnNpZ25lZCBtYXhfbGVuICk7CisKKworLyoqCisgKiBGaW5kIGNvZGVjcyBieSB0aGUgdW5pcXVlIGNvZGVjIGlkZW50aWZpZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kCisgKiBhbGwgY29kZWNzIHRoYXQgbWF0Y2ggdGhlIGNvZGVjIGlkZW50aWZpZXIgcHJlZml4LiBGb3IgZXhhbXBsZSwgaWYKKyAqICJIMjYiIGlzIHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIGZpbmQgIkgyNjMvOTAwMDAiLCAiSDI2NC85MDAwMCIsCisgKiBhbmQgc28gb24sIHVwIHRvIHRoZSBtYXhpbXVtIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnQuCisgKgorICogQHBhcmFtIG1ncgkgICAgVGhlIGNvZGVjIG1hbmFnZXIgaW5zdGFuY2UuIElmIE5VTEwsIHRoZSBkZWZhdWx0IGNvZGVjCisgKgkJICAgIG1hbmFnZXIgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkLgorICogQHBhcmFtIGNvZGVjX2lkICBUaGUgZnVsbCBjb2RlYyBJRCBvciBjb2RlYyBJRCBwcmVmaXguIElmIGFuIGVtcHR5CisgKgkJICAgIHN0cmluZyBpcyBnaXZlbiwgaXQgd2lsbCBtYXRjaCBhbGwgY29kZWNzLgorICogQHBhcmFtIGNvdW50CSAgICBNYXhpbXVtIG51bWJlciBvZiBjb2RlY3MgdG8gZmluZC4gT24gcmV0dXJuLCBpdAorICoJCSAgICBjb250YWlucyB0aGUgYWN0dWFsIG51bWJlciBvZiBjb2RlY3MgZm91bmQuCisgKiBAcGFyYW0gcF9pbmZvICAgIEFycmF5IG9mIHBvaW50ZXIgdG8gY29kZWMgaW5mbyB0byBiZSBmaWxsZWQuIFRoaXMKKyAqCQkgICAgYXJndW1lbnQgbWF5IGJlIE5VTEwsIHdoaWNoIGluIHRoaXMgY2FzZSwgb25seQorICoJCSAgICBjb2RlYyBjb3VudCB3aWxsIGJlIHJldHVybmVkLgorICogQHBhcmFtIHByaW8JICAgIE9wdGlvbmFsIGFycmF5IG9mIGNvZGVjIHByaW9yaXRpZXMuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBpZiBhdCBsZWFzdCBvbmUgY29kZWMgaW5mbyBpcyBmb3VuZC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3ZpZF9jb2RlY19tZ3JfZmluZF9jb2RlY3NfYnlfaWQocGptZWRpYV92aWRfY29kZWNfbWdyICptZ3IsCisJCQkJCWNvbnN0IHBqX3N0cl90ICpjb2RlY19pZCwKKwkJCQkJdW5zaWduZWQgKmNvdW50LAorCQkJCQljb25zdCBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICpwX2luZm9bXSwKKwkJCQkJdW5zaWduZWQgcHJpb1tdKTsKKworCisvKioKKyAqIFNldCBjb2RlYyBwcmlvcml0eS4gVGhlIGNvZGVjIHByaW9yaXR5IGRldGVybWluZXMgdGhlIG9yZGVyIG9mCisgKiB0aGUgY29kZWMgaW4gdGhlIFNEUCBjcmVhdGVkIGJ5IHRoZSBlbmRwb2ludC4gSWYgbW9yZSB0aGFuIG9uZSBjb2RlY3MKKyAqIGFyZSBmb3VuZCB3aXRoIHRoZSBzYW1lIGNvZGVjX2lkIHByZWZpeCwgdGhlbiB0aGUgZnVuY3Rpb24gc2V0cyB0aGUKKyAqIHByaW9yaXRpZXMgb2YgYWxsIHRob3NlIGNvZGVjcy4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gSWYgTlVMTCwgdGhlIGRlZmF1bHQgY29kZWMKKyAqCQkgICAgbWFuYWdlciBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gY29kZWNfaWQgIFRoZSBmdWxsIGNvZGVjIElEIG9yIGNvZGVjIElEIHByZWZpeC4gSWYgYW4gZW1wdHkKKyAqCQkgICAgc3RyaW5nIGlzIGdpdmVuLCBpdCB3aWxsIG1hdGNoIGFsbCBjb2RlY3MuCisgKiBAcGFyYW0gcHJpbwkgICAgUHJpb3JpdHkgdG8gYmUgc2V0LiBUaGUgcHJpb3JpdHkgY2FuIGhhdmUgYW55IHZhbHVlCisgKgkJICAgIGJldHdlZW4gMSB0byAyNTUuIFdoZW4gdGhlIHByaW9yaXR5IGlzIHNldCB0byB6ZXJvLAorICoJCSAgICB0aGUgY29kZWMgd2lsbCBiZSBkaXNhYmxlZC4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIGlmIGF0IGxlYXN0IG9uZSBjb2RlYyBpbmZvIGlzIGZvdW5kLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfY29kZWNfbWdyX3NldF9jb2RlY19wcmlvcml0eShwam1lZGlhX3ZpZF9jb2RlY19tZ3IgKm1nciwgCisJCQkJCSBjb25zdCBwal9zdHJfdCAqY29kZWNfaWQsCisJCQkJCSBwal91aW50OF90IHByaW8pOworCisKKy8qKgorICogR2V0IGRlZmF1bHQgY29kZWMgcGFyYW0gZm9yIHRoZSBzcGVjaWZpZWQgY29kZWMgaW5mby4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gSWYgTlVMTCwgdGhlIGRlZmF1bHQgY29kZWMKKyAqCQkgICAgbWFuYWdlciBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gaW5mbwkgICAgVGhlIGNvZGVjIGluZm8sIHdoaWNoIGRlZmF1bHQgcGFyYW1ldGVyJ3MgaXMgYmVpbmcKKyAqCQkgICAgcXVlcmllZC4KKyAqIEBwYXJhbSBwYXJhbQkgICAgT24gcmV0dXJuLCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWZhdWx0IGNvZGVjCisgKgkJICAgIHBhcmFtZXRlci4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV92aWRfY29kZWNfbWdyX2dldF9kZWZhdWx0X3BhcmFtKHBqbWVkaWFfdmlkX2NvZGVjX21nciAqbWdyLAorCQkJCQljb25zdCBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICppbmZvLAorCQkJCQlwam1lZGlhX3ZpZF9jb2RlY19wYXJhbSAqcGFyYW0pOworCisKKy8qKgorICogU2V0IGRlZmF1bHQgY29kZWMgcGFyYW0gZm9yIHRoZSBzcGVjaWZpZWQgY29kZWMgaW5mby4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gSWYgTlVMTCwgdGhlIGRlZmF1bHQgY29kZWMKKyAqCQkgICAgbWFuYWdlciBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gcG9vbAkgICAgVGhlIHBvb2wgaW5zdGFuY2UuCisgKiBAcGFyYW0gaW5mbwkgICAgVGhlIGNvZGVjIGluZm8sIHdoaWNoIGRlZmF1bHQgcGFyYW1ldGVyJ3MgaXMgYmVpbmcKKyAqCQkgICAgdXBkYXRlZC4KKyAqIEBwYXJhbSBwYXJhbQkgICAgVGhlIG5ldyBkZWZhdWx0IGNvZGVjIHBhcmFtZXRlci4gU2V0IHRvIE5VTEwgdG8gcmVzZXQKKyAqCQkgICAgY29kZWMgcGFyYW1ldGVyIHRvIGxpYnJhcnkgZGVmYXVsdCBzZXR0aW5ncy4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIAorcGptZWRpYV92aWRfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKHBqbWVkaWFfdmlkX2NvZGVjX21nciAqbWdyLAorCQkJCSAgICAgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgIGNvbnN0IHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtICpwYXJhbSk7CisKKworLyoqCisgKiBSZXF1ZXN0IHRoZSBjb2RlYyBtYW5hZ2VyIHRvIGFsbG9jYXRlIG9uZSBpbnN0YW5jZSBvZiBjb2RlYyB3aXRoIHRoZQorICogc3BlY2lmaWVkIGNvZGVjIGluZm8uIFRoZSBjb2RlYyB3aWxsIGVudW1lcmF0ZSBhbGwgY29kZWMgZmFjdG9yaWVzCisgKiB1bnRpbCBpdCBmaW5kcyBmYWN0b3J5IHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgdGhlIHNwZWNpZmllZCBjb2RlYy4KKyAqCisgKiBAcGFyYW0gbWdyCSAgICBUaGUgY29kZWMgbWFuYWdlciBpbnN0YW5jZS4gSWYgTlVMTCwgdGhlIGRlZmF1bHQgY29kZWMKKyAqCQkgICAgbWFuYWdlciBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgKiBAcGFyYW0gaW5mbwkgICAgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyB0byBiZSBjcmVhdGVkLgorICogQHBhcmFtIHBfY29kZWMgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGNvZGVjIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3ZpZF9jb2RlY19tZ3JfYWxsb2NfY29kZWMoIHBqbWVkaWFfdmlkX2NvZGVjX21nciAqbWdyLCAKKwkJCSAgICAgICAgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfaW5mbyAqaW5mbywKKwkJCSAgICAgICAgICAgcGptZWRpYV92aWRfY29kZWMgKipwX2NvZGVjKTsKKworLyoqCisgKiBEZWFsbG9jYXRlIHRoZSBzcGVjaWZpZWQgY29kZWMgaW5zdGFuY2UuIFRoZSBjb2RlYyBtYW5hZ2VyIHdpbGwgcmV0dXJuCisgKiB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvZGVjIGJhY2sgdG8gaXRzIGZhY3RvcnkuCisgKgorICogQHBhcmFtIG1ncgkgICAgVGhlIGNvZGVjIG1hbmFnZXIgaW5zdGFuY2UuIElmIE5VTEwsIHRoZSBkZWZhdWx0IGNvZGVjCisgKgkJICAgIG1hbmFnZXIgaW5zdGFuY2Ugd2lsbCBiZSB1c2VkLgorICogQHBhcmFtIGNvZGVjCSAgICBUaGUgY29kZWMgaW5zdGFuY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX21ncl9kZWFsbG9jX2NvZGVjKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV92aWRfY29kZWNfbWdyICptZ3IsIAorCQkJCQkJcGptZWRpYV92aWRfY29kZWMgKmNvZGVjKTsKKworCisKKy8qKiAKKyAqIEluaXRpYWxpemUgY29kZWMgdXNpbmcgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgKgorICogQHBhcmFtIGNvZGVjCSAgICBUaGUgY29kZWMgaW5zdGFuY2UuCisgKiBAcGFyYW0gcG9vbAkgICAgUG9vbCB0byB1c2Ugd2hlbiB0aGUgY29kZWMgbmVlZHMgdG8gYWxsb2NhdGUKKyAqCQkgICAgc29tZSBtZW1vcnkuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX2luaXQoIHBqbWVkaWFfdmlkX2NvZGVjICpjb2RlYywgCisJCQkJCSAgICAgICBwal9wb29sX3QgKnBvb2wgKQoreworICAgIHJldHVybiAoKmNvZGVjLT5vcC0+aW5pdCkoY29kZWMsIHBvb2wpOworfQorCisKKy8qKiAKKyAqIE9wZW4gdGhlIGNvZGVjIGFuZCBpbml0aWFsaXplIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuCisgKiBVcG9uIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24sIHRoZSBjb2RlYyBtYXkgbW9kaWZ5IHRoZSBwYXJhbWV0ZXIKKyAqIGFuZCBmaWxscyBpbiB0aGUgdW5zcGVjaWZpZWQgdmFsdWVzIChzdWNoIGFzIHNpemUgb3IgZnJhbWUgcmF0ZSBvZgorICogdGhlIGVuY29kZXIgZm9ybWF0LCBhcyBpdCBtYXkgbmVlZCB0byBiZSBuZWdvdGlhdGVkIHdpdGggcmVtb3RlCisgKiBwcmVmZXJlbmNlcyB2aWEgU0RQIGZtdHApLgorICoKKyAqIEBwYXJhbSBjb2RlYwkgICAgVGhlIGNvZGVjIGluc3RhbmNlLgorICogQHBhcmFtIHBhcmFtCSAgICBDb2RlYyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9JTkxJTkUocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX29wZW4ocGptZWRpYV92aWRfY29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtICpwYXJhbSkKK3sKKyAgICByZXR1cm4gKCpjb2RlYy0+b3AtPm9wZW4pKGNvZGVjLCBwYXJhbSk7Cit9CisKKworLyoqIAorICogQ2xvc2UgYW5kIHNodXRkb3duIGNvZGVjLCByZWxlYXNpbmcgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkKKyAqIHRoaXMgY29kZWMsIGlmIGFueS4KKyAqCisgKiBAcGFyYW0gY29kZWMJICAgIFRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfY29kZWNfY2xvc2UoIHBqbWVkaWFfdmlkX2NvZGVjICpjb2RlYyApCit7CisgICAgcmV0dXJuICgqY29kZWMtPm9wLT5jbG9zZSkoY29kZWMpOworfQorCisKKy8qKiAKKyAqIE1vZGlmeSB0aGUgY29kZWMgcGFyYW1ldGVyIGFmdGVyIHRoZSBjb2RlYyBpcyBvcGVuLiAKKyAqIE5vdGUgdGhhdCBub3QgYWxsIGNvZGVjIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGR1cmluZyBydW4tdGltZS4gCisgKiBXaGVuIHRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGNoYW5nZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gCisgKiBub24tUEpfU1VDQ0VTUywgYW5kIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIGNoYW5nZWQuCisgKgorICogQHBhcmFtIGNvZGVjCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBwYXJhbQlUaGUgbmV3IGNvZGVjIHBhcmFtZXRlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkKK3BqbWVkaWFfdmlkX2NvZGVjX21vZGlmeShwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtKQoreworICAgIHJldHVybiAoKmNvZGVjLT5vcC0+bW9kaWZ5KShjb2RlYywgcGFyYW0pOworfQorCisKKy8qKiAKKyAqIEdldCB0aGUgY29kZWMgcGFyYW1ldGVyIGFmdGVyIHRoZSBjb2RlYyBpcyBvcGVuZWQuIAorICoKKyAqIEBwYXJhbSBjb2RlYwlUaGUgY29kZWMgaW5zdGFuY2UuCisgKiBAcGFyYW0gcGFyYW0JVGhlIGNvZGVjIHBhcmFtZXRlci4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkKK3BqbWVkaWFfdmlkX2NvZGVjX2dldF9wYXJhbShwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsCisJCQkgICAgcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtKQoreworICAgIHJldHVybiAoKmNvZGVjLT5vcC0+Z2V0X3BhcmFtKShjb2RlYywgcGFyYW0pOworfQorCisvKiogCisgKiBFbmNvZGUgdGhlIHNwZWNpZmllZCBpbnB1dCBmcmFtZS4gVGhlIGlucHV0IE1VU1QgY29udGFpbiBvbmx5IG9uZSBwaWN0dXJlCisgKiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgYXMgc3BlY2lmaWVkIHdoZW4gb3BlbmluZyB0aGUgY29kZWMuIERlcGVuZGluZworICogb24gdGhlIHBhY2tpbmcgb3IgcGFja2V0aXphdGlvbiBzZXQgaW4gdGhlIFxhIHBhY2tpbmcgcGFyYW0sIHRoZSBwcm9jZXNzCisgKiBtYXkgcHJvZHVjZSBtdWx0aXBsZSBlbmNvZGVkIHBhY2tldHMgb3IgcGF5bG9hZHMgdG8gcmVwcmVzZW50IHRoZSBwaWN0dXJlLgorICogVGhpcyBpcyB0cnVlIGZvciBleGFtcGxlIGZvciBQSk1FRElBX1ZJRF9QQUNLSU5HX1BBQ0tFVFMgcGFja2luZy4gSW4gdGhpcworICogY2FzZSwgdGhlIFxhIGhhc19tb3JlIGZpZWxkIHdpbGwgYmUgc2V0IHRvIFBKX1RSVUUsIGFuZCBhcHBsaWNhdGlvbiBzaG91bGQKKyAqIGNhbGwgcGptZWRpYV92aWRfY29kZWNfZW5jb2RlX21vcmUoKSB0byBnZXQgdGhlIHJlbWFpbmluZyByZXN1bHRzIGZyb20gdGhlCisgKiBjb2RlYy4KKyAqCisgKiBAcGFyYW0gY29kZWMJCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBvcHQJCU9wdGlvbmFsIGVuY29kaW5nIG9wdGlvbnMuCisgKiBAcGFyYW0gaW5wdXQJCVRoZSBpbnB1dCBmcmFtZS4KKyAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLiBUaGlzCisgKiAJCQlzaG91bGQgYmUgYXQgbGVhc3QgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyZWQKKyAqIAkJCWVuY29kaW5nIE1UVSBvZiB0aGUgY29kZWMuCisgKiBAcGFyYW0gb3V0cHV0CVRoZSBvdXRwdXQgZnJhbWUuCisgKiBAcGFyYW0gaGFzX21vcmUJUEpfVFJVRSBpZiBtb3JlIHBheWxvYWRzIGFyZSBhdmFpbGFibGU7IGFwcGxpY2F0aW9uCisgKiAJCQlzaG91bGQgdGhlbiBjYWxsIHBqbWVkaWFfdmlkX2NvZGVjX2VuY29kZV9tb3JlKCkKKyAqIAkJCXRvIHJldHJpZXZlIHRoZSByZW1haW5pbmcgcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3M7CisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkKK3BqbWVkaWFfdmlkX2NvZGVjX2VuY29kZV9iZWdpbiggcGptZWRpYV92aWRfY29kZWMgKmNvZGVjLAorCQkJCWNvbnN0IHBqbWVkaWFfdmlkX2VuY29kZV9vcHQgKm9wdCwKKwkJCQljb25zdCBwam1lZGlhX2ZyYW1lICppbnB1dCwKKwkJCQl1bnNpZ25lZCBvdXRfc2l6ZSwKKwkJCQlwam1lZGlhX2ZyYW1lICpvdXRwdXQsCisJCQkJcGpfYm9vbF90ICpoYXNfbW9yZSkKK3sKKyAgICByZXR1cm4gKCpjb2RlYy0+b3AtPmVuY29kZV9iZWdpbikoY29kZWMsIG9wdCwgaW5wdXQsIG91dF9zaXplLCBvdXRwdXQsCisJCQkJICAgICAgaGFzX21vcmUpOworfQorCisvKioKKyAqIFJldHJpZXZlIG1vcmUgZW5jb2RlZCBwYWNrZXRzL3BheWxvYWRzIGZyb20gdGhlIGNvZGVjLiBBcHBsaWNhdGlvbgorICogc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5IHVudGlsIFxhIGhhc19tb3JlIGZsYWcgaXMgc2V0CisgKiB0byBQSl9GQUxTRS4KKyAqCisgKiBAcGFyYW0gY29kZWMJCVRoZSBjb2RlYyBpbnN0YW5jZS4KKyAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLiBUaGlzCisgKiAJCQlzaG91bGQgYmUgYXQgbGVhc3QgdGhlIHNhbWUgYXMgYXMgdGhlIGNvbmZpZ3VyZWQKKyAqIAkJCWVuY29kaW5nIE1UVSBvZiB0aGUgY29kZWMuCisgKiBAcGFyYW0gb3V0cHV0CVRoZSBvdXRwdXQgZnJhbWUuCisgKiBAcGFyYW0gaGFzX21vcmUJUEpfVFJVRSBpZiBtb3JlIHBheWxvYWRzIGFyZSBhdmFpbGFibGUsIHdoaWNoIGluCisgKiAJCQl0aGlzIGNhc2UgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgXGEgZW5jb2RlX21vcmUoKQorICogCQkJdG8gcmV0cmlldmUgdGhlbS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3M7CisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkKK3BqbWVkaWFfdmlkX2NvZGVjX2VuY29kZV9tb3JlKCBwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsCisJCQkgICAgICAgdW5zaWduZWQgb3V0X3NpemUsCisJCQkgICAgICAgcGptZWRpYV9mcmFtZSAqb3V0cHV0LAorCQkJICAgICAgIHBqX2Jvb2xfdCAqaGFzX21vcmUpCit7CisgICAgcmV0dXJuICgqY29kZWMtPm9wLT5lbmNvZGVfbW9yZSkoY29kZWMsIG91dF9zaXplLCBvdXRwdXQsIGhhc19tb3JlKTsKK30KKworLyoqIAorICogRGVjb2RlIHRoZSBpbnB1dCBwYWNrZXRzIGludG8gb25lIHBpY3R1cmUuIElmIHRoZSBwYWNraW5nIGlzIHNldCB0bworICogUEpNRURJQV9WSURfUEFDS0lOR19QQUNLRVRTIHdoZW4gb3BlbmluZyB0aGUgY29kZWMsIHRoZSBjb2RlYyBpcyBzZXQKKyAqIHRvIGRlY29kZSBtdWx0aXBsZSBlbmNvZGVkIHBhY2tldHMgaW50byBvbmUgcGljdHVyZS4gVGhlc2UgZW5jb2RlZAorICogcGFja2V0cyBhcmUgdHlwaWNhbGx5IHJldHJpZXZlZCBmcm9tIHRoZSBqaXR0ZXIgYnVmZmVyLiBJZiB0aGUgcGFja2luZworICogaXMgc2V0IHRvIFBKTUVESUFfVklEX1BBQ0tJTkdfV0hPTEUsIHRoZW4gdGhpcyBkZWNvZGUgZnVuY3Rpb24gY2FuIG9ubHkKKyAqIGFjY2VwdCBvbmUgZnJhbWUgYXMgdGhlIGlucHV0LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZGVjb2RlZCBwaWN0dXJlIGZvcm1hdCBtYXkgZGlmZmVyZW50IHRvIHRoZSBjb25maWd1cmVkCisgKiBzZXR0aW5nIChpLmUuIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGluIHRoZSAjcGptZWRpYV92aWRfY29kZWNfcGFyYW0gd2hlbgorICogb3BlbmluZyB0aGUgY29kZWMpLCBpbiB0aGlzIGNhc2UgdGhlIFBKTUVESUFfRVZFTlRfRk1UX0NIQU5HRUQgZXZlbnQgd2lsbAorICogYmUgZW1pdHRlZCBieSB0aGUgY29kZWMgdG8gbm90aWZ5IHRoZSBldmVudC4gVGhlIGNvZGVjIHBhcmFtZXRlciB3aWxsCisgKiBhbHNvIGJlIHVwZGF0ZWQsIGFuZCBhcHBsaWNhdGlvbiBjYW4gcXVlcnkgdGhlIGZvcm1hdCBieSB1c2luZworICogcGptZWRpYV92aWRfY29kZWNfZ2V0X3BhcmFtKCkuCisgKgorICogQHBhcmFtIGNvZGVjCQlUaGUgY29kZWMgaW5zdGFuY2UuCisgKiBAcGFyYW0gcGt0X2NvdW50CU51bWJlciBvZiBwYWNrZXRzIGluIHRoZSBpbnB1dC4KKyAqIEBwYXJhbSBwYWNrZXRzCUFycmF5IG9mIGlucHV0IHBhY2tldHMsIGVhY2ggY29udGFpbmluZyBhbiBlbmNvZGVkCisgKiAJCQlmcmFtZS4KKyAqIEBwYXJhbSBvdXRfc2l6ZQlUaGUgbGVuZ3RoIG9mIGJ1ZmZlciBpbiB0aGUgb3V0cHV0IGZyYW1lLgorICogQHBhcmFtIG91dHB1dAlUaGUgb3V0cHV0IGZyYW1lLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2VzczsKKyAqLworUEpfSU5MSU5FKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9jb2RlY19kZWNvZGUocGptZWRpYV92aWRfY29kZWMgKmNvZGVjLAorCQkJCQkJcGpfc2l6ZV90IHBrdF9jb3VudCwKKwkJCQkJCXBqbWVkaWFfZnJhbWUgcGFja2V0c1tdLAorCQkJCQkJdW5zaWduZWQgb3V0X3NpemUsCisJCQkJCQlwam1lZGlhX2ZyYW1lICpvdXRwdXQpCit7CisgICAgcmV0dXJuICgqY29kZWMtPm9wLT5kZWNvZGUpKGNvZGVjLCBwa3RfY291bnQsIHBhY2tldHMsIG91dF9zaXplLCBvdXRwdXQpOworfQorCisvKioKKyAqIFJlY292ZXIgYSBtaXNzaW5nIGZyYW1lLgorICoKKyAqIEBwYXJhbSBjb2RlYwkJVGhlIGNvZGVjIGluc3RhbmNlLgorICogQHBhcmFtIG91dF9zaXplCVRoZSBsZW5ndGggb2YgYnVmZmVyIGluIHRoZSBvdXRwdXQgZnJhbWUuCisgKiBAcGFyYW0gb3V0cHV0CVRoZSBvdXRwdXQgZnJhbWUgd2hlcmUgZ2VuZXJhdGVkIHNpZ25hbAorICoJCQl3aWxsIGJlIHBsYWNlZC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3M7CisgKi8KK1BKX0lOTElORShwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfY29kZWNfcmVjb3Zlcihwam1lZGlhX3ZpZF9jb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9mcmFtZSAqb3V0cHV0KQoreworICAgIGlmIChjb2RlYy0+b3AgJiYgY29kZWMtPm9wLT5yZWNvdmVyKQorCXJldHVybiAoKmNvZGVjLT5vcC0+cmVjb3ZlcikoY29kZWMsIG91dF9zaXplLCBvdXRwdXQpOworICAgIGVsc2UKKwlyZXR1cm4gUEpfRU5PVFNVUDsKK30KKworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9DT0RFQ19WSURfQ09ERUNTIFN1cHBvcnRlZCB2aWRlbyBjb2RlY3MKKyAqIEBpbmdyb3VwIFBKTUVESUFfVklEX0NPREVDCisgKi8KKworCisKKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1ZJRF9DT0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9jb2RlY191dGlsLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfY29kZWNfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzJlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfY29kZWNfdXRpbC5oCkBAIC0wLDAgKzEsMTU4IEBACisvKiAkSWQ6IHZpZF9jb2RlY191dGlsLmggMzcxNSAyMDExLTA4LTE5IDA5OjM1OjI1WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1ZJRF9DT0RFQ19VVElMX0hfXworI2RlZmluZSBfX1BKTUVESUFfVklEX0NPREVDX1VUSUxfSF9fCisKKworLyoqCisgKiBAZmlsZSB2aWRfY29kZWNfdXRpbC5oCisgKiBAYnJpZWYgVmlkZW8gY29kZWMgdXRpbGl0aWVzLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhL3ZpZF9jb2RlYy5oPgorI2luY2x1ZGUgPHBqbWVkaWEvc2RwX25lZy5oPgorCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBEZWZpbml0aW9uIG9mIEguMjYzIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2NvZGVjX2gyNjNfZm10cAoreworICAgIHVuc2lnbmVkIG1waV9jbnQ7CQkgICAgLyoqPCAjIG9mIHBhcnNlZCBNUEkgcGFyYW0JCSAgICAqLworICAgIHN0cnVjdCBtcGkgeworCXBqbWVkaWFfcmVjdF9zaXplICAgc2l6ZTsgICAvKio8IFBpY3R1cmUgc2l6ZS9yZXNvbHV0aW9uCSAgICAqLworCXVuc2lnbmVkCSAgICB2YWw7ICAgIC8qKjwgTVBJIHZhbHVlCQkJICAgICovCisgICAgfSBtcGlbMzJdOwkJCSAgICAvKio8IE1pbmltdW0gUGljdHVyZSBJbnRlcnZhbCBwYXJhbWV0ZXIgKi8KKworfSBwam1lZGlhX3ZpZF9jb2RlY19oMjYzX2ZtdHA7CisKKworLyoqCisgKiBQYXJzZSBTRFAgZm10cCBvZiBILjI2My4KKyAqCisgKiBAcGFyYW0gZm10cAkJVGhlIEguMjYzIFNEUCBmbXRwIHRvIGJlIHBhcnNlZC4KKyAqIEBwYXJhbSBoMjYzX2ZtdHAJVGhlIHBhcnNpbmcgcmVzdWx0LgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfY29kZWNfaDI2M19wYXJzZV9mbXRwKAorCQkJCWNvbnN0IHBqbWVkaWFfY29kZWNfZm10cCAqZm10cCwKKwkJCQlwam1lZGlhX3ZpZF9jb2RlY19oMjYzX2ZtdHAgKmgyNjNfZm10cCk7CisKKworLyoqCisgKiBQYXJzZSwgbmVnb3RpYXRlLCBhbmQgYXBwbHkgdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBTRFAgZm10cCBvZiBILjI2MworICogaW4gdGhlIHNwZWNpZmllZCBjb2RlYyBwYXJhbWV0ZXIuCisgKgorICogQHBhcmFtIHBhcmFtCQlUaGUgY29kZWMgcGFyYW1ldGVyLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfY29kZWNfaDI2M19hcHBseV9mbXRwKAorCQkJCXBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtICpwYXJhbSk7CisKKworLyoqCisgKiBEZWZpbml0aW9uIG9mIEguMjY0IHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX2NvZGVjX2gyNjRfZm10cAoreworICAgIC8qIHByb2ZpbGUtbGV2ZWwtaWQgKi8KKyAgICBwal91aW50OF90CSAgICBwcm9maWxlX2lkYzsgICAgLyoqPCBQcm9maWxlIElECQkJICAgICovCisgICAgcGpfdWludDhfdAkgICAgcHJvZmlsZV9pb3A7ICAgIC8qKjwgUHJvZmlsZSBjb25zdHJhaW50cyBiaXRzCSAgICAqLworICAgIHBqX3VpbnQ4X3QJICAgIGxldmVsOwkgICAgLyoqPCBMZXZlbAkJCQkgICAgKi8KKworICAgIC8qIHBhY2tldGl6YXRpb24tbW9kZSAqLworICAgIHBqX3VpbnQ4X3QJICAgIHBhY2tldGl6YXRpb25fbW9kZTsJLyoqPCBQYWNrZXRpemF0aW9uIG1vZGUJCSAgICAqLworCisgICAgLyogbWF4LW1icHMsIG1heC1mcywgbWF4LWNwYiwgbWF4LWRwYiwgYW5kIG1heC1iciAqLworICAgIHVuc2lnbmVkCSAgICBtYXhfbWJwczsJICAgIC8qKjwgTWF4IG1hY3JvYmxvY2sgcHJvY2Vzc2luZyByYXRlCSAgICAqLworICAgIHVuc2lnbmVkCSAgICBtYXhfZnM7CSAgICAvKio8IE1heCBmcmFtZSBzaXplIChpbiBtYWNyb2Jsb2NrcykgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgbWF4X2NwYjsJICAgIC8qKjwgTWF4IGNvZGVkIHBpY3R1cmUgYnVmZmVyIHNpemUJICAgICovCisgICAgdW5zaWduZWQJICAgIG1heF9kcGI7CSAgICAvKio8IE1heCBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyIHNpemUgICAgKi8KKyAgICB1bnNpZ25lZAkgICAgbWF4X2JyOwkgICAgLyoqPCBNYXggdmlkZW8gYml0IHJhdGUJCSAgICAqLworCisgICAgLyogc3Byb3AtcGFyYW1ldGVyLXNldHMsIGluIE5BTCB1bml0cyAqLworICAgIHBqX3NpemVfdAkgICAgc3Byb3BfcGFyYW1fc2V0c19sZW47ICAgLyoqPCBQYXJhbWV0ZXIgc2V0IGxlbmd0aAkgICAgKi8KKyAgICBwal91aW50OF90CSAgICBzcHJvcF9wYXJhbV9zZXRzWzI1Nl07ICAvKio8IFBhcmFtZXRlciBzZXQgKFNQUyAmIFBQUyksCisJCQkJCQkgaW4gTkFMIHVuaXQgYml0c3RyZWFtCSAgICAqLworCit9IHBqbWVkaWFfdmlkX2NvZGVjX2gyNjRfZm10cDsKKworCisvKioKKyAqIFBhcnNlIFNEUCBmbXRwIG9mIEguMjY0LgorICoKKyAqIEBwYXJhbSBmbXRwCQlUaGUgSC4yNjQgU0RQIGZtdHAgdG8gYmUgcGFyc2VkLgorICogQHBhcmFtIGgyNjRfZm10cAlUaGUgcGFyc2luZyByZXN1bHQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9jb2RlY19oMjY0X3BhcnNlX2ZtdHAoCisJCQkJY29uc3QgcGptZWRpYV9jb2RlY19mbXRwICpmbXRwLAorCQkJCXBqbWVkaWFfdmlkX2NvZGVjX2gyNjRfZm10cCAqaDI2NF9mbXRwKTsKKworCisvKioKKyAqIE1hdGNoIEguMjY0IGZvcm1hdCBpbiB0aGUgU0RQIG1lZGlhIG9mZmVyIGFuZCBhbnN3ZXIuIFRoaXMgd2lsbCBjb21wYXJlCisgKiBILjI2NCBpZGVudGlmaWVyIHBhcmFtZXRlcnMgaW4gU0RQIGZtdHAsIGkuZTogInByb2ZpbGUtbGV2ZWwtaWQiIGFuZAorICogInBhY2tldGl6YXRpb24tbW9kZSIgZmllbGRzLiBGb3IgYmV0dGVyIGludGVyb3BlcmFiaWxpdHksIHdoZW4gdGhlIG9wdGlvbgorICogI1BKTUVESUFfU0RQX05FR19GTVRfTUFUQ0hfQUxMT1dfTU9ESUZZX0FOU1dFUiBpcyBzZXQsIHRoaXMgZnVuY3Rpb24KKyAqIG1heSB1cGRhdGUgdGhlIGFuc3dlciBzbyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgYW5zd2VyIG1hdGNoIHRvIG9uZXMKKyAqIGluIHRoZSBvZmZlci4KKyAqCisgKiBAcGFyYW0gcG9vbAkJVGhlIG1lbW9yeSBwb29sLgorICogQHBhcmFtIG9mZmVyCQlUaGUgU0RQIG1lZGlhIG9mZmVyLgorICogQHBhcmFtIG9fZm10X2lkeAlJbmRleCBvZiB0aGUgSC4yNjQgZm9ybWF0IGluIHRoZSBTRFAgbWVkaWEgb2ZmZXIuCisgKiBAcGFyYW0gYW5zd2VyCVRoZSBTRFAgbWVkaWEgYW5zd2VyLgorICogQHBhcmFtIGFfZm10X2lkeAlJbmRleCBvZiB0aGUgSC4yNjQgZm9ybWF0IGluIHRoZSBTRFAgbWVkaWEgYW5zd2VyLgorICogQHBhcmFtIG9wdGlvbglUaGUgZm9ybWF0IG1hdGNoaW5nIG9wdGlvbiwgc2VlCisgKgkJCSNwam1lZGlhX3NkcF9uZWdfZm10X21hdGNoX2ZsYWcuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyB3aGVuIHRoZSBmb3JtYXRzIGluIG9mZmVyIGFuZCBhbnN3ZXIgbWF0Y2guCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX2NvZGVjX2gyNjRfbWF0Y2hfc2RwKAorCQkJCQkJcGpfcG9vbF90ICpwb29sLAorCQkJCQkJcGptZWRpYV9zZHBfbWVkaWEgKm9mZmVyLAorCQkJCQkJdW5zaWduZWQgb19mbXRfaWR4LAorCQkJCQkJcGptZWRpYV9zZHBfbWVkaWEgKmFuc3dlciwKKwkJCQkJCXVuc2lnbmVkIGFfZm10X2lkeCwKKwkJCQkJCXVuc2lnbmVkIG9wdGlvbik7CisKKworLyoqCisgKiBQYXJzZSBhbmQgYXBwbHkgdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBTRFAgZm10cCBvZiBILjI2NCBpbiB0aGUKKyAqIHNwZWNpZmllZCBjb2RlYyBwYXJhbWV0ZXIuIFRoaXMgd2lsbCB2YWxpZGF0ZSBzaXplIGFuZCBmcHMgdG8gY29uZm9ybQorICogdG8gSC4yNjQgbGV2ZWwgc3BlY2lmaWVkIGluIFNEUCBmbXRwICJwcm9maWxlLWxldmVsLWlkIi4KKyAqCisgKiBAcGFyYW0gcGFyYW0JCVRoZSBjb2RlYyBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9jb2RlY19oMjY0X2FwcGx5X2ZtdHAoCisJCQkJcGptZWRpYV92aWRfY29kZWNfcGFyYW0gKnBhcmFtKTsKKworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfVklEX0NPREVDX1VUSUxfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfcG9ydC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWE2NmQxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3BvcnQuaApAQCAtMCwwICsxLDI0MyBAQAorLyogJElkOiB2aWRfcG9ydC5oIDQxNjggMjAxMi0wNi0xOCAwNTo1OTowOFogbWluZyAkICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fUEpNRURJQV9WSURQT1JUX0hfXworI2RlZmluZSBfX1BKTUVESUFfVklEUE9SVF9IX18KKworLyoqCisgKiBAZmlsZSBwam1lZGlhL3ZpZGVvcG9ydC5oIFZpZGVvIG1lZGlhIHBvcnQKKyAqIEBicmllZiBWaWRlbyBtZWRpYSBwb3J0CisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3BvcnQuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9WSURFT19QT1JUIFZpZGVvIG1lZGlhIHBvcnQKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVF9DTE9DSworICogQGJyaWVmIFZpZGVvIG1lZGlhIHBvcnQKKyAqIEB7CisgKi8KKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSB2aWRlbyBwb3J0CisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX3BvcnRfcGFyYW0KK3sKKyAgICAvKioKKyAgICAgKiBWaWRlbyBzdHJlYW0gcGFyYW1ldGVyLgorICAgICAqLworICAgIHBqbWVkaWFfdmlkX2Rldl9wYXJhbQl2aWRwYXJhbTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgd2hldGhlciB0aGUgdmlkZW8gcG9ydCBzaG91bGQgdXNlIGFjdGl2ZSBvciBwYXNzaXZlIGludGVyZmFjZS4KKyAgICAgKiBJZiBhY3RpdmUgaW50ZXJmYWNlIGlzIHNlbGVjdGVkLCB0aGUgdmlkZW8gcG9ydCB3aWxsIHBlcmZvcm0gYXMKKyAgICAgKiBhIG1lZGlhIGNsb2NrLCBhdXRvbWF0aWNhbGx5IGNhbGxzIHBqbWVkaWFfcG9ydF9nZXRfZnJhbWUoKSBhbmQKKyAgICAgKiBwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKCkgb2YgaXRzIHNsYXZlIHBvcnQgKGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uCisgICAgICogdGhhdCBpcyBzcGVjaWZpZWQgd2hlbiBvcGVuaW5nIHRoZSB2aWRlbyBzdHJlYW0pLiBJZiBwYXNzaXZlIGludGVyZmFjZQorICAgICAqIGlzIHNlbGVjdGVkLCBhcHBsaWNhdGlvbiBjYW4gcmV0cmlldmUgdGhlIG1lZGlhIHBvcnQgb2YgdGhpcyB2aWRlbworICAgICAqIHBvcnQgYnkgY2FsbGluZyBwam1lZGlhX3ZpZF9wb3J0X2dldF9wYXNzaXZlX3BvcnQoKSwgYW5kIHN1YnNlcXVlbnRseQorICAgICAqIGNhbGxzIHBqbWVkaWFfcG9ydF9wdXRfZnJhbWUoKSBvciBwam1lZGlhX3BvcnRfZ2V0X2ZyYW1lKCkgdG8gdGhhdAorICAgICAqIG1lZGlhIHBvcnQuCisgICAgICoKKyAgICAgKiBEZWZhdWx0OiBQSl9UUlVFCisgICAgICovCisgICAgcGpfYm9vbF90CQlhY3RpdmU7CisKK30gcGptZWRpYV92aWRfcG9ydF9wYXJhbTsKKworLyoqCisgKiBPcGFxdWUgZGF0YSB0eXBlIGZvciB2aWRlbyBwb3J0LgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9wb3J0IHBqbWVkaWFfdmlkX3BvcnQ7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzLiBOb3RlIHRoYXQgdGhpcyB0eXBpY2FsbHkKKyAqIHdvdWxkIG9ubHkgZmlsbCB0aGUgc3RydWN0dXJlIHRvIHplcm9lcyB1bmxlc3MgdGhleSBoYXZlIGRpZmZlcmVudCBkZWZhdWx0CisgKiB2YWx1ZXMuCisgKgorICogQHBhcmFtIHBybQlUaGUgcGFyYW1ldGVyLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfdmlkX3BvcnRfcGFyYW1fZGVmYXVsdChwam1lZGlhX3ZpZF9wb3J0X3BhcmFtICpwcm0pOworCisvKioKKyAqIENyZWF0ZSBhIHZpZGVvIHBvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci4gV2hlbiB2aWRlbyBwb3J0IG9wZW5zCisgKiB0aGUgdmlkZW8gc3RyZWFtIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlciB0aGFuIHRoZSByZXF1ZXN0ZWQgdmFsdWVzIGluCisgKiB0aGUgXGEgcHJtLnZpZHBhcmFtIGFyZ3VtZW50LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgZG8gdGhlIG5lY2Vzc2FyeQorICogY29udmVyc2lvbi4KKyAqCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbS4KKyAqIEBwYXJhbSBwcm0JCVRoZSB2aWRlbyBwb3J0IHBhcmFtZXRlci4KKyAqIEBwYXJhbSBwX3ZwCQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIGlmIHZpZGVvIHBvcnQgaGFzIGJlZW4gY3JlYXRlZAorICogCQkJc3VjY2Vzc2Z1bGx5LCBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfcG9ydF9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgIGNvbnN0IHBqbWVkaWFfdmlkX3BvcnRfcGFyYW0gKnBybSwKKwkJCQkJICAgICBwam1lZGlhX3ZpZF9wb3J0ICoqcF92cCk7CisKKy8qKgorICogU2V0IHRoZSBjYWxsYmFja3Mgb2YgdGhlIHZpZGVvIHBvcnQncyB1bmRlcmx5aW5nIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gdmlkX3BvcnQJVGhlIHZpZGVvIHBvcnQuCisgKiBAcGFyYW0gY2IgICAgICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHZpZGVvIHN0cmVhbQorICogICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLgorICogQHBhcmFtIHVzZXJfZGF0YSAgICAgQXJiaXRyYXJ5IHVzZXIgZGF0YSwgd2hpY2ggd2lsbCBiZSBnaXZlbiBiYWNrIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLgorICovCitQSl9ERUNMKHZvaWQpIHBqbWVkaWFfdmlkX3BvcnRfc2V0X2NiKHBqbWVkaWFfdmlkX3BvcnQgKnZpZF9wb3J0LAorCQkJCSAgICAgIGNvbnN0IHBqbWVkaWFfdmlkX2Rldl9jYiAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qKgorICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIHZpZGVvIHN0cmVhbSBvZiB0aGUgdmlkZW8gcG9ydC4KKyAqCisgKiBAcGFyYW0gdmlkX3BvcnQJVGhlIHZpZGVvIHBvcnQuCisgKgorICogQHJldHVybgkJVGhlIHZpZGVvIHN0cmVhbS4KKyAqLworUEpfREVDTChwam1lZGlhX3ZpZF9kZXZfc3RyZWFtKikKK3BqbWVkaWFfdmlkX3BvcnRfZ2V0X3N0cmVhbShwam1lZGlhX3ZpZF9wb3J0ICp2aWRfcG9ydCk7CisKKy8qKgorICogUmV0dXJuIHRoZSAocGFzc2l2ZSkgbWVkaWEgcG9ydCBvZiB0aGUgdmlkZW8gcG9ydC4gVGhpcyBvcGVyYXRpb24KKyAqIGlzIG9ubHkgdmFsaWQgZm9yIHZpZGVvIHBvcnRzIGNyZWF0ZWQgd2l0aCBwYXNzaXZlIGludGVyZmFjZSBzZWxlY3RlZC4KKyAqIFJldHJpZXZpbmcgdGhlIG1lZGlhIHBvcnQgZm9yIGFjdGl2ZSB2aWRlbyBwb3J0cyBtYXkgcmFpc2UgYW4KKyAqIGFzc2VydGlvbi4KKyAqCisgKiAgQHBhcmFtIHZpZF9wb3J0CVRoZSB2aWRlbyBwb3J0LgorICoKKyAqICBAcmV0dXJuCQlUaGUgbWVkaWEgcG9ydCBpbnN0YW5jZSwgb3IgTlVMTC4KKyAqLworUEpfREVDTChwam1lZGlhX3BvcnQqKQorcGptZWRpYV92aWRfcG9ydF9nZXRfcGFzc2l2ZV9wb3J0KHBqbWVkaWFfdmlkX3BvcnQgKnZpZF9wb3J0KTsKKworLyoqCisgKiBHZXQgYSBjbG9jayBzb3VyY2UgZnJvbSB0aGUgdmlkZW8gcG9ydC4KKyAqCisgKiBAcGFyYW0gdmlkX3BvcnQgIFRoZSB2aWRlbyBwb3J0LgorICoKKyAqIEByZXR1cm4JICAgIFRoZSBjbG9jayBzb3VyY2UuCisgKi8KK1BKX0RFQ0wocGptZWRpYV9jbG9ja19zcmMgKikKK3BqbWVkaWFfdmlkX3BvcnRfZ2V0X2Nsb2NrX3NyYyggcGptZWRpYV92aWRfcG9ydCAqdmlkX3BvcnQgKTsKKworLyoqCisgKiBTZXQgYSBjbG9jayBzb3VyY2UgZm9yIHRoZSB2aWRlbyBwb3J0LgorICoKKyAqIEBwYXJhbSB2aWRfcG9ydCAgVGhlIHZpZGVvIHBvcnQuCisgKiBAcGFyYW0gY2xvY2tzcmMgIFRoZSBjbG9jayBzb3VyY2UuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KQorcGptZWRpYV92aWRfcG9ydF9zZXRfY2xvY2tfc3JjKCBwam1lZGlhX3ZpZF9wb3J0ICp2aWRfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9jbG9ja19zcmMgKmNsb2Nrc3JjICk7CisKKy8qKgorICogQ29ubmVjdCB0aGUgdmlkZW8gcG9ydCB0byBhIGRvd25zdHJlYW0gKHNsYXZlKSBtZWRpYSBwb3J0LiBUaGlzIG9wZXJhdGlvbgorICogaXMgb25seSB2YWxpZCBmb3IgdmlkZW8gcG9ydHMgY3JlYXRlZCB3aXRoIGFjdGl2ZSBpbnRlcmZhY2Ugc2VsZWN0ZWQuCisgKiBDb25uZWN0aW5nIGEgcGFzc2l2ZSB2aWRlbyBwb3J0IG1heSByYWlzZSBhbiBhc3NlcnRpb24uCisgKgorICogQHBhcmFtIHZpZF9wb3J0CVRoZSB2aWRlbyBwb3J0LgorICogQHBhcmFtIHBvcnQJCUEgZG93bnN0cmVhbSBtZWRpYSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bworICogCQkJdGhpcyB2aWRlbyBwb3J0LgorICogQHBhcmFtIGRlc3Ryb3kJU3BlY2lmeSBpZiB0aGUgZG93bnN0cmVhbSBtZWRpYSBwb3J0IHNob3VsZCBhbHNvIGJlCisgKiAJCQlkZXN0cm95ZWQgYnkgdGhpcyB2aWRlbyBwb3J0IHdoZW4gdGhlIHZpZGVvIHBvcnQKKyAqIAkJCWlzIGRlc3Ryb3llZC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX3BvcnRfY29ubmVjdChwam1lZGlhX3ZpZF9wb3J0ICp2aWRfcG9ydCwKKwkJCQkJICAgICAgcGptZWRpYV9wb3J0ICpwb3J0LAorCQkJCQkgICAgICBwal9ib29sX3QgZGVzdHJveSk7CisKKy8qKgorICogRGlzY29ubmVjdCB0aGUgdmlkZW8gcG9ydCBmcm9tIGl0cyBkb3duc3RyZWFtIChzbGF2ZSkgbWVkaWEgcG9ydCwgaWYgYW55LgorICogVGhpcyBvcGVyYXRpb24gaXMgb25seSB2YWxpZCBmb3IgdmlkZW8gcG9ydHMgY3JlYXRlZCB3aXRoIGFjdGl2ZSBpbnRlcmZhY2UKKyAqIHNlbGVjdGVkLCBhbmQgYXNzZXJ0aW9uIG1heSBiZSB0cmlnZ2VyZWQgaWYgdGhpcyBpcyBpbnZva2VkIG9uIGEgcGFzc2l2ZQorICogdmlkZW8gcG9ydC4KKyAqCisgKiBAcGFyYW0gdmlkX3BvcnQJVGhlIHZpZGVvIHBvcnQuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9wb3J0X2Rpc2Nvbm5lY3QocGptZWRpYV92aWRfcG9ydCAqdmlkX3BvcnQpOworCisvKioKKyAqIFJldHJpZXZlIHRoZSBtZWRpYSBwb3J0IGN1cnJlbnRseSBjb25uZWN0ZWQgYXMgZG93bnN0cmVhbSBtZWRpYSBwb3J0IG9mIHRoZQorICogc3BlY2lmaWVkIHZpZGVvIHBvcnQuIFRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIHZpZGVvIHBvcnRzIGNyZWF0ZWQKKyAqIHdpdGggYWN0aXZlIGludGVyZmFjZSBzZWxlY3RlZCwgYW5kIGFzc2VydGlvbiBtYXkgYmUgdHJpZ2dlcmVkIGlmIHRoaXMgaXMKKyAqIGludm9rZWQgb24gYSBwYXNzaXZlIHZpZGVvIHBvcnQuCisgKgorICogQHBhcmFtIHZpZF9wb3J0CVRoZSB2aWRlbyBwb3J0LgorICoKKyAqIEByZXR1cm4JCU1lZGlhIHBvcnQgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgdmlkZW8gcG9ydCwKKyAqIAkJCWlmIGFueS4KKyAqLworUEpfREVDTChwam1lZGlhX3BvcnQqKQorcGptZWRpYV92aWRfcG9ydF9nZXRfY29ubmVjdGVkX3BvcnQocGptZWRpYV92aWRfcG9ydCAqdmlkX3BvcnQpOworCisvKioKKyAqIFN0YXJ0IHRoZSB2aWRlbyBwb3J0LgorICoKKyAqIEBwYXJhbSB2aWRfcG9ydAlUaGUgdmlkZW8gcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX3BvcnRfc3RhcnQocGptZWRpYV92aWRfcG9ydCAqdmlkX3BvcnQpOworCisvKioKKyAqIFF1ZXJ5IHdoZXRoZXIgdGhlIHZpZGVvIHBvcnQgaGFzIGJlZW4gc3RhcnRlZC4KKyAqCisgKiBAcGFyYW0gdmlkX3BvcnQJVGhlIHZpZGVvIHBvcnQuCisgKgorICogQHJldHVybgkJUEpfVFJVRSBpZiB0aGUgdmlkZW8gcG9ydCBoYXMgYmVlbiBzdGFydGVkLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV92aWRfcG9ydF9pc19ydW5uaW5nKHBqbWVkaWFfdmlkX3BvcnQgKnZpZF9wb3J0KTsKKworLyoqCisgKiBTdG9wIHRoZSB2aWRlbyBwb3J0LgorICoKKyAqIEBwYXJhbSB2aWRfcG9ydAlUaGUgdmlkZW8gcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3Mgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX3BvcnRfc3RvcChwam1lZGlhX3ZpZF9wb3J0ICp2aWRfcG9ydCk7CisKKy8qKgorICogRGVzdHJveSB0aGUgdmlkZW8gcG9ydCwgYWxvbmcgd2l0aCBpdHMgdmlkZW8gc3RyZWFtLiBJZiB0aGUgdmlkZW8gcG9ydCBpcworICogYW4gYWN0aXZlIG9uZSwgdGhpcyBtYXkgYWxzbyBkZXN0cm95IHRoZSBkb3duc3RyZWFtIG1lZGlhIHBvcnQsIGlmIHRoZQorICogZGVzdHJveSBmbGFnIGlzIHNldCB3aGVuIHRoZSBtZWRpYSBwb3J0IGlzIGNvbm5lY3RlZC4KKyAqCisgKiBAcGFyYW0gdmlkX3BvcnQJVGhlIHZpZGVvIHBvcnQuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV92aWRfcG9ydF9kZXN0cm95KHBqbWVkaWFfdmlkX3BvcnQgKnZpZF9wb3J0KTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmIC8qIF9fUEpNRURJQV9WSURQT1JUX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfc3RyZWFtLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyY2JkOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3ZpZF9zdHJlYW0uaApAQCAtMCwwICsxLDQyMyBAQAorLyogJElkOiB2aWRfc3RyZWFtLmggNDA0MyAyMDEyLTA0LTEyIDEzOjQxOjUwWiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfVklEX1NUUkVBTV9IX18KKyNkZWZpbmUgX19QSk1FRElBX1ZJRF9TVFJFQU1fSF9fCisKKworLyoqCisgKiBAZmlsZSB2aWRfc3RyZWFtLmgKKyAqIEBicmllZiBWaWRlbyBTdHJlYW0uCisgKi8KKworI2luY2x1ZGUgPHBqbWVkaWEvZW5kcG9pbnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL2pidWYuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3BvcnQuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3J0Y3AuaD4KKyNpbmNsdWRlIDxwam1lZGlhL3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHBqbWVkaWEvdmlkX2NvZGVjLmg+CisjaW5jbHVkZSA8cGovc29jay5oPgorCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURfVklEX1NUUk0gVmlkZW8gc3RyZWFtcworICogQGluZ3JvdXAgUEpNRURJQV9QT1JUCisgKiBAYnJpZWYgVmlkZW8gY29tbXVuaWNhdGlvbiB2aWEgdGhlIG5ldHdvcmsKKyAqIEB7CisgKgorICogQSB2aWRlbyBzdHJlYW0gaXMgYSBiaWRpcmVjdGlvbmFsIHZpZGVvIGNvbW11bmljYXRpb24gYmV0d2VlbiB0d28KKyAqIGVuZHBvaW50cy4gSXQgY29ycmVzcG9uZHMgdG8gYSB2aWRlbyBtZWRpYSBkZXNjcmlwdGlvbiAoIm09dmlkZW8iIGxpbmUpCisgKiBpbiBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICoKKyAqIEEgdmlkZW8gc3RyZWFtIGNvbnNpc3RzIG9mIHR3byB1bmlkaXJlY3Rpb25hbCBjaGFubmVsczoKKyAqICAtIGVuY29kaW5nIGNoYW5uZWwsIHdoaWNoIHRyYW5zbWl0cyB1bmlkaXJlY3Rpb25hbCB2aWRlbyB0byByZW1vdGUsIGFuZAorICogIC0gZGVjb2RpbmcgY2hhbm5lbCwgd2hpY2ggcmVjZWl2ZXMgdW5pZGlyZWN0aW9uYWwgbWVkaWEgZnJvbSByZW1vdGUuCisgKgorICogQSB2aWRlbyBzdHJlYW0gZXhwb3J0cyB0d28gbWVkaWEgcG9ydCBpbnRlcmZhY2UgKHNlZSBAcmVmIFBKTUVESUFfUE9SVCksCisgKiBvbmUgZm9yIGVhY2ggZGlyZWN0aW9uLCBhbmQgYXBwbGljYXRpb24gbm9ybWFsbHkgdXNlcyB0aGlzIGludGVyZmFjZSB0bworICogaW50ZXJjb25uZWN0IHRoZSBzdHJlYW0gdG8gb3RoZXIgUEpNRURJQSBjb21wb25lbnRzLCBlLmc6IHRoZSB2aWRlbworICogY2FwdHVyZSBwb3J0IHN1cHBsaWVzIGZyYW1lcyB0byB0aGUgZW5jb2RpbmcgcG9ydCBhbmQgdmlkZW8gcmVuZGVyZXIKKyAqIGNvbnN1bWVzIGZyYW1lcyBmcm9tIHRoZSBkZWNvZGluZyBwb3J0LgorICoKKyAqIEEgdmlkZW8gc3RyZWFtIGludGVybmFsbHkgbWFuYWdlcyB0aGUgZm9sbG93aW5nIG9iamVjdHM6CisgKiAgLSBhbiBpbnN0YW5jZSBvZiB2aWRlbyBjb2RlYyAoc2VlIEByZWYgUEpNRURJQV9WSURfQ09ERUMpLAorICogIC0gYW4gQHJlZiBQSk1FRF9KQlVGLAorICogIC0gdHdvIGluc3RhbmNlcyBvZiBSVFAgc2Vzc2lvbnMgKCNwam1lZGlhX3J0cF9zZXNzaW9uLCBvbmUgZm9yIGVhY2gKKyAqICAgIGRpcmVjdGlvbiksCisgKiAgLSBvbmUgaW5zdGFuY2Ugb2YgUlRDUCBzZXNzaW9uICgjcGptZWRpYV9ydGNwX3Nlc3Npb24pLAorICogIC0gYW5kIGEgcmVmZXJlbmNlIHRvIHZpZGVvIHRyYW5zcG9ydCB0byBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMKKyAqICAgIHRvL2Zyb20gdGhlIG5ldHdvcmsgKHNlZSBAcmVmIFBKTUVESUFfVFJBTlNQT1JUKS4KKyAqCisgKiBWaWRlbyBzdHJlYW1zIGFyZSBjcmVhdGVkIGJ5IGNhbGxpbmcgI3BqbWVkaWFfdmlkX3N0cmVhbV9jcmVhdGUoKSwKKyAqIHNwZWNpZnlpbmcgI3BqbWVkaWFfc3RyZWFtX2luZm8gc3RydWN0dXJlIGluIHRoZSBwYXJhbWV0ZXIuIEFwcGxpY2F0aW9uCisgKiBjYW4gY29uc3RydWN0IHRoZSAjcGptZWRpYV92aWRfc3RyZWFtX2luZm8gc3RydWN0dXJlIG1hbnVhbGx5LCBvciB1c2UgCisgKiAjcGptZWRpYV92aWRfc3RyZWFtX2luZm9fZnJvbV9zZHAoKSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgdGhlCisgKiAjcGptZWRpYV92aWQgc3RyZWFtX2luZm8gZnJvbSBsb2NhbCBhbmQgcmVtb3RlIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3JzLgorICovCisKKworLyoqCisgKiBFbnVtZXJhdGlvbiBvZiB2aWRlbyBzdHJlYW0gc2VuZGluZyByYXRlIGNvbnRyb2wuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX3ZpZF9zdHJlYW1fcmNfbWV0aG9kCit7CisgICAgLyoqCisgICAgICogTm8gc2VuZGluZyByYXRlIGNvbnRyb2wuIEFsbCBvdXRnb2luZyBSVFAgcGFja2V0cyB3aWxsIGJlIHRyYW5zbWl0dGVkCisgICAgICogaW1tZWRpYXRlbHkgcmlnaHQgYWZ0ZXIgZW5jb2RpbmcgcHJvY2VzcyBpcyBkb25lLgorICAgICAqLworICAgIFBKTUVESUFfVklEX1NUUkVBTV9SQ19OT05FCQkgICAgPSAwLAorCisgICAgLyoqCisgICAgICogU2ltcGxlIGJsb2NraW5nLiBFYWNoIG91dGdvaW5nIFJUUCBwYWNrZXQgdHJhbnNtaXNzaW9uIG1heSBiZSBkZWxheWVkCisgICAgICogdG8gYXZvaWQgcGVhayBiYW5kd2lkdGggdGhhdCBpcyBtdWNoIGhpZ2hlciB0aGFuIHNwZWNpZmllZC4gVGhlIHRocmVhZAorICAgICAqIGludm9raW5nIHRoZSB2aWRlbyBzdHJlYW0gcHV0X2ZyYW1lKCksIGUuZzogdmlkZW8gY2FwdHVyZSBkZXZpY2UgdGhyZWFkLAorICAgICAqIHdpbGwgYmUgYmxvY2tlZCB3aGVuZXZlciB0cmFuc21pc3Npb24gZGVsYXkgdGFrZXMgcGxhY2UuCisgICAgICovCisgICAgUEpNRURJQV9WSURfU1RSRUFNX1JDX1NJTVBMRV9CTE9DS0lORyAgID0gMQorCit9IHBqbWVkaWFfdmlkX3N0cmVhbV9yY19tZXRob2Q7CisKKworLyoqCisgKiBTdHJ1Y3R1cmUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdmlkZW8gc3RyZWFtIHNlbmRpbmcgcmF0ZSBjb250cm9sLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3ZpZF9zdHJlYW1fcmNfY29uZmlnCit7CisgICAgLyoqCisgICAgICogUmF0ZSBjb250cm9sIG1ldGhvZC4KKyAgICAgKgorICAgICAqIERlZmF1bHQ6IFBKTUVESUFfVklEX1NUUkVBTV9SQ19TSU1QTEVfQkxPQ0tJTkcuCisgICAgICovCisgICAgcGptZWRpYV92aWRfc3RyZWFtX3JjX21ldGhvZCAgICBtZXRob2Q7CisKKyAgICAvKioKKyAgICAgKiBVcHN0cmVhbS9vdXRnb2luZyBiYW5kd2lkdGguIElmIHRoaXMgaXMgc2V0IHRvIHplcm8sIHRoZSB2aWRlbyBzdHJlYW0KKyAgICAgKiB3aWxsIHVzZSBjb2RlYyBtYXhpbXVtIGJpdHJhdGUgc2V0dGluZy4KKyAgICAgKgorICAgICAqIERlZmF1bHQ6IDAgKGZvbGxvdyBjb2RlYyBtYXhpbXVtIGJpdHJhdGUpLgorICAgICAqLworICAgIHVuc2lnbmVkCQkJICAgIGJhbmR3aWR0aDsKKworfSBwam1lZGlhX3ZpZF9zdHJlYW1fcmNfY29uZmlnOworCisKKy8qKiAKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB2aWRlbyBzdHJlYW0gaW5mb3JtYXRpb24uIEVhY2ggdmlkZW8gc3RyZWFtCisgKiBjb3JyZXNwb25kcyB0byBvbmUgIm09IiBsaW5lIGluIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IsIGFuZCBpdCBoYXMKKyAqIGl0cyBvd24gUlRQL1JUQ1Agc29ja2V0IHBhaXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX3N0cmVhbV9pbmZvCit7CisgICAgcGptZWRpYV90eXBlCXR5cGU7CSAgICAvKio8IE1lZGlhIHR5cGUgKGF1ZGlvLCB2aWRlbykJICAgICovCisgICAgcGptZWRpYV90cF9wcm90bwlwcm90bzsJICAgIC8qKjwgVHJhbnNwb3J0IHByb3RvY29sIChSVFAvQVZQLCBldGMuKSAqLworICAgIHBqbWVkaWFfZGlyCQlkaXI7CSAgICAvKio8IE1lZGlhIGRpcmVjdGlvbi4JCSAgICAqLworICAgIHBqX3NvY2thZGRyCQlyZW1fYWRkcjsgICAvKio8IFJlbW90ZSBSVFAgYWRkcmVzcwkJICAgICovCisgICAgcGpfc29ja2FkZHIJCXJlbV9ydGNwOyAgIC8qKjwgT3B0aW9uYWwgcmVtb3RlIFJUQ1AgYWRkcmVzcy4gSWYKKwkJCQkJIHNpbl9mYW1pbHkgaXMgemVybywgdGhlIFJUUCBhZGRyZXNzCisJCQkJCSB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBSVFAuCSAgICAqLworICAgIHVuc2lnbmVkCQl0eF9wdDsJICAgIC8qKjwgT3V0Z29pbmcgY29kZWMgcGF5bGFvZCB0eXBlLgkgICAgKi8KKyAgICB1bnNpZ25lZAkJcnhfcHQ7CSAgICAvKio8IEluY29taW5nIGNvZGVjIHBheWxhb2QgdHlwZS4JICAgICovCisgICAgcGpfdWludDMyX3QJCXNzcmM7CSAgICAvKio8IFJUUCBTU1JDLgkJCSAgICAqLworICAgIHBqX3VpbnQzMl90CQlydHBfdHM7CSAgICAvKio8IEluaXRpYWwgUlRQIHRpbWVzdGFtcC4JCSAgICAqLworICAgIHBqX3VpbnQxNl90CQlydHBfc2VxOyAgICAvKio8IEluaXRpYWwgUlRQIHNlcXVlbmNlIG51bWJlci4JICAgICovCisgICAgcGpfdWludDhfdAkJcnRwX3NlcV90c19zZXQ7CisJCQkJICAgIC8qKjwgQml0bWFzayBmbGFncyBpZiBpbml0aWFsIFJUUCBzZXF1ZW5jZSAKKwkJCQkgICAgICAgICBhbmQvb3IgdGltZXN0YW1wIGZvciBzZW5kZXIgYXJlIHNldC4KKwkJCQkJIGJpdCAwL0xTQiA6IHNlcXVlbmNlIGZsYWcgCisJCQkJCSBiaXQgMSAgICAgOiB0aW1lc3RhbXAgZmxhZyAJICAgICovCisgICAgaW50CQkJamJfaW5pdDsgICAgLyoqPCBKaXR0ZXIgYnVmZmVyIGluaXQgZGVsYXkgaW4gbXNlYy4gIAorCQkJCQkgKC0xIGZvciBkZWZhdWx0KS4JCSAgICAqLworICAgIGludAkJCWpiX21pbl9wcmU7IC8qKjwgSml0dGVyIGJ1ZmZlciBtaW5pbXVtIHByZWZldGNoCisJCQkJCSBkZWxheSBpbiBtc2VjICgtMSBmb3IgZGVmYXVsdCkuICAgICovCisgICAgaW50CQkJamJfbWF4X3ByZTsgLyoqPCBKaXR0ZXIgYnVmZmVyIG1heGltdW0gcHJlZmV0Y2gKKwkJCQkJIGRlbGF5IGluIG1zZWMgKC0xIGZvciBkZWZhdWx0KS4gICAgKi8KKyAgICBpbnQJCQlqYl9tYXg7CSAgICAvKio8IEppdHRlciBidWZmZXIgbWF4IGRlbGF5IGluIG1zZWMuICAgKi8KKworI2lmIGRlZmluZWQoUEpNRURJQV9TVFJFQU1fRU5BQkxFX0tBKSAmJiBQSk1FRElBX1NUUkVBTV9FTkFCTEVfS0EhPTAKKyAgICBwal9ib29sX3QJCXVzZV9rYTsJICAgIC8qKjwgU3RyZWFtIGtlZXAtYWxpdmUgYW5kIE5BVCBob2xlIHB1bmNoCisJCQkJCSAoc2VlICNQSk1FRElBX1NUUkVBTV9FTkFCTEVfS0EpCisJCQkJCSBpcyBlbmFibGVkPwkJCSAgICAqLworI2VuZGlmCisKKyAgICBwam1lZGlhX3ZpZF9jb2RlY19pbmZvICAgY29kZWNfaW5mbzsgIC8qKjwgSW5jb21pbmcgY29kZWMgZm9ybWF0IGluZm8uICAqLworICAgIHBqbWVkaWFfdmlkX2NvZGVjX3BhcmFtICpjb2RlY19wYXJhbTsgLyoqPCBPcHRpb25hbCBjb2RlYyBwYXJhbS4JICAgICovCisKKyAgICBwal9ib29sX3QgICAgICAgICAgIHJ0Y3Bfc2Rlc19ieWVfZGlzYWJsZWQ7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEaXNhYmxlIGF1dG9tYXRpYyBzZW5kaW5nIG9mIFJUQ1AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RFUyBhbmQgQllFLiAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgcGptZWRpYV92aWRfc3RyZWFtX3JjX2NvbmZpZyByY19jZmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBzZW5kIHJhdGUgY29udHJvbCBzZXR0aW5ncy4gKi8KK30gcGptZWRpYV92aWRfc3RyZWFtX2luZm87CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgdmlkZW8gc3RyZWFtIGluZm8gYmFzZWQgb24gaW5mb3JtYXRpb24KKyAqIGluIGJvdGggU0RQIHNlc3Npb24gZGVzY3JpcHRvcnMgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGluZGV4LiAKKyAqIFRoZSByZW1haW5pbmcgaW5mb3JtYXRpb24gd2lsbCBiZSB0YWtlbiBmcm9tIGRlZmF1bHQgY29kZWMgcGFyYW1ldGVycy4gCisgKiBJZiBzb2NrZXQgaW5mbyBhcnJheSBpcyBzcGVjaWZpZWQsIHRoZSBzb2NrZXQgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIAorICogc2Vzc2lvbiBpbmZvIGFzIHdlbGwuCisgKgorICogQHBhcmFtIHNpCQlTdHJlYW0gaW5mbyBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKiBAcGFyYW0gcG9vbAkJUG9vbCB0byBhbGxvY2F0ZSBtZW1vcnkuCisgKiBAcGFyYW0gZW5kcHQJCVBKTUVESUEgZW5kcG9pbnQgaW5zdGFuY2UuCisgKiBAcGFyYW0gbG9jYWwJCUxvY2FsIFNEUCBzZXNzaW9uIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gcmVtb3RlCVJlbW90ZSBTRFAgc2Vzc2lvbiBkZXNjcmlwdG9yLgorICogQHBhcmFtIHN0cmVhbV9pZHgJTWVkaWEgc3RyZWFtIGluZGV4IGluIHRoZSBzZXNzaW9uIGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBpZiBzdHJlYW0gaW5mbyBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3ZpZF9zdHJlYW1faW5mb19mcm9tX3NkcChwam1lZGlhX3ZpZF9zdHJlYW1faW5mbyAqc2ksCisJCQkgICAgICAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJIHBqbWVkaWFfZW5kcHQgKmVuZHB0LAorCQkJCSBjb25zdCBwam1lZGlhX3NkcF9zZXNzaW9uICpsb2NhbCwKKwkJCQkgY29uc3QgcGptZWRpYV9zZHBfc2Vzc2lvbiAqcmVtb3RlLAorCQkJCSB1bnNpZ25lZCBzdHJlYW1faWR4KTsKKworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIHZpZGVvIHN0cmVhbSByYXRlIGNvbnRyb2wgd2l0aCBkZWZhdWx0IHNldHRpbmdzLgorICoKKyAqIEBwYXJhbSBjZmcJCVZpZGVvIHN0cmVhbSByYXRlIGNvbnRyb2wgc3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkLgorICovCitQSl9ERUNMKHZvaWQpCitwam1lZGlhX3ZpZF9zdHJlYW1fcmNfY29uZmlnX2RlZmF1bHQocGptZWRpYV92aWRfc3RyZWFtX3JjX2NvbmZpZyAqY2ZnKTsKKworCisvKgorICogT3BhcXVlIGRlY2xhcmF0aW9uIGZvciB2aWRlbyBzdHJlYW0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfdmlkX3N0cmVhbSBwam1lZGlhX3ZpZF9zdHJlYW07CisKKworLyoqCisgKiBDcmVhdGUgYSB2aWRlbyBzdHJlYW0gYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuIEFmdGVyIHRoZSB2aWRlbworICogc3RyZWFtIGhhcyBiZWVuIGNyZWF0ZWQsIGFwcGxpY2F0aW9uIG5vcm1hbGx5IHdvdWxkIHdhbnQgdG8gZ2V0IHRoZSBtZWRpYQorICogcG9ydCBpbnRlcmZhY2Ugb2YgdGhlIHN0cmVhbSwgYnkgY2FsbGluZyBwam1lZGlhX3ZpZF9zdHJlYW1fZ2V0X3BvcnQoKS4KKyAqIFRoZSBtZWRpYSBwb3J0IGludGVyZmFjZSBleHBvcnRzIHB1dF9mcmFtZSgpIGFuZCBnZXRfZnJhbWUoKSBmdW5jdGlvbiwKKyAqIHVzZWQgdG8gdHJhbnNtaXQgYW5kIHJlY2VpdmUgbWVkaWEgZnJhbWVzIGZyb20gdGhlIHN0cmVhbS4KKyAqCisgKiBXaXRob3V0IGFwcGxpY2F0aW9uIGNhbGxpbmcgcHV0X2ZyYW1lKCkgYW5kIGdldF9mcmFtZSgpLCB0aGVyZSB3aWxsIGJlIAorICogbm8gbWVkaWEgZnJhbWVzIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkIGJ5IHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIGVuZHB0CQlNZWRpYSBlbmRwb2ludC4KKyAqIEBwYXJhbSBwb29sCQlPcHRpb25hbCBwb29sIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0cmVhbS4gSWYKKyAqIAkJCXRoaXMgaXMgbm90IHNwZWNpZmllZCwgb25lIHdpbGwgYmUgY3JlYXRlZCBpbnRlcm5hbGx5LgorICogCQkJQSBsYXJnZSBudW1iZXIgb2YgbWVtb3J5IG1heSBiZSBuZWVkZWQgYmVjYXVzZSBqaXR0ZXIKKyAqCQkJYnVmZmVyIG5lZWRzIHRvIHByZWFsbG9jYXRlIHNvbWUgc3RvcmFnZS4KKyAqIEBwYXJhbSBpbmZvCQlTdHJlYW0gaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBzdHJlYW0uIFVwb24gcmV0dXJuLAorICogCQkJdGhpcyBpbmZvIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tCisgKiAJCQl0aGUgaW5zdGFudGlhdGVkIGNvZGVjLiBOb3RlIHRoYXQgaWYgdGhlICJwb29sIgorICogCQkJYXJndW1lbnQgaXMgTlVMTCwgc29tZSBmaWVsZHMgaW4gdGhpcyAiaW5mbyIgcGFyYW1ldGVyCisgKiAJCQl3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIHRoZSBpbnRlcm5hbCBwb29sIG9mIHRoZQorICogCQkJc3RyZWFtLCB3aGljaCBtZWFucyB0aGF0IHRoZXkgd2lsbCBvbmx5IHJlbWFpbiB2YWxpZAorICogCQkJYXMgbG9uZyBhcyB0aGUgc3RyZWFtIGlzIG5vdCBkZXN0cm95ZWQuCisgKiBAcGFyYW0gdHAJCU1lZGlhIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIHRvIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKiAJCQlSVFAvUlRDUCBwYWNrZXRzIHRvL2Zyb20gdGhlIHVuZGVybHlpbmcgbmV0d29yay4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJQXJiaXRyYXJ5IHVzZXIgZGF0YSAoZm9yIGZ1dHVyZSBjYWxsYmFjayBmZWF0dXJlKS4KKyAqIEBwYXJhbSBwX3N0cmVhbQlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX3N0cmVhbV9jcmVhdGUoCisJCQkJCXBqbWVkaWFfZW5kcHQgKmVuZHB0LAorCQkJCQlwal9wb29sX3QgKnBvb2wsCisJCQkJCXBqbWVkaWFfdmlkX3N0cmVhbV9pbmZvICppbmZvLAorCQkJCQlwam1lZGlhX3RyYW5zcG9ydCAqdHAsCisJCQkJCXZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJcGptZWRpYV92aWRfc3RyZWFtICoqcF9zdHJlYW0pOworCisvKioKKyAqIERlc3Ryb3kgdGhlIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fZGVzdHJveShwam1lZGlhX3ZpZF9zdHJlYW0gKnN0cmVhbSk7CisKKworLyoqCisgKiBHZXQgdGhlIG1lZGlhIHBvcnQgaW50ZXJmYWNlIG9mIHRoZSBzdHJlYW0uIFRoZSBtZWRpYSBwb3J0IGludGVyZmFjZQorICogZGVjbGFyZXMgcHV0X2ZyYW1lKCkgYW5kIGdldF9mcmFtZSgpIGZ1bmN0aW9uLCB3aGljaCBpcyB0aGUgb25seSAKKyAqIHdheSBmb3IgYXBwbGljYXRpb24gdG8gdHJhbnNtaXQgYW5kIHJlY2VpdmUgbWVkaWEgZnJhbWVzIGZyb20gdGhlCisgKiBzdHJlYW0uIEFzIGJpZGlyZWN0aW9uYWwgdmlkZW8gc3RyZWFtaW5nIG1heSBoYXZlIGRpZmZlcmVudCB2aWRlbworICogZm9ybWF0cyBpbiB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGRpcmVjdGlvbiwgdGhlcmUgYXJlIHR3byBtZWRpYQorICogcG9ydHMgZXhwb3J0ZWQgYnkgdGhlIHZpZGVvIHN0cmVhbSwgb25lIGZvciBlYWNoIGRpcmVjdGlvbi4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gZGlyCQlUaGUgdmlkZW8gZGlyZWN0aW9uLgorICogQHBhcmFtIHBfcG9ydAlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHBvcnQgaW50ZXJmYWNlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfc3RyZWFtX2dldF9wb3J0KAorCQkJCQkgICAgcGptZWRpYV92aWRfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICBwam1lZGlhX2RpciBkaXIsCisJCQkJCSAgICBwam1lZGlhX3BvcnQgKipwX3BvcnQpOworCisKKy8qKgorICogR2V0IHRoZSBtZWRpYSB0cmFuc3BvcnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4KKyAqCisgKiBAcGFyYW0gc3QJCVRoZSB2aWRlbyBzdHJlYW0uCisgKgorICogQHJldHVybgkJVGhlIHRyYW5zcG9ydCBvYmplY3QgYmVpbmcgdXNlZCBieSB0aGUgc3RyZWFtLgorICovCitQSl9ERUNMKHBqbWVkaWFfdHJhbnNwb3J0KikgcGptZWRpYV92aWRfc3RyZWFtX2dldF90cmFuc3BvcnQoCisJCQkJCSAgICBwam1lZGlhX3ZpZF9zdHJlYW0gKnN0KTsKKworCisvKioKKyAqIEdldCB0aGUgc3RyZWFtIHN0YXRpc3RpY3MuIFNlZSBhbHNvICNwam1lZGlhX3N0cmVhbV9nZXRfc3RhdF9qYnVmKCkKKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gc3RhdAkJTWVkaWEgc3RyZWFtIHN0YXRpc3RpY3MuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fZ2V0X3N0YXQoCisJCQkJCSAgICBjb25zdCBwam1lZGlhX3ZpZF9zdHJlYW0gKnN0cmVhbSwKKwkJCQkJICAgIHBqbWVkaWFfcnRjcF9zdGF0ICpzdGF0KTsKKworLyoqCisgKiBSZXNldCB0aGUgdmlkZW8gc3RyZWFtIHN0YXRpc3RpY3MuCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgdmlkZW8gc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfc3RyZWFtX3Jlc2V0X3N0YXQocGptZWRpYV92aWRfc3RyZWFtICpzdHJlYW0pOworCisKKy8qKgorICogR2V0IGN1cnJlbnQgaml0dGVyIGJ1ZmZlciBzdGF0ZS4gU2VlIGFsc28gI3BqbWVkaWFfc3RyZWFtX2dldF9zdGF0KCkKKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gc3RhdGUJCUppdHRlciBidWZmZXIgc3RhdGUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fZ2V0X3N0YXRfamJ1ZigKKwkJCQkJICAgIGNvbnN0IHBqbWVkaWFfdmlkX3N0cmVhbSAqc3RyZWFtLAorCQkJCQkgICAgcGptZWRpYV9qYl9zdGF0ZSAqc3RhdGUpOworCisKKy8qKgorICogR2V0IHRoZSBzdHJlYW0gaW5mby4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gaW5mbwkJVmlkZW8gc3RyZWFtIGluZm8uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fZ2V0X2luZm8oCisJCQkJCSAgICBjb25zdCBwam1lZGlhX3ZpZF9zdHJlYW0gKnN0cmVhbSwKKwkJCQkJICAgIHBqbWVkaWFfdmlkX3N0cmVhbV9pbmZvICppbmZvKTsKKworCisvKioKKyAqIFN0YXJ0IHRoZSB2aWRlbyBzdHJlYW0uIFRoaXMgd2lsbCBzdGFydCB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbHMKKyAqIGluIHRoZSB2aWRlbyBzdHJlYW0sIGRlcGVuZGluZyBvbiB0aGUgdmlkZW8gZGlyZWN0aW9uIHRoYXQgd2FzIHNldAorICogd2hlbiB0aGUgc3RyZWFtIHdhcyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIHZpZGVvIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX3N0cmVhbV9zdGFydChwam1lZGlhX3ZpZF9zdHJlYW0gKnN0cmVhbSk7CisKKworLyoqCisgKiBRdWVyeSBpZiB0aGUgc3RyZWFtIGlzIHN0YXJ0ZWQgb24gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24uCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgdmlkZW8gc3RyZWFtLgorICogQHBhcmFtIGRpciAJCVRoZSBkaXJlY3Rpb24gdG8gYmUgY2hlY2tlZC4KKyAqCisgKiBAcmV0dXJuCQlQSl9UUlVFIGlmIHN0cmVhbSBpcyBzdGFydGVkLgorICovCitQSl9ERUNMKHBqX2Jvb2xfdCkgcGptZWRpYV92aWRfc3RyZWFtX2lzX3J1bm5pbmcocGptZWRpYV92aWRfc3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGptZWRpYV9kaXIgZGlyKTsKKworLyoqCisgKiBQYXVzZSBzdHJlYW0gY2hhbm5lbHMuCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgdmlkZW8gc3RyZWFtLgorICogQHBhcmFtIGRpcgkJV2hpY2ggY2hhbm5lbCBkaXJlY3Rpb24gdG8gcGF1c2UuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fcGF1c2UocGptZWRpYV92aWRfc3RyZWFtICpzdHJlYW0sCisJCQkJCSAgICAgIHBqbWVkaWFfZGlyIGRpcik7CisKKy8qKgorICogUmVzdW1lIHN0cmVhbSBjaGFubmVscy4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKiBAcGFyYW0gZGlyCQlXaGljaCBjaGFubmVsIGRpcmVjdGlvbiB0byByZXN1bWUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzOworICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fcmVzdW1lKHBqbWVkaWFfdmlkX3N0cmVhbSAqc3RyZWFtLAorCQkJCQkgICAgICAgcGptZWRpYV9kaXIgZGlyKTsKKworCisvKioKKyAqIEZvcmNlIHN0cmVhbSB0byBzZW5kIHZpZGVvIGtleWZyYW1lIG9uIHRoZSBuZXh0IHRyYW5zbWlzc2lvbi4KKyAqCisgKiBAcGFyYW0gc3RyZWFtCVRoZSB2aWRlbyBzdHJlYW0uCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzOworICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF9zdHJlYW1fc2VuZF9rZXlmcmFtZSgKKwkJCQkJCXBqbWVkaWFfdmlkX3N0cmVhbSAqc3RyZWFtKTsKKworCisvKioKKyAqIFNlbmQgUlRDUCBTREVTIGZvciB0aGUgbWVkaWEgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBzdHJlYW0JVGhlIG1lZGlhIHN0cmVhbS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfdmlkX3N0cmVhbV9zZW5kX3J0Y3Bfc2RlcygKKwkJCQkJCXBqbWVkaWFfdmlkX3N0cmVhbSAqc3RyZWFtKTsKKworCisvKioKKyAqIFNlbmQgUlRDUCBCWUUgZm9yIHRoZSBtZWRpYSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0cmVhbQlUaGUgbWVkaWEgc3RyZWFtLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfc3RyZWFtX3NlbmRfcnRjcF9ieWUoCisJCQkJCQlwam1lZGlhX3ZpZF9zdHJlYW0gKnN0cmVhbSk7CisKKworLyoqCisgKiBAfQorICovCisKK1BKX0VORF9ERUNMCisKKworI2VuZGlmCS8qIF9fUEpNRURJQV9WSURfU1RSRUFNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3RlZS5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvdmlkX3RlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmY4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS92aWRfdGVlLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qICRJZDogdmlkX3RlZS5oIDM2NjQgMjAxMS0wNy0xOSAwMzo0MjoyOFogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1ZJRF9URUVfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9WSURfVEVFX0hfXworCisvKioKKyAqIEBmaWxlIHZpZF90ZWUuaAorICogQGJyaWVmIFZpZGVvIHRlZSAoc291cmNlIGR1cGxpY2F0b3IpLgorICovCisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisKKy8qKgorICogQGFkZHRvZ3JvdXAgUEpNRURJQV9WSURfVEVFIFZpZGVvIHNvdXJjZSBkdXBsaWNhdG9yCisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBEdXBsaWNhdGUgdmlkZW8gZGF0YSBmcm9tIGEgbWVkaWEgcG9ydCBpbnRvIG11bHRpcGxlIG1lZGlhIHBvcnQgCisgKiAgZGVzdGluYXRpb25zCisgKiBAeworICoKKyAqIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgbWVkaWEgcG9ydCB0byBkdXBsaWNhdGUgdmlkZW8gZGF0YSBpbiB0aGUgc3RyZWFtLgorICoKKyAqIEEgdmlkZW8gdGVlIGJyYW5jaGVzIHZpZGVvIHN0cmVhbSBmbG93IGZyb20gb25lIHNvdXJjZSBwb3J0IHRvIG11bHRpcGxlCisgKiBkZXN0aW5hdGlvbiBwb3J0cyBieSBzaW1wbHkgZHVwbGljYXRpbmcgdGhlIHZpZGVvIGRhdGEgc3VwcGxpZWQgYnkgdGhlCisgKiBzb3VyY2UgcG9ydCBhbmQgZGVsaXZlcmluZyB0aGUgY29weSB0byBhbGwgcmVnaXN0ZXJlZCBkZXN0aW5hdGlvbnMuCisgKgorICogVGhlIHZpZGVvIHRlZSBpcyBhIHVuaWRpcmVjdGlvbmFsIHBvcnQsIGkuZTogZGF0YSBmbG93cyBmcm9tIHNvdXJjZSBwb3J0CisgKiB0byBkZXN0aW5hdGlvbiBwb3J0cyBvbmx5LiBBbHNvLCB0aGUgdmlkZW8gc291cmNlIHBvcnQgTVVTVCBhY3RpdmVseSBjYWxsCisgKiBwam1lZGlhX3BvcnRfcHV0X2ZyYW1lKCkgdG8gdGhlIHZpZGVvIHRlZSBhbmQgdGhlIHZpZGVvIGRlc3RpbmF0aW9uIHBvcnRzCisgKiBNVVNUIE5FVkVSIGNhbGwgcGptZWRpYV9wb3J0X2dldF9mcmFtZSgpIHRvIHRoZSB2aWRlbyB0ZWUuIFBsZWFzZSBub3RlIHRoYXQKKyAqIHRoZXJlIGlzIG5vIHNwZWNpZmljIG9yZGVyIG9mIHdoaWNoIGRlc3RpbmF0aW9uIHBvcnQgd2lsbCByZWNlaXZlIGEgZnJhbWUKKyAqIGZyb20gdGhlIHZpZGVvIHRlZS4KKyAqCisgKiBUaGUgdmlkZW8gdGVlIGlzIG5vdCB0aHJlYWQtc2FmZSwgc28gaXQgaXMgYXBwbGljYXRpb24gcmVzcG9uc2liaWxpdHkKKyAqIHRvIHN5bmNocm9uaXplIHZpZGVvIHRlZSBvcGVyYXRpb25zLCBlLmc6IG1ha2Ugc3VyZSB0aGUgc291cmNlIHBvcnQgaXMKKyAqIHBhdXNlZCBkdXJpbmcgYWRkaW5nIG9yIHJlbW92aW5nIGEgZGVzdGluYXRpb24gcG9ydC4KKyAqLworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBFbnVtZXJhdGlvbiBvZiB2aWRlbyB0ZWUgZmxhZ3MuCisgKi8KK3R5cGVkZWYgZW51bSBwam1lZGlhX3ZpZF90ZWVfZmxhZworeworICAgIC8qKgorICAgICAqIFRlbGwgdGhlIHZpZGVvIHRlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBwb3J0IHdpbGwgZG8gaW4tcGxhY2UKKyAgICAgKiBwcm9jZXNzaW5nLCBzbyB0aGUgZGVsaXZlcmVkIGRhdGEgbWF5IGJlIG1vZGlmaWVkIGJ5IHRoaXMgcG9ydC4KKyAgICAgKiBJZiB0aGlzIGZsYWcgaXMgdXNlZCwgYnVmZmVyIHdpbGwgYmUgY29waWVkIGJlZm9yZSBiZWluZyBnaXZlbiB0bworICAgICAqIHRoZSBkZXN0aW5hdGlvbiBwb3J0LgorICAgICAqLworICAgIFBKTUVESUFfVklEX1RFRV9EU1RfRE9fSU5fUExBQ0VfUFJPQyAgICA9IDQsCisKK30gcGptZWRpYV92aWRfdGVlX2ZsYWc7CisKKworLyoqCisgKiBDcmVhdGUgYSB2aWRlbyB0ZWUgcG9ydCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIG1lZGlhIHBvcnQuIEFwcGxpY2F0aW9uCisgKiBzaG91bGQgZGVzdHJveSB0aGUgdGVlIHdpdGggcGptZWRpYV9wb3J0X2Rlc3Ryb3koKSBhcyB1c3VhbC4gTm90ZSB0aGF0CisgKiBkZXN0cm95aW5nIHRoZSB0ZWUgZG9lcyBub3QgZGVzdHJveSBpdHMgZGVzdGluYXRpb24gcG9ydHMuCisgKgorICogQHBhcmFtIHBvb2wJCSAgICBUaGUgcG9vbC4KKyAqIEBwYXJhbSBmbXQJCSAgICBUaGUgc291cmNlIG1lZGlhIHBvcnQncyBmb3JtYXQuCisgKiBAcGFyYW0gbWF4X2RzdF9jbnQJICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZXN0aW5hdGlvbiBwb3J0cyBzdXBwb3J0ZWQuCisgKiBAcGFyYW0gcF92aWRfdGVlCSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIHZpZGVvIHRlZSBwb3J0LgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZQorICoJCQkgICAgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfdGVlX2NyZWF0ZShwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICBjb25zdCBwam1lZGlhX2Zvcm1hdCAqZm10LAorCQkJCQkgICAgdW5zaWduZWQgbWF4X2RzdF9jbnQsCisJCQkJCSAgICBwam1lZGlhX3BvcnQgKipwX3ZpZF90ZWUpOworCisvKioKKyAqIEFkZCBhIGRlc3RpbmF0aW9uIG1lZGlhIHBvcnQgdG8gdGhlIHZpZGVvIHRlZS4gRm9yIHRoaXMgZnVuY3Rpb24sIHRoZQorICogZGVzdGluYXRpb24gcG9ydCdzIG1lZGlhIGZvcm1hdCBtdXN0IG1hdGNoIHRoZSBzb3VyY2UgZm9ybWF0LgorICoKKyAqIEBwYXJhbSB2aWRfdGVlCSAgICBUaGUgdmlkZW8gdGVlLgorICogQHBhcmFtIG9wdGlvbgkgICAgVmlkZW8gdGVlIG9wdGlvbiwgc2VlIEBwam1lZGlhX3ZpZF90ZWVfZmxhZy4KKyAqIEBwYXJhbSBwb3J0CQkgICAgVGhlIGRlc3RpbmF0aW9uIG1lZGlhIHBvcnQuCisgKgorICogQHJldHVybgkJICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgKgkJCSAgICBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3ZpZF90ZWVfYWRkX2RzdF9wb3J0KHBqbWVkaWFfcG9ydCAqdmlkX3RlZSwKKwkJCQkJCSAgdW5zaWduZWQgb3B0aW9uLAorCQkJCQkJICBwam1lZGlhX3BvcnQgKnBvcnQpOworCisKKy8qKgorICogQWRkIGEgZGVzdGluYXRpb24gbWVkaWEgcG9ydCB0byB0aGUgdmlkZW8gdGVlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbworICogY3JlYXRlIGEgY29udmVydGVyIGlmIHRoZSBkZXN0aW5hdGlvbiBwb3J0J3MgbWVkaWEgZm9ybWF0IGRvZXMgbm90IG1hdGNoCisgKiB0aGUgc291cmNlIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gdmlkX3RlZQkgICAgVGhlIHZpZGVvIHRlZS4KKyAqIEBwYXJhbSBvcHRpb24JICAgIFZpZGVvIHRlZSBvcHRpb24sIHNlZSBAcGptZWRpYV92aWRfdGVlX2ZsYWcuCisgKiBAcGFyYW0gcG9ydAkJICAgIFRoZSBkZXN0aW5hdGlvbiBtZWRpYSBwb3J0LgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfdGVlX2FkZF9kc3RfcG9ydDIocGptZWRpYV9wb3J0ICp2aWRfdGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9uLAorCQkJCQkJICAgcGptZWRpYV9wb3J0ICpwb3J0KTsKKworCisvKioKKyAqIFJlbW92ZSBhIGRlc3RpbmF0aW9uIG1lZGlhIHBvcnQgZnJvbSB0aGUgdmlkZW8gdGVlLgorICoKKyAqIEBwYXJhbSB2aWRfdGVlCSAgICBUaGUgdmlkZW8gdGVlLgorICogQHBhcmFtIHBvcnQJCSAgICBUaGUgZGVzdGluYXRpb24gbWVkaWEgcG9ydCB0byBiZSByZW1vdmVkLgorICoKKyAqIEByZXR1cm4JCSAgICBQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICoJCQkgICAgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV92aWRfdGVlX3JlbW92ZV9kc3RfcG9ydChwam1lZGlhX3BvcnQgKnZpZF90ZWUsCisJCQkJCQkgICAgIHBqbWVkaWFfcG9ydCAqcG9ydCk7CisKKworUEpfRU5EX0RFQ0wKKworLyoqCisgKiBAfQorICovCisKKyNlbmRpZiAvKiBfX1BKTUVESUFfVklEX1RFRV9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wbGF5bGlzdC5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd2F2X3BsYXlsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxZTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wbGF5bGlzdC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiAkSWQ6IHdhdl9wbGF5bGlzdC5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9XQVZfUExBWUxJU1RfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9XQVZfUExBWUxJU1RfSF9fCisKKy8qKgorICogQGZpbGUgd2F2X3BsYXlsaXN0LmgKKyAqIEBicmllZiBXQVYgZmlsZSBwbGF5bGlzdC4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvd2F2X3BvcnQuaD4KKworCisKK1BKX0JFR0lOX0RFQ0wKKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1dBVl9QTEFZTElTVCBXQVYgRmlsZSBQbGF5IExpc3QKKyAqIEBpbmdyb3VwIFBKTUVESUFfUE9SVAorICogQGJyaWVmIEF1ZGlvIHBsYXliYWNrIG9mIG11bHRpcGxlIFdBViBmaWxlcworICogQHsKKyAqCisgKiBUaGUgV0FWIHBsYXkgbGlzdCBwb3J0IGVuYWJsZXMgYXBwbGljYXRpb24gdG8gcGxheSBiYWNrIG11bHRpcGxlCisgKiBXQVYgZmlsZXMgaW4gYSBwbGF5bGlzdC4KKyAqLworCisvKioKKyAqIENyZWF0ZSBhIFdBViBwbGF5bGlzdCBmcm9tIHRoZSBhcnJheSBvZiBXQVYgZmlsZSBuYW1lcy4gVGhlIFdBVgorICogZmlsZXMgbXVzdCBoYXZlIHRoZSBzYW1lIGNsb2NrIHJhdGUsIG51bWJlciBvZiBjaGFubmVscywgYW5kIGJpdHMKKyAqIHBlciBzYW1wbGUsIG9yIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVycm9yLgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGNyZWF0ZSBtZW1vcnkgYnVmZmVycyBmb3IgdGhpcyBwb3J0LgorICogQHBhcmFtIHBvcnRfbGFiZWwJT3B0aW9uYWwgbGFiZWwgdG8gc2V0IGFzIHRoZSBwb3J0IG5hbWUuCisgKiBAcGFyYW0gZmlsZV9saXN0CUFycmF5IG9mIFdBViBmaWxlIG5hbWVzLgorICogQHBhcmFtIGZpbGVfY291bnQJTnVtYmVyIG9mIGZpbGVzIGluIHRoZSBhcnJheS4KKyAqIEBwYXJhbSBwdGltZQkJVGhlIGR1cmF0aW9uIChpbiBtaWxpc2Vjb25kcykgb2YgZWFjaCBmcmFtZSByZWFkCisgKgkJCWZyb20gdGhpcyBwb3J0LiBJZiB0aGUgdmFsdWUgaXMgemVybywgdGhlIGRlZmF1bHQKKyAqCQkJZHVyYXRpb24gKDIwbXMpIHdpbGwgYmUgdXNlZC4KKyAqIEBwYXJhbSBvcHRpb25zCU9wdGlvbmFsIG9wdGlvbnMuIEFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IAorICoJCQlQSk1FRElBX0ZJTEVfTk9fTE9PUCB0byBwcmV2ZW50IHBsYXkgYmFjayBsb29wLgorICogQHBhcmFtIGJ1ZmZfc2l6ZQlCdWZmZXIgc2l6ZSB0byBiZSBhbGxvY2F0ZWQuIElmIHRoZSB2YWx1ZSBpcyB6ZXJvIG9yCisgKgkJCW5lZ2F0aXZlLCB0aGUgcG9ydCB3aWxsIHVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplICh3aGljaAorICoJCQlpcyBhYm91dCA0S0IpLgorICogQHBhcmFtIHBfcG9ydAlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGZpbGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIG9yIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3dhdl9wbGF5bGlzdF9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkJIGNvbnN0IHBqX3N0cl90ICpwb3J0X2xhYmVsLAorCQkJCQkJIGNvbnN0IHBqX3N0cl90IGZpbGVfbGlzdFtdLAorCQkJCQkJIGludCBmaWxlX2NvdW50LAorCQkJCQkJIHVuc2lnbmVkIHB0aW1lLAorCQkJCQkJIHVuc2lnbmVkIG9wdGlvbnMsCisJCQkJCQkgcGpfc3NpemVfdCBidWZmX3NpemUsCisJCQkJCQkgcGptZWRpYV9wb3J0ICoqcF9wb3J0KTsKKworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZpbGUgcmVhZGluZyBoYXMgcmVhY2hlZCB0aGUKKyAqIGVuZCBvZiBmaWxlIG9mIHRoZSBsYXN0IGZpbGUuIElmIHRoZSBmaWxlIGlzIHNldCB0byBwbGF5IHJlcGVhdGVkbHksIAorICogdGhlbiB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIE5vdGUgdGhhdCBvbmx5IG9uZSAKKyAqIGNhbGxiYWNrIGNhbiBiZSByZWdpc3RlcmVkIGZvciBlYWNoIGZpbGUgcG9ydC4KKyAqCisgKiBAcGFyYW0gcG9ydAkJVGhlIFdBViBwbGF5IGxpc3QgcG9ydC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJVXNlciBkYXRhIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbGJhY2sKKyAqIEBwYXJhbSBjYgkJQ2FsbGJhY2sgdG8gYmUgY2FsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24tCisgKgkJCVBKX1NVQ0NFU1MsIHRoZSBwbGF5YmFjayB3aWxsIHN0b3AuIE5vdGUgdGhhdCBpZgorICoJCQlhcHBsaWNhdGlvbiBkZXN0cm95cyB0aGUgZmlsZSBwb3J0IGluIHRoZSBjYWxsYmFjaywKKyAqCQkJaXQgbXVzdCByZXR1cm4gbm9uLVBKX1NVQ0NFU1MgaGVyZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpCitwam1lZGlhX3dhdl9wbGF5bGlzdF9zZXRfZW9mX2NiKHBqbWVkaWFfcG9ydCAqcG9ydCwKKwkJCSAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJICAgICAgICBwal9zdGF0dXNfdCAoKmNiKShwam1lZGlhX3BvcnQgKnBvcnQsCisJCQkJCQkgIHZvaWQgKnVzcl9kYXRhKSk7CisKKworLyoqCisgKiBAfQorICovCisKKworUEpfRU5EX0RFQ0wKKworCisjZW5kaWYJLyogX19QSk1FRElBX1dBVl9QTEFZTElTVF9IX18gKi8KZGlmZiAtLWdpdCBhL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdl9wb3J0LmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWQ4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZfcG9ydC5oCkBAIC0wLDAgKzEsMjUwIEBACisvKiAkSWQ6IHdhdl9wb3J0LmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1dBVl9QT1JUX0hfXworI2RlZmluZSBfX1BKTUVESUFfV0FWX1BPUlRfSF9fCisKKy8qKgorICogQGZpbGUgd2F2X3BvcnQuaAorICogQGJyaWVmIFdBViBmaWxlIHBsYXllciBhbmQgd3JpdGVyLgorICovCisjaW5jbHVkZSA8cGptZWRpYS9wb3J0Lmg+CisKKworCitQSl9CRUdJTl9ERUNMCisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GSUxFX1BMQVkgV0FWIEZpbGUgUGxheWVyCisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBBdWRpbyBwbGF5YmFjayBmcm9tIFdBViBmaWxlCisgKiBAeworICovCisKKy8qKgorICogV0FWIGZpbGUgcGxheWVyIG9wdGlvbnMuCisgKi8KK2VudW0gcGptZWRpYV9maWxlX3BsYXllcl9vcHRpb24KK3sKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBmaWxlIHBsYXllciB0byByZXR1cm4gTlVMTCBmcmFtZSB3aGVuIHRoZSB3aG9sZQorICAgICAqIGZpbGUgaGFzIGJlZW4gcGxheWVkLgorICAgICAqLworICAgIFBKTUVESUFfRklMRV9OT19MT09QID0gMQorfTsKKworCisvKioKKyAqIENyZWF0ZSBhIG1lZGlhIHBvcnQgdG8gcGxheSBzdHJlYW1zIGZyb20gYSBXQVYgZmlsZS4gV0FWIHBsYXllciBwb3J0CisgKiBzdXBwb3J0cyBmb3IgcmVhZGluZyBXQVYgZmlsZSB3aXRoIHVuY29tcHJlc3NlZCAxNiBiaXQgUENNIGZvcm1hdCBvciAKKyAqIGNvbXByZXNzZWQgRy43MTEgQS1sYXcvVS1sYXcgZm9ybWF0LgorICoKKyAqIEBwYXJhbSBwb29sCQlQb29sIHRvIGNyZWF0ZSBtZW1vcnkgYnVmZmVycyBmb3IgdGhpcyBwb3J0LgorICogQHBhcmFtIGZpbGVuYW1lCUZpbGUgbmFtZSB0byBvcGVuLgorICogQHBhcmFtIHB0aW1lCQlUaGUgZHVyYXRpb24gKGluIG1pbGlzZWNvbmRzKSBvZiBlYWNoIGZyYW1lIHJlYWQKKyAqCQkJZnJvbSB0aGlzIHBvcnQuIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCB0aGUgZGVmYXVsdAorICoJCQlkdXJhdGlvbiAoMjBtcykgd2lsbCBiZSB1c2VkLgorICogQHBhcmFtIGZsYWdzCQlQb3J0IGNyZWF0aW9uIGZsYWdzLgorICogQHBhcmFtIGJ1ZmZfc2l6ZQlCdWZmZXIgc2l6ZSB0byBiZSBhbGxvY2F0ZWQuIElmIHRoZSB2YWx1ZSBpcyB6ZXJvIG9yCisgKgkJCW5lZ2F0aXZlLCB0aGUgcG9ydCB3aWxsIHVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplICh3aGljaAorICoJCQlpcyBhYm91dCA0S0IpLgorICogQHBhcmFtIHBfcG9ydAlQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGZpbGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfd2F2X3BsYXllcl9wb3J0X2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkJICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCQkJCSAgICAgdW5zaWduZWQgcHRpbWUsCisJCQkJCQkgICAgIHVuc2lnbmVkIGZsYWdzLAorCQkJCQkJICAgICBwal9zc2l6ZV90IGJ1ZmZfc2l6ZSwKKwkJCQkJCSAgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0ICk7CisKKworLyoqCisgKiBHZXQgdGhlIGRhdGEgbGVuZ3RoLCBpbiBieXRlcy4KKyAqCisgKiBAcGFyYW0gcG9ydAkJVGhlIGZpbGUgcGxheWVyIHBvcnQuCisgKgorICogQHJldHVybgkJVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMuIFVwb24gZXJyb3IgaXQgd2lsbAorICoJCQlyZXR1cm4gbmVnYXRpdmUgdmFsdWUuCisgKi8KK1BKX0RFQ0wocGpfc3NpemVfdCkgcGptZWRpYV93YXZfcGxheWVyX2dldF9sZW4ocGptZWRpYV9wb3J0ICpwb3J0KTsKKworCisvKioKKyAqIFNldCB0aGUgZmlsZSBwbGF5IHBvc2l0aW9uIG9mIFdBViBwbGF5ZXIuCisgKgorICogQHBhcmFtIHBvcnQJCVRoZSBmaWxlIHBsYXllciBwb3J0LgorICogQHBhcmFtIG9mZnNldAlQbGF5YmFjayBwb3NpdGlvbiBpbiBieXRlcywgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgKgkJCXRoZSBwYXlsb2FkLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV93YXZfcGxheWVyX3BvcnRfc2V0X3BvcyggcGptZWRpYV9wb3J0ICpwb3J0LAorCQkJCQkJICAgICAgcGpfdWludDMyX3Qgb2Zmc2V0ICk7CisKKworLyoqCisgKiBHZXQgdGhlIGZpbGUgcGxheSBwb3NpdGlvbiBvZiBXQVYgcGxheWVyLgorICoKKyAqIEBwYXJhbSBwb3J0CQlUaGUgZmlsZSBwbGF5ZXIgcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQSl9TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK1BKX0RFQ0wocGpfc3NpemVfdCkgcGptZWRpYV93YXZfcGxheWVyX3BvcnRfZ2V0X3BvcyggcGptZWRpYV9wb3J0ICpwb3J0ICk7CisKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWxlIHJlYWRpbmcgaGFzIHJlYWNoZWQgdGhlCisgKiBlbmQgb2YgZmlsZS4gSWYgdGhlIGZpbGUgaXMgc2V0IHRvIHBsYXkgcmVwZWF0ZWRseSwgdGhlbiB0aGUgY2FsbGJhY2sKKyAqIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBOb3RlIHRoYXQgb25seSBvbmUgY2FsbGJhY2sgY2FuIGJlIAorICogcmVnaXN0ZXJlZCBmb3IgZWFjaCBmaWxlIHBvcnQuCisgKgorICogQHBhcmFtIHBvcnQJCVRoZSBmaWxlIHBsYXllciBwb3J0LgorICogQHBhcmFtIHVzZXJfZGF0YQlVc2VyIGRhdGEgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBjYWxsYmFjaworICogQHBhcmFtIGNiCQlDYWxsYmFjayB0byBiZSBjYWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi0KKyAqCQkJUEpfU1VDQ0VTUywgdGhlIHBsYXliYWNrIHdpbGwgc3RvcC4gTm90ZSB0aGF0IGlmCisgKgkJCWFwcGxpY2F0aW9uIGRlc3Ryb3lzIHRoZSBmaWxlIHBvcnQgaW4gdGhlIGNhbGxiYWNrLAorICoJCQlpdCBtdXN0IHJldHVybiBub24tUEpfU1VDQ0VTUyBoZXJlLgorICoKKyAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgCitwam1lZGlhX3dhdl9wbGF5ZXJfc2V0X2VvZl9jYiggcGptZWRpYV9wb3J0ICpwb3J0LAorCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCSAgICAgICBwal9zdGF0dXNfdCAoKmNiKShwam1lZGlhX3BvcnQgKnBvcnQsCisJCQkJCQkgdm9pZCAqdXNyX2RhdGEpKTsKKworLyoqCisgKiBAfQorICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GSUxFX1JFQyBGaWxlIFdyaXRlciAoUmVjb3JkZXIpCisgKiBAaW5ncm91cCBQSk1FRElBX1BPUlQKKyAqIEBicmllZiBBdWRpbyBjYXB0dXJlL3JlY29yZGluZyB0byBXQVYgZmlsZQorICogQHsKKyAqLworCisKKy8qKgorICogV0FWIGZpbGUgd3JpdGVyIG9wdGlvbnMuCisgKi8KK2VudW0gcGptZWRpYV9maWxlX3dyaXRlcl9vcHRpb24KK3sKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBmaWxlIHdyaXRlciB0byBzYXZlIHRoZSBhdWRpbyBpbiBQQ00gZm9ybWF0LgorICAgICAqLworICAgIFBKTUVESUFfRklMRV9XUklURV9QQ00gPSAwLAorCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgZmlsZSB3cml0ZXIgdG8gc2F2ZSB0aGUgYXVkaW8gaW4gRzcxMSBBbGF3IGZvcm1hdC4KKyAgICAgKi8KKyAgICBQSk1FRElBX0ZJTEVfV1JJVEVfQUxBVyA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBmaWxlIHdyaXRlciB0byBzYXZlIHRoZSBhdWRpbyBpbiBHNzExIEFsYXcgZm9ybWF0LgorICAgICAqLworICAgIFBKTUVESUFfRklMRV9XUklURV9VTEFXID0gMiwKK307CisKKworLyoqCisgKiBDcmVhdGUgYSBtZWRpYSBwb3J0IHRvIHJlY29yZCBzdHJlYW1zIHRvIGEgV0FWIGZpbGUuIE5vdGUgdGhhdCB0aGUgcG9ydAorICogbXVzdCBiZSBjbG9zZWQgcHJvcGVybHkgKHdpdGggI3BqbWVkaWFfcG9ydF9kZXN0cm95KCkpIHNvIHRoYXQgdGhlIFdBVgorICogaGVhZGVyIGNhbiBiZSBmaWxsZWQgd2l0aCBjb3JyZWN0IHZhbHVlcyAoc3VjaCBhcyB0aGUgZmlsZSBsZW5ndGgpLgorICogV0FWIHdyaXRlciBwb3J0IHN1cHBvcnRzIGZvciB3cml0aW5nIGF1ZGlvIGluIHVuY29tcHJlc3NlZCAxNiBiaXQgUENNIGZvcm1hdAorICogb3IgY29tcHJlc3NlZCBHLjcxMSBVLWxhdy9BLWxhdyBmb3JtYXQsIHRoaXMgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGluIAorICogXGEgZmxhZ3MgcGFyYW0uCisgKgorICogQHBhcmFtIHBvb2wJCSAgICBQb29sIHRvIGNyZWF0ZSBtZW1vcnkgYnVmZmVycyBmb3IgdGhpcyBwb3J0LgorICogQHBhcmFtIGZpbGVuYW1lCSAgICBGaWxlIG5hbWUuCisgKiBAcGFyYW0gY2xvY2tfcmF0ZQkgICAgVGhlIHNhbXBsaW5nIHJhdGUuCisgKiBAcGFyYW0gY2hhbm5lbF9jb3VudAkgICAgTnVtYmVyIG9mIGNoYW5uZWxzLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBiaXRzX3Blcl9zYW1wbGUgICBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIChlZyAxNikuCisgKiBAcGFyYW0gZmxhZ3MJCSAgICBQb3J0IGNyZWF0aW9uIGZsYWdzLCBzZWUKKyAqCQkJICAgICNwam1lZGlhX2ZpbGVfd3JpdGVyX29wdGlvbi4KKyAqIEBwYXJhbSBidWZmX3NpemUJICAgIEJ1ZmZlciBzaXplIHRvIGJlIGFsbG9jYXRlZC4gSWYgdGhlIHZhbHVlIGlzIAorICoJCQkgICAgemVybyBvciBuZWdhdGl2ZSwgdGhlIHBvcnQgd2lsbCB1c2UgZGVmYXVsdCBidWZmZXIKKyAqCQkJICAgIHNpemUgKHdoaWNoIGlzIGFib3V0IDRLQikuCisgKiBAcGFyYW0gcF9wb3J0CSAgICBQb2ludGVyIHRvIHJlY2VpdmUgdGhlIGZpbGUgcG9ydCBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3dhdl93cml0ZXJfcG9ydF9jcmVhdGUocGpfcG9vbF90ICpwb29sLAorCQkJCQkJICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJCQkJICAgIHVuc2lnbmVkIGNsb2NrX3JhdGUsCisJCQkJCQkgICAgdW5zaWduZWQgY2hhbm5lbF9jb3VudCwKKwkJCQkJCSAgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSwKKwkJCQkJCSAgICB1bnNpZ25lZCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCQkgICAgdW5zaWduZWQgZmxhZ3MsCisJCQkJCQkgICAgcGpfc3NpemVfdCBidWZmX3NpemUsCisJCQkJCQkgICAgcGptZWRpYV9wb3J0ICoqcF9wb3J0ICk7CisKKworLyoqCisgKiBHZXQgY3VycmVudCB3cml0aW5nIHBvc2l0aW9uLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtYXRjaAorICogdGhlIHNpemUgd3JpdHRlbiB0byB0aGUgZmlsZSwgc2luY2UgdGhlIFdBViB3cml0ZXIgZW1wbG95cyBzb21lIGludGVybmFsCisgKiBidWZmZXJpbmcuIEFsc28gdGhlIHZhbHVlIHJlcG9ydGVkIGhlcmUgb25seSBpbmRpY2F0ZXMgdGhlIHBheWxvYWQgc2l6ZQorICogKGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIFdBViBoZWFkZXIpLAorICoKKyAqIEBwYXJhbSBwb3J0CQlUaGUgZmlsZSB3cml0ZXIgcG9ydC4KKyAqCisgKiBAcmV0dXJuCQlQb3NpdGl2ZSB2YWx1ZSB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gKGluIGJ5dGVzKSwgCisgKgkJCW9yIG5lZ2F0aXZlIHZhbHVlIGNvbnRhaW5pbmcgdGhlIGVycm9yIGNvZGUuCisgKi8KK1BKX0RFQ0wocGpfc3NpemVfdCkgcGptZWRpYV93YXZfd3JpdGVyX3BvcnRfZ2V0X3BvcyggcGptZWRpYV9wb3J0ICpwb3J0ICk7CisKKworLyoqCisgKiBSZWdpc3RlciB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZpbGUgd3JpdGluZyBoYXMgcmVhY2hlZAorICogY2VydGFpbiBzaXplLiBBcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgY2FsbGJhY2ssIGZvciBleGFtcGxlLCB0byBsaW1pdAorICogdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlLgorICoKKyAqIEBwYXJhbSBwb3J0CQlUaGUgZmlsZSB3cml0ZXIgcG9ydC4KKyAqIEBwYXJhbSBwb3MJCVRoZSBmaWxlIHBvc2l0aW9uIG9uIHdoaWNoIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEJVXNlciBkYXRhIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgY2FsbGJhY2ssIGFuZCB3aWxsIGJlCisgKgkJCWdpdmVuIG9uIHRoZSBjYWxsYmFjay4KKyAqIEBwYXJhbSBjYgkJQ2FsbGJhY2sgdG8gYmUgY2FsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24tCisgKgkJCVBKX1NVQ0NFU1MsIHRoZSB3cml0aW5nIHdpbGwgc3RvcC4gTm90ZSB0aGF0IGlmIAorICoJCQlhcHBsaWNhdGlvbiBkZXN0cm95cyB0aGUgcG9ydCBpbiB0aGUgY2FsbGJhY2ssIGl0IG11c3QKKyAqCQkJcmV0dXJuIG5vbi1QSl9TVUNDRVNTIGhlcmUuCisgKgorICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSAKK3BqbWVkaWFfd2F2X3dyaXRlcl9wb3J0X3NldF9jYiggcGptZWRpYV9wb3J0ICpwb3J0LAorCQkJCXBqX3NpemVfdCBwb3MsCisJCQkJdm9pZCAqdXNlcl9kYXRhLAorCQkJCXBqX3N0YXR1c190ICgqY2IpKHBqbWVkaWFfcG9ydCAqcG9ydCwKKwkJCQkJCSAgdm9pZCAqdXNyX2RhdGEpKTsKKworCisvKioKKyAqIEB9CisgKi8KKworCitQSl9FTkRfREVDTAorCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfV0FWX1BPUlRfSF9fICovCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZlLmggYi9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYS93YXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmZWM3YwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dhdmUuaApAQCAtMCwwICsxLDE4NCBAQAorLyogJElkOiB3YXZlLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX1dBVkVfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9XQVZFX0hfXworCisKKy8qKgorICogQGZpbGUgd2F2ZS5oCisgKiBAYnJpZWYgV0FWRSBmaWxlIG1hbmlwdWxhdGlvbi4KKyAqLworI2luY2x1ZGUgPHBqbWVkaWEvdHlwZXMuaD4KKworLyoqCisgKiBAZGVmZ3JvdXAgUEpNRURJQV9GSUxFX0ZPUk1BVCBGaWxlIEZvcm1hdHMKKyAqIEBicmllZiBTdXBwb3J0ZWQgZmlsZSBmb3JtYXRzCisgKi8KKworCisvKioKKyAqIEBkZWZncm91cCBQSk1FRElBX1dBVkUgV0FWRSBIZWFkZXIKKyAqIEBpbmdyb3VwIFBKTUVESUFfRklMRV9GT1JNQVQKKyAqIEBicmllZiBSZXByZXNlbnRhdGlvbiBvZiBSSUZGL1dBVkUgZmlsZSBmb3JtYXQKKyAqIEB7CisgKgorICogVGhpcyB0aGUgdGhlIGxvdyBsZXZlbCByZXByZXNlbnRhdGlvbiBvZiBSSUZGL1dBVkUgZmlsZSBmb3JtYXQuIEZvcgorICogaGlnaGVyIGFic3RyYWN0aW9uLCBwbGVhc2Ugc2VlIFxyZWYgUEpNRURJQV9GSUxFX1BMQVkgYW5kIAorICogXHJlZiBQSk1FRElBX0ZJTEVfUkVDLgorICovCisKKworUEpfQkVHSU5fREVDTAorCisvKioKKyAqIFN0YW5kYXJkIFJJRkYgdGFnIHRvIGlkZW50aWZ5IFJJRkYgZmlsZSBmb3JtYXQgaW4gdGhlIFdBVkUgaGVhZGVyLgorICovCisjZGVmaW5lIFBKTUVESUFfUklGRl9UQUcJKCdGJzw8MjR8J0YnPDwxNnwnSSc8PDh8J1InKQorCisvKioKKyAqIFN0YW5kYXJkIFdBVkUgdGFnIHRvIGlkZW50aWZ5IFdBVkUgaGVhZGVyLgorICovCisjZGVmaW5lIFBKTUVESUFfV0FWRV9UQUcJKCdFJzw8MjR8J1YnPDwxNnwnQSc8PDh8J1cnKQorCisvKioKKyAqIFN0YW5kYXJkIEZNVCB0YWcgdG8gaWRlbnRpZnkgZm9ybWF0IGNodW5rcy4KKyAqLworI2RlZmluZSBQSk1FRElBX0ZNVF9UQUcJCSgnICc8PDI0fCd0Jzw8MTZ8J20nPDw4fCdmJykKKworLyoqCisgKiBTdGFuZGFyZCBEQVRBIHRhZyB0byBpZGVudGlmeSBkYXRhIGNodW5rcy4KKyAqLworI2RlZmluZSBQSk1FRElBX0RBVEFfVEFHCSgnYSc8PDI0fCd0Jzw8MTZ8J2EnPDw4fCdkJykKKworLyoqCisgKiBTdGFuZGFyZCBGQUNUIHRhZyB0byBpZGVudGlmeSBmYWN0IGNodW5rcy4KKyAqLworI2RlZmluZSBQSk1FRElBX0ZBQ1RfVEFHCSgndCc8PDI0fCdjJzw8MTZ8J2EnPDw4fCdmJykKKworCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIGZvcm1hdCBjb21wcmVzc2lvbiB0YWcuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgUEpNRURJQV9XQVZFX0ZNVF9UQUdfUENNCT0gMSwKKyAgICBQSk1FRElBX1dBVkVfRk1UX1RBR19BTEFXCT0gNiwKKyAgICBQSk1FRElBX1dBVkVfRk1UX1RBR19VTEFXCT0gNworfSBwam1lZGlhX3dhdmVfZm10X3RhZzsKKworCisvKioKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNpbXBsZXIvY2Fub25pY2FsIHZlcnNpb24gb2YgYSBXQVZFIGZpbGUuCisgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmdWxsIFJJRkYgZm9ybWF0IHNwZWNpZmljYXRpb24uCisgKi8KKyNwcmFnbWEgcGFjaygyKQorc3RydWN0IHBqbWVkaWFfd2F2ZV9oZHIKK3sKKyAgICAvKiogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIFJJRkYgV0FWRSBmaWxlIGhlYWRlciAqLworICAgIHN0cnVjdCB7CisJcGpfdWludDMyX3QgcmlmZjsJCS8qKjwgIlJJRkYiIEFTQ0lJIHRhZy4JCSovCisJcGpfdWludDMyX3QgZmlsZV9sZW47CQkvKio8IEZpbGUgbGVuZ3RoIG1pbnVzIDggYnl0ZXMJKi8KKwlwal91aW50MzJfdCB3YXZlOwkJLyoqPCAiV0FWRSIgQVNDSUkgdGFnLgkJKi8KKyAgICB9IHJpZmZfaGRyOworCisgICAgLyoqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBmb3JtYXQgY2h1bmtzL2hlYWRlciAgKi8KKyAgICBzdHJ1Y3QgeworCXBqX3VpbnQzMl90IGZtdDsJCS8qKjwgImZtdCAiIEFTQ0lJIHRhZy4JCSovCisJcGpfdWludDMyX3QgbGVuOwkJLyoqPCAxNiBmb3IgUENNLgkJKi8KKwlwal91aW50MTZfdCBmbXRfdGFnOwkJLyoqPCAxIGZvciBQQ00JCQkqLworCXBqX3VpbnQxNl90IG5jaGFuOwkJLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMuCSovCisJcGpfdWludDMyX3Qgc2FtcGxlX3JhdGU7CS8qKjwgU2FtcGxpbmcgcmF0ZS4JCSovCisJcGpfdWludDMyX3QgYnl0ZXNfcGVyX3NlYzsJLyoqPCBBdmVyYWdlIGJ5dGVzIHBlciBzZWNvbmQuCSovCisJcGpfdWludDE2X3QgYmxvY2tfYWxpZ247CS8qKjwgbmNoYW5uZWxzICogYml0cyAvIDgJKi8KKwlwal91aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7CS8qKjwgQml0cyBwZXIgc2FtcGxlLgkJKi8KKyAgICB9IGZtdF9oZHI7CisKKyAgICAvKiogVGhlIGRhdGEgaGVhZGVyIHByZWNlZWRzIHRoZSBhY3R1YWwgZGF0YSBpbiB0aGUgZmlsZS4gKi8KKyAgICBzdHJ1Y3QgeworCXBqX3VpbnQzMl90IGRhdGE7CQkvKio8ICJkYXRhIiBBU0NJSSB0YWcuCQkqLworCXBqX3VpbnQzMl90IGxlbjsJCS8qKjwgRGF0YSBsZW5ndGguCQkqLworICAgIH0gZGF0YV9oZHI7Cit9OworI3ByYWdtYSBwYWNrKCkKKworLyoqCisgKiBAc2VlIHBqbWVkaWFfd2F2ZV9oZHIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGptZWRpYV93YXZlX2hkciBwam1lZGlhX3dhdmVfaGRyOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBnZW5lcmljIFJJRkYgc3ViY2h1bmsgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBwam1lZGlhX3dhdmVfc3ViY2h1bmsKK3sKKyAgICBwal91aW50MzJfdAkgICAgaWQ7CQkJLyoqPCBTdWJjaHVuayBBU0NJSSB0YWcuCSAgICAqLworICAgIHBqX3VpbnQzMl90CSAgICBsZW47CQkvKio8IExlbmd0aCBmb2xsb3dpbmcgdGhpcyBmaWVsZCAgICAqLworfSBwam1lZGlhX3dhdmVfc3ViY2h1bms7CisKKworLyoqCisgKiBOb3JtYWxpemUgc3ViY2h1bmsgaGVhZGVyIGZyb20gbGl0dGxlIGVuZGlhbiAodGhlIHJlcHJlc2VudGF0aW9uIG9mCisgKiBSSUZGIGZpbGUpIGludG8gaG9zdCdzIGVuZGlhbi4KKyAqLworI2lmIGRlZmluZWQoUEpfSVNfQklHX0VORElBTikgJiYgUEpfSVNfQklHX0VORElBTiE9MAorIyAgIGRlZmluZSBQSk1FRElBX1dBVkVfTk9STUFMSVpFX1NVQkNIVU5LKGNoKSAgXAorCSAgICBkbyB7IFwKKwkJKGNoKS0+aWQgPSBwal9zd2FwMzIoKGNoKS0+aWQpOyBcCisJCShjaCktPmxlbiA9IHBqX3N3YXAzMigoY2gpLT5sZW4pOyBcCisJICAgIH0gd2hpbGUgKDApCisjZWxzZQorIyAgIGRlZmluZSBQSk1FRElBX1dBVkVfTk9STUFMSVpFX1NVQkNIVU5LKGNoKQorI2VuZGlmCisKKworLyoqCisgKiBPbiBiaWctZW5kaWFuIGhvc3RzLCB0aGlzIGZ1bmN0aW9uIHN3YXBzIHRoZSBieXRlIG9yZGVyIG9mIHRoZSB2YWx1ZXMKKyAqIGluIHRoZSBXQVZFIGhlYWRlciBmaWVsZHMuIE9uIGxpdHRsZS1lbmRpYW4gaG9zdHMsIHRoaXMgZnVuY3Rpb24gZG9lcyAKKyAqIG5vdGhpbmcuCisgKgorICogQXBwbGljYXRpb24gU0hPVUxEIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciByZWFkaW5nIHRoZSBXQVZFIGhlYWRlcgorICogY2h1bmtzIGZyb20gYSBmaWxlLgorICoKKyAqIEBwYXJhbSBoZHIJICAgIFRoZSBXQVZFIGhlYWRlci4KKyAqLworUEpfREVDTCh2b2lkKSBwam1lZGlhX3dhdmVfaGRyX2ZpbGVfdG9faG9zdCggcGptZWRpYV93YXZlX2hkciAqaGRyICk7CisKKworLyoqCisgKiBPbiBiaWctZW5kaWFuIGhvc3RzLCB0aGlzIGZ1bmN0aW9uIHN3YXBzIHRoZSBieXRlIG9yZGVyIG9mIHRoZSB2YWx1ZXMKKyAqIGluIHRoZSBXQVZFIGhlYWRlciBmaWVsZHMuIE9uIGxpdHRsZS1lbmRpYW4gaG9zdHMsIHRoaXMgZnVuY3Rpb24gZG9lcyAKKyAqIG5vdGhpbmcuCisgKgorICogQXBwbGljYXRpb24gU0hPVUxEIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgd3JpdGluZyB0aGUgV0FWRSBoZWFkZXIKKyAqIHRvIGEgZmlsZS4KKyAqCisgKiBAcGFyYW0gaGRyCSAgICBUaGUgV0FWRSBoZWFkZXIuCisgKi8KK1BKX0RFQ0wodm9pZCkgcGptZWRpYV93YXZlX2hkcl9ob3N0X3RvX2ZpbGUoIHBqbWVkaWFfd2F2ZV9oZHIgKmhkciApOworCisKK1BKX0VORF9ERUNMCisKKy8qKgorICogQH0KKyAqLworCisKKyNlbmRpZgkvKiBfX1BKTUVESUFfV0FWRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWEvd3NvbGEuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dzb2xhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3NjAyNQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhL3dzb2xhLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qICRJZDogd3NvbGEuaCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2lmbmRlZiBfX1BKTUVESUFfV1NPTEFfSF9fCisjZGVmaW5lIF9fUEpNRURJQV9XU09MQV9IX18KKworLyoqCisgKiBAZmlsZSB3c29sYS5oCisgKiBAYnJpZWYgV2F2ZWZvcm0gU2ltaWxhcml0eSBCYXNlZCBPdmVybGFwLUFkZCAoV1NPTEEpCisgKi8KKyNpbmNsdWRlIDxwam1lZGlhL3R5cGVzLmg+CisKKy8qKgorICogQGRlZmdyb3VwIFBKTUVEX1dTT0xBIFdhdmVmb3JtIFNpbWlsYXJpdHkgQmFzZWQgT3ZlcmxhcC1BZGQgKFdTT0xBKQorICogQGluZ3JvdXAgUEpNRURJQV9GUkFNRV9PUAorICogQGJyaWVmIFRpbWUtc2NhbGUgbW9kaWZpY2F0aW9uIHRvIGF1ZGlvIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBwaXRjaAorICogQHsKKyAqCisgKiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIFdhdmVmb3JtIFNpbWlsYXJpdHkgQmFzZWQgT3ZlcmxhcC1BZGQgKFdTT0xBKQorICogaW1wbGVtZW50YXRpb24gaW4gUEpNRURJQS4gVGhlIFdTT0xBIEFQSSBoZXJlIGNhbiBiZSB1c2VkIGJvdGggdG8gCisgKiBjb21wcmVzcyAoc3BlZWQtdXApIGFuZCBzdHJldGNoIChleHBhbmQsIHNsb3cgZG93bikgYXVkaW8gcGxheWJhY2sKKyAqIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIHBpdGNoLCBvciBhcyBhIG1lYW4gZm9yIHBlcmZvcm1pbmcgcGFja2V0IGxvc3MKKyAqIGNvbmNlYWxtZW50IChXU09MQSkuCisgKgorICogVGhlIFdTT0xBIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgYnkgXHJlZiBQSk1FRF9ERUxBWUJVRiBhbmQgXHJlZiBQSk1FRF9QTEMuCisgKi8KKworUEpfQkVHSU5fREVDTAorCisKKy8qKgorICogT3BhcXVlIGRlY2xhcmF0aW9uIGZvciBXU09MQSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqbWVkaWFfd3NvbGEgcGptZWRpYV93c29sYTsKKworCisvKioKKyAqIFdTT0xBIG9wdGlvbnMsIGNhbiBiZSBjb21iaW5lZCB3aXRoIGJpdG1hc2sgb3BlcmF0aW9uLgorICovCitlbnVtIHBqbWVkaWFfd3NvbGFfb3B0aW9uCit7CisgICAgLyoqCisgICAgICogRGlzYWJsZSBIYW5uaW5nIHdpbmRvdyB0byBjb25zZXJ2ZSBtZW1vcnkuCisgICAgICovCisgICAgUEpNRURJQV9XU09MQV9OT19IQU5OSU5HCT0gMSwKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhhdCB0aGUgV1NPTEEgd2lsbCBub3QgYmUgdXNlZCBmb3IgUExDLgorICAgICAqLworICAgIFBKTUVESUFfV1NPTEFfTk9fUExDID0gMiwKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhhdCB0aGUgV1NPTEEgd2lsbCBub3QgYmUgdXNlZCB0byBkaXNjYXJkIGZyYW1lcyBpbgorICAgICAqIG5vbi1jb250aWd1b3VzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBQSk1FRElBX1dTT0xBX05PX0RJU0NBUkQgPSA0LAorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBmYWRlLWluIGFuZCBmYWRlLW91dCBmZWF0dXJlIGluIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4KKyAgICAgKiBhY3R1YWwgYW5kIHN5bnRoZXRpYyBmcmFtZXMgaW4gV1NPTEEuIFdpdGggZmFkZSBmZWF0dXJlIGVuYWJsZWQsIAorICAgICAqIFdTT0xBIHdpbGwgb25seSBnZW5lcmF0ZSBhIGxpbWl0ZWQgbnVtYmVyIG9mIHN5bnRoZXRpYyBmcmFtZXMgCisgICAgICogKGNvbmZpZ3VyYWJsZSB3aXRoICNwam1lZGlhX3dzb2xhX3NldF9tYXhfZXhwYW5kKCkpLCBmYWRpbmcgb3V0IAorICAgICAqIHRoZSB2b2x1bWUgb24gZXZlcnkgbW9yZSBzYW1wbGVzIGl0IGdlbmVyYXRlcywgYW5kIHdoZW4gaXQgcmVhY2hlcworICAgICAqIHRoZSBsaW1pdCBpdCB3aWxsIG9ubHkgZ2VuZXJhdGUgc2lsZW5jZS4KKyAgICAgKi8KKyAgICBQSk1FRElBX1dTT0xBX05PX0ZBRElORyA9IDgKK307CisKKworCisvKioKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBXU09MQS4KKyAqCisgKiBAcGFyYW0gcG9vbAkJICAgIFBvb2wgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBXU09MQS4KKyAqIEBwYXJhbSBjbG9ja19yYXRlCSAgICBTYW1wbGluZyByYXRlIG9mIGF1ZGlvIHBsYXliYWNrLgorICogQHBhcmFtIHNhbXBsZXNfcGVyX2ZyYW1lIE51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZS4KKyAqIEBwYXJhbSBjaGFubmVsX2NvdW50CSAgICBOdW1iZXIgb2YgY2hhbm5lbHMuCisgKiBAcGFyYW0gb3B0aW9ucwkgICAgT3B0aW9uIGZsYWdzLCBiaXRtYXNrIGNvbWJpbmF0aW9uIG9mCisgKgkJCSAgICAjcGptZWRpYV93c29sYV9vcHRpb24uCisgKiBAcGFyYW0gcF93c29sYQkgICAgUG9pbnRlciB0byByZWNlaXZlIFdTT0xBIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuCQkgICAgUEpfU1VDQ0VTUyBvciB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV93c29sYV9jcmVhdGUocGpfcG9vbF90ICpwb29sLCAKKwkJCQkJICB1bnNpZ25lZCBjbG9ja19yYXRlLAorCQkJCQkgIHVuc2lnbmVkIHNhbXBsZXNfcGVyX2ZyYW1lLAorCQkJCQkgIHVuc2lnbmVkIGNoYW5uZWxfY291bnQsCisJCQkJCSAgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkJICBwam1lZGlhX3dzb2xhICoqcF93c29sYSk7CisKKworLyoqCisgKiBTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVvdXMgc3ludGhldGljIGZyYW1lcyB0aGF0IGNhbiBiZQorICogZ2VuZXJhdGVkIGJ5IFdTT0xBLCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgb3B0aW9uIHdpbGwgb25seSB0YWtlCisgKiBlZmZlY3QgaWYgZmFkaW5nIGlzIG5vdCBkaXNhYmxlZCB2aWEgdGhlIG9wdGlvbiB3aGVuIHRoZSBXU09MQQorICogc2Vzc2lvbiB3YXMgY3JlYXRlZC4gRGVmYXVsdCB2YWx1ZSBpcyBQSk1FRElBX1dTT0xBX01BWF9FWFBBTkRfTVNFQworICogKHNlZSBhbHNvIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBKTUVESUFfV1NPTEFfTUFYX0VYUEFORF9NU0VDIGZvcgorICogbW9yZSBpbmZvcm1hdGlvbikuCisgKgorICogQHBhcmFtIHdzb2xhCSAgICBUaGUgV1NPTEEgc2Vzc2lvbgorICogQHBhcmFtIG1zZWMJICAgIFRoZSBkdXJhdGlvbi4KKyAqCisgKiBAcmV0dXJuCSAgICBQSl9TVUNDRVNTIG5vcm1hbGx5LgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwam1lZGlhX3dzb2xhX3NldF9tYXhfZXhwYW5kKHBqbWVkaWFfd3NvbGEgKndzb2xhLAorCQkJCQkJICB1bnNpZ25lZCBtc2VjKTsKKworCisvKioKKyAqIERlc3Ryb3kgV1NPTEEuCisgKgorICogQHBhcmFtIHdzb2xhCSAgICBXU09MQSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgbm9ybWFsbHkuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfd3NvbGFfZGVzdHJveShwam1lZGlhX3dzb2xhICp3c29sYSk7CisKKworLyoqCisgKiBSZXNldCB0aGUgYnVmZmVyIGNvbnRlbnRzIG9mIFdTT0xBLgorICoKKyAqIEBwYXJhbSB3c29sYQkgICAgV1NPTEEgc2Vzc2lvbi4KKyAqIEBwYXJhbSBvcHRpb25zICAgUmVzZXQgb3B0aW9ucywgbXVzdCBiZSB6ZXJvIGZvciBub3cuCisgKgorICogQHJldHVybgkgICAgUEpfU1VDQ0VTUyBub3JtYWxseS4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV93c29sYV9yZXNldChwam1lZGlhX3dzb2xhICp3c29sYSwKKwkJCQkJIHVuc2lnbmVkIG9wdGlvbnMpOworCisKKy8qKgorICogR2l2ZSBvbmUgZ29vZCBmcmFtZSB0byBXU09MQSB0byBiZSBrZXB0IGFzIHJlZmVyZW5jZS4gQXBwbGljYXRpb24KKyAqIG11c3QgY29udGludW91c2x5IGdpdmUgV1NPTEEgZ29vZCBmcmFtZXMgdG8ga2VlcCBpdHMgc2Vzc2lvbiB1cCB0bworICogZGF0ZSB3aXRoIGN1cnJlbnQgcGxheWJhY2suIERlcGVuZGluZyBvbiB0aGUgV1NPTEEgaW1wbGVtZW50YXRpb24sCisgKiB0aGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYW1lLgorICoKKyAqIEBwYXJhbSB3c29sYQkgICAgV1NPTEEgc2Vzc2lvbi4KKyAqIEBwYXJhbSBmcm0JICAgIFRoZSBmcmFtZSwgd2hpY2ggbGVuZ3RoIG11c3QgbWF0Y2ggdGhlIHNhbXBsZXMgcGVyCisgKgkJICAgIGZyYW1lIHNldHRpbmcgb2YgdGhlIFdTT0xBIHNlc3Npb24uCisgKiBAcGFyYW0gcHJldl9sb3N0IElmIGFwcGxpY2F0aW9uIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGEgc3ludGhldGljCisgKgkJICAgIGZyYW1lIHdpdGggI3BqbWVkaWFfd3NvbGFfZ2VuZXJhdGUoKSBiZWZvcmUgY2FsbGluZworICoJCSAgICB0aGlzIGZ1bmN0aW9uLCBzcGVjaWZ5IHdoZXRoZXIgdGhhdCB3YXMgYmVjYXVzZSBvZgorICoJCSAgICBwYWNrZXQgbG9zdC4gSWYgc28sIHNldCB0aGlzIHBhcmFtZXRlciB0byBQSl9UUlVFCisgKgkJICAgIHRvIG1ha2UgV1NPTEEgaW50ZXJwb2xhdGUgdGhpcyBmcmFtZSB3aXRoIGl0cyBidWZmZXIuCisgKgkJICAgIE90aGVyd2lzZSBpZiB0aGlzIHZhbHVlIGlzIFBKX0ZBTFNFLCBXU09MQSB3aWxsCisgKgkJICAgIGp1c3QgYXBwZW5kIHRoaXMgZnJhbWUgdG8gdGhlIGVuZCBvZiBpdHMgYnVmZmVyLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgbm9ybWFsbHkuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfd3NvbGFfc2F2ZShwam1lZGlhX3dzb2xhICp3c29sYSwgCisJCQkJCXBqX2ludDE2X3QgZnJtW10sIAorCQkJCQlwal9ib29sX3QgcHJldl9sb3N0KTsKKworLyoqCisgKiBHZW5lcmF0ZSBvbmUgc3ludGhldGljIGZyYW1lIGZyb20gV1NPTEEuCisgKgorICogQHBhcmFtIHdzb2xhCSAgICBXU09MQSBzZXNzaW9uLgorICogQHBhcmFtIGZybQkgICAgQnVmZmVyIHRvIHJlY2VpdmUgdGhlIGZyYW1lLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgbm9ybWFsbHkuCisgKi8KK1BKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfd3NvbGFfZ2VuZXJhdGUocGptZWRpYV93c29sYSAqd3NvbGEsIAorCQkJCQkgICAgcGpfaW50MTZfdCBmcm1bXSk7CisKKworLyoqCisgKiBDb21wcmVzcyBvciBjb21wYWN0IHRoZSBzcGVjaWZpZWQgYnVmZmVyIGJ5IHJlbW92aW5nIHNvbWUgYXVkaW8gc2FtcGxlcworICogZnJvbSB0aGUgYnVmZmVyLCB3aXRob3V0IGFsdGVyaW5nIHRoZSBwaXRjaC4gRm9yIHRoaXMgZnVuY3Rpb24gdG8gd29yaywgCisgKiB0b3RhbCBsZW5ndGggb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIG1vcmUgdGhhbiB0d2ljZSBcYSBlcmFzZV9jbnQuCisgKiAKKyAqIEBwYXJhbSB3c29sYQkgICAgV1NPTEEgc2Vzc2lvbi4KKyAqIEBwYXJhbSBidWYxCSAgICBQb2ludGVyIHRvIGJ1ZmZlci4gCisgKiBAcGFyYW0gYnVmMV9jbnQgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBidWZmZXIuCisgKiBAcGFyYW0gYnVmMgkgICAgUG9pbnRlciB0byBzZWNvbmQgYnVmZmVyLCBpZiB0aGUgYnVmZmVyIGlzIG5vdAorICoJCSAgICBjb250aWd1b3VzLiBPdGhlcndpc2UgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBOVUxMLgorICogQHBhcmFtIGJ1ZjJfY250ICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgc2Vjb25kIGJ1ZmZlciwgaWYgdGhlIGJ1ZmZlcgorICoJCSAgICBpcyBub3QgY29udGlndW91cy4gT3RoZXJ3aXNlIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZQorICoJCSAgICB6ZXJvLgorICogQHBhcmFtIGVyYXNlX2NudCBPbiBpbnB1dCwgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgZXJhc2VkLgorICoJCSAgICBUaGlzIGZ1bmN0aW9uIG1heSBlcmFzZSBtb3JlIG9yIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIAorICoJCSAgICBudW1iZXIsIGFuZCB0aGUgYWN0dWFsIG51bWJlciBvZiBzYW1wbGVzIGVyYXNlZCB3aWxsIGJlIAorICoJCSAgICBnaXZlbiBvbiB0aGlzIGFyZ3VtZW50IHVwb24gcmV0dXJuaW5nIGZyb20gdGhlIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1MgaWYgc29tZSBzYW1wbGVzIGhhdmUgYmVlbiBlcmFzZWQsIFBKX0VUT09TTUFMTAorICoJCSAgICBpZiBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGJlIHJlZHVjZWQsIFBKX0VJTlZBTCBpZiBhbnkKKyAqCQkgICAgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCB2YWxpZC4KKyAqLworUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV93c29sYV9kaXNjYXJkKHBqbWVkaWFfd3NvbGEgKndzb2xhLCAKKwkJCQkJICAgcGpfaW50MTZfdCBidWYxW10sCisJCQkJCSAgIHVuc2lnbmVkIGJ1ZjFfY250LCAKKwkJCQkJICAgcGpfaW50MTZfdCBidWYyW10sCisJCQkJCSAgIHVuc2lnbmVkIGJ1ZjJfY250LAorCQkJCQkgICB1bnNpZ25lZCAqZXJhc2VfY250KTsKKworCitQSl9FTkRfREVDTAorCisvKioKKyAqIEB9CisgKi8KKworI2VuZGlmCS8qIF9fUEpNRURJQV9XU09MQV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWFfYXVkaW9kZXYuaCBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhX2F1ZGlvZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3YTFiNwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9saWJwanNpcC9zb3VyY2VzL3BqbWVkaWEvaW5jbHVkZS9wam1lZGlhX2F1ZGlvZGV2LmgKQEAgLTAsMCArMSwzMyBAQAorLyogJElkOiBwam1lZGlhX2F1ZGlvZGV2LmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpZm5kZWYgX19QSk1FRElBX0FVRElPREVWX0hfXworI2RlZmluZSBfX1BKTUVESUFfQVVESU9ERVZfSF9fCisKKy8qKgorICogQGZpbGUgcGptZWRpYV9hdWRpb2Rldi5oCisgKiBAYnJpZWYgUEpNRURJQSBtYWluIGhlYWRlciBmaWxlLgorICovCisKKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvZGV2Lmg+CisjaW5jbHVkZSA8cGptZWRpYS1hdWRpb2Rldi9hdWRpb2Rldl9pbXAuaD4KKyNpbmNsdWRlIDxwam1lZGlhLWF1ZGlvZGV2L2F1ZGlvdGVzdC5oPgorCisjZW5kaWYJLyogX19QSk1FRElBX0FVRElPREVWX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvbGlicGpzaXAvc291cmNlcy9wam1lZGlhL2luY2x1ZGUvcGptZWRpYV92aWRlb2Rldi5oIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWFfdmlkZW9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M5YmIwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL2xpYnBqc2lwL3NvdXJjZXMvcGptZWRpYS9pbmNsdWRlL3BqbWVkaWFfdmlkZW9kZXYuaApAQCAtMCwwICsxLDMxIEBACisvKiAkSWQ6IHBqbWVkaWFfdmlkZW9kZXYuaCA0MDE2IDIwMTItMDQtMDQgMDU6MDU6NTBaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpNRURJQV9WSURFT0RFVl9IX18KKyNkZWZpbmUgX19QSk1FRElBX1ZJREVPREVWX0hfXworCisvKioKKyAqIEBmaWxlIHBqbWVkaWFfdmlkZW9kZXYuaAorICogQGJyaWVmIFBKTUVESUEgbWFpbiBoZWFkZXIgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8cGptZWRpYS12aWRlb2Rldi92aWRlb2Rldi5oPgorI2luY2x1ZGUgPHBqbWVkaWEtdmlkZW9kZXYvdmlkZW9kZXZfaW1wLmg+CisjaW5jbHVkZSA8cGptZWRpYS12aWRlb2Rldi9hdmlfZGV2Lmg+CisKKyNlbmRpZgkvKiBfX1BKTUVESUFfVklERU9ERVZfSF9fICovCg==